前言:
这篇文章只针对后台返回的数据, 本地数据除外
处理方式1(一般都会选这种)
我们发送网络请求的时候, 带一个语言类型参数, 例如 map.put("language", "ZH"), 我们需要什么语言就传什么语言类型, 正常接收返回值就可以了.
这样做的好处:
①. 对于android端, 新增、修改、删除语言时也只需改变一个字段的值即可, 这个字段可以使用接口来控制值, App完全可以不用任何修改, 灵活性较高.
②. 对于整个项目而言: 前端("android", "IOS", "小程序", "公众号") 等多个端, 完全无需做任何判断, 只需后台处理好即可, 总体可以节约不少时间.
处理方式2 (希望大伙别碰到这种情况)---记录一下
后台把所有的语言数据一起返回, 可能出现如下格式:
"{Person:{'ZH':{'id': '1'}, 'EN':{'id': 'one'}}}"
"{User:{'ZH':{'name': '黎'}, 'EN':{'name': 'li'}}}"
"{'ZH':{'date': '2020'}, 'EN':{'date': '2020'}}"
同行的人看到了肯定会说: 叫后台改成第一种方式啊.
如果是项目刚刚开始开发, 可能比较好改.
我碰到的情况是: 一开始项目没有做android端, 后台和web端已经上线了不知道多少个版本了, 反正就是后台架构已经确定了, 这个时候改成本会比较大. 只能自己处理了.
这个时候处理方式:
"{'ZH':{'id': '1'}, 'EN':{'id': 'one'}}" //以这个格式为例子
① 如果按照原来的方式: GsonFormat.如下图:
这样是可以解析出来的, 看起来项目也能正常运行, 但是每个接口都这么做的话, 维护起来难度太大了, 项目越大越难维护, 例如:新增一种语言, 竟然要全局大改. 有100个接口就要改100个实体类, 等等.
![](https://img.haomeiwen.com/i13519092/3035943da7a8faa8.png)
②. 特殊处理
思考: 有什么办法可以和第一种方式一样, 修改一个参数就可以全局改变语言?
观察: 共同点: 多语言的实体类里面都会有变量名为"ZH" "EN" 的对象, 对象不确定类型, 这个时候想到用泛型. 于是有下面的写法:
public class LanguageBean<T> {
T ZH; //中文
T EN; //英文
public T getZH() {
return ZH;
}
public void setZH(T ZH) {
this.ZH = ZH;
}
public T getEN() {
return EN;
}
public void setEN(T EN) {
this.EN = EN;
}
/**
* 取对应的语言数据
* @return
*/
public T get(){
String languageType = "ZH"; //语言类型(可抽取为全局变量)
switch (languageType){
case "ZN":
return ZH;
case "EN":
return EN;
}
return (T)this;
}
}
我们的实体类都有这个特性, 所以直接继承即可.
public class LPerson extends LanguageBean<LPerson>{
String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
解析
String json = "{'ZH':{'id': '1'}, 'EN':{'id': 'one'}}";
LPerson lPerson = new Gson().fromJson(json, LPerson.class);
String id = lPerson.get().getId(); //取数据
解析数据类型2
String json = "{person:{'ZH':{'id': '1'}, 'EN':{'id': '2'}}}";
LTest iTest = new Gson().fromJson(json, LTest.class);
String id = iTest.getPerson().getId();
public class LTest{
LPerson person;
public LPerson getPerson() {
return person.get(); //关键
}
public void setPerson(LPerson person) {
this.person = person;
}
}
特殊处理步骤:
①. 封装好多语言基类LanguageBean<T>
②. 多语言实体类继承LanguageBean<T>
③. 获取多语言实体数据时, 要用bean.get()获取对象.
好处
①. 增删改语言, 只需在基类LanguageBean<T>修改即可, 其它地方完全不需要修改.
②. 切换语言时: 只需赋值给languageType即可.
③.可切换回方式1(网络请求的时候, 带一个语言类型参数), 只需languageType = "" 即可.
封装好以后, 即使后台要重构, 使用方式1处理多语言, 我们也只需修改一个字段即可.
网友评论