[VB.NET].NET多語系程式(三)

image

Abstract

  • Introduction
  • 學習目標
  • 操作步驟
  • 簡易實作範例

Introduction

本篇將介紹.NET多語系程式的寫法 ,下面會利用XML文件來達到多語系的功能。

學習目標

  • .NET多語程式撰寫
  • 用XML文件實現多語功能
  • XML序列化與解序列化

操作步驟

Step1.建立內含多語訊息的XML文件

XML文件格式可能如下,內含CultureInfo代碼與對應的訊息字串。

image

Step2.切換語系時,從XML文件中抓取對應的顯示字串

image

image

image

簡易實作範例

基本上這邊只是提示多語程式功能可透過XML文件實現,實現步驟大概如上面所述。然而XML文件的格式與存取的方法與寫法則就看個人怎樣編寫。這邊提供個簡易的範例:

MultiLanguage類別

MultiLanguage類別的Code如下

Imports System.Globalization
Imports System.Threading
Imports System.Xml.Serialization

Public Class MultiLanguage

Implements IXmlSerializable


#Region “Var”

Private _pool As New Hashtable
#End Region

#Region “Public Shared Method”

Public Shared Function GetFromXml(ByVal file As String) As MultiLanguage

Dim m As MultiLanguage

Dim x As New Xml.Serialization.XmlSerializer(GetType(MultiLanguage))

Dim fs As New IO.FileStream(file, IO.FileMode.Open)

m = CType(x.Deserialize(fs), MultiLanguage)

fs.Dispose()

Return m

End Function
#End Region

#Region “Public Method”

Public Sub AddString(ByVal key As String, ByVal msg As String, ByVal culture As String)

If Not _pool.ContainsKey(key) Then

_pool.Add(key, New Hashtable)

End If

CType(_pool(key), Hashtable).Add(culture, msg)

End Sub


Public Sub AddString(ByVal key As String, ByVal msg As String)

AddString(key, msg, Thread.CurrentThread.CurrentCulture.Name)

End Sub


Public Function GetString(ByVal key As String, ByVal culture As String) As String

If Not _pool.ContainsKey(key) Then

Return String.Empty

End If

Dim msgPool As Hashtable = CType(_pool(key), Hashtable)

If Not msgPool.ContainsKey(culture) Then

Return String.Empty

End If

Return msgPool(culture).ToString

End Function


Public Function GetString(ByVal key As String) As String

Return GetString(key, Thread.CurrentThread.CurrentCulture.Name)

End Function


Public Sub SaveXml(ByVal file As String)

Dim x As New Xml.Serialization.XmlSerializer(GetType(MultiLanguage))

Dim fs As New IO.FileStream(file, IO.FileMode.Create)

x.Serialize(fs, Me)

fs.Dispose()

End Sub
#End Region


#Region “Implements IXmlSerializable”

Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements System.Xml.Serialization.IXmlSerializable.GetSchema

Return Nothing

End Function


Public Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements System.Xml.Serialization.IXmlSerializable.ReadXml

Dim startElementName As String = reader.Name

Dim currentElementName As String


Do

currentElementName = reader.Name

If currentElementName = startElementName AndAlso (reader.MoveToContent = Xml.XmlNodeType.EndElement OrElse reader.IsEmptyElement) Then

reader.Read()

Exit Do

End If



Select Case currentElementName

Case “Item”

Dim key As String = reader.GetAttribute(“Key”)

Dim cultureKey As String = reader.GetAttribute(“Culture”)

Dim value As String = reader.ReadString()

reader.ReadEndElement()

AddString(key, value, cultureKey)


Case Else

reader.Read()

End Select



Loop


End Sub


Public Sub WriteXml(ByVal writer As System.Xml.XmlWriter) Implements System.Xml.Serialization.IXmlSerializable.WriteXml

Dim msgPool As Hashtable

For Each key As String In _pool.Keys

msgPool = CType(_pool(key), Hashtable)

For Each cultureKey As String In msgPool.Keys

writer.WriteStartElement(“Item”)

writer.WriteAttributeString(“Key”, key)

writer.WriteAttributeString(“Culture”, cultureKey)

writer.WriteString(msgPool(cultureKey).ToString)

writer.WriteEndElement()

Next

Next

End Sub
#End Region

End Class

建立各語系字串


m.AddString(“title”, “Title”, “en”)

m.AddString(“title”, “標題”, “zh-CHT”)

m.AddString(“title”, “标题”, “zh-CHS”)

切換語系


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Me.Text = m.GetString(“title”, “en”)

End Sub


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Me.Text = m.GetString(“title”, “zh-CHT”)

End Sub


Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

Me.Text = m.GetString(“title”, “zh-CHS”)

End Sub

儲存XML


m.SaveXml(“c:\test.xml”)

讀取XML

Dim m As MultiLanguage = MultiLanguage.GetFromXml(“c:\test.xml”)

image