Wie bekomme ich Locale aus seiner String-Darstellung in Java?

Lesezeit: 4 Minuten

Benutzer-Avatar
Joonas Pulakka

Gibt es eine ordentliche Möglichkeit, a Gebietsschema Instanz aus seinem “programmatischen Namen”, wie er von Locale zurückgegeben wird toString() Methode? Eine offensichtliche und hässliche Lösung wäre, den String zu analysieren und dann entsprechend eine neue Locale-Instanz zu erstellen, aber vielleicht gibt es dafür einen besseren Weg / eine fertige Lösung?

Die Notwendigkeit besteht darin, dass ich einige Gebietsschema-spezifische Einstellungen in einer SQL-Datenbank speichern möchte, einschließlich Gebietsschemas selbst, aber es wäre hässlich, dort serialisierte Gebietsschema-Objekte abzulegen. Ich würde lieber ihre String-Darstellungen speichern, die im Detail durchaus ausreichend zu sein scheinen.

Eine Methode, die das Gebietsschema aus der Zeichenfolge zurückgibt, ist in der commons-lang-Bibliothek vorhanden:
LocaleUtils.toLocale(localeAsString)

  • LocaleUtils.toLocale unterstützt keine Zeichenfolgen wie „zh-Hans“, „pt-PT“ usw.

    – Hans van Dodewaard

    21. Februar 2013 um 15:56 Uhr

  • Wenn Sie einen Bindestrich haben - zwischen Gebietsschemateilen haben Sie es mit einem IETF BCP 47-Tag zu tun, wenn Sie Java 7 verwenden, können Sie es verwenden Locale.forLanguageTag

    – Jaime Hablutzel

    16. November 2013 um 22:25 Uhr

Seit Java 7 gibt es die Factory-Methode Locale.forLanguageTag und Instanzmethode Locale.toLanguageTag verwenden IETF-Sprachtags.

  • Ich möchte das nur betonen Locale.forLanguageTag funktioniert IETF-Locale-Strings (dh en-US) und funktioniert nicht mit ISO-Locale-Strings (z en_US)

    – Fabian

    2. November 2018 um 20:46 Uhr

Benutzer-Avatar
VeKe

  1. Java bietet viele Dinge, bei richtiger Implementierung kann viel Komplexität vermieden werden. Dies kehrt zurück ms_MY.

    String key = "ms-MY";
    Locale locale = new Locale.Builder().setLanguageTag(key).build();
    
  2. Apache Commons hat LocaleUtils um beim Analysieren einer Zeichenfolgendarstellung zu helfen. Dies wird zurückkehren en_US

    String str = "en-US";
    Locale locale =  LocaleUtils.toLocale(str);
    System.out.println(locale.toString());
    
  3. Sie können auch Locale-Konstruktoren verwenden.

    // Construct a locale from a language code.(eg: en)
    new Locale(String language)
    // Construct a locale from language and country.(eg: en and US)
    new Locale(String language, String country)
    // Construct a locale from language, country and variant.
    new Locale(String language, String country, String variant)
    

Bitte prüfen Sie das LocaleUtils und das Gebietsschema um weitere Methoden zu erkunden.

  • LocaleUtils.toLocale(localeStringRepresentation) erledigt die Arbeit ordentlich. Auch wenn Sie die Implementierung dieser Methode sehen, ist sie ziemlich umfassend!

    – Coretechie

    26. Juli 2017 um 11:19 Uhr

Benutzer-Avatar
Raj

Siehe die Locale.getLanguage(), Locale.getCountry()… Speichern Sie diese Kombination in der Datenbank anstelle der "programatic name"
Wenn Sie das Gebietsschema zurückbauen möchten, verwenden Sie public Locale(String language, String country)

Hier ist ein Beispielcode 🙂

// May contain simple syntax error, I don't have java right now to test..
// but this is a bigger picture for your algo...
public String localeToString(Locale l) {
    return l.getLanguage() + "," + l.getCountry();
}

public Locale stringToLocale(String s) {
    StringTokenizer tempStringTokenizer = new StringTokenizer(s,",");
    if(tempStringTokenizer.hasMoreTokens())
    String l = tempStringTokenizer.nextElement();
    if(tempStringTokenizer.hasMoreTokens())
    String c = tempStringTokenizer.nextElement();
    return new Locale(l,c);
}

Benutzer-Avatar
Juni

Option 1 :

org.apache.commons.lang3.LocaleUtils.toLocale("en_US")

Option 2 :

Locale.forLanguageTag("en-US")

bitte beachten Sie Option 1 ist “Unterstrich” zwischen Sprache und Land , und Option 2 ist “Strich”.

  • Der Aufruf erfordert API-Level 21 (derzeit mindestens 17): java.util.Locale#forLanguageTag

    – Vlad

    14. Oktober 2018 um 7:53 Uhr

Benutzer-Avatar
Javad Alimohammadi

Wenn Sie das Spring-Framework in Ihrem Projekt verwenden, können Sie auch Folgendes verwenden:

org.springframework.util.StringUtils.parseLocaleString("en_US");

Dokumentation:

Analysieren Sie die angegebene Zeichenfolgendarstellung in ein Gebietsschema

  • Der Aufruf erfordert API-Level 21 (derzeit mindestens 17): java.util.Locale#forLanguageTag

    – Vlad

    14. Oktober 2018 um 7:53 Uhr

Diese Antwort ist vielleicht etwas spät, aber es stellt sich heraus, dass das Analysieren der Zeichenfolge nicht so hässlich ist, wie das OP angenommen hat. Ich fand es ganz einfach und prägnant:

public static Locale fromString(String locale) {
    String parts[] = locale.split("_", -1);
    if (parts.length == 1) return new Locale(parts[0]);
    else if (parts.length == 2
            || (parts.length == 3 && parts[2].startsWith("#")))
        return new Locale(parts[0], parts[1]);
    else return new Locale(parts[0], parts[1], parts[2]);
}

Ich habe dies (unter Java 7) mit allen in der Locale.toString()-Dokumentation angegebenen Beispielen getestet: “en”, “de_DE”, “_GB”, “en_US_WIN”, “de__POSIX”, “zh_CN_#Hans”, “zh_TW_ #Hant-x-java” und “th_TH_TH_#u-nu-thai”.

WICHTIGE AKTUALISIERUNG: Dies wird gemäß der nicht für die Verwendung in Java 7+ empfohlen Dokumentation:

Insbesondere Clients, die die Ausgabe von toString in Sprach-, Länder- und Variantenfelder parsen, können dies weiterhin tun (obwohl dies der Fall ist dringend abgeraten), obwohl das Variantenfeld zusätzliche Informationen enthält, wenn Skripte oder Erweiterungen vorhanden sind.

Verwenden Sie stattdessen Locale.forLanguageTag und Locale.toLanguageTag oder, falls erforderlich, Locale.Builder.

  • Java7 Locale.forLanguageTag gilt nur für Sprach-Tags, die gemäß IETF BCP 47 mit einem Bindestrich (-), kein Unterstrich (_) wie in der Rückkehr von Locale‘s toString Methode

    – Jaime Hablutzel

    16. November 2013 um 22:27 Uhr

  • Sie haben Recht. Es muss noch eine Möglichkeit geben, die bestehenden Locale-Darstellungen in das BCP47-Format zu konvertieren. Meine Absicht war es, vorzuschlagen, dass in Zukunft Locales sollten nicht in ihrem gespeichert werden toString Form, sondern in ihrer toLanguageTag Form, die in a zurückkonvertierbar ist Locale einfacher und genauer.

    – Andy

    22. November 2013 um 21:08 Uhr

  • Hätte diese Methode nicht eine Reihe von Grenzfällen, die dazu führen könnten, dass der Index außerhalb der Grenzen liegt?

    – Benutzer2524908

    9. Februar 2018 um 16:45 Uhr

  • @ user2524908: Ich glaube nicht, da er immer die Array-Länge testet, bevor er auf seine Elemente zugreift. Die Lösung kann viele Grenzfälle haben, in denen sie nicht richtig funktioniert, aber nicht “Index außerhalb der Grenzen”

    – MestreLion

    7. Juli 2020 um 10:29 Uhr

1329230cookie-checkWie bekomme ich Locale aus seiner String-Darstellung in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy