2009-11-05 32 views
0

主要問題:ASP.net MVC本地化|爲什麼這是困難的方式?

爲什麼要使用自定義的本地化幫手,如果有內置的已經在做同樣的事情?

說來話長

目前我一直在閱讀了許多選項來本地化asp.net的MVC的網站。例如,2008年10月22日,大多數帖子都是舊的。

我認爲最有聯繫的選項之一是: Matt Hawley on eWorld。此選項創建一個可用於本地和全球資源的可用於

Html.Resource("ResourceName") 
Html.Resource("GlobalResourceFileNameWithoutExtension, ResourceName") 

的Html幫助程序。其他使用

<asp:label meta:resourcekey="lblNameResource1" runat="server"/> 

代替

<label></label> 

一些問題的同時,努力,我發現在使用中< .asp的方法我有:標籤>我的部分頁面收到一些非常錯誤,如我的部分網頁渲染:

Validation of viewstate MAC failed. If this application is hosted by a Web Farm or 
cluster, ensure that <machineKey> configuration specifies the same validationKey and 
validation algorithm. AutoGenerate cannot be used in a cluster. 

最後,我想知道,爲什麼這一切的麻煩,如果有喜歡的標準方法:

<%= GetLocalResourceObject("lblNameResourceKey") %> 

使用內置函數的缺點是什麼?當然,我不喜歡使用字符串鍵,但所有方法都使用它們,所以我認爲這是不可避免的。我能想到的唯一缺點是每個字符串都需要它的關鍵字,而使用asp:標籤有一些自動功能內建(如lblName.Text/lblName.ToolTip等)。但是爲什麼這個馬特霍利傳言呢?他使用與內置的GetLocalResourceObject完全相同的方法,只是用他自己的幫助器方法以不同的方式命名它?

或者我錯過了什麼?

回答

3

我不同意「所有方法都使用字符串」。

我們這樣做:

<%= ApplicationName.Properties.Resources.lblNameResourceKey %> 

很明顯,你可以參考的命名空間,這樣你就不必完全限定。

+0

確實,以前見過它。但最終我的主要問題保持不變。爲什麼所有這些博客帖子,如果它不真正添加到原來的內置的東西? – bastijn 2009-11-05 19:47:13

+0

你的問題是爲什麼人們在他們的博客上提出的不是理想的解決方案?如果他們不這樣做,它不會成爲博客! :) – 2009-11-05 21:12:08

+0

我的問題是如果他們的解決方案和內置函數之間有差異。他們爲什麼打擾寫它。我錯過了什麼,或者僅僅是爲了代碼方便(好方法名稱?)。或者它增加了額外的功能。 – bastijn 2009-11-05 22:30:14

3

如果你引用馬特的帖子(更準確地說the post prior對更流行的鏈接!)你會看到他添加這些HTML助手的原因是他想設計一些委託選擇本地資源位置的責任到ViewEngine(即,如果您查看代碼,您會看到他的子類ViewEngine將視圖位置放入ViewData中)。這有助於視圖存儲在數據庫中的情況,或類似的非標準或甚至不從派生類派生的情況。

如果你永遠只能將使用WebFormViewEngine它可能不值得過失去的睡眠,並像下面應該工作正常(如你在你的問題提)

<%= GetLocalResourceObject("lblNameResourceKey") %> 

第二種方法你給使用一個serverside Label控件。我猜你得到錯誤的原因是,對ViewState的依賴正在偷偷溜進某處,並且由於MVC不會發出ViewState,頁面會出錯。

關於使用ASP.NET GetLocalResourceObject的缺點和它的全球等價的: -

缺點

  • 地段每個資源的關鍵,沒有強類型/錯誤高亮顯示的字符串。

上升空間

  • 很大的靈活性,可以部署RESX文件,而整個應用程序重新編譯。

    缺點

    • 更改字符串將強制應用程序重新編譯和 - :

    一個需要與Visual Studio的克雷格在他的回答中提到生成強類型的資源進行對比重新部署應用程序DLL。

上升空間

  • 強類型的意見,沒有神奇的字符串更乾淨的代碼由於沒有ASP.NET本地化黑魔法。

人們總是權衡與這些事情有關,因此最好是選擇什麼是最適合你的情況(例如,您的部署策略是什麼,改變你的字符串資源預計量)

0

只是爲了人民與我提問時一樣,我會放下我目前選擇用作方法的東西。

由於我是一個非常糟糕的typer,總是misstype,並不記得我def我的變量的名稱。需要強大的打字資源。所以我做的是創造全球資源。但由於我不喜歡有一個大文件(在許多例子中通常命名爲Strings),我選擇了製作一些全局資源文件。在我來說,我有三個現在:

  • ActionLinks:包含所有動作鏈路串
  • 字符串:包含網站
  • 表格上的所有主要的TextBlocks:包含所有表單標籤等的形式使用

現在,由於我開發的動態填充網站沒有那麼多的靜態文本,我通常在我的字符串中有一個變量「ViewPageNameMainText」和一些諸如「ControllerViewPageName [IDHERE]之類的東西。resx,一些像我的Forms.resx中的「用戶名」「密碼」和一些變量像「後退」「前進」等變量在我的ActionLinks.resx。

我做了一個簡單的輔助來代替「\ r \ n」「使用\ r \ n」和一些更多的(雖然我後來發現

等做資源文件的工作)。我通過將它們作爲參數傳入字符串來加載文本塊中的鏈接,所以我得到如下所示的內容。

Html.HtmlStringEncode(string.Format(Resources.Strings.HomeAboutMainText, 
    new object[]{ Html.ActionLink(Resources.ActionLinks.back, "Home", "Index"), 
    Html.ActionLink(Resources.ActionLinks.create, "Vacancies", "Create")})) 

隨着Strings.HomeAboutMainText類似的信息({0} {1}等通過actionlinks在這種情況下被替換):

< .h2> Lorem存有悲< ./h2> sit amet {1}, consectetur adipiscing elit。 < .p> Aliquam nec libero neque,eget tristique sapien。 Praesent lacinia ultricies diam,eget vehicula leo malesuada a。 Duis porttitor tincidunt malesuada。 Phasellus malesuada eros eu justo dapibus quis molestie ante posuere。 < ./p> 懸念調味品,sapien編號 調味品,自由人 rutrum sapien,在porttitor tellus metus eu felis。 Etiam vitae mollis nisi。 Aliquam rutrum nibh vel orci varius feugiat。在sem arcu的意見, 簡歷adipiscing愛慾。簡單地說, Donec sit amet mauris sed leo pellentesque feugiat。 Nulla facilisi。 Cras viverra pulvinar odio nec venenatis。間歇期間。 Aliquam consequat tristique mattis。 {0}

我已經給出其中被設定在創建對象的數據庫中的「語言」列中的內容dymanic(主要newsposts,列和空位)。當人們將頁面語言更改爲他們的語言首選項時。我只是用language = pref.language獲得所有職位/職位空缺等,並在需要的頁面上顯示他們。

雖然我還不是很開心現在已經夠了。我仍然在考慮如何處理圖像,但因爲我沒有任何需要更改atm的東西。這是一個現在不需要解決的問題。

0

工作,就可以對此進行確認教程。 Create ASP.NET MVC localization。它看起來像簡單的解決方案,如果你需要表單標籤,驗證或更復雜的東西,你應該使它變暗。