INTL は、Visual FoxPro (VFP) で多言語ソフトウェアを簡単に作成します。これにより、複数バージョンのソフトウェアを作成する手間を最小限に抑えながら、多言語の Visual FoxPro アプリケーションを作成できるようになります。
この文書は次のことについて説明します。
strings.dbf
バッチ更新する方法MsgSvc()
仕組みの詳細INTL
cINTLAbstract
cINTLCurrency
cINTLData
cINTLFont
cINTLMemento
cINTLPicture
cINTLRightToLeft
cINTLStrategy
cINTLString
config.fpw
メニュー ステートメントMsgSvc()
ダイアログの戻り値MsgSvc()
例strings.dbf
更新するstrings.dbf
更新するstrings.dbf
の更新strings.dbf
の更新strings.dbf
更新するINTLVisitor
まず、INTL ファイルをクリーンな新しいディレクトリに置きます。
それから、
ファイルを配置する: 「INTL ファイルを正しく配置する方法」の説明に従って、プロジェクトに関連してファイルを手動で配置します。
config.fpw
ファイルを変更します。メニューの場合は、「メニューをローカライズする方法」で説明されているように、 config.fpw
ファイルに 2 行を追加します。
Form クラス定義をシードします。現時点では、おそらく永久に、INTL オブジェクトを呼び出すForm::Init()
ステートメントを使用してフォーム内で INTL を呼び出します。 「フォームの自動ローカリゼーションを取得する方法」を参照してください。
ローカライズが必要な場合は、 INTL オブジェクトをインスタンス化します。ローカライズが必要な場合は、「INTL オブジェクトをインスタンス化する方法」の説明に従って、INTL オブジェクトを作成して構成します。
VFP にとって、必要に応じて INTL のファイルを見つけることが重要です。開発環境で使用できるように、INTL ファイルを配置する場所は次のとおりです。
次のようにファイルをデプロイします。
genmenux.prg
intl.prg
SET PATH
沿い。strings.dbf strings.fpt strings.cdx
SET PATH
沿い。msgsvc.dbf msgsvc.fpt msgsvc.cdx
SET PATH
沿い。 INTL インスタンスを保持するために、 _SCREEN.oINTL
という名前のメンバーを作成します。
INTL を使用するには、アプリケーションで INTL オブジェクトをインスタンス化する必要があります。これを行うには多くの方法がありますが、最良の方法は次のように_SCREEN
に追加することです。
*-- Anywhere, anytime:
*-- Instantiate INTL in _SCREEN
SET PROCEDURE TO INTL ADDITIVE
SCREEN.AddObject( "oINTL", "INTL" )
フォームのオブジェクト参照を INTL オブジェクトのLocalize()
メソッドに渡すことによって、フォームをローカライズします。
フォーム (およびその他のコンテナ) は、その参照をoINTL.Localize()
メソッドに渡すことによってローカライズされます。
*-- Configure oINTL to another language
_SCREEN.oINTL.SetLanguage( "French" )
*-- Instantiate a form. If the form calls INTL in its Init()
*-- method, then the form appears in French....
DO FORM MyForm Name MyForm
....または、その場でフォームをローカライズすることもできます。
_SCREEN.oINTL.Localize( MyForm )
Form.Init()
階層内でoINTL
への呼び出しを配置します。
フォーム自体をローカライズするには、フォーム クラス階層内のoINTL.Localize()
メソッドを自動的に呼び出します。これを行うには、フォーム クラス定義のInit()
メソッドに次のコードを配置します。 |
*-- Don't forget to call the ParentClass!
DODEFAULT()
IF TYPE("_SCREEN.oINTL" ) == "O"
_SCREEN.oINTL.Localize( This )
ENDIF
GENMENUX ドライバーは、メニューをローカライズするために使用されます。 GENMENUX とその INTL.PRG ドライバーをアクティブにするには、 config.fpw
に次の行を追加します。
これらの行をconfig.fpw
に追加します。
*-- Configuring for INTL menus.
_GENMENU = GENMENUX.PRG
_MNXDRV2 = INTL.PRG
*-- End of configuration for INTL menus.
これらの変更の中には、VFP の再起動が必要なものもあります。この時点で FoxPro を再起動しないようにするには、コマンド ウィンドウで次のコマンドを発行します。
_GENMENU = HOME()+”GENMENUX.PRG”
メニューをローカライズするために開発環境で変更する必要があるのはこれだけです。以降は通常どおりメニューを生成します。
GENMENUXはとてもクールです。それをチェックしてください。
注: GENMENUX は、VFP のネイティブ メニュー ジェネレーターを置き換えるものではありません。 GENMENUX は GENMENU.PRG を呼び出すため、コードは通常どおり VFP によって生成されます。 INTL ツールキットは、プリプロセッサとして GENMENUX を使用します。 GENMENUX は豊富なプログラムです。 GENMENUX の機能の詳細については、GENMENUX を参照してください。
strings.dbf
の構造によって、サポートされる言語が決まります。
INTL の言語を変更するには、 SetLanguage()
メソッドを使用します。
INTL には、さまざまなフィールドを含むstrings.dbf
という名前のテーブルが付属しており、その 1 つはcOriginal
であり、さまざまな言語の他のフィールド (たとえば、 cFrench
、 cGerman
、 cSpanish
など) が含まれる場合があります。
サポートする言語は、 strings.dbf
テーブルの構造によって決まります。新しい言語を追加するには、 strings.dbf
の構造を変更します。
現在のローカリゼーション言語を変更するには、 SetLanguage()
メソッドを使用します。フォームをフランス語にしたいとします。まず言語を設定してから、フォームをローカライズします。
_SCREEN.oINTL.SetLanguage( "French" )
_SCREEN.oINTL.Localize( _SCREEN.ActiveForm )
表示言語をその場で切り替えることほど優れたデモはありません。
デモでは常に成功する、オンザフライで言語を切り替えるには (必須でなくても実行できます。とても簡単です)、アプリケーション内にINTL.SetLanguage()
を使用して INTL オブジェクトを構成するメカニズムを作成します。が続きます。
_SCREEN.oINTL.SetLanguage("German" ) && Configure INTL for German
FOR i = 1 TO ALEN(_SCREEN.Forms ) && Localize active forms
_SCREEN.oINTL.Localize( _SCREEN.Forms[i] )
ENDFOR
DO MAIN.MPR && Refresh the menu too!
アプリケーションのロケールベースのパーソナリティを変更するには、必要に応じて機能するようにINTL
サブクラス化することをお勧めします。独自のニーズに合わせてINTL
サブクラス化することは、最小限のコードと労力でロケールの要求を満たす優れた方法です。
以下は、さまざまなロケールで機能する INTL サブクラスの例です。 INTL
クラスをサブクラス化して、すべてのロケール固有の設定を一度に変更します。
中東の書記体系に役立つ RightToLeft 戦略 (クラスcINTLRightToLeft
) に注目してください。
DEFINE CLASS MyINTL AS INTL
FUNCTION SetLocale( tcLocale )
IF EMPTY( tcLocale )
tcLocale = this.GetLocale()
ENDIF
IF INTL::SetLocale( @tcLocale )
DO CASE
CASE PROPER(tcLocale )= "Usa"
SET CURRENCY TO "$"
SET CURRENCY LEFT
SET POINT TO "."
SET SEPARATOR TO ","
SET DATE TO American
SET MARK TO "/"
this.SetRightToLeft( .F. )
this.SetConversion( "Usa", 1.33 )
this.SetLanguage( "USEnglish" )
CASE PROPER(tcLocale )= "France"
SET CURRENCY TO " F"
SET CURRENCY RIGHT
SET POINT TO ","
SET SEPARATOR TO "."
SET DATE TO DMY
SET MARK TO "/"
this.SetRightToLeft( .F. )
this.SetConversion( "France", 0.28 )
this.SetLanguage( "French" )
CASE PROPER(tcLocale )= "Germany"
SET CURRENCY TO " DM"
SET CURRENCY RIGHT
SET POINT TO ","
SET SEPARATOR TO "."
SET DATE TO DMY
SET MARK TO "/"
this.SetRightToLeft( .F. )
this.SetConversion( "Germany", 0.28 )
this.SetLanguage( "German" )
CASE PROPER(tcLocale )= "Israel"
SET CURRENCY TO "ILS"
SET CURRENCY LEFT
SET POINT TO "."
SET SEPARATOR TO ","
SET DATE TO British
SET MARK TO "/"
this.SetConversion( "Israel", 0.41 )
this.SetRightToLeft( .T. )
this.SetLanguage( "Hebrew" )
ENDCASE
ENDIF
ENDDEFINE
INTL は迅速に実装できるように設計されています。
今日の午後の多言語デモに備えて、今朝アプリケーションをローカライズするために行う必要があることは次のとおりです。 VFP の設計ツールを適切に使用したことがあれば、これは簡単な作業です。そうでない場合は、設計に少し時間がかかります。
基本的な手順は次のとおりです。
INTL をインストールし、フォーム基本クラスのInit()
メソッドをシードします。 「INTL のインストール」というタイトルのセクションの手順に従います。すべての手順を必ず確認してください。特に重要なのは、「INTL オブジェクトをインスタンス化する方法」、「フォームの自動ローカリゼーションを取得する方法」、および「メニューをローカライズする方法」というタイトルの手順です。
strings.dbf
の構造を変更し、必要な言語ごとに 1 つのフィールドを追加します。
strings.dbf
テーブルをコピーし、プロジェクトのルート ディレクトリに置きます。strings.dbf
テーブルをZAP
。strings.dbf
のMODIFY STRUCTURE
、長さ 120 のcSwahili
という名前の新しい列を追加します。cSwahili cSwahili
「c」は必須であることに注意してください。アプリケーションに INTL オブジェクトを作成させます。アプリケーションの早い段階で、「INTL オブジェクトをインスタンス化する方法」の説明に従って INTL オブジェクトをインスタンス化します。別の言語で表示するには、 SetLanguage()
メソッドを使用するだけです。
「すべてビルド」を実行します。プロジェクトを開いて [ビルド] を選択し、アプリまたは Exe をビルドします。必ず [すべてのファイルを再コンパイル] を選択してください。ランチに行きます。
strings.dbf
自動的にロードするには、アプリを実行するか、INTLTool ユーティリティを使用します。 strings.dbf
テーブルにプロジェクトのインターフェイス文字列を設定するには 2 つの方法があります。 1 つ目の方法は、プログラムを実行することです。オブジェクトがインスタンス化されると、INTL は文字列 ( Caption
、 Tooltiptext
など) を文字列テーブルに追加します。より良い方法は、INTLTool 更新プログラムを実行することです。 INTLツールを参照してください。
strings.dbf
テーブルに翻訳を入力します。 cSwahili
列にスワヒリ語の翻訳を入力し、必要に応じてホットキーとショートカット キーを使用します。注: 次の手順を実行すると、テストおよび内部デモ用の「簡単な」翻訳を取得できます。
`REPLACE ALL cSwahili with "**"+TRIM(cOriginal)+"**" FOR cOriginal <> "(("`
_SCREEN.oINTL
という名前のメイン INTL オブジェクトを作成することをお勧めします。
複数の個別の INTL オブジェクトを共存させることができます。各 INTL オブジェクトは、フックまたはストラテジと呼ばれる他の INTL オブジェクトの集合体です。メインの INTL オブジェクトは、環境内のマスター INTL オブジェクトであり、 _SCREEN.oINTL
という名前だと思います。
SetConfig( n )
メソッドを使用して、メインの INTL オブジェクトを構成します。
INTL は_SCREEN.oINTL.SetConfig( n )
メソッドを使用して構成します。ここで、 n
はビット単位の整数値であり、次のように解釈されます。
価値 | 構成の意味 |
---|---|
1 (デフォルト)2 4 8 16 32 | 文字列戦略をロードする フォント戦略をロードする データ戦略をロードする 画像戦略をロードする 通貨戦略をロードする RightToLeft 戦略をロードする |
例: 文字列とフォントをローカライズする INTL オブジェクトを作成する
*-- create an INTL object
_SCREEN.AddObject("oINTL", "INTL" )
*-- Load the strings and font strategies.
_SCREEN.oINTL.SetConfig( 1 + 2 )
メイン INTL オブジェクトの動作言語とロケールは、 SetLanguage()
とSetLocale()
メソッドで設定されます。
戦略はビットごとに構成されます。
個々の戦略を次のように構成します。戦略への参照を取得し、それを構成します。構成可能な各戦略の構成の意味は次のとおりです。
戦略 | 価値 | ローカリゼーション |
---|---|---|
データ | 1 (デフォルト)2 4 8 16 | BoundColumn ControlSource RowSource RecordSource InputMask |
フォント | 1 (デフォルト)2 (デフォルト) | Font とFontSize DynamicFont とDynamicFontSize |
写真 | 1 (デフォルト)2 4 (デフォルト)8 | Picture DownPicture Icon DragIcon |
右から左へ | 1 (デフォルト) | すべてのオブジェクトがそれぞれのコンテナ内で反転される |
文字列 | 1 (デフォルト)2 (デフォルト)4 (デフォルト) | Caption ToolTipText StatusBarText |
ロードされた戦略のハンドルを取得するには、 oINTL.GetStrategy()
メソッドを使用します。その後、ハンドルのoINTL.SetConfig()
メソッドを使用して戦略を構成します。
例: ツールチップではなく文字列をローカライズする INTL オブジェクトを作成する
oINTL.GetStrategy()
メソッドを使用してオブジェクト参照を取得し、そのoINTL.SetConfig()
メソッドを使用して構成します。
*-- create an INTL object
_SCREEN.AddObject("oINTL", "INTL" )
*-- Load the strings and font strategies.
_SCREEN.oINTL.SetConfig( 3 )
*-- Configure Strings to NOT localize ToolTips
LOCAL loTempHandle
loTempHandle = _SCREEN.oINTL.GetStrategy( "String" )
*-- For the string strategy, the configuration
*-- for Caption and StatusBarText is 5
loTempHandle.SetConfig( 1 + 4 )
例: 文字列とInputMaskのみをローカライズするINTLオブジェクトを作成します。
*-- create an INTL object
_SCREEN.AddObject( "oINTL", "INTL" )
*-- Load the strings and data strategies.
_SCREEN.oINTL.SetConfig( 5 )
*-- now modify the data strategy from its default.
LOCAL oTemp
oTemp = _SCREEN.oINTL.GetStrategy( "Data" )
*-- Input masks only.
oTemp.SetConfig( 16 )
ソフトウェアの翻訳について考えるとき、通常、最初に思い浮かぶのはインターフェイス文字列です。
INTL はデフォルトで文字列ストラテジのみをロードします。
次の表に、INTL の構成ビットを示します。これらの構成ビットは、どの戦略がロードされるかを決定します。デフォルトでは、文字列戦略のみがロードされます。つまり、文字列はデフォルトで INTL によって自動的にローカライズされます。
クラス | 構成ビット | ローカリゼーション |
---|---|---|
国際 | 1 (デフォルト)4 2 8 16 32 | cINTLString 戦略がロードされましたcINTLFont 戦略がロードされましたcINTLData ストラテジーがロードされましたcINTLPicture 戦略がロードされましたcINTLCurrency 戦略がロードされましたcINTLRightToLeft 戦略がロードされました |
CINTL文字列 | 1 (デフォルト)2 (デフォルト)3 (デフォルト) | Caption ToolTipText StatusBarText |
次のように文字列戦略をアクティブにします。
*-- cINTLString is loaded by default.
*-- So there’s usually no need to do this
_SCREEN.oINTL.SetStrategy( "String", "cINTLString" )
String ストラテジーをロードするもう 1 つの不可解な方法は次のとおりです。
-- Set configuration bit 2^0 "ON"
_SCREEN.oINTL.SetConfig( BITSET( oINTL.GetConfig(), 0 ))
したがって、それには 2 つの方法があります。
strings.dbf
で翻訳を提供することで、文字列をローカライズできます。
cオリジナル | cフランス語 |
---|---|
Yes | Oui |
No | Non |
SetConfig()
メソッドを使用して String Strategy を設定します。
INTL String 戦略は、他のすべての戦略と同様、ビットごとに構成されます。文字列戦略オブジェクトは次のように制御できます。
例: ToolTipText
プロパティのフォント処理を無効にするには:
*-- Get a handle on the string strategy:
oFont = _SCREEN.oINTL.GetStrategy( "String" )
*-- We want Caption( 1 ) and StatusbarText( 4 ) only
oFont.SetConfig( 5 )
フォントはロケール固有のものにすることができます。
Arial、Times New Roman、MS Sans Serif などのフォントは、言語によっては適さない場合があります。これは重要です。ロケールを変更するときにフォントを変更する方法が必要になる場合があります。
次の表に、フォント ストラテジをロードするための INTL オブジェクトの構成ビットと、フォント ストラテジを構成するための構成整数を示します。
クラス | 構成ビット | ローカリゼーション |
---|---|---|
国際 | 1 (デフォルト)2 4 8 16 32 | cINTLString 戦略がロードされましたcINTLFont 戦略がロードされましたcINTLData ストラテジーがロードされましたcINTLPicture 戦略がロードされましたcINTLCurrency 戦略がロードされましたcINTLRightToLeft 戦略がロードされました |
CINTLFont | 1 (デフォルト)2 (デフォルト) | Font とFontSize DynamicFont とDynamicFontSize |
次のようにフォント戦略をアクティブにします。
*-- cINTLFont is the Font strategy class.
_SCREEN.oINTL.SetStrategy( "Font", "cINTLFont" )
フォント戦略をロードするもう 1 つの不可解な方法は次のとおりです。
*-- Set configuration bit 2^1 "ON"
_SCREEN.oINTL.SetConfig(BITSET(oINTL.GetConfig(),1 ))
したがって、それには 2 つの方法があります。
strings.dbf
で翻訳を提供することで、フォントをローカライズできます。フォント仕様には、識別子「 ((Font ))
」が接頭辞として付けられます。次に例を示します。
cオリジナル | cロシア語 |
---|---|
((Font))Courier New,10 | ((Font))Courier New Cyr,10 |
((Font))Arial,16 | ((Font))Arial Cyr,16 |
SetConfig()
メソッドを使用してフォント戦略を設定します。
INTL フォント戦略は、すべての戦略と同様、ビットごとに構成されます。フォント戦略オブジェクトは次のように制御できます。
例: DynamicFont
およびDynamicFontSize
のフォント処理を無効にすると、フォント ストラテジのパフォーマンスがわずかに向上します。
*-- Set Font localization on
oINTL.SetConfig( BITSET( oINTL.GetConfig(), 1 )) && Set 2^1 "ON"
*-- Get a handle on the font strategy:
oFont = _SCREEN.oINTL.GetStrategy("Font" )
*-- We want Font and FontSize and to disable DynamicFont
*-- and DynamicFontSize
oFont.SetConfig( 1 )
データはロケール固有のものにすることができます。
ローカライズする必要があるのはデータ自体である場合もあります。 INTL を使用すると、さまざまなロケールにさまざまなフィールドを表示できます。
データ戦略は他の戦略と同様に機能します。
次の表に、ピクチャ ストラテジをロードするための INTL オブジェクトの構成ビットと、ピクチャ ストラテジを構成するための構成整数を示します。
クラス | 構成ビット | ローカリゼーション |
---|---|---|
国際 | 1 (デフォルト)2 4 8 16 32 | cINTLString 戦略がロードされましたcINTLFont 戦略がロードされましたcINTLData ストラテジーがロードされましたcINTLPicture 戦略がロードされましたcINTLCurrency 戦略がロードされましたcINTLRightToLeft 戦略がロードされました |
CINTLデータ | 1 (デフォルト)2 4 8 16 | BoundColumn ControlSource RowSource RecordSource InpuMask |
次のようにデータ戦略をアクティブ化します。
*-- cINTLData is the Graphics strategy class.
_SCREEN.oINTL.SetStrategy( "Data", "cINTLData" )
データ戦略をロードするもう 1 つの不可解な方法は次のとおりです。
*-- Set configuration bit 2^2 "ON"
_SCREEN.oINTL.SetConfig(BITSET(oINTL.GetConfig(),2 ))
したがって、それには 2 つの方法があります。
データ要素はstrings.dbf
で翻訳を提供することでローカライズできます。データ仕様には、次のように識別子「 ((Data))
」が接頭辞として付けられます。
cオリジナル | ロシア語 |
---|---|
((Data))cEngDesc | ((Data))cRussianDesc |
SetConfig()
メソッドを使用してデータ戦略を構成します。
INTL データ ストラテジは、すべてのストラテジと同様、ビットごとに構成されます。ピクチャー ストラテジ オブジェクトは次のように制御できます。
例: ControlSource プロパティをローカライズします。
*-- Set Data localization on
*-- Set 2^2 "ON"
oINTL.SetConfig( BITSET( oINTL.GetConfig(), 2 ))
*-- Get a handle on the data strategy:
oData = _SCREEN.oINTL.GetStrategy("Data" )
*-- We want ControlSource (2)
*-- property localized.
oPicture.SetConfig( 2 )
画像はロケール固有のものにすることができます。私たちが毎日使用しているアイコンや画像の中には、他のロケールでは適切でないものもあります。 INTL は、ロケールを変更するときに表示される画像を変更する方法を提供します。
Picture 戦略は他の戦略と同様に機能します。次の表に、ピクチャ ストラテジをロードするための INTL オブジェクトの構成ビットと、ピクチャ ストラテジを構成するための構成整数を示します。
クラス | 構成ビット | ローカリゼーション |
---|---|---|
国際 | 1 (デフォルト)2 4 8 16 32 | cINTLString 戦略がロードされましたcINTLFont 戦略がロードされましたcINTLData ストラテジーがロードされましたcINTLPicture 戦略がロードされましたcINTLCurrency 戦略がロードされましたcINTLRightToLeft 戦略がロードされました |
cINTLPicture | 1 (デフォルト)2 4 (デフォルト)8 | Picture DownPicture Icon DragIcon |
次のようにピクチャ ストラテジをアクティブにします。
*-- cINTLPicture is the Graphics strategy class.
_SCREEN.oINTL.SetStrategy( "Picture", "cINTLPicture" )
Picture ストラテジを読み込むもう 1 つの不可解な方法は次のとおりです。
*-- Set configuration bit 2^3 "ON"
_SCREEN.oINTL.SetConfig(BITSET(oINTL.GetConfig(),3 ))
したがって、それには 2 つの方法があります。
strings.dbf
で翻訳を提供することで、画像をローカライズできます。画像仕様には、識別子「 ((Picture))
」が接頭辞として付けられます。次に例を示します。
coriginal | crussian |
---|---|
((Picture))Doctor.BMP | ((Picture))Doktor.BMP |
((Picture))Friend.BMP | ((Picture))Comrade.BMP |
SetConfig()
メソッドを使用してピクチャ ストラテジを設定します。
INTL ピクチャ ストラテジは、すべてのストラテジと同様、ビットごとに構成されます。ピクチャー ストラテジ オブジェクトは次のように制御できます。
例: Picture、DownPicture、および Icon プロパティをローカライズします。
*-- Set Picture localization on
*-- Set 2^3 "ON"
oINTL.SetConfig( BITSET( oINTL.GetConfig(), 3 ))
*-- Get a handle on the font strategy:
oPicture = _SCREEN.oINTL.GetStrategy("Picture" )
*-- We want Picture (1), DownPicture( 2 ) and Icon (4)
*-- properties localized. 1+2+4 = 7
oPicture.SetConfig( 7 )
INTL は、シンプルでありながら適応性のある複数通貨機能を提供します。
INTL を使用すると、アプリケーションにシンプルな複数通貨機能を与えることができます。このアーキテクチャは柔軟であり、 cINTLCurrency
クラスをサブクラス化することで、おそらく必要なほぼすべての複数通貨スキームを実装できます。
すべての中心として、INTL Currency 戦略は、フォーマット プロパティが "$" であるフィールドでのみ機能します。
INTL ストラテジは、次の表に従ってビットごとに構成されていることを思い出してください。
クラス (デフォルトあり) | 価値 | ローカリゼーション |
---|---|---|
国際 (1) | 1 (デフォルト)2 4 8 16 32 | cINTLString 戦略がロードされましたcINTLFont 戦略がロードされましたcINTLData ストラテジーがロードされましたcINTLPicture 戦略がロードされましたcINTLCurrency 戦略がロードされましたcINTLRightToLeft 戦略がロードされました |
次のように通貨戦略を有効にします。
oINTL.SetConfig()
またはoINTL.SetStrategy()
を使用して通貨戦略をロードします。
OINTL = _SCREEN.oINTL
oINTL.SetStratrgy( "Currency", "cINTLCurrency" )
別の (そしてより不可解な) 方法は、次のように、INTL のSetConfig()
メソッドを使用して、INTL に特定のクラスのフォント ストラテジを呼び出すことです。
OINTL = _SCREEN.oINTL
*-- Set bit 2^4 "ON"
oINTL.SetConfig( BITSET( oINTL.GetConfig(), 4 ))
したがって、それには 2 つの方法があります。
通貨戦略は他の戦略とは異なります。 INTL ツールキットの通貨戦略は、次の 3 つの重要な点で他の戦略とは少し異なります。
通貨は言語固有ではなく、ロケール固有です。
クラスcINTLCurrency
クラスcINTLString
サービスを使用しません。
cINTLCurrency
クラスは、データが変換された状態にある場合、多くの入力フィールドを読み取り専用にします。
すべての通貨のデフォルトの為替レートは1.00
です。
INTL に同梱されているcINTLCurrency
クラスを使用して、通貨換算係数をさまざまな通貨に割り当てます。デフォルトでは、通貨ストラテジーで使用される変換係数は1.00
です。
時間依存の通貨換算が必要な場合は、 cINTLCurrency
サブクラス化して、検索など、必要な処理を行うことができます。
カナダドル、ユーロ、米ドルの通貨に対して INTL を構成してみましょう。データはカナダドルに基づいていると仮定します。
oINTL.SetConversion()
元のロケールと他のロケール間の為替レートを設定します。
通貨ロケールを変更するにはSetLocale()
を使用します。その後、通常どおりローカライズします。
oINTL = _SCREEN.oINTL
*-- Load the currency strategy
*-- Set 2^4 "ON"
oINTL.SetConfig( BITSET( oINTL.GetConfig(), 4 ))
*-- Define a few locales and currencies
oINTL.SetConversion( "Canada", 1 )
oINTL.SetConversion( "Euro", 1.55 )
oINTL.SetConversion( "USA", 1.33 )
*-- Lets assume we want to see it in US dollars
oINTL.SetLocale( "USA" )
*-- Localize the current form
oINTL.Localize(_SCREEN.ActiveForm )
INTL は、フォーム オブジェクトを右から左に自動的に表示します。
INTL を使用すると、中東の書記体系で必要とされる右から左へオブジェクトを表示できます。これを行うために、INTL はコンテナ内のオブジェクトの位置をコンテナの垂直中心線に沿って反転します。 INTL は、チェックボックスとオプション グループの配置プロパティも変更します。
INTL はキャプション テキストの方向を変更しません。キャプション テキストの方向を変更するには、Windows の中東ローカライズを使用している必要があります。
その結果、フォームが逆になります。左から右に読まれていた場合は、右から左に読まれ、その逆も同様です。
INTL ストラテジは、次の表に従ってビットごとに構成されていることを思い出してください。
クラス (デフォルトあり) | 価値 | ローカリゼーション |
---|---|---|
国際 (1) | 1 (デフォルト)2 4 8 16 32 | cINTLString 戦略がロードされましたcINTLFont 戦略がロードされましたcINTLData ストラテジーがロードされましたcINTLPicture 戦略がロードされましたcINTLCurrency 戦略がロードされましたcINTLRightToLeft 戦略がロードされました |
次のように通貨戦略を有効にします。
oINTL.SetConfig()
またはoINTL.SetStrategy()
を使用して通貨戦略をロードします。
OINTL = _SCREEN.oINTL
oINTL.SetStratrgy( "RightToLeft", "cINTLRightToLeft" )
An alternate (and more cryptic ) way is to use INTL's `SetConfig()` method make INTL invoke the Font strategy of a given class, as follows:
OINTL = _SCREEN.oINTL<b
*-- Set bit 2^5 "ON"
oINTL.SetConfig( BITSET( oINTL.GetConfig(), 5 ))
したがって、それには 2 つの方法があります。
RightToLeft 戦略は、コンテナ内のオブジェクトを実際に再配置する唯一の戦略です。
INTL ツールキットの右から左への戦略は、次の 4 つの重要な点で他の戦略とは少し異なります。
cINTLRightToLeft
は、クラスcINTLString
サービスを使用しません。cINTLRightToLeft
クラスは、コンテナ内のオブジェクトの位置をコンテナの垂直軸に沿って反転します。左側にあったものが右側になり、その逆も同様です。また、チェックボックスとオプショングループの配置プロパティも逆になり、ページフレーム内のページやグリッド内の列の順序も逆になります。cINTLRightToLeft
戦略を使用して左から右へ記述することができます。右から左に記述する言語用に INTL を構成しましょう。これを行う最もクリーンな方法は、 INTL::SetLanguage()
メソッドのサブクラスを使用することです。あるいは、 SetLocale()
メソッドを使用して行うこともできます。いずれにせよ、実装は同じです。
この例では、 SetLanguage()
使用して RightToLeft 変換を構成します。
注: わかりやすくするために、おそらく必要となるフォント戦略の設定を省略しました。フォントをローカライズする方法を参照してください。
DEFINE CLASS MidEastINTL AS INTL
FUNCTION SetLanguage( tcLanguage )
LOCAL llRetVal
LlRetVal = INTL::SetLanguage( tcLanguage )
*-- The right-to-left strategy is configured
*-- with the fifth INTL configuration bit.
IF tcLanguage = "Hebrew" OR ;
TcLanguage = "Arabic"
this.SetConfig( BITSET( this.GetConfig(), 5 ))
ELSE
this.SetConfig( BITCLEAR( this.GetConfig(), 5 ))
ENDIF
RETURN llRetVal
ENDDEFINE
異なる動作が必要ですか?サブクラスを考えてみましょう。別のことをしなければならない状況に遭遇するかもしれません。 INTL ソース コードを変更する (将来のリリースをマージするときに困難が生じる) 代わりに、望ましい動作を実現するために既存の戦略をサブクラス化することを検討してください。
以下の図では、2 つのサブクラスを作成しました。1 つはcINTLString
クラスから、もう 1 つはcINTLCurrency
クラスからです。クラス階層は次のようになります。
新しいクラスが INTL クラス階層に追加されました。
INTL に同梱されているサブクラスの代わりに独自のサブクラスを使用するには、次のように setstrategy() メソッドを呼び出します。
*-- Assuming _SCREEN.oINTL is already Instantiated
_SCREEN.oINTL.SetStrategy("String", "cMyString" )
_SCREEN.oINTL.SetStrategy("Currency", "cMyCurrency" )
独自の戦略を作成し、INTL を使用してそれらを自動的に呼び出すことができます。新しいストラテジーを cINTLStrategy クラスのサブクラスにして (これにより、INTL が期待するプロパティとメソッドが得られます)、それを使用して実行します。
既存のストラテジーをサブクラス化する場合と同様に、 SetStrategy()
メソッドを使用してストラテジーを INTL にロードします。
3 つの方法:
オブジェクトのコメント プロパティに文字列「INTL Ignore」を配置することで、INTL にオブジェクトまたはコンテナ オブジェクトを無視させることができます。この文字列では大文字と小文字が区別されません。
可能であれば、オブジェクトのクラスに INTL プロパティを与え、それに論理 .F を割り当てます。
可能であれば、オブジェクトのクラスに INTL プロパティを与え、0 未満の数値を割り当てます。
特定のオブジェクトに対して特別なニーズがある場合は、オブジェクトのクラスに INTL プロパティを与え、クラス定義内のプロパティまたはこのオブジェクトのインスタンスに数値を割り当てます。この数値は、この特定のオブジェクトに対して INTL を構成するために INTL のSetConfig()
メソッドに割り当てる値です。
後続のストラテジーのインスタンス化で独自のストラテジーを置き換える場合は、 SetStrategyClass()
メソッドを使用して、新しいストラテジー クラスを既存のストラテジー エイリアスに割り当てます。
*-- Permanently install cMyStringStrategy for the string strategy.
_SCREEN.oINTL.SetStrategyClass( "String", "cMyStringStrategy" )
strings.dbf
バッチ更新する方法INTL には、VFP 構造を再帰し、すべての文字列インターフェイス要素をstrings.dbf
にロードするように設計されたイテレータ クラスとビジター クラスが同梱されています。
「.PJX に基づくstrings.dbf
の更新」を参照してください。
VFP レポート構造は生成またはコンパイルされず、「そのまま」アプリケーションにバインドされます。したがって、.APP または .EXE を作成する前にレポートを変換する必要があります。
レポートのローカライズは、実際には 1 回だけ行う必要があります。変換プロセスにより、レポート ラベルが、INTL のI()
関数の呼び出しを含むレポート式に変換されます。たとえば、レポート ラベル"Name:"
は式I("Name:")
になります。
「.PJX に基づいたレポートの変換」を参照してください。
言語をその場で交換して本格的にやりたい場合は、次のことを知っておくと役立ちます。
INTL はフォームをローカライズした後、INTL が設定されたように設定されたクラスcINTLMemento
の oINTL という名前のオブジェクトをフォームに追加します。この memento は、特定の Form が現時点で、たとえば日本語で表示されていることを認識できるため、複数の INTL オブジェクトが平和的に共存できるようにする軽量オブジェクトです。
INTL オブジェクトは、oINTL という名前のメンバーを含むフォームを見つけると、そのGETCONFIG()
値によって決定されるメンバーの構成を採用します。
別の動作が必要な場合 (たとえば、2 番目の INTL オブジェクトで最初のメモを完全にオーバーライドする必要がある場合)、まずフォームを元の状態にローカライズし (これにより Form.oINTL メンバーが削除されます)、次に、次のコマンドを使用して新しいロケールにローカライズします。 2 番目の INTL オブジェクト。
MsgSvc()
仕組みの詳細最初の呼び出し時に、 MsgSvc()
_SCREEN.oMsgSvc
という名前のオブジェクトを作成し、その後このオブジェクトがメッセージングを管理します。 _SCREEN.oINTL
という名前のオブジェクトが存在する場合、 _SCREEN.MsgSvc
オブジェクトはその言語設定に従い、そのサービスを使用します。
実行時のローカリゼーションには、次のファイルを配布する必要があります。
ファイル | 注意事項 |
---|---|
i.prg | 最高のパフォーマンスを得るには、この関数を最初のSET PROCEDURE ファイルに配置します。 |
intl.prg | 最高のパフォーマンスを得るには、 SET PROCEDURE TO INTL Additive 。 |
msgsvc.dbf | |
msgsvc.fpt | |
msgsvc.cdx | MsgSvc() 使用する場合は、これらのファイルを配布する必要があります。 |
msgsvc.prg | メッセージ サービス ライブラリ。 |
nohot.prg | 最高のパフォーマンスを得るには、この関数を最初のSET PROCEDURE ファイルに配置します。 |
strings.dbf | |
strings.fpt | |
strings.cdx | これらも配布する必要があります。 |
STRINGS および MSGSVC のテーブルとファイルについては、APP または EXE に含めると、当然ながら読み取り専用になります。
INTL で使用されるファイルについて説明します。プロジェクトに対してこれらをどこに配置するのが最適かを判断するには、「INTL ファイルを正しく配置する方法」を参照してください。
ファイル | 説明 |
---|---|
addendum.txt | ドキュメントやヘルプ ファイルに含まれる場合と含まれない場合がある最新のニュース。 |
genmenux.zip | Andrew Ross MacNeill による、利用可能な最新の GENMENUX プログラムのアーカイブ。 |
i.prg | _SCREEN.oINTL.I() メソッドへのショートカットとして機能するスタンドアロン関数。 |
intl.prg | INTL ツールキットのクラスとユーティリティのコア コード。 |
intltool.prg | プロジェクト ファイルやその他の VFP 構造に対してバッチ操作を実行するための開発者用ユーティリティ。このファイルをアプリケーションと一緒に配布しないでください。 |
msgsvc.dbf msgsvc.fpt msgsvc.cdx | ダイアログ、待機ウィンドウ、温度計バー、テキスト ブロックのメッセージを含むテーブル ファイルとサポート ファイル。 |
msgsvc.prg | メッセージ サービス ライブラリ。 |
nohot.prg | nohot() FoxPro プロンプト式からホット キー文字を削除します。これは 1 行の関数であり、アプリケーションの呼び出しスタックのどこかにプロシージャとして切り取って貼り付ける必要があります。 |
strings.dbf strings.fpt strings.cdx | 翻訳された語句を含むテーブルとサポート ファイル。 |
INTL クラス階層はクラスcINTLAbstract
に基づいています。 cINTLAbstract
階層全体のインターフェイスを定義するために機能します。不正なプロパティ、イベント、メソッドをサブクラスに追加することは可能な限り避けられています。
以下の図は、INTL クラス階層の OMT 図を示しています。
INTL クラス階層。
通常の状況では、おそらく使用する唯一のオブジェクトは、 INTL
クラスです。
cINTLMemento
クラスはトークンとして使用できます。
cINTLMemento
は、INTL オブジェクトが特定のローカリゼーションの詳細を保存するために使用できる構成トークンです。 cINTLMemento
は、保護されたプロパティへのアクセス メソッドが含まれています。
INTL は、ローカリゼーション プロセスのパブリック インターフェイスおよびテンプレート メソッドです。
cINTLStrategy は、さまざまなローカリゼーション エンジンの親クラスです。
cINTLString
、 cINTLCurrency
、 cINTLFont
、 cINTLMeasures
、 cINTLPicture
、およびcINTLData
は、特定の戦略的実装のクラスです。
INTL
INTL クラスは、アプリケーション内のオブジェクトやその他の要素をローカライズするサービスを提供します。
INTL
クラスの公開プロパティINTL::cCurrencyStrategy
INTL を使用すると、通貨をローカライズできます。
通貨戦略クラスの名前を指定する文字列。
デフォルト | "cINTLCurrency" |
備考 | 特定のニーズに合わせてcINTLCurrency サブクラス化できます。その後、 SetStrategy("Currency",cYourCurrencyClass) メソッドを使用して、この通貨戦略プロパティをデフォルト以外に設定できます。 |
関連項目 | cINTLMemento::GetStrategy() |
INTL::cDataStrategy
INTL では、ロケールごとに異なるデータ ソースが許可されます。データ戦略クラスの名前を指定する文字列。
デフォルト | "cINTLData" |
備考 | 特定のニーズに合わせてcINTLData サブクラス化できます。 SetStrategy("Data", cYourDataClass) メソッドを使用して、このデータ戦略プロパティをデフォルト以外に設定できます。 |
関連項目 | cINTLMemento::GetStrategy() |
INTL::cFontStrategy
INTL を使用すると、適切なフォントを置き換えることができます。
フォント戦略クラスの名前を指定する文字列。
デフォルト | "cINTLFont" |
備考 | 特定のニーズに合わせてcINTLFont サブクラス化できます。 SetStrategy("Font", cYourFontClass) 使用して、フォント戦略プロパティをデフォルト以外に設定できます。 |
関連項目 | cINTLMemento::GetStrategy() |
INTL::cPictureStrategy
INTL は、写真、アイコン、画像をローカライズできます。
ピクチャ ストラテジ クラスの名前を指定する文字列。
デフォルト | "cINTLPicture" |
備考 | 特定のニーズに合わせてcINTLPicture サブクラス化できます。 ::SetStrategy("Picture", cYourPictureClass ) を使用して、ピクチャ ストラテジ プロパティをデフォルト以外に設定できます。 |
関連項目 | cINTLMemento::GetStrategy() |
INTL::cStringStrategy
INTL は単語とフレーズをローカライズします。
文字列戦略クラスの名前を指定する文字列。文字列戦略クラスは、アプリケーション内の文字列とフレーズをローカライズする役割を果たし、他の戦略クラスの関数リポジトリとしても機能します。
デフォルト | "cINTLSting" |
備考 | 特定のニーズに合わせてcINTLString サブクラス化できます。 SetStrategy("String", cYourStringClass) を使用してプロパティを設定できます。 |
関連項目 | cINTLMemento::GetStrategy() |
cINTLString 戦略クラスはこれまでで最も便利で、他の戦略にサービスを提供します。 | 注:多くのストラテジは、アクティブな文字列ストラテジ クラスによって提供される文字列ベースのサービスを使用します。特定のcStringStrategy クラスとの結合を減らすために、通常はcStringStrategy クラスに属する多くの文字列メソッドが、親ストラテジ クラスであるcINTLStrategy クラスに含まれています。したがって、すべての戦略には、何らかの固有の文字列ローカライゼーション機能があります。 |
INTL
クラスの公開メソッドINTL::Execute()
数値、文字列、オブジェクト、またはオブジェクトの配列をローカライズします。オブジェクトおよびオブジェクトの配列の場合、実行関数は各オブジェクトをすべてのアクティブなローカリゼーション戦略に順番に渡します。
構文 | oINTL.Execute( @PassedObject ) |
戻る | 何もない |
引数 | PassedObject : 数値、文字列、またはオブジェクトのタイプを指定できます。オブジェクト参照の配列にすることもできます。 |
関連項目 | INTL::ObjArray() |
例
DIMENSION laScratchArray[1]
SET PROC TO INTL
oINTL = CREATEOBJECT("INTL" )
oXX = CREATEOBJECT("Form" )
*-- Load the array with object references
oINTL.ObjArray( oXX, @laScratchArray )
oINTL.Execute( @laScratchArray )
INTL::GetAlias()
|戦略には、エイリアスによって参照されるリソース ファイルが必要な場合があります。
デフォルトのローカリゼーション戦略に関連付けられたリソース テーブルのエイリアスを返します。通常、デフォルトのストラテジ オブジェクトはcINTLString
クラスです。
構文 | oINTL.GetAlias() |
戻る | 文字列戦略テーブルのエイリアスの文字値。 |
引数 | なし。 |
備考 | GetAlias() メソッドはフック可能なメソッドです。つまり、クラスINTL のオブジェクトにフック オブジェクトが接続されている場合、 GetAlias() フック オブジェクトのメソッドに従います。デフォルトでは、 INTL クラスのオブジェクトはcINTLStringStrategy クラスのオブジェクトにフックされるため、 oINTL.GetAlias() の呼び出しは、 oINTL.oStringStrategy.getAlias() の呼び出しと同等です。 |
例
_SCREEN.AddObject( "oINTL", "INTL" )
*-- The following two are equivalent
_SCREEN.oINTL.oStringStrategy.GetAlias()
_SCREEN.oINTL.GetAlias() |
INTL::GetTable()
関連付けられたリソーステーブルの名前を返します。