2007年05月16日

 

开发国际化的软件要解决不同语言文化下的用户界面、字符串资源、日期货币显示格式等的本地化问题,除了日期货币等不同国度的显示格式外,都是关于维护一个资源集合的问题。集合中有针对不同语言文化的资源,包括用户界面的显示内容与方式,翻译好的字符串资源,声音资源,图片资源等。其实日期货币格式也是一个集合,只不过系统不是做为一个资源集合的方式来支持。

.NET为本地化工作提供了许多便利。例如Form有一个Bool属性Localizable,打开后可以为Form选择不同的Language属性,从而VisualStudio自动建立此Form在不同Language下的资源文件。当Form在设计期时,通过切换不同的Language属性就可以设计各个本地化版本。VisualStudio还可以识别不同Language下的规范命名,自动将各个Language版本的资源分别编译生成为一个个的Satlite Assembly,并生成在正确的资源搜索路径上,而且为Form生成的C#代码,可以在启动时根据线程环境选择正确的资源,并且在初始化界面元素时使用资源中的内容。基本代码如下:

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main));//自动完成根据环境加载正确资源,支持Fallback

resources.ApplyResources(this.button1, "button1");//所有的界面元素都会使用资源进行初始化

resources.ApplyResources(this, "$this");

 

而没有打开LocalizableForm初始化代码如下:

this.Text = "Form1";

 

.NETSDK中还提供了WinRes.exe,实现在VisualStudio之外对Form的各个本地化版本进行翻译、修改。

 

以上的内容在微软文档及参考书中都可以找到,但是如何实现软件中的非Form元素资源的本地化呢?

第一个想到的办法,就是在某个FormRES资源文件中加入其它类型资源,如字符串资源等,但由于这些RES都是由VisualStudio自动生成的,在下次修改Form再次生成时,手工加入的内容不会被保存。

第二个是使用VisualStudio为每个项目自动生成的一个Resource文件,位置在项目文件夹下Properties文件夹内,文件名是Resources.resx。但这如果加入其它语言文化的文件呢?手工方式可以是使用资源编译器编译手工编辑好的资源文件,再使用ALAssemblyLink)将其链接成一个SateliteAssembly。有没有自动办法呢?

在解决方案管理器中无法向Properties文件夹添加文件,所以只能手工添加,方法是先将Resources.resx复制重命名为类似Resources.zh-CN.resx的本地化资源文件名,再手工修改项目文件,如果使用C#就是扩展名为csproj的文件,加入以下内容:

<EmbeddedResource Include="Properties\Resources.zh-CN.resx">

<SubType>Designer</SubType>

</EmbeddedResource>

重新打开项目后,在解决方案管理器中就可以看到新加入的资源文件了,而且可以打开编辑。分别在Resources.resxResources.zh-CN.resx中添加一个字符串资源,内容分别为英文和中文,运行程序后可以看到已经根据环境显示本地化字符串了。而且支持Fallback,即删除Resources.zh-CN.resx中的对应字符串后,程序会自动显示Resources.resx中的内容。

 

这样就可以在程序开发过程中,根据默认的资源开展本地化工作,将内容保存到对应的资源文件中,VisualStudio会自动将规范命名的资源文件生成对应的SateliteAssembly

 

VisualStudio还为Resources.resx自动配置成生成StronglyTyped类,这个类只要生成一次就行了,使用它访问资源会自动支持多个SateliteAssembly

2007年04月01日

 

在网通和电信两大集团签订了竞合协议后,各地执行都出现了非常类似的“问题”。非主导方继续发展业务,主导方采取非常手段,主要是制造互联互通障碍,相关报导出现在网上,如杭州网通电话被掐背后

 

源文档 <http://tech.sina.com.cn/t/2007-03-20/10381424310.shtml> 。

2003年发布的《关于进一步加强电信市场监管工作的意见》

 

源文档 <http://tech.sina.com.cn/it/e/2003-08-28/1156226496.shtml>

这个法规性文件中明确规定了违反互联互通将受到严厉制裁,而正在两大集团签订协议后,通信管理局却对有明显事实依据的互联互通事件听之任之,两个公司之间的协议的执行可以采取违反国家法律法规的方式吗?

想起在普法教育中学到的基本口号:“有法可依,有法必依,执法必严,违法必究”,看似简单,落实起来是相当的困难,法制化的道路还很漫长。

现在再看一下竞合协议中的2.3款“保证网间互联畅通”就更是个笑话了。遵守国家法律法规需要约定吗?如果法律法规都不能保证得到履行,那商业协议还需要遵守吗?企业还有什么诚信可言?

这件事的过程非常典型,双方各在自己的主导区域做与对方一样的事情,你违法我也违法,这样的结果就是“法不则众”,法律解决不了的就按自己的规则处理。

 

 

2007年03月28日

 

今天走在路上,想着一个使用配置文件保存对象配置的问题,突然冒出这么个想法:把读取到的配置保存在一个对象中,这个对象的类就叫Pill,这个对象就叫RedPill,然后被配置的对象有一个方法叫做EatPill,将Pill类的对象做为参数。

这样当被配置的对象Eat不同的Pill时,就可以具有不同的能力。

Blue pill or red pill?What’s your choise?

2007年03月26日

 

古语有云,工欲善其事,必先利其器。一般意义上来说,这句话是正确的。但凡事不能走极端,而我发现现实生活中将这句话执行到“极致”的例子很多。

访问一个摄影论坛,关于器材的讨论是必不可少的,从中可以发现很多初学者,在摄影知识、技艺都很一般的时候,将很多的精力投入到器材的选择。我就是这么一个人。一直希望能拥有一部自己的相机,在挑选时花很多时间比较各型号的性能、特点,最终挑选了一部笨重且具有很多手动功能的相机。用了两年,用得最多的是两个档位:全自动,连续摄像。

也许是因为职业的原因,程序员不喜欢做简单重复的事情。如果有那么一件事是不可以自动化的,就变得那么不可忍受。如果这类事情是例行的工作,就会被偷工减料地完成,直到实现一种工具,可以“创新”地完成工作为止。

程序员喜欢研究各类开发工具、平台、不同的语言,不停地追求更方便、更高效、更轻松得工作,哪怕这样的研究花费了更多的时间。

访问一个软件开发论坛,关于开发工具的讨论非常多,很多的初学者也会加入进来,评论哪种工具、哪种语言更优秀,其实他们只是从别的途径读到了关于这些工具和语言的评论,自己还没有深入地了解和比较。

对软件工具的追求也延伸到对硬件设备的追求,哪怕设备只是用来看书,也要主频高的、内存大的。。

对于“器”的追求有点过火了,还是把更关心点“事”方面吧。工具器材在很多时候是锦上添花,而真正创造出作品才是目标。

 

2007年03月23日

 

OneNote可以很方便的将图片粘贴到内容中,但是从OneNote向博客网站提供的编辑器导入时就必须一张一张上传了。而且OneNote中的图片不能一次性导出,必须先粘贴到Word中,再另存为HTML网页,在网页的附属文件中可以找到内容中包含的所有图片。

 

有更好的方法吗?

刚试过“爱搞搞”,从OneNote粘贴过去后,再上传,图片仍然是指向本地电脑磁盘。不行。

 

今天在SourceForge上闲逛,选中了一个开源项目Startup-Manager,通过SVN下载了源码,想了解一下此类软件的实现原理。在读它的帮助时,谈到Windows(除Win2K外)自带了一个系统配置程序-msconfig,在Win2003系统中信手在运行中打了一下,果然运行起来。界面如图。

 

这个软件在开始菜单中找不到入口,可能是因为操作具有一定的风险,被有意地隐藏了起来。

2007年03月17日

 

Subversion是一种版本控制系统,对于软件开发人员来说,这种系统的功用是最熟悉不过的。它可以将软件开发过程中的各种文档包括代码保存起来,同时提供对这些文档的各种变更情况的记录保存,还支持多人开发时的冲突解决。

实际上Subversion不仅对软件开发人员有用,也可以用到普通办公环境中,只是一般的电脑用户不知道它的作用。比如将电脑中编辑的文档统一保存在Subversion中,每次修改完毕后就CheckIn一下,如果要取消以前做过的修改,回复到以前的内容,可以将那个时点的文档CheckOut出来,毕竟一般的办公软件只可以Undo现在打开着的文档中的变更,而不可以Undo已保存并关闭的文档中的所做的变更。

我的这种需要就很迫切,我的电脑中经常保存着象“××××20060215”这种方式命名的文档,因为这类文档往往要做数天才能完工,而这数天中会几经变更,每次的变更都可能要回退。如果我将文档保存在Subversion中,就不用这样保存文件了。

同时文档的备份也会十分方便,只要定期CheckIn工作文件夹,就可以将文件夹中变更的文档及新增的文档都保存到Subversion的库中去。

如果办公使用多台电脑,比如一台台式机,一台笔记本。每台电脑的工作文件夹都与Subversion的库相关联,回家时只要将文档CheckOut到笔记本的工作文件夹,在做了修改后进行Commit。而在台式机中进行Update即可。

也许这样的方式只有Geeks认为“很方便”。

忽然发现Word是支持版本管理的,可以在一个文档中保存多个版本。

 

      尝试来尝试去,还是选用OneNote来写博客。虽然不能自动上传,但手工操作不复杂,也可以避免解决一些“爱搞搞”自动上传的问题。

    毕竟,写博做重要的是写什么内容,而不是用什么工具写。

2007年01月20日

网络让世界变平了,让我可以访问的资源遍及全球,所以在遇到问题时,首先是上网搜一搜,看有没有现成的解决方法。Google等搜索引擎的功能虽然已经很强大,但真正想搜出结果还是要费一番周折的。而且搜到的结果,还需要实际使用验证一下,是不是真的可以满足要求。

在几个搜索-试用-再搜索-再试用的循环之后,问题可能可以解决,但时间也花费了不少,如果自己去想一个解决的方法,自己动手写一个小程序,可能用的时间也差不多,也许还更省。

想要在全球范围内避免重新发明轮子真是困难啊!

学习也是一样。如果想看书,每天都有大量的材料可供阅读,与几年前对某本技术书籍求之若渴而买不到相反,现在是大量的优秀内容躺在书架或硬盘上睡觉。每天不断的读啊读,突然发现读了这么多却没有了自己的思考时间,没有了消化应用的时间,没有了以前那种边读边想,融汇贯通的乐趣。

在全球信息共享的今天,自己的思想刚刚形成就已贬值。几经周折研究出来的成果,可能只是重新发明了轮子。

2007年01月01日

又是新的一年。

新旧交替的时候,人的感情总是十分敏感。昨天是2006年的最后一天,感觉有点失落,这一年这么快就过去了。今天是2007年的第一天,感觉充满希望,又一个365天开始了。

这个时候是最想珍惜生命的时候,希望今年不是在无意义的忙碌中度过,每一天都要活得精彩!