有没有一种简单的方法可以从PHP中的国家代码中获取语言代码
我使用ISO 3166-1-alpha 2代码传递给应用程序以检索本地化提要,例如美国的/feed/us。我有一个switch语句,它基于该国家/地区代码提供提要有没有一种简单的方法可以从PHP中的国家代码中获取语言代码,php,locale,Php,Locale,我使用ISO 3166-1-alpha 2代码传递给应用程序以检索本地化提要,例如美国的/feed/us。我有一个switch语句,它基于该国家/地区代码提供提要 有没有办法将两位数代码转换为语言代码,例如en_US?我想知道是否有标准/函数/库可以在PHP中执行此操作,或者我是否需要构建自己的数组?您需要交叉引用这些文件: ..或者在这里将它们全部放在一个拉链中: 据我所知,当前没有返回此数据的set PHP函数。您无法自动将国家代码转换为语言代码,因为有些国家使用多种语言。另一方面,操
有没有办法将两位数代码转换为语言代码,例如en_US?我想知道是否有标准/函数/库可以在PHP中执行此操作,或者我是否需要构建自己的数组?您需要交叉引用这些文件: ..或者在这里将它们全部放在一个拉链中:
据我所知,当前没有返回此数据的set PHP函数。您无法自动将国家代码转换为语言代码,因为有些国家使用多种语言。另一方面,操作系统本地化系统可能支持不同国家的单一语言的多种变体(例如,en_GB vs en_US) 例如,瑞士(CH)常用德语和法语(据统计,分别占人口的64%和20%)。如果您必须为国家代码选择一种语言,那么对于某些人来说,这两种语言中的任何一种都是有意义的。请注意,瑞士的一些地区只使用德语或法语作为官方语言(但并非两者都使用,详情请参见) 如果你必须为每个国家选择一种语言,我建议为你支持的每个国家手工选择。对于半途而废的自动实现,您可以扫描可用的本地化,并选择在下划线后具有匹配国家代码的第一个本地化
还要注意一个推论:国旗不能代表语言,因为语言和国家没有1:1的关系。一对多的关系可以在两个方向上找到。正如其他人所指出的,由于许多国家都有多种语言,因此没有内置的功能。不幸的是,我不能给你们指出一个实现这一点的库,但我确实写了一个小函数,它可以满足你们的需要 有两个警告,一个是如果没有提供语言,它只会选择列表中的第一个语言环境。为了避免这种情况,您必须在函数调用周围添加一些逻辑,以便为其提供适当的语言。另一个是需要安装php5 intl
<?php
/**
/* Returns a locale from a country code that is provided.
/*
/* @param $country_code ISO 3166-2-alpha 2 country code
/* @param $language_code ISO 639-1-alpha 2 language code
/* @returns a locale, formatted like en_US, or null if not found
/**/
function country_code_to_locale($country_code, $language_code = '')
{
// Locale list taken from:
// http://stackoverflow.com/questions/3191664/
// list-of-all-locales-and-their-short-codes
$locales = array('af-ZA',
'am-ET',
'ar-AE',
'ar-BH',
'ar-DZ',
'ar-EG',
'ar-IQ',
'ar-JO',
'ar-KW',
'ar-LB',
'ar-LY',
'ar-MA',
'arn-CL',
'ar-OM',
'ar-QA',
'ar-SA',
'ar-SY',
'ar-TN',
'ar-YE',
'as-IN',
'az-Cyrl-AZ',
'az-Latn-AZ',
'ba-RU',
'be-BY',
'bg-BG',
'bn-BD',
'bn-IN',
'bo-CN',
'br-FR',
'bs-Cyrl-BA',
'bs-Latn-BA',
'ca-ES',
'co-FR',
'cs-CZ',
'cy-GB',
'da-DK',
'de-AT',
'de-CH',
'de-DE',
'de-LI',
'de-LU',
'dsb-DE',
'dv-MV',
'el-GR',
'en-029',
'en-AU',
'en-BZ',
'en-CA',
'en-GB',
'en-IE',
'en-IN',
'en-JM',
'en-MY',
'en-NZ',
'en-PH',
'en-SG',
'en-TT',
'en-US',
'en-ZA',
'en-ZW',
'es-AR',
'es-BO',
'es-CL',
'es-CO',
'es-CR',
'es-DO',
'es-EC',
'es-ES',
'es-GT',
'es-HN',
'es-MX',
'es-NI',
'es-PA',
'es-PE',
'es-PR',
'es-PY',
'es-SV',
'es-US',
'es-UY',
'es-VE',
'et-EE',
'eu-ES',
'fa-IR',
'fi-FI',
'fil-PH',
'fo-FO',
'fr-BE',
'fr-CA',
'fr-CH',
'fr-FR',
'fr-LU',
'fr-MC',
'fy-NL',
'ga-IE',
'gd-GB',
'gl-ES',
'gsw-FR',
'gu-IN',
'ha-Latn-NG',
'he-IL',
'hi-IN',
'hr-BA',
'hr-HR',
'hsb-DE',
'hu-HU',
'hy-AM',
'id-ID',
'ig-NG',
'ii-CN',
'is-IS',
'it-CH',
'it-IT',
'iu-Cans-CA',
'iu-Latn-CA',
'ja-JP',
'ka-GE',
'kk-KZ',
'kl-GL',
'km-KH',
'kn-IN',
'kok-IN',
'ko-KR',
'ky-KG',
'lb-LU',
'lo-LA',
'lt-LT',
'lv-LV',
'mi-NZ',
'mk-MK',
'ml-IN',
'mn-MN',
'mn-Mong-CN',
'moh-CA',
'mr-IN',
'ms-BN',
'ms-MY',
'mt-MT',
'nb-NO',
'ne-NP',
'nl-BE',
'nl-NL',
'nn-NO',
'nso-ZA',
'oc-FR',
'or-IN',
'pa-IN',
'pl-PL',
'prs-AF',
'ps-AF',
'pt-BR',
'pt-PT',
'qut-GT',
'quz-BO',
'quz-EC',
'quz-PE',
'rm-CH',
'ro-RO',
'ru-RU',
'rw-RW',
'sah-RU',
'sa-IN',
'se-FI',
'se-NO',
'se-SE',
'si-LK',
'sk-SK',
'sl-SI',
'sma-NO',
'sma-SE',
'smj-NO',
'smj-SE',
'smn-FI',
'sms-FI',
'sq-AL',
'sr-Cyrl-BA',
'sr-Cyrl-CS',
'sr-Cyrl-ME',
'sr-Cyrl-RS',
'sr-Latn-BA',
'sr-Latn-CS',
'sr-Latn-ME',
'sr-Latn-RS',
'sv-FI',
'sv-SE',
'sw-KE',
'syr-SY',
'ta-IN',
'te-IN',
'tg-Cyrl-TJ',
'th-TH',
'tk-TM',
'tn-ZA',
'tr-TR',
'tt-RU',
'tzm-Latn-DZ',
'ug-CN',
'uk-UA',
'ur-PK',
'uz-Cyrl-UZ',
'uz-Latn-UZ',
'vi-VN',
'wo-SN',
'xh-ZA',
'yo-NG',
'zh-CN',
'zh-HK',
'zh-MO',
'zh-SG',
'zh-TW',
'zu-ZA',);
foreach ($locales as $locale)
{
$locale_region = locale_get_region($locale);
$locale_language = locale_get_primary_language($locale);
$locale_array = array('language' => $locale_language,
'region' => $locale_region);
if (strtoupper($country_code) == $locale_region &&
$language_code == '')
{
return locale_compose($locale_array);
}
elseif (strtoupper($country_code) == $locale_region &&
strtolower($language_code) == $locale_language)
{
return locale_compose($locale_array);
}
}
return null;
}
?>
虽然效果不错,但我遇到了一些(一般)问题:
- 如果你调用
,他的代码将返回country\u code\u to\u locale(“FR”)
——根据维基百科,现在br FR
(Breton)甚至不是官方语言。虽然列表中有br
,但fr-fr
是数组中的第一个。许多其他国家也有这种情况br-fr
- 这里很难划清界限,加拿大和瑞士就是一个很好的例子,你当然想为一个国家保留多种语言
- 我只为大多数国家保留了一种语言,为一些国家保留了多种语言,如BE、CA、CH、ZA。我保留了美国的
,但我不确定这一点(维基百科上说:es
官方语言:联邦一级没有)
- 我还为我懒得研究或同时使用拉丁语和西里尔语的国家保留了多种语言
- 我添加了
将随机化数组,这样我们就可以得到多语言国家的随机地区。这对于我的用例来说是有意义的,但是您可能想删除它shuffle($locales)
- 就我而言,只有在网络上具有相关流行性的语言才有兴趣。这份清单绝非完整或正确,而是务实的
$locales = array('af-ZA',
'am-ET',
'ar-AE',
'ar-BH',
'ar-DZ',
'ar-EG',
'ar-IQ',
'ar-JO',
'ar-KW',
'ar-LB',
'ar-LY',
'ar-MA',
'ar-OM',
'ar-QA',
'ar-SA',
'ar-SY',
'ar-TN',
'ar-YE',
'az-Cyrl-AZ',
'az-Latn-AZ',
'be-BY',
'bg-BG',
'bn-BD',
'bs-Cyrl-BA',
'bs-Latn-BA',
'cs-CZ',
'da-DK',
'de-AT',
'de-CH',
'de-DE',
'de-LI',
'de-LU',
'dv-MV',
'el-GR',
'en-AU',
'en-BZ',
'en-CA',
'en-GB',
'en-IE',
'en-JM',
'en-MY',
'en-NZ',
'en-SG',
'en-TT',
'en-US',
'en-ZA',
'en-ZW',
'es-AR',
'es-BO',
'es-CL',
'es-CO',
'es-CR',
'es-DO',
'es-EC',
'es-ES',
'es-GT',
'es-HN',
'es-MX',
'es-NI',
'es-PA',
'es-PE',
'es-PR',
'es-PY',
'es-SV',
'es-US',
'es-UY',
'es-VE',
'et-EE',
'fa-IR',
'fi-FI',
'fil-PH',
'fo-FO',
'fr-BE',
'fr-CA',
'fr-CH',
'fr-FR',
'fr-LU',
'fr-MC',
'he-IL',
'hi-IN',
'hr-BA',
'hr-HR',
'hu-HU',
'hy-AM',
'id-ID',
'ig-NG',
'is-IS',
'it-CH',
'it-IT',
'ja-JP',
'ka-GE',
'kk-KZ',
'kl-GL',
'km-KH',
'ko-KR',
'ky-KG',
'lb-LU',
'lo-LA',
'lt-LT',
'lv-LV',
'mi-NZ',
'mk-MK',
'mn-MN',
'ms-BN',
'ms-MY',
'mt-MT',
'nb-NO',
'ne-NP',
'nl-BE',
'nl-NL',
'pl-PL',
'prs-AF',
'ps-AF',
'pt-BR',
'pt-PT',
'ro-RO',
'ru-RU',
'rw-RW',
'sv-SE',
'si-LK',
'sk-SK',
'sl-SI',
'sq-AL',
'sr-Cyrl-BA',
'sr-Cyrl-CS',
'sr-Cyrl-ME',
'sr-Cyrl-RS',
'sr-Latn-BA',
'sr-Latn-CS',
'sr-Latn-ME',
'sr-Latn-RS',
'sw-KE',
'tg-Cyrl-TJ',
'th-TH',
'tk-TM',
'tr-TR',
'uk-UA',
'ur-PK',
'uz-Cyrl-UZ',
'uz-Latn-UZ',
'vi-VN',
'wo-SN',
'yo-NG',
'zh-CN',
'zh-HK',
'zh-MO',
'zh-SG',
'zh-TW');
以及守则:
function country_code_to_locale($country_code)
{
$locales = ...
// randomize the array, such that we get random locales
// for countries with multiple languages (CA, CH)
shuffle($locales);
foreach ($locales as $locale) {
$locale_region = locale_get_region($locale);
if (strtoupper($country_code) == $locale_region) {
return $locale;
}
}
return "en-US";
}
正如其他答案所指出的,国家和语言之间没有一对一的映射。但是,如果安装了PHP
Intl
扩展,则可以使用Unicode CLDR获取特定国家/地区的“默认”或“可能”语言:
函数getLanguage(字符串$country):字符串{
$subtags=\ResourceBundle::create('likelySubtags','ICUDATA',false);
$country=\Locale::规范化('und.'$country');
$locale=$subtags->get($country)?:$subtags->get('und');
return\Locale::getPrimaryLanguage($Locale);
}
现在,当您使用国家代码调用getLanguage()
函数时,您会得到相应的语言代码:
getLanguage('US');//“嗯”
getLanguage('GB');//“嗯”
getLanguage('DE');//“德”
getLanguage('CH');//“德”
getLanguage('IN');//“嗨”
getLanguage('NO');//“注意”
getLanguage('BR');//“pt”
这也适用于三个字母的国家/地区代码:
getLanguage('USA');//“嗯”
getLanguage('GBR');//“嗯”
getLanguage('AUT');//“德”
getLanguage('FRA');//“fr”
甚至代码:
getLanguage('003');//“嗯”
getLanguage('013');//“es”
getLanguage('039');//“它”
getLanguage('155');//“德”
CH应该使用哪种语言代码?“在”?“否”?看看新的列表,答案中提供的列表已经过时了。这一个包含422-460个条目。我想建议,如果您的目标是使用区域设置为本地市场设置货币格式,那么有一种策略可以解决这一问题:如果您的语言区域设置目标是正确显示货币值,那么我发现了一种简单的解决方法,它可以“确定”:在您的国家代码前加上“en_uu”。货币显示将默认为该国家/地区的通用标准。mikko你知道这个世界,这是一个很好的答案。作为一个瑞士人,我想说的是,在一个使用多种语言的国家,人们通常会选择使用本国语言的国家