2022年8月31日

通用多语言方案(1)

通用多语言方案(1)

经过实际项目需求打磨,多语言的要求如下

客户所处环境为zh-cn,环境为en-US,实际用户为不确定,可能是北韩,也能是南韩,也可以东京南,也可以大板北.,操作系统为Windows内核为主,版本从Win98到WinXP,从Win7到Win8,从Win10到Win11,服务端为2008R2/2012

注:微软给我们提供的多语言区域是根据Windows系统所处区域,以及系统初始化安装语言来选择的,但是实际有小语种的区分,

有三种方案,分别是我均踩过坑的,分别是现在流行的PO方案,第三方工具法,资源文件大法

PO方案大法

可参考开源软件:NAPS2(http://www.naps2.com)

该软件的作者很久以前就写了个自动翻译并生成PO文件的代码,并根据PO文件,自动加载多语言资源,我也是参考此作者的开源代码进行了多语言的探索

代码可参考NAPS2.Localization这个,里面写的很详尽了.

切换界面上的语言的代码可在NAPS2.Core\WinForms中找到

第三方工具

曹旭升:http://www.cnblogs.com/sheng_chao/p/5958846.html

曹大佬的工具也是生成资源文件,并加载资源文件内容,具体使用教程不详述,

ResXManager:https://marketplace.visualstudio.com/items?itemName=TomEnglert.ResXManager

资源文件

传统的WinForm,先将窗体的Localizable属性设置为True,再将language属性设置为目标语言,切换到窗体设计界面,对现有的内容进行人肉编辑

但是以上的种种方法均存在2个问题,

1.无法翻译枚举类型,

2.多值显示,即Key/Value组合的数据,多种显示,有下拉框,以及GridView/DataGrid控件

用我的场景解释是,客户是简体中文,操作系统是美式英语,但是操作人员可能是韩国或者朝鲜,甚至还分具体区域,比如说美国,英国,日本等

还有返回的信息,可能提示信息是中文,但是返回的报错信息必须是中文或者英文,因为维护人员是客户,操作员是不分国籍的.

枚举类型的翻译方案选择参考的是<--青青子衿-->的这篇博客https://www.cnblogs.com/jiangyan219/articles/12120552.html

多值显示也即他写的这个方法

使用如下,在枚举文件中加入,

这样的扩展方法,[Display(ResourceType = typeof(DisplayEnumCode), Name = "Pallet")]

需要加入using System.ComponentModel.DataAnnotations;命名空间,此命名空间从3.5时代就有,是ASP.NET框架中的,所以本方法不限版本.

接下来就是编辑并生成,DisplayEnumCode.resx文件,怎么生成如何生成,就都是人肉级别的代码,不多叙述

生成后,可使用ResXManager翻译,半自动人工AI的话可使用百度翻译的API进行翻译.

需要注意的坑点:

1.ResXManager要选择窗体资源文件,人肉翻译要导出为Excel,打开Excel后,需要取消锁定,再进行人肉翻译,翻译完成导入(导入前建议删除掉资源文件正在编辑的资源文件内容),并且控件会进行重新序号,

第三方控件包会自动生成字段的,需要二次加工翻译

2.ResXManager的半自动AI翻译,无法访问是常有的事儿,但是他们默认使用的都是半专业AI的翻译引擎,专业词汇会词不达意,让你哭笑不得,所以请使用人工翻译进行校正,可使用付费专业翻译,或者AI专业翻译,百度翻译,有道,科大讯飞,搜狗翻译

当然也有在线人工翻译的网站,具体水平只能说钱是好东西,但是能找对专业人士才是本事.

3.WinForm的翻译效果以及界面布局,都是需要实际测试的,跟系统设置,以及窗体的AutoScaleMode设置有关系,所以在进行翻译后,建议你切换到你翻译的语言下,针对的重新设置窗体的控件位置以及字体大小

4.字体的选择也很重要,如果选择的字体在语言环境中没有,那你看到的都是火星文或者方块,或者是烫烫烫,请使用微软雅黑字体,此字体全世界微软操作系统都自带默认有,如没有,那你的操作系统版本需要安装兼容多个语言的字体

即有英文和中文,以及韩文显示的.

5.每个多语言所选择的字符集也有区分,并不是和区域挂钩的,所以出现乱码的情况下,并不是统一设置为UTF-8就能解决,而是要去历史悠久的网站找找该死的某国人为什么要使用小语种的字符集(就是宇宙国和大和民族),不是用国际通用的UTF-8或者UTF-16

6.就是中文的话,也有不同的字符集,包括简体中文,所以请问我阿姆卢*刘秀秀,中间那个点会不会是个乱码呢?所以存储的时候一定要切忌这点,否则就是个棍棒伺候,解决办法是查询字符集,这也是个难点.

7.谁敢给自己的中文名称里取个NULL,或者使用不同字符集的特殊符号,请拖走该用户,并友好提示查无此人

8.大佬的方案肯定经过不少项目实战,但是有不少坑点,方案最新的,不一定适合我们国人,请使用人肉翻译以及多个翻译引擎的不同翻译,去校正自己的翻译内容,不然就是挨揍的份儿,更严重的说不得了,所以请注意程序和你之间一定有一个必定是你能跑

9.金额等问题,我没经历过,但是知道部分类型并不通用,且有精度差值,所以用什么类型,并无定论,所以我没有解决方案,但是我知道使用字符串肯定没毛病 ,反正计算的方法不在我这里,谁死就不管了哦

10.以上提到的所有方法均适用Windows操作系统环境,均以C#语言,WinForm为主,第三方控件为主

提供两个好用的扩展方法,也是从开源网站获取以及各大博客园博主的类库中提取,分别是获取上文中的描述属性,以及转为String转为枚举类型

ToDescription方法是扩展了任意的枚举,可在枚举类型.ToDescription中获取到枚举类型的描述字段内容,以此类推,可以尽情获取需要的类型

ToEnum方法是扩展了String类型,可"".ToEnum<枚举类型>()自动将任意字符串转为对应的枚举类型.

public static string ToDescription(this Enum value)
{
    if (value == null) return string.Empty;

    System.Reflection.FieldInfo fieldInfo = value.GetType().GetField(value.ToString());

    object[] attribArray = fieldInfo.GetCustomAttributes(false);
    if (attribArray.Length == 0)
        return value.ToString();
    else
        return (attribArray[0] as DescriptionAttribute).Description;
}

public static T ToEnum<T>(this string value, T defaultValue = default(T)) where T : struct
{
    if (!typeof(T).IsEnum)
    {
        throw new ArgumentException("Type T Must of type System.Enum");
    }

    T result;
    bool isParsed = Enum.TryParse(value, true, out result);
    return isParsed ? result : defaultValue;
}

 

posted @ 2022-08-31 18:06 澜紫癜青 阅读(212) 评论(0) 推荐(0) 编辑

2019年9月8日

win10系统vs2008环境wince项目无法创建问题

摘要: 文章备份,原文来自百度某个作者的博客。 昨晚,当我升级win10之后,发现系统使用还是挺顺畅的,没有当初升级win8的时候那么多错误。 但是今晚回来之后,发现之前win8.1下已经安装好的vs2008中处于开发中的wince项目无法加载了,不停的报错,忽略错误之后,凡是wince项目都是加载失败,其 阅读全文

posted @ 2019-09-08 20:21 澜紫癜青 阅读(339) 评论(0) 推荐(0) 编辑

2019年6月19日

工作满十年了

摘要: 仅仅是发个博客记录下 阅读全文

posted @ 2019-06-19 22:22 澜紫癜青 阅读(248) 评论(2) 推荐(0) 编辑

2015年1月26日

让Vs2013 完美支持EF6.1 Code First with Oracle 2015年12月24日更新

摘要: 本文是对下文的补充,切勿以为我是全盘复制哦连接:http://www.cnblogs.com/wlflovenet/p/4187455.html Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE ... 阅读全文

posted @ 2015-01-26 18:48 澜紫癜青 阅读(7593) 评论(16) 推荐(6) 编辑

2013年3月11日

AjaxControlToolkit AjaxFileUpload 为英文的解决办法

摘要: 下载AjaxControlToolkit的源代码 在ajaxcontroltoolkit-a2a6dc6854e0\Client\MicrosoftAjax.Extended\ExtenderBase\BaseScriptsResources.zh-CHS.resx里按照例子 如下修改 浏览 ... 阅读全文

posted @ 2013-03-11 18:09 澜紫癜青 阅读(635) 评论(0) 推荐(0) 编辑

2012年11月29日

NPOI 菜鸟实践行之导入Excel(一)

摘要: 例程excel来自群里的MM提供的,来自某次帮助,翻版必究 我们菜鸟用NPOI遇到的最常见的问题就是如何将一个excel文件内容导入到数据库中,我仅仅讲解如何利用NPOI读取excel文件中的内容并且导入到sqlserver数据库的例子,导入excel文件内容到数据库,可以参考 效率最高的Excel... 阅读全文

posted @ 2012-11-29 20:43 澜紫癜青 阅读(6399) 评论(7) 推荐(0) 编辑

2012年8月30日

NPOI导入导出excel好帮手之excelhelper

摘要: 菜鸟入门前,老师或者前辈都会给我们一个sqlhelper类,呵呵,园子里的好人其实有很多,我就贡献一个原作者为柳永法大大,经过很多园子里的朋友修改,最后由NPOI超级群里的阿修罗提供给我的最初的excelhelper版本的升级版本给大家,附带一个集合类转DataTable(版权来自园子里,我也不记得... 阅读全文

posted @ 2012-08-30 17:41 澜紫癜青 阅读(6267) 评论(1) 推荐(1) 编辑

2012年8月20日

NPOI 菜鸟实践行之根据指定的模板生成Excel Chart (一)

摘要: 参考文章:http://www.cnblogs.com/atao/archive/2009/10/25/1589606.html 原文还存在1点问题,是如果用名称的话,会有非空列在图形上显示 阅读全文

posted @ 2012-08-20 19:38 澜紫癜青 阅读(913) 评论(0) 推荐(0) 编辑

2012年6月23日

NPOI 菜鸟实践行之根据指定的模板生成Excel 2003格式的文件 (一)

摘要: 感谢群里的各位朋友的指导和教学,感谢Tony Qu的热心指导,感谢阿修罗兄提供的Excelhelper类 谈谈个人对Excel的理解,结合NPOI,个人水平一般般,菜鸟一只 Excel 打开后,分为sheet-文件簿,Rows-行,Cell-单元格 要基于模板生成EXCEL,首先我们要明白的是我们... 阅读全文

posted @ 2012-06-23 23:00 澜紫癜青 阅读(3573) 评论(2) 推荐(3) 编辑

2012年5月25日

NPOI实践之判断单元格是否为日期

摘要: NPOI1.25之后的版本已经内置有IsCellDate函数来判断是否是日期,所以本文就提供给大家参考与学习。 NPOI 1.25 之后,判断单元格是否为日期的函数为IsCellDateFormatted,在NPOI.SS.UserModel.DateUtil下; if (DateUtil.IsCe... 阅读全文

posted @ 2012-05-25 15:12 澜紫癜青 阅读(4224) 评论(4) 推荐(0) 编辑

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示