2016-04-26 6 views
0

へのフォールバックせずにリソース文字列を取得することができ、私は私のアプリでは、次のセットアップがあります翻訳プロ​​セスに遅れが原因はどのように私は、デフォルトの文化

MyResources.resx // english strings 
MyResources.zh-CN.resx // chinese strings 

を、いくつかのキーは、英語の値が、ありません中国の値を持っています。それ以外の場合は、zh-CN resxファイル全体が存在しません。中国の価値が存在しない場合、デフォルトでResourceManagerは英語の値に戻ります。これは、ほとんどのシナリオで私のユースケースに受け入れられます。しかし、私は現在英語にフォールバックせずに中国のリソース文字列を取得する必要があります。

私の質問です:これを行う正しい方法は何ですか?

私は当初、これはGetResourceSet方法を介して行うことができることを考えていた:意図は、フォールバックを提供するために常にあるので、一回限りのシナリオをです

var manager = MyResources.ResourceManager; 

var set = manager.GetResourceSet(CultureInfo.GetCultureInfo("zh-CN"), createIfNotExists: true, tryParents: false); 
if (set == null || set.GetString("key") == null) { /* not translated! */ } 

// however, this has issues because resource set lookup is cached: 

// this will force the association of the zh-CN culture with the 
// English resource set unde the hood 
manager.GetString("key", CultureInfo.GetCultureInfo("zh-CN")); 

// now this returns the English resource set, thus breaking my check 
var set2 = manager.GetResourceSet(CultureInfo.GetCultureInfo("zh-CN"), createIfNotExists: true, tryParents: false); 
if (set == null || set.GetString("key") == null) { /* checks whether key exists in english :-(*/ } 
+1

zh-CNリソースファイルに値を追加してください – Fabio

+0

@Fabioはおそらく何らかのスタブ値を示唆していますか?私はこれが理想的であることに同意しない。問題のコードは、さまざまな開発者が管理する〜30の異なるコードベースで使用されるライブラリです。私は新しい言語にリソースを翻訳し始めるたびに空のresxファイルでコードベースを瞬時に更新するソリューションに頼っています。 – ChaseMedallion

+0

コード内のローカリゼーション文字列へのアクセス方法は?生成されたクラス(Visual Studioはリソースクラスを生成します) 'ResourceNamespace.MyResourcesFileName.KeyofString'またはハードコードされたキーを持つResourceManagerを使用して:' ResourceManager.GetString( "KeyofString") '? – Fabio

答えて

0

。しかし、あなたはまだそれを回避することができます(これはやや単純な例です)。これは、既定値と異なる場合にのみResourceManagerが指定したカルチャに対して何を提供するかを返します。

私は習慣/慣習からコンストラクタにいくつかのものを入れています。 ResourceManager、希望のCultureInfo、またはその両方をメソッド引数に移動できます。

public class NonFallbackResourceManager 
{ 
    private readonly CultureInfo _desiredCulture; 
    private readonly ResourceManager _resourceManager; 

    public NonFallbackResourceManager(CultureInfo desiredCulture, ResourceManager resourceManager) 
    { 
     _desiredCulture = desiredCulture; 
     _resourceManager = resourceManager; 
    } 

    public string GetString(string key) 
    { 
     var desiredCultureString = _resourceManager.GetString(key, _desiredCulture); 
     var defaultCultureString = _resourceManager.GetString(key, CultureInfo.InvariantCulture); 
     return string.Equals(desiredCultureString, defaultCultureString) 
      ? String.Empty 
      : desiredCultureString; 
    } 
} 

フォールバックのレベルが複数ある場合があるシナリオは考慮されていません。