INTL 可以輕鬆地在 Visual FoxPro (VFP) 中建立多語言軟體。它使您能夠創建多語言 Visual FoxPro 應用程序,同時最大限度地減少創建多版本軟體的麻煩。
本文檔用於描述以下內容:
strings.dbfMsgSvc()工作原理的詳細信息INTL類cINTLAbstractcINTLCurrencycINTLDatacINTLFontcINTLMemento類cINTLPicturecINTLRightToLeftcINTLStrategycINTLStringconfig.fpw選單語句MsgSvc()對話框回傳值MsgSvc()範例strings.dbfstrings.dbfstrings.dbfstrings.dbfstrings.dbfINTLVisitor首先,將 INTL 檔案放入一個乾淨的新目錄中。
然後,
部署文件:手動放置與您的專案相關的文件,如如何正確放置 INTL 檔案所述。
修改config.fpw檔案:對於選單,將兩行加入config.fpw檔案中,如如何在地化選單中所述。
為 Form 類別定義新增種子:現在,可能永遠,使用呼叫 INTL 物件的Form::Init()語句在表單中呼叫 INTL。請參閱如何取得自動表單本地化。
如果需要本地化,請實例化 INTL 物件:現在,當需要本地化時,建立並配置 INTL 對象,如如何實例化 INTL 物件中所述。
根據需要找到INTL的檔案對於VFP來說很重要。這裡是放置 INTL 檔案的位置,以便它們可用於您的開發環境:
如下部署您的文件:
genmenux.prgintl.prgSET PATH 。strings.dbf strings.fpt strings.cdxSET PATH 。msgsvc.dbf msgsvc.fpt msgsvc.cdxSET PATH 。 建立一個名為_SCREEN.oINTL的成員來保存 INTL 實例。
為了使用 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 以了解有關其功能的更多資訊。
strings.dbf的結構決定了您支援的語言。
使用SetLanguage()方法更改 INTL 的語言。
INTL 附帶一個名為strings.dbf的表,其中包含各種字段,其中之一是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的結構並為您需要的每種語言新增一個欄位。
strings.dbf表,放到你的專案根目錄下。ZAP您放置在專案根目錄中的strings.dbf表。strings.dbf的MODIFY STRUCTURE並新增一個名為cSwahili cSwahili新列,長度為 120。讓您的應用程式建立一個 INTL 物件。在應用程式的早期,實例化一個 INTL 對象,如如何實例化 INTL 物件中所述。現在可以使用其SetLanguage()方法以不同的語言顯示。
進行“構建全部”。打開您的項目,選擇“建置”,然後建立應用程式或 Exe,確保選擇“重新編譯所有檔案”。去吃午餐吧。
若要自動載入strings.dbf ,請執行您的應用程式或使用 INTLTool 公用程式。有兩種方法可以使用專案的介面字串填入strings.dbf表。第一種方法是運行您的程式。當物件被實例化時,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 物件。
您可以使用_SCREEN.oINTL.SetConfig( n )方法配置 INTL,其中n是位元整數值,具有以下解釋:
| 價值 | 配置意義 |
|---|---|
1 (預設)2481632 | 載入字串策略 載入字體策略 載入資料策略 載入圖片策略 載入貨幣策略 載入 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 (預設)24816 | BoundColumnControlSourceRowSourceRecordSourceInputMask |
| 字體 | 1 (預設)2 (預設) | Font和FontSizeDynamicFont和DynamicFontSize |
| 圖片 | 1 (預設)24 (預設)8 | PictureDownPictureIconDragIcon |
| 從右到左 | 1 (預設) | 所有物件在各自的容器內反轉 |
| 弦樂 | 1 (預設)2 (預設)4 (預設) | CaptionToolTipTextStatusBarText |
若要取得已載入策略的句柄,請使用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 )
範例:建立一個僅本地化字串和 InputMasks 的 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 的配置位。這些配置位元決定要載入哪種策略。預設只載入String策略,也就是說字串預設是由INTL自動本地化的。
| 班級 | 配置位 | 本土化 |
|---|---|---|
| 國際 | 1 (預設)4281632 | cINTLString策略已載入cINTLFont策略已載入cINTLData策略已載入cINTLPicture策略加載cINTLCurrency策略已加載已載入 cINTLRightToLeft策略 |
| CINTL字串 | 1 (預設)2 (預設)3 (預設) | CaptionToolTipTextStatusBarText |
激活字串策略如下:
*-- cINTLString is loaded by default.
*-- So there’s usually no need to do this
_SCREEN.oINTL.SetStrategy( "String", "cINTLString" )
另一種更神秘的載入字串策略的方法是:
-- Set configuration bit 2^0 "ON"
_SCREEN.oINTL.SetConfig( BITSET( oINTL.GetConfig(), 0 ))
所以有兩種方法可以做到這一點。
可以透過在strings.dbf中提供翻譯來本地化字串。
| c原件 | 法語 |
|---|---|
Yes | Oui |
No | Non |
使用SetConfig()方法配置字串策略。
與所有策略一樣,INTL 字串策略是按位元配置的。您可以如下控製字串策略物件:
範例:停用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 (預設)2481632 | cINTLString策略已載入cINTLFont策略已載入cINTLData策略已載入cINTLPicture策略加載cINTLCurrency策略已加載已載入 cINTLRightToLeft策略 |
| CINTL字體 | 1 (預設)2 (預設) | Font和FontSizeDynamicFont和DynamicFontSize |
啟動字體策略如下:
*-- cINTLFont is the Font strategy class.
_SCREEN.oINTL.SetStrategy( "Font", "cINTLFont" )
另一種更神秘的載入字體策略的方法是:
*-- Set configuration bit 2^1 "ON"
_SCREEN.oINTL.SetConfig(BITSET(oINTL.GetConfig(),1 ))
所以有兩種方法可以做到這一點。
可以透過在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 (預設)2481632 | cINTLString策略已載入cINTLFont策略已載入cINTLData策略已載入cINTLPicture策略加載cINTLCurrency策略已加載已載入 cINTLRightToLeft策略 |
| CINTL數據 | 1 (預設)24816 | BoundColumnControlSourceRowSourceRecordSourceInpuMask |
啟動資料策略如下:
*-- cINTLData is the Graphics strategy class.
_SCREEN.oINTL.SetStrategy( "Data", "cINTLData" )
另一種更神秘的載入資料策略的方法是:
*-- Set configuration bit 2^2 "ON"
_SCREEN.oINTL.SetConfig(BITSET(oINTL.GetConfig(),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 提供了一種在我們更改區域設定時更改顯示圖像的方法。
圖片策略的工作原理與其他策略類似。下表列出了INTL物件載入圖片策略的配置位,以及配置圖片策略的配置整數。
| 班級 | 配置位 | 本土化 |
|---|---|---|
| 國際 | 1 (預設)2481632 | cINTLString策略已載入cINTLFont策略已載入cINTLData策略已載入cINTLPicture策略加載cINTLCurrency策略已加載已載入 cINTLRightToLeft策略 |
cINTLPicture | 1 (預設)24 (預設)8 | PictureDownPictureIconDragIcon |
啟動圖片策略如下:
*-- cINTLPicture is the Graphics strategy class.
_SCREEN.oINTL.SetStrategy( "Picture", "cINTLPicture" )
另一種更神秘的載入圖片策略的方法是:
*-- Set configuration bit 2^3 "ON"
_SCREEN.oINTL.SetConfig(BITSET(oINTL.GetConfig(),3 ))
所以有兩種方法可以做到這一點。
可以透過在strings.dbf中提供翻譯來在地化圖片。圖片規範以標識符「 ((Picture)) 」為前綴,例如:
coriginal | crussian |
|---|---|
((Picture))Doctor.BMP | ((Picture))Doktor.BMP |
((Picture))Friend.BMP | ((Picture))Comrade.BMP |
使用其SetConfig()方法配置圖片策略。
與所有策略一樣,INTL 圖片策略是按位配置的。您可以如下控制圖片策略物件:
範例:本地化圖片、DownPicture 和圖示屬性。
*-- 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 貨幣策略僅適用於格式屬性為「$」的欄位。
回想一下,INTL 策略是根據下表位元來配置的。
| 類別(預設) | 價值 | 本土化 |
|---|---|---|
| 國際 (1) | 1 (預設)2481632 | cINTLString策略已載入cINTLFont策略已載入cINTLData策略已載入cINTLPicture策略加載cINTLCurrency策略已加載已載入 cINTLRightToLeft策略 |
啟動貨幣策略如下:
使用oINTL.SetConfig()或oINTL.SetStrategy()載入貨幣策略。
OINTL = _SCREEN.oINTL
oINTL.SetStratrgy( "Currency", "cINTLCurrency" )
另一種(更神秘的)方法是使用 INTL 的SetConfig()方法來呼叫給定類別的 Font 策略,如下所示:
OINTL = _SCREEN.oINTL
*-- Set bit 2^4 "ON"
oINTL.SetConfig( BITSET( oINTL.GetConfig(), 4 ))
所以有兩種方法可以做到這一點。
貨幣策略與其他策略不同。 INTL工具包貨幣策略在三個重要方面與其他策略略有不同:
貨幣是特定於區域設定的,而不是特定於語言的。
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 (預設)2481632 | 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 ))
所以有兩種方法可以做到這一點。
RightToLeft 策略是唯一真正重新排列容器中物件的策略。
INTL 工具包從右到左策略在四個重要方面與其他策略略有不同:
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 原始程式碼(這會在合併未來版本時造成困難),而是考慮對現有策略進行子類化以實現所需的行為。
在下圖中,我們建立了兩個子類,一個來自cINTLString類,一個來自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 中。
三種方式:
您可以將字串「INTL Ignore」放入物件的註解屬性中來使 INTL 忽略物件或容器物件。該字串不區分大小寫。
如果可以的話,給你的物件的類別一個 INTL 屬性,並為其指派邏輯 .F。
如果可以的話,為物件的類別指定一個 INTL 屬性,並為其指定一個小於 0 的數值。
如果您對特定物件有特殊需求,請為物件的類別提供一個 INTL 屬性,並為類別定義中的屬性或該物件的實例指派一個數值。該數值是您指派給 INTL 的SetConfig()方法以為此特定物件配置 INTL 的值。
如果您希望在後續策略實例化中取代您自己的策略,請使用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 之前轉換報告。
本地化報告實際上只需要做一次。轉換過程將您的報表標籤轉換為包含對 INTL 的I()函數的呼叫的報表運算式。例如,報表標籤"Name:"變成表達式I("Name:") 。
請參閱基於 .PJX 轉換報告。
如果您打算真正喜歡即時交換語言,那麼了解以下內容將會很有幫助:
INTL 本地化表單後,它會在表單中新增一個名為 oINTL 的對象,該物件屬於cINTLMemento類,配置為 INTL 配置。這個備忘錄是一個輕量級對象,它允許多個 INTL 物件和平共存,因為它們可以知道某個特定的表單此時以日文顯示。
當 INTL 物件找到包含名為 oINTL 的成員的表單時,它將採用由其GETCONFIG()值決定的成員配置。
如果您需要替代行為 - 例如,如果您需要第二個 INTL 物件完全覆蓋第一個的備忘錄 - 那麼首先將表單本地化回原始狀態(這會刪除 Form.oINTL 成員),然後使用第二個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.dbfmsgsvc.fptmsgsvc.cdx | 包含對話方塊、等待視窗、溫度計條和文字區塊訊息的表格和支援文件。 |
msgsvc.prg | 訊息服務庫。 |
nohot.prg | nohot()從 FoxPro 提示表達式中移除熱鍵字元。它是一個單行函數,您應該將其作為過程剪切並貼上到應用程式呼叫堆疊中的某個位置。 |
strings.dbfstrings.fptstrings.cdx | 包含翻譯短語的表格和支援文件。 |
INTL 類別層次結構是基於類別cINTLAbstract 。 cINTLAbstract用來定義整個層次結構的介面。只要有可能,就避免在子類別中新增惡意屬性、事件和方法。
下圖顯示了INTL類別層次結構的OMT圖。

INTL 類別層次結構。
在正常情況下,您可能使用的唯一物件是INTL類別。
cINTLMemento類別可以用作令牌。
cINTLMemento是一個配置令牌,INTL 物件可以使用它來儲存特定本地化的詳細資訊。 cINTLMemento包括對受保護屬性的存取方法。
INTL 是本地化過程的公共介面和模板方法。
cINTLStrategy 是各種在地化引擎的父類別。
cINTLString 、 cINTLCurrency 、 cINTLFont 、 cINTLMeasures 、 cINTLPicture和cINTLData是特定策略實作的類別。
INTL類
INTL 類別提供在地化應用程式中的物件和其他元素的服務。
INTL公開屬性INTL::cCurrencyStrategyINTL 允許您本地化貨幣。
指定貨幣策略類別名稱的字串。
| 預設 | "cINTLCurrency" |
| 評論 | 您可以對cINTLCurrency進行子類化以滿足您的特定需求。然後,您可以使用SetStrategy("Currency",cYourCurrencyClass)方法將此貨幣策略屬性設為預設值以外的值。 |
| 參見 | cINTLMemento::GetStrategy() |
INTL::cDataStrategyINTL 允許不同的區域設定使用不同的資料來源。指定資料策略類別名稱的字串。
| 預設 | "cINTLData" |
| 評論 | 您可以對cINTLData進行子類化以滿足您的特定需求。您可以使用SetStrategy("Data", cYourDataClass)方法將此資料策略屬性設定為預設值以外的值。 |
| 參見 | cINTLMemento::GetStrategy() |
INTL::cFontStrategyINTL 允許替換正確的字型。
指定字型策略類別名稱的字串。
| 預設 | "cINTLFont" |
| 評論 | 您可以對cINTLFont進行子類化以滿足您的特定需求。您可以使用SetStrategy("Font", cYourFontClass)將字體策略屬性設定為預設值以外的值。 |
| 參見 | cINTLMemento::GetStrategy() |
INTL::cPictureStrategyINTL 可以在地化圖片、圖示和圖像。
指定圖片策略類別名稱的字串。
| 預設 | "cINTLPicture" |
| 評論 | 您可以對cINTLPicture進行子類化以滿足您的特定需求。您可以使用 ::SetStrategy("Picture", cYourPictureClass ) 將圖片策略屬性設為預設值以外的值。 |
| 參見 | cINTLMemento::GetStrategy() |
INTL::cStringStrategyINTL 本地化單字和片語。
指定字串策略類別名稱的字串。字串策略類別負責本地化應用程式中的字串和短語,並且還充當其他策略類別的函數儲存庫。
| 預設 | "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()傳回關聯的資源表的名稱