OSDN Git Service

#30244 Visual Studio 2012 Express for Windows Desktop, StyleCop 4.7, WiX 3.6 に合わせたソース...
[wptscs/wpts.git] / Wptscs / Models / Language.cs
1 // ================================================================================================
2 // <summary>
3 //      言語に関する情報をあらわすモデルクラスソース</summary>
4 //
5 // <copyright file="Language.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2012 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     using Honememo.Wptscs.Properties;
19
20     /// <summary>
21     /// 言語に関する情報をあらわすモデルクラスです。
22     /// </summary>
23     public class Language : IXmlSerializable
24     {
25         #region private変数
26
27         /// <summary>
28         /// 言語のコード。
29         /// </summary>
30         private string code;
31
32         /// <summary>
33         /// この言語の、各言語での名称。
34         /// </summary>
35         private IDictionary<string, LanguageName> names = new Dictionary<string, LanguageName>();
36
37         /// <summary>
38         /// 括弧のフォーマット。
39         /// </summary>
40         private string bracket;
41
42         #endregion
43
44         #region コンストラクタ
45
46         /// <summary>
47         /// 指定された言語コードの言語インスタンスを作成する。
48         /// </summary>
49         /// <param name="code">言語のコード。</param>
50         /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
51         /// <exception cref="ArgumentException">空文字列が指定された場合。</exception>
52         public Language(string code)
53         {
54             // メンバ変数の初期設定
55             this.Code = code;
56         }
57
58         /// <summary>
59         /// 空のインスタンスを作成する(シリアライズ or 拡張用)。
60         /// </summary>
61         protected Language()
62         {
63         }
64
65         #endregion
66
67         #region プロパティ
68
69         /// <summary>
70         /// 言語のコード。
71         /// </summary>
72         /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
73         /// <exception cref="ArgumentException">空文字列が指定された場合。</exception>
74         public string Code
75         {
76             get
77             {
78                 return this.code;
79             }
80
81             set
82             {
83                 this.code = Validate.NotBlank(value, "code").ToLower();
84             }
85         }
86
87         /// <summary>
88         /// この言語の、各言語での名称。
89         /// </summary>
90         /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
91         /// <remarks>空でもオブジェクトは存在。</remarks>
92         public IDictionary<string, LanguageName> Names
93         {
94             get
95             {
96                 return this.names;
97             }
98
99             set
100             {
101                 this.names = Validate.NotNull(value);
102             }
103         }
104
105         /// <summary>
106         /// 括弧のフォーマット。
107         /// </summary>
108         /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>
109         public string Bracket
110         {
111             get
112             {
113                 if (string.IsNullOrWhiteSpace(this.bracket))
114                 {
115                     return Settings.Default.Bracket;
116                 }
117
118                 return this.bracket;
119             }
120
121             set
122             {
123                 this.bracket = value;
124             }
125         }
126
127         #endregion
128
129         #region 公開メソッド
130
131         /// <summary>
132         /// <see cref="Bracket"/> を渡された値で書式化した文字列を返す。
133         /// </summary>
134         /// <param name="value">記事名。</param>
135         /// <returns>書式化した文字列。<see cref="Bracket"/>が未設定の場合<c>null</c>。</returns>
136         public string FormatBracket(string value)
137         {
138             return StringUtils.FormatDollarVariable(this.Bracket, value);
139         }
140
141         #endregion
142
143         #region XMLシリアライズ用メソッド
144
145         /// <summary>
146         /// シリアライズするXMLのスキーマ定義を返す。
147         /// </summary>
148         /// <returns>XML表現を記述する<see cref="System.Xml.Schema.XmlSchema"/>。</returns>
149         public System.Xml.Schema.XmlSchema GetSchema()
150         {
151             return null;
152         }
153
154         /// <summary>
155         /// XMLからオブジェクトをデシリアライズする。
156         /// </summary>
157         /// <param name="reader">デシリアライズ元の<see cref="XmlReader"/>。</param>
158         public void ReadXml(XmlReader reader)
159         {
160             XmlDocument xml = new XmlDocument();
161             xml.Load(reader);
162
163             // Webサイトの言語情報
164             // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす
165             XmlElement langElement = xml.DocumentElement;
166             this.Code = langElement.GetAttribute("Code");
167             this.Bracket = XmlUtils.InnerText(langElement.SelectSingleNode("Bracket"));
168
169             // 言語の呼称情報
170             foreach (XmlNode nameNode in langElement.SelectNodes("Names/LanguageName"))
171             {
172                 XmlElement nameElement = nameNode as XmlElement;
173                 this.Names[nameElement.GetAttribute("Code")] = new LanguageName
174                 {
175                     Name = XmlUtils.InnerText(nameElement.SelectSingleNode("Name")),
176                     ShortName = XmlUtils.InnerText(nameElement.SelectSingleNode("ShortName"))
177                 };
178             }
179         }
180
181         /// <summary>
182         /// オブジェクトをXMLにシリアライズする。
183         /// </summary>
184         /// <param name="writer">シリアライズ先の<see cref="XmlWriter"/>。</param>
185         public void WriteXml(XmlWriter writer)
186         {
187             // Webサイトの言語情報
188             writer.WriteAttributeString("Code", this.Code);
189
190             // 言語の呼称情報
191             writer.WriteStartElement("Names");
192             foreach (KeyValuePair<string, LanguageName> name in this.Names)
193             {
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();
199             }
200
201             writer.WriteEndElement();
202             writer.WriteElementString("Bracket", this.bracket);
203         }
204
205         #endregion
206
207         #region 構造体
208
209         /// <summary>
210         /// ある言語の、各言語での名称・略称を格納するための構造体です。
211         /// </summary>
212         public struct LanguageName
213         {
214             /// <summary>
215             /// 言語の名称。
216             /// </summary>
217             public string Name;
218
219             /// <summary>
220             /// 言語の略称。
221             /// </summary>
222             public string ShortName;
223         }
224
225         #endregion
226     }
227 }