多语言的2种实现方式对比

时间:2021-03-22 15:52:14

分别尝试过2种多语言的实现方式:1.文件、2.资源包。

一、简要说一下实现过程

1、文本

主要是以文本形式存储key-value键值对,然后用工具类Localizer负责加载对应的文件:en-US或zh-CN

_Confirm=Confirm //en-US
_Confirm=提示 //zh-CN

MessageBox.Show(Localizer.Instance["_Confirm"]); //使用的时候

2、资源包

这是微软默认的实现方式,主要是生成对应的资源包*.resources.dll,并通过ApplyResources加载。

//在设计器->属性里,设置
Localizable = true;
Language = 英语(美国);

改完之后,会自动生成一个form.en-US.resx,编译后生成对应的资源包*.resource.dll。

//使用的时候
var res = new ComponentResourceManager(form.GetType());
res.ApplyResources(form, "$this");
foreach (var ctl in form.Controls) {
   res.ApplyResources(ctl, ctl.Name);
}

二、做个对比

  1、文本 2、资源包
功能 只能支持文本和位置,但位置调整很不方便,暂不支持图片(需要序列化),无法支持动态列 能很好的支持文本、位置、图片,且调整方便,无法支持动态列
子系统的工作量 是资源包的3倍,en-US/zh-CN都要手写,子类里要覆写LanguageChanged事件 只需新增其他语言如en-US,默认的语言不用动,也不用覆写事件
不实现该功能时,对子系统的影响 必须正确实现所有key-value,否则界面上会显示key值
容错性(子系统实现有误时,系统是否会出错) 低,子系统必须正确实现所有key-value,如果遗漏,界面上会出现不正确的描述。界面变更时,也容易产生遗漏 高,如果有遗漏,就显示默认语言
灵活性(发布后是否可以任意修改) 高,子系统甚至用户都可以随时修改不合适的翻译,不需要再次编译 低,每次修改后都必须重新编译生成并发布
可维护性 不需要针对新的控件做特殊处理 需要针对新的控件如Dx等补充相应的ApplyResources代码,需要逐步完善
适用范围 较广,语言无关 只针对.net下的应用,因为有一整套自动生成代码、资源本地化工具、类库的支持

三、小结

以.net的应该来说,推荐使用方式2,功能全面也很方便,毕竟功能和工作量才是我们关心的大头,还是印证了那句话,微软的东西要用就用全套。