在 c# (winforms) 中本地化 UserControl 的最佳方式

Best way to localize UserControl in c# (winforms)

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

我正在做一个UserControl,里面有DataGridView,我想尽可能地简化实现过程,所以我想知道我是否应该用本地化来做? 据我所知 research 到目前为止,我的本地化方法是这样的:

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

  1. 将可本地化 属性 设置为 true 并选择语言(在本例中 意大利语)
  2. Google 翻译
  3. 将文本 属性 设置为 "Ciao"

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

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

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

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

以上工具不是免费的,但这是我唯一用过的工具

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

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

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

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

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

更新:
似乎有一个流行的 VS 插件叫做 ResXManager or (here)。

您的 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 Community 上测试过