Создание файлов сообщений перевода Yii
Мне интересно узнать, есть ли script или другой доступный для сбора и генерации сообщений перевода Yii в контроллере/проекте
Eg. Если у меня есть следующие коды в контроллере
Yii::t('blog', 'Your name');
Yii::t('category', 'Category name');
Он должен генерировать файлы сообщений английского перевода как blog.php и category.php с указанными выше строками в каталоге сообщений. Пожалуйста, дайте мне знать, если кто-то знает дорогу. Благодаря
Ответы
Ответ 1
Нет необходимости изобретать велосипед. Вы можете использовать yiic
для этого (если вы перейдете в папку фреймворка и введите yiic help message
, вы получите всю необходимую информацию об этом использовании). Для удобства, я собираюсь вставить его здесь.
ИСПОЛЬЗОВАТЬ yiic путь сообщения /to/config/file
ОПИСАНИЕ Эта команда выполняет поиск сообщений, которые будут указанных исходных файлов и компилирует их в массивы PHP как источника сообщений.
ПАРАМЕТРЫ * config-file: требуется, путь конфигурации файл. Вы можете найти пример в framework/messages/config.php.
Файл может быть размещен в любом месте и должен быть действительным PHP scriptкоторый возвращает массив пар имя-значение. Каждая пара имен и значений представляет собой конфигурационный параметр.
Доступны следующие параметры:
- sourcePath: строка, корневой каталог всех исходных файлов.
- messagePath: строка, корневая директория, содержащая переводы сообщений.
- Языки: массив, список кодов языков, которые извлеченные сообщения следует перевести на. Например, array ('zh_cn', 'en_au').
- fileTypes: массив, список расширений файлов (например, "php", "xml" ). В этом списке можно найти только файлы, имя которых можно найти в этом списке будет обработан. Если пустым, все файлы будут обработаны.
- exclude: array, список исключений в каталоге и файлах. каждый исключение может быть либо именем, либо путем. Если имя файла или каталога или путь соответствует исключению, он не будет скопирован. Например, исключение ".svn" исключает все файлы и каталоги, чьи name - ".svn". И исключение '/a/b' исключает файл или directory 'sourcePath/a/b'.
- translator: имя функции для перевода сообщений. По умолчанию используется значение "Yii:: t". Это используется как знак для поиска сообщений в переводе.
- переписать: если файл сообщения должен быть перезаписан объединенными сообщениями.
- removeOld: если сообщение больше не нуждается в переводе, оно будет удалено, вместо того, чтобы быть заключенным между парой отметок '@@'.
Вы должны изменить (и переместить) пример конфигурационного файла, и все будет установлено. Обязательно используйте полные пути (т.е. C:\path\to\project
в Windows или /var/www/your/project
on * nix)
Ответ 2
Я мог бы дать вам информацию о том, как начать, и вы можете написать свой собственный script. Я нашел это хорошо для меня сейчас:)
Создание компонентов компонента /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' => '',
и поместить в соответствующий файл перевода.
Это полезно в процессе разработки, потому что оно будет увеличивать файл transl.log с отсутствующим переводом (повторно) до тех пор, пока вы не переведете их.
Надеюсь, это даст вам идею.
Ответ 3
Это похоже на работу для 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'
).