none
VB.Net多國語言介面問題 RRS feed

  • 問題

  • 各位大大,我使用讀取INI檔的方式來當作多國語言的開發,將英文、繁體中文及簡體中文個別寫成一個.INI的檔案

    然後再將其名稱讀進來當作介面上的文字,英文及繁體中文都沒有問題,但是讀簡體中文進來時卻出現亂碼,我有確認過我的INI檔案裡面字體是正確的阿~~可是讀進來的時候卻是亂碼,很奇怪耶!!是不是哪裡要設定成Unicode才會顯示正確呢?

    可否有那位大大可以指導一下!!

     

    下面是我簡體中文INI檔案內的資料.

    tFile="档案"
    tExit="离开"
    tSetup="设定"
    tLanguage="语言"
    tEnglish="英文"
    tTChinese="繁体中文"
    tSChinese="简体中文"
    tHelp="说明"

    2007年9月22日 上午 04:24

解答

  • 講一個簡單實作多國語言介面的方法好了

     

    首先,建立 Form1 與 Form2,

    Form1 建立兩個 Button,一個當作以正體中文啟動 Form2,一個以簡體中文啟動 Form2

    Form2 拉一個 Label 測試文字用

     

    (1) 在設計畫面中選取 Form2,屬性視窗中設定 Localizable 為 true

     

    (2) 選取 Form2,屬性視窗中設定 Language,先選擇中文 (台灣),

         然後將 Form2 中,所有控制項的 Text 屬性設定為正體中文所需的文字。

     

    例如:  選擇 Label1 設定 Text 為 "說明"

     

    (3) 選取 Form2,屬性視窗中設定 Language,先選擇中文 (中華人民共和國),

         此時,你會發現所有的控制項,會變成預設狀態的文字。

         然後將 Form2 中,所有控制項的 Text 屬性設定為簡體中文所需的文字。

     

    例如:  選擇 Label1 設定 Text 為 "说明"

     

    (4) 以上 (2) (3) 步驟,就可以建立多國語言介面。此時專案下,會出現 Form2.zh-TW.resx 與 Form1.zh-CN.resx 兩個資源檔,代表兩種語言的設定。你可以透過滑鼠點擊檔案打開 GUI 模式編輯,或是直接利用文字編輯器來編輯皆可。

     

    (5) 製作 Form1 的 button1 與 button2 的 click 事件,就大功告成囉

     

    Code Snippet

            private void button1_Click(object sender, EventArgs e)
            {
                Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-TW");
               Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-TW");

     

                Form2 f2 = new Form2();
                f2.ShowDialog();
            }

     

            private void button2_Click(object sender, EventArgs e)
            {
                Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN");
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");

     

                Form2 f2 = new Form2();
                f2.ShowDialog();
            }

     

     

    2007年9月23日 下午 02:27

所有回覆

  • 你怎樣讀取剖析檔?

     

    若用 API 可能會發生掉碼的問題,另外也要確認你存檔的格式。

     

    你可以搜尋既有討論,有文字檔編碼的相關討論。

    2007年9月22日 上午 06:44
    版主
  • HI,

     

    Microsoft .NET對多國語文的支援都是利用資源檔(Resource File)來製作, 也就是應用程式和網頁都可以利用資源檔來提供多國語文的介面, 程式既好寫又容易維護. 可以考慮將INI檔案的內容換成資源檔的做法

     

    tihs

     

    2007年9月22日 上午 08:27
  • 我是使用下面這個方式宣告,來讀取INI的資料.

        Public Declare Function GetPrivateProfileString Lib "kernel32" _
          Alias "GetPrivateProfileStringA" ( _
          <MarshalAs(UnmanagedType.LPStr)> ByVal lpApplicationName As String, _
          <MarshalAs(UnmanagedType.LPStr)> ByVal lpKeyName As String, _
          <MarshalAs(UnmanagedType.LPStr)> ByVal lpDefault As String, _
          <MarshalAs(UnmanagedType.LPStr)> ByVal lpReturnedString As StringBuilder, _
          ByVal nSize As UInt32, _
          <MarshalAs(UnmanagedType.LPStr)> ByVal lpFileName As String) As UInt32
        Public Declare Function WritePrivateProfileString Lib "kernel32" _
         Alias "WritePrivateProfileStringA" ( _
         <MarshalAs(UnmanagedType.LPStr)> ByVal lpApplicationName As String, _
         <MarshalAs(UnmanagedType.LPStr)> ByVal lpKeyName As String, _
         <MarshalAs(UnmanagedType.LPStr)> ByVal lpReturnedString As StringBuilder, _
         <MarshalAs(UnmanagedType.LPStr)> ByVal lpFileName As String) As UInt32
        Public Declare Ansi Function FlushPrivateProfileString _
        Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _
        (ByVal lpApplicationName As Integer, _
        ByVal lpKeyName As Integer, _
        ByVal lpString As Integer, _
        ByVal lpFileName As String) As Integer

     

    this大大你說的使用資源檔來開發多國語言的介面是要如何製作呢?是否有相關的網頁或範例可以參考?

    老實說資源檔的應用我還真不會.希望各位大大多多指導.

    2007年9月22日 上午 09:09
  • 前面已經說了,用 API 會受編碼限制無法轉。

     

    你要測試的話,你必須裝英文作業系統 + 多語系介面,在測試簡體時把控制台地區選項預設編碼改為內地的編碼,就會自動以簡體解碼。

     

    多語系介面建議你先搜尋,已經有幾篇討論過了。

    2007年9月22日 上午 09:57
    版主
  • 講一個簡單實作多國語言介面的方法好了

     

    首先,建立 Form1 與 Form2,

    Form1 建立兩個 Button,一個當作以正體中文啟動 Form2,一個以簡體中文啟動 Form2

    Form2 拉一個 Label 測試文字用

     

    (1) 在設計畫面中選取 Form2,屬性視窗中設定 Localizable 為 true

     

    (2) 選取 Form2,屬性視窗中設定 Language,先選擇中文 (台灣),

         然後將 Form2 中,所有控制項的 Text 屬性設定為正體中文所需的文字。

     

    例如:  選擇 Label1 設定 Text 為 "說明"

     

    (3) 選取 Form2,屬性視窗中設定 Language,先選擇中文 (中華人民共和國),

         此時,你會發現所有的控制項,會變成預設狀態的文字。

         然後將 Form2 中,所有控制項的 Text 屬性設定為簡體中文所需的文字。

     

    例如:  選擇 Label1 設定 Text 為 "说明"

     

    (4) 以上 (2) (3) 步驟,就可以建立多國語言介面。此時專案下,會出現 Form2.zh-TW.resx 與 Form1.zh-CN.resx 兩個資源檔,代表兩種語言的設定。你可以透過滑鼠點擊檔案打開 GUI 模式編輯,或是直接利用文字編輯器來編輯皆可。

     

    (5) 製作 Form1 的 button1 與 button2 的 click 事件,就大功告成囉

     

    Code Snippet

            private void button1_Click(object sender, EventArgs e)
            {
                Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-TW");
               Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-TW");

     

                Form2 f2 = new Form2();
                f2.ShowDialog();
            }

     

            private void button2_Click(object sender, EventArgs e)
            {
                Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN");
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");

     

                Form2 f2 = new Form2();
                f2.ShowDialog();
            }

     

     

    2007年9月23日 下午 02:27
  • 感謝各位的熱情的教學,感謝chhuang詳細的說明,這部分我要再加強練習了,感謝囉~~

    2007年9月24日 上午 04:11
  •  

    Hi~~Liao

     

    u can try the WinAPI

     Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringW" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Int32, ByVal lpFileName As String) As Int32

     

    i have tested it successfully.

    2008年2月25日 下午 01:27
  •  chhuang 寫信:

    講一個簡單實作多國語言介面的方法好了

     

    首先,建立 Form1 與 Form2,

    Form1 建立兩個 Button,一個當作以正體中文啟動 Form2,一個以簡體中文啟動 Form2

    Form2 拉一個 Label 測試文字用

     

    (1) 在設計畫面中選取 Form2,屬性視窗中設定 Localizable 為 true

     

    (2) 選取 Form2,屬性視窗中設定 Language,先選擇中文 (台灣),

         然後將 Form2 中,所有控制項的 Text 屬性設定為正體中文所需的文字。

     

    例如:  選擇 Label1 設定 Text 為 "說明"

     

    (3) 選取 Form2,屬性視窗中設定 Language,先選擇中文 (中華人民共和國),

         此時,你會發現所有的控制項,會變成預設狀態的文字。

         然後將 Form2 中,所有控制項的 Text 屬性設定為簡體中文所需的文字。

     

    例如:  選擇 Label1 設定 Text 為 "說明"

     

    (4) 以上 (2) (3) 步驟,就可以建立多國語言介面。此時專案下,會出現 Form2.zh-TW.resx 與 Form1.zh-CN.resx 兩個資源檔,代表兩種語言的設定。你可以透過滑鼠點擊檔案打開 GUI 模式編輯,或是直接利用文字編輯器來編輯皆可。

     

    (5) 製作 Form1 的 button1 與 button2 的 click 事件,就大功告成囉

     

    Code Snippet

            private void button1_Click(object sender, EventArgs e)
            {
                Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-TW");
               Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-TW");

     

                Form2 f2 = new Form2();
                f2.ShowDialog();
            }

     

            private void button2_Click(object sender, EventArgs e)
            {
                Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN");
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");

     

                Form2 f2 = new Form2();
                f2.ShowDialog();
            }

     

     



    chhuang 先進所提的作法的確能在新 new 的 form 上 apply 剛設定的語言,但是若是要更改視窗本身的語言該怎麼做呢?

    例如 MainForm 有一個 Language 的 MenuItem,按下去跳出一個視窗,可以設定中文或  English,選擇中文後按確定,MainForm 介面顯示的語言仍然是英文!

    另外語系的預設路徑是在 \zh-TW 或 \en-US 之中,可以自訂語系的路徑嗎?例如設定成 \lang\zh-TW


    謝謝各位先進解惑Smile


    2008年9月23日 下午 04:43
  •  

    移文至 Visual Basic
    2008年9月24日 上午 06:28
    版主
  • 要動態變更表單本身的語言實際上 Framework 是無法自動幫你作到的,表單只會在初始的時候依照 CurrentUICulture 的屬性來決定語言,

    這裡有一個元件可以參考:

    https://secure.codeproject.com/KB/cs/CultureManager.aspx

     

    或者 cheap 一點換語言的時候重新載入整個程式。

    至於 satellite assembly 的路徑應該是 Framework 本身寫死不能改的,除非你自己管理 resource 檔,自己負責將 resource 套用。

     

    2008年9月25日 上午 09:48
  • 小克大大您好

     

    我在click中加入下列程式

    會有一堆錯誤耶

    我是用VB2005.net寫

    但會出現下面的錯誤

    Thread 未宣告
    CultureInfo 未定義
    f2 未宣告
    'Form' 為型別,無法當成運算式使用

    	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    		Thread.CurrentThread.CurrentCulture = New CultureInfo("zh-TW")
    		Thread.CurrentThread.CurrentUICulture = New CultureInfo("zh-TW")
    
    		Form2(f2 = New Form2())
    		f2.ShowDialog()
    
    	End Sub


     

     


    2012年1月7日 上午 02:32