Translations of portal status messages in KSS
What do you do when KSS does not translate your portal status messages? And what if Dutch translations are shown when you expect English?
You have a package that has some translations. One of those translations is used in a portal status message that gets shown by a KSS action. Something like this, taken from the xm.tracker package:
from kss.core import kssaction from plone.app.kss.plonekssview import PloneKSSView from zope.i18nmessageid import MessageFactory _ = MessageFactory('tracker') class KSSStart(PloneKSSView): """kss view for starting the timer""" @kssaction def start_timer(self): message = _(u'msg_started_timer', default=u'Started the timer') plone = self.getCommandSet("plone") plone.issuePortalMessage(message)
But -- tragedy of tragedies! -- it gets shown in English even though you have a fine Dutch translation and your Plone Site has Dutch as default language. What can possibly be wrong? Two things really.
plone.app.kss
For translations of portal messages you need plone.app.kss 1.4.3 or later. Check your Plone version. If it is Plone 3.1.5 or later you are fine. If you have 3.1.4 or earlier you need to upgrade Plone or update the plone.app.kss package.
Products/*/i18n
Are translations still not showing up? Then your package is probably in the Products name space and your translations are in an i18n folder. That directory is the domain of the PlacelessTranslationService from Plone. Those translations are not found by the zope.i18n translation machinery, which is in effect in plone.app.kss. You may encounter the same problem when you are using pure Zope 3 page templates.
To fix it, you need to add a few lines to your product. For example, I just added this in Products/eXtremeManagement/__init__.py:
from Products.PlacelessTranslationService.utility import PTSTranslationDomain xmdomain = PTSTranslationDomain('eXtremeManagement')
Then register that as a utility in your configure.zcml:
In the next major Plone release (4.0) this will not be needed anymore, but that is still quite a way off. You will probably be using locales then anyway.
I want English!
While I am writing about translations, here is something else I bumped into. Take a Plone Site with Dutch as default language and English as an allowed language. Take a package with a registered locales directory. It has Dutch translations in the locales/nl/LC_MESSAGES directory. Now visit that site with English as the preferred (or only) language of your browser. With the proper settings in the portal_languages tool of your Plone Site, this should present the user interface mostly in English. But: the translations for your package will be shown in Dutch! What is wrong here?
The problem is that the translation machinery does not know that the default strings (message ids) of your package are in English. It might as well be in Chinese and it refuses to guess. So what you do is: create a locales/en/LC_MESSAGES directory, copy your mydomain.pot file there and change its name to mydomain.po. You probably want to change some of the headers of that file slightly. Restart Zope and you should be able to enjoy the beautiful English language again. Tally ho!