Изменить файл ресурсов в коде С# в событии клика

Я изучаю локализацию интерфейса и использую WPF в Visual Studio 2008. Моя цель для моей программы - сделать так, чтобы пользователь мог нажать кнопку и изменить язык, отображаемый в окне. Я пытался изменить свои файлы ресурсов во время выполнения в разделе кода программной части, когда пользователь нажимает кнопку.

Я прочитал этот вопрос: Программно изменить язык файла ресурсов (resx ) в программном коде

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

Вот что я пробовал безуспешно, основываясь на предыдущем вопросе:

/// Change to English-US
        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            protected override void InitializeCulture()
            {
               base.InitializeCulture();
               System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
            }
        }

/// Change to German
        private void Button3_Click(object sender, RoutedEventArgs e)
        {
            protected override void InitializeCulture()
            {
               base.InitializeCulture();
               System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
            }
        }

Я программирую в школе и самостоятельно уже пару лет, так что я не абсолютный новичок. Однако я новичок в C# и WPF, и именно с этим я сейчас работаю. Насколько я знаю, у вас не может быть функции внутри функции, как у меня в моем коде. Единственная причина, по которой я поместил его туда, заключается в том, что мне нужно, чтобы он работал с событием нажатия кнопки.

Помощь в этом будет принята с благодарностью.

Вот новый код:

namespace LocalizationConcept
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            Properties.Resources.Culture = new CultureInfo(ConfigurationManager.AppSettings["Culture"]);
            ///InitializeComponent();
        }

        /// Exit Button
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            System.Environment.Exit(0);
        }

        private void ChangeCulture(string cultureKey)
        {
            try
            {
                System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureKey);
            }
            catch (Exception err)
            {
                System.Environment.Exit(0);
            }
        }

        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            ChangeCulture("en-US");
        }

        private void Button3_Click(object sender, RoutedEventArgs e)
        {
            ChangeCulture("de-DE");
        }
    }
}

person Eric after dark    schedule 08.07.2013    source источник


Ответы (2)


Похоже, что WPF не поддерживает те же функции Winforms, говоря о локализации и глобализации. Хотя я нашел несколько интересных статей, в которых пошагово показано, как заменить язык во время выполнения, на лету.

  • WPF Localization - On-the-fly Language Selection:
    • It provides an option for replacing languages at runtime, on-the-fly
    • Он работает лучше, чем слабое решение для привязки на основе XML и XPath.
    • Его можно использовать через стили, шаблоны управления и шаблоны данных.
    • Он переводит форматированный текст с параметрами, используя стандартные и пользовательские средства форматирования.
    • Он предоставляет пользовательское расширение разметки Translate для написания элегантного кода XAML.

  • WPF Runtime Localization
    • Switch cultures at runtime - automatically updating all localized elements
    • Используйте существующую файловую структуру ресурсов (файлы *.resx), которую можно поддерживать в Visual Studio.
    • Сохраняйте поддержку времени разработки для локализованных элементов, работающих в Expression Blend (и, надеюсь, в других приложениях для разработки XAML).
person Omar    schedule 08.07.2013

Это не обязательно должно быть в его собственной функции (хотя это может быть). Рассмотрим следующее:

    private void ChangeCulture(string cultureKey)
    {
        try
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureKey);
        }
        catch (Exception err)
        {
            // That culture probably doesn't exist
        }
    }

    private void ButtonA_Click(object sender, EventArgs args)
    {
        ChangeCulture("en-US");
    }

    private void ButtonB_Click(object sender, EventArgs args)
    {
        ChangeCulture("de-DE");
    }

РЕДАКТИРОВАТЬ:

Я нашел это в другом сообщении и он получил награду +100, так что я думаю, что это отличное решение. Проверьте это.

person Will Custode    schedule 08.07.2013
comment
Я полностью удалил события нажатия кнопки, которые у меня были раньше, и ввел это. У компилятора не было проблем, но язык не меняется при нажатии кнопки. Я опубликую новый код. - Также может быть важно отметить, что у меня есть файл app.config, который я использовал для изменения языка перед запуском программы. - person Eric after dark; 08.07.2013
comment
Я только что добавил ссылку на аналогичный пост, в котором есть отличный ответ на этот вопрос, хотя и немного более сложный. - person Will Custode; 08.07.2013
comment
Я пытаюсь локализовать весь текст в моем интерфейсе. На кнопках, текстовых полях и элементах вкладок есть текст. Эта ссылка будет работать и для них? Единственная причина, по которой я спрашиваю, заключается в том, что они всегда кодируют строки в окне XAML в качестве примера. - person Eric after dark; 08.07.2013