Spring Boot 国际化 i18n

Spring Cloud 微服务系列文章,点击上方合集↑

1. 简介

什么是国际化?国际化就是让您的应用系统适配不同的国家和语言,在中国就是中文,在中国台湾就自动切换为繁体中文,在美国就切换成英语。

i18n是国际化internationalization这个单词的缩写,取了首字母i和结尾字母n,中间有18个字母,相同的命名方式有k8s

2. Spring Boot 国际化

2.1 application.properties

server.port=8960
spring.application.name=i18n-demo
# 国际化配置文件目录
spring.messages.basename=i18n/messages
  • i18n是存放目录
  • messages是文件前缀

2.2 国际化配置文件

resources目录下创建i18n文件夹,然后在i18n目录下创建如下文件:

  • messages.properties默认语言
  • messages_en_US.properties英文语言
  • messages_zh_CN.properties简体中文
  • messages_zh_TW.properties繁体中文
2.2.1 messages.properties
opr_success=Operation successful
opr_fail=Operation failed
msg_welcome=welcome,{0}!
  • 可以通过{0}传递参数。
2.2.2 messages_en_US.properties
# English
opr_success=Operation successful
opr_fail=Operation failed
msg_welcome=welcome,{0}!
2.2.3 messages_zh_CN.properties
# 简体中文
opr_success=操作成功
opr_fail=操作失败
msg_welcome=欢迎,{0}!

2.2.4 messages_zh_TW.properties
# 繁體中文
opr_success=操作成功
opr_fail=操作失敗
msg_welcome=歡迎,{0}!

2.3 简单使用

MessageSourcegetMessage方法,传入不同的Locale就调用不同的语言。如messageSource.getMessage("opr_success", null, Locale.SIMPLIFIED_CHINESE);

并且可以创建一个数组如new String[]{name}来传递参数,对应配置中的{0}

@RestController
@RequestMapping("i18n")
public class I18nController {
    @Autowired
    private MessageSource messageSource;

    @GetMapping("success")
    public String success() {
        return messageSource.getMessage("opr_success", null, Locale.SIMPLIFIED_CHINESE);
    }

    @GetMapping("fail")
    public String fail() {
        return messageSource.getMessage("opr_fail", null, Locale.US);
    }

    @GetMapping("test")
    public String test(@RequestParam String name) {
        return messageSource.getMessage("msg_welcome", new String[]{name}, Locale.TRADITIONAL_CHINESE);
    }
}

3. 优雅的使用

3.1 LocaleInterceptor

定义一个拦截器:前端通过参数lang传入语言类型,如zh_CN,根据传入的参数生成对应的Locale对象,并通过LocaleContextHolder.setLocale(locale)Locale对象放入上下文对象中。

public class LocaleInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String lang = request.getParameter("lang");
        Locale locale = Locale.SIMPLIFIED_CHINESE;

        if (lang != null && !lang.trim().isEmpty()) {
            String[] langParts = lang.split("_");
            if (langParts.length == 2) {
                locale = new Locale(langParts[0], langParts[1]);
            }
        }

        LocaleContextHolder.setLocale(locale);

        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        LocaleContextHolder.resetLocaleContext();
    }
}


3.2 WebConfig

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleInterceptor());
    }

}

3.3 I18nUtils

封装I18nUtils类,提供getMessage方法获取语言文字,通过LocaleContextHolder.getLocale()从上下文中获取Locale对象。

@Component
public class I18nUtils {
    private static MessageSource messageSource;

    @Autowired
    public I18nUtils(MessageSource messageSource) {
        I18nUtils.messageSource = messageSource;
    }

    public static String getMessage(String key) {
        return getMessage(key, null);
    }

    public static String getMessage(String key, Object[] args) {
        Locale locale = LocaleContextHolder.getLocale();
        return messageSource.getMessage(key, args, locale);
    }
}

3.4 I18nController

@RestController
@RequestMapping("i18n")
public class I18nController {
    @GetMapping("welcome")
    public String welcome(@RequestParam String name) {
        return I18nUtils.getMessage("msg_welcome", new String[]{name});
    }
}

4. 接口测试

4.1 中文

http://localhost:8960/i18n/success

操作成功

4.2 英文

http://localhost:8960/i18n/fail

Operation failed

4.3 传入参数

http://localhost:8960/i18n/test?name=%E5%BC%A0%E4%B8%89

歡迎,张三!

4.4 lang=zh_TW指定语言

http://localhost:8960/i18n/welcome?name=%E5%BC%A0%E4%B8%89&lang=zh_TW

歡迎,张三!

4.5 默认的语言

http://localhost:8960/i18n/welcome?name=%E5%BC%A0%E4%B8%89

欢迎,张三!

5. 总结

建议在系统早期考虑国际化,即使目前只面向中文用户。尽早进行国际化设计能够避免后续需要适配其它语言(如英语、繁体中文)时带来的麻烦。您可以先实现一个默认的中文版本,这样不会给后续工作增加太多负担。记住,提前考虑国际化能够增加系统的可扩展性和适应性,为未来可能的需求做好准备。


Spring Cloud 微服务系列 完整的代码在仓库的sourcecode/spring-cloud-demo目录下。

gitee(推荐):https://gitee.com/cunzaizhe/xiaohuge-blog

github:https://github.com/tigerleeli/xiaohuge-blog

关注微信公众号:“小虎哥的技术博客”,让我们一起成为更优秀的程序员❤️!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot提供了简单易用的国际化i18n)支持。以下是使用Spring Boot进行国际化的步骤: 1. 在src/main/resources目录下创建一个新的文件夹,命名为"i18n"。在该文件夹下创建多个属性文件,分别对应不同的语言。例如,可以创建messages.properties(默认语言)和messages_zh.properties(中文)。 2. 在属性文件中添加键值对,以便将文本翻译成不同的语言。例如,在messages.properties中可以添加"welcome.message=Welcome!",在messages_zh.properties中可以添加"welcome.message=欢迎!"。 3. 在Spring Boot的配置文件(application.properties或application.yml)中添加以下配置: ``` spring.messages.basename=i18n/messages spring.messages.fallback-to-system-locale=false ``` 这样配置后,Spring Boot将会自动加载位于i18n文件夹下的属性文件。 4. 在需要进行国际化的地方使用`@Autowired`注解注入`org.springframework.context.MessageSource`对象,并使用`getMessage`方法获取对应的文本。例如: ```java @Autowired private MessageSource messageSource; public String getWelcomeMessage() { return messageSource.getMessage("welcome.message", null, LocaleContextHolder.getLocale()); } ``` `LocaleContextHolder.getLocale()`方法可用于获取当前请求的语言环境。 5. 运行应用程序并访问相应的接口或页面,Spring Boot将会根据请求的语言环境自动加载对应的属性文件,实现国际化效果。 这些是使用Spring Boot进行国际化的基本步骤,你可以根据需要进行进一步的定制和扩展。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小虎哥的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值