Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Translater ..По Срочнякам, Помогите плизз 
:(
    Опции темы
ShuVaS
Дата 6.1.2005, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 26.12.2004
Где: Севастополь

Репутация: нет
Всего: нет



Знач так столкнулся с траблой - мне надо написать как моно скорее переводчик Русско-Латынский и наоботор - я имею ввиду 'русский' переводило в 'rysskiy' и наоборот.Понимаю что может это и легко очень но очень прошу помощи.... smile smile
PM MAIL WWW ICQ   Вверх
Alex
Дата 6.1.2005, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Код

function RusToEng(s: string): string;
// Функция транслирует текст из русского в латиницу
var
 i: integer;
 t: string;
begin
 t:= '';
 for i:=1 to Length(s) do
   begin
     case s[i] of
       'а': t:= t + 'a';    'б': t:= t + 'b';    'в': t:= t + 'v';
       'г': t:= t + 'g';    'д': t:= t + 'd';    'е': t:= t + 'e';
       'ё': t:= t + 'jo';   'ж': t:= t + 'zh';   'з': t:= t + 'z';
       'и': t:= t + 'i';    'й': t:= t + 'j';    'к': t:= t + 'k';
       'л': t:= t + 'l';    'м': t:= t + 'm';    'н': t:= t + 'n';
       'о': t:= t + 'o';    'п': t:= t + 'p';    'р': t:= t + 'r';
       'с': t:= t + 's';    'т': t:= t + 't';    'у': t:= t + 'u';
       'ф': t:= t + 'f';    'х': t:= t + 'h';    'ц': t:= t + 'z';
       'ч': t:= t + 'ch';   'ш': t:= t + 'sh';   'щ': t:= t + 'sch';
       'ъ': t:= t + '''';   'ы': t:= t + 'y';    'ь': t:= t + '''';
       'э': t:= t + '''e';  'ю': t:= t + 'ju';   'я': t:= t + 'ja';
       'А': T:= T + 'A';    'Б': T:= T + 'B';    'В': T:= T + 'V';
       'Г': T:= T + 'G';    'Д': T:= T + 'D';    'Е': T:= T + 'E';
       'Ё': T:= T + 'Jo';   'Ж': T:= T + 'Zh';   'З': T:= T + 'Z';
       'И': T:= T + 'I';    'Й': T:= T + 'J';    'К': T:= T + 'K';
       'Л': T:= T + 'L';    'М': T:= T + 'M';    'Н': T:= T + 'N';
       'О': T:= T + 'O';    'П': T:= T + 'P';    'Р': T:= T + 'R';
       'С': T:= T + 'S';    'Т': T:= T + 'T';    'У': T:= T + 'U';
       'Ф': T:= T + 'F';    'Х': T:= T + 'H';    'Ц': T:= T + 'Z';
       'Ч': T:= T + 'Ch';   'Ш': T:= T + 'Sh';   'Щ': T:= T + 'Sch';
       'Ъ': T:= T + '''';   'Ы': T:= T + 'Y';    'Ь': T:= T + '''';
       'Э': T:= T + '''E';  'Ю': T:= T + 'Ju';   'Я': T:= T + 'Ja';
     else
       t:= t + s[i];
     end;
   end;
 Result:=t;
end;



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Satana
Дата 6.1.2005, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: 1
Всего: 5



ShuVaS А не проще найти в нете транслитерратор?


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
Snowy
Дата 6.1.2005, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Вот, наваял. Вполне неплохо работает. При желании можно сюда впихать вообще любую таблицу.
Код

function Translin(s:string):string;
const trans: array[192..255] of string=(
 'A','B','V','G','D','E','J','Z','I','Y','K','L','M','N','O','P','R',
 'S','T','U','F','H','Ts','Ch','Sh','Sch','`','Y','`','E','Yu','Ya',
 'a','b','v','g','d','e','j','z','i','y','k','l','m','n','o','p','r',
 's','t','u','f','h','ts','ch','sh','sch','`','y','`','e','yu','ya');
var
 l: string;
 i: integer;
begin
 for i:=1 to Length(s) do
   if ord(s[i])>191 then l:=l+trans[ord(s[i])]
   else l:=l+s[i];
 result:=l;
end;

Таблицу можно вынести в глобальные константы, в файл, в реестр. Куда хотите...
(Только для файла и реестра это есстественно уже не константа, а просто массив);

Это сообщение отредактировал(а) Snowy - 6.1.2005, 11:16
PM MAIL   Вверх
ShuVaS
Дата 6.1.2005, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 26.12.2004
Где: Севастополь

Репутация: нет
Всего: нет



Парни - как с русскокого на латынь понятно - а обратно ? smile
PM MAIL WWW ICQ   Вверх
Satana
Дата 6.1.2005, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: 1
Всего: 5



ShuVaS а обратно нада некоторые символы анализировать что за ними идет, к примеру если встречаешь c то надо посмотреть что за ним идет если h то эти 2 меняем на 1 ч ну и так далее...


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
Akella
Дата 6.1.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



возьми функцию Alexa и переделай, неужели так тяжело smile
PM MAIL   Вверх
Snowy
Дата 6.1.2005, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Конечно тяжко. Обратно гораздо сложнее - нужно буковки соединять вместе.
Более того, корректно это можно сделать только при наличии словаря, и то, корректность гарантируется только на 99%.

Вот набор контрольных примеров: Представьте, что вы накатали алгоритм перевода. Как ваш алгоритм проглотит следующие слова (скажем так слова для контроля алгоритма):
voshod
shema
kucheryavyy
schetnyy


Я думаю этого набора примеров должно быть достаточно, чтобы понять, что здесь нужен не конвертер, а языковой анализатор. А это уже нужно писать интеллект, за который могут заплатить хорошие денежки smile
Нужно иметь хороший словарь, просчитывать алгоритмы словообразования и реализовать лексический анализатор. Кому не слабо?
PM MAIL   Вверх
ShuVaS
Дата 6.1.2005, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 26.12.2004
Где: Севастополь

Репутация: нет
Всего: нет



блин неужели нерельно сделать ?А надо очень срочно ...
PM MAIL WWW ICQ   Вверх
Akella
Дата 6.1.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



само собой, что функцию нужно, как говориться шлифовать smile
когда отшлифуешь выкладывай сюда
Код

Function TfmMain.Translit(s:String):String;
Var
sym:char;
i:integer;
s2:String;
begin
//сначала заменяем всякие двойные, типа sh
s2:=StringReplace(s,'sh','ш',[rfIgnoreCase]);
s2:=StringReplace(s,'sсh','щ',[rfIgnoreCase]);
s2:=StringReplace(s,'сh','ч',[rfIgnoreCase]);
s2:=StringReplace(s,'th','т',[rfIgnoreCase]);
s2:=StringReplace(s,'sсh','щ',[rfIgnoreCase]);
s2:=StringReplace(s,'zh','ж',[rfIgnoreCase]);
s2:=StringReplace(s,'ya','я',[rfIgnoreCase]);

//ну и так далее сам остальные придумывай, как тебе нравится
//далее обрабатываем по символу
s:=s2;
//можно добавить проверку, типа если последняя буква 'Y' или 'y', то меняем на 'ий'
if Copy(s,length(s),1)='Y' then begin
 delete(s,length(s),1);
 s:= s+'ИЙ';
end;
if Copy(s,length(s),1)='y' then begin
 delete(s,length(s),1);
 s:= s+'ий';
end;
if Copy(s,length(s)-1,2)='YY' then begin
 delete(s,length(s)-,2);
 s:= s+'ЫЙ';
end;
if Copy(s,length(s)-1,2)='yy' then begin
 delete(s,length(s)-1,2);
 s:= s+'ый';
end;

For i:=1 to Length(s) do begin
  sym:=s[i];
Case sym of
 'Q': result := 'К';
 'W': result := 'В';
 'E': result := 'Е';
 'R': result := 'Р';
 'T': result := 'Т';
 'Y': result := 'Й';
 'U': result := 'У';
 'I': result := 'И';
 'O': result := 'О';
 'P': result := 'П';
 'A': result := 'А';
 'S': result := 'С';
 'D': result := 'Д';
 'F': result := 'Ф';
 'G': result := 'Г';
 'H': result := 'Х';
 'J': result := 'Ж';
 'K': result := 'К';
 'L': result := 'Л';
 'Z': result := 'З';
 'X': result := 'КС';
 'C': result := 'Ц';
 'V': result := 'В';
 'B': result := 'Б';
 'N': result := 'Н';
 'M': result := 'М';
 'q': result := 'к';
 'w': result := 'в';
 'e': result := 'е';
 'r': result := 'р';
 't': result := 'т';
 'y': result := 'й';
 'u': result := 'у';
 'i': result := 'и';
 'o': result := 'о';
 'p': result := 'п';
 'a': result := 'а';
 's': result := 'с';
 'd': result := 'д';
 'f': result := 'ф';
 'g': result := 'г';
 'h': result := 'х';
 'j': result := 'ж';
 'k': result := 'к';
 'l': result := 'л';
 'z': result := 'з';
 'x': result := 'кс';
 'c': result := 'ц';
 'v': result := 'в';
 'b': result := 'б';
 'n': result := 'н';
 'm': result := 'м';
 '0': result :='0';
 '1': result :='1';
 '2': result :='2';
 '3': result :='3';
 '4': result :='4';
 '5': result :='5';
 '6': result :='6';
 '7': result :='7';
 '8': result :='8';
 '9': result :='9';
 ' ': result :=' ';
end;//case-else
 result:=result+sym;
end;// For i:=1 to Length(s) do begin
end;


Это сообщение отредактировал(а) dsergey - 6.1.2005, 15:25
PM MAIL   Вверх
Snowy
Дата 6.1.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Реально. Но не срочно. Тут нужно много времени, анализа и мозгов.
Простой вариант легко. Он даже в 75% будет корректно работать smile
Но буквы й и ы уже совпадают. Это уже нехилая проблема. А в остальных случаях можно складывать буковки, наплевав на корректность.
Если расскажешь мне, как при декодировании различить й от s? то могу накатать пример, как декодировать, складывая буковки. Пусть не совсем корректно, но восстанавливать будет.
Понимаешь ли, транслитерация - это перевод с потерями. А потери нужно восстанавливать логикой, как FineReader восстанавливает текст из графики.
Добавлено @ 14:27
To dsergey:
Круто... А попробуй прогнать через эту функцию такие слова, как:
volshebnyy, cheburashka, zhestyanschik...
Не говоря уже про приведенные выше недвусмысленные слова.
PM MAIL   Вверх
ShuVaS
Дата 6.1.2005, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 26.12.2004
Где: Севастополь

Репутация: нет
Всего: нет



а теперь вопросик - как вызвать твою функцию, dsergey ??
я вызывал
Код

...
var
 i: integer;
begin
 Memo2.Lines.Clear;
 for i:=0 to Memo1.Lines.Count-1 do
   Memo2.Lines.Add(Translit(Memo1.Lines.Strings[i]));


и че то у меня не вига не переводило ... странно(я наверное че то не правильно делаю )
у тя в коде еще
Код

if Copy(s,length(s)-1,2)='YY' then begin
 delete(s,length(s)-,2);
 s:= s+'ЫЙ';
end;
if Copy(s,length(s)-1,2)='yy' then begin
 delete(s,length(s)-,2);


менус 2 ставить или что ?
PM MAIL WWW ICQ   Вверх
Akella
Дата 6.1.2005, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



ща че нить придумаем
PM MAIL   Вверх
Akella
  Дата 6.1.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



это то, что надо
Код

Function TForm1.Translit(s:String):String;
Var
sym:char;
i:integer;
sym2:String;

begin
//сначала заменяем всякие двойные, типа sh
s:=StringReplace(s,'sh','ш',[rfReplaceAll,rfIgnoreCase]);
s:=StringReplace(s,'sсh','щ',[rfIgnoreCase,rfReplaceAll]);
s:=StringReplace(s,'сh','ч',[rfIgnoreCase,rfReplaceAll]);
s:=StringReplace(s,'th','т',[rfIgnoreCase,rfReplaceAll]);
s:=StringReplace(s,'sсh','щ',[rfIgnoreCase,rfReplaceAll]);
s:=StringReplace(s,'zh','ж',[rfIgnoreCase,rfReplaceAll]);
s:=StringReplace(s,'ya','я',[rfIgnoreCase,rfReplaceAll]);
//ну и так далее сам остальные придумывай, как тебе нравится

//далее обрабатываем по символу
//можно добавить проверку, типа если последняя буква 'Y' или 'y', то меняем на 'ий'
if Copy(s,length(s),1)='Y' then begin
delete(s,length(s),1);
s:= s+'ИЙ';
end;
if Copy(s,length(s),1)='y' then begin
delete(s,length(s),1);
s:= s+'ий';
end;
if Copy(s,length(s)-1,2)='YY' then begin
delete(s,length(s)-1,2);
s:= s+'ЫЙ';
end;
if Copy(s,length(s)-1,2)='yy' then begin
delete(s,length(s)-1,2);
s:= s+'ый';
end;

For i:=1 to Length(s) do begin
 sym:=s[i];
Case sym of
'Q': sym2 := 'К';
'W': sym2 := 'В';
'E': sym2 := 'Е';
'R': sym2 := 'Р';
'T': sym2 := 'Т';
'Y': sym2 := 'Й';
'U': sym2 := 'У';
'I': sym2 := 'И';
'O': sym2 := 'О';
'P': sym2 := 'П';
'A': sym2 := 'А';
'S': sym2 := 'С';
'D': sym2 := 'Д';
'F': sym2 := 'Ф';
'G': sym2 := 'Г';
'H': sym2 := 'Х';
'J': sym2 := 'Ж';
'K': sym2 := 'К';
'L': sym2 := 'Л';
'Z': sym2 := 'З';
'X': sym2 := 'КС';
'C': sym2 := 'Ц';
'V': sym2 := 'В';
'B': sym2 := 'Б';
'N': sym2 := 'Н';
'M': sym2 := 'М';
'q': sym2 := 'к';
'w': sym2 := 'в';
'e': sym2 := 'е';
'r': sym2 := 'р';
't': sym2 := 'т';
'y': sym2 := 'й';
'u': sym2 := 'у';
'i': sym2 := 'и';
'o': sym2 := 'о';
'p': sym2 := 'п';
'a': sym2 := 'а';
's': sym2 := 'с';
'd': sym2 := 'д';
'f': sym2 := 'ф';
'g': sym2 := 'г';
'h': sym2 := 'х';
'j': sym2 := 'ж';
'k': sym2 := 'к';
'l': sym2 := 'л';
'z': sym2 := 'з';
'x': sym2 := 'кс';
'c': sym2 := 'ц';
'v': sym2 := 'в';
'b': sym2 := 'б';
'n': sym2 := 'н';
'm': sym2 := 'м';
'0': sym2 := '0';
'1': sym2 := '1';
'2': sym2:= '2';
'3': sym2 := '3';
'4': sym2 := '4';
'5': sym2 := '5';
'6': sym2 := '6';
'7': sym2 := '7';
'8': sym2 := '8';
'9': sym2 := '9';
' ': sym2 := ' ';
else//case-else
 sym2:=sym;
end;
result:=result+sym2;
end;// For i:=1 to Length(s) do begin
end;


smile

Это сообщение отредактировал(а) dsergey - 6.1.2005, 16:02
PM MAIL   Вверх
Snowy
Дата 6.1.2005, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Ндяяяя.... Нагорожено в 10 раз больше, но...
На анализатор это мало похоже.
нужно тогда уж написать универсальный цикл, а варианты как-то списком продумать, т.к. есть масса другий выриантов, где не может применяться одна буква, а применяется другая.
ой, ёй, ай, эй, уй, smile, яй, юй...
перед ы всегда согласная, перед й гласная. (но есть исключения)
Кроме того я дал уже достаточный набор тестовых слов. Неужели так сложно пропустить их через свой модуль? Ну не тянет!!! Лажа идет. Зачем предлагать что-попало. Трансрусификация это я вижу, но вопрос стоит в том, чтобы функция была обратной транслитерации, а не просто прописывала английские буквы по русски. Или я не прав? (Не вижу правда смысла в трансрусификации английских букв...)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2025 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.