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

Я изучаю локализацию интерфейса и использую 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");
        }
    }
}

2 ответа

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

  • Локализация WPF - выбор языка на лету:
    • Он предоставляет возможность замены языков во время выполнения, на лету
    • Он работает лучше, чем слабое решение для связывания на основе XML, XPath
    • Его можно использовать через стили, шаблоны управления и шаблоны данных
    • Он переводит форматированный текст с параметрами, используя стандартные и пользовательские форматеры
    • Предоставляет собственное расширение разметки Translate для написания элегантного XAML

  • WPF локализация времени выполнения
    • Переключение культур во время выполнения - автоматическое обновление всех локализованных элементов
    • Используйте существующую файловую структуру ресурсов (файлы *.resx), которую можно поддерживать в Visual Studio
    • Сохраняйте поддержку во время разработки для локализованных элементов, работающих в Expression Blend (и, надеюсь, в других приложениях дизайна XAML)

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

    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 к награде, так что я думаю, что это отличное решение. Проверьте это.

Другие вопросы по тегам