[Initranslator-svncheckins] SF.net SVN: initranslator: [202] translator/trunk/src
Brought to you by:
peter3
|
From: <pe...@us...> - 2006-12-18 18:31:03
|
Revision: 202
http://svn.sourceforge.net/initranslator/?rev=202&view=rev
Author: peter3
Date: 2006-12-18 10:30:59 -0800 (Mon, 18 Dec 2006)
Log Message:
-----------
- SDFSplit: New utility for splitting and extracting languages from OpenOffice multi-language sdf files
Added Paths:
-----------
translator/trunk/src/SDFSplit/
translator/trunk/src/SDFSplit/MainFrm.dfm
translator/trunk/src/SDFSplit/MainFrm.pas
translator/trunk/src/SDFSplit/SDFSplit.dof
translator/trunk/src/SDFSplit/SDFSplit.dpr
translator/trunk/src/SDFSplit/SDFSplit.res
Added: translator/trunk/src/SDFSplit/MainFrm.dfm
===================================================================
--- translator/trunk/src/SDFSplit/MainFrm.dfm (rev 0)
+++ translator/trunk/src/SDFSplit/MainFrm.dfm 2006-12-18 18:30:59 UTC (rev 202)
@@ -0,0 +1,208 @@
+object frmMain: TfrmMain
+ Left = 199
+ Top = 172
+ BorderStyle = bsDialog
+ Caption = 'SDF Split and Extract'
+ ClientHeight = 206
+ ClientWidth = 506
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Shell Dlg 2'
+ Font.Style = []
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCloseQuery = FormCloseQuery
+ OnShow = FormShow
+ DesignSize = (
+ 506
+ 206)
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label1: TLabel
+ Left = 8
+ Top = 16
+ Width = 40
+ Height = 13
+ Caption = 'SDF file:'
+ end
+ object Label2: TLabel
+ Left = 8
+ Top = 65
+ Width = 69
+ Height = 13
+ Caption = 'Output folder:'
+ end
+ object edSDFFile: TEdit
+ Left = 8
+ Top = 31
+ Width = 466
+ Height = 21
+ Anchors = [akLeft, akTop, akRight]
+ TabOrder = 0
+ end
+ object btnSDFFile: TButton
+ Left = 478
+ Top = 31
+ Width = 21
+ Height = 21
+ Anchors = [akTop, akRight]
+ Caption = '...'
+ TabOrder = 1
+ OnClick = btnSDFFileClick
+ end
+ object edSaveFolder: TEdit
+ Left = 8
+ Top = 80
+ Width = 466
+ Height = 21
+ Anchors = [akLeft, akTop, akRight]
+ TabOrder = 2
+ end
+ object btnSaveFolder: TButton
+ Left = 478
+ Top = 80
+ Width = 21
+ Height = 21
+ Anchors = [akTop, akRight]
+ Caption = '...'
+ TabOrder = 3
+ OnClick = btnSaveFolderClick
+ end
+ object btnOK: TButton
+ Left = 335
+ Top = 170
+ Width = 75
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Caption = 'Split'
+ Default = True
+ ModalResult = 1
+ TabOrder = 7
+ OnClick = btnOKClick
+ end
+ object btnCancel: TButton
+ Left = 419
+ Top = 170
+ Width = 75
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Cancel = True
+ Caption = 'Close'
+ ModalResult = 2
+ TabOrder = 8
+ OnClick = btnCancelClick
+ end
+ object chkExtractLanguage: TCheckBox
+ Left = 16
+ Top = 121
+ Width = 120
+ Height = 17
+ Caption = 'E&xtract language:'
+ TabOrder = 4
+ OnClick = chkExtractLanguageClick
+ end
+ object cbLanguages: TComboBox
+ Left = 147
+ Top = 119
+ Width = 145
+ Height = 21
+ Enabled = False
+ ItemHeight = 13
+ TabOrder = 5
+ Text = 'af'
+ Items.Strings = (
+ 'af'
+ 'ar'
+ 'as-IN'
+ 'be-BY'
+ 'bg'
+ 'br'
+ 'bs'
+ 'ca'
+ 'cs'
+ 'cy'
+ 'da'
+ 'el'
+ 'en-GB'
+ 'en-ZA'
+ 'eo'
+ 'es'
+ 'et'
+ 'fi'
+ 'fr'
+ 'ga'
+ 'gu'
+ 'gu-IN'
+ 'he'
+ 'hi-IN'
+ 'hr'
+ 'hu'
+ 'it'
+ 'ja'
+ 'ka'
+ 'km'
+ 'ko'
+ 'ku'
+ 'lt'
+ 'mk'
+ 'ml-IN'
+ 'mr-IN'
+ 'nb'
+ 'ne'
+ 'nl'
+ 'nn'
+ 'nr'
+ 'ns'
+ 'or-IN'
+ 'pa-IN'
+ 'pl'
+ 'pt'
+ 'pt-BR'
+ 'ru'
+ 'rw'
+ 'sh-YU'
+ 'sk'
+ 'sl'
+ 'sr-CS'
+ 'ss'
+ 'st'
+ 'sv'
+ 'sw-TZ'
+ 'ta'
+ 'ta-IN'
+ 'te-IN'
+ 'tg'
+ 'th'
+ 'ti-ER'
+ 'tn'
+ 'tr'
+ 'ts'
+ 'uk'
+ 'ur-IN'
+ 've'
+ 'vi'
+ 'xh'
+ 'zh-CN'
+ 'zh-TW'
+ 'zu')
+ end
+ object chkSortItems: TCheckBox
+ Left = 14
+ Top = 154
+ Width = 274
+ Height = 17
+ Caption = 'Sort items in output file(s)'
+ Checked = True
+ State = cbChecked
+ TabOrder = 6
+ end
+ object odSDFFile: TOpenDialog
+ DefaultExt = 'sdf'
+ Filter = 'SDF files|*.sdf|GSI files|*.gsi|All files|*.*'
+ InitialDir = '.'
+ Left = 147
+ Top = 7
+ end
+end
Added: translator/trunk/src/SDFSplit/MainFrm.pas
===================================================================
--- translator/trunk/src/SDFSplit/MainFrm.pas (rev 0)
+++ translator/trunk/src/SDFSplit/MainFrm.pas 2006-12-18 18:30:59 UTC (rev 202)
@@ -0,0 +1,319 @@
+unit MainFrm;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls;
+
+type
+ TfrmMain = class(TForm)
+ Label1: TLabel;
+ edSDFFile: TEdit;
+ btnSDFFile: TButton;
+ Label2: TLabel;
+ edSaveFolder: TEdit;
+ btnSaveFolder: TButton;
+ btnOK: TButton;
+ btnCancel: TButton;
+ odSDFFile: TOpenDialog;
+ chkExtractLanguage: TCheckBox;
+ cbLanguages: TComboBox;
+ chkSortItems: TCheckBox;
+ procedure btnOKClick(Sender: TObject);
+ procedure btnCancelClick(Sender: TObject);
+ procedure btnSDFFileClick(Sender: TObject);
+ procedure btnSaveFolderClick(Sender: TObject);
+ procedure chkExtractLanguageClick(Sender: TObject);
+ procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+ procedure FormShow(Sender: TObject);
+ private
+ { Private declarations }
+ procedure LoadSettings;
+ procedure SaveSettings;
+ procedure SplitFile(const Filename, OutputFolder: string; SortItems: boolean);
+ procedure ExtractFile(const Filename, OutputFolder, Language: string; SortItems: boolean);
+ public
+ { Public declarations }
+ end;
+
+var
+ frmMain: TfrmMain;
+
+implementation
+uses
+ FileCtrl, IniFiles;
+
+{$R *.dfm}
+
+procedure StrTokenize(const S: string; Delimiter: Char; List: TStrings; MinLength: integer = 1);
+var i, j: integer;
+ tmp: string;
+begin
+ j := 1;
+ for i := 1 to Length(S) do
+ begin
+ if (S[i] = Delimiter) then
+ begin
+ tmp := Copy(S, j, i - j);
+ if Length(tmp) >= MinLength then
+ List.Add(tmp);
+ j := i + 1;
+ end;
+ end;
+ if j <= Length(S) then
+ begin
+ tmp := Copy(S, j, MaxInt);
+ if Length(tmp) >= MinLength then
+ List.Add(tmp);
+ end;
+end;
+
+procedure TfrmMain.btnOKClick(Sender: TObject);
+begin
+ if not FileExists(edSDFFile.Text) then
+ ShowMessage('File does not exist')
+ else if not DirectoryExists(edSaveFolder.Text) then
+ ShowMessage('Output folder does not exist')
+ else if chkExtractLanguage.Checked then
+ begin
+ if cbLanguages.Text = '' then
+ begin
+ ShowMessage('No language specified');
+ Exit;
+ end;
+ ExtractFile(edSDFFile.Text, edSaveFolder.Text, cbLanguages.Text, chkSortItems.Checked);
+ ShowMessage('Done');
+ end
+ else
+ begin
+ SplitFile(edSDFFile.Text, edSaveFolder.Text, chkSortItems.Checked);
+ ShowMessage('Done');
+ end;
+end;
+
+function GetLanguage(S: string): string;
+var T: TStringlist;
+begin
+ T := TStringlist.Create;
+ try
+ StrTokenize(S, #9, T, 0);
+ if T.Count > 9 then
+ Result := T[9]
+ else
+ Result := '';
+ finally
+ T.Free;
+ end;
+end;
+
+procedure TfrmMain.SplitFile(const Filename, OutputFolder: string; SortItems: boolean);
+var
+ i, aStart, aIndex, aCount: integer;
+ S: TStringlist;
+ aFileNameTemplate, aBaseFolder, aCurrentFilename: string;
+ FFiles: array of TextFile;
+ FLanguages: TStringlist;
+
+ function GetLanguages(S: TStrings; i: integer): integer;
+ var
+ j: integer;
+ lang: string;
+ begin
+ for j := i to S.Count - 1 do
+ begin
+ lang := GetLanguage(S[j]);
+ if FLanguages.IndexOf(lang) > -1 then
+ begin
+ Result := FLanguages.Count;
+ Exit;
+ end
+ else
+ FLanguages.Add(lang);
+ end;
+ Result := 0;
+ end;
+begin
+ aBaseFolder := IncludeTrailingPathDelimiter(OutputFolder);
+ aFileNameTemplate := ExtractFileName(Filename);
+ S := TStringlist.Create;
+ FLanguages := TStringlist.Create;
+ try
+ FLanguages.Sorted := true;
+ S.LoadFromFile(Filename);
+ aStart := 0;
+ // skip empty and comment lines
+ while aStart < S.Count do
+ if (S[aStart] = '') or (S[aStart][1] = '#') then
+ Inc(aStart)
+ else
+ Break;
+ aCount := GetLanguages(S, aStart);
+ if aCount > 0 then
+ begin
+ SetLength(FFiles, aCount);
+ for i := 0 to aCount - 1 do
+ begin
+ // create a folder for each file, named like the language
+ ForceDirectories(aBaseFolder + FLanguages[i]);
+ aCurrentFilename := IncludeTrailingPathDelimiter(aBaseFolder + FLanguages[i]) + aFileNameTemplate;
+ // assign the filename to the file
+ // this assures that the index of a file in FFiles directly syncs up with the items in FLanguages,
+ // i.e they have the same index - THIS IS VERY IMPORTANT!
+ AssignFile(FFiles[i], aCurrentFilename);
+ Rewrite(FFiles[i]);
+ end;
+ // walk the source file, extract lines and put into correct file based on the language
+ for i := aStart to S.Count - 1 do
+ begin
+ aIndex := FLanguages.IndexOf(GetLanguage(S[i]));
+ if aIndex >= 0 then
+ Writeln(FFiles[aIndex], S[i]);
+ end;
+
+ if SortItems then
+ begin
+ // save the file names for later
+ FLanguages.Clear;
+ for i := 0 to aCount - 1 do
+ FLanguages.Add(TTextRec(FFiles[i]).Name);
+ end;
+ // close the files
+ for i := 0 to aCount - 1 do
+ begin
+ Flush(FFiles[i]);
+ CloseFile(FFiles[i]);
+ end;
+ SetLength(FFiles, 0);
+ if SortItems then
+ // sort the files
+ for i := 0 to aCount - 1 do
+ begin
+ S.LoadFromFile(FLanguages[i]);
+ S.Sort;
+ S.SaveToFile(FLanguages[i]);
+ end;
+ end;
+ finally
+ S.Free;
+ FLanguages.Free;
+ end;
+end;
+
+procedure TfrmMain.ExtractFile(const Filename, OutputFolder, Language: string; SortItems: boolean);
+var
+ i, aStart: integer;
+ S: TStringlist;
+ aFileNameTemplate, aBaseFolder, aCurrentFilename: string;
+ FFile: TextFile;
+begin
+ aBaseFolder := IncludeTrailingPathDelimiter(OutputFolder);
+ aFileNameTemplate := ExtractFileName(Filename);
+ S := TStringlist.Create;
+ try
+ S.LoadFromFile(Filename);
+ aStart := 0;
+ // skip empty and comment lines
+ while aStart < S.Count do
+ if (S[aStart] = '') or (S[aStart][1] = '#') then
+ Inc(aStart)
+ else
+ Break;
+ ForceDirectories(aBaseFolder + Language);
+ aCurrentFilename := IncludeTrailingPathDelimiter(aBaseFolder + Language) + aFileNameTemplate;
+ AssignFile(FFile, aCurrentFilename);
+ Rewrite(FFile);
+ try
+ for i := aStart to S.Count - 1 do
+ if AnsiSameText(Language, GetLanguage(S[i])) then
+ Writeln(FFile, S[i]);
+ finally
+ CloseFile(FFile);
+ end;
+ if SortItems then
+ begin
+ S.LoadFromFile(aCurrentFilename);
+ S.Sort;
+ S.SaveToFile(aCurrentFilename);
+ end;
+ finally
+ S.Free;
+ end;
+end;
+
+procedure TfrmMain.btnCancelClick(Sender: TObject);
+begin
+ Close;
+end;
+
+procedure TfrmMain.btnSDFFileClick(Sender: TObject);
+begin
+ odSDFFile.FileName := edSDFFile.Text;
+ if odSDFFile.Execute then
+ begin
+ edSDFFile.Text := odSDFFile.FileName;
+ if not DirectoryExists(edSaveFolder.Text) then
+ edSaveFolder.Text := ExtractFilePath(odSDFFile.FileName);
+ end;
+end;
+
+procedure TfrmMain.btnSaveFolderClick(Sender: TObject);
+var S: string;
+begin
+ S := edSaveFolder.Text;
+ if S = '' then
+ S := ExtractFilePath(edSDFFile.Text);
+ if SelectDirectory('Select output folder', '', S) then
+ edSDFFile.Text := S;
+end;
+
+procedure TfrmMain.chkExtractLanguageClick(Sender: TObject);
+begin
+ if chkExtractLanguage.Checked then
+ btnOK.Caption := 'Extract'
+ else
+ btnOK.Caption := 'Split';
+ cbLanguages.Enabled := chkExtractLanguage.Checked;
+end;
+
+procedure TfrmMain.LoadSettings;
+begin
+ with TIniFile.Create(ChangeFileExt(Application.Exename, '.ini')) do
+ try
+ edSDFFile.Text := ReadString('Settings', 'Filename','');
+ edSaveFolder.Text := ReadString('Settings', 'SaveFolder','');
+ chkExtractLanguage.Checked := ReadBool('Settings', 'ExtractLanguage',false);
+ chkSortItems.Checked := ReadBool('Settings', 'SortItems', true);
+ cbLanguages.Text := ReadString('Settings', 'Language','af');
+ finally
+ Free;
+ end;
+end;
+
+procedure TfrmMain.SaveSettings;
+begin
+ with TIniFile.Create(ChangeFileExt(Application.Exename, '.ini')) do
+ try
+ WriteString('Settings', 'Filename',edSDFFile.Text);
+ WriteString('Settings', 'SaveFolder',edSaveFolder.Text);
+ WriteBool('Settings', 'ExtractLanguage',chkExtractLanguage.Checked);
+ WriteBool('Settings', 'SortItems', chkSortItems.Checked);
+ WriteString('Settings', 'Language',cbLanguages.Text);
+ finally
+ Free;
+ end;
+end;
+
+procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+begin
+ SaveSettings;
+end;
+
+procedure TfrmMain.FormShow(Sender: TObject);
+begin
+ LoadSettings;
+ OnShow := nil;
+end;
+
+end.
+
Property changes on: translator/trunk/src/SDFSplit/MainFrm.pas
___________________________________________________________________
Name: svn:keywords
+ LastChangedDate LastChangedRevision LastChangedBy HeadURL Id
Added: translator/trunk/src/SDFSplit/SDFSplit.dof
===================================================================
--- translator/trunk/src/SDFSplit/SDFSplit.dof (rev 0)
+++ translator/trunk/src/SDFSplit/SDFSplit.dof 2006-12-18 18:30:59 UTC (rev 202)
@@ -0,0 +1,54 @@
+[Compiler]
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=..\..\bin
+UnitOutputDir=..\..\dcu
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1053
+CodePage=1252
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
Added: translator/trunk/src/SDFSplit/SDFSplit.dpr
===================================================================
--- translator/trunk/src/SDFSplit/SDFSplit.dpr (rev 0)
+++ translator/trunk/src/SDFSplit/SDFSplit.dpr 2006-12-18 18:30:59 UTC (rev 202)
@@ -0,0 +1,13 @@
+program SDFSplit;
+
+uses
+ Forms,
+ MainFrm in 'MainFrm.pas' {frmMain};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TfrmMain, frmMain);
+ Application.Run;
+end.
Property changes on: translator/trunk/src/SDFSplit/SDFSplit.dpr
___________________________________________________________________
Name: svn:keywords
+ LastChangedDate LastChangedRevision LastChangedBy HeadURL Id
Added: translator/trunk/src/SDFSplit/SDFSplit.res
===================================================================
(Binary files differ)
Property changes on: translator/trunk/src/SDFSplit/SDFSplit.res
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|