Sektionen
Benutzerspezifische Werkzeuge
Sie sind hier: Startseite Support Dokumentation docs Eigene ContentTypes für LinguaPlone aufbereiten

Eigene ContentTypes für LinguaPlone aufbereiten

Mit LinguaPlone lassen sich beliebige Inhalte in mehrere Sprechen übersetzen. Die Unterstützung ist per Default auch für die eigenen CT's aktiviert. Jedoch gibt es ein paar Stellen, auf die man besonders achten muss.

Wenn man sich seinen eigenen ContentType anlegt (meist mit paster addcontent) bekommt man ein solides Basisgerüst, welches auch die LinguaPlone-Unterstützung gleich mitbringt (und auch aktiviert, sofern es installiert ist). Dies kommt durch den Import in der Basisklasse Products.ATContentTypes.content.base:

from Products.ATContentTypes.config import HAS_LINGUA_PLONE
if HAS_LINGUA_PLONE:
    from Products.LinguaPlone.public import BaseContent
    from Products.LinguaPlone.public import BaseFolder
    from Products.LinguaPlone.public import OrderedBaseFolder
    from Products.LinguaPlone.public import BaseBTreeFolder
    from Products.LinguaPlone.public import registerType
else:
    from Products.Archetypes.atapi import BaseContent
    from Products.Archetypes.atapi import BaseFolder
    from Products.Archetypes.atapi import OrderedBaseFolder
    from Products.Archetypes.atapi import BaseBTreeFolder
    from Products.Archetypes.atapi import registerType

Per Default sind alle Felder in einem Schema sprachbezogen, d.h. sie werden bei einer Übersetzung neu ausgefüllt. Manchmal möchte man aber genau dies nicht, zum Beispiel bei Datumsfeldern oder Bildern (wie bei ATNewsItem). Dafür bietet LinguaPlone ein spezielles Flag, welches im Schema dem Feld hinzugefügt werden kann: languageIndependent.

    atapi.DateTimeField(
        'date',
        storage=atapi.AnnotationStorage(),
        widget=atapi.CalendarWidget(
            label=_(u"Date"),
            description=_(u"Enter a valid date and time."),
        ),
        required=True,
        validators=('isValidDate'),
        languageIndependent=True,
    ),

Dies funktioniert auch wunderbar bei der ersten Übersetzung. Alle sprachunabhängigen Felder behalten ihren Inhalt. Ändert man nun in dem Original-Dokument ein sprachunabhängiges Feld, so erwartet man, dass es in den Übersetzungen ebenfalls geändert wird. Dem ist aber leider nicht so. Der Fehler liegt in dem von paster erstellten Code.

...
from Products.Archetypes import atapi
...
atapi.registerType(MyContentType, PROJECTNAME)

Wenn wir uns den Import in der Basisklasse noch einmal anschauen stellen wir fest, dass dort aber, wenn LinguaPlone vorhanden ist, registerType aus dem LingaPlone Package genommen wird. Nun könnte man den Import von Hand hinzufügen und den Funktionsaufruf ändern, oder sich noch einmal die Basisklasse anschauen. Dort gibt es die Funktion registerATCT:

def registerATCT(class_, project):
    """Registers an ATContentTypes based type

    One reason to use it is to hide the lingua plone related magic.
    """
    assert IATContentType.isImplementedByInstancesOf(class_)
    registerType(class_, project)

Unseren Code müssen wir also nur wie folgt ändern:

from Products.ATContentTypes.content import base
...
base.registerATCT(MyContentType, PROJECTNAME)

Danach werden die Inhalte aller Felder, die das Flag languageIndependent=True gesetzt haben, automatisch in allen Übersetzungen aktualisiert, sobald Änderungen am Originaldokument vorgenommen wurden.