--- /dev/null
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+using System.Threading.Tasks;\r
+using System.Resources;\r
+using System.Diagnostics;\r
+\r
+\r
+namespace DTXMania\r
+{\r
+ public class CResources\r
+ {\r
+ private string csvFileName = "resources.csv";\r
+\r
+ private string[] csvHeader = null;\r
+ private Dictionary<string, string> dict = new Dictionary<string, string>();\r
+\r
+ private string[] langcodelist = null, langlist = null;\r
+\r
+ public string strLanguageCode;\r
+\r
+\r
+ /// <summary>\r
+ /// 表示に使用する言語情報を取得/設定する\r
+ /// 例: Language("ja-JP") など。\r
+ /// </summary>\r
+ public string Language\r
+ {\r
+ get {\r
+ if ( strLanguageCode == "" || strLanguageCode == null )\r
+ {\r
+ string s = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;\r
+ if ( s == "" || !csvHeader.Contains( s+".title" ) )\r
+ {\r
+ strLanguageCode = "default";\r
+ }\r
+ else\r
+ {\r
+ strLanguageCode = s;\r
+ }\r
+\r
+ }\r
+Debug.WriteLine( "Get: strLanguageCode: " + strLanguageCode );\r
+ return strLanguageCode;\r
+ }\r
+ set\r
+ {\r
+ if ( value == "" || value == null )\r
+ {\r
+ string s = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;\r
+ if ( s == "" || !csvHeader.Contains( s + ".title" ) )\r
+ {\r
+ strLanguageCode = "default";\r
+ }\r
+ else\r
+ {\r
+ strLanguageCode = s;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if ( !csvHeader.Contains( value + ".title" ) )\r
+ {\r
+ strLanguageCode = "default";\r
+ }\r
+ else\r
+ {\r
+ strLanguageCode = value;\r
+ }\r
+ }\r
+ if ( CDTXMania.Instance.ConfigIni != null )\r
+ {\r
+ CDTXMania.Instance.ConfigIni.strLanguage.Value = strLanguageCode;\r
+Debug.WriteLine( "strLang.Value=" + CDTXMania.Instance.ConfigIni.strLanguage.Value );\r
+ }\r
+Debug.WriteLine( "Set: strLanguageCode: " + strLanguageCode );\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// 使用可能な\r
+ /// </summary>\r
+ public string[] LanguageList\r
+ {\r
+ get\r
+ {\r
+ return langlist;\r
+ }\r
+ }\r
+ public string[] LanguageCodeList\r
+ {\r
+ get\r
+ {\r
+ return langcodelist;\r
+ }\r
+ }\r
+ public int LanguageCodeIndex\r
+ {\r
+ get\r
+ {\r
+ int index = Array.IndexOf( langcodelist, strLanguageCode );\r
+ if ( index < 0 ) index = 0;\r
+ return index;\r
+ }\r
+ }\r
+ \r
+ public string Label( string key )\r
+ {\r
+ return Resource( key, "title", strLanguageCode );\r
+ }\r
+ public string Label( string key, string strLang )\r
+ {\r
+ return Resource( key, "title", strLang );\r
+ }\r
+ public string Explanation( string key )\r
+ {\r
+ return Resource( key, "value", strLanguageCode );\r
+ }\r
+ public string Items( string key )\r
+ {\r
+ return Resource( key, "items", strLanguageCode );\r
+ }\r
+\r
+ public string Resource(string key, string strType)\r
+ {\r
+ return Resource( key, strType, strLanguageCode );\r
+ }\r
+\r
+ public string Resource( string key, string strType, string strLangCode )\r
+ {\r
+ if (strType != "" && strType != "title" && strType != "value" && strType != "items")\r
+ {\r
+ throw new ArgumentOutOfRangeException( "CResources.Resource: 引数が正しくありません。(" + strType + ")" );\r
+ }\r
+ string key_ = key + "." + strLangCode + "." + strType;\r
+ string value = "";\r
+\r
+//Debug.WriteLine( "strLangCode=" + strLangCode );\r
+//Debug.WriteLine( "key_=" + key_ );\r
+ if ( !dict.ContainsKey( key_ ) ) // keyかvalueが存在しない場合\r
+ {\r
+ value = "";\r
+ }\r
+ else\r
+ {\r
+ value = dict[ key_ ];\r
+//Debug.WriteLine( "value =" + value );\r
+\r
+ if (value == "") // もし未定義なら、defaultの文字列にfallbackする\r
+ {\r
+ if ( strLangCode == "default" )\r
+ {\r
+ value = "";\r
+ }\r
+ else\r
+ {\r
+ return Resource( key, strType, "default" );\r
+ }\r
+ }\r
+ }\r
+ return value;\r
+ }\r
+\r
+ public CResources()\r
+ {\r
+// this.csvPath = excelPath;\r
+ }\r
+ \r
+ // language="ja-JP"とか。\r
+ public void LoadResources(string language = "")\r
+ {\r
+ // 参考: http://dobon.net/vb/dotnet/file/readcsvfile.html\r
+\r
+ Microsoft.VisualBasic.FileIO.TextFieldParser tfp =\r
+ new Microsoft.VisualBasic.FileIO.TextFieldParser(\r
+ csvFileName,\r
+ System.Text.Encoding.Unicode\r
+ );\r
+ //フィールドが文字で区切られているとする\r
+ //デフォルトでDelimitedなので、必要なし\r
+ tfp.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;\r
+ //区切り文字を,とする\r
+ tfp.Delimiters = new string[] { "," };\r
+ //フィールドを"で囲み、改行文字、区切り文字を含めることができるか\r
+ //デフォルトでtrueなので、必要なし\r
+ tfp.HasFieldsEnclosedInQuotes = true;\r
+ //フィールドの前後からスペースを削除する\r
+ //デフォルトでtrueなので、必要なし\r
+ tfp.TrimWhiteSpace = true;\r
+\r
+ bool bAlreadyReadFirstLine = false;\r
+ while ( !tfp.EndOfData )\r
+ {\r
+ string[] fields = tfp.ReadFields();\r
+\r
+ if ( !bAlreadyReadFirstLine )\r
+ {\r
+ //csvHeader.Add( fields );\r
+ csvHeader = fields;\r
+ bAlreadyReadFirstLine = true;\r
+ }\r
+ else\r
+ {\r
+ string strItemName = fields[ 0 ];\r
+ if (strItemName == "" || strItemName.Contains("/") )\r
+ {\r
+ continue;\r
+ }\r
+ else\r
+ {\r
+ for ( int i = 0; i < fields.GetLength( 0 ); i++ )\r
+ {\r
+ string key = strItemName + "." + csvHeader[ i ];\r
+ string value = fields[ i ];\r
+\r
+ value = value.Replace( "\r", "" ).Replace( "\n", "" ); // 文字コードとしての改行は削除して、\r
+ value = value.Replace( "\\n", Environment.NewLine ); // "\n" と書かれたところを改行文字に置換する\r
+ dict[ key ] = value;\r
+ }\r
+ }\r
+\r
+ }\r
+ }\r
+\r
+ //後始末\r
+ tfp.Close();\r
+\r
+ //foreach ( string key in dict.Keys )\r
+ //{\r
+ // Console.WriteLine( "{0} : {1}", key, dict[ key ] );\r
+ //}\r
+\r
+\r
+ #region [ langcodelist, langlist 生成 ]\r
+ List<string> lstLangCodeList = new List<string>();\r
+ List<string> lstLangList = new List<string>();\r
+\r
+ for ( int i = 1; i < csvHeader.Length; i++ ) // 0から開始、ではない (0は名称定義)\r
+ {\r
+ string s = csvHeader[ i ].Replace( ".title", "" ).Replace( ".value", "" ).Replace( ".items", "" );\r
+ if ( !lstLangCodeList.Contains( s ) )\r
+ {\r
+ lstLangCodeList.Add( s );\r
+ lstLangList.Add( Label("strCfgLanguageName", s ) );\r
+ }\r
+ }\r
+ langcodelist = lstLangCodeList.ToArray();\r
+ langlist = lstLangList.ToArray();\r
+ #endregion\r
+\r
+\r
+ Language = language;\r
+ }\r
+\r
+ \r
+ \r
+ #region [ Dispose-Finallizeパターン実装 ]\r
+ //-----------------\r
+ public void Dispose()\r
+ {\r
+ this.Dispose( true );\r
+ GC.SuppressFinalize( this );\r
+ }\r
+ protected void Dispose( bool bManagedDispose )\r
+ {\r
+ dict = null;\r
+ csvHeader = null;\r
+ langcodelist = null;\r
+ langlist = null;\r
+ }\r
+ ~CResources()\r
+ {\r
+ this.Dispose( false );\r
+ }\r
+ //-----------------\r
+ #endregion\r
+ }\r
+}\r