小白的springboot之路、i18n多语言支持(后端篇)

2022-08-17 12:36:25

0-前言

  在有些系统中,比如网站,往往需要支持多国语言,英文版中文版什么的,这个其实也不难;

  今天我们就来介绍spring boot中用i18n在后端支持多语言;

  当然,也可以直接在前端用i18n直接支持多语言,这个我们以后在前端系列中再介绍;

1-实现

简单6步,轻松实现:

1-1、增加多语言文件

  在resources中,新增static/i18n文件夹,在里面新建新建三个文件

    messages.properties(默认的多语言文件)

    messages_zh_CN.properties(中文语言文件)

    messages_en_US.properties(英文语言文件)

如图:

在里面添加上相同键的不同语言翻译值;如zh_CN中:

user.appname=中文语言

1-2、IDEA中设置文件的编码为utf-8(重要,一定要设置)

  在中文环境中,IDE一般默认配置文件为GBK编码,会导致中文变成乱码,所以需要在IDEA中设置一下

  设置--编辑器--文本编码,几处都改成utf-8;如图:

1-3、配置文件增加配置

#I18n语言国际化配置
spring:
  messages:
    encoding: utf-8
    basename: static/i18n/messages

1-4、增加个配置类,主要是对语言参数进行拦截和设置语言环境

import java.util.Locale;

/**
 * 描述: 2、配置国际化语言
 * 版权: Copyright (c) 2020
 * 公司: XXX
 * 作者: yanghj
 * 版本: 4.0
 * 创建日期: 2020/9/18 10:25
 */
@Configuration
public class LocalConfig {

    /**
     * 默认解析器 其中locale表示默认语言
     */
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.CHINA);
        return localeResolver;
    }

    /**
     * 默认拦截器 其中lang表示切换语言的参数名
     */
    @Bean
    public WebMvcConfigurer localeInterceptor() {
        return new WebMvcConfigurer() {
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
                localeInterceptor.setParamName("lang");  //拦截lang参数
                registry.addInterceptor(localeInterceptor);
            }
        };
    }

}

1-5、写个工具类,主要是为了方便获取相应语言环境中的键值

/**
 * 描述: 3、国际化工具类
 * 版权: Copyright (c) 2020
 * 公司: XXXX
 * 作者: yanghj
 * 版本: 4.0
 * 创建日期: 2020/9/18 10:31
 */

@Component
public class LocalUtil
{

    private static MessageSource messageSource;

    public LocalUtil(MessageSource messageSource)
    {
        LocalUtil.messageSource = messageSource;
    }

    /**
     * 获取单个国际化翻译值
     */
    public static String get(String msgKey)
    {
        try
        {
            return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale());
        }
        catch (Exception e)
        {
            return msgKey;
        }
    }
}

1-6、使用,在需要的地方,直接调用工具类传入键值即可

注意:在接口,如果不传lang参数,会获取1-4设置的默认解析器的语言,如果传入了lang,就按lang参数传入的语言来;

   @GetMapping("/getmsg")
    @ApiOperation(value = "i18n测试", notes = "获取相应语言下的值")
    public String language() {

        String message =LocalUtil.get("user.appname");  //调用
        return message;
    }

运行结果:

2-总结

  后端实现多语言还是很轻松的;

  但是也有局限性,对于UI上的显示,我们可以在语言文件中配,但是对于很多系统,很多数据是存数据库的,要完全实现多语言,还需要数据库也设计相应的多语言表来分别存储不同语言环境的数据,这个操作起来是比较麻烦的,事实上很多时候也没有必要;

  中国是个局域网,加上东西方是不可能融合的,文化不同,只会冲突不会融合;所以中国人爱用的系统老外是基本不用的,像微信,在国外也只有国外的华人会用用,老外是不用的,老外爱用的像Facebook什么的,我们也用不了,所以,多语言更多时候是个伪命题,没实际意义的;

关于应用场景的一些建议:

  网站类,确实涉及到国外业务的,比如外贸类网站,这类可以添加多语言版本;

  APP等系统类的,就没有必要搞多语言了;实际上,即使国际化运营的系统,也都是外国单独部署单独运营的(国外是很注重隐私的,是绝对不允许国外的数据被中国获取和存储的),不会共用同一系统同一版本分支的,所以多语言也是不适用的;

总之一句话,中国优先!多语言,如非确实十分必要,不要使用,不要给自己挖坑,还是个毫无实际意义的坑;

  • 作者:在酒吧写代码
  • 原文链接:https://blog.csdn.net/java_xiaoo/article/details/108681435
    更新时间:2022-08-17 12:36:25