Falls es jemand interessiert: Ich hab das jetzt mit einem OO-Basic-Makro implementiert. War als OO-Basic-Anfänger schon ziemlich zäh, das Ergebnis ist aber ganz annehmbar.
Gruß
Franz
Dokumentstruktur vom Inhalt trennen / mehrsprachiges Handbuc
Moderator: Moderatoren
- Constructus
- *******
- Beiträge: 1610
- Registriert: Mo, 21.01.2008 18:08
- Wohnort: 20 Jahre Brilon - 40 Jahre Essen- Steele
Re: Dokumentstruktur vom Inhalt trennen / mehrsprachiges Han
Hallo Franz,,
Deine Lösung ist irgendwie unbefriedigend. Was hast Du wie gemacht?
Entweder hat kein Experte Deinen Erstbeitrag gesehen oder die sind alle weg wegen Frühling & so. Versuche doch vielleicht einmal, Deine Lösung deutlich und verständlich zu erläutern. Vielleicht bekommst Du dann noch geeignete Tipps, die Deine Lösung verbessern?
Viel Spaß
Constructus
P.s.: ich kann bei Makros nicht helfen...
Deine Lösung ist irgendwie unbefriedigend. Was hast Du wie gemacht?
Entweder hat kein Experte Deinen Erstbeitrag gesehen oder die sind alle weg wegen Frühling & so. Versuche doch vielleicht einmal, Deine Lösung deutlich und verständlich zu erläutern. Vielleicht bekommst Du dann noch geeignete Tipps, die Deine Lösung verbessern?
Viel Spaß
Constructus
P.s.: ich kann bei Makros nicht helfen...

EDV ist wunderbar - o Wunder, wenn sie funktioniert! {°L*}
Freie Offices auf div. Linuxen + 3 VBoxen mit WIN2K
|| LibO + AOO, auf Linux und WIN2K; portable OO & Co. auf WIN
Genaue Typisierung unmöglich, alles ist "im Fluß"
Freie Offices auf div. Linuxen + 3 VBoxen mit WIN2K
|| LibO + AOO, auf Linux und WIN2K; portable OO & Co. auf WIN
Genaue Typisierung unmöglich, alles ist "im Fluß"
Re: Dokumentstruktur vom Inhalt trennen / mehrsprachiges Han
Hallo Constructus,Constructus hat geschrieben: Deine Lösung ist irgendwie unbefriedigend. Was hast Du wie gemacht?
Entweder hat kein Experte Deinen Erstbeitrag gesehen oder die sind alle weg wegen Frühling & so. Versuche doch vielleicht einmal, Deine Lösung deutlich und verständlich zu erläutern. Vielleicht bekommst Du dann noch geeignete Tipps, die Deine Lösung verbessern?
ich hab mich auch etwas über die ausbleibenden Expertentipps gewundert, weil die meisten Beiträge recht schnell und meist gut beantwortet werden. Meine Lösung empfinde ich nicht als 'irgendwie unbefriedigend'; es war nur ziemlich aufwendig zu implementieren, weil ich mich in die Sprache und in die API einarbeiten musste.
Hier der Code:
Code: Alles auswählen
'
' CombineMultiLingualDocs
' =======================
'
' Basic-Programm zur Erstellung mehrsprachiger Dokumente aus Teildokumenten.
'
' Autor: Franz Häring (fh@informeon.de)
' Ersterstellung: 2013-04-15
'
' Beschreibung:
'
' Das Textdokument, in dem dieses Makro ausgeführt wird, ist typischerweise
' leer, enthält aber in den Eigenschaften den Autor usw.
' Der Dateityp kann .odm oder .odt sein. Für diese Beschreibung wird der Name
' als "MainDoc.odm" angenommen.
'
' In Unterordnern "de" und "en" befinden sich Teildokumente des Typs .odt.
' Sprachunabhänige Bestandteilen wie z.B. Bilder sind im Unterverzeichnis 'neutral'.
'
' Das Hauptdokument startet nach dem Laden automatisch ein Makro, das die
' Teildokumente in zwei sprachhabhängige Dokumente
'
' MainDoc_de.odt
'
' und
'
' MainDoc_en.odt
'
' kombiniert. Die Struktur wird durch die Teildokumente im Unterverzeichnis 'de'
' bestimmt. Das englische Dokument enthält die selben Teildokumente, allerdings
' werden sie bevorzugt aus dem Unterverzeichnis 'en' geladen; nur wenn eines dort
' nicht vorhanden ist, wird es aus dem Unterverzeichnis 'de' geladen. Damit ist
' sichergestellt, dass die nicht übersetzten Teile auf aktuellem Stand sind.
'
' Da die Teildokumente in der Reihenfolge hinzugefügt werden, in der sie mit der
' Methode "com.sun.star.ucb.SimpleFileAccess.GetFolderContents()" gelesen
' werden, empfiehlt es sich, sie mit vorangestellten Zahlen zu bezeichnen.
'
' Beispiel:
' ./de/0100 FacingPage
' ./de/0200 Introduction
' ./de/0300 SomeChapter
'
' Wichtig: Die einander entsprechenden Teildokumente müssen in den verschiedenen
' sprachabhängigen Unterordnern exakt gleich heißen.
'
' Für die Pflege des Dokuments ergeben sich daraus folgende Regeln:
'
' - Erweiterungen in Form neuer Teildokumente (diese enthalten Kapitel oder
' Unterkapitel) müssen im Unterverzeichnis 'de' angelegt werden.
'
' - Wenn Änderungen an Teildokumenten gemacht werden, die in anderen Sprachen
' bereits existieren, dann müssen diese übersetzten Teildokumente angepasst
' werden.
'
' - Wenn Teildokumente, die bisher nicht übersetzt sind, übersetzt werden
' sollen, dann sollte das deutsche Teildokument in das Unterverzeichnis
' 'en' kopiert und dort übersetzt werden.
Sub Main
Dim oLocale_de As New com.sun.star.lang.Locale
oLocale_de.Language="de"
oLocale_de.Country="DE"
Dim oLocale_en As New com.sun.star.lang.Locale
oLocale_en.Language="en"
oLocale_en.Country="US"
Call Build(oLocale_de)
Call Build(oLocale_en)
End Sub
Sub Build(oLocale as Object)
Dim oDoc As Object
oDoc = ThisComponent
Dim oSfa as Object
oSfa = createUnoService("com.sun.star.ucb.SimpleFileAccess")
Dim BaseDir as String
BaseDir = GetDirectoryFromFilePath(oDoc.URL)
Dim sThisDocFileName as String
sThisDocFileName=GetFileNameFromFilePath(oDoc.URL)
' Create locale specific document and load it for further operations.
Dim sLocaleSpecDocFilePath as String
sLocaleSpecDocFilePath=BaseDir & Left(sThisDocFileName,Len(sThisDocFileName)-4) & "_" & oLocale.Language & ".odt"
Dim noArgs()
oDoc.storeToURL(sLocaleSpecDocFilePath,oDoc.args())
oDoc = StarDesktop.LoadComponentFromUrl(sLocaleSpecDocFilePath,"_blank",0,noArgs)
' Build relevant directory names.
Dim LocaleSpecDir as String
LocaleSpecDir = BaseDir & oLocale.Language & "/"
Dim StructDefDir as String
StructDefDir = BaseDir & "de" & "/"
Dim FallBackDir as String
FallBackDir = BaseDir & "de" & "/"
' Add subdocuments: Preferrably from given locale, then from fallback locale, then from
' structure defining locale.
Dim sFiles() as String
sFiles=GetFilesInDir(StructDefDir)
Dim sFileName as String
Dim sFilePath as String
For i=LBound(sFiles) to UBound(sFiles)
sFileName=GetFileNameFromFilePath(sFiles(i))
sFilePath=LocaleSpecDir & sFileName
If Not oSfa.Exists(sFilePath) Then
sFilePath=FallBackDir & sFileName
If Not oSfa.Exists(sFilePath) Then
sFilePath=StructDefDir & sFileName
End If
End If
AddSubDocument(oDoc,sFilePath,sFileName)
Next i
' Refresh Tables of Content
oDoc.refresh()
oDoc.store()
oIndexes = oDoc.DocumentIndexes
For i = 0 To oIndexes.Count - 1
oIndex = oIndexes.getByIndex(i)
If oIndex.supportsService("com.sun.star.text.ContentIndex") Then
oIndex.update()
End If
Next
' Save the created document.
oDoc.store()
End Sub
Function GetDirectoryFromFilePath(sFilePath as String) as String
Dim i1,nSlashCount as Integer
Dim sResult as String
sResult=""
i1=Len(sFilePath)
if (Mid(sFilePath,i1,1)="/") then
i1=i1-1
End If
Do While (i1>1)
i1=i1-1
if (Mid(sFilePath,i1,1)="/") then
sResult=Left(sFilePath,i1)
Exit Do
End If
Loop
GetDirectoryFromFilePath=sResult
End Function
Function GetFileNameFromFilePath(sFilePath as String) as String
Dim i1,i2,nSlashCount as Integer
Dim sResult as String
sResult=""
i1=Len(sFilePath)
if (Mid(sFilePath,i1,1)="/") then
i1=i1-1
End If
i2=i1
Do While (i1>1)
i1=i1-1
if (Mid(sFilePath,i1,1)="/") then
sResult=Mid(sFilePath,i1+1,i2-i1)
Exit Do
End If
Loop
GetFileNameFromFilePath=sResult
End Function
Function GetFilesInDir(sDir as String)
Dim DirContent()
Dim sFiles() as String
Dim nFileCount as Integer
Dim oUcbObject as Object
oUcbObject = createUnoService("com.sun.star.ucb.SimpleFileAccess")
If oUcbObject.Exists(sDir) Then
DirContent() = oUcbObject.GetFolderContents(sDir,True)
If Ubound(DirContent()) <> -1 Then
FileCountinDir = Ubound(DirContent())+ 1
nFileCount = 0
For i = 0 to FilecountinDir -1
Filename = DirContent(i)
If oUcbObject.IsFolder(FileName) Then
Else
If (Right(FileName,3)="odt") Then
nFileCount=nFileCount+1
ReDim Preserve sFiles(nFileCount-1)
sFiles(nFileCount-1)=FileName
End If
End If
Next i
End If
Else
Msgbox("Directory '" & ConvertFromUrl(AnchorDir) & "' does not exist!", 16, GetProductName())
End If
GetFilesInDir=sFiles
End Function
Sub AddSubDocument(oDoc As Object,sFilePath as String,sSectionName as String)
Dim oSect
Dim oSectionFileLink as Object
Dim oTC
' Create a text section which links to the sub-document file.
oSect=oDoc.createInstance("com.sun.star.text.TextSection")
oSect.Name=sSectionName
oSectionFileLink=oSect.FileLink
oSectionFileLink.FileURL=sFilePath
oSect.FileLink=oSectionFileLink
' Create a text cursor and insert the section at the end.
oTC = oDoc.Text.createTextCursor()
oTC.gotoEnd(false)
oTC.Text.insertTextContent(oTC, oSect, True)
End Sub
Falls es jemand benutzen will, darf er das gern, vorausgesetzt er verweist auf den Urheber. Es wäre auch schön, davon zu erfahren, um von Verbesserungen zu profitieren.
Gruß
Franz
- Constructus
- *******
- Beiträge: 1610
- Registriert: Mo, 21.01.2008 18:08
- Wohnort: 20 Jahre Brilon - 40 Jahre Essen- Steele
Re: Dokumentstruktur vom Inhalt trennen / mehrsprachiges Han
Hallo Franz,Franz1960 hat geschrieben:
ich hab mich auch etwas über die ausbleibenden Expertentipps gewundert, weil die meisten Beiträge recht schnell und meist gut beantwortet werden. Meine Lösung empfinde ich nicht als 'irgendwie unbefriedigend'; es war nur ziemlich aufwendig zu implementieren, weil ich mich in die Sprache und in die API einarbeiten musste.
Man kann das Ganze natürlich noch verallgemeinern auf mehrere Sprachen oder darauf, dass sich die Dokumentstruktur aus der Vereinigungsmenge der Teildokumente ergibt und nicht aus den Teildokumenten einer bestimmten Sprache.
Falls es jemand benutzen will, darf er das gern, vorausgesetzt er verweist auf den Urheber. Es wäre auch schön, davon zu erfahren, um von Verbesserungen zu profitieren.
ich hätte präziser schreiben sollen: das Herüberbringen Deiner Lösung hier im Forum war unbefriedigend, nicht die Lösung selbst. Aber jetzt hast Du ja ein nachvollziehbares Ergebnis gepostet.

Seit einigen Tagen ist der Andrang auch in diesem Forum gering geworden; bei Frost und Schnee war mehr los...

Ich kann nur hoffen, daß sich noch jemand mit Deinem Thema beschäftigt, der sich mit der Umsetzung von Makroideen auskennt.
Ich wünsche Dir weiter viel Spaß mit den freien Offices- und laß Dich bitte nicht vom Schildern weiterer Ideen hier abhalten. Manchmal kommt eine Antwort auch erst nach Monaten.
Nette Grüße
Constructus
EDV ist wunderbar - o Wunder, wenn sie funktioniert! {°L*}
Freie Offices auf div. Linuxen + 3 VBoxen mit WIN2K
|| LibO + AOO, auf Linux und WIN2K; portable OO & Co. auf WIN
Genaue Typisierung unmöglich, alles ist "im Fluß"
Freie Offices auf div. Linuxen + 3 VBoxen mit WIN2K
|| LibO + AOO, auf Linux und WIN2K; portable OO & Co. auf WIN
Genaue Typisierung unmöglich, alles ist "im Fluß"