Многоязычный пользовательский интерфейс ( MUI ) позволяет локализовать пользовательский интерфейс приложения .
Многоязыковой пользовательский интерфейс предоставляется корпорацией Microsoft как интегрированная функция ее операционных систем от Windows 11 до Windows 2000 с некоторыми ограничениями в более старых версиях.
MUI используется для локализации флагманских продуктов Microsoft Microsoft Windows и Microsoft Office и как открытая технология может использоваться в любом приложении, работающем в версии Windows, поддерживающей MUI.
Основная функция MUI — это определяемые пользователем системные настройки для предпочитаемого языка, которые могут использоваться/совместно использоваться всеми приложениями на компьютере. Следующая по важности функция — это системные функции (например, LoadString), которые используют эту настройку для загрузки ресурсов пользовательского интерфейса во время выполнения из ресурсов на предпочитаемом пользователем языке. Для поддержки MUI приложению нужно только хранить ресурсы пользовательского интерфейса как ресурсы, специфичные для языка, и использовать LoadStrIng для их загрузки во время выполнения.
MUI также поддерживает хранение активов пользовательского интерфейса в виде отдельных одноязычных файлов, что обеспечивает гибкость разработки и развертывания. Эта функция необязательна. Ресурсы могут храниться в двоичном файле приложения.
MUI также предоставляет системные функции, которые позволяют настраивать пользовательское и расширенное поведение локализации.
Технология MUI [1] интегрирована в ОС Windows и может быть использована в приложении путем сохранения локализуемых активов в качестве ресурсов предписанным образом и использования функций win32 с поддержкой MUI для чтения ресурсов.
Относительно простая реализация MUI в приложении сохраняет строки каждого языка в ресурсе таблицы строк двоичного файла и использует функцию Win32 LoadString для загрузки строк во время выполнения. Никакой другой конфигурации или кода, связанных с MUI, не требуется. При желании можно реализовать следующие дополнительные возможности MUI:
Дизайн MUI пытается предоставить общий способ хранения информации о локализации приложения, который смягчает ограничения более традиционных и монолитных дизайнов для локализации, таких как включение всех языков в файлы логики приложения (т.е. ресурсы). С MUI возможны следующие сценарии развертывания:
Следующие термины, связанные с многоязыковым пользовательским интерфейсом, используются в документации Microsoft или взяты из нее.
Нейтральный по отношению к языку (LN): описывает то, что передает значение независимо от языка зрителя, например, изображение без текста или других локализуемых аспектов.
Ресурс LN: ресурс, который является общим и устанавливается для всех языковых версий приложения.
Файл LN: двоичный файл Windows, содержащий логику приложения и независимые от языка ресурсы.
Языко-специфичный (LS): описывает что-то, что имеет существенно разное значение в зависимости от языка зрителя. Наиболее распространенными элементами LS являются строки интерфейса, но могут быть и другие элементы, такие как изображение с текстом в нем
Файл ресурсов LS: набор ресурсов, локализованных для одного языка; также известный как файл MUI.
Выбор языка сохраняется системой для системы (общий для всех пользователей и может использоваться по умолчанию для нового пользователя) и для каждого пользователя. Эти выборы могут быть изменены пользователем через панель управления системы, но не могут быть изменены приложением.
Эти настройки управляют языком, который ОС использует для элементов пользовательского интерфейса. Приложения также могут использовать эти настройки, и через системные функции с поддержкой MUI (например, LoadString) использование происходит автоматически и прозрачно (не требует использования специфичного для MUI кода). Но использование этих настроек является необязательным и настраиваемым. Приложение может быть разработано так, чтобы игнорировать языковые настройки. Или оно может использовать их способами, отличными от тех, которые предусмотрены системными функциями с поддержкой MUI.
Приложение может использовать функции MUI [2] для чтения языковых предпочтений, которые по умолчанию соответствуют выбору пользователя [предполагается] и представляют собой список языков в порядке предпочтения. Эти предпочтения предоставляются на уровнях системы, пользователя, процесса и потока [предполагается, что изменение на более высоком уровне изменяет предпочтения для более низких уровней].
Приложение может изменять эти списки языковых предпочтений (через SetThreadPreferredUILanguages и другие функции), чтобы влиять на поведение MUI. Например:
LPCWSTR languageIdSpec = L "en-US \0 " ; ULONG langCount = 1 ; if ( ! SetThreadPreferredUILanguages ( MUI_LANGUAGE_NAME , languageIdSpec , & langCount )) MessageBoxW ( NULL , L "Невозможно установить предпочтительный язык пользовательского интерфейса потока." , NULL , MB_ICONERROR );
MUI обеспечивает поддержку локализованных ресурсов, хранящихся в двоичных файлах Windows (также известных как Win32 PE) (DLL, EXE, SYS) — обычно это файлы DLL.
Ресурсы для языка могут храниться либо в двоичном файле приложения, либо в файле MUI (он же LS) — по одному на язык. Чтобы MUI находил ресурсы, файл MUI должен находиться в том же каталоге, что и связанный с ним файл LN, и иметь такое же имя, как файл LN, плюс ". LCID .mui". Например, для файла LN my-lib.dll файл MUI для en-US будет называться my-lib.dll.0409.mui .
Строковые ресурсы кодируются в виде таблицы строк следующим образом:
ЯЗЫК LANG_ENGLISH, SUBLANG_NEUTRALСТРОКОВАЯ ТАБЛИЦАНАЧИНАТЬ1 L"текст сообщения"КОНЕЦ
Несколько функций win32, считывающих ресурсы приложения, поддерживают MUI, включая LoadString, FormatMessage и LoadImage. [3]
Каждая функция пытается прочитать ресурс для языка, выбранного глобальными языковыми предпочтениями, из ресурсов приложения или связанных файлов MUI (совместно расположенных с файлом LN и следующих соглашению об именовании). Каждая функция использует глобальные языковые предпочтения для выбора доступного языка. Если загрузка ресурса для первого предпочитаемого языка не удалась либо из-за того, что файл MUI не существует, либо из-за того, что ресурс не существует в файле MUI, функция попробует следующий предпочитаемый язык и так далее, пока не будут опробованы все предпочтения. Если загрузка не удалась для всех предпочитаемых языков, то пробует файл LN.
Наиболее часто используемая функция — LoadString, которая загружает строки из ресурса таблицы строк. Пример использования LoadString:
wchar_t * resourceCharArray ; int resourceLength = LoadStringW ( moduleHandle , resourceId , ( LPWSTR ) & resourceCharArray , 0 ); if ( ! resourceLength ) { MessageBoxW ( NULL , L "Не удалось найти ресурс." NULL , MB_ICONERROR ) ; return -1 ; } wchar_t * text = ( LPWSTR ) malloc ( ( resourceLength + 1 ) * sizeof ( wchar_t )); wcsncpy ( text , resourceCharArray , resourceLength ); text [ resourceLength ] = L '\0' ; // завершение нулем
Это извлекает адрес буфера символов текста ресурса, который не обязательно будет иметь нулевой конец. Затем это копирует символы в новый буфер и добавляет нулевой конец. Другой вариант — заставить LoadString скопировать строку в переданный буфер, но это требует использования буфера фиксированной длины, что имеет недостатки, такие как обычное выделение большего, чем нужно, или усечение, если слишком короткий.
Как ни странно, в документации MS для LoadString не упоминается его взаимодействие с MUI — использование языковых предпочтений.
FormatMessage также поддерживает MUI. Его страница справки по функциям описывает его взаимодействие с языковыми предпочтениями пользователя, когда параметр dwLanguageId передается как 0. Но FormatMessage считывает данные из таблицы сообщений , а не из таблицы строк , и, как говорит Рэймонд Чен, «никто на самом деле не использует таблицы сообщений». [4]
Документация MS рекомендует хранить активы пользовательского интерфейса как ресурсы, поскольку MUI полностью поддерживает извлечение из этого хранилища, но в ней отмечается, что MUI поддерживает любой другой формат файла, такой как XML, JSON или простой текстовый файл. [5] Это подразумевает, что использование аспекта извлечения ресурсов MUI не является обязательным для приложения, поддерживающего MUI. Приложение может использовать свою собственную, настраиваемую логику извлечения активов пользовательского интерфейса.
Для поддержки MUI приложение должно использовать системные языковые настройки. Логика извлечения ресурсов пользовательского пользовательского интерфейса может опционально использовать функцию MUI GetFileMUIPath для использования местоположения файла MUI и соглашений об именовании.
В документации MS MUI описаны следующие концепции, но неясно, как они связаны с MUI и какую ценность они предлагают:
Основные задачи по поддержке/внедрению MUI:
После выполнения основных задач приложение становится MUI-совместимым. Но есть и другие возможности MUI, которыми приложение может воспользоваться по желанию.
Базовые задачи подразумевают хранение всех языков в ресурсах двоичного файла приложения, что означает, что он не является нейтральным по отношению к языку. Эта структура обеспечивает все преимущества локализации во время выполнения MUI и простого развертывания в один файл, но не обеспечивает гибкости развертывания, которую обеспечивает MUI. Чтобы воспользоваться гибкостью развертывания:
Для хранения локализованных ресурсов в форматах, отличных от ресурсов, приложение должно реализовать механизм чтения ресурсов во время выполнения на основе системных настроек языка (см. GetThreadUILanguage). Другими словами, приложение загружает ресурсы пользовательского интерфейса на основе системных настроек языка без использования LoadString. Приложение может использовать расположение файла MUI на язык и соглашение об именовании с помощью GetFileMUIPath.
Технология MUI была разработана в ответ на локализованные версии и как их усовершенствование — более старая технология глобализации и развертывания пакетов программного обеспечения. В этом разделе описываются различия и преимущества MUI по сравнению с локализованными версиями.
Windows, локализованная с помощью пакета MUI, достигает той же цели, что и локализованная версия, но есть ключевые различия. Хотя обе версии отображают меню и диалоги на целевом языке, только локализованная версия использует переведенные имена файлов и папок. [что это значит? некоторые специальные папки локализуются (Документы, Загрузки, ...), но созданный пользователем файл/папка не локализуются (ОС). Разве языковой пакет не локализует специальные имена папок? Что еще он может сделать?]
Локализованная версия Windows переводит базовую операционную систему, а также все включенные программы [какие программы?], включая имена файлов и папок [так что она локализует имена файлов/папок. это противоречит вышесказанному], имена объектов [что такое объект?], строки в реестре [на самом деле? какие строки?] и любые другие внутренние строки, используемые Windows, на определенный язык. Локализованные версии Windows поддерживают обновление с предыдущей локализованной версии, а ресурсы пользовательского интерфейса полностью локализованы, чего нельзя сказать о версиях MUI продукта. [что не так с MUI?]
Версия MUI не содержит переведенных административных функций, таких как записи реестра [записи реестра — это функции?] и элементы в консоли управления Microsoft .
Одним из преимуществ версии MUI является то, что каждый пользователь компьютера может использовать другой язык. [8] Для локализованной версии ОС это невозможно. Это может быть возможно для локализованных приложений, но требует установки нескольких версий; по одной для каждого языка, и это может привести к проблемам с местом для хранения приложений и параллельной установкой. С MUI одна версия поддерживает несколько языков, а ОС и приложения используют предпочитаемый пользователем язык. Кроме того, та же ОС может размещать приложение, которое использует любой из поддерживаемых приложением языков, который может отличаться от выбранного ОС языка и даже языка, который не поддерживается ОС.
Многоязыковой интерфейс пользователя был представлен в Windows 2000 и поддерживается в каждой последующей версии Windows.
Продукты MUI для этих версий были доступны только через оптовые соглашения от Microsoft. Они не были доступны через розничные каналы. Однако некоторые OEM-производители распространяли продукт. [ необходима цитата ]
Вплоть до Windows XP пакеты MUI для продукта применяются поверх английской версии для обеспечения локализованного пользовательского опыта. Всего существует 5 наборов пакетов MUI.
Windows Vista усовершенствовала технологию MUI для отделения английских ресурсов от двоичных файлов логики приложения . Файлы логики приложения теперь нейтральны к языку, то есть независимы от языка. Другими словами, файлы логики приложения больше не ориентированы на английский язык. Такое разделение позволяет полностью менять языки, не изменяя основные двоичные файлы Windows, и устанавливать несколько языков с использованием одних и тех же двоичных файлов логики приложения. Языки применяются как языковые пакеты, содержащие ресурсы, необходимые для локализации части или всего пользовательского интерфейса в Windows Vista.
Пакеты MUI доступны пользователям Windows Vista Enterprise, а также в качестве дополнительных компонентов Ultimate для пользователей Windows Vista Ultimate.
Начиная с Windows Vista, набор связанных API MUI также доступен разработчикам для разработки приложений. [Это позволяет любому использовать технологию MUI?]
На момент запуска были выпущены следующие 16 языковых пакетов:
23 октября 2007 года были выпущены оставшиеся 19 языковых пакетов:
Многоязыковой интерфейс пользователя доступен пользователям Windows 7 Enterprise и Ultimate, а также Windows Phone 7.
Начиная с Windows 7, Microsoft начала называть «пакет MUI» «языковым пакетом»; не путать с пакетом языкового интерфейса (LIP). [9]
На момент запуска были выпущены следующие 15 языковых пакетов [10] (китайский (Гонконг) недоступен на мобильных устройствах):
31 октября 2009 года были выпущены оставшиеся 22 языковых пакета (эстонский, хорватский, латышский, литовский, румынский, словацкий, словенский, сербский, болгарский, иврит, арабский и тайский недоступны на мобильных устройствах):
На момент запуска поддерживалось только шесть языков.
С запуском Windows Phone 7.5 27 сентября 2011 года было добавлено еще двадцать языков (турецкий и украинский не поддерживались в качестве языков отображения до Windows Phone 8). [11] Первыми LIP для Windows Phone 7 были индонезийский и малайский с обновлением Tango. [12]
Начиная с Windows 8/RT, большинство редакций Windows могут загружать и устанавливать все языковые пакеты, [13] за некоторыми исключениями:
Начиная с Windows 10 версии 1803, Microsoft начала использовать термин «Local Experience Pack» (LXP) в некоторых местах [магазин?] вместо старого термина «Language Pack», но они работают одинаково. [18] Помимо установки через параметры Windows, эти 110 LXP также доступны через Microsoft Store (приложение и веб); последний позволяет удаленную установку для потребительских версий Windows. [19] Как и все приложения из Microsoft Store, в приложении Microsoft Store отображаются только те LXP, которые совместимы с этим устройством Windows.
LXP обновляется через Microsoft Store; вне обычного цикла обновления Windows. [20]
Поддерживаемые языки в зависимости от версии ОС следующие:
Многоязычный пользовательский интерфейс для Windows Phone появился только в версии 7.0.
Технология MUI защищена международным патентом под названием «Многоязычный пользовательский интерфейс для операционной системы». [21] Изобретателями являются Бьорн К. Реттиг, Эдвард С. Миллер, Грегори Уилсон и Шань Сюй.