Як русифікувати delphi - програмне забезпечення

Справа в тому, що кодування OEM і ANSI (в якій працює Delphi) не збігаються. У них різні позиції кириличних символів. В ANSI також є наголошені символи яких в OEM немає. Зате в другій присутні символи псевдографіки, які незамінні при зображенні таблиць, хоча це і не дуже затребуване. І все ж варто зауважити, що в цілому ці таблиці взаємозамінні - можливості виведення текстової інформації у них однакові.

Що стосується недоліків даного способу, тут можна позначити роботу поза звичним багатьом IDE з його наворотами, які здорово відрізняють життя, як то: кодування, компіляція, налагодження. І все це, що йдеться, «в одному флаконі». Крім того, при розростанні проекту починають проявлятися певні складності, коли починають використовуватися створені за допомогою кодування ANSI сторонні рядкові ресурси.

Якщо проект безпосередньо включених в код рядків (hard-coded) не містить, можна винести всі строкові ресурси в окремі модулі, локализуя їх потім під ту кодування, яка потрібна. Благо утиліт, які змінюють кодування файлів, в мережі повно.

Тепер про використання фільтруючих процедур. У Windows API містяться функції, які допомагають перетворювати кодування ANSI і OEM одна в іншу. Це OemToChar і CharToOem. Вони і використовуються при виведенні тексту із заміною фрагментів Writeln ( 'текст'); на наступні фрагменти:

procedure MyWriteln (const S: string);
var
NewStr: string;
begin
SetLengtn (NewStr, Length (S));
CharToOem (PChar (S), PChar (NewStr));
Writeln (NewStr);
end;
.
MyWriteln ( 'текст');

Що стосується недоліків цього способу, це неможливість використовувати розширений синтаксис Write і захаращення тексту додатка викликом фільтруючих процедур. Коли треба русифікувати готове додаток з множинними зверненнями до Write, це стає серйозною проблемою.

І останнє - зміна кодової сторінки консолі за допомогою засобів Windows API. Метод цей документований, до речі. Тільки заковика в тому, що функція в Windows 95 і 98 не працює. Хоча якщо працювати додаток буде виключно в Windows NT, в цьому випадку можна взяти на озброєння функцію SetConsoleOutputCP (866).

Схожі статті