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