当前位置: 首页 > biancheng >正文

【保姆级】SpringBoot项目中的i18n国际化

【Spring源码】13. 国际化处理initMessageSource()源码解析 中有对于Spring中的国际化代码的介绍,本篇是保姆级的SpringBoot项目中的国际化实践(其实也就是把Spring中的配置文件简化成了SpringBoot中的注解)
来~我们开始这次的保姆级实践教程( ̄∇ ̄)

项目结构

配置类 · MessageI18NConfig.java

package com.aqin.messagelocalization.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;

import java.util.Locale;

/**
*  @Description
 *  @Author  aqin1012 AQin.
*  @Date  2022/9/20 1:37 PM
*  @Version  1.0
*/
@Configuration
public class MessageI18NConfig {
@Bean
    public ResourceBundleMessageSource resourceBundleMessageSource () {
ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource () ;
        resourceBundleMessageSource.setBasename ( "classpath:messages/message" ) ;
        resourceBundleMessageSource.setDefaultLocale ( Locale.CHINA) ;
        return resourceBundleMessageSource;
    }
} 

接口 · IMessageLocalizationService.java

package com.aqin.messagelocalization.service;

import java.util.Locale;

/**
*  @Description
 *  @Author  aqin1012 AQin.
*  @Date  2022/9/20 1:37 PM
*  @Version  1.0
*/
public interface IMessageLocalizationService {
 /**
* 国际化处理
*
*  @param  code
*  @param  args
*  @param  locale
*  @return
 */
String getMessage ( String code, Object [] args, Locale locale ) ;

} 

实现类 · IMessageLocalizationServiceImpl.java

package com.aqin.messagelocalization.service.impl;

import com.aqin.messagelocalization.service.IMessageLocalizationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.stereotype.Service;

import java.util.Locale;

/**
*  @Description
 *  @Author  aqin1012 AQin.
*  @Date  2022/9/20 2:10 PM
*  @Version  1.0
*/
@Service
public class IMessageLocalizationServiceImpl implements IMessageLocalizationService {

@Autowired
    ResourceBundleMessageSource resourceBundleMessageSource;

    @Override
    public String getMessage ( String code, Object [] args, Locale locale ) {
System.out.println ( "IMessageLocalizationServiceImpl-getMessage()" ) ;
        try {
return resourceBundleMessageSource.getMessage ( code, args, locale ) ;
        } catch ( Exception e ) {
System.out.println ( e.getMessage ()) ;
        }
return null;
    }
} 

测试类 · TestI18N.java

package com.aqin.messagelocalization.service;

import com.aqin.messagelocalization.service.impl.IMessageLocalizationServiceImpl;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ResourceBundleMessageSource;

import java.util.Locale;

/**
*  @Description
 *  @Author  aqin1012 AQin.
*  @Date  2022/9/20 2:26 PM
*  @Version  1.0
*/
public class TestI18N {

@Test
    public void testPrint () throws IllegalAccessException {
IMessageLocalizationService iMessageLocalizationService = new IMessageLocalizationServiceImpl () ;
        ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource () ;
        resourceBundleMessageSource.setBasename ( "messages/message" ) ;
        // field replace
        FieldUtils.writeField( iMessageLocalizationService, "resourceBundleMessageSource", resourceBundleMessageSource, true ) ;
        System.out.println ( iMessageLocalizationService.getMessage ( "AQIN_TEST", null, Locale.CHINA)) ;
        System.out.println ( iMessageLocalizationService.getMessage ( "AQIN_TEST", null, Locale.US)) ;
    }

} 

配置文件

message.properties

AQIN_TEST=test

message_en_US.properties

AQIN_TEST=test

message_zh_CN.properties

AQIN_TEST=\u6d4b\u8bd5
  • \u6d4b\u8bd5 是“测试”经过Unicode编码后的结果

推荐一个在线转换的网站:

在线Unicode编码转换工具(ES JSON在线工具)

测试结果

总结

值得一提的是下面这行

FieldUtils.writeField( iMessageLocalizationService, "resourceBundleMessageSource", resourceBundleMessageSource, true ) ;

这行的作用把iMessageLocalizationService(第1个参数)中的名为"resourceBundleMessageSource"(第2个参数)的参数用resourceBundleMessageSource(第3个参数)对象替换掉, 第4个参数是一个布尔类型,表示是否使用reflect.AccessibleObject.setAccessible(boolean)方法打破范围限制。

相关文章:

  • switch循环语句
  • 牛客练习赛#84 F 莫比乌斯反演+杜教筛+技巧+斐波那契数列和gcd的结论+矩阵快速幂
  • ZZNUOJ_用C语言编写程序实现1342:支配值数目(附完整源码)
  • java毕业设计后勤管理系统餐饮评价监督系统(附源码、数据库)
  • 前端基础学习笔记
  • 【TS】联合类型--类型断言--类型推断
  • 谈笑风声的秘密
  • QT影城网上售票系统
  • NetCDF数据在ArcMap中的使用
  • 打怪升级(考验思路)