我使用ISO 3166-1-alpha 2代碼傳遞給應用程序以檢索本地化的Feed/feeds/us爲美國。我有一個switch語句,它根據country_code提供一個feed。是否有一種簡單的方法從PHP中的國家/地區代碼獲取語言代碼
有沒有辦法將兩位數字的代碼轉換成語言代碼例如en_US?我想知道是否有一個標準/函數/庫在PHP中執行此操作,或者是否需要構建自己的數組?
我使用ISO 3166-1-alpha 2代碼傳遞給應用程序以檢索本地化的Feed/feeds/us爲美國。我有一個switch語句,它根據country_code提供一個feed。是否有一種簡單的方法從PHP中的國家/地區代碼獲取語言代碼
有沒有辦法將兩位數字的代碼轉換成語言代碼例如en_US?我想知道是否有一個標準/函數/庫在PHP中執行此操作,或者是否需要構建自己的數組?
正如其他人所指出的那樣,由於許多國家擁有多種語言的現實,因此沒有內置功能。所以不幸的是,我不能指出你這樣做的一個圖書館,但我確實繼續寫一個你想要的功能。
有兩個警告,一個是如果它沒有提供一種語言,它只會選擇列表中的第一個語言環境。爲了解決這個問題,你必須在函數調用周圍添加一些邏輯來爲它提供適當的語言。另一個是它需要安裝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;
}
?>
您將要交叉引用這些文件:
http://www.ethnologue.com/codes/LanguageIndex.tab http://www.ethnologue.com/codes/CountryCodes.tab http://www.ethnologue.com/codes/LanguageCodes.tab
..or get them all in one zip here: http://www.ethnologue.com/codes/Language_Code_Data_20110104.zip
目前沒有一套PHP函數返回這個數據,我所知道的。
您不能自動將國家代碼轉換爲語言代碼,因爲有些國家使用多種語言。另一方面,OS本地化系統可以支持不同國家的單一語言的多種變體(例如,en_GB和en_US)。
例如,瑞士(CH)有德國和法國常用的(根據http://en.wikipedia.org/wiki/Switzerland,人口的64%和20%)。如果您必須爲國家/地區代碼選擇單一語言,那麼這些語言中的任何一種都可能對某些人有意義。請注意,瑞士的一些地區只使用德語或法語作爲官方語言(但不是兩種語言,詳見http://en.wikipedia.org/wiki/File:Sprachen_CH_2000_EN.svg)。
如果您必須爲每個國家/地區選擇一種語言,我建議您爲您支持的每個國家/地區手動進行選擇。對於半自動實現,您可以掃描可用的本地化,並選擇第一個具有匹配國家代碼的下劃線。
mikko你知道這個世界和質量的答案。作爲一個瑞士人,我想說的是,在一個多語種的國家,通常選擇該國的語言。我以蘋果爲例,他們在CH_de和CH_fr之間切換,或者在Schweiz-German和Suisse-Français之間進行拼寫。 – 2012-05-01 00:36:04
@ endo.anaconda:我想你的意思是de_CH和fr_CH。我不知道使用國家名稱和語言名稱是一種常見的標籤風格。在芬蘭,現場sv_FI通常被稱爲「suomenruotsi」,它直接轉換爲「芬蘭瑞典」,而不是「芬蘭瑞典」。 – 2012-05-02 10:46:56
的answer from TheJF是相當不錯的,但是有一些我碰到幾個(一般)問題:
他的代碼將返回br-FR
如果你打電話country_code_to_locale("FR")
- 現在br
(布雷頓)是根據維基百科,甚至沒有官方語言。儘管fr-FR
在列表中,但br-FR
是該陣列中的第一個。這也發生在許多其他國家。
許多其他區域列表正努力成爲的極端完整,並考慮所有可能的語言
,很難在這裏畫線,很好的例子,你一定要保持多語言的國家是:加拿大和瑞士
我帶着簡單的方法:
我保留大多數國家/地區只有1種語言,對於BE,CA,CH,ZA等一些國家/地區保留了多個語言。我一直es-US
,但我不知道這一點(維基百科說:Official languages: None at federal level
)
我還不停多種語言的國家我是懶得研究或同時使用,拉丁文和西里爾
我加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";
}
應該 「CH」 使用哪種語言的代碼? 「在」? 「沒有」? – 2012-04-16 14:10:25
查看新列表,答案中提供的列表已過時。這個包含422-460個條目。 http://msdn.microsoft.com/en-us/library/cc233968.aspx – 2013-09-28 01:29:59
我打算建議,如果你的目標是使用區域設置本地市場的貨幣格式,那麼有一種策略是通過HACKS來實現的: – 2017-10-12 08:25:13