[Libreoffice-commits] core.git: wizards/source
Jean-Pierre Ledure (via logerrit)
logerrit at kemper.freedesktop.org
Fri Sep 3 12:54:01 UTC 2021
wizards/source/scriptforge/SF_L10N.xba | 135 +++++++++++++++++++++--
wizards/source/scriptforge/SF_Root.xba | 2
wizards/source/scriptforge/SF_Utils.xba | 5
wizards/source/scriptforge/python/scriptforge.py | 8 +
wizards/source/sfdialogs/SF_Dialog.xba | 93 +++++++++++++++
wizards/source/sfdialogs/SF_DialogControl.xba | 4
wizards/source/sfdialogs/SF_Register.xba | 2
7 files changed, 232 insertions(+), 17 deletions(-)
New commits:
commit 552a1f30eca91eb647d10d77135b32a5729f11bd
Author: Jean-Pierre Ledure <jp at ledure.be>
AuthorDate: Thu Sep 2 16:08:44 2021 +0200
Commit: Jean-Pierre Ledure <jp at ledure.be>
CommitDate: Fri Sep 3 14:53:27 2021 +0200
ScriptForge - add AddTextsFromDialog and GetTextsFromL10N methods
The objective is to facilitate the automatic translation of
all fixed texts in dialogs and dialog controls.
Concerned items are:
- the title of the dialog
- the caption associated with next control types:
Button, CheckBox, FixedLine, FixedText, GroupBox and RadioButton
- the content of list- and comboboxes
- the tip- or helptext displayed when the mouse is hovering the
control
ScriptForge.SF_L10N.AddTextsFromDialog(dialog)
store all fixed texts of the dialog in the list of translatable
strings of a L10N object to prepare a POT file
SFDialogs.Dialog.GetTextsFromL10N(l10n)
get the translated versions of all fixed texts in the dialog from
a L10N object and apply them on the dialog before display
Both methods are executable from Basic and Python user scripts
Change-Id: I3dc9fbbce287d7af4040df713f9d11e0ff928b1c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121514
Tested-by: Jean-Pierre Ledure <jp at ledure.be>
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp at ledure.be>
diff --git a/wizards/source/scriptforge/SF_L10N.xba b/wizards/source/scriptforge/SF_L10N.xba
index 020dca541831..6aab1f7b4f14 100644
--- a/wizards/source/scriptforge/SF_L10N.xba
+++ b/wizards/source/scriptforge/SF_L10N.xba
@@ -34,11 +34,12 @@ Option Explicit
''' Being independent text files, one per language to support, the programmer may give away
''' pristine PO template files (known as POT-files) for a translator to process.
'''
-''' This class implements mainly 3 mechanisms:
-''' - AddText: for the programmer to build a set of words or sentences
+''' This class implements mainly 4 mechanisms:
+''' 1. AddText: for the programmer to build a set of words or sentences
''' meant for being translated later
-''' - ExportToPOTFile: All the above texts are exported into a pristine POT-file
-''' - GetText: At runtime get the text in the user language
+''' 2. AddTextsFromDialog: to automatically execute AddText() on each fixed text of a dialog
+''' 3. ExportToPOTFile: All the above texts are exported into a pristine POT-file
+''' 4. GetText: At runtime get the text in the user language
''' Note that the first two are optional: POT and PO-files may be built with a simple text editor
'''
''' Several instances of the L10N class may coexist
@@ -52,7 +53,7 @@ Option Explicit
''' Locale: in the form la-CO (language-COUNTRY)
''' Service invocation examples:
''' Dim myPO As Variant
-''' myPO = CreateScriptService("L10N") ' AddText and ExportToPOTFile are allowed
+''' myPO = CreateScriptService("L10N") ' AddText, AddTextsFromDialogt and ExportToPOTFile are allowed
''' myPO = CreateScriptService("L10N", "C:\myPOFiles\", "fr-BE")
''' 'All functionalities are available
'''
@@ -228,6 +229,91 @@ CatchDuplicate:
GoTo Finally
End Function ' ScriptForge.SF_L10N.AddText
+REM -----------------------------------------------------------------------------
+Public Function AddTextsFromDialog(Optional ByRef Dialog As Variant) As Boolean
+''' Add all fixed text strings of a dialog to the list of localizable text strings
+''' Added texts are:
+''' - the title of the dialog
+''' - the caption associated with next control types: Button, CheckBox, FixedLine, FixedText, GroupBox and RadioButton
+''' - the content of list- and comboboxes
+''' - the tip- or helptext displayed when the mouse is hovering the control
+''' The current method has method SFDialogs.SF_Dialog.GetTextsFromL10N as counterpart
+''' The targeted dialog must not be open when the current method is run
+''' Args:
+''' Dialog: a SFDialogs.Dialog service instance
+''' Returns:
+''' True when successful
+''' Examples:
+''' Dim myDialog As Object
+''' Set myDialog = CreateScriptService("SFDialogs.Dialog", "GlobalScope", "XrayTool", "DlgXray")
+''' myPO.AddTextsFromDialog(myDialog)
+
+Dim bAdd As Boolean ' Return value
+Dim vControls As Variant ' Array of control names
+Dim sControl As String ' A single control name
+Dim oControl As Object ' SFDialogs.DialogControl
+Dim sText As String ' The text to insert in the dictionary
+Dim sDialogComment As String ' The prefix in the comment to insert in the dictionary for the dialog
+Dim sControlComment As String ' The prefix in the comment to insert in the dictionary for a control
+Dim vSource As Variant ' RowSource property of dialog control as an array
+Dim i As Long
+
+Const cstThisSub = "L10N.AddTextsFromDialog"
+Const cstSubArgs = "Dialog"
+
+ If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+ bAdd = False
+
+Check:
+ If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+ If Not SF_Utils._Validate(Dialog, "Dialog", V_OBJECT, , , "DIALOG") Then GoTo Finally
+ End If
+
+Try:
+ With Dialog
+ ' Store the title of the dialog
+ sDialogComment = "Dialog => " & ._Container & " : " & ._Library & " : " & ._Name & " : "
+ stext = .Caption
+ If Len(sText) > 0 Then
+ If Not _ReplaceText("", sText, sDialogComment & "Caption") Then GoTo Catch
+ End If
+ ' Scan all controls
+ vControls = .Controls()
+ For Each sControl In vControls
+ Set oControl = .Controls(sControl)
+ sControlComment = sDialogComment & sControl & "."
+ With oControl
+ ' Extract fixed texts
+ sText = .Caption
+ If Len(sText) > 0 Then
+ If Not _ReplaceText("", sText, sControlComment & "Caption") Then GoTo Catch
+ End If
+ vSource = .RowSource ' List and comboboxes only
+ If IsArray(vSource) Then
+ For i = 0 To UBound(vSource)
+ If Len(vSource(i)) > 0 Then
+ If Not _ReplaceText("", vSource(i), sControlComment & "RowSource[" & i & "]") Then GoTo Catch
+ End If
+ Next i
+ End If
+ sText = .TipText
+ If Len(sText) > 0 Then
+ If Not _ReplaceText("", sText, sControlComment & "TipText") Then GoTo Catch
+ End If
+ End With
+ Next sControl
+ End With
+
+ bAdd = True
+
+Finally:
+ AddTextsFromDialog = bAdd
+ SF_Utils._ExitFunction(cstThisSub)
+ Exit Function
+Catch:
+ GoTo Finally
+End Function ' ScriptForge.SF_L10N.AddTextsFromDialog
+
REM -----------------------------------------------------------------------------
Public Function ExportToPOTFile(Optional ByVal FileName As Variant _
, Optional ByVal Header As Variant _
@@ -267,8 +353,8 @@ Const cstSubArgs = "FileName, [Header=""""], [Encoding=
bExport = False
Check:
- If IsMissing(Header) Or IsMissing(Header) Then Header = ""
- If IsMissing(Encoding) Or IsMissing(Encoding) Then Encoding = "UTF-8"
+ If IsMissing(Header) Or IsEmpty(Header) Then Header = ""
+ If IsMissing(Encoding) Or IsEmpty(Encoding) Then Encoding = "UTF-8"
If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
If Not SF_Utils._ValidateFile(FileName, "FileName") Then GoTo Finally
If Not SF_Utils._Validate(Header, "Header", V_STRING) Then GoTo Finally
@@ -506,6 +592,7 @@ Public Function Methods() As Variant
"AddText" _
, "ExportToPOTFile" _
, "GetText" _
+ , "AddTextsFromDialog" _
, "_" _
)
@@ -685,6 +772,40 @@ Finally:
Exit Function
End Function ' ScriptForge.SF_L10N._PropertyGet
+REM -----------------------------------------------------------------------------
+Private Function _ReplaceText(ByVal psContext As String _
+ , ByVal psMsgId As String _
+ , ByVal psComment As String _
+ ) As Boolean
+''' When the entry in the dictionary does not yet exist, equivalent to AddText
+''' When it exists already, extend the existing comment with the psComment argument
+''' Used from AddTextsFromDialog to manage identical strings without raising errors,
+''' e.g. when multiple dialogs have the same "Close" button
+
+Dim bAdd As Boolean ' Return value
+Dim sKey As String ' The key part of an entry in the dictionary
+Dim vItem As POEntry ' The item part of the new entry in the dictionary
+
+Try:
+ bAdd = False
+ If Len(psContext) > 0 Then sKey = psContext Else sKey = psMsgId
+ If _Dictionary.Exists(sKey) Then
+ ' Load the entry, adapt comment and rewrite
+ vItem = _Dictionary.Item(sKey)
+ If Len(vItem.Comment) = 0 Then vItem.Comment = psComment Else vItem.Comment = vItem.Comment & "\n" & psComment
+ bAdd = _Dictionary.ReplaceItem(sKey, vItem)
+ Else
+ ' Add a new entry as usual
+ bAdd = AddText(psContext, psMsgId, psComment)
+ End If
+
+Finally:
+ _ReplaceText = bAdd
+ Exit Function
+Catch:
+ GoTo Finally
+End Function ' ScriptForge.SF_L10N._ReplaceText
+
REM -----------------------------------------------------------------------------
Private Function _Repr() As String
''' Convert the L10N instance to a readable string, typically for debugging purposes (DebugPrint ...)
diff --git a/wizards/source/scriptforge/SF_Root.xba b/wizards/source/scriptforge/SF_Root.xba
index 131f2eb90d56..7d9132caf205 100644
--- a/wizards/source/scriptforge/SF_Root.xba
+++ b/wizards/source/scriptforge/SF_Root.xba
@@ -72,7 +72,6 @@ Private DatabaseContext As Object ' com.sun.star.sdb.DatabaseContext
Private ConfigurationProvider _
As Object ' com.sun.star.configuration.ConfigurationProvider
Private MailService As Object ' com.sun.star.system.SimpleCommandMail or com.sun.star.system.SimpleSystemMail
-Private TreeDataModel As Object ' com.sun.star.awt.tree.MutableTreeDataModel
Private GraphicExportFilter As Object ' com.sun.star.drawing.GraphicExportFilter
' Specific persistent services objects or properties
@@ -135,7 +134,6 @@ Private Sub Class_Initialize()
Set DatabaseContext = Nothing
Set ConfigurationProvider = Nothing
Set MailService = Nothing
- Set TreeDataModel = Nothing
Set GraphicExportFilter = Nothing
OSName = ""
SFDialogs = Empty
diff --git a/wizards/source/scriptforge/SF_Utils.xba b/wizards/source/scriptforge/SF_Utils.xba
index 99ee224cc79f..1505e4cfd308 100644
--- a/wizards/source/scriptforge/SF_Utils.xba
+++ b/wizards/source/scriptforge/SF_Utils.xba
@@ -439,11 +439,6 @@ Dim vNodePath As Variant
Set .TextSearch = CreateUnoService("com.sun.star.util.TextSearch")
End If
Set _GetUNOService = .TextSearch
- Case "TreeDataModel"
- If IsEmpty(.TreeDataModel) Or IsNull(.TreeDataModel) Then
- Set .TreeDataModel = CreateUnoService("com.sun.star.awt.tree.MutableTreeDataModel")
- End If
- Set _GetUNOService = .TreeDataModel
Case "URLTransformer"
If IsEmpty(.URLTransformer) Or IsNull(.URLTransformer) Then
Set .URLTransformer = CreateUnoService("com.sun.star.util.URLTransformer")
diff --git a/wizards/source/scriptforge/python/scriptforge.py b/wizards/source/scriptforge/python/scriptforge.py
index 498da0637dd7..12039b1d923d 100644
--- a/wizards/source/scriptforge/python/scriptforge.py
+++ b/wizards/source/scriptforge/python/scriptforge.py
@@ -1179,6 +1179,10 @@ class SFScriptForge:
def AddText(self, context = '', msgid = '', comment = ''):
return self.ExecMethod(self.vbMethod, 'AddText', context, msgid, comment)
+ def AddTextsFromDialog(self, dialog):
+ dialogobj = dialog.objectreference if isinstance(dialog, SFDialogs.SF_Dialog) else dialog
+ return self.ExecMethod(self.vbMethod + self.flgObject, 'AddTextsFromDialog', dialogobj)
+
def ExportToPOTFile(self, filename, header = '', encoding= 'UTF-8'):
return self.ExecMethod(self.vbMethod, 'ExportToPOTFile', filename, header, encoding)
@@ -1659,6 +1663,10 @@ class SFDialogs:
def Execute(self, modal = True):
return self.ExecMethod(self.vbMethod, 'Execute', modal)
+ def GetTextsFromL10N(self, l10n):
+ l10nobj = l10n.objectreference if isinstance(l10n, SFScriptForge.SF_L10N) else l10n
+ return self.ExecMethod(self.vbMethod + self.flgObject, 'GetTextsFromL10N', l10nobj)
+
def Terminate(self):
return self.ExecMethod(self.vbMethod, 'Terminate')
diff --git a/wizards/source/sfdialogs/SF_Dialog.xba b/wizards/source/sfdialogs/SF_Dialog.xba
index a574cf87ef25..b69e4b3ff5cf 100644
--- a/wizards/source/sfdialogs/SF_Dialog.xba
+++ b/wizards/source/sfdialogs/SF_Dialog.xba
@@ -498,6 +498,98 @@ Catch:
GoTo Finally
End Function ' SFDialogs.SF_Dialog.GetProperty
+REM -----------------------------------------------------------------------------
+Public Function GetTextsFromL10N(Optional ByRef L10N As Variant) As Boolean
+''' Replace all fixed text strings of a dialog by their localized version
+''' Replaced texts are:
+''' - the title of the dialog
+''' - the caption associated with next control types: Button, CheckBox, FixedLine, FixedText, GroupBox and RadioButton
+''' - the content of list- and comboboxes
+''' - the tip- or helptext displayed when the mouse is hovering the control
+''' The current method has a twin method ScriptForge.SF_L10N.AddTextsFromDialog
+''' The current method is probably run before the Execute() method
+''' Args:
+''' L10N : a "L10N" service instance created with CreateScriptService("L10N")
+''' Returns:
+''' True when successful
+''' Examples:
+''' Dim myPO As Object, oDlg As Object
+''' Set oDlg = CreateScriptService("Dialog", "GlobalScope", "XrayTool", "DlgXray")
+''' Set myPO = CreateScriptService("L10N", "C:\myPOFiles\", "fr-BE")
+''' oDlg.GetTextsFromL10N(myPO)
+
+Dim bGet As Boolean ' Return value
+Dim vControls As Variant ' Array of control names
+Dim sControl As String ' A single control name
+Dim oControl As Object ' SFDialogs.DialogControl
+Dim sText As String ' The text found in the dialog
+Dim sTranslation As String ' The translated text got from the dictionary
+Dim vSource As Variant ' RowSource property of dialog control as an array
+Dim bChanged As Boolean ' True when at least 1 item of a RowSource is modified
+Dim i As Long
+
+Const cstThisSub = "SFDialogs.Dialog.GetTextsFromL10N"
+Const cstSubArgs = "L10N"
+
+ If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+ bGet = False
+
+Check:
+ If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+ If Not SF_Utils._Validate(L10N, "L10N", V_OBJECT, , , "L10N") Then GoTo Finally
+ End If
+
+Try:
+ ' Get the dialog title
+ sText = Caption
+ If Len(sText) > 0 Then
+ sTranslation = L10N._(sText)
+ If sText <> sTranslation Then Caption = sTranslation
+ End If
+ ' Scan all controls
+ vControls = Controls()
+ For Each sControl In vControls
+ Set oControl = Controls(sControl)
+ With oControl
+ ' Extract fixed texts
+ sText = .Caption
+ If Len(sText) > 0 Then
+ sTranslation = L10N._(sText)
+ If sText <> sTranslation Then .Caption = sTranslation
+ End If
+ vSource = .RowSource ' List and comboboxes only
+ If IsArray(vSource) Then
+ bChanged = False
+ For i = 0 To UBound(vSource)
+ If Len(vSource(i)) > 0 Then
+ sTranslation = L10N._(vSource(i))
+ If sTranslation <> vSource(i) Then
+ bChanged = True
+ vSource(i) = sTranslation
+ End If
+ End If
+ Next i
+ ' Rewrite if at least 1 item has been modified by the translation process
+ If bChanged Then .RowSource = vSource
+ End If
+ sText = .TipText
+ If Len(sText) > 0 Then
+ sTranslation = L10N._(sText)
+ If sText <> sTranslation Then .TipText = sTranslation
+ End If
+ End With
+ Next sControl
+
+ bGet = True
+
+Finally:
+ GetTextsFromL10N = bGet
+ SF_Utils._ExitFunction(cstThisSub)
+ Exit Function
+Catch:
+ GoTo Finally
+End Function ' SFDialogs.SF_Dialog.GetTextsFromL10N
+
REM -----------------------------------------------------------------------------
Public Function Methods() As Variant
''' Return the list of public methods of the Model service as an array
@@ -507,6 +599,7 @@ Public Function Methods() As Variant
, "Controls" _
, "EndExecute" _
, "Execute" _
+ , "GetTextsFromL10N" _
, "Terminate" _
)
diff --git a/wizards/source/sfdialogs/SF_DialogControl.xba b/wizards/source/sfdialogs/SF_DialogControl.xba
index 42270e32bcd3..f4a0891d92c4 100644
--- a/wizards/source/sfdialogs/SF_DialogControl.xba
+++ b/wizards/source/sfdialogs/SF_DialogControl.xba
@@ -1440,7 +1440,7 @@ Try:
Case "TreeControlModel"
' Initialize the data model
_ControlType = CTLTREECONTROL
- Set _ControlModel.DataModel = ScriptForge.SF_Utils._GetUNOService("TreeDataModel")
+ Set _ControlModel.DataModel = CreateUnoService("com.sun.star.awt.tree.MutableTreeDataModel")
Set _TreeDataModel = _ControlModel.DataModel
Case "UnoControlGridModel"
_ControlType = CTLTABLECONTROL
@@ -2081,4 +2081,4 @@ Private Function _Repr() As String
End Function ' SFDialogs.SF_DialogControl._Repr
REM ============================================ END OF SFDIALOGS.SF_DIALOGCONTROL
-</script:module>
+</script:module>
\ No newline at end of file
diff --git a/wizards/source/sfdialogs/SF_Register.xba b/wizards/source/sfdialogs/SF_Register.xba
index b99c9e337526..11ee1543b412 100644
--- a/wizards/source/sfdialogs/SF_Register.xba
+++ b/wizards/source/sfdialogs/SF_Register.xba
@@ -220,7 +220,7 @@ End Function ' SFDialogs.SF_Register._FindDialogInCache
REM -----------------------------------------------------------------------------
Public Function _NewDialog(Optional ByVal pvArgs As Variant) As Object
''' Create a new instance of the SF_Dialog class
-' Args:
+''' Args:
''' Container: either "GlobalScope" or a WindowName. Default = the active window
''' see the definition of WindowName in the description of the UI service
''' Library: the name of the library hosting the dialog. Default = "Standard"
More information about the Libreoffice-commits
mailing list