<?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; OpenOffice 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;OpenOffice&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;OpenOffice 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>
