有没有一种简单的方法可以从PHP中的国家/地区代码中获取语言代码

cod*_*boy 13 php locale

我正在使用ISO 3166-1-alpha 2代码传递给应用程序以检索本地化的Feed,例如/ feeds/us for USA.我有一个switch语句,它根据country_code提供feed.

有没有办法将这两位数代码转换为语言代码,例如en_US?我想知道在PHP中是否有标准/函数/库,或者我是否需要构建自己的数组?

The*_*eJF 14

正如其他人所指出的那样,由于许多国家拥有多种语言的现实,因此没有内置功能.所以不幸的是,我不能指出你做一个这样做的图书馆,但我确实继续写了一个功能,它可以做你想要的.

有两个警告,一个是如果没有提供语言,它将只选择列表中的第一个区域设置.要解决这个问题,你必须在函数调用周围加上一些逻辑,以便为它提供适当的语言.另一个是它需要安装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;
}
?>
Run Code Online (Sandbox Code Playgroud)


aus*_*usi 9

正如其他答案所指出的,国家和语言之间没有一对一的映射。但是,如果您安装了 PHPIntl扩展,则应该可以使用 Unicode CLDR可能的子标签数据来获取 \xe2\x80\x9cdefault\xe2\x80\x9d 或 \xe2\x80\x9clikely\xe2\x80\x9d 语言对于特定国家:

\n\n
function getLanguage(string $country): string {\n    $subtags = \\ResourceBundle::create(\'likelySubtags\', \'ICUDATA\', false);\n    $country = \\Locale::canonicalize(\'und_\'.$country);\n    $locale = $subtags->get($country) ?: $subtags->get(\'und\');\n    return \\Locale::getPrimaryLanguage($locale);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,当您致电getLanguage()国家/地区代码调用该函数时,您会得到相应的语言代码:

\n\n
getLanguage(\'US\'); // "en"\ngetLanguage(\'GB\'); // "en"\ngetLanguage(\'DE\'); // "de"\ngetLanguage(\'CH\'); // "de"\ngetLanguage(\'IN\'); // "hi"\ngetLanguage(\'NO\'); // "nb"\ngetLanguage(\'BR\'); // "pt"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这也适用于三个字母的国家代码:

\n\n
getLanguage(\'USA\'); // "en"\ngetLanguage(\'GBR\'); // "en"\ngetLanguage(\'AUT\'); // "de"\ngetLanguage(\'FRA\'); // "fr"\n
Run Code Online (Sandbox Code Playgroud)\n\n

甚至联合国M49代码:

\n\n
getLanguage(\'003\'); // "en"\ngetLanguage(\'013\'); // "es"\ngetLanguage(\'039\'); // "it"\ngetLanguage(\'155\'); // "de"\n
Run Code Online (Sandbox Code Playgroud)\n


Mik*_*nen 5

您不能将国家代码自动转换为语言代码,因为某些国家使用多种语言。另一方面,OS本地化系统可能支持针对不同国家/地区的一种语言的多种变体(例如,en_GB与en_US)。

例如,瑞士(CH)拥有德语和法语两种常用语言(根据http://en.wikipedia.org/wiki/Switzerland的人口比例分别为64%和20%)。如果您必须为国家/地区代码CH确定一种语言,那么对于某些人来说,这两种语言都是有意义的。请注意,瑞士的某些地区仅使用德语或法语作为官方语言(有关详细信息,请参见http://en.wikipedia.org/wiki/File:Sprachen_CH_2000_EN.svg)。

如果您必须为每个国家/地区选择一种语言,建议您为支持的每个国家/地区手动选择语言。对于半自动执行,您可以浏览可用的本地化版本,然后选择下划线后第一个具有匹配国家/地区代码的本地化版本。