长久以前做18n一直靠Strurts的resource bundler的方法,从properties里读取一个个key的值来对应显示正确的语言文字,对于大部分场景这都是满足的。
但是对于有些情况,Resource bundler就不一定适合,比说产品的名称,一个很简单的例子,我的产品中文叫“钢笔,铅笔”,英文叫“pen,pencil",在搜索场景中,国内客户输入的就是“笔”--他想要钢笔铅笔的报价,国外用户可能输入“pen"--他只要钢笔的价格。那么resource bundler在这种情景下就有点力不从心。---可能方案,parser对应的properties,对应line的key读出来,然后读数据库,取信息....(也许luncene有更好的方案,不过偶不知道)。
因此我的初步解决方法是,将各国语言都存储到数据库中去,利用java 5.0的annotation标注其适用的field,例子如下。
//POJO 在hibernate mapping 是field不是properties
public class Major implements Serializable {
@DocumentId
private int id = 0;
@SuppressWarnings("unused")
@Field(name="subject",index = Index.TOKENIZED, store = Store.NO)
@Localization(language = "en", country = "US", acquiescence = true)
private String subject_english = StringUtils.EMPTY;
@SuppressWarnings("unused")
@Field(name="subject",index = Index.TOKENIZED, store = Store.NO)
@Localization(language = "zh", country = "CN")
private String subject_chinese = StringUtils.EMPTY;
// get/set Id 从略
public String getSubject(){
return Translator.translate(this, CurrentUser.getLocale());
}
public void setSubject(String subject){
}
}
Localization是个简单的annotation标签,它有四个参数,前面三个分别是langauge,country和variant,于java.util.Locale的构造参数是一样的,用于构造一个可比较的locale变量,第四个参数acquiescence用于指定某个field是否为默认显示。(default被java给占用了)。
无论我们指定了多少种语言的field,默认暴露出来的就只有subject一个属性,在getSubject中,我写了一个简单的Translator来parser匹配当前locale的field. CurrentUser是个辅助类,从ServletContext中读当前locale,如果用Spring的话,可以直接wrap
LocaleContextHolder.getLocale();
接下来是Translator的内容,并未做什么太多事情
import java.util.Locale;
import java.lang.reflect.Field;
import org.apache.commons.lang.StringUtils;
public class Translator {
public static String translate(Object object, Locale locale)
throws IllegalAccessException {
String result = StringUtils.EMPTY;
for (Field field : object.getClass().getFields()) {
field.setAccessible(true);
Localization i18n = (Localization) field
.getAnnotation(Localization.class);
// construct a local for compare
if (locale.equals(new Locale(i18n.language(), i18n.country(), i18n
.variant()))) {
result = field.get(object).toString();
break;
}
// set a default value if no found
if (i18n.acquiescence() && StringUtils.isEmpty(result))
result = field.get(object).toString();
}
return result;
}
}
利用了反射读每一个field的标签,找到适合的值返回而已。
这个方案好处是,对搜索是透明的,无须干预后台生成索引,也无须干预hibernate search的搜索过程,理论上可以满足前面提出的应用场景,请大家拍砖。
分享到:
相关推荐
J2ME中用LWUIT画简单的指针时钟 ... LWUIT(The Lightweight UI Toolkit)是一个轻量级...下面,thriller来演示一下如何用LWUIT来做一个简单的指针时钟,毕竟笔者只用了1个月的时间来学习、体会,不足和错误之处敬请拍砖。
Struts1.3+Spring3.0+Hibernate3.3+DWR2.X框架集成文档v1.4.pdf 包括事务处理配置,个人整理,仅供学习,请务拍砖。呵呵~~
精通Eclipse整合Web开发——Struts,Spring,Hibernate,JBPM 图书馆下载的,很不容易。 不是很清晰,如果介意的,请不要下载,不要拍砖。 总共有三部分。
精通Eclipse整合Web开发——Struts,Spring,Hibernate,JBPM 图书馆下载的,不是很清晰,如果介意的,请不要下载,不要拍砖。 总共有三部分。
解决bug你可以试试 不要拍砖啊解决bug你可以试试 不要拍砖啊解决bug你可以试试 不要拍砖啊解决bug你可以试试 不要拍砖啊
hibernate_spring_struts框架资料 详细分析hibernate,spring,struts的集成和相关技术·快来拍砖
PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!)PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!)PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!) 郑重声明:此软件不能合并PDF,合并工具请下载...
C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)
第一个ASP程序:Fate 风铃留言本,用来收集用户反馈用的,本人写的第一个ASP程序,希望高手不要拍砖。本留言本界面和功能都非常简洁,甚至没有“回复”功能,管理员与留言本共用同一界面,管理员登录后可以看到删除...
精通Eclipse整合Web开发——Struts,Spring,Hibernate,JBPM 图书馆下载的,不是很清晰,如果介意的,请不要下载,不要拍砖。 总共有三部分。
”按钮,如果一切正常,那么可以看到游戏效果--经典的拍砖游戏!所有代码注释非常详细,一行注释一行代码,是学习Windows编程的启步示例。 阅读对象:希望进行Windows游戏开发的人员,具备Java游戏开发基础和经验;...
SSH之路 其实我只想说的是我是一只对Java编程来说不折不扣的菜鸟,原先最网页前端开发的我最近迷上了底层代码开发,于是开始自学java编程,在同事同学的建议下,选择了SSH。写这些日志的原因只是想把自己这段自学的...
一个清华大学老师上C语言课的ppt课件,入门低。希望对刚刚开始学的盆友有一点小小的帮助
更多相关推荐 Pomer是几个无聊的人利用业余时间做的希望不是无聊的一个基础框架:),目前的功能还不完整,不过我们这几个无聊的人会继续做下去,现在推出的版本功能:一个可以运行的基础框架和代码生成器。...
很是简单,还有毛病,目的是想弄分,望各位大虾别拍砖....
自己本人在学校做的一个CRM,做的是不是很好.希望能给初学者参考一下.希望有高手看到我的资源的话.也能给我留言.本人不甚感激.
[网原]几道拿不准的陈题,欢迎拍砖.docx
NULL 博文链接:https://yuerthe9.iteye.com/blog/364229
从网站上搜集来的网页配色的东东,可以自己设计配色方案,即时预览效果,还可以生成CSS格式,部分汉化. 可以鼓励,不要拍砖.
自己写的 有缺漏请指出 如有不足 尽管拍砖