所以我要让这个网站必须有多种语言才能使用它。我已经四处寻找并得出结论,我应该使用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.")";
}
答案 0 :(得分:0)
如果您在文件中对语言进行编码,则可以 - 但不能 - 将多种语言放在同一文件中。 XML确实支持两者。只是说,因为你选择了XML,这将是一个好处。
对于程序内部,您只需要一个
的映射page + string + language:= translation
在你的操作中,这是一种语言,你甚至可以忽略它,因此你只需要一个数组:
$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)
}
这肯定会留下很多优化空间,例如:你可以将每个文件/页面的翻译保留在内存中,这样你只需要加载一次。或者您可以使用xpath()
来获取值。