Общие сведения о глобализации и локализации 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 поставляется англоязычному пользователю.
Примеры локализации WPF
В этом разделе приводятся примеры локализованных приложений, которые призваны облегчить понимание процесса сборки и локализации приложений WPF.
Пример диалогового окна "Выполнить"
На приведенном ниже рисунке показан пример диалогового окна Выполнить.
Английский.
Немецкий.
Разработка глобального диалогового окна "Выполнить"
В этом примере показано создание диалогового окна Выполнить с помощью 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.
Английский.
Арабский:
Проектирование глобальной домашней страницы Майкрософт
Этот макет веб-сайта Майкрософт для Саудовской Аравии показывает функциональные возможности глобализации, предоставляемые для языков с порядком чтения справа налево (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"
FlowDirection="RightToLeft"
Избегайте использования фиксированных размеров для панелей и элементов управления
Обратите внимание, что на всей домашней странице 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.
.NET Desktop feedback