В продолжении статьи про основы локализации приложений Windows 8MetroRTStore (сам черт ногу сломит что правильнее — и ещё проблемнее гуглить) хотел бы поделиться ещё одним небольшим скриптом, автоматизирующим эту самую локализацию.
Вам уже известно, что чтобы локализовать, к примеру, текст какого-нибудь лейбла (TextBlock) нам необходимо проделать следующие действия:
- Присвоить элементу x:UID
- Присвоить его свойству Text значение (потому-что дизайнер не подхватит значение из resw)
- Открыть resw, добавить UID, не ошибиться со свойстовм и указать свойство «Text», а потом и сам текст локализации.
Муторно, да?
Для других XAML-проектов (Silverlight, WPF, Windows Phone), есть такой замечательный инструмент как Resharper, а именно — Ctrl+Shift+R (Move to Resource):
Открывается такой user-friendly диалог:
который затем вставляет в Xaml большую строчку, но идиологически верную:
<TextBlock Text="{Binding Resources.MainPage_Title, Source={StaticResource ResourcesWrapper}}"/>
Но, к сожелению, в Windows Store, resharper (7.1) на попытку «двинуть ресурсы» отвечает что-то невнятное (требует наличие resx, и не понимает наличие resw):
Что ж, остается надеятся, что это недаразуменее в JetBrains исправят, а пока спешу поделиться ещё одним T4 скриптом, алгоритм которого следующий:
- Найти все файлы *.xaml в проекте
- В каждом файле найти элементы, которые содержат атрибут x:UID
- Попытаться найти у этого элемента локализируемое свойство. Тут используется следующий маппинг:
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" };
- Записываем всё в resw, попутно ведя логи о том, что в данной сессии добавилось нового в словаре, записи в resw, которые ни разу не встретились помечаются как неактуальные (в поле Comments), а для остальных в поле Comments вставляется перечисление страниц, на которых есть контролы с этим UID.
А теперь собственно сам скрипт: paste.org.ru/?teyin2
Cздаем в нашем проекте файл с расширением tt, вставляем текст скрипта, и запускаем через контекстное меню по средствам команды «Run Custom Tool» = Profit!
Спасибо за внимание, надеюсь, скрипт вам пригодится.
PS: Не забудьте поменять константу ReswFilePath (относительный от корня проекта путь к resw)
PS2: Скрипт в данный момент не поддерживает локализацию нескольких свойств у одного элемента
Автор: Nagg