小白的springboot之路(十八)、i18n多語言支援(後端篇)

大叔楊發表於2020-09-18

0-前言

  在有些系統中,比如網站,往往需要支援多國語言,英文版中文版什麼的,這個其實也不難;

  今天我們就來介紹spring boot中用i18n在後端支援多語言;

  當然,也可以直接在前端用i18n直接支援多語言,這個我們以後在前端系列中再介紹;

1-實現

  簡單6步,輕鬆實現:

1-1、增加多語言檔案

  在resources中,新增static/i18n資料夾,在裡面新建新建三個檔案:

    messages.properties(預設的多語言檔案)

    messages_zh_CN.properties(中文語言檔案)

    messages_en_US.properties(英文語言檔案)

如圖:

 

 

 在裡面新增上相同鍵的不同語言翻譯值;如zh_CN中:

user.appname=中文語言

 

1-2、IDEA中設定檔案的編碼為utf-8(重要,一定要設定)

  在中文環境中,IDE一般預設配置檔案為GBK編碼,會導致中文變成亂碼,所以需要在IDEA中設定一下

  設定--編輯器--文字編碼,幾處都改成utf-8;如圖:

 

 

1-3、配置檔案增加配置

#I18n語言國際化配置
spring:
  messages:
    encoding: utf-8
    basename: static/i18n/messages

 

1-4、增加個配置類,主要是對語言引數進行攔截和設定語言環境

import java.util.Locale;

/**
 * 描述: 2、配置國際化語言
 * 版權: Copyright (c) 2020
 * 公司: XXX
 * 作者: yanghj
 * 版本: 4.0
 * 建立日期: 2020/9/18 10:25
 */
@Configuration
public class LocalConfig {

    /**
     * 預設解析器 其中locale表示預設語言
     */
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.CHINA);
        return localeResolver;
    }

    /**
     * 預設攔截器 其中lang表示切換語言的引數名
     */
    @Bean
    public WebMvcConfigurer localeInterceptor() {
        return new WebMvcConfigurer() {
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
                localeInterceptor.setParamName("lang");  //攔截lang引數
                registry.addInterceptor(localeInterceptor);
            }
        };
    }

}

 

1-5、寫個工具類,主要是為了方便獲取相應語言環境中的鍵值

/**
 * 描述: 3、國際化工具類
 * 版權: Copyright (c) 2020
 * 公司: XXXX
 * 作者: yanghj
 * 版本: 4.0
 * 建立日期: 2020/9/18 10:31
 */

@Component
public class LocalUtil
{

    private static MessageSource messageSource;

    public LocalUtil(MessageSource messageSource)
    {
        LocalUtil.messageSource = messageSource;
    }

    /**
     * 獲取單個國際化翻譯值
     */
    public static String get(String msgKey)
    {
        try
        {
            return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale());
        }
        catch (Exception e)
        {
            return msgKey;
        }
    }
}

 

1-6、使用,在需要的地方,直接呼叫工具類傳入鍵值即可

注意:在介面,如果不傳lang引數,會獲取1-4設定的預設解析器的語言,如果傳入了lang,就按lang引數傳入的語言來;

   @GetMapping("/getmsg")
    @ApiOperation(value = "i18n測試", notes = "獲取相應語言下的值")
    public String language() {

        String message =LocalUtil.get("user.appname");  //呼叫
        return message;
    }

執行結果:

 

 

 

 

 

 

2-總結

  後端實現多語言還是很輕鬆的;

  但是也有侷限性,對於UI上的顯示,我們可以在語言檔案中配,但是對於很多系統,很多資料是存資料庫的,要完全實現多語言,還需要資料庫也設計相應的多語言表來分別儲存不同語言環境的資料,這個操作起來是比較麻煩的,事實上很多時候也沒有必要;

  中國是個區域網,加上東西方是不可能融合的,文化不同,只會衝突不會融合;所以中國人愛用的系統老外是基本不用的,像微信,在國外也只有國外的華人會用用,老外是不用的,老外愛用的像Facebook什麼的,我們也用不了,所以,多語言更多時候是個偽命題,沒實際意義的;

 

  關於應用場景的一些建議:

  網站類,確實涉及到國外業務的,比如外貿類網站,這類可以新增多語言版本;

  APP等系統類的,就沒有必要搞多語言了;實際上,即使國際化運營的系統,也都是外國單獨部署單獨運營的(國外是很注重隱私的,是絕對不允許國外的資料被中國獲取和儲存的),不會共用同一系統同一版本分支的,所以多語言也是不適用的;

  總之一句話,中國優先!多語言,如非確實十分必要,不要使用,不要給自己挖坑,還是個毫無實際意義的坑;

  

  

相關文章