2013-05-11 3 views
4

LocalizationAttributeActionFilterAttribute을 사용하여보기를 현지화합니다. 컨트롤러에 [Localize]을 입력하기 만하면됩니다. LocalizeStrings.resx 파일을 사용하여 현재 스레드에있는 언어를 기반으로 적용했습니다. 이 간단한 경우에는 모든 것이 작동합니다 (지역화 된 문자열 포함). 이제는 문자열이 아닌 전체 페이지를 현지화하고 싶습니다.현재 문화권을 기반으로 다른 (현지화 된)보기를 호출하십시오.

어떤 접근 방식을 채택 하시겠습니까?

public ActionResult AboutUs() 
{ 
    switch (Thread.CurrentThread.CurrentUICulture.Name) 
    { 
     case "en-US": 
      return View("EnglishUSView");    
     case "de-DE": 
      return View("GermanView");    
     default: 
      return View(); 
    } 
    return View(); 
} 

을하거나 다른 일을하는 것이 좋습니다 수행

내가 컨트롤러의 최신 볼 호출이 값을 기준으로하는 스레드를 식별해야합니까?

답변

6
내가 추천

단순히 RazorViewEngine을 연장하기 위해 오버라이드 (override) OnActionExecuted 방법으로 기본 컨트롤러 - 그냥 그 돌봐 일반적인 논리를 작성 ViewEngine에 모양을 알리려면 FindPartialViewFindView을 재정 의하여 스레드 내부에 현재 culture가있는보기가 있습니다. 해당 페이지를 찾을 수없는 경우 사용자 명으로 진행하십시오.

  1. 는 (영어는 기본 LANG라고 가정이 있어야한다 RazorViewEngine
  2. 내부보기 폴더를 확장합니다.) Index.cshtmlIndex.de-DE.cshtml
  3. 수정 Global.asax.cs 파일, 응용 프로그램 내에서 당신이 RazorViewEngine를 구현 (것)

컨트롤러

no further modification needed 

조회수 지역화 된 뷰 엔진을 호출해야합니다 시작

/Views/Home/Index.cshtml 
/Views/Home/Index.de.DE.cshtml 
,210

도우미

public class LocalizedRazorViewEngine : RazorViewEngine 
{ 
    public override ViewEngineResult FindPartialView ... 
    public override ViewEngineResult FindView... 
} 

ApplicationStart

ViewEngines.Engines.Clear(); 
ViewEngines.Engines.Add(new LocalizedRazorViewEngine()); 
2

나는 이것을 달성하기 위해 여러 가지 방법이있다 생각하지만 당신은 아래에이 일을 수행 할 수 있습니다.

은 첫째로 당신은 즉 ViewName_ EN-US .cshtml 자신의 이름으로 문화 접미사를 추가하여보기에 어떤 이름 지정 규칙을 가정 할 수있다, ViewName_ PL-PL .cshtml 등

그렇다면, 현재 문화권을 기반으로 각 활동에서이 이름을 따로 구성하지 마십시오. 작업이 지금 처리 현지화가 필요하지 않습니다

public class BaseController : Controller 
{ 
    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 

     var view = filterContext.Result as ViewResultBase; 
     if(view != null) 
     { 
      var viewName = string.IsNullOrEmpty(view.ViewName) 
           ? filterContext.RouteData.Values["action"].ToString() 
           : view.ViewName; // retrieve the custom view name if provided or default action name otherwise 
      var cultureName = Thread.CurrentThread.CurrentUICulture.Name; 
      var localizedViewName = string.Format("{0}_{1}", viewName, cultureName); // construct composite, culture-aware name 
      if (ViewExists(localizedViewName)) // safety check in case not all your views are localized - if so, just return the default name 
      { 
       filterContext.Result = new ViewResult { ViewName = localizedViewName }; 
      }       
     }    
    } 

    private bool ViewExists(string name) 
    { 
     var result = ViewEngines.Engines.FindView(ControllerContext, name, null); 
     return result.View != null; 
    } 
} 

:

public class HomeController : BaseController 
{ 
    public ActionResult AboutUs() 
    {    
     // (...) nothing special here 
     return View(); 
    } 
} 
관련 문제