100 votes

Comment obtenir Locale à partir de sa représentation String en Java?

Est-il une manière simple d'obtenir l'un des paramètres Régionaux de l'instance à partir de son "nom du programme" tel qu'il est renvoyé par les paramètres Régionaux de l' toString() méthode? Une évidente et laid solution serait l'analyse de la Chaîne, puis la construction d'une nouvelle instance Locale en fonction de cela, mais peut-être il ya une meilleure façon / solution prête à l'emploi pour qui?

Le besoin est que je veux stocker certains paramètres régionaux paramètres spécifiques dans une base de données SQL, y compris les paramètres régionaux eux-mêmes, mais il serait laid mettre sérialisé Locale des objets. Je préfère stocker leurs représentations de Chaîne, qui semblent être tout à fait adéquat dans le détail.

119voto

yurilo Points 1564

La méthode qui renvoie les paramètres régionaux de la chaîne existe dans la bibliothèque commons-lang: LocaleUtils.toLocale(localeAsString)

56voto

nilskp Points 838

Depuis Java 7, il existe une méthode d'usine Locale.forLanguageTag et une méthode d'instance Locale.toLanguageTag utilisant des balises de langue IETF .

33voto

raj Points 1631

Voir les Locale.getLanguage() , Locale.getCountry() .. stocker cette combinaison dans la base de données au lieu du "programatic name" ... lorsque vous voulez reconstruire les paramètres régionaux, utilisez public Locale(String language, String country)

voici un exemple de code, :)

 // may contain simple syntax error, i dont have java rite now to test.. but this is a bigger picture for ur 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);
}
 

12voto

andy Points 885

Cette réponse peut être un peu en retard, mais il s'avère que l'analyse de la chaîne n'est pas aussi laid que l'OP assumé. Je l'ai trouvé assez simple et concis:

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]);
}

J'ai testé (sur Java 7) avec tous les exemples donnés dans les paramètres Régionaux.toString() de la documentation: "fr", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "zh_CN_#Hans", "zh_TW_#Hant-x-java", et "th_TH_TH_#u-nu-thaï".

Mise à JOUR IMPORTANTE: Ce n'est pas recommandé pour une utilisation dans Java 7+ selon la documentation:

En particulier, les clients qui analyser les données en sortie de toString dans la langue, le pays, et la variante de champs peuvent continuer à le faire (même si cela est fortement déconseillé), bien que la variante domaine de l'information supplémentaire, si le script ou extensions sont présentes.

L'Utilisation De Paramètres Régionaux.forLanguageTag et les paramètres Régionaux.toLanguageTag au lieu de cela, ou si vous devez, les paramètres Régionaux.Générateur de rapports.

8voto

Tauren Points 9324

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X