Obsługa wielu języków 2

vecco

Przy okazji pisania własnego IDE (pascalIDE) potrzebowałem stworzyć kilka wersji językowych aplikacji.

Rozwiązałem problem na plikach INI. Oto struktura pliku xxx.lng

[Nazwa komponentu]
Właściwość=Wartość

Na początek powinniśmy wygenerować takie pliki, aby móc je przetłumaczyć.

var
  properties : array[1..3] of string = ('Caption','Hint','Text'); //wpisujemy właściwości które chcemy wyciągnąć
{...}
procedure TForm1.generateLanguageFiles;
var
  i,form,p : integer;
  ini : TIniFile;
  comp: TComponent;
  langDir,temp : string;
begin
  langDir := ExtractFilePath(Application.Exename)+'pl';
  if not directoryExists(langDir) then mkDir(langDir);
  for form := 1 to Application.ComponentCount-1 do
  begin
    ini := TIniFile.Create(langDir+'\'+Application.Components[form].Name+'.lng');
    ini.WriteString(Application.Components[form].Name,'Caption',TForm(Application.Components[form]).Caption);
    for i:= 0 to Application.Components[form].ComponentCount-1 do
    begin
      comp:= Application.Components[form].Components[i];
      for p := 1 to 3 do
      begin
        if IsPublishedProp(comp,properties[p]) then
        begin
          temp := GetPropValue(comp, properties[p]);
          if temp <> '' then
          ini.WriteString(comp.Name,properties[p],temp);
        end;
      end;
    end;
    ini.Free;
end;

Powyższa procedura generuje pliki lng dla każdej formy w projekcie. Odpalamy ją najlepiej w onShow formy głównej, po (ewentualnym) wczytaniu ustawień.

Kopiujemy wszystkie wygenerowane pliki do nowo utworzonego katalogu i nazywamy go en.
Następnie należy przetłumaczyć wszystkie napisy (najgorsza część).

Procedura która wczytuje pliki lng z folderu podanego jako parametr:

procedure TForm1.loadLanguage(lang : string);
var
  i,form,p : integer;
  ini : TIniFile;
  comp: TComponent;
  langDir,temp : string;
begin
  langDir := ExtractFilePath(Application.Exename)+lang;
  for form := 1 to Application.ComponentCount-1 do
  begin
    ini := TIniFile.Create(langDir+'\'+Application.Components[form].Name+'.lng');
    TForm(Application.Components[form]).Caption := ini.ReadString(Application.Components[form].Name,'Caption','');
    for i:= 0 to Application.Components[form].ComponentCount - 1 do
    begin
      comp:= Application.Components[form].Components[i];
        for p := 1 to 3 do
        begin
          temp := ini.ReadString(comp.Name,properties[p],'');
          if temp <> '' then
            SetPropValue(comp, properties[p],temp);
        end;
      end;
    ini.Free;
  end;
end;

Wywołanie:

  loadLanguage('en'); // en - folder z plikami lng

Źródła + demo
http://download.4programmers.net/MultiLang

0 komentarzy