2 using System.Collections.Generic;
\r
5 using System.Threading.Tasks;
\r
6 using System.Resources;
\r
7 using System.Diagnostics;
\r
12 public class CResources
\r
14 private string csvFileName = "resources.csv";
\r
16 private string[] csvHeader = null;
\r
17 private Dictionary<string, string> dict = new Dictionary<string, string>();
\r
19 private string[] langcodelist = null, langlist = null;
\r
21 public string strLanguageCode;
\r
25 /// 表示に使用する言語情報を取得/設定する
\r
26 /// 例: Language("ja-JP") など。
\r
28 public string Language
\r
31 if ( strLanguageCode == "" || strLanguageCode == null )
\r
33 string s = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
\r
34 if ( s == "" || !csvHeader.Contains( s+".title" ) )
\r
36 strLanguageCode = "default";
\r
40 strLanguageCode = s;
\r
44 Debug.WriteLine( "Get: strLanguageCode: " + strLanguageCode );
\r
45 return strLanguageCode;
\r
49 if ( value == "" || value == null )
\r
51 string s = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
\r
52 if ( s == "" || !csvHeader.Contains( s + ".title" ) )
\r
54 strLanguageCode = "default";
\r
58 strLanguageCode = s;
\r
63 if ( !csvHeader.Contains( value + ".title" ) )
\r
65 strLanguageCode = "default";
\r
69 strLanguageCode = value;
\r
72 if ( CDTXMania.Instance.ConfigIni != null )
\r
74 CDTXMania.Instance.ConfigIni.strLanguage.Value = strLanguageCode;
\r
75 Debug.WriteLine( "strLang.Value=" + CDTXMania.Instance.ConfigIni.strLanguage.Value );
\r
77 Debug.WriteLine( "Set: strLanguageCode: " + strLanguageCode );
\r
84 public string[] LanguageList
\r
91 public string[] LanguageCodeList
\r
95 return langcodelist;
\r
98 public int LanguageCodeIndex
\r
102 int index = Array.IndexOf( langcodelist, strLanguageCode );
\r
103 if ( index < 0 ) index = 0;
\r
108 public string Label( string key )
\r
110 return Resource( key, "title", strLanguageCode );
\r
112 public string Label( string key, string strLang )
\r
114 return Resource( key, "title", strLang );
\r
116 public string Explanation( string key )
\r
118 return Resource( key, "value", strLanguageCode );
\r
120 public string Items( string key )
\r
122 return Resource( key, "items", strLanguageCode );
\r
125 public string Resource(string key, string strType)
\r
127 return Resource( key, strType, strLanguageCode );
\r
130 public string Resource( string key, string strType, string strLangCode )
\r
132 if (strType != "" && strType != "title" && strType != "value" && strType != "items")
\r
134 throw new ArgumentOutOfRangeException( "CResources.Resource: 引数が正しくありません。(" + strType + ")" );
\r
136 string key_ = key + "." + strLangCode + "." + strType;
\r
139 //Debug.WriteLine( "strLangCode=" + strLangCode );
\r
140 //Debug.WriteLine( "key_=" + key_ );
\r
141 if ( !dict.ContainsKey( key_ ) ) // keyかvalueが存在しない場合
\r
147 value = dict[ key_ ];
\r
148 //Debug.WriteLine( "value =" + value );
\r
150 if (value == "") // もし未定義なら、defaultの文字列にfallbackする
\r
152 if ( strLangCode == "default" )
\r
158 return Resource( key, strType, "default" );
\r
165 public CResources()
\r
167 // this.csvPath = excelPath;
\r
170 // language="ja-JP"とか。
\r
171 public void LoadResources(string language = "")
\r
173 // 参考: http://dobon.net/vb/dotnet/file/readcsvfile.html
\r
175 Microsoft.VisualBasic.FileIO.TextFieldParser tfp =
\r
176 new Microsoft.VisualBasic.FileIO.TextFieldParser(
\r
178 System.Text.Encoding.Unicode
\r
180 //フィールドが文字で区切られているとする
\r
181 //デフォルトでDelimitedなので、必要なし
\r
182 tfp.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
\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
192 bool bAlreadyReadFirstLine = false;
\r
193 while ( !tfp.EndOfData )
\r
195 string[] fields = tfp.ReadFields();
\r
197 if ( !bAlreadyReadFirstLine )
\r
199 //csvHeader.Add( fields );
\r
200 csvHeader = fields;
\r
201 bAlreadyReadFirstLine = true;
\r
205 string strItemName = fields[ 0 ];
\r
206 if (strItemName == "" || strItemName.Contains("/") )
\r
212 for ( int i = 0; i < fields.GetLength( 0 ); i++ )
\r
214 string key = strItemName + "." + csvHeader[ i ];
\r
215 string value = fields[ i ];
\r
217 value = value.Replace( "\r", "" ).Replace( "\n", "" ); // 文字コードとしての改行は削除して、
\r
218 value = value.Replace( "\\n", Environment.NewLine ); // "\n" と書かれたところを改行文字に置換する
\r
219 dict[ key ] = value;
\r
229 //foreach ( string key in dict.Keys )
\r
231 // Console.WriteLine( "{0} : {1}", key, dict[ key ] );
\r
235 #region [ langcodelist, langlist 生成 ]
\r
236 List<string> lstLangCodeList = new List<string>();
\r
237 List<string> lstLangList = new List<string>();
\r
239 for ( int i = 1; i < csvHeader.Length; i++ ) // 0から開始、ではない (0は名称定義)
\r
241 string s = csvHeader[ i ].Replace( ".title", "" ).Replace( ".value", "" ).Replace( ".items", "" );
\r
242 if ( !lstLangCodeList.Contains( s ) )
\r
244 lstLangCodeList.Add( s );
\r
245 lstLangList.Add( Label("strCfgLanguageName", s ) );
\r
248 langcodelist = lstLangCodeList.ToArray();
\r
249 langlist = lstLangList.ToArray();
\r
253 Language = language;
\r
258 #region [ Dispose-Finallizeパターン実装 ]
\r
259 //-----------------
\r
260 public void Dispose()
\r
262 this.Dispose( true );
\r
263 GC.SuppressFinalize( this );
\r
265 protected void Dispose( bool bManagedDispose )
\r
269 langcodelist = null;
\r
274 this.Dispose( false );
\r
276 //-----------------
\r