2012-04-10 59 views
6

我正在構建一個使用MVC模式作爲開始位置的多語言Web應用程序。該應用程序有許多表單,用戶將與之交互,並且這些表單中的許多表單將具有從數據庫表(例如「省」)進行查找的字段。語言翻譯適合MVC模式在哪裏?

如果我需要在這些列表顯示在用戶的屏幕上的語言選項,我可以看到一對夫婦的方式做到這一點:

  1. 在模型中。當查詢模型時,我可以提供我希望返回結果的語言。這將允許在模型中顯示數據時無需更改即可使用翻譯。但是,這也意味着我的示例中的Province模型(加上所有其他應用程序模型)現在需要知道如何進行語言翻譯。
  2. 在控制器中。我可以像往常一樣在控制器操作中查詢模型,然後創建一個'Translator'對象,在完成操作之前可以將結果傳遞給對象。這意味着每個控制器操作可能會重複相同的翻譯代碼,違反了DRY原則。
  3. 在視圖中。由於通常預期應用程序的表示會存在於視圖中,並且用戶的語言不會影響系統的業務邏輯,因此可能會說語言翻譯屬於此處。特別是考慮到一個頁面還可能包含需要翻譯的靜態內容。這樣做的缺點是它會使觀點複雜化,特別是對於必須解決新翻譯代碼的前端設計人員。

對於Web應用程序的MCV模式中的文本翻譯屬於哪裏,是否有一個公認的最佳做法?如果我要通過AJAX調用而不是在頁面加載時加載選擇列表選項,這是否會改變?

感謝您的幫助!

回答

1

如果您需要翻譯部分UI,那麼我會創建一個幫助器方法,該方法將讀取資源文件併爲該資源輸出翻譯後的字符串。例如。

@Translate("NewUserHeading") 

所以對於用戶界面來說,在用戶界面中處理這個是有意義的。

如果您打算翻譯的數據可能會在Flash客戶端或移動應用程序中顯示,那麼它應該由服務器翻譯,並且與您的MVC應用程序無關。

0

老實說,任何與數據庫的交互應該在模型中處理,而這是模型中處理的唯一事情。解釋/組織這些數據應該在控制器中處理。我想更多的信息將需要這個翻譯來自何處,以及如何才能真正給出一個堅實的答案。

+0

我想這會打開fat models/skinny controller和skinny models/fat controller之間的爭論。我是對的,你會在控制器中擁有你的業務邏輯? – 2012-04-10 19:56:06

+1

@WallyLawless從來沒有人聽到有人認爲胖控制器。控制器是一個從視圖轉換到模型和模型以查看的薄層。控制器通常不會重複使用,它們只是膠水,不會用膠水填充您的代碼。 – 2012-06-14 19:25:59

5

處理它的最佳位置是在視圖中。您的問題僅引用數據庫中的動態數據,但您也必須處理視圖中的靜態信息。最好同時處理這兩個人。 MVC中處理多種語言的常見做法是資源字符串,每種語言的單獨視圖或兩者的組合。來自數據庫資源字符串的信息可以很好地工作。您將在數據庫中存儲一個令牌,以便列表中的選項(該令牌可以是英文翻譯),並且該視圖將從指定國家/地區的資源獲取適當的翻譯。這種方法在this blog post中有很好的詳細解釋。

0

視圖將只顯示資源文件中的字符串。爲語言環境包含正確的資源文件應該這樣做。在Web應用程序中,它通常是定義每個語言環境的UI字符串的單一語言JS文件,例如strings.en-us.js,strings.pt-br.js等。

一些字符串動態地來自服務器,控制器不需要知道它,模型應該只抓取本地化的字符串,並返回作爲數據請求的一部分。

所以它要麼在視圖中(如果它是靜態的)或在模型中(如果它是動態的)。控制器應該只是將視圖中的數據轉換爲模型和模型以及視圖