2017-04-03 25 views
2

asp.netコアでresxファイル文字列を取得するには? mvcでResxResourceReaderを使用して文字列を取得します。しかし、私はasp.netコアで同じを得ることはできません。asp.netコアで.resxファイル文字列を取得する方法

+1

がツアーに参加してくださいし、[私は良い質問をするにはどうすればよい?]:私は私が送っ同じ値を得ることはありません確実にするために[最小、完全、および検証可能なサンプルを作成する方法](// stackoverflow.com/help/mcve) – Olaia

+1

私はresxファイルのエントリにkeyvalueペアとしてアクセスしたいと思います。 dotnetコアでこれを行う方法 –

答えて

0

(asp.netのように)古い方法のバージョンは、異なる文化MyResources.fr.resxためMyResources.resxやその他のファイルなどのデフォルトのリソース・ファイルを作成することです。 MyResources.MyValue1で値を取得します。 MyResources.resxを作成すると、すべてのリソース値を静的プロパティとして持つ.csファイルが生成されます。

.Net CoreはIStringLocalizerで動作するように勧めます。ここで、Tはリソースファイルの名前と一致するように作成されたクラスです。リソースファイルを使用せずに開発を開始し、後で追加することができます。コントローラに(IStringLocalizer < MyResources>ローカライザ)を注入し、_localizer ["MyValue1"]で値を取得する必要があります。あなたはhere

+0

なぜ彼らはそれをするだろうか?今度は、実行時クラッシュを引き起こす文字列を使用する必要があります。 –

2

.NETのコアは、リソースファイルは、私が感じる方法でどのように機能するかを変更し、.NETのコア公式ドキュメント上で見てみることができます

は、サブパーと紛らわしいです(把握する日かかった)が、あなたがサポートしている言語の変更をし、「リソース」のResourcePathはちょうどあなたが後での.resxファイルを保存フォルダになります。注 - Startup.csに次のコードを追加します。

  1. を:これは、あなたが何をする必要があるかであります

    services.AddLocalization(o => o.ResourcesPath = "Resources"); 
        services.Configure<RequestLocalizationOptions>(options => 
        { 
         var supportedCultures = new[] 
         { 
          new CultureInfo("en-US"), 
          new CultureInfo("en-GB"), 
          new CultureInfo("de-DE") 
         }; 
         options.DefaultRequestCulture = new RequestCulture("en-US", "en-US"); 
    
         // You must explicitly state which cultures your application supports. 
         // These are the cultures the app supports for formatting 
         // numbers, dates, etc. 
    
         options.SupportedCultures = supportedCultures; 
    
         // These are the cultures the app supports for UI strings, 
         // i.e. we have localized resources for. 
    
         options.SupportedUICultures = supportedCultures; 
        }); 
    
  2. resxファイルを保存するプロジェクトのフォルダを作成します。デフォルトでは「リソース」と呼ばれます。

  3. 特定のカルチャとファイル名で新しいresxファイルを作成し、後で参照してください。共有している場合は、SharedResource.en-US.resxを実行します。次に、自動コード生成をオフにして、現在は役に立たない。

  4. resxファイルと同じ場所に「SharedResource」というクラスを作成します。空白にすることもできます。後で参照できるように、そこにあるだけです。

  5. リソースを使用する場所はどこでも、IoCはIStringLocalizer < SharedResource>を "_localizer"という名前で(この例では)挿入します。

  6. 最後に、あなたが_localizerを実行して、リソースファイル内のエントリを参照することができ、[「My_Resource_Name」]

  7. 新しいRESX「SharedResource.de-DE.resx」という名前のファイルまたは何を作成することによって、他の言語を追加します。同じフォルダに保存してください。

"リソース"フォルダは、すべてのアセンブリ全体で使用され、それらのすべてを表示します。したがって、このフォルダは、特にあなたがここで特定のものを見るのを開始する場合、かなり混雑してしまう可能性があります。

デベロッパーがここで何をしようとしているのか分かりますが、あまりにも多くの人がそこに着くことをあきらめました。実際に何も翻訳することなく翻訳スタッフをコードしたり追加することができます。彼らは、デベロッパーが最初から翻訳を心に留めさせることを容易にしましたが、実際に翻訳を使用する開発者のためにより多くの仕事をするようになりました。今は自動生成できません。私たちはIoCにアクセスするために翻訳への参照を挿入する必要があります(ServiceLocaterのアンチパターンを使用しない限り、静的ではありません)。すべての名前はハードコードされた文字列なので、翻訳が間違っていると、最初に翻訳したという目的を破った文字列が吐き出され、おそらくラッパーが必要になるでしょうこれはどこでも定数に依存しないためです。

正直言って、これはいい考えだと誰も信じられませんでした。とにかく、翻訳を気にしない開発者のためになぜ後ろに曲がるのですか?

このスタイルのラッパーを作成しました。これに関する唯一の良いことは、データベースからリソースを取得することを決定した場合、上記のコード変更は必要ありませんが、リソースエントリを追加してインタフェースに追加してから、それを実装する必要がありますそれはまた戻ってくる。私はnameof()を使用して定数を使う必要はありませんでしたが、プロパティ名やresxファイル名が変更された場合と同じように、まだ脆いです。何らかのクラッシュなしに翻訳を破ることになります。 (// stackoverflow.com/help/how-to-ask)

public interface ICommonResource 
{ 
    string ErrorUnexpectedNumberOfRowsSaved { get; } 
    string ErrorNoRecordsSaved { get; } 
    string ErrorConcurrency { get; } 
    string ErrorGeneric { get; } 

    string RuleAlreadyInUse { get; } 
    string RuleDoesNotExist { get; } 
    string RuleInvalid { get; } 
    string RuleMaxLength { get; } 
    string RuleRequired { get; } 
} 

public class CommonResource : ICommonResource 
{ 
    private readonly IStringLocalizer<CommonResource> _localizer; 

    public CommonResource(IStringLocalizer<CommonResource> localizer) => 
     _localizer = localizer; 

    public string ErrorUnexpectedNumberOfRowsSaved => GetString(nameof(ErrorUnexpectedNumberOfRowsSaved)); 
    public string ErrorNoRecordsSaved => GetString(nameof(ErrorNoRecordsSaved)); 
    public string ErrorConcurrency => GetString(nameof(ErrorConcurrency)); 
    public string ErrorGeneric => GetString(nameof(ErrorGeneric)); 

    public string RuleAlreadyInUse => GetString(nameof(RuleAlreadyInUse)); 
    public string RuleDoesNotExist => GetString(nameof(RuleDoesNotExist)); 
    public string RuleInvalid => GetString(nameof(RuleInvalid)); 
    public string RuleMaxLength => GetString(nameof(RuleMaxLength)); 
    public string RuleRequired => GetString(nameof(RuleRequired)); 

    private string GetString(string name) => 
     _localizer[name]; 
} 
+0

私はあなたが 'ResXFileCodeGenerator'を使ってコンパイル時の小道具を生成できると信じています(https://christianspecht.de/2017/11/29/fixed-resourcedesigns-generation-in-net-core /)を参照してください。 – Dejan

+0

私はしましたが、文化の変化は無視されました。 –

+0

ASP.Net 5を使用していた古いプロジェクトでは、翻訳されたすべての文字列(例:Translations.resx and Translations.fr.resx、Translations.nl.resxなど)を含む1つのグローバルファイルを含む分離プロジェクトがあります。これはASP.Net Core 2でも可能ですか?ファイルの2番目のプロジェクトを使用できない場合でも。私はこれを行う方法を見つけることができないので。 –

関連する問題