«Трудности» перевода приложений для Windows Store



    У меня было локализованное приложение для Windows Store. В нем была возможность переключить язык на английский, но даже с английским интерфейсом приложение продолжало удивлять англоязычных пользователей русскими кириллическими «иероглифами» на заставке и логотипах. А русскоязычные пользователи в свою очередь удивлялись тому, что приложение называлось не по-русски. О том, как получилось такое безобразие и как сделать хорошо эта статья.

    Всех, кому интересна разработка универсальных приложений Windows, приглашаю под кат.

    Практически все WP8/WinRT/WinJs разработчики (даже те, кто никогда не переводили свои приложения на другие языки) знают, что для локализации приложения необходимо создать папку Strings в которой создаются подпапки с наименованиями эквивалентными кодам языка. Далее в этих подпапках создаются файлы ресурсов resources.resjson для html5 приложений или resources.resw для xaml приложений.



    Строки локализованного текста вносятся в словари ресурсов парами ключ/строка и извлекаются после с помощью подобного кода. Пример на C#:

    Windows.ApplicationModel.Resources.ResourceLoader resload;
    resload = new Windows.ApplicationModel.Resources.ResourceLoader();
    txtWaitProcess.Text = resload.GetString("keyWaitProcess");
    // здесь txtWaitProcess это имя элемента XAML TextBlock, а keyWaitProcess это ключ, по которому текст извлекается из файла ресурсов соответствующего текущему языку приложения.
    

    На JavaScript это выглядит немного короче:

    document.getElementById('txtWaitProcess').innerText = WinJS.Resources.getString('keyWaitProcess').value;
    

    В придачу к этому есть возможность декларативно задать содержимое для элемента XAML. В данном примере задается текст кнопки:

    <Button x:Name="btnCancel" x:Uid="btnCancel" Click="do_cancel" FontFamily="Segoe UI" FontSize="20"></Button>
    

    В файл ресурсов можно внести строку с указанием Uid, атрибута через точку и указать значение этого атрибута. В данном примере мы можем задать содержимое текста кнопки, указав в качестве ключа файла ресурсов btnCancel.Content.
    В HTML5 приложениях в коде HTML текст содержимого задается так:

    <span data-win-res="{textContent: 'keyvisitsite'}"></span>
    

    Можно задать также и значение какого-либо атрибута, например атрибута title:

    <p style="" data-win-res="{attributes:{'title':'keytext7'}}">   </p>
    

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

    // C#
    Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "ru";
    // После установки языка соответственно гайдлайнам необходимо предупредить пользователя о том, что необходимо перезапустить приложение:
    

    // JavaScript
    Windows.Globalization.ApplicationLanguages.primaryLanguageOverride = "ru";
    // После чего можно принудительно запустить обновление для перевода интерфейса и всего текста приложения:
      WinJS.Resources.processAll();
    

    Как видно из примера приложение на WinJS не требует перезапуска. Но для C# разработчиков есть небольшое утешение в виде возможности приложения «отловить» переключение текущего языка в системе и автоматически обновить контекст. Для этого:

    // добавим при запуске приложения прослушивание события MapChanged
    protected override void OnLaunched(LaunchActivatedEventArgs args)
    {
    ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += Event_MapChanged;
    }
    // и далее в случае, если язык ОС был изменен, то сбросим контекст приложения
    void Event_MapChanged(IObservableMap<string, string> sender, IMapChangedEventArgs<string> @event)
    {
    ResourceManager.Current.DefaultContext.Reset();
    }
    

    Это было описание всем известных способов перевода текста. Однако, многие забывают о том, что можно перевести также логотипы, заставку и другие изображения.

    Сделать это очень просто. Достаточно создать подпапки с префиксами кодов языков внутри папок Assets (в C# приложениях) или images (в JavaScript приложениях).

    На следующем скриншоте вы можете увидеть, что у меня локализованы и стандартные логотипы приложения и картинка заставки – splashscreen.



    Открыв манифест приложения (файл Package.appxmanifest), мы сможем локализовать и отображаемое имя приложения и имя, под которым приложение будет отображено в store (отображаемое имя пакета). Для этого используем префикс ms-resource: и после него укажем имя ключа в наших ресурсных файлах.



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

    Скачать набор многоязычных инструментов можно по ссылке: набор средств для многоязычных приложений

    После установки приложения вам необходимо будет активировать набор инструментов. Открыв проект зайдите в меню «Сервис» и нажмите «Включить набор многоязычных инструментов». После этого в меню «Проект» у вас появится пункт «Добавить языки переводов…». Автоматически созданная папка MultilingualResources будет содержать в себе xlf файлы переводов. После построения проекта эти файлы будут заполнены значениями из файла ресурсов языка по умолчанию.
    Двойным кликом на файле xlf можно будет открыть его в редакторе, включающем в себя автоматический переводчик.



    Этот редактор не требует наличия установленной на компьютере Visual Studio, так что вы вполне можете переслать профессиональному переводчику свои файлы xlf и ссылку на многоязычный набор инструментов.

    Файл имя_вашего_проекта.qps-ploc.xlf – это файл псевдоязыка, предназначенного для тестовых задач. С помощью этого файла можно выявить сдвиги в разметке вашего кода. Перед публикацией проекта этот файл необходимо удалить.

    Комментарии 3

      0
      Установил набор многоязычных инструментов, в меню сервис первый пункт появился Включить набор многоязычных инструментов, но этот пункт неактивен, в чем может быть дело? VS2015, W10UWP
        0
        Может быть при установке не была установлена "Поддержка расширений Visual Studio"?

        В меню проекта могут быть не активными поля Multilingual App Toolkit. Но они становятся активными, если создать папку Strings и в нее добавить вложенные папки с ресурсами (ru-RU, например).
          0
          спасибо)

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

      Самое читаемое