2011-10-16 54 views
1

我目前正在使用PHP和MySQL構建一個多語言網站,並且想知道關於本地化的最佳方法是關於我的數據模型。每個表格都包含需要翻譯的字段(例如,name,description ....)以多種語言。使用mysql/PHP進行本地化

第一個想法是要建立一個字段爲每種語言(例如name_enname_dename_fr),使用變量(例如$entry['name_' . LANGUAGE])從PHP檢索適當的字段。雖然它可以工作,但這種方法在我看來有許多缺點:
- 您需要儘可能多地發生每個字段(因爲您可以使用en-US,en-CA,en-GB ...) )
- 如果您添加或刪除的語言,你需要改變
- 如果你有翻譯領域,他們仍然不顯得很優化的每個條目創建的數據庫結構

第二個想法是創建可用於存儲數據庫中任何表格的任何字段的翻譯的翻譯表:

 
---------------- 
translation 
---------------- 
id INT 
table_name VARCHAR 
field_name VARCHAR 
value VARCHAR 
language_id VARCHAR 

table_namefield_name將允許標識翻譯是關於哪個表和哪個字段,而language_id將指示翻譯如果是哪種語言。這個想法是創建模型,根據用戶選擇的語言,用相應的翻譯來替換可翻譯字段的值(例如name,description)。

您可以看到這種方法的缺點嗎?你有建議嗎?

謝謝。

+0

此問題已被提問。建議你通過SO進行搜索。看看http://stackoverflow.com/questions/6242478/ph​​p-translation-frontend-similar-to-rosetta/6244655#6244655這裏http://stackoverflow.com/questions/6000541/multi-language-php-application -best-practice/6000874#6000874 – PurplePilot

+0

正如你從給出的答案中可以看到的那樣,仍然有討論的空間。 – Max

回答

4

其主要缺點是您通過將元數據(如表名和字段名稱)存儲爲應用程序數據來銷燬關係模型。您的查詢會過於醜陋和無效。

另一個缺點是,您僅限於一種數據類型的可翻譯數據。你的表結構將定義

value VARCHAR(255) 

這意味着你將存儲,要求在VARCHAR(255)總是更小的現場數據。如果你想擁有它更普遍也儲存大量的文字,你需要定義它

value TEXT 

這更是雪上加霜。

流行的模型如下。對於每個實體,您都定義了不依賴於語言的字段以及與語言相關的字段,並始終創建2個表。例如:

products 
-------- 
id 
price 
status 
picture 

products_translations 
-------- 
product_id 
language_id 
name VARCHAR(100) 
description TEXT 

這是正確的關係方法。當然,它也有一個缺點,那就是你總是會連接2個表來獲取項目,並且數據的添加/更新變得更復雜一些。

+0

這是有道理的。您是否有參考文件支持您的聲明,即您的解決方案是「流行」和「適當」的方法? – Max

+1

這是一個「正確」的方法,因爲它保持了數據庫設計[鏈接](http://en.wikipedia.org/wiki/Database_normalization)中的規範化原則,並且它「流行」,因爲我已經見過並使用它並在多個教程,書籍和博客中提到。這不是「正確」的方法,因爲數據庫設計沒有對錯,對每個特定項目都有可行或不可行的方法。如果你知道只有3種語言,並且在未來3年內不會添加新語言,這不是一種「好」的方法。 –

+0

+1。你在這裏以你的客觀性贏得了我:) – Max

0

不知道這個答案將滿足你,但我兩種文本之間的辨別:

  1. 靜態
  2. 動態

靜態文本是由您自己對一般應用的文字規定,用戶對其沒有影響。東西像表單輸入標籤和介紹性文字。我爲那些使用gettext,所以如果我需要翻譯,我可以將它發送給專業翻譯人員。

動態文本是由應用程序,這似乎是你在說什麼的用戶提供的文本。就我個人而言,我也將動態文本識別爲2種不同類型。

  1. 普遍適用
  2. 特定

的一般類型的一個例子是HTML選擇元素,或一個標記的系統內的選項。它們不是特定於單個內容元素,但可以應用於多個內容元素。 特定文本的示例可以是CMS內的實際內容,如文章或網上商店中的產品說明。

對於第一個我用一種中央查找表的實際,原文爲指標,我指的是在我使用該字符串表的外鍵的哈希值。然後你在中心表中查找哈希以迴應它背後的真實文本(當然,你應該在這裏使用某種緩存)。

對於後者我用列的經典內容表對於特定於該邏輯內容單元和用於每一種語言的行的每個內容區域。

到目前爲止,它工作得很好。