2

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

通常你有一个默认资源文件,它作为一个后备。最重要的是,您可以拥有一种语言的文化特定资源。现在我想要的是一个“主题”特定的资源。

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

一个问题示例:我们有短语“Add your horse”和“Add your car”,在英语中可能看起来相同(在语法方面),但在波兰语或罗马尼亚语中不一定如此!

所以我在想,如果可能的话,我们应该有一个带有“添加你的{0}”的英文文件,然后是一个带有波兰语等效句子的波兰语文件,除此之外还有一个“汽车”特定的波兰语翻译,其中的语法适合单词“Car”和“Horse”特定波兰语翻译,其中语法适合单词“Horse”。

使用两种或三种语言的两个或三个主题可能不会那么糟糕。很容易认为我们可以在处理这少数情况的代码中进行切换。问题是,我们有 15 个主题,使用 6 种不同的语言,并且还在不断扩展。

希望有一些巧妙的技巧或一些很少使用的奇异功能的知识!

提前致谢

4

1 回答 1

2

我没有为您的问题指出解决方案,但是我担心您的字符串格式:

您的示例的一个问题是使用 String.Format 进行翻译。

在某些语言中,“添加您的 {0}”部分将需要不同的措辞,具体取决于将插入 {0} 部分的内容。

一个例子:

“Add you horse”将翻译成丹麦语,变成“Tilføj din hest”,而“Add your donkey”将翻译成“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-method。

请注意,上述代码未经测试。我只是从我的脑海中写到这里。但它应该为您指明可能的(不一定是最佳的)解决方案的方向。

您可以在此处阅读有关 ResXResourceReader 的更多信息:Working with .resx Files Programmatically

于 2013-08-07T14:10:46.380 回答