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
.
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…
</a>
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.
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">
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.
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"
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.
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>
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.
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 einschließlich der Satzzeichen in die zu übersetzende message id ein.
Verwenden sie für den gesamten Satz den i18n:translate
-Tag (s.o.) und verwenden i18n:name
für den eingeschlossenen Teil.