Общие сведения о глобализации и локализации 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.