2012-12-05 44 views
5

我正在将项目转换为使用卫星组件。 我创建了一个新的类库(名为“Resources”)。所有的默认资源位于根级*.resx。 然后每个文化都有一个文件夹。卫星组件,ASP.NET语言不变

“EN /” 与*.en.resx

EN-GB/ 与*.en-GB.resx

我改变了.resx文件Access Modifier “公开”,并改变这些设置。

BuildAction: EmbeddedResource 
CopyToOutputDirectory: CopyAlways 

我确定.resx设计师*.Designer.cs使用 “资源” 的命名空间。

我将类库添加到ASP.NET MVC应用程序,并在global.asax.cs我有根据需要设置的文化。

System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB"); 
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB"); 

我尝试添加了al.exeResgen.exe命令,在资源类库生成后事件。

“C:\ Program Files文件\微软的SDK \的Windows \ V7.1 \ BIN \ Resgen.exe” EN-GB/MyResourceFile.en-GB.resx“C:\ Program Files文件\微软的SDK \ Windows \ v7.1 \ Bin \ al.exe“/ t:lib /eed:en-GB/MyResourceFile.en-GB.resources/culture:en-gb /out:Resources.resources.dll

展望MVC应用程式内为bin/每种语言文件夹下有文件夹有3个文件:

MyResources.en-GB.Designer.cs,MyResources.en-GB.resx, Resources.resources.dll

根级别只有Resources.dllResources.resources.dll但默认语言工作正常。第二个*.resources.dll是由于生成后事件。

当我更改CurrentUICulture时,它不会更改UI语言。在将资源从App_GlobalResources/移出到外部组件之前,它可以正常工作(Razor示例)。

@Resources.MyResources.StringIdentifier 

使用.NET Reflector查看资源.dlls这些是不同之处。

编辑:

设置的CurrentCulture和的UICulture在global.asax.cs后,我测试了手动检索ResourceManager其实际工作和预期语言检索到的字符串。

  System.Resources.ResourceManager gStrings = 
       new System.Resources.ResourceManager("Resources.MyResources", System.Reflection.Assembly.Load("Resources")); // Resources=Project Name 
      string test = gStrings.GetString("TestString"); // WORKS IN GLOBAL.ASAX.CS!!! 

我在MVC控制器中尝试了相同的测试,但它不起作用。所以ResourceManager可以被检索的唯一地方是Global.asax.cs。

奇怪的是,在剃刀中的UI级别进行相同的测试只会返回默认文化文本! cultureInfo是正确的,但ResourceManager只返回ASP.NET MVC Razor UI中的默认语言。 (这是严格的测试)

@{ 
     System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture; 
     System.Resources.ResourceManager gStrings = 
      new System.Resources.ResourceManager("Resources.MyResource", System.Reflection.Assembly.Load("Resources")); 
     string s = gStrings.GetString("Test"); // DOESN'T WORK IN UI 
    } 

TLDR版本:

从资源(的.resx)从App_GlobalResources文件转换为附属程序集。

问题在眼前。

我可以使用global.asax中的CurrentUICulture语言为卫星程序集手动调用ResourceManager,它按预期方式工作,但是相同的测试从​​UI端失败并在MVC控制器中失败。

默认语言工作正常,所以为什么不切换语言?

回答

1

如果最近已经建立了一个项目,其中的内部化工作或多或少像您所描述的那样正确工作。

using Perpetuality.Data; 
using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 
using System.Security.Principal; 
using System.Threading; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 


namespace Perpetuality.Controllers 
{ 
    public partial class BaseController : Controller 
    { 
     private CultureInfo GetCultureInfo(AuthorizationContext filterContext) 
     { 
      switch ((string)filterContext.RouteData.Values["language"]) 
      { 
       case "nl": 
        return CultureInfo.CreateSpecificCulture("nl-NL"); 
       case "en": 
        return CultureInfo.CreateSpecificCulture("en-US"); 
       case "pt": 
        return CultureInfo.CreateSpecificCulture("pt-PT"); 
       case "de": 
        return CultureInfo.CreateSpecificCulture("de-DE"); 
       case "es": 
        return CultureInfo.CreateSpecificCulture("es-ES"); 
       case "fr": 
        return CultureInfo.CreateSpecificCulture("fr-FR"); 
       case "it": 
        return CultureInfo.CreateSpecificCulture("it-IT"); 
       case "jp": 
        return CultureInfo.CreateSpecificCulture("ja-JP"); 
       default: 
        return CultureInfo.CreateSpecificCulture("en-US"); 
      } 
     } 

     protected override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      Thread.CurrentThread.CurrentCulture = GetCultureInfo(filterContext); 
      Thread.CurrentThread.CurrentUICulture = GetCultureInfo(filterContext); 

      base.OnAuthorization(filterContext); 
     } 
    } 
} 

在我的项目的RESX文件是不是在你指定的不同:

BuildAction: EmbeddedResource 
CopyToOutputDirectory: DoNotCopy 

https://github.com/Jacco/Perpetuality

我切换每个HTTP请求的语言OnAuthorize控制器我作为基地使用

在我的看法我访问这样的字符串:

@Resources.Home.Index.FacebookButtonCaption 

我没有设置任何帖子或预编译。

在我的项目中,语言始终在url上。如果最初没有选择合适的语言,用户可以切换语言。

+0

+1分享。我使用cookies作为语言,因此文化只能设置为登录时。在我有机会详细调查您的应用程序之前(以及它是否实际适用于卫星资源)还需要一段时间,谢谢发布。它们有点棘手,在多个项目中使用时需要非常繁琐的细节。 :) – lko

+0

我认为你需要为每一个请求进入文化设置。从饼干中获取它没有问题。我的资源也在一个单独的图书馆(我认为这是你的意思是卫星?) – Jacco