+++ /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
- /// <summary>\r
- /// 多言語メッセージ情報を扱います。\r
- /// </summary>\r
- public class CResources\r
- {\r
- private const string csvFileName = @"System\resources.csv";\r
-\r
- private string[] csvHeader = null;\r
- private Dictionary<string, string> dict = new Dictionary<string, string>();\r
-\r
- private string[] langcodelist = null, langdisplist = null;\r
-\r
- private 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 == null || !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 == null || !csvHeader.Contains( s + ".title" ) )\r
- {\r
- strLanguageCode = "default";\r
- }\r
- else\r
- {\r
- strLanguageCode = s;\r
- }\r
- }\r
- else\r
- {\r
- if ( csvHeader == null || !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
- /// <remarks>\r
- /// listの格納順は、LanguageCodeListと一致する。\r
- /// </remarks>\r
- public string[] LanguageDispList\r
- {\r
- get\r
- {\r
- return langdisplist;\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// 使用可能な言語(ja-JPなどの言語コード)のリストを返す\r
- /// </summary>\r
- /// <remarks>\r
- /// listの格納順は、LanguageDispListと一致する。\r
- /// </remarks>\r
- public string[] LanguageCodeList\r
- {\r
- get\r
- {\r
- return langcodelist;\r
- }\r
- }\r
- /// <summary>\r
- /// 現在設定されている言語のindex順を返す\r
- /// LanguageDispListやLanguageCodeListのindexに相当する\r
- /// </summary>\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
- /// <summary>\r
- /// key名に相当するlabel(表示名)を返す\r
- /// </summary>\r
- /// <param name="key"></param>\r
- /// <returns></returns>\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
- /// <summary>\r
- /// key名に相当するExplanation(説明文)を返す\r
- /// </summary>\r
- /// <param name="key"></param>\r
- /// <returns></returns>\r
- public string Explanation( string key )\r
- {\r
- return Resource( key, "value", strLanguageCode );\r
- }\r
- /// <summary>\r
- /// key名に相当するitem(コンマ区切りの選択肢)を返す\r
- /// ただし現在は未使用\r
- /// /// </summary>\r
- /// <param name="key"></param>\r
- /// <returns></returns>\r
- public string Items( string key )\r
- {\r
- return Resource( key, "items", strLanguageCode );\r
- }\r
-\r
- private 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
- /// <summary>\r
- /// コンストラクタ\r
- /// </summary>\r
- public CResources()\r
- {\r
-// this.csvPath = excelPath;\r
- }\r
- \r
- /// <summary>\r
- /// csvファイルを読み込んで、言語リソースを初期化する。\r
- /// languageで指定した言語リソースがない場合は、default(=en-US)にフォールバックする。\r
- /// </summary>\r
- /// <param name="language">"ja-JP"などの言語情報。""の場合は、default(=en-US)が用いられる。</param>\r
- public void LoadResources(string language = "")\r
- {\r
- // 参考: http://dobon.net/vb/dotnet/file/readcsvfile.html\r
- Microsoft.VisualBasic.FileIO.TextFieldParser tfp;\r
- try\r
- {\r
- tfp = new Microsoft.VisualBasic.FileIO.TextFieldParser(\r
- csvFileName,\r
- System.Text.Encoding.Unicode\r
- );\r
- }\r
- catch ( System.IO.FileNotFoundException e )\r
- {\r
- Trace.TraceError( "言語情報ファイル System/resources.csv が見つかりませんでした。" + e.Message );\r
- return;\r
- }\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
- tfp.TrimWhiteSpace = false;\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
-\r
- #region [ langcodelist, langlist 生成 ]\r
- List<string> lstLangCodeList = new List<string>();\r
- List<string> lstLangDispList = 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
- lstLangDispList.Add( Label("strCfgLanguageName", s ) );\r
- }\r
- }\r
- langcodelist = lstLangCodeList.ToArray();\r
- langdisplist = lstLangDispList.ToArray();\r
- #endregion\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
- langdisplist = null;\r
- }\r
- ~CResources()\r
- {\r
- this.Dispose( false );\r
- }\r
- //-----------------\r
- #endregion\r
- }\r
-}\r