1

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

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

编辑:

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

注意: Team Foundation Server 不是一个选项。

4

2 回答 2

2

不确定是否值得为一个如此容易更改且如此容易看出它具有错误值的属性付出努力。但是您可以创建自己的项目模板。

例如:项目 + 添加用户控件。将其 Localizable 属性设置为 True。文件+导出模板,选择项目模板。下一个。检查您添加的控件。下一个。检查所有参考资料,只省略那些你永远不需要的。下一个。给它一个好的模板名称(比如:“可本地化的用户控件”)。

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

于 2010-03-19T10:47:12.100 回答
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;
    }

请让我知道这可不可以帮你。

于 2010-03-22T15:59:57.533 回答