Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 三层特定于区域性的资源文件_C#_.net_Resx - Fatal编程技术网

C# 三层特定于区域性的资源文件

C# 三层特定于区域性的资源文件,c#,.net,resx,C#,.net,Resx,我需要一种方法来使用特定于区域性的资源文件的第三个“层”。这可能是以它应该的方式完成的,并且可能以某种方式被黑客攻击。只要黑客不是太大,没关系!另一种解决方案也是可能的(如果我处理问题的方法不对,请告诉我更好的解决方案) 通常情况下,您有一个默认的资源文件,该文件作为备用文件。除此之外,您还可以为一种语言提供特定于区域性的资源。现在我想要的是一个特定于“主题”的资源 问题是,我们有几个网站都有不同的主题(马、车、rc单位等),当我们使用本地化资源文件中的字符串时,如果资源还没有翻译成特定的语言,

我需要一种方法来使用特定于区域性的资源文件的第三个“层”。这可能是以它应该的方式完成的,并且可能以某种方式被黑客攻击。只要黑客不是太大,没关系!另一种解决方案也是可能的(如果我处理问题的方法不对,请告诉我更好的解决方案)

通常情况下,您有一个默认的资源文件,该文件作为备用文件。除此之外,您还可以为一种语言提供特定于区域性的资源。现在我想要的是一个特定于“主题”的资源

问题是,我们有几个网站都有不同的主题(马、车、rc单位等),当我们使用本地化资源文件中的字符串时,如果资源还没有翻译成特定的语言,它会退回到默认语言英语。酷

一个问题示例:我们有“添加您的马”和“添加您的车”这两个短语,它在英语中可能看起来相同(当涉及语法时),但在波兰语或罗马尼亚语中不一定如此

所以我想,如果可能的话,我们应该有一个英文文件,上面写着“addyour{0}”,然后是一个波兰语文件,上面写着波兰语的对等句子,再加上一个“Car”特定的波兰语翻译,语法适合“Car”这个词,还有一个“Horse”特定的波兰语翻译,语法适合“Horse”这个词

在两种或三种语言中有两种或三种主题,问题可能不会那么糟糕。我们很容易想到,我们可以在处理这几个案例的代码中进行切换。问题是,我们有15个主题,用6种不同的语言,并且正在扩展

希望有一些整洁的黑客或一些很少使用的异国情调的功能知识


提前感谢

我不是为您的问题指出解决方案,但是我对您的字符串格式有一个顾虑:

您的示例中的一个问题是使用带翻译的String.Format

在某些语言中,“添加{0}”部分将根据插入{0}部分的内容要求使用不同的措辞

例如:

“加上你的马”将被翻译成丹麦语,变成“Tilføj din hest”,而“加上你的驴”将被翻译成“Tilføj ditæsel”。 因此,正如您所看到的,有一个区别:din/dit不能从“添加您的{0}”正确地进行翻译。 其他语言如德语也是如此


编辑: 伪答案可能类似于: 为每个主题向每个resx文件添加更多字符串(带有AddYourItemHorse、AddYourItemRacecar和addYourItem驴等标识符)。或者创建资源文件,如PageName.Racecar.da-DK.resx,其中包含赛车主题的资源,等等。 然后,根据代码区域、主题和当前文化,执行以下操作:

Dictionary<string, string> resourceDictionary = new Dictionary<string, string>();
private void fillDictionary(string path)
{
    using (ResXResourceReader rxrr = new ResXResourceReader(path))
    {
        foreach (DictionaryEntry entry in rxrr)
        {
            //Fill the fillDictionary
        }
    }
}
或者,您可以拥有资源文件pr.area、语言和主题,如: MainForm.Racecar.da-DK.resx,然后构建传递给fillDictionary的路径,如下所示:

string languageCode = Thread.CurrentThread.CurrentCulture.Name;
string path = "MainForm." + theme + "." + llanguageCode + ".resx";
并将路径传递给fillDictionary方法

请注意,上面的代码没有经过测试。我刚从心头把它写在这里。但它应该为您指明一个可能(不一定是最优)解决方案的方向


您可以在此处阅读有关ResXResourceReader的更多信息:

这听起来太复杂,很容易变得难以管理。为什么不坚持标准方法,将“添加你的车”和“添加你的马”作为两个完全独立的字符串?然后我还需要:*添加你的rc单元*添加你的拖拉机*添加你的猫*添加你的狗*添加你的corvette三个字符串为德语,十个字符串为丹麦语,三个字符串为法语,最后一个字符串为罗马尼亚语,西班牙语,波兰人和奥地利人。我们还计划进一步扩展(目前有四个新站点排队)假设您愿意解决具体词语(如ThoBa在回答中提到的)带来的性别/衰退/等差异,您的具体示例可能会起作用:即,您需要一个更通用的模板,而不是“添加您的{0}”,如“添加您的[女性]{0}”,“添加您的[阳性]{0}“等等,完全依赖于语言——正如我所说,这将很快成为一场噩梦。字符串应该尽可能地简单和容易翻译——翻译人员的时间通常比开发人员花在解决本地化问题和实现粗制滥造的解决方案上的时间要便宜。这就是问题所在。因此,每个项目都有特定的字符串,因为“æsel”和“hest”都以丹麦语获取各自的资源文件。有些语言的语法甚至比丹麦语差!事实上,这并不全是坏事!你让我意识到一些解决问题的新方法!与您刚才描述的非常接近;)听到这个消息我很高兴!请确保为具有相同问题的其他人说明您的解决方案。我们将编写一个自定义类,用于处理资源文件并合并它们,并在应用程序加载时将它们保存在内存中。这似乎是最合适的方法。我只是希望它能得到某种程度上的支持,而不必对它进行破解:)谢谢你的投入,绝对值得!
string languageCode = Thread.CurrentThread.CurrentCulture.Name;
string path = "MainForm." + theme + "." + llanguageCode + ".resx";