Как изменить язык во время выполнения без проблем с макетом

У меня есть приложение winforms, которое пользователи должны иметь возможность изменять язык во время выполнения.

Чтобы обобщить коммутатор и чтобы избежать необходимости жестко кодировать управляющие имена, я попробовал следующее расширение:

    internal static void SetLanguage(this Form form, CultureInfo lang)
    {
        ComponentResourceManager resources = new ComponentResourceManager(form.GetType());

        ApplyResourceToControl(resources, form, lang);
        resources.ApplyResources(form, "$this", lang);
    }

    private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang)
    {
        foreach (Control c in control.Controls)
        {
            ApplyResourceToControl(resources, c, lang);
            resources.ApplyResources(c, c.Name, lang);
        }
    }

Это изменяет все строки.

Однако побочным эффектом этого является то, что все содержимое окна изменяется до исходного размера запуска этого окна, нет независимо от того, каков текущий размер.

Как я могу предотвратить изменение макета или инициировать новый расчет макета?

10
задан hultqvist 24 August 2010 в 15:56
поделиться

2 ответа

Посмотрите в RESX-файл, что все переназначено. Такие свойства, как Size и Form.AutoScaleDimensions, являются локализуемыми. Переназначение их имеет тот эффект, который вы видите. Особенно неприятно было бы отменить автоматическое масштабирование.

Нет конкретных рекомендаций по устранению этой проблемы, просто он не предназначен для запуска в каком-либо другом месте, кроме конструктора формы. Восстановите форму. Указание на то, что реальный пользователь вашей формы никогда не чувствует необходимости менять свой родной язык на лету, похоже, никогда не произведет впечатления.

5
ответ дан 4 December 2019 в 01:29
поделиться

Это полный код, который я сейчас использую.

Изменение заключается в ручном изменении только свойства Text. Если мне удастся локализовать другие свойства, код впоследствии придется расширить.

    /// <summary>
    /// Change language at runtime in the specified form
    /// </summary>
    internal static void SetLanguage(this Form form, CultureInfo lang)
    {
        //Set the language in the application
        System.Threading.Thread.CurrentThread.CurrentUICulture = lang;

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

        ApplyResourceToControl(resources, form.MainMenuStrip, lang);
        ApplyResourceToControl(resources, form, lang);

        //resources.ApplyResources(form, "$this", lang);
        form.Text = resources.GetString("$this.Text", lang);
    }

    private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang)
    {
        foreach (Control c in control.Controls)
        {
            ApplyResourceToControl(resources, c, lang);
            //resources.ApplyResources(c, c.Name, lang);
            string text = resources.GetString(c.Name+".Text", lang);
            if (text != null)
                c.Text = text;
        }
    }

    private static void ApplyResourceToControl(ComponentResourceManager resources, MenuStrip menu, CultureInfo lang)
    {
        foreach (ToolStripItem m in menu.Items)
        {
            //resources.ApplyResources(m, m.Name, lang);
            string text = resources.GetString(m.Name + ".Text", lang);
            if (text != null)
                m.Text = text;
        }
    }
5
ответ дан 4 December 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: