======================================== 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.:: Existiert jedoch für eine Zeichenkette bereits eine Übersetzung in einer anderen Domain, verweisen Sie auf diese, z.B.:: Read More… 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:: Dynamische Inhalte ------------------ Mit ``i18n:name`` lassen sich auch dynamische Inhalte übersetzen, z.B.::
There have been 100.000 downloads of Plone.
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.::Use the content rules control panel to create new rules or delete or modify existing ones.
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``::