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

в 10:07, , рубрики: php, Программирование, метки:

Понадобилось мне перевести список регионов мира на русский. Подобные списки с 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 строк. Но лучше в таких случаях запускать НЕ через браузер.

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

Автор: czorny

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js