2012-09-10 88 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

既不容易也不難。 –