搜尋

首頁  >  問答  >  主體

如何在JSF中實現會話層級的本地化,而不是每個請求/視圖層級的選定區域設定記憶

<p><code>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>在一個bean的動作方法中,我按照以下方式改變當前視圖的語言環境:</p> <pre class="brush:php;toolbar:false;">FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("ua"));</pre> <p>問題是<code>ua</code>語言環境只應用於請求/視圖,而不適用於會話。在同一會話中的另一個請求/視圖會將語言環境重設為預設的<code>ru</code>值。 </p> <p>如何將語言環境應用於會話? </p>
P粉360266095P粉360266095467 天前512

全部回覆(2)我來回復

  • P粉662802882

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

    我看到問題也跟.properties檔名有關。 Java的Locale程式碼(小寫)如:en_gb 但由Netbeans自動產生的Locale是小寫_大寫,例如:messages_en_GB.properties 將其改為:messages_en_gb.properties 然後它應該能夠正常工作 - 如果你已經嘗試了一切

    回覆
    0
  • P粉426906369

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

    您需要將選擇的區域設定儲存在會話範圍內,並在兩個位置設定它:一次是透過UIViewRoot#setLocale()立即在變更區域設定後(這將更改當前視圖根的區域設置,從而在後續請求中反映出來;如果之後執行重定向,則此部分是不必要的),以及一次在<f:view>locale屬性中(這將在後續請求/視圖中設定/保留區域設定)。

    這是一個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);
        }
    
    }

    這是視圖應該如何看起來的範例:

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

    這假設#{text}已在faces-config.xml中配置如下:

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

    請注意,<html lang>對於JSF的功能並不是必要的,但對於搜尋引擎的解釋頁面是強制性的。否則,它可能會被標記為重複內容,這對SEO來說是不好的。

    另請參閱:

    #

    回覆
    0
  • 取消回覆