14

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

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

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

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

4

3 回答 3

21

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

使用 yiic 消息路径/to/config/file

描述 该命令在指定的源文件中搜索要翻译的消息,并将它们编译成 PHP 数组作为消息源。

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

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

可以使用以下选项:

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

您应该修改(并移动)示例配置文件,一切就绪。确保使用完整路径(即C:\path\to\project在 Windows 或/var/www/your/project*nix 上)

于 2012-06-28T10:23:07.160 回答
3

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

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

这在开发过程中很有帮助,因为它会在您翻译这些内容之前(重复)增长缺少翻译的 translation.log 文件。

希望它给你的想法。

于 2012-06-28T07:07:26.860 回答
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')。

于 2012-06-28T08:04:51.677 回答