2011-05-10 59 views
5

根據這種方法,默認語言是已經在第一個表中翻譯了。如果用戶不需要翻譯,他不會與他們鬥爭。只需連接主表,這一切......用於翻譯的MySQL結構

產品表(InnoDB的):

Obj_id(PK)    name     desc 
---------  -------------------  ------------------ 
    1   Million Dollar Baby Short description is... 
    2   Music Album   Another explanation... 

轉換表(InnoDB的)

trans_id (PK) Obj_id (FK) lang  field    trans 
-------------- ----------- ------ -------- --------------------- 
     22    1   TR  name  Milyonluk Bebek 
     23    1   BA  name  Djevojka od milijun... 
     24    1   TR  desc  Kisa açiklama burada 
     25    1   BA  desc  Kratki opis je ovdje 
     26    2   BA  name  Glazba albuma 

但是,當管理員要更改默認語言,出現問題。我有兩個選擇來解決這個問題:

  1. 管理員有權在項目一開始就決定default_lang,如果他仍然想在將來改變default_lang,該程序會說:Go to hell

  2. 與第一個解決方案一樣,admin必須首先決定default_lang,但系統將能夠將新的default_lang數據從轉換表傳輸到主表(我不這麼做)。

我覺得我的解決方案不夠好。

對於DEFAULT_LANG問題,如果有或者沒有改變結構(如果可能的話,不要改變結構 - 我喜歡它),你有更好的想法嗎?

+6

+ 1將'Go to hell'消息發給Admin。 – 2011-05-10 12:02:09

回答

0

你看過gettext嗎?

http://www.gnu.org/software/gettext/

+0

是的,但我不喜歡它。它對我來說有幾個問題。謝謝你的建議.. – dino 2011-05-10 12:02:33

+1

你有哪些問題? – programmersbook 2011-05-10 12:47:23

+0

@progrsm ...管理員想要在將來更改默認語言時出現問題..所以我必須將NEW DEFAULT_LANG從TRANSLATION表傳輸到PRODUCT(PRIMARY)TABLE。 – dino 2011-05-10 12:49:21

4

我不知道是否有每種語言的表會更好。這樣你就可以切換正在使用的表格。

TRANSLATIONS_TR 
TRANSLATIONS_EN 
TRANSLATIONS_FR 
TRANSLATIONS_BR 

然後在您的用戶顯示例程中,您可以決定顯示翻譯文本時要查詢的表格。

0

gettext解決了與多語言數據庫不同的問題:gettext用於UI,而數據庫用於內容。

你會使用gettext或同等的燈具,如錯誤消息,按鈕標籤或頁面標題,其中有一小部分不經常更改的項目列表。

多語言數據庫適用於大量的內容,可能會或可能不會頻繁更改,例如成百上千的書籍和電影的標題或投標說明。

+0

gettext的問題對我來說(我以前用它來進行Wordpress翻譯)是同義詞。例如,我在我的軟件中使用'Class'兩個不同的地方(其中一個用於'分類',另一個用於'學校課程')。這適用於英語,但是當我想翻譯它時,這是其他語言的問題。也許gettext解決了這個問題。 – dino 2011-05-11 09:59:45

1

我的做法,我認爲這將是(我在建設這個我自己的過程):

也許(1)產品具有(N)名稱(取決於語言,假設你只有一列描述語言,如「上課」,「恩」)

[ Product ]—(1)—————(N)-[ProductName] 
| id |    | name  | 
         | language | 

也許是更好的產品語言在N:M關係:

[ Product ]-(N)—————————(M)-[Language] 
| id |  |  |iso_code| 
      (translation) | name | 


[ Product ]<————[ProdTranslation]———>[language] 
| id  |  | name   | |iso_code| 
|default name?|       | name |--- (name of language: "English") 

另一種選擇可能是考慮機生產線的每個翻譯ct是「產品類型」(一個子類)。邏輯模型如下:

[ Product ] 
| id  |-(1)————(1)-[ EnglishProduct ] 
|default name?|   | name (in eng.) | 
|    | 
|    |-(1)——(1)-[FrenchProduct] 
|    |   | name(in fr.)| 

當在關係數據庫中實現這一點,那麼你既可以一)有3個表(在這個例子中,多用更多的語言)或b)把它們都放在一個表。這取決於你需要多少語言都有,尺寸的名稱/描述,性能等

[ Product ] 
| id  | 
| name_en | 
| name_fr | 
| name_de | 

使用查詢數據庫會知道的語言的代碼,然後從右邊欄查詢名稱。