PHP gettext обратный перевод
Мой вопрос довольно прост, я использую gettext для перевода URL-адресов, поэтому у меня есть только переведенная версия строки url.
Я хотел бы знать, существует ли простой способ получить базовую строку из переведенной строки?
Что мне пришло в голову, так это автоматически добавлять переведенное имя в базу данных и псевдонимы с базовой строкой каждый раз, когда я использую свою функцию _u($string)
.
Что я имею в настоящее время:
function _u($string)
{
if (empty($string))
return '';
else
return dgettext('Urls', $string);
}
О чем я думал? (псевдокод):
function _u($string)
{
if (empty($string))
return '';
$translation = dgettext('Urls', $string);
MySQL REPLACE INTO ... base = $string, translation = $translation; (translation = primary key)
return $translation;
}
function url_base($translation)
{
$row = SELECT ... FROM ... translation = $translation;
return $base;
}
Хотя это не кажется лучшим способом сделать это, и если на производстве я удалю часть REPLACE
, то я могу забыть одно или два звена в производстве, на которые я, возможно, не пошел.
EDIT: то, что я в основном ищу, - это часть синтаксического анализа gettext. Мне не нужно пропускать ни одного из возможных URL-адресов, поэтому, если у вас есть другое решение, потребуется парсер (основанный на том, что я ищу).
EDIT2: еще одна трудность есть только что добавлено. Мы должны найти URL-адрес в любом переводе и поместить его обратно в "базовый" перевод, чтобы система проанализировала URL-адрес на базовом языке.
1 ответ:
На самом деле, самый простой способ, который я могу придумать, - это декодировать файлы .mo, используемые для перевода, с помощью вызова утилиты
msgunfmt
.Как только у вас есть база данных открытого текста, вы сохраняете ее в любой другой базе данных, а затем сможете выполнять обратный поиск.
Но, возможно, лучше, вы могли бы создать дополнительный домен (ы) ("ReverseUrlsIT"), в котором можно хранить переведенный URL как ключ, а базу как значение (при условии, что сопоставление полностью двустороннее, что есть!).
В этот момент вы можете использовать
dgettext
для восстановления базовой строки из переведенной строки, при условии, что вы знаете язык переведенной строки.Обновить
Это основной пункт использования gettext, и я бы бросил его в любое время, если бы Я мог бы найти другой синтаксический анализатор / библиотеку / инструмент, который мог бы помочь с этим
Семейство функций
gettext
, в конце концов, немного больше, чем система баз данных хранилища ключей с (возможно) синтаксический анализатор, который немного мощнее, чемprintf
, для обработки множественного числа и инверсий прилагательных/существительных (violin virtuoso на английском языке становится virtuoso di violino на итальянском языке).За счет добавления к базе данных сложности (и нагрузки), вы можете построить хранилище ключей, используя любой уровень устойчивости, который у вас есть под рукой (
gettext
основан на файлах, в конце концов):TABLE LanguageDomain { PRIMARY KEY ldId; varchar(?) ldValue; } # e.g. # 39 it_IT # 44 en_US # 01 us_US TABLE Shorthand { PRIMARY KEY shId; varchar(?) shValue; } # e.g. # 1 CAMERA # 2 BED TABLE Translation { KEY t_ldId, t_shId; varchar(?) t_Value; // Or one value for singular form, one for plural... } # e.g. # 44 1 Camera # 39 1 Macchina fotografica # 01 1 Camera # 44 1 Bed # 39 1 Letto # 01 1 Bed # 01 137 Behavior # 44 137 Behaviour # "American and English have many things in common..." # 01 979 Cookie # 44 979 Biscuit " "...except of course the language" (O. Wilde) function translate($string, $arguments = array()) { GLOBAL $languageDomain; // First recover main string SELECT t_Value FROM Translation AS t LEFT JOIN LanguageDomain AS l ON (t.ldId = l.ldId AND l.ldValue = :LangDom) LEFT JOIN Shorthand AS s ON (t.t_shId = s.shId AND s.shValue=:String); // if (empty($arguments)) return $Result; // Now run replacement of arguments - if any $replacements = array(); foreach($arguments as $n => $argument) $replacements["\${$n}"] = translate($argument); // Now replace '$1' with translation of first argument, etc. return str_replace(array_keys($replacements), array_values($replacements), $Result); }
Это позволит вам легко добавить еще один
Эта система совместима с POfiles, что важно, если вам нужно передать перевод на аутсорсинг кому-то, использующему стандартные инструменты торговли. Но вы можете так же легко вывести запрос непосредственно в формат TMX, исключив дубликаты (в некоторых случаях это может действительно сократить ваш стоимость перевода-несколько услуг завышают цену за ввод в "странных" форматах, таких как Excel, и либо завышают цену за "дедупинг", либо будут взимать плату за каждый дубликат, как если бы это был оригинал).languageDomain
и даже запускать такие запросы, как, например, - Какие термины в английском языке еще не переведены на немецкий?"(то есть, имеют нулевое значение, когдаLEFT JOIN
ing подмножествоTranslation
таблицы с английским доменным идентификатором с подмножеством с немецким доменным идентификатором).<?xml version="1.0" ?> <tmx version="1.4"> <header creationtool="MySQLgetText" creationtoolversion="0.1-20120827" datatype="PlainText" segtype="sentence" adminlang="en-us" srclang="EN" o-tmf="ABCTransMem"> </header> <body> <tu tuid="BED" datatype="plaintext"> <tuv xml:lang="en"> <seg>bed</seg> </tuv> <tuv xml:lang="it"> <seg>letto</seg> </tuv> </tu> <tu tuid="CAMERA" datatype="plaintext"> <tuv xml:lang="en"> <seg>camera</seg> </tuv> <tuv xml:lang="it"> <seg>macchina fotografica</seg> </tuv> </tu> </body> </tmx>