
現在3つのアプリを開発中で、それらは全て画面に表示する文言をjson形式にて管理する予定です。
他国でも使用されるアプリのため、その文言管理用jsonファイルは各国の文言を記載したものがそれぞれ用意されることとなります。
バージョンアップにて新しく文言が追加される度、英語を基準に各国の方が翻訳し、その国ごとの文言管理用jsonファイルを作成するための、技術者でない人でも扱えるような文言変更ツールが必要となります。
今回はその文言変更ツールの作成です。
ツールの開発環境はVS2008、Frameworkは3.5で作成しています。
その読み込むjsonファイルの中身が以下のような内容です。
{
"LoginScreen":{
"label_title":"Login Screen",
"label_userId":"User ID",
"label_password":"Password",
"button_login":"LOGIN"
←(増える可能性あり)
},
"UserLIstScreen":{
"label_title":"User List",
"label_userId":"User ID",
"label_userName":"User Name",
"label_userTell":"TEL",
"label_phone":"Phone",
"label_save":"SAVE"
←(増える可能性あり)
},
"SettingListScreen":{
"label_title":"Setting",
"label_storeName":"Store Name",
"label_language":"Language",
"button_save":"SAVE"
←(増える可能性あり)
}
←(更に他画面が増える)
}
画面ごとに区切られていて、その中にメッセージのkeyとvalue といった形になってます。
画面名・メッセージのkey・valueはそれぞれ全て動的な上、今後文言が増えることもありますし、画面が増えることもあります。
その度にツールを修正するようなことはしたくありません。
やりたいこととしては、
1.jsonファイルを読み込み、データをメモリに保持。
2.フォームのDataGridViewに値をセット、画面にて編集できるようにする。
(その際、変更された文言・追加された文言・既存文言が分かるようにする。)
3.保存ボタン押下時に、編集した新しいjsonファイルを排出。
といった内容です。
現在jsonファイルの読み込みの段階で、読み込むには別クラスによる型宣言が必要だと認識しているのですが、キーが動的なゆえに別クラスによる型宣言がうまくできず、どう読み込めばいいのか分からなくて詰まっています。
→なんとか読み込み、切り分け、画面に表示までできました。
ただ、やり方が少し強引というか…
C#
1 private void EditScreen_Load(object sender, EventArgs e) 2 { 3 4 5 try 6 { 7 var jScreen = JObject.Parse(File.ReadAllText("D:\MessageWork\En_Old\risou.json", Encoding.Default)); 8 9 foreach (var MenuMsg in jScreen.Properties()) 10 { 11 MessageBox.Show(Regex.Replace(MenuMsg.ToString(), ".*{", "{")); 12 var dic = JsonConvert.DeserializeObject<Dictionary<string, string>>(Regex.Replace(MenuMsg.ToString(), ".*{", "{")); 13 string sss = ""; 14 foreach (var ScreenMsg in dic.Keys) 15 { 16 sss += ScreenMsg.ToString() + " : " + dic[ScreenMsg].ToString() + "\r\n"; 17 } 18 MessageBox.Show(sss); 19 20 } 21 22 } 23 catch (Exception ex) 24 { 25 string msg = string.Format("Error Occurred! \r\n\r\n{0}", ex.ToString()); 26 MessageBox.Show(msg); 27 } 28 }
JObject.Parseを使って画面ごとに切り出し、
切り出した後の左側の部分を無理やりReplaceでカット
JsonConverter.DeserialiseObjectを通して{}の部分を読み込み。
画面に表示…といった感じです。
出来た、としてもいいのですが、あまり綺麗ではないかな…と感じています。
これ以外に「この方法の方が良い」といったような方法は無いでしょうか…











