P粉6628028822023-08-23 10:48:27
我看到問題也跟.properties檔名有關。 Java的Locale程式碼(小寫)如:en_gb 但由Netbeans自動產生的Locale是小寫_大寫,例如:messages_en_GB.properties 將其改為:messages_en_gb.properties 然後它應該能夠正常工作 - 如果你已經嘗試了一切
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來說是不好的。