在代码中动态创建用于本地化txt文件的资源文件

时间:2014-10-14 08:01:29

标签: wpf dynamic localization resourcedictionary

我的应用程序必须是多语言的,所以我创建了一些资源文件,其中包含文本,例如:

texts.resx
texts.en.resx
texts.fr.resx

到目前为止一切正常。

但是有些文本是使用外部工具生成的。我最终得到一个普通的文本文件(* .txt),它保存着这样的字符串:

key|language1|language2|language3

所以我需要做的是在开始时读取该文件并生成相应的资源文件。

到目前为止我做了什么:

使用StreamReader阅读文件并使用键和语言填充列表

line = reader.ReadLine();
char[] delimiterChars = { '|' };
string[] parts = line.Split(delimiterChars);
keyList.Add(parts[0]);
language1List.Add(parts[1]);
language2List.Add(parts[2]);

生成资源文件:

using (ResXResourceWriter resx = new ResXResourceWriter("test.resx"))
{
    for (int i = 0; i < keyList.Count; i++)
    {
        resx.AddResource(keyList[i], language1List[i]);
    }
}
using (ResXResourceWriter resx = new ResXResourceWriter("test.en.resx"))
{
    for (int i = 0; i < keyList.Count; i++)
    {
        resx.AddResource(keyList[i], language2List[i]);
    }
}

从资源文件中获取字符串:

using (ResXResourceSet resxSet = new ResXResourceSet("test.resx"))
{
    Text = resxSet.GetString(keyList[0]);
}

一切正常。

问题

  1. 我该如何更改语言?如果我设置文化,程序“神奇地”采取正确的资源文件,但不是正确的生成文件。当我将其更改为("text.en.resx")时,它显然有效。
  2. 如何从视图中访问字符串?在设计时,资源文件不存在,所以我收到错误。

2 个答案:

答案 0 :(得分:0)

我认为你并不了解本地化的过程......

答案1: 当您在控制面板中更改计算机上的语言时,程序将尝试在您的bin中查找具有所选语言名称的文件夹(&#34; en&#34;为英语),该文件夹应包含.satellite.dll文件(这些文件是选择正确的语言时将加载的文件)。它们是使用英语资源字符串生成的。

答案2:

public class LocalizedStrings
{
        private static MyProjResources resource = new MyProjResources();

        public MyProjResources Resources
        {
            get
            {
                return resource;
            }
        }
}

你可以像访问

一样访问它
<UserControl.Resources>
        <localization:LocalizedStrings x:Key="LocalizedStrings" />
</UserControl.Resources>
<Button Content="{Binding Path=Resources.MyProj_EXPORT_PDF, Source={StaticResource LocalizedStrings}}" Height="Auto" Width="200" "></Button>

你应该考虑在这个问题上多读一点。

答案 1 :(得分:0)

我想我得到了一个解决方案: 生成资源文件:

IResourceWriter writer = new ResourceWriter("test.resx");
for (int i = 0; i < keyList.Count; i++)
{
    writer.AddResource(keyList[i], language1List[i]);
}
IResourceWriter writer = new ResourceWriter("test.en.resx");
for (int i = 0; i < keyList.Count; i++)
{
    writer.AddResource(keyList[i], language2List[i]);
}

这会创建*.resources而不是*.resx个文件。他们可以这样读:

ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("test", location, null);
Text = rm.GetString("foo");

取决于设置的文化,ResourceManager读取正确的文件并获取正确的文本。