之前由于经验不足,将常用的App提示信息串(string)放置在了配置文件中(*.Settings)。目前需要将App国际化,对这些信息的翻译有两个途径:
- 直接翻译,将参数中的提示信息串用英文或者其他语言替换。这在语义上是改变了App的配置参数。
- 将这些提示信息串提取出来,放入资源文件,统一对资源文件进行国际化。
个人更倾向于第2个方案。一是因为语义上比较一致;二是可以将资源统一处理。更可以建立新的DLL项目,将资源放置在DLL中。采用第2个方案需要两个步骤:1.将Settings中的名值对提取出来;2.将名值对生成为资源文件。如下Code,提取出名值对,以key=value的形式保存在中间文件(.txt)中。该中间文件能够被Resgen.exe进行识别,利用resgen.exe生成C#强类型的资源文件。 *资源文件生成器 (Resgen.exe) 将文本(.txt 或 .restext)文件和基于 XML 的资源格式 (.resx) 文件转换为公共语言运行时二进制 (.resources) 文件,后者可嵌入到运行时二进制可执行文件或附属程序集中。 示例Code如下: /// <summary> /// 将制定的参数集合以名值对的形式转储到制定的文本文件(utf-8)中。 /// </summary> /// <param name="stettings">参数集合</param> /// <param name="txtPath">输出路径</param> /// <exception cref="System.IO.IOException"></exception> public static void DumpSettingsToKvTxt(SettingsPropertyCollection stettings, string txtPath) { using (var fio = new StreamWriter(txtPath, true, Encoding.UTF8, 2048)) { foreach (var p in stettings) { var sp = p as SettingsProperty; fio.WriteLine($"{sp.Name}={sp.DefaultValue.ToString()}"); } fio.Flush(); } } /// <summary> /// resgen Hello.resource.txt /str:cs Hello.resource.resx /// </summary> /// <param name="txtPath">名值对的txt文本</param> /// <param name="resxName">目标强类型(C#/cs)*.resx资源文件</param> public static void ConvertKvTxtToResx(string txtPath, string resxName) { try { System.Diagnostics.Process.Start(@"resgen.exe", $"{txtPath} /str:cs {resxName}"); }catch(Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } }
var txt = "Hello.resource.txt"; var resx = "Hello.resx"; DumpSettingsToKvTxt(Properties.Settings.Default.Properties, txt); DumpSettingsToKvTxt(Properties.Hints.Default.Properties, txt); ConvertKvTxtToResx(txt, resx);
可以将多个*.settings全部统一存到最终的*.resx,但此代码没有考虑到名值对重复的问题。转换之后,直接添加.resx文件到工程即可。
reference:
[1] Resgen.exe, https://msdn.microsoft.com/zh-cn/library/ccec7sz1(v=vs.110).aspx
时间: 2024-12-04 12:14:00