从Setting.settings到Resource.resx

之前由于经验不足,将常用的App提示信息串(string)放置在了配置文件中(*.Settings)。目前需要将App国际化,对这些信息的翻译有两个途径:
  1. 直接翻译,将参数中的提示信息串用英文或者其他语言替换。这在语义上是改变了App的配置参数。
  2. 将这些提示信息串提取出来,放入资源文件,统一对资源文件进行国际化。
个人更倾向于第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

从Setting.settings到Resource.resx的相关文章

VS C#开发中WinForm中Setting.settings的作用

1.定义 在Settings.settings文件中定义配置字段.把作用范围定义为:User则运行时可更改,Applicatiion则运行时不可更改.可以使用数据网格视图,很方便: 2.读取配置值 text1.text = Properties.Settings.Default.FieldName; //FieldName是你定义的字段 3.修改和保存配置 Properties.Settings.Default.FieldName = "server"; Properties.Sett

c#app.config 与 Settings.settings

本篇博客将介绍C#中Settings的使用. 首先介绍一个桌面程序中的例子,当我们新安装一个软件,软件启动后会有例如新手指导等窗体弹出来,每次都需要自己去关闭它.当然这些软件都会提供例如不再显示等功能.当选择不再显示功能后,这些窗体以后再也不显示了. 对于这些设置,可以采用下面的一些方法来存储,自定义XML文件,注册表,当然还可以是C#中自带的Settings文件.推荐使用Settings文件.注册表轻易不要使用,自定义XML在使用时需要解析,可以当备选方案. 下面通过一个例子来展示, 新建一个

scrapyd schedule.json setting 传入多个值

使用案例: import requests adder='http://127.0.0.1:6800' data = { 'project':'v1', 'version':'12379', 'setting':['ROBOTSTXT_OBEY=True','CONCURRENT_REQUESTS=32'] } resp = requests.post(adder,data=data)   问题解决思路: 版本1.2文档中: setting (string, optional) - a Scra

IBatisNet使用教程

 1.是数据持久层,对应.NET方向的有Ibatis.NET,只要用来处理数据库表结构和程序实体之间映射,ado.net是用来处理和数据库直接通信的,取出数据(object,int,string,dataset,datatable等常规类型),通常程序中如果用到MOEDL实体,都需要手动写代码去做类型转换(把datatable的字段赋值到model对应字段),用了数据持久层,这一部就可以省略了,Ibatis.NET可以直接把数据库表字段映射为实体模型,操作简便了. 2.IBatis.net 是2

ckeditor+ckfinder

官方地址:http://ckeditor.com/ 复制ckeditor和ckfinder的文件夹到项目根路径下 拷贝ckfinder的config.xml到WEB-INF下 <config> <!-- CKFinder : Configuration File - Basic Instructions In a generic usage case, the following tasks must be done to configure CKFinder: 1. Check the

IBatisNet -- 保护你的配置文件及映射文件信息

通常情况下我们在使用IBatisNet的时候,配置文件和映射文件都是暴露在外的,如果能进入到服务器,那么你的程序的操作数据库的SQL语句,数据库连接字符串等信息都将很轻松的被看到,这样是很危险的.然而IBatisnet自身也没有提供配置文件直接加密的方法,但我们可以用变通的方式来尽可能的保护这些文件中的信息.IBatisnet的映射文件等可以指定为内嵌的资源,利用这个我们可以把一些敏感信息写到另外一个配置文件中,并设置这个配置文件的Build Action为embedded Resource.具

P6 Professional Installation and Configuration Guide (Microsoft SQL Server Database) 16 R1

P6 Professional Installation and Configuration Guide (Microsoft SQL Server Database) 16 R1       May 2016 Contents About This Guide...................................................................................... 11 Shared Topics in This Guide .

android内核剖析学习笔记:AMS(ActivityManagerService)内部原理和工作机制

一.ActivityManagerService提供的主要功能: (1)统一调度各应用程序的Activity (2)内存管理 (3)进程管理 二.启动一个Activity的方式有以下几种: (1)在应用程序中调用startActivity启动指定的Activity (2)在Home程序中单击一个应用图标,启动新的Activity (3)按"Back"键,结束当前Activity,返回到上一个Activity (4)长按"Home"键,显示出当前正在运行的程序列表,从

mybatis大框架

MyBatis   开源的数据持久化层框架 实体类与SQL语句之间建立映射关系 一:MyBatis前身是IBatis,本是Apache的一个开源的项目, 基于SQL语法,简单易学 ,是耦合度降低,方便程序调式 二:搭建Mybatis的开发步骤: a:下载mybatis-3.3.3.jar包并导入工程 b.编写MyBatis核心配置文件(configuration.xml) c.创建实体类-POJO d.DAO层-SQL映射文件(mapper.xml) e.创建测试类 读取全局配置文件mybati