OSDN Git Service

Wikipedia翻訳支援ツール Ver1.10時点のソース
[wptscs/wpts.git] / Wptscs / Models / TranslationDictionary.cs
1 // ================================================================================================
2 // <summary>
3 //      言語間の翻訳パターンをあらわすモデルクラスソース</summary>
4 //
5 // <copyright file="TranslationDictionary.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2011 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.Models;
18     using Honememo.Utilities;
19     using Honememo.Wptscs.Properties;
20
21     /// <summary>
22     /// 言語間の翻訳パターンをあらわすモデルクラスです。
23     /// </summary>
24     /// <remarks>用途上、大文字小文字の違いは無視する。</remarks>
25     public class TranslationDictionary : IgnoreCaseDictionary<TranslationDictionary.Item>, IXmlSerializable
26     {
27         #region private変数
28
29         /// <summary>
30         /// 翻訳元言語コード。
31         /// </summary>
32         private string from;
33
34         /// <summary>
35         /// 翻訳先言語コード。
36         /// </summary>
37         private string to;
38
39         #endregion
40
41         #region コンストラクタ
42
43         /// <summary>
44         /// コンストラクタ(通常)。
45         /// </summary>
46         /// <param name="from">翻訳元言語コード。</param>
47         /// <param name="to">翻訳先言語コード。</param>
48         public TranslationDictionary(string from, string to)
49         {
50             // メンバ変数の初期設定
51             this.From = from;
52             this.To = to;
53         }
54
55         /// <summary>
56         /// コンストラクタ(シリアライズ or 拡張用)。
57         /// </summary>
58         protected TranslationDictionary()
59         {
60         }
61
62         #endregion
63
64         #region プロパティ
65         
66         /// <summary>
67         /// 翻訳元言語コード。
68         /// </summary>
69         public string From
70         {
71             get
72             {
73                 return this.from;
74             }
75
76             set
77             {
78                 // ※必須な情報が設定されていない場合、例外を返す
79                 this.from = Validate.NotBlank(value, "from");
80             }
81         }
82
83         /// <summary>
84         /// 翻訳先言語コード。
85         /// </summary>
86         public string To
87         {
88             get
89             {
90                 return this.to;
91             }
92
93             set
94             {
95                 // ※必須な情報が設定されていない場合、例外を返す
96                 this.to = Validate.NotBlank(value, "to");
97             }
98         }
99
100         #endregion
101
102         #region 静的メソッド
103
104         /// <summary>
105         /// コレクションから指定された言語の翻訳パターンを取得する。
106         /// 存在しない場合は空のインスタンスを生成、コレクションに追加して返す。
107         /// </summary>
108         /// <param name="collection">翻訳パターンを含んだコレクション。</param>
109         /// <param name="from">翻訳元言語。</param>
110         /// <param name="to">翻訳先言語。</param>
111         /// <returns>翻訳パターン。存在しない場合は新たに作成した翻訳パターンを返す。</returns>
112         public static TranslationDictionary GetDictionaryNeedCreate(
113             ICollection<TranslationDictionary> collection, string from, string to)
114         {
115             // 設定が存在すれば取得した値を返す
116             foreach (TranslationDictionary d in collection)
117             {
118                 if (d.From == from && d.To == to)
119                 {
120                     return d;
121                 }
122             }
123
124             // 存在しない場合、作成した翻訳パターンをコレクションに追加し、返す
125             TranslationDictionary dic = new TranslationDictionary(from, to);
126             collection.Add(dic);
127             return dic;
128         }
129
130         #endregion
131
132         #region XMLシリアライズ用メソッド
133
134         /// <summary>
135         /// シリアライズするXMLのスキーマ定義を返す。
136         /// </summary>
137         /// <returns>XML表現を記述するXmlSchema。</returns>
138         public System.Xml.Schema.XmlSchema GetSchema()
139         {
140             return null;
141         }
142
143         /// <summary>
144         /// XMLからオブジェクトをデシリアライズする。
145         /// </summary>
146         /// <param name="reader">デシリアライズ元のXmlReader</param>
147         public void ReadXml(XmlReader reader)
148         {
149             XmlDocument xml = new XmlDocument();
150             xml.Load(reader);
151
152             // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす
153             XmlElement tableElement = xml.DocumentElement;
154             this.From = tableElement.GetAttribute("From");
155             this.To = tableElement.GetAttribute("To");
156
157             // 各対訳の読み込み
158             foreach (XmlNode itemNode in tableElement.SelectNodes("Item"))
159             {
160                 XmlElement itemElement = itemNode as XmlElement;
161                 Item item = new Item();
162                 item.Word = itemElement.GetAttribute("To");
163                 item.Alias = itemElement.GetAttribute("Redirect");
164                 string timestamp = itemElement.GetAttribute("Timestamp");
165                 if (!String.IsNullOrEmpty(timestamp))
166                 {
167                     item.Timestamp = DateTime.Parse(timestamp);
168
169                     // 登録日時が有効期限より古い場合は破棄する
170                     if (DateTime.Now - Settings.Default.CacheExpire > item.Timestamp.Value)
171                     {
172                         continue;
173                     }
174                 }
175
176                 this[itemElement.GetAttribute("From")] = item;
177             }
178         }
179
180         /// <summary>
181         /// オブジェクトをXMLにシリアライズする。
182         /// </summary>
183         /// <param name="writer">シリアライズ先のXmlWriter</param>
184         public void WriteXml(XmlWriter writer)
185         {
186             writer.WriteAttributeString("From", this.From);
187             writer.WriteAttributeString("To", this.To);
188
189             // 各対訳の出力
190             foreach (KeyValuePair<string, Item> item in this)
191             {
192                 writer.WriteStartElement("Item");
193                 writer.WriteAttributeString("From", item.Key);
194                 writer.WriteAttributeString("To", item.Value.Word);
195                 if (!String.IsNullOrWhiteSpace(item.Value.Alias))
196                 {
197                     writer.WriteAttributeString("Redirect", item.Value.Alias);
198                 }
199
200                 if (item.Value.Timestamp.HasValue)
201                 {
202                     writer.WriteAttributeString(
203                         "Timestamp",
204                         XmlConvert.ToString(item.Value.Timestamp.Value, XmlDateTimeSerializationMode.Utc));
205                 }
206
207                 writer.WriteEndElement();
208             }
209         }
210
211         #endregion
212
213         #region 構造体
214
215         /// <summary>
216         /// 対訳表の翻訳先をあらわす構造体です。
217         /// </summary>
218         public struct Item
219         {
220             /// <summary>
221             /// 翻訳先語句。
222             /// </summary>
223             /// <remarks>翻訳先の語句が存在しないことを明示する場合<c>null</c>または空。</remarks>
224             public string Word;
225
226             /// <summary>
227             /// 登録日時。
228             /// </summary>
229             /// <remarks>有効期間としても使用。無期限である場合<c>null</c>。</remarks>
230             public DateTime? Timestamp;
231
232             /// <summary>
233             /// 翻訳先別名。
234             /// </summary>
235             /// <remarks>Wikipediaのリダイレクト等を意図。別名が無い場合<c>null</c>または空。</remarks>
236             public string Alias;
237         }
238
239         #endregion
240     }
241 }