1. 场景需求
首先,我们要清楚理解自己的需求。在服务国际化场景中一般有两种类型的需求:
产品是 web 项目,在浏览器中访问时能够支持多语言。
服务输出 Api,需要返回的数据支持多语言。
2. 实现原理
i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称
首先我们了解一下 java.util.Locale 类,这是 java 中专门适用于国际化的一个类。代表了一个特定的地理、政治和文化地区。
一般用语言_地区(如 zh-CN 表示中文,中国大陆) 可以确定一个特定类型的本地化信息。
Locale 的获取,会通过请求头中 Accept-Language 的字段来得到的。Accept-Language 表示请求者(如浏览器)期望接收的语言。
Accept-Language: en-US,en;q=0.5 // 英文,美国;q 表示期望值
当请求头中 Accept-Language 字段为空时 locale 的则回获取一个默认值,下面会有介绍 Locale 如何通过代码来获取。
Locale 类中部分属性有很多已知的国家常量。
/** Useful constant for language.
*/
static public final Locale JAPANESE = createConstant("ja", "");
/** Useful constant for language.
*/
static public final Locale SIMPLIFIED_CHINESE = createConstant("zh", "CN");
注意事项:
在配置 zh-CN 资源文件,即中文时,需要 idea 设置中勾选如下配置,不然会出现乱码问题。
3. 实现步骤
在 resources 目录下添加多语言配置文件。
国际化资源文件,前缀相同时自动生成 Resource Bundle 'messages'
例 messagesenUS.properties 文件中
10000 = system error!
10001 = information empty!
10000 是 key 值,"system error!" 是 value 值。在其他文件中 key = 相应的语言翻译。
配置解析器,用于收集资源文件并提取属性。
这里可能会有多种实现方式,笔者这里只介绍常用的一种方案。
利用 spring 自动注入资源读取配置类
@Configuration
public class I18nCon