2010-08-02 74 views
1

我有一個網站,應該在不同的語言上翻譯相同的內容。所以它應該有相同字符串的不同翻譯的數據庫條目。 它不僅僅是一個小型網站,所以有很多不同的複雜數據結構。設計數據庫體系結構:與多種不同語言一起使用的數據庫

我有一個想法如何實現這一點。但我不太喜歡它。

我想介紹一個額外的翻譯表,其中計劃存儲不同語言的字符串字段。

例如,對於表項目,即包含三個字符串字段(姓名,shortDescr,fullDescr)我會用轉換表,在未來的方式:

alt text http://a.imageshack.us/img576/7948/2deldbtop.png

我會改變名稱,shortDescr,fullDescr領域從字符串到整數(包含鏈接(ID)到translationTxtID)。不同的translationTxtID和lang字段將爲每個字符串標記和語言定義唯一的字符串。 因此,這種解決方案將工作,但我正在尋找更優雅的解決方案。你能建議我解決這個問題嗎?

+0

? – JNK 2010-08-02 19:40:07

+0

你也可以看看使用XML,就像這個用戶:http://stackoverflow.com/questions/3374494/localization-strategy – 2010-08-02 19:45:48

回答

4

你可以建議我解決這個問題嗎?

是的。

請勿使用整數鍵。確實,不要自己發明這個。只需使用gettext。您已經擁有幾乎所有的操作系​​統。它是快速且經過驗證的軟件,無需編寫。

做什麼標準gettext模塊爲i18n做。 (見http://en.wikipedia.org/wiki/GNU_gettext

  1. 使用文本鍵。

  2. 選擇語言環境(即「C」語言環境或您編寫軟件的語言環境)。

  3. 將所有消息作爲缺省語言環境中的字符串放入「Project」表中。

  4. 將所有翻譯放入帶有原始字符串和I18N語言環境的「翻譯」表中以將其翻譯爲。是的,翻譯表是由一個很長的字符串鍵入的。這在實踐中效果很好,因爲(1)你沒有那麼多的字符串,(2)你不會經常查看它們,(3)你應該使用gettext,而不是自己滾動。

  5. 向用戶展示任何數據時,嘗試使用SELECT獲取翻譯。如果你找到翻譯,那很好。

    如果你沒有找到翻譯,那麼你使用的鍵是默認的字符串,這比沒有好。在某處記錄異常,並顯示原始字符串。

+0

謝謝!我認爲這是最好的解決方案! – andrii 2010-08-06 12:06:15

0

爲什麼不在表中有多個條目,每個lang有一個條目? PK可以是ID和LangID的組合。對於你上面的例子:

Project 

ID, int 
LangId, int 
Name, varchar 
shortDesc, varchar 
Fulldesc, varchar 
date, date 

然後,所有你需要在你的代碼做的是設置一個語言變量,並在查詢中給它在查詢中的一個選項(我使用SQL作爲參考這裏) :

SELECT (columns) 
FROM Project 
WHERE ID = @id 
and LangId = @langid 

您對該特定會話的所有查詢保持langid。

+1

這個問題是如果表中有其他字段不是本地化的。然後你最終重複其他數據導致維護頭痛。 – DancesWithBamboo 2010-08-02 20:35:00

+0

@DancesWithBamboo - 好點。 – JNK 2010-08-02 20:44:56

0

我對每個包含字符串的父表使用本地化表。所以如果你有一個「Project」表,你也可以有一個「Project_Locale」表。 Project_Locale與Project +具有相同的PK,增加了「Culture」字段。所有可本地化的字符串字段都在Project_Locale中,其他所有內容都在Project中。

0

我的選擇是

Project 
------- 
ProjectID (PK) 
Date 

ProjectLoc 
---------- 
ProjectID (FK) 
Lang 
Name 
ShortDesc 
FullDesc 

然後你就可以像

SELECT Project.ProjectID, Date, Name, ShortDesc, FullDesc 
FROM Project 
LEFT JOIN ProjectLoc ON Project.ProjectID = ProjectLoc.ProjectID 
WHERE ProjectLoc.Lang = %CurrentLang% 

優點運行一個簡單的查詢:優雅簡約的
缺點:表大量