在有些系统中,好比网站,每每须要支持多国语言,英文版中文版什么的,这个其实也不难;前端
今天咱们就来介绍spring boot中用i18n在后端支持多语言;java
固然,也能够直接在前端用i18n直接支持多语言,这个咱们之后在前端系列中再介绍;spring
简单6步,轻松实现:数据库
1-一、增长多语言文件后端
在resources中,新增static/i18n文件夹,在里面新建新建三个文件:微信
messages.properties(默认的多语言文件)app
messages_zh_CN.properties(中文语言文件)编辑器
messages_en_US.properties(英文语言文件)ide
如图:工具
在里面添加上相同键的不一样语言翻译值;如zh_CN中:
user.appname=中文语言
1-二、IDEA中设置文件的编码为utf-8(重要,必定要设置)
在中文环境中,IDE通常默认配置文件为GBK编码,会致使中文变成乱码,因此须要在IDEA中设置一下
设置--编辑器--文本编码,几处都改为utf-8;如图:
1-三、配置文件增长配置
#I18n语言国际化配置 spring: messages: encoding: utf-8 basename: static/i18n/messages
1-四、增长个配置类,主要是对语言参数进行拦截和设置语言环境
import java.util.Locale; /** * 描述: 二、配置国际化语言 * 版权: Copyright (c) 2020 * 公司: XXX * 做者: yanghj * 版本: 4.0 * 建立日期: 2020/9/18 10:25 */ @Configuration public class LocalConfig { /** * 默认解析器 其中locale表示默认语言 */ @Bean public LocaleResolver localeResolver() { SessionLocaleResolver localeResolver = new SessionLocaleResolver(); localeResolver.setDefaultLocale(Locale.CHINA); return localeResolver; } /** * 默认拦截器 其中lang表示切换语言的参数名 */ @Bean public WebMvcConfigurer localeInterceptor() { return new WebMvcConfigurer() { @Override public void addInterceptors(InterceptorRegistry registry) { LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor(); localeInterceptor.setParamName("lang"); //拦截lang参数 registry.addInterceptor(localeInterceptor); } }; } }
1-五、写个工具类,主要是为了方便获取相应语言环境中的键值
/** * 描述: 三、国际化工具类 * 版权: Copyright (c) 2020 * 公司: XXXX * 做者: yanghj * 版本: 4.0 * 建立日期: 2020/9/18 10:31 */ @Component public class LocalUtil { private static MessageSource messageSource; public LocalUtil(MessageSource messageSource) { LocalUtil.messageSource = messageSource; } /** * 获取单个国际化翻译值 */ public static String get(String msgKey) { try { return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale()); } catch (Exception e) { return msgKey; } } }
1-六、使用,在须要的地方,直接调用工具类传入键值便可
注意:在接口,若是不传lang参数,会获取1-4设置的默认解析器的语言,若是传入了lang,就按lang参数传入的语言来;
@GetMapping("/getmsg") @ApiOperation(value = "i18n测试", notes = "获取相应语言下的值") public String language() { String message =LocalUtil.get("user.appname"); //调用 return message; }
运行结果:
后端实现多语言仍是很轻松的;
可是也有局限性,对于UI上的显示,咱们能够在语言文件中配,可是对于不少系统,不少数据是存数据库的,要彻底实现多语言,还须要数据库也设计相应的多语言表来分别存储不一样语言环境的数据,这个操做起来是比较麻烦的,事实上不少时候也没有必要;
中国是个局域网,加上东西方是不可能融合的,文化不一样,只会冲突不会融合;因此中国人爱用的系统老外是基本不用的,像微信,在国外也只有国外的华人会用用,老外是不用的,老外爱用的像Facebook什么的,咱们也用不了,因此,多语言更多时候是个伪命题,没实际意义的;
关于应用场景的一些建议:
网站类,确实涉及到国外业务的,好比外贸类网站,这类能够添加多语言版本;
APP等系统类的,就没有必要搞多语言了;实际上,即便国际化运营的系统,也都是外国单独部署单独运营的(国外是很注重隐私的,是绝对不容许国外的数据被中国获取和存储的),不会共用同一系统同一版本分支的,因此多语言也是不适用的;
总之一句话,中国优先!多语言,如非确实十分必要,不要使用,不要给本身挖坑,仍是个毫无实际意义的坑;