2

我正在开发Visual Studio 2013(C#),并且正在寻找一种方法来使窗体语言的选择更容易进行本地化。Visual Studio设计器 - 限制属性网格以显示语言属性的某些特定语言

在您必须选择要“设计‘下的语言的可能性设计师→’语言”和Visual Studio通过创建必要的本地化文件,如果你需要一个新的本地化形式没有休息。

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

有谁知道一种方法来限制设计器选项中显示的语言达到期望的数量和选择?

回答

1

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

作为一种变通方法,你可以有一个包含BaseForm属性像FormLanguageLanguage财产get,返回值和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); 
    } 
} 

当您选择从FormLanguagefa-IR那么Language自动成为Persian的,因为这是我们在FormLanguage二传手写的代码。您可以在MyCultureInfoConverter中添加您需要的任何其他语言。

+0

当你从FormLanguage中选择'fa-IR'时,由于我们在'FormLanguage'的setter中编写的代码,'Language'自动变成'Persian'。您可以在'MyCultureInfoConverter'中添加任何您需要的语言。如果您对答案有任何疑问,请告知我们。 –

+0

非常感谢。这是一个很好的解决方法来限制选择。它似乎工作得很好。从一种语言切换到另一种语言效果良好,并且创建了正确的resx文件。我现在遇到的问题(但这可能是另一个问题)是,当我在设计器视图中保存更改时,Visual Studio将不再反应,我将不得不杀死它。但是这可能是一个设置问题。我会在接下来的几天观察它。 –

+0

不客气,我没有面对这样的问题。我会再检查一次。但是你也可以在一个新的干净的项目中检查行为并让我知道结果。 –