2009-09-22 8 views
4

"[en]"또는 "it"인 세션 [ "lang"]에 내 대상 언어가 있습니다. 나는 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> 

내가 가진를 Global.resx라는 App_GlobalResources에 두 개의 파일, 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 게시 된 지침을 따르고 그것은 매력처럼 작동합니다.

그래서 Content 아래에 Localization 폴더를 만든 다음 번역하려는 각 언어에 대한 Resources resx 파일을 만듭니다. resx 파일 이름에는 규칙이 있습니다. ie

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

모든 컨트롤러는이 클래스에서 상속합니다.

로케일의 관리 세트이므로 내 앱 설정에서 설정해야합니다. 당신은 쿠키에서 그것을 읽고 설정할 수 있습니다. 이것은 내가 지금까지 마주 친 지역화를위한 가장 단순한 솔루션입니다.

일단 구현되면 추가 코드가 필요없는 다음 간단한 코드 줄을 추가하여 문자열을 참조 할 수 있습니다.

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

도움이되지 않습니다. 죄송합니다 : "문화를 설정해야하는 경우 사용자의 기본 설정이나 URL 매개 변수에 따라 위로 설정하면 가장 적합한 방법은 사용자 지정 HTTP 모듈 또는 작업 필터를 작성하는 것입니다. " 아마 이런 식으로 할 방법이 없을까요? – Palantir

+0

물론 문화를 설정하는 방법이 있습니다. 사용자 사이트의 사용자 환경 설정에 쿠키를 저장하면 인스턴스 생성자 (생성자)에서 쿠키를 읽고 CultureUI/Culture를 설정하는 컨트롤러를 만듭니다. 그런 다음 모든 컨트롤러가 해당 컨트롤러로부터 inhereit해야합니다. – Konstantinos

+0

로캘을 읽고 원하는대로 설정하려고 할 때까지 : System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo ("en-US"); System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo ("en-US"); – Konstantinos

3

나는이 하나가 중복 내기.
어쨌든 - 당신이 필요로하는 것은 here입니다 (다른 사람들과도 함께 일할 수도 있고, 조사하지 않았을 수도 있습니다).

아 글쎄 ... 여기 내 '요약'간다 :

도우미 단지 일부를. 기본 뷰 엔진으로 수정해야합니다. createview/createpartialview에서 htmlhelper가 resourceexpressionsfield를 찾고 원하는 값을 검색하는 localizationhelpers 클래스에 전달하기 위해 viewdata에 대한 경로 키를 추가하는 localizationwebformview를 반환해야합니다.

리틀 보너스 =>

당신이보기 하위 폴더에 대한 리소스 폴더를 다시하지 않으려면이 편리 수 있습니다
(경우에 당신이 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); 
     } 

편집 :
이 있지만 AG 수 있습니다 App_GlobalResources 및 App_LocalResources를 피하기위한 ood 아이디어 K. Scott Allen (Konstantinos 응답 확인).

+0

사이트에 정보 요약을 포함시킨 경우이 내용을 전제로합니다. – tvanfosson

+0

이미 시도했지만, 그것은 모든 곳에서 연결되어 있지만 전체 이야기를 말하지는 않습니다. 리소스 파일에서 물건을 가져 오는 도우미 만 제공합니다. 설치에 버그가있어서 어쨌든 (어쨌든 호출이 작동해야합니다. 그런 다음 문서가 구문에서 벗어나 MVC 스타일을 더 많이 사용한다고 생각합니다) 어쨌든 작동하지 않습니다. – Palantir

+0

이것은 조사해야 할 소스 코드로 압축 할 수있는 링크입니다.> http://www.eworldui.net/files/LocalizationHelpers.zip –