Winforms:默认启用本地化(强制执行项目/解决方案策略)

时间:2010-03-19 08:53:04

标签: winforms visual-studio-2008 .net-3.5 localization policy

是否有一种简单的方法可以为新创建的用户控件/表单将Localizable属性设置为true?理想情况下,设置的范围应该是解决方案或项目。

换句话说,我想说这个项目/解决方案应该是可本地化的,然后如果我添加一个新表单或控件VS应该自动将该属性设置为true。

修改:

尽管可以使用自定义模板,但在较大的团队中,可能并不总是使用它们。因此,它更多地是关于实施策略,确保团队成员不要忽略为项目/解决方案设置属性,其中所有包含文本资源的表单/控件都应该是可本地化的。

注意: Team Foundation Server不是选项。

2 个答案:

答案 0 :(得分:2)

不确定是否值得为易于更改的属性而努力,并且很容易看到它具有错误的值。但您可以创建自己的项目模板。

例如:Project + Add User Control。将其Localizable属性设置为True。文件+导出模板,选择项目模板。下一个。检查您添加的控件。下一个。检查所有引用,只省略您不需要的引用。下一个。给它好的模板名称(例如:“Localizable User Control”)。

现在,您将拥有一个项目模板,可用于具有该属性集的未来项目。根据需要对其他项目模板重复,例如表单。

答案 1 :(得分:2)

可以编写一个使用反射来确定表单/用户控件是否已标记为可本地化的单元测试。具体来说,如果某个类型已标记为可本地化,则会有一个与该类型相关联的嵌入式资源文件,该文件将包含“>> $ this.Name”值。这是一些示例代码:

    private void CheckLocalizability()
    {
        try
        {
            Assembly activeAssembly = Assembly.GetAssembly(this.GetType());
            Type[] types = activeAssembly.GetTypes();
            foreach (Type type in types)
            {
                if (TypeIsInheritedFrom(type, "UserControl") || TypeIsInheritedFrom(type, "Form"))
                {
                    bool localizable = false;
                    System.IO.Stream resourceStream = activeAssembly.GetManifestResourceStream(string.Format("{0}.resources", type.FullName));
                    if (resourceStream != null)
                    {
                        System.Resources.ResourceReader resourceReader = new System.Resources.ResourceReader(resourceStream);
                        foreach (DictionaryEntry dictionaryEntry in resourceReader)
                        {
                            if (dictionaryEntry.Key.ToString().Equals(">>$this.Name", StringComparison.InvariantCultureIgnoreCase))
                            {
                                localizable = true;
                                break;
                            }
                        }
                    }
                    if (!localizable)
                    {
                        Debug.Assert(false, string.Format("{0} is not marked localizable.", type.FullName));
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Debug.Assert(false, string.Format("Exception occurred: Unable to check localization settings.  {0}", ex.Message));
        }
    }

    private bool TypeIsInheritedFrom(Type type, string baseType)
    {
        while (type != null)
        {
            if (type.Name.Equals(baseType, StringComparison.InvariantCultureIgnoreCase))
                return true;
            type = type.BaseType;
        }

        return false;
    }

如果有帮助,请告诉我。