Общие сведения о глобализации и локализации WPF
Если доступность продукта ограничена только одним языком, то таким образом ограничивается потенциальная база клиентов до некоторой части всего 6.5-миллиардного мирового населения. Чтобы созданные приложения были доступны мировой аудитории, для достижения большего количества клиентов одним из лучших и наиболее экономичных способов является экономически эффективная локализация продукта.
В этом обзоре даются вводные сведения по глобализации и локализации в Windows Presentation Foundation (WPF). Глобализация — это проектирование и разработка приложений, которые выполняются в нескольких расположениях. Например, глобализация поддерживает локализованные пользовательские интерфейсы и региональные данные для пользователей на различных языках. WPF предоставляет глобализованные функциональные возможности проектирования, включая автоматическую структуру, вспомогательные сборки, а также локализованные атрибуты комментарии.
Локализация — это перевод ресурсов приложения в локализованные версии для конкретных языков и региональных параметров, которые поддерживает приложение. При локализации в WPF используются интерфейсы API из пространства имен System.Windows.Markup.Localizer. Эти интерфейсы API поддерживают средство командной строки LocBaml. Сведения о том, как построить и использовать LocBaml, см. в разделе Практическое руководство. Локализация приложения.
В этом разделе содержатся следующие подразделы.
- Рекомендации по глобализации и локализации в WPF
- Локализация приложения WPF
- Примеры локализации WPF
Рекомендации по глобализации и локализации в WPF
Большую часть функциональных возможностей глобализации и локализации, встроенных в WPF, можно создать, следуя советам по проектированию пользовательского интерфейса и локализации, представленным в этом разделе.
Оптимальные методы разработки пользовательского интерфейса WPF
При разработке UI, основанном на WPF, необходимо учитывать следующие рекомендации:
Создавайте элементы UI в XAML; избегайте создания элементов UI в коде. При создании элементов UI с использованием XAML пользовательский интерфейс предоставляется через встроенные API-интерфейсы локализации.
Избегайте использования абсолютного позиционирования и фиксированных размеров для размещения содержимого; вместо этого используйте относительное или автоматическое изменение размеров.
Необходимо использовать SizeToContent; установки для параметров ширины и высоты должны сохраняться как Auto.
Не следует использовать Canvas для размещения UI.
Рекомендуется использовать Grid и ее функциональную возможность общего изменения размера.
Необходимо предусмотреть дополнительное пространство в границах, поскольку локализованный текст часто занимает больше места. Дополнительное пространство позволит использовать выступающие символы, возможно присутствующие в конкретном языке.
Чтобы не допустить усечение текста, необходимо включить параметр TextWrapping объекта TextBlock.
Необходимо задать атрибут xml:lang. Этот атрибут описывает язык и региональные параметры конкретного элемента и его дочерних элементов. Значение этого свойства изменяет поведение некоторых функциональных возможностей WPF. Например, изменяется процесс переноса по слогам, проверки орфографии, подстановки чисел, формирования сложных скриптов и подмены шрифта. См. в разделе Глобализация для WPF дополнительные сведения о настройке Обработка xml:lang в XAML.
Рекомендуется создавать настраиваемый составной шрифт, чтобы получить лучшее управление шрифтами, использующимися для разных языков. По умолчанию WPF использует шрифт GlobalUserInterface.composite из папки Windows\Fonts.
При создании приложений навигации, которые могут быть локализованы в языке, использующем представление текста в формате справа налево, необходимо явно установить FlowDirection каждой страницы, чтобы гарантировать, что страница не будет наследовать FlowDirection от NavigationWindow.
При создании автономных приложений навигации, размещенных вне обозревателя, требуется установить для параметра StartupUri начального приложения значение NavigationWindow вместо страницы (например, <Application StartupUri="NavigationWindow.xaml">). Такая конструкция позволяет изменять FlowDirection окна и панели переходов. Дополнительные сведения и пример см. в разделе Пример Globalization Homepage.
Оптимальные методы локализации приложений WPF
При локализации приложений на основе WPF необходимо учитывать следующие рекомендации по реализации.
Используйте комментарии локализации для обеспечения дополнительного контекста для локализаторов.
Используйте атрибуты локализации для управления локализацией вместо выборочного пропуска свойств Uid в элементах. Дополнительные сведения см. в разделе Атрибуты и комментарии локализации.
Необходимо использовать команды msbuild /t:updateuid и /t:checkuid для добавления и проверки свойств Uid в коде XAML. Используйте свойства Uid для отслеживания изменений между разработкой и локализацией. СвойстваUid помогают локализовать новые изменения в разработке. При добавлении свойств Uid в UI вручную эта задача становится более трудоемкой и менее точной.
Не следует редактировать или изменять свойства Uid после начала локализации.
Не следует использовать повторяющиеся свойства Uid (необходимо помнить этот совет при использовании команды копировать-вставить).
Необходимо задать расположение UltimateResourceFallback в AssemblyInfo.*, чтобы указать соответствующий язык в качестве базового языка (например, [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]).
Если потребуется включить базовый язык в основную сборку путем пропуска тега <UICulture> в файле проекта, необходимо установить расположение UltimateResourceFallback в качестве основной сборки вместо вспомогательной (например, [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]).
Локализация приложения WPF
Существует несколько вариантов локализации приложения WPF. Например, можно привязать локализованные ресурсы в приложении к файлу XML, хранить локализуемый текст в resx-таблицах, или же указать локализатору использовать файлы Extensible Application Markup Language (XAML). В этом разделе описывается рабочий процесс локализации, использующий BALM-форму XAML, который предоставляет несколько преимуществ.
Локализация может делаться после построения.
Можно выполнить обновление до более новой версии BALM-формы XAML с локализациями из старой версии BALM-формы XAML, чтобы обеспечить возможность локализации в процессе разработки.
Можно проверять элементы и семантику исходного источника во время компиляции, поскольку BALM-форма XAML является скомпилированной формой XAML.
Процесс построения локализации
При разработке приложения WPF процесс построения локализации состоит в следующем:
Разработчик создает и глобализует приложение WPF. В файле проекта разработчик задает параметр <UICulture>en-US</UICulture>, чтобы при компиляции приложения создавалась независимая от языка основная сборка. Эта сборка имеет вспомогательный файл .resources.dll, содержащий все локализуемые ресурсы. При необходимости можно хранить базовый язык в основной сборке, поскольку APIs локализации поддерживают извлечение из основной сборки.
При компиляции файла в построение XAML преобразуется в BALM-форму XAML. Независимый от языка и региональных параметров файл MyDialog.exe и зависимый от языка и региональных параметров (английских) файл MyDialog.resources.dll выпущены для англоговорящего клиента.
Технология локализации
Процесс локализации начинается после сборки нелокализованного файла MyDialog.resources.dll. Элементы и свойства UI в исходном коде XAML извлекаются из BALM-формы XAML в пары "ключ-значение" с помощью APIs из пространства имен System.Windows.Markup.Localizer. Локализаторы используют пары ключ-значение для локализации приложения. После завершения локализации можно создать новый файл .resource.dll из новых значений.
Ключи пар "ключ-значение" — это значения x:Uid, которые помещаются разработчиком в исходный XAML. Эти значения x:Uid позволяют API осуществлять отслеживание и слияние изменений, внесенных разработчиком и локализатором во время локализации. Например, если разработчик изменяет UI после начала локализации, можно слить их с уже выполненной работой по локализации, так что теряется минимум работы по переводу.
На приведенном ниже рисунке показана типичный рабочий процесс локализации на основе BALM-формы XAML. Эта диаграмма предполагает, что разработчик пишет приложение на английском языке. Разработчик создает и глобализует приложение WPF. В файле проекта разработчик задает <UICulture>en-US</UICulture> таким образом, что при построении основная независимая от языка сборка получает созданный вспомогательной сборкой файл .resources.dll, содержащий все локализуемые ресурсы. Кроме того, можно сохранить базовый язык в основной сборке, поскольку локализация WPF API-интерфейсов поддерживает извлечение из основной сборки. По завершении процесса построения XAML компилируется в BAML. Независимый от языка и региональных параметров MyDialog.exe.resources.dll поставляется англоязычному пользователю.
Примеры локализации WPF
В этом разделе приводятся примеры локализованных приложений, чтобы облегчить понимание процесса построения и локализации приложений WPF.
Пример диалогового окна "Выполнить"
На следующем рисунке показан вывод демонстрационного диалогового окна Выполнить.
Английский:
Немецкий:
Построение глобального диалогового окна "Выполнить"
В этом примере показано создание диалогового окна Выполнить при помощи WPF и XAML. Это диалоговое окно является эквивалентом диалогового окна Выполнить, доступного из меню "Пуск" Microsoft Windows.
Некоторые замечания по созданию глобальных диалоговых окон:
Automatic Layout
В Window1.xaml:
<Window SizeToContent="WidthAndHeight">
Предыдущее свойство Window автоматически изменяет размер окна в соответствии с размером содержимого. Это свойство предотвращает обрезание содержимого окна, которое увеличивается в размере после локализации; кроме того, оно также удаляет лишнее пространство, если содержимое уменьшается в размерах после локализации.
<Grid x:Uid="Grid_1">
Свойства Uid необходимы для корректной работы WPF по выполнению локализации APIs.
Они используются при выполнении WPF локализации APIs для отслеживания изменений между разработкой и локализацией user interface (UI). Свойства Uid позволяют выполнить слияние более новой версии UI со старой локализацией UI. Свойство Uid добавляется при запуске msbuild /t:updateuid RunDialog.csproj в командной оболочке. Это рекомендуемый способ добавления свойств Uid, потому что добавление их вручную обычно является более затратным по времени и менее точным.. Чтобы проверить корректность задания свойств Uid, можно запустить msbuild /t:checkuid RunDialog.csproj.
UI структурирован при помощи элемента управления Grid, который помогает воспользоваться преимуществами автоматического макета в WPF. Обратите внимание, что диалоговое окно разделено на три строки и пять столбцов. Ни в одном из определений строк и столбцов не задан фиксированный размер; следовательно, элементы UI, расположенные в каждой ячейке, могут адаптироваться к увеличению и уменьшению размеров во время локализации.
<Grid.ColumnDefinitions>
<ColumnDefinition x:Uid="ColumnDefinition_1" />
<ColumnDefinition x:Uid="ColumnDefinition_2" />
Первые два столбца, в которых размещены метка Открыть: и поле со списком ComboBox, занимают 10 процентов всей ширины UI.
<ColumnDefinition x:Uid="ColumnDefinition_3" SharedSizeGroup="Buttons" />
<ColumnDefinition x:Uid="ColumnDefinition_4" SharedSizeGroup="Buttons" />
<ColumnDefinition x:Uid="ColumnDefinition_5" SharedSizeGroup="Buttons" />
</Grid.ColumnDefinitions>
Обратите внимание, что пример использует функциональную возможность общего изменения размера Grid. Последние три столбца используют это преимущество, размещаясь в одной группе SharedSizeGroup. Во время ожидания имени свойства это позволит столбцам использовать один и тот же размер. Поэтому когда "Browse…" локализуется в более длинную строку "Durchsuchen…", ширина всех кнопок увеличивается, и не возникает ситуация с маленькой кнопкой "ОК" и непропорционально большой кнопкой "Durchsuchen…".
Xml:lang
Xml:lang="en-US"
Обратите внимание, что Обработка xml:lang в XAML помещается в корневом элементе UI. Это свойство описывает язык и региональные параметры конкретного элемента и его потомков. Это значение используется несколькими функциональными возможностями в WPF, поэтому во время локализации оно должно быть соответствующим образом изменено. Это значение изменяется в зависимости от того, какой языковый словарь используется для расстановки переносов и проверки орфографии слов. Оно также влияет на отображение цифр и на то, как система подмены шрифтов выбирает шрифт для использования. Наконец, это свойство влияет на способ отображения чисел и на способ написания текста в сложных скриптах. По умолчанию используется значение "en-US".
Building a Satellite Resource Assembly
В .csproj:
<UICulture>en-US</UICulture>
Обратите внимание на добавление значения UICulture. Когда оно установлено в допустимое значение CultureInfo, например "en-US", построение проекта создаст вспомогательную сборку со всеми локализуемыми ресурсами.
<Resource Include="RunIcon.JPG">
<Localizable>False</Localizable>
</Resource>
Не нужно локализовывать RunIcon.JPG, так как он должен быть одинаков для всех языков и региональных параметров. Свойству Localizable присвоено значение false, таким образом этот элемент остается в независимой от языка основной сборке, а не переносится во вспомогательную сборку. Для всех некомпилируемых ресурсов свойству Localizable по умолчанию присвоено значение true.
Локализация диалогового окна "Выполнить"
Parse
После того как приложение будет построено, первым шагом в локализации является разбор локализуемых ресурсов из вспомогательной сборки. В процессе изучения данного раздела используется демонстрационный инструмент LocBaml, который можно найти в разделе Пример LocBaml. Обратите внимание, что LocBaml ― только демонстрационный инструмент, предназначенный помочь начать работу по созданию инструмента локализации, встраиваемого в процесс локализации. С помощью LocBaml выполните следующую команду для анализа: LocBaml /parse RunDialog.resources.dll /out:. В результате создается файл RunDialog.resources.dll.CSV.
Localize
Для редактирования этого файла можно воспользоваться любым CSV-редактором, поддерживающим Unicode. Исключите все записи с категорией локализации "Нет". Должны остаться следующие записи:
Ключ ресурса |
Категория локализации |
Значение |
Button_1:System.Windows.Controls.Button.$Content |
Кнопка |
ОК |
Button_2:System.Windows.Controls.Button.$Content |
Кнопка |
Отмена |
Button_3:System.Windows.Controls.Button.$Content |
Кнопка |
Обзор... |
ComboBox_1:System.Windows.Controls.ComboBox.$Content |
ComboBox |
|
TextBlock_1:System.Windows.Controls.TextBlock.$Content |
Текст |
Введите имя программы, папки, документа или Интернет-ресурса, и Windows откроет его. |
TextBlock_2:System.Windows.Controls.TextBlock.$Content |
Текст |
Открыть: |
Window_1:System.Windows.Window.Title |
Заголовок |
Запуск |
Для локализации приложений в немецком языке потребуются следующие переводы:
Ключ ресурса |
Категория локализации |
Значение |
Button_1:System.Windows.Controls.Button.$Content |
Кнопка |
ОК |
Button_2:System.Windows.Controls.Button.$Content |
Кнопка |
Abbrechen |
Button_3:System.Windows.Controls.Button.$Content |
Кнопка |
Durchsuchen… |
ComboBox_1:System.Windows.Controls.ComboBox.$Content |
ComboBox |
|
TextBlock_1:System.Windows.Controls.TextBlock.$Content |
Текст |
Geben Sie den Namen eines Programms, Ordners, Dokuments oder einer Internetresource an. |
TextBlock_2:System.Windows.Controls.TextBlock.$Content |
Текст |
Öffnen: |
Window_1:System.Windows.Window.Title |
Заголовок |
Запуск |
Generate
Последний шаг локализации включает создание только что локализованной вспомогательной сборки. Это может быть выполнено с помощью следующей команды LocBaml:
LocBaml.exe /generate RunDialog.resources.dll /trans:RunDialog.resources.dll.CSV /out: . /cul:de-DE
В немецком Windows, если файл resources.dll размещен в папке de-DE главной сборки, этот ресурс будет автоматически загружаться вместо ресурса из папки en-US. Если немецкая версия Windows отсутствует, то чтобы проверить это, установите тот язык и региональные параметры, которые используются в вашей Windows (т.е. ru-RU), и замените исходный файл resources.dll.
Satellite Resource Loading
MyDialog.exe |
en-US\MyDialog.resources.dll |
De-DE\MyDialog.resources.dll |
---|---|---|
Код |
Исходный английский BAML |
Локализованный BAML |
Ресурсы, не зависящие от языка и региональных параметров |
Другие ресурсы на английском языке |
Другие ресурсы, локализованные для немецкого языка |
Платформа .NET framework автоматически выбирает вспомогательную сборку ресурсов для загрузки в зависимости от Thread.CurrentThread.CurrentUICulture приложения. По умолчанию используется языка и региональных параметров операционной системы Windows. Поэтому при использовании немецкой Windows загружается "de-DE\MyDialog.resources.dll", а при использовании английской Windows загружается "en-US\MyDialog.resources.dll". Можно задать для приложения встроенный ресурс, указав NeutralResourcesLanguage в AssemblyInfo.* проекта. Например, если будет указано:
[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
то в случае недоступности de-DE\MyDialog.resources.dll и de\MyDialog.resources.dll немецкой версией Windows будет использоваться en-US\MyDialog.resources.dll.
домашняя страница Microsoft Saudi Arabia
На следующем рисунке показаны английская и арабская начальные страницы. Полный пример создания такой графики см. в разделе Пример Globalization Homepage.
Английский:
Арабский:
Проектирование глобальной домашней страницы Microsoft
Данный макет веб-узла Microsoft Saudi Arabia показывает функциональные возможности глобализации, предоставляемые для языков с порядком чтения справа-налево (RightToLeft). Такие языки, как иврит и арабский, имеют порядок чтения справа-налево, поэтому макет UI часто надо располагать совершенно иначе, нежели в языках с порядком чтения слева-направо, как например в английском языке. Локализация языка с направлением письма слева-направо в язык с направлением письма справа-налево или наоборот может быть достаточно сложной. WPF был разработан, чтобы значительно упростить подобные локализации.
FlowDirection
Homepage.xaml:
<Page x:Uid="Page_1" x:Class="MicrosoftSaudiArabiaHomepage.Homepage"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
FlowDirection="LeftToRight"
Localization.Comments="FlowDirection(This FlowDirection controls the actual content of the homepage)"
xml:lang="en-US">
Обратите внимание на свойство FlowDirection в Page. Изменение этого свойства на RightToLeft приведет к изменению FlowDirection страницы Page и всех ее дочерних элементов, поэтому макет этого UI зеркально отразится и примет вид, предназначенный для порядка чтения справа налево, как того и ожидает арабский пользователь. Можно переопределить это наследуемое поведение, явно указав свойство FlowDirection в любом элементе. Свойство FlowDirection доступно для любого элемента FrameworkElement или элемента, связанного с документом, и имеет неявное значение LeftToRight.
Обратите внимание, что даже фоновые градиентные кисти при изменении свойства FlowDirection корня изменяются соответствующим образом.
FlowDirection="LeftToRight"
FlowDirection="RightToLeft"
Избегайте использования фиксированных размеров для панелей и элементов управления
Обратите внимание, что на всей домашней странице Homepage.xaml, помимо фиксированной ширины и высоты, заданной для всего UI вверху DockPanel, отсутствуют какие-либо другие фиксированные размеры. Не следует использовать фиксированные размеры, чтобы предотвратить отсечение локализованного текста, который может быть больше, чем исходный текст. Панели и элементы управления WPF будут автоматически изменяться в размерах в зависимости от находящегося в них содержимого. Большинство элементов управления также имеют минимальные и максимальные размеры, которые можно задать для большего регулирования (например, MinWidth= "20"). С помощью элемента управления Grid также можно задать относительную ширину и высоту, используя символ "*" (например, Width= "0,25*") или возможность совместного использования размера ячейки.
Комментарии локализации
Во многих случаях содержимое может быть неоднозначным и трудным для перевода. Разработчик и проектировщик имеют возможность предоставить локализаторам дополнительный контекст и комментарии в комментариях локализации. Например, в приведенных ниже комментариях локализации уточняется использование символа "|".
<TextBlock
x:Uid="TextBlock_2"
DockPanel.Dock="Right"
Foreground="White"
Margin="5,0,5,0"
Localization.Comments="$Content(This character is used as a decorative rule.)">
|
</TextBlock>
Этот комментарий становится связанным с полем TextBlock_1, и в инструменте LocBaml (см. Практическое руководство. Локализация приложения) его можно увидеть в выходном .csv файле, в шестом столбце строки TextBlock_1:
Ключ ресурса |
Категория |
Для чтения |
Изменяемый |
Комментарий |
Значение |
TextBlock_1:System.Windows.Controls.TextBlock.$Content |
Текст |
TRUE |
TRUE |
Этот символ используется в качестве декоративного правила. |
| |
Комментарии могут быть помещены в содержимое или в свойство любого элемента посредством следующего синтаксиса:
<TextBlock
x:Uid="TextBlock_1"
DockPanel.Dock="Right"
Foreground="White"
Margin="5,0,5,0"
Localization.Comments="$Content(This is a comment on the TextBlock's content.)
Margin(This is a comment on the TextBlock's Margin property.)">
|
</TextBlock>
Атрибуты локализации
Разработчику или менеджеру локализации часто бывает необходимо управлять тем, что локализаторы могут читать и изменять. Например, может быть нежелательно, чтобы локализатор переводил название компании или юридическую формулировку. В WPF имеются атрибуты, позволяющие задать возможность чтения, возможность модификации, а также категорию содержимого или свойства элемента; эти атрибуты можно использовать в инструменте локализации для блокировки, скрытия или сортировки элементов. Дополнительные сведения см. в разделе Attributes. В данном примере инструмент LocBaml только выводит значения этих атрибутов. Во всех элементах управления WPF эти атрибуты имеют значения по умолчанию, но их можно переопределять. Например, в следующем примере переопределяются атрибуты локализации по умолчанию для TextBlock_1 и задается возможность чтения и невозможность изменения содержимого для локализаторов.
<TextBlock
x:Uid="TextBlock_1"
Localization.Attributes=
"$Content(Readable Unmodifiable)">
Microsoft Corporation
</TextBlock>
В дополнение к атрибутам, задающим возможность чтения и изменения, WPF предоставляет перечисление общих категорий пользовательского интерфейса (LocalizationCategory), которые можно использовать для предоставления локализаторам дополнительного контекста. Категории WPF по умолчанию для элементов управления платформы также могут переопределяться в XAML:
<TextBlock x:Uid="TextBlock_2">
<TextBlock.ToolTip>
<TextBlock
x:Uid="TextBlock_3"
Localization.Attributes=
"$Content(ToolTip Readable Unmodifiable)">
Microsoft Corporation
</TextBlock>
</TextBlock.ToolTip>
Windows Vista
</TextBlock>
Атрибуты локализации по умолчанию, предоставляемые WPF, также могут быть переопределены в коде, так что можно корректно установить правильные значения по умолчанию для пользовательских элементов управления. Пример.
[Localizability(Readability = Readability.Readable, Modifiability=Modifiability.Unmodifiable, LocalizationCategory.None)]
public class CorporateLogo: TextBlock
{
…
..
.
}
Каждый набор атрибутов экземпляра, установленный в XAML, будет иметь приоритет над значениями, заданными в коде в пользовательских элементах управления. Дополнительные сведения об атрибутах и комментариях см. в разделе Атрибуты и комментарии локализации.
Подмена шрифтов и составные шрифты
Если задан шрифт, который не поддерживает данный диапазон кодовых точек, WPF будет автоматически подменять его шрифтом, который реализуется с помощью шрифта Global User Interface.compositefont, расположенного в папке Windows\Fonts. Составные шрифты работают так же, как и любой другой шрифт, и могут использоваться явно путем установки параметра FontFamily элемента (например, FontFamily= "Global User Interface"). Можно задавать собственные предпочтения для подмены шрифта путем создания собственного составного шрифта и указания его использования для конкретных языков и диапазонов кода UNICODE.
Дополнительные сведения о составных шрифтах см. в разделе FontFamily.
Локализация домашней страницы Microsoft
Для локализации домашней страницы Microsoft можно выполнить те же действия, что и в примере локализации приложения диалогового окна "Выполнить". Локализованный CSV-файл для арабского языка доступен в разделе Пример Globalization Homepage.