使用 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 和一些表单来更改语言(针对整个项目)的主要内容,如果未能解决你的问题,请参考以下文章

wpf 自定义控件combobox 依赖属性

C#Custom ComboBox - DropDown位置

如何将 UserControl 中的控件设为私有?

如何处理 UserControl 中属性的可见性?

C# 数据绑定 ComboBox 在其他控件中更改数据

为啥我不能在我的 UserControl 中重置 TextBox 的背景?