lazarus/tools/updatepofiles.pas
2017-01-29 21:04:32 +00:00

144 lines
3.8 KiB
ObjectPascal

{ $Id$ }
{
***************************************************************************
* *
* This source is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This code is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* General Public License for more details. *
* *
* A copy of the GNU General Public License is available on the World *
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
* obtain it by writing to the Free Software Foundation, *
* Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA. *
* *
***************************************************************************
Author: Mattias Gaertner
Name:
updatepofiles - updates po files.
Synopsis:
updatepofiles filename1.po [filename2.po ... filenameN.po]
Description:
updatepofiles deletes doubles in the po file and merges new strings into
all translated po files (filename1.*.po)
}
program UpdatePoFiles;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, Translations, LazFileUtils, LazUTF8;
var
Files: TStringList;
Prefix: string;
ResFiles: array of TStringList;
procedure AddResFile(const PoIndex:Integer; const AResFile:string);
begin
if PoIndex>(Length(ResFiles)-1) then
SetLength(ResFiles, PoIndex+1);
if ResFiles[PoIndex]=nil then
ResFiles[PoIndex] := TStringList.Create;
ResFiles[PoIndex].Add(AResFile);
end;
procedure ClearResFiles;
var
i: Integer;
begin
for i:=0 to Length(ResFiles)-1 do
if ResFiles[i]<>nil then
ResFiles[i].Free;
end;
function ParamsValid: boolean;
var
i: Integer;
Filename: String;
Ext: String;
Name: string;
PoIndex: Integer;
begin
Result:=false;
PoIndex:=0;
if ParamCount<1 then
exit;
for i:=1 to ParamCount do begin
Filename:=ParamStrUTF8(i);
Ext:=ExtractFileExt(Filename);
if not FileExistsUTF8(Filename) then begin
if (Ext='.rst') or (Ext='.lrt') or (Ext='.rsj') then
continue; // ignore resource files
writeln('ERROR: file not found: ',FileName);
exit;
end;
if (Ext<>'.po') and (Ext<>'.rst') and (Ext<>'.lrt') and (Ext<>'.rsj') then begin
writeln('ERROR: invalid extension: ',Filename);
exit;
end;
Name:=ExtractFileName(Filename);
Name:=LeftStr(Name,length(Name)-length(Ext));
if Pos('.',Name)>0 then begin
writeln('ERROR: invalid unitname: ',Name);
exit;
end;
if Ext='.po' then begin
if Files=nil then
Files:=TStringList.Create;
Files.Add(Filename);
inc(PoIndex);
SetLength(ResFiles, Files.Count); // make sure Files and ResFiles are in sync
end else
AddResFile(PoIndex, FileName);
end;
Result:=true;
end;
procedure UpdateAllPoFiles;
var
i: Integer;
begin
for i:=0 to Files.Count-1 do
UpdatePoFile(ResFiles[i], Files[i]);
end;
begin
Prefix:='';
Files:=nil;
if not ParamsValid then
writeln('Usage: ',ExtractFileName(ParamStrUTF8(0))
,' filename1.po [filename2.po ... filenameN.po]')
else
UpdateAllPoFiles;
if Files<>nil then
Files.Free;
ClearResFiles;
end.