2009-09-22 114 views
4

我在Session [“lang”]中有我的目标语言,它是“en”或“it”。我已经加入这个了的Site.Master:asp.net MVC:本地化

<script runat="server"> 
    void Page_Load(object sender, EventArgs e) { 
    string lang = Session["lang"].ToString(); 
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang); 
    System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang); 
    } 
</script> 

那么我想引用这样的资源字符串:

<asp:Label ID="Label1" runat="server" Text="<%$ Resources:Global, test %>"></asp:Label> 

我有两个文件在App_GlobalResources文件,命名为Global.resx和Global.en.resx。

的问题是,无论是什么LANG变量,我总是从主Global.resx得到的结果,我从来没有从Global.en.resx

拿到英文版

我这样做完全错误?

我试着在Global.asax.cs中的Application_PreRequestHandlerExecute方法中放置System.Threading ...部分,但结果是一样的。

感谢

PS:我问一个途径,以一种简单的方式这项工作。如果我要使用复杂的方式,我会与此:http://helios.ca/2009/05/27/aspnet-mvc-and-localization/

回答

4

我在我的asp.net mvc应用程序中有相同的困境(如何实现本地化)。

我按照发布的指示here,它就像一个魅力。

所以我创建了一个名为Localization的文件夹,然后为每个我想翻译的语言创建Resources resx文件。请记住,resx文件名有一个约定。即

Resources.resx是所有内容的默认回退。

Resources.en-GB.resx是英语GB

Resources.en-US.resx是美国英语

只要确保你跟随贴中的说明链接嵌入,并在所有地方可用的资源,您的应用程序(视图,控制器等)

编辑:

我想补充一点,我OMM因为我想从我的应用程序手动设置本地,所以从web.config中提出这一行。

<globalization uiCulture="auto" culture="auto"/> 

相反,我已经创建了下面的类:

public class SmartController : Controller 
{ 
    public SmartController() 
    { 
     System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); 
     System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
    } 
} 

的所有控制器从该类继承。

由于这是区域的行政设置,我必须从我的应用程序设置来设置它。你可以从Cookies中读取它并设置它,否则。这是迄今为止我遇到的最简单的本地化解决方案。

一旦实施,你可以参考一下您的代码下面简单的线条,不需要额外的代码添加任何字符串。

<%= Resources.Strings.TranslatedTerm %> 
+0

没有帮助任何一个链接,抱歉:所有这说的是,“如果你需要设置文化根据用户的偏好设置或URL参数,最好的办法是编写一个自定义HTTP模块或操作过滤器“。 也许那么有没有办法这样做? – Palantir 2009-09-22 12:51:14

+0

当然有一种方法来设置文化..如果它是您的网站的用户偏好,然后你将它存储在一个cookie中,你创建一个控制器,当实例化(构造函数)你读取cookie并设置CultureUI/Culture。然后,所有的控制器都应该从该控制器中无处不在。 – Konstantinos 2009-09-22 12:55:02

+0

当你读到您的语言环境,并要设置它,你那样做的时候: System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(“EN-US”); System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(“en-US”); – Konstantinos 2009-09-22 12:55:59

3

我敢打赌,这是一个重复。
无论如何 - 所有你需要的是here(假设你正在使用webforms viewengine(可能与其他人一起工作,没有调查过))。

哦...在这里不用我的“摘要”:

助手只是一个部分。您还需要使用默认视图引擎进行一些修改。在createview/createpartialview上,它应该返回一个localizationwebformview,它向viewdata添加一个路径关键字,这个关键字被htmlhelper用来查找resourceexpressionsfields并将它们传递给检索期望值的本地化类。

一点奖金=>

这可能是方便的,如果你不想重新创建资源文件夹视图子
(如果你修改viewengine.view/partialviewlocationformats):

private static string ReformatVirtualPath(string virtualPath) 
     { 
      //This allows NOT to duplicate App_localResources directory 
      // ~/Views/Shared/Partial/Some/BulltihS/_View.ascx 
      // turns into => 
      // ~/Views/Shared/_View.ascx 
      var start = @"(~(/?\w*/?){2})"; 
      var end = @"(\w*.as(c|p)x)"; 

      start = Regex.Match(virtualPath, start).Value; 
      end = Regex.Match(virtualPath, end).Value; 

      return start + end; 
     } 

用法:

internal static ResourceExpressionFields GetResourceFields 
      (string expression, string virtualPath) 
     { 
      virtualPath = ReformatVirtualPath(virtualPath); 

      var context = new ExpressionBuilderContext(virtualPath); 
      var builder = new ResourceExpressionBuilder(); 
      return (ResourceExpressionFields) 
        builder.ParseExpression(expression, typeof(string), context); 
     } 

编辑:
但它可能是股份公司建议避免App_GlobalResources和App_LocalResources为K. Scott Allen建议(勾选Kon​​stantinos答案)。

+0

如果您在网站上包含了该信息的摘要,我会对此表示赞成。 – tvanfosson 2009-09-22 12:40:59

+0

试过,它已经连接到任何地方,但它并没有讲述整个故事。它只是提供助手从资源文件中解脱出来。我的设置中存在一个错误,因此这种方法无论如何不会起作用(请查看前两段,无论如何调用都应该起作用,然后本文将讨论远离该语法以使MVC更具风格)。 – Palantir 2009-09-22 12:45:06

+0

这是源代码,压缩您应该调查=> http://www.eworldui.net/files/LocalizationHelpers.zip – 2009-09-22 13:05:33