This is a mirror of official site: http://jasper-net.blogspot.com/

Автоматизация локализации в Silverlight при помощи макросов Visual Studio

| Friday, April 8, 2011
дравствуйте. Хочу поделиться небольшой наработкой в области автоматизации локализации приложений разработанных с использованием технологии SilverLight. Прочитав этот пост (Локализация в Silverlight), стало ясно, что придется выносить все строковые константы в ресурсные файлы, что нельзя назвать особо интеллектуальной работой. Поэтому решил пойти длинным путём и попробовать автоматизировать данный процесс с помощью встроенных в Visual Studio макросов.

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

После анализа были выработаны следующие требования к макросу:
  • проанализировать выделенную пользователем фразу (по нажатию на определённую комбинацию клавиш);
  • найти перевод фразы в google translate (чтобы не напрягать пользователя придумыванием названия ресурса);
  • добавить фразу в указанные заранее ресурсы (причем необходимо, чтобы изменения производились через VS, так как нам нужен сгенерированный прокси класс);
  • заменить выделенную пользователем фразу на биндинг к ресурсу.
В Visual Studio встроен удобный редактор макросов. Чтобы его вызвать необходимо выбрать в меню Tools/Macros/Macros IDE. Перед началом работы, необходимо создать файл с макросами (код пишется на VB .Net). Любая public процедура без параметров — видна в списке макросов и её можно вызывать при нажатии на горячую клавишу, либо через Macro Explorer.

Задача 1. Определение выделенного слова в VS

Dim doc As Document = DTE.ActiveDocument
Dim d As TextDocument = doc.Object
Dim bp = d.Selection.AnchorPoint.CreateEditPoint, ep = d.Selection.BottomPoint.CreateEditPoint
Dim caption As String = bp.GetText(ep)
If (String.IsNullOrWhiteSpace(caption)) Then Exit Sub ' если у нас ничего не выделено - то выходим

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

Задача 2. Получение имени ресурса

Наиболее простым способом получения имени ресурса — является перевод выделенной фразы на английский язык (примечание: наиболее простой способ — не является наиболее правильным). Для перевода было решено использовать сервис Google Translate, так как этот сервис имеет простое API
В результате запроса получаем следующий JSON объект:
{"responseData": {"translatedText":"Organization Structure"}, "responseDetails": null, "responseStatus": 200}

Private Function ConvertToResourceName(ByVal text As String) As String
Dim result As String = (New WebClient()).DownloadString("http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + text + "&langpair=ru|en")
Dim stream As New MemoryStream(Encoding.Unicode.GetBytes(result))
Dim serializer As New System.Runtime.Serialization.Json.DataContractJsonSerializer(GetType(TranslateResult))
Return String.Join("", CType(serializer.ReadObject(stream), TranslateResult).responseData.translatedText _
                                .Split(" ", ".", ",", "!", "(", ")", vbCrLf, vbCr) _
                                .Where(Function(word) Not String.IsNullOrWhiteSpace(word)) _
                                .Select(Function(word) word(0).ToString().ToUpper() + word.Substring(1)) _
                                .ToArray())
End Function

Read more: Habrahabr.ru

Posted via email from Jasper-net

0 comments: