Показано с 1 по 3 из 3

Тема: Для разработчиков: система для перевода плагинов.

  1. #1
    klirik
    klirik вне форума
    Участник
    Регистрация
    16.02.2003
    Сообщений
    180

    Для разработчиков: система для перевода плагинов.

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

    Система состоит из двух частей: "ресурсоизвлекалки" (LNGXtractor.exe) и библиотеки перевода.

    При помощи утилиты LNGXtractor из скомпилированного плугина извлекаются два файла (.lnc и .inc), которые затем могут быть переведены на другие языки при помощи бесплатной утилиты LNGCompiler(http://sourceforge.net/projects/lngcompiler). В результате перевода получается стандартный (для The Bat!) языковой модуль - файл с расширением .lng.

    Вторая часть системы - библиотека перевода - предоставляет интерфейс для задания целевого .lng-файла, получения списка доступных (переведённых) языков, задания целевого языка и освобождения ресурса при выходе из программы. В коде плугина это может выглядеть примерно так:

    Код:
    //TBP_Initialize
    …
    LNG_OpenRes("c:\myplugin.lng");
    LNG_SetLanguage(lnc_russian);
    …
    //TBP_Finalize
    …
    LNG_Free();
    ..
    "Ресурсоизвлекалка" вложена в это сообщение - можно уже пробовать (только учтите, что применяется она только к несжатым файлам (без всяких ASP или UPx), иначе получится мусор).

    Библиотека перевода будет размещена в этой же теме чуть позднее.

  2. #2
    klirik
    klirik вне форума
    Участник
    Регистрация
    16.02.2003
    Сообщений
    180

    Система для перевода: часть 2

    Ну вот. Теперь систему перевода можно считать полной
    Здесь находится "вторая половина" системы - библиотека и хедер-файл для её использования. Хедер файл документирован.

    сценарий использования библиотеки примерно таков:
    - в начале вызваем функцию LNG_OpenRes - передаём ей в качестве параметра путь к исходному .lng-файлу. Если с файлом всё в порядке (есть в начале правильная сигнатура, а также права доступа), функция вернёт "true".

    Каждый файл LNG может содержать разное количество языков. Для того, чтобы предоставить выбор только из имеющегося, предназначена следующая функция - LNG_EnumLanguages. Для получения списка её имеет смысл вначале вызвать с нулём в качестве параметра - при этом функция просто вернёт количество языков, размещённых в назначенном .lng-файле, затем выделить в куче массив значений типа idlan (тип-перечисление языков, определён здесь же, в заголовочном файле) размера, достаточного, чтобы разместить весь список. Повторно функции передаётся в качестве параметра указатель на этот массив - и она его заполняет списком доступных идентификаторов языка.

    Получить "человеческое" имя по идентификатору языка поможет вспомогательная функция LbyID.

    Собственно, для смены языка программы на какой-нибудь другой (доступный из .lng-файла) предназначена функция LNG_SetLanguage. Ей передаётся идентификатор нужного языка и указатель HINSTANCE плугина (в случае с WinAPI-приложением его можно получить как параметр Dllmain, в случае использования MFC и (по заведённому порядку) наличия в начале функции макроса AFX_MANAGE_STATE(AfxGetStaticModuleState()); можно в качестве HINSTANCE передать нуль). Передача верного Hinstance очень важна - поскольку иначе можно по ошибке "перевести" ресурсы самого The Bat! - не забывайте, что плугины - это не самостоятельные программы, а подключаемые библиотеки!

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

    Последняя функция - LNG_Free запускается без параметров и производит "сборку мусора". Её нужно запускать в самом конце, непосредственно перед выходом из плугина (предположительно в конце TBP_Finalize()).

    Общий сценарий работы с системой перевода получается следующим:
    1) плугин пишется с использованием функциональных возможностей библиотеки перевода - с вызовом функций загрузки LNG и установки нужного языка, а также освобождения ресурсов в конце.
    2) Внутренние ресурсы (те, которые, собственно, редактируются в редакторе ресурсов Visual Studio) не должны содержать никакой кириллицы или прочих локальных знаков - только латинские символы. Сами ресурсы предполагаются на английском языке. При этом нужно заранее сделать для контролов некоторый запас по размеру - для тех языков, которые окажутся чересчур "многословными" - чтобы они не были как-нибудь некрасиво обрезаны на экране.
    3). После компиляции плугина к нему применяется утилита, данная в 1-м постинге - LNGXtractor. Она создаёт два файла - .lnc и .inc. Далее - берём бесплатный LNGCompiler и переводим при помощи него ресурсы программы (эти самые полученные два файла) на другие языки. Можно, например, выложить куда-нибудь и привлечь сторонних переводчиков… В результате вы получите исходный .inc файл и кучу .lnc-файлов - по одному для каждого языка. Из них при помощи LNGCompiler компилируется финальный .lng-файл, содержащий ресурсы в закодированном виде.
    4) теперь вы можете подключить этот .lng-файл к своему плугину и "на лету" переключать язык интерфейса - прямо как в самом The Bat!

    Хитрость системы в том, что изменения к уже готовым проектам (предполагается, что строковые ресурсы там по уму размещены как ресурсные строки, а не "вкодированы" прямо в текст программы) требуются минимальные. В BayesIt для подключения модуля в минимальном случае потребовалось добавить всего 3 дополнительные строки - и он сразу стал многоязычным

    P.S. Да, кстати, забыл - потребуется библиотека MSVCP60.dll - обычно именно эта библиотека присутствует практически в любой программе (и потому есть уже почти у всех), но если плугин с системой перевода ставится на "голую" систему после переустановки, то может начать ругаться, что, мол, это вообще не плугин… Тогда вот и потребуется найти ему эту самую библиотеку.

  3. #3
    klirik
    klirik вне форума
    Участник
    Регистрация
    16.02.2003
    Сообщений
    180

    Как это работает: ещё о системе перевода.

    Думаю, будет полезно дать несколько комментариев к системе перевода плугинов.

    Итак…

    Обе части системы перевода основаны на низкоуровневой работе со внутренними структурами Windows.

    - первая часть - LNGXtractor - самостоятельно обрабатывает PE-файлы, находит в них секцию ресурсов и интерпретирует её - передвигается по каталогам ресурсов, разбирая строки и диалоги. Из шаблонов диалогов извлекаются все строковые фразы и каждый из них записывается в выходной файл как отдельная "форма". Строковые ресурсы разбираются по порядку и также экспортируются в выходной файл.

    Извлечённые строки записываются в два файла - .lnc - сами ресурсы, .inc - список строк. Перевод и компиляция этих файлов в .lng файл осуществляется при помощи общедоступного LNGCompiler.

    - вторая часть - собственно, подключаемая библиотека - аналогичным образом разбирает ресурсы программы, к которой она "прикомпилирована". Поскольку предполагается, что это та же самая программа, что использовалась для генерации начальных .lnc и .inc файлов, строковые идентификаторы в ней будут совпадать. Библиотечные функции разбирают внутренние низкоуровневые структуры ресурсов (блоки строк, шаблоны диалогов), при этом совпадающие по идентификатору строки заменяются строками из .lng-файлов. Аналогично для диалогов - на основании исходного шаблона строится новый шаблон, в котором все строковые фразы заменены на фразы из .lng-файла. Таким образом происходит "перекомпиляция" ресурсов. Далее, ресурсы собираются в один блок, который снабжается надлежащими заголовками каталогов - в памяти создаётся новая виртуальная секция ресурсов. К этой секции, в свою очередь, добавляется сгенерированный заголовок PE. В результате в памяти получается образ DLL-библиотеки, содержащей переведённые на нужный язык ресурсы программы. Эта библиотека устанавливается как основной источник ресурсов для программы функцией AfxSetResourceHandle - и программа тут же начинает "говорить" на другом языке.

Похожие темы

  1. Ответов: 0
    Последнее сообщение: 29.06.2010, 00:01
  2. Новая система фильтров: а где…
    от Mick H. Oswald V в разделе The Bat!: вопросы и ответы
    Ответов: 12
    Последнее сообщение: 28.11.2004, 17:14
  3. Новая система фильтров в 3.0
    от amail в разделе The Bat!: вопросы и ответы
    Ответов: 2
    Последнее сообщение: 02.10.2004, 13:08
  4. Новая система фильтров
    от Vadim в разделе The Bat!: вопросы и ответы
    Ответов: 14
    Последнее сообщение: 10.09.2004, 15:11
  5. Гейт nntp-imap - плагин для разработчиков.
    от klirik в разделе Плагины для The Bat! и Voyager!
    Ответов: 0
    Последнее сообщение: 13.11.2003, 16:52