47 votes

Les paramètres régionaux JSF sont définis par demande, pas pour la session

faces-config:

 <application>
        <locale-config>
            <default-locale>ru</default-locale>
            <supported-locale>ua</supported-locale>
        </locale-config>
        <resource-bundle>
            <base-name>msg</base-name>
            <var>m</var>
        </resource-bundle>
</application> 
 

partie bean, où les paramètres régionaux sont codés en dur pour l'instant:

 FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("ua"));
 

Le problème est que ua paramètres régionaux sont appliqués, mais par demande. Une autre demande ramène les paramètres régionaux à la valeur par défaut ru .

Comment appliquer la valeur des paramètres régionaux pour la session?

88voto

BalusC Points 498232

Vous avez besoin de stocker les paramètres régionaux sélectionnés dans l'étendue de session et de le fixer dans le viewroot à deux endroits: une fois par UIViewRoot#setLocale() immédiatement après avoir modifié les paramètres régionaux (qui modifie les paramètres régionaux de l'actuel viewroot et se reflète dans la publication; cette partie n'est pas nécessaire lorsque vous effectuez une redirection par la suite) et une fois dans l' locale attribut de l' <f:view> (ce qui définit/conserve les paramètres régionaux dans la suite des requêtes/vues).

Voici un exemple de comment un tel LocaleBean devrait ressembler à:

package com.example.faces;

import java.util.Locale;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

@ManagedBean
@SessionScoped
public class LocaleBean {

    private Locale locale;

    @PostConstruct
    public void init() {
        locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
    }

    public Locale getLocale() {
        return locale;
    }

    public String getLanguage() {
        return locale.getLanguage();
    }

    public void setLanguage(String language) {
        locale = new Locale(language);
        FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
    }

}

Et voici un exemple de la vue devrait ressembler à:

<!DOCTYPE html>
<html lang="#{localeBean.language}"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<f:view locale="#{localeBean.locale}">
    <h:head>
        <title>JSF/Facelets i18n example</title>
    </h:head>
    <h:body>
        <h:form>
            <h:selectOneMenu value="#{localeBean.language}" onchange="submit()">
                <f:selectItem itemValue="en" itemLabel="English" />
                <f:selectItem itemValue="nl" itemLabel="Nederlands" />
                <f:selectItem itemValue="es" itemLabel="Español" />
            </h:selectOneMenu>
        </h:form>
        <p><h:outputText value="#{text['some.text']}" /></p>
    </h:body>
</f:view>
</html>

Notez que <html lang> n'est pas nécessaire pour le fonctionnement de l'ACI, mais il est obligatoire comment les moteurs de recherche interprètent votre page. Sinon, il serait peut-être marqué comme un contenu en double ce qui est mauvais pour le RÉFÉRENCEMENT.

Connexes:

4voto

Sebastian Points 31

Je vois que le problème est également avec le nom de fichier .properties. Java Locale nous codes (minuscules) comme: en_gb Mais les paramètres régionaux créés automatiquement (par Netbeans) sont lowercase_uppercase ie: messages_en_GB.properties Changez le nom en: messages_en_gb.properties et cela devrait fonctionner - si vous avez tout essayé

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