21

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

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

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

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

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

4

4 回答 4

10

我的解决方案:程序只包含一个默认语言资源文件(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);
    }
于 2009-11-30T17:59:05.640 回答
6

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

于 2009-11-24T22:18:30.867 回答
-1

我使用了GetString上面的方法。无法使用 GetManifestResourceStream() 加载清单资源一文描述了如何将资源正确检索为流对象。之后,一切正常。

于 2012-10-15T23:27:44.610 回答
-1

使用这个程序,它适用于我:EXEPack

只需要每次编译的时候手动做,不知道有没有命令工具。

于 2014-02-20T20:01:36.380 回答