我需要一种方法来使用文化特定资源文件的第三“层”。这可能会以应有的方式完成,并且可能会以某种方式被黑客攻击。只要黑客攻击不是太大,就可以了!另一种解决方案也是可能的(如果我处理问题的方法错误,请告诉更好的解决方案)。
通常您有一个默认资源文件,它可以作为后备资源。最重要的是,您可以拥有针对某种语言的文化特定资源。现在我想要的是“主题”特定资源。
问题是,我们有几个具有不同主题(马、汽车、遥控装置等)的网站,并且当我们使用本地化资源文件中的字符串(如果资源未翻译为特定语言)时然而,它会回退到默认语言英语。酷!
一个问题示例:我们有短语“添加你的马”和“添加你的车”,在英语中它可能看起来相同(在语法方面),但在波兰语或罗马尼亚语中却不一定如此!
所以我认为,如果可能的话,我们应该有一个包含“添加您的 {0}”的英文文件,然后是一个带有波兰语等效句子的波兰语文件,最重要的是“汽车”特定的波兰语翻译其中语法适合单词“Car”,而“Horse”特定波兰语翻译则适合单词“Horse”。
对于两种或三种语言的两个或三个主题,问题可能不会那么严重。人们很容易认为我们可以在处理这几种情况的代码中进行切换。事实是,我们有 15 个主题,采用 6 种不同的语言,并且还在不断扩展。
希望获得一些巧妙的技巧或了解一些很少使用的奇异功能!
提前致谢
最佳答案
我并不是为您的问题指出解决方案,但是我对您的字符串格式感到担忧:
您的示例的一个问题是使用 String.Format 进行翻译。
在某些语言中,“添加您的 {0}”部分需要不同的措辞,具体取决于要插入到 {0} 部分中的内容。
一个例子:
“添加你的马”将翻译成丹麦语,变成“Tilføj din hest”,而“添加你的驴”将翻译成“Tilføj dit æsel”。 正如您所看到的,有一个区别:din/dit 无法从“添加您的 {0}”中正确翻译。 对于德语等其他语言也是如此。
编辑: 伪答案可能是这样的: 为每个主题向每个 resx 文件添加更多字符串(带有 AddYourItemHorse、AddYourItemRacecar 和 AddYourItemDonkey 等标识符)。或者创建资源文件,例如 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
}
}
}
然后通过将所需内容与代表主题的字符串连接起来来访问字典中的字符串:
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 方法。
请注意,以上代码未经测试。我刚刚从心里写下来。但它应该为您指明可能(不一定是最佳)解决方案的方向。
您可以在此处阅读有关 ResXResourceReader 的更多信息:Working with .resx Files Programmatically
关于c# - 三层文化特定资源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18105370/