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

0-前言

  在有些系統中,好比網站,每每須要支持多國語言,英文版中文版什麼的,這個其實也不難;前端

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

  固然,也能夠直接在前端用i18n直接支持多語言,這個咱們之後在前端系列中再介紹;spring

1-實現

  簡單6步,輕鬆實現:數據庫

1-一、增長多語言文件後端

  在resources中,新增static/i18n文件夾,在裏面新建新建三個文件:微信

    messages.properties(默認的多語言文件)app

    messages_zh_CN.properties(中文語言文件)編輯器

    messages_en_US.properties(英文語言文件)ide

如圖:工具

 

 

 在裏面添加上相同鍵的不一樣語言翻譯值;如zh_CN中:

user.appname=中文語言

 

1-二、IDEA中設置文件的編碼爲utf-8(重要,必定要設置)

  在中文環境中,IDE通常默認配置文件爲GBK編碼,會致使中文變成亂碼,因此須要在IDEA中設置一下

  設置--編輯器--文本編碼,幾處都改爲utf-8;如圖:

 

 

1-三、配置文件增長配置

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

 

1-四、增長個配置類,主要是對語言參數進行攔截和設置語言環境

import java.util.Locale;

/**
 * 描述: 二、配置國際化語言
 * 版權: 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-五、寫個工具類,主要是爲了方便獲取相應語言環境中的鍵值

/**
 * 描述: 三、國際化工具類
 * 版權: 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-六、使用,在須要的地方,直接調用工具類傳入鍵值便可

注意:在接口,若是不傳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等系統類的,就沒有必要搞多語言了;實際上,即便國際化運營的系統,也都是外國單獨部署單獨運營的(國外是很注重隱私的,是絕對不容許國外的數據被中國獲取和存儲的),不會共用同一系統同一版本分支的,因此多語言也是不適用的;

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

相關文章
相關標籤/搜索