• Добро пожаловать на WYLEK.ru. Пожалуйста, войдите или зарегистрируйтесь.
 
123 гостей, 3 пользователей

  • Русификация программ на Visual Basic 5.0/6.0 от Leserg 3 0 5 1
avatar_Leserg

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

Автор Leserg, 25 августа 2012, 15:09:00

« предыдущая - следующая »

LesergАвтор темы

Тема создана 25 августа 2012, 15:09:00 Последнее редактирование: 22 июля 2018, 14:57:07 от WYLEK

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

Программа "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

Теперь посмотрим информацию о программе (это можно сделать в Войдите на сайт для перехода по ссылке при установленном плагине 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, если указатель длины не соответствует действительности, то такая строка в работающей программе может не отображаться или возникнет ошибка. Например, строка получилась короче оригинальной и оставшуюся часть вы стерли (заполнили нулями), а указатель длины не изменили на новый, то вполне возможно, что эта строка не будет показана. Такой вот капризный Бейсик. Кстати, если вы будете переводить программу с помощью инструмента Войдите на сайт для перехода по ссылке, то учтите, что он не меняет указатель длины строк и, в последствии, вам вручную все равно придется это делать в НЕХ-редакторе (в большинстве случаев). Именно по этой причине, я предпочитаю сразу делать перевод НЕХ-редактором, чтобы контролировать каждую строку, а не искать потом иголку в стоге сена. Также, работа с НЕХ-редактором требует от вас внимательности, терпения и усидчивости. Если вы не обладаете этими качествами, то можете даже не браться за это дело.

Строка Unicode. В указанном выше примере я привел строку " Pixel(s)". Она является жестко-закодированной и языковом файле отсутствует, поэтому её необходимо перевести в файле программы. Обратите внимание, в строке Unicode один символ занимает два байта. Т.к. символы латиницы находятся в начале этой кодовой страницы, то в текстовой части Нех-редактора они отображаются без изменений, т.е. их можно вводить с клавиатуры (не забывая, что один символ - два байта). А вот с символами кириллицы (и другими языками) такой фокус не пройдет. Необходимо вводить код символа в шестнадцатеричном виде в правой части НЕХ-редактора. Конвертировать русский текст в шестнадц. символы Unicode вам поможет замечательный инструмент Войдите на сайт для перехода по ссылке. Здесь, также не забывайте про длину строки и указатель. Оригинальная строка имеет длину 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, где указываются языковые параметры, установленные по умолчанию для всего приложения. Тогда, я думаю, можно окончательно закрыть этот вопрос.
Кто ищет, тот всегда найдет!

LesergАвтор темы

Ответ #1 : 27 августа 2012, 03:41:00 #1 Последнее редактирование: 22 июля 2018, 14:46:44 от WYLEK
Продолжение. часть 2


Показать / Скрыть текст
Была задумка найти в коде приложений место, отвечающее за
используемый по умолчанию набор символов для всей программы, если он явно не был указан при
её создании.
Мои изыскания привели к следующему: в программах на Visual Basic 5.0/6.0 за языковые
свойства (шрифт, кодовая страница, набор символов) отвечает ран-тайм (RunTime) библиотека
MSVBVM60.DLL. Этот файл по умолчанию устанавливается автоматически при установке
самой ОС (Windows XP, Vista, 7), т.е. является системным. Если по каким-то причинам этого
файла в системе нет (или он не зарегистрирован), то VB программа работать не будет. Так
вот, в этом файле и заданы языковые установки по умолчанию - язык LANG_NEUTRAL
(идентификатор 0х0С00) и локаль LOCALE_NEUTRAL (идентификатор 0x0000). Параметру
LOCALE_NEUTRAL соответствует кодовая страница СР1252 (десятичный код - 0), а в ней, как
известно, символов кириллицы не наблюдается. Нам же необходимо, чтобы программа
использовала кодовую страницу СР1251 (десятичный код - 204) с кириллическим набором
символов. Как быть? Ответ уже был дан мною ранее. Необходимо использовать так называемую
подмену (или замену) шрифтов. Для этого в реестре Windows добавляется значение (Кстати эта
ветка реестре как раз для этого и предназначена. В переводе на русский "Font Substitutes"
означает - Замена шрифтов.):
HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionFontSubstitutes
"Arial,0"="Arial,204"
Arial - это название шрифта, для которого мы хотим выполнить замену набора символов.
При этом происходит следующее: при обращении программы к латинской кодовой странице шрифта
(Arial,0) вместо нее выдается кириллическая кодовая страница (Arial,204) - чего мы и хотели добиться. На сегодняшний день этот способ представляется самым корректным и надежным. Таким способом можно назначить замену любому шрифту, который использует программа. После правки реестра обязательно необходимо сделать перезагрузку системы, чтобы изменения вступили в силу.
     Вывод: если в при переводе программы нет возможности задать русский набор символов (204 Dec
= CC Нех) или не для всех элементов управления явно заданы параметры шрифта, чтобы выполнить такую операцию, то можно завершить дело правкой реестра.
Вы можете возразить и ограничиться только правкой реестра, а в самой программе сделать только перевод. Можно и так, криминала в этом нет. Но предлагаемый мною вариант является наиболее правильным. Подойдите к этому вопросу не с позиций переводчика, а с позиции программиста. Вы проектируете приложение, добавляете на форму различные элементы и вводите для них надписи. Вы же не будете давать русские названия латинскими буквами?! Нет, вы выберете шрифт и укажете набор символов - Кириллица. Вот и при переводе получается такая картина - вы перевели название элемента на русский, а шрифт не исправили. Вот программа вам и показывает кракозябры. :) Поэтому, если есть возможность исправить шрифт, то нужно ею воспользоваться. Тем более, что после такого корректного перевода, программа будет правильно отображать кириллицу на системах, где русский язык не является языком по умолчанию.

--------------------------

При переводе второй программы "iPAQ 31x Image Explorer" я сначала в НЕХ-редакторе выполнил
замену набора символов на кириллицу, а затем занялся переводом. Это дало мне возможность
тестировать перевод на своей немецкой системе, а также показало, где и для каких элементов
отсутствуют параметры шрифта и для каких из них нужно будет делать замену в реестре Windows
(это оказался вездесущий шрифт Arial).
Наибольшую сложность при переводе программ Visual Basic 5.0/6.0 создают меню и заголовки
таблиц. Их почти невозможно удлинить для русского текста. Например, меню "Save as..." имеет
длину в 10 знаков (с учетом символов пробела). На русском надо написать "Сохранить как..."
- 16 знаков. Что делать? Можно написать без троеточия в конце, т.е. "Сохранить как" - 13 знаков. Или так "Сохранить..." - 12 знаков. А вот ещё к примеру другие пункты меню "Help" - 4 (на русском "Справка" - 7), "About" - 5 (О программе - 11) - и т.д. В любом случае, как лучше сделать перевод необходимо смотреть исходя из местных условий кода программы.
Немного упростить эту задачу позволяет инструмент "VBLocalize v1.1", но здесь важно понимать, как он это делает. Иначе, после перевода в нём, вы получите неработоспособную программу. Я не знаю, чем руководствовался создатель VBLocalize, но количество доступных символов в строке его творение показывает с учетом названия элемента управления. Когда смотришь на строку, в которой всего 5 символов (к примеру строка меню &Help), а редактор тебе сообщает, что в ней доступно аж 10 знаков, то можно подумать, что с переводом проблем не будет. Да, с переводом не будет, но будут проблемы с программой. :)
Давайте разберемся (в примере показана строка "&Help"):


Хорошо видно, что текущая строка занимает 5 байт. Редактор нам показывает, что максимальная
длина строки может быть 10 байт. Откуда взялись еще 5 байт? Эта строка формата ANSI, а вы
уже знаете, что в ней 1 символ (знак) занимает 1 байт. Допустим в строке может быть 10 знаков. Перевод желательно делать без клавиш доступа (&), так мы экономим один символ, что крайне важно при переводе программ Visual Basic 5.0/6.0. Итак, на русском языке этот пункт меню будет называться "Справка". В этой строке 7 знаков, т.е. она будет длиной в 7 байт, а это меньше 10 максимальных. Но прежде, чем писать перевод, давайте посмотрим в НЕХ-редакторе, действительно ли в коде программы есть место для 10 байт вместо 5. Адрес этой строки вы можете взять прямо из редактора VBLocalize, первая колонка - 0001В359:


Посмотрите внимательно на код программы возле строки "&Help", вы там видите где-нибудь свободное место? Если ориентироваться на правую половину с текстовой информацией, то какие-то пустые места там вырисовываются. Но самое главное это левая половина, где представлен код программы в шестнадцатеричном виде. И вот здесь вы не найдете пустого места. Что мы имеем? Строка "&Help" действительно занимает 5 байт. Об этом говорит указатель длины, находящийся перед ней по адресу 0001В359. Если посмотреть в текстовую часть редактора, то перед словом "&Help" находится слово mHelp. Как ни странно, но в нем тоже 5 знаков и в правой части редактора видно, что оно также занимает 5 байт и перед ним, также находится указатель длины (адрес 0001В34F). Уж не это ли слово инструмент VBLocalize подсчитал за дополнительные байты? Что это вообще такое, и что обозначает?
Если вы программист, то сразу ответите на этот вопрос. Если нет, то я вам скажу. Любая программа состоит из множества различных элементов, у которых есть имена. Эти имена (обычно) даются таким образом, чтобы легче было ориентироваться в листинге программы, а при её отладке сразу было видно в каком модуле произошел сбой. Возвращаясь к нашей строке "mHelp" можно понять, что речь идет о пункте меню "Справка" (m - сокращение от menu, help - справка). Вот пример листинга программы с этим пунктом меню, где это хорошо видно:


Именно так это и записано в шестнадцатеричном коде программы:


Обратите внимание на пустые (00) байты разделители между указателями длины строк и между строками - они также важны. Если вы думаете, что длину строки можно увеличить за счет этих пустых байт, то вы глубоко заблуждаетесь. Это как пробелы между словами в предложении. (Еслинаписатьпредложениебезпробеловмеждусловами,вамудобнобудетчитать?)
 :)
Надеюсь, теперь вы поняли, что "mHelp" - это имя элемента меню. Естественно имя этого элемента можно переименовать. Именно так и поступает инструмент "VBLocalize v1.1", но делает это некорректно. Если не знать того, о чем только что я рассказал, то переводом можно полностью затереть имена элементов. В результате программа станет неработоспособной (так и произошло при моем пробном переводе - тогда я еще таких тонкостей не знал).
Посмотрите как это происходит (анимационное изображение):


Как видите, надпись можно увеличить за счет изменения имени элемента меню, сдвигая указатель Caption влево, увеличивая тем самым длину строки с надписью. Вы видите, что этот пункт меню я перевел как "Справка". Если бы длина строки оказалась равна 10 байтам, то от имени элемента меню ничего бы не осталось. После перевода пункта меню, само имя элемента меню стало короче - mHe. Внимательно посмотрите на рисунок еще раз. Так действует инструмент VBLocalize. Если же вы будете удлинять строки самостоятельно в НЕХ-редакторе, то не забывайте менять значение указателя длины для каждой строки (имени элемента и надписи). Напоминаю, что длина строки указывается в шестнадцатеричном формате, а не в десятичном. Для перевода значений из десятичного формата в шестнадцатеричный, воспользуйтесь Калькулятором Windows в режиме "Инженерный".
Еще важный момент, нельзя допускать совпадения имён элементов, если выполняете удлинение строк за счёт них. Неважно каким инструментом это делается, или VBLocalize, или вручную с помощью НЕХ-редактора. Иначе в работающем приложении возникнет конфликт из-за одинаковых идентификаторов (имен) и его работа завершится ошибкой. Особенно такой промах можно допустить при переводе большого приложения с многочисленными меню и подменю. Поэтому важно следить за этим или искать альтернативные варианты перевода.
Еще раз повторю, что инструмент VBLocalize показывает максимальную длину строки с учетом имени элемента, для которого она используется. Желательно переводить так, чтобы переведенная строка была меньше или равнялась длине исходной. Если это сделать невозможно, то рассмотрите вопрос её удлинения за счет имени элемента. Просто нужно быть очень внимательным и следить за адресным пространством, в рамках которого находится тот или иной элемент интерфейса программы.
Также не забывайте делать промежуточных копий файла программы, которую вы переводите. Особенно если делаете кардинальные изменения кода. И главное - не спешите!
[свернуть]
Кто ищет, тот всегда найдет!

WYLEK

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

gazon01

Ответ #3 : 22 июля 2018, 16:54:00 #3 Последнее редактирование: 22 июля 2018, 16:58:54 от gazon01
StInd2013, попросил в ЛС ссылки восстановить в шапке "Задавайте вопросы по русификации...", решил ссылки не восстанавливать (вдруг наш админ захочет удалить юкозовский сайт, и опять всё повиснет), а сделать отдельную тему, и добавлять туда примеры русификации Visual Basic.

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

Цитата: WYLEKлевую картинку
ну извиняйте, не можем мы гифки вставляь
Возможно всё! На невозможное просто требуется больше времени.
 Мудрец из Шангри Ла

WYLEK

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

* Ваши права на сайте

    TinyPortal

  • Вы не можете создавать статьи.
  • Вы не можете изменять свои статьи.
  • Вы не можете писать комментарии.
  • Вы не можете управлять статьями.
  • Вы не можете загружать файлы в TPdownloads.
  • Вы не можете управлять TPlistimages.

    Simple Machines

  • Вы не можете удалять темы.
  • Вы не можете создавать темы.
  • Вы не можете отвечать на сообщения.
  • Вы не можете прикреплять файлы.
  • Вы не можете изменять свои сообщения.
  • Вы не можете удалять свои сообщения.

 аталог@MAIL.RU - каталог ресурсов интернет Яндекс.Метрика