web-dev-qa-db-ja.com

ASP.NetコアMVCでのローカリゼーションが機能しない-リソースファイルが見つかりません

アプリケーションをローカライズしようとするとき、私は次の手順に従いました: 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を使用しています。誰か助けてもらえますか?

15
genericuser

同様の問題がありました。 "Localization.AspNetCore.TagHelpers" nuget packagがプロジェクトから欠落していることがわかりました。 QueryStringRequestCultureProviderに必要なパッケージのようです。

27
user2389913

これらの参照をnugetから追加する必要があります:

Microsoft.Extensions.Localization

また、Localization.AspNetCore.TagHelpersは、ローカライゼーションを毎回ビューに注入する代わりに、優れたタグヘルパーになることができます

2

私にとっては、プロジェクトのフォルダーの名前がルート名前空間と異なることが問題でした!コア3.0。

1
kuken

.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がこれらの行を挿入したのは奇妙です。バグのようです。

0
Mingo

同じ問題があり、デフォルトのリクエストカルチャを使用できるようにするために、組み込みプロバイダーを削除して修正しました。そのためには、このコードをサービスに追加する必要があります。スタートアップクラスで構成します。

    options.RequestCultureProviders = new List<IRequestCultureProvider>
    {
        new QueryStringRequestCultureProvider(),
        new CookieRequestCultureProvider()
    }; 

この他の答えを見てください: ASP .NET Coreのデフォルト言語は常に英語です

0
Greivin Marin

デフォルトでは、Visual studio IDEはアセンブリ参照を解決しますが、Microsoft.Extensions.LocalizationおよびMicrosoft.Extensions.Localization.Abstractions NuGetsが必要です。プロジェクト参照に追加すると、リソースロケータはリソースファイルを見つけることができます!

0
Arulvel

.netコア2.2でも同じ問題が発生しました。デバッガーでプロパティSearchedLocation enter image description here

したがって、私は最初にファイルにControllers.HomesController.rsxを作成し、プロパティにアクセスするためのアクセス修飾子 "Public"を言語拡張なしで enter image description here

そしてlocalizer ["Property]を使ってgoood値を見つけました。

Controllers.HomeController.fr.resxを作成した後、彼はurlのカルチャーで良い値を見つけました。

0
Richard Barat

アセンブリのルート名前空間がアセンブリ名と異なる場合:

ローカリゼーションはデフォルトでは機能しません。アセンブリ内でリソースを検索する方法が原因で、ローカリゼーションが失敗します。 RootNamespaceはビルドタイム値であり、実行中のプロセスでは使用できません。

RootNamespaceがAssemblyNameと異なる場合は、以下をAssemblyInfo.csに含めます(パラメーター値を実際の値に置き換えます)。

using System.Reflection;
using Microsoft.Extensions.Localization;

[Assembly: ResourceLocation("Resource Folder Name")]
[Assembly: RootNamespace("App Root Namespace")]

詳細はこちら

0
John Hogan