我需要一种方法来使用特定于文化的资源文件的第三个“层”。这可能是以应有的方式完成的,并且可能以某种方式被黑客入侵。而且只要黑客不是太大,就没关系!另一种解决方案也是可能的(如果我正在解决问题,请告诉更好的解决方案)。
通常您有一个默认资源文件,它可用作后备。最重要的是,您可以拥有语言的特定于文化的资源。现在我想要的是一个'主题'特定资源。
问题是我们有几个网站都有不同的主题(马,汽车,遥控单位等),当我们使用本地化资源文件中的字符串时,如果资源没有以特定语言翻译然而,它将回归到英语,这是默认语言。酷!
一个问题的例子:我们用“添加你的马”和“添加你的汽车”这个短语在英语中看起来可能是相同的(当涉及语法时),但波兰语或罗马尼亚语的情况不一定如此! / p>
所以我认为,如果可能的话,我们应该有一个带有“添加你的{0}”的英文文件,然后是一个波兰文件,其中包含波兰语中的等效句子,最重要的是“Car”特定的波兰语翻译语法适用于单词“Car”和“Horse”特定的波兰语翻译,其中语法适用于“Horse”这个词。
在两种或三种语言中,两个或三个主题的问题可能不是那么糟糕。很容易认为我们可以在处理这几种情况的代码中进行切换。事实上,我们有15种主题,有6种不同的语言,并且正在扩展。
希望获得一些整洁的黑客或知道一些很少使用的异国情调!
提前致谢
答案 0 :(得分:2)
我没有为您的问题指出解决方案,但我对您的字符串格式有疑虑:
您的示例的一个问题是使用带翻译的String.Format。
在某些语言中,“添加{0}”部分将根据插入{0}部分的内容来要求不同的措辞。
一个例子:
“添加你的马”意志,翻译成丹麦语,成为“Tilføjdinhest”,而“添加你的驴”将翻译成“Tilføjditésel”。 因此,您可以看到存在差异:din / dit无法从“添加您的{0}”正确翻译。 其他语言也是如此,例如德语。
编辑: 伪答案可能是这样的: 为每个主题添加更多字符串到每个resx文件(带有AddYourItemHorse,AddYourItemRacecar和AddYourItemDonkey等标识符)。或者创建像PageName.Racecar.da-DK.resx这样的资源文件,其中包含racecar-theme的资源,依此类推。 然后,根据代码区域,主题和当前文化,执行以下操作:
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
}
}
}
然后通过将您想要的内容与表示主题的字符串连接来访问字典中的字符串:
string theme = "Racecar";
Label testLabel = new Label();
testLabel.Text = resourceDictionary[AddYourItem + theme];
或者你可以拥有资源文件pr。区域,语言和主题如: MainForm.Racecar.da-DK.resx然后构建传递给fillDictionary的路径,如下所示:
string languageCode = Thread.CurrentThread.CurrentCulture.Name;
string path = "MainForm." + theme + "." + llanguageCode + ".resx";
将路径传递给fillDictionary-method。
请注意,上述代码未经过测试。我刚刚从头脑中写到这里。但它应该指向一个可能的(不一定是最优的)解决方案。
您可以在此处阅读有关ResXResourceReader的更多信息:Working with .resx Files Programmatically