C#winforms多语言resx文件未嵌入到程序集中

时间:2017-11-29 11:53:43

标签: c# winforms

我正在开发一个winforms多语言应用程序,我已经创建了一个包含2个.resx文件的文件夹(例如:Resources.en.resx)。 该应用程序在调试模式下工作正常(根据所选语言检索不同的字符串值),但是,在运行安装程序并最终运行应用程序后,它崩溃,返回错误:

  

System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---> System.Resources.MissingManifestResourceException:找不到适合指定文化或中性文化的任何资源。确保在编译时将“-ProjectName-.LanguageResources.Resources.resources”正确嵌入或链接到程序集“-ProjectName-”中,或者所有所需的附属程序集都是可加载和完全签名的。

语言resx文件的属性是: 构建动作 - 嵌入式资源, 复制到输出目录 - 不要复制, customtool - ResXFileCodeGenerator

非常感谢提前

1 个答案:

答案 0 :(得分:2)

像这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Resources;
using System.Reflection;

namespace LogWizard
{
    static class Localizer
    {
        private static ResourceManager MainResourse = null;

        public static void InitLocalizedResource(string LanguagePrefix, string ResourseBase, string Delimeter = "_")
        {
            string FullResourseName = ResourseBase;
            Assembly assembly = Assembly.GetExecutingAssembly();

            var ResList = assembly.GetManifestResourceNames().ToList();

            if (ResList.
                Where(x => x.Equals(FullResourseName + Delimeter + LanguagePrefix + ".resources"))
                .Count() == 1)
                FullResourseName += Delimeter + LanguagePrefix;

            MainResourse = new ResourceManager(FullResourseName, assembly);
        }

        public static string Localize(this string str)
        {
            return GetString(str);
        }

        public static string GetString(string name)
        {
            try
            {
                if (MainResourse == null) 
                    return name;

                string result = MainResourse.GetString(name);
                return (result == null) ? name : result;
            }
            catch
            {
                return name;
            }
        }

    }
}

开始时的某个地方:

Localizer.InitLocalizedResource("en", "LogWizard.Resources.lang");

代码中的某处:

var localized = "text_item".Localize();

此外,这种方法允许在运行时更改程序本地化