我在资源文件(resx)中存储了一组值,并将值命名为:
Form.Option.Value1 | Car
Form.Option.Value2 | Lorry
Form.Option.Value3 | Bus
Form.Option.Value4 | Train
如果有一种方法可以让System.Resources.ResourceManager类一次性检索所有这些值。我正在寻找一种get by prefix方法:
ResourceManager manager ...
IEnumerable<string> values = manager.GetStringsByPrefix("Form.Option");
这样做的原因是我们有一个带有下拉列表的表单,其中值可能需要根据文化而改变。
还可以将字符串值作为键值对返回,这样我就可以得到资源的名称及其值,例如:
IEnumerable<KeyValuePair<string,string>> values = manager.GetPairWithPrefix("Form.Options")
答案 0 :(得分:2)
您可以使用GetResourceSet method枚举ResourceManager中特定语言的所有字符串。
答案 1 :(得分:1)
如果您使用Visual Studio / .NET Framework中内置的本地化功能来本地化您的表单(包括组合框列表),则会生成如下代码:
在Form1.de.resx中找到:
<data name="comboBox1.Items" xml:space="preserve">
<value>Auto</value>
</data>
<data name="comboBox1.Items1" xml:space="preserve">
<value>Bahn</value>
</data>
在Form1.resx中找到:
<data name="comboBox1.Items" xml:space="preserve">
<value>Car</value>
</data>
<data name="comboBox1.Items1" xml:space="preserve">
<value>Train</value>
</data>
它加载它们(在Initializecomponent中的Form1.Designer.cs中找到):
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
resources.ApplyResources(this.comboBox1, "comboBox1");
this.comboBox1.FormattingEnabled = true;
this.comboBox1.Items.AddRange(new object[] {
resources.GetString("comboBox1.Items"),
resources.GetString("comboBox1.Items1")});
this.comboBox1.Name = "comboBox1";
它可能不是您要求的答案,但作为.NET的创建者提出的完全相同问题的解决方案,我怀疑它会引起人们的兴趣。
如果要使用.NET / VS本机本地化,只需设置表单的Language属性,然后通过IDE更新所有字符串。当您切换回(默认)时,将恢复原始字符串。这两种语言都将在特定语言的resx文件中被记住。
答案 2 :(得分:1)
您应该重新考虑这种格式。像
Form.Option.Value = Car;Lorry;Bus;...
答案 3 :(得分:1)
感谢您的回复,我通过对ResourceManager进行子类化并添加新方法来解决这个问题:
public class ResourceManager : System.Resources.ResourceManager
{
public ResourceManager(Type resourceSource)
: base(resourceSource)
{
}
public IEnumerable<string> GetStringsByPrefix(string prefix)
{
return GetStringsByPrefix(prefix, null);
}
public IEnumerable<string> GetStringsByPrefix(string prefix, CultureInfo culture)
{
if (prefix == null)
throw new ArgumentNullException("prefix");
if (culture == null)
culture = CultureInfo.CurrentUICulture;
var resourceSet = this.InternalGetResourceSet(culture, true, true);
IDictionaryEnumerator enumerator = resourceSet.GetEnumerator();
List<string> results = new List<string>();
while (enumerator.MoveNext())
{
string key = (string)enumerator.Key;
if (key.StartsWith(prefix))
{
results.Add((string)enumerator.Value);
}
}
return results;
}
}
答案 4 :(得分:0)
尽管用于编辑resx文件的IDE不支持它,但您可以将字符串数组(我怀疑任何可序列化的类)添加到resx文件中:
string outPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
outPath = System.IO.Path.Combine(outPath, "MyResources.resx");
using (System.Resources.ResXResourceWriter rw = new System.Resources.ResXResourceWriter(outPath))
{
rw.AddResource("ComboBox1Values", new string[] { "Car", "Train" });
rw.Generate();
rw.Close();
}
在输出文件中,您会看到如下内容:
<data name="ComboBox1Values" mimetype="application/x-microsoft.net.object.binary.base64">
<value>AAEAAAD/////AQAAAAAAAAARAQAAAAIAAAAGAgAAAANDYXIGAwAAAAVUcmFpbgs=</value>
</data>