2012-04-16 23 views
10

我使用ISO 3166-1-alpha 2代碼傳遞給應用程序以檢索本地化的Feed/feeds/us爲美國。我有一個switch語句,它根據country_code提供一個feed。是否有一種簡單的方法從PHP中的國家/地區代碼獲取語言代碼

有沒有辦法將兩位數字的代碼轉換成語言代碼例如en_US?我想知道是否有一個標準/函數/庫在PHP中執行此操作,或者是否需要構建自己的數組?

+2

應該 「CH」 使用哪種語言的代碼? 「在」? 「沒有」? – 2012-04-16 14:10:25

+0

查看新列表,答案中提供的列表已過時。這個包含422-460個條目。 http://msdn.microsoft.com/en-us/library/cc233968.aspx – 2013-09-28 01:29:59

+0

我打算建議,如果你的目標是使用區域設置本地市場的貨幣格式,那麼有一種策略是通過HACKS來實現的: – 2017-10-12 08:25:13

回答

12

正如其他人所指出的那樣,由於許多國家擁有多種語言的現實,因此沒有內置功能。所以不幸的是,我不能指出你這樣做的一個圖書館,但我確實繼續寫一個你想要的功能。

有兩個警告,一個是如果它沒有提供一種語言,它只會選擇列表中的第一個語言環境。爲了解決這個問題,你必須在函數調用周圍添加一些邏輯來爲它提供適當的語言。另一個是它需要安裝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; 
} 
?> 
+1

您使用的這個列表比較陳舊,請查看最新版本,其中包含約422-460個條目。 http://msdn.microsoft.com/en-us/library/cc233968.aspx – 2013-09-28 01:28:09

+0

致命錯誤:在php shell代碼中調用未定義的函數locale_get_region() – talsibony 2016-07-25 06:06:36

+0

@talsibony您是否已經安裝了intl擴展? – alle 2016-08-11 12:01:38

4

您不能自動將國家代碼轉換爲語言代碼,因爲有些國家使用多種語言。另一方面,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)。

如果您必須爲每個國家/地區選擇一種語言,我建議您爲您支持的每個國家/地區手動進行選擇。對於半自動實現,您可以掃描可用的本地化,並選擇第一個具有匹配國家代碼的下劃線。

+0

mikko你知道這個世界和質量的答案。作爲一個瑞士人,我想說的是,在一個多語種的國家,通常選擇該國的語言。我以蘋果爲例,他們在CH_de和CH_fr之間切換,或者在Schweiz-German和Suisse-Français之間進行拼寫。 – 2012-05-01 00:36:04

+0

@ endo.anaconda:我想你的意思是de_CH和fr_CH。我不知道使用國家名稱和語言名稱是一種常見的標籤風格。在芬蘭,現場sv_FI通常被稱爲「suomenruotsi」,它直接轉換爲「芬蘭瑞典」,而不是「芬蘭瑞典」。 – 2012-05-02 10:46:56

0

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"; 
} 
相關問題