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";
    }
}

 

測試:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM