国际化一般在中大型公司领域会用得到,有时候会面对一些外国客户等,这时候就需要做一些多语言功能,来提升项目的可读性,本文带你了解什么是国际化以及他的用法。
理解国际化概念
应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产。开发这样的程序的过程,就称为国际化。
粗俗的理解就是项目实现多种语言,我们想要哪种语言,他就可以切换到哪种语言。
对于没有在项目当中使用过多种语言的,可能以为这不就是用个翻译软件就可以了,不是这样的。你那已经脱离了项目功能,依赖上了别的软件,这并不是我们想要的,我们要的国际化是要在自己的项目实现国际化。
项目当中实现国际化就是在页面写两种语言,然后通过语言参数来进行确定哪种语言,然后展示给用户,这就是国际化。
简单了解国际化原理
SpringBoot自动配置好了管理国际化资源文件的组件
从这里我们可以看出,我们要是使用国际化他默认会去messages文件夹下找资源,但是这个值只是他的默认值,我们想要让他从别的文件夹获取,直接通过application文件全局修改默认值即可。
国际化Locale(区域信息对象);LocaleResolver(获取区域信息对象);
区域信息解析器,他默认取的是浏览器请求头的
我们简单来串一下:
首先是根据springmvc的配置当中的获取区域信息,获取到区域信息之后,就开始去访问国际化资源,根据区域信息来确定访问哪个文件,最终来完成多语言。
国际化demo练习
springboot相当于已经都为我们配置好了,我们只需要在项目当中创建多语言文件即可。由于他默认取的是浏览器的,我们还可以自己定义拦截器,来进行页面上的语言切换。
1、引入依赖
这个demo当中使用到了thymeleaf取值,所以引入了thymeleaf
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
2、创建多语言文件
这里需要注意的是文件名称是有规则的。
我们创建3个文件,分别是无语言配置时候生效的index.properties;
中文生效的index_zh_CN.properties;
英文生效的index_en_US.properties;
也就是以下划线的组合:文件名_区域_语言.properties;
这里我给大家找了一个地区语言对照表,想要了解的可以简单了解一下。
国际化语言: https://www.cnblogs.com/crane13/p/10907486.html.
我用的是eclipse当时练习的时候properties文件乱码,最终百度了一下,下载了一个插件,这是我下载插件的地址,你们看看对你们有帮助没有。
链接: https://jingyan.baidu.com/article/380abd0a6abe731d90192ce4.html.
3、添加全局配置
4、添加区域信息拦截
通过传参的形式,来截取区域信息,并注入到容器,注入之后他就不会采用系统默认区域信息了,这样就可以通过传入的区域信息来进行寻找对应的语言文件。
package com.gzl.cn.config;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
/**
* 可以在连接上携带区域信息
*/
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
String l = request.getParameter("l");
Locale locale = Locale.getDefault();
if(!StringUtils.isEmpty(l)){
String[] split = l.split("_");
locale = new Locale(split[0],split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
这个MyMvcConfig配置类,主要配置了一个视图映射,这样当我们访问
http://localhost:8080/ 让他自动寻找tomplate文件夹下的 index页面。
package com.gzl.cn.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyMvcConfig implements WebMvcConfigurer{
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
}
//将区域信息注入到容器,不注入到容器他就还是取的系统默认区域信息
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
}
5、创建一个页面测试取值
[[#{index.remember}]] 这个是采用的thymeleaf当中的一个行内写法。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
[[#{index.remember}]]
<a href="/index.html?l=zh_CN">中文</a>
<a href="/index.html?l=en_US">English</a>
</body>
</html>
6、项目结构
public文件夹放的是图标。无视即可!
7、测试结果
当我点击English 切换英文,成功切换成功,这个时候注意上面传的参数,也就是框架内部会根据这个区域信息去寻找我们添加的对应文件。
简单总结
这个相对来说也不是很常用,但是有时候玩玩挺好玩的,毕竟自己在接触新的事务,总比整天crud强。万一有一天正好用到了呢。