双方向言語サポート

このドキュメントでは、次のトピックについて説明します。


全般的な情報

アラビア語やヘブライ語などの一部の言語は右から左(RTL)に記述されますが、英語やドイツ語などの大部分の言語は左から右(LTR)に記述されます。左から右と右から左の両方が含まれるテキストは、双方向テキストと呼ばれます。

Natural は、双方向言語を基本的にサポートします。Windows では、このサポートは、Natural デフォルトコードページと Windows システムコードページの両方が双方向コードページとして定義されている場合に有効です。Natural で特定のコードページが定義されていない場合は、双方向の Windows システムコードページが定義されていれば十分です。UNIX および OpenVMS では、双方向言語のサポートは、Natural デフォルトコードページが双方向コードページである場合に有効です。

Natural プログラムの出力は、プロファイルパラメータ PM、端末コマンド %V、およびセッションパラメータ PM を使用して制御できます。

UNIX、および OpenVMS では、プロファイルパラメータ DO(表示順序)を追加で使用して、もともとは双方向データではなくインバース(右から左)出力モードをサポートする端末用に作成されているアプリケーションをサポートすることができます。これらのアプリケーションにより、アプリケーションコード内の双方向データの表示順序が作成されます。パラメータ DO を使用すると、これらのアプリケーションは、双方向データをサポートする I/O デバイスでも動作できるようになります。このことは、例えば、Natural Web I/O インターフェイスを使用してブラウザで実行されるアプリケーションなどが当てはまります。

画面方向

プロファイルパラメータ PM は、デフォルトの画面方向を定義します。PMR(リセット)に設定されている場合、デフォルトの画面方向は左から右です。PMI(逆)に設定されている場合、デフォルトの画面方向は右から左です。英数字以外のフィールドシステム変数はいずれも、Natural によって自動的にインバートされるため、画面方向が右から左であれば、右から左に正しく表示されます。PF キー行(UNIX および OpenVMS)はインバートされず、常に左から右へ表示されます。

端末コマンド %V は、画面方向を変更するために使用できます。画面方向が右から左の場合、現在のウィンドウのレイアウトはミラーリングされます。つまり、すべてのウィンドウコンポーネントまたはフィールドの基点は右上隅になります。画面方向は、%VON を使用して右から左に変更され、%VOFF を使用して左から右に戻されます。

フィールド方向

セッションパラメータ PM では、フィールドの方向が反対になります。"フィールドの方向を反対にした場合" の結果は、PM パラメータが使用されるステートメントおよびプラットフォームによって異なります。PM パラメータが MOVE ステートメントで使用された場合、フィールドの内容は単純に反対になります。つまり、最初の文字が最後の文字になるなどです。結果はフィールドの文字に依存しません。末尾の空白が削除されてから、フィールドは反対にされます。

例えば、次のようなプログラムがあります。

DEFINE DATA LOCAL
1  TEST1  (A10)
1  TEST2  (A10)
END-DEFINE
TEST1 := 'program'

MOVE TEST1 (PM=I) TO TEST2
INPUT TEST1 (AD=O) TEST2 (AD=O)

END

次の出力を生成します。

TEST1 program    TEST2 margorp

"margorp" は "program" が反対になったものです。

PM パラメータが INPUTDISPLAY などの IO ステートメントに対して使用される場合、その結果はより複雑です。この場合、フィールド方向は画面方向に基づきます。

  • 画面方向が左から右であり、PM=I がフィールドに適用される場合、フィールド方向は右から左に変わります。

  • 画面方向が右から左であり、PM=I がフィールドに適用される場合、フィールド方向は左から右に変わります。

Windows およびブラウザ端末(Natural Web I/O インターフェイス)では、"フィールド方向を反対にすること" は、フィールドの文字が単純に反対になることを意味しません。この場合、複雑な双方向アルゴリズムが適用されます(詳細については、Microsoft Windows のドキュメントを参照してください)。ただし、文字型の端末では、フィールドの文字は再ソートされません。単純に反対になるだけです。

次の例では、変数 TEST に割り当てられた文字は、次の順序で入力されています。

Test variable

次に、Windows のプログラム例を示します。プログラムエディタで入力するときに、定数の文字はすでに再ソートされています。

DEFINE DATA LOCAL
1  TEST  (A20)
END-DEFINE
TEST := 'abc 123 graphics/uni-testvariable-reversed.png'

SET CONTROL 'voff'

INPUT TEST (AD=O)  /
      TEST (AD=O PM=I) 

SET CONTROL 'von'

INPUT TEST (AD=O)  /
      TEST (AD=O PM=I) 
END

このプログラムでは、Windows 上に次の 2 つの画面が生成されます。

TEST abc 123 graphics/uni-testvariable-reversed.png 
TEST          123 graphics/uni-testvariable-reversed.png  abc

および

                                           123 graphics/uni-testvariable-reversed.png  abc TEST
                                  abc 123 graphics/uni-testvariable-reversed.png           TEST

次に、UNIX および OpenVMS のプログラム例を示します。文字が前述の順序で入力された場合、文字は単純にキーイング順に表示されるため、プログラムは次のように表示されます。

DEFINE DATA LOCAL
1  TEST  (A20)
END-DEFINE
TEST := 'abc graphics/uni-testvariable.png 123'
 
SET CONTROL 'voff'
 
INPUT TEST (AD=O)  /
      TEST (AD=O PM=I) 
 
SET CONTROL 'von'
 
INPUT TEST (AD=O)  /
      TEST (AD=O PM=I) 
END

UNIX および OpenVMS では、このプログラムにより次の 2 つの画面が生成されます。

TEST abc graphics/uni-testvariable.png 123 
TEST          321 graphics/uni-testvariable-reversed.png  cba

および

                                           321 graphics/uni-testvariable-reversed.png  cba TSET
                                  abc graphics/uni-testvariable.png 123           TSET

マップおよびダイアログ

Windows、UNIX、および OpenVMS では、マップエディタにはReverse Mapコマンドがあり、双方向フィールドを持つマップを簡単に処理できます。このコマンドによって、現在のマップの表示方向が変更されます。フィールドの位置は変わらず、表示のみが変更されます。Windows では、このコマンドは現在のマップにのみ影響します。UNIX および OpenVMS では、以降のすべてのマップが反対に表示されるように、フラグが設定されます。次の[Reverse Map]コマンドによって、元の状況が復元されます。

Windows では、ダイアログの出力を同様に制御できます。ダイアログ自体とほとんどのダイアログコントロールの両方に RTL 属性があります。ダイアログの RTL 属性をオンにすると、ダイアログの画面方向は右から左になります。他のコントロールの RTL 属性をオンにすると、これらのコントロールの方向は右から左になります。

プロファイルパラメータ PM によって、新しいダイアログの RTL 属性のデフォルト設定が定義されます。PMR(リセット)に設定されている場合、RTL 属性はデフォルトでオンになりません。PMI(逆)に設定されている場合、RTL 属性はデフォルトでオンになります。ダイアログの新しく作成されるコントロールの RTL 属性のデフォルト設定は、ダイアログの RTL 属性の設定から派生します。

ダイアログにすでにコントロールがあるときにダイアログの RTL 属性が変更された場合は、コントロールの RTL 属性も変更するかどうかを確認するダイアログが表示されます。

出力方法

Windows で双方向言語を使用している場合は、"GUI" が推奨される出力方法です。出力方法 "GUI" を使用すると、出力されるページに、画面上に表示されるウィンドウと同じレイアウトが表示されます。フィールド文字のソートは同一です。

出力方法 "TTY" を使用すると、ほとんどの場合、出力されるレイアウトは画面ウィンドウのレイアウトとは異なります。これは、フィールド文字が論理順に出力されるためです。方向が右から左へのフィールドの場合、すべての文字が単純に反対になります。つまり、最初の文字が最後の文字になるなどです。

端末機能

UNIX および OpenVMS では、Natural TermCap ユーティリティを使用して双方向サポートのための特殊な端末機能を定義できます。

RTLF 機能によって定義されたキーを使用して、ランタイム時にフィールドの入力方向を切り替えることができます。

RTLM および LTRM 機能により、入力モードを右から左と右から左との間で自動的に切り替えることができます。ただし、端末エミュレーションでこの機能がサポートされている場合に限ります。RTLM エスケープシーケンスは、右から左のフィールドの前に挿入され、LTRM エスケープシーケンスは左から右のフィールドの前に挿入されます。