1 // ================================================================================================
3 // 言語間の翻訳パターンをあらわすモデルクラスソース</summary>
5 // <copyright file="TranslationDictionary.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2011 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Wptscs.Models
14 using System.Collections.Generic;
16 using System.Xml.Serialization;
17 using Honememo.Models;
18 using Honememo.Utilities;
19 using Honememo.Wptscs.Properties;
22 /// 言語間の翻訳パターンをあらわすモデルクラスです。
24 /// <remarks>用途上、大文字小文字の違いは無視する。</remarks>
25 public class TranslationDictionary : IgnoreCaseDictionary<TranslationDictionary.Item>, IXmlSerializable
46 /// <param name="from">翻訳元言語コード。</param>
47 /// <param name="to">翻訳先言語コード。</param>
48 public TranslationDictionary(string from, string to)
56 /// コンストラクタ(シリアライズ or 拡張用)。
58 protected TranslationDictionary()
78 // ※必須な情報が設定されていない場合、例外を返す
79 this.from = Validate.NotBlank(value, "from");
95 // ※必須な情報が設定されていない場合、例外を返す
96 this.to = Validate.NotBlank(value, "to");
105 /// コレクションから指定された言語の翻訳パターンを取得する。
106 /// 存在しない場合は空のインスタンスを生成、コレクションに追加して返す。
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)
116 foreach (TranslationDictionary d in collection)
118 if (d.From == from && d.To == to)
124 // 存在しない場合、作成した翻訳パターンをコレクションに追加し、返す
125 TranslationDictionary dic = new TranslationDictionary(from, to);
132 #region XMLシリアライズ用メソッド
135 /// シリアライズするXMLのスキーマ定義を返す。
137 /// <returns>XML表現を記述するXmlSchema。</returns>
138 public System.Xml.Schema.XmlSchema GetSchema()
144 /// XMLからオブジェクトをデシリアライズする。
146 /// <param name="reader">デシリアライズ元のXmlReader</param>
147 public void ReadXml(XmlReader reader)
149 XmlDocument xml = new XmlDocument();
152 // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす
153 XmlElement tableElement = xml.DocumentElement;
154 this.From = tableElement.GetAttribute("From");
155 this.To = tableElement.GetAttribute("To");
158 foreach (XmlNode itemNode in tableElement.SelectNodes("Item"))
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))
167 item.Timestamp = DateTime.Parse(timestamp);
169 // 登録日時が有効期限より古い場合は破棄する
170 if (DateTime.Now - Settings.Default.CacheExpire > item.Timestamp.Value)
176 this[itemElement.GetAttribute("From")] = item;
181 /// オブジェクトをXMLにシリアライズする。
183 /// <param name="writer">シリアライズ先のXmlWriter</param>
184 public void WriteXml(XmlWriter writer)
186 writer.WriteAttributeString("From", this.From);
187 writer.WriteAttributeString("To", this.To);
190 foreach (KeyValuePair<string, Item> item in this)
192 writer.WriteStartElement("Item");
193 writer.WriteAttributeString("From", item.Key);
194 writer.WriteAttributeString("To", item.Value.Word);
195 if (!String.IsNullOrWhiteSpace(item.Value.Alias))
197 writer.WriteAttributeString("Redirect", item.Value.Alias);
200 if (item.Value.Timestamp.HasValue)
202 writer.WriteAttributeString(
204 XmlConvert.ToString(item.Value.Timestamp.Value, XmlDateTimeSerializationMode.Utc));
207 writer.WriteEndElement();
216 /// 対訳表の翻訳先をあらわす構造体です。
223 /// <remarks>翻訳先の語句が存在しないことを明示する場合<c>null</c>または空。</remarks>
229 /// <remarks>有効期間としても使用。無期限である場合<c>null</c>。</remarks>
230 public DateTime? Timestamp;
235 /// <remarks>Wikipediaのリダイレクト等を意図。別名が無い場合<c>null</c>または空。</remarks>