Как изначально заложить в приложение возможность локализации на произвольный язык? Это включает в себя и MessageBox'ы, различные диалоги, элементы интерфейса. Причем нужно, чтобы язык можно было сменить без перезапуска приложения, а так же можно было легко добавлять новые языки и редактировать существующие без перекомпиляции приложения.
Локализация приложения
4
Спросил
Новые ответы
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 есть статья: Общие сведения о глобализации и локализации WPF
- статья с codeproject о ток как локализовать WPF приложение используя RESX файды
Общие статьи также в MSDN: Глобализация и локализация приложений
Первый способ не очень удобен, т.к. используется сторонняя утилита LocBaml + командная строка.
Все это делается при помощи LocBaml естессно. В итоге, имея текстовый файл с извлеченными ресурсами для локализации, мы можем создать сателлитную сборку для любого языка. Она автоматически выберется на основании текущей системной культуры и подключится при запуске приложения.
Это решает проблему только со строками, зашитыми в xaml-файлах описания интерфейса. А как быть со строками, динамически формируемыми в коде?
Второй способ использует расширение разметки. Это уже кажется немного удобнее, но тоже , по-моему, не решает проблемы динамически формируемых строк. Да и в design time вместо нормальных надписей будут видны их идентификаторы.