Создание файлов сообщений о переводе Yii
Мне интересно узнать, есть ли сценарий или другой способ для сбора и генерации сообщений перевода Yii в контроллере/проекте
Например. Если у меня есть следующие коды в контроллере
Yii::t('blog', 'Your name');
Yii::t('category', 'Category name');
Он должен генерировать файлы сообщений с переводом на английский язык в виде blog.php и category.php с приведенными выше строками в каталоге сообщений. Пожалуйста, дайте мне знать, если кто-нибудь знает способ. Спасибо
3 answers
Нет необходимости изобретать велосипед заново. Для этого вы можете использовать yiic
(если вы зайдете в папку framework и введете yiic help message
, вы получите всю необходимую информацию о его использовании). Для удобства я собираюсь вставить его сюда.
Путь к сообщению об ИСПОЛЬЗОВАНИИ yiic/к/конфигурации/файлу
ОПИСАНИЕ Эта команда выполняет поиск сообщений для перевода в указанных исходных файлах и компилирует их в массивы PHP в качестве источника сообщений.
ПАРАМЕТРЫ * конфигурационный файл: обязательно, путь к файлу конфигурации. Вы можете найти пример в framework/messages/config.php .
Файл может быть размещен где угодно и должен быть действительным PHP-скриптом который возвращает массив пар имя-значение. Каждая пара имя-значение представляет параметр конфигурации.
Доступны следующие опции:
- Путь к источнику: строка, корневой каталог всех исходных файлов.
- Путь к сообщению: строка, корневой каталог, содержащий переводы сообщений.
- языки: массив, список кодов языков, которые извлекаются сообщениями следует перевести на. Например, массив ('zh_cn', 'en_au').
- Типы файлов: массив, список расширений файлов (например, "php", "xml"). Только файлы, имя расширения которых можно найти в этом списке будет обработан. Если он пуст, все файлы будут обработаны.
- исключить: массив, список исключений каталогов и файлов. Каждый исключением может быть либо имя, либо путь. Если имя файла или каталога или путь соответствует исключению, он не будет скопирован. Например, исключение ".svn" приведет к исключению всех файлов и каталогов с именем ".svn". И исключение '/a/b' приведет к исключению файла или каталога 'Sourcepath/a/b'.
- переводчик: название функции для перевода сообщений. По умолчанию используется значение 'Yii::t'. Это используется в качестве метки для поиска сообщений, подлежащих переводу.
- перезапись: если файл сообщения должен быть перезаписан с помощью объединенные сообщения.
- Удалить: если сообщение больше не нуждается в переводе, оно будет удалено, а не заключено между парой знаков "@@".
Вы должны изменить (и переместить) файл конфигурации примера, и все готово. Обязательно используйте полные пути (т.Е. C:\path\to\project
в Windows или /var/www/your/project
в *nix)
Я мог бы подсказать вам, как начать, и вы сможете написать свой собственный сценарий. Я нашел это хорошим для себя на данный момент:)
Создать компонент components/Translation.php
public function missing($messageEvent) {
Yii::log(
"'".$messageEvent->message."' => '',",
'translation',
$messageEvent->category.'.'.$messageEvent->language
);
}
}
Редактировать файл конфигурации config/main.php
'components' => array(
//...
'log' => array(
array(
'class'=>'CFileLogRoute',
'levels'=>'translation',
'logFile'=>'translations.log',
),
//...
),
'messages' => array(
//'class' => 'CDbMessageSource',
'onMissingTranslation' => array('Translation', 'missing'),
//'sourceMessageTable' => 'source_message',
//'translatedMessageTable' => 'message'
),
)
Результат
В конечном итоге у вас будет файл translation.php
в каталоге файлов журнала, и содержимое файла будет примерно таким:
2012/06/28 09:45:00 [translation] [Site.lv] 'MyStringInSource' => '',
....
В зависимости от вашей конфигурации.
Таким образом, вы можете скопировать часть 'MyStringInSource' => '',
и вставить соответствующую файл перевода.
Это полезно в процессе разработки, потому что это приведет к росту перевода.файл журнала с отсутствующим переводом (неоднократно), пока вы не переведете их.
Надеюсь, это даст вам представление.
Это звучит как работа для grep
и регулярного выражения. Найдите это:
Yii::t\s*\(\s*('(?:[^']|(?<=\\)')*'|"(?:[^"]|(?<=\\)")*")\s*,\s*('(?:[^']|(?<=\\)')*'|"(?:[^"]|(?<=\\)")*")\s*\)
Поскольку вышесказанное, к сожалению, нечитаемо, я немного разберу его:
Yii::t\s*\(\s*##PATTERN##\s*,\s*##PATTERN##\s*\)
Это, очевидно, соответствует вызову Yii::t
, учитывающему пробелы. Секретный соус - ##PATTERN##
, который повторяется дважды. ##PATTERN##
является
('(?:[^']|(?<=\\)')*'|"(?:[^"]|(?<=\\)")*")
Приведенное выше соответствует либо '([^']|(?<=\\)')*'
(строка в одинарных кавычках), либо "([^"]|(?<=\\)")*"
(строка в двойных кавычках). Группы без захвата (?:
) использовались для игнорируйте промежуточные результаты, которые не представляют интереса.
После сопоставления с этим регулярным выражением группа захвата № 1 будет содержать имя файла перевода (например, 'blog'
), а группа № 2 будет содержать имя строки (например, 'Your name'
).