1 // ================================================================================================
3 // 言語に関する情報をあらわすモデルクラスソース</summary>
5 // <copyright file="Language.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Wptscs.Models
14 using System.Collections.Generic;
16 using System.Xml.Serialization;
17 using Honememo.Utilities;
18 using Honememo.Wptscs.Properties;
21 /// 言語に関する情報をあらわすモデルクラスです。
23 public class Language : IXmlSerializable
35 private IDictionary<string, LanguageName> names = new Dictionary<string, LanguageName>();
40 private string bracket;
47 /// 指定された言語コードの言語インスタンスを作成する。
49 /// <param name="code">言語のコード。</param>
50 /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
51 /// <exception cref="ArgumentException">空文字列が指定された場合。</exception>
52 public Language(string code)
59 /// 空のインスタンスを作成する(シリアライズ or 拡張用)。
72 /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
73 /// <exception cref="ArgumentException">空文字列が指定された場合。</exception>
83 this.code = Validate.NotBlank(value, "code").ToLower();
90 /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
91 /// <remarks>空でもオブジェクトは存在。</remarks>
92 public IDictionary<string, LanguageName> Names
101 this.names = Validate.NotNull(value);
108 /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>
109 public string Bracket
113 if (string.IsNullOrWhiteSpace(this.bracket))
115 return Settings.Default.Bracket;
123 this.bracket = value;
132 /// <see cref="Bracket"/> を渡された値で書式化した文字列を返す。
134 /// <param name="value">記事名。</param>
135 /// <returns>書式化した文字列。<see cref="Bracket"/>が未設定の場合<c>null</c>。</returns>
136 public string FormatBracket(string value)
138 return StringUtils.FormatDollarVariable(this.Bracket, value);
143 #region XMLシリアライズ用メソッド
146 /// シリアライズするXMLのスキーマ定義を返す。
148 /// <returns>XML表現を記述する<see cref="System.Xml.Schema.XmlSchema"/>。</returns>
149 public System.Xml.Schema.XmlSchema GetSchema()
155 /// XMLからオブジェクトをデシリアライズする。
157 /// <param name="reader">デシリアライズ元の<see cref="XmlReader"/>。</param>
158 public void ReadXml(XmlReader reader)
160 XmlDocument xml = new XmlDocument();
164 // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす
165 XmlElement langElement = xml.DocumentElement;
166 this.Code = langElement.GetAttribute("Code");
167 this.Bracket = XmlUtils.InnerText(langElement.SelectSingleNode("Bracket"));
170 foreach (XmlNode nameNode in langElement.SelectNodes("Names/LanguageName"))
172 XmlElement nameElement = nameNode as XmlElement;
173 this.Names[nameElement.GetAttribute("Code")] = new LanguageName
175 Name = XmlUtils.InnerText(nameElement.SelectSingleNode("Name")),
176 ShortName = XmlUtils.InnerText(nameElement.SelectSingleNode("ShortName"))
182 /// オブジェクトをXMLにシリアライズする。
184 /// <param name="writer">シリアライズ先の<see cref="XmlWriter"/>。</param>
185 public void WriteXml(XmlWriter writer)
188 writer.WriteAttributeString("Code", this.Code);
191 writer.WriteStartElement("Names");
192 foreach (KeyValuePair<string, LanguageName> name in this.Names)
194 writer.WriteStartElement("LanguageName");
195 writer.WriteAttributeString("Code", name.Key);
196 writer.WriteElementString("Name", name.Value.Name);
197 writer.WriteElementString("ShortName", name.Value.ShortName);
198 writer.WriteEndElement();
201 writer.WriteEndElement();
202 writer.WriteElementString("Bracket", this.bracket);
210 /// ある言語の、各言語での名称・略称を格納するための構造体です。
212 public struct LanguageName
222 public string ShortName;