アプリケーションをローカライズしようとするとき、私は次の手順に従いました: https://docs.asp.net/en/latest/fundamentals/localization.html
これが私のコードです:
Startup.cs
public List<IRequestCultureProvider> RequestCultureProviders { get; private set; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(options => options.ResourcesPath = "Resources")
.AddDataAnnotationsLocalization();
services.AddOptions();
services.AddTransient<IViewRenderingService, ViewRenderingService>();
services.AddTransient<IEmailSender, EmailSender>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
app.UseStaticFiles();
app.UseFileServer(new FileServerOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory())),
EnableDirectoryBrowsing = true
});
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("fr"),
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("fr"),
// Formatting numbers, dates, etc.
SupportedCultures = supportedCultures,
// UI strings that we have localized.
SupportedUICultures = supportedCultures,
RequestCultureProviders = new List<IRequestCultureProvider>
{
new QueryStringRequestCultureProvider
{
QueryStringKey = "culture",
UIQueryStringKey = "ui-culture"
}
}
});
}
MyController.cs
public class MyController : Controller
{
private readonly IViewRenderingService _viewRenderingService;
private IStringLocalizer<MyController> _localizer;
private MyOptions _options;
//Constructor for dependency injection principle
public MyController(IViewRenderingService viewRenderingService, IStringLocalizer<MyController> localizer, IOptions<MyOptions> options)
{
_viewRenderingService = viewRenderingService;
_localizer = localizer;
_options = options.Value;
}
[HttpGet]
public string Get()
{
// _localizer["Name"]
return _localizer["Product"];
}
}
*.resx
ファイルは、Controllers.MyController.fr.resx
という名前でResources
フォルダーに格納されます(「製品」のエントリがあります)。
ただし、リソースファイルを見つけることができず、フランス語で「製品」が返されることはありません。私はクエリ文字列を使用しているので、ここにクエリ文字列があります:
localhost:3333/my?culture=fr
また、ビューでは、@Localizer["Product"]
は "Product"を返します。
誰かが私が不足しているものを見つけるのを手伝ってくれる?
編集:
調査の結果、カルチャが変化していることがわかりましたが、リソースファイルを見つけることができません。 VS2015を使用しています。誰か助けてもらえますか?
同様の問題がありました。 "Localization.AspNetCore.TagHelpers" nuget packagがプロジェクトから欠落していることがわかりました。 QueryStringRequestCultureProviderに必要なパッケージのようです。
これらの参照をnuget
から追加する必要があります:
Microsoft.Extensions.Localization
また、Localization.AspNetCore.TagHelpers
は、ローカライゼーションを毎回ビューに注入する代わりに、優れたタグヘルパーになることができます
私にとっては、プロジェクトのフォルダーの名前がルート名前空間と異なることが問題でした!コア3.0。
.NET Core 2.1をターゲットにしたVS 2017を使用していますが、私の場合、プロジェクトファイル(.csproj)に次のような奇妙なItemGroupタグがいくつか含まれています。
<ItemGroup>
<EmbeddedResource Remove="Resources\Controllers.HomeController.sv.resx" />
...
</ItemGroup>
<ItemGroup>
<None Include="Resources\Controllers.HomeController.sv.resx" />
...
</ItemGroup>
行を削除すると、機能し始めました。
以前にリソースファイルの追加と削除を試してみたところ、アイテムグループが表示された可能性がありますが、Visual Studioがこれらの行を挿入したのは奇妙です。バグのようです。
同じ問題があり、デフォルトのリクエストカルチャを使用できるようにするために、組み込みプロバイダーを削除して修正しました。そのためには、このコードをサービスに追加する必要があります。スタートアップクラスで構成します。
options.RequestCultureProviders = new List<IRequestCultureProvider>
{
new QueryStringRequestCultureProvider(),
new CookieRequestCultureProvider()
};
この他の答えを見てください: ASP .NET Coreのデフォルト言語は常に英語です
デフォルトでは、Visual studio IDEはアセンブリ参照を解決しますが、Microsoft.Extensions.LocalizationおよびMicrosoft.Extensions.Localization.Abstractions NuGetsが必要です。プロジェクト参照に追加すると、リソースロケータはリソースファイルを見つけることができます!
アセンブリのルート名前空間がアセンブリ名と異なる場合:
ローカリゼーションはデフォルトでは機能しません。アセンブリ内でリソースを検索する方法が原因で、ローカリゼーションが失敗します。 RootNamespaceはビルドタイム値であり、実行中のプロセスでは使用できません。
RootNamespaceがAssemblyNameと異なる場合は、以下をAssemblyInfo.csに含めます(パラメーター値を実際の値に置き換えます)。
using System.Reflection;
using Microsoft.Extensions.Localization;
[Assembly: ResourceLocation("Resource Folder Name")]
[Assembly: RootNamespace("App Root Namespace")]