如何在CakePhp i18n中为单词添加上下文?

时间:2012-01-22 02:31:20

标签: cakephp internationalization

我正在使用Cakephp国际化,并希望为该单词提供上下文。 消息在应用程序中以英语编写为默认语言。 一些(粗体)消息来自数据库。 例如:

原文:评估第一第一第一

翻译:Hodnotenie prvéhoročníka, prvej časti,prvéhostupňa...

在某些语言中,单词在使用时会有不同的单词形式。例如,一个单词可以有10种不同的形式。如何告诉cakephp应用程序显示来自数据库的正确单词“first”?

2 个答案:

答案 0 :(得分:2)

问题后的某个时间,添加了__x()功能。它的目的正是为了在i18n文字中添加上下文。

一般帮助: https://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html#using-translation-functions

迁移指南: https://book.cakephp.org/2.0/en/appendices/2-6-migration-guide.html#basics-php

CakePHP 3的API信息: https://api.cakephp.org/3.4/function-__x.html

CakePHP 2的API信息: https://api.cakephp.org/2.9/function-__x.html

答案 1 :(得分:0)

CakePHP(至少1.3确实)提供了__d()函数。它被用作:

__d($domain, $message, $return)

您可以使用'域名'指定要翻译的单词的语法重要性。完成编写代码后,您将运行CakePHP的i18n控制台任务。这将在APP / locale /中创建多个.pot文件,这些文件将命名为.pot。文件名将是$ domain,因此您可以为每个语法意义获得一个.pot文件(实际上,我不知道这个问题的适当词汇)。

CakePHP的i18n控制台任务在你的应用程序文件中搜索翻译功能,然后将要翻译的字符串放在一个文件中,至少我认为这是它的工作方式。如果您要翻译的内容是动态的(在您的情况下),控制台任务将无法找到您的字符串,这意味着您必须自己构建.pot文件。如果所有您需要翻译的内容是动态的,您可能需要为每个语法重要性创建一个包含翻译功能的文件,然后运行控制台任务,这样您至少可以使用适当的文件。

对于需要翻译的字符串,生成的.pot文件将包含以下三行(除非该字符串被多次使用,在这种情况下,它将有一次出现,只有第一行将重复(略有不同)每次出现。)

#: /app_controller.php:129
msgid "Home"
msgstr ""

前面带有#标签的行仅供您参考(查看字符串出现的位置),如果您自己构建文件,则不需要添加它。 ' MSGID'是你要翻译的词/句子,' msgstr'是提供的翻译。 自己构建文件只需要反复复制这三行并更改msgid并输入一些内容作为翻译。我认为构建这些文件的最简单方法是首先构建一个文件,然后复制内容(因为msgid对所有这些文件都是相同的),然后输入相应的翻译。

完成后,将.pot文件移至APP / locale // LC_MESSAGES /并将其扩展名更改为.po。

这种方法显然只有在你想要翻译的单词数量固定的情况下才有效,因为翻译函数依赖于你在需要之前对.po文件中的翻译进行硬编码。因此,如果您正在翻译用户输入,这可能不会成为理想的解决方案。

来源: