OSDN Git Service

svnプロパティをファイルの種類に応じたものに更新
[wptscs/wpts.git] / Wptscs / Models / TranslationTable.cs
1 // ================================================================================================
2 // <summary>
3 //      言語間の対訳表をあらわすモデルクラスソース</summary>
4 //
5 // <copyright file="TranslationTable.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Wptscs.Models
12 {
13     using System;
14     using System.Collections.Generic;
15     using System.Xml;
16     using System.Xml.Serialization;
17     using Honememo.Utilities;
18
19     /// <summary>
20     /// 言語間の対訳表をあらわすモデルクラスです。
21     /// </summary>
22     public class TranslationTable : List<IDictionary<string, string>>, IXmlSerializable
23     {
24         #region プロパティ
25         
26         /// <summary>
27         /// 翻訳元言語コード。
28         /// </summary>
29         public string From
30         {
31             get;
32             set;
33         }
34
35         /// <summary>
36         /// 翻訳先言語コード。
37         /// </summary>
38         public string To
39         {
40             get;
41             set;
42         }
43
44         #endregion
45
46         #region 公開メソッド
47
48         /// <summary>
49         /// 指定された言語の対訳語を取得する。
50         /// </summary>
51         /// <param name="from">翻訳元言語コード。</param>
52         /// <param name="to">翻訳先言語コード。</param>
53         /// <param name="word">翻訳元語。</param>
54         /// <returns>対訳語。登録されていない場合 <c>null</c>。</returns>
55         /// <remarks>大文字小文字は区別しない。</remarks>
56         public string GetWord(string from, string to, string word)
57         {
58             // nullは不可。以降でエラーになるためここでチェック
59             Validate.NotNull(from, "from");
60             Validate.NotNull(to, "to");
61             Validate.NotNull(word, "word");
62
63             string w = word.ToLower();
64             foreach (IDictionary<string, string> record in this)
65             {
66                 if (record.ContainsKey(from) && record[from].ToLower() == w)
67                 {
68                     string c = null;
69                     if (record.ContainsKey(to))
70                     {
71                         c = record[to];
72                     }
73
74                     return c;
75                 }
76             }
77
78             return null;
79         }
80
81         /// <summary>
82         /// 指定されている言語の組み合わせで対訳語を取得する。
83         /// </summary>
84         /// <param name="word">翻訳元語。</param>
85         /// <returns>対訳語。登録されていない場合 <c>null</c>。</returns>
86         /// <remarks>大文字小文字は区別しない。</remarks>
87         public string GetWord(string word)
88         {
89             if (String.IsNullOrEmpty(this.From) || String.IsNullOrEmpty(this.To))
90             {
91                 throw new InvalidOperationException("empty from or to");
92             }
93
94             return this.GetWord(this.From, this.To, word);
95         }
96
97         #endregion
98
99         #region XMLシリアライズ用メソッド
100
101         /// <summary>
102         /// シリアライズするXMLのスキーマ定義を返す。
103         /// </summary>
104         /// <returns>XML表現を記述するXmlSchema。</returns>
105         public System.Xml.Schema.XmlSchema GetSchema()
106         {
107             return null;
108         }
109
110         /// <summary>
111         /// XMLからオブジェクトをデシリアライズする。
112         /// </summary>
113         /// <param name="reader">デシリアライズ元のXmlReader</param>
114         public void ReadXml(XmlReader reader)
115         {
116             XmlDocument xml = new XmlDocument();
117             xml.Load(reader);
118
119             // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす
120             XmlElement tableElement = xml.DocumentElement;
121
122             // 各対訳の読み込み
123             this.Clear();
124             foreach (XmlNode recordNode in tableElement.SelectNodes("Group"))
125             {
126                 IDictionary<string, string> record = new Dictionary<string, string>();
127                 foreach (XmlNode wordNode in recordNode)
128                 {
129                     XmlElement wordElement = wordNode as XmlElement;
130                     record[wordElement.GetAttribute("Lang")] = wordElement.InnerText;
131                 }
132
133                 this.Add(record);
134             }
135         }
136
137         /// <summary>
138         /// オブジェクトをXMLにシリアライズする。
139         /// </summary>
140         /// <param name="writer">シリアライズ先のXmlWriter</param>
141         public void WriteXml(XmlWriter writer)
142         {
143             // 各対訳の出力
144             foreach (IDictionary<string, string> record in this)
145             {
146                 writer.WriteStartElement("Group");
147                 foreach (KeyValuePair<string, string> word in record)
148                 {
149                     writer.WriteStartElement("Word");
150                     writer.WriteAttributeString("Lang", word.Key);
151                     writer.WriteValue(word.Value);
152                     writer.WriteEndElement();
153                 }
154
155                 writer.WriteEndElement();
156             }
157         }
158
159         #endregion
160     }
161 }