springboot中的页面国际化

页面国际化

有些情况下,我们的网站会遇到中英文切换的问题,这里我们就需要用到国际化

准备工作

在ider中设置一下文件的编码格式:UTF-8

image-20230530192537402

编写国际化配置文件,抽取页面需要显示的国际化页面消息。我们可以去登录页面查看一下,哪些内容我们需要编写国际化的配置!

配置文件的编写

  1. 在resources资源目录下新建一个 i18n 的目录

  2. 在目录中创建login.properties文件,还有一个login_zh_CN.properties,这时候ider会自动弹出插件,直接安装进行了,然后我们的文件就会有变化了。

    image-20230530192911800

  3. 在资源包目录下在新建一个login_en_US.properties的文件

    image-20230530193145298

​ 然后我们点击加号

image-20230530193305696

​ 这样就比较方便了

  1. 我们的文件创建完成后我们在来创建配置,我们可以看见ider下有一个视图

    image-20230530193551943

    我们只需要点进去然后我们就可以看到以下这个页面了

    image-20230530193803128

    我们只需要点击这里的加就可以创建配置了,只需要将首页的增加进去进行了。

    image-20230530194107519

    如何我们依次配置进行了

    image-20230530194149614

    然后我们在来看看配置文件

    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

但是我们要根据下面的按钮切换中英文的状态

配置国际化代码解析

在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();
}

重新启动我们的项目就完成了。

image-20230530195841702

image-20230530195912091

在我们

自己写的MvcConfig类中配置bean

//自定义国际化
@Bean
public LocaleResolver localeResolver(){
    return new MyLocaleResolver();
}

重新启动我们的项目就完成了。

[外链图片转存中…(img-fBAsxTsi-1685448022922)]

[外链图片转存中…(img-Y8XXSzYo-1685448022923)]

注意看我们的url地址的变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值