2016-08-24 2 views
0

내 목표는 여러 언어를 지원하는 API를 만드는 것입니다.API 작업에서 반복 코드 피하기는하지만 여전히 다중 언어 지원

내가 각 작업에

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang); 

, 난 그 피할 수 가정 뭔가를 호출 할 경우에만 있지만, 노력하고 있습니다.


는 WebApiConfig.cs 파일에 나는 기본 경로 "{lang}/api/{controller}/{id}" 전에 언어를 배치, 여러 언어를 지원하기 위해 경로를 만들었습니다. 즉, 영어로는 을 이라고 부르면 http://localhost/en/api/service/get으로 전화 할 수 있습니다.

WebApiConfig.cs : 내 행동에

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApiLocalized", 
      routeTemplate: "{lang}/api/{controller}/{id}", 
      constraints: new { lang = @"(\w{2})|(\w{2}-\w{2})"}, // en or en-US 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

나는 언어를 수신하고 문화를 변경하는 데 사용합니다.

ServiceController.cs


내가 http://localhost/en/api/service/get 또는 http://localhost/pt/api/service/get 내가 완벽하게 작동, 각각의 언어로 문자열을 얻을 전화

public class ServiceController : ApiController 
{ 
    [HttpGet] 
    public string Get(string lang) 
    { 
     Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang); 
     return Resources.Global.Country; 
    } 
} 
.

어떻게 모든 작업에

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang); 

을 사용하지 않도록 할 수 있습니까?

어디에서 코드에 쓸 수 있지만 여전히 필요한 lang 인수가 있습니까?

  • lang 인수를 얻을 나는 Global.asax.cs을 시도했지만, 내가 할 수있는 (방법) 나도 몰라.
  • 나는 그것을 (그리고 어떻게) 넣을 수 있는지 모르겠다. WebApiConfig.cs.
+0

검색어 매개 변수가 아닌 URL에 언어를 사용하려는 이유는 무엇입니까? 후자는 나에게 더 깨끗한 옵션처럼 느껴진다. 물론 요청의 기존 헤더에서 가져 가라. –

+0

다시 한번 살펴보면, 귀하의 질문은 라우팅에 관한 것이 아니라 "실제로 특정 언어에 대한 리소스를 얻는 방법"에 관한 것입니다. 관련없는 라우팅 부분을 제거하는 것이 도움이됩니다. –

+0

'Resources.Global'의 유형을 표시하면 도움이 될 것입니다.내 생각 엔 특정 문화권의 문자열을 가져올 수있는'ResourceManager' 속성을 가진 생성 된 클래스라는 것입니다. –

답변

1

모든 작업 방법에서 일부 코드를 제거한 후 중앙에서 코드 중복을 방지하려면 작업 필터를 만들어 모든 요청에 ​​적용 할 수 있도록 전역으로 적용하는 것이 좋습니다. .

public class LangSettingActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var routeData= actionContext.Request.GetRouteData(); 
     object langCode; 
     if (routeData.Values.TryGetValue("lang", out langCode)) 
     { 
      //the languageCode from url is in langCode variable. Use it as needed. 
      //Thread.CurrentThread.CurrentUICulture = 
            //CultureInfo.GetCultureInfo(langCode.ToString()); 

     } 
     base.OnActionExecuting(actionContext); 
    } 
} 

당신은 당신의 WebApiConfig 클래스의 Register 방법 안에 전 세계적으로이 필터를 등록 할 수 있습니다.

public static void Register(HttpConfiguration config) 
{ 
    // Your existing route definiton here 
    config.Filters.Add(new LangSettingActionFilter()); 
} 
+1

절대적으로 완벽합니다. 그것이 내가 필요한 것입니다. 그것은 모든 사람에게 문화를 설정할 필요없이 모든 행동에 적용됩니다. 감사합니다. – Edu