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框架快速为项目添加国际化支持相关推荐

  1. ExtAspNet学习-利用AppBox框架快速创建项目(五)—完成项目含源代码

    我们前边四个部分已经完成了框架需要的基础配置, 现在我们来完成项目 1.Subsonic 配置,首先在OraSurvey.DAO中添加App.config配置相关信息 View Code 1 < ...

  2. 如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇) - 广州.net微软技术俱乐部12月份活动报名帖...

    这是广州.net微软技术俱乐部12月份活动报名帖.此帖会持续更新. 活动课程标题是:如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇) 这是内容大纲: ABP框架简介(这里会聊聊.net真 ...

  3. 如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理...

    这篇文章介绍一下,如何使用VS2017给asp.net core添加容器支持,并发布镜像到私有docker hub,然后用chart管理容器镜像的操作流程. 话不多说,just do it. 新建项目 ...

  4. 【完结】给新手的12大深度学习开源框架快速入门项目

    文/编辑 | 言有三 这是一篇总结文,给大家来捋清楚12大深度学习开源框架的快速入门,这是有三AI的GitHub项目,欢迎大家star/fork. https://github.com/longpen ...

  5. 如何为你的项目添加国际化配置(umi@3的国际化实践)

    本文主要是针对基于umi@3的前端框架的国际化方案 国际化的项目,之前实践的很少,上次踩了一次坑,发现不少问题,在这里总结一下,希望大家能提前感知,避免踩坑. 国际化要做什么事? 国际化要求从产品中抽 ...

  6. 为React应用添加国际化支持

    国际化一般可分为以下几个挑战: 1.检测用户的语言环境; 2.翻译UI元素.标题和提示; 3.提供特定于地区的内容,如日期.货币和数字. 在本文中,我将只关注前端部分.我们将开发一个简单的通用Reac ...

  7. 向.NET Core项目添加EntityFrameworkCore支持

    目录 介绍 创建解决方案和项目 配置数据库和模型 添加迁移和更新数据库 总结 参考 介绍 我每天都在使用EntityFramework,但我不会每天向现有项目添加EntityFramework(EF) ...

  8. Java web项目添加Struts2支持的步骤

    今天开始学习Struts2了,Struts2使用了MVC的设计模式,使Java web应用层次更分明,是非常流行的一种框架,下面我记录在Java web应用中添加Struts2支持的几个步骤: 一.在 ...

  9. 如何用ABP框架快速完成项目(2) - 快的定义!

    为什么要从快的角度来讲这系列课程呢? 因为快是一个很统一很清晰的标准. 所有人对时间都有一个统一清晰的概念.  比如说这系列课程会讲到的一个实例: 集成LinqToExcel, 用我的方法大概耗时1个 ...

  10. maven Web项目添加数据源支持,包括Oracle、Mysql

    pom.xml 支持jkbc: <dependency><groupId>org.springframework.boot</groupId><artifac ...

最新文章

  1. 窗体的ControlBox属性
  2. 笛卡尔树 (25 分)笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字
  3. 欲善其事,先利其器 | IDCF第6期DevOps案例研究回顾(附视频)
  4. 将Java向前推进? 一个定义。 一年回顾。
  5. 潘石屹没跑,他去学 Python 了
  6. Windows Server 2016 配置指南 之 安装 PHP redis 拓展
  7. 常见的HTTP状态码说明
  8. 智能优化算法:引力搜索算法-附代码
  9. 夜间灯光数据dn值_黑夜给了我黑色的眼睛——全球夜间灯光数据分析
  10. EJB是什么,以及weblogic和tomcat的区别
  11. Kaldi的安装与测试
  12. 【老九】【Python】函数与模块
  13. 关于阿里云的一键部署工具【飞流】的使用(详细)
  14. Android集成Facebook登录时遇到的问题invalid key hash.the key hash
  15. 老男孩教育 | 0基础学习三个月的心得分享!
  16. AE(ArcGIS Engine)的安装与配置(附加ArcGIS安装及所需安装包)
  17. 机电管线综合布置的原则分析
  18. 负数分解质因数java_Java分解质因数
  19. 安⽐(SECBIT)实验室携⼿路印(Loopring)共同发布智能合约风险列表
  20. mysql更新多字段sql_SQL UPDATE 更新语句用法(单列与多列)

热门文章

  1. java中BOM是什么_Java处理带BOM的文本情况是什么?
  2. 3ds Max 布尔(Boolean)运算——象棋的制作
  3. linux gst-launch-1.0测试音视频
  4. 视频目标分割数据集DAVIS(Denly-Annotated VIdeo Segmentation)解读
  5. Android 8.1 MTK平台 强制第三方 APP 横屏(微信、今日头条等)
  6. 排水注水java_小学数学重难点:关于《水池注水排水问题》例题详解,考试必备...
  7. 云网融合赋能智慧转型,“天翼云管 ”开启贴身云管家时代
  8. 关闭默认共享-关于Windows的默认共享介绍
  9. Spine 2D骨骼动画教程-完整实例入门教程
  10. Mac 终端连接和操作服务器常用命令