Cara melaksanakan penyetempatan peringkat sesi dalam JSF dan bukannya setiap peringkat permintaan/lihat hafalan setempat yang dipilih
P粉360266095
P粉360266095 2023-08-22 21:30:42
0
2
500
<p><kod>faces-config.xml</code>:</p> <pre class="brush:php;toolbar:false;"><application> <locale-config> <default-locale>ru</default-locale> <supported-locale>ua</supported-locale> </locale-config> </application></pre> <p>Dalam kaedah tindakan kacang, saya menukar tempat paparan semasa seperti berikut: </p> <pre class="brush:php;toolbar:false;">FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("ua"));</pre> <p>Masalahnya ialah <kod>ua</code> hanya digunakan pada permintaan/pandangan, bukan sesi. Permintaan/pandangan lain dalam sesi yang sama akan menetapkan semula tempat kepada nilai lalai <code>ru</code> </p> <p>Bagaimanakah cara saya menggunakan tempattempat pada sesi? </p>
P粉360266095
P粉360266095

membalas semua(2)
P粉662802882

Saya melihat bahawa masalah itu juga berkaitan dengan nama fail .properties. Kod Tempatan Java (huruf kecil) seperti: en_gb Tetapi Tempatan yang dijana secara automatik oleh Netbeans ialah huruf kecil_besar, contohnya: messages_en_GB.properties Tukar kepada: messages_en_gb.properties Maka ia sepatutnya berkesan - jika anda telah mencuba segala-galanya

P粉426906369

Anda perlu menyimpan tempat yang dipilih dalam skop sesi dan menetapkannya di dua tempat: sekali melalui atribut UIViewRoot#setLocale()立即在更改区域设置后(这将更改当前视图根的区域设置,从而在后续请求中得到反映;如果之后执行重定向,则此部分是不必要的),以及一次在<f:view>locale (ini akan menetapkan/mengekalkan tempat itu pada permintaan/pandangan berikutnya).

Berikut ialah contoh bagaimana LocaleBean sepatutnya kelihatan:

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);
    }

}

Berikut ialah contoh bagaimana pandangan sepatutnya kelihatan:

<!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>

Ini mengandaikan bahawa konfigurasi dalam #{text}已在faces-config.xml adalah seperti berikut:

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

Sila ambil perhatian bahawa <html lang> tidak diperlukan untuk fungsi JSF, tetapi wajib untuk halaman penjelasan enjin carian. Jika tidak, ia mungkin ditandakan sebagai kandungan pendua, yang tidak baik untuk SEO.

Lihat juga:

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan