Java-I18n
前言
- 国际化也称作
i18n
,来源是英文单词internationalization
的首末字符i
和n
,18
为中间的字符数。- 由于软件发行可能面向多个国家,对于不同国家的用户,软件显示不同语言的过程就是国际化
- 通常来讲,软件中的国际化是通过配置文件来实现的,假设要支撑两种语言,那么就需要两个版本的配置文件
Java国际化
Java
自身是支持国际化的,java.util.Locale
用于指定当前用户所属的语言环境等信息,java.util.ResourceBundle
用于查找绑定对应的资源文件,Locale
包含了language
信息和country
信息
配置文件命名规则:
basename_language_country.properties
- 必须遵守以上的命名规则,
java
才会识别。其中basename
是必须的,语言和国家是可选的。- 这里存在一个优先级的概念,如果同时提供了
messages.properties
和messages_zh_CN.propertis
两个配置文件,如果提供的locale
符合zh_CN
,那么优先查找messages_zh_CN.properties
配置文件,如果没找到,再找messages.properties
配置文件最后注意事项:所有的配置文件必须放在
classpath
中,一般放在resources
目录下
1、代码演示
1.1、创建java\maven
项目
略。。。
1.2、创建多语言配置文件
如下创建方法基于
Idea
开发工具
首先右键
resource
文件夹,然后new->Resource Bundle
然后再弹框中输入要添加的语言文件信息,最后点击
OK
即可自动生成,左侧有的话,可以选中然后点中间的➡️
移动过去
生成文件效果如下
最后给
en_US、zh_CN
添加测试数据即可注意:配置文件的编码格式一定要是UTF-8
,可打开settings->Editor->File Encodings
里面修改
1.3、编写测试代码
以下代码可以将相同地方提取为工具类进行多次调用不同传参
package com.tcc;import java.util.Locale;
import java.util.ResourceBundle;public class TestI18n {private static final String BUNDLE_NAME = "messages";public static void main(String[] args) {// 手动指定 获取配置文件中的中国的内容 zh_CNResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_NAME, Locale.CHINA);String value = bundle.getString("test");System.out.println(value);// 手动指定 获取配置文件中的英国的内容 en_USResourceBundle bundle2 = ResourceBundle.getBundle(BUNDLE_NAME, Locale.US);String value2 = bundle2.getString("test");System.out.println(value2);// 设置默认值 为中国语言(常用)Locale.setDefault(Locale.CHINA);ResourceBundle bundle3 = ResourceBundle.getBundle(BUNDLE_NAME, Locale.getDefault());String value3 = bundle3.getString("test");System.out.println(value3);}
}
1.4、执行效果
Spring国际化
Spring
中,国际化是通过MessageSource
这个接口来支持的- 常见实现类:
ResourceBundleMessageSource
:这个是基于java
的ResourceBundle
基础类实现,允许仅通过资源名加载国际化资源ReloadableResourceBundleMessageSource
:和第一个类的功能类似,多了定时刷新功能,允许再不重启系统的情况下,更新资源的信息StaticMessageSource
:它允许通过编程的方式提供国际化信息,我们可以通过这个来实现db
中存储国际化信息的功能- 以下只演示了基本的使用方式,如需更复杂的使用方式,可自行搜索其他案例
1、代码演示
1.1、创建SpringBoot
项目
略。。。
1.2、编写配置文件
spring.application.name=i18n-spring-test# 默认的basename值配置
spring.messages.basename=messages
# 找不到code时,是否直接返回code值,而不是抛异常,默认false,抛异常
spring.messages.use-code-as-default-message=true
1.3、创建多语言配置文件
和上面
Java国际化->代码演示->创建多语言配置文件
步骤一致,就不演示了,内容如下
1.4、编写测试代码
package com.tcc;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.MessageSource;import java.util.Locale;@SpringBootTest
class I18nSpringTestApplicationTests {@Autowiredprivate MessageSource messageSource;@Testvoid contextLoads() {// 手动指定 获取配置文件中的中国的内容 zh_CNString test = messageSource.getMessage("test", new Object[]{"世界!"}, Locale.CHINA);System.out.println(test);// 手动指定 获取配置文件中的英国的内容 en_USString test2 = messageSource.getMessage("test", new Object[]{"World!"}, Locale.US);System.out.println(test2);// 设置默认值 为中国语言Locale.setDefault(Locale.CHINA);String test3 = messageSource.getMessage("test", new Object[]{"世界!"}, Locale.getDefault());System.out.println(test3);String test4 = messageSource.getMessage("test1", new Object[]{"世界!"}, Locale.getDefault());System.out.println(test4);// 没有对语言时,返回默认语言String test5 = messageSource.getMessage("test", new Object[]{"世界!"}, Locale.FRANCE);System.out.println(test5);}}