
资深软件开发工程师,业余马拉松选手。
在开发应用程序的时候,经常会遇到支持多语言的需求,这种支持多语言的功能称之为国际化,英文是internationalization,缩写为i18n(因为首字母i和末字母n中间有18个字母)。
还有针对特定地区的本地化功能,英文是localization,缩写为L10n,本地化是指根据地区调整类似姓名、日期的显示等。
也有把上面两者合称为全球化,英文是globalization,缩写为g11n。
在Java中,支持多语言和本地化是通过配合实现的:
对于Web应用程序,要实现国际化功能,主要是渲染View的时候,要把各种语言的资源文件提出来,这样,不同的用户访问同一个页面时,显示的语言就是不同的。
我们来看看在Spring MVC应用程序中如何实现国际化。
实现国际化的第一步是获取到用户的。在Web应用程序中,HTTP规范规定了浏览器会在请求中携带头,用来指示用户浏览器设定的语言顺序,如:
上述HTTP请求头表示优先选择简体中文,其次选择中文,最后选择英文。表示权重,解析后我们可获得一个根据优先级排序的语言列表,把它转换为Java的,即获得了用户的。大多数框架通常只返回权重最高的。
Spring MVC通过来自动从中获取。有多种的实现类,其中最常用的是:
从中获取时,首先根据一个特定的Cookie判断是否指定了,如果没有,就从HTTP头获取,如果还没有,就返回默认的。
当用户第一次访问网站时,只能从HTTP头获取,即使用浏览器的默认语言。通常网站也允许用户自己选择语言,此时,就会把用户选择的语言存放到Cookie中,下一次访问时,就会返回用户上次选择的语言而不是浏览器默认语言。
第二步是把写死在模板中的字符串以资源文件的方式存储在外部。对于多语言,主文件名如果命名为,那么资源文件必须按如下方式命名并放入classpath中:
- 默认语言,文件名必须为;
- 简体中文,Locale是,文件名必须为;
- 日文,Locale是,文件名必须为;
- 其它更多语言……
每个资源文件都有相同的key,例如,默认语言是英文,文件内容如下:
文件内容如下:
第三步是创建一个Spring提供的实例,它自动读取所有的文件,并提供一个统一接口来实现“翻译”:
其中,是我们在文件中定义的key,第二个参数是数组作为格式化时传入的参数,最后一个参数就是获取的用户实例。
创建如下:
注意到会自动根据主文件名自动把所有相关语言的资源文件都读进来。
再注意到Spring容器会创建不只一个实例,我们自己创建的这个是专门给页面国际化使用的,因此命名为,不会与其它实例冲突。
要在View中使用加上输出多语言,我们通过编写一个,把相关资源注入到中:
不要忘了在中注册。现在,就可以在View中调用方法来实现多语言:
上述这种写法虽然可行,但格式太复杂了。使用View时,要根据每个特定的View引擎定制国际化函数。在Pebble中,我们可以封装一个国际化函数,名称就是下划线,改造一下创建的代码:
这样,我们可以把多语言页面改写为:
如果是带参数的多语言,需要把参数传进去:
使用其它View引擎时,也应当根据引擎接口实现更方便的语法。
最后,我们需要允许用户手动切换,编写一个来实现该功能:
在页面设计中,通常在右上角给用户提供一个语言选择列表,来看看效果:
切换到中文:
在Spring MVC程序中实现国际化。
下载练习
多语言支持需要从HTTP请求中解析用户的Locale,然后针对不同Locale显示不同的语言;
Spring MVC应用程序通过和,配合View实现国际化。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/6157.html