i18n в Lazarus

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

i18n в Lazarus

Сообщение Alexx2000 » 10.11.2007 21:57:48

Активируем в настройках проекта поддержку i18n. После этого создается .po файл, который содержит строки вида:
Код: Выделить всё
#: TFORM1.CAPTION
msgid "Form1"
msgstr ""

#: TFORM1.BUTTON1.CAPTION
msgid "Button1"
msgstr ""

Насколько я понимаю это для перевода элементов интерфейса.
Собственно как сделать, чтобы отображались переведенные строки.
Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
var
  PODirectory, Lang, FallbackLang: String;
begin
  PODirectory:='X:\Test\language\';
  GetLanguageIDs(Lang,FallbackLang); // in unit gettext
  Translations.TranslateUnitResourceStrings('Unit1',PODirectory+'project1.%s.po',
                                  Lang,FallbackLang);
end;

Это не помогает, я что-то не так делаю или эта функция еще не доделана?
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 487
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Сообщение Alexx2000 » 11.11.2007 00:53:54

Проанализировав код модулей Translations.pas и DefaultTranslator.pas пришел к такому решению:
Код: Выделить всё
unit uTranslator;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, GetText, Controls, typinfo, Translations;
type

{ TTranslator }

TTranslator = class(TAbstractTranslator)
private
  FFormClassName : String;
  FPOFile:TPOFile;
public
  constructor Create(POFileName:string);
  destructor Destroy;override;
  procedure TranslateStringProperty(Sender:TObject; const Instance: TPersistent; PropInfo: PPropInfo; var Content:string);override;
end;

var
  POFileName : String;
 
implementation
uses
  Forms, LCLProc;

{ TTranslator }

constructor TTranslator.Create(POFileName: string);
begin
  inherited Create;
  FPOFile := TPOFile.Create(POFileName);
end;

destructor TTranslator.Destroy;
begin
  FPOFile.Free;
  inherited Destroy;
end;

procedure TTranslator.TranslateStringProperty(Sender: TObject;
  const Instance: TPersistent; PropInfo: PPropInfo; var Content: string);
begin
  if Instance.InheritsFrom(TForm) then
    begin
      FFormClassName := Instance.ClassName;
      DebugLn(UpperCase(FFormClassName + '.'+PropInfo^.Name) + '=' + Content);
      Content := FPOFile.Translate(UpperCase(FFormClassName + '.' + PropInfo^.Name), Content);
    end
  else
    begin
      DebugLn(UpperCase(FFormClassName + '.'+Instance.GetNamePath + '.' + PropInfo^.Name) + '=' + Content);
      Content := FPOFile.Translate(UpperCase(FFormClassName + '.'+Instance.GetNamePath + '.'+ PropInfo^.Name), Content);
    end;
  // convert UTF8 to current local
  Content := UTF8ToSystemCharSet(Content);
end;

initialization
  POFileName := 'x:\Test\language\project1.ru.po'; // для примера
  // присваеваем свой Translator
  LRSTranslator := TTranslator.Create(POFileName);
  {
  Теперь при считывании текстовых Свойств обектов формы будет
вызываться метод TranslateStringProperty
  }
end.
   

Добавляем uTranslator в uses модуля проекта, и все работает.
Вот такой велосипед :)

З.Ы. Может есть уже готовое решение, но я его не откопал.
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 487
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 30

Рейтинг@Mail.ru