c#循环类中的所有方法并赋值

时间:2014-07-10 23:54:09

标签: c# winforms ini nini

我有一个包含所有按钮,标签的表单,我打算使用INI文件进行多语言支持。我创建了Lang Class以保持价值,如果用户更改语言,即时更新而无需重启程序。

我目前的代码:

private  void  LangGet(string  LangID)
{
IConfigSource  Lng = new  IniConfigSource(Globals.Path.FolderLang  +  "\\"  +  LangID  +  ".ini");

  //  Set
  var  g = Lng.Configs["general"];
  Lang.Id.General.OK = g.GetString("OK");
  Lang.Id.General.Cancel = g.GetString("Cancel");
  Lang.Id.General.Error = g.GetString("Error");
  ...
  Lang.Id.General.lblStart = g.GetString("lblStart");
...

我希望代码更有效率,但我不知道如何......

IConfigSource Lng = new IniConfigSource(Globals.Path.FolderLang + "\\" + LangID + ".ini");
var g = Lng.Config["general"];
forloop ( ... )
{
    item = g.GetString(item);
}

如果更强大

IConfigSource Lng = new IniConfigSource(Globals.Path.FolderLang + "\\" + LangID + ".ini");
forloop ( ... )
{
    forloop ( ... )
    {
        TheName = Lng.Config[TheClass].GetString(TheName);
    }
}

加载INI加载到Variable后,控制文本的时间获得变量值

forloop ( control )
{
    forloop ( class )
    {
        if ( control name contain btn )
        {
            item.Text = Lng.Configs[TheClass].GetString(item.name?);
        }
        if ( control name contain lbl )
        {
            item.Text = Lng.Configs[TheClass].GetString(item.name?);
        }
        // So On...

1 个答案:

答案 0 :(得分:0)

我找到了答案......所以我回答了自己,

使用Ini-parser而不是Nini ...

使用INI文件制作多语言,编译后允许编辑语言,便于校正。

而是每个控件编写代码,使用循环来完成他们的工作

CreateLang();将使用控件名称为Ini Key

扫描您的所有表单及其子级

LoadLang();将扫描所有表单控件,一旦Ini Key等于控件名称,Value将适用于控件。

在设计过程中,所有控件必须更改为{0}或多行{0} {1} {2}

代码:

    private void frmMain_Load(object sender, EventArgs e)
    {
        CreateLang(); // Create new empty language
        //LoadLang(); // Load language, GUI must use {0} {1} ... as place-holder
    }

    private void LoadLang()
    {
        var parser = new FileIniDataParser();
        IniData data = parser.ReadFile("eng.ini");

        Control ctrl = this;
        do
        {
            ctrl = this.GetNextControl(ctrl, true);

            if (ctrl != null)
                if (ctrl is Label ||
                    ctrl is Button ||
                    ctrl is TabPage ||
                    ctrl is CheckBox)
                    if (data["Root"][ctrl.Name].Contains('|')) // Character | donated by New-Line, \n
                        ctrl.Text = String.Format(ctrl.Text, data["Root"][ctrl.Name].Split('|'));
                    else
                        ctrl.Text = String.Format(ctrl.Text, data["Root"][ctrl.Name]);

        } while (ctrl != null);

    }

    private void CreateLang()
    {
        if (System.IO.File.Exists("eng.ini"))
            System.IO.File.WriteAllText("eng.ini", "");
        else
            System.IO.File.WriteAllText("eng.ini", "");

        var parser = new FileIniDataParser();
        IniData data = parser.ReadFile("eng.ini");

        data.Sections.AddSection("Info");
        data.Sections["Info"].AddKey("Name", "Anime4000");
        data.Sections["Info"].AddKey("Version", "0.1");
        data.Sections["Info"].AddKey("Contact", "fb.com/anime4000");

        string main = "Root";
        data.Sections.AddSection(main);

        Control ctrl = this;
        do
        {
            ctrl = this.GetNextControl(ctrl, true);

            if (ctrl != null)
                if (ctrl is Label ||
                    ctrl is Button ||
                    ctrl is TabPage ||
                    ctrl is CheckBox ||
                    ctrl is GroupBox)
                    data.Sections[main].AddKey(ctrl.Name, "");

        } while (ctrl != null);


        parser.WriteFile("eng.ini", data);
    }