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

如何在CakePhp i18n中为单词添加上下文?,cakephp,internationalization,Cakephp,Internationalization,我正在使用Cakephp国际化,希望为这个词提供上下文。 消息以英语编写,作为应用程序中的默认语言。 一些(粗体)消息来自数据库。 例如: 原文:对第一等级第一部分第一等级的评估 翻译:Hodnotenieprvéhoročníka,prvejprvéhostupňa 在某些语言中,单词在不同的单词中有不同的形式。例如,一个单词可以有10种不同的形式。如何告诉cakephp应用程序显示来自数据库的单词“first”的正确形式?cakephp(至少1.3版本)提供了uu d()函数。它被用作: _

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

原文:对第一等级第一部分第一等级的评估

翻译:Hodnotenieprvéhoročníka,prvejprvéhostupňa

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

cakephp(至少1.3版本)提供了uu d()函数。它被用作:

__d($domain, $message, $return)
您可以使用“域”指定要翻译的单词的语法意义。编写完代码后,您将运行CakePHP的i18n控制台任务。这将在APP/locale/中创建多个名为.pot的.pot文件。文件名将是$domain,因此您将得到一个.pot文件,用于您定义的每个语法意义(实际上,我不知道合适的单词)

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

对于需要翻译的字符串,生成的.pot文件将包含以下三行(除非该字符串被多次使用,否则该字符串将出现一次,每次出现时仅重复第一行(略有不同)

前面带有hashtag的行只是供您参考(查看字符串出现的位置),如果您自己构建文件,则无需添加该行“msgid”是您要翻译的单词/senctence,“msgstr”是提供的翻译。 自己构建文件只需要一遍又一遍地复制这三行,更改msgid并输入一些内容作为翻译。我认为构建这些文件最简单的方法是先构建一个文件,然后复制内容(因为所有这些文件的msgid都是相同的),然后输入适当的翻译

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

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

资料来源:

  • 拥有CakePHP的i18n功能的经验
  • 示例是从我正在使用的应用程序中的一个.pot文件复制的

在提问后的一段时间,添加了
\uux()
函数。它正是为了将上下文添加到i18n文本中

一般帮助:

迁移指南:

CakePHP 3的API信息:

CakePHP 2的API信息:

prvého和prvej的语法区别是什么?这需要什么样的上下文信息?还有,“第一”是动态的吗?即,是否要动态生成1→ “第一”,2→ “第二”等等?光是英语就很难做到这一点,更不用说你提到的语法差异了。在这种情况下,简单的选择是避免使用序数,而是输出“1级第1部分1级评估…”。否则,您将不得不编写大量代码。:)语法上的区别在于prvého是男性的形式,属格,单数。prvej是女性的形式,属格,单数。是的,在斯洛伐克语中,事物可以有自己的性别。序号是必需的。我不能用数字代替它们,所以,这意味着我需要为每种形式的单词创建单独的.po文件?我正在寻找一些像复数形式这样优雅的东西。事实上,每个单词的形式都需要一个文件(当然,每个文件都包含多个单词)。虽然我现在意识到,对于男性/女性、复数/单数和多个语法格,这可能相当多的文件。在这种情况下,我建议使用上述答案的改编,使用其中一个或这些函数在使用上类似,只是我没有使用它们的经验。遗憾的是,这本书(1.3版)没有解释它们。您可能需要自己对其工作方式进行一些研究,但这些函数应该支持单/复数和多计数,因为(quote)“某些语言的复数消息形式不止一种,取决于计数。”澄清上述评论:您可能“误用”了$count参数来定义语法格。为了简化编程,您可以将某些count integer映射到bootstrap数组中它们的语法大小写,这样您就不需要记住正确的整数,而是可以使用类似maleginitin的字符串来表示Male Genitiv Singular。如果这看起来更有希望,我可以做更多的研究,并更新我的上述答案。让我知道。。
#: /app_controller.php:129
msgid "Home"
msgstr ""