i18n в Lazarus

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

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

Ответить
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

i18n в Lazarus

Сообщение Alexx2000 »

Активируем в настройках проекта поддержку 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
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

Проанализировав код модулей 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 модуля проекта, и все работает.
Вот такой велосипед :)

З.Ы. Может есть уже готовое решение, но я его не откопал.
Ответить