Локализация во время выполнения - PullRequest
5 голосов
/ 08 августа 2011

Я создал программу Windows Form в C #.У меня есть некоторые проблемы с локализацией.У меня есть файлы ресурсов на 3 языках.Я хочу нажать на каждую кнопку языка и изменить язык во время выполнения.Когда я меняю язык до InitializeComponent(), это работает.Но когда я нажимаю на кнопку, это не работает.Я использую этот код.

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

Ответы [ 4 ]

13 голосов
/ 30 апреля 2012

Я написал RuntimeLocalizer класс со следующими функциями:

  • Изменения и обновления локализации для всех Control с и SubControl с в форме
  • Также изменяет локализацию для всех SubItem с всех MenuStrip с

Пример использования: RuntimeLocalizer.ChangeCulture(MainForm, "en-US");


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);
        }
    }
}
4 голосов
/ 08 августа 2011

Вам нужно будет перезагрузить элементы управления, чтобы они отражали новые значения культуры

ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));

, а затем вам нужно будет подать заявку на каждый элемент управления, используя resources.ApplyResources

. Пожалуйста, имейте смотрите здесь

1 голос
/ 08 августа 2011

Изменение 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;

}
0 голосов
/ 08 августа 2011

Спасибо V4Vendetta и другим .. Решение ... ... 1001 *

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

.... .... ...

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));
                    }
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...