И по переводу еще.
Сделал следующее.
- Код: Выделить всё
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 старовата? Иль настройки какие виноваты?