-3

我想弄清楚如何使用 xml 和 php 处理多语言?我希望能够默认使用英语,但是如果用户选择了一种语言,比如说德语,我想将语言更改为该语言。这部分我可以弄清楚,但如果某个语言字符串尚未翻译成德语,我希望能够选择该字符串的英文版本。我已经用常规的 php 和 mysql 做到了这一点,如下所示:

$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,如下所示:

<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>

' 我怎样才能用 xml 完成我对 mysql 所做的事情?

任何帮助表示赞赏:-)

4

2 回答 2

0

有标准可以做这些事情,不需要 XML!对于翻译,最常见的方法是使用 gettext,这在开源世界中非常流行。

此外,gettext 中使用的 MO 文件是编译文件,这意味着它们比解析 XML 快得多。

看看http://php.net/manual/en/function.gettext.php

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

于 2012-09-11T00:05:40.210 回答
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在外部设置为语言代码。对于每个record包含<lang>en</lang>,如果存在,则返回用户语言的对应记录,否则返回英文记录。(更具体地说:对于每个这样的记录,制作一个由用户语言的相应记录组成的序列,然后是英语记录,然后取该序列中的第一项。)

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

在您可以访问 XPath 的其他语言中,您可能能够做大致类似的事情,尽管return如果您只有 XPath 1.0,您可能不得不用一些应用程序逻辑替换表达式。

于 2012-09-11T02:15:20.650 回答