讨论一下SSH(2):国际化问题

Little_qd 2008-11-07 11:35:22
一个应用如果有可能部署到多个语言地区时就不可避免面临国际化问题,应用构建之初就应加以考虑
最近需要将系统部署到美帝那里,所以讨论一下这个问题

1、Struts提供对国际化的支持
过程简单说一下,定义各种语言的资源文件,转码,可以分模块定义各自文件,如:

英文(美国):UserResources_en_US.properties
user.name=Name
中文(简体):UserResources_zh_CN.properties
user.name=姓名

加载:
<message-resources key="user" parameter="com.littleqd.resources.user.UserResources"/>

在JSP中使用标签处理语言相关的内容,JS同样处理,如:
<bean:message bundle="user" key="user.name"/>

2、图片国际化
可以利用上面的处理,将图片的url放到资源文件中,不同语言对应不同路径的图片
3、用户自定义语言
用户可以自己选择应用的语言:
request.getSession().setAttribute(Globals.LOCALE_KEY,locale);

4、显示习惯
数字、货币、日期、度量单位、电话邮编等各个地区的显示习惯也不同,需要考虑,如货币:
NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(locale);
String currencyString = currencyFormat.format(doubleNum);

5、字符范围的扩展
校验字母就不能单纯a~z了,要考虑法文、俄文等,如d'entrée à ç
6、时区
如果应用服务器在中国,数据库在美国,用户又在英国、德国、爪哇岛,时区不同咋整,数据库里日期咋存储?用户界面咋显示?也要考虑

欢迎讨论

...全文
495 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
Little_qd 2008-11-18
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 guoquanyou 的回复:]
这是个好东西,
不过我看到的很多都是
cn/
en/
jp/
等目录下,分别放置。
这样让故意让人家看看我有几个版本,好像很牛的。呵呵
[/Quote]

改程序时可就累了
null1null 2008-11-18
  • 打赏
  • 举报
回复
按用户所在的地点IP选取相应的数据
eeight 2008-11-17
  • 打赏
  • 举报
回复
先学习下。。。。。。。。。。。。。。。。。。。。。。。。。。。
Little_qd 2008-11-17
  • 打赏
  • 举报
回复
Up
忙碌的布谷鸟 2008-11-17
  • 打赏
  • 举报
回复
这是个好东西,
不过我看到的很多都是
cn/
en/
jp/
等目录下,分别放置。
这样让故意让人家看看我有几个版本,好像很牛的。呵呵
ri881226 2008-11-12
  • 打赏
  • 举报
回复
关注
hanhongmin 2008-11-12
  • 打赏
  • 举报
回复
语言不一样,显示也不一样
比如"中国"是2个字,"China"是5个字母,页面很难搞定样式什么的,而且有的字是嵌在图片里的
我们一般是对一种语言做一套页面出来,选择哪种语言,需要用户自己去选择,而不是自动国际化
hecaiyun2003 2008-11-12
  • 打赏
  • 举报
回复
关注并学习.
Little_qd 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 hanhongmin 的回复:]
语言不一样,显示也不一样
比如"中国"是2个字,"China"是5个字母,页面很难搞定样式什么的,而且有的字是嵌在图片里的
我们一般是对一种语言做一套页面出来,选择哪种语言,需要用户自己去选择,而不是自动国际化
[/Quote]

这个虽然可以实现
但有点治标不治本的感觉
恬毅 2008-11-11
  • 打赏
  • 举报
回复
过来学习。。现在也在用struts还有spring、hibernate做项目。。感觉struts框架比较成熟。。
bruni 2008-11-11
  • 打赏
  • 举报
回复
个人想法:
1. 对于界面, 你的系统支持(或者你实现了)集中语言, 那就是集中语言.
不可能说, 你的资源文件只有中文, 英文, 俄文, 当阿拉伯人访问的时候就显示阿拉伯语.

2. 关于时区, 只要你清楚那个是客户端的语言, 那个是服务器端的语言就好了. 必要的时候进行转换就是了.

3. 至于如何确定客户希望什么样的语言, 一种是通过浏览器的设置, 一种是通过IP. 一般都是取前者, 因为你可以想想一下, 一个国外用户到了中国上网并不代表他希望看中文网页.

仅供参考.
mark
时光瞄 2008-11-11
  • 打赏
  • 举报
回复
顶一个,Struts好久都没用了,国际化用得更少,过来学习...
Little_qd 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 boboo_2000_0 的回复:]
很高兴能和楼主探讨,在做Struts时也遇到国际化问题,在action里面可以取得国际化资源:
MessageResources resources = this.getResources(request, "message");
jsp里面可以像楼主所说的那样:
1.先设置locale
request.getSession().setAttribute(Globals.LOCALE_KEY,locale);
2.根据bundle和key取得资源
<bean:message bundle="user" key="user.name"/>
[/Quote]

对头
如果在Struts Action里,可以直接使用Struts的工具类

Locale locale = this.getLocale(request);
MessageResources messageResource = this.getResources(request, "UserResources");
String userName = messageResource.getMessage(locale, "user.name");

如果不是Action,可以参考Struts Action中getLocale和getResources的实现

Locale locale = RequestUtils.getUserLocale(request, null);
MessageResources messageResource = (MessageResources) request.getAttribute(Globals.MESSAGES_KEY);
String userName = messageResource.getMessage(locale, "user.name");

其中RequestUtils.getUserLocale的实现如下

先从session里看有没有自定义过local
(Locale) session.getAttribute(Globals.LOCALE_KEY);
如果没有,取环境的local(IE或系统的语言设置)
request.getLocale();



[/code]
Little_qd 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zjjsgwm 的回复:]
建议楼主通过用户选择来做国际化,单纯的通过struts去获取客户端的区域来做会有问题.
一些公用的格式转换可以通过参数条件来做.
比如说所有的校验都需要传递个local参数.而在校验里通过local来判定使用哪种校验方式.
[/Quote]

单纯的通过struts去获取客户端的区域来做会有问题.
这个怎么讲?

时区是个大问题.如果真要做到这个,那估计得通过IP去查用户在哪国了.呵呵,或者不考虑这个原因,用户选择什么语言就给他显示什么时间.
这确实是个大问题
比如google,即使是选择了用英文界面,它仍然知道你是中国的,估计是通过IP确定
zjjsgwm 2008-11-10
  • 打赏
  • 举报
回复
建议楼主通过用户选择来做国际化,单纯的通过struts去获取客户端的区域来做会有问题.
一些公用的格式转换可以通过参数条件来做.
比如说所有的校验都需要传递个local参数.而在校验里通过local来判定使用哪种校验方式.

关于数据库存储的数据如日期\货币等都可以是标准格式,在显示时根据区域不同转成相应的格式.
这么做法的效率肯定没有直接指定来的快.但能避免很多问题.

时区是个大问题.如果真要做到这个,那估计得通过IP去查用户在哪国了.呵呵,或者不考虑这个原因,用户选择什么语言就给他显示什么时间.
nf0011468 2008-11-10
  • 打赏
  • 举报
回复
恩,我也用过国际化,但也就是登陆时的提示信息给国际化了下,没LZ这么深究,来学习下
boboo_2000_0 2008-11-10
  • 打赏
  • 举报
回复
很高兴能和楼主探讨,在做Struts时也遇到国际化问题,在action里面可以取得国际化资源:
MessageResources resources = this.getResources(request, "message");
jsp里面可以像楼主所说的那样:
1.先设置locale
request.getSession().setAttribute(Globals.LOCALE_KEY,locale);
2.根据bundle和key取得资源
<bean:message bundle="user" key="user.name"/>
Little_qd 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 orz_ORZ_orz 的回复:]
这个全球化项目很牛,lz牛人啊,占座学习
[/Quote]

继续等niu人
加分
:)
zou_wei_forever 2008-11-10
  • 打赏
  • 举报
回复
好贴,占个座先
orz_ORZ_orz 2008-11-08
  • 打赏
  • 举报
回复
这个全球化项目很牛,lz牛人啊,占座学习
加载更多回复(8)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧