str1[1]:= UpCase_R(str1[1]);
end;
str2:= str2+str1;
end
else if ch in small_al then //если маленькая русская буква
begin
if UpCase_R(ch) = 'Ё' then str1:= b_jo
else str1:= alph[UpCase_R(ch)];
str2:= str2+str1;
end
else //если не является символом русского алфавита
str2:= str2+ch;
end;
MainForm.MemLat.Lines.Add(str2); //добавляем переведенную строку в окошко
с переводом
end; //и все с начала (след. строка)
end;
В приложении №1 приводится блок-схема этого алгоритма.
Обратный перевод осуществляется аналогично прямому за исключением того, что из строки с транслитом сначала выбирается подстрока с длинной равной наибольшей длинне буквы в словаре транслита (для правильной обработки символов типа «ъ» - «’ ’» и «ь» - «’ ’»):
procedure TMainForm.acLatTuCyrExecute(Sender: TObject);
const
lat_small : set of char = ['a'..'z',''''];
lat_up : set of char = ['A'..'Z'];
var
i1,j1,i3,max_l,tek_l,len :integer;
str,str1,st2 :string;
ch :char;
ok1,f_ok :boolean;
function find(var st_in:string):boolean; //Эта функция ищет в alph['А'..'Я'] заданную строку
var //т.е. пытается определить какой букве русского алфавита соответствует введенная строка
i2 :char;
j2,i3 :integer;
st_mod :string;
ok :boolean;
begin
st_mod:= st_in; //Будем работать с локальной переменной, чтоб не испортить исходную строку
forj2:= 1 tolength(st_mod) do //уменьшаем регистр у символов в строке
st_mod[j2]:= downcase(st_mod[j2]);
find:= false; //Присваиваем начальное значение результату функции
ifb_jo = st_modthen //буква определяется Ё отдельно
begin
st_mod:= 'Ё';
if st_in[1] in lat_small then st_mod:= 'ё'; //проверяем должна ли буква быть маленькой
st_in:= st_mod; //меняем исходную на переведенную
find:= true; //да, мы нашли соответствие возвращаем true
exit; //досрочныйвыход.
end;
fori2:= 'А' to 'Я' do //а если не Ё, то проверяем все буквы по алгоритму приведенному выше
begin
if alph[i2] = st_mod then
begin
st_mod:= i2;
if (st_in[1] in lat_up) then st_in:= st_mod;
else st_in:= DownCase(st_mod);
find:= true;
exit;
end;
end;
end;
begin
MainForm.MemCyr.Clear; //очищаем поле для результата
max_l:= length(b_jo); //запоминаем длинну самой длинной буквы в алфавите
forch:= 'А' to 'Я' do //цикл по всем буквам
begin
tek_l:= length(alph[ch]);
if tek_l > max_l then max_l:= tek_l;
end;
for i1:= 0 to MainForm.MemLat.Lines.Count-1 do //цикл построчно
begin
str:= MainForm.MemLat.Lines[i1];
st2:= '';
str1:= '';
whilestr <> '' do //пока строка не пустая (обработанные символы будем удалять)
begin
f_ok:= false;
forj1:= max_ldownto 1 do //пытаемся собрать букву разной длины
begin
st2:= '';
for i3:= 1 to j1 do
begin
if (str[i3] in lat_small)or(str[i3] in lat_up)then
st2:= st2+str[i3] //если латинская буква тогда заносим её в st2!
else if j1 = 1 then
begin
st2:= str[i3]; //это символ не кириллицы, заносим в строку с результатом (st2)
delete(str,1,1); //удаляем из исходной
f_ok:= true; //обработали
break;
end
elsebreak;
end;
len:= length(st2); //запомним длину полученной строки
iffind(st2) then //и если окажется, что она соответствует русской букве
begin
delete(str,1,len); //удалим ее из исходной строки
f_ok:= true; //обработали
break;
end;
end;
str1:= str1 + st2; //добавляем к строке с результатом полученную букву
ifnotf_okthen
delete(str,1,1); //если по какой-то причине еще не удалили из исходной, то удаляем сейчас
end;
MainForm.MemCyr.Lines.Add(str1); //и заноси строку в окно с переводом
end;
end;
Для работы программы достаточно исполняемого файла. Если необходимы дополнительные словари, то они могут, как прилагаться к программе, так и создаваться вручную в самом приложении. Текст для перевода может загружаться из файла или вводиться с клавиатуры, а результат работы - сохраняться в файл. Это позволяет удобней вводить данные и обрабатывать результат.
Для тестов использовались два отрывка текста, написанных на кириллице. Первый из них – отрывок из первой главы книги «Библия Delphi» Михаила Флёнова:
«Прежде чем программировать компьютер, мы должны понять, как он работает.Как говорил какой-то полководец: «Нужно хорошо изучить своего врага!!!».Возможно, это говорил и не полководец, но это не важно :). Кодинг – это постоянная борьба с машиной. Нужно заставлять её делать то, что тебе нужно. Поэтому любой программист просто обязан знать его внутренности. Компьютер состоит из следующих основных компонентов: процессор, память, видеокарта, винчестер (жёсткий диск) и различные разъёмы для подключения дополнительных устройств. Все эти компоненты связаны между собой с помощью шлейфов и шин.»
При переводе этого текста на транслит получился следующий текст:
«Prezhde chem programmirovat' komp'juter, my dolzhny ponjat', kak on rabotaet.Kak govoril kakojj-to polkovodec: «Nuzhno khorosho izuchit' svoego vraga!!!». Vozmozhno, ehto govoril i ne polkovodec, no ehto ne vazhno :). Koding – ehto postojannaja bor'ba s mashinojj. Nuzhno zastavljat' ejo delat' to, chto tebe nuzhno. Poehtomu ljubojj programmist prosto objazan znat' ego vnutrennosti. Komp'juter sostoit iz sledujushhikh osnovnykh komponentov: processor, pamjat', videokarta, vinchester (zhjostkijj disk) i razlichnye raz''jomy dlja podkljuchenija dopolnitel'nykh ustrojjstv. Vse ehti komponenty svjazany mezhdu sobojj s pomoshh'ju shlejjfov i shin.».
При переводе этого текста обратно на кириллицу, получаем текст идентичный первоначальному, что свидетельствует о правильной работе программы.
Второй текст для теста был взят из книги Фрэнка Херберта «Бог - император Дюны», глава первая:
«Я не только с огромным удовольствием сообщаю вам сегодня об открытии чудесного содержимого тайного хранилища с его значительной коллекцией рукописей, запечатленных на Редуланской хрустальной бумаге, но также горда привести вам доводы в защиту подлинности наших открытий, сообщить вам, почему мы считаем, что открыли подлинные дневники Лито II, Бога Императора.»
Результат перевода:
«Ja ne tol'ko s ogromnym udovol'stviem soobshhaju vam segodnja ob otkrytii chudesnogo soderzhimogo tajjnogo khranilishha s ego znachitel'nojj kollekciejj rukopisejj, zapechatlennykh na Redulanskojj khrustal'nojj bumage, no takzhe gorda privesti vam dovody v zashhitu podlinnosti nashikh otkrytijj, soobshhit' vam, pochemu my schitaem, chto otkryli podlinnye dnevniki Lito II, Boga Imperatora.»
При переводе данного текста в кириллицу был обнаружен недочёт, не связанный с алгоритмом программы – римские цифры. II преобразуется в ИИ, VV – в ВВ и т.д.