介紹
現在很多WEB網站都提供了多語言切換功能,在使用ADF創建的WEB應用中,很容易實現多語言,只需簡單的幾個步驟。
2013年6月25日更新:通過在URL後面添加參數改變locale,具體參見代碼。URL如:http://localhost:7101/locale/faces/test.jspx?language=en
效果預覽
實現步驟
一、建立並配置使用資源文件
1.建立資源文件
資源文件的文件名結構爲basename_language[_country][_variant].extenstion
例如UIResource_zh.properties, UIResources_zh_CN.properties
2.在項目中的faces-config.xml中配置資源文件
3.使用資源文件中的項目
經過上面的配置之後,在頁面上使用資源文件中的項目也變的非常簡單,只需要通過EL編輯器選擇即可。
這樣一來,只需要切換瀏覽器的語言,應用程序會自動根據瀏覽器的語言環境選擇匹配的語言顯示。但是這樣還不能達到實時切換語言的要求,那麼下面的步驟將介紹如何編寫代碼來切換語言。
二、編程切換界面語言
1.編寫Manage Bean,並且將Manage Bean配置到adfc-config.xml中,選擇合適的scope
- package adf.locale.view;
- import java.io.IOException;
- import java.util.Locale;
- import javax.el.ELContext;
- import javax.el.ExpressionFactory;
- import javax.el.ValueExpression;
- import javax.faces.context.FacesContext;
- import javax.faces.event.ValueChangeEvent;
- import javax.servlet.http.HttpServletRequest;
- import oracle.adf.model.BindingContext;
- import oracle.adf.share.ADFContext;
- import oracle.adf.view.rich.context.AdfFacesContext;
- import oracle.jbo.common.DefLocaleContext;
- public class LocaleManager {
- public static final String EL_KEY = "#{localeManager}";
- private String currentLanguage;
- private Locale currentLocale;
- private static LocaleManager instance;
- public LocaleManager() {
- super();
- }
- public static LocaleManager getInstance() {
- if(instance == null) {
- Object value = evaluateEL(EL_KEY);
- if(value instanceof LocaleManager) {
- instance = (LocaleManager)value;
- } else {
- instance = new LocaleManager();
- }
- }
- return instance;
- }
- /**
- * 用於綁定下拉列表的value change,根據用戶選擇的語言,然後刷新頁面。
- * @param event
- * @throws IOException
- */
- public void changeLocale(ValueChangeEvent event) throws IOException {
- String newLanguage = (String)event.getNewValue();
- if (newLanguage != null) {
- this.currentLanguage = newLanguage;
- Locale locale = new Locale(newLanguage);
- this.currentLocale = locale;
- FacesContext ctx = FacesContext.getCurrentInstance();
- HttpServletRequest request =
- (HttpServletRequest)ctx.getExternalContext().getRequest();
- String uri = request.getRequestURI();
- ctx.getExternalContext().redirect(uri);
- }
- }
- private static Object evaluateEL(String el) {
- FacesContext ctx = FacesContext.getCurrentInstance();
- ELContext elCtx = ctx.getELContext();
- ExpressionFactory ef = ctx.getApplication().getExpressionFactory();
- ValueExpression ve = ef.createValueExpression(elCtx, el, Object.class);
- return ve.getValue(elCtx);
- }
- public void setCurrentLanguage(String currentLanguage) {
- this.currentLanguage = currentLanguage;
- }
- public String getCurrentLanguage() {
- return currentLanguage;
- }
- public void setCurrentLocale(Locale currentLocale) {
- this.currentLocale = currentLocale;
- }
- public Locale getCurrentLocale() {
- return currentLocale;
- }
- }
2.編寫並配置ViewHandler類
- package adf.locale.view;
- import java.io.IOException;
- import java.util.Locale;
- import javax.el.ELContext;
- import javax.el.ExpressionFactory;
- import javax.el.ValueExpression;
- import javax.faces.FacesException;
- import javax.faces.application.ViewHandler;
- import javax.faces.component.UIViewRoot;
- import javax.faces.context.FacesContext;
- public class LocaleSettingViewHandler extends ViewHandler {
- private ViewHandler base;
- public LocaleSettingViewHandler() {
- super();
- }
- public LocaleSettingViewHandler(ViewHandler base) {
- this.base = base;
- }
- public Locale calculateLocale(FacesContext facesContext) {
- LocaleManager localeManager = LocaleManager.getInstance();
- //通過添加URL參數language來改變Locale
- String language =
- facesContext.getExternalContext().getRequestParameterMap().get("language");
- if(language != null) {
- localeManager.setCurrentLanguage(language);
- localeManager.setCurrentLocale(new Locale(language));
- }
- Locale locale = localeManager.getCurrentLocale();
- if(locale == null) {
- locale = Locale.getDefault();
- }
- return locale;
- }
- public String calculateRenderKitId(FacesContext facesContext) {
- return base.calculateRenderKitId(facesContext);
- }
- public UIViewRoot createView(FacesContext facesContext, String string) {
- return base.createView(facesContext, string);
- }
- public String getActionURL(FacesContext facesContext, String string) {
- return base.getActionURL(facesContext, string);
- }
- public String getResourceURL(FacesContext facesContext, String string) {
- return base.getResourceURL(facesContext, string);
- }
- public void renderView(FacesContext facesContext,
- UIViewRoot uIViewRoot) throws IOException,
- FacesException {
- base.renderView(facesContext, uIViewRoot);
- }
- public UIViewRoot restoreView(FacesContext facesContext, String string) {
- return base.restoreView(facesContext, string);
- }
- public void writeState(FacesContext facesContext) throws IOException {
- base.writeState(facesContext);
- }
- public void setBase(ViewHandler base) {
- this.base = base;
- }
- public ViewHandler getBase() {
- return base;
- }
- }
將LocaleSettingViewHandler配置到faces-config.xml中
3.ADF界面設置
- <af:selectOneChoice id="soc1"
- label="#{res['login.language.label']}"
- value="#{localeManager.currentLanguage}"
- valueChangeListener="#{localeManager.changeLocale}"
- autoSubmit="true">
- <af:selectItem label="簡體中文" value="zh" id="si1"/>
- <af:selectItem label="English" value="en" id="si2"/>
- </af:selectOneChoice>
特別說明
還有種方法不用編寫LocaleSettingViewHandler類的,只需要LocaleManager類即可,需要把LocaleManager類中的currentLocale和jspx中view標籤的locale屬性綁定。不過這樣應該需要在每一個jspx頁面中進行設置。可以根據需求靈活選擇不同的方法。
- <f:view locale="#{localeManager.currentLocale}">
參考文獻
http://docs.oracle.com/cd/E25178_01/web.1111/b31973/af_global.htm#CHDGCAFI
代碼下載
http://download.csdn.net/detail/ygj26/4891805
轉自:http://blog.csdn.net/ygj26/article/details/8286558