実際、私が考えることができる最も簡単な方法は、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>