Паредер на основе регулярных выражений Poedit? - PullRequest
1 голос
/ 28 мая 2009

В наших файлах JS мы используем следующий формат для перевода Gettext:

var str1 = '!t[The text that should be translated]';
var str2 = '!t[Some more text]';

Эти JS-файлы будут проанализированы с использованием PHP, а проанализированные строки переведены через Zend Framework Zend_Translate. Сгенерированный JS выглядит так:

var str1 = 'The text that should be translated';
var str2 = 'Some more text';

Для извлечения строк, которые нужно перевести, и для перевода наших файлов PHP, мы используем Poedit, он работает очень хорошо.
Есть ли способ проанализировать строки для перевода из '!t[...]' с помощью Poedit?

Что решило бы проблему, это какой-то парсер Poedit, основанный на регулярных выражениях. Есть ли такой парсер?

В качестве альтернативы мы могли бы определить синтаксический анализатор исходного кода на основе xgettext с языком PHP в качестве параметра (вы должны сделать это, потому что xgettext не знает о файлах .js и обрабатывает их как файлы C). Затем мы используем следующий формат в наших файлах JS:

var str1 = '<?=_t("The text that should be translated")?>';
var str2 = '<?=_t("Some more text")?>';

Само собой разумеется, это действительно не круто использовать код, который везде выглядит как php, просто чтобы иметь возможность анализировать строки с помощью Poedit.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2016

Poedit и xgettext теперь поддерживают JavaScript (честно говоря, я не знаю, так ли это было в 2009 году, но думаю, что это не так), но они не поддерживают строковые литералы с пользовательской разметкой в ​​них. Таким образом, вы все еще не можете извлечь из

var str1 = '!t[The text that should be translated]';

но вы можете легко извлечь с помощью вспомогательной функции:

var str1 = t('The text that should be translated');

, если вы просто добавите t в качестве ключевого слова в Poedit.

0 голосов
/ 28 мая 2009

регулярное выражение, соответствующее вашим строкам

 $translated = preg_replace('/[\'"]\!t\[(.+)\][\'"]/e', 'translate_function('\\2')', $str);

Я не знаю, следует ли заменить \ 2 на \ 1 или \ 3, ваше решение - это модификатор "e", предоставляемый модулем регулярных выражений PCRE.

...