en_UK是否是非法区域设置?


Is en_UK an illegal locale?

到目前为止,我一直用'en_UK'来表示英式英语。今天我得到了一个错误,当使用它与Zend框架,因为区域设置不包括在可识别的区域设置的长列表。

以下是该列表的简短摘录:

'ee_GH' => true, 'ee_TG' => true, 'ee'    => true, 'el_CY' => true, 'el_GR' => true,
'el'    => true, 'en_AS' => true, 'en_AU' => true, 'en_BE' => true, 'en_BW' => true,
'en_BZ' => true, 'en_CA' => true, 'en_GB' => true, 'en_GU' => true, 'en_HK' => true,
'en_IE' => true, 'en_IN' => true, 'en_JM' => true, 'en_MH' => true, 'en_MP' => true,
'en_MT' => true, 'en_NA' => true, 'en_NZ' => true, 'en_PH' => true, 'en_PK' => true,
'en_SG' => true, 'en_TT' => true, 'en_UM' => true, 'en_US' => true, 'en_VI' => true,
'en_ZA' => true, 'en_ZW' => true, 'en'    => true, 'eo'    => true, 'es_AR' => true,
'es_BO' => true, 'es_CL' => true, 'es_CO' => true, 'es_CR' => true, 'es_DO' => true,

正如你所看到的,有各种各样的领土使用英语,还有一个条目'en_GB',我认为它代表大不列颠…但是没有"en_UK"。这只是Zend框架中的一个"bug",还是有其他原因?

正确的国家代码为en_GB。区域设置使用ISO 3166-1作为国家代码。维基百科的描述包括:

选择的代码,根据ISO 3166/MA,"以反映重要的,唯一的组成部分的国家名称,以便允许国家名称和国家代码之间的视觉关联"。[7]对于这个原因是,国家名称的常见组成部分,如"共和国"、"王国"、"United"、"Federal"或"Democratic"通常不用于派生代码元素。因此,比如英国英国的官方代号是GB而不是UK,基于它的正式名称是"大不列颠和北方联合王国"爱尔兰"(尽管英国应联合王国的要求保留)王国)。

这确实是一个常见的错误。en_UK错了。英国的ISO国家代码是GB,所以语言标签是en_GB。

不完美的实现

从1985年开始,ISO 3166-1 alpha-2代码已用于作为国家代码顶级域名(cctld)的域名系统。的互联网号码分配机构目前负责分配cctld大多数都遵循α -2代码,但也有少数例外。[9]为例如,英国使用。uk,其alpha-2代码为GB而不是。gb作为其ccTLD,因为英国目前特别保留在ISO 3166-1中,应英国的要求。

根据维基百科http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2.

所以很明显这是一个古老的东西,被卡住了或类似的东西

编辑:martin clayton找到了一个更好的答案。

您不能简单地发明区域设置!它们已经定义好了。所以"en-gb"是英式英语,而"en-us"是美式英语。如果你使用"en-uk",你只是在编一个代码。

至于为什么官方代码是"en-gb"而不是"en-uk",我认为基本上是因为没有所谓的"联合王国英语"。这种语言的变体是英国语。注意大不列颠和联合王国的区别是:

UK = GB +北爱尔兰

因此,通过将变体命名为"en-UK",就好像你想把北爱尔兰人的说话方式包括在这一类别中。但你为什么要这么做?从语言学的角度来看,这是没有意义的,因为北爱尔兰英语比英国英语更接近爱尔兰英语(en-IE)。

在ISO 3166中,大不列颠及北爱尔兰联合王国的正确国家代码出于某种原因是"GB",所以区域代码应该是en_GB,而不是这里提到的en_UK。

en_GB也被glibc, gnome, kde等使用

我也喜欢这样的事实,许多以前的错误修复在开源项目中都与此相关,如apache http 1.3和roundcube项目