<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="SF_Root" script:language="StarBasic" script:moduleType="normal">REM =======================================================================================================================
REM ===			The ScriptForge library and its associated libraries are part of the LibreOffice project.				===
REM ===					Full documentation is available on https://help.libreoffice.org/								===
REM =======================================================================================================================

Option Compatible
Option ClassModule
Option Private Module

Option Explicit

&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;
&apos;&apos;&apos;	SF_Root
&apos;&apos;&apos;	=======
&apos;&apos;&apos;		FOR INTERNAL USE ONLY
&apos;&apos;&apos;		Singleton class holding all persistent variables shared
&apos;&apos;&apos;			by all the modules of the ScriptForge library
&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;

REM ============================================================= PRIVATE MEMBERS

&apos;	Internals
Private [Me]				As Object
Private [_Parent]			As Object
Private ObjectType			As String	&apos; Must be &quot;ROOT&quot;
Private MainFunction		As String	&apos; Name of method or property called by user script
Private MainFunctionArgs	As String	&apos; Syntax of method called by user script
Private StackLevel			As Integer	&apos; Depth of calls between internal methods

&apos;	Error management
Private ErrorHandler		As Boolean	&apos; True = error handling active, False = internal debugging
Private ConsoleLines()		As Variant	&apos; Array of messages displayable in console
Private ConsoleDialog		As Object	&apos; SFDialogs.Dialog object
Private ConsoleControl		As Object	&apos; SFDialogs.DialogControl object
Private ReportScriptErrors	As Boolean	&apos; When True, error messages are displayed to the user
Private StopWhenError		As Boolean	&apos; When True, process stops after error &gt; &quot;WARNING&quot;
Private ReturnCode			As String	&apos; The short error code
Private ReturnCodeDescription As String	&apos;	The long and localized error message
Private TriggeredByPython	As Boolean	&apos; When True, the actual user script is a Python script
Private DebugMode			As Boolean	&apos; When True, log enter/exit each official Sub

&apos;	Progress and status bars
Private ProgressBarDialog	As Object	&apos; SFDialogs.Dialog object
Private ProgressBarText		As Object	&apos; SFDialogs.DialogControl object
Private ProgressBarBar		As Object	&apos; SFDialogs.DialogControl object
Private Statusbar			As Object

&apos;	Services management
Private ServicesList		As Variant	&apos; Dictionary of provided services

&apos;	Usual UNO services
Private FunctionAccess		As Object	&apos; com.sun.star.sheet.FunctionAccess
Private PathSettings		As Object	&apos; com.sun.star.util.PathSettings
Private PathSubstitution	As Object	&apos; com.sun.star.util.PathSubstitution
Private ScriptProvider		As Object	&apos; com.sun.star.script.provider.MasterScriptProviderFactory
Private SystemShellExecute	As Object	&apos; com.sun.star.system.SystemShellExecute
Private CoreReflection		As Object	&apos; com.sun.star.reflection.CoreReflection
Private DispatchHelper		As Object	&apos; com.sun.star.frame.DispatchHelper
Private TextSearch			As Object	&apos; com.sun.star.util.TextSearch
Private SearchOptions		As Object	&apos; com.sun.star.util.SearchOptions
Private SystemLocale		As Object	&apos; com.sun.star.lang.Locale
Private OfficeLocale		As Object	&apos; com.sun.star.lang.Locale
Private FormatLocale		As Object	&apos; com.sun.star.lang.Locale
Private LocaleData			As Object	&apos; com.sun.star.i18n.LocaleData
Private CalendarImpl		As Object	&apos; com.sun.star.i18n.CalendarImpl
Private Number2Text			As Object	&apos; com.sun.star.linguistic2.NumberText
Private PrinterServer		As Object	&apos; com.sun.star.awt.PrinterServer
Private CharacterClass		As Object	&apos; com.sun.star.i18n.CharacterClassification
Private FileAccess			As Object	&apos; com.sun.star.ucb.SimpleFileAccess
Private FilterFactory		As Object	&apos; com.sun.star.document.FilterFactory
Private URLTransformer		As Object	&apos; com.sun.star.util.URLTransformer
Private Introspection		As Object	&apos; com.sun.star.beans.Introspection
Private BrowseNodeFactory	As Object	&apos; com.sun.star.script.browse.BrowseNodeFactory
Private DatabaseContext		As Object	&apos; com.sun.star.sdb.DatabaseContext
Private ConfigurationProvider _
							As Object	&apos; com.sun.star.configuration.ConfigurationProvider
Private PackageProvider		As Object	&apos; com.sun.star.comp.deployment.PackageInformationProvider
Private MailService			As Object	&apos; com.sun.star.system.SimpleCommandMail or com.sun.star.system.SimpleSystemMail
Private GraphicExportFilter	As Object	&apos; com.sun.star.drawing.GraphicExportFilter
Private GraphicProvider		As Object	&apos; com.sun.star.graphic.GraphicProvider
Private Toolkit				As Object	&apos; com.sun.star.awt.Toolkit
Private ModuleUIConfigurationManagerSupplier _
							As Object	&apos; com.sun.star.ui.ModuleUIConfigurationManagerSupplier
Private TransientDocument	As Object	&apos; com.sun.star.frame.TransientDocumentsDocumentContentFactory

&apos;	Specific persistent services objects or properties
Private FileSystemNaming	As String	&apos; If &quot;SYS&quot;, file and folder naming is based on operating system notation
Private PythonHelper		As String	&apos; File name of Python helper functions (stored in $(inst)/share/Scripts/python)
Private PythonHelper2		As String	&apos; Alternate Python helper file name for test purposes
Private LocalizedInterface	As Object	&apos; ScriptForge own L10N service
Private OSName				As String	&apos; WIN, LINUX, MACOS
Private SFDialogs			As Variant	&apos; Persistent storage for the SFDialogs library
Private SFForms				As Variant	&apos; Persistent storage for the SF_Form class in the SFDocuments library
Private PythonStorage		As Variant	&apos; Persistent storage for the objects created and processed in Python
Private PythonPermanent		As Long		&apos; Number of permanent entries in PythonStorage containing standard module objects
Private GlobalStorage		As Object	&apos; Dictionary of storage shared between Basic and Python

REM ====================================================== CONSTRUCTOR/DESTRUCTOR

REM -----------------------------------------------------------------------------
Private Sub Class_Initialize()
	Set [Me] = Nothing
	Set [_Parent] = Nothing
	ObjectType = &quot;ROOT&quot;
	MainFunction = &quot;&quot;
	MainFunctionArgs = &quot;&quot;
	StackLevel = 0
	ErrorHandler = True
	ConsoleLines = Array()
	Set ConsoleDialog = Nothing
	Set ConsoleControl = Nothing
	ReportScriptErrors = True
	StopWhenError = True
	ReturnCode = &quot;&quot;
	ReturnCodeDescription = &quot;&quot;
	TriggeredByPython = False
	DebugMode = False
	Set ProgressBarDialog = Nothing
	Set ProgressBarText = Nothing
	Set progressBarBar = Nothing
	Set Statusbar = Nothing
	ServicesList = Empty
	Set FunctionAccess = Nothing
	Set PathSettings = Nothing
	Set PathSubstitution = Nothing
	Set ScriptProvider = Nothing
	Set SystemShellExecute = Nothing
	Set CoreReflection = Nothing
	Set DispatchHelper = Nothing
	Set TextSearch = Nothing
	Set SearchOptions = Nothing
	Set SystemLocale = Nothing
	Set OfficeLocale = Nothing
	Set FormatLocale = Nothing
	Set LocaleData = Nothing
	Set CalendarImpl = Nothing
	Set Number2Text = Nothing
	Set PrinterServer = Nothing
	Set CharacterClass = Nothing
	Set FileAccess = Nothing
	Set FilterFactory = Nothing
	Set URLTransformer = Nothing
	Set Introspection = Nothing
	FileSystemNaming = &quot;ANY&quot;
	PythonHelper = &quot;ScriptForgeHelper.py&quot;
	PythonHelper2 = &quot;&quot;
	Set LocalizedInterface = Nothing
	Set BrowseNodeFactory = Nothing
	Set DatabaseContext = Nothing
	Set ConfigurationProvider = Nothing
	Set PackageProvider = Nothing
	Set MailService = Nothing
	Set GraphicExportFilter = Nothing
	Set GraphicProvider = Nothing
	Set Toolkit = Nothing
	Set ModuleUIConfigurationManagerSupplier = Nothing
	Set TransientDocument = Nothing
	OSName = &quot;&quot;
	SFDialogs = Empty
	SFForms = Empty
	PythonStorage = Empty
	PythonPermanent = -1
	Set GlobalStorage = Nothing
End Sub		&apos;	ScriptForge.SF_Root Constructor

REM -----------------------------------------------------------------------------
Private Sub Class_Terminate()
	Call Class_Initialize()
End Sub		&apos;	ScriptForge.SF_Root Destructor

REM -----------------------------------------------------------------------------
Public Function Dispose() As Variant
	Call Class_Terminate()
	Set Dispose = Nothing
End Function	&apos;	ScriptForge.SF_Root Explicit destructor

REM =========================================================== PRIVATE FUNCTIONS

REM -----------------------------------------------------------------------------
Public Sub _AddToConsole(ByVal psLine As String)
&apos;&apos;&apos;	Add a new line to the console
&apos;&apos;&apos;	TAB characters are expanded before the insertion of the line
&apos;&apos;&apos;	NB: Array redimensioning of a member of an object must be done in the class module
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		psLine: the line to add

Dim lConsole As Long		&apos;	UBound of ConsoleLines
Dim sLine As String			&apos;	Alias of psLine

	&apos;	Resize ConsoleLines
	lConsole = UBound(ConsoleLines)
	If lConsole &lt; 0 Then
		ReDim ConsoleLines(0)
	Else
		ReDim Preserve ConsoleLines(0 To lConsole + 1)
	End If

	&apos;	Add a timestamp to the line and insert it (without date)
	sLine = Mid(SF_Utils._Repr(Now()), 12) &amp; &quot; -&gt; &quot; &amp; psLine
	ConsoleLines(lConsole + 1) = sLine

	&apos;	Add the new line to the actual (probably non-modal) console, if active
	If Not IsNull(ConsoleDialog) Then
		If ConsoleDialog._IsStillAlive(False) Then	&apos;	False to not raise an error
			If IsNull(ConsoleControl) Then Set ConsoleControl = ConsoleDialog.Controls(SF_Exception.CONSOLENAME)	&apos;	Should not happen ...
			ConsoleControl.WriteLine(sLine)
		End If
	End If

End Sub		&apos;	ScriptForge.SF_Root._AddToConsole

REM -----------------------------------------------------------------------------
Public Function _AddToPythonStorage(ByRef poObject As Object) As Long
&apos;&apos;&apos;	Insert a newly created object in the Python persistent storage
&apos;&apos;&apos;	and return the index of the used entry
&apos;&apos;&apos;	The persistent storage is a simple array of objects
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		poObject: the object to insert

Dim lIndex As Long			&apos;	Return value
Dim lSize As Long			&apos;	UBound of the persistent storage
Dim i As Long

Check:
	lIndex = -1
	If IsNull(poObject) Then Exit Function
	On Local Error GoTo Finally
	lSize = UBound(PythonStorage)

Try:
	&apos;	Can an empty entry be reused ?
	For i = PythonPermanent + 1 To lSize
		If IsNull(PythonStorage(i)) Then
			lIndex = i
			Exit For
		End If
	Next i

	&apos;	Resize Python storage if no empty space
	If lIndex &lt; 0 Then
		lSize = lSize + 1
		ReDim Preserve PythonStorage(0 To lSize)
		lIndex = lSize
	End If

	&apos;	Insert new object
	Set PythonStorage(lIndex) = poObject

Finally:
	_AddToPythonStorage = lIndex
	Exit Function
End Function	&apos;	ScriptForge.SF_Root._AddToPythonStorage

REM ------------------------------------------------------------------------------
Public Function _GetLocalizedInterface() As Object
&apos;&apos;&apos;	Returns the LN object instance related to the ScriptForge internal localization
&apos;&apos;&apos;	If not yet done, load it from the shipped po files
&apos;&apos;&apos;	Makes that the localized user interface is loaded only when needed

Try:
	If IsNull(LocalizedInterface) Then _LoadLocalizedInterface()

Finally:
	Set _GetLocalizedInterface = LocalizedInterface
	Exit Function
End Function	&apos;	ScriptForge.SF_Root._GetLocalizedInterface

REM -----------------------------------------------------------------------------
Public Sub _InitPythonStorage()
&apos;&apos;&apos;	Make PythonStorage an array
&apos;&apos;&apos;	In prevision to an abundant use of those objects in Python, hardcode to optimize the performance and memory :
&apos;&apos;&apos;	Initialize the first entries with the standard module objects located in the ScriptForge library

Try:
	If Not IsArray(PythonStorage) Then
		PythonPermanent = 9
		PythonStorage = Array()
		ReDim PythonStorage(0 To PythonPermanent)
		&apos;	Initialize each entry
		PythonStorage(0) = ScriptForge.SF_Array
		PythonStorage(1) = ScriptForge.SF_Exception
		PythonStorage(2) = ScriptForge.SF_FileSystem
		PythonStorage(3) = ScriptForge.SF_Platform
		PythonStorage(4) = ScriptForge.SF_Region
		PythonStorage(5) = ScriptForge.SF_Services
		PythonStorage(6) = ScriptForge.SF_Session
		PythonStorage(7) = ScriptForge.SF_SharedMemory
		PythonStorage(8) = ScriptForge.SF_String
		PythonStorage(9) = ScriptForge.SF_UI
	End If

Finally:
	Exit Sub
End Sub		&apos;	ScriptForge.SF_Root._InitPythonStorage

REM -----------------------------------------------------------------------------
Public Sub _LoadLocalizedInterface(Optional ByVal psMode As String)
&apos;&apos;&apos;	Build the user interface in a persistent L10N object
&apos;&apos;&apos;	Executed - only once - at first request of a label inside the LocalizedInterface dictionary
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;		psMode:	ADDTEXT =&gt;	the (english) labels are loaded from code below
&apos;&apos;&apos;				POFILE  =&gt;	the localized labels are loaded from a PO file
&apos;&apos;&apos;							the name of the file is &quot;la.po&quot; where la = language part of locale
&apos;&apos;&apos;							(fallback to ADDTEXT mode if file does not exist)

Dim sInstallFolder As String		&apos;	ScriptForge installation directory
Dim sPOFolder As String				&apos;	Folder containing the PO files
Dim sPOFile As String				&apos;	PO File to load
Dim sLocale As String				&apos;	Locale

	If ErrorHandler Then On Local Error GoTo Catch

Try:
	&apos;TODO: Modify default value
	If IsMissing(psMode) Then psMode = &quot;POFILE&quot;

	If psMode = &quot;POFILE&quot; Then		&apos;	Use this mode in production
		&apos;	Build the po file name
		With SF_FileSystem
			sInstallFolder = ._SFInstallFolder()	&apos;	ScriptForge installation folder
			sLocale = SF_Utils._GetUNOService(&quot;OfficeLocale&quot;).Language
			sPOFolder = .BuildPath(sInstallFolder, &quot;po&quot;)
			sPOFile = .BuildPath(sPOFolder, sLocale &amp; &quot;.po&quot;)
			If sLocale = &quot;en&quot; Then					&apos;	LocalizedInterface loaded by code i.o. read from po file
				psMode = &quot;ADDTEXT&quot;
			ElseIf Not .FileExists(sPOFile) Then	&apos;	File not found =&gt; load texts from code below
				psMode = &quot;ADDTEXT&quot;
			Else
				Set LocalizedInterface = CreateScriptService(&quot;L10N&quot;, sPOFolder, sLocale)
			End If
		End With
	End If

	If psMode = &quot;ADDTEXT&quot; Then		&apos;	Use this mode in development to prepare a new POT file
		Set LocalizedInterface = CreateScriptService(&quot;L10N&quot;)
		With LocalizedInterface
	&apos;	SF_Exception.Raise
			.AddText(	Context := &quot;ERRORNUMBER&quot; _
						, MsgId := &quot;Error %1&quot; _
						, Comment :=	&quot;Title in error message box\n&quot; _
									&amp;	&quot;%1: an error number&quot; _
					)
			.AddText(	Context := &quot;ERRORLOCATION&quot; _
						, MsgId := &quot;Location : %1&quot; _
						, Comment :=	&quot;Error message box\n&quot; _
									&amp;	&quot;%1: a line number&quot; _
					)
			.AddText(	Context := &quot;LONGERRORDESC&quot; _
						, MsgId := &quot;Error %1 - Location = %2 - Description = %3&quot; _
						, Comment :=	&quot;Logfile record&quot; _
					)
			.AddText(	Context := &quot;STOPEXECUTION&quot; _
						, MsgId := &quot;THE EXECUTION IS CANCELLED.&quot; _
						, Comment :=	&quot;Any blocking error message&quot; _
					)
			.AddText(	Context := &quot;NEEDMOREHELP&quot; _
						, MsgId := &quot;Do you want to receive more information about the &apos;%1&apos; method ?&quot; _
						, Comment :=	&quot;Any blocking error message\n&quot; _
									&amp;	&quot;%1: a method name&quot; _
					)
	&apos;	SF_Exception.RaiseAbort
			.AddText(	Context := &quot;INTERNALERROR&quot; _
						, MsgId := &quot;The ScriptForge library has crashed. The reason is unknown.\n&quot; _
									&amp; &quot;Maybe a bug that could be reported on\n&quot; _
									&amp; &quot;\thttps://bugs.documentfoundation.org/\n\n&quot; _
									&amp; &quot;More details : \n\n&quot; _
						, Comment :=	&quot;SF_Exception.RaiseAbort error message&quot; _
					)
	&apos;	SF_Utils._Validate
			.AddText(	Context := &quot;VALIDATESOURCE&quot; _
						, MsgId := &quot;Library : \t%1\nService : \t%2\nMethod : \t%3&quot; _
						, Comment :=	&quot;SF_Utils._Validate error message\n&quot; _
									&amp;	&quot;%1: probably ScriptForge\n&quot; _
									&amp;	&quot;%2: service or module name\n&quot; _
									&amp;	&quot;%3: property or method name where the error occurred&quot; _
					)
			.AddText(	Context := &quot;VALIDATEARGS&quot; _
						, MsgId := &quot;Arguments: %1&quot; _
						, Comment :=	&quot;SF_Utils._Validate error message\n&quot; _
									&amp;	&quot;%1: list of arguments of the method&quot; _
					)
			.AddText(	Context := &quot;VALIDATEERROR&quot; _
						, MsgId := &quot;A serious error has been detected in your code on argument : « %1 ».&quot; _
						, Comment :=	&quot;SF_Utils._Validate error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name&quot; _
					)
			.AddText(	Context := &quot;VALIDATIONRULES&quot; _
						, MsgId := &quot;\tValidation rules :&quot;, Comment := &quot;SF_Utils.Validate error message&quot; _
					)
			.AddText(	Context := &quot;VALIDATETYPES&quot; _
						, MsgId := &quot;\t\t« %1 » must have next type (or one of next types) : %2&quot; _
						, Comment :=	&quot;SF_Utils._Validate error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name\n&quot; _
									&amp;	&quot;%2: Comma separated list of allowed types&quot; _
					)
			.AddText(	Context := &quot;VALIDATEVALUES&quot; _
						, MsgId := &quot;\t\t« %1 » must contain one of next values : %2&quot; _
						, Comment :=	&quot;SF_Utils._Validate error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name\n&quot; _
									&amp;	&quot;%2: Comma separated list of allowed values&quot; _
					)
			.AddText(	Context := &quot;VALIDATECLASS&quot; _
						, MsgId := &quot;\t\t« %1 » must be a Basic object of class : %2&quot; _
						, Comment :=	&quot;SF_Utils._Validate error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name\n&quot; _
									&amp;	&quot;%2: The name of a Basic class&quot; _
					)
			.AddText(	Context := &quot;VALIDATEACTUAL&quot; _
						, MsgId := &quot;The actual value of « %1 » is : &apos;%2&apos;&quot; _
						, Comment :=	&quot;SF_Utils._Validate error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name\n&quot; _
									&amp;	&quot;%2: The value of the argument as a string&quot; _
					)
			.AddText(	Context := &quot;VALIDATEMISSING&quot; _
						, MsgId := &quot;The « %1 » argument is mandatory, yet it is missing.&quot; _
						, Comment :=	&quot;SF_Utils._Validate error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name&quot; _
					)
	&apos;	SF_Utils._ValidateArray
			.AddText(	Context := &quot;VALIDATEARRAY&quot; _
						, MsgId := &quot;\t\t« %1 » must be an array.&quot; _
						, Comment :=	&quot;SF_Utils._ValidateArray error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name&quot; _
					)
			.AddText(	Context := &quot;VALIDATEDIMS&quot; _
						, MsgId := &quot;\t\t« %1 » must have exactly %2 dimension(s).&quot; _
						, Comment :=	&quot;SF_Utils._ValidateArray error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name\n&quot; _
									&amp;	&quot;%2: Number of dimensions of the array&quot; _
					)
			.AddText(	Context := &quot;VALIDATEALLTYPES&quot; _
						, MsgId := &quot;\t\t« %1 » must have all elements of the same type : %2&quot; _
						, Comment :=	&quot;SF_Utils._ValidateArray error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name\n&quot; _
									&amp;	&quot;%2: Either one single type or &apos;String, Date, Numeric&apos;&quot; _
					)
			.AddText(	Context := &quot;VALIDATENOTNULL&quot; _
						, MsgId := &quot;\t\t« %1 » must not contain any NULL or EMPTY elements.&quot; _
						, Comment :=	&quot;SF_Utils._ValidateArray error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name\n&quot; _
									&amp;	&quot;NULL and EMPTY should not be translated&quot; _
					)
	&apos;	SF_Utils._ValidateFile
			.AddText(	Context := &quot;VALIDATEFILE&quot; _
						, MsgId := &quot;\t\t« %1 » must be of type String.&quot; _
						, Comment :=	&quot;SF_Utils._ValidateFile error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name\n&quot; _
									&amp;	&quot;&apos;String&apos; should not be translated&quot; _
					)
			.AddText(	Context := &quot;VALIDATEFILESYS&quot; _
						, MsgId := &quot;\t\t« %1 » must be a valid file or folder name expressed in the operating system native notation.&quot; _
						, Comment :=	&quot;SF_Utils._ValidateFile error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name&quot; _
					)
			.AddText(	Context := &quot;VALIDATEFILEURL&quot; _
						, MsgId := &quot;\t\t« %1 » must be a valid file or folder name expressed in the portable URL notation.&quot; _
						, Comment :=	&quot;SF_Utils._ValidateFile error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name\n&quot; _
									&amp;	&quot;&apos;URL&apos; should not be translated&quot; _
					)
			.AddText(	Context := &quot;VALIDATEFILEANY&quot; _
						, MsgId := &quot;\t\t« %1 » must be a valid file or folder name.&quot; _
						, Comment :=	&quot;SF_Utils._ValidateFile error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name&quot; _
					)
			.AddText(	Context := &quot;VALIDATEWILDCARD&quot; _
						, MsgId := &quot;\t\t« %1 » may contain one or more wildcard characters (?, *) in its last path component only.&quot; _
						, Comment :=	&quot;SF_Utils._ValidateFile error message\n&quot; _
									&amp;	&quot;%1: Wrong argument name\n&quot; _
									&amp;	&quot;&apos;(?, *)&apos; is to be left as is&quot; _
					)
	&apos;	SF_Array.RangeInit
			.AddText(	Context := &quot;ARRAYSEQUENCE&quot; _
						, MsgId := &quot;The respective values of &apos;From&apos;, &apos;UpTo&apos; and &apos;ByStep&apos; are incoherent.\n\n&quot; _
									&amp; &quot;\t« From » = %1\n&quot; _
									&amp; &quot;\t« UpTo » = %2\n&quot; _
									&amp; &quot;\t« ByStep » = %3&quot; _
						, Comment :=	&quot;SF_Array.RangeInit error message\n&quot; _
									&amp;	&quot;%1, %2, %3: Numeric values\n&quot; _
									&amp;	&quot;&apos;From&apos;, &apos;UpTo&apos;, &apos;ByStep&apos; should not be translated&quot; _
					)
	&apos;	SF_Array.AppendColumn, AppendRow, PrependColumn, PrependRow
			.AddText(	Context := &quot;ARRAYINSERT&quot; _
						, MsgId := &quot;The array and the vector to insert have incompatible sizes.\n\n&quot; _
									&amp; &quot;\t« Array_2D » = %2\n&quot; _
									&amp; &quot;\t« %1 » = %3&quot; _
						, Comment :=	&quot;SF_Array.AppendColumn (...) error message\n&quot; _
									&amp;	&quot;%1: &apos;Column&apos; or &apos;Row&apos; of a matrix\n&quot; _
									&amp;	&quot;%2, %3: array contents\n&quot; _
									&amp;	&quot;&apos;Array_2D&apos; should not be translated&quot; _
					)
	&apos;	SF_Array.ExtractColumn, ExtractRow
			.AddText(	Context := &quot;ARRAYINDEX1&quot; _
						, MsgId := &quot;The given index does not fit within the bounds of the array.\n\n&quot; _
									&amp; &quot;\t« Array_2D » = %2\n&quot; _
									&amp; &quot;\t« %1 » = %3&quot; _
						, Comment :=	&quot;SF_Array.ExtractColumn (...) error message\n&quot; _
									&amp;	&quot;%1: &apos;Column&apos; or &apos;Row&apos; of a matrix\n&quot; _
									&amp;	&quot;%2, %3: array contents\n&quot; _
									&amp;	&quot;&apos;Array_2D&apos; should not be translated&quot; _
					)
	&apos;	SF_Array.ExtractColumn, ExtractRow
			.AddText(	Context := &quot;ARRAYINDEX2&quot; _
						, MsgId := &quot;The given slice limits do not fit within the bounds of the array.\n\n&quot; _
									&amp; &quot;\t« Array_1D » = %1\n&quot; _
									&amp; &quot;\t« From »     = %2\n&quot; _
									&amp; &quot;\t« UpTo »     = %3&quot; _
						, Comment :=	&quot;SF_Array.ExtractColumn (...) error message\n&quot; _
									&amp;	&quot;%1: &apos;Column&apos; or &apos;Row&apos; of a matrix\n&quot; _
									&amp;	&quot;%2, %3: array contents\n&quot; _
									&amp;	&quot;&apos;Array_1D&apos;, &apos;From&apos; and &apos;UpTo&apos; should not be translated&quot; _
					)
	&apos;	SF_Array.ImportFromCSVFile
			.AddText(	Context := &quot;CSVPARSING&quot; _
						, MsgId := &quot;The given file could not be parsed as a valid CSV file.\n\n&quot; _
									&amp; &quot;\t« File name »   = %1\n&quot; _
									&amp; &quot;\tLine number     = %2\n&quot; _
									&amp; &quot;\tContent         = %3&quot; _
						, Comment :=	&quot;SF_Array.ImportFromCSVFile error message\n&quot; _
									&amp;	&quot;%1: a file name\n&quot; _
									&amp;	&quot;%2: numeric\n&quot; _
									&amp;	&quot;%3: a long string&quot; _
					)
	&apos;	SF_Dictionary.Add/ReplaceKey
			.AddText(	Context := &quot;DUPLICATEKEY&quot; _
						, MsgId := &quot;The insertion of a new key &quot; _
									&amp; &quot;into a dictionary failed because the key already exists.\n&quot; _
									&amp; &quot;Note that the comparison between keys is NOT case-sensitive.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_Dictionary Add/ReplaceKey error message\n&quot; _
									&amp;	&quot;%1: An identifier&quot; _
									&amp;	&quot;%2: a (potentially long) string&quot; _
					)
	&apos;	SF_Dictionary.Remove/ReplaceKey/ReplaceItem
			.AddText(	Context := &quot;UNKNOWNKEY&quot; _
						, MsgId := &quot;The requested key does not exist in the dictionary.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_Dictionary Remove/ReplaceKey/ReplaceItem error message\n&quot; _
									&amp;	&quot;%1: An identifier&quot; _
									&amp;	&quot;%2: a (potentially long) string&quot; _
					)
	&apos;	SF_Dictionary.Add/ReplaceKey
			.AddText(	Context := &quot;INVALIDKEY&quot; _
						, MsgId := &quot;The insertion or the update of an entry &quot; _
									&amp; &quot;into a dictionary failed because the given key contains only spaces.&quot; _
						, Comment :=	&quot;SF_Dictionary Add/ReplaceKey error message\n&quot; _
					)
	&apos;	SF_FileSystem.CopyFile/MoveFile/DeleteFile/CreateScriptService(&quot;L10N&quot;)
			.AddText(	Context := &quot;UNKNOWNFILE&quot; _
						, MsgId := &quot;The given file could not be found on your system.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_FileSystem copy/move/delete error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file name&quot; _
					)
	&apos;	SF_FileSystem.CopyFolder/MoveFolder/DeleteFolder/Files/SubFolders
			.AddText(	Context := &quot;UNKNOWNFOLDER&quot; _
						, MsgId := &quot;The given folder could not be found on your system.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_FileSystem copy/move/delete error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A folder name&quot; _
					)
	&apos;	SF_FileSystem.CopyFile/MoveFolder/DeleteFile
			.AddText(	Context := &quot;NOTAFILE&quot; _
						, MsgId := &quot;« %1 » contains the name of an existing folder, not that of a file.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_FileSystem copy/move/delete error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file name&quot; _
					)
	&apos;	SF_FileSystem.CopyFolder/MoveFolder/DeleteFolder/Files/SubFolders
			.AddText(	Context := &quot;NOTAFOLDER&quot; _
						, MsgId := &quot;« %1 » contains the name of an existing file, not that of a folder.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_FileSystem copy/move/delete error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A folder name&quot; _
					)
	&apos;	SF_FileSystem.Copy+Move/File+Folder/CreateTextFile/OpenTextFile
			.AddText(	Context := &quot;OVERWRITE&quot; _
						, MsgId := &quot;You tried to create a new file which already exists. Overwriting it has been rejected.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_FileSystem copy/move/... error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file name&quot; _
					)
	&apos;	SF_FileSystem.Copy+Move+Delete/File+Folder
			.AddText(	Context := &quot;READONLY&quot; _
						, MsgId := &quot;Copying or moving a file to a destination which has its read-only attribute set, or deleting such a file or folder is forbidden.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_FileSystem copy/move/delete error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file name&quot; _
					)
	&apos;	SF_FileSystem.Copy+Move+Delete/File+Folder
			.AddText(	Context := &quot;NOFILEMATCH&quot; _
						, MsgId := &quot;When « %1 » contains wildcards. at least one file or folder must match the given filter. Otherwise the operation is rejected.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_FileSystem copy/move/delete error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file or folder name with wildcards&quot; _
					)
	&apos;	SF_FileSystem.CreateFolder
			.AddText(	Context := &quot;FOLDERCREATION&quot; _
						, MsgId := &quot;« %1 » contains the name of an existing file or an existing folder. The operation is rejected.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_FileSystem CreateFolder error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file or folder name&quot; _
					)
	&apos;	SF_FileSystem.Any
			.AddText(	Context := &quot;FILESYSTEM&quot; _
						, MsgId := &quot;The method « %2 » is not applicable on a document&apos;s internal file system.\n\n&quot; _
									&amp; &quot;« %1 » = &apos;%3&apos;&quot; _
						, Comment :=	&quot;SF_FileSystem not supported method error message\n&quot; _
									&amp;	&quot;%1: A method name\n&quot; _
									&amp;	&quot;%2: An identifier\n&quot; _
									&amp;	&quot;%3: A file or folder name&quot; _
					)
	&apos;	SF_Services.CreateScriptService
			.AddText(	Context := &quot;UNKNOWNSERVICE&quot; _
						, MsgId := &quot;No service named &apos;%4&apos; has been registered for the library &apos;%3&apos;.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_Services.CreateScriptService error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: A Basic library name\n&quot; _
									&amp;	&quot;%4: A service (1 word) name&quot; _
					)
	&apos;	SF_Services.CreateScriptService
			.AddText(	Context := &quot;SERVICESNOTLOADED&quot; _
						, MsgId := &quot;The library &apos;%3&apos; and its services could not been loaded.\n&quot; _
									&amp; &quot;The reason is unknown.\n&quot; _
									&amp; &quot;However, checking the &apos;%3.SF_Services.RegisterScriptServices()&apos; function and its return value can be a good starting point.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_Services.CreateScriptService error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: A Basic library name&quot; _
					)
	&apos;	SF_Session.ExecuteCalcFunction
			.AddText(	Context := &quot;CALCFUNC&quot; _
						, MsgId := &quot;The Calc &apos;%1&apos; function encountered an error. Either the given function does not exist or its arguments are invalid.&quot; _
						, Comment :=	&quot;SF_Session.ExecuteCalcFunction error message\n&quot; _
									&amp;	&quot;&apos;Calc&apos; should not be translated&quot; _
					)
	&apos;	SF_Session._GetScript
			.AddText(	Context := &quot;NOSCRIPT&quot; _
						, MsgId := &quot;The requested %1 script could not be located in the given libraries and modules.\n&quot; _
									&amp; &quot;« %2 » = %3\n&quot; _
									&amp; &quot;« %4 » = %5&quot; _
						, Comment :=	&quot;SF_Session._GetScript error message\n&quot; _
									&amp;	&quot;%1: &apos;Basic&apos; or &apos;Python&apos;\n&quot; _
									&amp;	&quot;%2: An identifier\n&quot; _
									&amp;	&quot;%3: A string\n&quot; _
									&amp;	&quot;%4: An identifier\n&quot; _
									&amp;	&quot;%5: A string&quot; _
					)
	&apos;	SF_Session.ExecuteBasicScript
			.AddText(	Context := &quot;SCRIPTEXEC&quot; _
						, MsgId := &quot;An exception occurred during the execution of the Basic script.\n&quot; _
									&amp; &quot;Cause: %3\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_Session.ExecuteBasicScript error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: A (long) string&quot; _
					)
	&apos;	SF_Session.SendMail
			.AddText(	Context := &quot;WRONGEMAIL&quot; _
						, MsgId := &quot;One of the email addresses has been found invalid.\n&quot; _
									&amp; &quot;Invalid mail = « %1 »&quot; _
						, Comment :=	&quot;SF_Session.SendMail error message\n&quot; _
									&amp;	&quot;%1 = a mail address&quot; _
					)
	&apos;	SF_Session.SendMail
			.AddText(	Context := &quot;SENDMAIL&quot; _
						, MsgId := &quot;The message could not be sent due to a system error.\n&quot; _
									&amp; &quot;A possible cause is that LibreOffice could not find any mail client.&quot; _
						, Comment :=	&quot;SF_Session.SendMail error message&quot; _
					)
	&apos;	SF_TextStream._IsFileOpen
			.AddText(	Context := &quot;FILENOTOPEN&quot; _
						, MsgId := &quot;The requested file operation could not be executed because the file was closed previously.\n\n&quot; _
									&amp; &quot;File name = &apos;%1&apos;&quot; _
						, Comment :=	&quot;SF_TextStream._IsFileOpen error message\n&quot; _
									&amp;	&quot;%1: A file name&quot; _
					)
	&apos;	SF_TextStream._IsFileOpen
			.AddText(	Context := &quot;FILEOPENMODE&quot; _
						, MsgId := &quot;The requested file operation could not be executed because it is incompatible with the mode in which the file was opened.\n\n&quot; _
									&amp; &quot;File name = &apos;%1&apos;\n&quot; _
									&amp; &quot;Open mode = %2&quot; _
						, Comment :=	&quot;SF_TextStream._IsFileOpen error message\n&quot; _
									&amp;	&quot;%1: A file name\n&quot; _
									&amp;	&quot;%2: READ, WRITE or APPEND&quot; _
					)
	&apos;	SF_TextStream.ReadLine, ReadAll, SkipLine
			.AddText(	Context := &quot;ENDOFFILE&quot; _
						, MsgId := &quot;The requested file read operation could not be completed because an unexpected end-of-file was encountered.\n\n&quot; _
									&amp; &quot;File name = &apos;%1&apos;&quot; _
						, Comment :=	&quot;SF_TextStream.ReadLine/ReadAll/SkipLine error message\n&quot; _
									&amp;	&quot;%1: A file name&quot; _
					)
	&apos;	SF_UI.Document
			.AddText(	Context := &quot;DOCUMENT&quot; _
						, MsgId := &quot;The requested document could not be found.\n\n&quot; _
									&amp; &quot;%1 = &apos;%2&apos;&quot; _
						, Comment :=	&quot;SF_UI.GetDocument error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string&quot; _
					)
	&apos;	SF_UI.Create
			.AddText(	Context := &quot;DOCUMENTCREATION&quot; _
						, MsgId := &quot;The creation of a new document failed.\n&quot; _
									&amp; &quot;Something must be wrong with some arguments.\n\n&quot; _
									&amp; &quot;Either the document type is unknown, or no template file was given,\n&quot; _
									&amp; &quot;or the given template file was not found on your system.\n\n&quot; _
									&amp; &quot;%1 = &apos;%2&apos;\n&quot; _
									&amp; &quot;%3 = &apos;%4&apos;&quot; _
						, Comment :=	&quot;SF_UI.GetDocument error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A string&quot; _
					)
	&apos;	SF_UI.OpenDocument
			.AddText(	Context := &quot;DOCUMENTOPEN&quot; _
						, MsgId := &quot;The opening of the document failed.\n&quot; _
									&amp; &quot;Something must be wrong with some arguments.\n\n&quot; _
									&amp; &quot;Either the file does not exist, or the password is wrong, or the given filter is invalid.\n\n&quot; _
									&amp; &quot;%1 = &apos;%2&apos;\n&quot; _
									&amp; &quot;%3 = &apos;%4&apos;\n&quot; _
									&amp; &quot;%5 = &apos;%6&apos;&quot; _
						, Comment :=	&quot;SF_UI.OpenDocument error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A string\n&quot; _
									&amp;	&quot;%5: An identifier\n&quot; _
									&amp;	&quot;%6: A string&quot; _
					)
	&apos;	SF_UI.OpenBaseDocument
			.AddText(	Context := &quot;BASEDOCUMENTOPEN&quot; _
						, MsgId := &quot;The opening of the Base document failed.\n&quot; _
									&amp; &quot;Something must be wrong with some arguments.\n\n&quot; _
									&amp; &quot;Either the file does not exist, or the file is not registered under the given name.\n\n&quot; _
									&amp; &quot;%1 = &apos;%2&apos;\n&quot; _
									&amp; &quot;%3 = &apos;%4&apos;&quot; _
						, Comment :=	&quot;SF_UI.OpenDocument error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A string&quot; _
					)
	&apos;	SF_Document._IsStillAlive
			.AddText(	Context := &quot;DOCUMENTDEAD&quot; _
						, MsgId := &quot;The requested action could not be executed because the document was closed inadvertently.\n\n&quot; _
									&amp; &quot;The concerned document is &apos;%1&apos;&quot; _
						, Comment :=	&quot;SF_Document._IsStillAlive error message\n&quot; _
									&amp;	&quot;%1: A file name&quot; _
					)
	&apos;	SF_Document.Save
			.AddText(	Context := &quot;DOCUMENTSAVE&quot; _
						, MsgId := &quot;The document could not be saved.\n&quot; _
									&amp; &quot;Either the document has been opened read-only, or the destination file has a read-only attribute set, &quot; _
									&amp; &quot;or the file where to save to is undefined.\n\n&quot; _
									&amp; &quot;%1 = &apos;%2&apos;&quot; _
						, Comment :=	&quot;SF_Document.SaveAs error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file name\n&quot; _
					)
	&apos;	SF_Document.SaveAs
			.AddText(	Context := &quot;DOCUMENTSAVEAS&quot; _
						, MsgId := &quot;The document could not be saved.\n&quot; _
									&amp; &quot;Either the document must not be overwritten, or the destination file has a read-only attribute set, &quot; _
									&amp; &quot;or the given filter is invalid.\n\n&quot; _
									&amp; &quot;%1 = &apos;%2&apos;\n&quot; _
									&amp; &quot;%3 = %4\n&quot; _
									&amp; &quot;%5 = &apos;%6&apos;&quot; _
						, Comment :=	&quot;SF_Document.SaveAs error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file name\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: True or False\n&quot; _
									&amp;	&quot;%5: An identifier\n&quot; _
									&amp;	&quot;%6: A string&quot; _
					)
	&apos;	SF_Document.any update
			.AddText(	Context := &quot;DOCUMENTREADONLY&quot; _
						, MsgId := &quot;You tried to edit a document which is not modifiable. The document has not been changed.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_Document any update\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file name&quot; _
					)
	&apos;	SF_Base.GetDatabase
			.AddText(	Context := &quot;DBCONNECT&quot; _
						, MsgId := &quot;The database related to the actual Base document could not be retrieved.\n&quot; _
									&amp; &quot;Check the connection/login parameters.\n\n&quot; _
									&amp; &quot;« %1 » = &apos;%2&apos;\n&quot; _
									&amp; &quot;« %3 » = &apos;%4&apos;\n&quot; _
									&amp; &quot;« Document » = %5&quot; _
						, Comment :=	&quot;SF_Base GetDatabase\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A user name\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A password\n&quot; _
									&amp;	&quot;%5: A file name&quot; _
					)
	&apos;	SF_Calc._ParseAddress (sheet)
			.AddText(	Context := &quot;CALCADDRESS1&quot; _
						, MsgId := &quot;The given address does not correspond with a valid sheet name.\n\n&quot; _
									&amp; &quot;« %1 » = %2\n&quot; _
									&amp; &quot;« %3 » = %4&quot; _
						, Comment :=	&quot;SF_Calc _ParseAddress (sheet)\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A file name&quot; _
					)
	&apos;	SF_Calc._ParseAddress (range)
			.AddText(	Context := &quot;CALCADDRESS2&quot; _
						, MsgId := &quot;The given address does not correspond with a valid range of cells.\n\n&quot; _
									&amp; &quot;« %1 » = %2\n&quot; _
									&amp; &quot;« %3 » = %4&quot; _
						, Comment :=	&quot;SF_Calc _ParseAddress (range)\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A file name&quot; _
					)
	&apos;	SF_Calc.InsertSheet
			.AddText(	Context := &quot;DUPLICATESHEET&quot; _
						, MsgId := &quot;There exists already in the document a sheet with the same name.\n\n&quot; _
									&amp; &quot;« %1 » = %2\n&quot; _
									&amp; &quot;« %3 » = %4&quot; _
						, Comment :=	&quot;SF_Calc InsertSheet\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A file name&quot; _
					)
	&apos;	SF_Calc.Offset
			.AddText(	Context := &quot;OFFSETADDRESS&quot; _
						, MsgId := &quot;The computed range falls beyond the sheet boundaries or is meaningless.\n\n&quot; _
									&amp; &quot;« %1 » = %2\n&quot; _
									&amp; &quot;« %3 » = %4\n&quot; _
									&amp; &quot;« %5 » = %6\n&quot; _
									&amp; &quot;« %7 » = %8\n&quot; _
									&amp; &quot;« %9 » = %10\n&quot; _
									&amp; &quot;« %11 » = %12&quot; _
						, Comment :=	&quot;SF_Calc Offset\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A Calc reference\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A number\n&quot; _
									&amp;	&quot;%5: An identifier\n&quot; _
									&amp;	&quot;%6: A number\n&quot; _
									&amp;	&quot;%7: An identifier\n&quot; _
									&amp;	&quot;%8: A number\n&quot; _
									&amp;	&quot;%9: An identifier\n&quot; _
									&amp;	&quot;%10: A number\n&quot; _
									&amp;	&quot;%11: An identifier\n&quot; _
									&amp;	&quot;%12: A file name&quot; _
					)
	&apos;	SF_Calc.CreateChart
			.AddText(	Context := &quot;DUPLICATECHART&quot; _
						, MsgId := &quot;A chart with the same name exists already in the sheet.\n\n&quot; _
									&amp; &quot;« %1 » = %2\n&quot; _
									&amp; &quot;« %3 » = %4\n&quot; _
									&amp; &quot;« %5 » = %6\n&quot; _
						, Comment :=	&quot;SF_Calc CreateChart\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A string\n&quot; _
									&amp;	&quot;%5: An identifier\n&quot; _
									&amp;	&quot;%6: A file name&quot; _
					)
	&apos;	SF_Calc.CreateShapeFromFile
			.AddText(	Context := &quot;DUPLICATESHAPE&quot; _
						, MsgId := &quot;A shape with the same name exists already in the sheet.\n\n&quot; _
									&amp; &quot;« %1 » = %2\n&quot; _
									&amp; &quot;« %3 » = %4\n&quot; _
									&amp; &quot;« %5 » = %6\n&quot; _
						, Comment :=	&quot;SF_Calc CreateShapeFromFile\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A string\n&quot; _
									&amp;	&quot;%5: An identifier\n&quot; _
									&amp;	&quot;%6: A file name&quot; _
					)
	&apos;	SF_Calc.ExportRangeToFile
			.AddText(	Context := &quot;RANGEEXPORT&quot; _
						, MsgId := &quot;The given range could not be exported.\n&quot; _
									&amp; &quot;Either the destination file must not be overwritten, or it has a read-only attribute set.\n\n&quot; _
									&amp; &quot;%1 = &apos;%2&apos;\n&quot; _
									&amp; &quot;%3 = %4&quot; _
						, Comment :=	&quot;SF_Calc.ExportRangeToFile error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file name\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: True or False\n&quot; _
					)
	&apos;	SF_Shape.ExportToFile
			.AddText(	Context := &quot;SHAPEEXPORT&quot; _
						, MsgId := &quot;The shape could not be exported.\n&quot; _
									&amp; &quot;Either the destination file must not be overwritten, or it has a read-only attribute set.\n\n&quot; _
									&amp; &quot;%1 = &apos;%2&apos;\n&quot; _
									&amp; &quot;%3 = %4&quot; _
						, Comment :=	&quot;SF_Shape.ExportToFile error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file name\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: True or False\n&quot; _
					)
	&apos;	SF_Form._IsStillAlive
			.AddText(	Context := &quot;FORMDEAD&quot; _
						, MsgId := &quot;The requested action could not be executed because the form is not open or the document was closed inadvertently.\n\n&quot; _
									&amp; &quot;The concerned form is &apos;%1&apos; in document &apos;%2&apos;.&quot; _
						, Comment :=	&quot;SF_Dialog._IsStillAlive error message\n&quot; _
									&amp;	&quot;%1: An identifier&quot; _
									&amp;	&quot;%2: A file name&quot; _
					)
	&apos;	SF_Calc.Forms
			.AddText(	Context := &quot;CALCFORMNOTFOUND&quot; _
						, MsgId := &quot;The requested form could not be found in the Calc sheet. The given index is off-limits.\n\n&quot; _
									&amp; &quot;The concerned Calc document is &apos;%3&apos;.\n\n&quot; _
									&amp; &quot;The name of the sheet = &apos;%2&apos;\n&quot; _
									&amp; &quot;The index = %1.&quot; _
						, Comment :=	&quot;SF_Form determination\n&quot; _
									&amp;	&quot;%1: A number\n&quot; _
									&amp;	&quot;%2: A sheet name\n&quot; _
									&amp;	&quot;%3: A file name&quot; _
					)
	&apos;	SF_Document.Forms
			.AddText(	Context := &quot;WRITERFORMNOTFOUND&quot; _
						, MsgId := &quot;The requested form could not be found in the Writer document. The given index is off-limits.\n\n&quot; _
									&amp; &quot;The concerned Writer document is &apos;%2&apos;.\n\n&quot; _
									&amp; &quot;The index = %1.&quot; _
						, Comment :=	&quot;SF_Form determination\n&quot; _
									&amp;	&quot;%1: A number\n&quot; _
									&amp;	&quot;%2: A file name&quot; _
					)
	&apos;	SF_Base.Forms
			.AddText(	Context := &quot;BASEFORMNOTFOUND&quot; _
						, MsgId := &quot;The requested form could not be found in the form document &apos;%2&apos;. The given index is off-limits.\n\n&quot; _
									&amp; &quot;The concerned Base document is &apos;%3&apos;.\n\n&quot; _
									&amp; &quot;The index = %1.&quot; _
						, Comment :=	&quot;SF_Form determination\n&quot; _
									&amp;	&quot;%1: A number\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: A file name&quot; _
					)
	&apos;	SF_Form.Subforms
			.AddText(	Context := &quot;SUBFORMNOTFOUND&quot; _
						, MsgId := &quot;The requested subform could not be found below the given main form.\n\n&quot; _
									&amp; &quot;The main form = &apos;%2&apos;.\n&quot; _
									&amp; &quot;The subform = &apos;%1&apos;.&quot; _
						, Comment :=	&quot;SF_Form determination\n&quot; _
									&amp;	&quot;%1: A form name\n&quot; _
									&amp;	&quot;%2: A form name&quot; _
					)
	&apos;	SF_FormControl._SetProperty
			.AddText(	Context := &quot;FORMCONTROLTYPE&quot; _
						, MsgId := &quot;The control &apos;%1&apos; in form &apos;%2&apos; is of type &apos;%3&apos;.\n&quot; _
									&amp; &quot;The property or method &apos;%4&apos; is not applicable on that type of form controls.&quot; _
						, Comment :=	&quot;SF_FormControl property setting\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: An identifier\n&quot; _
									&amp;	&quot;%3: A string\n&quot; _
									&amp;	&quot;%4: An identifier&quot; _
					)
	&apos;	SF_Writer._ParseRange (textrange)
			.AddText(	Context := &quot;WRITERRANGE&quot; _
						, MsgId := &quot;The given text range does not correspond with a valid position in the text.\n\n&quot; _
									&amp; &quot;« %1 » = %2\n&quot; _
									&amp; &quot;« %3 » = %4&quot; _
						, Comment :=	&quot;SF_Writer._ParseRange (textrange)\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A file name&quot; _
					)
	&apos;	SF_Dialog._NewDialog
			.AddText(	Context := &quot;DIALOGNOTFOUND&quot; _
						, MsgId := &quot;The requested dialog could not be located in the given container or library.\n&quot; _
									&amp; &quot;« %1 » = %2\n&quot; _
									&amp; &quot;« %3 » = %4\n&quot; _
									&amp; &quot;« %5 » = %6\n&quot; _
									&amp; &quot;« %7 » = %8&quot; _
						, Comment :=	&quot;SF_Dialog creation\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A file name\n&quot; _
									&amp;	&quot;%5: An identifier\n&quot; _
									&amp;	&quot;%6: A string\n&quot; _
									&amp;	&quot;%7: An identifier\n&quot; _
									&amp;	&quot;%8: A string&quot; _
					)
	&apos;	SF_Dialog._IsStillAlive
			.AddText(	Context := &quot;DIALOGDEAD&quot; _
						, MsgId := &quot;The requested action could not be executed because the dialog was closed inadvertently.\n\n&quot; _
									&amp; &quot;The concerned dialog is &apos;%1&apos;.&quot; _
						, Comment :=	&quot;SF_Dialog._IsStillAlive error message\n&quot; _
									&amp;	&quot;%1: An identifier&quot; _
					)
	&apos;	SF_DialogControl._SetProperty
			.AddText(	Context := &quot;CONTROLTYPE&quot; _
						, MsgId := &quot;The control &apos;%1&apos; in dialog &apos;%2&apos; is of type &apos;%3&apos;.\n&quot; _
									&amp; &quot;The property or method &apos;%4&apos; is not applicable on that type of dialog controls.&quot; _
						, Comment :=	&quot;SF_DialogControl property setting\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: An identifier\n&quot; _
									&amp;	&quot;%3: A string\n&quot; _
									&amp;	&quot;%4: An identifier&quot; _
					)
	&apos;	SF_DialogControl.WriteLine
			.AddText(	Context := &quot;TEXTFIELD&quot; _
						, MsgId := &quot;The control &apos;%1&apos; in dialog &apos;%2&apos; is not a multiline text field.\n&quot; _
									&amp; &quot;The requested method could not be executed.&quot; _
						, Comment :=	&quot;SF_DialogControl add line in textbox\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: An identifier&quot; _
					)
	&apos;	SF_Dialog.SetPageManager
			.AddText(	Context := &quot;PAGEMANAGER&quot; _
						, MsgId := &quot;The Page Manager could not be setup due to inconsistent arguments.\n\n&quot; _
									&amp; &quot; %1 : « %2 »\n&quot; _
									&amp; &quot; %3 : « %4 »\n&quot; _
									&amp; &quot; %5 : « %6 »&quot; _
						, Comment :=	&quot;SF_Dialog Page Manager setting\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A list of names separated by commas\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: A list of names separated by commas\n&quot; _
									&amp;	&quot;%5: An identifier\n&quot; _
									&amp;	&quot;%6: A list of names separated by commas&quot; _
					)
	&apos;	SF_Dialog.CreateControl
			.AddText(	Context := &quot;DUPLICATECONTROL&quot; _
						, MsgId := &quot;A control with the same name exists already in the dialog &apos;%3&apos;.\n\n&quot; _
									&amp; &quot;« %1 » = %2&quot; _
						, Comment :=	&quot;SF_Dialog CreateControl\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A string\n&quot; _
									&amp;	&quot;%3: A dialog name&quot; _
					)
	&apos;	SF_Database.RunSql, SF_Dataset.Delete/Insert/Update
			.AddText(	Context := &quot;DBREADONLY&quot; _
						, MsgId := &quot;The database has been opened in read-only mode.\n&quot; _
									&amp; &quot;The &apos;%1&apos; method must not be executed in this context.&quot; _
						, Comment :=	&quot;SF_Database when running update SQL statement\n&quot; _
									&amp;	&quot;%1: The concerned method&quot; _
					)
	&apos;	SF_Database._ExecuteSql
			.AddText(	Context := &quot;SQLSYNTAX&quot; _
						, MsgId := &quot;An SQL statement could not be interpreted or executed by the database system.\n&quot; _
									&amp; &quot;Check its syntax, table and/or field names, ...\n\n&quot; _
									&amp; &quot;SQL Statement : « %1 »&quot; _
						, Comment :=	&quot;SF_Database can&apos;t interpret SQL statement\n&quot; _
									&amp;	&quot;%1: The statement&quot; _
					)
	&apos;	SF_Dataset.Reload/_Initialize
			.AddText(	Context := &quot;SQLSYNTAX2&quot; _
						, MsgId := &quot;An SQL statement could not be interpreted or executed by the database system.\n&quot; _
									&amp; &quot;Check its syntax, table and/or field names, ...\n\n&quot; _
									&amp; &quot;SQL Statement : « %1 »\n&quot; _
									&amp; &quot;combined with\n&quot; _
									&amp; &quot;    « %2 »\n&quot; _
									&amp; &quot;    « %3 »&quot; _
						, Comment :=	&quot;SF_Database can&apos;t interpret SQL statement\n&quot; _
									&amp;	&quot;%1: The statement\n&quot; _
									&amp;	&quot;%2: a WHERE clause\n&quot; _
									&amp;	&quot;%3: a ORDER BY clause&quot; _
					)
	&apos;	SF_Dataset.Update/Insert/Delete/GetValue
			.AddText(	Context := &quot;NOCURRENTRECORD&quot; _
						, MsgId := &quot;A database record could not be retrieved, inserted or updated by the database system.\n&quot; _
									&amp; &quot;The current record could not be determined.&quot; _
						, Comment :=	&quot;SF_Dataset can&apos;t read field values or store field updates&quot; _
					)
	&apos;	SF_Dataset._SetColumnValue
			.AddText(	Context := &quot;RECORDUPDATE&quot; _
						, MsgId := &quot;A database record could not be inserted or updated by the database system.\n&quot; _
									&amp; &quot;Possible reasons:\n&quot; _
									&amp; &quot;- the field is not updatable\n&quot; _
									&amp; &quot;- a [NULL] value is provided which is forbidden for the field\n&quot; _
									&amp; &quot;- the type of value and the type of field are incompatible\n&quot; _
									&amp; &quot;- the input binary file does not exist or is empty\n&quot; _
									&amp; &quot;- the field type is not supported\n\n&quot; _
									&amp; &quot;Field name : « %1 »\n&quot; _
									&amp; &quot;Field value :  « %2 »\n&quot; _
									&amp; &quot;Field type :  « %3 »&quot; _
						, Comment :=	&quot;SF_Database can&apos;t store field updates\n&quot; _
									&amp;	&quot;%1: The field name\n&quot; _
									&amp;	&quot;%2: the value to store in the field&quot; _
					)
	&apos;	SF_Dataset.ExportFieldToFile
			.AddText(	Context := &quot;FIELDEXPORT&quot; _
						, MsgId := &quot;The database field could not be exported.\n&quot; _
									&amp; &quot;Either the destination file must not be overwritten, or it has a read-only attribute set.\n\n&quot; _
									&amp; &quot;%1 = &apos;%2&apos;\n&quot; _
									&amp; &quot;%3 = %4&quot; _
						, Comment :=	&quot;SF_Dataset.ExportToFile error message\n&quot; _
									&amp;	&quot;%1: An identifier\n&quot; _
									&amp;	&quot;%2: A file name\n&quot; _
									&amp;	&quot;%3: An identifier\n&quot; _
									&amp;	&quot;%4: True or False\n&quot; _
					)
	&apos;	SF_Exception.PythonShell (Python only)
			.AddText(	Context := &quot;PYTHONSHELL&quot; _
						, MsgId := &quot;The APSO extension could not be located in your LibreOffice installation.&quot; _
						, Comment :=	&quot;SF_Exception.PythonShell error message&quot; _
									&amp;	&quot;APSO: to leave unchanged&quot; _
					)
	&apos;	SFUnitTests._NewUnitTest
			.AddText(	Context := &quot;UNITTESTLIBRARY&quot; _
						, MsgId := &quot;The requested library could not be located.\n&quot; _
									&amp; &quot;The UnitTest service has not been initialized.\n\n&quot; _
									&amp; &quot;Library name : « %1 »&quot; _
						, Comment :=	&quot;SFUnitTest could not locate the library gven as argument\n&quot; _
									&amp;	&quot;%1: The name of the library&quot; _
					)
	&apos;	SFUnitTests.SF_UnitTest
			.AddText(	Context := &quot;UNITTESTMETHOD&quot; _
						, MsgId := &quot;The method &apos;%1&apos; is unexpected in the current context.\n&quot; _
									&amp; &quot;The UnitTest service cannot proceed further with the on-going test.&quot; _
						, Comment :=	&quot;SFUnitTest finds a RunTest() call in a inappropriate location\n&quot; _
									&amp;	&quot;%1: The name of a method&quot; _
					)
		End With
	End If

Finally:
	Exit Sub
Catch:
	GoTo Finally
End Sub		&apos;	ScriptForge.SF_Root._LoadLocalizedInterface

REM -----------------------------------------------------------------------------
Public Function _Repr() As String
&apos;&apos;&apos;	Convert the unique SF_Root instance to a readable string, typically for debugging purposes (DebugPrint ...)
&apos;&apos;&apos;	Args:
&apos;&apos;&apos;	Return:
&apos;&apos;&apos;		&quot;[Root] (MainFunction: xxx, Console: yyy lines, ServicesList)&quot;

Dim sRoot As String				&apos;	Return value
Const cstRoot = &quot;[Root] (&quot;

	sRoot = cstRoot &amp; &quot;MainFunction: &quot; &amp; MainFunction &amp; &quot;, Console: &quot; &amp; UBound(ConsoleLines) + 1 &amp; &quot; lines&quot; _
						&amp; &quot;, Libraries:&quot; &amp; SF_Utils._Repr(ServicesList.Keys) _
						&amp; &quot;)&quot;

	_Repr = sRoot

End Function	&apos;	ScriptForge.SF_Root._Repr

REM -----------------------------------------------------------------------------
Public Sub _StackReset()
&apos;&apos;&apos;	Reset private members after a fatal/abort error to leave
&apos;&apos;&apos;	a stable persistent storage after an unwanted interrupt

	MainFunction = &quot;&quot;
	MainFunctionArgs = &quot;&quot;
	StackLevel = 0
	TriggeredByPython = False

End Sub		&apos;		ScriptForge.SF_Root._StackReset

REM ================================================== END OF SCRIPTFORGE.SF_ROOT
</script:module>