mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-22 03:11:22 +01:00
IDE: implemented content check if generated .po files really changed
git-svn-id: trunk@10429 -
This commit is contained in:
parent
a51bbbe67a
commit
e8d1b7295b
@ -74,7 +74,8 @@ function GetLazarusLanguageLocalizedName(const ID: string): String;
|
|||||||
procedure CollectTranslations(const LazarusDir: string);
|
procedure CollectTranslations(const LazarusDir: string);
|
||||||
|
|
||||||
function ConvertRSTFiles(RSTDirectory, PODirectory: string): Boolean;
|
function ConvertRSTFiles(RSTDirectory, PODirectory: string): Boolean;
|
||||||
function ConvertRSTFile(const RSTFilename, OutputFilename: string): Boolean;
|
function ConvertRSTFile(const RSTFilename, OutputFilename: string;
|
||||||
|
CheckContentChange: Boolean; var ContentChanged: Boolean): Boolean;
|
||||||
|
|
||||||
var
|
var
|
||||||
LazarusTranslations: TLazarusTranslations = nil;
|
LazarusTranslations: TLazarusTranslations = nil;
|
||||||
@ -259,32 +260,100 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
function ConvertToGettextPO(TreeOfConstItems: TAVLTree;
|
function ConvertToGettextPO(TreeOfConstItems: TAVLTree;
|
||||||
const OutFilename: string): Boolean;
|
const OutFilename: string; CheckContentChange: Boolean;
|
||||||
|
var ContentChanged: Boolean): Boolean;
|
||||||
var
|
var
|
||||||
j: Integer;
|
j: Integer;
|
||||||
item: TConstItem;
|
item: TConstItem;
|
||||||
s: String;
|
s: String;
|
||||||
c: Char;
|
c: Char;
|
||||||
Node: TAVLTreeNode;
|
Node: TAVLTreeNode;
|
||||||
ms: TMemoryStream;
|
NewContent: TMemoryStream;
|
||||||
e: string;
|
e: string;
|
||||||
|
OldContent: TMemoryStream;
|
||||||
|
|
||||||
procedure WriteStr(const s: string);
|
procedure WriteStr(const s: string);
|
||||||
begin
|
begin
|
||||||
if s<>'' then ms.Write(s[1],length(s));
|
if s<>'' then NewContent.Write(s[1],length(s));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure WriteLine(const s: string);
|
procedure WriteLine(const s: string);
|
||||||
begin
|
begin
|
||||||
if s<>'' then ms.Write(s[1],length(s));
|
if s<>'' then NewContent.Write(s[1],length(s));
|
||||||
ms.Write(e[1],length(e));
|
NewContent.Write(e[1],length(e));
|
||||||
|
end;
|
||||||
|
|
||||||
|
function CompareMemStreamText(s1, s2: TMemoryStream): Boolean;
|
||||||
|
// compare text in s2, s2 ignoring line ends
|
||||||
|
var
|
||||||
|
p1: PChar;
|
||||||
|
p2: PChar;
|
||||||
|
Count1: Int64;
|
||||||
|
Count2: Int64;
|
||||||
|
begin
|
||||||
|
if s1.Memory=nil then begin
|
||||||
|
Result:=s2.Memory=nil;
|
||||||
|
end else begin
|
||||||
|
if s2.Memory=nil then begin
|
||||||
|
Result:=false;
|
||||||
|
end else begin
|
||||||
|
p1:=PChar(s1.Memory);
|
||||||
|
p2:=PChar(s2.Memory);
|
||||||
|
Count1:=s1.Size;
|
||||||
|
Count2:=s2.Size;
|
||||||
|
repeat
|
||||||
|
if not (p1^ in [#10,#13]) then begin
|
||||||
|
// p1 has normal char
|
||||||
|
if p1^=p2^ then begin
|
||||||
|
inc(p1);
|
||||||
|
dec(Count1);
|
||||||
|
inc(p2);
|
||||||
|
dec(Count2);
|
||||||
|
end else begin
|
||||||
|
exit(false);
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
// p1 has a newline
|
||||||
|
if (p2^ in [#10,#13]) then begin
|
||||||
|
// p2 has a newline
|
||||||
|
if (Count1>1) and (p1[1] in [#10,#13]) and (p1[0]<>p1[1]) then
|
||||||
|
begin
|
||||||
|
inc(p1,2);
|
||||||
|
dec(Count1,2);
|
||||||
|
end else begin
|
||||||
|
inc(p1);
|
||||||
|
dec(Count1);
|
||||||
|
end;
|
||||||
|
if (Count2>1) and (p2[1] in [#10,#13]) and (p2[0]<>p2[1]) then
|
||||||
|
begin
|
||||||
|
inc(p2,2);
|
||||||
|
dec(Count2,2);
|
||||||
|
end else begin
|
||||||
|
inc(p2);
|
||||||
|
dec(Count2);
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
// p1 has newline, p2 not
|
||||||
|
exit(false);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if Count1=0 then begin
|
||||||
|
Result:=Count2=0;
|
||||||
|
exit;
|
||||||
|
end else if Count2=0 then begin
|
||||||
|
exit(false);
|
||||||
|
end;
|
||||||
|
until false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
Result:=false;
|
||||||
|
ContentChanged:=false;
|
||||||
try
|
try
|
||||||
e:=LineEnding;
|
e:=LineEnding;
|
||||||
ms:=TMemoryStream.Create;
|
NewContent:=TMemoryStream.Create;
|
||||||
|
|
||||||
// write header
|
// write header
|
||||||
WriteLine('"MIME-Version: 1.0\n"');
|
WriteLine('"MIME-Version: 1.0\n"');
|
||||||
@ -331,14 +400,24 @@ begin
|
|||||||
Node:=TreeOfConstItems.FindSuccessor(Node);
|
Node:=TreeOfConstItems.FindSuccessor(Node);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
ms.Position:=0;
|
NewContent.Position:=0;
|
||||||
ms.SaveToFile(OutFilename);
|
if CheckContentChange then begin
|
||||||
|
OldContent:=TMemoryStream.Create;
|
||||||
|
OldContent.LoadFromFile(OutFilename);
|
||||||
|
ContentChanged:=CompareMemStreamText(NewContent,OldContent);
|
||||||
|
OldContent.Free;
|
||||||
|
end else begin
|
||||||
|
ContentChanged:=true;
|
||||||
|
end;
|
||||||
|
if ContentChanged then
|
||||||
|
NewContent.SaveToFile(OutFilename);
|
||||||
Result:=true;
|
Result:=true;
|
||||||
except
|
except
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function ConvertRSTFile(const RSTFilename, OutputFilename: string): Boolean;
|
function ConvertRSTFile(const RSTFilename, OutputFilename: string;
|
||||||
|
CheckContentChange: Boolean; var ContentChanged: Boolean): Boolean;
|
||||||
var
|
var
|
||||||
TreeOfConstItems: TAVLTree;
|
TreeOfConstItems: TAVLTree;
|
||||||
begin
|
begin
|
||||||
@ -352,7 +431,9 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
// write .po file
|
// write .po file
|
||||||
if not ConvertToGettextPO(TreeOfConstItems,OutputFilename) then begin
|
if not ConvertToGettextPO(TreeOfConstItems,OutputFilename,
|
||||||
|
CheckContentChange,ContentChanged)
|
||||||
|
then begin
|
||||||
DebugLn(['ConvertRSTFile writing failed: OutputFilename=',OutputFilename]);
|
DebugLn(['ConvertRSTFile writing failed: OutputFilename=',OutputFilename]);
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
@ -370,6 +451,7 @@ var
|
|||||||
FileInfo: TSearchRec;
|
FileInfo: TSearchRec;
|
||||||
RSTFilename: String;
|
RSTFilename: String;
|
||||||
OutputFilename: String;
|
OutputFilename: String;
|
||||||
|
ContentChanged: Boolean;
|
||||||
begin
|
begin
|
||||||
Result:=true;
|
Result:=true;
|
||||||
if (RSTDirectory='') then exit;// nothing to do
|
if (RSTDirectory='') then exit;// nothing to do
|
||||||
@ -389,10 +471,15 @@ begin
|
|||||||
//DebugLn(['ConvertPackageRSTFiles RSTFilename=',RSTFilename,' OutputFilename=',OutputFilename]);
|
//DebugLn(['ConvertPackageRSTFiles RSTFilename=',RSTFilename,' OutputFilename=',OutputFilename]);
|
||||||
if (not FileExists(OutputFilename))
|
if (not FileExists(OutputFilename))
|
||||||
or (FileAge(RSTFilename)>FileAge(OutputFilename)) then begin
|
or (FileAge(RSTFilename)>FileAge(OutputFilename)) then begin
|
||||||
if not ConvertRSTFile(RSTFilename,OutputFilename) then begin
|
ContentChanged:=false;
|
||||||
|
if not ConvertRSTFile(RSTFilename,OutputFilename,true,ContentChanged)
|
||||||
|
then begin
|
||||||
DebugLn(['ConvertPackageRSTFiles FAILED: RSTFilename=',RSTFilename,' OutputFilename=',OutputFilename]);
|
DebugLn(['ConvertPackageRSTFiles FAILED: RSTFilename=',RSTFilename,' OutputFilename=',OutputFilename]);
|
||||||
exit(false);
|
exit(false);
|
||||||
end;
|
end;
|
||||||
|
if ContentChanged then begin
|
||||||
|
// ToDo: update translations
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
until SysUtils.FindNext(FileInfo)<>0;
|
until SysUtils.FindNext(FileInfo)<>0;
|
||||||
end;
|
end;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user