winform 不同语言(中文,英文等)
Visual Studio對于.NET程序的本地化提供了完整的支持,這里僅介紹實現多語言版本本地化程序的簡單步驟.
注意黑體處為關鍵點.
一.窗體本地化
對于Windows窗體,你需要做的第一步是確定你的默認界面語言,默認語言是指當執行程序無法找到已定義的本地化資源時,默認使用的語言,由于.net使用utf-8作為默認編碼,一般情況下在任何語言的系統上都能正常顯示.
本地化窗體一個關鍵的步驟是將窗體的本地化屬性(Localizable)設置為True,此時窗體代碼中自動生成的代碼部分的字符串(Text屬性)將由原來的"this.Text
= Form1"變為resources.ApplyResources(this, "$this")",并且窗體文件名下面會多出一個資源文件"Form1.resx",雙擊該資源文件可以看到字符串已經生成為資源了
像往常一樣在窗體上加入你需要的控件,并設置好屬性,控件的Text屬性同樣會自動生成為資源(雙擊Form1.resx看看吧~),簡單吧,我們來看下一步,本地化窗體.
下面我們來添加英語環境下的窗體.在窗體屬性窗口中找到Language屬性(挨著Localizable),選擇"英語(美國)",現在我們把窗體上的各個字符串翻譯成英文,并修改窗體的默認字體為Arial,字號8,完成后你會看到窗體文件名下面多出一個Form1.en-US.resx,這里用來保存已本地化為英文的資源.編譯程序,拷貝到英文系統下執行程序看看,效果怎么樣?(什么?你沒有英文環境?好吧,后面會提供解決辦法)
現在你已經成功的實現了中文簡體與英文美國的完美支持,如果需要其他語種的支持,選擇Language屬性列表中相應的語種重復上述步驟即可.需要注意的是.net使用的是unicode編碼,需要用unicode編碼其他語種后輸入到界面上,否則特別像繁體字容易出現亂碼.
需要注意的情況:如果需要在窗體上添加刪除控件,必須把窗體語言屬性(Language)修改為默認后才可以進行修改.
下面我們來看一下資源文件如何處理
二.資源本地化
在工程名稱上點擊右鍵,選擇添加新項目,生成Resource1.resx文件,雙擊打開該文件,默認為字符串資源編輯器,在這里你可以定義字符串資源,在字符串值中輸入"Hello
World"(不包含雙引號),現在就可以在代碼中直接用Resource1.String1來引用了,注意這里的資源也是同窗體一樣,是默認語言下的資源,在解釋如何添加其他語言前,我們先介紹一下.net解析資源的步驟
.net資源文件名(這里是Resource1.resx)由根名稱(即Resource1),本地語言名稱(默認情況下還沒有)及擴展名組成,在讀取資源時,資源管理器會根據當前環境決定需要的本地語言名稱,例如英語,然后試圖以全名讀取資源,美國英語的本地名稱為en-US(更多語言名稱可以從MSDN中查詢CultureInfo信息得到),那么資源全名為Resource1.en-US.resx,如果存在該文件,則載入該文件作為資源文件,如果沒有則使用默認值Resource1.resx,確定好資源文件后開始查找指定的資源(例如"String1"),如果在本地資源文件中沒有找到,則向上查找上一級的本地資源文件,最終找到根名稱Resource1為止.更多信息參考文章最后所附連接.
現在我們來添加美國英語資源,使用項目菜單添加新項,添加一個新的資源文件,命名為Resource1.en-US.resx,雙擊打開,把Resource1.resx中的資源翻譯成英語填入其中,在代碼中添加一個窗體載入事件,在事件處理代碼中添加一行MessageBox.Show(Resource1.String1);編譯運行程序,觀察在中文簡體系統和英文系統下的顯示內容.
不停的在不同語言系統環境下切換很麻煩,下面提供可以在一臺電腦上測試不同語種的解決方案.
三.切換顯示語言
C#窗體程序使用CultureInfo來管理當前語言,這里CultureInfo分為兩種,一種決定語言格式,一種決定語言資源(這里我們僅需要后者),只需簡單的設置如下兩個變量即可改變程序顯示語言:
System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture;
在窗體初始化之前,我們設置
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
即可把程序執行語言切換為美國英語,編譯程序試試看吧
演練:本地化Windows窗體
Visual Studio項目系統為本地化Windows窗體應用程序提供相當大的支持。下面是兩種使用Visual
Studio開發環境生成資源文件的方法:
使項目系統為可本地化的用戶界面元素(如窗體上的文本和圖像)生成資源文件。然后將該資源文件生成到附屬程序集中。
添加一個資源文件模板然后使用XML設計器編輯該模板。采取后一種方法的原因之一是為了生成在對話框和錯誤信息中出現的可本地化字符串。然后,必須編寫代碼以訪問這些資源。
本演練主題在一個Windows應用程序項目中演示這兩種過程。
還可以將文本文件轉換為資源文件;有關更多信息,請參見文本文件格式中的資源和資源文件生成器(Resgen.exe)。
使Visual Studio生成資源文件
1.創建名為“WindowsApplication1”的新Windows應用程序。有關詳細信息,請參見如何:創建Windows應用程序項目。
2.在“屬性”窗口中,將窗體的Localizable屬性設置為true。
Language屬性已經設置為“(默認值)”。
3.將Button控件從“工具箱”的“Windows窗體”選項卡拖到窗體上,然后將其Text屬性設置為Hello
World。
4.將該窗體的Language屬性設置為“德語(德國)”。
5.將該按鈕的Text屬性設置為Hallo
Welt。
6.將該窗體的Language屬性設置為“法語(法國)”。
7.將該按鈕的Text屬性設置為Bonjour
le Monde。如果需要的話,可調整該按鈕的大小以容納較長的字符串。
8.保存和生成解決方案。
9.單擊“解決方案資源管理器”中的“顯示所有文件”按鈕。
資源文件出現在Form1.vb、Form1.cs或Form1.jsl下面。Form1.resx是默認區域性的資源文件,它將生成到主程序集中。Form1.de-DE.resx是在德國講的德語的資源文件。Form1.fr-FR.resx是在法國講的法語的資源文件。
此外,您將看到名為Form1.de.resx和Form1.fr.resx的文件。Visual
Studio自動創建這些文件,以便解決Visual SourceSafe中存在的一個限制,即Visual SourceSafe不得不在保存操作期間處理將新文件添加到項目中的操作。.resx文件為空并且不包含任何資源。
10.按F5鍵或從“調試”菜單中選擇“啟動”。
現在將看到對話框中出現英語、法語或德語的問候,具體看到哪一種取決于操作系統的UI語言。
|
注意 |
|
Windows中使用的用戶界面語言是“CurrentUICulture”設置的一種功能。如果您的Windows副本裝有多語言用戶界面包(MUI),則可以在控制面板中更改用戶界面語言。有關更多信息,請參閱Windows |
下面的過程說明如何設置用戶界面區域性,以便該應用程序顯示法語資源。在實際應用程序中,不用這種方式硬編碼用戶界面區域性。用戶界面區域性的設置將取決于用戶設置或應用程序設置。
設置用戶界面區域性以查看特定資源
1.在“代碼編輯器”中,在模塊開始處將下面的代碼添加到Form1聲明之前:
2.' Visual Basic
3.Imports System.Globalization
4.Imports System.Threading
5.
6.// C#
7.using System.Globalization;
8.using System.Threading;
9.
10.// Visual J#
11.import System.Globalization.*;
import System.Threading.*;
12.添加下列代碼。在Visual Basic中,調用InitializeComponent函數前應使用New函數。在Visual
C#和Visual J#中,應使用Form1,并且也在調用InitializeComponent函數之前。
13.' Visual Basic
14.' Sets the UI culture to French (France).
15.Thread.CurrentThread.CurrentUICulture = New CultureInfo("fr-FR")
16.
17.// C#
18.// Sets the UI culture to French (France).
19.Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
20.
21.// Visual J#
22.// Sets the UI culture to French (France).
System.Threading.Thread.get_CurrentThread().set_CurrentUICulture( new CultureInfo("fr-FR"));
23.保存和生成解決方案。
24.按F5鍵或從“調試”菜單中選擇“啟動”。
現在該窗體將始終以法語顯示。如果早已更改了該按鈕的大小以容納較長的法語字符串,則請注意,在法語資源文件中也已經保持了該按鈕的大小。
手動向項目中添加資源文件并編輯它們
1.在“項目”菜單上單擊“添加新項”。
2.在“模板”框中選擇“程序集資源文件”模板。在“名稱”框中鍵入文件名“WinFormStrings.resx”。WinFormStrings.resx文件將包含英語的后備資源。每當應用程序找不到更適合于用戶界面區域性的資源時,就將訪問這些資源。
該文件被添加到“解決方案資源管理器”中的項目中,并在XML設計器內的“數據”視圖里自動打開。
3.在“數據表”窗格中選擇“data”。
4.在“數據”窗格中,單擊一個空行,并在“名稱”列中輸入strMessage,在“值”列中輸入Hello
World。
無需指定字符串的類型或MIME類型;它們用于對象。類型說明符保留所保存對象的數據類型。如果對象由二進制數據組成,則MIME類型說明符保持所存儲的二進制信息的基類型(base64)。
5.在“文件”菜單上,單擊“保存WinFormStrings.resx”。
6.再執行步驟1-5兩次以創建兩個分別名為WinFormStrings.de-DE.resx和WinFormStrings.fr-FR.resx的資源文件,并且這兩個文件具有在下表中指定的字符串資源。WinFormStrings.de-DE.resx文件將包含特定于在德國講的德語的資源。WinFormStrings.fr-FR.resx文件將包含特定于在法國講的法語的資源。
|
資源文件名 |
名稱 |
值 |
|
WinFormStrings.de-DE.resx |
strMessage |
Hallo Welt |
|
WinFormStrings.fr-FR.resx |
strMessage |
Bonjour le Monde |
訪問手動添加的資源
1.在“代碼編輯器”中,在代碼模塊的開始處導入System.Resources命名空間。
2.' Visual Basic
3.Imports System.Resources
4.
5.// C#
6.using System.Resources;
7.
8.// Visual J#
import System.Resources.*;
9.在“設計”視圖中,雙擊該按鈕以顯示其Click事件處理程序的代碼并添加下面的代碼。ResourceManager構造函數帶兩個參數。第一個參數是資源的根名稱,即不帶區域性和.resx后綴的資源文件的名稱。第二個參數是主程序集。
在本演練中,不聲明任何命名空間,因此ResourceManager構造函數的第一個參數可以采用ProjectName.ResourceFileRootName的形式。但是,在實際的應用程序中,您應設置DefaultNamespace屬性。在該情況下,您將需要通過資源文件的完全限定的根名稱(包括其命名空間)聲明資源管理器。例如,如果默認命名空間為MyCompany.MyApplication.MyComponent,則ResourceManager構造函數的第一個參數可以為MyCompany.MyApplication.MyComponent.WinFormStrings。
' Visual Basic
' Declare a Resource Manager instance.
Dim LocRM As New ResourceManager("WindowsApplication1.WinFormStrings", GetType(Form1).Assembly)
' Assign the string for the "strMessage" key to a message box.
MessageBox.Show(LocRM.GetString("strMessage"))
// C#
// Declare a Resource Manager instance.
ResourceManager LocRM = new ResourceManager("WindowsApplication1.WinFormStrings",typeof(Form1).Assembly);
// Assign the string for the "strMessage" key to a message box.
MessageBox.Show(LocRM.GetString("strMessage"));
// Visual J#
// Declare a Resource Manager instance.
ResourceManager LocRM = new ResourceManager("WindowsApplication1.WinFormStrings",
System.Type. GetType("WindowsApplication1.Form1").get_Assembly());
// Assign the string for the "strMessage" key to a message box.
MessageBox.Show(LocRM.GetString("strMessage"));
|
注意 |
|
默認情況下,ResourceManager對象區分大小寫。如果希望執行不區分大小寫的查找(例如使“TXTWELCOME”與“txtWelcome”檢索相同的資源),則可以將資源管理器的IgnoreCase屬性設置為true。但是,為了提高性能,最好始終為資源名稱指定正確的大小寫。如果執行不區分大小寫的資源查找,則可能會導致性能問題。 |
10.生成并運行窗體。單擊按鈕。
消息框將顯示適合于用戶界面區域性設置的字符串;或者如果它不能找到該用戶界面區域性的資源,它將顯示來自后備資源的字符串。
總結
以上是生活随笔為你收集整理的winform 不同语言(中文,英文等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lumen 错误&日志
- 下一篇: pyttsx3 快速上手之:语音合成播报