国際言語化

国際言語化とは日本語以外の国際言語(英語、中国語, 等)でのインターフェースで使用することを
言います。
日本企業の海外への進出や海外協力会社への発注や材料調達も一般的になっている
現在のグローバル社会にあっては IBM i のインターフェースも国際言語に対応している必要が
迫られてきています。
ここでは AutoWeb を使っての効果的な国際言語化の具体的な方法について解説します。

国際言語化の方法

国際言語化とは大別して次の二種類の方法があります。

  • 1.データ・ベースとインターフェースの両方を国際言語化して識別する
  • 2.データ・ベースはそのままでインターフェースだけを国際言語化する

上記のどちらのケースでも AutoWeb を使って国際言語に対応することができます。
しかもどちらの場合であっても二次言語を導入する必要がありません。
CPF メッセージなども含めてエラー・メッセージや環境そのものを
現地化したい場合のみ二次言語の導入を検討してください。
また上記のいずれでも選択することができますが
最初はインターフェースのみを国際言語化することのほうが
簡単で現実的ですので 2. の方法を選択されることをお勧めします。

AutoWeb による国際言語化

AutoWebを使って国際言語化を行うと上記 2. のように

インターフェースだけを国際言語化することができます。

日本語データ・ベースはそのまま利用してインターフェースだけを
国際言語にすることができますので工数の少ないシンプルな
国際言語対応が可能となります。

二次言語をi5/OSに導入しなくても
二次言語の表示/登録および入力も行うことができます。

ひとつの DSPF オブジェクトで複数国際言語に対応

言語別に DSPF を作成する必要がなく、ひとつの DSPF オブジェクトだけで
複数の国際言語への対応が可能です。

複数の国際言語を同時表示が可能

データ・ベースを日本語のままで表示してインターフェースだけを
他の中国語などで表示することができます。
さらに画面上で中国語や英語、韓国語などを混在して表示することもできます。

国際言語化の基礎知識と準備

CCSID

国際言語を識別するためのコードが CCSID (=文字コード・セット: Coded Charactor Set ID) です。
例えば図書館に様々な本が保管されていたとしても、それが何語で書かれているのかを
わからなければ正しく読むことはできません。
例えば「汽車」という単語は日本語として解釈すれば「蒸気機関車」を意味しますが
中国語で解釈すれば「自動車」の意味になります。
「汽車」という単語が中国語であるのか日本語であるのかを識別するのが CCSID です。

コンピュータの中ではもっと複雑なので言語を識別するための文字コードが用意されています。
これが CCSID です。

【例】 CCSID の代表例
I
B
M
代表的な CCSID 使用可能な CCSID
日本 5026 5035, 1399, 290, 300, 301, 897, 930, 932, 942,
1041, 4396, 57345, 5026
米国(ENU) 37 37
中国簡体字(CHS) 935 836, 837, 903, 928, 935, 946, 1042, 1115, 1380, 1381
中国繁体字(CHT) 937 835, 904, 927, 937, 938, 948, 950, 1043, 1114
韓国(KOR) 833 833, 834, 891, 926, 933, 934, 944, 949, 951, 1040, 1088
タイ(THA) 838 838
ドイツ(DEU) 1011 273, 1011


Shift_JIS 943 943
UTF-8 1208 1208
UTF-16 1200 1200

良く知られている CCSID : 5026 や 5035 は日本語文字セットを表す CCSID です。
5026 は半角を優先して表示している CCSID ですが 5035 は英子文字を優先して表示している
CCSID です。
従って同じ HEX コードであっても CCSID を変えて表示すると表示される文字は
異なったものになります。
IBM i の多くの内部オブジェクトは CCSID がオブジェクトに付随して示されるように
なっています。
CCSID の理解を苦手としているユーザーが多いのも事実です。

ユニコードとは

ユニコードとはすべての国際言語のコードを重複することなく表現するために
統一されたコードであり基本的には UTF-16 が最初に登場したユニコードであり
漢字は 3バイト で半角文字は 2バイト で表示されます。
しかしこれではかなり冗長となるため半角文字だけを今まで通りに 1バイト
表現したのが UTF-8 というユニコードです。
今ではユニコードといえば殆ど UTF-8 が使用されていますが
ILE-RPG がサポートしているのは UTF-16 だけです。

AutoWeb の html インターフェースの文字コードも
ユニコード (UTF-8) で表現されています。

CCSID 1399 はユニコードではない。

CCSID 1399 は 5035 + NEC 選定漢字がセットされたものです。
例えば「梶vという字も CCSID 1399 には含まれています。
しかし 1399 はユニコードではありません。
ユニコードの CCSID は上図のように 1200 または 1208 (これ以外もありますが)です。
しかもユニコードの場合は漢字は 3バイト で表現されます。
CCSID 1399 にしたからといって EBCDIC 漢字が 3バイト になるわけではありません。
1399 がユニコードであるという、個人サイトや特約店 SE の説明は誤りです。

CTRL + F3 キーで CCSID は変化しない。

5250 エミュレータで CTRL + F3 キーを押すと CCSID が変化すると
説明している IBM 特約店があるようですが
CTRL + F3 キーでジョブの CCSID が変わることはありません。
5250 エミュレータのホスト・コードが変化するだけです。
CTRL + F3 キーで ジョブ属性が変化することはあり得ません。

AutoWebによる国際言語化の動作原理

AutoWeb による国際言語化はメッセージ・ファイルに各国用の言語を
用意しておいてこれらを OVRMSGF によって切替えて使用するというものです。
固定情報をメッセージ・ファイルの MSGID で記述しておくと
DSPF は実行時に MSGF の記述を参照します。
OVRMSGF で中国語の MSGF に一時変更しておけば
固定情報が中国語で表示されます。

【例】
  A                                  1 27' 部課マスターの登録

を次のようなメッセージ記述に書き換えます。

  A            TITLE_        20A  O  1 27MSGID(MSG0001 QTROBJ/USRMSG)
【解説】

この記述によって DSPF は実行時にメッセージ・ファイル: QTROBJ/USRMSG の
MSGID: MSG0001 に記述されている文字列を表示します。
メッセージ・ファイル: QTROBJ/USRMSG は CCSID が日本語として
5026, 5035 または 1399 で登録されていますので日本語として表示されますが
中国語の CCSID:935 として登録されているメッセージ・ファイルであれば
中国語として変換されて表示されます。

AutoWebの国際言語化とは

DDS の固定情報を MSGID で記述して
国際言語別のメッセージ・ファイルをオーバーライドで置換える

国際言語化の手順

AutoWebによって国際言語化を行う場合、

  • 二次言語の導入は必要ありません。
  • 二次言語用の 5250エミュレータも一切、必要ありません。

1. メッセージ・ファイルを言語別に作成します。

日本語を始めとして国際言語のメッセージ・ファイルを 所定のライブラリーに作成します。

【例】 日本語メッセージ・ファイルの作成

CRTMSGF MSGF(MYLIB/JAPAN) TEXT(' 日本語メッセージ・ファイル ')
     AUT(*ALL) CCSID(5026)

【註】CCSID は 5026, 5035 または 1399 として作成します。

【例】 中国簡体字メッセージ・ファイルの作成

CRTMSGF MSGF(MYLIB/CHINA) TEXT(' 中国語メッセージ・ファイル ')
     AUT(*ALL) CCSID(935)

【註】中国簡体字: 935, 中国繁体字: 937, 韓国語: 833, 米国: 37

2. DSPF を MSGID 記述に書き換えます。

DSPF の DDS 記述の日本語の固定情報を MSGID 記述に変更します。

【例】
  A                                  2  2' 部課コード '

を次のように書き換えます。

  A*                                 2  2' 部課コード '
  A            BUKA_         12A  O  2  2MSGID(MSG0002 QTROBJ/USRMSG)

元の固定情報「部課コード」もコメントとして残しておいたほうが
後でわかりやすくなります。
フィールド名 (BUKA_) は他と重複しないフィールド名を任意に命名してください。
長さ 12A は「部課コード」の文字列の長さを記述してください。
MSG0002 はメッセージ識別コード (MSGID) です。
メッセージ・ファイル QTROBJ/USRMSG は *LIBL を使わずに
日本語メッセージ・ファイルのライブラリーとメッセージ・ファイルの名前を
明示的に記述してください。

倍角カナ文字 (【例】システム) は MSGID として登録する必要はありません。
倍角カナ文字は日本語独自のものなので文字化けすることなく表示されます。

3. 日本語メッセージ・ファイルを登録します。

ADDMSGD MSGID(MSG0002) MSGF(QTROBJ/USRMSG) MSG(' 部課コード ')

のようにして日本語メッセージ・ファイルを登録してください。

4. 表示装置ファイル (DSPF) を CRTDSPF コマンドで再作成します。

日本語環境で CRTDSPF コマンドを使って表示装置ファイル (DSPF) を
再作成してください。

5. 関連する RPG/COBOL の再コンパイル&実行

該当の表示装置ファイル (DSPF) を使用している RPG/COBOL プログラムを
再コンパイルして実行します。
日本語環境下で MSGID に変更した日本語が正しく文字化けせずに
表示されているかを確認してください。

6. 国際言語の登録

WRKLANG: 国際言語の登録 を使って国際言語を国際言語のメッセージ・ファイルに登録します。
詳細は 「WRKLANG: 国際言語の登録」を参照してください。
国際言語への翻訳は Google翻訳を使って行います。

7. 国際言語の表示用CLの作成

OVRMSGF を使って国際語にオーバーライドして実行する CLP を作成してください。

【例】PGM119CL :USRMSG を中国語のメッセージ・ファイル:
         CHINALIB/USRMSG にオーバーライドさせて実行する。
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 に一時変更します。

        CALL       QTROBJ/PGM119

によってプログラムを実行した後には

        DLTOVR     FILE(USRMSG) LVL(*JOB)

によって一時変更を解除します。 必ず LVL(*JOB) と指定してください

8. AutoWeb で CLPを実行する。

作成した CLP を AutoWeb で動作させる最も簡単な方法は
CALL コマンドによって CLP を呼び出すのではなく
AutoWeb で提供されている CALLWEB コマンドを使うことです。

【例】CALLWEB QTROBJ/PGM119CL
【解説】

表題や欄見出しのような固定情報は中国語として
表示されていますがデータ・ベースは日本語のままで
文字化けせずに表示されていることに着目してください。
これは日本語環境のままで実行されているからです。

CALLWEB コマンドとは
CALLWEB コマンドとは CALL コマンドと動作は同じで
プログラムをパラメータつきで呼び出して実行する
コマンドですが CALL コマンドは 5250 エミュレータ上で
実行しますが CALLWEB コマンドは AutoWeb 上で実行されます。
CALLWEB は呼び出された時点で次の環境を AutoWeb に継承して実行します。
  • ユーザー・プロフィール       
  • パラメータ
  • ライブラリー・リスト
  • *LDA
  • 省略時の CCSID

高度な国際言語化を学習する

言語選択をプログラムで行う

プログラムの実行前に CLP で OVRMSGF でオーバーライドするのではなく
プログラムの実行中にコンボボックスで言語を選択する、という方法は
Web サイトではよく見られます。

サンプル : PGM109 : 部課マスターの登録

右上には言語選択のための静的なコンボボックスが表示されています。
これは DDS では

 A            LANG           3A  B  5 67
 A                                      VALUES('JPN' 'CHN')
 A                                      TEXT('" 日本語 " " 中国語 " *SBM')

のように定義されています。
TEXT キー・ワードの最後の「*SBM」は、このコンボボックスの選択と同時に
SUBMIT されることを意味しています。
すなわちコンボボックスを選択すると自動的に実行キー (ENTER) を押したのと
同じになります。

制御が RPG に戻ると RPG は選択に応じて次のようなサブ・ルーチンを実行します。

H DFTNAME(PGM109) DATEDIT(*YMD/) BNDDIR('QC2LE')
  :
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)');
    FLGIMG = BEGIMG + CHINA + ENDIMG;
  /END-FREE
C                   ENDSR
C******************************************************
C     JAPAN_        BEGSR
C******************************************************
  *( 日本語 )
  /FREE
    SYSTEM('DLTOVR FILE(USRMSG) LVL(*)');
    FLGIMG = BEGIMG + JAPAN + ENDIMG;
  /END-FREE
C                   ENDSR
【解説】

SYSTEM 関数とは QCMDEXC と同じ機能でありコマンドを実行する C 言語の関数です。
QCMDEXC を使うより SYSTEM 関数のほうが直感的で見やすくわかりやすい
コマンド実行を記述することができます。
H-仕様書に BNDDIR('QC2LE') と記述しておけばコンパイラーによって
C 言語の関数を参照することができるようになります。

【 DSPF      : PGM109FMソース 】   
【 ILE-RPG : PGM109ソース      】   

固定情報だけでなく変数値を国際言語化して表示する

通常の入出力フィールドの値を AutoWeb で国際言語化して表示することができます。

すべてのフィールドが同じ言語である場合

データ・ベースを始めとしてすべての変数、つまりフィールドが
同一の言語である場合は、実行ジョブの CCSID は 65535,
国コードを言語コードに設定します。

【例】中国語環境に設定

CHGJOB LANGID(CHS) CNTRYID(CN) CCSID(65535)

国コードが CHS であるので省略時の CCSID は i5/OS によって 935 に
設定されます。( DFTCCSID )
これによってすべて中国語による表示と入力も行うことができます。
データ・ベースやフィールド値はすべて中国語: CCSID 935 であると
解釈されて Web サイトの UTF-8 の文字コードに変換されます。
また入力した文字列も IBM i 内部では中国語: 935 に変換されて保管されます。

複数の国際言語の入出力を行う

変数としてのフィールド値でありながら複数の国際言語を混在して表示したり
複数の国際言語の入力を行うことができます。
( ただし一度に入力できるのはひとつの国際言語の場合だけです。)

フィールド個別のCCSIDを指定することができます。

【例】TEXTキー・ワードを使って CCSID:935 を指定する。
  A            MSGENG        48O  B  8 64TEXT('*CCSID 935')
【解説】

TEXTキー・ワードの最初の桁から *CCSID xxxx のようにして
フィールド個別の CCSID を指定することができます。
これによってこのフィールドは指定した CCSID 値から UTF-8 への
翻訳が行われ、入力時にはその逆の翻訳がなされます。

IBM DDS キー・ワードにも CCSIDキー・ワードが用意されていますが
IBM 提供の CCSID キー・ワードは CCSID(1200) しか指定することが
できず、また SFL レコードには指定することができません。
このため IBM提供の CCSID キー・ワードは使用することはできません。

表示のときは *CCSID によるフィールド個別の CCSID 指定による複数の
言語の同時表示は可能ですが入力のときはひとつの言語に限られており
同時に複数の言語を入力することはできません。
これは AutoWeb が HTMLインターフェースである文字コード:UTF-8 から
IBM i への文字コードへの変換はジョブの(ただひとつの)
省略時の文字コードへ変換されるからです。
そのジョブ環境は例えば中国語であれば

CHGJOB LANGID(CHS) CNTRYID(CN) CCSID(65535)

のようにして設定しておかねばなりません。
CCSID の値は必ず 65535 に設定してください。
動的に他の言語の入力も可能にしたいのであれば

CHGJOB LANGID(JPN) CNTRYID(JP) CCSID(65535)

などのコマンドをプログラム内部で実行できるように
しなければなりません。
この設定はプログラマーの責任の範囲内において
設定しなければなりません。

下記は日本語と中国語の入力を「F11=切替」によって切替えて
入力できる高度な事例となる「WRKLANG:国際言語の登録」を示しています。

サンプル : WRKLANG : 国際言語の登録

この適用業務のくわしい使用方法はこちら

このプログラムは「F11=切替」で日本語の入力モードと中国語の入力モードの どちらかに切替えることができます。 内部では日本語の入力モードの開始が選択されると

CHGJOB LANGID(JPN) CNTRYID(JP) CCSID(65535)

のコマンドが実行され、中国語の入力モードが選択されると

CHGJOB LANGID(CHS) CNTRYID(CN) CCSID(65535)

が実行されるようになっています。