如何从 PHP 中的语言代码获取语言环境代码

问题描述 投票:0回答:2

基本上我有很多语言代码

it, en, en-GB, de, de-CH, and so on...
,如果尚未指定国家/地区代码,我需要从这些代码中获得完整的区域设置代码
format: LANGCODE-COUNTRYCODE
以及该语言的默认国家/地区。

我的意思/需要的一个例子:

INPUT      OUTPUT  

it     ->  it-IT  
it-IT  ->  it-IT  
en-GB  ->  en-GB  
en     ->  en-US  
es-AR  ->  es-AR   
es-MX  ->  es-MX 
es     ->  es-ES  

是否有任何我不知道的库或在 PHP 中实现此目的的简单方法?

我已经尝试在谷歌上寻找解决方案很多次,但要么它不存在,要么我只是使用了错误的关键字...... 我真的需要手工制作一个手动数组吗?我确信一定有更好的方法!

php localization locale
2个回答
1
投票

感谢 iso.orglocaleplanet.com 的帮助,再加上一些很好的旧谷歌搜索和大量的苦劳,我想出了下面这个列表。 它可能并不完美,但它会为我完成工作......我希望它对其他人有帮助!

<?php
    
    $defaultLocales = [
        'af' => 'af-ZA',
        'am' => 'am-ET',
        'as' => 'as-IN',
        'az' => 'az-AZ',
        'ba' => 'ba-RU',
        'be' => 'be-BY',
        'bg' => 'bg-BG',
        'bn' => 'bn-IN',
        'bo' => 'bo-CN',
        'br' => 'br-FR',
        'ca' => 'ca-ES',
        'co' => 'co-FR',
        'cs' => 'cs-CZ',
        'cy' => 'cy-GB',
        'da' => 'da-DK',
        'de' => 'de-DE',
        'el' => 'el-GR',
        'en' => 'en-US',
        'es' => 'es-ES',
        'et' => 'et-EE',
        'eu' => 'eu-ES',
        'fi' => 'fi-FI',
        'fo' => 'fo-FO',
        'fr' => 'fr-FR',
        'fy' => 'fy-NL',
        'ga' => 'ga-IE',
        'gd' => 'gd-IE',
        'gl' => 'gl-ES',
        'gu' => 'gu-IN',
        'he' => 'he-IL',
        'hi' => 'hi-IN',
        'hr' => 'hr-HR',
        'hu' => 'hu-HU',
        'hy' => 'hy-AM',
        'id' => 'id-ID',
        'in' => 'in-ID',
        'is' => 'is-IS',
        'it' => 'it-IT',
        'iw' => 'iw-IL',
        'ja' => 'ja-JP',
        'ka' => 'ka-GE',
        'kk' => 'kk-KZ',
        'kl' => 'kl-GL',
        'km' => 'km-KH',
        'kn' => 'kn-IN',
        'ko' => 'ko-KR',
        'kok' => 'kok-IN',
        'ky' => 'ky-KG',
        'lo' => 'lo-LA',
        'lt' => 'lt-LT',
        'lv' => 'lv-LV',
        'mi' => 'mi-NZ',
        'mk' => 'mk-MK',
        'ml' => 'ml-IN',
        'mn' => 'mn-MN',
        'mr' => 'mr-IN',
        'ms' => 'ms-MY',
        'mt' => 'mt-MT',
        'nb' => 'nb-NO',
        'ne' => 'ne-NP',
        'nl' => 'nl-NL',
        'nn' => 'nn-NO',
        'oc' => 'oc-FR',
        'or' => 'or-IN',
        'pl' => 'pl-PL',
        'ps' => 'ps-AF',
        'pt' => 'pt-PT',
        'ro' => 'ro-RO',
        'ru' => 'ru-RU',
        'rw' => 'rw-RW',
        'sa' => 'sa-IN',
        'si' => 'si-LK',
        'sk' => 'sk-SK',
        'sq' => 'sq-AL',
        'sr' => 'sr-RS',
        'sv' => 'sv-SE',
        'ta' => 'ta-IN',
        'te' => 'te-IN',
        'th' => 'th-TH',
        'tk' => 'tk-TM',
        'tr' => 'tr-TR',
        'tt' => 'tt-RU',
        'uk' => 'uk-UA',
        'ur' => 'ur-PK',
        'uz' => 'uz-UZ',
        'vi' => 'vi-VN',
        'wo' => 'wo-SN',
        'xh' => 'xh-ZA',
        'zh' => 'zh-CN',
        'zu' => 'zu-ZA'
    ];
    
    function getLocaleFromLang($lang) {
        global $defaultLocales;
        return $defaultLocales[$lang] ?? $lang;
    }
    
?>

如果您对我如何改进有任何建议,请随时在下面评论!

[编辑]

我使用的标准的解释。

如果您有意大利语 it 语言,我们可以假设它是意大利意大利语的 it-IT。否则,您可以为瑞士的意大利语指定 it-CH,或为圣马力诺的意大利语指定 it-SM。在这种情况下,这很容易。

英语不一样。如果您应用相同的规则,那么 en-GB 将成为默认值,而不是 en-US。在我看来,这应该是这样,但在 IT 世界中 en-US 作为大多数程序的默认区域设置几十年后,这在这里也是正确的。

我想说一半的“默认”是简单的,但也有很多奇怪的情况,我不熟悉语言或国家...... 当这种情况发生时,如果前一个解决方案没有结论,我必须查找哪个国家/地区的母语人数最多,或者将语言与原籍国联系起来的其他内容。

有些情况是没有希望的,比如阿拉伯语。这是一种在许多国家/地区广泛使用的语言,我觉得没有必要提供“默认”语言环境...

解释我为什么需要这个。

我愿意做出这些“歧视”,原因只有一个: 这只是后备情况!

在输入中,我大多得到由语言和国家/地区代码组成的区域设置,例如 en-AU、es-AR、pt-BR 等...然后,有时,在某些情况下,它只是语言代码。当这种情况发生时,一些小机械装置就会损坏。首先,数字、值等的格式...

这主要是用户输入的意外情况,用户可以选择指定语言的国家/地区,但如果不这样做,则只会插入语言代码... 我被完整的区域设置代码和语言代码的混合所困扰,并且当仅提供语言时,我必须尝试回退到默认区域设置,以便我可以尝试保持其余代码/格式按用户的预期工作!

希望这能澄清情况


0
投票

您在后续评论中描述的规则只不过是您对哪些国家对于特定语言“更重要”的主观看法。你选择西班牙,因为西班牙语最初来自那里,但然后选择美国作为英语(没有提到德语,但它可能早于德国本身)。您找不到此类规则集的算法,因此除了编写我们自己的硬编码列表之外没有其他方法。一旦你这样做了,PHP 部分就可以像数组查找一样简单:

$defaults = [
    'it' => 'it-IT',
    'en' => 'en-US',
    'es' => 'es-ES',
    // ...
];
$requests = [
    'it',
    'it-IT',
    'en-GB',
    'en',
    'es-AR',
    'es-MX',
    'es',
];
foreach ($requests as $input) {
    $output = $defaults[$input] ?? $input;
    echo "$input -> $output\n";
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.