Поделиться через


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

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

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

Локализация — это перевод ресурсов приложения в локализованные версии для определенных языков и региональных параметров, поддерживаемых приложением. При локализации в WPF используются API в пространстве имен System.Windows.Markup.Localizer. Эти API являются основой для средства командной строки Пример LocBaml Tool Sample. Сведения о создании и использовании 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 использует в каталоге Windows\Fonts шрифт GlobalUserInterface.composite.

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

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

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

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

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

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

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

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

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

    • Установите 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, культурно нейтральный, поставляется клиенту, говорящему на английском языке.

Диаграмма, показывающая рабочий процесс локализации.

Диаграмма, показывающая нелокализованный рабочий процесс.

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

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

Пример диалогового окна запуска

Следующие графики показывают выходные данные из примера диалогового окна Run.

английский:

снимок экрана, показывающий диалоговое окно

немецкий:

снимок экрана, показывающий немецкое диалоговое окно

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

В этом примере создается диалоговое окно запуска с помощью 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. Как следует ожидать от имени свойства, это позволяет столбцам совместно использовать один и тот же размер. Итак, когда "Обзор..." переводится на более длинную строку "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 Tool Sample . Обратите внимание, что 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 Кнопка ХОРОШО
Кнопка_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 Кнопка Отменить
Button_3:System.Windows.Controls.Button.$Content Кнопка Просмотреть…
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 Текст Открыть:
Window_1:System.Windows.Window.Title Титул Бежать

Создание

Последний шаг локализации включает создание новой локализованной спутниковой сборки. Это можно сделать с помощью следующей команды 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. Если вы используете немецкую версию 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.

Домашняя страница Microsoft Саудовская Аравия

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

английский:

снимок экрана английской домашней страницы.

арабский язык:

снимок экрана, показывающий домашнюю страницу на арабском языке.

Разработка домашней страницы Глобальной корпорации Майкрософт

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

FlowDirection

Домашняя страница.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"

снимок экрана: поток градиента слева направо.

Направление потока="Справа налево"

снимок экрана: градиентный поток справа налево.

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

Обратите внимание на 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 (см. раздел Локализация приложения), его можно увидеть в 6-м столбце строки TextBlock_1 в выходном .csv файле:

Ключ ресурса Категория Удобочитаемый Изменяемые Комментарий Ценность
TextBlock_1:System.Windows.Controls.TextBlock.$Content Текст ИСТИНА ИСТИНА Этот символ используется в качестве декоративного правила. |

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

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

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

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

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