Локализация Windows 8 приложений, часть 2

в 9:10, , рубрики: metro, Windows 8, локализация, метки: , ,

В продолжении статьи про основы локализации приложений Windows 8MetroRTStore (сам черт ногу сломит что правильнее — и ещё проблемнее гуглить) хотел бы поделиться ещё одним небольшим скриптом, автоматизирующим эту самую локализацию.
Вам уже известно, что чтобы локализовать, к примеру, текст какого-нибудь лейбла (TextBlock) нам необходимо проделать следующие действия:

  1. Присвоить элементу x:UID
  2. Присвоить его свойству Text значение (потому-что дизайнер не подхватит значение из resw)
  3. Открыть resw, добавить UID, не ошибиться со свойстовм и указать свойство «Text», а потом и сам текст локализации.

Муторно, да?

Для других XAML-проектов (Silverlight, WPF, Windows Phone), есть такой замечательный инструмент как Resharper, а именно — Ctrl+Shift+R (Move to Resource):
image
Открывается такой user-friendly диалог:
image
который затем вставляет в Xaml большую строчку, но идиологически верную:

<TextBlock Text="{Binding Resources.MainPage_Title, Source={StaticResource ResourcesWrapper}}"/>

Но, к сожелению, в Windows Store, resharper (7.1) на попытку «двинуть ресурсы» отвечает что-то невнятное (требует наличие resx, и не понимает наличие resw):
image
Что ж, остается надеятся, что это недаразуменее в JetBrains исправят, а пока спешу поделиться ещё одним T4 скриптом, алгоритм которого следующий:

  1. Найти все файлы *.xaml в проекте
  2. В каждом файле найти элементы, которые содержат атрибут x:UID
  3. Попытаться найти у этого элемента локализируемое свойство. Тут используется следующий маппинг:
    Dictionary<string, string> PreferredPropertiesMap = new Dictionary<string, string>
                                                 {
                                                     {"TextBlock", "Text"},
                                                     {"Run", "Text"},
                                                     {"Button", "Content"}
                                                     //Add Element-Property pairs here
                                                 };

    Если же тип элемента не найден в PreferredPropertiesMap, то ищется одно из следующих свойств:

    private static readonly string[] Properties = { "Text", "Content", "Header", "Caption" };
  4. Записываем всё в resw, попутно ведя логи о том, что в данной сессии добавилось нового в словаре, записи в resw, которые ни разу не встретились помечаются как неактуальные (в поле Comments), а для остальных в поле Comments вставляется перечисление страниц, на которых есть контролы с этим UID.

А теперь собственно сам скрипт: paste.org.ru/?teyin2

Cздаем в нашем проекте файл с расширением tt, вставляем текст скрипта, и запускаем через контекстное меню по средствам команды «Run Custom Tool» = Profit!
Спасибо за внимание, надеюсь, скрипт вам пригодится.

PS: Не забудьте поменять константу ReswFilePath (относительный от корня проекта путь к resw)
PS2: Скрипт в данный момент не поддерживает локализацию нескольких свойств у одного элемента

Автор: Nagg

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js