是否有一种简单的方法可以为新创建的用户控件/表单将Localizable
属性设置为true?理想情况下,设置的范围应该是解决方案或项目。
换句话说,我想说这个项目/解决方案应该是可本地化的,然后如果我添加一个新表单或控件VS应该自动将该属性设置为true。
修改:
尽管可以使用自定义模板,但在较大的团队中,可能并不总是使用它们。因此,它更多地是关于实施策略,确保团队成员不要忽略为项目/解决方案设置属性,其中所有包含文本资源的表单/控件都应该是可本地化的。
注意: Team Foundation Server不是选项。
答案 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;
}
如果有帮助,请告诉我。