本地化使用 resx 文件生成 MissingManifestResourceException

3

这是我第一次尝试本地化,我读得越多,就越感到困惑。老实说,我现在只是在寻找答案。以下是我遇到的错误:

未处理的异常:System.Resources.MissingManifestResourceException:找不到适用于指定区域性或中性区域性的任何资源。请确保“MeetnGreetSf.Resources.AppResources.resources”在编译时已正确嵌入或链接到程序集“MeetnGreetSf”,或者所需的所有卫星程序集都可以加载并完全签名。

以下是类:

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个回答

2
请注意,我是Visual Studio商业本地化工具的作者(为了充分披露)。您应该调查“System.Threading.Thread.CurrentThread.CurrentUICulture”,这通常是.NET中所有翻译所围绕的内容(用于处理本地化资源)。但是,您处理它的方式可能会因项目类型而异。您现在正在处理的方式通常不是必需的。通常比那更容易(不需要专门的类)。例如,对于简单的控制台应用程序,以下是基本过程(同样,根据项目类型,事情可能会有所不同)。
  1. 创建一个名为“TestApp”的新控制台应用程序
  2. 打开项目属性(例如,在“解决方案资源管理器”中右键单击它并选择“属性”),然后在属性窗口中单击“资源”选项卡。现在单击屏幕中间的按钮,该按钮显示为“此项目不包含默认资源文件。单击此处以创建一个”。这将在您的解决方案中添加“Resources.resx”(位于“解决方案资源管理器”中的“属性”文件夹下),并自动在“.resx”编辑器中打开。
  3. 在“.resx”编辑器中添加一个名为“MyString”的字符串。将其分配为“This is my default string”(或其他内容)。
  4. 在您的代码中,您想要使用该字符串的位置添加一个“using TestApp.Properties”语句(请继续阅读)。您现在可以通过静态属性“Resources.MyString”访问该字符串。这在“Resources.Designer.cs”中声明,它是由VS在上述第2步中自动创建的“代码后备”文件(即,它是“解决方案资源管理器”中“Resources.resx”的子级)。VS会为您处理此文件(为您添加每个在上述第3步中添加的字符串的新静态属性到“TestApp.Properties”命名空间中)。请注意,这些字符串被称为“强类型资源”。
  5. 向项目添加新的“.resx”文件,并将其命名为“Resources.es.resx”。这将包含西班牙语中的字符串。创建后,将其拖动到“属性”文件夹中的“解决方案资源管理器”中(因此现在它与“Resources.resx”位于同一文件夹中 - 所有本地化的“.resx”文件必须与“Resources.resx”位于同一文件夹中)。
  6. 双击“Resources.es.resx”,并将“MyString”添加到其中。将其文本设置为“This is my Spanish string”。
  7. 当您想要更改代码中的语言以获取字符串的西班牙语版本时,只需将“System.Threading.Thread.CurrentThread.CurrentUICulture”属性设置为“es”。现在,每当您引用“Resources.MyString”时,该字符串的西班牙语版本将自动返回。换句话说,它遵循当前设置为“System.Threading.Thread.CurrentThread.CurrentUICulture”的内容。因此,通常会根据您的应用程序要求更改后者属性(例如,当用户从GUI中单击其所需的语言时),并且所有强类型资源(通常仅为字符串)将自动采用新语言。
  8. 这是如何工作的?下面的段落摘自我曾经发送给我的客户的某些内容。它足以让您开始(请注意,下面对“YourApp”的引用将针对上述示例更改为“TestApp”):
你应该研究"强类型化"资源,而不是你当前处理的方式。同时还需要研究卫星程序集和"System.Threading.Thread.CurrentThread.CurrentUICulture"属性(还有"CurrentCulture"属性,但它不会影响你的资源,因为资源总是由"CurrentUICulture"属性控制)。请注意,"CurrentUICulture"属性通常设置为系统的当前语言(当您的应用程序启动时)。当您访问您程序中的任何资源,例如"Resources.MyString"(这是一个强类型化资源的示例,您需要查看它),系统将根据"CurrentUICulture"属性查找"MyString"。如果该属性当前设置为系统默认值(通常情况下,除非您在代码中更改它),则您将从您应用程序的主程序集中获取"MyString"版本(默认语言资源存储在那里)。然而,如果您在代码中将"CurrentUICulture"更改为"es"(对于西班牙语),则系统将在文件"es\YourApp.resources.dll"(位于您程序的根文件夹下)中查找"MyString"。如果在那里找不到它(如果您不支持西班牙语,则该文件夹可能不存在),或更现实地说,"MyString" 在该(西班牙语)DLL 中没有翻译,那么它将回退到您应用程序的主程序集,因此您将再次获得默认语言字符串。这是简短的故事,但它涵盖了基本细节。在MSFT的文档中,它通常被称为"中心与分支"模型(虽然有时会使用其他术语),并依赖于前面提到的"回退"过程。例如,如果您将"System.Threading.Thread.CurrentThread.CurrentUICulture"设置为"es-AR",它是阿根廷西班牙语,则程序将在"es-AR\YourApp.resources.dll"中查找"MyString"。如果在那里没有找到它(例如你不支持"es-AR",因此没有这样的文件夹,或者该字符串根本不存在),那么它将"回退"到"es"文件夹(在这种情况下,被称为中立文化,只是普通的西班牙语,系统认为这是第二好的选择)。如果在那里找不到它(在"es\YourApp.resources.dll"中),则再次回退到嵌入在主程序集中的默认语言字符串。研究所有这些,您会发现处理您的字符串相比您现在的方式轻松得多。一切都会自动处理,包括回退情况(只需调整"System.Threading.Thread.CurrentThread.CurrentUICulture"属性-所有对任何强类型化资源的引用,如"Resources.MyString",都将显示为当前设置为的任何语言)。我希望这有所帮助。

感谢您的回复,它澄清了很多事情。这与Xamarin.Forms项目有关,我最终放弃了这种方法,选择修改他们的本地化示例并使用转换器。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接