2009-11-05 26 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。它看起来像简单的解决方案,如果你需要表单标签,验证或更复杂的东西,你应该使它变暗。