0

そのため、複数の言語で作業する必要があるこのWebサイトを作成しています。私はざっと見て、言語ごとに1つずつXMLファイルを使用する必要があるという結論に達しました。魔女は私には理にかなっていますが、ここに私の問題があります:

次のようなXMLファイルを作成しました。

<?xml version="1.0" encoding="utf-8"?>
<translations>
  <frontpage>
    <!--Main translation-->
    <translation string="email" value="E-mail" />
    <translation string="password" value="Password" />
    <translation string="createacc" value="Create account" />
    <translation string="login" value="Login" />
    <!--Errors-->
    <translation string="erroremail1" value="E-mail not valid" />
    <translation string="erroremail2" value="There's no account with that e-mail" />
    <translation string="errorpass" value="Incorrect password" />
  </frontpage>
</translations>

しかし、PHPライブラリからのXMLReaderとDOMDocumentがどのように機能するかを理解できません。これは私がこれまでに持っているコードです:

public function Translate($page,$string,$variables = array()) {
    $reader = new XMLReader();
    $reader->open(www::findFile("lang/".$this->short.".xml"));
    //Here i want to find the <translation> with the attribute string that is === $string
    //With the parent of $page (fx. Translate("frontpage","erroremail1"))
    $reader->close();

    $find = array();
    for ($x = 0; count($find) != count($variables); $x++) $find[] = "{".$x."}";
    return (isset($value)) ? str_replace($find,$variables,$value) : "NOT TRANSLATED (".$string.")";
}

解決:

public function Translate($page,$string,$variables = array()) {
    //Read from XML 
    $reader = simplexml_load_file(www::findFile("lang/".$this->short.".xml"));
    foreach ($reader->$page->translation as $t) if ($t['string'] == $string) { $value = $t['value']; break; }
    $find = array();
    for ($x = 0; count($find) != count($variables); $x++) $find[] = "{".$x."}";
    return (isset($value)) ? str_replace($find,$variables,$value) : "NOT TRANSLATED (".$string.")";
}
4

1 に答える 1

0

ファイル内で言語もエンコードする場合は、同じファイル内に複数の言語を入れることができますが、そうすべきではありません。XML は両方をサポートします。XML を選択したということは、1 つのメリットになるということです。

プログラム内では、現在のマッピングのみが必要です

page + string + language:= translation

あなたの操作では、これは1つの言語であり、無視することもできるため、配列を取ることができます:

$translations[$string]

各言語とページごと。あとは、ファイルを配列に変換するだけです。

$getTranslations = function($file, $page) {
   $translations = [];
   foreach(simplexml_load_file($file)->$page->translation as $translation)
   {
       $translations[$translation['string']] = $translation['value'];
   }
   return $translations;        
}

$translations = $getTranslations($file, $page); 

if (isset($translations[$string]) {
   // found
} else {
   // not found (e.g. fallback to $string)
}

これにより、最適化の余地が大きく残されます。たとえば、ファイル/ページごとの翻訳をメモリに保持できるため、翻訳を 1 回ロードするだけで済みます。xpath()または、代わりに使用して値を取得することもできます。

于 2013-03-06T09:30:12.217 に答える