cakephp、i18n .po 文件,如何正确使用它们

Posted

技术标签:

【中文标题】cakephp、i18n .po 文件,如何正确使用它们【英文标题】:cakephp, i18n .po files, How to use them correctly 【发布时间】:2011-01-31 05:24:50 【问题描述】:

我终于设法建立了一个多语言的 cakephp 网站。 虽然没有完成,但这是我第一次可以在引导程序中更改 DEFAULT_LANGUAGE 并且我可以看到要更改的语言。

我现在的问题是我不能很好地理解如何正确使用 po 文件。 根据我使用过的教程,我需要创建一个文件夹 /app/locale 并在该文件夹内为每种语言创建一个文件夹,格式如下:/locale/eng/LC_MESSAGES。

我已经做到了,我还设法使用 cake i18n extract 提取了一个 default.pot 文件。并且似乎已成功找到所有出现的 __() 函数。

在我的应用程序中,我使用了 2 种语言:eng 和 gre。 我明白为什么每种语言都需要一个单独的文件夹。 但是,在我的情况下,当我编辑每个文件夹中的 po 文件时,什么都没有发生……几乎什么都没有。如果我编辑 /app/locale/gre/LC_MESSAGES/default.po 我没有语言更改。如果我编辑 /app/locale/eng​​strong>/LC_MESSAGES/default.po,则语言会更改为新值(在翻译字段上),并且不会切换到其他语言。

我做错了什么。 我希望我尽可能清楚地表达自己。

【问题讨论】:

我想我做对了....当我有 2 种语言而是 1 种语言时,我不应该使用两个文件夹。因此,如果我的默认语言是 eng,那么我应该为第二种语言使用一个文件夹语言 gre。 这里可以找到使用poedit的简单国际化教程:wpy.me/en/blog/… 【参考方案1】:

有不同的方法来解决它。最简单的方法是以主要语言编写应用程序并将所有可翻译的字符串包装在__() 中。稍后您可以为您可能需要的每个翻译添加.po 文件。

这种方法的问题是,如果您要更改原始语言中的文本,您还需要更改您可能拥有的每个.po 文件中此字符串的msgid 条目。如果您必须支持多种不同的语言,这可能会变得非常麻烦。

请忽略上面的旧信息。正确设置的 i18n 工作流程将使用 xgettext 或类似实用程序自动从源代码中提取 __() 包装的字符串并生成、更新和合并 .po 文件。没有什么麻烦的。


另一种方法是在源文件中使用“描述符”文本并将实际文本放入.po 文件中,即使对于主要语言也是如此。即:

__('PRODUCT CAPTION');

/eng/.po
msgid "PRODUCT CAPTION"
msgstr "Buy our awesome products!"

/ger/.po
msgid "PRODUCT CAPTION"
msgstr "Kaufen Sie unsere Produkte!"

什么效果更好取决于项目和你,你必须弄清楚......

【讨论】:

什么时候被认为是“描述符”文本?大写? @ters 这纯粹是概念性的,“描述符”甚至不是官方术语 AFAIK。我的意思是“显然是占位符的东西”。【参考方案2】:

使用

Configure::write('Config.language', 'fr');

将用户的语言设置为法语。

【讨论】:

以上是关于cakephp、i18n .po 文件,如何正确使用它们的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 本地化拒绝工作

odoo国际化翻译

如何正确模拟i18n for Jest

如何使 Angular 11 i18n 在 NRWL NX workspace.json 中工作?

django - 如何使翻译工作?

玩I18N库