OSDN Git Service

#35906 CResource.csの登録漏れ。
[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         public class CResources\r
13         {\r
14                 private string csvFileName = "resources.csv";\r
15 \r
16                 private string[] csvHeader = null;\r
17                 private Dictionary<string, string> dict = new Dictionary<string, string>();\r
18 \r
19                 private string[] langcodelist = null, langlist = null;\r
20 \r
21                 public string strLanguageCode;\r
22 \r
23 \r
24                 /// <summary>\r
25                 /// 表示に使用する言語情報を取得/設定する\r
26                 /// 例: Language("ja-JP") など。\r
27                 /// </summary>\r
28                 public string Language\r
29                 {\r
30                         get {\r
31                                 if ( strLanguageCode == "" || strLanguageCode == null )\r
32                                 {\r
33                                         string s = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;\r
34                                         if ( s == "" || !csvHeader.Contains( s+".title" ) )\r
35                                         {\r
36                                                 strLanguageCode = "default";\r
37                                         }\r
38                                         else\r
39                                         {\r
40                                                 strLanguageCode = s;\r
41                                         }\r
42 \r
43                                 }\r
44 Debug.WriteLine( "Get: strLanguageCode: " + strLanguageCode );\r
45                                 return strLanguageCode;\r
46                         }\r
47                         set\r
48                         {\r
49                                 if ( value == "" || value == null )\r
50                                 {\r
51                                         string s = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;\r
52                                         if ( s == "" || !csvHeader.Contains( s + ".title" ) )\r
53                                         {\r
54                                                 strLanguageCode = "default";\r
55                                         }\r
56                                         else\r
57                                         {\r
58                                                 strLanguageCode = s;\r
59                                         }\r
60                                 }\r
61                                 else\r
62                                 {\r
63                                         if ( !csvHeader.Contains( value + ".title" ) )\r
64                                         {\r
65                                                 strLanguageCode = "default";\r
66                                         }\r
67                                         else\r
68                                         {\r
69                                                 strLanguageCode = value;\r
70                                         }\r
71                                 }\r
72                                 if ( CDTXMania.Instance.ConfigIni != null )\r
73                                 {\r
74                                         CDTXMania.Instance.ConfigIni.strLanguage.Value = strLanguageCode;\r
75 Debug.WriteLine( "strLang.Value=" + CDTXMania.Instance.ConfigIni.strLanguage.Value );\r
76                                 }\r
77 Debug.WriteLine( "Set: strLanguageCode: " + strLanguageCode );\r
78                         }\r
79                 }\r
80 \r
81                 /// <summary>\r
82                 /// 使用可能な\r
83                 /// </summary>\r
84                 public string[] LanguageList\r
85                 {\r
86                         get\r
87                         {\r
88                                 return langlist;\r
89                         }\r
90                 }\r
91                 public string[] LanguageCodeList\r
92                 {\r
93                         get\r
94                         {\r
95                                 return langcodelist;\r
96                         }\r
97                 }\r
98                 public int LanguageCodeIndex\r
99                 {\r
100                         get\r
101                         {\r
102                                 int index = Array.IndexOf( langcodelist, strLanguageCode );\r
103                                 if ( index < 0 ) index = 0;\r
104                                 return index;\r
105                         }\r
106                 }\r
107                 \r
108                 public string Label( string key )\r
109                 {\r
110                         return Resource( key, "title", strLanguageCode );\r
111                 }\r
112                 public string Label( string key, string strLang )\r
113                 {\r
114                         return Resource( key, "title", strLang );\r
115                 }\r
116                 public string Explanation( string key )\r
117                 {\r
118                         return Resource( key, "value", strLanguageCode );\r
119                 }\r
120                 public string Items( string key )\r
121                 {\r
122                         return Resource( key, "items", strLanguageCode );\r
123                 }\r
124 \r
125                 public string Resource(string key, string strType)\r
126                 {\r
127                         return Resource( key, strType, strLanguageCode );\r
128                 }\r
129 \r
130                 public string Resource( string key, string strType, string strLangCode )\r
131                 {\r
132                         if (strType != "" && strType != "title" && strType != "value" && strType != "items")\r
133                         {\r
134                                 throw new ArgumentOutOfRangeException( "CResources.Resource: 引数が正しくありません。(" + strType + ")" );\r
135                         }\r
136                         string key_ = key + "." + strLangCode + "." + strType;\r
137                         string value = "";\r
138 \r
139 //Debug.WriteLine( "strLangCode=" + strLangCode );\r
140 //Debug.WriteLine( "key_=" + key_ );\r
141                         if ( !dict.ContainsKey( key_ ) )                                // keyかvalueが存在しない場合\r
142                         {\r
143                                 value = "";\r
144                         }\r
145                         else\r
146                         {\r
147                                 value = dict[ key_ ];\r
148 //Debug.WriteLine( "value =" + value );\r
149 \r
150                                 if (value == "")        // もし未定義なら、defaultの文字列にfallbackする\r
151                                 {\r
152                                         if ( strLangCode == "default" )\r
153                                         {\r
154                                                 value = "";\r
155                                         }\r
156                                         else\r
157                                         {\r
158                                                 return Resource( key, strType, "default" );\r
159                                         }\r
160                                 }\r
161                         }\r
162                         return value;\r
163                 }\r
164 \r
165                 public CResources()\r
166                 {\r
167 //            this.csvPath = excelPath;\r
168         }\r
169  \r
170         // language="ja-JP"とか。\r
171         public void LoadResources(string language = "")\r
172         {\r
173                         // 参考: http://dobon.net/vb/dotnet/file/readcsvfile.html\r
174 \r
175                         Microsoft.VisualBasic.FileIO.TextFieldParser tfp =\r
176                                 new Microsoft.VisualBasic.FileIO.TextFieldParser(\r
177                                         csvFileName,\r
178                                         System.Text.Encoding.Unicode\r
179                         );\r
180                         //フィールドが文字で区切られているとする\r
181                         //デフォルトでDelimitedなので、必要なし\r
182                         tfp.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;\r
183                         //区切り文字を,とする\r
184                         tfp.Delimiters = new string[] { "," };\r
185                         //フィールドを"で囲み、改行文字、区切り文字を含めることができるか\r
186                         //デフォルトでtrueなので、必要なし\r
187                         tfp.HasFieldsEnclosedInQuotes = true;\r
188                         //フィールドの前後からスペースを削除する\r
189                         //デフォルトでtrueなので、必要なし\r
190                         tfp.TrimWhiteSpace = true;\r
191 \r
192                         bool bAlreadyReadFirstLine = false;\r
193                         while ( !tfp.EndOfData )\r
194                         {\r
195                                 string[] fields = tfp.ReadFields();\r
196 \r
197                                 if ( !bAlreadyReadFirstLine )\r
198                                 {\r
199                                         //csvHeader.Add( fields );\r
200                                         csvHeader = fields;\r
201                                         bAlreadyReadFirstLine = true;\r
202                                 }\r
203                                 else\r
204                                 {\r
205                                         string strItemName = fields[ 0 ];\r
206                                         if (strItemName == "" || strItemName.Contains("/") )\r
207                                         {\r
208                                                 continue;\r
209                                         }\r
210                                         else\r
211                                         {\r
212                                                 for ( int i = 0; i < fields.GetLength( 0 ); i++ )\r
213                                                 {\r
214                                                         string key = strItemName + "." + csvHeader[ i ];\r
215                                                         string value = fields[ i ];\r
216 \r
217                                                         value = value.Replace( "\r", "" ).Replace( "\n", "" );          // 文字コードとしての改行は削除して、\r
218                                                         value = value.Replace( "\\n", Environment.NewLine );            // "\n" と書かれたところを改行文字に置換する\r
219                                                         dict[ key ] = value;\r
220                                                 }\r
221                                         }\r
222 \r
223                                 }\r
224                         }\r
225 \r
226                         //後始末\r
227                         tfp.Close();\r
228 \r
229                         //foreach ( string key in dict.Keys )\r
230                         //{\r
231                         //      Console.WriteLine( "{0} : {1}", key, dict[ key ] );\r
232                         //}\r
233 \r
234 \r
235                         #region [ langcodelist, langlist 生成 ]\r
236                         List<string> lstLangCodeList = new List<string>();\r
237                         List<string> lstLangList = new List<string>();\r
238 \r
239                         for ( int i = 1; i < csvHeader.Length; i++ )            // 0から開始、ではない (0は名称定義)\r
240                         {\r
241                                 string s = csvHeader[ i ].Replace( ".title", "" ).Replace( ".value", "" ).Replace( ".items", "" );\r
242                                 if ( !lstLangCodeList.Contains( s ) )\r
243                                 {\r
244                                         lstLangCodeList.Add( s );\r
245                                         lstLangList.Add( Label("strCfgLanguageName", s ) );\r
246                                 }\r
247                         }\r
248                         langcodelist = lstLangCodeList.ToArray();\r
249                         langlist = lstLangList.ToArray();\r
250                         #endregion\r
251 \r
252 \r
253                         Language = language;\r
254         }\r
255 \r
256         \r
257         \r
258                 #region [ Dispose-Finallizeパターン実装 ]\r
259                 //-----------------\r
260                 public void Dispose()\r
261                 {\r
262                         this.Dispose( true );\r
263                         GC.SuppressFinalize( this );\r
264                 }\r
265                 protected void Dispose( bool bManagedDispose )\r
266                 {\r
267                         dict = null;\r
268                         csvHeader = null;\r
269                         langcodelist = null;\r
270                         langlist = null;\r
271                 }\r
272                 ~CResources()\r
273                 {\r
274                         this.Dispose( false );\r
275                 }\r
276                 //-----------------\r
277                 #endregion\r
278         }\r
279 }\r