i18n(Internationalization),即国际化。目的是为了使软件、应用或网站能够适应不同的语言、地区,用户可以选择他们熟悉的语言进行交互,为所有用户提供一致的体验。
本文将会带你了解如何使用 Spring Boot + Freemarker 实现国际化。
假设我们有一个登录页面,其中有 2 个输入框,分别用于输入 用户名 和 密码。对于使用不同语言的用户,需要显示不同的输入框名称。
在 中添加 和 stater 依赖。
通常我们会把项目中需要国际化的内容定义在不同的 properties 文件中,通过 properties 文件名的后缀来表示资源的 语言 和 国别。
在 目录下创建 目录,用于存放国际化资源文件。接着,在 目录中创建如下 3 个 properties 文件,如下:
如上,除了第 1 个空文件外,分别在 2 个资源文件中指定了不同语言的国际化内容。
- 则表示英文资源, 表示英文, 表示美国。
- 表示是中文资源,其中 表示中文, 表示中国。
按照这个格式,你可以配置多个其他语言和国别的资源。
- :英国、英语
- :韩文、韩国
也可以不指定国别,仅指定语言,如:,表示英语,但不分国别(美国、英国、加拿大都说英语)。
注意,properties 文件的编码一定要是 UTF-8!
文件一定要存在,哪怕是空的。否则可能会在运行时遇到如下异常。
在 中添加如下配置:
指定了国际化资源文件的 “前缀”,也就是上文国际化资源文件所在的目录和基本名称。
则是整合 Freemarker 模板引擎的配置。 设置为 暴露了 spring 提供的宏,我们会通过这个宏定义的指令来在模板上渲染国际化资源。 配置则是指定了模板引擎的目录(关于 Spring Boot 整合 Freemarker 的更多细节你可以参考 这篇文章)。
接口用于解析客户端的语言环境,默认它提供了如下实现:
- :从 Cookie 解析客户端语言。
- :固定使用 JVM 的默认语言,不支持更改。
- :从 Session 解析客户端语言。
这里我们使用 ,也就是说在用户选择了语言后,把语言信息存储在客户端浏览器的 Cookie 中,这样的话服务器就不用维护状态了。
创建 配置类,如下:
通过 构造函数指定 Cookie 的名称,默认是 。
方法设置默认的语言。在客户端选择的语言不支持,或者客户端未选择语言的情况下,默认使用的国际化资源。这里设置为 ,也就是 。
还可以设置关于 Cookie 的一些属性,如:、、、、 等等。这里仅设置了 属性,表示禁止 JS 读写这个 Cookie。
拦截器,用于拦截用户的请求。根据用户请求参数来设置语言环境。
创建 配置类,实现 接口:
创建 拦截器实例 Bean。通过 方法指定要拦截的请求方法。 方法设置一个参数名称。客户端通过这个参数传递所选择的语言。 方法表示是否要忽略客户端传递的非法参数值。
最后通过 配置拦截器,拦截所有请求。
在 目录下创建 目录,用于存放模板引擎(上述配置 定义的值)。
接着,在 下创建 模板引擎文件,内容如下。
首先在最顶部通过 导入 Spring 预定义的宏 ,命名为 。这个宏定义了大量的工具指令。
在模板中,通过 调用 宏中的 指令,其中 参数就是在国际化资源文件中定义的 KEY。该指令会根据当前请求所设置的语言环境,自动从对应语言的资源文件中根据 KEY 读取配置值。
最后,创建渲染 模板的 Controller:
启动应用后,用浏览器访问 。
由于第一次访问,且未指定使用的语言。根据 配置,默认使用 ,所以你会看到中文表单名称。

接着,尝试添加 “语言参数”。访问 。
这次,传递了一个 参数, 会拦截到此请求,并把当前请求环境设置为 。所以,能看到英文表单名称。
参数的值要符合:。格式

因为使用了 Cookie,所以只要你没有再次使用 参数来切换不同的语言,则所有请求都会被解析为 语言。
除了模板引擎,我们也可以在代码中通过 Bean 来根据 获取不同的国际化消息值。
例如,在上述 中注入 。
首先,注入 。
在 Controller 方法中通过 获取到当前请求所设置的语言环境 对象。再使用 通过这个 对象获取对应的国际化配置信息。
修改后,重启应用。再次访问 ,服务端输出日志如下:
如上,成功读取到了国际化的配置信息。因为上次请求使用的是 ,由于 Cookie 还在,所以这次请求的语言环境也同样是 。
本文介绍了如何使用 Spring Boot + Freemarker 开发一个国际化应用。步骤总结如下:
- 在 目录下配置各个语言、国别的国际化资源文件。
- 在配置文件中设置国际化资源文件的目录和基本文件名称。
- 创建 实现,用于解析客户端选择的语言。
- 创建 拦截器实现,并且指定要拦截的路径,用于客户端切换不同的语言。
- 在 Freemarker 中通过 指令来渲染国际化内容。
- 在代码中通过 获取当前请求的语言环境,配合 就可以获取到国际化配置信息。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/6066.html