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
파일에 두 줄을 추가합니다.
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를 참조하세요.
strings.dbf
의 구조에 따라 지원하는 언어가 결정됩니다.
INTL의 언어를 변경하려면 SetLanguage()
메서드를 사용하세요.
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
테이블을 복사하여 프로젝트 루트 디렉터리에 넣습니다.strings.dbf
테이블을 ZAP
.strings.dbf
의 MODIFY STRUCTURE
하고 길이가 120인 cSwahili
라는 새 열을 추가합니다. cSwahili
의 "c"는 필수입니다. 응용 프로그램이 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
이라고 가정합니다.
기본 INTL 개체를 구성하려면 SetConfig( n )
메서드를 사용하세요.
_SCREEN.oINTL.SetConfig( n )
메서드를 사용하여 INTL을 구성합니다. 여기서 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" )
문자열 전략을 로드하는 또 다른 더 비밀스러운 방법은 다음과 같습니다.
-- 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 (기본값)2 4 8 16 32 | cINTLString 전략이 로드됨cINTLFont 전략 로드됨cINTLData 전략 로드됨cINTLPicture 전략 로드됨cINTLCurrency 전략 로드됨cINTLRightToLeft 전략이 로드됨 |
CINTL글꼴 | 1 (기본값)2 (기본값) | Font 및 FontSize DynamicFont 및 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러시아어 |
---|---|
((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" )
데이터 전략을 로드하는 또 다른 더 비밀스러운 방법은 다음과 같습니다.
*-- Set configuration bit 2^2 "ON"
_SCREEN.oINTL.SetConfig(BITSET(oINTL.GetConfig(),2 ))
따라서 두 가지 방법이 있습니다.
strings.dbf
에 번역을 제공하여 데이터 요소를 현지화할 수 있습니다. 데이터 사양에는 다음과 같이 식별자 " ((Data))
"가 접두사로 붙습니다.
원본 | 크러시아어 |
---|---|
((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" )
그림 전략을 로드하는 또 다른 좀 더 비밀스러운 방법은 다음과 같습니다.
*-- 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 그림 전략은 모든 전략과 마찬가지로 비트 단위로 구성됩니다. 다음과 같이 그림 전략 개체를 제어할 수 있습니다.
예: 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 통화 전략은 "$" 형식 속성이 있는 필드에서만 작동합니다.
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 ))
따라서 두 가지 방법이 있습니다.
통화 전략은 다른 전략과 다릅니다. 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 (기본값)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 ))
따라서 두 가지 방법이 있습니다.
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을 구성하기 위해 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가 생성되기 전에 보고서를 변환해야 합니다.
보고서 현지화는 실제로 한 번만 수행하면 되는 작업입니다. 변환 프로세스는 보고서 레이블을 INTL의 I()
함수 호출이 포함된 보고서 표현식으로 변환합니다. 예를 들어 보고서 레이블 "Name:"
표현식 I("Name:")
이 됩니다.
.PJX를 기반으로 보고서 변환을 참조하세요.
즉석에서 언어를 바꾸는 기능을 정말 멋지게 활용하려면 다음 사항을 알아 두는 것이 도움이 될 것입니다.
INTL은 양식을 지역화한 후 INTL이 구성되도록 구성된 cINTLMemento
클래스의 oINTL이라는 개체를 양식에 추가합니다. 이 기념품은 특정 양식이 현재 일본어로 표시되고 있음을 알 수 있기 때문에 여러 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.dbf msgsvc.fpt msgsvc.cdx | 대화 상자, 대기 창, 온도계 막대 및 텍스트 블록에 대한 메시지가 포함된 테이블 및 지원 파일입니다. |
msgsvc.prg | 메시지 서비스 라이브러리. |
nohot.prg | nohot() FoxPro 프롬프트 표현에서 단축키 문자를 제거합니다. 애플리케이션의 호출 스택 어딘가에 프로시저로 잘라내서 붙여넣어야 하는 한 줄 함수입니다. |
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()
연관된 리소스 테이블의 이름을 반환합니다.