Перевод русских имен и фамилий на английский язык при помощи PHP

от автора

Во время создания сайтов, я столкнулся с проектом, где требовалось хранить в базе данных имена, фамилии и отчества людей на английском языке, для последующей передачи этой информации через API на удаленный сервис. Однако сам сайт был ориентирован на русскую аудиторию и как-то не хотелось заморачивать пользователей вбивать своё ФИО на английском языке, причем на русском языке эта информация тоже должна была быть. В результате было принято решение, позволяющее пользователям заносить информацию о своем ФИО только на русском языке, а транслит на английский язык обеспечивала специальная функция, незаметно для пользователей.

Погуглив на тему выдачи мне готовой функции PHP, поисковик толкового ничего не нашёл, большинство страниц ссылались только на описание правил образования английских ФИО из русских. Почитав подобные статьи на эту тему, небольшим открытием для меня стало то, что в настоящий момент существует 2 разных правила перевода, — так называемый «правильный» и официальный по ГОСТ Р52535.1-2006, применяемый для загранпаспортов (приказ ФМС России от 3 февраля 2010 г. N26). Судя по отзывам, официальная версия, сделана несколько криво и поэтому применяют ее в основном для того, для чего ее создали. Если посмотреть на принятые правила, то, возможно, вы с этим тоже согласитесь. Приведу их в качестве примера в виде массива:

$replace = array( 	"А"=>"A","а"=>"a", 	"Б"=>"B","б"=>"b", 	"В"=>"V","в"=>"v", 	"Г"=>"G","г"=>"g", 	"Д"=>"D","д"=>"d", 	"Е"=>"E","е"=>"e", 	"Ё"=>"E","ё"=>"e", 	"Ж"=>"Zh","ж"=>"zh", 	"З"=>"Z","з"=>"z", 	"И"=>"I","и"=>"i", 	"Й"=>"I","й"=>"i", 	"К"=>"K","к"=>"k", 	"Л"=>"L","л"=>"l", 	"М"=>"M","м"=>"m", 	"Н"=>"N","н"=>"n", 	"О"=>"O","о"=>"o", 	"П"=>"P","п"=>"p", 	"Р"=>"R","р"=>"r", 	"С"=>"S","с"=>"s", 	"Т"=>"T","т"=>"t", 	"У"=>"U","у"=>"u", 	"Ф"=>"F","ф"=>"f", 	"Х"=>"Kh","х"=>"kh", 	"Ц"=>"Tc","ц"=>"tc", 	"Ч"=>"Ch","ч"=>"ch", 	"Ш"=>"Sh","ш"=>"sh", 	"Щ"=>"Shch","щ"=>"shch", 	"Ы"=>"Y","ы"=>"y", 	"Э"=>"E","э"=>"e", 	"Ю"=>"Iu","ю"=>"iu", 	"Я"=>"Ia","я"=>"ia", 	"ъ"=>"","ь"=>"" ); 

Тут в принципе все просто, каждой букве русского языка соответствует буква или комбинация букв английского языка.

Немного сложнее выглядят правила «правильного» перевода, которые учитывают особенности при переводе некоторых букв ‘Е’, ‘Ё’, ‘Ъ’, ‘Ь’ и дифтонгов (сочетаний гласной буквы и ‘Й’). Рассмотрим опять же на примере в виде массива соответствий:

$replace = array( 	"А"=>"A","а"=>"a", 	"Б"=>"B","б"=>"b", 	"В"=>"V","в"=>"v",	 	"Г"=>"G","г"=>"g", 	"Д"=>"D","д"=>"d", 	"Е"=>"Ye","е"=>"e", 	"Ё"=>"Ye","ё"=>"e", 	"Ж"=>"Zh","ж"=>"zh", 	"З"=>"Z","з"=>"z", 	"И"=>"I","и"=>"i", 	"Й"=>"Y","й"=>"y", 	"К"=>"K","к"=>"k", 	"Л"=>"L","л"=>"l", 	"М"=>"M","м"=>"m", 	"Н"=>"N","н"=>"n", 	"О"=>"O","о"=>"o", 	"П"=>"P","п"=>"p", 	"Р"=>"R","р"=>"r", 	"С"=>"S","с"=>"s", 	"Т"=>"T","т"=>"t", 	"У"=>"U","у"=>"u", 	"Ф"=>"F","ф"=>"f", 	"Х"=>"Kh","х"=>"kh", 	"Ц"=>"Ts","ц"=>"ts", 	"Ч"=>"Ch","ч"=>"ch", 	"Ш"=>"Sh","ш"=>"sh", 	"Щ"=>"Shch","щ"=>"shch", 	"Ъ"=>"","ъ"=>"", 	"Ы"=>"Y","ы"=>"y", 	"Ь"=>"","ь"=>"", 	"Э"=>"E","э"=>"e", 	"Ю"=>"Yu","ю"=>"yu", 	"Я"=>"Ya","я"=>"ya", ); 

Данный массив, помимо простого преобразования букв, учитывает одно из правил, — если буквы ‘E’ и ‘Ё’ стоят в начале слова, то они преобразуются как ‘YE’. К сожалению, другие правила «правильного» перевода не удалось установить через данный массив соответствий и последующей обработкой их функцией strtr(), поэтому пришлось пойти на некоторые ухищрения. Но прежде, чем показать это в коде, приведу сами правила, которые необходимо учитывать при «правильном» переводе:
— Буквы ‘E’ и ‘Ё’, если они стоят после гласных и знаков ‘Ъ’ и ‘Ь’, то транслитерируются как ‘YE’.
— Окончания ‘ИЙ’ и ‘ЫЙ’, вместо них как правило ставится только одна буква ‘Y’.

Чтобы учесть эти 2 правила, я создал 3 дополнительных массива одинаковой длинны, два из которых описывают комбинации букв ‘E’ и ‘Ё’ с гласными и знаками ‘Ъ’/’Ь’, а также окончания ‘ИЙ’/’ЫЙ’. Третий массив содержит комбинацию этих же букв со знаками ‘$’ для первого правила и символ ‘@’ для второго. Эти символы мы добавляем в слово как временные, они показывают, что тут нужно применить одно из правил. Затем через функцию str_replace замещаются найденные комбинации в слове из первого и второго массива, на комбинации из третьего. Т.е. если встречается в слове комбинация, к примеру, ‘ae’ из первого массива, то она заменяется на ‘а$’ из третьего, и так далее. А дальше срабатывает обычная функция преобразования символов strtr() из массива, в которой дополнительно прописаны наши правила для символов ‘@’=>’y’ и ‘$’=>’ye’.

На самом деле есть еще одно правило для «правильного» перевода, когда буква ‘Ё’ переводится как ‘YO’, но так делается обычно тогда, когда нужно подчеркнуть ее звучание. Например, имя Фёдор, можно перевести как Fyedor, а если нужно подчеркнуть звучание ‘Ё’, то переводится как Fyodor. Но учитывая то, что нет общепринятых правил на этот счет, то оба варианта можно расценивать как верные, а предусмотреть это в коде возможности нет, так как и нет однозначных правил, которые можно было бы использовать.

Вот в принципе, вот и все, теперь, учитывая 2 разных правила перевода, приведу это в виде универсальной функции на php, в первом параметре которой передается строка для перевода, а во втором значение boolean, означающее, какой перевод мы хотим получить:

public function get_in_translate_to_en($string, $gost=false) { 	if($gost) 	{ 		$replace = array("А"=>"A","а"=>"a","Б"=>"B","б"=>"b","В"=>"V","в"=>"v","Г"=>"G","г"=>"g","Д"=>"D","д"=>"d",                 "Е"=>"E","е"=>"e","Ё"=>"E","ё"=>"e","Ж"=>"Zh","ж"=>"zh","З"=>"Z","з"=>"z","И"=>"I","и"=>"i",                 "Й"=>"I","й"=>"i","К"=>"K","к"=>"k","Л"=>"L","л"=>"l","М"=>"M","м"=>"m","Н"=>"N","н"=>"n","О"=>"O","о"=>"o",                 "П"=>"P","п"=>"p","Р"=>"R","р"=>"r","С"=>"S","с"=>"s","Т"=>"T","т"=>"t","У"=>"U","у"=>"u","Ф"=>"F","ф"=>"f",                 "Х"=>"Kh","х"=>"kh","Ц"=>"Tc","ц"=>"tc","Ч"=>"Ch","ч"=>"ch","Ш"=>"Sh","ш"=>"sh","Щ"=>"Shch","щ"=>"shch",                 "Ы"=>"Y","ы"=>"y","Э"=>"E","э"=>"e","Ю"=>"Iu","ю"=>"iu","Я"=>"Ia","я"=>"ia","ъ"=>"","ь"=>""); 	} 	else 	{ 		$arStrES = array("ае","уе","ое","ые","ие","эе","яе","юе","ёе","ее","ье","ъе","ый","ий"); 		$arStrOS = array("аё","уё","оё","ыё","иё","эё","яё","юё","ёё","её","ьё","ъё","ый","ий");         		$arStrRS = array("а$","у$","о$","ы$","и$","э$","я$","ю$","ё$","е$","ь$","ъ$","@","@");                      		$replace = array("А"=>"A","а"=>"a","Б"=>"B","б"=>"b","В"=>"V","в"=>"v","Г"=>"G","г"=>"g","Д"=>"D","д"=>"d",                 "Е"=>"Ye","е"=>"e","Ё"=>"Ye","ё"=>"e","Ж"=>"Zh","ж"=>"zh","З"=>"Z","з"=>"z","И"=>"I","и"=>"i",                 "Й"=>"Y","й"=>"y","К"=>"K","к"=>"k","Л"=>"L","л"=>"l","М"=>"M","м"=>"m","Н"=>"N","н"=>"n",                 "О"=>"O","о"=>"o","П"=>"P","п"=>"p","Р"=>"R","р"=>"r","С"=>"S","с"=>"s","Т"=>"T","т"=>"t",                 "У"=>"U","у"=>"u","Ф"=>"F","ф"=>"f","Х"=>"Kh","х"=>"kh","Ц"=>"Ts","ц"=>"ts","Ч"=>"Ch","ч"=>"ch",                 "Ш"=>"Sh","ш"=>"sh","Щ"=>"Shch","щ"=>"shch","Ъ"=>"","ъ"=>"","Ы"=>"Y","ы"=>"y","Ь"=>"","ь"=>"",                 "Э"=>"E","э"=>"e","Ю"=>"Yu","ю"=>"yu","Я"=>"Ya","я"=>"ya","@"=>"y","$"=>"ye");                  		$string = str_replace($arStrES, $arStrRS, $string); 		$string = str_replace($arStrOS, $arStrRS, $string); 	}          	return iconv("UTF-8","UTF-8//IGNORE",strtr($string,$replace)); } 

Надеюсь, данный пост окажется для кого-то интересным и пригодиться при создании своего проекта.

ссылка на оригинал статьи http://habrahabr.ru/post/187778/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *