生成Yii翻译消息文件

时间:2012-06-27 17:42:43

标签: php bash internationalization yii

我很想知道是否有一个脚本或其他可用于在控制器/项目中收集和生成Yii翻译消息

EG。如果我在控制器中有以下代码

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

它应该生成英文翻译消息文件,如blog.php和category.php,以及消息目录中的上述字符串。如果有人知道某种方式,请告诉我。感谢

3 个答案:

答案 0 :(得分:21)

没有必要重新发明轮子。您可以使用yiic(如果您转到框架文件夹并输入yiic help message,您将获得有关其使用的所有信息)。为方便起见,我将把它粘贴在这里。

  

USAGE yiic message path / to / config / file

     

说明此命令搜索要翻译的邮件   指定的源文件并将它们编译为PHP数组   消息来源。

     

PARAMETERS * config-file:required,配置路径   文件。您可以在framework / messages / config.php中找到一个示例。

     

该文件可以放在任何地方,并且必须是有效的PHP脚本   它返回一组名称 - 值对。每个名称 - 值对   表示配置选项。

     

可以使用以下选项:

     
      
  • sourcePath:string,所有源文件的根目录。
  •   
  • messagePath:string,包含邮件翻译的根目录。
  •   
  • languages:array,提取消息的语言代码列表    应该翻译成。例如,数组('zh_cn','en_au')。
  •   
  • fileTypes:array,文件扩展名列表(例如'php','xml')。    只能在此列表中找到其扩展名称的文件    将被处理。如果为空,则将处理所有文件。
  •   
  • exclude:array,目录和文件排除列表。每    排除可以是名称或路径。如果是文件或目录名称    或路径匹配排除,它不会被复制。例如,    排除'.svn'将排除所有文件和目录    名字是'.svn'。排除'/ a / b'将排除文件或    目录'sourcePath / a / b'。
  •   
  • 翻译器:翻译消息的功能名称。    默认为'Yii :: t'。这用作标记来查找消息    平移。
  •   
  • 覆盖:如果必须使用合并的消息覆盖消息文件。
  •   
  • removeOld:如果消息不再需要翻译,它将被删除,    而不是被一对'@@'标记包围。
  •   

您应该修改(并移动)示例配置文件,并且您已完成设置。请务必使用完整路径(例如Windows上的C:\path\to\project或* nix上的/var/www/your/project

答案 1 :(得分:3)

我可以给你输入如何开始,你可以编写自己的脚本。我现在发现这对我有好处:)

创建组件组件/ 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' => '',部分并输入相应的翻译文件。

这在开发过程中非常有用,因为它会使translate.log文件变长(重复),直到您翻译它们为止。

希望它能给你一些想法。

答案 2 :(得分:1)

这听起来像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')。