场景
当系统固定消息/标题文字,需要面向多个国家的时候,i18n就能很好解决了
概述
国际化(Internationalization,简称i18n)是指在软件开发中设计和实现应用程序,使其能够适应不同语言、文化和区域设置的需求,而无需对代码进行重大修改。国际化通常与本地化(Localization,简称l10n)一起使用。国际化关注的是软件的通用设计,而本地化则是针对特定语言和地区的内容调整。
配置
spring中已经有i18n相关的依赖了
1、引入依赖
1 2 3 4 <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter</artifactId > </dependency >
2、创建i18n文件
根据自己项目国际化语种配置, 此处的结构
1 2 3 4 5 6 7 8 9 src └── main └── resources └── i18n ├── message.properties // 默认的消息文件(不带语言代码) ├── message_en_US.properties // 英文(美国)消息文件 ├── message_ja_JP.properties // 日文(日本)消息文件 ├── message_zh_CN.properties // 简体中文(中国)消息文件 ├── message_zh_TW.properties // 繁体中文(台湾)消息文件
message.properties
1 index.page.title ={0}Study hard, make progress every day{1}
message_en_US.properties
1 index.page.title ={0}Study hard, make progress every day{1}
message_ja_JP.properties
1 index.page.title ={0}よく学び、日々進歩{1}
message_zh_CN.properties
1 index.page.title ={0}好好学习,天天向上{1}
message_zh_TW.properties
1 index.page.title ={0}好好學習,天天向上{1}
注意:{0},{1}
表示占位符,可以替换参考下面的i18mhelper的用法,当然你也可以往后添加更多的占位符:{2},{3}
3、i18m配置类
配置springboot启动时,读取i18n的资源文件
1 2 3 4 5 6 7 8 9 10 11 @Configuration public class I18NConfig { @Bean public ResourceBundleMessageSource messageSource () { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource (); messageSource.setBasenames("i18n/message" ); messageSource.setDefaultEncoding("UTF-8" ); return messageSource; } }
4、i18mhelper
用于获取i18n中某语言的具体值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 @Component public class I18nHelper { @Resource private MessageSource messageSource; public String getMessageWithLocale (String languageTag, String key, Object... args) { Locale newLocale = Locale.forLanguageTag(languageTag.replace('_' , '-' )); System.out.println("Setting Locale to: " + newLocale); LocaleContextHolder.setLocale(newLocale); try { return messageSource.getMessage(key, args, newLocale); } catch (NoSuchMessageException e) { System.err.println("No message found for key: " + key + " with Locale: " + newLocale); throw e; } } }
5、单元测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 @SpringBootTest public class TestI18n { @Resource private I18nHelper i18nHelper; @Test public void TestI18n () { try { String res = "" ; String i18nType = "ja_JP" ; res = i18nHelper.getMessageWithLocale(i18nType, "index.page.title" , "《" , "》" ) System.out.println("\n ======== res " +res+" ===========\n" ); i18nType = "en_US" ; res = i18nHelper.getMessageWithLocale(i18nType, "index.page.title" , "《" , "》" ) System.out.println("\n ======== res " +res+" ===========\n" ); i18nType = "zh_TW" ; res = i18nHelper.getMessageWithLocale(i18nType, "index.page.title" , "《" , "》" ) System.out.println("\n ======== res " +res+" ===========\n" ); i18nType = "zh_CN" ; res = i18nHelper.getMessageWithLocale(i18nType, "index.page.title" , "《" , "》" ) System.out.println("\n ======== res " +res+" ===========\n" ); } catch (ExecutionException e) { e.printStackTrace(); } } }
测试结果
1 2 3 4 ======== res 《よく学び、日々進歩》 =========== ======== res 《Study hard, make progress every day》 =========== ======== res 《好好學習,天天向上》 =========== ======== res 《好好学习,天天向上》 ===========