最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot3項目實現(xiàn)國際化的示例詳解

 更新時間:2025年08月13日 09:08:28   作者:xiguolangzi  
這篇文章主要為大家詳細介紹了SpringBoot3如何在項目中實現(xiàn)國際化的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

下面小編就來和大家簡單介紹一下springBoot3 項目實現(xiàn)國際化的完整代碼吧

1 創(chuàng)建國際化資源文件

  //src/main/resources/i18n/Resource Bundle 'messages'
      messages.properties (默認)
      messages_en_US.properties (英文)
      messages_zh_CN.properties (中文)
    
  // 翻譯文件內(nèi)容:
        # {}是參數(shù)引用,用于拼接傳參
        user.password.retry.limit.exceed=密碼輸入錯誤{0}次,帳戶鎖定{1}分鐘

2 配置 application.yml

  # Spring配置
  spring:
    # 資源信息
    messages:
      # 國際化資源文件路徑,如果有多個通過逗號隔開,這里的messages不是路徑,而是文件名前綴
      basename: i18n/messages
      encoding: UTF-8

3 維護 i8n 配置類

  package com.okyun.framework.config;
  ?
  /**
   * 資源文件配置加載
   * 語言切換優(yōu)先級 -> 1 請求lang參數(shù)語言 -> 2 瀏覽器設(shè)置的默認語言 -> 3 該系統(tǒng)默認語言(簡體中文)
   *
   * @author hubiao
   */
  @Configuration
  public class I18nConfig implements WebMvcConfigurer
  {
      /**
       * 語言切換
       * @return
       */
      @Bean
      public LocaleResolver localeResolver()
      {
          // SessionLocaleResolver 用來解析和存儲用戶的 Locale 信息在會話 (session) 中
          SessionLocaleResolver slr = new SessionLocaleResolver();
          // 設(shè)置默認語言 = 簡體中文,可以用 Locale.CHINA
          slr.setDefaultLocale(Constants.DEFAULT_LOCALE);
          return slr;
      }
  ?
      /**
       * LocaleChangeInterceptor: Spring 提供的用于切換 Locale 的攔截器,攔截 HTTP 請求中的參數(shù)來確定用戶想要切換到的語言
       * lci.setParamName("lang"): 設(shè)置 URL 請求中的參數(shù)名為 lang
       * 即用戶可以通過傳遞 ?lang=xx 來切換語言(如 ?lang=zh_CN 切換到簡體中文,?lang=en 切換到英文)
       * @return
       */
      @Bean
      public LocaleChangeInterceptor localeChangeInterceptor()
      {
          LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
          // 參數(shù)名
          lci.setParamName("lang");
          return lci;
      }
  ?
      /**
       * WebMvcConfigurer 添加自定義攔截器
       * @param registry
       */
      @Override
      public void addInterceptors(InterceptorRegistry registry)
      {
          // 添加攔截器
          registry.addInterceptor(localeChangeInterceptor());
      }
  }

4 封裝消息工具

  package com.okyun.common.utils;
  ?
  import org.springframework.context.MessageSource;
  import org.springframework.context.i18n.LocaleContextHolder;
  import com.okyun.common.utils.spring.SpringUtils;
  ?
  /**
   * 獲取i18n資源文件
   * 
   * @author hubiao
   */
  public class MessageUtils
  {
      /**
       * 根據(jù)消息鍵和參數(shù) 獲取消息 委托給spring messageSource
       *
       * @param code 消息鍵
       * @param args 參數(shù)
       * @return 獲取國際化翻譯值
       */
      public static String message(String code, Object... args)
      {
          // MessageSource:Spring 的國際化資源接口,主要用于獲取不同語言環(huán)境下的消息內(nèi)容
          MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
          // LocaleContextHolder.getLocale():從 LocaleContextHolder 中獲取當前線程的 Locale(語言環(huán)境)
          return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
      }
  }

5 后臺業(yè)務(wù)中使用

  AjaxResult.error(MessageUtils.message("user.password.retry.limit.exceed",new Object[] { retryLimitCount, lockTime }))

6 前端切換語言

 /**
  * 切換語言
  * @param lang
  * @return
  */
  @GetMapping("/changeLanguage")
  public AjaxResult changeLanguage(String lang)
  {
    return AjaxResult.success();
  }

7 特殊國際化處理 - 參數(shù)校驗注解

/**
* 參數(shù)驗證國際化
*/
@Size(max = 30, message = "編碼最大長度30個字符")
@Pattern(regexp = "^[^+-].*", message = "編碼不能以 + 或 - 開頭")
private String productNo;

// 舉例 @Size(max = 30, message = "size.max.valid")
# Spring 會自動從 `messages.properties` 加載對應(yīng)的消息
size.between.valid=長度必須在{min}到{max}個字符之間
size.max.valid=長度不能超過{max}個字符
size.min.valid=長度不能少于{min}個字符

8 特殊國際化處理 - Excel列名

8.1 Excel注解添加i18n字段

package com.okyun.common.annotation;

/**
 * 自定義導(dǎo)出Excel數(shù)據(jù)注解
 * 
 * @author hubiao
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel{
...

/**
 * 國際化Key(優(yōu)先級高于name).
 * 示例: excel.user.name
 */
public String i18nKey() default "";

...

}

8.2 ExcelUtil 方法添加獲取國際化邏輯

package com.okyun.common.utils.poi;


/**
 * Excel相關(guān)處理
 * @author hubiao
 */
public class ExcelUtil<T>{

    ...
    // 國際化 - 注入MessageSource(若依中可通過SpringUtils獲取)
    private static final MessageSource messageSource = SpringUtils.getBean(MessageSource.class);


    /**
     * 獲取國際化表頭名稱
     */
    private String getI18nHeader(Excel excelAttr) {
        if (StringUtils.isNotEmpty(excelAttr.i18nKey())) {
            return messageSource.getMessage(
                    excelAttr.i18nKey(),
                    null,
                    LocaleContextHolder.getLocale()
            );
        }
        return excelAttr.name(); // 默認返回name
    }

    /**
     * 創(chuàng)建單元格
     */
    public Cell createHeadCell(Excel attr, Row row, int column){

        ...

        // 寫入列信息 - 國際化
        cell.setCellValue(getI18nHeader(attr));

        ...

    }



    /**
     * 添加單元格
     */
    public Cell addCell(Excel attr, Row row, T vo, Field field, int column){

        ......

        else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) {
            String label = DictUtils.getDictLabel(
                    dictType,
                    Convert.toStr(value),
                    separator,
                    LocaleContextHolder.getLocale() // 傳遞當前語言環(huán)境
            );
            cell.setCellValue(label);
        }

        ......

    }

    ...

}

8.3 字典數(shù)據(jù)國際化

package com.okyun.common.utils;


/**
 * 字典工具類
 * 
 * @author hubiao
 */
public class DictUtils{

    ......

    /**
     * 獲取國際化字典標簽(完整實現(xiàn))
     * @param dictType 字典類型
     * @param dictValue 字典值
     * @param separator 分隔符
     * @param locale 語言環(huán)境
     * @return 字典標簽
     */
    public static String getDictLabel(String dictType, String dictValue, String separator, Locale locale) {
        // 1. 嘗試獲取國際化標簽
        String i18nKey = "dict." + dictType + "." + dictValue;
        MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
        String i18nLabel = messageSource.getMessage(i18nKey, null, null, locale);

        // 2. 如果不存在國際化配置,回退到系統(tǒng)字典
        if (i18nLabel == null || i18nKey.equals(i18nLabel)) {
            return getDictLabel(dictType, dictValue, separator); // 調(diào)用原有方法
        }
        return i18nLabel;
    }

    ......

}

8.4 項目實戰(zhàn)中使用

8.4.1 @Excel注解

/** 
* 商品狀態(tài) 
* dictType 字典類型
* i18nKey 映射的字段名
*/
@Excel(name = "商品狀態(tài)", dictType = "product_status", i18nKey = "product.product.status")
private Integer productStatus;

/** 
* 編碼
* i18nKey 映射的字段名
*/
@Excel(name = "編碼", i18nKey = "product.product.code")
private String productNo;

8.4.2 維護映射文件

# excel導(dǎo)出/導(dǎo)入 - 字段名映射
product.product.code=商品編碼
product.product.status=商品狀態(tài)

# dictData 的 value 對應(yīng) label
# dict 固定前綴
# dictType 字典類型
# 0 字典值
# 啟售 字典label
dict.product_status.0=啟售
dict.product_status.1=停售

到此這篇關(guān)于SpringBoot3項目實現(xiàn)國際化的示例詳解的文章就介紹到這了,更多相關(guān)SpringBoot3國際化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中實現(xiàn)Comparable接口實現(xiàn)自定義排序的示例

    java中實現(xiàn)Comparable接口實現(xiàn)自定義排序的示例

    下面小編就為大家?guī)硪黄猨ava中實現(xiàn)Comparable接口實現(xiàn)自定義排序的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java CRM系統(tǒng)用戶登錄功能實現(xiàn)代碼實例

    Java CRM系統(tǒng)用戶登錄功能實現(xiàn)代碼實例

    這篇文章主要介紹了Java CRM系統(tǒng)用戶登錄功能實現(xiàn)代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程

    Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程

    這篇文章主要介紹了Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java實現(xiàn)簡單班級管理系統(tǒng)

    Java實現(xiàn)簡單班級管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單班級管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java實現(xiàn)在線五子棋對戰(zhàn)游戲(人機對戰(zhàn))

    Java實現(xiàn)在線五子棋對戰(zhàn)游戲(人機對戰(zhàn))

    這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)在線五子棋對戰(zhàn)游戲(人機對戰(zhàn)),文中的實現(xiàn)步驟講解詳細,感興趣的可以嘗試一下
    2022-09-09
  • java集合類HashMap源碼解析

    java集合類HashMap源碼解析

    這篇文章主要介紹了Java集合之HashMap用法,結(jié)合實例形式分析了java map集合中HashMap定義、遍歷等相關(guān)操作技巧,需要的朋友可以參考下
    2021-06-06
  • Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案

    Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案

    這篇文章主要介紹了Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案,分布式部署hadoop,服務(wù)機只有namenode節(jié)點,主機包含其他所有節(jié)點,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • Java線程狀態(tài)變換過程代碼解析

    Java線程狀態(tài)變換過程代碼解析

    這篇文章主要介紹了Java線程狀態(tài)變換過程代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 淺析mybatis和spring整合的實現(xiàn)過程

    淺析mybatis和spring整合的實現(xiàn)過程

    據(jù)官方的說法,在Mybatis3問世之前,Spring3的開發(fā)工作就已經(jīng)完成了,所以Spring3中還是沒有對Mybatis3的支持。因此由Mybatis社區(qū)自己開發(fā)了一個Mybatis-Spring用來滿足Mybatis用戶整合Spring的需求,下面通過Mybatis-Spring來整合Mybatis跟Spring的用法做介紹
    2015-10-10
  • Java中String.split()的最詳細源碼解讀及注意事項

    Java中String.split()的最詳細源碼解讀及注意事項

    以前經(jīng)常使用String.split()方法,但是從來沒有注意,下面這篇文章主要給大家介紹了關(guān)于Java中String.split()最詳細源碼解讀及注意事項的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-07-07

最新評論

纳雍县| 焉耆| 巫山县| 车致| 施秉县| 哈巴河县| 邳州市| 三明市| 布尔津县| 河西区| 灯塔市| 夏邑县| 成武县| 乌鲁木齐县| 曲水县| 天津市| 锡林浩特市| 琼结县| 新营市| 东港市| 页游| 临城县| 历史| 建瓯市| 九江市| 龙州县| 通江县| 元阳县| 陇西县| 山西省| 三穗县| 东阳市| 吉木乃县| 屏东县| 施秉县| 绥化市| 静安区| 府谷县| 松原市| 湘阴县| 吐鲁番市|