Structs2 request_locale国际化介绍

众所周知,struts2中使用了大量的拦截器(即是传说中的interceptor),其中国际化使用的拦截器为com.opensymphony.xwork2.interceptor.I18nInterceptor,那么接下来分析一下I18nInterceptor这个类。

一.属性

I18nInterceptor有三个属性,分别为parameterName,requestOnlyParameterName,attributeName。

parameterName:http request请求中的参数名字,该参数反映了应该转向的locale,并且保存在session中,所以会话过程都有效。默认为request_locale。

requestOnlyParameterName:http request请求中的参数名字,该参数反映了应该转向的locale,不保存在session中,所以只对当前请求有效。默认为request_only_locale。

attributeName:session中保存用户选择的locale值对应的key值。默认值为WW_TRANS_I18N_LOCALE

二.方法

拦截器中最重要的方法当属intercept方法,其他方法暂时忽略。该方法的逻辑如下:

1.获取parameters对象。Map<String, Object> params = invocation.getInvocationContext().getParameters()

2.在params在取出并移除request_locale。  Object requested_locale = params.remove(parameterName);(parameters对象获取参数得到的是一个字符串数组)

2.1 requested_locale不为null,是Array,长度为1,取出requested_locale的值。否则,2.2

2.2 返回requested_locale

3.在step2中获取到的request_locale如果为空,则将2中的parameterName换成requestOnlyParameterName,执行step2,返回requested_locale

4.如果通过step2和step3获取到的requested_locale不为null,则将requested_locale转换成locale并保存在session中(注意:如果获取到的requested_locale.toString()为null或空字符串或者"_",此时locale=Locale.getDefault())。

5.如果通过step2和step3获取到的requested_locale为null,则判断session中key=attributeName的value值是否存在,若存在则locale=session.get(attributeName),否则locale = invocation.getInvocationContext().getLocale()(此处意思是没有找到重写的locale定义,则保持当前的invocation locale,即用户在浏览器中设置的语言)。

至此,通过I18nInterceptor得到了locale,此后的处理就不言而喻了,肯定就是根据locale取值了。

可以看出:用户在画面设置的locale优先级高于浏览器设置语言得到的locale。

可以看到此处超链接处设置request_locale=en_US,这样struts2获取到的locale当然就是en_US,此时不管浏览器语言设置成什么,画面显示的都是英文的资源,并且在会话期间都有效。若设置的是request_only_locale=en_US,这样只是在当前请求下会显示英文界面,刷新页面就会显示中文了。

时间: 2024-07-30 13:46:27

Structs2 request_locale国际化介绍的相关文章

【JEECG技术博文】JEECG国际化介绍

1.为什么要做国际化 没有国际化的框架是一个不完整的框架,特别在全球信息化的今天,国际化不再是鸡肋,而是在选择开发平台时必须首要的考试因素,特别在有些公司平台是否国际化具有一票否决要素,所以我们要搞国际化,而不是仅仅是简单的高大尚. 2.国际化的实现原理 国际化听起来简单,但要框架中要做到与框架的无缝衔接,松耦合还是有一定难度的.有些系统有时不需要做国际化,在做国际化如果快速发现哪些没有被国际化的字段等,这些问题都开发者在开发过程中实际需要解决的问题,而这一切我们都已经帮你想到了. 用户在登录页

structs2 投影的介绍

第一部分:代码 //前端 访问属性 //web.xml <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false"> <constant name="struts.devMode" value="true"> <constant name="struts.ognl.allowSta

Struts2学习笔记(八)——国际化

1.Struts2国际化介绍 国际化即internationalization简称i18n. 为了实现程序的国际化,必须先提供程序所需要的资源文件.资源文件的内容是key-value键值对. 资源文件的命名可以是如下3种形式: baseName_language_country.properties baseName_language.properties baseName.properties 其中baseName是资源文件的基本名称,用户可以自由定义,而language和country都不可

教程序言

关键字:java 8u101 教程序言备注:中括号为相应汉字的英文单词 本教程是想使用Java进行开发应用的程序员的实践指导.本教程包含成百上千的完整的.可运行的样例,以及几十门课程.相关的课程会被组织成路线[trail]. 什么是新的?本教程会持续更新,来和Java平台的改变以及读者的反馈保持同步.发行的教程和 jdk 8u101 同步.两个新的处理限制属性 entityReplaceLimit 和 maxXMLNameLimit,被添加到了JAXP中.更多信息参考 [处理限制[Process

《Python 3标准库》

Python的库太庞大的,确实需要一本书来梳理一下,最好是按库的功能来粗略地分类,方便我们通过目录快速查阅.而<Python3标准库>就是这样一本书.全文1000+页,活脱脱一块大砖头,沉甸甸的,估计得有两三斤重.一共19章,每一章都是按照一个主题来介绍相关的库,每一个库会分几个小节来举例说明.这些例子来源于作者的“Python Module of the Week”开源项目,地址为https://pymotw.com/3/. <Python3标准库>主题: 1.文本: 介绍了st

【web开发学习笔记】Structs2 Result学习笔记(一)简单介绍

Structs2 Result学习笔记(一)简单介绍 问题一 <struts> <constant name="struts.devMode" value="true" /> <package name="resultTypes" namespace="/r" extends="struts-default"> <action name="r1"

Odoo国际化翻译方法及示例介绍

本文主要介绍了odoo国际化翻译使用的方法及示例 国际化翻译方法 每个模块的翻译文件放在该模块目录下i18n目录里.模块内相关字符串一般用英语写成,然后通过翻译模板导出功能(Settings ? Translations ? Import/Export ? Export Translation)导出一个翻译模板pot文件.翻译人员使用翻译软件(poedit)进行翻译后,产生对应语言po文件,再放入i18n目录下供odoo加载.po文件的文件名规则一般由对应语言缩写或语言_国家组成,如中文为zh.

i18next-页面层语言国际化js框架介绍

因为工作需要,最近研究了下网站语言国际化的问题,根据当前项目架构,寻求一种较好的解决方案.首先总结下项目中语言切换实现方式大概有以下几种: 1,一种语言一套页面,如:index_CN.html,index_TN.html,index_EN.html   根据用户当前使用语言来展示对应的页面.   这种方式比较常用,也比较理想,性能不错,但是开发使用的时间就多,每个页面要多做几遍. 2,后台定义变量,根据当前语言返回对应语言信息   这种方式不好使,麻烦,页面所有静态显示文本处都需要定义变量,从后

Qt国际化详细介绍,中文乱码以及解决方案

Qt国际化的一般步骤 运行 lupdate,从应用程序的代码中提取所有界面上的可见字符. 这些可见字符必须被 tr() .QCoreApplication::translate().Qt_TR_NOOP().Qt_TRANSLATE_NOOP()等来包裹字符串,具体这些函数或者宏是什么功能,我们后面细说. 使用 Qt Linguist 翻译应用程序. 运行 lrelease,生成二进制的 .qm 文件,应用程序可以使用 QTranslator 加载这个文件. 翻译标志函数和宏 在类内时,使用tr