如何在单个EXE中嵌入多语言* .resx(或* .resources)文件?

有很多教程如何创建多语言RESX文件以及如何使用AL.exe创建附属程序集,但是我没有找到工作示例如何在单个EXE文件中嵌入RESX / Resources / satellite-DLL文件并分发整个多语言应用程序作为这样的EXE。

我试图使用ilmerge.exe,但它看起来不适用于具有相同名称的多个DLL(文件卫星DLL具有相同的名称,最初位于以文化命名的不同子目录中)。

我也不知道如何创建ResourceManager实例来处理嵌入式资源。

我的目标是在封闭的,预定义的语言集之间进行动态切换。 我需要获得文化字符串(即“de-DE”),资源名称(即“CancelText”)并返回基于嵌入式resx / resource / dll的翻译文本的类/方法。

我正在使用VS2008,请注意在resx / resource files属性表中需要设置“构建操作”的设置。 工作代码示例或链接到教程项目将是最好的。


我的解决方案:程序只包含一个默认的语言资源文件(resx)。 所有其他语言都从.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);
    }

你没有找到它,因为它不是.NET框架的工作方式。 .NET期望卫星DLL位于特定的命名位置(以它所包含资源的语言命名的低级目录,例如dede-DEchs ,...)。 如果你不这样工作,.NET将无法应用它的魔法(根据当前UI文化自动选择正确的资源: Thread.CurrentThread.CurrentUICulture )。


使用这个程序,它与我合作:EXEPack

您只需在每次编译时手动执行,不确定是否有命令工具。

链接地址: http://www.djcxy.com/p/23709.html

上一篇: How to embed multilanguage *.resx (or *.resources) files in single EXE?

下一篇: How can I detect the encoding/codepage of a text file