Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.java > #13111

Locale.forLanguageTag: "ru" vs. "rus"

From Christoph Schneegans <Christoph@Schneegans.de>
Newsgroups de.comp.lang.java
Subject Locale.forLanguageTag: "ru" vs. "rus"
Date 2017-03-26 18:01 +0200
Message-ID <ejq6u4Fp7m6U1@mid.individual.net> (permalink)

Show all headers | 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


Thread

Locale.forLanguageTag: "ru" vs. "rus" Christoph Schneegans <Christoph@Schneegans.de> - 2017-03-26 18:01 +0200

csiph-web