【问题标题】:How to detect localizable properties in WinForms?如何检测 WinForms 中的可本地化属性?
【发布时间】:2011-05-18 13:45:21
【问题描述】:

Somewhere else,有人说控件的“可见”属性无法本地化。这是半真半假。但是,“可见”属性的 LocalizableAttribute 设置为 true。但这仅仅意味着属性被序列化到资源文件中。我编写了一个测试程序,该程序将标签的可见属性设置为不变文化的“false”。使表单可本地化我将德国文化的可见属性更改为“true”。现在,如果我在系统设置为德语区域设置的情况下启动程序会发生什么?标签保持不可见。 检查资源文件 Form1.de.resx 可以看到 visible 属性没有被序列化。但是如果我手动将其添加到资源文件中:

<data name="label1.Visible" type="System.Boolean, mscorlib">
  <value>True</value>
</data>

标签出现。我承认有点困惑。 两个问题:

  • 如何使用内置序列化程序检测属性是否“真正”可本地化?
  • 推荐的覆盖默认行为的方法是什么?

编辑: 也许我需要澄清我的问题。 我的示例程序是一个简单的表单,它的默认语言设置为不变。我通过表单设计器手动添加了德语资源。程序在区域设置设置为德语的系统上运行。

案例一

"Visible" 添加到表单的面板属性:
1.) 在不变文化中设置为 false,在德国文化中设置为 true(默认)。 => 面板不可见
2.) 在 Invariant 文化中设置为 true,在德国文化中设置为 false。 => 面板不可见(按预期工作)
显然,如果它不是默认值,则该值仅写入特定于语言的资源文件。

案例 2

"字体" 添加到表单的标签属性:
1.) 在不变文化中设置为粗体,在德语文化中属性被重置为默认值。 => 标签不是粗体
2.) 在不变文化中设置为默认值,在德国文化中设置为粗体。 => 标签为粗体
现在这里的属性按预期序列化了。

这是一个错误还是我错过了什么?

【问题讨论】:

  • 我们已将此作为错误提交给 MS 支持。支持工程师已确认。我会让你知道这是怎么回事.. ;-)

标签: c# winforms localization


【解决方案1】:

我们收到了微软的回复:

我知道这可能是个问题 对于这种本地化场景,但在 一般情况下,这是 大大减小 resx 的大小 文件,所以我们不想改变 这个实现。这个设计缺陷 不符合我们目前的标准,所以这个 下个版本不会修复。

所以答案是:目前没有解决办法。

【讨论】:

    【解决方案2】:

    当我尝试它时,它工作得很好。测试步骤:

    • 在表单上放置一个文本框
    • 将表单的 Localizable 属性设置为 True
    • 将表单的语言设置为南非荷兰语
    • 将 TextBox 的 Visible 属性设置为 True
    • 这样修改构造函数:

      public Form1() {
          System.Threading.Thread.CurrentThread.CurrentUICulture =
              System.Globalization.CultureInfo.GetCultureInfo("af");
          InitializeComponent();
      }
      

    运行表单时,文本框不可见。我将 CurrentUICulture 赋值注释掉以切换回英文:文本框可见。

    【讨论】:

    • 反其道而行之。当文化是南非荷兰语时它是可见的,而当它是默认的(英语)时它是不可见的。
    【解决方案3】:

    我认为 Microsoft 不会将此归类为错误。它按设计工作;但肯定是脖子疼。

    据我所知,没有一个简单的解决方案没有对 Label 控件进行子类化和添加属性 - 太糟糕了。

    作为一种解决方法,您可以简单地设置 Width 或 Text 属性而不是 Visibility 吗?

    【讨论】:

      【解决方案4】:

      我仍然认为 Visible 属性不可本地化。当我切换到默认语言然后回到特定语言时,它总是重置为默认语言的设置,不管它是否是默认设置。

      【讨论】:

      • 如果您尝试案例 1 编号 2,您将看到针对特定语言生成了“可见”属性的条目。所以它是可本地化的......有点。 :)
      • 是的,你在写……但这绝对看起来像一个错误。
      • 当您将特定语言的字体重置为非粗体时,它仍会在“属性”窗口中显示为已更改。这大概就是它被序列化的原因吧。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2011-04-27
      相关资源
      最近更新 更多