C# winform 多语言(json)方式实现

前后对比

使用nuget json工具包

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.总体思路

创建对应的json字典对照表

{
   
"测试":"Test",
"语言":"Language",
"设置":"Set",
"中文(默认)":"Chinese (default)",
"英文":"English",
"标签测试":"Label Test",
"主界面-标题":"Main Title",
"组合框":"group box",
"选择框":"checkBox",
"单选按钮":"radioButton",
"列标题1":"ColumnHeader1",
"列标题2":"ColumnHeader2",
}

加载对应 json文件

/// <summary>
/// 当前项目文件夹Debug\Language\参数文件夹
/// </summary>
/// <param name="language">配置文件所在文件夹名</param>
public static void LoadLanguage(TransType transType, string language = "")
{
   
    if (string.IsNullOrEmpty(language))
    {
   
        language = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
    }

    resources = new Dictionary<string, string>();

    string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, 
                              string.Format("Language/{0}.json", language));
    if (File.Exists(dir))
    {
   
        LoadFile(transType, dir);
    }
}

/// <summary>
/// 配置文件加载
/// </summary>
/// <param name="path">配置文件绝对路径(包括文件本身)</param>
public static void LoadFile(TransType transType, string path)
{
   
    var content = File.ReadAllText(path, Encoding.UTF8);
    if (!string.IsNullOrEmpty(content))
    {
   
        var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(content);
        foreach (string key in dict.Keys)
        {
   
            if(transType == TransType.cn_en)
            {
   
                // 中文转英文
                if (!resources.ContainsKey(key))
                {
   
                    resources.Add(key, dict[key]);
                }
                else
                    resources[key] = dict[key];
            }
            else if(transType == TransType.en_cn)
            {
   
                // 英文转中文
                var value = dict[key];
                if (!resources.ContainsKey(value))
                {
   
                    resources.Add(value, key);
                }
                else
                    resources[value] = key;
            }
        }
    }
}

设置窗口语言

/// <summary>
/// 遍历翻译 窗体或控件及其子控件
/// </summary>
/// <param name="control">需要翻译的控件或窗体</param>
public static void InitLanguage(Control control)
{
   
    SetControlLanguage(control);
    // 循环所有控件
    foreach (Control ctrl in control.Controls)
    {
   
        InitLanguage(ctrl);
    }

    //工具栏 或者菜单动态构建窗体或者控件的时候,重新对子控件进行处理
    control.ControlAdded += (sender, e) =>
    {
   
        InitLanguage(e.Control);
    };
}

/// <summary>
/// 控件及子控件翻译
/// </summary>
/// <param name="control">需要翻译的控件</param>
public static void SetControlLanguage(Control control)
{
   
    if (control is ComboBox)
    {
   
        // ComboBox 转换
        ComboBox combox = control as ComboBox;
        int curSelect = combox.SelectedIndex;
        string[] NewItems = new string[combox.Items.Count];
        for (int i = 0; i < combox.Items.Count; i++)
        {
   
            if (resources.ContainsKey(combox.Items[i].ToString()))
            {
   
                NewItems[i] = resources[combox.Items[i].ToString()];
            }
            else
                NewItems[i] = combox.Items[i].ToString();
        }

        combox.Text = (resources.ContainsKey(combox.Text)) ? resources[combox.Text] : combox.Text;

        combox.Items.Clear();
        combox.Items.AddRange(NewItems);

        combox.SelectedIndex = curSelect;
    }
    
    else if (control is TreeView)
    {
   
        //control is 其他控件或者特殊控件 如:TreeView
    }
    else if(control is ListView)
    {
   
        // ListView 标题修改
        var listView = control as ListView;
        for (int i = 0; i < listView.Columns.Count; i++)
        {
   
            string titleName = listView.Columns[i].Text.ToString();
            if (resources.ContainsKey(titleName))
            {
   
                listView.Columns[i].Text = resources[titleName];
            }
        }
        
    }
    else
    {
   
        control.Text = (resources.ContainsKey(control.Text)) ? resources[control.Text] : control.Text;
    }
}

完整代码包

链接:https://pan.baidu.com/s/1FXS5X4O5vBrKykgdSmAj3w
提取码:c7p0

相关推荐

  1. js实现字符串转json对象的四种方法

    2024-02-03 07:26:03       10 阅读
  2. Android主界面Tab实现方式

    2024-02-03 07:26:03       19 阅读
  3. c语言线程队列实现

    2024-02-03 07:26:03       40 阅读
  4. Go语言中如何实现

    2024-02-03 07:26:03       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-03 07:26:03       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-03 07:26:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-03 07:26:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-03 07:26:03       18 阅读

热门阅读

  1. 微信小程序如何控制元素的显示和隐藏

    2024-02-03 07:26:03       25 阅读
  2. Acwing---2816. 判断子序列

    2024-02-03 07:26:03       27 阅读
  3. Go语言中...(三个点)的使用几个常见情况

    2024-02-03 07:26:03       26 阅读
  4. qt编程---->qml

    2024-02-03 07:26:03       29 阅读
  5. node版本对应的npm版本

    2024-02-03 07:26:03       30 阅读
  6. PyQt子线程处理业务事件

    2024-02-03 07:26:03       31 阅读
  7. Ubuntu 安装 Docker 详细步骤

    2024-02-03 07:26:03       34 阅读
  8. nuxt.js中使用axios以及二次封装

    2024-02-03 07:26:03       29 阅读