4

我们在 Visual Studio 2008 中的项目中有一些自动生成的资源文件,其中包含一些本地化版本,在其中一个本地化版本中,有一个字符串在这种情况下为空。

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

现在的问题是表单设计者很高兴找到了一个字符串的资源,并且显然会不择手段地为任何空字符串重用该资源,它将在生成的设计器代码中为表单分配一个属性。

例如,如果由于某种原因没有为控件上的属性指定默认值(因此即使它是空的,它也会被序列化为代码),那么它将引用我们的资源,而不是在C# 代码。

问题是它引用了本地化版本,并且这些版本没有编译为代码。

这是一个简短的代码示例:

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

在这种情况下,dash_red_shift_info_descriptionsv-SE 语言环境没有值,因此设计人员在看到代码中的空字符串时,将尝试链接到该资源。但是 SystemMessagesResources_sv_SE 不是现有的类,而是似乎为 SystemMessagesResources 资源文件的瑞典本地化版本生成的类名,该文件编译为一个类。

这可以避免吗?每次我们更改表单文件中的某些内容时,我们都会对搜索/替换感到厌倦,而且我们很确定我们已经做了一个让这种情况发生的事情,但我们是显然我们自己无法找到原因。

如果我们删除资源,上面的代码将如下所示:

this.rpAllFields.KeyTip = "";
4

4 回答 4

2

如果问题是由资源文件中的空字符串引起的,那么将其设为空格会产生什么影响。因此,资源文件包含“”而不是“”。我不知道这是否是最好的解决方案,但我很想知道它是否会阻止设计者将该资源用作默认的空字符串。但是,不知道它是如何使用的,我不确定将一个应该未定义的值定义为空格会产生什么影响......

于 2009-01-28T02:38:56.803 回答
2

您可以尝试创建一个字符串资源empty_string,为每个语言环境定义为“”。如果您将其作为第一个资源,表单设计者将(希望)始终选择该资源作为贯穿您表单的值。这样至少您将使用为此目的指定的字符串。

于 2009-01-28T19:07:35.747 回答
0

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

但如果我的场景不是这样的,我只会用空字符串废弃资源条目。我只想说,“无论如何,什么独立的 UI 文本转换为空白?”。

如果在某些情况下我真的需要资源是空白的(它代表一种语言的文章,而另一种语言中不存在等效的词),我会尝试看看我是否可以通过其他方式产生相同的效果。

于 2009-01-27T15:15:56.683 回答
0

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

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

为了解决这个问题,我们在命名空间中为这些原语使用了命名类型,并将其设为全局。我在这里看到的是您的全局命名空间正在填补空白——您可能希望有一个“下面”来评估所有空字符串。

我已经一年多没有使用这个了,所以如果我的措辞很糟糕,请原谅我,但我的意思是:想想 XML。您需要在属性中显式使用命名空间或将它们分配得更低(如 xaml 中的附加属性)。

我希望这会有所帮助(并且有意义)

于 2009-01-27T15:23:40.583 回答