Internationalisieren des User-Interfaces

Plone nutzt den Placeless Translation Service um das User-Interface zu übersetzen. Ist das Produkt installiert, werden alle verfügbaren Übersetzungsdateien in /Control_Panel/TranslationService/manage_main angezeigt. Dabei schaut der Placeless Translation Service nach Übersetzungsdateien in i18n- und locales-Ordnern innerhalb von INSTANCE_HOME und INSTANCE_HOME/Products.

Internationalisieren von Page Templates

Domäne

Für jedes Page Template kann im HTML-Header die Standard-Übersetzungsdomäne angegeben werden, z.B.:

<html xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      i18n:domain="vs.registration">

Existiert jedoch für eine Zeichenkette bereits eine Übersetzung in einer anderen Domain, verweisen Sie auf diese, z.B.:

<a href=""
   tal:attributes="href python:test(item_type in use_view_action, item_url+'/view', item_url);"
   i18n:translate="read_more">
    Read More&hellip;
</a>

Inhalte

Text wird mit einer bestimmten message id, hier read_more, verknüpft um übersetzt werden zu können. Würde die message id leer sein, also i18n:translate="", dann wird stattdessen der zu übersetzende Text selbst, hier Read More, verwendet. Dabei sind für die Präfixe der message ids in Plone bestimmte, unten genannte Regeln festgelegt worden.

Attribute

Um Attribute zu übersetzen wird nicht i18n:translate sondern i18n:attributes verwendet. Auch können mehrere Attribute gleichzeitig adressiert werden, wie z.B. in:

<img src="plone.gif"
     alt="Plone Icon"
     title="Plone Icon Title"
     i18n:attributes="alt vs_registration_plone_icon;
                      title vs_registration_plone_icon_title">

Dynamische Inhalte

Mit i18n:name lassen sich auch dynamische Inhalte übersetzen, z.B.:

<p i18n:translate="text_download">There have been
    <span tal:content="here/download_count"
          i18n:name="count">100.000</span>
    downloads of Plone. </p>

Der Eintrag in die Übersetzungsdatei sieht dann folgendermaßen aus:

msgid "text_download"
msgstr "There have been ${count} downloads of Plone."

Für Datum und Zeit wird die localized_time-Methode mit den zwei message ids date_format_long und date_format_short verwendet. Gibt es keine Übersetzungen für eine Sprache wird das Standardformat strftime, wie in den portal_properties angegeben, verwendet. Siehe auch Übersetzen des User-Interfaces: Datum und Urzeit.

Verschachtelungen

Message ids lassen sich auch verschachteln, z.B.:

<p i18n:translate="contentrules_controlpanel_link">
    Use the
    <a i18n:name="controlpanel_link"
       i18n:translate="contentrules_control_panel"
       tal:attributes="href string:${portal/absolute_url}/@@rules-controlpanel">
        content rules control panel
    </a>
    to create new rules or delete or modify existing ones.
</p>

In der Übersetzungsdatei findet die Übersetzung in verschiedenen Abschnitten statt:

msgid "contentrules_controlpanel_link"
msgstr "Benutzen Sie ${controlpanel_link} um neue Regeln zu erstellen, zu löschen oder zu modifizieren."

msgid "contentrules_control_panel"
msgstr "die Regeleinstellungen"

Internationalisieren von Pythonskripten

In Pythonskripten sollten eigentlich keine Angaben zum User Interface stehen. Meist sind jedoch zumindest label und description von Widgets in den Pythonskripten selbst enthalten. Um diese lokalisieren zu können, werden gegebenenfalls label_msgid und description_msgid eingefügt, z.B.:

StringField('event_type', vocabulary='EventTypes',
    widget=SelectionWidget(
        label='Event Type',
        label_msgid='label_event_type',
        description='The type of the event',
        description_msgid='help_event_type',
        i18n_domain='vs.registration'),),

Seit Plone 2.5 kann die Zope Message Factory in Pythonskripten verwendet werden. Hierzu wird zunächst in der __init__.py-Datei des Pakets die Message Factory registriert:

from zope.i18nmessageid import MessageFactory
RegistrationMessageFactory = MessageFactory('vs.registration')

Anschließend lässt sich diese Message Factory in ein Pythonskript importiert mit:

from vs.registration import RegistrationMessageFactory as _

Und nun lassen sich folgende Angaben einfach übersetzen:

label=_(u"Body Text"),
description=_(u"Text for front page of registration")

Mit dem u-Präfix wird Unicode als Kodierung für die Zeichenketten festgelegt. Dieses Beispiel wird in einem Page Template weiterverwendet werden (z.B. in tal:replace oder tal:content).

Falls das Pythonskript nicht in einem Page Template verarbeitet wird, muss translation_service direkt aufgerufen werden:

from Products.CMFCore.utils import getToolByName
...
translation_service = getToolByName(self, 'translation_service')
value = u'John Doo'
return translation_service.utranslate('plone',
                                       u'My name is ${fullname}',
                                       mapping={u'fullname' : value})

Schließlich können auf diese Weise die Titel und Aktionen von Inhaltstypen in einer eigenen Produktdomäne verwaltet werden – es wird keine zusätzliche .pot-Datei für die Plone-Domäne benötigt.

Siehe auch Translating text in code.

Internationalisieren von GenericSetup-Profilen

Verschiedene Angaben in den .xml-Dateien des profiles-Ordner können ebenfalls lokalisert werden, z.B. src/vs.registration/vs/registration/profiles/default/types/Registration.xml:

<object name="Registration"
        meta_type="Factory-based Type Information with dynamic views"
        i18n:domain="vs.registration"
        xmlns:i18n="http://xml.zope.org/namespaces/i18n">
    <property name="title"
              i18n:translate="">Registration</property>

Standardisierte Präfixe

In Plone werden bestimmte Präfixe für message ids verwendet. Da die IDs später alphabetisch sortiert werden, lassen sich semantische Differenzen leichter erkennen.

heading_

für <h>-Elemente.

description_

erläuternder Text direkt unterhalb von <h1>.

legend_

verwendet für <legend>-Elemente.

label_

Für label von input- und textarea-Felder sowie <a>-Elemente.

help_

für Hilfetexte von input-Fledern.

box_

für die Inhalte von Portlets.

listingheader_

für header-Angaben in Tabellen (üblicherweisse in der Klasse``listing``).

date_

für datumsspezifische Angaben, wie z.B. Gestern, letzte Woche.

text_

Nachrichten, die keiner anderen Kategorie zugeordnet werden konnten, üblicherweise innerhalb von <p>.

batch_

für Stapeldarstellungen wie X bis Y von Z.

summary_

für Zusammenfassungen in Tabellen.

title_

für Titel aller Elemente.

message_

für Text in portal_status_message

Den Präfixen folgt nach dem Unterstrich eine kurze Beschreibung der Nachricht, wie z.B. label_address.

Siehe auch: Guide to Prefixes.

Tipps & Tricks

Vermeiden sie aufwändige Differenzierungen

Es ist möglich, z.B. zwischen Singular und Plural zu unterscheiden:

<p i18n:translate="">
  Cart has <tal:block replace="number">#</tal:block>
  book<tal:block condition=
      "python: number <> 1">s</tal:block>.</p>

Dies macht jedoch die Arbeit der Übersetzer sehr schwierig, da in manchen Sprachen der Plural nicht einfach durch ein bis zwei angehängte Buchstaben gebildet wird.

Schließen sie die gesamte Phrase ein

Schließen sie die gesamte Phrase einschließlich der Satzzeichen in die zu übersetzende message id ein.

Teilen sie Sätze nicht in zwei verschiedene message id auf

Verwenden sie für den gesamten Satz den i18n:translate-Tag (s.o.) und verwenden i18n:name für den eingeschlossenen Teil.