不一致?在关于translate behaviour in the CakePHP 3 book的章节中,使用了三个字母的代码,这些代码源自英文名称,而不是像ISO 639-2这样的语言的本地名称:
eng (english)
spa (spanish)
使用此示例更改语言:
I18n::locale('spa');
但在chapter about Internationalization and Localization中说
翻译文件夹可以是该语言的双字母ISO代码,也可以是完整的语言环境名称,例如fr_FR,es_AR,da_DK,其中包含语言和使用该语言的国家/地区。
更改语言的示例如下所示:
use Cake\I18n\I18n;
I18n::locale('de_DE');
关于translate behaviour
过时的章节或所有方法都是正确的吗?我认为最好是保持一致并在Translate behaviour
和Internationalization and Localization
使用相同的语言代码?
此外,i18n架构表示例将字段locale
定义为varchar(6)
...如果需要3个字母代码varchar(3)
应该足够......但即使我使用像fr_FR
varchar(5)这样的完整本地代码就足够了。为什么示例模式使用varchar(6)
?
答案 0 :(得分:3)
我不会说Translate behvaiour章已经过时了,因为它可以正常工作。翻译行为不会对语言标识符施加任何限制,可能的值仅受locale
列类型/大小的限制,即使用spa
将正常工作。 6的长度可能只是一个错字,或者它可能会考虑UN M.49(es-419
),谁知道。
但翻译文件夹名称确实受到限制,仅限于ext-intl
应用的规则。确切地说,文件夹名称来自Locale::parseLocale()
的返回值,例如,它将为es
返回spa
。
参见 Source > \Cake\I18n\MessagesFileLoader::translationsFolders()
因此,您可以在应用和翻译表中使用spa
这样的三个字母代码,但翻译文件夹必须使用双字母代码,即es
。
我同意在整本书中保持这种一致性可能会很好,也许还有一些关于后台会发生什么的额外信息。您可能想要创建一个问题(甚至通过PR自己修复)over at GitHub。