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