Dorado7的国际化
目录
配置
管理页面地址com.deloitte.common.resource.view.langResourcemanager_one.ling
WebContent/WEB-INF/dorado-home/context.xml
<bean id="dorado.globalResourceBundleManager" class="com.deloitte.common.resource.service.TRGlobalResourceBundleManager">
<property name="cache" ref="dorado.globalResourceCache" />
</bean>
@Override
public Map<String, Map<String, String>> getLangCacheMap() {
if (langCacheMap == null) {
flushLangCacheMap();
}
return langCacheMap;
}
public void flushLangCacheMap() {
isInit = false;
execFlushLangCacheMap();
}
/**
* 同时只有一个入口能调用flushLangCacheMap
* 排队调用时,因为isInit的原因,第一次过后的执行都不会去读数据库刷新langCacheMap的值
*/
private synchronized void execFlushLangCacheMap() {
if (!isInit) {
List<LangResource> resources = langResourceDao
.findLangResourceByParams(new HashMap<>());
langCacheMap = new HashMap<String, Map<String, String>>();
Map<String, String> zhCacheMap = new HashMap<>();
Map<String, String> enCacheMap = new HashMap<>();
langCacheMap.put("zh", zhCacheMap);
langCacheMap.put("en", enCacheMap);
for (LangResource resource : resources) {
zhCacheMap.put(resource.getKey(), resource.getZh());
enCacheMap.put(resource.getKey(), resource.getEn());
}
isInit = true;
}
}
使用
查找中文
[^\x00-\xff]
view.xml使用
${res["DB/project.groupCode"]}
.js中使用
alert('${res["DB/project.groupCode"]}')
java中使用
I18nUtils.get("project.groupCode")
字典中使用
res["DB/project.groupCode"]
常用代码
${res["core.common/"]}
version=版本号
orgName=主数据归属单位
createdBy=创建人
createDate=创建日期
flag=状态
Already exists=已存在!
Availability Period=有效期
Availability Period To=至
Save Data Sucess=数据保存成功!
在ling2下的使用
SearchPath配置为:
<bean parent="dorado.globalResourceSearchPathRegister"> <property name="searchPath" value="classpath:config/i18n/" /> </bean>
即:默认公共语言文件放在下classpath:config/i18n/下 例如当你把一个Test.zh_CN.properties放置在SearchPath(classpath:config/i18n/)对应目录的名为core的子目录中时,它的BundleName就应该是core.Test。可以按照下面的方法来定义EL表达式:
${res["core.Test/PageTitle"]}
对于这段表达式,Dorado在处理时会到SearchPath的core子目录中名为“Test”的国际化资源束查找名为“PageTitle”的资源项。
如果要在java代码中使用
@Component public class MyBean { @DataProvider public Collection<Employee> findEmployeesByNamePattern(String pattern) throws Exception { if (StringUtils.isEmpty(pattern)) { // 获得当前Class的私有国际化资源束 ResourceManager resourceManager = ResourceManagerUtils.get(getClass()); throw new IllegalArgumentException(resourceManager.getString("PatternUndefined")); } ... ... } }
调试模式
core.classPathResourceReloadable=true
定义Locale
com.bstek.dorado.core.resource.LocaleResolver接口用于告知Dorado系统当前应使用什么地区和语种,Dorado提供的默认配置如下:
<bean id="dorado.localeResolver" class="com.bstek.dorado.view.resource.SpringLocaleResolverAdapter"> <property name="springLocaleResolver"> <bean class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" /> </property> </bean>
该配置通过Spring中的org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver来确定地区和语种。您也可以通过自定义com.bstek.dorado.core.resource.LocaleResolver的实现类来改变原有的逻辑,新的实现类只要通过下面的方式配置到 home:context.xml 既可生效。
<bean id="dorado.localeResolver" class="xxx.MyLocaleResolver"/>
国际化资源的自动注入
想象一下,如果我们的某个View中有一个包含了50个PropertyDef的DataType,而这50个PropertyDef的caption和tip属性都需要进行国际化。那么我们可能需要在这个View中填写100此EL表达式,这么做无疑是令人崩溃的一件事!正是考虑到了这样的使用场景,Dorrado为国际化资源提供了主动注入的功能。
自动注入功能目前适用于Model和View这两种文件,基本的做法是只要按照特定的规则在私有国际化资源文件中定义资源项,这些资源字符串就会在运行时自动的被注入到相应的属性中,不需要额外的定义EL表达式去引用。
所以支持自动注入的资源项都必须以“#”作为其键值的开头。以View配置文件为例,假设我们在其私有资源文件定义了如下的资源项:
\#buttonSave=保存
由于#在Java的.properties文件中表示注释,所以我们需要在第一个“#”字符之前增加“\”。Dorado在遇到这样的资源项时会把“#”后面的内容认作View中某控件的id,并且自动将“保存”设置到该控件(实质为Button)的caption属性中。
看到这里您可能会产生一个疑问,为什么“保存”被注入到了caption属性中而不是其他的属性?原因是在进行自动注入时,如果没有显示的指定的属性名,Dorado默认会按照下面的规则来确定属性,首先查找控件是否存在caption属性,如何存在则直接设置caption属性,如果没有则进一步查找label属性,进而查找title属性。此查找规则可以被定义在具体Class上的Annotation改变,定义这种Annotation的方法此处不表。
- 在注入的过程中如果Dorado发现对象的目前属性的内容不是空,那么Dorado会跳过该资源的注入。也就是说直接定义在View配置文件的内容的优先级是高于资源自动注入的。
- 另外还有一个需要提及的规则是,#后面的内容其实并不仅仅表示控件的id,也可以是DataType的名称。具体代表控件还是DataType,将有Dorado在运行时自动判断。
- 如果您需要为View配置文件中的View对象本身注入国际化资源,那么可以通过“#view”完成,因为View对象不允许我们为其定义id属性。
下面的更多的资源注入的实例:
\#buttonSave.tip=保存当前记录 <-- 注入到id为buttonSave的按钮的tip属性 \#view=代码维护 <-- 注入到View的title属性 \#Employee.#address=地址 <-- 查找名为Employee的DataType,并注入到其中address属性描述的caption属性中 \#Employee.#address.tip=请输入您的地址 <-- 注入到上面属性描述的tip属性中 \#gridEmployee.#comment=备注 <-- 查找id为gridEmployee的DataGrid,并注入到其中comment列的caption属性中