我可以在运行时在表单的标签控件之间切换不同的值集吗?

时间:2012-02-13 20:18:39

标签: .net winforms localization resources

我需要能够根据设置更改标签的文本(主要是标签,复选框......至少任何具有某种标签的东西)。这是必需的,因为使用该应用程序的各种客户在内部使用不同的术语。 因此,例如,如果我将文本标签(随附文本框)的值硬编码为“事件”,这可能对其他客户不起作用,因为他们想要使用“票证”或“服务电话”。

我想我可以在WinForms中使用本地化功能并创建某种亚文化(如果你考虑的话),比如en-us-cust1,en-us-cust2。与它们相关联的资源将包含标签文本的不同值,无论该术语如何变化。

另一个重要的事情是能够避免在程序集内编译这些资源。

注意:我继续搜索类似的问题,这个问题是相同的Implementation of industry specific resources。我还不知道那个答案是否令人满意,所以仍然欢迎任何回复。

4 个答案:

答案 0 :(得分:1)

您可以从Resource

加载标签文字

看一下这篇文章:http://www.codeproject.com/Articles/5447/NET-Localization-using-Resource-file

答案 1 :(得分:1)

也许创建一个Dictionary来存储您的“本地化”。

Dictionary<Control, string> myLocalization = new Dictionary<Control, string>();

保存并阅读如下:

BinaryFormatter serializer = new BinaryFormatter();
using (Stream streamout = File.Create(path)) serializer.Serialize(streamout, myLocalization);
using (Stream streamin = File.OpenRead(path)) myLocalization = (Dictionary<Control,string>)serializer.Deserialize(streamin);

并像这样使用它:

foreach (Control ctrl in myLocalization.Keys) ctrl.Text = myLocalization[ctrl];

你需要:

using System.Runtime.Serialization.Formatters.Binary;

答案 2 :(得分:1)

是的,你可以。你需要:

1.-通过创建不同的本地化文件来准备您的项目(我建议您查看this

2.-在运行时设置文化:

// C#
// Sets the UI culture to French (France).
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");

(上述代码摘自上述来源)

3.-实现一个帮助器(static)类,它将负责在需要时进行艰苦的工作,并在运行时通过访问表单的子控件(递归非常适合)在这里)并为每个人获得适当的文本。当然,并非Form上的所有控件都必须是用户语言敏感的,您的代码必须根据您正在检查的控件类型来决定是否从资源中获取已翻译的字符串。 / p>

4.-在描述中提到的控件名称中添加某种后缀,以便您可以使用该名称作为决定要使用的资源字符串的基础。

答案 3 :(得分:0)

以上所有尝试都没有完全回答我的问题。所以,我花了几天时间(我想避免)阅读.Net中的本地化,这就是我要做的事情。

我编写了一个小型控制台应用程序,允许我基于现有文档创建自定义文化并指定新的CultureName,CultureEnglishName,CultureNativeName并在Windows机器上注册它。这将是应用程序的设置步骤之一。

public static void Main(string[] args)
{
    string operation = args[0];
    string newCultureName = args[1];
    string sourceCultureName = args[2];
    string newCultureDescriptiveName = args[3];

    try
    {
        if (operation == "Register")
        {
            CultureAndRegionInfoBuilder crib = new CultureAndRegionInfoBuilder(newCultureName, CultureAndRegionModifiers.None);
            crib.LoadDataFromCultureInfo(new CultureInfo(sourceCultureName));
            crib.LoadDataFromRegionInfo(new RegionInfo(sourceCultureName));
            crib.CultureEnglishName = newCultureDescriptiveName;
            crib.CultureNativeName = newCultureDescriptiveName;
            crib.Register();
        }
        else if (operation == "Unregister")
        {
            CultureAndRegionInfoBuilder.Unregister(newCultureName);
        }
        else
            throw new ArgumentException("The only accepted values are: Register; Unregister", "operation");
    }
    catch (InvalidOperationException ex)
    {
        Console.WriteLine(ex.Message);
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine(ex.Message);
    }
    catch (Exception ex)
    {
        throw;
    }
}

我可以通过调用控制台应用程序来创建一个名为“en-CA-Company”的文化:

consoleapp Register "en-CA-Company", "en-CA", "English (Canada) Company"

需要设置描述性名称,因为CultureEnglishName,CultureNativeName属性与源文化中的属性相同,这会产生混淆,例如在Visual Studio中,您下拉本地化表单的语言列表并查看两个“英语(加拿大)”条目。我不知道VS使用哪一个属性来显示语言名称,所以我猜到了广泛使用英语和本地名称。

现在,由于我的自定义文化已在计算机上注册,因此当我启用本地化Language时,我可以在表单属性的Localizable = True字段中的Visual Studio中看到它。 enter image description here

当我选择新的自定义文化时,VS将创建一个单独的资源文件,其中包含我对任何标签所做的所有修改...同时选择了这种文化。

要获取此特定资源文件(及其中的字符串),我只需:

Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-CA-Company");

应用程序初始化时的某个地方。