<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<!--***********************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 ***********************************************************-->
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Language" script:language="StarBasic">Option Explicit

Public sMSTemplateCheckbox(2) As String
Public sMSDocumentCheckbox(2) As String
Public sSODocumentCheckbox(4) As String
Public sSOHelperdocuments(1,1) As String
Public sTemplateCheckbox(SBMAXAPPLCOUNT-1) As String
Public sDocumentCheckbox(SBMAXAPPLCOUNT-1) As String
Public sTemplateGroupName As String
Public sSearchInSubDir as String
Public sPathErrorTemplates(SBMAXAPPLCOUNT-1) As String
Public sPathErrorDocument(SBMAXAPPLCOUNT-1) As String
Public sPathErrorStarDoc(SBMAXAPPLCOUNT-1) As String
Public sStarDocLabel(SBMAXAPPLCOUNT-1) As String
Public sImportLabel As String, sExportLabel As String
Public SOApplicationName(5) As String
Public sHelpButton As String, sCancelButton As String, sBackButton As String, sNextButton As String
Public sSumInclusiveSubDir As String, sSumSaveDocuments As String
Public sSummaryHeader As String
Public sWelcometextLabel1 As String, sWelcometextLabel2 As String,  sWelcometextLabel3 As String
Public sBeginButton As String, sMsgDirNotThere As String
Public sQueryForNewCreation As String, sPathError3 As String
Public sNoDirCreation As String
Public sProgressMoreDocs As String, sProgressMoreTemplates as String
Public sFileExists As String, sMorePathsError3 As String
Public sConvertError1 As String, sConvertError2 As String, sPathDialogMessage As String
Public sRTErrorDesc As String, sRTErrorHeader As String
Public sProgressPage_1 As String, sProgressPage_2 As String, sProgressPage_3 as String
Public sProgressFound as String, sProgresspage_5 as String
Public sContainerName(1) as String
Public sReady as String, sTitle as String
Public sCloseButton as String
Public sSourceDocuments as String
Public sTargetDocuments as String
Public sSumSODocuments(4) as String
Public sSumSOTemplates(4) as String
Public sSumMSDocuments(3) as String
Public sSumMSTemplates(3) as String
Public ModuleList(3) as String
Public sLogSummary as String
Public sReeditMacro as String
Public sOverwriteallFiles as String
Public scouldnotopenDocument as String
Public sCurcouldnotopenDocument as String
Public scouldnotsaveDocument as String
Public sCurcouldnotsaveDocument as String


Sub LoadLanguage()
	If InitResources(&quot;ImportWizard&quot;,&quot;imp&quot;) then
		sHelpButton = GetResText(1000)
		sCancelButton = GetResText(1001)
		sBackButton = GetResText(1002)
		sNextButton = GetResText(1003)
		sBeginButton = GetResText(1004)
		sCloseButton = GetResText(1005)
		
		sWelcometextLabel1 = ReplaceString(GetResText(1006), GetProductName(),&quot;%PRODUCTNAME&quot;)
		sWelcometextLabel2 = GetResText(1007)
		sWelcometextLabel3 = GetResText(1008)

		&apos; Microsoft Documents
		GetApplResourceArray(1009, 3, sMSTemplateCheckBox())

		&apos; DocumentCheckbox- Captions
		GetApplResourceArray(1012, 3, sMSDocumentCheckBox())

		&apos; DocumentCheckbox- Captions
		GetApplResourceArray(2013, 5, sSODocumentCheckBox())

		&apos;StarOffice Applicationnames

		sSOHelperDocuments(0,0) = GetResText(2017)
		sSOHelperDocuments(0,1) = &quot;com.sun.star.text.GlobalDocument&quot;
		sSOHelperDocuments(1,0) = GetResText(2018)
		sSOHelperDocuments(1,1) = &quot;com.sun.star.formula.FormulaProperties&quot;
		
		GetApplResourceArray(2017,2, sSOHelperDocuments())		
		
		sContainerName(0) = GetResText(1030)
		&apos; Note: for the version 5.2 there was no Productname &quot;StarSuite&quot;
		sContainerName(1) = &quot;StarOffice&quot;
	
		sSummaryHeader = GetResText(1031)

		sTemplateGroupName = GetResText(1036)

		sProgressMoreDocs = GetResText(1041)
		sProgressMoreTemplates = GetResText(1042)
		sNoDirCreation = GetResText(1050)
		sMsgDirNotThere = GetResText(1051)
		sQueryForNewCreation = GetResText(1052)
		sFileExists = GetResText(1053)
		sMorePathsError3 = GetResText(1054)
		sConvertError1 = GetResText(1055)
		sConvertError2 = GetResText(1056)
		sRTErrorDesc = GetResText(1057)
		sRTErrorHeader = GetResText(1058)
		sOverwriteallFiles = GetResText(1070)
		sReeditMacro = GetResText(1071)
		scouldnotsaveDocument = GetResText(1072)		
		scouldnotopenDocument = GetResText(1073)
		sPathDialogMessage = GetResText(1080)
		sTitle = GetResText(1081)

		sProgressPage_1 = GetResText(1090)
		sProgressPage_2 = GetResText(1091)
		sProgressPage_3 = GetResText(1092)
		sProgressFound = GetResText(1093)
		sProgressPage_5 = GetResText(1094)
		sReady = GetResText(1100)
		sSourceDocuments = GetResText(2030)
		sTargetDocuments = GetResText(2031)
		sLogSummary = GetResText(2034)
		sSumInclusiveSubDir = GetResText(3000)
		sSumSaveDocuments = GetResText(3001)
		&apos;StarOffice Applicationnames
		GetApplResourceArray(3100, 4, sSumSODocuments())
		GetApplResourceArray(3110, 4, sSumSOTemplates())
		GetApplResourceArray(3200, 3, sSumMSDocuments())
		GetApplResourceArray(3210, 3, sSumMSTemplates())
		With ImportDialog
			sImportLabel = GetResText(1033)
			sExportLabel = GetResText(1034)
			sSearchInSubDir = GetResText(1022)
			.chkTemplateSearchSubDir.Label = sSearchInSubDir
			.lblDocumentImport.Label = sImportLabel
			.lblDocumentExport.Label = sExportLabel
			.chkDocumentSearchSubDir.Label = sSearchInSubDir
			.lblTemplateImport.Label = sImportLabel
			.lblTemplateExport.Label = sExportLabel
			.chkLogfile.Label = GetResText(2032)
			.chkLogfile.Helptext = GetResText(2033)
			Dim Blabla as String
			blabla = GetResText(1072)
			.cmdShowLogFile.Label = GetResText(2035)
		End With
		ModuleList(0) = &quot;com.sun.star.text.TextDocument&quot;
		ModuleList(1) = &quot;com.sun.star.sheet.SpreadsheetDocument&quot;
		ModuleList(2) = &quot;com.sun.star.drawing.DrawingDocument/com.sun.star.presentation.PresentationDocument&quot;
		ModuleList(3) = &quot;com.sun.star.formula.FormulaProperties/com.sun.star.text.GlobalDocument&quot;
	End If
End Sub


Sub GetApplResourceArray(StartResIndex as Integer, Count as Integer, BigArray())
Dim i as Integer
Dim a as Integer
	a = 0
	For i = StartResIndex To StartResIndex + Count-1
		BigArray(a) = GetResText(i)
		a = a + 1
	Next			
End Sub
</script:module>
