2012-04-16 8 views
10

Tôi đang sử dụng mã ISO 3166-1-alpha 2 để chuyển đến một ứng dụng để truy xuất nguồn cấp dữ liệu được bản địa hóa, ví dụ:/nguồn cấp dữ liệu/chúng tôi cho Hoa Kỳ. Tôi có một tuyên bố chuyển đổi phục vụ nguồn cấp dữ liệu dựa trên mã quốc gia đó.Có cách đơn giản để lấy mã ngôn ngữ từ mã quốc gia trong PHP

Có cách nào để chuyển đổi mã hai chữ số đó thành mã ngôn ngữ hay không, ví dụ: en_? Tôi tự hỏi nếu có một tiêu chuẩn/chức năng/thư viện để làm điều này trong PHP hoặc cho dù tôi cần phải xây dựng mảng của riêng tôi?

+2

Những mã ngôn ngữ nên "CH" sử dụng không? "TRONG"? "KHÔNG"? –

+0

Hãy xem danh sách mới, danh sách được cung cấp trong câu trả lời là hết hạn. cái này chứa 422 - 460 mục. http://msdn.microsoft.com/en-us/library/cc233968.aspx –

+0

Tôi sẽ đề xuất rằng nếu mục tiêu của bạn là sử dụng ngôn ngữ để định dạng tiền tệ cho thị trường địa phương, có một chiến lược HACKS thông qua: –

Trả lời

12

Như người khác đã chỉ ra, không có chức năng tích hợp vì điều này có thể do thực tế của nhiều quốc gia có nhiều ngôn ngữ. Thật không may, tôi không thể chỉ cho bạn một thư viện làm điều này, nhưng tôi đã đi trước và viết một chức năng nhỏ mà làm những gì bạn muốn.

Có hai cảnh báo, một là nếu không được cung cấp một ngôn ngữ, nó sẽ chỉ chọn ngôn ngữ đầu tiên trong danh sách. Để giải quyết vấn đề này, bạn phải đặt một số logic xung quanh lời gọi hàm để cung cấp nó với ngôn ngữ thích hợp. Khác là nó cần phải cài đặt 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

Danh sách này bạn đang sử dụng cũ, hãy xem bản sửa đổi mới nhất chứa khoảng 422 - 460 mục. http://msdn.microsoft.com/en-us/library/cc233968.aspx –

+0

Lỗi nghiêm trọng: Gọi hàm undefined locale_get_region() trong mã trình bao php – talsibony

+0

@talsibony Bạn đã cài đặt phần mở rộng intl chưa? – alle

4

Bạn không thể tự động chuyển đổi mã quốc gia thành mã ngôn ngữ vì một số quốc gia sử dụng nhiều ngôn ngữ. Mặt khác, hệ thống bản địa hóa OS có thể hỗ trợ nhiều biến thể của một ngôn ngữ cho các quốc gia khác nhau (ví dụ: en_GB vs en_US).

Ví dụ: Thụy Sĩ (CH) có cả tiếng Đức và tiếng Pháp thường được sử dụng (64% và 20% dân số, theo số http://en.wikipedia.org/wiki/Switzerland). Nếu bạn phải quyết định một ngôn ngữ duy nhất cho mã quốc gia CH, một trong những ngôn ngữ đó có thể có ý nghĩa đối với một số người. Lưu ý rằng một số phần của Thụy Sĩ chỉ sử dụng tiếng Đức hoặc tiếng Pháp làm ngôn ngữ chính thức (nhưng không phải cả hai, xem http://en.wikipedia.org/wiki/File:Sprachen_CH_2000_EN.svg để biết chi tiết).

Nếu bạn PHẢI chọn một ngôn ngữ cho mỗi quốc gia, tôi khuyên bạn nên thực hiện lựa chọn bằng tay cho mọi quốc gia bạn hỗ trợ. Đối với triển khai tự động được hỗ trợ một nửa, bạn có thể quét qua các bản địa phương có sẵn của mình và chọn bản đầu tiên có mã quốc gia phù hợp sau dấu gạch dưới.

+0

mikko bạn biết thế giới và câu trả lời có chất lượng. Như một điều tôi muốn nói, trong một quốc gia đa ngôn ngữ, việc chọn quận bằng ngôn ngữ của nó là bình thường. Tôi lấy táo làm ví dụ, họ chuyển đổi giữa CH_de và CH_fr hoặc đánh vần giữa Schweiz-German và Suisse-Français. –

+0

@ endo.anaconda: Tôi đoán bạn có nghĩa là de_CH và fr_CH. Tôi không biết rằng sử dụng tên quốc gia theo sau là tên ngôn ngữ là một kiểu ghi nhãn phổ biến. Tại Phần Lan, sv_FI địa phương thường được gọi là "suomenruotsi", dịch trực tiếp sang "Tiếng Thụy Điển của Phần Lan" thay vì "Tiếng Thụy Điển của Phần Lan". –

0

các answer from TheJF là khá tốt, tuy nhiên có một vài (nói chung) các vấn đề mà tôi đi qua:

  • mã của ông sẽ trở lại br-FR nếu bạn gọi country_code_to_locale("FR") - bây giờ br (Breton) được thậm chí không phải là một ngôn ngữ chính thức theo Wikipedia. Mặc dù fr-FR nằm trong danh sách, br-FR là người đầu tiên trong mảng. điều này cũng xảy ra với nhiều quốc gia khác.

  • nhiều danh sách địa phương khác đang cố gắng trở thành cực kỳ hoàn chỉnh và xem xét tất cả các ngôn ngữ có thể

  • rất khó để rút ra những dòng ở đây, ví dụ tốt, nơi bạn có chắc chắn muốn giữ nhiều ngôn ngữ cho một quốc gia là: Canada và Thụy Sĩ

tôi đã đi với một cách tiếp cận đơn giản :

  • Tôi giữ chỉ 1 ngôn ngữ cho hầu hết các quốc gia và để lại nhiều ngôn ngữ cho một số quốc gia như BE, CA, CH, ZA. Tôi giữ es-US, nhưng tôi không chắc chắn về điều đó (Wikipedia nói: Official languages: None at federal level)

  • Tôi cũng giữ nhiều ngôn ngữ cho nước tôi quá lười biếng để nghiên cứu hoặc sử dụng cả hai, Latinh và Cyrillic

  • tôi đã thêm shuffle($locales); sẽ ngẫu nhiên mảng, sao cho chúng tôi nhận được miền địa phương ngẫu nhiên cho các quốc gia có nhiều ngôn ngữ. Nó có ý nghĩa đối với trường hợp sử dụng của tôi, nhưng bạn có thể muốn loại bỏ điều đó.

  • Vì mục đích của tôi, chỉ những ngôn ngữ có tỷ lệ có liên quan trên web mới được quan tâm. Danh sách này không có nghĩa là hoàn chỉnh hay chính xác, nhưng thực dụng.

Vì vậy, đây là danh sách của tôi ngôn ngữ:

$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'); 

và mã:

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"; 
}