SpringBoot-頁面國際化(五)

Code1667發表於2020-11-01

SpringBoot-頁面國際化(五)

參考微信公眾號:狂神說 頁面國際化

如果想實現頁面中英文切換,這時候就涉及到頁面國際化

一、準備工作

現在IDEA中設定編碼統一為UTF-8

img

編寫國際化配置檔案,抽取頁面需要顯示的國際化頁面訊息。我們可以去登入頁面檢視一下,哪些內容我們需要編寫國際化的配置

i18n配置檔案的編寫

1、 我們在resources資原始檔下新建一個i18n目錄,存放國際化配置檔案

2、 建立一個login.properties檔案,還有一個login_zh_CN.properties; 發現IDEA自動識別了我們要做國際化操作

img

3、 可以在這上面去新建一個檔案login_en_US.properties;

img

img

4、 接下來編寫配置,我們可以看到idea下面有另外一個檢視;

img

這個檢視我們點選+ 號就可以直接新增屬性了;我們新建一個login.tip,可以看到邊上有三個檔案框可以輸入

img

新增完所有屬性 檢視

login.properties :預設

login.btn=登入
login.password=密碼
login.remember=記住我
login.tip=請登入
login.username=使用者名稱

英文:

login.btn=Sign in
login.password=Password
login.remember=Remember me
login.tip=Please sign in
login.username=Username

中文:

login.btn=登入
login.password=密碼
login.remember=記住我
login.tip=請登入
login.username=使用者名稱

5、 配置這個messages的路徑;

spring.messages.basename=i18n.login

配置頁面

去頁面獲取國際化的值,檢視Thymeleaf的文件,找到message取值操作為:#{...}。我們去頁面測試下:

img

去啟動專案,訪問一下,發現已經自動識別為中文的了 !

二、中英文切換按鈕

在Spring中有一個國際化的Locale (區域資訊物件);裡面有一個叫做LocaleResolver (獲取區域資訊物件)的解析器!

我們去我們webmvc自動配置檔案,尋找一下!看到SpringBoot預設配置:

@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
public LocaleResolver localeResolver() {
    // 容器中沒有就自己配,有的話就用使用者配置的
    if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
        return new FixedLocaleResolver(this.mvcProperties.getLocale());
    }
    // 接收頭國際化分解
    AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
    localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
    return localeResolver;
}

AcceptHeaderLocaleResolver 這個類中有一個方法

public Locale resolveLocale(HttpServletRequest request) {
    Locale defaultLocale = this.getDefaultLocale();
    // 預設的就是根據請求頭帶來的區域資訊獲取Locale進行國際化
    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,可以在連結上攜帶區域資訊!

修改一下前端頁面的中英文切換連結:

<!-- 這裡傳入引數不需要使用 ?使用 (key=value)-->
<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>

自定義 LocaleResolver

//可以在連結上攜帶區域資訊
public class MyLocaleResolver implements LocaleResolver {

    //解析請求
    @Override
    public Locale resolveLocale(HttpServletRequest request) {

        String language = request.getParameter("l");
        Locale locale = Locale.getDefault(); // 如果沒有獲取到就使用系統預設的
        //如果請求連結不為空
        if (!StringUtils.isEmpty(language)){
            //分割請求引數
            String[] split = language.split("_");
            //國家,地區
            locale = new Locale(split[0],split[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {

    }
}

​ 為了讓我們的區域化資訊能夠生效,我們需要再配置一下這個元件!在我們自己的MvcConofig下新增bean;

@Bean
public LocaleResolver localeResolver(){
    return new MyLocaleResolver();
}

相關文章