programing

Shared Resources를 통한 ASP.NET Core Localization

closeapi 2023. 9. 28. 08:23
반응형

Shared Resources를 통한 ASP.NET Core Localization

안녕하세요 공유 자원 파일에 대해 질문이 있습니다.여기 자습서 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/localization, 에 나와 있는데 제가 제대로 이해했는지 잘 모르겠습니다.

는 를 있습니다.SharedResources.cs수업, 그런데 어디에 둬야하고 비워야하나요 아니면 자료로 채워야 하나요?

를 .SharedResources.da.resx파일을 저장하고 거기에 내 공유 문자열을 모두 저장할 수 있습니까?어디로 가야 합니까?

그리고 제가 사용할때는.IHtmlLocalizer<SharedResources>나는 그냥 글을 쓰시오.@using다가 있는 .SharedResources.cs거주자?

.SharedResources.cs그리고.SharedResources.da.resx리소스 폴더에서 이를 사용하여 웹 사이트 언어를 덴마크어로 변경하지만 작동하지 않습니다.와 같은 전용 Index.da.resx그리고.IViewLocalizer만,IHtmlLocalizer<SharedResources>작동하지 않는 것 같습니다.

페이지 하단의 에 연결된 예제 프로젝트를 살펴봤을 때 공유 리소스가 사용되는 곳을 찾지 못했습니다. 누군가가 예제와 함께 업데이트를 해준다면 좋을 것 같습니다.

제가 시도한 방법은 이렇습니다.

Views/Home/Index.cshtml:

@using Funkipedia.Resources
@using Microsoft.AspNetCore.Mvc.Localization
@inject IHtmlLocalizer<Shared> SharedLocalizer
...
<p>@SharedLocalizer["Hei"]</p>
...

Startup.cs 에서 ConfigureServices(서비스 구성) 상단:

services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
  .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
  .AddDataAnnotationsLocalization();

Startup.cs 에서 Configure(구성) 상단:

var supportedCultures = new List<CultureInfo>
{
       new CultureInfo("nb-NO"),
       new CultureInfo("sv-SE"),
       new CultureInfo("da-DK")
};

app.UseRequestLocalization(new RequestLocalizationOptions
{
       DefaultRequestCulture = new RequestCulture("nb-NO"),
       SupportedCultures = supportedCultures,
       SupportedUICultures = supportedCultures
});

에 빈 .Shared.cs그리고.Shared.da.resx공유 문자열을 포함합니다.요?SharedResources.cs그리고.SharedResources.da.resx?

좋아요, 좀 더 뒤지고 시행착오를 거듭한 끝에 제 질문에 대한 답을 찾았고 모든 걸 해결할 수 있게 됐어요.제가 찾은 것은 다음과 같습니다.

는 를 있습니다.SharedResources.cs수업, 그런데 어디에 둬야하고 비워야하나요 아니면 자료로 채워야 하나요?

: SharedResources.cs프로젝트의 루트 폴더 또는 리소스 폴더에 배치할 수 있지만 가장 중요한 것은 네임스페이스를 프로젝트의 루트에 설정해야 한다는 것입니다.나같은 경우에는namespace Funkipedia없고 그리고 어떤 자료도 포함할 필요가 없고, 단지 클래스 선언만 포함할 필요가 있습니다.

를 .SharedResources.da.resx파일을 저장하고 거기에 내 공유 문자열을 모두 저장할 수 있습니까?어디로 가야 합니까?

답변: 예, .cs 파일과 동일한 리소스 파일을 생성하고 리소스 폴더에 넣어야 합니다.

그리고 제가 사용할때는.IHtmlLocalizer<SharedResources>나는 그냥 글을 쓰시오.@using이름 공간을 가리키고 있습니다.SharedResources.cs거주자?

답변: 사용할 때IHtmlLocalizer및/또는IStringLocalizer보기에 당신은 이것을 맨 위에 쓸 필요가 있습니다..cshtml파일:

@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Localization
@inject IViewLocalizer Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@inject IHtmlLocalizer<SharedResources> SharedHtmlLocalizer

참고:@using Microsoft.Extensions.Localization를 사용하는 경우에만 필요합니다.IStringLocalizer

ASP의 자원화 파일과 현지화를 처음 해보는 분들에게 도움이 되길 바랍니다.NET Core 애플리케이션.

이것이 제게 (ASP에서) 효과가 있었던 것입니다.NET Core 2.0):

  1. SharedResources.cs 을 Resources(리소스)라는 폴더에 넣습니다.
  2. 공유 리소스를 배치합니다.리소스 폴더에도 xx-yy.resx 리소스 파일이 있습니다.
  3. 서비스를 호출합니다.ResourcesPath 옵션 없이 Localization() 추가.

저희 팀에도 적용되는 설정을 추가하고 싶습니다.이는 (물론) 귀사와 동일한 원칙에 기반을 두고 있지만, 리소스 관련 파일을 프로젝트 루트에 넣을 필요가 없기 때문에 파일 위치에 보다 유연성을 제공할 수 있다고 생각합니다.

제가 알기로는IStringLocalizer<T>장소지킴이라는 개념을 가지고 있습니다. Type, 전체 이름이 상대 경로로 변환되어 실제 리소스 파일을 찾는 데 사용됩니다.이 변환을 수행하기 위해 다음의 정보도 사용합니다.LocalizationOptions.ResourcesPath, 있는 경우에

예를 들어 다음과 같이 하십시오.

// in ProjectRoot\Startup.cs

services.AddLocalization(opts =>
{
  opts.ResourcesPath = "Localized";
});

// in ProjectRoot\Area\Whatever\SomeClass.cs

namespace Com.Company.Project.Area.Whatever
{
  public class SomeClass
  {
    public SomeClass(IStringLocalizer<SomeClass> localizer)
    {
      // ...
    }
  }
}

다음과 같이 단계적으로 아이디어를 제시합니다.

  1. SomeClass전체 이름:Com.Company.Project.Area.Whatever.SomeClass
  2. 다음을 .resx 파일 경로로 변환합니다.Com\Company\Project\Area\Whatever\SomeClass.resx
  3. …의 앞글자를 따다ResourcesPath내용:Localized\Com\Company\Project\Area\Whatever\SomeClass.resx

리소스 파일이 조회되는 실제 경로입니다.

그래서, 대체적으로, 당신은 당신의.SharedResources.cs클래스 전체 이름을 아래의 경로로 복제하는 한 원하는 곳에 클래스를 비웁니다.ResourcesPath프로젝트 루트 아래에 폴더가 있습니다.

예제에서:

\
--Area
  --Whatever
    --SomeClass.cs
--Localized
  --Com
    --Company
      --Project
        --Area
          --Whatever
            --SomeClass.resx
            --SomeClass.fr.resx
            --SomeClass.da.resx

표지 아래에 있는 디렉터리 트리가 필요한 이유는 resx 파일에서 생성된 클래스가 디렉터리 트리의 네임스페이스를 가져올 것이고, 또한 문자열 로컬라이저가 자리 표시자 유형을 다음과 같이 접두사로 지정할 때 루트 네임스페이스를 제거하지 않기 때문입니다.ResourcesPath.

위의 모든 답변을 시도한 끝에 마침내 제가 사용했던 네임스페이스 협약을 맺게 되었습니다!

루트 네임스페이스에 이미 점이 있는 경우 ex: MyTestApp.WebAPI, 그러면 리소스 폴더 내에 더미 클래스를 배치하는 것이 작동하지 않습니다.대신 프로젝트의 루트 디렉터리에 더미 클래스를 추가하고 리소스 파일을 리소스 폴더 자체에 두십시오.

참조 : https://weblogs.asp.net/ricardoperes/asp-net-core-pitfalls-localization-with-shared-resources

enter image description here

언급URL : https://stackoverflow.com/questions/42647384/asp-net-core-localization-with-help-of-sharedresources

반응형