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:
maxim 2019-01-29 23:04:16 +00:00
parent a9f2cac891
commit 040d1106ac
3 changed files with 35 additions and 51 deletions

View File

@ -183,6 +183,7 @@ var
// if you don't use UTF-8, install a proper widestring manager and set this
// to false.
function GetPOFilenameParts(const Filename: string; out AUnitName, Language: string): boolean;
function FindAllTranslatedPoFiles(const Filename: string): TStringList;
// translate resource strings for one unit
@ -408,33 +409,44 @@ begin
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;
var
Path: String;
Name: String;
NameOnly: String;
Ext: String;
FileInfo: TSearchRec;
CurExt: String;
CurUnitName: String;
CurLang: String;
begin
Result:=TStringList.Create;
Path:=ExtractFilePath(Filename);
Name:=ExtractFilename(Filename);
Ext:=ExtractFileExt(Filename);
NameOnly:=LeftStr(Name,length(Name)-length(Ext));
if FindFirstUTF8(Path+GetAllFilesMask,faAnyFile,FileInfo)=0 then begin
NameOnly:=ExtractFileNameOnly(Filename);
if FindFirstUTF8(Path+GetAllFilesMask,faAnyFile,FileInfo)=0 then
repeat
if (FileInfo.Name='.') or (FileInfo.Name='..') or (FileInfo.Name='')
or (CompareFilenames(FileInfo.Name,Name)=0) then continue;
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);
if GetPOFilenameParts(FileInfo.Name, CurUnitName, CurLang) and (NameOnly=CurUnitName) then
Result.Add(Path+FileInfo.Name);
until FindNextUTF8(FileInfo)<>0;
end;
FindCloseUTF8(FileInfo);
end;

View File

@ -428,28 +428,23 @@ end;
function FindTranslatedPoFiles(const BasePOFilename: string): TStringList;
var
Path: String;
Name: String;
NameOnly: String;
Dir: TCTDirectoryCache;
Files: TStrings;
Filename: String;
CurUnitName: String;
CurLang: String;
begin
Result:=TStringList.Create;
Path:=ExtractFilePath(BasePOFilename);
Name:=ExtractFileName(BasePOFilename);
NameOnly:=ExtractFileNameOnly(Name);
NameOnly:=ExtractFileNameOnly(BasePOFilename);
Dir:=CodeToolBoss.DirectoryCachePool.GetCache(Path);
Files:=TStringList.Create;
try
Dir.GetFiles(Files,false);
for Filename in Files do begin
if CompareFilenames(Filename,Name)=0 then continue;
if CompareFileExt(Filename,'.po',false)<>0 then continue;
//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);
if GetPOFilenameParts(Filename, CurUnitName, CurLang) and (NameOnly=CurUnitName) then
Result.Add(Path+Filename);
end;
finally
Files.Free;

View File

@ -3166,29 +3166,6 @@ var
TranslateUnitResourceStrings(AnUnitName,AFilename);
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;
const Directory, Language: string);
var
@ -3202,8 +3179,8 @@ var
try
CodeToolBoss.DirectoryCachePool.GetListing(Directory,Files,false);
for Filename in Files do begin
if CompareFileExt(Filename,'.po',false)<>0 then continue;
if GetPOFilenameParts(Filename,CurUnitName,CurLang)
and IsValidUnitName(CurUnitName)
and (CurLang=Language)
and (not UnitTranslated(CurUnitName))
and (APackage.FindUnit(CurUnitName)<>nil)