INTL mempersingkat pembuatan perangkat lunak multibahasa di Visual FoxPro (VFP). Ini memberi Anda kemampuan untuk membuat aplikasi Visual FoxPro multibahasa sambil meminimalkan kerumitan pembuatan perangkat lunak multi-versi.
Dokumen ini berfungsi untuk menjelaskan hal-hal berikut:
strings.dbf
MsgSvc()
INTL
cINTLAbstract
cINTLCurrency
cINTLData
cINTLFont
cINTLMemento
cINTLPicture
kelascINTLRightToLeft
cINTLStrategy
kelascINTLString
config.fpw
MsgSvc()
MsgSvc()
Contohstrings.dbf
Berdasarkan .PJXstrings.dbf
Berdasarkan .SCXstrings.dbf
Berdasarkan .VCXstrings.dbf
Berdasarkan .MNXstrings.dbf
Berdasarkan .FRXINTLVisitor
KelasPertama, masukkan file INTL ke direktori baru yang bersih.
Kemudian,
Menyebarkan file: Tempatkan file secara manual relatif terhadap proyek Anda seperti yang dijelaskan dalam Cara Menempatkan File INTL Anda dengan Benar.
Ubah file config.fpw
: Untuk menu, tambahkan dua baris ke file config.fpw
seperti yang dijelaskan dalam Cara Melokalkan Menu.
Benihkan definisi kelas Formulir Anda: Untuk saat ini, mungkin selamanya, aktifkan INTL dalam formulir dengan pernyataan Form::Init()
yang memanggil objek INTL. Lihat Cara Mendapatkan Lokalisasi Formulir Otomatis.
Jika Anda memerlukan pelokalan, buat instance objek INTL: Sekarang ketika pelokalan diperlukan, buat dan konfigurasikan objek INTL seperti yang dijelaskan dalam Cara Membuat Instansi Objek INTL.
Penting bagi VFP untuk menemukan file INTL sesuai kebutuhan. Di sinilah tempat untuk meletakkan file INTL Anda sehingga tersedia untuk lingkungan pengembangan Anda:
Terapkan file Anda sebagai berikut:
genmenux.prg
intl.prg
SET PATH
.strings.dbf strings.fpt strings.cdx
SET PATH
.msgsvc.dbf msgsvc.fpt msgsvc.cdx
SET PATH
. Buat anggota bernama _SCREEN.oINTL
untuk menampung instance INTL.
Untuk menggunakan INTL, aplikasi Anda harus membuat instance objek INTL. Ada banyak cara untuk melakukan ini, cara terbaik adalah menambahkannya ke _SCREEN
, seperti ini:
*-- Anywhere, anytime:
*-- Instantiate INTL in _SCREEN
SET PROCEDURE TO INTL ADDITIVE
SCREEN.AddObject( "oINTL", "INTL" )
Lokalkan formulir dengan meneruskan referensi objeknya ke metode Localize()
pada objek INTL.
Formulir (dan wadah lainnya) dilokalkan dengan meneruskan referensinya ke metode 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
....atau Anda dapat melokalkan formulir dengan cepat.
_SCREEN.oINTL.Localize( MyForm )
Lakukan panggilan ke oINTL
di hierarki Form.Init()
Anda.
Untuk membuat formulir Anda melokalkan dirinya secara otomatis, panggil metode oINTL.Localize()
dalam hierarki kelas formulir Anda. Untuk melakukannya, tempatkan kode berikut dalam metode Init()
definisi kelas formulir Anda. |
*-- Don't forget to call the ParentClass!
DODEFAULT()
IF TYPE("_SCREEN.oINTL" ) == "O"
_SCREEN.oINTL.Localize( This )
ENDIF
Driver GENMENUX digunakan untuk melokalisasi menu. Untuk mengaktifkan GENMENUX dan driver INTL.PRG-nya, masukkan baris berikut di config.fpw
Anda :
Tambahkan baris ini ke config.fpw
.
*-- Configuring for INTL menus.
_GENMENU = GENMENUX.PRG
_MNXDRV2 = INTL.PRG
*-- End of configuration for INTL menus.
Beberapa perubahan ini memerlukan restart VFP. Untuk menghindari memulai ulang FoxPro saat ini, jalankan perintah berikut di jendela perintah:
_GENMENU = HOME()+”GENMENUX.PRG”
Hanya ini yang perlu Anda ubah di lingkungan pengembangan untuk melokalkan menu. Untuk selanjutnya, buat menu seperti biasa.
GENMENUX sangat keren. Coba lihat.
Catatan : GENMENUX tidak menggantikan generator menu asli VFP. Karena GENMENUX memanggil GENMENU.PRG, kode Anda dibuat oleh VFP seperti biasa. INTL Toolkit menggunakan GENMENUX sebagai pra-prosesor. GENMENUX adalah program yang kaya. Silakan lihat GENMENUX untuk informasi lebih lanjut tentang kemampuannya.
Struktur strings.dbf
menentukan bahasa apa yang Anda dukung.
Gunakan metode SetLanguage()
untuk mengubah bahasa INTL.
INTL dilengkapi dengan tabel bernama strings.dbf
yang berisi berbagai bidang, salah satunya adalah cOriginal
, dan mungkin berisi bidang lain untuk bahasa berbeda, misalnya cFrench
, cGerman
, cSpanish
, dan seterusnya.
Bahasa yang Anda dukung ditentukan oleh struktur tabel strings.dbf
. Untuk menambahkan bahasa baru, ubah struktur strings.dbf
.
Untuk mengubah bahasa pelokalan saat ini, gunakan metode SetLanguage()
. Katakanlah kita ingin formulirnya dalam bahasa Prancis. Pertama-tama atur bahasanya, lalu lokalkan formulirnya:
_SCREEN.oINTL.SetLanguage( "French" )
_SCREEN.oINTL.Localize( _SCREEN.ActiveForm )
Tidak ada demo yang lebih baik daripada menukar bahasa tampilan dengan cepat.
Untuk menukar bahasa dengan cepat, yang selalu berhasil dalam demo (lakukan meskipun tidak diperlukan — sangat mudah), buat mekanisme di aplikasi Anda untuk mengonfigurasi objek INTL dengan INTL.SetLanguage()
, sebagai berikut.
_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!
Untuk mengubah kepribadian berbasis lokal aplikasi Anda, saya sarankan Anda membuat subkelas INTL
agar berfungsi sesuai kebutuhan. Mensubklasifikasikan INTL
untuk kebutuhan Anda sendiri adalah cara terbaik untuk memenuhi permintaan lokal dengan kode dan kerumitan yang minimal.
Berikut adalah contoh subkelas INTL yang berfungsi untuk saya di berbagai lokasi. Kami membuat subkelas kelas INTL
untuk mengubah semua pengaturan spesifik lokal sekaligus.
Perhatikan strategi RightToLeft (kelas cINTLRightToLeft
), yang berguna untuk sistem penulisan Timur Tengah.
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 dirancang untuk diimplementasikan dengan cepat.
Inilah yang perlu Anda lakukan untuk melokalkan aplikasi Anda pagi ini untuk demo multibahasa sore ini. Jika Anda telah menggunakan alat desain VFP dengan benar, ini adalah pekerjaan yang cepat. Jika tidak, proses rekayasa ini akan memakan waktu lebih lama.
Langkah-langkah dasarnya adalah:
Instal INTL dan masukkan metode Init()
dari kelas dasar formulir Anda. Ikuti langkah-langkah di bagian berjudul Menginstal INTL. Pastikan Anda meninjau semua langkah. Yang paling penting adalah langkah-langkah yang berjudul Cara Membuat Instansiasi Objek INTL, Cara Mendapatkan Lokalisasi Formulir Otomatis, dan Cara Melokalkan Menu.
Ubah struktur strings.dbf
dan tambahkan satu bidang untuk setiap bahasa yang Anda perlukan.
strings.dbf
yang disertakan dengan INTL dan letakkan di direktori root proyek Anda.ZAP
tabel strings.dbf
yang Anda tempatkan di root proyek Anda.MODIFY STRUCTURE
strings.dbf
dan tambahkan kolom baru bernama cSwahili
dengan panjang 120. Perhatikan bahwa "c" di cSwahili
wajib diisi. Jadikan aplikasi Anda membuat objek INTL. Di awal aplikasi Anda, buat instance objek INTL seperti yang dijelaskan dalam Cara Membuat Instantiate Objek INTL. Menampilkan dalam bahasa yang berbeda kini tinggal menggunakan metode SetLanguage()
.
Lakukan "Bangun Semua". Buka proyek Anda, pilih "Bangun", dan buat Aplikasi atau Exe, pastikan untuk memilih "Kompilasi Ulang Semua File". Pergi makan siang.
Untuk memuat strings.dbf
secara otomatis, jalankan aplikasi Anda atau gunakan utilitas INTLTool. Ada dua cara untuk mengisi tabel strings.dbf
dengan string antarmuka proyek Anda. Cara pertama adalah dengan menjalankan program Anda. Saat objek dibuat, INTL akan menambahkan string (seperti Caption
, Tooltiptext
, dll.) ke dalam tabel strings. Cara yang lebih baik adalah dengan menjalankan program pembaruan INTLTool. Lihat INTLTool.
Masukkan terjemahannya ke dalam tabel strings.dbf
. Pada kolom cSwahili
, ketikkan terjemahan bahasa Swahili, lengkap dengan hot-key dan shortcut-key sesuai kebutuhan. Catatan: Anda bisa mendapatkan terjemahan "cepat dan kotor" untuk pengujian dan demo internal dengan melakukan:
`REPLACE ALL cSwahili with "**"+TRIM(cOriginal)+"**" FOR cOriginal <> "(("`
Saya sarankan membuat objek INTL utama bernama _SCREEN.oINTL
.
Dimungkinkan untuk memiliki beberapa objek INTL terpisah yang hidup berdampingan. Setiap objek INTL merupakan campuran dari objek INTL lainnya yang disebut kait atau strategi. Objek INTL utama Anda adalah objek INTL master di lingkungan Anda, yang saya asumsikan disebut _SCREEN.oINTL
.
Gunakan metode SetConfig( n )
untuk mengonfigurasi objek INTL utama Anda.
Anda mengonfigurasi INTL dengan metode _SCREEN.oINTL.SetConfig( n )
, di mana n
adalah nilai integer bitwise dengan interpretasi berikut:
Nilai | Arti Konfigurasi |
---|---|
1 (Bawaan)2 4 8 16 32 | Muat strategi String Muat strategi Font Muat strategi Data Muat strategi Gambar Muat strategi Mata Uang Muat strategi RightToLeft |
Contoh: membuat objek INTL yang melokalisasi string dan font
*-- create an INTL object
_SCREEN.AddObject("oINTL", "INTL" )
*-- Load the strings and font strategies.
_SCREEN.oINTL.SetConfig( 1 + 2 )
Bahasa operasi dan lokal objek INTL utama dikonfigurasi dengan metode SetLanguage()
dan SetLocale()
.
Strategi dikonfigurasi secara bitwise.
Konfigurasikan masing-masing strategi sebagai berikut: dapatkan referensi ke strategi tersebut, lalu konfigurasikan. Berikut adalah arti konfigurasi untuk setiap strategi yang dapat dikonfigurasi.
Strategi | Nilai | Lokalisasi |
---|---|---|
Data | 1 (Bawaan)2 4 8 16 | BoundColumn ControlSource RowSource RecordSource InputMask |
huruf | 1 (Bawaan)2 (Bawaan) | Font dan FontSize DynamicFont dan DynamicFontSize |
Gambar | 1 (Bawaan)2 4 (Bawaan)8 | Picture DownPicture Icon DragIcon |
Kanan Ke Kiri | 1 (Bawaan) | Semua objek dibalik dalam wadahnya masing-masing |
string | 1 (Bawaan)2 (Bawaan)4 (Bawaan) | Caption ToolTipText StatusBarText |
Untuk menangani strategi yang dimuat, gunakan metode oINTL.GetStrategy()
. Setelah itu, gunakan metode oINTL.SetConfig()
pegangannya untuk mengonfigurasi strategi.
Contoh: membuat objek INTL yang melokalisasi string tetapi tidak melokalisasi Tooltips
Gunakan metode oINTL.GetStrategy()
untuk mendapatkan referensi objek, lalu gunakan metode oINTL.SetConfig()
untuk mengonfigurasinya.
*-- 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 )
Contoh: buat objek INTL yang hanya melokalisasi string dan InputMasks.
*-- 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 )
String antarmuka biasanya merupakan hal pertama yang terlintas dalam pikiran ketika kita berpikir untuk menerjemahkan perangkat lunak.
INTL hanya memuat strategi string secara default.
Tabel berikut mencantumkan bit konfigurasi untuk INTL. Bit konfigurasi ini menentukan strategi mana yang dimuat. Secara default, hanya strategi String yang dimuat, artinya string secara otomatis dilokalkan oleh INTL secara default.
Kelas | Bit konfigurasi | Lokalisasi |
---|---|---|
INTL | 1 (Bawaan)4 2 8 16 32 | Strategi cINTLString dimuatStrategi cINTLFont dimuatStrategi cINTLData dimuatstrategi cINTLPicture dimuatStrategi cINTLCurrency dimuatStrategi cINTLRightToLeft dimuat |
String CINTLS | 1 (Bawaan)2 (Bawaan)3 (Bawaan) | Caption ToolTipText StatusBarText |
Aktifkan strategi string sebagai berikut:
*-- cINTLString is loaded by default.
*-- So there’s usually no need to do this
_SCREEN.oINTL.SetStrategy( "String", "cINTLString" )
Cara lain yang lebih samar untuk memuat strategi String adalah:
-- Set configuration bit 2^0 "ON"
_SCREEN.oINTL.SetConfig( BITSET( oINTL.GetConfig(), 0 ))
Jadi ada dua cara untuk melakukannya.
String dapat dilokalkan dengan menyediakan terjemahan di strings.dbf
.
cAsli | cPerancis |
---|---|
Yes | Oui |
No | Non |
Konfigurasikan Strategi String dengan metode SetConfig()
-nya.
Strategi INTL String, seperti semua strategi lainnya, dikonfigurasikan secara bitwise. Anda dapat mengontrol objek strategi string sebagai berikut:
Contoh: untuk menonaktifkan pemrosesan font untuk properti ToolTipText
:
*-- Get a handle on the string strategy:
oFont = _SCREEN.oINTL.GetStrategy( "String" )
*-- We want Caption( 1 ) and StatusbarText( 4 ) only
oFont.SetConfig( 5 )
Font bisa spesifik untuk lokal.
Font seperti Arial, Times New Roman, MS Sans Serif mungkin tidak cocok di beberapa bahasa. Ini penting; kita mungkin memerlukan cara untuk mengubah font saat kita mengubah lokal.
Tabel berikut mencantumkan bit konfigurasi untuk objek INTL untuk memuat strategi Font, dan bilangan bulat konfigurasi untuk mengkonfigurasi strategi Font.
Kelas | Bit konfigurasi | Lokalisasi |
---|---|---|
INTL | 1 (Bawaan)2 4 8 16 32 | Strategi cINTLString dimuatStrategi cINTLFont dimuatStrategi cINTLData dimuatstrategi cINTLPicture dimuatStrategi cINTLCurrency dimuatStrategi cINTLRightToLeft dimuat |
CINTLFont | 1 (Bawaan)2 (Bawaan) | Font dan FontSize DynamicFont dan DynamicFontSize |
Aktifkan strategi font sebagai berikut:
*-- cINTLFont is the Font strategy class.
_SCREEN.oINTL.SetStrategy( "Font", "cINTLFont" )
Cara lain yang lebih samar untuk memuat strategi Font adalah:
*-- Set configuration bit 2^1 "ON"
_SCREEN.oINTL.SetConfig(BITSET(oINTL.GetConfig(),1 ))
Jadi ada dua cara untuk melakukannya.
Font dapat dilokalkan dengan menyediakan terjemahan di strings.dbf
. Spesifikasi font diawali dengan pengenal “ ((Font ))
”, misalnya:
cAsli | cRusia |
---|---|
((Font))Courier New,10 | ((Font))Courier New Cyr,10 |
((Font))Arial,16 | ((Font))Arial Cyr,16 |
Konfigurasikan Strategi Font dengan metode SetConfig()
-nya.
Strategi Font INTL, seperti semua strategi lainnya, dikonfigurasi secara bitwise. Anda dapat mengontrol objek strategi font sebagai berikut:
Contoh: untuk menonaktifkan pemrosesan font untuk DynamicFont
dan DynamicFontSize
, yang akan sedikit meningkatkan performa strategi font:
*-- 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 )
Data bisa spesifik untuk lokal.
Terkadang data itu sendiri yang perlu dilokalkan. INTL memungkinkan Anda menyajikan bidang berbeda untuk lokal berbeda.
Strategi Data bekerja seperti strategi lainnya.
Tabel berikut mencantumkan bit konfigurasi untuk objek INTL untuk memuat strategi Gambar, dan bilangan bulat konfigurasi untuk mengonfigurasi strategi Gambar.
Kelas | Bit konfigurasi | Lokalisasi |
---|---|---|
INTL | 1 (Bawaan)2 4 8 16 32 | Strategi cINTLString dimuatStrategi cINTLFont dimuatStrategi cINTLData dimuatstrategi cINTLPicture dimuatStrategi cINTLCurrency dimuatStrategi cINTLRightToLeft dimuat |
Data CINTL | 1 (Bawaan)2 4 8 16 | BoundColumn ControlSource RowSource RecordSource InpuMask |
Aktifkan strategi data sebagai berikut:
*-- cINTLData is the Graphics strategy class.
_SCREEN.oINTL.SetStrategy( "Data", "cINTLData" )
Cara lain yang lebih samar untuk memuat strategi Data adalah:
*-- Set configuration bit 2^2 "ON"
_SCREEN.oINTL.SetConfig(BITSET(oINTL.GetConfig(),2 ))
Jadi ada dua cara untuk melakukannya.
Elemen data dapat dilokalkan dengan menyediakan terjemahan di strings.dbf
. Spesifikasi data diawali dengan pengenal “ ((Data))
”, seperti misalnya:
cAsli | cRrusia |
---|---|
((Data))cEngDesc | ((Data))cRussianDesc |
Konfigurasikan Strategi Data dengan metode SetConfig()
-nya.
Strategi data INTL, seperti semua strategi lainnya, dikonfigurasi secara bitwise. Anda dapat mengontrol objek strategi gambar sebagai berikut:
Contoh: Melokalkan properti 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 )
Gambar bisa spesifik untuk lokal. Beberapa ikon dan gambar yang kami gunakan setiap hari mungkin tidak sesuai di lokasi lain. INTL menyediakan cara untuk mengubah gambar yang ditampilkan ketika kita mengubah lokal.
Strategi Gambar bekerja seperti strategi lainnya. Tabel berikut mencantumkan bit konfigurasi untuk objek INTL untuk memuat strategi Gambar, dan bilangan bulat konfigurasi untuk mengonfigurasi strategi Gambar.
Kelas | Bit konfigurasi | Lokalisasi |
---|---|---|
INTL | 1 (Bawaan)2 4 8 16 32 | Strategi cINTLString dimuatStrategi cINTLFont dimuatStrategi cINTLData dimuatstrategi cINTLPicture dimuatStrategi cINTLCurrency dimuatStrategi cINTLRightToLeft dimuat |
cINTLPicture | 1 (Bawaan)2 4 (Bawaan)8 | Picture DownPicture Icon DragIcon |
Aktifkan strategi gambar sebagai berikut:
*-- cINTLPicture is the Graphics strategy class.
_SCREEN.oINTL.SetStrategy( "Picture", "cINTLPicture" )
Cara lain yang lebih samar untuk memuat strategi Gambar adalah:
*-- Set configuration bit 2^3 "ON"
_SCREEN.oINTL.SetConfig(BITSET(oINTL.GetConfig(),3 ))
Jadi ada dua cara untuk melakukannya.
Gambar dapat dilokalkan dengan menyediakan terjemahan di strings.dbf
. Spesifikasi gambar diawali dengan pengenal “ ((Picture))
”, misalnya:
coriginal | crussian |
---|---|
((Picture))Doctor.BMP | ((Picture))Doktor.BMP |
((Picture))Friend.BMP | ((Picture))Comrade.BMP |
Konfigurasikan Picture Strategy dengan metode SetConfig()
-nya.
Strategi gambaran INTL, seperti semua strategi, dikonfigurasikan secara bitwise. Anda dapat mengontrol objek strategi gambar sebagai berikut:
Contoh: Lokalkan properti Gambar, Gambar Bawah, dan Ikon.
*-- 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 menyediakan kemampuan multi-mata uang yang sederhana namun mudah beradaptasi.
INTL memungkinkan Anda memberikan aplikasi Anda kemampuan multi-mata uang yang sederhana. Arsitektur ini fleksibel, dan dengan membuat subkelas kelas cINTLCurrency
Anda mungkin dapat mengimplementasikan hampir semua skema multi-mata uang yang Anda perlukan.
Inti dari semuanya, strategi Mata Uang INTL hanya bekerja pada bidang yang memiliki properti format "$".
Ingatlah bahwa strategi INTL dikonfigurasikan secara bitwise sesuai dengan tabel berikut.
Kelas (dengan default) | Nilai | Lokalisasi |
---|---|---|
INTL (1) | 1 (Bawaan)2 4 8 16 32 | Strategi cINTLString dimuatStrategi cINTLFont dimuatStrategi cINTLData dimuatstrategi cINTLPicture dimuatStrategi cINTLCurrency dimuatStrategi cINTLRightToLeft dimuat |
Aktifkan strategi mata uang sebagai berikut:
Gunakan oINTL.SetConfig()
atau oINTL.SetStrategy()
untuk memuat strategi Mata Uang.
OINTL = _SCREEN.oINTL
oINTL.SetStratrgy( "Currency", "cINTLCurrency" )
Cara alternatif (dan lebih samar) adalah dengan menggunakan metode SetConfig()
INTL untuk membuat INTL memanggil strategi Font dari kelas tertentu, sebagai berikut:
OINTL = _SCREEN.oINTL
*-- Set bit 2^4 "ON"
oINTL.SetConfig( BITSET( oINTL.GetConfig(), 4 ))
Jadi ada dua cara untuk melakukannya.
Strategi Mata Uang tidak seperti yang lain. Strategi mata uang toolkit INTL sedikit berbeda dari strategi lainnya dalam tiga hal penting:
mata uang bersifat spesifik lokal , bukan spesifik bahasa.
kelas cINTLCurrency
tidak menggunakan layanan kelas cINTLString
, dan
kelas cINTLCurrency
membuat banyak kolom input menjadi hanya-baca ketika data dalam keadaan dikonversi.
Nilai tukar default untuk semua mata uang adalah 1.00
.
Dengan kelas cINTLCurrency
yang dikirimkan bersama INTL, Anda menetapkan faktor konversi mata uang ke mata uang yang berbeda. Secara default, faktor konversi yang digunakan oleh strategi Mata Uang adalah 1.00
.
Jika Anda memerlukan konversi mata uang yang bergantung pada waktu, Anda dapat membuat subkelas cINTLCurrency
untuk melakukan apa pun yang Anda perlukan, seperti pencarian.
Mari konfigurasikan INTL untuk mata uang berikut: dolar Kanada, Euro, dan dolar AS. Asumsikan bahwa data kami didasarkan pada dolar Kanada.
oINTL.SetConversion()
menetapkan nilai tukar antara lokal asli dan lokal lainnya.
Gunakan SetLocale()
untuk mengubah lokal mata uang. Kemudian lokalkan seperti biasa.
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 secara otomatis akan membuat objek formulir Anda ditampilkan dari kanan ke kiri.
INTL memungkinkan Anda menampilkan objek dari kanan ke kiri, yang diperlukan oleh sistem penulisan Timur Tengah. Untuk melakukan hal ini, INTL membalikkan lokasi objek dalam wadah sepanjang garis tengah vertikal wadah. INTL juga memodifikasi properti penyelarasan kotak centang dan grup opsi.
INTL tidak mengubah orientasi teks keterangan. Untuk mengubah orientasi teks keterangan, Anda harus menggunakan lokalisasi Windows Timur Tengah.
Hasilnya adalah bentuk-bentuk yang terbalik; jika dibaca dari kiri ke kanan sekarang dibaca dari kanan ke kiri, dan sebaliknya.
Ingatlah bahwa strategi INTL dikonfigurasi secara bitwise berdasarkan tabel berikut:
Kelas (dengan default) | Nilai | Lokalisasi |
---|---|---|
INTL (1) | 1 (Bawaan)2 4 8 16 32 | Strategi cINTLString dimuatStrategi cINTLFont dimuatStrategi cINTLData dimuatstrategi cINTLPicture dimuatStrategi cINTLCurrency dimuatStrategi cINTLRightToLeft dimuat |
Aktifkan strategi mata uang sebagai berikut:
Gunakan oINTL.SetConfig()
atau oINTL.SetStrategy()
untuk memuat strategi Mata Uang.
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 ))
Jadi ada dua cara untuk melakukannya.
Strategi RightToLeft adalah satu-satunya strategi yang benar-benar menata ulang objek dalam container.
Strategi kanan-ke-kiri perangkat INTL sedikit berbeda dari strategi lain dalam empat hal penting:
cINTLRightToLeft
tidak menggunakan layanan kelas cINTLString
.cINTLRightToLeft
membalikkan lokasi objek dalam kontainer sepanjang sumbu vertikal kontainer. Yang tadinya di sebelah kiri akan berakhir di sebelah kanan, dan sebaliknya. Properti penyelarasan Kotak Centang dan Grup Opsi juga dibalik, begitu pula urutan Halaman dalam Bingkai Halaman dan Kolom dalam kisi.cINTLRightToLeft
untuk menulis dari kiri ke kanan. Mari konfigurasikan INTL untuk bahasa kanan-ke-kiri. Cara terbersih untuk melakukan ini adalah dengan subkelas metode INTL::SetLanguage()
. Sebagai alternatif, Anda juga bisa melakukannya dengan metode SetLocale()
. Apa pun yang terjadi, penerapannya sama saja.
Dalam contoh ini, kami menggunakan SetLanguage()
untuk mengonfigurasi transformasi RightToLeft.
Catatan: agar lebih jelas, kami telah menghilangkan konfigurasi untuk strategi Font, yang mungkin perlu kami lakukan. Lihat Cara Melokalkan Font.
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
Butuh perilaku berbeda? Pertimbangkan subkelas. Anda mungkin menghadapi situasi di mana Anda perlu melakukan sesuatu secara berbeda. Daripada mengubah kode sumber INTL (yang akan menimbulkan kesulitan saat menggabungkan rilis mendatang) pertimbangkan untuk membuat subkelas strategi yang ada untuk perilaku yang diinginkan.
Pada diagram di bawah, kita telah membuat dua subkelas, satu dari kelas cINTLString
dan satu lagi dari kelas cINTLCurrency
. Hierarki kelas sekarang terlihat seperti ini:
Kelas baru ditambahkan ke hierarki kelas INTL.
Untuk menggunakan subkelas Anda dan bukan subkelas yang dikirimkan bersama INTL, panggil metode setstrategy() sebagai berikut:
*-- Assuming _SCREEN.oINTL is already Instantiated
_SCREEN.oINTL.SetStrategy("String", "cMyString" )
_SCREEN.oINTL.SetStrategy("Currency", "cMyCurrency" )
Anda dapat membuat strategi Anda sendiri dan menggunakan INTL untuk menjalankannya secara otomatis. Jadikan strategi baru Anda sebagai subkelas dari kelas cINTLStrategy (sehingga Anda akan memiliki properti dan metode yang diharapkan INTL) lalu jalankan dengannya!
Seperti halnya subkelas strategi yang sudah ada, gunakan metode SetStrategy()
untuk memuat strategi Anda ke INTL.
Tiga cara:
Anda dapat membuat INTL mengabaikan suatu objek atau objek kontainer dengan menempatkan string "INTL Ignore" di properti komentar objek. String ini tidak peka huruf besar-kecil.
Jika bisa, berikan properti INTL pada kelas objek Anda, dan tetapkan logikanya .F.
Jika bisa, berikan properti INTL pada kelas objek Anda, dan berikan nilai numerik kurang dari 0.
Jika Anda memiliki kebutuhan khusus untuk objek tertentu, berikan properti INTL pada kelas objek Anda, dan tetapkan nilai numerik ke properti dalam definisi kelas atau ke instance objek ini. Nilai numerik ini adalah nilai yang akan Anda tetapkan ke metode SetConfig()
INTL untuk mengonfigurasi INTL untuk objek khusus ini.
Jika Anda ingin mengganti strategi Anda sendiri dalam contoh strategi berikutnya, gunakan metode SetStrategyClass()
untuk menetapkan kelas strategi baru ke alias strategi yang sudah ada.
*-- Permanently install cMyStringStrategy for the string strategy.
_SCREEN.oINTL.SetStrategyClass( "String", "cMyStringStrategy" )
strings.dbf
INTL dikirimkan dengan kelas iterator dan pengunjung yang dirancang untuk mengulang struktur VFP dan, antara lain, memuat semua elemen antarmuka string ke dalam strings.dbf
.
Lihat Memperbarui strings.dbf
Berdasarkan .PJX.
Struktur laporan VFP tidak dibuat atau dikompilasi — struktur tersebut terikat ke dalam aplikasi Anda "sebagaimana adanya". Oleh karena itu, laporan harus diubah sebelum .APP atau .EXE dibuat.
Melokalkan laporan adalah sesuatu yang hanya perlu Anda lakukan sekali. Proses transformasi mengubah label laporan Anda menjadi ekspresi laporan yang berisi panggilan ke fungsi I()
INTL. Misalnya, label laporan "Name:"
menjadi ekspresi I("Name:")
.
Lihat Mentransformasi Laporan Berdasarkan .PJX.
Jika Anda berencana untuk benar-benar menyukai pertukaran bahasa dengan cepat, akan sangat membantu jika Anda mengetahui hal-hal berikut:
Setelah INTL melokalisasi formulir, ia menambahkan ke dalam formulir sebuah objek bernama oINTL dari kelas cINTLMemento
yang dikonfigurasikan saat INTL dikonfigurasi. Kenang-kenangan ini adalah objek ringan yang memungkinkan beberapa objek INTL hidup berdampingan secara damai karena mereka dapat mengetahui bahwa Formulir tertentu, pada saat ini, ditampilkan dalam, katakanlah, bahasa Jepang.
Ketika objek INTL menemukan formulir yang berisi anggota bernama oINTL, ia akan mengadopsi konfigurasi anggota sebagaimana ditentukan oleh nilai GETCONFIG()
-nya.
Jika Anda memerlukan perilaku alternatif — misalnya jika Anda memerlukan objek INTL kedua untuk sepenuhnya mengganti kenang-kenangan dari objek pertama — maka pertama-tama lokalkan formulir kembali ke aslinya (yang menghapus anggota Form.oINTL) dan kemudian lokalkan ke lokal baru menggunakan objek INTL kedua.
MsgSvc()
Pada pemanggilan pertama, MsgSvc()
membuat objek bernama _SCREEN.oMsgSvc
yang selanjutnya akan mengelola perpesanan. Jika objek bernama _SCREEN.oINTL
ada, objek _SCREEN.MsgSvc
akan mematuhi pengaturan bahasanya dan menggunakan layanannya.
Untuk pelokalan run time, Anda perlu mendistribusikan file berikut:
Mengajukan | Catatan |
---|---|
i.prg | Untuk performa terbaik, tempatkan fungsi ini di file SET PROCEDURE pertama Anda. |
intl.prg | Untuk performa terbaik, SET PROCEDURE TO INTL Additive . |
msgsvc.dbf | |
msgsvc.fpt | |
msgsvc.cdx | Jika Anda menggunakan MsgSvc() Anda perlu mendistribusikan file-file ini. |
msgsvc.prg | Perpustakaan layanan pesan. |
nohot.prg | Untuk performa terbaik, tempatkan fungsi ini di file SET PROCEDURE pertama Anda. |
strings.dbf | |
strings.fpt | |
strings.cdx | Anda harus mendistribusikannya juga. |
Untuk tabel dan file STRINGS dan MSGSVC, jika Anda memasukkannya ke dalam APP atau EXE Anda, tentu saja, tabel dan file tersebut akan bersifat read-only.
Berikut deskripsi file yang digunakan oleh INTL. Untuk memperhitungkan di mana penempatan terbaiknya dibandingkan dengan proyek Anda, lihat Cara Menempatkan File INTL Anda dengan Benar.
Mengajukan | Keterangan |
---|---|
addendum.txt | Berita terkini yang mungkin disertakan atau tidak disertakan dalam dokumentasi atau file bantuan. |
genmenux.zip | Arsip program GENMENUX terbaru yang tersedia oleh Andrew Ross MacNeill. |
i.prg | Fungsi yang berdiri sendiri yang berfungsi sebagai pintasan ke metode _SCREEN.oINTL.I() . |
intl.prg | Kode inti untuk kelas dan utilitas dalam toolkit INTL. |
intltool.prg | Utilitas pengembang untuk melakukan operasi batch pada file proyek dan struktur VFP lainnya. Jangan mendistribusikan file ini dengan aplikasi Anda. |
msgsvc.dbf msgsvc.fpt msgsvc.cdx | Tabel dan file pendukung berisi pesan untuk dialog, jendela tunggu, bilah termometer, dan blok teks. |
msgsvc.prg | Perpustakaan layanan pesan. |
nohot.prg | nohot() menghapus karakter hot key dari ekspresi prompt FoxPro. Ini adalah fungsi satu baris yang harus Anda potong dan tempel sebagai prosedur di suatu tempat di tumpukan pemanggilan aplikasi Anda. |
strings.dbf strings.fpt strings.cdx | Tabel dan file pendukung berisi frasa terjemahan. |
Hierarki kelas INTL didasarkan pada kelas cINTLAbstract
. cINTLAbstract
berfungsi untuk mendefinisikan antarmuka untuk seluruh hierarki. Jika memungkinkan, penambahan properti, kejadian, dan metode jahat ke subkelas telah dihindari.
Gambar di bawah menunjukkan diagram OMT dari hierarki kelas INTL.
Hierarki kelas INTL.
Dalam keadaan normal, satu-satunya objek yang mungkin Anda gunakan adalah kelas INTL
.
Kelas cINTLMemento
dapat digunakan sebagai token.
cINTLMemento
adalah token konfigurasi yang dapat digunakan objek INTL untuk menyimpan detail lokalisasi tertentu. cINTLMemento
menyertakan metode akses ke properti yang dilindungi.
INTL adalah antarmuka publik dan metode templat untuk proses pelokalan.
cINTLStrategy adalah kelas Induk dari berbagai mesin lokalisasi.
cINTLString
, cINTLCurrency
, cINTLFont
, cINTLMeasures
, cINTLPicture
, dan cINTLData
adalah kelas implementasi strategis tertentu.
INTL
Kelas INTL menyediakan layanan untuk melokalisasi objek dan elemen lain dalam aplikasi Anda.
INTL
INTL::cCurrencyStrategy
INTL memungkinkan Anda melokalisasi mata uang.
Sebuah string yang menentukan nama kelas strategi mata uang.
Bawaan | "cINTLCurrency" |
Perkataan | Anda dapat membuat subkelas cINTLCurrency sesuai dengan kebutuhan khusus Anda. Anda kemudian dapat menggunakan metode SetStrategy("Currency",cYourCurrencyClass) untuk menyetel properti strategi mata uang ini ke sesuatu selain default. |
Lihat Juga | cINTLMemento::GetStrategy() |
INTL::cDataStrategy
INTL memungkinkan sumber data berbeda untuk lokal berbeda. Sebuah string yang menentukan nama kelas strategi data.
Bawaan | "cINTLData" |
Perkataan | Anda dapat membuat subkelas cINTLData untuk memenuhi kebutuhan khusus Anda. Anda dapat menggunakan metode SetStrategy("Data", cYourDataClass) untuk menyetel properti strategi data ini ke sesuatu selain default. |
Lihat Juga | cINTLMemento::GetStrategy() |
INTL::cFontStrategy
INTL memungkinkan penggantian font yang tepat.
Sebuah string yang menentukan nama kelas strategi font.
Bawaan | "cINTLFont" |
Perkataan | Anda dapat membuat subkelas cINTLFont sesuai dengan kebutuhan khusus Anda. Anda dapat menggunakan SetStrategy("Font", cYourFontClass) untuk menyetel properti strategi font ke selain default. |
Lihat Juga | cINTLMemento::GetStrategy() |
INTL::cPictureStrategy
INTL dapat melokalisasi gambar, ikon, dan gambar.
Sebuah string yang menentukan nama kelas strategi gambar.
Bawaan | "cINTLPicture" |
Perkataan | Anda dapat membuat subkelas cINTLPicture sesuai dengan kebutuhan khusus Anda. Anda dapat menggunakan ::SetStrategy("Picture", cYourPictureClass ) untuk mengatur properti strategi gambar ke sesuatu selain default. |
Lihat Juga | cINTLMemento::GetStrategy() |
INTL::cStringStrategy
INTL melokalisasi kata dan frasa.
Sebuah string yang menentukan nama kelas strategi string. Kelas strategi string bertanggung jawab untuk melokalisasi string dan frasa dalam aplikasi, dan juga berfungsi sebagai tempat penyimpanan fungsi untuk kelas strategi lainnya.
Bawaan | "cINTLSting" |
Perkataan | Anda dapat membuat subkelas cINTLString untuk memenuhi kebutuhan khusus Anda. Anda dapat menggunakan SetStrategy("String", cYourStringClass) untuk mengatur properti. |
Lihat Juga | cINTLMemento::GetStrategy() |
Kelas strategi cINTLString sejauh ini adalah yang paling berguna, dan menyediakan layanan untuk strategi lain. | Catatan: banyak strategi menggunakan layanan berbasis string yang disediakan oleh kelas strategi string aktif. Untuk mengurangi kohesi dengan kelas cStringStrategy tertentu, banyak metode string yang biasanya termasuk dalam kelas cStringStrategy ditemukan di kelas cINTLStrategy , kelas strategi induk. Jadi semua strategi mempunyai kemampuan lokalisasi string yang melekat. |
INTL
INTL::Execute()
Melokalkan numerik, string, objek, atau array objek. Dalam kasus objek dan array objek, fungsi eksekusi meneruskan setiap objek secara bergantian ke semua strategi pelokalan aktif.
Sintaksis | oINTL.Execute( @PassedObject ) |
Kembali | Tidak ada |
Argumen | PassedObject : Dapat bertipe numerik, string, atau objek. Ini juga bisa berupa array referensi objek. |
Lihat Juga | INTL::ObjArray() |
Contoh
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()
| Strategi mungkin memerlukan file sumber daya, yang direferensikan dengan alias.
Mengembalikan alias tabel sumber daya yang terkait dengan strategi pelokalan default. Biasanya, objek strategi default adalah kelas cINTLString
.
Sintaksis | oINTL.GetAlias() |
Kembali | Nilai karakter alias tabel strategi string. |
Argumen | Tidak ada. |
Perkataan | Metode GetAlias() adalah metode hookable , artinya jika suatu objek kelas INTL memiliki objek kait yang terpasang, maka GetAlias() akan mengikuti metode objek kait tersebut. Karena secara default objek kelas INTL dikaitkan dengan objek kelas cINTLStringStrategy , pemanggilan oINTL.GetAlias() sama dengan pemanggilan oINTL.oStringStrategy.getAlias() . |
Contoh
_SCREEN.AddObject( "oINTL", "INTL" )
*-- The following two are equivalent
_SCREEN.oINTL.oStringStrategy.GetAlias()
_SCREEN.oINTL.GetAlias() |
INTL::GetTable()
Mengembalikan nama tabel sumber daya yang terkait