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

了解springboot国际化用途以及使用

前言:   

        Spring Boot国际化可以使应用程序能够根据用户的语言和地区设置显示相应的内容。这提高了用户界面的友好性,使用户能够更容易理解和使用应用程序。通过实现国际化,Spring Boot应用程序可以符合行业标准和最佳实践,提高应用程序的质量和可访问性。

归纳为以下几个方面:

  • 1.提升用户体验

多语言支持:通过国际化,应用程序可以支持多种语言,如中文、英文、法文等,满足不同国家和地区用户的需求。

地区适应性:除了语言之外,国际化还可以包括日期、时间、货币等格式的本地化,使应用程序更符合当地用户的习惯。

  • 2.可扩展性和维护性

代码分离:通过国际化,可以将可翻译的信息(如菜单按钮的标签、提示信息等)从代码中分离出来,放入专门的资源文件中。这样,当需要修改这些信息时,无需修改代码,只需更新资源文件即可,降低了维护成本。

易于管理:资源文件通常按照语言或地区进行分类,这使得管理和更新这些信息变得更加容易。

  • 3.增强应用程序的灵活性

国际化使Spring Boot应用程序更加灵活,能够适应不同的市场和用户群体。随着应用程序的不断发展,可能需要添加新的语言或地区支持。通过国际化,可以轻松实现这一需求,而无需对应用程序进行重大修改。

  • 4.支持全球化战略

市场扩展:随着全球化的加速,越来越多的企业开始将目光投向国际市场。通过国际化,应用程序可以更容易地进入新市场,吸引更多的国际用户。

品牌一致性:国际化有助于保持品牌在不同市场的一致性,提升品牌形象和知名度。


实现方式:

在Spring Boot中,实现国际化通常涉及以下几个步骤:

步骤一:

  • resources目录下创建i18n目录

ed9771c28fb3419c87d2a0853750f6b6.png

  • i18n目录创建资源配置文件

ed9771c28fb3419c87d2a0853750f6b6.png

  • 创建不同语言环境的资源文件,如messages_zh_CN.properties,messages_en_US.properties等。

ff741b6b5d524fb99929120bfc12b314.png

9e544136bff34c78bc26d3d7a9eafcef.png

步骤二:

配置:

@Configuration
public class I18nConfig {


    @Bean
    public LocaleResolver localeResolver() {
        return new I18nLocaleResolver();
    }
}


class I18nLocaleResolver implements LocaleResolver {
    //从请求头content-language,语言类型zh_CN
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        String language = httpServletRequest.getHeader("content-language");
        Locale locale = Locale.getDefault();
        if (language != null && language.length() > 0) {
            String[] split = language.split("_");
            locale = new Locale(split[0], split[1]);
        }
        return locale;
    }

    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse             httpServletResponse, Locale locale) {
    }
}

步骤三:

使用上一篇文章进行演示:springboot使用aop防御用户重复请求-CSDN博客

注解:

这里修改信息提示:{repeat.submit.message}

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RepeatSubmit {
    //间隔
    int interval() default 5000;
    //时间单位
    TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
    //消息提示
    String message() default "{repeat.submit.message}";
}

切面:

主要代码:

         //消息提示读取资源文件
            String message = repeatSubmit.message();
             message = MessageUtils.message(StringUtils.substring(message, 1, message.length() - 1), new Object[0]);
                throw new ServiceException(repeatSubmit.message());
            }

示例: 

    @Before("@annotation(repeatSubmit)")
    public void doBefore(JoinPoint point, RepeatSubmit repeatSubmit) throws Throwable {
         long interval = repeatSubmit.timeUnit().toMillis(repeatSubmit.interval());
        if (interval < 1000L) {
            throw new ServiceException("重复提交间隔时间不能小于'1'秒");
        } else {
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = requestAttributes.getRequest();
             //解析参数point.getArgs()
            String params = getArgs(point.getArgs());
            //获取url
            String url = request.getRequestURI();
            //获取用户登录token
            String token=request.getHeader("Authorization"));
 			//token+参数进行md5
            token = SecureUtil.md5(token + ":" + params);
            String cacheRepeatKey = "cache:repeat_submit:" + url + token;
 			//redis设置key,并且设置过期时间
            if (RedisUtil.setObjectIfAbsent(cacheRepeatKey, "", Duration.ofMillis(interval))) {
                KEY_CACHE.set(cacheRepeatKey);
            } else {

            //消息提示读取资源文件
            String message = repeatSubmit.message();
             message = MessageUtils.message(StringUtils.substring(message, 1, message.length() - 1), new Object[0]);
                throw new ServiceException(repeatSubmit.message());
            }
        }
    }

工具:

public class MessageUtils {
    private static final MessageSource messageSource = (MessageSource) SpringUtil.getBean(MessageSource.class);

    public static String message(String code, Object... args) {
        try {
            return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
        } catch (NoSuchMessageException var3) {
            return code;
        }
    }
}

测试结果:

第一次:repeat.submit.message=不允许重复提交,请稍候再试

c079a31096714a6abb8cf8a694b8e7bf.png

第二次:repeat.submit.message=不允许重复提交,次数频繁待会就拉黑你!

584cef5636c54320a660580f773b2cb8.png

小结:

        总之,Spring Boot使用国际化作用是多方面的,包括提升用户体验、支持多语言和多地区用户、简化维护和管理、增强应用程序的灵活性、遵循最佳实践以及支持全球化战略等。通过实现国际化,Spring Boot应用程序可以更加适应全球用户的需求,并在全球范围内取得更大的成功。

 


http://www.kler.cn/a/390031.html

相关文章:

  • 软件测试面试八股文(超详细整理)
  • ubuntu cmake CPack将第三方库进行打包
  • 重新认识HTTPS
  • 【C++】详解RAII思想与智能指针
  • 准确--FastDFS快速单节点部署
  • 如何线程安全的使用HashMap
  • [数据结构]顺序表详解+完整源码(顺序表初始化、销毁、扩容、元素的插入和删除)
  • 【网页设计】CSS 高级技巧
  • PyTorch:torchvision中的dataset的使用
  • 【后端速成Vue】模拟实现翻译功能
  • 【网络安全 | 漏洞挖掘】我如何通过路径遍历实现账户接管
  • RFID被装信息化监控:物联网解决方案深入分析
  • 达梦8-达梦数据实时同步软件(DMHS)配置-Oracle-DM8
  • 11 go语言(golang) - 数据类型:结构体
  • lua入门教程:垃圾回收
  • 数据分析-45-时间序列预测之使用LSTM的错误及修正方式
  • Golang常见编码
  • 恒源云使用手册记录:从服务器下载数据到本地
  • 【数据库实验一】数据库及数据库中表的建立实验
  • 配置管理,雪崩问题分析,sentinel的使用
  • 向量搜索:信息检索领域的变革力量
  • Java基础——反射
  • 测试实项中的偶必现难测bug--验证码问题
  • 小程序免备案
  • 基于SSD模型的高压输电线障碍物检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】
  • OpenObserve云原生平台指南:在Ubuntu上快速部署与远程观测