2009-01-12 27 views
4

我们在Visual Studio 2008项目中有一些自动生成的资源文件,其中包含一些本地化版本,在其中一个本地化版本中,有一个字符串,在这种情况下为空。VS2008中的项目文件中的资源由窗体设计器创造性地“重用”,可以避免?

更明确。我们有一个核心资源文件,有很多字符串资源。然后,我们有4个其他本地化版本的这个文件,并在其中一个其他本地化文件中,其中一个字符串被赋予一个空值。

现在的问题是,表单设计人员很高兴为字符串找到资源,并且显然会停下来为任何空字符串重用此资源,它将在生成的设计器代码中为其分配属性形成。例如,如果由于某种原因,控件上的某个属性没有用默认值指定(所以即使它是空的,它也会被序列化为代码),那么它会引用我们的资源,而不是写出空的在C#代码中的字符串文字。

问题是它引用了本地化的版本,而这些不会被编译为代码。

下面是一个简短的代码示例:

this.rpAllFields.KeyTip = 
    global::namespaces.SystemMessagesResources_sv_SE. 
    dash_red_shift_info_description; 

在这种情况下,dash_red_shift_info_description没有为SV-SE区域设置的值,因此设计,当它看到在代码中一个空字符串,将尝试链接到该资源。但是SystemMessagesResources_sv_SE不是一个现有的类,但看起来是瑞典本地化版本的SystemMessagesResources资源文件的一个生成的类名,编译为一个类。

这是可以避免的吗?每次我们在表单文件中改变某些内容时,我们都会对搜索/替换感到厌倦,而且我们确信我们已经做了一次巴掌 - 我的额头 - 骨头的事情,这会发生,但我们自然无法找到自己的原因。

上面的代码会,如果我们去掉了资源,这样写的:

this.rpAllFields.KeyTip = ""; 

回答

2

您可以尝试创建一个字符串资源empty_string,定义为“”为每个地区。如果您将其作为第一个资源,表单设计人员(希望)会始终选择该资源作为通过表单投放的值。这样至少你会使用为此目的指定的字符串。

0

多少你需要的资源,它的值是一个空字符串?我可以想象一些多语言场景,其中某些资源键应该对应于某些受支持语言中的空白(如果对某些UI元素使用字符串连接),是的。

但是,如果我的情况不是这样的话,我只会用空字符串废弃资源项。我只是说,“无论如何,什么独立的UI文本翻译为空白?”。

如果我真的需要的资源是空白一些案件,(它代表的一篇文章中一种语言和地方在另一个不存在等价词),我会尝试看看我是否能产生同样的影响其他方式。

+0

资源项具有原始语言的值,但不在另一个中,因此为空字符串。如果我删除资源条目,它将默认恢复为原来的语言,这也是错误的。 – 2009-01-27 20:58:19

+0

你是否自己使用了空字符串(例如作为UI元素的文本),还是与其他字符串连接形成短语?如果是后者,我只会分散纯粹主义者一秒钟的时间,并将不规则资源硬编码为区域感知属性。 – Ishmaeel 2009-01-28 07:16:33

0

生成的资源文件和代码示例会很好。

你所说的是:你的命名空间中有一个空的字符串字面定义(第一个找到的),但是这导致了一些问题?在任何时候都不是空的吗?当你编译代码时,它会做一些古怪的事情来节省空间。在生成带有代码隐藏的XAML文件时,我遇到了一个类似的问题,用于动态自动构建程序集文件:编译器足够聪明,可以知道“它没有什么区别,但对我们来说,它做到了,因为它会重命名文字(在别处使用)。

为了解决这个问题,我们在命名空间中为这些原语使用了命名的类型,并将其作为全局的。我在这里看到的是,你的全局命名空间正在填充空白 - 你可能想要一个'下面'来评估所有的空字符串。

我还没有在这一年多的工作,所以原谅我,如果我的措辞很差,但我的意思是:认为XML。你需要明确地在属性中使用命名空间,或者将它们分配得较低(如xaml中的附加属性)。

我希望这有助于(和有意义)

+0

这是一个由资源编辑器完全管理和生成的资源文件,因此除非我想重写整个资源系统,否则我怀疑我可以在这里随便引入命名空间。 – 2009-01-27 20:59:11

2

如果问题是由在资源文件中一个空字符串,将效果是使得它的空间是什么原因造成。因此,而不是“”资源文件包含“”。我不知道这是否是最好的解决方案,但我很想知道它是否会阻止设计人员将该资源用作默认空字符串。然而,不知道它是如何使用的,我不确定具有应该未定义的值的影响应该被定义为空间...

相关问题