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

做venn图的网站精品下载

做venn图的网站,精品下载,安徽信息工程学院信息门户平台,金融企业类网站模板什么是国际化#xff1f; 国际化#xff0c;也叫i18n#xff0c;为什么叫i18n呢#xff1f; i18n是国际化#xff08;internationalization#xff09;的缩写#xff0c;数字18代表了国际化这个单词中间的字母数量。类似这样的缩写还有k8s#xff08;kube…什么是国际化 国际化也叫i18n为什么叫i18n呢 i18n是国际化internationalization的缩写数字18代表了国际化这个单词中间的字母数量。类似这样的缩写还有k8skubernetes等 为什么使用国际化 简单理解就是开发的软件需要能同时应对不同国家和地区的用户访问并根据用户地区和语言习惯提供相应的、符合用具阅读习惯的页面和数据例如为中国用户提供汉语界面显示为美国用户提供提供英语界面显示。 国际化细分 国际化需要分成两个部分 前端国际化 前端国际化主要关注页面的显示和用户界面的本地化。它涉及将应用程序的界面元素如文本、标签、按钮等根据用户的语言和地区进行翻译和适配。前端国际化通常使用资源文件、语言包或翻译服务来存储和管理不同语言的文本。前端开发人员可以通过使用国际化框架或库如React Intl、Vue I18n或Angular i18n等来实现前端国际化功能 后端国际化 后端国际化主要关注处理与业务逻辑和数据相关的国际化问题。这包括但不限于日期和时间格式、货币符号、数字格式、排序规则、接口提示信息等。后端国际化的目标是确保应用程序能够适应不同的语言和地区并提供正确的本地化数据。后端国际化可以通过使用国际化库或框架如SpringBoot I18n来实现后端国际化功能 总之前端国际化主要关注页面显示和用户界面的本地化而后端国际化则处理与业务逻辑和数据相关的国际化问题。两者通常需要协同工作以实现完整的国际化功能 国际化相关知识 Locale对象 需要支持国际化得先知道选择的是哪种地区的哪种语言java中使用java.util.Locale来表示地区语言这个对象内部包含了国家和语言的信息。 Locale中最常用的构造方法: public Locale(String language, String country) {this(language, country, ); }构造方法有两个参数language语言、country国家 这两个参数的值不是乱写的国际上有统一的标准如zh-CN表示中国大陆地区的中文zh-TW表示中国台湾地区的中文en-US表示美国地区的英文en-GB表示英国地区的英文等等。通过语言和国家构造Locale对象比如Locale locale new Locale(“zh”, “CN”);表示中国大陆地区的中文。 MessageSource接口 这是 Spring 国际化的核心接口其定义如下 public interface MessageSource {/*** 获取国际化信息*/NullableString getMessage(String code, Nullable Object[] args, Nullable String defaultMessage, Locale locale);/*** 与上面的方法类似只不过在找不到资源中对应的属性名时直接抛出NoSuchMessageException异常*/String getMessage(String code, Nullable Object[] args, Locale locale) throws NoSuchMessageException;/*** param MessageSourceResolvable 将属性名、参数数组以及默认信息封装起来它的功能和第一个方法相同*/String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException; }MessageSource接口提供了三个获取国际化消息的方法其主要是根据 Locale 信息获取对应的国际化消息的集合然后根据 code 获取对应的消息并且通过提供的参数 args 还可以对获取后的消息进行格式化。 具体参数含义如下 参数名含义code表示国际化资源中的属性名args为消息中的参数填充的值defaultMessage默认的消息如果没有找到将返回默认消息resolvable消息参数封装了 code、args、defaultMessagelocale表示本地化对象 类图结构 常见3个实现类 类名含义ResourceBundleMessageSource这个是基于Java的ResourceBundle基础类实现允许仅通过资源名加载国际化文件ReloadableResourceBundleMessageSource这个功能和第一个类的功能类似多了定时刷新功能允许在不重启系统的情况下更新国际化文件的信息StaticMessageSource它允许通过编程的方式提供国际化信息。 重点我们在项目中会创建 MessageSource接口但不管使用哪个实现类或者我们自定义的类都要将Bean名称设置为messageSource 加载ApplicationContext时自动搜索上下文中定义的MessagesSource Bean名称必须为messageSource。 如果无法找到消息的任何源则实例化一个空的messageSource。 LocaleResolver接口 这个接口是用来设置当前会话默认的国际化语言的其定义如下 public interface LocaleResolver {/*** 根据当前请求解析当前请求的本地化信息*/Locale resolveLocale(HttpServletRequest request);/*** 设置当前请求、响应的本地化信息*/void setLocale(HttpServletRequest request, Nullable HttpServletResponse response, Nullable Locale locale); }resolveLocale方法用于从当前request中解析对应出对应的Locale对象场景如 常见4个实现类 类名含义AcceptHeaderLocalResovler通过请求头里面的Accept-Language:zh,en;q0.9,zh-HK;q0.8来决定使用具体的Locale实例其实AcceptHeaderLocalResovler就是使用HttpServletRequest实例中的Locale实例在进入DispatcherServlet的时候HttpServletRequest实例里面就已经有Locale实例了可以通过request.getLocale();来获取Locale实例HttpServletRequest里面的Locale实例就是使用请求头里面的Accept-Language:zh,en;q0.9,zh-HK;q0.8来构建的比如请求头里面的Accept-Language:zh,en;q0.9,zh-HK;q0.8 就表示zh的权重是1en;q0.9表示en的权重是0.9zh-HK;q0.8就表示zh-HK的权重是0.8那么我么通过request.getLocale();获取到的就是权重最高的zh然后就是构建一个zh的Locale实例那么AcceptHeaderLocalResovler在解析Locale的时候就会返回zh的Locale实例CookieLocaleResovler根据用户在Cookie中设置的某参数来进行确定具体的本地化Locale实例SessionLocaleResovler根据用户在HttpSession中设置某参数来进行确定具体的本地化Locale实例FixedLocalResovler使用jdk自带的默认的Locale实例 国际化文件 项目中在resources目录下创建名为i18n的文件目录然后我们在i18n目录创建国际化文件 格式为名称_语言_地区.properties 我们先来创建两种语言如 message.properties这个文件名称没有指定Local信息当系统找不到的时候会使用这个默认的 name您的姓名 text默认文本message_cn_ZH.properties中文【中国】 name姓名 text文本messages_en_US.properties 英文【美国】 namename texttext我们通过MessageSource接口的getMessage方法传入对应的key如name、text便可以从国际化文件中取值。同时我们还可以指定Locale对象便能找到对应的国际化文件然后取值。 国际化一般实现 一般让前端在请求头中, 添加 { “Accept-Language”: “zh” }来标识,用户使用的语言 然后我们添加拦截器, 将这个值取出来, 这一步springboot已经帮我们做了(默认配置) 所以一般的单体springboot项目中, 直接在配置一下国际化资源文件即可 Configuration public class I18nConfig implements WebMvcConfigurer {Beanpublic MessageSource messageSource() {// 多语言文件地址Locale.setDefault(Locale.CHINA);ResourceBundleMessageSource messageSource new ResourceBundleMessageSource();//设置国际化文件存储路径 resources目录下 可以设置多个messageSource.addBasenames(i18n/common/messages,i18n/system/messages,i18n/device/messages);//设置根据key如果没有获取到对应的文本信息,则返回key作为信息messageSource.setUseCodeAsDefaultMessage(true);//设置字符编码messageSource.setDefaultEncoding(StandardCharsets.UTF_8.toString());return messageSource;} }然后在对应的目录文件(/i18n/common/)下定义国际化资源文件 美式英语 messages_en_US.properties user.login.usernameUser name user.login.passwordPassword user.login.codeSecurity code user.login.rememberRemember me user.login.submitSign In中文简体 messages_zh_CN.properties user.login.username用户名 user.login.password密码 user.login.code验证码 user.login.remember记住我 user.login.submit登录MessageUtils工具类 public class MessageUtils {/*** 根据消息键和参数 获取消息 委托给spring messageSource** param code 消息键* param args 参数* return 获取国际化翻译值*/public static String message(String code, Object... args){MessageSource messageSource SpringUtils.getBean(MessageSource.class);return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());} }然后直接这样使用就行 MessageUtils.message(user.login.username) MessageUtils.message(user.login.password)国际化改进版 下面看网上的两种国际化 通过数据库实现国际化 基于若依-cloud的国际化方案 框架中国际化 目前我们国际化应用场景1.接口抛出的异常国际化 2.参数校验实现国际化 ① 因为每个服务都有国际化配置文件所以关于加载国际化配置的配置类我们放在common包中首选创建加载MessageSource实现类的I18nConfig 配置类这个配置类有以下作用 实例化ReloadableResourceBundleMessageSourceMessageSourceAccessor是对MessageSource的封装提供了更便捷的方法来获取消息免去我们封装MessageUtils类。 package com.tps.cloud.config;import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.MessageSource; import org.springframework.context.support.MessageSourceAccessor; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.context.annotation.Bean;AutoConfiguration public class I18nConfig {private static final String BASE_NAME classpath:i18n/messages;Beanpublic MessageSource messageSource() {ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource new ReloadableResourceBundleMessageSource();reloadableResourceBundleMessageSource.setBasenames(BASE_NAME);reloadableResourceBundleMessageSource.setCacheSeconds(5);reloadableResourceBundleMessageSource.setDefaultEncoding(UTF-8);return reloadableResourceBundleMessageSource;}Beanpublic MessageSourceAccessor messageSourceAccessor(MessageSource messageSource) {MessageSourceAccessor accessor new MessageSourceAccessor(messageSource) ;return accessor ;}}②ValidatorConfig配置类此类作用 注入MessageSource用于国际化配置。实例化工厂LocalValidatorFactoryBean设置 设置国际化将MessageSource设置到ValidationMessageSource设置提供者类校验器HibernateValidator设置属性实例化Properties配置Hibernate的快速异常返回hibernate.validator.fail_fast加入到工厂配置。快速返回指的是遇到一个不合法的就不继续往下校验。 加载配置调用factoryBean的afterPropertiesSet返回工厂方法的Validator 这里可以顺便谈谈关于Spring的FactoryBean FactoryBean是接口实现该接口的类可以自定义创建Bean。一般在框架中用来创建复杂的Bean。这里的FactoryBean实现InitializingBean接口在afterPropertiesSet方法中创建bean会在bean 实例化后调用。FactoryBean让Bean构建过程更灵活可以理解为一种策略模式我们需要生成什么样的 bean可以通过实现接口来自定义。 package com.tps.cloud.config;import jakarta.validation.Validator; import org.hibernate.validator.HibernateValidator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;import java.util.Properties;AutoConfiguration public class ValidatorConfig {Autowiredprivate MessageSource messageSource;/*** 配置校验框架 快速返回模式*/Beanpublic Validator validator() {LocalValidatorFactoryBean factoryBean new LocalValidatorFactoryBean();// 国际化factoryBean.setValidationMessageSource(messageSource);// 设置使用 HibernateValidator 校验器factoryBean.setProviderClass(HibernateValidator.class);Properties properties new Properties();// 设置 快速异常返回properties.setProperty(hibernate.validator.fail_fast, true);factoryBean.setValidationProperties(properties);// 加载配置factoryBean.afterPropertiesSet();return factoryBean.getValidator();} }③ 在对应的服务下创建国际化资源文件 ④ 在接口入参对象上添加占位符然后测试保存用户接口 NotBlank(message {SystemUserDto.Username.NotEmpty})UniqueUsernameprivate String username;PostMappingpublic ResultLong save(RequestBody Validated SystemUserDto systemUserDto) {Long idsystemUserService.createUser(systemUserDto);return Result.ok(id);}⑤ 创建异常处理器用于捕获参数验证异常并返回统一数据结构 package com.tps.cloud.handler;import com.tps.cloud.response.Result; import org.springframework.http.HttpStatus; import org.springframework.validation.BindException; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.List;/*** 全局异常处理器MethodArgumentNotValidException*/ RestControllerAdvice public class GlobalExceptionHandler {/*** validation Exception (以form-data形式传参)* param exception* return Result*/ExceptionHandler({ BindException.class })ResponseStatus(HttpStatus.BAD_REQUEST)public Result bindExceptionHandler(BindException exception) {ListFieldError fieldErrors exception.getBindingResult().getFieldErrors();return Result.failed(fieldErrors.get(0).getDefaultMessage());}/*** validation Exception* param exception* return Result*/ExceptionHandler({ MethodArgumentNotValidException.class })public Result handleBodyValidException(MethodArgumentNotValidException exception) {FieldError fieldError exception.getBindingResult().getFieldError();return Result.failed(String.format(%s, fieldError.getDefaultMessage()));} }⑥通过Apifox测试通过Header传递国际化参数Accept-Language参数(en-US,zh-CN)模拟参数username为空状态 ⑦ 现在模拟异常抛出国际化首先在保存接口添加用户账号唯一校验(记得去除掉上节添加的UniqueUsername注解防止被影响) private final MessageSourceAccessor messages;PostMappingpublic ResultLong save(RequestBody Validated SystemUserDto systemUserDto) {//验证用户唯一SystemUserVo systemUserVosystemUserService.findByUsername(systemUserDto.getUsername());if(systemUserVo!null){return Result.failed(messages.getMessage(SystemUserDto.Username.Exist));}Long idsystemUserService.createUser(systemUserDto);return Result.ok(id);}国际化配置文件添加SystemUserDto.Username.Exist 通过Apifox测试通过Header传递国际化参数Accept-Language参数(en-US,zh-CN)模拟参数username重复存在的情况。
http://www.hyszgw.com/news/102595/

相关文章:

  • 发布软文是什么意思seo高级教程
  • 有什么网站做任务换q币吗换物网站为什么做不起来
  • 打开自己的网站是别人的域天津建设银行招聘网站
  • 玉溪住房和城乡建设局网站网站注册地查询
  • 免费视频网站大全怎么修改网站上传附件大小
  • 网站营销最大的特点用自己的服务器做网站
  • 河池市住房城乡建设网站手机版在线公章制作生成
  • 中小型企业网站开发免费做网站的方法
  • 网站如何更换空间青海城乡与建设厅网站
  • 做网站用什么语言编写工程门户网站建设
  • 新浪云计算 网站开发建设旅游电子商务网站的目的
  • 舆情监测系统深圳seo网站设计
  • 模版网站怎么做新媒体营销和传统营销的区别
  • 乐云网站建设流行网站开发框架
  • wordpress 图片问题网站seo工具
  • 酒店网站开发回扣自己的淘宝网站怎么建设
  • 网站开发项目项目运营网络营销策划方案展示
  • 做视频网站用什么服务器网页编辑如何添加图片
  • 百度网站开发业务大型网站建设套餐
  • 郏县住房和城乡建设局网站网站制作西安
  • 深圳做网站网络营销公司排名网站开发报价明细表
  • 网站建站什么目录哪个网站可以做翻译兼职
  • 冀州网站优化网站后台管理系统怎么上传
  • 河北网站seo外包交友软件
  • 医疗网站优化公司中国美食网站模板免费下载
  • 公司找网站做宣传做账抓取网站后台
  • 建设书局 网站初中学历怎么提升大专学历
  • 做公司网站解析阳江市人才招聘网
  • 长沙五百强企业名单游戏优化大师下载安装
  • 企业进行网站建设的方式有学网站建设与维护