• Spring Boot 国际化及点击链接跳转国家语言


    一、国际化

      在SpringBoot中已经自动帮我们配置管理国际化资源的组件,所以我们只需要编写代码就可。

      

    @Bean
        @ConfigurationProperties(prefix = "spring.messages")
        public MessageSourceProperties messageSourceProperties() {
            return new MessageSourceProperties();
        }
    
        @Bean
        public MessageSource messageSource(MessageSourceProperties properties) {
            ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
            if (StringUtils.hasText(properties.getBasename())) {
                messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(
                        StringUtils.trimAllWhitespace(properties.getBasename())));  //获取基础名(login_zh_CN中的login部分)
            }
            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;
        }

      1.编写代码。

        在类路径下创建一个i18n的文件夹,存放国际化配置(login.properties、login_zh_CN.properties、login_en_US.properties)分别填写对应的值即可。

        2.在页面中获取国际化信息

        在thymeleaf中获取值信息。通过#{键}获取国际化中的值。

       3.在application.properties中配置如下代码。

    #指定i18n从哪里配置
    spring.messages.basename=i18n.login  //位置

      

      效果:会根据浏览器系统语言自动显示对应文字

    二、点击超链接切换国家语言

      原理:

        @Bean
            @ConditionalOnMissingBean   //前提是容器中不存在这个组件,
                    所以使用自己的对象就要配置@Bean让这个条件不成立(实现
    LocaleResolver 即可


          @ConditionalOnProperty(prefix
    = "spring.mvc", name = "locale") public LocaleResolver localeResolver()
          //如果在application.properties中有配置国际化就用配置文件的,没有配置就用AcceptHeaderLocaleResolver 默认request中获取
        {
                if (this.mvcProperties
                        .getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
                    return new FixedLocaleResolver(this.mvcProperties.getLocale());
                }
                AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
                localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
                return localeResolver;
            }
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
    Locale defaultLocale = getDefaultLocale();  
    if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
    return defaultLocale;
    }
    Locale requestLocale = request.getLocale();  //通过request对象获取请求头的国际化信息
    List<Locale> supportedLocales = getSupportedLocales();
    if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) {
    return requestLocale;
    }
    Locale supportedLocale = findSupportedLocale(request, supportedLocales);
    if (supportedLocale != null) {
    return supportedLocale;
    }
    return (defaultLocale != null ? defaultLocale : requestLocale);
    }
     

      1.实现点击链接切换国家语言(链接上加入区域信息“language='zh_CN'))

          通过原理知道可以通过request请求头中获取区域信息,所有我们在链接上加入区域信息“language='zh_CN')”,然后通过实现LocaleResolver重resolveLocale即可,并且将自己的实现类放在容器中,容器会自动加载这个组件。

      2.编写代码

    public class MyLocaleResolver implements LocaleResolver {
        @Override
        public Locale resolveLocale(HttpServletRequest request) {
    
            String language = request.getParameter("language");
            //获取系统的语言
            Locale locale = Locale.getDefault();
            if (!StringUtils.isEmpty(language)){
                //有值
                String[] s = language.split("_");
                locale=new Locale(s[0],s[1]);
    
            }
            return locale;
        }

    效果:

    作者:独而不孤

    -------------------------------------------

    个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

    万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!

    喂一下的我仓鼠谢谢
  • 相关阅读:
    [Oracle]跨越 DBLINK 访问表时,数据缓存在何处的Data Buffer 中?
    [Oracle]查看数据是否被移入 DataBuffer 的方法
    [Oracle]如何为数据库设置Event(eg: ORA-00235)
    [Oracle][Corruption]究竟哪些检查影响到 V$DATABASE_BLOCK_CORRUPTION
    [Oracle]OpenVMS 运行 Oracle 时的推荐值
    [Oracle]System 表空间的文件丢失
    [Oracle]如果误删了某个数据文件,又没有被备份,能否恢复?
    OFS环境,删除Resource 时出现错误失败,应该如何继续
    基于酷Q的工作秘书机器人
    C++编写简单的俄罗斯方块游戏
  • 原文地址:https://www.cnblogs.com/lcaiqin/p/10422072.html
Copyright © 2020-2023  润新知