我正在开发一个winforms多语言应用程序,我已经创建了一个包含2个.resx文件的文件夹(例如:Resources.en.resx)。 该应用程序在调试模式下工作正常(根据所选语言检索不同的字符串值),但是,在运行安装程序并最终运行应用程序后,它崩溃,返回错误:
System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---> System.Resources.MissingManifestResourceException:找不到适合指定文化或中性文化的任何资源。确保在编译时将“-ProjectName-.LanguageResources.Resources.resources”正确嵌入或链接到程序集“-ProjectName-”中,或者所有所需的附属程序集都是可加载和完全签名的。
语言resx文件的属性是: 构建动作 - 嵌入式资源, 复制到输出目录 - 不要复制, customtool - ResXFileCodeGenerator
非常感谢提前
答案 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();
此外,这种方法允许在运行时更改程序本地化