И по переводу еще.
Сделал следующее.
- Код: Выделить всё
- unit UResourceStrings;
 
 {$mode objfpc}{$H+}
 
 interface
 
 uses
 Classes, SysUtils, LResources, Translations, gettext, PoTranslator, FileUtil;
 
 function MyTranslateUnitResourceStrings(unitName: String): boolean;
 function MyTranslate(unitName, lang: String): boolean;
 
 var
 varLang          : String;
 varFallbackLang  : String;
 varCurrentPOPath : String;
 
 const
 constPODir       = 'languages';
 constPOSmallName = 'izhitsa.%s';
 constPOName      = constPOSmallName + '.po';
 constPOPath      = constPODir + '/' + constPOName;
 
 ResourceString
 rsFileVersion            = '%s от %s';
 rsLabelAuthor            = 'Автор:';
 rsLabelVersion           = 'Версия:';
 
 implementation
 
 function MyTranslateUnitResourceStrings(unitName: String): boolean;
 var
 r: TLResource;
 POFile: TPOFile;
 POStream: TStream;
 begin
 GetLanguageIDs(varLang, varFallbackLang);
 
 MyTranslate(unitName, varFallbackLang);
 end;
 
 
 function MyTranslate(unitName, lang: String): boolean;
 var
 r: TLResource;
 POFile: TPOFile;
 //POStream: TStream;
 begin
 r := LazarusResources.Find(Format(constPOSmallName, [lang]), 'PO');
 
 // Если найден ресурс с переводом на нужный язык
 if (r <> nil) then begin
 POFile := TPOFile.Create;
 //POStream := TStream.Create;
 try
 POFile.ReadPOText(r.Value);
 Translations.TranslateUnitResourceStrings(unitName, POFile);
 LRSTranslator := TPoTranslator.Create(Format(constPOPath, [lang])); //TODO: сделать загрузку из ресурса
 //LRSTranslator := TPoTranslator.Create(POStream);
 finally
 POFile.Free;
 //POStream.Free;
 end;
 end;
 
 // Если не найден ресурс с переводом на нужный язык, ищем файл
 if (r = nil) then begin
 if (FileExistsUTF8(Format(constPOPath, [lang]))) then begin
 TranslateUnitResourceStrings(unitName, Format(constPOPath, [lang]));
 LRSTranslator := TPoTranslator.Create(Format(constPOPath, [lang]));
 end
 else begin
 // Если нет ни ресурса ни файла на нужном языке, то ищем перевод на английский
 if (lang <> 'en') then begin
 MyTranslate(unitName, 'en');
 end;
 end
 end;
 end;
 
 initialization
 {$I uresourcestrings.lrs}
 
 end.
 
И вызываю MyTranslateUnitResourceStrings
- Код: Выделить всё
- initialization
 {$I main.lrs}
 MyTranslateUnitResourceStrings('Main');
Самое интересное, что переводится интерфейс и на других формах, хотя в их коде нет ни слова о переводе (все формы не проверял, но с одной именно так).
Как так? Т.е. там не нужно делать вызов LRSTranslator := TPoTranslator.Create ?
Помогите, пожалуйста. Как преобразовать вызов (код PoTranslator из 
http://wiki.lazarus.freepascal.org/Tran ... rograms/ru)
- Код: Выделить всё
-  LRSTranslator := TPoTranslator.Create(Format(constPOPath, [lang]));
чтобы он воспринял переменную POFile? Точнее как её записать в TStream.
Добавлено спустя 7 минут 39 секунд:zub писал(а):к проекту нужно добавить все *.pas в которых присутствуют ResourceString и пересобрать. загляни в проектинспектор проекта - там видно что добавлено
Это сделана. Нашел баг. Ресурсы добавляются только из корневого каталога или каталога, где лежит главная форма (не проверял).
А у меня главная форма в корне, а все остальные ресурсы в подкаталоге....
Есть такой у кого баг?
Добавлено спустя 5 минут 35 секунд:Проверил, у меня добавляются только из корневого каталога файлы ресурсов.
Это у всех так или у меня версия IDE старовата? Иль настройки какие виноваты?