Быстрый перевод больших списков на примере регионов мира

от автора

Понадобилось мне перевести список регионов мира на русский. Подобные списки с ISO-кодами встроены во многие CMS и интернет-магазины, и их перевод вручную — занятие зело неблагодарное. На русском я ничего подобного не нашел, да это не сильно помогло бы, поскольку нужно сопоставить названия на английском с названиями на русском. В итоге родилась простенькая идея быстрого перевода подобных списков, которой я хочу поделиться — вдруг кому-то тоже пригодится.

Я переводил список регионов для OpenCart, используя Википедию и простейший скрипт:

$db = mysql_connect('localhost', 'username', 'password'); mysql_select_db('database', $db); mysql_set_charset('utf8', $db);  $result = mysql_query("SELECT zone_id, name FROM zone GROUP BY zone_id ASC"); // Берем список из базы.  while ($row = mysql_fetch_assoc($result)) { 	$page = @file_get_contents('http://en.wikipedia.org/wiki/'.str_replace(" ", "_", $row['name'])); // Запрашиваем страницу на английском. 	preg_match("/<a href=\"\/\/ru\.wikipedia\.org\/wiki\/(.*)\" title/", $page, $matches); // Ищем в коде полученной страницы ссылку на русский вариант.  	if (!empty($matches)) 	{ 		mysql_query("UPDATE zone SET name = '".$row['name']."::".urldecode(str_replace("_", " ", $matches[1]))."' WHERE zone_id = '".$row['zone_id']."'"); // Если нашлось, пишем в базу вот так. 	} 	else 	{ 		mysql_query("UPDATE zone SET name = '".$row['name']."' WHERE zone_id = '".$row['zone_id']."'"); // Если не нашлось, пишем этак. 	} } 

Скрипт просто запрашивает Википедию, подставляя в ссылку английское название, парсит страницу на предмет наличия ссылки на русский вариант и из нее же забирает перевод. Фокус в том, что у Википедии почти все ссылки содержат то же самое название, что и в тексте. Даже вот такой ужас.

Нюансы:

  • Где-то треть списка осталась непереведенной, но это сильно зависит от того, насколько совпадают английские названия с теми, что указаны в Википедии.
  • Переведенный список придется немного почистить руками. Например, в моем случае нужно было убрать названия стран в скобках или всякие там "(значения)", "(город)", "(провинция)" и т. п.
  • Википедия заменяет пробелы на подчеркивания, поэтому нужно туда-сюда их переводить (есть в скрипте). Но я не уверен, что не происходит еще каких-то других замен — стоит этот момент учитывать.
  • Капитан напоминает, что чем больше список, тем дольше он будет обрабатываться. Например, у меня был список из 4000+ зон, и я его запускал через браузер, ограничивая запрос по 1000 строк. Но лучше в таких случаях запускать НЕ через браузер.

Еще раз уточню, что это лишь пример. Теоретически подобное решение можно использовать для перевода любых списков через Википедию с любого языка на любой. Возможно, у данной задачи есть и другие варианты поиска и парсинга полученных данных, но ничего проще я не придумал.

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


Комментарии

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

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