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):
- SharedResources.cs 을 Resources(리소스)라는 폴더에 넣습니다.
- 공유 리소스를 배치합니다.리소스 폴더에도 xx-yy.resx 리소스 파일이 있습니다.
- 서비스를 호출합니다.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)
{
// ...
}
}
}
다음과 같이 단계적으로 아이디어를 제시합니다.
SomeClass
전체 이름:Com.Company.Project.Area.Whatever.SomeClass
- 다음을 .resx 파일 경로로 변환합니다.
Com\Company\Project\Area\Whatever\SomeClass.resx
- …의 앞글자를 따다
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
언급URL : https://stackoverflow.com/questions/42647384/asp-net-core-localization-with-help-of-sharedresources
'programing' 카테고리의 다른 글
MySql 이벤트가 마지막으로 실행된 시기 찾기 (0) | 2023.09.28 |
---|---|
asp.net 웹 방식과 wcf 서비스의 차이점은 무엇입니까? (0) | 2023.09.28 |
자바 langClassNotFoundException: org.springframework.boot.스프링 어플리케이션 메이븐 (0) | 2023.09.28 |
스프링 동면 템플릿 사용 시기 및 이유는? (0) | 2023.09.28 |
mod deflat 루트의 하위 디렉토리를 압축하지 않음 (0) | 2023.09.28 |