こんにちはSharedResourcesファイルについて質問があります。ここのチュートリアルで一見します: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/localization 、私はそうではありません正しく取得できるかどうかを確認してください。
SharedResources.cs
クラスを作成することになっていますが、どこに配置する必要があり、空にする必要がありますか、それともデータを入力する必要がありますか?
リソースファイルについても同様です。SharedResources.da.resx
ファイルを作成して、そこにすべての共有文字列を配置する必要がありますか?どこに行くべきですか?
そして、IHtmlLocalizer<SharedResources>
を使用するときは、単に@using
と記述し、SharedResources.cs
が存在する名前空間を指すようにしますか?
ResourcesフォルダーにSharedResources.cs
とSharedResources.da.resx
を入れて、それを使用してWebサイトの言語をデンマーク語に変更しようとしましたが、機能しません。 Index.da.resx
やIViewLocalizer
などの専用のリソースファイルを使用しても問題ありませんが、IHtmlLocalizer<SharedResources>
は機能しないようです。
ページの下部にリンクされているサンプルプロジェクトを見たときに、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
});
Resourcesフォルダーには、共有文字列を含むShared.cs
およびShared.da.resx
という空のクラスが含まれます。名前をSharedResources.cs
およびSharedResources.da.resx
に変更する必要がありますか?
さて、少し掘り下げて、さらに試行錯誤を繰り返した後、質問に対する答えを見つけて、すべてが機能するようになりました。私が見つけたものは次のとおりです。
SharedResources.cs
クラスを作成することになっていますが、どこに配置する必要があり、空にする必要がありますか、それともデータを入力する必要がありますか?
ANSWER:SharedResources.cs
はプロジェクトのルートフォルダーまたはResourcesフォルダーに配置できますが、最も重要なことは、名前空間を設定する必要があることですプロジェクトのルートへ。私の場合、namespace Funkipedia
。また、データを含める必要はなく、クラス宣言のみを含める必要があります。
リソースファイルについても同様です。SharedResources.da.resx
ファイルを作成して、そこにすべての共有文字列を配置する必要がありますか?どこに行くべきですか?
ANSWER:はい、.csファイルと同じ名前のリソースファイルを作成する必要がありますneeds Resourcesフォルダー内。
そして、IHtmlLocalizer<SharedResources>
を使用するときは、単に@using
と記述し、SharedResources.cs
が存在する名前空間を指すようにしますか?
ANSWER:ビューで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アプリケーションのローカライズを初めて使用する他のユーザーにも役立つことを願っています。
私のチームでも機能するセットアップを追加したいと思います。 (もちろん)あなたと同じ原理に基づいていますが、プロジェクトのルートにリソース関連のファイルを配置することを強制しないので、ファイルの場所をより柔軟にできると思います。
私の理解は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
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ファイルから生成されたクラスがディレクトリツリーから名前空間を取得するため、また、文字列ローカライザーがnotプレースホルダータイプの前にResourcesPath
。
ASP.NET Core 2.0で私がうまくいったのは次のとおりです。