使用 ComboBox、UserControl 和一些表单来更改语言(针对整个项目)
Posted
技术标签:
【中文标题】使用 ComboBox、UserControl 和一些表单来更改语言(针对整个项目)【英文标题】:Using a ComboBox, UserControl and some forms to change language (for entire project) 【发布时间】:2014-02-12 14:19:11 【问题描述】:在开始之前,我已经进行了研究,但似乎找不到任何东西。请注意,我对 UserControl 非常陌生,所以这可能是它被证明很困难的原因。
I have a combobox in Form1 which when selected allows the user to change between a choice of 21 languages.我创建了一个包含标签、按钮和复选框的 UserControl - 添加到名为 Print 的表单中。
如果用户选择了法语,我将如何实现 UserControl 来更改项目中所有表单的语言?
用户控制:
我在这里为按钮使用了 get 和 set 方法。当 Form1 中的语言发生变化时,我希望这个按钮(实际上是所有元素)发生变化。
using System.Windows.Forms;
namespace Print
public partial class UserControl1 : UserControl
public UserControl1()
InitializeComponent();
public string LabelPreview
get
return Button_Preview.Text;
set
Button_Preview.Text = value;
表格1:
如果在组合框中选择了字符串值英语,则调用一个方法 - 这是我想为其他形式更改语言的地方。
private void ComboBoxLang_SelectedIndexChanged(object sender, EventArgs e)
string selectedItem = this.comboBoxLang.GetItemText(this.comboBoxLang.SelectedItem);
if (selectedItem == Language.English)
ToEnglish();
private void ToEnglish()
// Cannot actually implement the UserControl, It can't find the method above.
// When I've tried to implement UserControl in Print, it can't seem to find it either.
// I've tried:
// Print.UserControl1.(_LabelPreview doesn't show_);
// ^ It might be the completely wrong thing to do so excuse me.
我很困惑...我是在 Print(添加 UserControl 的地方)或/和 Form1 中编程吗?!我不希望设计出现在Form1中,只想让其他表单知道选择了什么语言。
注意:我在翻译时一直使用Unicode*
【问题讨论】:
你已经在这里问过这个***.com/questions/20620796/… 类似但不一样。我将继续使用 UserControl,因为我是新手,所以我问了另一个问题。 看我的回答。这里没有金锤。你需要努力 我目前在做什么......目前正在处理按钮和复选框事件,并且正在工作......正在进行中。 如果我理解正确的话,快速谷歌has what you need的第一个结果@ 【参考方案1】:如何触发我在您的另一个问题Everytime ComboBox is changed (using SelectedIndexChanged) display message in other forms, if opened, of new value 中描述的应用程序范围的语言更改
现在,设置控件... 一种方法是在一个表中创建具有StringId
的短语数据库,在另一个表中创建StringId, LanguageId, StringValue
。您将创建StringManager
对象,该对象将具有方法GetLanguageSpecificString(stringId, languageId)
。当触发语言更改时,您的控件将为您显示的每个标签等调用GetLanguageSpecificString
。
所以你的数据会是这样的
Table DisplayLanguage
LanguageId Int
LanguageName nvarchar
LanguageCulture varchar
//1, English, us-En
//2, French, fr-Ca
Table DisplayString
StringId Int
//1
//2
//3
Table DisplayStringValue
DisplayStringValueId int
StringId int
LanguageId int
StringValue nvarchar
//1, 1, 1, Person Name
//2, 1, 2, Nome de Persona(or whateever)
使用创建缓存
"Select * from DisplayStringValue where LanguageId = 1"
然后使用 Linq 或其他东西从缓存中为每个控件选择其数据,因为您不想为每个控件使用这些数据来命中 DB
"Select StringValue from DisplayStringValue where StringId = 1 and LanguageId = 1"
现在,将我的其他答案与此结合起来,您会看到,如果在您的表单中有
LanguageChangeObserver.LanguageChanged += MyObserverHandler;
private void MyObserverHandler(languageId)
_formLanguage = languageId;
// set your controls
lblFirstName.Text = GetLanguageSpecificString(5, languageId);
lblLastName.Text = GetLanguageSpecificString(6, languageId);
// loop through userControls and pass to them language id
如果您的用户控件从您创建的单个基类派生并且已经具有SetNewLanguage
方法,那将是一个好主意,这样您就可以这样做
foreach (var c in form.controls)
MyControlBase currControl = c as MyControlBase;
if (currControl != null) currControl.SetNewLanguage(languageId);
【讨论】:
当资源文件可以正常工作时,您为什么建议使用数据库?我的意思是,是的,这会起作用,但对于如此简单的事情来说似乎有点过分了。 数据库更易于维护。它可以由 Db 人或任何使用简单工具的人维护。他有21种语言。资源文件需要程序员注意,重新编译。【参考方案2】:所以我想出了一个适合我的解决方案!我已经从 Printer.cs 表单中复制过来,在该表单中我使用了一个参数来表示所选择的语言,将 strTextBox 初始化为等于 label1 并包含一个 if 语句以查看语言是否为英语(也与 UserControl 一起使用以获取标签等)。
打印机
public Printer(string strTextBox)
InitializeComponent();
label1.Text = strTextBox;
if (label1.Text == Language.English)
UserControl111.Label_Option_Multi = "Please select an option:"; //Simple test
表格1
private void Print_Click(object sender, EventArgs e)
string selectedItem = this.ComboBox_Lang.GetItemText(this.ComboBox_Lang.SelectedItem);
Printer p = new Printer(selectedItem);
p.Show();
用户控制
public string Label_Option_Multi
get
return Label_Option.Text;
set
Label_Option.Text = value;
结果,如果我在 Form1.s 中选择英文然后打开 Printer.cs,标签显示为英文并进行相应的翻译。
【讨论】:
【参考方案3】:您必须以与任何其他控件相同的方式进行操作。想象一下,您已经创建了自己的 TextBox
,现在希望每个表单上项目中的所有文本框都可以做某事。
显然,您必须以某种方式获取此类控件的列表。一种方法是使用Application.Forms
遍历所有内容。其他方法是在每次创建或显示控件时注册您的控件(添加到列表中),否则在 what_you_need 和取消注册(从列表中删除)。
【讨论】:
以上是关于使用 ComboBox、UserControl 和一些表单来更改语言(针对整个项目)的主要内容,如果未能解决你的问题,请参考以下文章