SpringBoot实现国际化的操作步骤

 更新时间:2024年02月04日 11:51:37   作者:索码理  
国际化(Internationalization) 是指为了适应不同语言、文化和地区的用户,使软件能够方便地进行本地化修改的过程,本文介绍了SpringBoot 国际化功能的简单使用,感兴趣的朋友可以参考下

什么是国际化

国际化(Internationalization) 是指为了适应不同语言、文化和地区的用户,使软件能够方便地进行本地化修改的过程。 国际化(Internationalization) 简称i18n,其中 “i”Internationalization的首字母 ,“n” 是最后一个字母 , “18” 代表了中间省略的18个字母。

SpringBoot 国际化

SpringBoot也提供了国际化的功能,在Spring Boot中,国际化通常涉及以下几个关键组件:

  • 资源文件(Properties文件):这些文件包含了不同语言的文本消息,每个语言对应一个资源文件。通常,资源文件的命名采用messages_语言代码.properties的格式,例如messages_en.properties(英语)、messages_zh_CN.properties(简体中文)等。

  • MessageSource接口:这是Spring框架提供的一个核心接口,定义了获取文本消息的方法。它的实现类负责加载并解析资源文件,并根据语言和代码来返回相应的消息。

  • LocaleResolver接口:这是Spring框架提供的另一个接口,用于解析用户的语言偏好。根据用户的设置,LocaleResolver可以确定要使用哪个语言。

  • 组件中使用的文本消息:在应用程序的界面和代码中,您可以使用特定的消息代码来引用资源文件中的文本消息。Spring Boot会根据用户的语言偏好选择合适的消息进行显示。

通过配置MessageSource和LocaleResolver,以及在应用程序中使用相应的消息代码,就可以实现Spring Boot的国际化功能。

实践出真知

话不多说,上代码。

新建Properties文件

Resource目录下新建Properties文件

  • 中文properties文件 messages_zh_CN.properties :
hello=你好
welcome=欢迎关注公众号, {0}!
  • 英文properties文件 messages_en.properties
hello=hi
welcome=Welcome to follow WeChat Public Number, {0}!

创建完文件idea会自动将国际化文件归类到Resource Bundle中

修改配置文件

application.properties

测试

@Resource
private MessageSource messageSource;

@Test
void testMessageSource() {

    Locale china = Locale.CHINA;
    System.out.println("\n中文环境");
    //中文语言
    String hello_zh = messageSource.getMessage("hello", null, china);
    System.out.println(hello_zh);
    // 占位符替换
    String welcome_zh = messageSource.getMessage("welcome", new String[]{"索码理"}, china);
    System.out.println(welcome_zh);

    //英文语言
    Locale english = Locale.ENGLISH;
    System.out.println("\n英文环境");
    String hello_en = messageSource.getMessage("hello", null, english);
    System.out.println(hello_en);
    String welcome_en = messageSource.getMessage("welcome", new String[]{"suncodernote"}, english);
    System.out.println(welcome_en);

    System.out.println("\n没有对应语言的国际化属性,返回code");
    //没有对应语言的国际化属性,返回code
    String hello_test = messageSource.getMessage("hello-test", null, china);
    System.out.println(hello_test);

    System.out.println("\n没有对应语言的国际化区域时,返回默认语言");
    //没有对应语言的国际化区域时,返回默认
    String hello_fr = messageSource.getMessage("hello", null, Locale.FRANCE);
    System.out.println(hello_fr);
}

测试结果:

中文环境
你好
欢迎关注公众号, 索码理!

英文环境
你好
欢迎关注公众号, suncodernote!

没有对应语言的国际化属性,返回code
hello-test

没有对应语言的国际化区域时,返回默认语言
你好

获取所有国际化资源

上面的测试我们都是只能根据一个code获取一个国际化信息,我们在切换语言使用国际化时,总不能每次进行国际化的时候都调用一次接口吧,这肯定是不行的。 下面是获取指定语言的所有的国际化信息的代码示例。

定义一个I18nService 接口:

public interface I18nService {

    /**
     * 获取指定语言所有国际化信息
     * @param locale
     * @return
     */
    Map<String, String> getAllMessages(Locale locale);
}

I18nService 接口实现类

@Service
public class I18nServiceImpl implements I18nService{

    @Autowired
    private MessageSource messageSource;

    @Override
    public Map<String, String> getAllMessages(Locale locale) {
        if (locale == null) {
            locale = Locale.getDefault();
        }
        //存放所有message
        Map<String, String> messages = new HashMap<>();

        ResourceBundleMessageSource bundleMessageSource = (ResourceBundleMessageSource) messageSource;
        String[] basenames = bundleMessageSource.getBasenameSet().toArray(new String[0]);

        for (String basename : basenames) {
            //从缓存中获取资源文件
            ResourceBundle resourceBundle = ResourceBundle.getBundle(basename, locale);
            //获取资源文件的所有code
            Set<String> keys = resourceBundle.keySet();

            for (String key : keys) {
                //根据code获取对应的message
                String message = messageSource.getMessage(key, null, locale);
                messages.put(key, message);
            }
        }
        return messages;
    }
}

getAllMessages方法中,拿到了指定资源文件的所有code,有了code再做一些操作就很方便了。比如获取以xxx开头的code。

I18nController

@RequestMapping("/i18n")
@RestController
public class I18nController {

    @Resource
    private I18nService i18nService;

    @RequestMapping("/messages")
    public Map<String, String> getAllMessages(@RequestHeader(name = "Accept-Language" , required = false) Locale locale) {
        return i18nService.getAllMessages(locale);
    }
}

通过postman调用接口,将请求头 Accept-Language 设置为 zh 获取中文国际化环境,测试结果如下图所示:

以上就是SpringBoot 国际化一个简单的实现的操作步骤,感兴趣的可以动手试试。

总结

本文介绍了SpringBoot 国际化功能的简单使用,通过在资源文件中配置国际化字段,然后获取对应区域的国际化信息。这些操作都是静态的,要预先配置好国际化信息才能进行一系列的操作,不够灵活。

以上就是SpringBoot实现国际化的操作步骤的详细内容,更多关于SpringBoot国际化的资料请关注脚本之家其它相关文章!

相关文章

  • spring如何动态指定具体实现类

    spring如何动态指定具体实现类

    这篇文章主要为大家详细介绍了spring如何动态指定具体实现类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 如何把char数组转换成String

    如何把char数组转换成String

    这篇文章主要介绍了如何把char数组转换成String问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • SpringBoot中HTTP请求不通的原因级解决方法

    SpringBoot中HTTP请求不通的原因级解决方法

    HTTP 请求是指从客户端到服务器的请求消息,对于一个 Spring Boot 项目而言,服务器就是 Spring Boot,客户端就是用户本地的浏览器,但是会遇到SpringBoot HTTP请求不通的问题,本文介绍了一些常见问题及解决方法,需要的朋友可以参考下
    2025-02-02
  • 在SpringBoot中使用ResponseBodyAdvice自定义响应的代码实现

    在SpringBoot中使用ResponseBodyAdvice自定义响应的代码实现

    ResponseBodyAdvice是Spring Framework中的一个接口,允许您在将响应写入客户端之前自定义响应,它通常与@ControllerAdvice注释结合使用,以跨多个控制器将全局更改应用于响应主体,本文介绍了如何使用ResponseBodyAdvice的基本概述,需要的朋友可以参考下
    2024-12-12
  • java生成抽样随机数的多种算法

    java生成抽样随机数的多种算法

    本文主要介绍了java生成抽样随机数的多种算法,主要是基于random库函数的,有需要的可以了解一下。
    2016-10-10
  • win10和win7下java开发环境配置教程

    win10和win7下java开发环境配置教程

    这篇文章主要为大家详细介绍了win7下Java开发环境配置教程,win10下Java开发环境配置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Java使用selenium爬取b站动态的实现方式

    Java使用selenium爬取b站动态的实现方式

    本文主要介绍了Java使用selenium爬取b站动态的实现方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java工具类实现高效编写报表

    Java工具类实现高效编写报表

    对于报表数据大部分情况下使用写sql的方式为大屏/报表提供数据来源,但是对于某些复杂情况下仅仅使用sql无法实现,这篇文章主要介绍了Java工具类实现高效编写报表
    2022-11-11
  • 如何在Spring Boot微服务使用ValueOperations操作Redis集群String字符串

    如何在Spring Boot微服务使用ValueOperations操作Redis集群String字符串

    这篇文章主要介绍了在Spring Boot微服务使用ValueOperations操作Redis集群String字符串类型数据,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Java集成swagger文档组件

    Java集成swagger文档组件

    这篇文章主要介绍了Java集成swagger文档组件,通过详细的图文介绍和代码分析展示,从头展开说明详细的过程,希望对你的开发有所帮助
    2021-06-06

最新评论