小白的springboot之路(十八)、i18n多语言支持(后端篇)
0-前言
在有些系统中,比如网站,往往需要支持多国语言,英文版中文版什么的,这个其实也不难;
今天我们就来介绍spring boot中用i18n在后端支持多语言;
当然,也可以直接在前端用i18n直接支持多语言,这个我们以后在前端系列中再介绍;
1-实现
简单6步,轻松实现:
1-1、增加多语言文件
在resources中,新增static/i18n文件夹,在里面新建新建三个文件:
messages.properties(默认的多语言文件)
messages_zh_CN.properties(中文语言文件)
messages_en_US.properties(英文语言文件)
如图:

在里面添加上相同键的不同语言翻译值;如zh_CN中:
user.appname=中文语言
1-2、IDEA中设置文件的编码为utf-8(重要,一定要设置)
在中文环境中,IDE一般默认配置文件为GBK编码,会导致中文变成乱码,所以需要在IDEA中设置一下
设置--编辑器--文本编码,几处都改成utf-8;如图:

1-3、配置文件增加配置
#I18n语言国际化配置
spring:
messages:
encoding: utf-8
basename: static/i18n/messages
1-4、增加个配置类,主要是对语言参数进行拦截和设置语言环境
import java.util.Locale; /**
* 描述: 2、配置国际化语言
* 版权: 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-5、写个工具类,主要是为了方便获取相应语言环境中的键值
/**
* 描述: 3、国际化工具类
* 版权: 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-6、使用,在需要的地方,直接调用工具类传入键值即可
注意:在接口,如果不传lang参数,会获取1-4设置的默认解析器的语言,如果传入了lang,就按lang参数传入的语言来;
@GetMapping("/getmsg")
@ApiOperation(value = "i18n测试", notes = "获取相应语言下的值")
public String language() {
String message =LocalUtil.get("user.appname"); //调用
return message;
}
运行结果:



2-总结
后端实现多语言还是很轻松的;
但是也有局限性,对于UI上的显示,我们可以在语言文件中配,但是对于很多系统,很多数据是存数据库的,要完全实现多语言,还需要数据库也设计相应的多语言表来分别存储不同语言环境的数据,这个操作起来是比较麻烦的,事实上很多时候也没有必要;
中国是个局域网,加上东西方是不可能融合的,文化不同,只会冲突不会融合;所以中国人爱用的系统老外是基本不用的,像微信,在国外也只有国外的华人会用用,老外是不用的,老外爱用的像Facebook什么的,我们也用不了,所以,多语言更多时候是个伪命题,没实际意义的;
关于应用场景的一些建议:
网站类,确实涉及到国外业务的,比如外贸类网站,这类可以添加多语言版本;
APP等系统类的,就没有必要搞多语言了;实际上,即使国际化运营的系统,也都是外国单独部署单独运营的(国外是很注重隐私的,是绝对不允许国外的数据被中国获取和存储的),不会共用同一系统同一版本分支的,所以多语言也是不适用的;
总之一句话,中国优先!多语言,如非确实十分必要,不要使用,不要给自己挖坑,还是个毫无实际意义的坑;
小白的springboot之路(十八)、i18n多语言支持(后端篇)的更多相关文章
- 小白的springboot之路(八)、继承Redis以及@Cacheable注解实现Redis缓存
0.前言 在项目中,缓存作为一种高效的提升性能的手段,几乎必不可少,Redis作为其中的佼佼者被广泛应用: 一.spring boot集成Redis 1.添加依赖 <dependency> ...
- 小白的springboot之路(七)、事务支持
0-前言 事务管理对于企业级应用来说必不可少,用来确保数据的完整性和一致性: 1-开启事务 spring boot支持编程式事务和声明式事务,用声明式事务即可: spring boot开启事务非常简单 ...
- 小白的springboot之路(一)、环境搭建、第一个实例
小白的springboot之路(一).环境搭建.第一个实例 0- 前言 Spring boot + spring cloud + vue 的微服务架构技术栈,那简直是爽得不要不要的,怎么爽法,自行度娘 ...
- 小白的springboot之路(十九)、集成swagger(com.spring4all篇)
0-前言 集成swagger,有两种方式: 一种在前面已经介绍过了,直接集成官方的springfox-swagger2的方式,这种方式需要在配置类中配置 第二种方式是这里要介绍的方式,国人写的com. ...
- 小白的springboot之路(十)、全局异常处理
0.前言 任何系统,我们不会傻傻的在每一个地方进行异常捕获和处理,整个系统一般我们会在一个的地方统一进行异常处理,spring boot全局异常处理很简单: 介绍前先说点题外话,我们现在开发系统,都是 ...
- 小白的springboot之路(十四)、AOP
0.前言 1.什么是AOP AOP(面向切面编程),是一种横切技术,是对OOP的补充和完善: 使用AOP的横切,可以对系统进行无侵入性的日志监听.事务.权限管理等: 思想上跟拦截器其实类似;拦截器是对 ...
- 小白的springboot之路(十二)、集成log4j2日志
0.前言 日志记录对系统来说必不可少,spring boot中常用的日志组件有log4j.logback.log4j2,其中logback是spring boot默认的,已自带:选用log4j2就可以 ...
- 小白的springboot之路(十五)、mybatis的PageHelper分页插件使用
0.前言 用mybatis,那么分页必不可少,基本都是用PageHelper这个分页插件,好用方便: 1.实现 1.1.添加依赖: <!-- 3.集成 mybatis pagehelper--& ...
- 小白的springboot之路(十六)、mybatis-plus 的使用
0-前言 mybatis plus是对mybatis的增强,集成mybatis plus后,简单的CRUD和分页就不用写了,非常方便,五星推荐: 1-集成 1-1.添加依赖 <!-- .集成my ...
随机推荐
- C#分布式登录——jwt
一.传统的session登录 在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这 ...
- ES6中的变量的解构赋值, 解放我们的双手,实现变量的批量赋值
ES6--变量的解构赋值 引言 正文 一.数组的解构赋值 解构失败 不完全解构 默认值 二.对象的解构赋值 三.字符串的解构赋值 结束语 引言 变量的解构赋值, 听起来很复杂, 简单点说可以理解成批量 ...
- 什么?Java9这些史诗级更新你都不知道?Java9特性一文打尽!
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- 用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线
我最近出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中给出了MACD,KDJ ...
- JavaScript学习系列博客_10_JavaScript中的while语句
循环语句 - while循环 - 语法: while(条件表达式){ 语句... } - 执行流程: while语句在执行时,会先对条件表达式进行求值判断, 如果判断结果为false,则终止循环 如果 ...
- HM16.0 TAppEncoder
参考: https://www.cnblogs.com/tiansha/p/6458573.html https://blog.csdn.net/liangjiubujiu/article/deta ...
- 20分钟理清Maven构建中的测试相关工具的关系
如果你用Maven进行系统构建,同时还要同步编写测试用例,获取用例成功与否以及用例覆盖率的相关报告,那么这些工具你肯定接触过不少: JUnit TestNG maven-surefire-plugin ...
- django学习(一)
1.django版本的选择问题 在学习django之前,我们先做一个基本问题的讨论,这个问题是关于django版本的问题.我们进入官网,可以查看django版本的情况. 关于django的版本的问题, ...
- 软件工程第二次作业(Junit和GoogleTest)
使用Eclipse的Junit框架进行单元测试 一.前言 我的电脑因为以前学过安卓开发,已经安装好了eclipse,看了邹欣老师的博客,博客上讲的的非常详细,所以在进行的过程中遇到困难,基本都能解决. ...
- idea中展开折叠的文件夹
1. 按键盘中的向右箭头 选中要展开的目录,按下键盘的向右箭头,这时候会展开一层当前目录.如果要展开所有,一直按住向右箭头不放. 左箭头则是折叠 2. 按数字键盘中的 * 选中要展开的目录,按下数字键 ...