RPG

287. 国際言語対応の開発 (3)

先の「286. 国際言語対応の開発 (2)」では DDS の MSGCON を使う方法を紹介したが
MSGCON による方法は言語別に DSPFオブジェクトが必要であった。
オブジェクトがひとつだけで複数言語に対応できる方法はないだろうか ?

ここでは、ひとつのオブジェクトだけで複数の国際言語対応に切替えることが
できる方法を紹介する。
その方法とは MSGCON キー・ワードではなく MSGID キー・ワードを使うことである。

【例】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 コマンドによってメッセージ・ファイルを中国語用に
外部から切替えることができるのである。

MSGID を利用する関連図

  • 中国語を使用するときだけ OVRMSGF を指定する。
  • DSPF オブジェクトはひとつだけでよい。

この方法を使えば、例えば 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 で
オーバーライドすればいっそう簡単なものとなる。

【 サンプル CLP : PGM119CL 】
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 の内容が表示されることになる。

【追記】OVRMSGF について

OVRDBF : ファイルの一時変更 と同じように
メッセージ・ファイル (*MSGF) に対しても
OVRMSGF を使えばメッセージ・ファイルを一時変更することができる。
一時変更先のメッセージ・ファイルには
変更元のメッセージ ID すべてを含んでいる必要はない。
変更先の MSGF に含まれていない MSGID については
変更前の MSGID が採用されるからである。
このことを利用すれば QCPFMSG の独自のメッセージに変更することができる。
そのような特殊な利用方法は別の機会に紹介する。