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