Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Christoph Schneegans Newsgroups: de.comp.lang.java Subject: Locale.forLanguageTag: "ru" vs. "rus" Date: Sun, 26 Mar 2017 18:01:07 +0200 Lines: 73 Message-ID: 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 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? -- · Validator für BCP 47