一、什么是国际化:
- 国际化是设计软件应用的过程中应用被使用与不同语言和地区;
- 国际化通常采用多属性文件的方式解决,每个属性文件保存一种语言的文字信息;
- 不同语言的用户看到的是不同的内容;
二、合格的国际化软件:
- 软件实现国际化,需具备以下两个特征
- 1、对于程序中固定使用的文本元素,例如菜单栏、导航条等中使用的文本元素、或错误提示信息,状态信息等,需要根据来访者的地区和国家,选择不同语言的文本为之服务。
- 2、对于程序动态产生的数据,例如(日期,货币等),软件应能根据当前所在的国家或地区的文化习惯进行显示。
三、国际化的框架:
-
i18n(internationalization),L10n(localization),g11n(globalization),还有m17n(multilingualization)
-
区别:
- i18n支持多种语言,但是同一时间只能是英文和一种选定的语言,例如英文+中文、英文+德文、英文+韩文等等;
- L10n(localization),支持2种语言,英文和另外一种语言(例如中文);
- g11n(globalization),简单的理解可以认为g11n = i18n + L10n。
- m17n(multilingualization)可以在同一时间支持多种语言,例如你可以在一个页面里看到中文、英文、德文和韩文。
没有找到L10n、g11n、m17n的使用例子。
四、I18n的简单使用:
- 1、工程资源文件里面创建国际化文件,messages.properties/messages_en_US.properties/messages_zh_CN.properties等文件。
-
2、在配置文件中引入资源文件配置:
spring: messages: encoding: UTF-8 basename: i18n/messages cache-seconds: 3600
-
3、 使用:
@Autowired
private MessageSource messageSource;
@GetMapping("test")
public Map<String, String> test(HttpServletRequest request) {
Locale locale = RequestContextUtils.getLocale(request);
String msg1 = messageSource.getMessage("test.abc", null, Locale.ENGLISH);
String[] params = {"java", "测试"};
String msg2 = messageSource.getMessage("test.abc", params, locale);
Map<String, String> infos = new HashMap<String,String>();
infos.put("msg1", msg1);
infos.put("msg2", msg2);
return infos;
}
五、解决方案
-
根据项目的多服务、多语种、多中开发语言等情况考虑,采用国际化语言服务系统化的方式提供服务,系统提供两种解决思路;
- 根据需求,系统可导出xml、key=value、json格式的语言文件,各个服务系统集成到各自的工程中;
- 系统将语言包打包发布到指定仓库,应用服务主动获取,并更新到本地服务中。
-
系统分为公用语言和项目语言,公用语言会在导出或发布时自动合并入项目国际化语言中。
-
命名规则:服务+模块+功能+描述;(待完善)
- 例如:pgs.order.add.idisnotnull=ID不能为空
- 公用:common.button.confirm=确认
-
前端应用调研:
- 后端只返回默认语言(如中文),前端是否可根据中文,自动转换为相应的其他语言?