Локализация приложения WinForms со встроенными пользовательскими элементами управления WPF - PullRequest
1 голос
/ 17 декабря 2008

Приложение, которое я пытаюсь локализовать, является приложением WinForms, имеющим несколько размещенных пользовательских элементов управления WPF (пользовательских элементов управления WPF, размещенных в элементе управления ElementHost WinForms).

Я использую resx файлы для локализации WinForms, с которыми VS2008 справляется довольно хорошо.

Проблема начинается, когда я пытаюсь использовать метод LocBaml для локализации частей WPF.

Вот что происходит: Когда я создаю решение, Visual Studio автоматически создает сателлитные сборки для меня, но только для ресурсов WinForms в файлах resx. Затем, когда я использую инструмент командной строки LocBaml, он генерирует спутниковые сборки для меня, но только для ресурсов WPF в файлах xaml.

Я не выяснил, как объединить две полученные библиотеки DLL (WPF и WinForms) в одну спутниковую сборку.

Ответы [ 3 ]

3 голосов
/ 12 марта 2009

Blech ... Команда WPF, похоже, оставляла желать лучшего с их решением по локализации. Ну, для чего это стоит, вот что я делал (честно говоря, я фактически позаимствовал эту идею у Jecho Jekov в CodeProject):

Во-первых, вам нужно создать (или заимствовать) класс Localization MarkupExtension. Jecho называет его LocExtension, я назвал свой i18nExtension ни по какой другой причине, кроме того, что мне показалось, что это было немного более наглядно, чем Loc. Это расширение разметки будет выполнять поиск указанного ключа ресурса в файле ресурсов. Это действительно простой и легкий класс для написания кода, если вы хотите, чтобы все ваши ресурсы находились в файле Properties / Resources.resx.

В результате вы получите что-то вроде этого в xaml:

<UserControl ... >
    ...
    <TextBox Text="{i18n HelloWorld}"/>
    ...
</UserControl>

Если вы хотите иметь отдельные файлы resx для каждого элемента UserControl / Window, как позволяет конструктор WinForms, вам нужно проявить немного креативности в MarkupExtension, чтобы он мог выяснить свой контекст.

В конечном счете, вы получаете одну сборку сателлитов на культуру, а это то, что вам кажется. Единственное предостережение, которое приходит на ум, заключается в том, что я не уверен, как это происходит с изменениями культуры / языка на лету. По крайней мере, окно / элемент управления необходимо перезагрузить.

0 голосов
/ 28 июня 2012

Как объединить несколько наборов ресурсов в одну спутниковую сборку

Правильный метод - использовать AL.exe (средство компоновки сборок) для встраивания файла формы Windows .resources и .resources, сгенерированных LocBaml, в одну спутниковую сборку (заменяя исходную сборку). по умолчанию содержит только ресурсы WinForms).

Шаги для создания гибридного приложения:

  1. Создайте свое решение (создание файла .resource только для WinForms и спутниковой библиотеки DLL).
  2. Создайте свой XAML .resource файл, используя инструмент locBaml
  3. Используйте AL.exe, чтобы связать оба набора файлов .resource в новый гибридный сателлитный dll и заменить оригинал с шага 1. Для восстановления проекта потребуется повторение шагов 2 и 3 для повторного объединения ресурсов xaml, так что вы, вероятно, хотите автоматизировать это, добавив его в качестве шага сборки или цели.

Пример использования:

Al.exe /out:MyApp.resources.dll /culture:es-ES /embed:MyApp.Form1.es-ES.resources /embed:MyAppWpf.g.es-ES.resources

Дополнительная информация (локализация гибридного приложения) http://msdn.microsoft.com/en-us/library/ms754231.aspx

0 голосов
/ 09 декабря 2011

Чтобы получить метод dustyburwell, опубликованный , работающий в пользовательских элементах управления WPF, встроенных в WinForms, необходимо установить для культуры пользовательский контроль после вызова InitializeComponent () в конструкторе форм WinForms, а затем обновить значения.

  1. Объявление формы WinForms.
  2. Добавить ElementHost (elementHost1).
  3. Добавьте свой WPF UserControl в elementHost1 (userControl1).
  4. Код открытой формы. Введите следующий код:
    public Form1()
    {
        InitializeComponent();

        WpfLocalization.LocalizationScope.SetCulture(userControl1, System.Threading.Thread.CurrentThread.CurrentCulture);
        WpfLocalization.LocalizationScope.SetUICulture(userControl1, System.Threading.Thread.CurrentThread.CurrentCulture);
        WpfLocalization.LocalizationManager.UpdateValues();
    }

При каждом изменении CurrentCulture эти 3 строки должны вызываться для каждого встроенного в WinForms пользовательского элемента управления WPF.

...