Создание файлов сообщений о переводе Yii


Мне интересно узнать, есть ли сценарий или другой способ для сбора и генерации сообщений перевода Yii в контроллере/проекте

Например. Если у меня есть следующие коды в контроллере

Yii::t('blog', 'Your name');
Yii::t('category', 'Category name');

Он должен генерировать файлы сообщений с переводом на английский язык в виде blog.php и category.php с приведенными выше строками в каталоге сообщений. Пожалуйста, дайте мне знать, если кто-нибудь знает способ. Спасибо

Author: Gihan, 2012-06-27

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)

 21
Author: adamors, 2012-06-28 10:34:16

Я мог бы подсказать вам, как начать, и вы сможете написать свой собственный сценарий. Я нашел это хорошим для себя на данный момент:)

Создать компонент 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' => '', и вставить соответствующую файл перевода.

Это полезно в процессе разработки, потому что это приведет к росту перевода.файл журнала с отсутствующим переводом (неоднократно), пока вы не переведете их.

Надеюсь, это даст вам представление.

 3
Author: SnippLeaf.com, 2012-06-28 07:07:26

Это звучит как работа для 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').

 1
Author: Jon, 2012-06-28 08:04:51