40 votes

Analyser l'en-tête Accept-Language en Java

L'en-tête accept-language dans la requête est généralement une longue chaîne complexe -

Par exemple :

Accept-Language : en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2

Existe-t-il un moyen simple de l'analyser en java ? Ou une API pour m'aider à faire ça ?

48voto

bkail Points 16610

Je suggère d'utiliser ServletRequest.getLocales() pour laisser le conteneur analyser Accept-Language plutôt que d'essayer de gérer la complexité vous-même.

38voto

Qiang Li Points 627

Pour mémoire, il est maintenant possible avec Java 8 :

Locale.LanguageRange.parse()

4voto

Arun Points 922

Nous utilisons Spring boot et Java 8. Cela fonctionne

Dans ApplicationConfig.java, écrivez ceci

@Bean

public LocaleResolver localeResolver() {
    return new SmartLocaleResolver();
}

et j'ai cette liste dans ma classe de constantes qui a des langues que nous prenons en charge

List<Locale> locales = Arrays.asList(new Locale("en"),
                                         new Locale("es"),
                                         new Locale("fr"),
                                         new Locale("es", "MX"),
                                         new Locale("zh"),
                                         new Locale("ja"));

et écrivez la logique dans la classe ci-dessous.

public class SmartLocaleResolver extends AcceptHeaderLocaleResolver {
          @Override
         public Locale resolveLocale(HttpServletRequest request) {
            if (StringUtils.isBlank(request.getHeader("Accept-Language"))) {
            return Locale.getDefault();
            }
            List<Locale.LanguageRange> ranges = Locale.LanguageRange.parse("da,es-MX;q=0.8");
            Locale locale = Locale.lookup(ranges, locales);
            return locale ;
        }
}

3voto

tec Points 330

ServletRequest.getLocale() est certainement la meilleure option si elle est disponible et non écrasée comme le font certains cadres.

Pour tous les autres cas, Java 8 offre Locale.LanguageRange.parse() comme mentionné précédemment par Quiang Li. Cela ne redonne cependant qu'une Chaîne de Langue, et non une Locale. Pour analyser les chaînes de langue, vous pouvez utiliser Locale.forLanguageTag() (disponible depuis Java 7) :

    final List<Locale> acceptedLocales = new ArrayList<>();
    final String userLocale = request.getHeader("Accept-Language");
    if (userLocale != null) {
        final List<LanguageRange> ranges = Locale.LanguageRange.parse(userLocale);

        if (ranges != null) {
            ranges.forEach(languageRange -> {
                final String localeString = languageRange.getRange();
                final Locale locale = Locale.forLanguageTag(localeString);
                acceptedLocales.add(locale);
            });
        }
    }
    return acceptedLocales;

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