diff --git a/components/lazutils/translations.pas b/components/lazutils/translations.pas index 2303a2dd0c..e40a70e458 100644 --- a/components/lazutils/translations.pas +++ b/components/lazutils/translations.pas @@ -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; diff --git a/ide/idetranslations.pas b/ide/idetranslations.pas index 11079f5861..3b783549bc 100644 --- a/ide/idetranslations.pas +++ b/ide/idetranslations.pas @@ -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; diff --git a/packager/pkgmanager.pas b/packager/pkgmanager.pas index ffa8bc0d6f..9b8d6bd578 100644 --- a/packager/pkgmanager.pas +++ b/packager/pkgmanager.pas @@ -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)