首页 文章

使用resx文件进行本地化会生成MissingManifestResourceException

提问于
浏览
1

这是我对本地化的第一次努力,我读的越多,我就越困惑 . 说实话,我只是在寻找答案 . 所以这是我得到的错误:

未处理的异常:System.Resources.MissingManifestResourceException:找不到适合指定文化或中性文化的任何资源 . 确保在编译时将“MeetnGreetSf.Resources.AppResources.resources”正确嵌入或链接到程序集“MeetnGreetSf”中,或者所有所需的附属程序集都是可加载和完全签名的 . 发生了

这是 class :

public class TranslateHelper
{
    readonly CultureInfo ci;
    private string ResourceId = "MeetnGreetSf.Resources.AppResources";
    private ResourceManager resmgr;
    private CultureInfo cui = new CultureInfo("es-ES");
    public TranslateHelper()
    {
        //ResourceId += "." + cui.Name;
        resmgr = new ResourceManager(ResourceId, typeof(AppResource).GetTypeInfo().Assembly);


    }

    public string Translate(string Name)
    {
        var translation = resmgr.GetString(Name, ci);
        return translation;
    }

}

我认为我很接近它将.resources附加到文件而不是.resx?

在此先感谢您的帮助 .

忘了包括翻译类的使用方式 .

public Colors()
    {
        colorInfo = new ObservableCollection<ColorType>();
        t = new TranslateHelper();
        this.GenerateColors();




    }

    private void GenerateColors()
    {
        colorInfo.Add(new ColorType(t.Translate("Aqua"), Color.Aqua));
        colorInfo.Add(new ColorType(t.Translate("Black"), Color.Black));
        colorInfo.Add(new ColorType(t.Translate("Blue"), Color.Blue));
        colorInfo.Add(new ColorType(t.Translate("Gray"), Color.Gray));
        colorInfo.Add(new ColorType(t.Translate("Green"), Color.Green));
        colorInfo.Add(new ColorType(t.Translate("Lime"), Color.Lime));
        colorInfo.Add(new ColorType(t.Translate("Maroon"), Color.Maroon));
        colorInfo.Add(new ColorType(t.Translate("Navy"), Color.Navy));
        colorInfo.Add(new ColorType(t.Translate("Olive"), Color.Olive));
        colorInfo.Add(new ColorType(t.Translate("Purple"), Color.Purple));
        colorInfo.Add(new ColorType(t.Translate("Red"), Color.Red));
        colorInfo.Add(new ColorType(t.Translate("Silver"), Color.Silver));
        colorInfo.Add(new ColorType(t.Translate("Teal"), Color.Teal));
        colorInfo.Add(new ColorType(t.Translate("White"), Color.White));
        colorInfo.Add(new ColorType(t.Translate("Yellow"), Color.Yellow));
    }
}

1 回答

  • 1

    请注意,我是Visual Studio的商业本地化工具的作者(为了完全公开) . 您应该调查“System.Threading.Thread.CurrentThread.CurrentUICulture”,这通常是.NET中所有翻译的内容(用于处理本地化资源) . 但是,如何处理它的机制可能会因项目类型而异 . 现在通常不需要你现在这样做的方式 . 它通常比那更容易(不需要专门的课程) . 以下是一个简单的控制台应用程序的基本过程(同样,事情可能因项目类型而异) .

    • 创建一个名为"TestApp"的新控制台应用程序

    • 打开项目的属性(例如,在解决方案资源管理器中右键单击它并选择"Properties"),然后单击属性窗口中的"Resources"选项卡 . 现在单击屏幕中间显示的按钮"This project does not contain a default resource file. Click here to create one" . 这会将"Resources.resx"添加到您的解决方案中(在解决方案资源管理器中的"Properties"文件夹下),它将在".resx"编辑器中自动打开 .

    • 在".resx"编辑器中添加一个名为"MyString"的字符串 . 分配"This is my default string"(或其他) .

    • 在您要使用字符串的代码中,添加"using TestApp.Properties"语句(继续阅读) . 您现在可以通过静态属性"Resources.MyString"访问该字符串 . 这在"Resources.Designer.cs"中声明,这是由VS在上面的步骤2中自动创建的"code-behind"文件(即,它是解决方案资源管理器中的"Resources.resx"的子节点) . VS为您查找此文件(为上面3中添加的每个字符串向"TestApp.Properties"名称空间添加新的静态属性) . 请注意,这些字符串称为"strongly typed resources" .

    • 将新的".resx"文件添加到项目中并将其命名为"Resources.es.resx" . 这将包含西班牙语字符串 . 创建后,将其在解决方案资源管理器中拖到"Properties"文件夹(因此它现在与"Resources.resx"在同一文件夹中 - 所有本地化的".resx"文件必须与"Resources.resx"在同一文件夹中) .

    • 双击"Resources.es.resx"并向其添加"MyString" . 将其文本设置为"This is my Spanish string" .

    • 如果要更改代码中的语言以获取字符串的西班牙语版本,只需将代码中的"System.Threading.Thread.CurrentThread.CurrentUICulture"属性设置为"es" . 现在每当您引用"Resources.MyString"时,将返回该字符串的西班牙语版本(自动) . IOW,它遵循当前设置的"System.Threading.Thread.CurrentThread.CurrentUICulture" . 您需要(例如,当用户从您的GUI中单击他们想要的语言时),并且所有强类型资源(通常只是字符串)将自动采用新语言 .

    • 这是如何工作的?下面的段落是我曾经发送给我的客户的一段摘录 . 它应该足以帮助您入门(请注意,对于上面的示例,下面对"YourApp"的引用将更改为"TestApp"):

    “您应该调查”强类型“资源,而不是您处理事物的方式 . 还要调查附属程序集和”System.Threading.Thread.CurrentThread.CurrentUICulture“属性(还应该查看”CurrentCulture“属性)但这不会影响您的资源,这些资源总是由“CurrentUICulture”属性控制 . 请注意,“CurrentUICulture”属性通常设置为系统的当前语言(当您的应用程序启动时) . 当您访问任何资源时程序,例如“Resources.MyString”(这是一个你需要查看的强类型资源的例子),系统会根据它查找“MyString”“CurrentUICulture”属性 . 如果该属性当前设置为系统默认值(通常除非您在代码中更改它),那么您将从应用程序的主程序集中获取“MyString”的版本(默认语言资源存储在那里) . 如果将代码中的“CurrentUICulture”更改为“es”(对于西班牙语),则系统将在文件“es \ YourApp.resources.dll”中找到“MyString”(关闭程序的根文件夹) . 如果它没有找到它(如果你不支持西班牙语,文件夹可能不存在),或者更现实地说,“MyString”在该(西班牙语)DLL中根本没有翻译,那么它将回退到你的应用程序的主程序集,所以你将再次获得默认语言字符串 . 同样,这是短篇小说,但它涵盖了基本细节 . 它传统上被称为MSFT文档中的“中心和辐射”模型(虽然有时会使用其他术语),它依赖于前面提到的“后备”过程 . 例如,如果您将“System.Threading.Thread.CurrentThread.CurrentUICulture”设置为“es-AR”,这是阿根廷语中的西班牙语,那么程序将在“es-AR \ YourApp.resources”中查找“MyString” . DLL” . 如果没有找到(例如你不支持“es-AR”,所以没有这样的文件夹,或者字符串根本不存在),那么它将“回退”到“es”文件夹而是(已知)作为中立文化,在这种情况下,系统假定的普通西班牙语是下一个最好的东西) . 如果在那里找不到(在“es \ YourApp.resources.dll”中),那么系统将再次回退到主程序集中嵌入的默认语言字符串 . 研究所有这些,你会发现,与你现在的方式相比,处理你的琴弦是轻而易举的 . 所有内容都会自动处理,包括后备情况(只需调整“System.Threading.Thread.CurrentThread.CurrentUICulture”属性) - 所有对任何强类型资源的引用(如“Resources.MyString”)都会以任何语言出现 . 目前设置为) . 我希望有所帮助 .

相关问题