2 using System.Collections.Generic;
\r
5 using System.Threading.Tasks;
\r
6 using System.Resources;
\r
7 using System.Diagnostics;
\r
13 /// 多言語メッセージ情報を扱います。
\r
15 public class CResources
\r
17 private const string csvFileName = @"System\resources.csv";
\r
19 private string[] csvHeader = null;
\r
20 private Dictionary<string, string> dict = new Dictionary<string, string>();
\r
22 private string[] langcodelist = null, langdisplist = null;
\r
24 private string strLanguageCode;
\r
28 /// 表示に使用する言語情報を取得/設定する
\r
29 /// 例: Language("ja-JP") など。
\r
31 public string Language
\r
34 if ( strLanguageCode == "" || strLanguageCode == null )
\r
36 string s = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
\r
37 if ( s == "" || !csvHeader.Contains( s+".title" ) )
\r
39 strLanguageCode = "default";
\r
43 strLanguageCode = s;
\r
47 //Debug.WriteLine( "Get: strLanguageCode: " + strLanguageCode );
\r
48 return strLanguageCode;
\r
52 if ( value == "" || value == null )
\r
54 string s = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
\r
55 if ( s == "" || !csvHeader.Contains( s + ".title" ) )
\r
57 strLanguageCode = "default";
\r
61 strLanguageCode = s;
\r
66 if ( !csvHeader.Contains( value + ".title" ) )
\r
68 strLanguageCode = "default";
\r
72 strLanguageCode = value;
\r
75 if ( CDTXMania.Instance.ConfigIni != null )
\r
77 CDTXMania.Instance.ConfigIni.strLanguage.Value = strLanguageCode;
\r
78 //Debug.WriteLine( "strLang.Value=" + CDTXMania.Instance.ConfigIni.strLanguage.Value );
\r
80 //Debug.WriteLine( "Set: strLanguageCode: " + strLanguageCode );
\r
85 /// 使用可能な言語(表示名)のリストを返す
\r
88 /// listの格納順は、LanguageCodeListと一致する。
\r
90 public string[] LanguageDispList
\r
94 return langdisplist;
\r
99 /// 使用可能な言語(ja-JPなどの言語コード)のリストを返す
\r
102 /// listの格納順は、LanguageDispListと一致する。
\r
104 public string[] LanguageCodeList
\r
108 return langcodelist;
\r
112 /// 現在設定されている言語のindex順を返す
\r
113 /// LanguageDispListやLanguageCodeListのindexに相当する
\r
115 public int LanguageCodeIndex
\r
119 int index = Array.IndexOf( langcodelist, strLanguageCode );
\r
120 if ( index < 0 ) index = 0;
\r
126 /// key名に相当するlabel(表示名)を返す
\r
128 /// <param name="key"></param>
\r
129 /// <returns></returns>
\r
130 public string Label( string key )
\r
132 return Resource( key, "title", strLanguageCode );
\r
134 public string Label( string key, string strLang )
\r
136 return Resource( key, "title", strLang );
\r
139 /// key名に相当するExplanation(説明文)を返す
\r
141 /// <param name="key"></param>
\r
142 /// <returns></returns>
\r
143 public string Explanation( string key )
\r
145 return Resource( key, "value", strLanguageCode );
\r
148 /// key名に相当するitem(コンマ区切りの選択肢)を返す
\r
151 /// <param name="key"></param>
\r
152 /// <returns></returns>
\r
153 public string Items( string key )
\r
155 return Resource( key, "items", strLanguageCode );
\r
158 private string Resource(string key, string strType)
\r
160 return Resource( key, strType, strLanguageCode );
\r
163 public string Resource( string key, string strType, string strLangCode )
\r
165 if (strType != "" && strType != "title" && strType != "value" && strType != "items")
\r
167 throw new ArgumentOutOfRangeException( "CResources.Resource: 引数が正しくありません。(" + strType + ")" );
\r
169 string key_ = key + "." + strLangCode + "." + strType;
\r
172 //Debug.WriteLine( "strLangCode=" + strLangCode );
\r
173 //Debug.WriteLine( "key_=" + key_ );
\r
174 if ( !dict.ContainsKey( key_ ) ) // keyかvalueが存在しない場合
\r
180 value = dict[ key_ ];
\r
181 //Debug.WriteLine( "value =" + value );
\r
183 if (value == "") // もし未定義なら、defaultの文字列にfallbackする
\r
185 if ( strLangCode == "default" )
\r
191 return Resource( key, strType, "default" );
\r
201 public CResources()
\r
203 // this.csvPath = excelPath;
\r
207 /// csvファイルを読み込んで、言語リソースを初期化する。
\r
208 /// languageで指定した言語リソースがない場合は、default(=en-US)にフォールバックする。
\r
210 /// <param name="language">"ja-JP"などの言語情報。""の場合は、default(=en-US)が用いられる。</param>
\r
211 public void LoadResources(string language = "")
\r
213 // 参考: http://dobon.net/vb/dotnet/file/readcsvfile.html
\r
215 Microsoft.VisualBasic.FileIO.TextFieldParser tfp =
\r
216 new Microsoft.VisualBasic.FileIO.TextFieldParser(
\r
218 System.Text.Encoding.Unicode
\r
220 //フィールドが文字で区切られているとする
\r
221 //デフォルトでDelimitedなので、必要なし
\r
222 tfp.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
\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
232 bool bAlreadyReadFirstLine = false;
\r
233 while ( !tfp.EndOfData )
\r
235 string[] fields = tfp.ReadFields();
\r
237 if ( !bAlreadyReadFirstLine )
\r
239 //csvHeader.Add( fields );
\r
240 csvHeader = fields;
\r
241 bAlreadyReadFirstLine = true;
\r
245 string strItemName = fields[ 0 ];
\r
246 if (strItemName == "" || strItemName.Contains("/") )
\r
252 for ( int i = 0; i < fields.GetLength( 0 ); i++ )
\r
254 string key = strItemName + "." + csvHeader[ i ];
\r
255 string value = fields[ i ];
\r
257 value = value.Replace( "\r", "" ).Replace( "\n", "" ); // 文字コードとしての改行は削除して、
\r
258 value = value.Replace( "\\n", Environment.NewLine ); // "\n" と書かれたところを改行文字に置換する
\r
259 dict[ key ] = value;
\r
270 #region [ langcodelist, langlist 生成 ]
\r
271 List<string> lstLangCodeList = new List<string>();
\r
272 List<string> lstLangDispList = new List<string>();
\r
274 for ( int i = 1; i < csvHeader.Length; i++ ) // 0から開始、ではない (0は名称定義)
\r
276 string s = csvHeader[ i ].Replace( ".title", "" ).Replace( ".value", "" ).Replace( ".items", "" );
\r
277 if ( !lstLangCodeList.Contains( s ) )
\r
279 lstLangCodeList.Add( s );
\r
280 lstLangDispList.Add( Label("strCfgLanguageName", s ) );
\r
283 langcodelist = lstLangCodeList.ToArray();
\r
284 langdisplist = lstLangDispList.ToArray();
\r
287 Language = language;
\r
292 #region [ Dispose-Finallizeパターン実装 ]
\r
293 //-----------------
\r
294 public void Dispose()
\r
296 this.Dispose( true );
\r
297 GC.SuppressFinalize( this );
\r
299 protected void Dispose( bool bManagedDispose )
\r
303 langcodelist = null;
\r
304 langdisplist = null;
\r
308 this.Dispose( false );
\r
310 //-----------------
\r