2022年3月4日 星期五

spring boot 後端 i18n

Spring boot 其實有自動配置好

因此只需要注入MessageSource就可以使用了



而~i18n檔案的目錄

可以從application.properties檔案中做控制

例如:

spring.messages.basename=static/i18n/report

這個是從resource下面開始的路徑








後面~我們檔案名稱就為report

多國檔就會為report_xxx


@Autowired
    private MessageSource messageSource;
    
    @Test 
    void test() {
    	String s1 = messageSource.getMessage(
            "demo.message", 
            null, 
            Locale.ENGLISH);
    	System.out.println(s1);

       	String s2 = messageSource.getMessage(
                "demo.message", 
                null, 
                Locale.TAIWAN);
        System.out.println(s2);
  
    }

在多國文字檔案的部分如下










run的結果如下





另外~我們可以發現, 他原生的用法, 參數多又麻煩
所以, 我另外寫了一個helper把它簡化
只要一開始設定完語言, 使用的時候就只要getMessage一個參數就搞定
寫好的內容如下, 裡面還有一個邏輯是圖片的邏輯
比方說中文版, 我們就原圖, 英文版我們使用英文版的圖, 圖檔名結尾為_en
這樣, 方便我們getImage取得相對應的路徑
程式碼如下




@Service
public class ReportHelper {
	
	   @Autowired
	   private MessageSource messageSource;
	   
	   private Locale locale;
	   
	   public String getMessage(String name) {   	
	    	return messageSource.getMessage(name, null, locale);
	    }

		public Locale getLocale() {
			return locale;
		}

		public void setLocale(Locale locale) {
			this.locale = locale;
		}   
		
		public String getImagePath(String path) {
			String suffix="";
			if(locale.equals(Locale.TAIWAN)) {
	        	suffix="";
	        } else {
	        	suffix="_en";
	        }
			return path + suffix;
		}

}

使用如下


    @Autowired 
    private ReportHelper reportMessage;
    
    @Test
    void utilTest() {
    	reportMessage.setLocale(Locale.TAIWAN);
    	String s2 = reportMessage.getMessage("demo.message");
    	System.out.println(s2);
    }

最後~如果有超過一種以上的多國檔要注入只要在application.properties檔案用逗號隔開就好

ex


# i18n
spring.messages.basename=static/i18n/report, static/i18n/message

沒有留言:

張貼留言

創業想法1

現在有駐點工作的公司 今天突然想到 那為什麼沒有遠端駐點公司 就是接國外的職位 幫他找台灣人 在公司上遠端工作的職缺 有可能是因為時差 所以這種公司上班時間不同, 並不好管理 但是感覺理論上是存在需求 就是台灣人想找遠端職缺, 但是可能語言上或技能上還差點火候 公司提供培訓, 並...