• SpringBoot 切换国际化


    git:https://github.com/xiaozhuanfeng/demoProj

    代码结构:

    application.properties:
    spring.messages.basename=i18n/sprMesgs

    说明:默认情况下,国际化资源文件的基础名为messages,且存放在classpath根路径下,即messages.properties、messages_zh_CN.properties、messages_en_US.properties等等,这样就无需在配置文件中设置spring.messages.basename=...了,但是如果基础名不为messages或者不在classpath根路径下,则需要手动添加spring.messages.basename=文件名.自定义的基础名,如果有多个就用逗号分隔。例如:spring.messages.basename=i18n/sprMesgs。

    本例就是不用messages.XXX开头,上述具体可参照源码文件:MessageSourceAutoConfiguration.class。

    Spring 采用的默认区域解析器是AcceptHeaderLocaleResolver。它通过检验HTTP请求的头部信息accept-language来解析区域。这个头部是由用户的wb浏览器底层根据底层操作系统的区域设置进行设定的。请注意,这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置。

    代码获取国际化信息:
    org.springframework.context.MessageSource
    方法:messageSource.getMessage("welcome"null,locale);
    获取locale两种方法:
    Locale locale = LocaleContextHolder.getLocale();//建议
    Locale locale1= RequestContextUtils.getLocale(request);
    例如:
     //代码中获取国际化信息
            Locale locale = LocaleContextHolder.getLocale();
            String msg = messageSource.getMessage("welcome.backhome", null,locale);
            System.out.println("获取国际化信息"+msg);
    下面看切换国际化:
    在Spring MVC应用程序中,用户的区域是通过区域解析器来识别的,它必须是实现LocaleResolver接口。Spring MVC提供了几个LocaleResolver实现,让你可以按照不同的条件来解析区域。Spring采用的默认区域解析器是AcceptHeaderLocaleResolver。它通过检验HTTP请求的accept-language头部来解析区域。这个头部是由用户的web浏览器根据底层操作系统的区域设置进行设定。请注意,这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置。这里采用SessionLocaleResolver实现页面切换国际化。
     
    新增一个加载类:
    package com.example.demo.config;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.LocaleResolver;
    import org.springframework.web.servlet.i18n.SessionLocaleResolver;
    
    import java.util.Locale;
    
    @Configuration
    public class MvcConfig {
        private final Logger log = LoggerFactory.getLogger(getClass());
        @Bean
        public LocaleResolver localeResolver() {
            log.info("SessionLocaleResolver is start....  ");
            //会话区域解析器也就是说,你设置完只针对当前的会话有效,session失效,还原为默认状态
            SessionLocaleResolver srl = new SessionLocaleResolver();
            //设置默认区域
            srl.setDefaultLocale(Locale.CHINA);
            return srl;
        }
    }

    html页面:

    <div>
                <span>3、文字国际化表达式</span><br/>
                <form action="/changeLanguage2" method="get">
                   <!-- <span th:text="'语言 '+${lang}"></span><br/>-->
    
                    <select name="lang">
                        <option value=""></option>
                        <option  th:selected="${lang=='zh'}" value="zh">中文</option>
                        <option  th:selected="${lang=='en'}" value="en">English</option>
                    </select>
    
                    <button>切换语言</button>
                </form>
    
                <br/>
                <span th:text="#{welcome.backhome}"></span><br/>
     </div>

    Controller:

    package com.example.demo.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.LocaleResolver;
    import org.springframework.web.servlet.i18n.SessionLocaleResolver;
    import org.springframework.web.servlet.support.RequestContextUtils;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.Locale;
    @Controller
    public class I18nController {
    
        @RequestMapping(value = "changeLanguage1")
        public String changeLan1(HttpServletRequest req, String lang) {
    
            if ("en".equals(lang)) {
                req.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, Locale.US);
            } else {
                req.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, Locale.CHINA);
            }
            return "redirect:/demo/example1";
        }
    
        @RequestMapping(value = "changeLanguage2")
        public String changeLan2(HttpServletRequest req, String lang) {
            LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(req);
            if ("en".equals(lang)) {
                localeResolver.setLocale(req, null, Locale.US);
            } else {
                localeResolver.setLocale(req, null, Locale.CHINA);
            }
            return "redirect:/demo/example1";
        }
    }

    跳转页面Controller:

    package com.example.demo.controller;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.i18n.LocaleContextHolder;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.Locale;
    import java.util.Map;
    
    @Controller
    @RequestMapping(value = "/demo")
    public class DemoController {
        private final Logger log = LoggerFactory.getLogger(getClass());
    
        @RequestMapping("/example1")
        private String example1(HttpServletRequest request, Map<String, Object> map) {
    
            //.....省略
            //1、代码中获取国际化信息
            Locale locale = LocaleContextHolder.getLocale();
            //2、从Session中获取语言环境
            //locale = (Locale)req.getSession().getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);
            //System.out.println("当前语言环境:"+locale.getLanguage());
            map.put("lang",locale.getLanguage());
    
            return "web_demo1";
        }
    }

    测试:

  • 相关阅读:
    八字案例董易奇
    nginx和tomcat二合一服务器配置SSL证书
    RecyclerView,内容不居中的解决办法。
    cxf接口生成WSDL带密码的code实践
    去除server.key的密码
    Window下openssl的安装教程(通俗易懂)
    Nginx配置https证书
    自己做CA
    自己生成ssl证书
    自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书
  • 原文地址:https://www.cnblogs.com/xiaozhuanfeng/p/11111274.html
Copyright © 2020-2023  润新知