一篇文章带你了解国际化,以及springboot当中如何实现国际化

国际化一般在中大型公司领域会用得到,有时候会面对一些外国客户等,这时候就需要做一些多语言功能,来提升项目的可读性,本文带你了解什么是国际化以及他的用法。




理解国际化概念

应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产。开发这样的程序的过程,就称为国际化。

粗俗的理解就是项目实现多种语言,我们想要哪种语言,他就可以切换到哪种语言。

对于没有在项目当中使用过多种语言的,可能以为这不就是用个翻译软件就可以了,不是这样的。你那已经脱离了项目功能,依赖上了别的软件,这并不是我们想要的,我们要的国际化是要在自己的项目实现国际化。

项目当中实现国际化就是在页面写两种语言,然后通过语言参数来进行确定哪种语言,然后展示给用户,这就是国际化。

简单了解国际化原理

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强。万一有一天正好用到了呢。




猜你喜欢

转载自blog.csdn.net/weixin_43888891/article/details/111602764