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粉360266095
P粉360266095 2023-08-22 21:30:42
0
2
533
<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粉360266095
P粉360266095

répondre à tous(2)
P粉662802882

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é

P粉426906369

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 :

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal