OSDN Git Service

#36057 configファイルがxml化したため、従来Config.iniファイルを直接編集することでのみ設定変更できていた項目が、設定変更しづらくなった。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / 全体 / CResources.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Linq;\r
4 using System.Text;\r
5 using System.Threading.Tasks;\r
6 using System.Resources;\r
7 using System.Diagnostics;\r
8 \r
9 \r
10 namespace DTXMania\r
11 {\r
12         /// <summary>\r
13         /// 多言語メッセージ情報を扱います。\r
14         /// </summary>\r
15         public class CResources\r
16         {\r
17                 private const string csvFileName = @"System\resources.csv";\r
18 \r
19                 private string[] csvHeader = null;\r
20                 private Dictionary<string, string> dict = new Dictionary<string, string>();\r
21 \r
22                 private string[] langcodelist = null, langdisplist = null;\r
23 \r
24                 private string strLanguageCode;\r
25 \r
26 \r
27                 /// <summary>\r
28                 /// 表示に使用する言語情報を取得/設定する\r
29                 /// 例: Language("ja-JP") など。\r
30                 /// </summary>\r
31                 public string Language\r
32                 {\r
33                         get {\r
34                                 if ( strLanguageCode == "" || strLanguageCode == null )\r
35                                 {\r
36                                         string s = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;\r
37                                         if ( s == "" || !csvHeader.Contains( s+".title" ) )\r
38                                         {\r
39                                                 strLanguageCode = "default";\r
40                                         }\r
41                                         else\r
42                                         {\r
43                                                 strLanguageCode = s;\r
44                                         }\r
45 \r
46                                 }\r
47 //Debug.WriteLine( "Get: strLanguageCode: " + strLanguageCode );\r
48                                 return strLanguageCode;\r
49                         }\r
50                         set\r
51                         {\r
52                                 if ( value == "" || value == null )\r
53                                 {\r
54                                         string s = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;\r
55                                         if ( s == "" || !csvHeader.Contains( s + ".title" ) )\r
56                                         {\r
57                                                 strLanguageCode = "default";\r
58                                         }\r
59                                         else\r
60                                         {\r
61                                                 strLanguageCode = s;\r
62                                         }\r
63                                 }\r
64                                 else\r
65                                 {\r
66                                         if ( !csvHeader.Contains( value + ".title" ) )\r
67                                         {\r
68                                                 strLanguageCode = "default";\r
69                                         }\r
70                                         else\r
71                                         {\r
72                                                 strLanguageCode = value;\r
73                                         }\r
74                                 }\r
75                                 if ( CDTXMania.Instance.ConfigIni != null )\r
76                                 {\r
77                                         CDTXMania.Instance.ConfigIni.strLanguage.Value = strLanguageCode;\r
78 //Debug.WriteLine( "strLang.Value=" + CDTXMania.Instance.ConfigIni.strLanguage.Value );\r
79                                 }\r
80 //Debug.WriteLine( "Set: strLanguageCode: " + strLanguageCode );\r
81                         }\r
82                 }\r
83 \r
84                 /// <summary>\r
85                 /// 使用可能な言語(表示名)のリストを返す\r
86                 /// </summary>\r
87                 /// <remarks>\r
88                 /// listの格納順は、LanguageCodeListと一致する。\r
89                 /// </remarks>\r
90                 public string[] LanguageDispList\r
91                 {\r
92                         get\r
93                         {\r
94                                 return langdisplist;\r
95                         }\r
96                 }\r
97 \r
98                 /// <summary>\r
99                 /// 使用可能な言語(ja-JPなどの言語コード)のリストを返す\r
100                 /// </summary>\r
101                 /// <remarks>\r
102                 /// listの格納順は、LanguageDispListと一致する。\r
103                 /// </remarks>\r
104                 public string[] LanguageCodeList\r
105                 {\r
106                         get\r
107                         {\r
108                                 return langcodelist;\r
109                         }\r
110                 }\r
111                 /// <summary>\r
112                 /// 現在設定されている言語のindex順を返す\r
113                 /// LanguageDispListやLanguageCodeListのindexに相当する\r
114                 /// </summary>\r
115                 public int LanguageCodeIndex\r
116                 {\r
117                         get\r
118                         {\r
119                                 int index = Array.IndexOf( langcodelist, strLanguageCode );\r
120                                 if ( index < 0 ) index = 0;\r
121                                 return index;\r
122                         }\r
123                 }\r
124                 \r
125                 /// <summary>\r
126                 /// key名に相当するlabel(表示名)を返す\r
127                 /// </summary>\r
128                 /// <param name="key"></param>\r
129                 /// <returns></returns>\r
130                 public string Label( string key )\r
131                 {\r
132                         return Resource( key, "title", strLanguageCode );\r
133                 }\r
134                 public string Label( string key, string strLang )\r
135                 {\r
136                         return Resource( key, "title", strLang );\r
137                 }\r
138                 /// <summary>\r
139                 /// key名に相当するExplanation(説明文)を返す\r
140                 /// </summary>\r
141                 /// <param name="key"></param>\r
142                 /// <returns></returns>\r
143                 public string Explanation( string key )\r
144                 {\r
145                         return Resource( key, "value", strLanguageCode );\r
146                 }\r
147                 /// <summary>\r
148                 /// key名に相当するitem(コンマ区切りの選択肢)を返す\r
149                 /// ただし現在は未使用\r
150                 /// /// </summary>\r
151                 /// <param name="key"></param>\r
152                 /// <returns></returns>\r
153                 public string Items( string key )\r
154                 {\r
155                         return Resource( key, "items", strLanguageCode );\r
156                 }\r
157 \r
158                 private string Resource(string key, string strType)\r
159                 {\r
160                         return Resource( key, strType, strLanguageCode );\r
161                 }\r
162 \r
163                 public string Resource( string key, string strType, string strLangCode )\r
164                 {\r
165                         if (strType != "" && strType != "title" && strType != "value" && strType != "items")\r
166                         {\r
167                                 throw new ArgumentOutOfRangeException( "CResources.Resource: 引数が正しくありません。(" + strType + ")" );\r
168                         }\r
169                         string key_ = key + "." + strLangCode + "." + strType;\r
170                         string value = "";\r
171 \r
172 //Debug.WriteLine( "strLangCode=" + strLangCode );\r
173 //Debug.WriteLine( "key_=" + key_ );\r
174                         if ( !dict.ContainsKey( key_ ) )                                // keyかvalueが存在しない場合\r
175                         {\r
176                                 value = "";\r
177                         }\r
178                         else\r
179                         {\r
180                                 value = dict[ key_ ];\r
181 //Debug.WriteLine( "value =" + value );\r
182 \r
183                                 if (value == "")        // もし未定義なら、defaultの文字列にfallbackする\r
184                                 {\r
185                                         if ( strLangCode == "default" )\r
186                                         {\r
187                                                 value = "";\r
188                                         }\r
189                                         else\r
190                                         {\r
191                                                 return Resource( key, strType, "default" );\r
192                                         }\r
193                                 }\r
194                         }\r
195                         return value;\r
196                 }\r
197 \r
198                 /// <summary>\r
199                 /// コンストラクタ\r
200                 /// </summary>\r
201                 public CResources()\r
202                 {\r
203 //            this.csvPath = excelPath;\r
204         }\r
205  \r
206                 /// <summary>\r
207                 /// csvファイルを読み込んで、言語リソースを初期化する。\r
208                 /// languageで指定した言語リソースがない場合は、default(=en-US)にフォールバックする。\r
209                 /// </summary>\r
210                 /// <param name="language">"ja-JP"などの言語情報。""の場合は、default(=en-US)が用いられる。</param>\r
211         public void LoadResources(string language = "")\r
212         {\r
213                         // 参考: http://dobon.net/vb/dotnet/file/readcsvfile.html\r
214 \r
215                         Microsoft.VisualBasic.FileIO.TextFieldParser tfp =\r
216                                 new Microsoft.VisualBasic.FileIO.TextFieldParser(\r
217                                         csvFileName,\r
218                                         System.Text.Encoding.Unicode\r
219                         );\r
220                         //フィールドが文字で区切られているとする\r
221                         //デフォルトでDelimitedなので、必要なし\r
222                         tfp.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;\r
223                         //区切り文字を,とする\r
224                         tfp.Delimiters = new string[] { "," };\r
225                         //フィールドを"で囲み、改行文字、区切り文字を含めることができるか\r
226                         //デフォルトでtrueなので、必要なし\r
227                         tfp.HasFieldsEnclosedInQuotes = true;\r
228                         //フィールドの前後からスペースを削除する\r
229                         //デフォルトでtrueなので、必要なし\r
230                         tfp.TrimWhiteSpace = true;\r
231 \r
232                         bool bAlreadyReadFirstLine = false;\r
233                         while ( !tfp.EndOfData )\r
234                         {\r
235                                 string[] fields = tfp.ReadFields();\r
236 \r
237                                 if ( !bAlreadyReadFirstLine )\r
238                                 {\r
239                                         //csvHeader.Add( fields );\r
240                                         csvHeader = fields;\r
241                                         bAlreadyReadFirstLine = true;\r
242                                 }\r
243                                 else\r
244                                 {\r
245                                         string strItemName = fields[ 0 ];\r
246                                         if (strItemName == "" || strItemName.Contains("/") )\r
247                                         {\r
248                                                 continue;\r
249                                         }\r
250                                         else\r
251                                         {\r
252                                                 for ( int i = 0; i < fields.GetLength( 0 ); i++ )\r
253                                                 {\r
254                                                         string key = strItemName + "." + csvHeader[ i ];\r
255                                                         string value = fields[ i ];\r
256 \r
257                                                         value = value.Replace( "\r", "" ).Replace( "\n", "" );          // 文字コードとしての改行は削除して、\r
258                                                         value = value.Replace( "\\n", Environment.NewLine );            // "\n" と書かれたところを改行文字に置換する\r
259                                                         dict[ key ] = value;\r
260                                                 }\r
261                                         }\r
262 \r
263                                 }\r
264                         }\r
265 \r
266                         //後始末\r
267                         tfp.Close();\r
268 \r
269 \r
270                         #region [ langcodelist, langlist 生成 ]\r
271                         List<string> lstLangCodeList = new List<string>();\r
272                         List<string> lstLangDispList = new List<string>();\r
273 \r
274                         for ( int i = 1; i < csvHeader.Length; i++ )            // 0から開始、ではない (0は名称定義)\r
275                         {\r
276                                 string s = csvHeader[ i ].Replace( ".title", "" ).Replace( ".value", "" ).Replace( ".items", "" );\r
277                                 if ( !lstLangCodeList.Contains( s ) )\r
278                                 {\r
279                                         lstLangCodeList.Add( s );\r
280                                         lstLangDispList.Add( Label("strCfgLanguageName", s ) );\r
281                                 }\r
282                         }\r
283                         langcodelist = lstLangCodeList.ToArray();\r
284                         langdisplist = lstLangDispList.ToArray();\r
285                         #endregion\r
286 \r
287                         Language = language;\r
288         }\r
289 \r
290         \r
291         \r
292                 #region [ Dispose-Finallizeパターン実装 ]\r
293                 //-----------------\r
294                 public void Dispose()\r
295                 {\r
296                         this.Dispose( true );\r
297                         GC.SuppressFinalize( this );\r
298                 }\r
299                 protected void Dispose( bool bManagedDispose )\r
300                 {\r
301                         dict = null;\r
302                         csvHeader = null;\r
303                         langcodelist = null;\r
304                         langdisplist = null;\r
305                 }\r
306                 ~CResources()\r
307                 {\r
308                         this.Dispose( false );\r
309                 }\r
310                 //-----------------\r
311                 #endregion\r
312         }\r
313 }\r