アラビア語やヘブライ語などの一部の言語は右から左(RTL)に記述されますが、英語やドイツ語などの大部分の言語は左から右(LTR)に記述されます。 左から右と右から左の両方が含まれるテキストは、双方向テキストと呼ばれます。
Natural は、双方向言語を基本的にサポートします。 Windows では、このサポートは、Natural デフォルトコードページと Windows システムコードページの両方が双方向コードページとして定義されている場合に有効です。 Natural
で特定のコードページが定義されていない場合は、双方向の Windows システムコードページが定義されていれば十分です。 UNIX および OpenVMS では、双方向言語のサポートは、Natural デフォルトコードページが双方向コードページである場合に有効です。
メインフレームでは、双方向言語のサポートは自動的にアクティブはなりません。このため、ユーザーは常に、以下の説明に従ってすべての必要なパラメータを(例えば、PM=I
のように)指定する必要があります。
Natural プログラムの出力は、プロファイルパラメータ PM
、端末コマンド %V
、およびセッションパラメータ PM
を使用して制御できます。
メインフレーム、UNIX、および OpenVMS では、プロファイルパラメータ DO
(表示順序)を追加で使用して、元々は双方向データではなくインバース(右から左)出力モードをサポートする端末用に作成されているアプリケーションをサポートすることができます。 これらのアプリケーションにより、アプリケーションコード内の双方向データの表示順序が作成されます。
パラメータ DO
を使用すると、これらのアプリケーションは、双方向データをサポートする I/O デバイスでも動作できるようになります。 このことは、例えば、Natural Web I/O インターフェイスを使用してブラウザで実行されるアプリケーションなどが当てはまります。
プロファイルパラメータ PM
は、デフォルトの画面方向を定義します。 PM
が "R"(リセット)に設定されている場合、デフォルトの画面方向は左から右です。 PM
が "I"(逆)に設定されている場合、デフォルトの画面方向は右から左です。 英数字以外のフィールド、システム変数、および PF キー行(メインフレームのみ)はいずれも、Natural によって自動的にインバートされるため、画面方向が右から左であれば、右から左に正しく表示されます。
UNIX および OpenVMS では、PF キー行はインバートされず、常に左から右へ表示されます。
端末コマンド %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
パラメータが INPUT
や DISPLAY
などの IO ステートメントに対して使用される場合、その結果はより複雑です。 この場合、フィールド方向は画面方向に基づきます。
画面方向が左から右であり、PM=I
がフィールドに適用される場合、フィールド方向は右から左に変わります。
画面方向が右から左であり、PM=I
がフィールドに適用される場合、フィールド方向は左から右に変わります。
Windows およびブラウザ端末(Natural Web I/O インターフェイス)では、"フィールド方向を反対にすること" は、フィールドの文字が単純に反対になることを意味しません。 この場合、複雑な双方向アルゴリズムが適用されます。詳細については、Microsoft Windows のドキュメントを参照してください。 ただし、(文字型の)他の端末では、フィールドの文字は再ソートされません。単純に反対になるだけです。
次の例では、変数 TEST
に割り当てられた文字は、次の順序で入力されています。
次に、Windows のプログラム例を示します。 プログラムエディタで入力するときに、定数の文字はすでに再ソートされています。
DEFINE DATA LOCAL 1 TEST (A20) END-DEFINE TEST := 'abc 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
このプログラムでは、Windows 上に次の 2 つの画面が生成されます。
TEST abc 123 TEST 123 abc
および
123 abc TEST abc 123 TEST
次に、UNIX、OpenVMS、およびメインフレームのプログラム例を示します。 文字が同じ順序で入力された場合、文字は単純にキーイング順に表示されるため、プログラムは次のように表示されます。
DEFINE DATA LOCAL 1 TEST (A20) END-DEFINE TEST := 'abc 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 123 TEST 321 cba
および
321 cba TSET abc 123 TSET
メインフレームでは、このプログラムにより 2 つの同じ画面が生成されます(メインフレームでは、ステートメント SET CONTROL 'voff'
と SET CONTROL 'von'
は英数字フィールドには適用されません)。 どちらの画面も、次のように表示されます。
TEST abc 123 TEST 321 cba
Windows、UNIX、および OpenVMS では、マップエディタには、
コマンドがあり、双方向フィールドを持つマップを簡単に処理できます。 このコマンドによって、現在のマップの表示方向が変更されます。 フィールドの位置は変わらず、表示のみが変更されます。 Windows では、このコマンドは現在のマップにのみ影響します。 UNIX および OpenVMS では、以降のすべてのマップが反対に表示されるように、フラグが設定されます。次の コマンドによって、元の状況が復元されます。Windows では、ダイアログの出力を同様に制御できます。ダイアログ自体とほとんどのダイアログコントロールの両方に RTL
属性があります。 ダイアログの RTL
属性をオンにすると、ダイアログの画面方向は右から左になります。 他のコントロールの RTL
属性をオンにすると、これらのコントロールの方向は右から左になります。
プロファイルパラメータ PM
によって、新しいダイアログの RTL
属性のデフォルト設定が定義されます。 PM
が "R"(リセット)に設定されている場合、RTL
属性はデフォルトでオンになりません。 PM
が "I"(逆)に設定されている場合、RTL
属性はデフォルトでオンになります。 ダイアログの新しく作成されるコントロールの RTL
属性のデフォルト設定は、ダイアログの RTL
属性の設定から派生します。
ダイアログにすでにコントロールがあるときにダイアログの RTL
属性が変更された場合は、コントロールの RTL
属性も変更するかどうかを確認するダイアログが表示されます。
Windows で双方向言語を使用している場合は、"GUI" が推奨される出力方法です。 出力方法 "GUI" を使用すると、出力されるページに、画面上に表示されるウィンドウと同じレイアウトが表示されます。 フィールド文字のソートは同一です。 出力方法 "TTY" を使用すると、ほとんどの場合、出力されるレイアウトは画面ウィンドウのレイアウトとは異なります。これは、フィールド文字が論理順に出力されるためです。 方向が右から左へのフィールドの場合、すべての文字が単純に反対になります。つまり、最初の文字が最後の文字になるなどです。