国际化是产品、应用程序或文档内容的设计和开发,它可以为不同文化、地区或语言的目标受众轻松实现本地化。国际化(Internationalization)通常用英文写成i18n,其中18是英文单词中i和n之间的字母数。 任何一个面向全世界的软件都会面临多语言国际化的问题,尤其是跨境电商行业,在做自研系统必不可少的要实现多语言功能,就是在数据展示给用户之前,替换成用户可识别的语言,这里以springi18n国际化来介绍一下。SpringBoot下application。yml basename:以逗号分隔的基名列表(本质上是一个完全限定的类路径位置),每个基名都遵循ResourceBundle约定,对基于斜杠的位置提供宽松的支持,它将从类路径根目录解析。 cacheduration:加载的资源包文件缓存的持续时间。如果没有设置,捆绑包将被永久缓存。如果没有指定持续时间后缀,将使用秒。spring:资源信息messages:encoding:utf8国际化资源文件路径(配置文件路径),多模块也可以用逗号分隔basename:i18nmessages将异常信息写入i18n资源文件 messages。propertiesexception。name。can。not。nullexceptionnamecannotnull,thenameis{0}exception。insertexceptioninsert messageszhCN。propertiesexception。name。can。not。null用户名不能为空,用户名为:{0}exception。insert新增异常工具类I18nUtilsComponentSlf4jpublicclassI18nUtils{如果当前bean不加Component注解,则messageSource无法注入,始终为nullprivatestaticMessageSourcemessageSource;AutowiredpublicvoidsetMessageSource(MessageSourcemessageSource){I18nUtils。messageSourcemessageSource;}解析code对应的信息进行返回,如果对应的code不能被解析则抛出异常NoSuchMessageExceptionparamcode需要进行解析的code,对应资源文件中的一个属性名paramargs当对应code对应的信息不存在时需要返回的默认值return国际化翻译值publicstaticStringi18n(Stringcode,Object。。。args){returnmessageSource。getMessage(code,args,LocaleContextHolder。getLocale());}解析code对应的信息进行返回,如果对应的code不能被解析则返回默认信息defaultMessage。paramcode需要进行解析的code,对应资源文件中的一个属性名paramdefaultMessage当对应code对应的信息不存在时需要返回的默认值paramargs需要用来替换code对应的信息中包含参数的内容,如:{0},{1,date},{2,time}return对应的LocalepublicstaticStringi18nOrDefault(Stringcode,StringdefaultMessage,Object。。。args){returnmessageSource。getMessage(code,args,defaultMessage,LocaleContextHolder。getLocale());}因为i18n方法如果获取不到对应的键值,会抛异常NoSuchMessageException本方法是对i18n方法的封装。当报错时并不抛出异常,而是返回sourceparamsource模板paramargs参数return返回I18n(正常结束)或者source(抛出异常)seei18n(String,Object。。。)NonNullpublicstaticStringtryI18n(NonNullStringsource,NonNullObject。。。args){Stringres;try{resi18n(source,args);}catch(Exceptionignored){ressource;}returnres;}}自定义异常RestControllerAdviceSlf4jpublicclassGlobalExceptionHandler{ExceptionHandler(CommonException。class)publicApiResponseObjecthandleCommonException(CommonExceptione){log。error(e。getMessage(),e);returnnewApiResponse(1,error,e。getMessage());}}应用ServicepublicclassUserService{ResourceprivateUserDaouserDao;publicvoidinsertUser(UserQouserQo){UserEntityuserEntityuserDao。findByName(userQo。getName());if(Objects。nonNull(userEntity)){i18n带有参数StringnameuserQo。getName();thrownewCommonException(exception。name。can。not。null,name);}userEntitynewUserEntity();BeanUtils。copyProperties(userQo,userEntity);userEntity。setCreateTime(newDate());intcountuserDao。insert(userEntity);if(count1){i18n不带有参数thrownewCommonException(exception。insert);}}}结论 这里只是简单的演示了springi18n的功能,可以满足一些简单场景的需求,可以适当扩展,比如:如果使用了nacos等配置中心,则需要去注册中心手动拉取i18n的properties文件内容,并加载到应用程序的内存里。