2009-11-24 18 views
15

多言語のRESXファイルを作成する方法とAL.exeで衛星アセンブリを作成する方法はたくさんありますが、RESX/Resources/satellite-DLLファイルを1つのEXEファイルに埋め込んで全体を配布する方法の例は見つかりませんでしたそのようなEXEとして多言語アプリ。多言語の* .resx(または* .resources)ファイルを1つのEXEに埋め込む方法は?

ilmerge.exeを使用しようとしましたが、同じ名前の複数のDLLで機能しないように見えます(カルチャサテライトDLLはもともとカルチャの名前が付けられた別のサブディレクトリに存在する同じ名前です)。

埋め込みリソースを扱うためのResourceManagerインスタンスの作成方法もわかりません。

私の目標は、閉じた、事前定義された言語セットを動的に切り替えることです。 culture文字列(つまり「de-DE」)、リソース名(「CancelText」)を取得し、埋め込み resx/resource/dllに基づいて翻訳されたテキストを返すクラス/メソッドが必要です。

私はVS2008を使用していますが、resx/resourceファイルのプロパティシートでは、「ビルドアクション」の設定が必要です。作業コードサンプルやチュートリアルプロジェクトへのリンクが最適です。

+1

このような古いスレッドを再度アクティブにするのは気が気ですが、あなたの問題が解決したかどうかを調べることに興味があります。あなたはまだこの日まで、あなたのアプローチ(あなたが下で与えた答え)を使っていますか?私はVS 2012で同様のプロジェクトに取り組んでおり、ResourceManagerを使用してドイツ語と英語を切り替えながら、言語リソースDLLをメインアセンブリ/ exeファイルに結合したいと考えています。ありがとう! – Sebastian

+0

@セバスチャン私は他の方法を模索していませんでした。より良いものを見つけたら分かち合ってください – tomash

答えて

8

解決方法:プログラムにはデフォルトの言語リソースファイル(resx)が1つのみ含まれています。他のすべての言語は.resxから.resourcesにコンパイルされ、リソースファイルとして埋め込まれます。重要! ".resources"は特別な種類のリソースとして認識されるので、私の拡張子は変更されたので、私のフランス語ファイルの名前は "PIAE.LangResources.fr"となります。私は上記GetStringアプローチを使用

internal static string GetString(string str, string lang) 
    { 

     if (string.IsNullOrEmpty(str)) throw new ArgumentNullException("empty language query string"); 
     if (string.IsNullOrEmpty(lang)) throw new ArgumentNullException("no language resource given"); 

     // culture-specific file, i.e. "LangResources.fr" 
     Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PIAE.LangResources."+lang); 

     // resource not found, revert to default resource 
     if (null == stream) 
     {                 
      stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PIAE.Properties.LangResources.resources"); 
     } 

     ResourceReader reader = new ResourceReader(stream); 
     IDictionaryEnumerator en= reader.GetEnumerator(); 
     while (en.MoveNext()) 
     { 
      if (en.Key.Equals(str)) 
      { 
       return en.Value.ToString(); 
      } 
     } 

     // string not translated, revert to default resource 
     return LangResources.ResourceManager.GetString(str); 
    } 
+6

+1、同様のアプローチを使用します。衛星ネットワークを避けたい場合には、.netはホイールの再開発を強要します。非常に悪いデザイン決定、IMO。 – Heinzi

+0

ニースのアプローチ。ちょうど名前で値を取得するのを容易にするために、読者の周りに 'ResourceSet'を使用できるようにすることを追加しました。 –

4

.NETフレームワークの仕組みではないため、見つからなかった。 .NETは、具体的に名前が付けられた場所(例えば、dede-DEchs、...などのリソースの言語にちなんで名付けられたiowディレクトリ)にあるサテライトDLLを想定しています。そのように動作しないと、.NETは現在のUIカルチャ(Thread.CurrentThread.CurrentUICulture)に従って正しいリソースを自動的に選択するという魔法を適用することはできません。

+2

私は自分自身で適切な文化を渡すことができますが、小さなツールを配布しています。 dll。 .NETフレームワークがほとんど役に立たなくても、EXEは1つだけです。 – tomash

0

:ここ

は、変換された文字列を取得する簡単なコード(それはリソースからキャッシュ値で改善されるべきである)です。記事Can't load a manifest resource with GetManifestResourceStream()には、リソースをストリームオブジェクトとして正しく取得する方法が記載されています。その後、すべてがうまくいった。

0

使用このプログラムは、それは私と一緒に作品:EXEPack

はあなただけ毎回あなたがコマンドツールがあるかどうかわからない、コンパイル手動で行う必要があります。

関連する問題