Русификация программ на Visual Basic 5.0/6.0 от Leserg

Немного теории и практики.-------------------------------------Опишу немного ход работы и свои рассуждения.Программа "MioMap IGO BMP TOOL".
  1. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 945

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1676

    Был: 2024-07-28 22:59

    Лайков: 167



    Немного теории и практики.
    -------------------------------------
    Опишу немного ход работы и свои рассуждения.

    Программа "MioMap & IGO BMP TOOL". После перевода языкового файла (Russian.lng), запуска программы и выбора русского языка, в интерфейсе вместо символов кириллицы появились кракозябры:

    Это произошло потому, что программа использует западноевропейский набор символов - 1252, а для отображения кириллицы необходима - 1251. Исправляется эта беда правкой реестра (для Windows XP) и подменой файлов с кодовыми страницами (для Windows Vista и 7). Необходимые патчи можно найти в топике этой темы форума. Но я иду по этому пути только в самом крайнем случае, когда действительно ничего нельзя сделать и остается только одно: хирургическое вмешательство в систему.

    Итак, если вы собрались переводить приложение на языке Visual Basic 5.0/6.0, то вам необходимо знать, что строки в этих программах представлены двумя кодировками: ANSI - для строк элементов формы и Unicode - для жестко-закодированных строк. Эта информация поможет при поиске необходимой строки для перевода в HEX-редакторе. Если вы не нашли какую-либо строку в кодировке ANSI, значит нужно выполнить её поиск в кодировке Unicode или наоборот.

    Еще, по поводу Unicode в библиотеке MSDN написано: "В Visual Basic 6.0 строки во внутреннем представлении являются знаками Юникода, но отображаются с помощью кодовых страниц Windows." Таким образом, если разработчик приложения явно не указал используемый набор символов для отображения текстовых строк, то по умолчанию компилятором используется локаль OC Windows, в которой запущена среда разработки и в которой создается программа (обычно с кодовой страницей 1252). :D

    Теперь посмотрим информацию о программе (это можно сделать в Total Commander"е при установленном плагине FileInfo):



    Как видите, программе написана в ОС с французским языком и хотя автор использует языковые файлы, то скорее всего (в дальнейшем это подтвердилось) основной язык приложения будет французский. Перевод языкового файла и его проверка в программе показал, что автор внес в него не все строки, поэтому допереводить их уже придется в HEX-редакторе и их поиск нужно выполнять с учетом языка (на французском), но это потом и по желанию переводчика. Еще мы видим используемый набор символов - Unicode, но это только для жестко-закодированных строк, о чем было сказано ранее. Для всех остальных строк применяется ANSI кодировка. Как это выглядит в HEX-редакторе и чем они отличаются? Давайте посмотрим:



    Строка ANSI. В примере я привел строку " Information BMP " (с пробелами в начале и в конце выражения!). Она есть в языковом файле и переводить её в HEX-редакторе нет смысла. Но это исключение из правил. В моей практике это первый случай, когда автор программы, написанной на Visual Basic 5.0/6.0, сделал языковую поддержку. Поэтому другие программы придется переводить в HEX-редакторе. В данном же случае, я хочу вам показать различие ANSI и Unicode строк. Возвращаясь к строке ANSI, в левой части НЕХ-редактора (текстовой) видно, что она является явной - одному символу строки соответствует один байт шестнадцатеричного кода (в правой части НЕХ-редактора). Таким образом, вместо неё, в тестовой части редактора, можно с клавиатуры ввести перевод, например " Сведения о ВМР ". Обратите внимание, перевод ни в коем случае не должен превышать длину исходного текста, иначе программа станет неработоспособной. Переведенная строка должна быть или такой же длины, или меньше, но не больше. В нашем случае, в исходной строке 17 символов (включая пробелы) или 17 байт шестнадцатеричного кода, а переведенной - 16 (16 байт). Еще самое главное - это указатель на длину строки. Он для всех строк (и ANSI, и Unicode) находится перед строкой и указывает количество символов (байт), занятых ею. Естественно сама длина записывается в шестнадцатиричной системе счисления (в десятичной системе 17, а в шестнадцатиричной - 11).



    Переводить значения из одной системы счисления в другую вы можете с помощью калькулятора Windows в инженерном режиме. Если переведенная строка у вас получилась такой же длины, что и оригинальная, то указатель длины остается без изменений. Если же перевод получился короче, то можно поступить двумя способами: или дополнить строку пробелами до соответствия длине оригинальной строки, при этом указатель не изменятся; или остаток строки забить нулями (в шестнадцатиричной части редактора, не в текстовой!) и изменить указатель длины на новый, соответствующий длине перевода. Конечно же, какой способ применить зависит от конкретных условий той или иной строки - необходимо смотреть по контексту. Бывает, что предложения в программе формируются из нескольких строк, и если одну часть предложения вы дополнили пробелами, то в целом это будет выглядеть, мягко сказать, некорректно. Почему я акцентирую внимание на длине строки? При переводе программ написанных в Visual Basic 5.0/6.0, если указатель длины не соответствует действительности, то такая строка в работающей программе может не отображаться или возникнет ошибка. Например, строка получилась короче оригинальной и оставшуюся часть вы стерли (заполнили нулями), а указатель длины не изменили на новый, то вполне возможно, что эта строка не будет показана. Такой вот капризный Бейсик. Кстати, если вы будете переводить программу с помощью инструмента VBLocalize v1.1.0.0, то учтите, что он не меняет указатель длины строк и, в последствии, вам вручную все равно придется это делать в НЕХ-редакторе (в большинстве случаев). Именно по этой причине, я предпочитаю сразу делать перевод НЕХ-редактором, чтобы контролировать каждую строку, а не искать потом иголку в стоге сена. Также, работа с НЕХ-редактором требует от вас внимательности, терпения и усидчивости. Если вы не обладаете этими качествами, то можете даже не браться за это дело.

    Строка Unicode. В указанном выше примере я привел строку " Pixel(s)". Она является жестко-закодированной и языковом файле отсутствует, поэтому её необходимо перевести в файле программы. Обратите внимание, в строке Unicode один символ занимает два байта. Т.к. символы латиницы находятся в начале этой кодовой страницы, то в текстовой части Нех-редактора они отображаются без изменений, т.е. их можно вводить с клавиатуры (не забывая, что один символ - два байта). А вот с символами кириллицы (и другими языками) такой фокус не пройдет. Необходимо вводить код символа в шестнадцатеричном виде в правой части НЕХ-редактора. Конвертировать русский текст в шестнадц. символы Unicode вам поможет замечательный инструмент 1251 to HEX. Здесь, также не забывайте про длину строки и указатель. Оригинальная строка имеет длину 9 символов (включая символ пробела перед словом). Так как на один символ в юникоде задействовано 2 байта, то 9*2=18 байт. В шестнадцатиричной системе счисления - 12. Что мы и видим в редакторе. Я перевел это выражение так: " пикс.". Его длина 6 символов. Для юникода потребуется 6*2=12 байт. В шестнадцатиричной системе счисления - . Оставшуюся часть строки я заполнил нулями. Учтите, что в текстовой части НЕХ-редактора вместо выражения " пикс." будет " ?8:А", но в программе отображение будет верное.



    Итак, со строками разобрались. А как же быть с кодировкой и отображением кириллицы, о чем было сказано в начале моего повествования? Здесь снова придеться сделать небольшое отступление. Если вы занимаетесь программированием, то наверняка знаете, что для каждого элемента управления (Label, Button, CheckBox и т.д.), в его свойствах, можно выбрать параметры шрифта: размер, начертание, название шрифта и, самое главное, установить набор символов. По умолчанию, при создании программы в среде Visual Basic 5.0/6.0, для всех будущих элементов интерфейса установлен шрифт MS Sans Serif с набором символов, который в ОС Windows является основным.



    Те, кто не занимается программированием, теперь тоже это знаете :) . И скорее всего вам знакомо это окошко выбора свойств шрифта, не правда ли? Так вот, нас интересует именно свойство "Набор символов". Чтобы переводимая нами программа правильно отображала символы кириллицы, для каждого элемента управления необходимо установить кириллический набор символов. Если мы создаем программу, то сделать это на этапе программирования не составит труда, а как быть с уже готовой программой?

    Для этого нам понадобится:

    1) НЕХ-редактор (куда же без него).

    2) Стандартные названия шрифтов, которые могут применяться при программировании. Один мы уже знаем точно - это MS Sans Serif. Еще могут быть:Arial, Tahoma, Verdana, Courier (Courier New). Я перечислил основные, могут быть и другие. Все зависит от фантазии разработчика.

    3) Знание того, каким образом в коде программе обозначается признак кириллического набора символов и, где он прописан. Ему, согласно спецификациям шрифта, соответствует десятичное число 204. Тем, кто занимается переводом, оно очень хорошо знакомо. В шестнадцатиричном виде оно занимает один байт и записывается как СС. Это не то, что вы подумали, а мнемоническое отображение слова CyrilliC.

    Теперь, наша задача найти в коде программы все места, где указано название шрифта и в его свойствах изменить указатель набора символов на кириллический, т.е. на СС. На примере программы "MioMap & IGO BMP TOOL" я поиске НЕХ-редактора ввел название шрифта MS Sans Serif и нажал ОК (поиск необходимо осуществлять в ANSI кодировке). Для данной программы нашлось одно совпадение:



    Чуть ниже, в текстовой части редактора видно слово Tahoma. Это нам намек на то, какой шрифт нужно искать далее. :D Конечно же нужно перебрать все стандартные шрифты. Сейчас будем менять набор символов для этого шрифта. Для начала познакомимся с шестнадцатиричным форматом записи свойств шрифта. Посмотрите на следующий рисунок:



    Эта последовательность байт и их позиция, относительно названия шрифта, постоянна для всех элементов управления в коде программы. Это не значит, что в вашей программе, которую вы будете переводить, будут именно эти значения байт. Все зависит от выбранных разработчиком свойств шрифта. Но позиция байта, отвечающего за набор символов, всегда будет постоянной относительно названия шрифта - 10 байт от первой буквы.



    Наконец, можно смело вместо ноликов записать СС. Такую операцию необходимо выполнить для всех найденных шрифтов в коде программы. В данной программе автор использовал три шрифта: MS Sans Serif, Arial и Tahoma.



    Затем сохраните изменения, сделанные в файле. На этом этапе будьте очень внимательны. Малейшая оплошность и программа станет неработоспособной. Смотрим, что у нас получилось, запустив программу на выполнение.



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

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

    Но теперь осталось сделать самую малость, внести в реестр следующую запись:

    [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionFontSubstitutes]
    "Arial,0"="Arial,204"


    Это так называемая подмена наборов символов. При изменении набора символов в НЕХ-редакторе, мы видели, что в программе используется нулевой набор символов (00 нех), т.е. нейтральный (а в нем нет символов кириллицы). После перезагрузки ОС, получим корректный вариант:



    Пожалуй, неплохо. А вы как думаете?

    После прочтения этого материала, у вас, дорогой читатель, может возникнуть вопрос: "А зачем было столько страдать, если можно было с самого начала применить патч, выполняющий подмену кодовых страниц Windows?" Я отвечу так: "Мне было очень интересно найти решение этого вопроса." Именно поэтому я и занимаюсь русификацией. Да, вопрос не решен полностью, только частично, но может своими исследованиями, я подтолкну вас на решение очередной головоломки.

    P.S. Теперь осталось найти место в коде программ, написанных на Visual Basic, где указываются языковые параметры, установленные по умолчанию для всего приложения. Тогда, я думаю, можно окончательно закрыть этот вопрос.
    NNK_RTR, самосвал нравится это сообщение.
    Сообщение отредактировал 22 июля 2018 - 14:57

    Кто ищет, тот всегда найдет!

    25 августа 2012 - 15:09 / #1
  2. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 945

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1676

    Был: 2024-07-28 22:59

    Лайков: 167

    Продолжение. часть 2



    NNK_RTR нравится это сообщение.
    Сообщение отредактировал 22 июля 2018 - 14:46

    Кто ищет, тот всегда найдет!

    27 августа 2012 - 03:41 / #2
  3. Оффлайн

    WYLEK

    Звание: Легенда

    Админ

    Сообщений: 2195

    Создано тем: 317

    Рейтинг: 10

    Репа: (245|245|0)

    Баллы: 3580

    Был: 2024-11-18 08:59

    Лайков: 202

    Поправил автора темы, внутренние ссылки, левую картинку crazy_mini и время релиза темы. Как я пропустил это дело scratch_one-s_head_mini
    Закатал на локалку старый форум, эта тема была в разделе Наши проекты и называлась Конвертеры BMP изображений для программ навигации
    В принципе Саня все выкинул на форум.

    22 июля 2018 - 15:02 / #3
  4. Оффлайн

    gazon01

    Звание: Ветеран

    Команда

    Сообщений: 1211

    Создано тем: 39

    Рейтинг: 8

    Репа: (42|41|-1)

    Баллы: 86

    Был: 2018-12-02 14:30

    Лайков: 18

    StInd2013, попросил в ЛС ссылки восстановить в шапке "Задавайте вопросы по русификации...", решил ссылки не восстанавливать (вдруг наш админ захочет удалить юкозовский сайт, и опять всё повиснет), а сделать отдельную тему, и добавлять туда примеры русификации Visual Basic.

    Прошу обратить внимание: только примеры, а не просьбы о помоши!

    Цитата: WYLEK
    левую картинку


    ну извиняйте, не можем мы гифки вставляь
    Сообщение отредактировал gazon01 22 июля 2018 - 16:58

    Возможно всё! На невозможное просто требуется больше времени.
    Мудрец из Шангри Ла

    22 июля 2018 - 16:54 / #4
  5. Оффлайн

    WYLEK

    Звание: Легенда

    Админ

    Сообщений: 2195

    Создано тем: 317

    Рейтинг: 10

    Репа: (245|245|0)

    Баллы: 3580

    Был: 2024-11-18 08:59

    Лайков: 202

    Цитата: gazon01
    решил ссылки не восстанавливать (вдруг наш админ захочет удалить юкозовский сайт,


    Это уже не мне решать - юкоз может при чистке не рабочих сайтов просто удалить его. Но лучше делать темы здесь, чтобы не лицезреть на пустые места от картинок goof

    22 июля 2018 - 18:12 / #5

Статистика форума, пользователей онлайн: 0 (за последние 20 минут)

---
Создано тем
1197
Всего сообщений
15762
Пользователей
18014
Новый участник
Markhabayev