2013-03-27 7 views
6

Meine App erhält String aus einem externen Prozess, wobei jede Zeichenfolge entweder 2 oder 5 Zeichen lang ist und eine java.util.Locale s darstellt. Zum Beispiel:Wie validiere und instanziiere Java Locale aus Strings?

en-us

ko

Das erste Beispiel eines 5-char-String ist, wo "en" der Sprachcode ISO ist, und "wir" sind die ISO-Länder Code. Dies sollte dem Gebietsschema "en_US" entsprechen. Das zweite Beispiel ist nur eine 2-Zeichenkette, wobei "ko" der ISO-Sprachcode ist und dem koreanischen Gebietsschema "ko_KR" entsprechen sollte.

Ich brauche einen Weg, um diese Zeichenfolgen (entweder die 2- oder 5-Char-Variante) zu nehmen, validiere sie (als unterstützte Java Locale) und dann eine Locale-Instanz damit.

Ich hätte gehofft, dass Locale mit einer solchen Validierung kam aus der Box, aber leider läuft dieser Code ohne Ausnahmen geworfen werden:

Locale loc = new Locale("waawaaweewah", "greatsuccess"); 

// Prints: "waawaaweewah" 
System.out.println(loc.getDisplayLanguage()); 

Also frage ich, da mir die zwei Formen, die diese Zeichenfolge sein Wie kann ich:

  • Validieren Sie die Zeichenfolge (beide Formulare) und eine Ausnahme für Zeichenfolgen, die nicht vorhandenen oder nicht unterstützten Java 6 Locales entsprechen; und
  • Instanziieren Sie ein neues Gebietsschema aus der Zeichenfolge? Diese Frage trifft wirklich auf das 2-Zeichen-Formular zu, wo ich vielleicht nur "ko" habe und es auf das Gebietsschema "ko_KR" usw. abbilden muss.
  • Vielen Dank im Voraus!

    +0

    Wie wäre es mit einem 'neuen Gebietsschema (Sprache)' für den zweiten Fall und 'neuem Gebietsschema (Sprache, Land)' für den ersten Fall vorausgesetzt, Sie teilen die Eingabe mit einem Bindestrich und behandeln die 2-Zeichen-Token als Sprache und Land? – asgs

    Antwort

    6

    Locale.getISOCountries() und Locale.getISOLanguages()

    Rückkehr eine Liste aller 2-Buchstaben-Land und Sprachcodes nach ISO 3166 und ISO 639 bzw. und kann verwendet werden, Locales zu erstellen.

    Sie können dies verwenden, um Ihre Eingaben zu validieren.

    1

    Sie haben zwei Möglichkeiten,

    1. Verwenden Sie eine Bibliothek, dies zu tun commons-lang hat die LocaleUtils Klasse, die eine Methode hat, die eine String zu einem Locale analysieren kann.
    2. Während Ihrer eigene Methode, die Validierung hier ist nicht trivial, da es eine Reihe von verschiedenen Arten von Ländercodes, die ein gültigen für ein Locale ist - der javadoc

    Ein Ausgangspunkt für die String wäre aufzuspalten zu sehen und schalten Sie die Anzahl der Elemente:

    public static Locale parseLocale(final String locale) { 
        final String[] localeArr = locale.split("_"); 
        switch (localeArr.length) { 
         case 1: 
          return new Locale(localeArr[0]); 
         case 2: 
          return new Locale(localeArr[0], localeArr[1]); 
         case 3: 
          return new Locale(localeArr[0], localeArr[1], localeArr[2]); 
         default: 
          throw new IllegalArgumentException("Invalid locale format;"); 
        } 
    } 
    

    Vermutlich müssten Sie eine Liste aller gültigen Ländercode und Sprachen erhalten und die Elemente in der String[] den gültigen Werte vor dem Aufruf der Konstruktor zu vergleichen.