简介
此项目用于演示如何使用popularmvc提供的响应信息国际化能力。有如下几种场景:
- 错误提示国际化,popularmvc框架层自动处理
- 通过接口语言类型locale参数进行指定,响应信息自动翻译,使用
@LanguageTranslate
注解- 响应信息,翻译成指定语言
@LanguageTranslate(locale = "en_US")
- 使用国际化翻译器手动翻译业务内容,使用国际化管理器
LanguageTranslateManager
手动翻译
项目示例
1 项目结构
-
项目结构
│ pom.xml │ README.md │ └─src ├─main │ ├─java │ │ └─com │ │ └─danyuanblog │ │ └─framework │ │ └─demo │ │ └─popularmvc │ │ │ StartDemoApplication.java │ │ │ │ │ └─controller │ │ │ TestManualTranslteResponseController.java │ │ │ TestTranslateBusinessErrorController.java │ │ │ TestTranslateResponseController.java │ │ │ │ │ └─dto │ │ CustomResponse.java │ │ LanguageInfoDto.java │ │ LicenseDto.java │ │ │ └─resources │ │ application.yml │ │ │ └─i18n │ ├─custom │ │ systemErrorCodeInfo.properties │ │ systemErrorCodeInfo_en_US.properties │ │ systemErrorCodeInfo_zh_CN.properties │ │ │ └─messages │ messages.properties │ messages_en_US.properties │ messages_zh_CN.properties │ └─test └─java └─com └─danyuanblog └─framework └─popular └─mvc
-
引入模块依赖,在
pom.xml
添加
<dependency>
<groupId>com.danyuanblog.framework</groupId>
<artifactId>popular-web-mvc</artifactId>
<version>${popular-web-mvc.version}</version>
</dependency>
2 启用PopularMvc框架
/**
* Title StartDemoApplication.java
* Description
* @author danyuan
* @date Oct 31, 2020
* @version 1.0.0
* site: www.danyuanblog.com
*/
package com.danyuanblog.framework.demo.popularmvc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.danyuanblog.framework.popularmvc.annotation.EnablePopularMvc;
@SpringBootApplication
@EnablePopularMvc
public class StartDemoApplication {
public static void main(String[] args) {
SpringApplication.run(StartDemoApplication.class, args);
}
}
3 配置信息
3.1 项目配置信息
application.yml
spring.messages:
#默认会加载加载i18n/messages/messages字典翻译信息,这里我们再配置自定义国际化系统错误码的字典翻译信息
basename: i18n/custom/systemErrorCodeInfo
3.2 国际化翻译配置信息
你可以选择都配置在默认的
i18n/messages/messages
文件中,也可以分类进行存放。
-
自定义系统错误码国际化翻译
这里只对’
接口未找到
错误码做自定义的翻译systemErrorCodeInfo_en_US.properties
#修改默认的系统错误码提示信息 system.invalidParam=[self-defined]this invalid param{0}[{1}]
systemErrorCodeInfo_zh_CN.properties
#修改默认的系统错误码提示信息 system.invalidParam=[自定义]这是无效参数{0}[{1}]
-
自定义业务错误码国际化
当业务条件不满足时,可以抛出业务错误码提示用户!
messages_en_US.properties
#业务错误码翻译 USER_ACCOUNT_NOT_FOUND=Sorry , The user account[{0}] not found, please check your input. USER_PASSWORD_ERROR=Sorry, Password error.
messages_zh_CN.properties
#业务错误码翻译 USER_ACCOUNT_NOT_FOUND=对不起,你输入的账号[{0}]没有找到,请检查下你的账号哦! USER_PASSWORD_ERROR=对不起,你输入的密码有误,请核对!
-
自定义业务内容国际化翻译
业务执行过程中也可以对业务数据进行国际化翻译,比如商品名字,描述信息等等。
messages_en_US.properties
#业务信息翻译 danyuan.name=danyuan danyuan.info=The universe is invincible, handsome boy! danyuan.tags=Sunshine, positive, love life, embrace change, understand tolerance #只提供了英文版的版权信息,这时候可以指定版权信息只能翻译成英文 LICENSE= license info.
messages_zh_CN.properties
#业务信息翻译 danyuan.name=淡远 danyuan.info=宇宙无敌帅小伙! danyuan.tags=阳光,积极向上,热爱生活,拥抱变化,懂得容忍
4 源码示例说明
4.1 响应信息国际化
我们可以对响应内容的全部字符串信息进行自动国际化翻译,也可以只对其中的某些字段进行国际化翻译。
-
接口源码
TestTranslateResponseController.java
/** * Title TestTranslateResponseController.java * Description * @author danyuan * @date Jan 4, 2021 * @version 1.0.0 * site: www.danyuanblog.com */ package com.danyuanblog.framework.demo.popularmvc.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.danyuanblog.framework.demo.popularmvc.controller.dto.CustomResponse; import com.danyuanblog.framework.demo.popularmvc.controller.dto.LanguageInfoDto; import com.danyuanblog.framework.demo.popularmvc.controller.dto.LicenseDto; @Api(tags = "测试自动翻译响应信息相关接口列表") @RestController public class TestTranslateResponseController { @GetMapping("getLanguageInfo") @ApiOperation(value="测试信息国际化自动翻译整个对象", notes="测试信息国际化自动翻译整个对象") public LanguageInfoDto getLanguageObjectInfo(@RequestParam(name = "info", required = false) String info){ return new LanguageInfoDto(info,"danyuan.name"); } @GetMapping("getLanguageFieldInfo") @ApiOperation(value="测试信息国际化自动翻译某些字段", notes="测试信息国际化自动翻译某些字段") public CustomResponse getLanguageFieldInfo(){ return new CustomResponse("danyuan.name", 22, true, "danyuan.info", "danyuan.tags"); } @GetMapping("getEnglishLicence") @ApiOperation(value="测试获取指定语言的版权信息", notes="测试获取指定语言的版权信息") public LicenseDto getEnglishLicence(){ return new LicenseDto("LICENSE"); } }
-
其他dto信息
CustomResponse.java
/** * Title CustomResponse.java * Description * @author danyuan * @date Jan 3, 2021 * @version 1.0.0 * site: www.danyuanblog.com */ package com.danyuanblog.framework.demo.popularmvc.controller.dto; import java.io.Serializable; import com.danyuanblog.framework.popularmvc.annotation.LanguageTranslate; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @Data @Accessors(chain = true) @AllArgsConstructor @NoArgsConstructor public class CustomResponse implements Serializable{/** *serialVersionUID */ private static final long serialVersionUID = 1L; @LanguageTranslate private String name; private Integer age; private Boolean sex; @LanguageTranslate private String info; @LanguageTranslate private String tags; }
LanguageInfoDto.java
/** * Title LanguageInfoDto.java * Description * @author danyuan * @date Nov 16, 2020 * @version 1.0.0 * site: www.danyuanblog.com */ package com.danyuanblog.framework.demo.popularmvc.controller.dto; import java.io.Serializable; import com.danyuanblog.framework.popularmvc.annotation.LanguageTranslate; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @LanguageTranslate @AllArgsConstructor @NoArgsConstructor public class LanguageInfoDto implements Serializable{ /** *serialVersionUID */ private static final long serialVersionUID = 1L; private String info; private String name; }
LicenseDto.java
/** * Title LicenseDto.java * Description * @author danyuan * @date Jan 4, 2021 * @version 1.0.0 * site: www.danyuanblog.com */ package com.danyuanblog.framework.demo.popularmvc.controller.dto; import java.io.Serializable; import com.danyuanblog.framework.popularmvc.annotation.LanguageTranslate; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class LicenseDto implements Serializable{/** *serialVersionUID */ private static final long serialVersionUID = 1L; @LanguageTranslate(locale = "en_US") private String licence; }
4.2 业务错误自动翻译
异常信息也能自动翻译,无需做任何处理,只需要接口调用者指定自己需要的语言类型即可,框架自动进行转换。
-
接口源码
TestTranslateBusinessErrorController.java
/** * Title TestTranslateBusinessErrorController.java * Description * @author danyuan * @date Jan 4, 2021 * @version 1.0.0 * site: www.danyuanblog.com */ package com.danyuanblog.framework.demo.popularmvc.controller; import javax.validation.Valid; import javax.validation.constraints.NotEmpty; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import com.danyuanblog.framework.popularmvc.exception.BusinessException; @Api(tags = "测试自动翻译业务异常信息相关接口列表") @RestController @Validated public class TestTranslateBusinessErrorController { @PostMapping("getLanguageInfo") @ApiOperation(value="测试登录失败", notes="测试提示账户存在错误") public void login(@Valid @NotEmpty String account, @Valid @NotEmpty String password){ //TODO: 执行业务逻辑 //TODO:当发现账户信息不存在,直接抛出异常即可 if(!"admin".equals(account)){ throw new BusinessException("USER_ACCOUNT_NOT_FOUND").setParam(account); } //TODO:当发现密码错误时,直接抛出异常 if(!"123456".equals(password)){ throw new BusinessException("USER_PASSWORD_ERROR"); } //TODO:组装响应信息,然后返回 } }
4.3 手动翻译
也可以注入
LanguageTranslateManager
语言翻译管理器进行手动翻译。
-
接口源码
TestManualTranslteResponseController.java
/** * Title TestManualTranslteResponseController.java * Description * @author danyuan * @date Jan 4, 2021 * @version 1.0.0 * site: www.danyuanblog.com */ package com.danyuanblog.framework.demo.popularmvc.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import net.logstash.logback.encoder.org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.danyuanblog.framework.popularmvc.LanguageTranslateManager; @Api(tags = "测试手动翻译响应内容接口列表") @RestController public class TestManualTranslteResponseController { @Autowired @Lazy private LanguageTranslateManager languageTranslateManager; @GetMapping("getUserEnDesc") @ApiOperation(value="测试获取用户英文描述信息", notes="测试获取用户英文描述信息") public String getUserEnDesc(@RequestParam(name = "infoDict", required = false) String infoDict){ if(StringUtils.isEmpty(infoDict)){ infoDict = "danyuan.info"; } return languageTranslateManager.get(infoDict, "en_US"); } }