先の「286. 国際言語対応の開発 (2)」では DDS の MSGCON
を使う方法を紹介したが
MSGCON
による方法は言語別に DSPFオブジェクトが必要であった。
オブジェクトがひとつだけで複数言語に対応できる方法はないだろうか ?
ここでは、ひとつのオブジェクトだけで複数の国際言語対応に切替えることが
できる方法を紹介する。
その方法とは MSGCON
キー・ワードではなく MSGID
キー・ワードを使うことである。
A TITLE_ 20A O 1 27MSGID(MSG0001 *LIBL/USRMSG) A TEXT(' 部課マスターの登録 ')
MSGID : MSG0001 は
ADDMSGD MSGID(MSG0001) MSGF(QTROBJ/USRMSG) MSG('部課マスターの登録 ')
によって「部課マスターの登録」という文字列として
QTROBJ/USRMSG に登録されている。
一方、中国語は
中国語ライブラリー CHINALIB のメッセージ・ファイル : USRMSG を
CRTMSGF MSGF(CHINALIB/USRMSG) AUT(*ALL) CCSID(935)
として作成して
( 中国簡体字の CCSID は 935
, 繁体字は 937
CCSID は指定しなくても良いがすべての必要な簡体字を
登録するのであれば CCSID を指定すること )
ADDMSGD MSGID(MSG0001) MSGF(CHINALIB/USRMSG) MSG('部課主文件注册')
として登録されている。
そして
CRTDSPF FILE(QTROBJ/PGM109FM) SRCFILE(QTRSRC/QDSPSRC) LVLCHK(*NO) AUT(*ALL)
のように DSPF を日本語ライブラリー QTROBJ に作成する。
ここまでは MSGCON
キー・ワードのときと全く同じである。
ところが MSGID
キー・ワードを使って登録した DSPF に対しては
OVRMSGF MSGF(USRMSG) TOMSGF(CHINALIB/USRMSG) SECURE(*YES)
というメッセージ・ファイルに対するオーバーライド(一時変更)が
有効に働くのである。
従って中国語ライブラリーに中国語用の DSPF オブジェクトを作成する必要はなく
この OVRMSGF
コマンドによってメッセージ・ファイルを中国語用に
外部から切替えることができるのである。
この方法を使えば、例えば ILE-RPG の中では
D SYSTEM PR 10I 0 EXTPROC('system') D PATH * VALUE OPTIONS(*STRING) : C****************************************************** C CHINA BEGSR C****************************************************** *( 中国語 ) /FREE SYSTEM('OVRMSGF MSGF(USRMSG) TOMSGF(CHINALIB/USRMSG) SECURE(*YES)'); /END-FREE C ENDSR C****************************************************** C JAPAN BEGSR C****************************************************** *( 日本語 ) /FREE SYSTEM('DLTOVR FILE(USRMSG) LVL(*)'); /END-FREE C ENDSR
上記のように C 言語の system 関数を使って OVRMSGF
を実行すれば
容易に日本語から中国語表示に変更することができる。
また IBM マニュアルには書かれていないが OVRMSGF
に対する
一時変更の解除は
DLTOVR FILE(USRMSG) LVL(*JOB)
で有効に働かない。
正しくは
DLTOVR FILE(USRMSG) LVL(*)
である。
またはプログラムを呼び出す CLP で
オーバーライドすればいっそう簡単なものとなる。
0001.00 PGM 0002.00 /*---------------------------------------------------------*/ 0003.00 /* PGM119 : 部課マスターの登録 ( 中国語 ) */ 0004.00 /*---------------------------------------------------------*/ 0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80) 0006.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0007.00 0008.00 OVRMSGF MSGF(USRMSG) TOMSGF(CHINALIB/USRMSG) + 0009.00 SECURE(*YES) 0010.00 OVRDBF FILE(BUKAM) TOFILE(QTRFIL/BUKAM) + 0011.00 SECURE(*YES) OVRSCOPE(*JOB) 0012.00 CALL QTROBJ/PGM119 0013.00 MONMSG MSGID(RPG9801) EXEC(GOTO CMDLBL(ERROR)) 0014.00 DLTOVR FILE(BUKAM) LVL(*JOB) 0015.00 DLTOVR FILE(USRMSG) LVL(*JOB) 0016.00 RETURN 0017.00 0018.00 ERROR: RCVMSG RMV(*NO) MSG(&MSG) 0019.00 SNDMSG: SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG) 0020.00 ENDPGM
OVRMSGF MSGF(USRMSG) TOMSGF(CHINALIB/USRMSG) SECURE(*YES)
によってメッセージ・ファイル USRMSG を
中国語のメッセージ・ファイル (CHINALIB/USRMSG) に
一時変更すれば CHINALIB/USRMSG の内容が表示されることになる。
OVRDBF : ファイルの一時変更 と同じように
メッセージ・ファイル (*MSGF) に対しても
OVRMSGF
を使えばメッセージ・ファイルを一時変更することができる。
一時変更先のメッセージ・ファイルには
変更元のメッセージ ID すべてを含んでいる必要はない。
変更先の MSGF に含まれていない MSGID
については
変更前の MSGID
が採用されるからである。
このことを利用すれば QCPFMSG
の独自のメッセージに変更することができる。
そのような特殊な利用方法は別の機会に紹介する。