# 共通ドキュメント

## メッセージリソース

### 概要

固定文字列リソースの読み取り

- 設定
- メッセージリソースの作成
- メッセージリソースの配置
- メッセージリソースオブジェクトの取得
- メッセージの取得

### 設定

#### 基本設定

app.config/appSettings/name=MessageResourceAssemblyNameに メッセージリソースを格納するアセンブリ名称を指定する。

    <appSettings>
        <add key="MessageResourceAssemblyName" value="Message.Resources"/>
      </appSettings>

指定するのはDllのファイル名ではなく「アセンブリ名称」。大抵はDllファイル名から".dll"を取り除いた形となる
省略した場合は "Message.Resources" を使用する。

### メッセージリソースの作成

#### 基本的な流れ

- リソースの元となるテキストファイルを作成する。
- resgen.exeを使用して .resourcesファイルを生成する。
- al.exeを使用してアセンブリファイルを生成する

#### リソースの元となるテキストファイルを作成する。

"key = value" の形式でメッセージのキー、メッセージを記述する。";"(セミコロン)はコメントとして扱われる。

"(project name).(subsystem).(category).txt"等の様なファイル名でテキストファイルを保存する。"."(ドット)で分割された要素はプログラム内で可変扱いになり、メッセージの階層関係を表現できる

##### サンプル(common.txtから)

    ;
    ; Messge Resource File
    ; Language = ja
    ;
    ;	MessageID = Message の形式で記述
    ;
    ; 入力項目名などの可変項目は{0},{1},...として記述し、プログラムで設定

    ;
    ; Error Messages?
    ; 入力チェックなどのメッセージ
    ERR_INPUT_TOO_LONG = {0} 入力文字が長すぎます。{1}文字まで
    ERR_INVALID_FORMAT = {0} 入力形式が違います。

    ERR_INVALID_RANGE = {0} 範囲を超えています。{1} から {2}
    ERR_REQUIRED_MISSING = {0} 必須入力です。

    ;
    ; 例外時のメッセージ
    ;
    EXCEPTION_INVALID_ARG_LENGTH = 入力引数の長さが不正です。
    EXCEPTION_INVALID_ARG_CHARACTERS = 入力引数に認識できない文字が含まれています。

    MSG_RESULT_NO_DATA = 検索条件に一致するものが見つかりませんでした。

#### resgen.exeを使用して .resourcesファイルを生成する。

resgen.exe は.Net Frameworkに付属する。

##### 実行例

    c:\...\>resgen.exe proj.subsys.category.txt

上記を実行すると proj.subsys.category.resources ファイルが生成される。

あるいは msbuildの GenerateResourceタスクを使用する。

#### al.exeを使用してアセンブリファイルを生成する

al.exe は.Net Frameworkに付属する。

##### 実行例

    c:\...\>al.exe /out:Message.Resources.dll  /embed:proj.subsys.category.txt

上記を実行すると Message.Resources.dll ファイルが生成される。この時の"Message.Resources"をapp.config/appSettings/name=MessageResourceAssemblyName に指定する。

あるいは msbuildの ALタスクを使用する。

#### 注意

- 上記処理は src/build/message.resource.proj をmsbuildで実行する事により可能
- 各案件でMessageResources.dllを作成する場合、CFW/dotnet/src/message/common.txt を必ず含めること。そこにはCFWが使用するメッセージが存在する。

### メッセージリソースの配置

上で生成した Message.Resources.dll(または別に生成したdll) を実行環境にコピーする。

asp.netであれば(asp.net仮想フォルダ)/bin、windowsアプリケーションであれば .exeと同じフォルダに配置。または(厳密名をつけた場合のみ)GACディレクトリ、app.config/system.runtime以下に設定したprobeパスに配置。

click onceアプリケーションの場合 Message.Resources.dllを マニフェストに含めなければならない。

### メッセージリソースオブジェクトの取得

CFW.MessageResources.MessageResourceFacotory.GetInstance を使用してCFW.MessageResources.MessageResourceオブジェクトを取得する。

#### サンプル

    // 階層 "proj","subsys","category" のリソースを取得する。
    CFW.MessageResources.MessageResource resource =
    	CFW.MessageResources.MessageResourceFacotory.GetInstance("proj","subsys","category");

    // 階層 (拠点コード),"category" のリソースを取得する。
    string baseCode = "X001"; // 拠点 = X001 を指定
    CFW.MessageResources.MessageResource resource =
    	CFW.MessageResources.MessageResourceFacotory.GetInstance(baseCode ,"category");

### メッセージの取得

上で取得したメッセージリソースオブジェクトから必要なキーを指定してメッセージを取り出す。

#### サンプル

    // 階層 "proj","subsys","category" のリソースを取得する。
    CFW.MessageResources.MessageResource resource =
    	CFW.MessageResources.MessageResourceFacotory.GetInstance("proj","subsys","category");
    // キー ERR_INPUT_TOO_LONGに設定されたメッセージを取得
    string message = resource.GetString("ERR_INPUT_TOO_LONG");

### その他

- メッセージの内部に可変項目を設定する場合、TemplateTextParserスタイルにするか、string.Format()形式にするかのいずれかにする
- 階層構造のデフォルト機能(指定した階層のリソースがない場合)の処理は実装されていない。