2012-04-16 12 views
10

Sto utilizzando i codici ISO 3166-1-alpha 2 per passare a un'applicazione per recuperare un feed localizzato, ad es./feed/us per gli Stati Uniti. Ho una dichiarazione switch che serve un feed basato su quel country_code.C'è un modo semplice per ottenere il codice della lingua da un codice paese in PHP

C'è un modo per convertire quel codice a due cifre nel codice della lingua, ad es. en_US? Mi chiedo se esiste una libreria standard/funzione/per farlo in PHP o se devo costruire il mio array personale?

+2

Quale codice di lingua dovrebbe "CH" usare? "IN"? "NO"? –

+0

Dai un'occhiata al nuovo elenco, l'elenco fornito nella risposta è scaduto. questo contiene 422 - 460 voci. http://msdn.microsoft.com/en-us/library/cc233968.aspx –

+0

Stavo per suggerire che se il tuo obiettivo è quello di utilizzare le impostazioni internazionali per formattare la valuta per un mercato locale, esiste una strategia che HACKS: –

risposta

12

Come altri hanno sottolineato, non vi è alcuna funzione incorporata in quanto ciò probabilmente a causa della realtà di molti paesi che hanno più lingue. Quindi sfortunatamente, non posso indicarti una libreria che lo faccia, ma ho fatto un passo avanti e ho scritto una piccola funzione che fa ciò che vuoi.

Esistono due avvertimenti, uno dei quali se non viene fornita una lingua, verrà scelta la prima lingua nell'elenco. Per aggirare questo, dovresti mettere un po 'di logica attorno alla chiamata di funzione per fornirgli la lingua appropriata. L'altro è che ha bisogno di avere php5-intl installato.

<?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

Questo elenco che stai utilizzando è vecchio, dai un'occhiata alla versione più recente che contiene circa 422 - 460 voci. http://msdn.microsoft.com/en-us/library/cc233968.aspx –

+0

Errore irreversibile: chiamata alla funzione non definita locale_get_region() nel codice della shell php – talsibony

+0

@talsibony È installata l'estensione intl? – alle

4

Non è possibile convertire automaticamente il codice del paese in codice della lingua perché alcuni paesi utilizzano più lingue. D'altra parte, il sistema di localizzazione OS può supportare più varianti di una singola lingua per diversi paesi (ad esempio, en_GB vs en_US).

Ad esempio, la Svizzera (CH) ha tedesco e francese comunemente utilizzati (64% e 20% della popolazione, secondo lo http://en.wikipedia.org/wiki/Switzerland). Se devi decidere una sola lingua per il codice paese CH, una di queste lingue potrebbe avere senso per alcune persone. Nota che alcune parti della Svizzera usano solo il tedesco o il francese come lingua ufficiale (ma non entrambe, vedi http://en.wikipedia.org/wiki/File:Sprachen_CH_2000_EN.svg per i dettagli).

Se DEVI selezionare una singola lingua per ogni paese, ti suggerisco di fare la selezione a mano per ogni paese che sostieni. Per un'implementazione automatica semi-assed, è possibile eseguire la scansione tra le localizzazioni disponibili e selezionare il primo con il codice paese corrispondente dopo il carattere di sottolineatura.

+0

mikko conosci il mondo e una risposta di qualità. Come svizzero, voglio dire che in un paese multilingue è normale scegliere la contea nella sua lingua. Prendo la mela come esempio, cambiano tra CH_de e CH_fr o compaiono tra Schweiz-German e Suisse-Français. –

+0

@ endo.anaconda: Immagino tu intenda de_CH e fr_CH. Non sapevo che usare il nome del paese seguito dal nome della lingua fosse uno stile di etichettatura comune. Qui in Finlandia, la localizzazione sv_FI viene solitamente chiamata "suomenruotsi" che si traduce direttamente in "svedese della Finlandia" invece che in "svedese di Finlandia". –

0

il answer from TheJF è piuttosto buona, tuttavia ci sono alcuni problemi (generali) che ho trovato:

  • suo codice restituirà br-FR se si chiama country_code_to_locale("FR") - ora br (bretone) è nemmeno un linguaggio ufficiale secondo Wikipedia. Sebbene fr-FR sia nell'elenco, br-FR è il primo nell'array. questo succede anche in molti altri paesi.

  • molte altre liste impostazioni internazionali stanno cercando di essere estremamente completo e prendere in considerazione tutte le lingue possibili

  • è difficile tracciare la linea qui, buoni esempi in cui si certamente desidera conservare più lingue per un paese sono: il Canada e Svizzera

sono andato con un semplice approccio :

  • Ho mantenuto solo 1 lingua per la maggior parte dei paesi e lasciato più per alcuni paesi come BE, CA, CH, ZA. Ho continuato a es-US, ma non sono sicuro di questo (Wikipedia dice: Official languages: None at federal level)

  • ho anche continuato a più lingue per i paesi ero troppo pigro per ricerca o che utilizzano sia, latino e cirillico

  • ho aggiunto shuffle($locales); che randomizzerà l'array, in modo tale da ottenere localizzazioni casuali per i Paesi con più lingue. Aveva senso per il mio caso d'uso, ma potresti volerlo rimuovere.

  • Per il mio scopo, solo le lingue che hanno una prevalenza rilevante sul web sono di interesse. Questa lista non è affatto completa o corretta, ma pragmatica.

Quindi, ecco la mia lista locale:

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

e il codice:

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