如何通过国家/地区代码从ICU库中获取默认语言

时间:2012-06-05 20:17:28

标签: php localization icu

en_US为我提供en英语,但它已经在代码

我需要US返回en表示英语,或者'DE'表示返回de表示德语

echo Locale::getPrimaryLanguage('en_US');
echo Locale::getPrimaryLanguage('US');

以上两者都应输出en,但后者实际输出us

2 个答案:

答案 0 :(得分:1)

getPrimaryLanguage不是ICU功能,所以我不知道它是如何实现的。在ICU中,您可以致电uloc_addLikelySubtags,这会扩展und_US(您可以在地区代码und之前将US置于未知状态)至en_US或{{1} } und_DE - 然后,调用de_DE将返回uloc_getLanguageen等。

de us的结果可能是由于US被解释为语言代码。您可以尝试US查看行为是什么。

答案 1 :(得分:0)

喜欢@Steven R. Loomis说你可以使用语言环境'und_US'而Locale::getPrimaryLanguage('und_US')只会返回'und'

如果使用php intl扩展名,它可以接受“und_US”的区域设置,但不会根据仅限美国区域正确格式化您的货币,您需要指定一种语言。

$locales = array('de_DE', 'en_US', 'ja_JP', 'und_US', 'und_JP', 'und_DE', 'und_FR');
$amount = 1234567.891234567890000;
foreach ($locales as $locale) {
        echo Locale::getPrimaryLanguage($locale).'<br />';
        $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY); 
        echo $formatter->getTextAttribute(NumberFormatter::CURRENCY_CODE); 
        echo '|' . $formatter->getSymbol(NumberFormatter::CURRENCY_SYMBOL);
        echo '|' . $formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL);
        echo ' - ' . $formatter->formatCurrency($amount, $formatter->getTextAttribute(NumberFormatter::CURRENCY_CODE));
        echo '<br /><br />';
}

返回

  

de EUR |€| EUR - 1.234.567,89€

     

en USD | $ | USD - $ 1,234,567.89

     

ja JPY |¥| JPY - ¥1,234,568

     

und USD | $ | USD - $ 1234567.89

     

和日元|¥|日元 - ¥1234568

     

und EUR |€| EUR - €1234567.89

     

und EUR |€| EUR - €1234567.89

请注意,即使您为该地区指定了正确的货币符号,该数字的格式也不正确。