RAD Studio |  |

Creating Resource DLLs
See Also
Collapse All

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:

Copy Code

    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;

Copy Code

    /* 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);

See Also

Using Resource DLLs

Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
What do you think about this topic? Send feedback!