2016-12-08 3 views
1

Je travaille sur un projet d'application Web prenant en charge plusieurs langues. J'utilise Spring framework. Spring a l'option de prendre en charge plusieurs langues en ajoutant les beans suivants dans la servlet du répartiteur.Localisation du ressort sans passer le langage dans la chaîne de requête

<bean id="localeResolver" 
     class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> 
     <property name="defaultLocale" value="en" /> 
    </bean> 

    <mvc:interceptors> 
     <mvc:interceptor> 
      <mvc:mapping path="/**" /> 
      <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
       <property name="paramName" value="language" /> 
      </bean> 
     </mvc:interceptor> 
    </mvc:interceptors> 

    <!-- Register the messages.properties --> 
    <bean id="messageSource" 
     class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
     <property name="basename" value="classpath:messages" /> 
     <property name="defaultEncoding" value="UTF-8" /> 
    </bean> 

La localisation ne fonctionne que si je passe le paramètre de langue dans chaque URL.

Y a-t-il une option pour définir les paramètres régionaux en fonction de la langue du navigateur du client?

+0

Remplacez 'SessionLocaleResolver' par' AcceptHeaderLocaleResolver' et supprimez le 'LocaleChangeInterceptor' (car vous ne pourrez pas le changer ensuite). Cela fonctionnerait également si vous supprimez la propriété 'defaultLocale' de' SessionLocaleResolver' car, lorsqu'elle n'est pas définie, elle utilise celle reçue du navigateur. –

Répondre

2

Sites mettre en œuvre la localisation dans une des deux façons. La première approche consiste à détecter automatiquement les paramètres régionaux de l'utilisateur en examinant les en-têtes des requêtes HTTP (en particulier l'en-tête Accept-Language) et en localisant le contenu du site pour les paramètres régionaux de l'utilisateur (s'il est pris en charge).

Spring MVC utilise cette approche par défaut. Il utilise la méthode HttpServletRequest.getLocale pour déterminer les paramètres régionaux du client, puis charge les messages localisés à partir des sources de messages. Notez que la méthode getLocale renvoie un seul objet Locale tandis que l'en-tête Accept-Language transmis par le client peut contenir plusieurs langues (par exemple, Accept-Language: en-US, en-GB, en). Dans ce cas, la méthode getLocale renvoie la Locale pour la première langue correspondante (en-US dans l'exemple ci-dessus). Par conséquent, si vous souhaitez que votre application Spring MVC détecte automatiquement les paramètres régionaux du client et serve le contenu localisé, déclarez simplement un bean ResourceBundleMessageSource dans le contexte de l'application. Aucune autre configuration n'est requise.

Voir my sample application qui illustre cette approche. Utilisez une extension de navigateur telle que Postman pour Chrome pour manipuler la valeur de l'en-tête Accept-Language. L'échantillon prend en charge l'anglais, le français, l'allemand et l'espagnol. Ainsi, en-US, fr-FR, de-DE et es-ES afficheront respectivement des messages localisés dans chacune de ces langues.


La deuxième approche utilisée par des sites Web est d'afficher toujours contenu dans une langue par défaut d'abord, puis en permettant à l'utilisateur de modifier les paramètres régionaux (en utilisant un menu déroulant ou des liens dans l'en-tête du site ou pied de page). Dans ce cas, les utilisateurs peuvent choisir des paramètres régionaux qui ne correspondent pas à l'en-tête Accept-Language envoyé par leur navigateur. Par exemple, l'en-tête Accept-Language peut contenir fr-CH tandis que l'utilisateur peut sélectionner de-DE comme paramètres régionaux.

C'est dans de tels scénarios que LocaleChangeInterceptor et SessionLocaleResolver sont requis pour utiliser la sélection de l'utilisateur au lieu des en-têtes de demande. Ces composants peuvent intercepter le choix de l'utilisateur et l'enregistrer temporairement pendant la durée de la session pour localiser correctement le contenu du site.

0

Obtenir la langue de tête de requête « Accept-Language »