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

本文关键字:区域性 资源 源文件 三层 | 更新日期: 2023-09-27 18:26:41

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

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

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

一个问题示例:我们有一个短语"Add your horse"answers"Add your car",在英语中可能看起来是一样的(当涉及到语法时),但在波兰语或罗马尼亚语中不一定是这样!

因此,我认为,如果可能的话,我们应该有一个英文文件,上面写着"Add your{0}",然后是一个波兰语文件,里面有等效的波兰语句子,再加上一个"Car"特定的波兰文翻译,语法适合"Car(汽车)"一词,还有一个"Horse(马)"特定的波兰文翻译,文法适合"Horse"一词。

用两三种语言表达两三个主题,问题可能不会那么严重。我们很容易想到,我们可以在处理这些少数情况的代码中进行切换。问题是,我们有15个主题,用6种不同的语言,并且正在扩展。

希望得到一些巧妙的技巧或了解一些很少使用的异国特色!

提前感谢

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

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

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

在某些语言中,"添加您的{0}"部分将根据插入{0}部分的内容要求不同的单词。

一个例子:

"加上你的马",翻译成丹麦语,将变成"Tilføj din hest",而"加你的驴"将翻译成"Tilföj ditæsel"。因此,正如您所看到的,有一个区别:从"添加您的{0}"中无法正确翻译的din/dit。其他语言也是如此,比如德语。


编辑:伪答案可能是这样的:为每个主题向每个resx文件添加更多字符串(使用AddYourItemHorse、AddYourItemsRacecar和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.area,语言和主题,如:MainForm.Racecar.da-DK.resx,然后构建传递给fillDictionary的路径,如下所示:

string languageCode = Thread.CurrentThread.CurrentCulture.Name;
string path = "MainForm." + theme + "." + llanguageCode + ".resx";

并将路径传递给fillDictionary方法。

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

您可以在此处阅读更多关于ResXResourceReader的信息:以编程方式使用.resx文件