Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.java > #13111
| Path | csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail |
|---|---|
| From | Christoph Schneegans <Christoph@Schneegans.de> |
| Newsgroups | de.comp.lang.java |
| Subject | Locale.forLanguageTag: "ru" vs. "rus" |
| Date | Sun, 26 Mar 2017 18:01:07 +0200 |
| Lines | 73 |
| Message-ID | <ejq6u4Fp7m6U1@mid.individual.net> (permalink) |
| Mime-Version | 1.0 |
| Content-Type | text/plain; charset=utf-8; format=flowed |
| Content-Transfer-Encoding | 8bit |
| X-Trace | individual.net YFEk4A5KzWX77EgMH9PHqwq2zmQDZxMXrsh+Ejomd396WSYw== |
| Cancel-Lock | sha1:gdExLMbDE82PCVzQEMihg4/IsWw= |
| X-Mozilla-News-Host | news://news.individual.de:119 |
| User-Agent | Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 |
| Xref | csiph.com de.comp.lang.java:13111 |
Show key headers only | View raw
Hallo allerseits!
Die Klasse java.util.Locale zeigt hier in Version 8u121 folgendes Verhalten:
{
Locale ru = Locale.forLanguageTag("ru");
System.out.println(ru.toLanguageTag()); // ru
System.out.println(ru.getLanguage()); // ru
System.out.println(ru.getDisplayLanguage(Locale.GERMAN)); // Russisch
System.out.println(ru.getISO3Language()); // rus
}
{
Locale rus = Locale.forLanguageTag("rus");
System.out.println(rus.toLanguageTag()); // rus
System.out.println(rus.getLanguage()); // rus
System.out.println(rus.getDisplayLanguage(Locale.GERMAN)); // Russisch
System.out.println(rus.getISO3Language()); // rus
}
(Etwa mit "en"/"eng" statt "ru"/"rus" verhält sich die Klasse ganz analog.)
Die Locale-Instanz
Locale ru = Locale.forLanguageTag("ru")
verhält sich so, wie ich das erwarten würde. Insbesondere gibt
ru.toLanguageTag()
dasselbe (gültige) BCP-47-Tag "ru" zurück, und
ru.getISO3Language()
den der Sprache laut
https://www.loc.gov/standards/iso639-2/php/code_list.php zugeordneten
ISO-639-2-Code "rus".
Die Instanz
Locale rus = Locale.forLanguageTag("rus")
jedoch verhält sich m.E. seltsam. "rus" ist gemäß
https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
kein gültiges Subtag, insbesondere also nicht das Subtag für die Sprache
"Russisch". Dennoch erhalte ich eine Locale-Instanz, die als
Anzeigesprache "Russisch" und als ISO-639-2-Code "rus" zurückgibt.
Warum ist forLanguageTag() hier so tolerant?
rus.toLanguageTag()
gibt für diese Sprache ein ungültiges BCP-47-Tag "rus" zurück, also
gerade wieder die (ungültige) Eingabe.
Laut Javadoc wird die Gültigkeit der Rückgabe von toLanguageTag () zwar
nicht garantiert:
"Note: Although the language tag created by this method is well-formed
(satisfies the syntax requirements defined by the IETF BCP 47
specification), it is not necessarily a valid BCP 47 language tag."
Aber eine gültige Rückgabe ("ru") wäre in diesem Fall ja sehr leicht zu
erreichen, zumal die Eingabe von forLanguageTag() ja nicht der Ausgabe
von toLanguageTag() entsprechen muß:
"Note: there is no guarantee that toLanguageTag and forLanguageTag will
round-trip."
Übersehe ich etwas, oder gibt es mit Java-Bordmitteln tatsächlich keine
Möglichkeit, BCP-47-Tags wie "rus" zu "ru" zu normalisieren?
--
<http://schneegans.de/lv/> · Validator für BCP 47
Back to de.comp.lang.java | Previous | Next | Find similar
Locale.forLanguageTag: "ru" vs. "rus" Christoph Schneegans <Christoph@Schneegans.de> - 2017-03-26 18:01 +0200
csiph-web