【问题标题】:Generate Yii translation message files生成 Yii 翻译消息文件
【发布时间】:2012-06-29 05:30:07
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php bash internationalization yii


    【解决方案1】:

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

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

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

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

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

    以下选项可用:

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

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

    【讨论】:

    • 非常好!谢谢你。现在我想起了我刚开始 Yii 探索但在“基本的东西”之后忘记了这种东西 :) (刚刚测试并收集了我所有的翻译)+1
    • 优秀。它的效果超出预期。感谢您指出。
    【解决方案2】:

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

    创建组件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 文件。

    希望它能给你一些想法。

    【讨论】:

      【解决方案3】:

      这听起来像是grep 和正则表达式的工作。搜索这个:

      Yii::t\s*\(\s*('(?:[^']|(?<=\\)')*'|"(?:[^"]|(?<=\\)")*")\s*,\s*('(?:[^']|(?<=\\)')*'|"(?:[^"]|(?<=\\)")*")\s*\)
      

      由于上面的内容很遗憾无法阅读,我将对其进行分解:

      Yii::t\s*\(\s*##PATTERN##\s*,\s*##PATTERN##\s*\)
      

      这显然与对Yii::t 的调用相匹配,注意考虑空格。秘诀是##PATTERN##,重复两次。 ##PATTERN##

      ('(?:[^']|(?<=\\)')*'|"(?:[^"]|(?<=\\)")*")
      

      以上匹配'([^']|(?&lt;=\\)')*'(单引号字符串)或"([^"]|(?&lt;=\\)")*"(双引号字符串)。非捕获组 (?:) 已被用于忽略不感兴趣的中期结果。

      与此正则表达式匹配后,捕获组#1 将保存翻译文件名(例如'blog'),组#2 将保存字符串名称(例如'Your name')。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-20
        • 2014-06-29
        • 1970-01-01
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        相关资源
        最近更新 更多