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

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

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

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

Предупреждение

Инструмент LocBaml работает только с WPF для проектов платформа .NET Framework, он не работает с WPF для .NET.

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

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

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

При разработке пользовательского интерфейса на основе WPF рекомендуется реализовать следующие рекомендации.

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

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

    • Используйте SizeToContent и оставьте значения ширины и высоты равными Auto.

    • Избегайте использования Canvas для размещения пользовательских интерфейсов.

    • Используйте Grid и его функцию совместно используемого размера.

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

  • Включите TextWrapping в TextBlock, чтобы избежать обрезки.

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

  • Рекомендуется создавать настраиваемый составной шрифт для наилучшего управления шрифтами разных языков. По умолчанию в 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 свойства в пользовательский интерфейс, задача обычно мучена и менее точную.

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

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

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

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

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

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

  • Локализация может осуществляться после сборки.

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

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

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

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

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

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

Рабочий процесс локализации

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

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

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

Diagram showing the Localization workflow.

Diagram showing the Unlocalized workflow.

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

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

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

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

Английский.

Screenshot showing an English Run dialog box.

Немецкий.

Screenshot showing a German Run dialog box.

Разработка глобального диалогового окна "Выполнить"

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

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

Автоматический макет

В файле Window1.xaml

<Window SizeToContent="WidthAndHeight">

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

<Grid x:Uid="Grid_1">

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

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

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

<Grid.ColumnDefinitions>
  <ColumnDefinition x:Uid="ColumnDefinition_1" />
  <ColumnDefinition x:Uid="ColumnDefinition_2" />

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

  <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 помещается в корневом элементе пользовательского интерфейса. Это свойство описывает язык и региональные параметры конкретного элемента и его потомков. Это значение используется несколькими функциональными возможностями в WPF и во время локализации должно быть соответствующим образом изменено. Это значение изменяется в зависимости от того, какой языковой словарь используется для расстановки переносов и проверки орфографии слов. Оно также влияет на отображение цифр и на то, как система подмены шрифтов выбирает шрифт для использования. Наконец, это свойство влияет на способ отображения чисел и на способ написания текста в сложных скриптах. По умолчанию используется значение en-US.

Создание вспомогательной сборки ресурсов

В файле .csproj

Измените файл .csproj и добавьте следующий тег в безусловный <PropertyGroup>:

<UICulture>en-US</UICulture>

Обратите внимание на добавление значения UICulture. Когда оно установлено в допустимое значение CultureInfo, например en-US, при создании проекта будет создана вспомогательная сборка со всеми локализуемыми ресурсами.

<Resource Include="RunIcon.JPG">

<Localizable>False</Localizable>

</Resource>

Файл RunIcon.JPG локализовывать не нужно, так как он должен быть одинаков для всех языков и региональных параметров. Свойству Localizable присвоено значение false. Таким образом, этот элемент остается в независимой от языка основной сборке, а не переносится во вспомогательную сборку. Для всех некомпилируемых ресурсов свойству Localizable по умолчанию присвоено значение true.

Локализация диалогового окна "Выполнить"

Анализ

После сборки приложения первым шагом в локализации является анализ локализуемых ресурсов из вспомогательной сборки. В процессе изучения этого раздела используется демонстрационное средство LocBaml, которое можно найти в разделе Пример средства LocBaml. Обратите внимание, что LocBaml ― только демонстрационное средство, предназначенное помочь начать работу по созданию средства локализации, встраиваемого в процесс локализации. С помощью LocBaml выполните следующую команду для анализа: LocBaml /parse RunDialog.resources.dll /out:. В результате будет создан файл RunDialog.resources.dll.CSV.

Предупреждение

Инструмент LocBaml работает только с WPF для проектов платформа .NET Framework, он не работает с WPF для .NET.

Локализация

Для редактирования этого файла можно воспользоваться любым редактором CSV, поддерживающим Юникод. Исключите все записи с категорией локализации "Нет". Должны остаться следующие записи.

Ключ ресурса Категория локализации Значение
Button_1:System.Windows.Controls.Button.$Content Кнопка ОК
Button_2:System.Windows.Controls.Button.$Content Кнопка Cancel
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 (например, en-US), и замените исходный файл ресурсов DLL.

Загрузка вспомогательных ресурсов

MyDialog.exe en-US\MyDialog.resources.dll de-DE\MyDialog.resources.dll
Код Исходный английский BAML Локализованный BAML
Ресурсы, не зависящие от языка и региональных параметров Другие ресурсы на английском языке Другие ресурсы, локализованные для немецкого языка

Платформа .NET автоматически выбирает вспомогательную сборку ресурсов для загрузки в зависимости от приложения Thread.CurrentUICulture. По умолчанию используются язык и региональные параметры операционной системы. Если вы используете немецкую версию Windows, загружается файл de-DE\MyDialog.resources.dll. Если вы используете английскую версию Windows, загружается файл en-US\MyDialog.resources.dll. Можно задать для приложения резервный ресурс, указав атрибут NeutralResourcesLanguage в вашем файле AssemblyInfo проекта. Например, если будет указано:

[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]

файл en-US\MyDialog.resources.dll используется с немецкая версия Windows, если следующие файлы не доступны: de-DE\MyDialog.resources.dll или de\MyDialog.resources.dll.

Домашняя страница сайта Майкрософт для Саудовской Аравии

На рисунке ниже показаны английская и арабская домашние страницы. Полный пример создания такой графики см. в разделе Пример Globalization Homepage.

Английский.

Screenshot showing an English home page.

Арабский:

Screenshot showing an Arabic home page.

Проектирование глобальной домашней страницы Майкрософт

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

FlowDirection

Homepage.xaml:

<Page x:Uid="Page_1" x:Class="MicrosoftSaudiArabiaHomepage.Homepage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://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 и его дочерние элементы, так что макет этого пользовательского интерфейса будет перевернут, чтобы направление письма было справа налево, как и ожидал арабский пользователь. Можно переопределить поведение наследования, указав в любом элементе явно FlowDirection. Свойство FlowDirection доступно в любом элементе FrameworkElement или документе, связанном с элементом, и имеет неявное значение LeftToRight.

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

FlowDirection="LeftToRight"

Screenshot showing the gradient flow from left to right.

FlowDirection="RightToLeft"

Screenshot showing the gradient flow from right to left.

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

Обратите внимание, что на всей домашней странице Homepage.xaml, помимо фиксированной ширины и высоты, заданной для всего пользовательского интерфейса вверху 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"). Вы можете задавать собственные предпочтения для подмены шрифта путем создания собственного составного шрифта и указания его использования для конкретных языков и диапазонов кодовых точек.

Дополнительные сведения о составных шрифтах см. в разделе FontFamily.

Локализация домашней страницы Майкрософт

Для локализации этого приложения можно выполнить те же действия, что и в примере локализации диалогового окна "Выполнить". Локализованный CSV-файл для арабского языка доступен в разделе Пример Globalization Homepage.