Локализация приложения - CodeHelper

Локализация приложения

4

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

Новые ответы


0

Вот еще один вариант локализации интерфейса WPF приложения. Здесь опять же ничего не говориться о динамически формируемых строках, но описание интерфейса вроде бы более наглядное + довольно легко в runtime можно сменить язык.

Разметка при таком подходе выглядит примерно вот так:

<Window.Resources>
  <XmlDataProvider x:Key="Lang" Source="/lng/german.xml" XPath="CrypTool"/>
  </Window.Resources>
  <Window.Background>
    ... 
  <TreeView Margin="10" FontSize="12" Name="Menu" 
    VerticalAlignment="Top" Grid.Column="0" Grid.Row="0" 
    Background="{x:Null}">
  <TreeViewItem Name="MenuItemDocSetup" Header="{Binding Source=
    {StaticResource Lang}, XPath=MenuItemDocSetup/@Header}" 
    Selected="DocSetup"/>
   ...
0

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

Разметка выглядит примерно вот так:

    <TextBlock loc:Translate.Uid="3"
        Text="{loc:Translate}"
        Background="{loc:Translate}"
        Width="{loc:Translate}"
        Height="{loc:Translate}" FontSize="18" />

    <TextBlock FontSize="18">
        <TextBlock.Text>
            <loc:Translate>
                <Binding ElementName="Root" Path="Uid" />
            </loc:Translate>
        </TextBlock.Text>
    </TextBlock>

При этом в коде можно делать так:

LanguageDictionary dictionary = LanguageDictionary.GetDictionary(LanguageContext.Instance.Culture);    
string message = dictionary.Translate("NotEnoughMemory", "Message", typeof(string)) as string;

English Entry:

<Value Id="NotEnoughMemory" Message="There is not enough memory" />

Hebrew Entry:

<Value Id="NotEnoughMemory" Message="אין מספיק זכרון" />
0

Для WPF:

Общие статьи также в MSDN: Глобализация и локализация приложений

Alexander

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

  1. Первоначально все элементы интерфейса помечаются как локализируемые
  2. Потом они извлекаются из сборки в отдельный текстовый файл, где переводятся
  3. Затем из этого файла формируется сатилитная сборка, содержащая переведенные ресурсы
  4. Данная сборка помещается в подкаталог приложения
Alexander

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

Это решает проблему только со строками, зашитыми в xaml-файлах описания интерфейса. А как быть со строками, динамически формируемыми в коде?

Alexander

Второй способ использует расширение разметки. Это уже кажется немного удобнее, но тоже , по-моему, не решает проблемы динамически формируемых строк. Да и в design time вместо нормальных надписей будут видны их идентификаторы.


v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.