recherche

Maison  >  Questions et réponses  >  le corps du texte

Comment implémenter la localisation au niveau de la session dans JSF au lieu de la mémorisation des paramètres régionaux sélectionnés au niveau de la requête/vue

<p><code>faces-config.xml</code>:</p> <pre class="brush:php;toolbar:false;"><application> <locale-config> <locale par défaut>ru</locale par défaut> <locales-prises en charge>ua</locales-prises en charge> </locale-config> </application></pre> <p>Dans une méthode d'action de bean, je modifie les paramètres régionaux de la vue actuelle comme suit : </p> <pre class="brush:php;toolbar:false;">FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("ua"));</pre> <p>Le problème est que les paramètres régionaux <code>ua</code> ne s'appliquent qu'aux requêtes/vues, pas aux sessions. Une autre requête/vue dans la même session réinitialisera les paramètres régionaux à la valeur par défaut <code>ru</code> </p> <p>Comment appliquer des paramètres régionaux à une session ? </p>
P粉360266095P粉360266095467 Il y a quelques jours513

répondre à tous(2)je répondrai

  • P粉662802882

    P粉6628028822023-08-23 10:48:27

    Je vois que le problème est également lié au nom du fichier .properties. Code local de Java (minuscules), tel que : en_gb Mais les paramètres régionaux générés automatiquement par Netbeans sont en minuscules, par exemple : messages_en_GB.properties Remplacez-le par : messages_en_gb.properties Alors cela devrait fonctionner - si vous avez tout essayé

    répondre
    0
  • P粉426906369

    P粉4269063692023-08-23 00:27:17

    Vous devez stocker les paramètres régionaux sélectionnés dans la portée de la session et les définir à deux endroits : une fois via l'attribut UIViewRoot#setLocale()立即在更改区域设置后(这将更改当前视图根的区域设置,从而在后续请求中得到反映;如果之后执行重定向,则此部分是不必要的),以及一次在<f:view>locale (cela définira/préserve les paramètres régionaux lors des demandes/vues ultérieures).

    Voici un exemple de ce à quoi devrait ressembler LocaleBean :

    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().getExternalContext().getRequestLocale();
        }
    
        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);
        }
    
    }

    Voici un exemple de ce à quoi devrait ressembler la vue :

    <!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 示例</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>

    Cela suppose que la configuration dans #{text}已在faces-config.xml est la suivante :

    <application>
        <resource-bundle>
            <base-name>com.example.i18n.text</base-name>
            <var>text</var>
        </resource-bundle>
    </application>

    Veuillez noter que <html lang> n'est pas requis pour la fonctionnalité JSF, mais est obligatoire pour les pages d'explication des moteurs de recherche. Sinon, il pourrait être marqué comme contenu en double, ce qui serait mauvais pour le référencement.

    Voir aussi :

    répondre
    0
  • Annulerrépondre