Dokumentstruktur vom Inhalt trennen / mehrsprachiges Handbuc

Das Textverarbeitungsprogramm

Moderator: Moderatoren

Franz1960
Beiträge: 2
Registriert: Di, 16.04.2013 14:27

Re: Dokumentstruktur vom Inhalt trennen / mehrsprachiges Han

Beitrag von Franz1960 »

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
Benutzeravatar
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

Beitrag von Constructus »

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... :(
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ß"
Franz1960
Beiträge: 2
Registriert: Di, 16.04.2013 14:27

Re: Dokumentstruktur vom Inhalt trennen / mehrsprachiges Han

Beitrag von Franz1960 »

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?
Hallo Constructus,

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
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.

Gruß
Franz
Benutzeravatar
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

Beitrag von Constructus »

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.
Hallo Franz,

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. :D Aber wenn man so nachts in Foren herumgeistert, passieren schon mal ungewollt Fehler, sieh mir das bitte nach.
Seit einigen Tagen ist der Andrang auch in diesem Forum gering geworden; bei Frost und Schnee war mehr los... :shock:

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ß"
Antworten