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 2

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);
}

Это позволит вам легко добавить еще один languageDomain и даже запускать такие запросы, как, например, - Какие термины в английском языке еще не переведены на немецкий?"(то есть, имеют нулевое значение, когда LEFT JOINing подмножество Translation таблицы с английским доменным идентификатором с подмножеством с немецким доменным идентификатором).

Эта система совместима с POfiles, что важно, если вам нужно передать перевод на аутсорсинг кому-то, использующему стандартные инструменты торговли. Но вы можете так же легко вывести запрос непосредственно в формат TMX, исключив дубликаты (в некоторых случаях это может действительно сократить ваш стоимость перевода-несколько услуг завышают цену за ввод в "странных" форматах, таких как Excel, и либо завышают цену за "дедупинг", либо будут взимать плату за каждый дубликат, как если бы это был оригинал).
<?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>