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
на основе .PJXstrings.dbf
на основе .SCXstrings.dbf
на основе .VCXstrings.dbf
на основе .MNXstrings.dbf
на основе .FRXINTLVisitor
Сначала поместите файлы INTL в новый чистый каталог.
Затем,
Развертывание файлов: вручную разместите файлы относительно вашего проекта, как описано в разделе «Как правильно разместить файлы INTL».
Измените файл config.fpw
: для меню добавьте две строки в файл config.fpw
, как описано в разделе «Локализация меню».
Задайте определение класса формы: на данный момент, возможно, навсегда, вызывайте 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
. Создайте член с именем _SCREEN.oINTL
для хранения экземпляра INTL.
Чтобы использовать INTL, ваше приложение должно создать экземпляр объекта INTL. Есть много способов сделать это, лучше всего добавить его в _SCREEN
, например:
*-- Anywhere, anytime:
*-- Instantiate INTL in _SCREEN
SET PROCEDURE TO INTL ADDITIVE
SCREEN.AddObject( "oINTL", "INTL" )
Локализуйте формы, передавая ссылки на их объекты методу Localize()
объекта INTL.
Формы (и любой другой контейнер) локализуются путем передачи ссылки на метод 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 )
Поместите вызов oINTL
в иерархию Form.Init()
.
Чтобы ваши формы автоматически локализовались, вызовите метод 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 Toolkit использует 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 с помощью INTL.SetLanguage()
, как следует.
_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
, входящую в состав INTL, и поместите ее в корневой каталог вашего проекта.ZAP
таблицу strings.dbf
, которую вы поместили в корень вашего проекта.MODIFY STRUCTURE
файла strings.dbf
и добавьте новый столбец с именем cSwahili
длиной 120. Обратите внимание, что буква «c» в cSwahili
является обязательной. Заставьте ваше приложение создать объект INTL. В начале вашего приложения создайте экземпляр объекта INTL, как описано в разделе «Как создать экземпляр объекта INTL». Отображение на другом языке теперь зависит от использования метода SetLanguage()
.
Сделайте «Построить все». Откройте проект, выберите «Создать» и создайте приложение или exe-файл, обязательно выбрав «Перекомпилировать все файлы». Иди обедать.
Чтобы автоматически загрузить strings.dbf
, запустите приложение или используйте утилиту INTLTool. Есть два способа заполнить таблицу strings.dbf
строками интерфейса вашего проекта. Первый способ — запустить вашу программу. При создании экземпляров объектов INTL добавит строки (например, Caption
, Tooltiptext
и т. д.) в таблицу строк. Лучше всего запустить программу обновления INTLTool. См. INTTLTool.
Введите переводы в таблицу strings.dbf
. В столбце cSwahili
введите переводы на суахили, дополнив их необходимыми горячими клавишами и сочетаниями клавиш. Примечание: вы можете получить «быстрый» перевод для тестирования и внутренних демонстраций, выполнив:
`REPLACE ALL cSwahili with "**"+TRIM(cOriginal)+"**" FOR cOriginal <> "(("`
Я рекомендую создать основной объект INTL с именем _SCREEN.oINTL
.
Возможно сосуществование нескольких отдельных объектов INTL. Каждый объект INTL представляет собой смесь других объектов INTL, называемых крючками или стратегиями. Ваш основной объект INTL — это главный объект INTL в вашей среде, который, как я предполагаю, называется _SCREEN.oINTL
.
Используйте метод SetConfig( n )
для настройки основного объекта INTL.
Вы настраиваете INTL с помощью метода _SCREEN.oINTL.SetConfig( n )
, где n
— побитовое целое значение со следующей интерпретацией:
Ценить | Конфигурация Значение |
---|---|
1 (по умолчанию)2 4 8 16 32 | Загрузите стратегию String Загрузите стратегию шрифтов Загрузите стратегию данных Загрузите стратегию изображения Загрузите валютную стратегию Загрузите стратегию 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 )
Пример: создайте объект 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 (по умолчанию)4 2 8 16 32 | Стратегия cINTLString загружена.Стратегия cINTLFont загруженаcINTLData загруженаcINTLPicture загруженаcINTLCurrency стратегия загруженаСтратегия cINTLRightToLeft загружена. |
CINTLString | 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:
-- Set configuration bit 2^0 "ON"
_SCREEN.oINTL.SetConfig( BITSET( oINTL.GetConfig(), 0 ))
Итак, есть два способа сделать это.
Строки можно локализовать, предоставив переводы в strings.dbf
.
cОригинал | cФранцузский |
---|---|
Yes | Oui |
No | Non |
Настройте стратегию String с помощью метода SetConfig()
.
Стратегия 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 загружена. |
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Оригинал | cРусский |
---|---|
((Font))Courier New,10 | ((Font))Courier New Cyr,10 |
((Font))Arial,16 | ((Font))Arial Cyr,16 |
Настройте стратегию шрифтов с помощью метода SetConfig()
.
Стратегия INTL Font, как и все стратегии, конфигурируется побитно. Вы можете управлять объектом стратегии шрифтов следующим образом:
Пример: отключить обработку шрифтов для 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))
», например:
cОригинал | cRрусский |
---|---|
((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 (по умолчанию)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:
*-- 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 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 вызывать стратегию Font данного класса, следующим образом:
OINTL = _SCREEN.oINTL
*-- Set bit 2^4 "ON"
oINTL.SetConfig( BITSET( oINTL.GetConfig(), 4 ))
Итак, есть два способа сделать это.
Валютная стратегия не похожа на другие. Валютная стратегия набора инструментов INTL немного отличается от других стратегий в трех важных отношениях:
валюты зависят от локали , а не от языка.
класс cINTLCurrency
не использует службы класса cINTLString
и
Класс cINTLCurrency
делает многие поля ввода доступными только для чтения, когда данные находятся в преобразованном состоянии.
Обменный курс по умолчанию для всех валют составляет 1.00
.
С помощью класса cINTLCurrency
, поставляемого с INTL, вы назначаете коэффициенты пересчета валют различным валютам. По умолчанию коэффициент конвертации, используемый валютной стратегией, равен 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 игнорировать объект или объект-контейнер, поместив строку «INTL Ignore» в свойство комментария объекта. Эта строка не чувствительна к регистру.
Если можете, присвойте классу вашего объекта свойство 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
.
См. Обновление strings.dbf
на основе .PJX.
Структуры отчетов VFP не генерируются и не компилируются — они привязываются к вашему приложению «как есть». Поэтому отчеты необходимо преобразовать до создания .APP или .EXE.
Локализация отчетов — это то, что вам нужно сделать только один раз. Процесс преобразования превращает метки отчета в выражения отчета, содержащие вызов функции I()
INTL. Например, метка отчета "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 | Архив последней доступной программы 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
служит для определения интерфейса всей иерархии. По возможности избегали добавления мошеннических свойств, событий и методов в подклассы.
На рисунке ниже показана диаграмма OMT иерархии классов INTL.
Иерархия классов 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 : может иметь числовой, строковый или объектный тип. Это также может быть массив ссылок на объекты. |
См. также | ИНТЛ::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()
Возвращает имя связанной таблицы ресурсов