Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行时本地化_C#_.net_Winforms_Localization - Fatal编程技术网

C# 运行时本地化

C# 运行时本地化,c#,.net,winforms,localization,C#,.net,Winforms,Localization,我已经用C#创建了Windows窗体程序。 我在本地化方面有一些问题。 我有3种语言的资源文件。 我想单击每个语言按钮并在运行时更改语言。 当我在InitializeComponent()之前更改语言时,它会工作。 但当我点击按钮时,它不起作用。 我正在使用这个代码 private void RussianFlag_Click(object sender, EventArgs e) { Thread.CurrentThread.CurrentUICulture = new Culture

我已经用C#创建了Windows窗体程序。 我在本地化方面有一些问题。 我有3种语言的资源文件。 我想单击每个语言按钮并在运行时更改语言。 当我在
InitializeComponent()
之前更改语言时,它会工作。 但当我点击按钮时,它不起作用。 我正在使用这个代码

private void RussianFlag_Click(object sender, EventArgs e)
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU");
}

更改CurrentUICulture不会自动重新加载资源。您需要手动执行它(http://msdn.microsoft.com/en-us/magazine/cc163609.aspx#S8)

您可以从InitializeComponent()复制与本地化相关的代码 进入另一个功能:

void LoadResources(){

    this.Title = MyApp.Resources.MainFormCaption;
    this.lblWelcomeMessage.Text = MyApp.Resources.UserWelcome;

}

您需要重新加载控件以反映新的区域性值

ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
然后您必须使用
resources.ApplyResources


请有一个

谢谢Vendetta和其他。。 解决办法是

private void RussianFlag_Click(object sender, EventArgs e)
        {
            if (currentLanguage != "RUS")
            {
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU");
                ChangeLanguage("ru-RU");
            }
        }
。。。。 ....


我编写了一个具有以下特性的
RuntimeLocalizer
类:

  • 在表单中更改和更新所有
    控件和
    子控件的本地化
  • 还更改所有菜单项的所有子项的本地化
用法示例:
RuntimeLocalizer.ChangeCulture(MainForm,“en-US”)



公共静态类RuntimeLocalizer
{
公共静态void changecurity(表单frm,字符串cultureCode)
{
CultureInfo culture=CultureInfo.GetCultureInfo(cultureCode);
Thread.CurrentThread.CurrentUICulture=区域性;
ComponentResourceManager资源=新的ComponentResourceManager(frm.GetType());
ApplyResourceControl(资源、frm、文化);
资源。应用资源(frm,“$this”,文化);
}
私有静态void ApplyResourceToControl(ComponentResourceManager资源、控件控件、CultureInfo语言)
{
if(control.GetType()==typeof(MenuStrip))//查看这是否是一个MenuStrip
{
MenuStrip strip=(MenuStrip)控件;
ApplyResourceToToolStripItemCollection(strip.Items、res、lang);
}
foreach(Control.Controls中的控件c)//应用于所有子控件
{
ApplyResourceToControl(res、c、lang);
res.ApplyResources(c,c.名称,lang);
}
//适用于自己
res.ApplyResources(control,control.Name,lang);
}
私有静态无效ApplyResourceToToolStripItemCollection(ToolStripItemCollection列、ComponentResourceManager列、CultureInfo列)
{
for(int i=0;i
您是否也尝试过更改
线程。CurrentCulture
呢?您是否尝试过在将线程区域设置为另一种语言后调用
刷新()
?我怀疑您是否需要
组件资源管理器
,并可能通过循环所有运行良好的控件进行应用!非常感谢。运行时本地化更改的最佳解决方案,非常容易实现!非常有帮助!非常感谢。我尝试了很多方法,只有你的作品谢谢!我也使用这个类。一件有趣的事情是,它可能会改变控件的大小,因为维度也是“可本地化”的,它们的值存储在资源文件中。如果表单在应用此类后变得“跳跃”,则从文件中删除不需要的维度值。下面是一个递归解决方案:private void ChangeLanguage(Control ctl,string lang){ComponentResourceManager resources=new ComponentResourceManager(typeof(Form1));resources.ApplyResources(ctl,ctl.Name,new CultureInfo(lang));foreach(ctl.Controls中的控件c)ChangeLanguage(c,lang);}虽然是一个很好的入门教程,但它为一些问题打开了大门
private void ChangeLanguage(string lang)
        {
            foreach (Control c in this.Controls)
            {
                ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
                resources.ApplyResources(c, c.Name, new CultureInfo(lang));
                if (c.ToString().StartsWith("System.Windows.Forms.GroupBox"))
                {
                    foreach (Control child in c.Controls)
                    {
                        ComponentResourceManager resources_child = new ComponentResourceManager(typeof(Form1));
                        resources_child.ApplyResources(child, child.Name, new CultureInfo(lang));
                    }
                }
            }
        }
using System.Windows.Forms;
using System.Globalization;
using System.Threading;
using System.ComponentModel;
public static class RuntimeLocalizer
{
    public static void ChangeCulture(Form frm, string cultureCode)
    {
        CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode);

        Thread.CurrentThread.CurrentUICulture = culture;

        ComponentResourceManager resources = new ComponentResourceManager(frm.GetType());

        ApplyResourceToControl(resources, frm, culture);
        resources.ApplyResources(frm, "$this", culture);
    }

    private static void ApplyResourceToControl(ComponentResourceManager res, Control control, CultureInfo lang)
    {
        if (control.GetType() == typeof(MenuStrip))  // See if this is a menuStrip
        {
            MenuStrip strip = (MenuStrip)control;

            ApplyResourceToToolStripItemCollection(strip.Items, res, lang);
        }

        foreach (Control c in control.Controls) // Apply to all sub-controls
        {
            ApplyResourceToControl(res, c, lang);
            res.ApplyResources(c, c.Name, lang);
        }

        // Apply to self
        res.ApplyResources(control, control.Name, lang);
    }

    private static void ApplyResourceToToolStripItemCollection(ToolStripItemCollection col, ComponentResourceManager res, CultureInfo lang)
    {
        for (int i = 0; i < col.Count; i++)     // Apply to all sub items
        {
            ToolStripItem item = (ToolStripMenuItem)col[i];

            if (item.GetType() == typeof(ToolStripMenuItem))
            {
                ToolStripMenuItem menuitem = (ToolStripMenuItem)item;
                ApplyResourceToToolStripItemCollection(menuitem.DropDownItems, res, lang);
            }

            res.ApplyResources(item, item.Name, lang);
        }
    }
}