介绍
现在很多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