Visual Studio Designer - 限制属性网格以显示Language属性的某些特定语言

时间:2016-04-29 07:28:32

标签: c# winforms visual-studio localization windows-forms-designer

我正在使用Visual Studio 2013(C#)进行开发,并且正在寻找一种方法来为Windows窗体选择语言更容易进行本地化。

在设计器中,您可以在“设计”→“语言”下选择所需的语言,Visual Studio通过创建必要的本地化文件来完成剩下的工作如果您需要新的本地化表格。

问题是:目前我只使用两种不同的语言,每当我在这些本地化表单之间切换时,它会向我显示所有可能语言的列表,其中错误的单击可能会导致visual studio创建本地化版本的语言我不想要,这只是令人讨厌,并且项目中包含更多文件。

有没有人知道如何将设计师选项中显示的语言限制为所需的数量和选择?

1 个答案:

答案 0 :(得分:2)

语言属性是仅限设计时的属性,不属于Form类。它是使用扩展程序提供程序添加到表单设计时的扩展属性。它的类型为CultureInfo,并使用TypeConverter显示所有可用的文化。

作为一种变通方法,您可以让BaseForm包含FormLanguageget之类的属性,Language属性的返回值以及set },设置Language属性的值。然后从此BaseForm继承所有表单。这样,它就足以改变FormLanguage属性。

同时为CultureInfo创建一个自定义类型转换器,只显示您想要的文化,然后更改语言,它足以更改FormLanguage属性。

Localization Language

以下是我用作解决方法的代码。不要忘记从BaseClass继承您的表单。

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;
public partial class BaseForm : Form
{
    [TypeConverter(typeof(MyCultureInfoConverter))]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public CultureInfo FormLanguage
    {
        get
        {
            return TypeDescriptor.GetProperties(this)["Language"]
                .GetValue(this) as CultureInfo;
        }
        set
        {
            TypeDescriptor.GetProperties(this)["Language"].SetValue(this, value);
        }
    }
}
public class MyCultureInfoConverter : CultureInfoConverter
{
    public override StandardValuesCollection 
        GetStandardValues(ITypeDescriptorContext context)
    {
        var values = CultureInfo.GetCultures(CultureTypes.SpecificCultures | 
            CultureTypes.NeutralCultures)
            .Where(x => x.Name == "fa-IR" || x.Name == "en-US").ToList();
        values.Insert(0, CultureInfo.InvariantCulture);
        return new StandardValuesCollection(values);
    }
}

当您从fa-IR选择FormLanguage时,由于我们在Language的设置者中编写的代码,Persian会自动变为FormLanguage。您可以在MyCultureInfoConverter

中添加所需的任何其他语言