.
Была задумка найти в коде приложений место, отвечающее за используемый по умолчанию набор символов для всей программы, если он явно не был указан при её создании.
Мои изыскания привели к следующему: в программах на 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 показывает максимальную длину строки с учетом имени элемента, для которого она используется. Желательно переводить так, чтобы переведенная строка была меньше или равнялась длине исходной. Если это сделать невозможно, то рассмотрите вопрос её удлинения за счет имени элемента. Просто нужно быть очень внимательным и следить за адресным пространством, в рамках которого находится тот или иной элемент интерфейса программы.
Также не забывайте делать промежуточных копий файла программы, которую вы переводите. Особенно если делаете кардинальные изменения кода. И главное - не спешите!