「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>アプリケーション設計のポイント]]

*目次 [#s1a14a59]
#contents

*概要 [#t2436305]
リソース ファイルではなく、国際化(多言語化)辞書テーブルを用いてプログラムでコントロールの表示を国際化(多言語化)することもできる。

*詳細 [#m417ea77]

**テーブル設計 [#g694e1c1]
国際化(多言語化)辞書テーブルを下記のように設計すると良い。

|ID|画面名|コントロール名|日本語|英語|中国語|・・・|h
|1|xxx||あああ|aaa|亜亜亜|・・・|
|2|xxx|yyyy|いいい|iii|威威威|・・・|
|3|yyy||えええ|eee|獲獲獲|・・・|
|4|yyy|zzzz|かかか|kkk|華華華|・・・|

**テーブルのストレージ [#yf989f80]
スタンドアロンのアプリケーションの場合は、DBとして以下の利用も考えられる。

***[[SQL Server>https://techinfoofmicrosofttech.osscons.jp/index.php?SQL%20Server%20%E3%81%AE%E3%82%A8%E3%83%87%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3#f7a75351]] [#naecfa85]

***XMLファイル [#j78df3cf]
-XmlDocument~
実装も定義も面倒。

-DataTable~
--DataTable.WriteXmlメソッドを使用して、XMLにデータを保存。
--DataTable.ReadXmlメソッドを使用して、DataTableをロード、
--DataTable.Selectメソッドを使えばDBレスでも実装可能である。

--DataTableからレコードを抽出するサンプル~
http://asp35.com/adoDataSet/Chapter2/ch2-09.aspx

**国際化(多言語化)する方法 [#y135b8cb]
国際化(多言語化)辞書テーブルをしてコントロールのキャプションを国際化(多言語化)する方式を以下に示す。

***Form上のコントロールを再帰処理する。 [#ce4d6cc8]
***Web Forms上のコントロールを再帰処理する。 [#ce4d6cc8]
この実装は、”Open棟梁”の各レイヤの「[[ベースクラス2]]」(画面コード親クラス2)上に共通処理として実装できる(画面内のコントロールを再帰的に処理する)。

-処理概要
>
+画面表示時に画面名をキーにして、国際化(多言語化)辞書テーブルの結果セットを取得する。
+Control.HasControlsメソッド & Controlsプロパティの再起処理により画面上のコントロールを取得する。
+コントロールのID(名前)を取得し、結果セットから対応する国際化(多言語化)辞書レコードを取得。
+上記の国際化(多言語化)辞書レコードから、必要に応じてコントロールのプロパティ(画面に出力する情報)を変更する。

-実装箇所~
「[[ベースクラス2]]」(画面コード親クラス2)上の”[[private void CMN_FormInit(string eventName)>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Business/Presentation/MyBaseController.cs#L208]]”メソッドなどに実装する。

-実装方法~
以下はForm上のcontrolを再起処理する例。

 private void Form1_Load(object sender, EventArgs e)
 {
   RecursiveProcessing(this);
 }
 
 private void RecursiveProcessing(Control ctrl)
 {
   System.Diagnostics.Debug.WriteLine(ctrl.Name);
 
   if (ctrl.HasChildren)
   {
     foreach (Control child in ctrl.Controls)
     {
       RecursiveProcessing(child);
     }
   }
 }

ここでキャプション(Textプロパティ)の値を設定する。~
ControlをLabelコントロール等にDownCastする場合は、以下を参照。

-方法: as 演算子と is 演算子を使用して安全にキャストする (C# プログラミング ガイド)~
https://msdn.microsoft.com/ja-jp/library/cc488006.aspx

***カスタム・コントロールで対応する [#k136b56b]
ASP.NETのWeb(System.Web.UI)コントロールのRendre系メソッドをカスタマイズする。

-@IT:.NET TIPS [ASP.NET]国際化対応サイトをプログラムレスで実現するには? - C# VB.NET Webフォーム~
http://www.atmarkit.co.jp/fdotnet/dotnettips/195aspmultilang2/aspmultilang2.html

-.NETコントロールのカスタマイズ方法 - マイクロソフト系技術情報 Wiki~
http://techinfoofmicrosofttech.osscons.jp/index.php?.NET%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E6%96%B9%E6%B3%95

***MVCとの親和性は低い [#n17d5e7e]
MVCでは、[[Web Forms]]のように、Form上のControlを再帰処理できない。
MVCでは、Web Formsのように、Form上のコントロールを再帰処理できない。~
なので、「国際化(多言語化)辞書テーブル」方式が適合しない可能性。

-参考
--[[ASP.NET MVCの国際化対応>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20MVC%E3%81%AE%E5%9B%BD%E9%9A%9B%E5%8C%96%E5%AF%BE%E5%BF%9C]]

IP:202.246.252.97 TIME:"2019-08-02 (金) 16:52:04" REFERER:"https://opentouryo.osscons.jp/index.php?cmd=edit&page=%E5%9B%BD%E9%9A%9B%E5%8C%96%EF%BC%88%E5%A4%9A%E8%A8%80%E8%AA%9E%E5%8C%96%EF%BC%89%E8%BE%9E%E6%9B%B8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB" USER_AGENT:"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS