i18n的Java AOP或注释
我正在开发一个jsp web应用程序,它本来不打算是多语言的,但现在他们希望它能够根据浏览器的语言环境更改用户界面语言 因此,为标签和其他固定元素实现i18n是很容易的,但是我们有一个仪表板框架,它有一些标准报告,这些报告的标题、列标题和其他元素也是固定的,但是从数据库中检索,并且不是所有的都将被翻译 我想用一些符号来表示哪个字段值是可翻译的元素来解决这个问题。例如,可以使用一些i18n的Java AOP或注释,java,jsp,internationalization,annotations,aop,Java,Jsp,Internationalization,Annotations,Aop,我正在开发一个jsp web应用程序,它本来不打算是多语言的,但现在他们希望它能够根据浏览器的语言环境更改用户界面语言 因此,为标签和其他固定元素实现i18n是很容易的,但是我们有一个仪表板框架,它有一些标准报告,这些报告的标题、列标题和其他元素也是固定的,但是从数据库中检索,并且不是所有的都将被翻译 我想用一些符号来表示哪个字段值是可翻译的元素来解决这个问题。例如,可以使用一些#{resource.bundle.key.element}符号 嗯,仪表盘实体使用JPA。因此,我想知道是否有可能使
#{resource.bundle.key.element}
符号
嗯,仪表盘实体使用JPA。因此,我想知道是否有可能使用资源包进行i18n转换,并在从DB检索值后进行区域设置转换,而不进行侵入性编码,可能使用注释或AOP实现
这可能吗?或者我可以使用另一种方法?国际化是一个贯穿各领域的问题,因此是AOP的一个很好的候选者。使用AspectJ,您可以执行以下操作(简单、朴素的示例,仅作为概念证明): 驱动程序应用程序:
package de.scrum\u master.app;
公共类应用程序{
公共枚举语言{EN,DE,FR};
公共最终语言;
公共应用程序(语言){
这种语言=语言;
}
公共静态void main(字符串[]args){
for(语言:Language.values())
新应用程序(语言).printStuff();
}
私有void printStuff(){
System.out.println(“你好世界”);
System.out.println(“此错误消息将不会被翻译”);
系统输出打印项次(“一”);
System.out.println(“两个”);
System.out.println(“三”);
System.out.println(“此错误消息也不会被翻译”);
System.out.println(“再见”);
System.out.println();
}
}
翻译方面:
请注意:静态翻译内容应该存储在属性文件中。我知道这样很难看
package de.scrum\u master.aspect;
导入java.util.HashMap;
导入java.util.Map;
导入de.scrum_master.app.Application;
导入de.scrum_master.app.Application.Language;
公共方面翻译方面{
私有静态最终映射字典=新HashMap();
静止的{
Map translations=newhashmap();
translations.put(Language.EN,“Hello world”);
翻译.put(Language.DE,“你好”);
翻译.put(Language.FR,“世界报你好”);
dictionary.put(“你好,世界”,翻译);
translations=新HashMap();
translations.put(Language.EN,“再见”);
翻译.put(Language.DE,“Auf wiedershen”);
翻译。put(Language.FR,“Au revoir”);
字典。放(“再见”,翻译);
translations=新HashMap();
翻译。put(Language.EN,“一”);
翻译.put(Language.DE,“eins”);
翻译。put(Language.FR,“un”);
字典。放(“一”,翻译);
translations=新HashMap();
翻译。put(Language.EN,“两个”);
翻译.put(Language.DE,“zwei”);
翻译。put(Language.FR,“deux”);
字典。放(“两个”,翻译);
translations=新HashMap();
翻译。put(Language.EN,“三”);
翻译.put(Language.DE,“drei”);
translations.put(Language.FR,“trois”);
字典。放(“三”,翻译);
}
周围空白(应用程序、字符串文本):
调用(**.println(字符串))&&this(应用程序)&&args(文本)
{
进行(
应用
dictionary.get(text)==null?text:dictionary.get(text).get(application.language)
);
}
}
控制台输出:
你好,世界
此错误消息将不会被翻译。
一
二
三
此错误消息也不会被翻译。
再见
哈罗贴边
此错误消息将不会被翻译。
埃因斯
茨威
德雷
此错误消息也不会被翻译。
奥夫·维德尔申
《世界报》你好
此错误消息将不会被翻译。
联合国
双份
特洛伊
此错误消息也不会被翻译。
再见
享受吧