Spring Cloud微服務下如何配置I8n

来源:https://www.cnblogs.com/lvlaotou/p/18302881
-Advertisement-
Play Games

什麼是I8n 國際化(I18n)指的是設計和開發產品的過程,使得它們能夠適應多種語言和文化環境,而不需要進行大量的代碼更改。這通常涉及到創建一個基礎版本的產品,然後通過配置和資源文件來添加對不同語言和地區的支持。 這樣,當產品需要在新的地理區域或語言環境中使用時,只需要添加或更新相應的資源文件,而不 ...


什麼是I8n

國際化(I18n)指的是設計和開發產品的過程,使得它們能夠適應多種語言和文化環境,而不需要進行大量的代碼更改。這通常涉及到創建一個基礎版本的產品,然後通過配置和資源文件來添加對不同語言和地區的支持。

這樣,當產品需要在新的地理區域或語言環境中使用時,只需要添加或更新相應的資源文件,而不需要修改產品本身的代碼。

"I18n" 是 "Internationalization" 的縮寫形式,之所以是 "I18n" 而不是 "Int" 或者其他縮寫,是因為 "Internationalization" 這個詞的第一個字母是 "I",最後一個字母是 "n",而在這兩個字母之間有 18 個字元。因此,"I18n" 成為了一個流行的縮寫方式,類似的還有 "K8s" 。

Spring Boot I18n

I8n體現在Java後端比較常見的就是錯誤提示,而SpringBoot本身就提供了對I8n的支持。使用也非常簡單,可以參考一下官方文檔

添加國際化資源文件

SpringBoot預設會讀取classpath/resource下的messages目錄里的國際化資源文件,可以通過下麵這個配置更改:

spring.messages.basename=messages

咱們先通過Idea 創建國際化資源文件,方法如下:

Untitled
Untitled

創建完成後在reources目錄下能看到這些國際化資源文件,圖中為了演示,定義了咱們開發中比較常見的登錄錯誤提示信息。

Untitled

創建工具類

創建工具類的目的是方便咱們獲取國際化信息

public class I18nUtil {
 public static String getI18nMessage(String code) {
         try {
           // SpringBoot提供有一個MessageSource的預設實現
             MessageSource messageSource = SpringUtils.getBean("messageSource");
             // 從SpringBoot中獲取請求上下文 語言
             Locale locale = LocaleContextHolder.getLocale();
             // 因為我項目只有中文和英文,所以判斷一下除了指定中文,否則預設使用英文  
             // 這裡對簡體中文的定義,Locale[] SIMPLIFIED_CHINESE = {Locale.CHINESE, Locale.CHINA, Locale.SIMPLIFIED_CHINESE, Locale.PRC};
             if (Arrays.stream(LocaleUtils.SIMPLIFIED_CHINESE).toList().contains(locale)) {
                 locale = Locale.SIMPLIFIED_CHINESE;
             } else {
                locale = Locale.US;
             }
            return messageSource.getMessage(code, null, locale);
         } catch (Exception e) {
             log.error("獲取國際化內容異常", e);
             // 如果獲取國際化信息失敗就返回原內容
             return code;
         }
     }
}

定義介面統一返回類

@Data
public class RestResult<Timplements Serializable {

    private static final long serialVersionUID = 1L;

    /** 狀態標識碼 */
    private String code;

    /** 描述信息 */
    private String message;

    /** 數據 */
    private T data;
    
    public String getMessage(){
     if (StrUtil.isNotEmpty(this.code)) {
       // 獲取I8n
      return I18nUtil.getI18nMessage(this.code)
     }
     return this.message;
    }
    
    // 省略其他方法。。。
}

請求頭添加語言編碼

curl -H "Accept-Language: zh-CN" http://example.com

Spring Cloud 配置I8n

上面是一個簡單的是SpringBoot項目配置I8n的流程,但是在Spring Cloud下通常會有多個服務(SpringBoot項目)。按照我們的習慣一般有一個公共項目(common),用於封裝POJO 和一些通用的工具類、常量類之類的功能,然後把這個項目打成jar包,其他業務服務都會依賴這個項目,達到功能復用的目的。通用我們也會將一些通用的錯誤信息(比如:用戶Id不能為空)放到common項目裡面,那麼怎麼把這些通用錯誤信息配置成I8n呢?

按照上面所說,我們把common項目打成jar包供其他業務服務使用,那麼當其他服務引入common依賴以後,common就和業務服務同處於一個Spring容器,這時候上面的I8n配置就無法讀取到common裡面的I8n配置了(上面講過了SpringBoot預設讀取的是項目classpath/resource下的配置文件)。因此我們需要自定義一個MessageSource 然後讀取common下的I8n配置就可以了。

  1. 首先,我們在commonresource下創建I8n配置文件,方法和上面一樣,因為和業務服務同處一個Spring容器,所以我們需要將資源名稱區分開,我們暫且就叫common_messages, 如下圖所示:
Untitled
Untitled
  1. 然後,我們配置一個自定義MessageSource Bean,並且讀取我們設置的common_messages
@Bean(name = "commonMessageSource")
public ResourceBundleMessageSource resourceBundleMessageSource() throws IOException {
    ResourceBundleMessageSource source = new ResourceBundleMessageSource();
    source.setDefaultEncoding(StandardCharsets.UTF_8.displayName());
    source.setBasename("common_messages");
    return source;
}
  1. 最後,調整I8nUtil邏輯,先讀取業務服務自己的I8n,如果沒有再從common I8n獲取,如果還沒有則返回原code
public class I18nUtil {
 public static String getI18nMessage(String code) {
         try {
           // SpringBoot提供有一個MessageSource的預設實現
             MessageSource messageSource = SpringUtils.getBean("messageSource");
             // 從SpringBoot中獲取請求上下文 語言
             Locale locale = LocaleContextHolder.getLocale();
             // 因為我項目只有中文和英文,所以判斷一下除了指定中文,否則預設使用英文  
             // 這裡對簡體中文的定義,Locale[] SIMPLIFIED_CHINESE = {Locale.CHINESE, Locale.CHINA, Locale.SIMPLIFIED_CHINESE, Locale.PRC};
             if (Arrays.stream(LocaleUtils.SIMPLIFIED_CHINESE).toList().contains(locale)) {
                 locale = Locale.SIMPLIFIED_CHINESE;
             } else {
                locale = Locale.US;
             }
            try{
              // 先讀取業務服務自己配置的I8n
             return messageSource.getMessage(code, null, locale);
            }catch (NoSuchMessageException e) {
                // 如果沒有獲取到,再從common裡面讀取I18n
              ResourceBundleMessageSource commonMessageSource = SpringUtils.getBean("commonMessageSource");
                return commonMessageSource.getMessage(code, null, locale);
            }
         } catch (Exception e) {
             log.error("獲取國際化內容異常", e);
             // 如果獲取國際化信息失敗就返回原內容
             return code;
         }
     }
}

本文使用 markdown.com.cn 排版


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring Boot註解主要用於簡化配置、自動裝配組件和實現聲明式服務。以下是詳細的介紹: 1、Springboot註解 核心註解 1. @SpringBootApplication 作用: 標註一個主程式類,表明這是一個Spring Boot應用程式的入口。 功能: 這是一個複合註解,組合了@C ...
  • 有的時候博客內容會有變動,首發博客是最新的,其他博客地址可能會未同步,認準https://blog.zysicyj.top 官方地址 Ubuntu 針對Docker客戶端版本大於 1.10.0 的用戶 您可以通過修改daemon配置文件/etc/docker/daemon.json來使用加速器 su ...
  • 在開發過程中,我們可能會遇到需要生成word,或者通過模板word替換相應內容的需求。但在文檔中插入圖片時,如果段落格式設置不對,就會導致圖片只顯示一點點或者不顯示。接下來就介紹一下java編輯word和插入圖片需怎麼處理。 1.引入依賴 首先我們在項目中引入Apache POI,用於讀取和操作wo ...
  • 1. Spring MVC 中的攔截器的使用“攔截器基本配置” 和 “攔截器高級配置” @目錄1. Spring MVC 中的攔截器的使用“攔截器基本配置” 和 “攔截器高級配置”2. 攔截器3. Spring MVC 中的攔截器的創建和基本配置3.1 定義攔截3.2 攔截器基本配置3.3 攔截器的 ...
  • 條形碼和二維碼是現代信息交換和數據存儲的重要工具,它們將信息以圖形的形式編碼,便於機器識別和數據處理,被廣泛應用於物流、零售、醫療、教育等各領域。本文將介紹如何使用Python快速生成各種常見的條形碼如Code 128、EAN-13,以及生成二維碼。 Python條碼庫 本文需要用到 Spire.B ...
  • 以下是一個詳細全面的 Spring Boot 使用 WebSocket 的知識點彙總 1. 配置 WebSocket 添加依賴 進入maven官網, 搜索spring-boot-starter-websocket,選擇版本, 然後把依賴複製到pom.xml的dependencies標簽中 配置 We ...
  • 引言 在現代的互聯網應用中,數據安全和隱私保護變得越來越重要。尤其是在介面返回數據時,如何有效地對敏感數據進行脫敏處理,是每個開發者都需要關註的問題。本文將通過一個簡單的Spring Boot項目,介紹如何實現介面數據脫敏。 一、介面數據脫敏概述 1.1 介面數據脫敏的定義 介面數據脫敏是指在介面返 ...
  • 本文介紹基於R語言中的UBL包,讀取.csv格式的Excel表格文件,實現SMOTE演算法與SMOGN演算法,對機器學習、深度學習回歸中,訓練數據集不平衡的情況加以解決的具體方法~ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...