Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms:默认情况下启用本地化(强制实施项目/解决方案策略)_Winforms_Visual Studio 2008_.net 3.5_Localization - Fatal编程技术网

Winforms:默认情况下启用本地化(强制实施项目/解决方案策略)

Winforms:默认情况下启用本地化(强制实施项目/解决方案策略),winforms,visual-studio-2008,.net-3.5,localization,Winforms,Visual Studio 2008,.net 3.5,Localization,对于新创建的usercontrols/forms,是否有一种简单的方法将Localizable属性设置为true?理想情况下,设置的范围应该是解决方案或项目 换句话说,我想说这个项目/解决方案应该是可本地化的,然后如果我添加了一个新的表单或控件,VS应该自动将属性设置为true 编辑: 尽管定制模板是可能的,但在更大的团队中,它们可能并不总是被使用。因此,更重要的是实施策略,确保团队成员不要求为项目/解决方案设置属性,因为所有包含文本资源的表单/控件都应该是可本地化的 注意:Team Found

对于新创建的usercontrols/forms,是否有一种简单的方法将Localizable属性设置为true?理想情况下,设置的范围应该是解决方案或项目

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

编辑:

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


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

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

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


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

对于一个很容易更改且很容易看到其值错误的属性,不确定是否值得付出努力。但您可以创建自己的项目模板

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


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

可以编写一个单元测试,使用反射来确定表单/用户控件是否已标记为可本地化。特别是,如果某个类型已标记为可本地化,则将有一个与该类型关联的嵌入式资源文件,该文件将包含一个>>$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;
    }

请告诉我这是否有帮助。

可以编写一个单元测试,使用反射来确定表单/用户控件是否已标记为可本地化。特别是,如果某个类型已标记为可本地化,则将有一个与该类型关联的嵌入式资源文件,该文件将包含一个>>$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;
    }

请让我知道这是否有帮助。

很抱歉在OP中没有明确说明。模板是实现这一点的一种方法,但是,它们没有强制执行本地化属性必须为真的策略。嗯,这里的策略强制选项非常有限。VisualStudio让程序员负责,而不是老板。您可以编辑标准模板。很抱歉,在OP中没有明确说明。模板是执行此操作的一种方法,但是,它们没有强制执行本地化属性必须为true的策略。嗯,这里的策略强制选项非常有限。VisualStudio让程序员负责,而不是老板。您可以编辑标准模板。