在 c# (winforms) 中本地化 UserControl 的最佳方式
Best way to localize UserControl in c# (winforms)
由于我缺乏知识,我已经编辑了这个问题
我正在做一个UserControl
,里面有DataGridView
,我想尽可能地简化实现过程,所以我想知道我是否应该用本地化来做?
据我所知 research 到目前为止,我的本地化方法是这样的:
例如,假设我的 form/UserControl
上有一个按钮,文本 属性 设置为 "hello",现在我想将我的 form/UserControl
本地化为意大利语。
- 将可本地化 属性 设置为 true 并选择语言(在本例中
意大利语)
- Google 翻译
- 将文本 属性 设置为 "Ciao"
英语是默认的,所以我的表单中已经有 .resx
文件,但是在此之后 VS 将使用 button.Text
属性 作为 key 为意大利语生成资源 和 "ciao" 作为 value,如果我理解正确的话,但是如果有人来把 button.Text
属性 从 hello 改成"hello world",那么除非手动更改,否则我的意大利语资源将不正确,有没有办法以某种方式自动进行此更改?
我想知道这一点,因为当我的 UserControl
和 DataGridView
在某些 form
上实现时,我无法判断我的 DataGridView
有哪些列,所以我想知道我是否应该将本地化过程留给实施我的控制的人?
谢谢,非常感谢您的帮助,抱歉编辑。
最佳选择是使用代码设置(本地化)文本(使用 一个 资源文件)。
例如,您可以在表单's/user 控件的构造函数中执行此操作。
尽量避免对每个 form/user 控件使用 resx,因为这可能会导致无法维护的代码(重复 key/values),除非您使用第三方工具来本地化整个应用程序,例如 (Infralution Globalizer )
以上工具不是免费的,但这是我唯一用过的工具
您的构造函数中的代码将如下所示(假设您有一个 YourResourceFile.resx)
public MyUserControl()
{
columnFirstName.Header = YourResourceFile.FirstName;
columnLastName.Header = YourResourceFile.LastName;
}
如果您想在网格中添加更多列,您将添加:
- 资源文件中的键
- 构造函数中的新行
实际上,通常不需要第 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 上测试过
由于我缺乏知识,我已经编辑了这个问题
我正在做一个UserControl
,里面有DataGridView
,我想尽可能地简化实现过程,所以我想知道我是否应该用本地化来做?
据我所知 research 到目前为止,我的本地化方法是这样的:
例如,假设我的 form/UserControl
上有一个按钮,文本 属性 设置为 "hello",现在我想将我的 form/UserControl
本地化为意大利语。
- 将可本地化 属性 设置为 true 并选择语言(在本例中 意大利语)
- Google 翻译
- 将文本 属性 设置为 "Ciao"
英语是默认的,所以我的表单中已经有 .resx
文件,但是在此之后 VS 将使用 button.Text
属性 作为 key 为意大利语生成资源 和 "ciao" 作为 value,如果我理解正确的话,但是如果有人来把 button.Text
属性 从 hello 改成"hello world",那么除非手动更改,否则我的意大利语资源将不正确,有没有办法以某种方式自动进行此更改?
我想知道这一点,因为当我的 UserControl
和 DataGridView
在某些 form
上实现时,我无法判断我的 DataGridView
有哪些列,所以我想知道我是否应该将本地化过程留给实施我的控制的人?
谢谢,非常感谢您的帮助,抱歉编辑。
最佳选择是使用代码设置(本地化)文本(使用 一个 资源文件)。
例如,您可以在表单's/user 控件的构造函数中执行此操作。
尽量避免对每个 form/user 控件使用 resx,因为这可能会导致无法维护的代码(重复 key/values),除非您使用第三方工具来本地化整个应用程序,例如 (Infralution Globalizer )
以上工具不是免费的,但这是我唯一用过的工具
您的构造函数中的代码将如下所示(假设您有一个 YourResourceFile.resx)
public MyUserControl()
{
columnFirstName.Header = YourResourceFile.FirstName;
columnLastName.Header = YourResourceFile.LastName;
}
如果您想在网格中添加更多列,您将添加:
- 资源文件中的键
- 构造函数中的新行
实际上,通常不需要第 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 上测试过