【问题标题】:Best way to localize UserControl in c# (winforms)在 c# (winforms) 中本地化 UserControl 的最佳方法
【发布时间】:2018-06-01 03:36:30
【问题描述】:

由于我缺乏知识,我已经编辑了这个问题

我正在制作一个带有DataGridViewUserControl,我想尽可能地简化实现过程,所以我想知道我应该通过本地化来做到这一点吗? 据我所知,research 到目前为止,我的本地化方法是这样的:

例如,假设我的 form/UserControl 上有一个按钮,文本属性设置为 "hello" ,现在我想将我的 form/UserControl 本地化为意大利语。

  1. 将 localizable 属性设置为 true 并选择语言(在这种情况下 意大利语)
  2. 谷歌翻译
  3. 将文本属性设置为“Ciao”​​

默认情况下是英语,所以我的表单中已经有.resx 文件,但是在此之后VS 将生成意大利语资源,其中button.Text 属性为key,“ciao”为,如果我理解正确,但是如果有人来将 button.Text 属性从 hello 更改为“hello world”,那么我的意大利资源将不正确,除非手动更改,有没有办法以某种方式自动进行此更改?

我想知道这一点,因为当我的UserControlDataGridView 在某些form 上实现时,我无法确定我的DataGridView 有哪些列,所以我想知道我是否应该将本地化过程留给实施我控制的人?

谢谢你,非常感谢你的帮助,很抱歉编辑。

【问题讨论】:

  • @ZoharPeled 我可以在用户控件中添加 .resx 文件,但我需要在其中包含大量字符串,因为我不知道将在哪个表单上实现
  • 如果DataGridView 的列始终相同,那么在设计时使用UserControlLocalizable and Language property 也是一个简单的好选择。最好的方法是基于意见。这取决于不同的要求。如果列不同并且可以由UserControl 的用户添加,那么您不需要在控件本身中提供本地化,表单应该是可本地化的,您只需将列公开为您的控制权。
  • @RezaAghaei 感谢您的建议,列不一样,所以您对表单本地化是正确的,但我在考虑长期,如果可能添加或修改新列,我该如何更新@987654340 @文件自动,我知道这不是我的工作,但刚刚开始工作并试图证明自己,也许我应该编辑问题
  • 添加新列的时间,也将本地化字符串添加到资源中。要更改语言或添加新语言,您可以分发附属程序集。
  • @RezaAghaei 谢谢你,很好的建议,但我第一次听说卫星组件,我认为这是一个很好的example,如果你有更多的时间,请随时回答我的问题。跨度>

标签: c# winforms datagridview user-controls


【解决方案1】:

最好的选择是使用代码设置(本地化)文本(使用一个资源文件)。
例如,您可以在表单/用户控件的构造函数中执行此操作。
尽量避免对每个表单/用户控件使用 resx,因为这可能会导致无法维护的代码(重复的键/值),除非您使用第三方工具来本地化整个应用程序,例如 (Infralution Globalizer)

上面的工具不是免费的,但它是我唯一用过的一个

您的构造函数中的代码将如下所示(假设您有一个 YourResourceFile.resx)

public MyUserControl()
{
        columnFirstName.Header = YourResourceFile.FirstName;
        columnLastName.Header = YourResourceFile.LastName;
}

如果您想在网格上添加更多列,您将添加:

  1. 资源文件中的一个键
  2. 构造函数中的新行

事实上,通常不需要步骤 1,因为密钥可能就在那里

更新:
似乎有一个流行的 VS 插件,名为 ResXManager 或 (here)。

【讨论】:

  • 谢谢你的建议,我想在UserControl构造函数中写一些代码,但你对不可维护的代码是正确的,谢谢你的工具,虽然我现在不会使用它,我以后肯定会使用一些工具,现在我对该代码感兴趣,我现在将编辑我的问题。
  • @Yollo 代码并不复杂,您所要做的就是从资源文件中分配一个属性。查看我的更新答案
  • 但我仍然不知道DataGridVIew 会有哪些列,也许我应该使用loop,查看我更新的question
  • @Yollo 您只会在“设计”时本地化用户控件上的任何控件。在控件上添加列/网格视图的人将负责新控件的本地化(再次,最好的选择是通过代码)
  • @Yollo 我会检查但我真的不认为这是值得的,太麻烦了(我已经做到了)。最好坚持一个(或多个,如果你愿意)资源文件,就像你在 Web 应用程序上做的那样
【解决方案2】:

您的 UserControl 的 Localizable 属性应设置为 true。

此外,您要翻译的 UserControl 的任何自定义属性都应添加:

[Localizable(true)]
public string MyTranslatableLabel
{
    get;set;
}

您可能还必须从包含 UserControl 的表单的 Designer.cs 文件中删除如下所示的任何实例化,以使其正常工作:

this.myUserControl.MyTranslatableLabel = "Initial label of user control";

所有这些都在 MS VisualStudio 2017 社区测试过

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2010-10-11
    • 2010-09-18
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多