Php 如何按国家代码从ICU库获取默认语言

Php 如何按国家代码从ICU库获取默认语言,php,localization,icu,Php,Localization,Icu,en_US为我提供了英语的en,但它已经在代码中了 我需要US返回英语的en,或者“DE”返回德语的DE echo Locale::getPrimaryLanguage('en_US'); echo Locale::getPrimaryLanguage('US'); 上面两个都应该输出en,但后者实际上输出usgetPrimaryLanguage不是ICU函数,所以我不知道它是如何实现的。在ICU中,您可以调用uloc\u addLikelySubtags,它将扩展und\u-US(您将und

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

我需要
US
返回英语的
en
,或者“DE”返回德语的
DE

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

上面两个都应该输出
en
,但后者实际上输出
us
getPrimaryLanguage
不是ICU函数,所以我不知道它是如何实现的。在ICU中,您可以调用
uloc\u addLikelySubtags
,它将扩展
und\u-US
(您将
und
放在区域代码
US
之前,用于未知)到
en\u-US
und\u-DE
DE\code>,然后调用
uloc\u-getLanguage>将返回
en
DE
,等等


您对
us
us
结果可能是因为
us
被解释为语言代码。您可以尝试
und__US
查看行为是什么。

getPrimaryLanguage
不是ICU函数,因此我不知道它是如何实现的。在ICU中,您可以调用
uloc\u addLikelySubtags
,它将扩展
und\u-US
(您将
und
放在区域代码
US
之前,用于未知)到
en\u-US
und\u-DE
DE\code>,然后调用
uloc\u-getLanguage>将返回
en
DE
,等等


您对
us
us
结果可能是因为
us
被解释为语言代码。您可以尝试
und_US
查看行为是什么。

就像@Steven R.Loomis说的,您可以使用区域设置“und_US”,而
locale::getPrimaryLanguage(“und_US”)
只会返回“und”

如果使用php intl扩展,它可以接受“und_US”区域设置,但它不会根据区域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 />';
}
$locales=array('de_de','en_US','ja_JP','und_US','und_JP','und_de','und_FR');
$amount=1234567.89123456789万;
foreach($locales作为$locale){
echo Locale::getPrimaryLanguage($Locale)。“
”; $formatter=newnumberformatter($locale,NumberFormatter::CURRENCY); echo$formatter->getTextAttribute(NumberFormatter::CURRENCY\u代码); echo“|”。$formatter->getSymbol(NumberFormatter::CURRENCY_SYMBOL); echo“|”。$formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL); echo'-'.$formatter->formatCurrency($amount,$formatter->getTextAttribute(NumberFormatter::CURRENCY_CODE)); 回音“

”; }
返回

欧元-1.234.567,89欧元

en美元|$|美元-1234567.89美元

日元-1234568日元

und美元|$|美元-1234567.89美元

日元-1234568日元

欧元-1234567.89欧元

欧元-1234567.89欧元


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

如@Steven R.Loomis所说,您可以使用区域设置“und_US”,而
区域设置::getPrimaryLanguage(“und_US”)
只会返回“und”

如果使用php intl扩展,它可以接受“und_US”区域设置,但它不会根据区域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 />';
}
$locales=array('de_de','en_US','ja_JP','und_US','und_JP','und_de','und_FR');
$amount=1234567.89123456789万;
foreach($locales作为$locale){
echo Locale::getPrimaryLanguage($Locale)。“
”; $formatter=newnumberformatter($locale,NumberFormatter::CURRENCY); echo$formatter->getTextAttribute(NumberFormatter::CURRENCY\u代码); echo“|”。$formatter->getSymbol(NumberFormatter::CURRENCY_SYMBOL); echo“|”。$formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL); echo'-'.$formatter->formatCurrency($amount,$formatter->getTextAttribute(NumberFormatter::CURRENCY_CODE)); 回音“

”; }
返回

欧元-1.234.567,89欧元

en美元|$|美元-1234567.89美元

日元-1234568日元

und美元|$|美元-1234567.89美元

日元-1234568日元

欧元-1234567.89欧元

欧元-1234567.89欧元

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

您可以使用Unicode CLDR获取特定国家的“默认”或“可能”语言,请参阅您可以使用Unicode CLDR获取特定国家的“默认”或“可能”语言,请参阅