2

私の質問は非常に単純です。私は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パーツを削除すると、本番環境で行っていないリンクを1つか2つ忘れてしまう可能性があります。

編集:私が主に探しているのは、gettextの解析部分です。考えられるURLを見逃す必要はないので、別の解決策がある場合は、(私が探しているものに基づいて)パーサーが必要になります。

EDIT2:別の難易度が追加されました。システムが基本言語でURLを解析できるように、翻訳でURLを見つけて、それを「基本」翻訳に戻す必要があります。

4

1 に答える 1

4

実際、私が考えることができる最も簡単な方法は、msgunfmtユーティリティを呼び出して、翻訳に使用される .mo ファイルをデコードすることです。

平文データベースを取得したら、それを他の種類のデータベースに保存すると、逆検索を実行できるようになります。

しかし、おそらくもっと良いのは、変換された URL をキーとして格納し、ベースを値として格納する追加のドメイン (「ReverseUrlsIT」) を作成することです (マッピングが完全に双方向である場合、つまり!)。

その時点dgettextで、翻訳された文字列の言語を知っていれば、翻訳された文字列からベース文字列を復元するために使用できます。

アップデート

これは gettext を使用する主なポイントであり、それを支援できる別のパーサー/ライブラリ/ツールを見つけることができれば、いつでも削除します

関数のファミリgettext、結局のところ、printf複数形や形容詞/名詞の反転を処理するための (おそらく)パーサーを備えたキーストア データベース システムにすぎませんイタリア語でヴァイオリン)。

データベースの複雑さ (および負荷) を追加することを犠牲にして、便利な永続レイヤーを活用してキーストアを構築できます (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);
}

これにより、簡単に をもう 1 つ追加しlanguageDomainたり、「英語でまだドイツ語に翻訳されていない用語は?」などのクエリを実行したりすることもできます。(つまり、英語のドメイン ID を持つテーブルのサブセットとドイツ語のドメイン ID を持つサブセットを使用LEFT JOINする場合は、NULL 値を持ちます)。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>
于 2012-08-26T22:24:48.303 に答える