OSDN Git Service

svnプロパティをファイルの種類に応じたものに更新
[wptscs/wpts.git] / Wptscs / Models / Language.cs
1 // ================================================================================================
2 // <summary>
3 //      言語に関する情報をあらわすモデルクラスソース</summary>
4 //
5 // <copyright file="Language.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     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         public Language(string code)
51         {
52             // メンバ変数の初期設定
53             this.Code = code;
54         }
55
56         /// <summary>
57         /// コンストラクタ(シリアライズ or 拡張用)。
58         /// </summary>
59         protected Language()
60         {
61         }
62
63         #endregion
64
65         #region プロパティ
66
67         /// <summary>
68         /// 言語のコード。
69         /// </summary>
70         public string Code
71         {
72             get
73             {
74                 return this.code;
75             }
76
77             set
78             {
79                 // ※必須な情報が設定されていない場合、例外を返す
80                 this.code = Validate.NotBlank(value, "code").ToLower();
81             }
82         }
83
84         /// <summary>
85         /// この言語の、各言語での名称。
86         /// </summary>
87         /// <remarks>空でもオブジェクトは存在。</remarks>
88         public IDictionary<string, LanguageName> Names
89         {
90             get
91             {
92                 return this.names;
93             }
94
95             set
96             {
97                 // ※必須な情報が設定されていない場合、例外を返す
98                 this.names = Validate.NotNull(value, "names");
99             }
100         }
101
102         /// <summary>
103         /// 括弧のフォーマット。
104         /// </summary>
105         /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>
106         public string Bracket
107         {
108             get
109             {
110                 if (String.IsNullOrWhiteSpace(this.bracket))
111                 {
112                     return Settings.Default.Bracket;
113                 }
114
115                 return this.bracket;
116             }
117
118             set
119             {
120                 this.bracket = value;
121             }
122         }
123
124         #endregion
125
126         #region XMLシリアライズ用メソッド
127
128         /// <summary>
129         /// シリアライズするXMLのスキーマ定義を返す。
130         /// </summary>
131         /// <returns>XML表現を記述するXmlSchema。</returns>
132         public System.Xml.Schema.XmlSchema GetSchema()
133         {
134             return null;
135         }
136
137         /// <summary>
138         /// XMLからオブジェクトをデシリアライズする。
139         /// </summary>
140         /// <param name="reader">デシリアライズ元のXmlReader</param>
141         public void ReadXml(XmlReader reader)
142         {
143             XmlDocument xml = new XmlDocument();
144             xml.Load(reader);
145
146             // Webサイトの言語情報
147             // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす
148             XmlElement langElement = xml.DocumentElement;
149             this.Code = langElement.GetAttribute("Code");
150             this.Bracket = XmlUtils.InnerText(langElement.SelectSingleNode("Bracket"));
151
152             // 言語の呼称情報
153             foreach (XmlNode nameNode in langElement.SelectNodes("Names/LanguageName"))
154             {
155                 XmlElement nameElement = nameNode as XmlElement;
156                 this.Names[nameElement.GetAttribute("Code")] = new LanguageName
157                 {
158                     Name = XmlUtils.InnerText(nameElement.SelectSingleNode("Name")),
159                     ShortName = XmlUtils.InnerText(nameElement.SelectSingleNode("ShortName"))
160                 };
161             }
162         }
163
164         /// <summary>
165         /// オブジェクトをXMLにシリアライズする。
166         /// </summary>
167         /// <param name="writer">シリアライズ先のXmlWriter</param>
168         public void WriteXml(XmlWriter writer)
169         {
170             // Webサイトの言語情報
171             writer.WriteAttributeString("Code", this.Code);
172
173             // 言語の呼称情報
174             writer.WriteStartElement("Names");
175             foreach (KeyValuePair<string, LanguageName> name in this.Names)
176             {
177                 writer.WriteStartElement("LanguageName");
178                 writer.WriteAttributeString("Code", name.Key);
179                 writer.WriteElementString("Name", name.Value.Name);
180                 writer.WriteElementString("ShortName", name.Value.ShortName);
181                 writer.WriteEndElement();
182             }
183
184             writer.WriteEndElement();
185             writer.WriteElementString("Bracket", this.bracket);
186         }
187
188         #endregion
189
190         #region 構造体
191
192         /// <summary>
193         /// ある言語の、各言語での名称・略称を格納するための構造体です。
194         /// </summary>
195         public struct LanguageName
196         {
197             /// <summary>
198             /// 言語の名称。
199             /// </summary>
200             public string Name;
201
202             /// <summary>
203             /// 言語の略称。
204             /// </summary>
205             public string ShortName;
206         }
207
208         #endregion
209     }
210 }