using System;
using System.Xml;
using System.Collections;
/// <summary>
/// 多國語言處理類別
/// 因應多國語言的需求, 特別設計一個以 XML 為主的類別
/// Usage:
///
/// MessageManager L_Manager = new MessageManager("Language.xml");
/// L_Manager.CreateNewMessageTable();
/// L_Manager.Load_MultiLanguage();
/// String strTitles=L_Manager.getMessage("ProgramTitle", "S_Chinese");
///
/// Abstract Storage Structure
/// [ ]
/// [ ] ----> ArrayList ->[A lang][...]
// ->[B lang][...]
/// </summary>
namespace Player {
public class MessageManager {
String strFilename;
System.Collections.Hashtable LanguageTable = new System.Collections.Hashtable();
public MessageManager(String strFilename) {
this.strFilename = strFilename;
}
// 建立多國語言屬性訊息表
public void CreateNewMessageTable() {
string[] Default ={ "<!-- MultiLanguage Setup File (多國語言設定檔)",
" ",
" You can add your native language to the EZLearn Helper.",
" 你可以加入自己國家慣用的語言到 EZLearn 語言學習機.",
" Ex:",
"<LanguageItem Title=\"Version_Text\"",
"T_Chinese=\"版本\"",
"S_Chinese=\"版本\"",
"English=\"Ver.\"",
"/>",
" ",
" Manual Edit: NotePad.exe (*the saving format, please choose UTF-8).",
"-->",
"<EZLearn_Multi_Language FileName=\"Default_Mutilanguage_Data\" >",
" ",
"<Title value=\"ProgramTitle\" >",
" <Language Name=\"T_Chinese\" ",
" value=\"EZLearn 語言學習機\"",
" />",
" <Language Name=\"S_Chinese\" ",
" value=\"EZLearn 语言学习机\"",
" />",
" <Language Name=\"English\" ",
" value=\"EZLearn Helper\"",
" />",
"</Title>",
" ",
"<Title value=\"menuItem9.Text\" >",
" <Language Name=\"T_Chinese\" ",
" value=\"功能\"",
" />",
" <Language Name=\"S_Chinese\" ",
" value=\"功能\"",
" />",
" <Language Name=\"English\" ",
" value=\"Function\"",
" />",
"</Title>",
" ",
"<Title value=\"menuItem34.Text\" >",
" <Language Name=\"T_Chinese\" ",
" value=\"網際網路上的電子字典\"",
" />",
" <Language Name=\"S_Chinese\" ",
" value=\"网际网路上的电子字典\"",
" />",
" <Language Name=\"English\" ",
" value=\"On-Line Dictionaries\"",
" />",
"</Title>",
" ",
"</EZLearn_Multi_Language>"};
// Create a initial mult-language setup file
Create_A_New_XML_File(strFilename, Default);
}
public string getMessage(string strTitle, string strLanguage) {
ArrayList LanguagePairList = (ArrayList)LanguageTable[strTitle];
for (int i = 0; i < LanguagePairList.Count; i++) {
string[] strLanguageNameValuePair = (string[])LanguagePairList[i];
if (strLanguageNameValuePair[0].Equals(strLanguage)) {
return strLanguageNameValuePair[1];
}
}
return getMessage(strTitle, "English");
}
public bool Load_MultiLanguage() {
XmlValidatingReader reader = null;
try {
XmlTextReader txtreader = new XmlTextReader(strFilename);
txtreader.WhitespaceHandling = WhitespaceHandling.None;
//Implement the validating reader over the text reader.
reader = new XmlValidatingReader(txtreader);
reader.ValidationType = ValidationType.None;
//Parse the XML fragment. If they exist, display the
//prefix and namespace URI of each element.
string[] Item_Title_Address = null;
bool brule = false;
// 讀取一行 XML 指令
ArrayList Language_Name_ValuePairArray = null;
while (reader.Read()) {
switch (reader.NodeType) {
// 讀取 value = "字串"
case XmlNodeType.Element:
//Console.WriteLine("<{0}>", reader.LocalName); // Debug Information
string ElementName = reader.LocalName;
String strTitle, strLanguageName, strLanguageValue;
int Step = 0;
switch (ElementName) {
case "LanguageItem":
// 讀取各種語言的文字說明
String[] strLanguageItemArray = new String[reader.AttributeCount];
for (int i = 0; i < reader.AttributeCount; i++) {
strLanguageItemArray[i] = (string)reader.GetAttribute(i);
}
// 讀完後, 放到 Hash 中
string Title = strLanguageItemArray[0]; // 利用 變數名稱當作 key, 把多國語言陣列放到 Hash 中
LanguageTable.Add(Title, strLanguageItemArray);
break;
case "Title":
strTitle = (string)reader.GetAttribute(0);
// 遇到新的 變數Title, 建立語言對應表
// [ ]
// [ ] ----> ArrayList ->[A lang][...]
// ->[B lang][...]
Language_Name_ValuePairArray = new ArrayList();
LanguageTable.Add(strTitle, Language_Name_ValuePairArray);
break;
case "Language":
strLanguageName = (string)reader.GetAttribute(0);
strLanguageValue = (string)reader.GetAttribute(1);
String[] Language_Name_ValuePair = new String[2];
Language_Name_ValuePair[0] = strLanguageName;
Language_Name_ValuePair[1] = strLanguageValue;
if (Language_Name_ValuePairArray != null)
Language_Name_ValuePairArray.Add(Language_Name_ValuePair);
else
return false;
//Language_Name_ValuePairArray.Add(Language_Name_ValuePair); // 把收集到的目前語言收起來
break;
}
break;
}
}
txtreader.Close();
}
catch (System.Xml.XmlException ee) {
System.Windows.Forms.MessageBox.Show("XML 語法檢查錯誤\n\n請修正 Dictionary.xml內容.\n\n如果想要回復預設值,\n請刪除 Dictionary.xml 檔即可");
Console.WriteLine("Exception " + ee);
return false;
}
return true;
}
// XML Utilities
// Create a new XML file
public void Create_A_New_XML_File(String strFilename, String[] InitialContent) {
using (System.IO.StreamWriter writer = System.IO.File.CreateText(strFilename)) {
for (int i = 0; i < InitialContent.Length; i++) {
writer.WriteLine(InitialContent[i]);
}
}// end of using
}
// Read whole langauge setting
public void ReadWholeItemsInfo(XmlValidatingReader reader) {
}
}
}// end of Player namespace