2012-09-10 158 views
-3

我想弄清楚如何处理使用XML和PHP的多语言?我希望能够默认使用英语,但如果用户选择了一种语言,可以说德语,我想将语言改为此。这部分我可以弄清楚,但如果某个语言字符串没有被翻译成德语,我希望能够选择该字符串的英文版本。我曾与普通PHP和MySQL这样做是这样的:Foreach WHERE子句?

$language = "de"; 
$sql = "SELECT * FROM ".$prefix."_countries WHERE con_id=$language"; 
$result = mysql_query($sql) ; 
$row = mysql_fetch_assoc($result); 

$userlang = $row['lang']; 

$languagestring = array(); 
$res1 = mysql_query("SELECT * FROM ".$prefix."_language WHERE lang = 'en'"); 
while($row1 = mysql_fetch_assoc($res1)){ 

    $langid = $row1['id']; 

    $res = mysql_query("SELECT * FROM ".$prefix."_language WHERE fk_id = $langid AND lang = '$userlang'"); 
    $row = mysql_fetch_assoc($res); 

    if(!$row){ 
     $languagestring[] = $row1['text']; 
    } else { 
     $str = $row['text']; 
     $languagestring[] = $str; 
    } 

} 

现在我建立我的XML的方式为DB这样相同:

<data> 
    <record id="1"> 
    <fk_id>0</fk_id> 
    <lang>en</lang> 
    <text>Network Error</text> 
    </record> 
    <record id="2"> 
    <fk_id>0</fk_id> 
    <lang>en</lang> 
    <text>There is a problem with the network!</text> 
    </record> 
    <record id="3"> 
    <fk_id>0</fk_id> 
    <lang>en</lang> 
    <text>OK</text> 
    </record> 
    <record id="4"> 
    <fk_id>1</fk_id> 
    <lang>de</lang> 
    <text>Das netvaerk sind corrupt!</text> 
    </record> 

' 我怎么能做到我做什么与MySQL与XML?

任何帮助表示赞赏:-)

+0

您应该学习如何制作SQL JOIN。您的所有查询都可以使用单个查询(不重复)完成。 –

+0

请不要使用'mysql_ *'函数来编写新的代码。他们不再维护,社区已经开始[弃用程序](http://goo.gl/KJveJ)。查看[*红色框*](http://goo.gl/GPmFd)?相反,您应该了解[准备好的语句](http://goo.gl/vn8zQ)并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。如果你不能决定哪些,[这篇文章](http://goo.gl/3gqF9)会帮助你。如果你选择PDO,[这里是很好的教程](http://goo.gl/vFWnC)。 –

+0

好吧,实际上我想在这种情况下绕过任何数据库解决方案,只使用XML。如果我使用2个xml文档,每个语言一个文档,上面的例子更容易,我还在游荡? –

回答

0

有标准做这种事情,没有必要XML! 翻译最常见的方式是使用gettext,这在开源世界非常流行。此外,gettext中使用的MO文件是编译文件,这意味着它们比解析XML更快。

采取http://php.net/manual/en/function.gettext.php

看看要创建PO和MO文件,我建议使用PoEditVirtaal

0

在XQuery中,你会说这样的事情(未测试):

declare variable $userlang as xs:language external; 

for $msg in /data/record[lang='en'] 
return (/data/record[lang=$userlang 
    and fk_id=$msg/@id], $msg)[1] 

英文:变量$userlang外部设置为语言代码。对于每个包含<lang>en</lang>record,如果存在用户的语言,则返回相应的记录,否则返回英文记录。 (更具体地说:对于每个这样的记录,用用户的语言编写由相应的记录组成的序列,然后是英文记录,然后取该序列中的第一项。)

在XSLT 2.0 ,你可以做一些非常相似的事情(我在示例中使用了XQuery,部分原因是它更简洁,部分原因是它的逻辑更像是当前代码的结构)。

在你有机会获得XPath的其他语言,你可以做到大致类似的事情,虽然你可能有一些应用程序逻辑来代替return表达,如果你只得到了XPath 1.0。

+0

如果语言位于不同的xml文件language_en.xml,language_de.xml中,会更容易吗? –

+0

既不容易也不难。 –