Get English translation of msgid

I get every translation (e.g. French, Italian, German) but not English

How do I get the english "translation"?

>>> from zope.i18n import translate
>>> from Products.CMFPlone import PloneMessageFactory as _
>>> for lang in ['en', 'fr', 'it', 'de']:
...     msgid = _(u"label_allow_combined_language_codes")
...     print(lang, translate(msgid, context=plone, target_language=lang))

en label_allow_combined_language_codes  # <- expected: Show country-specific language variants
fr Montrer les variantes de langue spécifiques aux pays
it Mostra le varianti nazionali delle lingue
de Länderspezifische Sprachvarianten anzeigen

>>> translation_service = getToolByName(plone, 'translation_service')
>>> for lang in ['en', 'fr', 'it', 'de']:
...     msgid = _(u"label_allow_combined_language_codes")
...     print(lang, translation_service.translate(msgid, context=plone, target_language=lang))

en label_allow_combined_language_codes  # <- expected: Show country-specific language variants
fr Montrer les variantes de langue spécifiques aux pays
it Mostra le varianti nazionali delle lingue
de Länderspezifische Sprachvarianten anzeigen

Plone’s translation files have no translation for English. This means that of you use a label instead of the english source as msg id. the ‘default’ translation is the English fallback.

If you mark a string in a (zope) page template you also always specify the default text, which is english, and optionally you can add a label.

In your example above you create a msgid with the _ function for a label you know that exists in the translation files in plone.app.locales. But you don’t pass the default (English) text.

If you look at the origin where this msgid/label was extracted from, you’lll see that the default is specified there as well. From the .pot file:

#. Default: "Show country-specific language variants"
#: plone.i18n/plone/i18n/interfaces.py:66
msgid "label_allow_combined_language_codes"
msgstr ""

its in the plone.i18n package in the interfaces file.

So to summarise, you’re looking for something that isn’t there because in Zope/Plone the translation substitution starts at the point in code or template where the message is defined, always with a fallback/default which is by convention the English source.

If you know which label you want to piggyback on, you also have to copy/add the default from that label

@fredvd: Thank you!

I was wrongly reading ILanguageSchema.use_combined_language_codes.title as str.
I must read it as zope.i18nmessageid.message.Message.