2017-11-20 4 views
0

가 나는 두 개의 리소스를 생성 다국어 project.For 나는 자원 (의 .resx 파일)Asp.net 코어 현지화 항상 영어 clulture

을 사용하는 정적 값을 개발하기 위해 노력하고 반환 파일 Home.resx (기본 영어) 및 (아랍어 언어) home.resx는 는

가 그럼 난 언어를

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ar"); 
var home = Resources.Home.Home1; 

을 변경하려고하지만 여전히 대신 아랍어 값의 영어 값을 반환 기본 영어 작동 여기 내 startup.cs는

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
     { 

    var supportedCultures = new List<System.Globalization.CultureInfo> 
      { 
       new System.Globalization.CultureInfo("en-US"), 

       new System.Globalization.CultureInfo("ar-AR"), 

      }; 
      var options = new RequestLocalizationOptions 
      { 
       DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-US"), 
       SupportedCultures = supportedCultures, 
       SupportedUICultures = supportedCultures 
      }; 
      app.UseRequestLocalization(options); 
...... 

내 코드 잘못된 것입니다 기능을 구성한다?

+0

[naming rules] (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization#resource-file-naming)를 더 자세히 따라야한다고 생각합니다. 따라서 파일의 이름은'Home.ar.resx'로 지정해야합니다. – poke

+0

@poke 나는 그것을 바꾼다 Home.ar.resx하지만 여전히 기본 (영어) 값을 얻는다. 나는 어떻게 아랍 문화를 정착시킬 수 있는가? 틀린가? 이 줄은 충분하니? System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo ("ar-AR"); // 또는 ("ar") – user1688401

답변

1

좋아요, 내 프로젝트에서 내가하는 일을 알려 드리겠습니다. Startup.cs의 ConfigureServices 메서드에서 services.AddMvc() 뒤에 다음 코드를 입력합니다.

IList<CultureInfo> supportedCultures = new List<CultureInfo> 
{ 
    new CultureInfo("en-US"), 
    new CultureInfo("fr-FR"), 
    new CultureInfo("el-GR"), 
}; 

var MyOptions = new RequestLocalizationOptions() 
{ 
    DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US"), 
    SupportedCultures = supportedCultures, 
    SupportedUICultures = supportedCultures 
}; 
MyOptions.RequestCultureProviders = new[] 
{ 
    new RouteDataRequestCultureProvider() { RouteDataStringKey = "lang", Options = MyOptions } 
}; 

services.AddSingleton(MyOptions); 

이제 기본 라우팅을 변경

프로젝트

public class LocalizationPipeline 
{ 
    public void Configure(IApplicationBuilder app, RequestLocalizationOptions options) 
    { 
     app.UseRequestLocalization(options); 
    } 
} 
에 다음 클래스를 정의 :

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{lang=en-US}/{controller=Home}/{action=Index}/{id?}"); 
}); 

사용하여 컨트롤러 각각에 대한 MiddlewareFilter에서.

[MiddlewareFilter(typeof(LocalizationPipeline))] 
public class HomeController : Controller 
{ 
    public string GetCulture() 
    { 
     return $"CurrentCulture:{CultureInfo.CurrentCulture.Name}, CurrentUICulture:{CultureInfo.CurrentUICulture.Name}"; 
    } 
} 

는이 같은 현재의 언어를 변경할 수 있습니다

<ul> 
    <li>@Html.ActionLink("EN", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "en-US" })</li> 
    <li>@Html.ActionLink("FR", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "fr-FR" })</li> 
    <li>@Html.ActionLink("GR", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "el-GR" })</li> 
</ul> 

당신은뿐만 아니라 면도기 페이지를 지원하려면, 다음과 같이 변경합니다. 다음 변경 내용을 servcies.AddMvc() 추가하십시오.

services.AddMvc() 
    .AddRazorPagesOptions(options => 
    { 
     options.Conventions.AddFolderRouteModelConvention("/", model => 
     { 
      foreach (var selector in model.Selectors) 
      { 
       var attributeRouteModel = selector.AttributeRouteModel; 
       attributeRouteModel.Template = AttributeRouteModel.CombineTemplates("{lang=el-GR}", attributeRouteModel.Template); 
      } 
     }); 
    }); 

은 PageModels

[MiddlewareFilter(typeof(LocalizationPipeline))] 
public class ContactModel : PageModel 
{ 
    public string Message { get; set; } 

    public void OnGet() 
    { 
     Message = "Your contact page."; 
    } 
} 

내가 관리하지 않은 유일한 것은 자동으로 프로그램 내부의 MiddlewareFilter을 추가하여 모든 컨트롤러와 PageModels의 LocalizationPipeline을 정의하는 동안 다음과 같은 MiddlewareFilter 속성을 사용 Startup.cs.

+0

이렇게 힘들어요 :) 사용자 컨값을 변경하면 현재 cultur를 설정하려고합니다. 언어를 아랍어 또는 다른 언어로 번역 – user1688401

+0

이것이 내가 구현할 수있는 유일한 방법이지만 올바르게 설정하면 작동합니다. – pitaridis

+0

네, 작동하고 아무런 성능 문제가 없습니다 .. 정말 고마워요 ... route를 변경하고 싶습니다. 코드로 URL을 생성합니다 : http : // localhost : 49531/ar/Flight/List?currencyCode = KWD http : // localhost : 49531/ar/kwd/MyFlights로 바꾸려면 어떻게해야합니까? – user1688401