在 Java 中,您可以调用Locale.getAvailableLocales()
以获取可用语言环境的列表。
我期待 PHP Locale类的等价物,但找不到。
有没有办法获得所有有效语言环境的数组?
在 Java 中,您可以调用Locale.getAvailableLocales()
以获取可用语言环境的列表。
我期待 PHP Locale类的等价物,但找不到。
有没有办法获得所有有效语言环境的数组?
这里的部分困惑是 PHP 有两个称为“语言环境”的概念,它们几乎完全分开。
第一个是较旧的,它基本上只使用 C 语言环境功能。setlocale
这就是PHP 的一些函数(money_format
例如)的背后和语言环境支持。这就是提到locale -a
在命令行上运行和使用的其他答案setlocale
正在谈论的内容。
PHP 的Locale
类和扩展中的其他相关功能intl
较新,并且工作方式不同。它没有使用 libc 语言环境的东西,而是使用一个名为 ICU 的库,该库提供自己的语言环境数据。PHP确实提供了一种方法来确定该系统支持哪些语言环境:ResourceBundle::getLocales。这里的文档有点冗长,但您可以将其作为静态方法调用并传递空白字符串以使用 ICU 的默认资源,从而获得支持的语言环境列表intl
:
ResourceBundle::getLocales('');
我认为没有内置功能。您需要询问操作系统安装了哪些语言环境。
例如,如果您在 unix 系统上运行,则需要执行以下命令:
$ locale -a
我现在也解决了这个问题。这就是发生的事情。
<?php
return array(
'aa_DJ' => 'Afar (Djibouti)',
'aa_ER' => 'Afar (Eritrea)',
'aa_ET' => 'Afar (Ethiopia)',
'af_ZA' => 'Afrikaans (South Africa)',
'sq_AL' => 'Albanian (Albania)',
'sq_MK' => 'Albanian (Macedonia)',
'am_ET' => 'Amharic (Ethiopia)',
'ar_DZ' => 'Arabic (Algeria)',
'ar_BH' => 'Arabic (Bahrain)',
'ar_EG' => 'Arabic (Egypt)',
'ar_IN' => 'Arabic (India)',
'ar_IQ' => 'Arabic (Iraq)',
'ar_JO' => 'Arabic (Jordan)',
'ar_KW' => 'Arabic (Kuwait)',
'ar_LB' => 'Arabic (Lebanon)',
'ar_LY' => 'Arabic (Libya)',
'ar_MA' => 'Arabic (Morocco)',
'ar_OM' => 'Arabic (Oman)',
'ar_QA' => 'Arabic (Qatar)',
'ar_SA' => 'Arabic (Saudi Arabia)',
'ar_SD' => 'Arabic (Sudan)',
'ar_SY' => 'Arabic (Syria)',
'ar_TN' => 'Arabic (Tunisia)',
'ar_AE' => 'Arabic (United Arab Emirates)',
'ar_YE' => 'Arabic (Yemen)',
'an_ES' => 'Aragonese (Spain)',
'hy_AM' => 'Armenian (Armenia)',
'as_IN' => 'Assamese (India)',
'ast_ES' => 'Asturian (Spain)',
'az_AZ' => 'Azerbaijani (Azerbaijan)',
'az_TR' => 'Azerbaijani (Turkey)',
'eu_FR' => 'Basque (France)',
'eu_ES' => 'Basque (Spain)',
'be_BY' => 'Belarusian (Belarus)',
'bem_ZM' => 'Bemba (Zambia)',
'bn_BD' => 'Bengali (Bangladesh)',
'bn_IN' => 'Bengali (India)',
'ber_DZ' => 'Berber (Algeria)',
'ber_MA' => 'Berber (Morocco)',
'byn_ER' => 'Blin (Eritrea)',
'bs_BA' => 'Bosnian (Bosnia and Herzegovina)',
'br_FR' => 'Breton (France)',
'bg_BG' => 'Bulgarian (Bulgaria)',
'my_MM' => 'Burmese (Myanmar [Burma])',
'ca_AD' => 'Catalan (Andorra)',
'ca_FR' => 'Catalan (France)',
'ca_IT' => 'Catalan (Italy)',
'ca_ES' => 'Catalan (Spain)',
'zh_CN' => 'Chinese (China)',
'zh_HK' => 'Chinese (Hong Kong SAR China)',
'zh_SG' => 'Chinese (Singapore)',
'zh_TW' => 'Chinese (Taiwan)',
'cv_RU' => 'Chuvash (Russia)',
'kw_GB' => 'Cornish (United Kingdom)',
'crh_UA' => 'Crimean Turkish (Ukraine)',
'hr_HR' => 'Croatian (Croatia)',
'cs_CZ' => 'Czech (Czech Republic)',
'da_DK' => 'Danish (Denmark)',
'dv_MV' => 'Divehi (Maldives)',
'nl_AW' => 'Dutch (Aruba)',
'nl_BE' => 'Dutch (Belgium)',
'nl_NL' => 'Dutch (Netherlands)',
'dz_BT' => 'Dzongkha (Bhutan)',
'en_AG' => 'English (Antigua and Barbuda)',
'en_AU' => 'English (Australia)',
'en_BW' => 'English (Botswana)',
'en_CA' => 'English (Canada)',
'en_DK' => 'English (Denmark)',
'en_HK' => 'English (Hong Kong SAR China)',
'en_IN' => 'English (India)',
'en_IE' => 'English (Ireland)',
'en_NZ' => 'English (New Zealand)',
'en_NG' => 'English (Nigeria)',
'en_PH' => 'English (Philippines)',
'en_SG' => 'English (Singapore)',
'en_ZA' => 'English (South Africa)',
'en_GB' => 'English (United Kingdom)',
'en_US' => 'English (United States)',
'en_ZM' => 'English (Zambia)',
'en_ZW' => 'English (Zimbabwe)',
'eo' => 'Esperanto',
'et_EE' => 'Estonian (Estonia)',
'fo_FO' => 'Faroese (Faroe Islands)',
'fil_PH' => 'Filipino (Philippines)',
'fi_FI' => 'Finnish (Finland)',
'fr_BE' => 'French (Belgium)',
'fr_CA' => 'French (Canada)',
'fr_FR' => 'French (France)',
'fr_LU' => 'French (Luxembourg)',
'fr_CH' => 'French (Switzerland)',
'fur_IT' => 'Friulian (Italy)',
'ff_SN' => 'Fulah (Senegal)',
'gl_ES' => 'Galician (Spain)',
'lg_UG' => 'Ganda (Uganda)',
'gez_ER' => 'Geez (Eritrea)',
'gez_ET' => 'Geez (Ethiopia)',
'ka_GE' => 'Georgian (Georgia)',
'de_AT' => 'German (Austria)',
'de_BE' => 'German (Belgium)',
'de_DE' => 'German (Germany)',
'de_LI' => 'German (Liechtenstein)',
'de_LU' => 'German (Luxembourg)',
'de_CH' => 'German (Switzerland)',
'el_CY' => 'Greek (Cyprus)',
'el_GR' => 'Greek (Greece)',
'gu_IN' => 'Gujarati (India)',
'ht_HT' => 'Haitian (Haiti)',
'ha_NG' => 'Hausa (Nigeria)',
'iw_IL' => 'Hebrew (Israel)',
'he_IL' => 'Hebrew (Israel)',
'hi_IN' => 'Hindi (India)',
'hu_HU' => 'Hungarian (Hungary)',
'is_IS' => 'Icelandic (Iceland)',
'ig_NG' => 'Igbo (Nigeria)',
'id_ID' => 'Indonesian (Indonesia)',
'ia' => 'Interlingua',
'iu_CA' => 'Inuktitut (Canada)',
'ik_CA' => 'Inupiaq (Canada)',
'ga_IE' => 'Irish (Ireland)',
'it_IT' => 'Italian (Italy)',
'it_CH' => 'Italian (Switzerland)',
'ja_JP' => 'Japanese (Japan)',
'kl_GL' => 'Kalaallisut (Greenland)',
'kn_IN' => 'Kannada (India)',
'ks_IN' => 'Kashmiri (India)',
'csb_PL' => 'Kashubian (Poland)',
'kk_KZ' => 'Kazakh (Kazakhstan)',
'km_KH' => 'Khmer (Cambodia)',
'rw_RW' => 'Kinyarwanda (Rwanda)',
'ky_KG' => 'Kirghiz (Kyrgyzstan)',
'kok_IN' => 'Konkani (India)',
'ko_KR' => 'Korean (South Korea)',
'ku_TR' => 'Kurdish (Turkey)',
'lo_LA' => 'Lao (Laos)',
'lv_LV' => 'Latvian (Latvia)',
'li_BE' => 'Limburgish (Belgium)',
'li_NL' => 'Limburgish (Netherlands)',
'lt_LT' => 'Lithuanian (Lithuania)',
'nds_DE' => 'Low German (Germany)',
'nds_NL' => 'Low German (Netherlands)',
'mk_MK' => 'Macedonian (Macedonia)',
'mai_IN' => 'Maithili (India)',
'mg_MG' => 'Malagasy (Madagascar)',
'ms_MY' => 'Malay (Malaysia)',
'ml_IN' => 'Malayalam (India)',
'mt_MT' => 'Maltese (Malta)',
'gv_GB' => 'Manx (United Kingdom)',
'mi_NZ' => 'Maori (New Zealand)',
'mr_IN' => 'Marathi (India)',
'mn_MN' => 'Mongolian (Mongolia)',
'ne_NP' => 'Nepali (Nepal)',
'se_NO' => 'Northern Sami (Norway)',
'nso_ZA' => 'Northern Sotho (South Africa)',
'nb_NO' => 'Norwegian Bokmål (Norway)',
'nn_NO' => 'Norwegian Nynorsk (Norway)',
'oc_FR' => 'Occitan (France)',
'or_IN' => 'Oriya (India)',
'om_ET' => 'Oromo (Ethiopia)',
'om_KE' => 'Oromo (Kenya)',
'os_RU' => 'Ossetic (Russia)',
'pap_AN' => 'Papiamento (Netherlands Antilles)',
'ps_AF' => 'Pashto (Afghanistan)',
'fa_IR' => 'Persian (Iran)',
'pl_PL' => 'Polish (Poland)',
'pt_BR' => 'Portuguese (Brazil)',
'pt_PT' => 'Portuguese (Portugal)',
'pa_IN' => 'Punjabi (India)',
'pa_PK' => 'Punjabi (Pakistan)',
'ro_RO' => 'Romanian (Romania)',
'ru_RU' => 'Russian (Russia)',
'ru_UA' => 'Russian (Ukraine)',
'sa_IN' => 'Sanskrit (India)',
'sc_IT' => 'Sardinian (Italy)',
'gd_GB' => 'Scottish Gaelic (United Kingdom)',
'sr_ME' => 'Serbian (Montenegro)',
'sr_RS' => 'Serbian (Serbia)',
'sid_ET' => 'Sidamo (Ethiopia)',
'sd_IN' => 'Sindhi (India)',
'si_LK' => 'Sinhala (Sri Lanka)',
'sk_SK' => 'Slovak (Slovakia)',
'sl_SI' => 'Slovenian (Slovenia)',
'so_DJ' => 'Somali (Djibouti)',
'so_ET' => 'Somali (Ethiopia)',
'so_KE' => 'Somali (Kenya)',
'so_SO' => 'Somali (Somalia)',
'nr_ZA' => 'South Ndebele (South Africa)',
'st_ZA' => 'Southern Sotho (South Africa)',
'es_AR' => 'Spanish (Argentina)',
'es_BO' => 'Spanish (Bolivia)',
'es_CL' => 'Spanish (Chile)',
'es_CO' => 'Spanish (Colombia)',
'es_CR' => 'Spanish (Costa Rica)',
'es_DO' => 'Spanish (Dominican Republic)',
'es_EC' => 'Spanish (Ecuador)',
'es_SV' => 'Spanish (El Salvador)',
'es_GT' => 'Spanish (Guatemala)',
'es_HN' => 'Spanish (Honduras)',
'es_MX' => 'Spanish (Mexico)',
'es_NI' => 'Spanish (Nicaragua)',
'es_PA' => 'Spanish (Panama)',
'es_PY' => 'Spanish (Paraguay)',
'es_PE' => 'Spanish (Peru)',
'es_ES' => 'Spanish (Spain)',
'es_US' => 'Spanish (United States)',
'es_UY' => 'Spanish (Uruguay)',
'es_VE' => 'Spanish (Venezuela)',
'sw_KE' => 'Swahili (Kenya)',
'sw_TZ' => 'Swahili (Tanzania)',
'ss_ZA' => 'Swati (South Africa)',
'sv_FI' => 'Swedish (Finland)',
'sv_SE' => 'Swedish (Sweden)',
'tl_PH' => 'Tagalog (Philippines)',
'tg_TJ' => 'Tajik (Tajikistan)',
'ta_IN' => 'Tamil (India)',
'tt_RU' => 'Tatar (Russia)',
'te_IN' => 'Telugu (India)',
'th_TH' => 'Thai (Thailand)',
'bo_CN' => 'Tibetan (China)',
'bo_IN' => 'Tibetan (India)',
'tig_ER' => 'Tigre (Eritrea)',
'ti_ER' => 'Tigrinya (Eritrea)',
'ti_ET' => 'Tigrinya (Ethiopia)',
'ts_ZA' => 'Tsonga (South Africa)',
'tn_ZA' => 'Tswana (South Africa)',
'tr_CY' => 'Turkish (Cyprus)',
'tr_TR' => 'Turkish (Turkey)',
'tk_TM' => 'Turkmen (Turkmenistan)',
'ug_CN' => 'Uighur (China)',
'uk_UA' => 'Ukrainian (Ukraine)',
'hsb_DE' => 'Upper Sorbian (Germany)',
'ur_PK' => 'Urdu (Pakistan)',
'uz_UZ' => 'Uzbek (Uzbekistan)',
've_ZA' => 'Venda (South Africa)',
'vi_VN' => 'Vietnamese (Vietnam)',
'wa_BE' => 'Walloon (Belgium)',
'cy_GB' => 'Welsh (United Kingdom)',
'fy_DE' => 'Western Frisian (Germany)',
'fy_NL' => 'Western Frisian (Netherlands)',
'wo_SN' => 'Wolof (Senegal)',
'xh_ZA' => 'Xhosa (South Africa)',
'yi_US' => 'Yiddish (United States)',
'yo_NG' => 'Yoruba (Nigeria)',
'zu_ZA' => 'Zulu (South Africa)'
);
在 Windows 上,您可以尝试setlocale()
使用以下列表中的所有项目调用 php 函数:http:
//msdn.microsoft.com/en-us/goglobal/bb895996.aspx
这是一个代码片段,用于列出基于 Windows 的主机上的所有可用语言环境:
<?php
header( 'Content-Type: text/html; charset=utf-8' );
// source of the list:
// http://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.90).aspx
$langs = array(
// language, sublanguage, codes
array( 'Chinese', 'Chinese', array( 'chinese' ) ),
array( 'Chinese', 'Chinese (simplified)', array( 'chinese-simplified', 'chs' ) ),
array( 'Chinese', 'Chinese (traditional)', array( 'chinese-traditional', 'cht' ) ),
array( 'Czech', 'Czech', array( 'csy', 'czech' ) ),
array( 'Danish', 'Danish', array( 'dan', 'danish' ) ),
array( 'Dutch', 'Dutch (default)', array( 'dutch', 'nld' ) ),
array( 'Dutch', 'Dutch (Belgium)', array( 'belgian', 'dutch-belgian', 'nlb' ) ),
array( 'English', 'English (default)', array( 'english' ) ),
array( 'English', 'English (Australia)', array( 'australian', 'ena', 'english-aus' ) ),
array( 'English', 'English (Canada)', array( 'canadian', 'enc', 'english-can' ) ),
array( 'English', 'English (New Zealand)', array( 'english-nz', 'enz' ) ),
array( 'English', 'English (United Kingdom)', array( 'eng', 'english-uk', 'uk' ) ),
array( 'English', 'English (United States)', array( 'american', 'american english', 'american-english', 'english-american', 'english-us', 'english-usa', 'enu', 'us', 'usa' ) ),
array( 'Finnish', 'Finnish', array( 'fin', 'finnish' ) ),
array( 'French', 'French (default)', array( 'fra', 'french' ) ),
array( 'French', 'French (Belgium)', array( 'frb', 'french-belgian' ) ),
array( 'French', 'French (Canada)', array( 'frc', 'french-canadian' ) ),
array( 'French', 'French (Switzerland)', array( 'french-swiss', 'frs' ) ),
array( 'German', 'German (default)', array( 'deu', 'german' ) ),
array( 'German', 'German (Austria)', array( 'dea', 'german-austrian' ) ),
array( 'German', 'German (Switzerland)', array( 'des', 'german-swiss', 'swiss' ) ),
array( 'Greek', 'Greek', array( 'ell', 'greek' ) ),
array( 'Hungarian', 'Hungarian', array( 'hun', 'hungarian' ) ),
array( 'Icelandic', 'Icelandic', array( 'icelandic', 'isl' ) ),
array( 'Italian', 'Italian (default)', array( 'ita', 'italian' ) ),
array( 'Italian', 'Italian (Switzerland)', array( 'italian-swiss', 'its' ) ),
array( 'Japanese', 'Japanese', array( 'japanese', 'jpn' ) ),
array( 'Korean', 'Korean', array( 'kor', 'korean' ) ),
array( 'Norwegian', 'Norwegian (default)', array( 'norwegian' ) ),
array( 'Norwegian', 'Norwegian (Bokmal)', array( 'nor', 'norwegian-bokmal' ) ),
array( 'Norwegian', 'Norwegian (Nynorsk)', array( 'non', 'norwegian-nynorsk' ) ),
array( 'Polish', 'Polish', array( 'plk', 'polish' ) ),
array( 'Portuguese', 'Portuguese (default)', array( 'portuguese', 'ptg' ) ),
array( 'Portuguese', 'Portuguese (Brazil)', array( 'portuguese-brazilian', 'ptb' ) ),
array( 'Russian', 'Russian (default)', array( 'rus', 'russian' ) ),
array( 'Slovak', 'Slovak', array( 'sky', 'slovak' ) ),
array( 'Spanish', 'Spanish (default)', array( 'esp', 'spanish' ) ),
array( 'Spanish', 'Spanish (Mexico)', array( 'esm', 'spanish-mexican' ) ),
array( 'Spanish', 'Spanish (Modern)', array( 'esn', 'spanish-modern' ) ),
array( 'Swedish', 'Swedish', array( 'sve', 'swedish' ) ),
array( 'Turkish', 'Turkish', array( 'trk', 'turkish' ) )
);
echo '<table>'."\n";
echo '<tr>'."\n";
echo ' <th>Languange</th>'."\n";
echo ' <th>Sub-Languange</th>'."\n";
echo ' <th>Languange String</th>'."\n";
echo '</tr>'."\n";
foreach ( $langs as $lang ) {
echo '<tr>'."\n";
echo ' <td>'.$lang[0].'</td>'."\n";
echo ' <td>'.$lang[1].'</td>'."\n";
$a = array();
foreach ( $lang[2] as $lang_code ) {
$loc = setlocale( LC_ALL, $lang_code );
$a []= $lang_code.' '.( false === $loc ? '✖' : '✔ - '.$loc );
}
echo ' <td>'.implode( '<br>', $a ).'</td>'."\n";
echo '</tr>'."\n";
}
echo '</table>'."\n";
// Note: Norvegian (Bokmal) is Norvegian (Bokmål), see: http://en.wikipedia.org/wiki/Bokmål
?>
您通常只需要与 UTF-8 兼容的语言环境即可在 html 中使用它
因此,ResourceBundle 是无用的,但您仍然可以这样调用它
\ResourceBundle::getLocales('')
确定它是多么无用。
因此,您需要获取 Ubuntu 支持的列表(因为 Ubuntu 是您所需要的)
$string = shell_exec("locale -a|grep .utf8");
$array = explode('.utf8' . "\n", $string);
无论您在 ubuntu 上安装什么,您都会得到类似en_US
, ru_RU
, - 的东西。zh_CN
现在拿一个并像这样使用它
$locale = $array[0].'.UTF-8';
setlocale(LC_MONETARY, $locale);
但你可以locales
在你的 Ubuntu 上安装更多
这可能与 OP 略有偏差,但我觉得这是一个足够常见的用例,可以在这里提及。如果您想要ICU 定义的语言代码列表而不是语言环境列表怎么办?
基于的解决方案ResourceBundle::getLocales('');
将为您提供locales。然后您需要将它们映射到语言代码。但即使在那之后,语言列表也不完整。
这是与如何正确执行此操作的比较:
<?php
function getListFromLocales(): array
{
return array_filter(ResourceBundle::getLocales(''), function ($value) {
return strpos($value, '_') === false;
});
}
function getListFromLanguages(): array
{
$resourceBundle = new ResourceBundle('en', 'ICUDATA-lang', false);
$languagesBundle = $resourceBundle['Languages'];
$languages = [];
foreach ($languagesBundle as $languageCode => $languageName) {
$languages[] = $languageCode;
}
return $languages;
}
function languageForEndUser($language): string
{
return Locale::getDisplayLanguage($language, $language) . ' (' . Locale::getDisplayLanguage($language) . ')';
}
$list1 = getListFromLocales();
$list2 = getListFromLanguages();
echo 'languages in list1: ' . count($list1) . PHP_EOL;
echo 'languages in list2: ' . count($list2) . PHP_EOL;
echo 'languages that exists in list1, but not in list2: ' . count(array_diff($list1, $list2)) . PHP_EOL;
echo 'languages that exists in list2, but not in list1: ' . count(array_diff($list2, $list1)) . PHP_EOL;
Locale::setDefault('fr'); // Assume end-user speaks french
echo 'examples of language for end-user: ' . PHP_EOL;
echo ' - ' . languageForEndUser('en') . PHP_EOL;
echo ' - ' . languageForEndUser('fr') . PHP_EOL;
echo ' - ' . languageForEndUser('ko') . PHP_EOL;
这将输出类似于:
languages in list1: 204
languages in list2: 620
languages that exists in list1, but not in list2: 0
languages that exists in list2, but not in list1: 416
examples of language for end-user:
- English (anglais)
- français (français)
- 한국어 (coréen)
我们可以看到正确的方法可以产生大约 400 种(!)更多的语言。
system("locale -a|grep XX");
语言代码在哪里,XX
即。system("locale -a|grep de");