The following are extracts from Visual Basic 6.0 Internationalization of Software Internationalization Tool World Wide Navi‘s Internationalization Programming Advisory Info.
Maybe this article is rather old, but if you”re looking for legacy application localization tips, the advisory info above is very useful for you.
Why don”t you wake up your apps sleeping in the drawer and fly them to the world?
To switch the messages, labels, captions, fonts and others corresponding to each language setting (locale), these data need to be packed in resources and loaded dynamically.
In Visual Basic 6.0, it can be achieved by
the same way as Windows API resource loading.
The
following steps are how to create and load resource data from dlls in Visual Basic 6.0, with World Wide Navi string externalization.
1. Create a Resource File (.rc)
Describe strings in a resource file made up of resource keys and values.(This file can be created by a text editor or World Wide Navi string externalization)Below is a sample file generated by World Wide Navi.
wwnavi_string.rc ... #pragma code_page(1252) STRINGTABLE BEGIN 101 "My Name" // MsgBox ("My Name"), MyClass.cls 102 "Form1" // Caption = "Form1", Form1.frm 103 "MS PGothic" // Name = "MS PGothic", Form1.frm 104 "Button1" // Caption = "Button1", Form1.frm 105 "@Arial Unicode MS" // Name = "@Arial Unicode MS", Form1.frm 106 "Label1" // Caption = "Label1", Form1.frm 107 "Ms Mincho" // Name = "Ms Mincho", Form1.frm 108 "array 1" // strs1(0) = "array 1", Form1.frm 109 "array 2" // strs2(0) = "array 2", Form1.frm 110 "Hello, how are you? This is sample for Windows DLL." // MsgBox ("Hello, how are you? This is sample for Windows DLL."), Form1.frm 111 "this is simple text." // msg = "this is simple text.", Module1.bas 112 "This is message 2." // MsgBox ("This is message 2."), Module1.bas END
*Code pages and file encodings have to corresponding to each other.
2. Declare Windows API Functions
To use Windows API in VB, those declarations need written like the online casino following codes.
Private Declare Function GetThreadLocale Lib "kernel32" () As Long Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" _ (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, _ ByVal cchData As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _ (ByVal lpLibFileName As String) As cialis daily use online Long Private Declare Function LoadString Lib "user32" Alias "LoadStringA" _ (ByVal hInstance As Long, ByVal wID As Long, ByVal lpBuffer As String, _ ByVal nBufferMax As Long) As Long Private Const LOCALE_IDEFAULTANSICODEPAGE = &H1004& Private Const LOCALE_SISO639LANGNAME = &H59
GetThreadLocale, GetUserDefaultLCID … Get the current
get it, a bit viagraonline-edstore Lifecell keeps the strand. The you: this soft reminds.
locale.
GetLocaleInfo … Get the locale info.
LoadLibrary … Load the resource dll.
LoadString … Load string data from the dll.(*1)
LOCALE_IDEFAULTANSICODEPAGE, LOCALE_SISO639LANGNAME … Constants for locale functions.
*1)VB has a similar function “LoadResString”, but “LoadString” is necessary for loading from the dll.
3. Describe the Resource Loading Process
Describe the process of loading strings from the resource.Use the function LoadString for loading. Below is a sample code generated by World Wide Navi.
MsgBox cialis directions (wwnaviGetString(110)) ... Function WwnaviGetString(i d As Long) As String Dim buf As String * 512 online cialis paypal Dim rslt As Long rslt = LoadString( wwnaviH, id, buf, 512) WwnaviGetString = buf End Function
wwnaviH … Pointer to DLL modules (described later).
id … Resource key
buf … String to put a loaded string.
512 … loaded string buffer size.
4. Describe the Dynamic Resource DLL Loading
Describe the process of loading the resource DLL before first calling of LoadString.You have to load the DLL corresponding to the language setting at runtime.World Wide Navi gets the current LCID (locale-ID) by the function GetUserDefaultLCID, converts it to ISO-639 language code, and loads the proper DLL.Below is a sample code generated by World Wide Navi.
Private wwnaviH As Long Function WwnaviLoadLibrary() As Long Dim libName As String Dim langName As String * 10 Dim langName2 As String Dim lcId As Long Dim rslt As Long Dim posNull As Long Dim cnt As Integer Dim i As Integer "lcIdinstant payday loans ... payday loans online ... payday loans columbus ohio ... apply ... payday loans ... http://paydayloansusca.com/ ... apply now ... payday loans for bad credit= GetThreadLocale() lcId = GetUserDefaultLCID() rslt = GetLocaleInfo(lcId, LOCALE_SISO639LANGNAME, langName, 10) posNull = InStr( langName, Chr$(0)) langName = Left$( langName, posNull - 1) langName2 = "" cnt = Len(langName) For i = 1 To cnt If Mid(langName, i, 1) <> " " Then langName2 = langName2 & Mid(langName, i, 1) End If Next i libName = "./" & langName2 & "/wwnavi_string_VBTest.dll" wwnaviH = LoadLibrary(libName) If wwnaviH = 0 Then wwnaviH = LoadLibrary("./wwnavi_string_VBTest.dll") End If WwnaviLoadLibrary = wwnaviH End Function Function WwnaviGetModule() As Long WwnaviGetModule = wwnaviH End Function Function WwnaviGetString( id As Long) As String Dim buf As String * 512 Dim rslt As Long If WwnaviGetModule() = 0 Then WwnaviLoadLibrary(*1) http://sildenafilviagra-pharmacy.net/ End If rslt = canadian pharmacy cialis LoadString(wwnaviH, id, buf, 512) WwnaviGetString = buf End Function
wwnaviH … Pointer to the DLL modules.
LoadLibrary … Function to load the DLL and set it to the pointer.
GetUserDefaultLCID … Function to get the locale-ID at runtime.
GetLocaleInfo … Function to get the string information from the locale-ID.
*Load the DLL of the current language code converted from the LCID or the default one if the appropriate one does not exist.
*1)Load the resource dll if it”s not been yet. This needs to be called only at once in one execution.
5. Switch Fonts
Fonts for forms, labels, buttons, and others are set by GUI of Visual Basic 6.0 IDE and you cannot edit form codes manually (The IDE outputs errors if you do it).Instead, setting font names loaded from the resuorce dll on the Form_Load event is better solution to switch fonts dynamically. (Font switching are not necessary for all applications, it depends on their GUI design)
Form1.frm ... VERSION 5.00 Begin VB.Form Form1 Caption = "Form1" ClientHeight = 1530 ... BeginProperty Font Name = "MS PGothic" (*1) Size = 8.25 ... Private Sub Form_Load() WwnaviSetCaption End cialisonline-lowprice.com Sub Private Sub WwnaviSetCaption() Form1.Caption = viagra rezeptfrei online kaufen wwnaviGetString(102) " "Form1" "Form1.Font.Name = "Lucida Sans Unicode" Form1.Font.Name = wwnaviGetString(103) (*2) " "MS PGothic" Command1.Caption = wwnaviGetString(104) " "Button1" "Command1.Font.Name = "Lucida Sans Unicode" Command1.Font.Name canadianpharmacy-drugstorerx.com = wwnaviGetString(105) " "@Arial Unicode MS" Label1.AutoSize = True Label1.Font.Charset = WwnaviGetCharSet(WwnaviGetCodePage) Label1.Caption = wwnaviGetString(106) " "Label1" "Label1.Font.Name = "Lucida Sans Unicode" Label1.Font.Name = wwnaviGetString(107) http://viagracoupons-onlinerx.com/ " "Ms Mincho" End Sub
*1)Default font set by IDE. These are auto-generated codes and you cannot edit manually.
*2)Switching the font to the loaded one from the dll, which is suitable to the current language.
6. Compile the Resource File to DLL.
Compile resource files (.rc) to DLLs (.dll) with RC command (included by Visual Studio tools) and Visual Basic DLL projects.
1. Visual Basic DLL project only can load .res file (compiled by RC command), so you need to compile your .rc file to .res by this command.
2. After creating .res file, create the dll project to compile it loading and activating Visual Basic add-in “Rsource Editor”.
3. Create a Visual Basic group including your source project and that dll project to compile exe and dlls at once.
World Wide Navi makes these steps automatic creating .bat file for 1, dll project file for 2, and gruop file for 3.
Codes generated by World Wide Navi takes the dll in the same directory as the executable for default, and other dlls cialis walmart in each language code directory for its language.
For example, in the case of a Japanese resource, create the dll as viagraonline-toptrusted.com follows.
./Foo.exe ... executable file ./wwnavi_string.rc -> ./wwnavi_string.res -> ./wwnavi_string.dll ... <- * default DLL ./wwnavi_string_ja.rc -> ./wwnavi_string_ja.res -> ./ja/wwnavi_string.dll ... <- * Japanese DLL
Recent Comments