国际化,资源文件如何存储更优?

来源:互联网 发布:淘宝电费 编辑:程序博客网 时间:2024/04/30 14:08

项目的 v1.0 完成了,然后被告知,需要添加 i18n 支持。

我们用的框架是 struts2 + spring,其中 spring 只做 bean 相关的生产以及配置工作,按照最简单的,就是建立一个个的 .properties 文件。

在 1.0 版本的系统里,我把所有的 Action 都去继承自己写的一个 AbstractAction (简称 AA ) 了,并且,我在这个 AA 里重载 了 ActionSupport 的 getText(String key) 方法,去我们数据库内的一张 messages 表内取与 key 对应的文本。但是没有考虑 i18n。

当然,如果在这个基础上添加 i18n 支持的话,不外乎添加一个 locale/language 的字段,简单。
麻烦的是,页面上的 <s:text name="xxx"/> 好像用不了,只能改为 <s:property value="xxx" escape="true/false"/>。
-----已解决
<s:text name="key"/> 调用的是String getText(String key, String defaultValue, List args, ValueStack stack)方法,重载此方法就可以了。



早上,小组开了个小会讨论 i18n 的解决方案。最后确定,采用通用的 .properties 文件的做法。

但我还是觉得这个做法不是那么多好,原因如下:
1. 开发期间,修改资源文件,当前的这个 web context 不断的 reload,麻烦,若系统添加了需要登录的权限验证,那就是超级麻烦。
2. 对于 key-value-pair 的管理,按照 DRY 的原则,若 value 相同,那么就应该把 key 置为相同的,可如果是在两个 Action 里的呢?向父类 AA 里提取?那么,命名方式呢?(我们现在采取了如此多命名方式:login.invalid_username, profile.change_password_success,.前的是 Action 的名字)。
3. 对于问题 2,独立开发的话,问题不会很大。但是小组配合,若 partner 不在旁边的那个位置,这就是一场灾难。
4. <s:text/> 方法很好用,但是仅限于在 view/action 层。我们系统里有一个导出 excel 功能,表头 label 的 i18n,好吧,我功力太浅,没有找到在一个外部 utils 包内的完全脱离语境的情况下如何取得这些 resource bundles。

----关于问题1,可能有人认为统一改好后统一测试不就得了。但是作为一个 web 开发人员,我个人认为,看到页面效果后再进行下一步,是给我前面动作的肯定,信心的提升,不看页面就往下走,可能效率极高,但是更可能自找麻烦。
TDD 不是就认为我们应该多测试么?



在社区的地址,看看会不会有人讨论。
http://topic.csdn.net/u/20081223/16/2770aeee-d1b9-4bec-8053-3cbac682f018.html


*******************************
add @ 2008-12-26 15:30
--------
看来 CSDN 真是堕落的不行,只有一个人回复了我这个帖子:
ladofwind:相信我 ,用propertie文件是业界规范,另外js文件也可以做国际化,它会随browser locale不同加载不同语言的,
第二个问题,多搞几个文件就可以了,不同的propertie文件也可以有同样的key啊,只要你jsp里搞好bundle哪个文件
就好

-----------------------
今天我想到了的是,我还是觉得放DB里好一些,因为开发阶段这些痛苦实在太让人难受了。
关于速度,.properties文件用的是启动时全部加载,速度没话说,毕竟是内存操作。那么我给数据库加一个缓存的话,也同样是内存操作。脏数据?那加一个清空缓存的接口就OK了。

于是,优缺点在此列一下:
缺点:
1. 增加了一个做清缓存的接口,不过,此为一劳永逸。
2. 页面上的 <s:text name="key"/> 方法需要全改为 <s:property value="getText('key')"/>,这个比较恶心。。。
----同上,已解决。

优点:
1. 传闻 webwork/struts2 的 getText(String) 方法运用不当会导致效率问题(这个是我以讹传讹。。。)。
2. 开发小组成员统一引用一个DB,维护 key-value-pair 的难度比独自维护 properties 文件下降很多很多。
3. 脱离 web context 模块的 i18n 做起来将方便很多。
-----
4. 重载 getText 方法,可以在 key 里面自己做手脚,如: <s:text name="username +:"/>,代表后面跟一个冒号(国际化里的全角半角之分)。


----- 黑体部分 @ 2008-12-26
----- 第4点 @ 2009-01-04