页面国际化
有些情况下,我们的网站会遇到中英文切换的问题,这里我们就需要用到国际化
准备工作
在ider中设置一下文件的编码格式:UTF-8
编写国际化配置文件,抽取页面需要显示的国际化页面消息。我们可以去登录页面查看一下,哪些内容我们需要编写国际化的配置!
配置文件的编写
-
在resources资源目录下新建一个 i18n 的目录
-
在目录中创建login.properties文件,还有一个login_zh_CN.properties,这时候ider会自动弹出插件,直接安装进行了,然后我们的文件就会有变化了。
-
在资源包目录下在新建一个login_en_US.properties的文件
然后我们点击加号
这样就比较方便了
-
我们的文件创建完成后我们在来创建配置,我们可以看见ider下有一个视图
我们只需要点进去然后我们就可以看到以下这个页面了
我们只需要点击这里的加就可以创建配置了,只需要将首页的增加进去进行了。
如何我们依次配置进行了
然后我们在来看看配置文件
login.properties :默认
login.username=用户名 login.btn=登入 login.password=密码 login.remember=记住我 login.tip=请登入
英文配置:
login.username=username login.btn=Sing in login.password=password login.remember=Remember me login.tip=Please sign in
中文配置:
login.username=用户名 login.btn=登入 login.password=密码 login.remember=记住我 login.tip=请登入
配置文件是否生效
我们去看一下SpringBoot对国际化的自动配置!这里又涉及到一个类:MessageSourceAutoConfiguration
里面有一个方法,这里发现SpringBoot已经自动配置好了管理我们国际化资源文件的组件 ResourceBundleMessageSource;
// 获取 properties 传递过来的值进行判断
@Bean
public MessageSource messageSource(MessageSourceProperties properties) {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
if (StringUtils.hasText(properties.getBasename())) {
// 设置国际化文件的基础名(去掉语言国家代码的)
messageSource.setBasenames(
StringUtils.commaDelimitedListToStringArray(
StringUtils.trimAllWhitespace(properties.getBasename())));
}
if (properties.getEncoding() != null) {
messageSource.setDefaultEncoding(properties.getEncoding().name());
}
messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
Duration cacheDuration = properties.getCacheDuration();
if (cacheDuration != null) {
messageSource.setCacheMillis(cacheDuration.toMillis());
}
messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
return messageSource;
}
我们配置的文件是放在了i18n目录下,所以我们要在配置文件中配置这个messages路径;
#我们配置文件的真实位置
spring.messages.basename=i18n.login
配置页面的国际化值
去页面获取国际化的值,查看Thymeleaf的文档,找到message取值操作为:#{…}。我们去页面测试下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ToqP9WO4-1685448022922)(C:\Users\A’n’le\AppData\Roaming\Typora\typora-user-images\image-20230530194908746.png)]
我们启动看看,就是中文了
![image-20230530194943973](https://s2.loli.net/2023/05/30/7zLN6AojvVHOq5y.png)
但是我们要根据下面的按钮切换中英文的状态
配置国际化代码解析
在spring中有一个国际化Locale (区域信息对象);里面有一个叫做LocaleResolver (获取区域信息对象)的解析器!
我们去我们webmvc自动配置文件,寻找一下!看到SpringBoot默认配置:
@Bean
@ConditionalOnMissingBean(
name = {"localeResolver"}
)
public LocaleResolver localeResolver() {
//判断容器中是否有配置,如果没有就使用默认的,用户配置了就用用户的
if (this.webProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.WebProperties.LocaleResolver.FIXED) {
return new FixedLocaleResolver(this.webProperties.getLocale());
}
//接收头国际化分解
else {
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(this.webProperties.getLocale());
return localeResolver;
}
}
AcceptHeaderLocaleResolver 这个类中有一个方法
public Locale resolveLocale(HttpServletRequest request) {
Locale defaultLocale = this.getDefaultLocale();
if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
return defaultLocale;
} else {
Locale requestLocale = request.getLocale();
List<Locale> supportedLocales = this.getSupportedLocales();
if (!supportedLocales.isEmpty() && !supportedLocales.contains(requestLocale)) {
Locale supportedLocale = this.findSupportedLocale(request, supportedLocales);
if (supportedLocale != null) {
return supportedLocale;
} else {
return defaultLocale != null ? defaultLocale : requestLocale;
}
} else {
return requestLocale;
}
}
}
那假如我们现在想点击链接让我们的国际化资源生效,就需要让我们自己的Locale生效!
我们去自己写一个自己的LocaleResolver,可以在链接上携带区域信息!
修改一下前端页面的跳转连接:
<a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
我们去写一个处理的组件,模仿上面的AcceptHeaderLocaleResolver 来进行写。
package com.anle.config;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.LocaleResolver;
import org.thymeleaf.util.StringUtils;
import java.util.Locale;
/**
* @author: anle
* @date: 2023/05/30 18:47
**/
public class MyLocaleResolver implements LocaleResolver {
//解析请求
@Override
public Locale resolveLocale(HttpServletRequest request) {
//获取请求中的语言参数
String language = request.getParameter("l");
//如果没有就使用默认的
Locale locale = Locale.getDefault();
//判断请求的链接是否携带了国际化参数
if (!StringUtils.isEmpty(language)){
//zh_CN :从参数的中间进行分割形成键值对的形式
String[] split = language.split("_");
//键:国家 值:地区
locale = new Locale(split[0],split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
为了我们的配置信息能够生效,我们需要在配置以下这个组件,在我们
自己写的MvcConfig类中配置bean
//自定义国际化
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
重新启动我们的项目就完成了。
在我们
自己写的MvcConfig类中配置bean
//自定义国际化
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
重新启动我们的项目就完成了。
[外链图片转存中…(img-fBAsxTsi-1685448022922)]
[外链图片转存中…(img-Y8XXSzYo-1685448022923)]
注意看我们的url地址的变化。