CakePHP 3.1:用于翻译行为的语言字母代码 (i18n)

CakePHP 3.1: Language letter codes to use with translate behaviour (i18n)

不一致?在关于 translate behaviour in the CakePHP 3 book there are three-letter codes used, derived from English names rather than native names of language like ISO 639-2 的章节中:

eng (english)
spa (spanish)

用这个例子来改变语言:

I18n::locale('spa');

但是在chapter about Internationalization and Localization中它说

Translation folders can either be the two letter ISO code of the language or the full locale name such as fr_FR, es_AR, da_DK which contains both the language and the country where it is spoken.

更改语言的示例如下所示:

use Cake\I18n\I18n;
I18n::locale('de_DE');

所以关于 translate behaviour 的章节是过时了还是所有方法都正确?我认为在 Translate behaviourInternationalization and Localization?

中保持一致并使用相同的语言代码可能更好

此外,i18n 架构 table 示例将字段 locale 定义为 varchar(6)...如果需要 3 字母代码 varchar(3) 应该足够了。 . 但即使我使用像 fr_FR varchar(5) 这样的完整本地代码也足够了。为什么示例架构使用 varchar(6)?

我不会说“翻译行为”一章已经过时,因为它可以正常工作。 Translate 行为不会对语言标识符施加任何限制,可能的值仅受 locale 列 type/size 限制,即使用 spa 就可以正常工作。 6 的长度可能只是一个错字,也可能是考虑了 UN M.49 (es-419),谁知道呢。

然而,翻译文件夹名称确实受到限制,仅限于 ext-intl 应用的规则。确切地说,文件夹名称是根据 Locale::parseLocale() 的 return 值得出的,例如 return es 表示 spa

Source > \Cake\I18n\MessagesFileLoader::translationsFolders()

所以你实际上可以在你的应用程序和你的翻译 table 中使用像 spa 这样的三个字母代码,但是翻译文件夹必须使用两个字母代码,即 es .

我同意在整本书中保持一致会很好,也许还有一些关于背景中发生的事情的额外信息。你可能想创建一个问题(或者甚至通过 PR 自己修复它)over at GitHub.