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

时间:2017-03-29 17:35:32

标签: c# localization xamarin.forms resx

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

  

未处理的异常: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 个答案:

答案 0 :(得分:1)

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

  1. 创建一个名为&#34; TestApp&#34;
  2. 的新控制台应用
  3. 打开项目的属性(例如,在解决方案资源管理器中右键单击它,然后选择&#34;属性&#34;),然后单击&#34;资源&#34;属性窗口中的选项卡。现在单击屏幕中间显示的按钮&#34;此项目不包含默认资源文件。点击这里创建一个&#34;。这将添加&#34; Resources.resx&#34;到您的解决方案(在解决方案资源管理器中的&#34;属性&#34;文件夹下),它将自动在&#34; .resx&#34;编辑器。
  4. 添加一个名为&#34; MyString&#34;的字符串。在&#34; .resx&#34;编辑。分配它&#34;这是我的默认字符串&#34; (或其他)。
  5. 在您要使用字符串的代码中,使用TestApp.Properties&#34;添加&#34;声明(继续阅读)。您现在可以通过静态属性&#34; Resources.MyString&#34;来访问该字符串。这在&#34; Resources.Designer.cs&#34;中声明。这是一个&#34;代码隐藏&#34; VS在上面的步骤2中自动创建的文件(即,它是#34; Resources.resx&#34;在解决方案资源管理器中的子项)。 VS为您管理此文件(为上面3中添加的每个字符串的&#34; TestApp.Properties&#34;名称空间添加新的静态属性)。请注意,这些字符串被称为&#34;强类型资源&#34;。
  6. 添加新的&#34; .resx&#34;将文件发送到您的项目并调用它&#34; Resources.es.resx&#34;。这将包含西班牙语字符串。创建后,将其在解决方案资源管理器中拖到&#34;属性&#34;文件夹(因此它现在与&#34; Resources.resx&#34;在同一文件夹中; - 所有本地化的&#34; .resx&#34;文件必须与&#34;资源相同的文件夹。 RESX&#34)
  7. 双击&#34; Resources.es.resx&#34;并添加&#34; MyString&#34;它。将其文本设置为&#34;这是我的西班牙语字符串&#34;。
  8. 如果要更改代码中的语言以获取字符串的西班牙语版本,只需设置&#34; System.Threading.Thread.CurrentThread.CurrentUICulture&#34;您的代码中的属性为&#34; es&#34;。现在每当您引用&#34; Resources.MyString&#34;时,将返回该字符串的西班牙语版本(自动)。 IOW,它遵循&#34; System.Threading.Thread.CurrentThread.CurrentUICulture&#34;目前设置为。因此,您通常会根据应用程序的要求更改后一个属性(例如,当用户从GUI中单击所需的语言时),并且所有强类型资源(通常仅字符串)将自动采用新语言。
  9. 这是如何工作的?下面的段落是我曾经发送给我的客户的一段摘录。它应该足以帮助您入门(请注意,对于&#34; YourApp&#34;下面的引用将更改为&#34; TestApp&#34;对于上面的示例):
  10.   

    &#34;你应该调查&#34;强烈输入&#34;资源而不是   你处理事情的方式。还研究卫星组件和   &#34; System.Threading.Thread.CurrentThread.CurrentUICulture&#34;属性   (还有#34; CurrentCulture&#34;你应该看的属性,但是   这并不会影响您的资源,而这些资源总是受到资源的控制   &#34;的CurrentUICulture&#34;属性)。请注意&#34; CurrentUICulture&#34;   属性通常设置为系统的当前语言(当你的   应用程序开始)。当您访问程序中的任何资源时,例如   &#34; Resources.MyString&#34; (这是一个强类型的例子   系统将寻找您需要查看的资源   &#34; MyString的&#34;基于&#34; CurrentUICulture&#34;属性。如果那个属性   当前设置为系统默认值(通常是除非   你在代码中改变它,然后你将获得&#34; MyString&#34;的版本。背部   来自您应用程序的主程序集(默认语言资源是   存储在那里)。如果你改变&#34; CurrentUICulture&#34;代码中的&#34; es&#34;   然而(对于西班牙语),那么系统将寻找&#34; MyString&#34;在里面   file&#34; es \ YourApp.resources.dll&#34; (关闭你的程序的根文件夹)。   如果它在那里找不到(如果你没有,那么该文件夹可能不存在   支持西班牙语),或更现实地说,&#34; MyString&#34;根本没有   在该(西班牙语)DLL中翻译,然后它将回退到您的应用程序   主程序集,因此您将再次获取默认语言字符串。   同样,这是短篇小说,但它涵盖了基本细节。它&#39; S   传统上被称为&#34; hub and spoke&#34; MSFT中的模型   文档(虽然有时使用其他术语),它依赖   关于&#34;后备&#34;前面提到的过程。例如,如果你设置   &#34; System.Threading.Thread.CurrentThread.CurrentUICulture&#34;到&#34; es-AR&#34;   这是阿根廷语中的西班牙语,然后该程序将会看起来   为&#34; MyString&#34;在&#34; es-AR \ YourApp.resources.dll&#34;。如果没有找到那里   (你不支持&#34; es-AR&#34;例如,所以没有这样的文件夹,   或者字符串根本就不存在),那么它将会回落&#34;到了   &#34; ES&#34;相反的文件夹(称为中性文化,在这种情况下只是   系统假设的普通西班牙语是下一个最好的东西)。如果不   在那里(在&#34; es \ YourApp.resources.dll&#34;),然后再次,系统   将回退到主要中嵌入的默认语言字符串   部件。研究这一切,你会发现处理你的   与你现在的方式相比,字符串是轻而易举的。一切   为您自动处理包括后备情况   (只需调整   &#34; System.Threading.Thread.CurrentThread.CurrentUICulture&#34;财产 -   所有对强类型资源的引用,例如   &#34; Resources.MyString&#34;然后会以任何语言出现   属性目前设置为)。我希望有所帮助。