我很想知道是否有一个脚本或其他可用于在控制器/项目中收集和生成Yii翻译消息
EG。如果我在控制器中有以下代码
Yii::t('blog', 'Your name');
Yii::t('category', 'Category name');
它应该生成英文翻译消息文件,如blog.php和category.php,以及消息目录中的上述字符串。如果有人知道某种方式,请告诉我。感谢
答案 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)
我可以给你输入如何开始,你可以编写自己的脚本。我现在发现这对我有好处:)
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' => '',
部分并输入相应的翻译文件。
这在开发过程中非常有用,因为它会使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'
)。