有没有一种方法可以通过Locale默认知道语言和国家?

10

我有这些代码:

Locale[] cosas = Locale.getAvailableLocales();

for (int i = 0; i < cosas.length; i++) {
    log.info(cosas[i]);
}

我得到了这个列表:
ms_MY
ar_QA
is_IS
fi_FI
pl
en_MT
it_CH
nl_BE
ar_SA
ar_IQ
es_PR
es_CL
fi
de_AT
da
en_GB
es_PA
sr
ar_YE
mk_MK
mk
en_CA
vi_VN
nl_NL
es_US
zh_CN
es_HN
en_US
fr
th
ar
ar_MA
lv
de
in_ID
hr
en_ZA
ko_KR
ar_TN
in
ja
sr_RS
be_BY
zh_TW
ar_SD
pt
is
ja_JP_JP_#u-ca-japanese
es_BO
ar_DZ
ms
es_AR
ar_AE
fr_CA
sl
es
lt_LT
sr_ME_#Latn
ar_SY
ru_RU
fr_BE
es_ES
bg
iw_IL
sv
en
iw
da_DK
es_CR
zh_HK
zh
ca_ES
th_TH
uk_UA
es_DO
es_VE
pl_PL
ar_LY
ar_JO
it
uk
hu_HU
ga
es_GT
es_PY
bg_BG
hr_HR
sr_BA_#Latn
ro_RO
fr_LU
no
lt
en_SG
es_EC
sr_BA
es_NI
sk
ru
mt
es_SV
nl
hi_IN
et
el_GR
sl_SI
it_IT
ja_JP
de_LU
fr_CH
mt_MT
ar_BH
sq
vi
sr_ME
pt_BR
no_NO
el
de_CH
zh_SG
ar_KW
ar_EG
ga_IE
es_PE
cs_CZ
tr_TR
cs
es_UY
en_IE
en_IN
ar_OM
sr_CS
ca
be
sr__#Latn
ko
sq_AL
pt_PT
lv_LV
sr_RS_#Latn
sk_SK
es_MX
en_AU
no_NO_NY
en_NZ
sv_SE
ro
ar_LB
de_DE
th_TH_TH_#u-nu-thai
tr
es_CO
en_PH
et_EE
el_CY
hu
fr_FR

例如,对于西班牙这个国家,列表包含两个区域设置:es_ES和ca_ES,当然,这与西班牙语言并不相同。
那么我的问题是,我如何知道一个国家的默认语言是哪种?虽然可以通过语言构建区域设置,但我需要仅通过参数传递国家来调用方法。现在我有以下代码来分配默认语言:
if (language.equals("")) {
    switch (country) {
        case "CN":
            language = "zh";
            break;
        case "ES":
            language = "es";
            break;
        case "US":
            language = "en";
            break;
        case "JP":
            language = "ja";
            break;
        default:
            country = "";
            break;
        }
    }

if (language.equals("") && country.equals("")) {
    newLocale = new Locale("es", "ES");
} else {
    newLocale = new Locale(language, country);
}

RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME, newLocale);

但是我需要将这个开关扩展到更多的语言上。因此,我更喜欢有一种明确的方式来为每个国家分配默认语言。

我在这个链接上找到了一个解决方案,但我尝试了一下发现它不正确(例如,对于西班牙,它返回默认的ca-ES,但实际上不是)。有人认为通过代码真的可能获得国家吗?有什么想法吗?非常感谢。


3
“默认语言”是什么意思?如果一个国家使用多种语言,很少会有一种语言被定义为默认或更具优越性。如果您的意思是最广泛使用的语言,在Java的本地化支持中没有相关数据。 - jarnbjo
好的,这不是按国家而是按用户,请查看Locale.getDefault() - Andrew Thompson
@jarnbjo JVM 列出了 en_USes_US。显然,英语是美国的国家语言,只有约 10% 的人口说西班牙语。 - Maarten
@Maarten 正如我之前所写的:如果你指的是最广泛使用的语言,那么在Java的本地化支持中没有相关数据。我不确定你对“国家语言”这个术语的理解是什么,但在美国英语并没有任何法律或行政上的优越性,西班牙语也同样如此。美国在联邦层面上没有官方语言,但在一些州,行政机构也使用其他语言。在新墨西哥州,西班牙语被用作行政/官方语言,在夏威夷州使用夏威夷语,在阿拉斯加州使用几种土著语言。 - jarnbjo
@jarnbjo https://en.wikipedia.org/wiki/National_language 大多数国家都有一种几乎所有公民都会说的语言,政府也用它进行通讯等。这是一种默认语言,即使没有正式法令指定。说这种语言“很少存在”是错误的。 - Maarten
3个回答

1
您可以通过以下方式获取区域设置的语言:

String lang = Locale.getDefault().getISO3Language();

您可以获取区域设置的国家:

String country = Locale.getDefault().getISO3Country();

许多国家有多种语言。例如,加拿大有法语和英语本地化版本。
实际上,任何国家都没有真正的“默认”语言。JVM将使用其所在机器的默认本地设置,但语言和国家也可以使用-Duser.country -Duser.language变量进行设置。
您还可以使用任意组合的国家和语言来以编程方式更改默认区域设置。例如,以下代码有效:
    Locale l = new Locale("Ca", "Cyrl");
    Locale.setDefault(l);  

大多数国家都有官方的国家语言或事实上的国家语言,实际上并没有任何国家的“默认”语言。比较 en_USes_US - Maarten
Locale.getDefault() 会返回项目的默认值,这不是被要求的内容。 - RiZKiT

1
我认为“默认语言不存在”的观点是相当错误的,或者说这是一个陈词滥调,对于解决手头的问题没有什么用。几乎每个国家都有一种主导语言或国家语言,无论是官方的还是事实上的。或者至少可以有某种方法来确定多种语言的优先顺序。
通常情况下,什么是主要语言以及特定领域中某种语言的权重往往是主观的,而且可能会发生变化。因此,Java或Unicode不提供这些信息是有道理的。幸运的是,使用多种语言的国家数量相当少(至少在我的JVM本地设置列表中),我们需要确定偏好的所有数据都很容易获取。因此,我们可以手动指定这些信息。
以下是我(主观)的排序。必须特别注意一些边缘情况,例如塞尔维亚语,因为西里尔字母用于官方通信,但更多的人能够阅读拉丁字母。因此,在某些情况下,您喜欢哪种语言取决于您的用例。
同时,请注意本地存储库和语言使用可能会发生变化,因此此答案可能已过时。
//    https://en.wikipedia.org/wiki/Languages_of_Ireland
//    English (99%)
//    Irish (36%)
setPreference("IE", "en_IE", 0.99) // English
setPreference("IE", "ga_IE", 0.36) // Irish

// India
//    https://en.wikipedia.org/wiki/Languages_of_India
//    Hindi (57.1%)
//    English (10.6%)
setPreference("IN", "hi_IN", 0.571) // Hindi
setPreference("IN", "en_IN", 0.106) // English

// Bosnia and Herzegovina
//    https://en.wikipedia.org/wiki/Serbian_Cyrillic_alphabet
//    Although the Bosnian language "officially accept[s] both alphabets", the Latin script is almost always used in the Federation of Bosnia and Herzegovina
setPreference("BA", "sr_BA_#Latn", 0.75) // Serbian
setPreference("BA", "sr_BA", 0.25) // Serbian

// Serbia
//    https://en.wikipedia.org/wiki/Serbian_Cyrillic_alphabet
//    Cyrillic is an important symbol of Serbian identity. In Serbia, official documents are printed in Cyrillic only even though, according to a 2014 survey, 47% of the Serbian population write in the Latin alphabet whereas 36% write in Cyrillic.
setPreference("RS", "sr_RS", 0.51) // Serbian
setPreference("RS", "sr_RS_#Latn", 0.5) // Serbian

// Belgium
//    https://en.wikipedia.org/wiki/Languages_of_Belgium
//    Dutch (1st language: ~55%, 2nd language: 16%)
//    French (1st language: ~36%, 2nd language: ~49%)
setPreference("BE", "nl_BE", 0.55) // Dutch
setPreference("BE", "fr_BE", 0.36) // French

// Japan
setPreference("JP", "ja_JP", 0.51) // Japanese
setPreference("JP", "ja_JP_JP_#u-ca-japanese", 0.49) // Japanese

// Singapore
//    https://en.wikipedia.org/wiki/Singapore#Languages
//    Singapore has four official languages: English, Malay, Mandarin Chinese, and Tamil.[333] English is the common language, and is the language of business and government, and the medium of instruction in schools.
setPreference("SG", "en_SG", 0.369) // English
setPreference("SG", "zh_SG", 0.349) // Chinese

// Canada
//    https://en.wikipedia.org/wiki/Languages_of_Canada
setPreference("CA", "fr_CA", 0.5597) // French
setPreference("CA", "en_CA", 0.2061) // English

// Switzerland
//    https://en.wikipedia.org/wiki/Languages_of_Switzerland
//    Year  German  French  Italian Romansh Other
//    2015  63.0    22.7    8.4 0.6 5.3
setPreference("CH", "de_CH", 0.63) // German
setPreference("CH", "fr_CH", 0.227) // French
setPreference("CH", "it_CH", 0.084) // Italian

// Thailand
//    https://docs.oracle.com/javase/tutorial/i18n/locale/extensions.html
//    a Unicode locale extension is specified by the 'u' key code or the UNICODE_LOCALE_EXTENSION constant. The value itself is also specified by a key/type pair. Legal values are defined in the Key/Type Definitions table on the Unicode website. A key code is specified by two alphabetic characters.
//    nu    number type
setPreference("TH", "th_TH", 0.51) // Thai
setPreference("TH", "th_TH_TH_#u-nu-thai", 0.49) // Thai

// Luxembourg
//    https://en.wikipedia.org/wiki/Languages_of_Luxembourg
//    2012  Luxembourgish   French  German  English other
//    Native language   52% 16% 2%  N/A 30%
setPreference("LU", "fr_LU", 0.16) // French
setPreference("LU", "de_LU", 0.02) // German

// Montenegro
//    https://en.wikipedia.org/wiki/Montenegrin_alphabet
//    Although the Latin and Cyrillic alphabets enjoy equal status under the Constitution of Montenegro, the government and proponents of the Montenegrin language prefer to use the Latin script.
setPreference("ME", "sr_ME_#Latn", 0.8) // Serbian
setPreference("ME", "sr_ME", 0.2) // Serbian

// United States
setPreference("US", "en_US", 0.98) // English
setPreference("US", "es_US", 0.88) // Spanish

// Malta
//    https://en.wikipedia.org/wiki/Languages_of_Malta
//    98% of Maltese people can speak Maltese, 88% can speak English
setPreference("MT", "mt_MT", 0.98) // Maltese
setPreference("MT", "en_MT", 0.88) // English

// Spain
//    https://en.wikipedia.org/wiki/Languages_of_Spain
//    the most prominent of the languages of Spain is Spanish (Castilian), spoken by about 99% of Spaniards as a first or second language.[5] Catalan (or Valencian) is spoken by 19%
setPreference("ES", "es_ES", 0.99) // Spanish
setPreference("ES", "ca_ES", 0.19) // Catalan

// Norway
//    https://en.wikipedia.org/wiki/Languages_of_Switzerland
//    Bokmål is the preferred written standard of Norwegian for 85% to 90%
//    Nynorsk is reportedly used as main form of Norwegian by around 7.4% of the total population
setPreference("NO", "no_NO", 0.85) // Norwegian
setPreference("NO", "no_NO_NY", 0.074) // Norwegian

// Greece
//    The official language of Greece is Greek, spoken by 99% of the population
//    English (51%)
//    German (9%)
//    French (8.5%)
//    Italian (8%)
setPreference("GR", "el_GR", 0.99) // Greek
setPreference("GR", "de_GR", 0.09) // German

更多信息:


我的意思是,这是一个很好的想法...现在只需要将其添加到库中以便于使用 :p - ArcX

0

一定要用Java吗?我用C++写了一个小的exe程序,你可能会觉得有用:KyaaLocale,你可以根据自己的需要进行自定义,添加更多的if/then/else或其他你需要的内容。


谢谢,@Kyousuke Kyaa。是的,我需要它是Java代码。我看了你的代码,我认为将其转换为Java代码不可能,所以我需要另一个解决方案。 - ovejaexiste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接