C# 在C中创建多语言应用程序

C# 在C中创建多语言应用程序,c#,winforms,localization,C#,Winforms,Localization,我的申请是用英语写的,我想把它换成多语言版本。但我给了我的应用程序一个名为langauge的ToolStripMenuItem,并为阿拉伯语、韩语和英语版本添加了一个子菜单,而不是用户在区域设置中更改默认语言 据我所知,需要做三件事: 在该语言的click事件中编写代码,使用阿拉伯语 创建相应的resx文件 我还将Form localizable属性设置为True 这是我在Form1中添加到程序中的代码 //this variable indicates the current language

我的申请是用英语写的,我想把它换成多语言版本。但我给了我的应用程序一个名为langauge的ToolStripMenuItem,并为阿拉伯语、韩语和英语版本添加了一个子菜单,而不是用户在区域设置中更改默认语言

据我所知,需要做三件事:

在该语言的click事件中编写代码,使用阿拉伯语 创建相应的resx文件 我还将Form localizable属性设置为True 这是我在Form1中添加到程序中的代码

//this variable indicates the current language in use
    CultureInfo CurrentLocale;

    public Form1()
    {
        InitializeComponent();
        valueInit();
        //MessageBox.Show(rfidCard.PORT + "");
    }


    //Lets start adding the multilingual code here




    //change the language in real time 
    private void ChangeLanguage(string lang)
    {
        CurrentLocale = new CultureInfo(lang);
        foreach (Control c in this.Controls)
        {
            ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
            resources.ApplyResources(c, "$this");
            RefreshResources(this, resources);
        }
    }

    //refresh all the controls e sub-controls of the form 
    private void RefreshResources(Control ctrl, ComponentResourceManager res)
    {
        ctrl.SuspendLayout();
        res.ApplyResources(ctrl, ctrl.Name, CurrentLocale);
        foreach (Control control in ctrl.Controls)
            RefreshResources(control, res); // recursion
        ctrl.ResumeLayout(false);
    }

    private void englishToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ChangeLanguage("en-US");
    }

    private void arabicToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ChangeLanguage("ar-SA");
    }

    private void koreanToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ChangeLanguage("ko-KR");
    }

    // the code ends here
其次,我添加了一个名为Form1.ar-SA.resx的resx文件,在该文件中,仅为测试添加了两个内容:

$this.Text=Abc Mالب㶤㶤㶤㶤㶤㶤㶤

$this.Name=Form1

然而,当我运行我的应用程序并尝试点击阿拉伯语时,它仍然不会改变任何东西

有人能帮我找到哪里出了问题,或者我错过了什么

在default.resx中,我还发现了另一个专栏

$this.Type=System.Windows.Forms.Form,System.Windows.Forms,版本=2.0.0.0,区域性=neutral,PublicKeyToken=b77a5c561934e089

这有什么区别吗

EDIT1:在浏览时,我发现我还需要生成一个designer.cs文件来响应它。搜索引擎谈到安装了一些RazorGenerator。我尝试从包管理器安装它,但失败了。有这个灯吗


EDIT2:这就是我所做的。我创建了另外两个.resx文件,一个用于韩语,另一个用于阿拉伯语,并尝试更改形式语言,在编码视图中效果非常好。然而,仍然缺少一些东西。首先,我仍然无法根据需要通过单击工具条语言选项来更改语言。其次,我甚至试图将我的系统的语言环境更改为韩语,但应用程序没有收到任何更改。它总是以英文显示,你应该使用system.globalization来解决这个问题,你不必创建资源文件,只需更改表单中的语言并开始编辑,但为什么它不会影响你呢

因为,c在重置应用程序后会执行此操作,所以您应该保存有关应用程序状态的数据,然后重新启动应用程序,然后使用所需的本地化重新加载应用程序。如果你不想这样做,不要使用全球化,按行设置整个ui,
Sry在我的状态下,我在公交车上不能给你确切的代码,但这是你应该怎么做的,应用程序。重新启动我想或者附近的某件事:谢谢你的建议。下面是我所做的。我创建了另外两个resx文件,一个是韩语的,另一个是阿拉伯语的,并尝试按照您的建议更改形式语言,效果非常好。然而,仍然缺少一些东西。首先,我仍然无法根据需要通过单击工具条语言选项来更改语言。其次,我甚至试图将我的系统的区域设置更改为韩语,但应用程序没有收到任何更改。是的,你不能按照你的意愿这样做,但关于另一件事,我认为有一个本地化类告诉你哪个本地化用户在他的系统上,如果你没有找到留言,我今晚退房,现在是1点,我6点回来。。。CyaSry昨晚头痛,我不确定,但我认为这是您应该在开始时执行的代码:system.threading.thread.CurrentThread.CurrentCalture=system.globalization.CaltureInfoen-CA;我在整本书中没有找到其他代码,还有一件事要做,你可以将所有资源存储在单独的空项目中,一旦你需要特定的资源,然后加载特定的程序集,但我自己我从来没有这样做过,也没有简要的解释