[C#]リソース(ResX)ファイルを実行時に動的に読みこむ

普通のリソース用のresxファイルにはプロパティのカスタムツールに ResXFileCodeGenerator が指定されているのでリソースを簡単に扱えるクラスが自動生成されるし、ローカライズも勝手にやってくれる。ただ動的にリソースファイルを切り替えて読み込んだりはできない。

自動生成されたコードに頼らずにResXファイルを実行時に読み込む方法

設定 - resxファイルのプロパティを変更する

  • カスタムツール : (入力無し)
  • ビルドアクション : コンテンツ
  • 出力ディレクトリにコピー : 常にコピーする

コード

internal NameValueCollection GetResource()
{
  // 動的に読み込む場合は自動的にカルチャで切替とかしてくれないので
  // 読み込むリソースをUIカルチャで分岐する
  string name = Thread.CurrentThread.CurrentUICulture.Name;
  string resourceFilePath =
    name.StartsWith("ja") ? "ja.resx" :
    name.StartsWith("en") ? "en.resx" :
                            "default.resx";

  // ResXResourceReaderをそのまま返せるといいんだけど
  // IDisposable持ってるからNameValueCollectionに入れ替えて返す
  var ret = new NameValueCollection();
  using (var reader = new ResXResourceReader(resourceFilePath))
  {
    foreach (DictionaryEntry entry in reader)
    {
      ret.Add(entry.Key.ToString(), entry.Value.ToString());
    }
  }
  return ret;
}
Share
関連記事