Общие сведения о глобализации и локализации WPF

Обновлен: Ноябрь 2007

Если доступность продукта ограничена только одним языком, то таким образом ограничивается потенциальная база клиентов до некоторой части всего 6.5-миллиардного мирового населения. Чтобы созданные приложения были доступны мировой аудитории, для достижения большего количества клиентов одним из лучших и наиболее экономичных способов является экономически эффективная локализация продукта.

В этом обзоре даются вводные сведения по глобализации и локализации в Windows Presentation Foundation (WPF). Глобализация — это проектирование и разработка приложений, которые выполняются в нескольких расположениях. Например, глобализация поддерживает локализованные пользовательские интерфейсы и региональные данные для пользователей на различных языках. WPF предоставляет глобализованные функциональные возможности проектирования, включая автоматическую структуру, вспомогательные сборки, а также локализованные атрибуты комментарии.

Локализация — это перевод ресурсов приложения в локализованные версии для конкретных языков и региональных параметров, которые поддерживает приложение. При локализации в WPF используются интерфейсы API из пространства имен System.Windows.Markup.Localizer. Эти API приводят в действие инструмент командной строки Пример использования инструмента LocBaml. Сведения о том, как построить и использовать LocBaml, см. в разделе Практическое руководство. Локализация приложения.

В этом разделе содержатся следующие подразделы.

  • Рекомендации по глобализации и локализации в WPF
  • Локализация приложения WPF
  • Примеры локализации WPF

Рекомендации по глобализации и локализации в WPF

Большую часть функциональных возможностей глобализации и локализации, встроенных в WPF, можно сделать, следуя советам по проектированию пользовательского интерфейса и локализации, представленным в этом разделе.

Оптимальные методы разработки пользовательского интерфейса WPF

При разработке Пользовательский интерфейс, основанном на WPF, необходимо учитывать следующие рекомендации:

  • Пользовательский интерфейс создается в XAML; необходимо избегать создания Пользовательский интерфейс в коде. При создании Пользовательский интерфейс с использованием XAML пользовательский интерфейс предоставляется через встроенные API-интерфейсы локализации.

  • Необходимо избегать абсолютного позиционирования и фиксированных размеров для размещения содержимого; желательно использовать относительные размеры или их автоматическое изменение.

    • Необходимо использовать SizeToContent; установки для параметров ширины и высоты должны сохраняться как Auto.

    • Не следует использовать Canvas для размещения Пользовательский интерфейс.

    • Рекомендуется использовать Grid и ее функциональную возможность общего изменения размера.

  • Необходимо предусмотреть дополнительное пространство в границах, поскольку локализованный текст часто занимает больше места. Дополнительное пространство позволит использовать выступающие символы, возможно присутствующие в конкретном языке.

  • Чтобы не допустить усечение текста, необходимо включить параметр TextWrapping объекта TextBlock.

  • Необходимо задать атрибут xml:lang. Этот атрибут описывает язык и региональные параметры конкретного элемента и его дочерних элементов. Значение этого свойства изменяет поведение некоторых функциональных возможностей в WPF. Например, изменяется процесс переноса по слогам, проверки орфографии, подстановки чисел, формирования сложного сценария и подмены шрифта. Дополнительные сведения о настройке Обработка xml:lang в XAML см. в разделе Глобализация и Windows Presentation Foundation.

  • Рекомендуется создавать настраиваемый составной шрифт, чтобы получить лучшее управление шрифтами, использующимися для разных языков. По умолчанию WPF использует шрифт GlobalUserInterface.composite из папки Windows\Fonts.

  • При создании приложений навигации, которые могут быть локализованы в языке, использующем представление текста в формате справа налево, необходимо явно установить FlowDirection каждой страницы, чтобы гарантировать, что страница не будет наследовать FlowDirection от NavigationWindow.

  • При создании автономных приложений навигации, размещенных вне обозревателя, требуется установить для параметра StartupUri начального приложения значение NavigationWindow вместо страницы (например, <Application StartupUri="NavigationWindow.xaml">). Такая конструкция позволяет изменять FlowDirection окна и панели переходов. Дополнительные сведения и примеры см. в разделе Пример создания локализованной домашней страницы.

Оптимальные методы локализации приложений WPF

При локализации приложений на основе WPF необходимо учитывать следующие рекомендации по реализации:

  • С помощью комментариев локализации можно обеспечить дополнительный контекст для локализаторов.

  • Для управления локализацией необходимо использовать атрибуты локализации, а не выборочный пропуск свойств Uid элементов. Дополнительные сведения см. в разделе Атрибуты и комментарии локализации.

  • Необходимо использовать команды msbuild /t:updateuid и /t:checkuid для добавления и проверки свойств Uid в коде XAML. Рекомендуется использовать свойства Uid, чтобы отслеживать изменения, произведенные во время локализации. Рекомендуется использовать свойства Uid, которые помогают локализовать внесенные разработчиками изменения. При добавлении свойств Uid в Пользовательский интерфейс вручную эта задача становится более трудоемкой и менее точной.

    • Не следует редактировать или изменять свойства Uid после начала локализации.

    • Не следует использовать повторяющиеся свойства Uid (необходимо помнить этот совет при использовании команды копировать-вставить).

    • Необходимо задать расположение UltimateResourceFallback в AssemblyInfo.*, чтобы указать соответствующий язык в качестве базового языка (например, [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]).

      Если потребуется включить базовый язык в основную сборку путем пропуска тега <UICulture> в файле проекта, необходимо установить расположение UltimateResourceFallback в качестве основной сборки вместо вспомогательной (например, [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]).

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

Существует несколько вариантов локализации приложения WPF. Например, можно привязать локализованные ресурсы в приложении к файлу XML, хранить локализуемый текст в resx-таблицах, или же указать локализатору использовать файлы Язык XAML (Extensible Application Markup Language). В этом разделе описываются технологии локализации, использующие двоичный XAML (BAML), который предоставляет несколько преимуществ:

  • Локализация может делаться после построения.

  • Можно выполнить обновление до более новой версии BAML с локализациями из старой версии BAML, так что возможно одновременное проведение локализации и разработки.

  • Можно проверять элементы и семантику оригинального источника во время компиляции, поскольку BAML является скомпилированной формой XAML.

Процесс построения локализации

При разработке приложения WPF процесс построения локализации состоит в следующем:

  • Разработчик создает и глобализует приложение WPF. В файле проекта разработчик задает <UICulture>en-US</UICulture> таким образом, чтобы при компиляции приложения создавалась независимая от языка основная сборка. Эта сборка имеет вспомогательный файл resources.dll, содержащий все локализуемые ресурсы. При необходимости можно хранить базовый язык в основной сборке, поскольку локализация API-интерфейсы поддерживает извлечение из основной сборки.

  • При компиляции файла в построение XAML преобразуется в BAML. Независимый от языка и региональных параметров файл MyDialog.exe и зависимый от языка и региональных параметров (английских) файл MyDialog.resources.dll выпущены для англоговорящего клиента.

Технология локализации

Процесс локализации начинается после сборки нелокализованного файла MyDialog.resources.dll. Элементы и свойства Пользовательский интерфейс в исходном XAML извлекаются из BAML в пары ключ-значение с помощью API-интерфейсы в System.Windows.Markup.Localizer. Локализаторы используют пары ключ-значение для локализации приложения. После завершения локализации можно создать новый файл .resource.dll из новых значений.

Ключи пар ключ-значение ― это x:Uids, которые помещаются разработчиком в исходный XAML. Эти ключи x:Uids позволяют API-интерфейс осуществлять отслеживание и слияние изменений, внесенных разработчиком и локализатором во время локализации. Например, если разработчик изменяет Пользовательский интерфейс после начала локализации, можно слить их с уже выполненной работой по локализации, так что теряется минимум работы по переводу.

На приведенном ниже рисунке показана типичная технология локализации на основе BAML. Эта диаграмма предполагает, что разработчик пишет приложение на английском языке. Разработчик создает и глобализует приложение WPF. В файле проекта разработчик устанавливает <UICulture>en-US</UICulture>, таким образом при построении основная независимая от языка сборка получает созданный вспомогательной сборкой .resources.dll, содержащий все локализуемые ресурсы. Кроме того, можно сохранить базовый язык в основной сборке, поскольку локализация WPF API-интерфейсов поддерживает извлечение из основной сборки. По завершении процесса построения XAML компилируется в BAML. Независимый от языка и региональных параметров MyDialog.exe.resources.dll поставляется англоязычному пользователю.

Локализация рабочего процессаНелокализированный рабочий процесс

Процесс локализации начинается после построения нелокализованного MyDialog.resources.dll. Элементы и свойства пользовательского интерфейса в исходном XAML могут затем быть извлечены из BAML в пары «ключ-значение» с помощью API-интерфейсов пространства имен System.Windows.Markup.Localizer. Затем локализаторы заканчивают работу над парами «ключ-значение» для локализации приложения. После завершения локализации может быть создан новый .resource.dll из новых значений.

Ключи пар «ключ-значение» ― это x:Uids, помещенные разработчиком в исходный XAML. Эти ключи x:UIds позволяют API осуществлять отслеживание и слияние изменений, внесенных разработчиком и локализатором во время локализации. Например, если разработчик вносит изменения в интерфейс пользователя после начала локализации, эти изменения можно слить с уже выполненной работой по локализации, так что потери переводов будут минимальны.

Примеры локализации WPF

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

Пример диалогового окна «Выполнить»

На следующем рисунке показан вывод демонстрационного диалогового окна Выполнить.

Английский:

Диалоговое окно ''Выполнение''

Немецкий:

Немецкий вариант диалогового окна ''Выполнение''

Построение глобального диалогового окна «Выполнить»

В этом примере показано создание диалогового окна Выполнить при помощи WPF и XAML. Это диалоговое окно является эквивалентом диалогового окна Выполнить, доступного из меню «Пуск» Microsoft Windows.

Полный пример см. в разделе Пример глобализации диалогового окна "Выполнение".

Некоторые замечания по созданию глобальных диалоговых окон:

Automatic Layout

В Window1.xaml:

<Window SizeToContent="WidthAndHeight">

Предыдущее свойство Window автоматически изменяет размер окна в соответствии с размером содержимого. Это свойство предотвращает обрезание содержимого окна, которое увеличивается в размере после локализации; кроме того, оно также удаляет лишнее пространство, если содержимое уменьшается в размерах после локализации.

<Grid x:Uid="Grid_1">

Свойства Uid необходимы для корректной работы WPF по выполнению локализации API-интерфейсы.

Они используются при выполнении WPF локализации API-интерфейсы для отслеживания изменений между разработкой и локализацией пользовательский интерфейс. Свойства Uid позволяют слить более новую версию Пользовательский интерфейс со старой локализацией Пользовательский интерфейс. Свойство Uid добавляется при запуске msbuild /t:updateuid RunDialog.csproj в командной оболочке Windows SDK. Это рекомендуемый способ добавления свойств Uid, потому что добавление их вручную обычно является более затратным по времени и менее точным.. Чтобы проверить корректность задания свойств Uid, можно запустить msbuild /t:checkuid RunDialog.csproj.

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

Первые два столбца, в которых размещены метка Открыть: и поле со списком ComboBox, используют 10 процентов всей ширины Пользовательский интерфейс.

Обратите внимание, что пример использует функциональную возможность общего изменения размера Grid. Последние три столбца используют это преимущество, размещаясь в одной группе SharedSizeGroup. Во время ожидания имени свойства это позволит столбцам использовать один и тот же размер. Поэтому когда «Browse…» локализуется в более длинную строку «Durchsuchen…», ширина всех кнопок увеличивается, и не возникает ситуация с маленькой кнопкой «ОК» и непропорционально большой кнопкой «Durchsuchen…».

Xml:lang

Xml:lang="en-US"

Обратите внимание, что Обработка xml:lang в XAML помещается в корневом элементе Пользовательский интерфейс. Это свойство описывает язык и региональные параметры конкретного элемента и его потомков. Это значение используется несколькими функциональными возможностями в 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, так как он должен быть одинаков для всех языков и региональных параметров. Свойство Локализуемый имеет значение 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

Заголовок

Run

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 (т.е. en-US), и замените исходный 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

На следующем рисунке показаны английская и арабская начальные страницы. Полный пример создания этих рисунков см. в разделе Пример создания локализованной домашней страницы.

Английский:

Английская страница

Арабский:

Арабская страница

Проектирование глобальной начальной страницы Microsoft

Данный макет веб-узла Microsoft Saudi Arabia показывает функциональные возможности глобализации, предоставляемые для языков с порядком чтения справа-налево (RightToLeft). Такие языки, как иврит и арабский, имеют порядок чтения справа-налево, поэтому макет Пользовательский интерфейс часто надо располагать совершенно иначе, нежели в языках с порядком чтения слева-направо, как например в английском языке. Локализация языка с порядком чтения слева-направо в язык с порядком чтения справа-налево или наоборот может быть достаточно сложной. WPF был разработан, чтобы значительно упростить подобные локализации.

FlowDirection

Homepage.xaml:

Обратите внимание на свойство FlowDirection страницы. Изменение этого свойства на «RightToLeft» приведет к такому же изменению FlowDirection и всех ее дочерних элементов, поэтому макет этого Пользовательский интерфейс зеркально отразится и примет вид, предназначенный для порядка чтения справа-налево, как того и ожидает арабский пользователь. Можно переопределить это наследуемое поведение, явно указав свойство FlowDirection в любом элементе. Свойство FlowDirection доступно для любого элемента, связанного с классом FrameworkElement или с документом, и имеет неявное значение LeftToRight.

Обратите внимание, что даже фоновые градиентные кисти при изменении свойства FlowDirection корневой страницы изменяются соответствующим образом:

FlowDirection="LeftToRight"

Направление потока слева-направо

FlowDirection="RightToLeft"

Направление потока справа-налево

Избегайте использования фиксированных размеров для панелей и элементов управления

Обратите внимание, что на всей начальной странице Homepage.xaml, помимо фиксированной ширины и высоты, заданной для всего Пользовательский интерфейс вверху DockPanel, отсутствуют какие-либо другие фиксированные размеры. Не следует использовать фиксированные размеры, чтобы предотвратить отсечение локализованного текста, который может быть больше, чем исходный текст. Панели и элементы управления WPF будут автоматически изменяться в размерах в зависимости от находящегося в них содержимого. Большинство элементов управления также имеют минимальные и максимальные размеры, которые можно задать для большего регулирования (например, MinWidth="20"). С помощью сетки Grid можно также задать относительные размеры в ширину и высоту, воспользовавшись «*» (например, Width= «0.25*») или функциональной возможностью совместного использования размера ячейки, как показано в примере RunDialog в разделе Пример глобализации диалогового окна "Выполнение".

Комментарии локализации

Во многих случаях содержимое может быть неоднозначным и трудным для перевода. Разработчик и проектировщик имеют возможность предоставить локализаторам дополнительный контекст и комментарии в комментариях локализации. Например, в приведенных ниже комментариях локализации уточняется использование символа «|».

Этот комментарий становится связанным с полем TextBlock_1, и в инструменте LocBaml (см. Практическое руководство. Локализация приложения) его можно увидеть в выходном .csv файле, в шестом столбце строки TextBlock_1:

Ключ ресурса

Категория

Для чтения

Изменяемый

Комментарий

Значение

TextBlock_1:System.Windows.Controls.TextBlock.$Content

Текст

TRUE

TRUE

Этот символ используется в качестве декоративного правила.

|

Комментарии могут быть помещены в содержимое или в свойство любого элемента посредством следующего синтаксиса:

Атрибуты локализации

Разработчику или менеджеру локализации часто бывает необходимо управлять тем, что локализаторы могут читать и изменять. Например, может быть нежелательно, чтобы локализатор переводил название компании или юридическую формулировку. В WPF имеются атрибуты, позволяющие задать возможность чтения, возможность модификации, а также категорию содержимого или свойства элемента; эти атрибуты можно использовать в инструменте локализации для блокировки, скрытия или сортировки элементов. Дополнительные сведения см. в разделе AttributesProperty. В данном примере инструмент LocBaml только выводит значения этих атрибутов. Во всех элементах управления WPF эти атрибуты имеют значения по умолчанию, но их можно переопределять. Например, в следующем примере значения по умолчанию атрибутов локализации для элемента TextBlock_1 переопределяются, чтобы задать возможность чтения и невозможность модификации содержимого этого элемента.

<TextBlock
x:Uid="TextBlock_1"
Localization.Attributes=
"$Content(Readable Unmodifiable)">
  Microsoft Corporation
</TextBlock>

В дополнение к атрибутам, задающим возможность чтения и модификации, WPF предоставляет перечисление общих категорий Пользовательский интерфейс, которые можно использовать для предоставления локализаторам дополнительного контекста: Text, Title, Label, Button, CheckBox, ComboBox, ListBox, Menu, RadioButton, ToolTip, Hyperlink, Document, XmlData и Font. Категории 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-файл для арабского языка доступен в разделе Пример создания локализованной домашней страницы.