WPF Локализация в XAML, какой простой, легкий и элегантный способ сделать это? - PullRequest
12 голосов
/ 04 октября 2010

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

Предположим, что я должен отобразить в пользовательском интерфейсе что-то вроде:

На английском языке: Orgnanization - Beoing

На французском: Organizzazione - Beoing

    <StackPanel Orientation="Horizontal">
        <TextBlock Text="Organization -"></TextBlock>
        <TextBlock Text="{Binding Path=OrganizationName}">
        </TextBlock>
    </StackPanel>

По сути, мне нужно назначить локализованный текст для метки организации TextBlock. Должен ли я отделить дефис от «Организация -» и поместить его в отдельный ярлык?

Как мне это сделать?

Ответы [ 5 ]

8 голосов
/ 27 сентября 2012

Создание проекта WpfApplication1

Создание папки 'Localization'

Добавьте файл ресурсов (Strings.resx) в 'localization \' и добавьте строку 'OrganizationText' и значение 'Organization'

Когда вы компилируете, создается файл designer.cs.К сожалению, все методы в этом файле являются внутренними, и нам нужны открытые доступы, чтобы включить строковые ссылки из wpf.Для этого замените .resx «пользовательский инструмент» на «PublicResXFileCodeGenerator» (> = vs2008) и выполните сборку заново.Используйте этот xaml в MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:localization="clr-namespace:WpfApplication1.Localization"
        Title="MainWindow" Height="350" Width="525">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{x:Static localization:Strings.OrganizationText}"/>
        </StackPanel>
</Window>

Чтобы добавить '-', вы должны использовать множественное связывание (см. здесь )

2 голосов
/ 07 октября 2010

Я привязываю все метки и т. Д. В моем приложении к объекту, который я использую для отображения разных языков. Я храню все строки в базе данных и просто извлекаю нужные строки на основе языка, который выбрал пользователь. Это имеет преимущество мгновенного обновления во время выполнения. Таким образом, пользователю не нужно перезапускать приложение, как если бы вы решили сделать окна «Локализуемыми».

1 голос
/ 04 октября 2010

Посмотрите эту Белую книгу. Если я правильно помню, она объясняет, как использовать словарь ресурсов в xaml для локализации -

Этот проект включает в себя технический документ с примерами кода, чтобы помочь Windows Презентационный фонд (WPF) разработчики локализуют свои Приложения. Белая книга сравнивает LocBaml и классический подход Resx с плюсами и минусами.

http://wpflocalization.codeplex.com/

0 голосов
/ 26 мая 2014

Я сделал полное решение по локализации (включая редактор переводов), которое также поддерживает перевод XAML через ряд MarkupExtensions. Он использует словарь со всеми переведенными текстами (включая формы единственного / множественного числа), к которым можно получить доступ через MarkupExtensions из XAML или обычные методы из другого кода. MarkupExtensions также поддерживают изменение языка во время выполнения и даже обновление при изменении базового файла словаря.

Другие функции: локализованное форматирование даты / времени и чисел и типографские помощники.

Я успешно использую эту библиотеку в нескольких приложениях и в будущем планирую использовать ее в других приложениях.

http://dev.unclassified.de/source/txlib

0 голосов
/ 04 октября 2010

У нас есть приложение, которое может переключать языки пользовательского интерфейса во время выполнения и имеет возможность использовать новые языки пользовательского интерфейса, копируя соответствующие ресурсы в определенный каталог. Использование каких-либо скомпилированных ресурсов для этого слишком негибко с точки зрения распределения и т. Д. Поэтому у нас есть языковые ресурсы в ResourceDictionary как System: Strings - по одному ResourceDictionary в отдельном файле XAML для каждого языка. Файлы XAML помечены как Содержимое в VS и скопированы. Вы можете использовать их как DynamicResources в XAML или через экземпляр Localizer в C #. Эта концепция оказалась очень полезной в нашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...