mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-12 13:50:06 +02:00
IDE/Packager/LazUtils: factored out PO filename parsing code to a separate procedure and made it dotted filename safe. Now using it in all relevant places, thus reducing code duplication and fixing possible problems with dotted PO filenames.
git-svn-id: trunk@60245 -
This commit is contained in:
parent
a9f2cac891
commit
040d1106ac
@ -183,6 +183,7 @@ var
|
|||||||
// if you don't use UTF-8, install a proper widestring manager and set this
|
// if you don't use UTF-8, install a proper widestring manager and set this
|
||||||
// to false.
|
// to false.
|
||||||
|
|
||||||
|
function GetPOFilenameParts(const Filename: string; out AUnitName, Language: string): boolean;
|
||||||
function FindAllTranslatedPoFiles(const Filename: string): TStringList;
|
function FindAllTranslatedPoFiles(const Filename: string): TStringList;
|
||||||
|
|
||||||
// translate resource strings for one unit
|
// translate resource strings for one unit
|
||||||
@ -408,33 +409,44 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function GetPOFilenameParts(const Filename: string; out AUnitName, Language: string): boolean;
|
||||||
|
var
|
||||||
|
NameWithoutExt, Ext: string;
|
||||||
|
ExtLength: Integer;
|
||||||
|
begin
|
||||||
|
Result:=false;
|
||||||
|
AUnitName:='';
|
||||||
|
Language:='';
|
||||||
|
if CompareFileExt(Filename, '.po', false)=0 then
|
||||||
|
begin
|
||||||
|
NameWithoutExt:=ExtractFileNameWithoutExt(Filename);
|
||||||
|
Ext:=ExtractFileExt(NameWithoutExt);
|
||||||
|
ExtLength:=Length(Ext);
|
||||||
|
if ExtLength>1 then
|
||||||
|
begin
|
||||||
|
AUnitName:=copy(NameWithoutExt, 1, Length(NameWithoutExt)-ExtLength);
|
||||||
|
Language:=copy(Ext, 2, ExtLength-1);
|
||||||
|
Result:=true;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function FindAllTranslatedPoFiles(const Filename: string): TStringList;
|
function FindAllTranslatedPoFiles(const Filename: string): TStringList;
|
||||||
var
|
var
|
||||||
Path: String;
|
Path: String;
|
||||||
Name: String;
|
|
||||||
NameOnly: String;
|
NameOnly: String;
|
||||||
Ext: String;
|
|
||||||
FileInfo: TSearchRec;
|
FileInfo: TSearchRec;
|
||||||
CurExt: String;
|
CurUnitName: String;
|
||||||
|
CurLang: String;
|
||||||
begin
|
begin
|
||||||
Result:=TStringList.Create;
|
Result:=TStringList.Create;
|
||||||
Path:=ExtractFilePath(Filename);
|
Path:=ExtractFilePath(Filename);
|
||||||
Name:=ExtractFilename(Filename);
|
NameOnly:=ExtractFileNameOnly(Filename);
|
||||||
Ext:=ExtractFileExt(Filename);
|
if FindFirstUTF8(Path+GetAllFilesMask,faAnyFile,FileInfo)=0 then
|
||||||
NameOnly:=LeftStr(Name,length(Name)-length(Ext));
|
|
||||||
if FindFirstUTF8(Path+GetAllFilesMask,faAnyFile,FileInfo)=0 then begin
|
|
||||||
repeat
|
repeat
|
||||||
if (FileInfo.Name='.') or (FileInfo.Name='..') or (FileInfo.Name='')
|
if GetPOFilenameParts(FileInfo.Name, CurUnitName, CurLang) and (NameOnly=CurUnitName) then
|
||||||
or (CompareFilenames(FileInfo.Name,Name)=0) then continue;
|
Result.Add(Path+FileInfo.Name);
|
||||||
CurExt:=ExtractFileExt(FileInfo.Name);
|
|
||||||
if (CompareFilenames(CurExt,'.po')<>0)
|
|
||||||
//skip files which names don't have form 'nameonly.foo.po', e.g. 'nameonlyfoo.po'
|
|
||||||
or (CompareFilenames(LeftStr(FileInfo.Name,length(NameOnly)+1),NameOnly+'.')<>0)
|
|
||||||
then
|
|
||||||
continue;
|
|
||||||
Result.Add(Path+FileInfo.Name);
|
|
||||||
until FindNextUTF8(FileInfo)<>0;
|
until FindNextUTF8(FileInfo)<>0;
|
||||||
end;
|
|
||||||
FindCloseUTF8(FileInfo);
|
FindCloseUTF8(FileInfo);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -428,28 +428,23 @@ end;
|
|||||||
function FindTranslatedPoFiles(const BasePOFilename: string): TStringList;
|
function FindTranslatedPoFiles(const BasePOFilename: string): TStringList;
|
||||||
var
|
var
|
||||||
Path: String;
|
Path: String;
|
||||||
Name: String;
|
|
||||||
NameOnly: String;
|
NameOnly: String;
|
||||||
Dir: TCTDirectoryCache;
|
Dir: TCTDirectoryCache;
|
||||||
Files: TStrings;
|
Files: TStrings;
|
||||||
Filename: String;
|
Filename: String;
|
||||||
|
CurUnitName: String;
|
||||||
|
CurLang: String;
|
||||||
begin
|
begin
|
||||||
Result:=TStringList.Create;
|
Result:=TStringList.Create;
|
||||||
Path:=ExtractFilePath(BasePOFilename);
|
Path:=ExtractFilePath(BasePOFilename);
|
||||||
Name:=ExtractFileName(BasePOFilename);
|
NameOnly:=ExtractFileNameOnly(BasePOFilename);
|
||||||
NameOnly:=ExtractFileNameOnly(Name);
|
|
||||||
Dir:=CodeToolBoss.DirectoryCachePool.GetCache(Path);
|
Dir:=CodeToolBoss.DirectoryCachePool.GetCache(Path);
|
||||||
Files:=TStringList.Create;
|
Files:=TStringList.Create;
|
||||||
try
|
try
|
||||||
Dir.GetFiles(Files,false);
|
Dir.GetFiles(Files,false);
|
||||||
for Filename in Files do begin
|
for Filename in Files do begin
|
||||||
if CompareFilenames(Filename,Name)=0 then continue;
|
if GetPOFilenameParts(Filename, CurUnitName, CurLang) and (NameOnly=CurUnitName) then
|
||||||
if CompareFileExt(Filename,'.po',false)<>0 then continue;
|
Result.Add(Path+Filename);
|
||||||
//skip files which names don't have form 'nameonly.foo.po', e.g. 'nameonlyfoo.po'
|
|
||||||
if (CompareFilenames(LeftStr(Filename,length(NameOnly)+1),NameOnly+'.')<>0)
|
|
||||||
then
|
|
||||||
continue;
|
|
||||||
Result.Add(Path+Filename);
|
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
Files.Free;
|
Files.Free;
|
||||||
|
@ -3166,29 +3166,6 @@ var
|
|||||||
TranslateUnitResourceStrings(AnUnitName,AFilename);
|
TranslateUnitResourceStrings(AnUnitName,AFilename);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function GetPOFilenameParts(const Filename: string;
|
|
||||||
out AUnitName, Language: string): boolean;
|
|
||||||
var
|
|
||||||
UnitNameEnd: Integer;
|
|
||||||
LangEnd: Integer;
|
|
||||||
begin
|
|
||||||
Result:=false;
|
|
||||||
AUnitName:='';
|
|
||||||
Language:='';
|
|
||||||
UnitNameEnd:=1;
|
|
||||||
while (UnitNameEnd<=length(Filename)) and (Filename[UnitNameEnd]<>'.') do
|
|
||||||
inc(UnitNameEnd);
|
|
||||||
if (UnitNameEnd=1) then exit;
|
|
||||||
LangEnd:=UnitNameEnd+1;
|
|
||||||
while (LangEnd<=length(Filename)) and (Filename[LangEnd]<>'.') do
|
|
||||||
inc(LangEnd);
|
|
||||||
if LangEnd<>length(Filename)-2 then exit;
|
|
||||||
AUnitName:=copy(Filename,1,UnitNameEnd-1);
|
|
||||||
Language:=copy(Filename,UnitNameEnd+1,LangEnd-UnitNameEnd-1);
|
|
||||||
Result:=IsValidUnitName(AUnitName) and (Language<>'');
|
|
||||||
//DebugLn(['GetPOFilenameParts AUnitName=',AUnitName,' Language=',Language,' Result=',Result]);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TranslateWithFileMask(APackage: TLazPackage;
|
procedure TranslateWithFileMask(APackage: TLazPackage;
|
||||||
const Directory, Language: string);
|
const Directory, Language: string);
|
||||||
var
|
var
|
||||||
@ -3202,8 +3179,8 @@ var
|
|||||||
try
|
try
|
||||||
CodeToolBoss.DirectoryCachePool.GetListing(Directory,Files,false);
|
CodeToolBoss.DirectoryCachePool.GetListing(Directory,Files,false);
|
||||||
for Filename in Files do begin
|
for Filename in Files do begin
|
||||||
if CompareFileExt(Filename,'.po',false)<>0 then continue;
|
|
||||||
if GetPOFilenameParts(Filename,CurUnitName,CurLang)
|
if GetPOFilenameParts(Filename,CurUnitName,CurLang)
|
||||||
|
and IsValidUnitName(CurUnitName)
|
||||||
and (CurLang=Language)
|
and (CurLang=Language)
|
||||||
and (not UnitTranslated(CurUnitName))
|
and (not UnitTranslated(CurUnitName))
|
||||||
and (APackage.FindUnit(CurUnitName)<>nil)
|
and (APackage.FindUnit(CurUnitName)<>nil)
|
||||||
|
Loading…
Reference in New Issue
Block a user