使用Whisper框架快速为项目添加国际化支持
Wisper是一个轻量级I18n翻译框架,简单易用,性能出色,并且扩展简单。
让我们看看如何开始使用Whisper!
假设你有一个基于Spring的项目,并且项目的dataSource已经配置好。
可以在下面链接得到Whisper的样例代码
Whisper Demo
准备工作
创建I18n翻译表
在你的服务基于的数据库中,创建一张i18n表,用来存储翻译关系。
如果恰好使用Mysql,你可以直接使用以下脚本创建这张表:
CREATE TABLE `i18n_item` (`i18n_key` varchar(36) NOT NULL,`language` varchar(20) NOT NULL,`i18n_code` varchar(45) NOT NULL,`i18n_name` longtext,`is_enabled` bigint(1) NOT NULL,`is_deleted` bigint(1) NOT NULL,`created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,UNIQUE KEY `index_key_lang_code` (`i18n_key`,`language`,`i18n_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;复制代码
其余数据库的实现我们后续会很快给出,也欢迎大家贡献其他库的实现方式。
添加Maven依赖
将Whisper的Maven依赖加入到项目中。
<dependency><groupId>io.github.benhouse1987</groupId><artifactId>whisper</artifactId><version>1.0.0-SNAPSHOT</version>
</dependency>>
复制代码
初始化翻译Service
这里我们使用一个最基本的初始化方式。
该初始化的Service固定将所有内容翻译成中文。
事实上,你可以直接将这个类复制到你的项目中。
@Configuration
@EnableResourceServer
public class I18nTranslateConfig {@AutowiredApplicationContext applicationContext;@Beanpublic I18nTranslateService init() {//this basic translator service always translate your data in Chinese languagereturn new I18nTranslateService(applicationContext);}}
复制代码
现在,Whisper已经准备完毕!
尝试一下!
Demo 1
将部门名称翻译成中文
首先我们写一个Department类,像这样:
@Data
public class Department {// this is the department id , we will translate the department name by this id@I18nMapping(i18nCode = "id")private Long departmentId;// this is the attribute we need to translate@I18nMapping(i18nCode = "name")private String departmentName;private String description;private Integer level;}复制代码
假如我们希望把部门名称翻译成中文,只需要加两个I18nMapping
注解,分别用来指定待翻译实体的id以及,要翻译的字段。
在i18n_item表中,我们初始化一条中文翻译:
insert into `i18n_item` values ( '1', 'zh_cn', 'name', '中文部门', '1', '0', '2018-08-23 21:41:24');
insert into `i18n_item` values ( '1', 'en', 'name', 'english department name', '1', '0', '2018-08-23 21:41:24');
复制代码
现在让我们看看效果!
在Controller中,添加一个示例的api,这个api中,我们返回一个名称为english department name
的部门:
@Controller
public class DemoController {@RequestMapping(value = "/getOneDepartment")@I18nTranslate@ResponseBodypublic Department getOneDepartment() {Department department = new Department();department.setDepartmentId(1L);department.setDepartmentName("english department name");department.setDescription("english description");department.setLevel(0);throw new RuntimeException("i18n exception test");}
}复制代码
项目运行后,调用该api,你会发现Whisper把departmentName
字段翻译成了中文!
{"departmentId": 1,"departmentName": "中文部门","description": "english description","level": 0
}
复制代码
Demo 2
按指定的语言翻译(比如用户的当前语言)
在Demo 1中,我们总是把任何东西翻译成中文。
如果我们想按照api的调用者语言,返回相应语言的翻译怎么办呢?
非常简单!
创建一个语言翻译工具类,这个类将帮助我们决定按何种语言翻译。
这个类需要实现TranslateToolService 接口。
下面是个简单的示意:
public class MyTranslateToolService implements TranslateToolService {public String getCurrentLanguage() {//some exist logic to get current user language//for example from token or some other tablereturn someClass.getCurrentUserLanguage();}}复制代码
我们需要在I18nTranslateConfig
中,使用新的构造函数初始化I18nTranslateService。
该初始化指定了语言工具类为我们刚才新建的MyTranslateToolService
。
@Configuration
@EnableResourceServer
public class I18nTranslateConfig {@AutowiredApplicationContext applicationContext;@Beanpublic I18nTranslateService init() { return new I18nTranslateService(applicationContext,MyTranslateToolService);}}
复制代码
现在,Whisper将按照MyTranslateToolService.getCurrentLanguage()
方法的返回语言进行翻译!
Demo 3
一个国际化异常的例子
也许你希望将返回的错误信息也按照当前用户的语言来翻译。
使用Whisper框架做这件事情非常简单!
创建一个错误信息DTO
假设我们将errorCode
属性作为i18n的翻译ID。
我们希望将message
属性翻译成不同语言。
只需要加两个I18nMapping 的 annotation,非常简单。
@Builderpublic class ExceptionDetail {@I18nMapping(i18nCode = "message")private String message;@I18nMapping(i18nCode = "id")private String errorCode;}
复制代码
创建一个 ControllerAdvice来处理异常
@ControllerAdvice
public class ResourceAdvice {@ExceptionHandler(RuntimeException.class)@I18nTranslatepublic ResponseEntity<ExceptionDetail> handleValidationException(RuntimeException e) {ExceptionDetail detail = ExceptionDetail.builder().errorCode("e001").message("cccc").build();return new ResponseEntity(detail, HttpStatus.BAD_REQUEST);}
}复制代码
在 i18n_item 表中,初始化两条翻译项。
insert into `i18n_item` values ( 'e001', 'zh_cn', 'message', '中文报错', '1', '0', '2018-08-23 21:41:24');
insert into `i18n_item` values ( 'e001', 'en', 'message', 'english error message', '1', '0', '2018-08-23 21:41:24');
复制代码
现在,你抛出的所有code为e001的报错都将被翻译成指定的语言,修改DemoController自己试一试吧!
@Controller
public class DemoController {@RequestMapping(value = "/getOneDepartment")@I18nTranslate@ResponseBodypublic Department getOneDepartment() {Department department = new Department();department.setDepartmentId(1L);department.setDepartmentName("english department name");department.setDescription("english description");department.setLevel(0);throw new RuntimeException("i18n exception test");}
}复制代码
如何创建i18n翻译项
我们提供了一个简单的api,帮助你维护i18n翻译项,你可以通过这个api轻松地将你的项目与Whisper集成起来。
这里是一段样例代码:
@InjectI18nTranslateService i18nTranslateService;public Boolean createI18nItems(){List<I18nTranslateItemDTO> i18nTranslateItemDTOS = new ArrayList<>();i18nTranslateItemDTOS.add(I18nTranslateItemDTO.builder().i18nKey("1").code("name").language("en").name("department english name").build());return i18nTranslateService.createOrUpdateI18nItems(i18nTranslateItemDTOS);}
复制代码
注意
我们使用i18nKey,i18nCode,language,作为联合唯一索引。所以请保证所有的被指定为i18n id的属性值全局唯一(@I18nMapping(i18nCode = "id"))。 最佳实践是使用UUID作为i18n id,你可能需要为需要翻译的表添加一列i18n_id,并用随机的UUID填充。
转载于:https://juejin.im/post/5b8404b2e51d4538962082bb
使用Whisper框架快速为项目添加国际化支持相关推荐
- ExtAspNet学习-利用AppBox框架快速创建项目(五)—完成项目含源代码
我们前边四个部分已经完成了框架需要的基础配置, 现在我们来完成项目 1.Subsonic 配置,首先在OraSurvey.DAO中添加App.config配置相关信息 View Code 1 < ...
- 如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇) - 广州.net微软技术俱乐部12月份活动报名帖...
这是广州.net微软技术俱乐部12月份活动报名帖.此帖会持续更新. 活动课程标题是:如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇) 这是内容大纲: ABP框架简介(这里会聊聊.net真 ...
- 如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理...
这篇文章介绍一下,如何使用VS2017给asp.net core添加容器支持,并发布镜像到私有docker hub,然后用chart管理容器镜像的操作流程. 话不多说,just do it. 新建项目 ...
- 【完结】给新手的12大深度学习开源框架快速入门项目
文/编辑 | 言有三 这是一篇总结文,给大家来捋清楚12大深度学习开源框架的快速入门,这是有三AI的GitHub项目,欢迎大家star/fork. https://github.com/longpen ...
- 如何为你的项目添加国际化配置(umi@3的国际化实践)
本文主要是针对基于umi@3的前端框架的国际化方案 国际化的项目,之前实践的很少,上次踩了一次坑,发现不少问题,在这里总结一下,希望大家能提前感知,避免踩坑. 国际化要做什么事? 国际化要求从产品中抽 ...
- 为React应用添加国际化支持
国际化一般可分为以下几个挑战: 1.检测用户的语言环境; 2.翻译UI元素.标题和提示; 3.提供特定于地区的内容,如日期.货币和数字. 在本文中,我将只关注前端部分.我们将开发一个简单的通用Reac ...
- 向.NET Core项目添加EntityFrameworkCore支持
目录 介绍 创建解决方案和项目 配置数据库和模型 添加迁移和更新数据库 总结 参考 介绍 我每天都在使用EntityFramework,但我不会每天向现有项目添加EntityFramework(EF) ...
- Java web项目添加Struts2支持的步骤
今天开始学习Struts2了,Struts2使用了MVC的设计模式,使Java web应用层次更分明,是非常流行的一种框架,下面我记录在Java web应用中添加Struts2支持的几个步骤: 一.在 ...
- 如何用ABP框架快速完成项目(2) - 快的定义!
为什么要从快的角度来讲这系列课程呢? 因为快是一个很统一很清晰的标准. 所有人对时间都有一个统一清晰的概念. 比如说这系列课程会讲到的一个实例: 集成LinqToExcel, 用我的方法大概耗时1个 ...
- maven Web项目添加数据源支持,包括Oracle、Mysql
pom.xml 支持jkbc: <dependency><groupId>org.springframework.boot</groupId><artifac ...
最新文章
- 窗体的ControlBox属性
- 笛卡尔树 (25 分)笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字
- 欲善其事,先利其器 | IDCF第6期DevOps案例研究回顾(附视频)
- 将Java向前推进? 一个定义。 一年回顾。
- 潘石屹没跑,他去学 Python 了
- Windows Server 2016 配置指南 之 安装 PHP redis 拓展
- 常见的HTTP状态码说明
- 智能优化算法:引力搜索算法-附代码
- 夜间灯光数据dn值_黑夜给了我黑色的眼睛——全球夜间灯光数据分析
- EJB是什么,以及weblogic和tomcat的区别
- Kaldi的安装与测试
- 【老九】【Python】函数与模块
- 关于阿里云的一键部署工具【飞流】的使用(详细)
- Android集成Facebook登录时遇到的问题invalid key hash.the key hash
- 老男孩教育 | 0基础学习三个月的心得分享!
- AE(ArcGIS Engine)的安装与配置(附加ArcGIS安装及所需安装包)
- 机电管线综合布置的原则分析
- 负数分解质因数java_Java分解质因数
- 安⽐(SECBIT)实验室携⼿路印(Loopring)共同发布智能合约风险列表
- mysql更新多字段sql_SQL UPDATE 更新语句用法(单列与多列)
热门文章
- java中BOM是什么_Java处理带BOM的文本情况是什么?
- 3ds Max 布尔(Boolean)运算——象棋的制作
- linux gst-launch-1.0测试音视频
- 视频目标分割数据集DAVIS(Denly-Annotated VIdeo Segmentation)解读
- Android 8.1 MTK平台 强制第三方 APP 横屏(微信、今日头条等)
- 排水注水java_小学数学重难点:关于《水池注水排水问题》例题详解,考试必备...
- 云网融合赋能智慧转型,“天翼云管 ”开启贴身云管家时代
- 关闭默认共享-关于Windows的默认共享介绍
- Spine 2D骨骼动画教程-完整实例入门教程
- Mac 终端连接和操作服务器常用命令