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

C# Visual Studio Designer-限制属性网格以显示语言属性的某些特定语言,c#,winforms,visual-studio,localization,windows-forms-designer,C#,Winforms,Visual Studio,Localization,Windows Forms Designer,我正在Visual Studio 2013 C中开发,正在寻找一种方法,使windows窗体的语言选择更易于本地化 在designer中,您可以在Design下选择所需的语言→如果您需要新的本地化表单,则Language和Visual Studio通过创建必要的本地化文件来完成其余工作 问题是:目前我只使用两种不同的语言,每次在这些本地化表单之间切换时,都会显示一个所有可能语言的列表,错误的单击可能会导致visual studio创建我不想要的语言的本地化版本,这很烦人,并且会使项目中的文件变得

我正在Visual Studio 2013 C中开发,正在寻找一种方法,使windows窗体的语言选择更易于本地化

在designer中,您可以在Design下选择所需的语言→如果您需要新的本地化表单,则Language和Visual Studio通过创建必要的本地化文件来完成其余工作

问题是:目前我只使用两种不同的语言,每次在这些本地化表单之间切换时,都会显示一个所有可能语言的列表,错误的单击可能会导致visual studio创建我不想要的语言的本地化版本,这很烦人,并且会使项目中的文件变得混乱


有人知道如何将设计器选项中显示的语言限制在所需的数量和选择范围内吗?

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

作为一种解决方法,您可以使用包含类似FormLanguage的属性的BaseForm,并在get中返回Language属性的值,在set中设置Language属性的值。然后从此基窗体继承所有窗体。这样,更改FormLanguage属性就足够了

还要为CultureInfo创建一个自定义类型转换器,它只显示您想要的文化,然后要更改语言,只需更改FormLanguage属性即可

以下是我用作变通方法的代码。别忘了从这个基类继承表单


当您从FormLanguage中选择fa IR时,由于我们在FormLanguage的setter中编写的代码,该语言将自动变成波斯语。您可以在MyCultureInfo Converter中添加所需的任何其他语言。

当您从FormLanguage中选择fa IR时,由于我们在FormLanguage的setter中编写的代码,该语言将自动成为波斯语。您可以在MyCultureInfo Converter中添加所需的任何其他语言。如果你对答案有任何疑问,请告诉我。非常感谢。这是限制选择的一个很好的解决方法。而且它似乎工作得很好。从一种语言切换到另一种语言效果很好,并且创建了正确的resx文件。我现在有一个问题,但这可能是另一个问题,当我在designer视图中保存对的更改时,VisualStudio将不再响应,我将不得不终止它。但这可能是一个设置问题。我将在接下来的几天观察它。不客气,我没有遇到这样的问题。我会再检查一遍。但是你也检查了一个新的干净项目中的行为,并让我知道结果。
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);
    }
}