这是我2010年左右,写 Winform IDE (http://www.cnblogs.com/sheng_chao/p/4387249.html)项目时延伸出的一个小项目。

最初是以共享软件的形式存在的。

  

后来忙于其它事情,没有精力再去打理,就被雪藏至今,最近抽了几天时间,把软件里的注册验证相关逻辑都去掉了,以完全免费的形式发布,希望对大家有用。

痛点:

通常我们为了让软件支持多语言,会使用 .NET 自带的资源文件来存储不同的语言资源,在程序中加载和调用,但是对于大型工程或者团队开发,包括不断演进的版本,会让多语言开发十分的麻烦,存在许多不可控的因素,比如以下几点:

1)过去的资源调用方式主要是以字符串作为key来获取,而开发人员在获取资源时,可能出现拼写错误; 
2)修订资源文件时,对原有资源文件标识进行了修改,而未能同步到程序的各处; 
3)修订资源文件时,误删原有资源条目,或删除误认为已不在使用中但确仍在某处需要的条目。
4)无法得知某条资源文本的使用情况:是否在使用,是否在多处使用。
5)增加语言资源时,难以保证各语种资源完全同步,尤其在是资源数量较大,修订次数较多时;

如果使用字符串作为key的方式来调用资源,以上问题都无法在项目编译时作静态检查,也就是说出了错误很难发现。

此外还有两个问题,让开发过程中处理资源文件十分的麻烦:

1)在 VisualStudio 中直接编辑资源文件,只能一个文件一个文件的单独编辑,比如中文和英文两个资源文件,我需要打开两个独立的窗口分别编辑,要来回切换,并且最最重要的是,VisualStudio 不会去检查你的两个资源文件中的条目,是不是一一对应的,它们之前没有什么联系和映射之类的关系,其中一个资源文件中多了一条或少了一条,或是KEY不小写拼写错了,都是不知道的;

2)没有好的与翻译人员协调的方法,如资源的导入、导出、自动检查;没有好的办法把语言资源交给翻译人员,并导回来,而且在导回来时,几千条甚至更多的资源条目,有没有疏漏,误删除,没有办法知道。

分析与构想:

我们分析 .NET 自带的资源机制,其在将资源存储在资源文件中后,会生成一个对应的 Designer.cs 文件,如果有多个语言版本的资源文件,就生成多个对应 的 Designer.cs,但就是没有将他们抽象起来。

当时我想,如果能够用接口(Interface)把不同的资源文件的实体类,约束起来,在程序中使用时,放弃 Language.Get("key") 这种方式,而是转而使用接口来调用,就可以解决上面1到5点的问题,形成如下结构:

那么在代码中,就完全解决了上文中1~5的问题。

对比,引用一个不存在的资源条目:

好了,核心需求就解决了。

那么对于用户界面的部分,怎么样加载资源呢?其实相当简单,并不需要开发人员一个一个去设置,在WinForm中,只需要写一个公共类,检索UI上符合指定格式的字符,将其替换为当前资源即可,如:

如果是 WPF 项目,直接使用静态资源绑定即可,比 WinForm 更加简单。

还剩两个可用性的问题:

第1个,怎样又好又快的同时编辑多个版本的语言资源?

对于 Visual Studio ,多个不同的资源文件是分别编辑的,问题上文已经说明:我需要要来回切换分别编辑,并且最最重要的是,VisualStudio 不会去检查你的两个资源文件中的条目,是不是一一对应的。

所以我在写 SailingEase .NET Resources Tool 时,把不同的资源文件编辑集中到了一起,在一个画面中同时编辑多个不同的资源文件,当我添加一个新的资源文件条目时,只要操作一次即可,不用打开每个资源文件添加一遍(真的很麻烦):

第2个问题:怎样与翻译人员协作

上文提到了,想到的最好的方式是导入导出 Excel,并且在导回来时,能效验一下,这个并不复杂:

我在软件中添加一个区域,比如“德语”,软件会自动生成一个德语的资源列表,这一列的内容现在是空白的,我可以把当前的资源,连同原语言版本(如中文),导出Excel,交给翻译:

导出的 Excel 中,包括中原语言(如中文),还包括了 Comments,这样翻译人员在翻译时,有参照有备注,就很方便,翻译完毕后,再回到软件中导入即可。

提高效率的辅助功能:

资源行复制:

例如,A项目包含“中文”、“英文”,B项目包含“英文”、“法文”,那么从A项目向B项目中复制资源行时,能够自动将A项目中的英文资源粘贴到B项目的英文资源中,中文资源则被忽略。哪怕两个项目只是区域信息的顺序不同,亦能自动匹配。

实时错误检查:

有问题的资源会实时标注出来,在生成的时候会给出提示:

Visual Studio 里如果复制资源行的Key是重复的,会不断的弹框强制你先改掉,不然光标就移不走,但实际上做多语言编辑的时候,我有时需要一连复制很多行,然后再修改它们的Key,这就很讨厌了,所以我自己写这个工具的时候,就允许在有错误的时候光标移走,也不强制必须先改掉,而是给出标注,只是在生成代码的时候,阻止生成。

Visual Studio 中的错误提示:

同时编辑多个项目

在实际工程中,我是一个 Module 对应一个资源工程,所以同时编辑多个工程就是必须的,否则就很麻烦:

导入既有的资源文件(resx文件或resources文件):

欢迎画面,可以直接打开最新的项目:

对了,新建工程之后不要忘记添加区域:

最后,在软件中编辑好资源后,需要生成代码,可以生成C#或VB.NET的代码,也可以仅仅生成资源文件:

将生成的资源文件和代码引入工程中使用:

下载:

我没找到博文添加附件的地方,需要的朋友可移步到我的网站上免费下载:

http://www.shengxunwei.com

欢迎加我QQ交流探讨,共同学习:279060597,另外我在南京,有南京的朋友吗?

[免费了] SailingEase .NET Resources Tool (.NET 多语言资源编辑器)的更多相关文章

  1. [源代码] SailingEase .NET Resources Tool (.NET 多语言资源编辑器)

    我在2016年10月发过一篇博客,介绍了我写过的一个多语言资源文件编辑器,并且做为免费软件发布给了出来. 陆续收到了一些朋友的反馈,有朋友很热心提了很多建议和关心的话,还有朋友发红包过来,让我很感动. ...

  2. SailingEase .NET Resources Tool (.NET 多语言资源编辑器)转

    转自:http://www.cnblogs.com/sheng_chao/p/5958846.html 软件下载链接 痛点: 通常我们为了让软件支持多语言,会使用 .NET 自带的资源文件来存储不同的 ...

  3. 【Unity3D】Unity3D之 Resources.Load 动态加载资源

    [Unity3D]Unity3D之 Resources.Load 动态加载资源 1.Resources.Load:使用这种方式加载资源,首先需要下Asset目录下创建一个名为Resources的文件夹 ...

  4. 在build中配置resources,来防止我们资源导出失败的问题

    <!--在build中配置resources,来防止我们资源导出失败的问题--> <build> <resources> <resource> < ...

  5. struts.custom.i18n.resources 如何配置多个资源文件?

    struts.custom.i18n.resources = resources1,resources2,resources3   配置properties文件

  6. MAVEN 工程打包resources目录外的更多资源文件

    首先,来看下MAVENx项目标准的目录结构: 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,ma ...

  7. 免费利用网页版谷歌翻译实现任意语言转换php版

    本文源发布地址: http://ourgarden.cn/2013/07/20/%E5%85%8D%E8%B4%B9%E5%88%A9%E7%94%A8%E7%BD%91%E9%A1%B5%E7%89 ...

  8. unity3d Resources.Load动态加载资源

    初步整理并且学习unity3d资源加载方法,预计用时两天完成入门学习Unity3d常用两种加载资源方案:Resources.Load和AssetBundle Resources.Load就是从一个缺省 ...

  9. Windbg and resources leaks in .NET applications 资源汇总

    Windows Forms Leaks 1.http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-informatio ...

随机推荐

  1. ABP文档 - 目录

    ABP框架 概览 介绍 多层结构 模块系统 启动配置 多租户 集成OWIN 共同结构 依赖注入 会话 缓存 日志 设置管理 时间 领域层 实体 值对象(新) 仓储 领域服务 工作单元 领域事件(Eve ...

  2. 千呼万唤始出来,微软Power BI简体中文版官网终于上线了,中文文档也全了。。

    前几个月时间,研究微软Power BI技术,由于没有任何文档和资料,只能在英文官网瞎折腾,同时也发布了英文文档的相关文章:系列文章,刚好上周把文章发布完,结果简体中文版上线了.哈哈,心里有苦啊,早知道 ...

  3. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  4. pt-pmp

    pt-pmp有两方面的作用:一是获取进程的堆栈信息,二是对这些堆栈信息进行汇总. 进程的堆栈信息是利用gdb获取的,所以在获取的过程中,会对mysql服务端的性能有一定的影响. 用官方的话说: Thi ...

  5. 破解SQLServer for Linux预览版的3.5GB内存限制 (UBUNTU篇)

    在上一篇中我提到了如何破解RHEL上SQLServer的内存大小限制,但是Ubuntu上还有一道检查 这篇我将会讲解如何在3.5GB以下内存的Ubuntu中安装和运行SQLServer for Lin ...

  6. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

  7. 以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程

    最近由于项目部署时需要更灵活的控制程序安装的流程以及自定义安装行为,特意研究了一下VS程序打包,把解决办法和大家分享一下. 以VS2010为例: 这是一个已经设置好最基本的Visual Studio ...

  8. ASP.NET MVC5----常见的数据注解和验证

    只要一直走,慢点又何妨. 在使用MVC模式进行开发时,数据注解是经常使用的(模型之上操作),下面是我看书整理的一些常见的用法. 什么是验证,数据注解 验证 从全局来看,发现逻辑仅是整个验证的很小的一部 ...

  9. SHA-1算法

    SHA-1.h #ifndef _SHA1_H #define _SHA1_H #include<iostream> using namespace std; //4个函数 #define ...

  10. UML图中经常用到几种的关系图例

    学习这个东西挺奇怪的,时间一长就容易忘记,或者记不清楚.今天看到一些UML图的关系,发现有些出入了,索性就写下来,以后再忘记的时候过来看看. 在UML的类图中,常见的有以下几种关系: 继承(Gener ...