C#WinForm實(shí)現(xiàn)多語(yǔ)言切換的示例
因項(xiàng)目需要,所以在網(wǎng)上找了一些方法實(shí)現(xiàn)了該功能,本文也是做一個(gè)總結(jié)和記錄。使用resx文件實(shí)現(xiàn)Winform多語(yǔ)言切換,以實(shí)現(xiàn)簡(jiǎn)體中文、英文、泰語(yǔ)的切換為例。如果后續(xù)需要增加其它語(yǔ)言的切換,只需要按照步驟重復(fù)操作即可。
效果圖如下:
中文:

英語(yǔ):

泰語(yǔ):

窗體設(shè)置
下面來(lái)說(shuō)一下流程:
1.首先將Form1的 Localizable 屬性為 true( 設(shè)置該屬性后,.net 將根據(jù)不同的語(yǔ)言,為應(yīng)用程序生成不同的資源文件),然后將Language屬性設(shè)置為所需要的語(yǔ)言,如下所示。

2.當(dāng)把Language屬性設(shè)置成例如英語(yǔ)后,那么我們對(duì)窗體中的控件名稱(chēng)進(jìn)行調(diào)整,如下圖:

別的語(yǔ)言也是這種操作,只是拿英語(yǔ)做個(gè)示例。當(dāng)我們把頁(yè)面調(diào)整完后,我們重新生成一下,然后再把上述Language屬性切回到默認(rèn)或漢語(yǔ)時(shí),再把項(xiàng)目重新生成一下。這樣的話(huà),語(yǔ)言文件就會(huì)自動(dòng)生成好了。


注意:一定要重新啟動(dòng)一下,不然改過(guò)之后直接運(yùn)行不會(huì)出現(xiàn)語(yǔ)言文件!
當(dāng)我們把窗體的設(shè)置全部搞定后,我們來(lái)看怎么設(shè)置自動(dòng)切換,如圖所示,我是在登錄頁(yè)面就放了一個(gè)下拉框,當(dāng)選中語(yǔ)言時(shí),所有窗體的語(yǔ)言會(huì)自動(dòng)切換,接下來(lái)我們看一下實(shí)現(xiàn)方法。
實(shí)時(shí)語(yǔ)言切換
1.項(xiàng)目的Properties的Settings.settings中添加變量DefaultLanguage,用于保存當(dāng)前設(shè)置的默認(rèn)語(yǔ)言。當(dāng)下次啟動(dòng)程序時(shí),會(huì)讀取該變量,從而將程序的語(yǔ)言設(shè)置為上次程序關(guān)閉時(shí)的語(yǔ)言。第一次將默認(rèn)語(yǔ)言設(shè)置為中文zh-CN。

2.創(chuàng)建一個(gè)靜態(tài)類(lèi)(MultiLanguage.cs)用于編寫(xiě)與切換語(yǔ)言相關(guān)的變量和代碼。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CodePrint
{
//用于編寫(xiě)與切換語(yǔ)言相關(guān)的變量和代碼
class MultiLanguage
{
//當(dāng)前默認(rèn)語(yǔ)言
public static string DefaultLanguage = "zh-CN";
/// <summary>
/// 修改默認(rèn)語(yǔ)言
/// </summary>
/// <param name="lang">待設(shè)置默認(rèn)語(yǔ)言</param>
public static void SetDefaultLanguage(string lang)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
DefaultLanguage = lang;
Properties.Settings.Default.DefaultLanguage = lang;
Properties.Settings.Default.Save();
}
/// <summary>
/// 加載語(yǔ)言
/// </summary>
/// <param name="form">加載語(yǔ)言的窗口</param>
/// <param name="formType">窗口的類(lèi)型</param>
public static void LoadLanguage(Logins form, Type formType)
{
if (form != null)
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(formType);
resources.ApplyResources(form, "$this");
Loading(form, resources);
}
}
/// <summary>
/// 加載語(yǔ)言
/// </summary>
/// <param name="control">控件</param>
/// <param name="resources">語(yǔ)言資源</param>
private static void Loading(Control control, System.ComponentModel.ComponentResourceManager resources)
{
if (control is MenuStrip)
{
//將資源與控件對(duì)應(yīng)
resources.ApplyResources(control, control.Name);
MenuStrip ms = (MenuStrip)control;
if (ms.Items.Count > 0)
{
foreach (ToolStripMenuItem c in ms.Items)
{
//遍歷菜單
Loading(c, resources);
}
}
}
foreach (Control c in control.Controls)
{
resources.ApplyResources(c, c.Name);
Loading(c, resources);
}
}
/// <summary>
/// 遍歷菜單
/// </summary>
/// <param name="item">菜單項(xiàng)</param>
/// <param name="resources">語(yǔ)言資源</param>
private static void Loading(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)
{
if (item is ToolStripMenuItem)
{
resources.ApplyResources(item, item.Name);
ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
if (tsmi.DropDownItems.Count > 0)
{
foreach (ToolStripMenuItem c in tsmi.DropDownItems)
{
Loading(c, resources);
}
}
}
}
}
}
3.在窗體的Load(雙擊Form1即可跳轉(zhuǎn)至該事件)事件中讀取Properties.Settings.Default.DefaultLanguage,并將ComboBox賦值為當(dāng)前默認(rèn)語(yǔ)言,即簡(jiǎn)體中文或英文。
private void Login_Load(object sender, EventArgs e)
{
//設(shè)置combobox的值
string language = Properties.Settings.Default.DefaultLanguage;
if (language == "zh-CN")
{
comboBox1.Text = "簡(jiǎn)體中文(默認(rèn))";
}
else if (language == "en-US")
{
comboBox1.Text = "English";
}
else if(language == "th-TH")
{
comboBox1.Text = "???";
}
MultiLanguage.LoadLanguage(this, typeof(Logins));
}
4.編寫(xiě)用于切換語(yǔ)言的ComboBox的SelectedIndexChanged事件,使得當(dāng)用戶(hù)選擇對(duì)應(yīng)的語(yǔ)言時(shí),程序會(huì)切換到該語(yǔ)言。
事件添加方式如下:選中ComboBox,點(diǎn)擊事件,在SelectedIndexChanged事件中輸入方法名languageTxt_SelectedIndexChanged,按回車(chē)即可自動(dòng)生成。
private void languageTxt_SelectedIndexChanged(object sender, EventArgs e)
{
comboBox1.Enabled = false;
if (comboBox1.Text == "中文")
{
//修改默認(rèn)語(yǔ)言
MultiLanguage.SetDefaultLanguage("zh-CN");
//對(duì)所有打開(kāi)的窗口重新加載語(yǔ)言
foreach (Form form in Application.OpenForms)
{
LoadAll(form);
}
}
else if (comboBox1.Text == "English")
{
//修改默認(rèn)語(yǔ)言
MultiLanguage.SetDefaultLanguage("en-US");
//對(duì)所有打開(kāi)的窗口重新加載語(yǔ)言
foreach (Form form in Application.OpenForms)
{
LoadAll(form);
}
}
else if(comboBox1.Text == "???")
{
//修改默認(rèn)語(yǔ)言
MultiLanguage.SetDefaultLanguage("th-TH");
//對(duì)所有打開(kāi)的窗口重新加載語(yǔ)言
foreach (Form form in Application.OpenForms)
{
LoadAll(form);
}
}
comboBox1.Enabled = true;
}
LoadAll(form)方法:
private void LoadAll(Form form)
{
if (form.Name == "Logins")
{
MultiLanguage.LoadLanguage((Logins)form, typeof(Logins));
}
else if (form.Name == "CodePrint")
{
MultiLanguage.LoadLanguage((Logins)form, typeof(CodePrint));
}
else if(form.Name == "CodePrint")
{
MultiLanguage.LoadLanguage((Logins)form, typeof(CodePrint));
}
}
if里面就是我們可以切換的窗體名稱(chēng)。
到此這篇關(guān)于C#WinForm實(shí)現(xiàn)多語(yǔ)言切換的示例的文章就介紹到這了,更多相關(guān)C# WinForm多語(yǔ)言切換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#連接藍(lán)牙設(shè)備的實(shí)現(xiàn)示例
本文主要介紹了C#連接藍(lán)牙設(shè)備的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
c# 如何自己實(shí)現(xiàn)一個(gè)ORM框架
這篇文章主要介紹了c# 如何自己實(shí)現(xiàn)一個(gè)ORM,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03
C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法
這篇文章主要介紹了C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法,涉及網(wǎng)絡(luò)文件操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05
C#?wpf使用DockPanel實(shí)現(xiàn)制作截屏框
做桌面客戶(hù)端的時(shí)候有時(shí)需要實(shí)現(xiàn)截屏功能,能夠在界面上框選截屏,本文就來(lái)為大家介紹一下wpf如何使用DockPanel制作截屏框吧,感興趣的可以了解下2023-09-09

