MUI (локализация)

MUI (англ. Multilingual User Interface) — динамическая система локализации, используемая в Microsoft Windows, Windows Phone и совместимых приложениях. Технология MUI позволяет хранить языковые файлы независимо от бизнес-логики приложения, что облегчает разработку и распространение локализованного программного обеспечения[1].

Система, интерфейс программирования и файлы локализации (так называемые Language Packs — языковые пакеты) впервые появились в Windows 2000. В Windows Vista возможности MUI были существенно расширены, появилось подключение к приложениям третьих сторон. В Windows 7 к языковым пакетам были добавлены Language Interface Packs (LIP), которые в Windows 10 (начиная с билдa 1809) были заменены на Local Experience Packs (LXP).

Что важно знать
MUI
Разработчик Microsoft
Написана на C++
Первый выпуск 17 февраля 2000
Лицензия Проприетарная
Сайт Microsoft Learn — Multilingual User Interface

Общие сведения

MUI встроена в Windows и используется приложениями путем хранения локализуемых ресурсов в языковом файле и загрузки их через MUI API во время выполнения[1].

Один из простейших способов интеграции MUI — размещение строк каждого языка в ресурсе string-table исполняемого файла программы с использованием Win32-функции LoadString для загрузки строк в ходе работы. Для этого не требуется дополнительная конфигурация, другие возможности MUI по желанию:

  • Хранить ресурсы каждого языка в отдельной DLL — для гибкости установки
  • Управлять потреблением локализуемых данных, например использовать язык, отличный от системного, через MUI API
  • Хранить локализуемые данные не как ресурсы, а в других форматах.

Дизайн MUI предоставляет стандартный способ хранения данных локализации и преодолевает ограничения традиционных монолитных подходов (все языки в файлах ресурсов). С использованием MUI возможны такие сценарии развертывания:

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

Технологические компоненты

Терминология

Термины, связанные с MUI, используются и определяются в документации Microsoft:[2]

  • Языково-независимый (LN): элемент, смысл которого не зависит от языка, например изображение без текста или иных локализуемых компонентов.
  • LN-ресурс: ресурс, общий для всех языковых версий приложения.
  • LN-файл: Windows-бинарник, содержащий логику приложения и языково-независимые ресурсы.
  • Языково-специфичный (LS): компонент, различающийся для разных языков. Обычно это строки интерфейса или изображения с текстом.
  • LS-файл ресурсов: набор ресурсов для одного языка (файл MUI).

Языковые предпочтения

Языковой выбор сохраняется отдельно для системы в целом (он применяется для всех пользователей и становится дефолтным для новых), а также индивидуально для каждого пользователя. Пользователь может изменить эти предпочтения через Панель управления, но сами приложения этого сделать не могут.

Языковые предпочтения определяют язык интерфейса ОС и могут учитываться приложениями, особенно при использовании функций Windows с поддержкой MUI (например, LoadString) — тогда язык подбирается автоматически, без MUI-специфичного кода. Использование этих предпочтений опционально: приложение может их игнорировать или обрабатывать самостоятельно.

Приложение может использовать MUI-функции[3] для получения списка языков (обычно — предпочтения пользователя) на разных уровнях: системном, пользовательском, для процесса и отдельного потока (приоритет уровней — от общего к частному).

Приложение может изменять язык текущего потока (например, через SetThreadPreferredUILanguages):

LPCWSTR languageIdSpec = L"en-US\0";
ULONG langCount = 1;
if (!SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, languageIdSpec, &langCount))
    MessageBoxW(NULL, L"Unable to set thread preferred UI language.", NULL, MB_ICONERROR);

Хранение ресурсов

MUI поддерживает хранение локализованных ресурсов в форматах бинарных файлов Windows (EXE, DLL, SYS), как правило — в DLL.

Ресурсы для каждого языка могут храниться как в основном файле приложения, так и в отдельном MUI-файле (LS) — для каждого языка свой файл. Чтобы MUI смогла их найти, MUI-файл должен лежать в той же папке, что и связанный LN-файл, и называться по шаблону <имя LN-файла>.<LCID>.mui (например: my-lib.dll.0409.mui для en-US).

Строковые ресурсы определяются как таблицы строк:

LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
STRINGTABLE
BEGIN
1 L"текст сообщения"
END

Загрузка ресурсов

Чтение локализованных ресурсов поддерживается несколькими функциями Win32, в том числе LoadString, FormatMessage и LoadImage[4].

При вызове эти функции поочередно пытаются загрузить ресурс на выбранном языке (согласно глобальным языковым предпочтениям) из ресурсов приложения либо из соответствующих MUI-файлов (LN+LCID.mui). Если по каким-то причинам невозможно получить ресурс на первом языке из списка (нет файла или отсутствует сам ресурс), пробуются следующие предпочтения, пока не будет либо найден ресурс, либо исчерпан список. Если ничего не найдено — обращение к LN-файлу.

Наиболее часто используется функция LoadString, возвращающая указатель на строку из string-table:

wchar_t *resourceCharArray;
int resourceLength = LoadStringW(moduleHandle, resourceId, (LPWSTR)&resourceCharArray, 0);
if (!resourceLength)
{
    MessageBoxW(NULL, L"Unable to find resource.", NULL, MB_ICONERROR);
    return -1;
}

wchar_t *text = (LPWSTR)malloc((resourceLength + 1) * sizeof(wchar_t));
wcsncpy(text, resourceCharArray, resourceLength);
text[resourceLength] = L'\0'; // завершение строкового буфера нулём

Загрузка ресурса может возвращать указатель на массив символов без автоматического добавления нулевого символа-окончания. Для «безопасного» копирования в новый буфер требуется добавить завершающий нуль вручную.

FormatMessage также поддерживает MUI: если параметр dwLanguageId равен 0, выбирается язык пользователя. Однако функция работает с message-table, которая редко используется на практике[5].

Нересурсное хранение и загрузка

Microsoft рекомендует хранить UI-ресурсы в виде ресурсов, так как MUI полностью поддерживает их извлечение. Однако поддерживаются и другие форматы — XML, JSON, текстовые файлы. Это означает, что фреймворк загрузки ресурсов MUI не обязателен: приложение может реализовывать собственную логику поиска и извлечения UI-данных, при этом считаться MUI-совместимым, если оно использует системные языковые предпочтения. Также возможно использовать функцию GetFileMUIPath для поиска MUI-файлов по стандарту имени/расположения[6].

Дополнительные аспекты

Документация по MUI описывает также:

  • Файл конфигурации ресурсов[7]
  • Редирект строк реестра[8]

Реализация

Базовая поддержка MUI в приложении включает:

  • Использование LoadString и аналогичных функций для загрузки локализованных ресурсов с учётом языковых настроек системы/пользователя
  • Создание исходных файлов ресурсов для каждого языка (рекомендуется отдельный ресурсный файл для каждого)

После этого приложение считается совместимым с MUI. Для получения дополнительных преимуществ MUI:

  • Локализованные строки выносятся из логики программы
  • Локализация хранится в языковых пакетах по отдельным языкам или в LIP/LXP, размещённых в одной папке с бинарными файлами приложения

Если данные хранятся не как ресурсы, приложение самостоятельно реализует механизм загрузки UI на основе языковых предпочтений (например, через GetThreadUILanguage). Можно использовать стандартные пути/имена MUI-файлов при помощи GetFileMUIPath.

Преимущества по сравнению со статической локализацией

MUI создавалась как развитие и альтернатива технологии статической локализации — устаревшего подхода к интернационализации и распространению программ.

Локализация через языковой пакет (Language Pack) и статическая локализация достигают одинаковой цели — отображение интерфейса на целевом языке. Однако только «локализованная версия» ОС предоставляет переводы имён системных папок (например, «Документы», «Загрузки»), а не пользовательских файлов и папок[9].

Языковой пакет в Windows переводит базовую ОС и все приложения с поддержкой MUI на выбранный язык. В классических локализованных версиях Windows пользовательский интерфейс полностью переведён и обновляется при апгрейде, чего не всегда достигают MUI-пакеты[9].

Языковые пакеты не переводят административные данные, например содержимое реестра и элементы Microsoft Management Console.

Одно из преимуществ MUI — каждый пользователь Windows может установить свой язык интерфейса системы и программ, чего нельзя добиться с помощью статической локализации. Также ОС, локализованная через Language Pack, поддерживает использование приложений, локализованных с помощью других языковых пакетов.

История

Технология MUI появилась в Windows 2000 и поддерживается во всех последующих версиях Windows.

Windows 2000 и Windows XP

В этих версиях языковые пакеты и MUI распространялись корпорацией Microsoft только по корпоративным лицензиям. В рознице они не продавались, однако некоторые OEM-производители комплектовали свою продукцию MUI[9].

Языки в Windows XP

В Windows 2000 и Windows XP языковые пакеты заменяют встроенные строки интерфейса (обычно на американском английском). Всего для данных ОС доступно 5 наборов языков:

Набор 1

  • Deutsch — немецкий
  • Français — французский
  • 한국어 — корейский
  • 中文 (简体) — китайский (упрощённый)
  • 中文 (繁體) — китайский (традиционный)
  • 日本語 — японский

Набор 2

  • Español — испанский
  • Italiano — итальянский
  • Nederlands — нидерландский
  • Português (Brasil) — португальский (Бразилия)
  • Svenska — шведский
  • עברית — иврит
  • العربية — арабский

Набор 3

  • Čeština — чешский
  • Dansk — датский
  • Norsk bokmål — норвежский (букмол)
  • Suomi — финский
  • Русский — русский

Набор 4

  • Magyar — венгерский
  • Polski — польский
  • Português (Portugal) — португальский (Португалия)
  • Türkçe — турецкий
  • Ελληνικά — греческий

Набор 5

  • Eesti — эстонский
  • Hrvatski — хорватский
  • Latviešu — латышский
  • Lietuvių — литовский
  • Română — румынский
  • Slovenčina — словацкий
  • Slovenščina — словенский
  • Български — болгарский
  • ไทย — тайский

Windows Vista

В Windows Vista протокол MUI был обновлён: языковые ресурсы вынесены из логики приложения (LN-файл), что позволило совершать полноценное переключение языков интерфейса. Языковые пакеты стали распространяться как Language Packs, устанавливаемые независимо от кода приложения.

Языковые пакеты доступны для редакций Windows Vista Enterprise и как дополнительный компонент для Windows Vista Ultimate.

Начиная с Vista, MUI-API стали доступны сторонним разработчикам для создания программ с поддержкой MUI.

Изначально были доступны 16 языковых пакетов:

  • Dansk — датский
  • Deutsch — немецкий
  • English — английский
  • Español — испанский
  • Français — французский
  • Italiano — итальянский
  • Nederlands — нидерландский
  • Norsk bokmål — норвежский (букмол)
  • Português (Brasil) — португальский (Бразилия)
  • Suomi — финский
  • Svenska — шведский
  • Русский — русский
  • 한국어 — корейский
  • 中文 (简体) — китайский (упрощённый)
  • 中文 (繁體) — китайский (традиционный)
  • 日本語 — японский

23 октября 2007 года вышли ещё 19 языковых пакетов:

  • Čeština — чешский
  • Eesti — эстонский
  • Hrvatski — хорватский
  • Latviešu — латышский
  • Lietuvių — литовский
  • Magyar — венгерский
  • Polski — польский
  • Português (Portugal) — португальский (Португалия)
  • Română — румынский
  • Slovenčina — словацкий
  • Slovenščina — словенский
  • Srpski — сербский (латиница)
  • Türkçe — турецкий
  • Ελληνικά — греческий
  • Български — болгарский
  • Українська — украинский
  • עברית — иврит
  • العربية — арабский
  • ไทย — тайский

Windows 7

Языковые пакеты доступны для Windows 7 Enterprise и Windows 7 Ultimate, а также Windows Phone 7.

Впервые введён формат Language Interface Pack (LIP), обеспечивающий частичные переводы на языки, для которых нет полных Language Pack[10].

Языки Windows 7 (ПК)

На запуске доступны следующие 15 языковых пакетов[11] (китайский для Гонконга отсутствует на мобильных):

  • Deutsch — немецкий
  • English (United Kingdom) — английский (Великобритания)
  • English (United States) — английский (США)
  • Español — испанский
  • Français — французский
  • Italiano — итальянский
  • Nederlands — нидерландский
  • Polski — польский
  • Português (Brasil) — португальский (Бразилия)
  • Русский — русский
  • 한국어 — корейский
  • 中文 (简体) — китайский (упрощённый)
  • 中文 (繁體) — китайский (традиционный)
  • 中文 (香港) — китайский (Гонконг)
  • 日本語 — японский

31 октября 2009 года вышли ещё 22 языковых пакета (многие недоступны для мобильных версий):

  • Čeština — чешский
  • Dansk — датский
  • Eesti — эстонский
  • Hrvatski — хорватский
  • Latviešu — латышский
  • Lietuvių — литовский
  • Magyar — венгерский
  • Norsk bokmål — норвежский (букмол)
  • Português (Portugal) — португальский (Португалия)
  • Română — румынский
  • Slovenčina — словацкий
  • Slovenščina — словенский
  • Srpski — сербский (латиница)
  • Suomi — финский
  • Svenska — шведский
  • Türkçe — турецкий
  • Ελληνικά — греческий
  • Български — болгарский
  • Українська — украинский
  • עברית — иврит
  • العربية — арабский
  • ไทย — тайский

Языки Windows Phone 7

При запуске только 6 языков поддерживались системой:

  • Deutsch — немецкий
  • English (United Kingdom) — английский (Великобритания)
  • English (United States) — английский (США)
  • Español — испанский
  • Français — французский
  • Italiano — итальянский

С выходом Windows Phone 7.5 (27 сентября 2011 года) добавлены ещё 20 языков (турецкий и украинский поддерживаются только с Windows Phone 8)[12]. Первые LIP для Windows Phone 7 — индонезийский и малайский (Tango-обновление)[13].

  • Bahasa Indonesia — индонезийский
  • Bahasa Melayu — малайский
  • Čeština — чешский
  • Dansk — датский
  • Magyar — венгерский
  • Nederlands — нидерландский
  • Norsk bokmål — норвежский (букмол)
  • Polski — польский
  • Português (Brasil) — португальский (Бразилия)
  • Português (Portugal) — португальский (Португалия)
  • Suomi — финский
  • Svenska — шведский
  • Türkçe — турецкий
  • Ελληνικά — греческий
  • Русский — русский
  • Українська — украинский
  • 한국어 — корейский
  • 中文 (简体) — китайский (упрощённый)
  • 中文 (繁體) — китайский (традиционный)
  • 日本語 — японский

Windows 8/8.1/RT

Начиная с Windows 8/RT почти все редакции Windows позволяют скачивать и устанавливать языковые пакеты и LIP[14], за некоторыми исключениями:

  • В редакциях типа Single Language разрешена установка только одного Language Pack[15], как и в обычных версиях Windows 7 и ранее.
  • В OEM-версиях Windows перечень предустановленных и загружаемых LIP зависит от производителя оборудования и страны (или мобильного оператора, для устройств с SIM-картой). Возможна предустановка нескольких языков на устройстве, при этом фактические ограничения задаются производителем. С Windows 8 (и Phone 8) эта модель применяется к ПК и телефонам, позже она была изменена в Windows 10 версии 1803 и возвращена в 1809. Пользователь может выполнить «чистую» установку через Media Creation Tool и обойти привязку по региону, установив любой язык.
    • Обновления Windows не затрагивают текущие языки системы, но при крупном обновлении система может сбросить язык по умолчанию.
    • Некоторые языки поддерживаются только на Xbox/Surface Duo.
    • Часть LIP требует наличия соответствующего Language Pack[16].

Windows 10

В Windows 10 начиная с версии 1803 LIP постепенно заменяются на Local Experience Pack (LXP)[17]. Помимо установки через настройки Windows, LXPs доступны и через Microsoft Store[18], что позволяет удалённую установку языков для домашних версий[19].

Поддерживаемые языки

Список поддерживаемых языков зависит от версии операционной системы. (См. оригинальную таблицу MUI и LIP с отметками поддерживаемости по версиям Windows.)

Патенты

Технология MUI защищена международным патентом «Multilingual User Interface for an Operating System». Изобретатели: Бьёрн С. Реттиг, Эдвард С. Миллер, Грегори Вилсон и Шан Сюй[20].

Примечания