2012-12-05 1 views
5

위성 어셈블리를 사용하도록 프로젝트를 변환 중입니다. 새로운 클래스 라이브러리 ("Resources")를 만들었습니다. 기본 자원은 모두 루트 레벨 *.resx입니다. 다음 각 문화권에 대한 폴더가 있습니다.위성 어셈블리, ASP.NET 언어가 변경되지 않습니다.

는 "EN은 /"*.en-GB.resx

엉 - GB *.en.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 : \ 프로그램 파일 \은 Microsoft SDKs \ 윈도우 \ 7.1 \ 빈 \ Resgen.exe" EN-GB/MyResourceFile.en-GB.resx "C : \ 프로그램 Files \ Microsoft SDK를 \ Windows \ v7.1 \ Bin \ al.exe "/ t : lib /embed:en-GB/MyResourceFile.en-GB.resources/culture : ko-gb /out:Resources.resources.dll

: MVC의 내부에서 찾고

3 개 파일을 각 언어에 대한 bin/ 폴더가있는 폴더를 애플 리케이션

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

루트 수준은 Resources.dllResources.resources.dll 가지고 있지만 기본 언어는 잘 작동합니다. 두 번째 *.resources.dll은 빌드 후 이벤트 때문입니다.

CurrentUICulture를 변경할 때 UI 언어가 변경되지 않습니다. App_GlobalResources/ 외부 자원을 외부 어셈블리로 이동하기 전에 제대로 작동했습니다 (예 : 면도날).

@Resources.MyResources.StringIdentifier 

는 이러한 차이점입니다 .NET 리플렉터를 사용하여 자원 .dlls에서 찾고있다.

Satellite Resources: (Project: Resources) 
Resources.en_GB.MyResources.en-GB.resources 
App_GlobalResources: (Project MVCApp) 
Namespace.MVCApp.App_GlobalResources.MyResources.en-GB.resources 

편집 :

global.asax.cs의 CurrentCulture 및 UICulture를 설정 한 후, 내가 수동으로 실제로 근무하고 예상 언어로 문자열을 검색된 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 면도기 UI에서 기본 언어 만 반환합니다.

위성 어셈블리에 App_GlobalResources에서 자원 (의 .resx)에서 변환 :

@{ 
     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 버전 (이 테스트를 위해 엄격하게).

손에 문제가 있습니다.

나는 수동으로 global.asax의 CurrentUICulture 언어를 사용하여 위성 어셈블리를위한 ResourceManager에 전화를 할 수 있으며 예상대로, 그러나 동일한 테스트가 UI 측면에서 실패하고 MVC 컨트롤러에 실패 작동합니다.

기본 언어가 정상적으로 작동하므로 UI가 언어를 전환하지 않는 이유는 무엇입니까?

답변

1

당신이 묘사 한 것처럼 내부화가 올바르게 작동하는 프로젝트를 최근에 설정 한 경우. RESX 파일이 당신에 다르게 지정되어 내 프로젝트에서

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); 
     } 
    } 
} 

:

BuildAction: EmbeddedResource 
CopyToOutputDirectory: DoNotCopy 
내가 컨트롤러에 OnAuthorize에서 HTTP의 요청에 따라 언어를 전환

https://github.com/Jacco/Perpetuality

나는 기지로 사용

내 게임에서 다음과 같은 문자열에 액세스합니다.

@Resources.Home.Index.FacebookButtonCaption 

게시 또는 사전 빌드를 설정하지 않았습니다.

내 프로젝트에서 언어는 항상 URL에 있습니다. 사용자가 적절한 언어를 선택하지 않은 경우 사용자가 언어를 전환 할 수있었습니다.

+0

+1을 공유합니다. 나는 언어에 쿠키를 사용하므로 문화는 예를 들어 로그인시. 게시 할 수있게 된 덕분에 귀하의 신청서를 상세히 조사 할 기회가 주어지기까지는 다소 시간이 걸릴 것입니다. 그들은 약간 까다로워서 여러 프로젝트에서 사용할 때 아주 지루한 세부 사항을 요구합니다. :) – lko

+0

나는 당신이 들어오는 모든 요청에 ​​대해 문화를 설정해야한다고 생각한다. 쿠키로부터 얻는 것은 괜찮다. 내 자원도 별도의 라이브러리에 있습니다 (제 생각에 그것이 위성에 의한 것입니까?) – Jacco