多言語の *.resx (または *.resources) ファイルを単一の EXE に埋め込むにはどうすればいいですか? 質問する

多言語の *.resx (または *.resources) ファイルを単一の EXE に埋め込むにはどうすればいいですか? 質問する

多言語 RESX ファイルを作成する方法や AL.exe を使用してサテライト アセンブリを作成する方法についてのチュートリアルはたくさんありますが、RESX/リソース/サテライト DLL ファイルを単一の EXE ファイルに埋め込み、多言語アプリ全体をそのような EXE として配布する方法の実用的な例は見つかりませんでした。

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

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

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

私は VS2008 を使用しています。resx/リソース ファイルのプロパティ シートで「ビルド アクション」にどのような設定が必要か注意してください。実用的なコード サンプルまたはチュートリアル プロジェクトへのリンクが最適です。

ベストアンサー1

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

以下は翻訳された文字列を取得するための簡単なコードです (リソースからの値をキャッシュすることで改善されるはずです)。

    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);
    }

おすすめ記事