作者:@Ryan-Miao
本文为作者原创,转载请注明出处:www.cnblogs.com/woshimrf/p/…
目录
简单使用
#情形一 只有一个Resource Bundle
#情形二 我有多个Resource Bundle
#情形三 我有多个Resource Bundle但读取翻译的时候我想一起
#情形4
引入easy-i18n
添加Resource Bundle
新建MessageService
在IoC中提供ResourceBundleMessageSource
测试
前言
Dropwizard官方文档并没有提供国际化的模块,所以只能自己加。Spring的MessageResource用的很顺手,所以copy过来。
Easy i18n
在整合Dropwizard的时候,多语言貌似只能通过jdk自带的ResourceBundle拿数据。其实也就够了,但在开发过程中发现需要缓存,需要解析占位符等。代码越写越多,显然不是仅仅一个调用就完事的。写的差不多的时候突然觉得和spring context里的message source结构类似。于是,放弃维护已经开始变的复杂的逻辑,直接使用spring。
但选取dropwizard的时候就是摒弃了spring,再拿过来也不好玩了。干脆,抽取Spring context项目的MessageResource相关代码,重写封装了一个library: github.com/Ryan-Miao/e…, 欢迎star。
easy-i18n还是和在Spring项目中相同。
首先,引入依赖,由于github项目的library已经有仓库去维护了,就没费心思放到maven和jcenter了,直接从github上拉取。类库地址为:
1 | 复制代码`<repositories>` |
引入
1 | 复制代码`<dependency>` |
简单使用
#情形一 只有一个Resource Bundle
在resources下新建i18n/messages.properties
以及i18n/messages_zh_CN.properties
. demo位置:l4dropwizard
然后,调用方法如下:
1 | 复制代码`@Test` |
#情形二 我有多个Resource Bundle
实际项目中,由于产品分类,有时候需要创建多个Resource Bundle,这时候也简单,只要创建多个ResourceBundleMessageSource
来读取翻译即可。
1 | 复制代码 |
#情形三 我有多个Resource Bundle但读取翻译的时候我想一起
有时候,想要读取翻译,可能翻译文件在不同的Resource Bundle,但我指向用一个接口去调用。这时候,做法时候在这几个Resource Bundle的里面添加命名空间,即key要在这几个Resource Bundle里唯一,而不仅仅是本文件唯一。
然后,
1 | 复制代码 |
这种做法,会一次从两个Resource Bundle里寻找翻译,找到即返回。因此,如果有相同的key,将导致只有第一个生效。
#情形4
没有了,你翻译要那么复杂吗。
更多用法,参考测试类:ResourceBundleMessageSourceTest
Demo source
本文是基于dropwizard入门之上的演进。
确保依赖都是最新的,或者自行解决版本冲突,比如jackson不同版本之间的类有所不同。
引入easy-i18n
repository url
1 | 复制代码`<repositories>` |
引入
1 | 复制代码`<dependency>` |
添加Resource Bundle
在resources下新增文件夹i18n
, 依次添加几个Resource Bundle。具体做法是,在文件夹i18n
右键 -> new
-> Resource Bundle
, 然后选择想要支持的语言。比如美国en_US
,简体中文zh_CN
。
新建MessageService
创建一个Util来处理翻译功能。 com.test.domain.service.IMessageService
1 | 复制代码`package com.test.domain.service;` |
实现类com.test.domain.service.impl.MessageService
1 | 复制代码`package com.test.domain.service.impl;` |
在IoC中提供ResourceBundleMessageSource
由于ResourceBundleMessageSource
是公共组件,需要单独提取出来,并使用单例模式创建。关于IoC的配置,参阅dropwizard中添加DI
在ConfigurationModule
中:
1 | 复制代码`package com.test.domain.ioc.module;` |
这里,关于Resource Bundle的位置没有单独提出来,后面可以放到HelloWorldConfiguration
,提到配置文件中。
测试
在dagger中,接口和实现类的绑定只能通过手动声明。因此,绑定IMessageService
1 | 复制代码`@Singleton` |
创建测试Resource, com.test.domain.resource.LocalResource
1 | 复制代码`package com.test.domain.resource;` |
结果
So do it,and
change it,no regret!
本文转载自: 掘金