一、概述
国际化就是用户可以选择对应的语言,页面展示成对应的语言;
一个系统的国际化按照信息的所在位置,可以分为三种国际化信息:
- 前端页面信息
- 后端提示信息
- 数据库的字典类信息
二、前端页面国际化
使用i18n库实现国际化
- i18n国际化库思路:
通过jquery或者dom操作拿到需要变化语种的id或者class,然后到配置文件里面识别key是谁,因为他的结构是map结构的,也就是value-key的结构,最后在html页面通过class或者id取到名字就行了;
相关技术可以看博客:https://blog.youkuaiyun.com/qq_41485414/article/details/81093999
也可以直接在网上搜索关键词:前端i18n国际化
三、后端提示信息国际化
依托于Spring的国际化技术实现
3.1 创建语言信息包
-
在项目的
resources
下创建文件夹i18n
-
在
i18n
文件夹下创建 messages语言信息包使用idea创建:
创建完成后,既可看到两类语言的配置文件:
配置内容可以按照需要增加 键值对,例如:
- messages_en_US.properties
return.ok=Success
return.fail=FAIL
- messages_zh_CN.properties
return.ok=操作成功
return.fail=操作失败
- 国际化i18n语言码表:
3.2 注入语言资源类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import java.util.Locale;
/**
* @author xch
* 2024/7/18 14:15
*/
@Configuration
public class LocaleConfig {
@Bean
public ResourceBundleMessageSource messageSource() {
//默认使用 中文
Locale.setDefault(Locale.CHINA);
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("i18n/messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setUseCodeAsDefaultMessage(true);
return messageSource;
}
}
- 原理是,Spring会创建一个
MessageSource
的bean;这个MessageSource
提供了对应的语言转换方法:
@Nullable
String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);
String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
code:我们在语言信息包中配置的key,如:return.ok
local:就是我们要转换的对应的语言
所以我们使用的时候只需调用上面的getMessage方法既可实现信息国际化;
3.3 请求头Accept-Language
示例
- 如果语言参数使用请求头
Accept-Language
传输,参数Locale可以直接使用Locale locale = LocaleContextHolder.getLocale();
获取;
public class MessageUtil {
/**
* 获取国际化信息
* @param code 信息key
* @return 国际化的信息
*/
public static String getMessage(String code) {
Locale locale = LocaleContextHolder.getLocale();
String message = code;
try{
MessageSource messageSource = SpringUtil.getBean(MessageSource.class);
message = messageSource.getMessage(code, null, locale);
} catch (NoSuchMessageException e){
return message;
}
return message;
}
}
@GetMapping("/test")
public Result<Void> test() {
return Result.ok(MessageUtil.getMessage("return.ok"));
}
3.4 自定义请求头Language
示例(不优雅)
为了方便使用上述的getMessage方法,可以封装成静态的方法,方便调用使用:
- 封装SpringUtil工具类
import org.springframework.beans.BeansException;
import org.springframework