长久以前做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个月的时间来学习、体会,不足和错误之处敬请拍砖。
总的来说,处理bug是一个系统的工程,需要耐心、细心和专业的技能。开发者应当以解决问题的态度去面对bug,而不是抱怨或焦虑,正如"解决bug不要拍砖啊"所提倡的那样,保持冷静,用技术和智慧去战胜困难。
PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!)PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!)PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!) 郑重声明:此软件不能合并PDF,合并工具请下载...
标题中的“JMail 示例(无附件发送) 欢迎大家拍砖”表明这是一个关于使用JMail库在Java中发送邮件的示例代码,没有涉及附件功能。博主可能分享了一个简单的程序,期望社区成员提供反馈和改进意见。 JMail是一个...
C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)
5. **自定义配置**:一个好的插件应该提供丰富的配置选项,允许开发者根据需要调整滚动速度、延迟时间、加载方式等。 遗憾的是,没有直接提供源码,我们无法直接分析其具体实现。但可以尝试访问提供的博文链接...
文件"DDDFWD_Sunrise"可能是一个项目或工具的名称,如果与博客内容相关,它可能是作者讨论的一个实例,涉及到源码分析或工具应用的具体场景。然而,由于缺乏上下文,我们无法进一步推测其具体含义。 总的来说,理解...
”按钮,如果一切正常,那么可以看到游戏效果--经典的拍砖游戏!所有代码注释非常详细,一行注释一行代码,是学习Windows编程的启步示例。 阅读对象:希望进行Windows游戏开发的人员,具备Java游戏开发基础和经验;...
在这个案例中,“Fate 风铃留言本”是一个简单的ASP应用程序,用于收集用户的反馈信息。 【留言本功能】 一个基本的留言本系统通常包括以下组件: 1. **用户界面**:用户通过浏览器看到的页面,用于输入留言和查看...
标题“求拍砖,如果完全放弃Java的面向对象设计,会产生怎样的后果”提出了一个有争议的话题,即在软件开发中完全不采用面向对象(Object-Oriented, OO)设计原则会带来的影响。面向对象是Java语言的核心特性之一,...
标题中的“新手学j2me,大牛来看看写得如何,欢迎拍砖啊”表明了这是一个关于学习Java ME(J2ME)技术的讨论,作者可能是初学者,希望得到资深开发者的意见和反馈。J2ME是Java的一个版本,主要用于开发移动设备、...
在这个项目中,你创建了一个基于Struts、Hibernate、Spring和Ajax的CRM系统,这四个技术是Java Web开发中的核心组件。 Struts是一个开源的MVC(Model-View-Controller)框架,它简化了Web应用程序的开发。通过分离...
1988年,这个标准被ISO接纳,形成了ISO C标准(ISO9899-1990),并在后续年份进行了多次修订,以适应不断变化的计算环境和技术需求。目前的C语言编译器大多基于ANSI C标准,尽管不同编译器之间可能存在细微差异。 ...
从网站上搜集来的网页配色的东东,可以自己设计配色方案,即时预览效果,还可以生成CSS格式,部分汉化. 可以鼓励,不要拍砖.
而"工具"标签则提示我们,这是一个易于使用的应用程序,无需深入理解数据库备份的底层机制,用户只需配置好参数即可使用。 至于压缩包中的“MySQL_backup”,这很可能是备份工具的主程序或者配置文件。在使用前,...
自己写的 有缺漏请指出 如有不足 尽管拍砖
修复之前的一个isReg()的错误,之前的博客就写过一篇文章《写了一个Follow5 API的PHP类》说自己已经写了一个Follow5的PHP类,今天我主要是要发布我写的这个Follow5 的API PHP类,高手拍砖,基本的功能跟代码说明在...
当时本人急需破解了一个公务员考试视频讲座,但是加了密,找了N个工具都不行,后来找到这个工具后试了试,很快就将RAR的密码破解了出来,非常激动,好东西立刻给大家分享一下。因为没有办法上传图片,所以也不给大家...
手机PCBPADS 可以参考,最新方案,欢迎拍砖啊啊 呵呵,小弟画的不好请大哥指点啊
- 在一个1公里长的电缆上建立一个1Gbps速率的CSMA/CD网络,信号在电缆中的传播速度为200000km/s,计算得到最短帧长度为2560b/s。 - 对于从源主机向目的主机发送一个30Mbits的MP3文件的问题: - 如果源主机和目的...