我很想知道是否有脚本或其他方式可用于在控制器/项目中收集和生成 Yii 翻译消息
例如。如果我在控制器中有以下代码
Yii::t('blog', 'Your name');
Yii::t('category', 'Category name');
它应该在messages目录中生成带有上述字符串的英文翻译消息文件,如blog.php和category.php。如果有人知道方法,请告诉我。谢谢
我很想知道是否有脚本或其他方式可用于在控制器/项目中收集和生成 Yii 翻译消息
例如。如果我在控制器中有以下代码
Yii::t('blog', 'Your name');
Yii::t('category', 'Category name');
它应该在messages目录中生成带有上述字符串的英文翻译消息文件,如blog.php和category.php。如果有人知道方法,请告诉我。谢谢
没有必要重新发明轮子。您可以使用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 上)
我可以给你输入如何开始,你可以编写自己的脚本。我现在发现这对我有好处:)
public function missing($messageEvent) {
Yii::log(
"'".$messageEvent->message."' => '',",
'translation',
$messageEvent->category.'.'.$messageEvent->language
);
}
}
'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 文件。
希望它给你的想法。
这听起来像是一个工作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'
)。