Spring Boot國際化

以後會上傳自己寫的完整spring boot 基礎,敬請期待!

步驟:

1.編寫國際化配置文件:

在resource文件夾下建立一個:i18n的文件夾:

新建立一個login.properties,的文件,然後再建立一個login_zh_CN.properties的文件,

注意命名:login_語言_國家.properties。

這樣建立之後idea會自動識別出來這是一個國際化的文件夾。

之後,再右鍵,點擊new之後,只要輸入語言代碼_國家代碼,就可以自動創建了。

創建成功後,點擊任意一個語言文件,可以看到,下面有一個Resource Bundle選項,

點擊:

點擊左上角的加號就可以了(輸入見圖)。

spring Boot默認配置了國際化文件的位置:

String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");

我們可以在配置文件application.properties中更改它:

spring.message.basename=i18n.login

這樣,就改好了國際化文件的位置了。

下面,要如何在界面中獲取呢?

可以在界面中用#{}來獲得國際化的內容!

<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">Please sign in</h1>
<label class="sr-only" th:text="#{login.username}">Username</label>

<input type="text" class="form-control" placeholder="Username" th:placeholder="#{login.username}" required="" autofocus="">

<label class="sr-only" th:text="#{login.username}" >Password</label>

<input type="password" class="form-control" placeholder="Password" th:placeholder="#{login.password}" required="">

<div class="checkbox mb-3">

   <label>

       <input type="checkbox" value="remember-me"/> [[#{login.remember}]]

注意,在checkbox裏,不可以寫th:text=,因爲,它是一個閉合和HTML標籤。也沒有什麼placeholder可以用。所以,可以用thymeleaf提供的行內字符來寫。用[[ ]],前面也有說到,這個其實也相當於th:text。注意:寫[[]]這個的時候,寫裏面的內容是沒有提示的。

這樣,整個界面的語言就跟誰瀏覽器的語言來定了。

打開瀏覽器,把相應的語言移到頂部,這樣再重新刷新界面,就可以看到語言隨之更改了。

注意:這裏可能會亂碼,我們前面也有說過,可以通過更改idea中文件的編碼方式:

打開setting,輸入file coding,勾選相關的選項就可以了。

原理:

現在,我們要實現,點擊下面的語言按鈕,來切換語言,做法:

實現自己的配置類:

public class MyLocaleResovler implements LocaleResolver {

    @Override

    public Locale resolveLocale(HttpServletRequest request) {

        String l = request.getParameter("l");

        Locale locale=Locale.getDefault();

        if(!StringUtils.isEmpty(l))

        {

            String[] s = l.split("_");

            locale=new Locale(s[0],s[1]);

        }

        return locale;

    }



    @Override

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



    }

}

 

自己寫一個LocaleResolver來繼承LocaleResolver

原碼裏面的:

,在配置類裏面注入進來:

@Bean

public LocaleResolver localeResolver(){

    return new MyLocaleResovler();

}

界面上,用這個:

<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>

@{/index.html(l='zh_CN')}等價於@{/index.html?l=’zh_CN’},thymeleaf中可以中小括號來代替?的方法來傳遞參數。

這樣,在訪問的時候,就可以通過點擊按鈕來切換了。

ps:對於自己寫配置,其實也是參考着原來的webMvcAutoConfiguration配置類來寫,

下面是原碼的截圖:

可以看到,在原碼裏面有public LocaleResolver localeResolver() 方法,我們就寫這個方法,

這個方法要返回LocaleResolver類的對象,那我們就寫一個。

而原碼裏面的是這樣寫的:

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對象,那我們也返回一個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章