【问题标题】:CakePHP Translate - How to refer to languagesCakePHP 翻译 - 如何引用语言
【发布时间】:2013-10-29 09:18:08
【问题描述】:

我正在开发一个使用以下 CakePHP 功能的网站:

  • .po 文件用于 ctp 文件中的静态字符串
  • 数据库存储字符串的翻译行为

即使我已阅读文档,我也不确定如何在不同地方统一引用语言。

以德语为例,下面的?用什么代替:

设置区域设置以便 CakePHP 知道要使用哪个 po 文件

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

我猜是deu

po 文件的路径

/app/locale/?/LC_MESSAGES/default.po

我猜是deu

以特定语言保存

As per the docs.

$this->Post->locale = '?';

这个例子让我感到困惑,因为示例显示了 de_de。这会自动映射到我的Config.language 吗?

如果是这样,我在哪里可以找到这些映射?

【问题讨论】:

  • 请务必提及您的确切 CakePHP 版本!

标签: cakephp internationalization


【解决方案1】:

在 Cake 1.3 中,我用过

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

查找 /locale/ger/LC_MESSAGES/default.po;正如您所指出的,事后看来,这是错误的,因为德语的“官方”代码是“deu”。但是,我认为您可以为您的语言使用任何标识符,只要它位于正确的子目录中即可。

当您想使用 locale() 函数来格式化数字、日期等时,会发生有趣的部分:

    setlocale (LC_TIME, 'de_DE');
    setlocale (LC_MONETARY, 'de_DE');

但是,请注意http://php.net/manual/en/function.setlocale.php 关于使用 setlocale 的警告。

--- 修正

您必须记住,语言环境与语言完全不同。语言环境指定如何格式化数字、时间、金钱、比较字符串并对其进行排序。是的,语言环境也有用于翻译的 LC_MESSAGES 类别。但请听我说完。

一种语言可以在许多国家/地区使用,因此您认为您可以在所有这些国家/地区使用您的翻译。但是你很快就会遇到问题。例如,英国、美国、加拿大和许多其他国家都使用英语,但差异很小。但是打印 date 是另一回事。美国使用月/日/年格式,而英国使用日/月/年。一些国家在字段之间使用斜线,其他国家使用破折号或圆点;有些使用月份的名称而不是数字。等等。

因此,本地化用于特定的国家,而不是语言。但是,有些国家使用一种以上的语言。这就是本地化字符串包含两部分的原因:第一部分是语言,第二部分是国家(例如 de_BE、fr_BE、nl_BE 甚至 wa_BE)。

IMO 令人困惑的部分是消息翻译也是语言环境的一部分。对于某些语言,这是有道理的,例如葡萄牙语和巴西都使用葡萄牙语,但其差异足以保证不同的翻译文件(pt_PT 与 pt_BR)。另一方面,据我所知,法语在所有地方都有 99.99% 的相同,但是为法国、加拿大、瑞士、比利时和卢森堡复制相同的语言文件会相当麻烦。因此,大多数程序员在构建多语言站点时都会选择“语言”文件,然后将各个国家/地区联合起来。 CakePHP 有一个类似的半生不熟(如果你原谅双关语...)的方法:语言文件和本地化。

回到您的帖子:如果谈论本地化,您应该使用“de_DE”样式字符串。当仅谈论一种语言时,ISO 639:2 中的 3 个字母代码应该可以工作......这也可能有助于将两者分开。

【讨论】:

  • 感谢您的回答。特别是对区域设置和语言之间的区别的澄清。
猜你喜欢
  • 2012-09-08
  • 2012-03-25
  • 2013-03-10
  • 2013-05-10
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
相关资源
最近更新 更多