Isolating resources simplifies the translation process. The next level of resource separation is the creation of a resource DLL. A resource DLL contains all the resources and only the resources for a program. Resource DLLs allow you to create a program that supports many translations simply by swapping the resource DLL.
Use the Resource DLL wizard to create a resource DLL for your program. The Resource DLL wizard requires an open, saved, compiled project. It will create an RC file that contains the string tables from used RC files and resourcestring strings of the project, and generate a project for a resource only DLL that contains the relevant forms and the created RES file. The RES file is compiled from the new RC file.
You should create a resource DLL for each translation you want to support. Each resource DLL should have a file name extension specific to the target locale. The first two characters indicate the target language, and the third character indicates the country of the locale. If you use the Resource DLL wizard, this is handled for you. Otherwise, use the following code to obtain the locale code for the target translation:
unit locales; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; LocaleList: TListBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} function GetLocaleData(ID: LCID; Flag: DWORD): string; var BufSize: Integer; begin BufSize := GetLocaleInfo(ID, Flag, nil, 0); SetLength(Result, BufSize); GetLocaleinfo(ID, Flag, PChar(Result), BufSize); SetLength(Result, BufSize - 1); end; { Called for each supported locale. } function LocalesCallback(Name: PChar): Bool; stdcall; var LCID: Integer; begin LCID := StrToInt('$' + Copy(Name, 5, 4)); Form1.LocaleList.Items.Add(GetLocaleData(LCID, LOCALE_SLANGUAGE)); Result := Bool(1); end; procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin with Languages do begin for I := 0 to Count - 1 do begin ListBox1.Items.Add(Name[I]); end; end; end;
/* This callback fills a listbox with the strings and their associated languages and countries*/ BOOL __stdcall EnumLocalesProc(char* lpLocaleString) { AnsiString LocaleName, LanguageName, CountryName; LCID lcid; lcid = StrToInt("$" + AnsiString(lpLocaleString)); LocaleName = GetLocaleStr(lcid, LOCALE_SABBREVLANGNAME, ""); LanguageName = GetLocaleStr(lcid, LOCALE_SNATIVELANGNAME, ""); CountryName = GetLocaleStr(lcid, LOCALE_SNATIVECTRYNAME, ""); if (lstrlen(LocaleName.c_str()) > 0) Form1->ListBox1->Items->Add(LocaleName + ":" + LanguageName + "-" + CountryName); return TRUE; } /* This call causes the callback to execute for every locale */ EnumSystemLocales((LOCALE_ENUMPROC)EnumLocalesProc, LCID_SUPPORTED);
Copyright(C) 2008 CodeGear(TM). All Rights Reserved.
|
What do you think about this topic? Send feedback!
|