基本上我有很多语言代码
it, en, en-GB, de, de-CH, and so on...
,如果尚未指定国家/地区代码,我需要从这些代码中获得完整的区域设置代码format: LANGCODE-COUNTRYCODE
以及该语言的默认国家/地区。
我的意思/需要的一个例子:
INPUT OUTPUT
it -> it-IT
it-IT -> it-IT
en-GB -> en-GB
en -> en-US
es-AR -> es-AR
es-MX -> es-MX
es -> es-ES
是否有任何我不知道的库或在 PHP 中实现此目的的简单方法?
我已经尝试在谷歌上寻找解决方案很多次,但要么它不存在,要么我只是使用了错误的关键字...... 我真的需要手工制作一个手动数组吗?我确信一定有更好的方法!
感谢 iso.org 和 localeplanet.com 的帮助,再加上一些很好的旧谷歌搜索和大量的苦劳,我想出了下面这个列表。 它可能并不完美,但它会为我完成工作......我希望它对其他人有帮助!
<?php
$defaultLocales = [
'af' => 'af-ZA',
'am' => 'am-ET',
'as' => 'as-IN',
'az' => 'az-AZ',
'ba' => 'ba-RU',
'be' => 'be-BY',
'bg' => 'bg-BG',
'bn' => 'bn-IN',
'bo' => 'bo-CN',
'br' => 'br-FR',
'ca' => 'ca-ES',
'co' => 'co-FR',
'cs' => 'cs-CZ',
'cy' => 'cy-GB',
'da' => 'da-DK',
'de' => 'de-DE',
'el' => 'el-GR',
'en' => 'en-US',
'es' => 'es-ES',
'et' => 'et-EE',
'eu' => 'eu-ES',
'fi' => 'fi-FI',
'fo' => 'fo-FO',
'fr' => 'fr-FR',
'fy' => 'fy-NL',
'ga' => 'ga-IE',
'gd' => 'gd-IE',
'gl' => 'gl-ES',
'gu' => 'gu-IN',
'he' => 'he-IL',
'hi' => 'hi-IN',
'hr' => 'hr-HR',
'hu' => 'hu-HU',
'hy' => 'hy-AM',
'id' => 'id-ID',
'in' => 'in-ID',
'is' => 'is-IS',
'it' => 'it-IT',
'iw' => 'iw-IL',
'ja' => 'ja-JP',
'ka' => 'ka-GE',
'kk' => 'kk-KZ',
'kl' => 'kl-GL',
'km' => 'km-KH',
'kn' => 'kn-IN',
'ko' => 'ko-KR',
'kok' => 'kok-IN',
'ky' => 'ky-KG',
'lo' => 'lo-LA',
'lt' => 'lt-LT',
'lv' => 'lv-LV',
'mi' => 'mi-NZ',
'mk' => 'mk-MK',
'ml' => 'ml-IN',
'mn' => 'mn-MN',
'mr' => 'mr-IN',
'ms' => 'ms-MY',
'mt' => 'mt-MT',
'nb' => 'nb-NO',
'ne' => 'ne-NP',
'nl' => 'nl-NL',
'nn' => 'nn-NO',
'oc' => 'oc-FR',
'or' => 'or-IN',
'pl' => 'pl-PL',
'ps' => 'ps-AF',
'pt' => 'pt-PT',
'ro' => 'ro-RO',
'ru' => 'ru-RU',
'rw' => 'rw-RW',
'sa' => 'sa-IN',
'si' => 'si-LK',
'sk' => 'sk-SK',
'sq' => 'sq-AL',
'sr' => 'sr-RS',
'sv' => 'sv-SE',
'ta' => 'ta-IN',
'te' => 'te-IN',
'th' => 'th-TH',
'tk' => 'tk-TM',
'tr' => 'tr-TR',
'tt' => 'tt-RU',
'uk' => 'uk-UA',
'ur' => 'ur-PK',
'uz' => 'uz-UZ',
'vi' => 'vi-VN',
'wo' => 'wo-SN',
'xh' => 'xh-ZA',
'zh' => 'zh-CN',
'zu' => 'zu-ZA'
];
function getLocaleFromLang($lang) {
global $defaultLocales;
return $defaultLocales[$lang] ?? $lang;
}
?>
如果您对我如何改进有任何建议,请随时在下面评论!
[编辑]
我使用的标准的解释。
如果您有意大利语 it 语言,我们可以假设它是意大利意大利语的 it-IT。否则,您可以为瑞士的意大利语指定 it-CH,或为圣马力诺的意大利语指定 it-SM。在这种情况下,这很容易。
英语不一样。如果您应用相同的规则,那么 en-GB 将成为默认值,而不是 en-US。在我看来,这应该是这样,但在 IT 世界中 en-US 作为大多数程序的默认区域设置几十年后,这在这里也是正确的。
我想说一半的“默认”是简单的,但也有很多奇怪的情况,我不熟悉语言或国家...... 当这种情况发生时,如果前一个解决方案没有结论,我必须查找哪个国家/地区的母语人数最多,或者将语言与原籍国联系起来的其他内容。
有些情况是没有希望的,比如阿拉伯语。这是一种在许多国家/地区广泛使用的语言,我觉得没有必要提供“默认”语言环境...
解释我为什么需要这个。
我愿意做出这些“歧视”,原因只有一个: 这只是后备情况!
在输入中,我大多得到由语言和国家/地区代码组成的区域设置,例如 en-AU、es-AR、pt-BR 等...然后,有时,在某些情况下,它只是语言代码。当这种情况发生时,一些小机械装置就会损坏。首先,数字、值等的格式...
这主要是用户输入的意外情况,用户可以选择指定语言的国家/地区,但如果不这样做,则只会插入语言代码... 我被完整的区域设置代码和语言代码的混合所困扰,并且当仅提供语言时,我必须尝试回退到默认区域设置,以便我可以尝试保持其余代码/格式按用户的预期工作!
希望这能澄清情况
您在后续评论中描述的规则只不过是您对哪些国家对于特定语言“更重要”的主观看法。你选择西班牙,因为西班牙语最初来自那里,但然后选择美国作为英语(没有提到德语,但它可能早于德国本身)。您找不到此类规则集的算法,因此除了编写我们自己的硬编码列表之外没有其他方法。一旦你这样做了,PHP 部分就可以像数组查找一样简单:
$defaults = [
'it' => 'it-IT',
'en' => 'en-US',
'es' => 'es-ES',
// ...
];
$requests = [
'it',
'it-IT',
'en-GB',
'en',
'es-AR',
'es-MX',
'es',
];
foreach ($requests as $input) {
$output = $defaults[$input] ?? $input;
echo "$input -> $output\n";
}