def preferred_language_locale_negotiator(request):
    """
    A pyramid locale negotiator that piggybacks off
    the preferred language support. We return a valid locale
    name consisting of at most language-territory, but at least language.
    A valid locale is one for which we have available locale data,
    not necessarily one for which any translation data is available.
    """
    # pylint:disable=too-many-function-args, assignment-from-no-return

    # This code is similar to that in zope.publisher.http.HTTPRequest.
    # it's point is to find the most specific available locale possible.
    # We differ in that, instead of returning a generic default, we
    # specifically return the english default. We also differ in that we
    # return a locale name instead of a locale object.

    result = EnglishUserPreferredLanguagesImpl.PREFERRED_LANGUAGES[0]

    pref_langs = IUserPreferredLanguages(request, ())
    if pref_langs:
        pref_langs = pref_langs.getPreferredLanguages()

    for lang in pref_langs:
        parts = (lang.split('-') + [None, None])[:3]
        try:
            locales.getLocale(*parts)
            result = lang
            break
        except LoadLocaleError: # pragma: no cover
            continue

    return result
Example #2
0
def get_locale_dates(request=_marker, locale=_marker):
    """Return the date formatter given the request.
    """
    local_info = locale
    if local_info is _marker:
        local_info = get_locale_info(request)
    try:
        return locales.getLocale(*local_info.split('-')).dates
    except LoadLocaleError:
        return locales.getLocale('en').dates
Example #3
0
def get_locale(request):
    """Adapts request to ILocale based on preferred language.

    Under the hood a call to IUserPreferredLanguages will help decide
    language.
    """
    langs = IUserPreferredLanguages(request).getPreferredLanguages()
    if not langs or langs[0] == '':
        return locales.getLocale(None, None, None)
    else:
        parts = (langs[0].split('-') + [None, None])[:3]
        return locales.getLocale(*parts)
Example #4
0
    def __init__(self, body_instream=None, environ=None, form=None,
                 skin=None, outstream=None,
                 **kw):

        _testEnv =  {
            'SERVER_URL':         'http://127.0.0.1',
            'HTTP_HOST':          '127.0.0.1',
            'CONTENT_LENGTH':     '0',
            'GATEWAY_INTERFACE':  'TestFooInterface/1.0',
            }

        if environ is not None:
            # BBB: This is backward-compatibility support for the deprecated
            # output stream.
            try:
                environ.get
            except AttributeError:
                import warnings
                warnings.warn("Can't pass output streams to requests anymore. "
                              "This will go away in Zope 3.4.",
                              DeprecationWarning,
                              2)
                environ, form, skin, outstream = form, skin, outstream, environ

            _testEnv.update(environ)

        if kw:
            _testEnv.update(kw)
        if body_instream is None:
            from StringIO import StringIO
            body_instream = StringIO('')

        super(TestRequest, self).__init__(body_instream, _testEnv)
        if form:
            self.form.update(form)

        # Setup locale object
        langs = BrowserLanguages(self).getPreferredLanguages()
        from zope.i18n.locales import locales
        if not langs or langs[0] == '':
            self._locale = locales.getLocale(None, None, None)
        else:
            parts = (langs[0].split('-') + [None, None])[:3]
            self._locale = locales.getLocale(*parts)

        if skin is not None:
            directlyProvides(self, skin)
        else:
            directlyProvides(self, IDefaultBrowserLayer)

        # BBB: Goes away in 3.4.
        self.response.outstream = outstream
Example #5
0
def _get_locales_info(portal):
    reg = queryUtility(IRegistry, context=portal)
    language = reg['plone.default_language']
    parts = (language.split('-') + [None, None])[:3]

    try:
        locale = locales.getLocale(*parts)

        # If we get a territory, we enable the combined language codes
        if locale.id.territory:
            return locale.id.language + '_' + locale.id.territory, True, locale
        return locale.id.language, False, locale
    except LoadLocaleError:
        # default to *some* language so we don't error out
        return language, False, locales.getLocale('en')
Example #6
0
def _get_locales_info(portal):
    reg = queryUtility(IRegistry, context=portal)
    language = reg['plone.default_language']
    parts = (language.split('-') + [None, None])[:3]

    try:
        locale = locales.getLocale(*parts)

        # If we get a territory, we enable the combined language codes
        if locale.id.territory:
            return locale.id.language + '_' + locale.id.territory, True, locale
        return locale.id.language, False, locale
    except LoadLocaleError:
        # default to *some* language so we don't error out
        return language, False, locales.getLocale('en')
def first_weekday_setup(context):
    """Set the first day of the week based on the portal's locale.
    """
    reg = getUtility(IRegistry)
    if reg.get('plone.first_weekday') is not None:
        # don't overwrite if it's already set
        return

    first = 6
    try:
        site = getSite()
        # find the locale implied by the portal's language
        language = site.Language()
        parts = (language.split('-') + [None, None])[:3]
        locale = locales.getLocale(*parts)
        # look up first day of week
        gregorian_calendar = locale.dates.calendars.get(u'gregorian', None)
        if gregorian_calendar is not None:
            day = gregorian_calendar.week.get('firstDay', 7)
            first = 6 if day == 0 else day - 1
    except LoadLocaleError:
        # If we cannot get the locale, just Sunday as first weekday
        pass

    # save setting
    reg['plone.first_weekday'] = first
Example #8
0
def first_weekday_setup(context):
    """Set the first day of the week based on the portal's locale.
    """
    reg = getUtility(IRegistry)
    settings = reg.forInterface(IEventSettings, prefix="plone.app.event")
    if settings.first_weekday is not None:
        # don't overwrite if it's already set
        return

    first = 6
    try:
        site = getSite()
        # find the locale implied by the portal's language
        language = site.Language()
        parts = (language.split('-') + [None, None])[:3]
        locale = locales.getLocale(*parts)
        # look up first day of week
        gregorian_calendar = locale.dates.calendars.get(u'gregorian', None)
        if gregorian_calendar is not None:
            first = wkday_to_mon0(gregorian_calendar.week.get('firstDay', 7))
    except LoadLocaleError:
        # If we cannot get the locale, just Sunday as first weekday
        pass
    # save setting
    settings.first_weekday = first
Example #9
0
def currency_format(context, locale):
    locale = locales.getLocale(locale)
    currency = context.bika_setup.getCurrency()
    symbol = locale.numbers.currencies[currency].symbol
    def format(val):
        return '%s %0.2f' % (symbol, val)
    return format
Example #10
0
 def locale(self):
     try:
         # Country is optional
         lang_country = get_locale_name(self).split('-')
     except AttributeError:  # Testing, registry has no settings
         lang_country = ('en', 'US')
     return locales.getLocale(*lang_country)
Example #11
0
def first_weekday_setup(context):
    """Set the first day of the week based on the portal's locale.
    """
    reg = getUtility(IRegistry)
    settings = reg.forInterface(IEventSettings, prefix="plone.app.event")
    if settings.first_weekday is not None:
        # don't overwrite if it's already set
        return

    first = 6
    try:
        site = getSite()
        # find the locale implied by the portal's language
        language = site.Language()
        parts = (language.split('-') + [None, None])[:3]
        locale = locales.getLocale(*parts)
        # look up first day of week
        gregorian_calendar = locale.dates.calendars.get(u'gregorian', None)
        if gregorian_calendar is not None:
            first = wkday_to_mon0(gregorian_calendar.week.get('firstDay', 7))
    except LoadLocaleError:
        # If we cannot get the locale, just Sunday as first weekday
        pass
    # save setting
    settings.first_weekday = first
    def _set_language_de(self):
        """This Function is used to set the language of the plone site.
        We need this, because we wan't to make sure that the language is
        inherited when there isn't one forced.
        """
        locale = locales.getLocale('de')
        target_language = locale.id.language

        # If we get a territory, we enable the combined language codes
        use_combined = False
        if locale.id.territory:
            use_combined = True
            target_language += '_' + locale.id.territory

            # As we have a sensible language code set now, we disable the
            # start neutral functionality

        tool = getToolByName(self.portal, "portal_languages")

        tool.manage_setLanguageSettings(
            target_language,
            [target_language],
            setUseCombinedLanguageCodes=use_combined,
            startNeutral=False)
        transaction.commit()
Example #13
0
    def folderitems(self):
        self.categories = []

        bsc = getToolByName(self.context, 'bika_setup_catalog')
        wf = getToolByName(self.context, 'portal_workflow')
        mtool = getToolByName(self.context, 'portal_membership')
        member = mtool.getAuthenticatedMember()
        roles = member.getRoles()
        self.allow_edit = 'LabManager' in roles or 'Manager' in roles

        items = BikaListingView.folderitems(self)

        for x in range(len(items)):
            if not items[x].has_key('obj'): continue
            obj = items[x]['obj']

            cat = obj.getCategoryTitle()
            items[x]['category'] = cat
            if cat not in self.categories:
                self.categories.append(cat)

            analyses = [a.UID() for a in self.fieldvalue]

            items[x]['selected'] = items[x]['uid'] in analyses

            items[x]['class']['Title'] = 'service_title'

            calculation = obj.getCalculation()
            items[x]['Calculation'] = calculation and calculation.Title()

            locale = locales.getLocale('en')
            currency = self.context.bika_setup.getCurrency()
            symbol = locale.numbers.currencies[currency].symbol
            items[x]['Price'] = "%s %s" % (symbol, obj.getPrice())
            items[x]['class']['Price'] = 'nowrap'

            after_icons = ''
            if obj.getAccredited():
                after_icons += "<img\
                src='%s/++resource++bika.lims.images/accredited.png'\
                title='%s'>" % (self.context.absolute_url(), _("Accredited"))
            if obj.getReportDryMatter():
                after_icons += "<img\
                src='%s/++resource++bika.lims.images/dry.png'\
                title='%s'>" % (self.context.absolute_url(),
                                _("Can be reported as dry matter"))
            if obj.getAttachmentOption() == 'r':
                after_icons += "<img\
                src='%s/++resource++bika.lims.images/attach_reqd.png'\
                title='%s'>" % (self.context.absolute_url(),
                                _("Attachment required"))
            if obj.getAttachmentOption() == 'n':
                after_icons += "<img\
                src='%s/++resource++bika.lims.images/attach_no.png'\
                title='%s'>" % (self.context.absolute_url(),
                                _('Attachment not permitted'))
            if after_icons:
                items[x]['after']['Title'] = after_icons
        self.categories.sort()
        return items
Example #14
0
def get_locale(request):
    """
    return locale based on HTTP request header ACCEPT_LANGUAGES.

    We need languages to get locale, and the locale on the request
    object gets this wrong (removes territory part of locale). This
    does essentially what ZPublisher.HTTPRequest does to load a
    locale, but with a fixed (predictable, correct) adapter.

    zope.publisher.browser.BrowserLangauges is an adapter with
    fixed behavior to correctly get languages.  Other adapters in
    Plone packages (e.g. PTSLanguages) may interfere with
    ZPublisher.HTTPRequest.locales loading territory, so we prefer
    a fixed adapter rather than an adapter looked-up by registration
    via IUserPreferredLanguages.
    """
    locale = None
    languages = BrowserLanguages(request).getPreferredLanguages()
    for lang in languages:
        parts = (lang.split('-') + [None, None])[:3]
        try:
            locale = locales.getLocale(*parts)
            break
        except LoadLocaleError:
            pass
    return locale
def first_weekday_setup(context):
    """Set the first day of the week based on the portal's locale.
    """
    reg = getUtility(IRegistry)
    if reg.get('plone.first_weekday') is not None:
        # don't overwrite if it's already set
        return

    first = 6
    try:
        site = getSite()
        # find the locale implied by the portal's language
        language = site.Language()
        parts = (language.split('-') + [None, None])[:3]
        locale = locales.getLocale(*parts)
        # look up first day of week
        gregorian_calendar = locale.dates.calendars.get(u'gregorian', None)
        if gregorian_calendar is not None:
            day = gregorian_calendar.week.get('firstDay', 7)
            first = 6 if day == 0 else day - 1
    except LoadLocaleError:
        # If we cannot get the locale, just Sunday as first weekday
        pass

    # save setting
    reg['plone.first_weekday'] = first
Example #16
0
def get_locale(request):
    """
    return locale based on HTTP request header ACCEPT_LANGUAGES.

    We need languages to get locale, and the locale on the request
    object gets this wrong (removes territory part of locale). This
    does essentially what ZPublisher.HTTPRequest does to load a
    locale, but with a fixed (predictable, correct) adapter.

    zope.publisher.browser.BrowserLangauges is an adapter with
    fixed behavior to correctly get languages.  Other adapters in
    Plone packages (e.g. PTSLanguages) may interfere with
    ZPublisher.HTTPRequest.locales loading territory, so we prefer
    a fixed adapter rather than an adapter looked-up by registration
    via IUserPreferredLanguages.
    """
    locale = None
    languages = BrowserLanguages(request).getPreferredLanguages()
    for lang in languages:
        parts = (lang.split("-") + [None, None])[:3]
        try:
            locale = locales.getLocale(*parts)
            break
        except LoadLocaleError:
            pass
    return locale
Example #17
0
def currency_format(context, locale):
    locale = locales.getLocale(locale)
    currency = context.bika_setup.getCurrency()
    symbol = locale.numbers.currencies[currency].symbol
    def format(val):
        return '%s %0.2f' % (symbol, val)
    return format
    def folderitems(self):
        mtool = getToolByName(self.context, 'portal_membership')
        member = mtool.getAuthenticatedMember()
        roles = member.getRoles()
        self.allow_edit = 'LabManager' in roles or 'Manager' in roles

        items = BikaListingView.folderitems(self)
        for x in range(len(items)):
            if not items[x].has_key('obj'):
                continue
            obj = items[x]['obj']

            cat = obj.getCategoryTitle()
            # Category (upper C) is for display column value
            items[x]['Category'] = cat
            if self.do_cats:
                # category is for bika_listing to groups entries
                items[x]['category'] = cat
                if cat not in self.categories:
                    self.categories.append(cat)

            analyses = [a.UID() for a in self.field_value]
            items[x]['selected'] = items[x]['uid'] in analyses

            items[x]['class']['Title'] = 'service_title'

            calculation = obj.getCalculation()
            items[x]['Calculation'] = calculation and calculation.Title()

            locale = locales.getLocale('en')
            currency = self.context.bika_setup.getCurrency()
            symbol = locale.numbers.currencies[currency].symbol
            items[x]['Price'] = "%s %s" % (symbol, obj.getPrice())
            items[x]['class']['Price'] = 'nowrap'

            after_icons = ''
            if obj.getAccredited():
                after_icons += "<img\
                    src='%s/++resource++bika.lims.images/accredited.png'\
                    title='%s'>" % (self.context.absolute_url(),
                                    _("Accredited"))
            if obj.getReportDryMatter():
                after_icons += "<img\
                    src='%s/++resource++bika.lims.images/dry.png'\
                    title='%s'>" % (self.context.absolute_url(),
                                    _("Can be reported as dry matter"))
            if obj.getAttachmentOption() == 'r':
                after_icons += "<img\
                    src='%s/++resource++bika.lims.images/attach_reqd.png'\
                    title='%s'>" % (self.context.absolute_url(),
                                    _("Attachment required"))
            if obj.getAttachmentOption() == 'n':
                after_icons += "<img\
                    src='%s/++resource++bika.lims.images/attach_no.png'\
                    title='%s'>" % (self.context.absolute_url(),
                                    _('Attachment not permitted'))
            if after_icons:
                items[x]['after']['Title'] = after_icons

        return items
Example #19
0
 def get_currency_symbol(self):
     """Get the currency Symbol
     """
     locale = locales.getLocale('en')
     setup = api.get_setup()
     currency = setup.getCurrency()
     return locale.numbers.currencies[currency].symbol
Example #20
0
File: form.py Project: goschtl/zope
def getLocale(request):
    envadapter = IUserPreferredLanguages(request, None)
    if envadapter is None:
        return None

    langs = envadapter.getPreferredLanguages()
    for httplang in langs:
        parts = (httplang.split('-') + [None, None])[:3]
        try:
            return locales.getLocale(*parts)
        except LoadLocaleError:
            # Just try the next combination
            pass
    else:
        # No combination gave us an existing locale, so use the default,
        # which is guaranteed to exist
        return locales.getLocale(None, None, None)
Example #21
0
def _getLocale(request):
    envadapter = IUserPreferredLanguages(request, None)
    if envadapter is None:
        return None

    langs = envadapter.getPreferredLanguages()
    for httplang in langs:
        parts = (httplang.split('-') + [None, None])[:3]
        try:
            return locales.getLocale(*parts)
        except LoadLocaleError:
            # Just try the next combination
            pass
    else:
        # No combination gave us an existing locale, so use the default,
        # which is guaranteed to exist
        return locales.getLocale(None, None, None)
Example #22
0
 def __call__(self, context):
     items = []
     currencies = locales.getLocale('zh','cn').numbers.currencies.values()
     currencies.sort(lambda x,y:cmp(x.displayName, y.displayName))
     for c in currencies:
         items.append(SimpleVocabulary.createTerm(
             c.type, c.type,
             "%s (%s)" % (c.displayName, c.symbol)))
     return SimpleVocabulary(items)
 def get_currency_symbol(self):
     """Returns the locale currency symbol
     """
     currency = self.context.bika_setup.getCurrency()
     locale = locales.getLocale("en")
     locale_currency = locale.numbers.currencies.get(currency)
     if locale_currency is None:
         return "$"
     return locale_currency.symbol
Example #24
0
 def __call__(self):
     context = self.context
     workflow = getToolByName(context, 'portal_workflow')
     # Gather relted objects
     batch = context.aq_parent
     client = context.getClient()
     analysis_request = context.getAnalysisRequest(
     ) if context.getAnalysisRequest() else None
     # Gather general data
     self.invoiceId = context.getId()
     self.invoiceDate = self.ulocalized_time(context.getInvoiceDate())
     self.subtotal = '%0.2f' % context.getSubtotal()
     self.VATAmount = '%0.2f' % context.getVATAmount()
     self.total = '%0.2f' % context.getTotal()
     # Create the batch range
     start = self.ulocalized_time(batch.getBatchStartDate())
     end = self.ulocalized_time(batch.getBatchEndDate())
     self.batchRange = "%s to %s" % (start, end)
     # Gather client data
     self.clientName = client.Title()
     self.clientURL = client.absolute_url()
     self.clientPhone = client.getPhone()
     self.clientFax = client.getFax()
     self.clientEmail = client.getEmailAddress()
     self.clientAccountNumber = client.getAccountNumber()
     # currency info
     locale = locales.getLocale('en')
     self.currency = self.context.bika_setup.getCurrency()
     self.symbol = locale.numbers.currencies[self.currency].symbol
     # Get an available client address in a preferred order
     self.clientAddress = None
     # A list with the items and its invoice values to render in template
     self.items = []
     addresses = (
         client.getBillingAddress(),
         client.getPostalAddress(),
         client.getPhysicalAddress(),
     )
     for address in addresses:
         if address.get('address'):
             self.clientAddress = address
             break
     # Gather the line items
     items = context.invoice_lineitems
     for item in items:
         invoice_data = {
             'invoiceDate': self.ulocalized_time(item.get('ItemDate', '')),
             'description': item.get('ItemDescription', ''),
             'orderNo': item.get('OrderNumber', ''),
             'subtotal': '%0.2f' % item.get('Subtotal', ''),
             'VATAmount': '%0.2f' % item.get('VATAmount', ''),
             'total': '%0.2f' % item.get('Total', ''),
         }
         self.items.append(invoice_data)
     # Render the template
     return self.template()
Example #25
0
def _get_locales_info(portal):
    language = portal.Language()
    parts = (language.split('-') + [None, None])[:3]
    locale = locales.getLocale(*parts)

    # If we get a territory, we enable the combined language codes
    if locale.id.territory:
        return locale.id.language + '_' + locale.id.territory, True, locale

    return locale.id.language, False, locale
def _get_locales_info(portal):
    language = portal.Language()
    parts = (language.split('-') + [None, None])[:3]
    locale = locales.getLocale(*parts)
    # If we get a territory, we enable the combined language codes
    use_combined = False
    if locale.id.territory:
        use_combined = True
        target_language += '_' + locale.id.territory
    return locale.id.language, use_combined, locale
 def formatDateTime(self, instance, dt):
     if not dt:
         return u''
     dt = timezoneAdjuster(instance, dt)
     site = self._site(instance)
     locale = ILocaleFactory(site)
     locale = locales.getLocale(locale, locale)
     if not self.show_hm:
         return ltimefmt(dt, locale, category="date", length="short")
     return ltimefmt(dt, locale, category="dateTime", length="short")
Example #28
0
def _get_locales_info(portal):
    language = portal.Language()
    parts = (language.split('-') + [None, None])[:3]
    locale = locales.getLocale(*parts)
    # If we get a territory, we enable the combined language codes
    use_combined = False
    if locale.id.territory:
        use_combined = True
        target_language += '_' + locale.id.territory
    return locale.id.language, use_combined, locale
Example #29
0
    def setupLocale(self):
        envadapter = IUserPreferredLanguages(self, None)
        if envadapter is None:
            self._locale = None
            return

        langs = envadapter.getPreferredLanguages()
        for httplang in langs:
            parts = (httplang.split("-") + [None, None])[:3]
            try:
                self._locale = locales.getLocale(*parts)
                return
            except LoadLocaleError:
                # Just try the next combination
                pass
        else:
            # No combination gave us an existing locale, so use the default,
            # which is guaranteed to exist
            self._locale = locales.getLocale(None, None, None)
Example #30
0
 def __call__(self):
     context = self.context
     workflow = getToolByName(context, 'portal_workflow')
     # Gather relted objects
     batch = context.aq_parent
     client = context.getClient()
     analysis_request = context.getAnalysisRequest() if context.getAnalysisRequest() else None
     # Gather general data
     self.invoiceId = context.getId()
     self.invoiceDate = self.ulocalized_time(context.getInvoiceDate())
     self.subtotal = '%0.2f' % context.getSubtotal()
     self.VATAmount = '%0.2f' % context.getVATAmount()
     self.total = '%0.2f' % context.getTotal()
     # Create the batch range
     start = self.ulocalized_time(batch.getBatchStartDate())
     end = self.ulocalized_time(batch.getBatchEndDate())
     self.batchRange = "%s to %s" % (start, end)
     # Gather client data
     self.clientName = client.Title()
     self.clientURL = client.absolute_url()
     self.clientPhone = client.getPhone()
     self.clientFax = client.getFax()
     self.clientEmail = client.getEmailAddress()
     self.clientAccountNumber = client.getAccountNumber()
     # currency info
     locale = locales.getLocale('en')
     self.currency = self.context.bika_setup.getCurrency()
     self.symbol = locale.numbers.currencies[self.currency].symbol
     # Get an available client address in a preferred order
     self.clientAddress = None
     # A list with the items and its invoice values to render in template
     self.items = []
     addresses = (
         client.getBillingAddress(),
         client.getPostalAddress(),
         client.getPhysicalAddress(),
     )
     for address in addresses:
         if address.get('address'):
             self.clientAddress = address
             break
     # Gather the line items
     items = context.invoice_lineitems
     for item in items:
         invoice_data = {
             'invoiceDate': self.ulocalized_time(item.get('ItemDate', '')),
             'description': item.get('ItemDescription', ''),
             'orderNo': item.get('OrderNumber', ''),
             'subtotal': '%0.2f' % item.get('Subtotal', ''),
             'VATAmount': '%0.2f' % item.get('VATAmount', ''),
             'total': '%0.2f' % item.get('Total', ''),
         }
         self.items.append(invoice_data)
     # Render the template
     return self.template()
Example #31
0
def setup_language(portal):
    """When installing plone, the language is set when creating
    example content.
    If the content creation profile ``Products.CMFPlone:plone-content``
    is not installed, the lanuage is not set up properly.

    This setup handler allows to only setup the language but not
    create example content by putting a ``inflator-setup-language.txt``
    in a generic setup profile which is used on initialization.

    The code of this function is copied from
    ``Products.CMFPlone.setuphandlers.setupPortalContent``.
    """
    language = portal.Language()
    parts = (language.split('-') + [None, None])[:3]
    locale = locales.getLocale(*parts)
    target_language = base_language = locale.id.language

    # If we get a territory, we enable the combined language codes
    use_combined = False
    if locale.id.territory:
        use_combined = True
        target_language += '_' + locale.id.territory

    # As we have a sensible language code set now, we disable the
    # start neutral functionality
    tool = getToolByName(portal, "portal_languages")

    tool.manage_setLanguageSettings(language,
        [language],
        setUseCombinedLanguageCodes=use_combined,
        startNeutral=False)

    # Set the first day of the week, defaulting to Sunday, as the
    # locale data doesn't provide a value for English. European
    # languages / countries have an entry of Monday, though.
    calendar = getToolByName(portal, "portal_calendar", None)
    if calendar is not None:
        first = 6
        gregorian = locale.dates.calendars.get(u'gregorian', None)
        if gregorian is not None:
            first = gregorian.week.get('firstDay', None)
            # on the locale object we have: mon : 1 ... sun : 7
            # on the calendar tool we have: mon : 0 ... sun : 6
            if first is not None:
                first = first - 1

        calendar.firstweekday = first

    # Enable visible_ids for non-latin scripts

    # See if we have an url normalizer
    normalizer = queryUtility(IURLNormalizer, name=target_language)
    if normalizer is None:
        normalizer = queryUtility(IURLNormalizer, name=base_language)
Example #32
0
def setup_language(portal):
    """When installing plone, the language is set when creating
    example content.
    If the content creation profile ``Products.CMFPlone:plone-content``
    is not installed, the lanuage is not set up properly.

    This setup handler allows to only setup the language but not
    create example content by putting a ``inflator-setup-language.txt``
    in a generic setup profile which is used on initialization.

    The code of this function is copied from
    ``Products.CMFPlone.setuphandlers.setupPortalContent``.
    """
    language = portal.Language()
    parts = (language.split('-') + [None, None])[:3]
    locale = locales.getLocale(*parts)
    target_language = base_language = locale.id.language

    # If we get a territory, we enable the combined language codes
    use_combined = False
    if locale.id.territory:
        use_combined = True
        target_language += '_' + locale.id.territory

    # As we have a sensible language code set now, we disable the
    # start neutral functionality
    tool = getToolByName(portal, "portal_languages")

    tool.manage_setLanguageSettings(language, [language],
                                    setUseCombinedLanguageCodes=use_combined,
                                    startNeutral=False)

    # Set the first day of the week, defaulting to Sunday, as the
    # locale data doesn't provide a value for English. European
    # languages / countries have an entry of Monday, though.
    calendar = getToolByName(portal, "portal_calendar", None)
    if calendar is not None:
        first = 6
        gregorian = locale.dates.calendars.get(u'gregorian', None)
        if gregorian is not None:
            first = gregorian.week.get('firstDay', None)
            # on the locale object we have: mon : 1 ... sun : 7
            # on the calendar tool we have: mon : 0 ... sun : 6
            if first is not None:
                first = first - 1

        calendar.firstweekday = first

    # Enable visible_ids for non-latin scripts

    # See if we have an url normalizer
    normalizer = queryUtility(IURLNormalizer, name=target_language)
    if normalizer is None:
        normalizer = queryUtility(IURLNormalizer, name=base_language)
Example #33
0
def _get_locales_info(portal):
    reg = queryUtility(IRegistry, context=portal)
    language = reg['plone.default_language']
    parts = (language.split('-') + [None, None])[:3]
    locale = locales.getLocale(*parts)

    # If we get a territory, we enable the combined language codes
    if locale.id.territory:
        return locale.id.language + '_' + locale.id.territory, True, locale

    return locale.id.language, False, locale
Example #34
0
    def __init__(self,
                 body_instream=None,
                 environ=None,
                 form=None,
                 skin=None,
                 **kw):

        _testEnv = {
            'SERVER_URL': 'http://127.0.0.1',
            'HTTP_HOST': '127.0.0.1',
            'CONTENT_LENGTH': '0',
            'GATEWAY_INTERFACE': 'TestFooInterface/1.0',
        }

        if environ is not None:
            _testEnv.update(environ)

        if kw:
            _testEnv.update(kw)
        if body_instream is None:
            from io import BytesIO
            body_instream = BytesIO()

        super(TestRequest, self).__init__(body_instream, _testEnv)
        if form:
            self.form.update(form)

        # Setup locale object
        langs = BrowserLanguages(self).getPreferredLanguages()
        from zope.i18n.locales import locales
        if not langs or langs[0] == '':
            self._locale = locales.getLocale(None, None, None)
        else:
            parts = (langs[0].split('-') + [None, None])[:3]
            self._locale = locales.getLocale(*parts)

        if skin is not None:
            directlyProvides(self, skin)
        else:
            directlyProvides(self, IDefaultBrowserLayer)
    def setupLocale( self, request ):
        # slightly adapted from zope.publisher.http.HTTPRequest.setupLocale
        if getattr( request, 'locale', None) is not None:
            return
        
        envadapter = IUserPreferredLanguages(request, None)
        if envadapter is None:
            request.locale = locales.getLocale(None, None, None)            
            return

        langs = envadapter.getPreferredLanguages()
        for httplang in langs:
            parts = (httplang.split('-') + [None, None])[:3]
            try:
                request.locale = locales.getLocale(*parts)
                return
            except LoadLocaleError:
                # Just try the next combination
                pass
        else:
            # No combination gave us an existing locale, so use the default,
            # which is guaranteed to exist
            request.locale = locales.getLocale(None, None, None)
Example #36
0
    def setupLocale(self, request):
        # slightly adapted from zope.publisher.http.HTTPRequest.setupLocale
        if getattr(request, 'locale', None) is not None:
            return

        envadapter = IUserPreferredLanguages(request, None)
        if envadapter is None:
            request.locale = locales.getLocale(None, None, None)
            return

        langs = envadapter.getPreferredLanguages()
        for httplang in langs:
            parts = (httplang.split('-') + [None, None])[:3]
            try:
                request.locale = locales.getLocale(*parts)
                return
            except LoadLocaleError:
                # Just try the next combination
                pass
        else:
            # No combination gave us an existing locale, so use the default,
            # which is guaranteed to exist
            request.locale = locales.getLocale(None, None, None)
Example #37
0
 def TestRequest(**kwargs):  # pylint: disable=invalid-name
     """Test request helper"""
     params = kwargs.get('params')
     if params:
         copy = params.__class__()
         for key, value in params.items():
             if key.endswith(':list'):
                 key = key.split(':', 1)[0]
             copy[key] = value
         kwargs['params'] = copy
     request = DummyRequest(**kwargs)
     request.locale = locales.getLocale('en')
     apply_skin(request, PYAMS_BASE_SKIN_NAME)
     return request
Example #38
0
    def __init__(self, body_instream=None, environ=None, form=None, skin=None, **kw):

        _testEnv = {
            "SERVER_URL": "http://127.0.0.1",
            "HTTP_HOST": "127.0.0.1",
            "CONTENT_LENGTH": "0",
            "GATEWAY_INTERFACE": "TestFooInterface/1.0",
        }

        if environ is not None:
            _testEnv.update(environ)

        if kw:
            _testEnv.update(kw)
        if body_instream is None:
            from StringIO import StringIO

            body_instream = StringIO("")

        super(TestRequest, self).__init__(body_instream, _testEnv)
        if form:
            self.form.update(form)

        # Setup locale object
        langs = BrowserLanguages(self).getPreferredLanguages()
        from zope.i18n.locales import locales

        if not langs or langs[0] == "":
            self._locale = locales.getLocale(None, None, None)
        else:
            parts = (langs[0].split("-") + [None, None])[:3]
            self._locale = locales.getLocale(*parts)

        if skin is not None:
            directlyProvides(self, skin)
        else:
            directlyProvides(self, IDefaultBrowserLayer)
Example #39
0
 def __call__(self):
     context = self.context
     workflow = getToolByName(context, 'portal_workflow')
     # Gather relted objects
     batch = context.aq_parent
     client = context.getClient()
     # Gather general data
     self.invoiceId = context.getId()
     self.invoiceDate = self.ulocalized_time(context.getInvoiceDate())
     self.subtotal = '%0.2f' % context.getSubtotal()
     self.VATAmount = '%0.2f' % context.getVATAmount()
     self.total = '%0.2f' % context.getTotal()
     # Create the batch range
     start = self.ulocalized_time(batch.getBatchStartDate())
     end = self.ulocalized_time(batch.getBatchEndDate())
     self.batchRange = "%s to %s" % (start, end)
     # Gather client data
     self.clientName = client.Title()
     self.clientPhone = client.getPhone()
     self.clientFax = client.getFax()
     self.clientEmail = client.getEmailAddress()
     self.clientAccountNumber = client.getAccountNumber()
     # currency info
     locale = locales.getLocale('en')
     self.currency = self.context.bika_setup.getCurrency()
     self.symbol = locale.numbers.currencies[self.currency].symbol
     # Get an available client address in a preferred order
     self.clientAddress = None
     addresses = (
         client.getBillingAddress(),
         client.getPostalAddress(),
         client.getPhysicalAddress(),
     )
     for address in addresses:
         if address.get('address'):
             self.clientAddress = address
             break
     # Gather the line items
     items = context.invoice_lineitems
     self.items = [{
         'invoiceDate': self.ulocalized_time(item['ItemDate']),
         'description': item['ItemDescription'],
         'orderNo': item['OrderNumber'],
         'subtotal': item['Subtotal'],
         'VATAmount': item['VATAmount'],
         'total': item['Total'],
     } for item in items]
     # Render the template
     return self.template()
    def folderitem(self, obj, item, index):
        """Processed once per analysis
        """
        cat = obj.getCategoryTitle()
        # Category (upper C) is for display column value
        item["Category"] = cat
        if self.do_cats:
            # category is for bika_listing to groups entries
            item["category"] = cat
            if cat not in self.categories:
                self.categories.append(cat)

        analyses = [a.UID() for a in self.fieldvalue]

        item["selected"] = item["uid"] in analyses
        item["class"]["Title"] = "service_title"

        calculation = obj.getCalculation()
        item["Calculation"] = calculation and calculation.Title()

        locale = locales.getLocale("en")
        currency = self.context.bika_setup.getCurrency()
        symbol = locale.numbers.currencies[currency].symbol
        item["Price"] = u"{} {}".format(symbol, obj.getPrice())
        item["class"]["Price"] = "nowrap"

        after_icons = ""
        if obj.getAccredited():
            after_icons += u"<img src='{}/++resource++bika.lims.images/accredited.png' title='{}'>".format(
                self.context.absolute_url(), _("Accredited"))
        if obj.getReportDryMatter():
            after_icons += u"<img src='{}/++resource++bika.lims.images/dry.png' title='{}'>".format(
                self.context.absolute_url(), _("Can be reported as dry matter"))
        if obj.getAttachmentOption() == "r":
            after_icons += u"<img src='{}/++resource++bika.lims.images/attach_reqd.png' title='{}'>".format(
                self.context.absolute_url(), _("Attachment required"))
        if obj.getAttachmentOption() == "n":
            after_icons += u"<img src='%s/++resource++bika.lims.images/attach_no.png' title='%s'>".format(
                self.context.absolute_url(), _('Attachment not permitted'))
        if after_icons:
            item["after"]["Title"] = after_icons

        if self.profile:
            # Display analyses for this Analysis Service in results?
            ser = self.profile.getAnalysisServiceSettings(obj.UID())
            item["allow_edit"] = ["Hidden", ]
            item["Hidden"] = ser.get("hidden", obj.getHidden())

        return item
def setupPortalContent(p):
    """
    Import default plone content
    """
    setupPlonePortalContent(p)

    language = p.Language()
    parts = (language.split("-") + [None, None])[:3]
    locale = locales.getLocale(*parts)
    target_language = base_language = locale.id.language

    util = getToolByName(p, "translation_service")

    #    util = queryUtility(ITranslationDomain, 'ploomcake.installer')
    front_title = (
        util
        and util.translate(
            u"front-title", "ploomcake.installer", target_language=target_language, context=p, default=front_page.title
        )
        or "Ploomcake"
    )
    front_desc = (
        util
        and util.translate(
            u"front-description",
            "ploomcake.installer",
            target_language=target_language,
            context=p,
            default=front_page.desc,
        )
        or ""
    )
    front_text = (
        util
        and util.translate(
            u"front-text", "ploomcake.installer", target_language=target_language, context=p, default=front_page.text
        )
        or "Congratulations !"
    )

    existing = p.keys()
    fp = p["front-page"]

    fp.setTitle(front_title)
    fp.setDescription(front_desc)

    fp.setText(front_text, mimetype="text/html")

    fp.reindexObject()
Example #42
0
    def test_locale(self):
        # Set up registry so that no is an accepted language and that the
        # language information from the request is actually being used.
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        settings.use_request_negotiation = True
        settings.available_languages.append('no')

        no = locales.getLocale('no', None, None)
        self.app.REQUEST.set('HTTP_ACCEPT_LANGUAGE', 'no')

        # Push request through the BeforeTraverseEvent handler again to
        # update language settings
        notify(BeforeTraverseEvent(self.portal, self.portal.REQUEST))
        self.assertEqual(self.view.locale(), no)
Example #43
0
def toLocale(iso):
    locale = None
    if ILocale.providedBy(iso):
        locale = iso
    else:
        localeIdentity = None
        if isinstance(iso, basestring):
            localeIdentity = parseLocaleIdentity(iso)
        elif ILocaleIdentity.providedBy(iso):
            localeIdentity = iso 
        if localeIdentity is not None:
            locale = locales.getLocale(localeIdentity.language, localeIdentity.territory, localeIdentity.variant)
    if locale is None:
        raise TypeError('the argument must be a string, ILocaleIdentity or ILocale')
    return locale
Example #44
0
    def __init__(self, body_instream=None, environ=None, form=None,
                 skin=None, **kw):

        _testEnv =  {
            'SERVER_URL':         'http://127.0.0.1',
            'HTTP_HOST':          '127.0.0.1',
            'CONTENT_LENGTH':     '0',
            'GATEWAY_INTERFACE':  'TestFooInterface/1.0',
            }

        if environ is not None:
            _testEnv.update(environ)

        if kw:
            _testEnv.update(kw)
        if body_instream is None:
            from io import BytesIO
            body_instream = BytesIO()

        super(TestRequest, self).__init__(body_instream, _testEnv)
        if form:
            self.form.update(form)

        # Setup locale object
        langs = BrowserLanguages(self).getPreferredLanguages()
        from zope.i18n.locales import locales
        if not langs or langs[0] == '':
            self._locale = locales.getLocale(None, None, None)
        else:
            parts = (langs[0].split('-') + [None, None])[:3]
            self._locale = locales.getLocale(*parts)

        if skin is not None:
            directlyProvides(self, skin)
        else:
            directlyProvides(self, IDefaultBrowserLayer)
Example #45
0
    def test_locale(self):
        # Set up registry so that no is an accepted language and that the
        # language information from the request is actually being used.
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ILanguageSchema, prefix='plone')
        settings.use_request_negotiation = True
        settings.available_languages.append('no')

        no = locales.getLocale('no', None, None)
        self.app.REQUEST.set('HTTP_ACCEPT_LANGUAGE', 'no')

        # Push request through the BeforeTraverseEvent handler again to
        # update language settings
        notify(BeforeTraverseEvent(self.portal, self.portal.REQUEST))
        self.assertEqual(self.view.locale(), no)
Example #46
0
def hour_time_formatter(self, timeobj):
    """uses zope.i18n.locales to determine hour/min format
    """

    #grab locale from request
    languages = IUserPreferredLanguages(self.request)
    langs = languages.getPreferredLanguages()
    if langs:
        parts = (langs[0].split('-') + [None, None])[:3]
    else:
        parts = (None, None, None)
    locale = locales.getLocale(*parts)

    #create formatted hour minute string
    formatter = locale.dates.getFormatter('time', 'short')
    return formatter.format(timeobj)
def hour_time_formatter(self, timeobj):
    """uses zope.i18n.locales to determine hour/min format
    """

    #grab locale from request
    languages = IUserPreferredLanguages(self.request)
    langs = languages.getPreferredLanguages()
    if langs:
        parts = (langs[0].split('-') + [None,None])[:3]
    else:
        parts = (None,None,None)
    locale = locales.getLocale(*parts)

    #create formatted hour minute string
    formatter = locale.dates.getFormatter('time', 'short')
    return formatter.format(timeobj)
Example #48
0
class TestRootLocale(TestCase):
    """There were some complaints that the root locale does not work
    correctly, so make sure it does."""

    locales.loadLocale(None, None, None)
    locale = locales.getLocale(None, None, None)

    def test_dateFormatter(self):
        formatter = self.locale.dates.getFormatter('date')
        self.assertEqual(formatter.format(datetime.date(2004, 10, 31), 'E'),
                         '1')
        self.assertEqual(formatter.format(datetime.date(2004, 10, 31), 'EE'),
                         '01')
        self.assertEqual(formatter.format(datetime.date(2004, 10, 31), 'EEE'),
                         '1')
        self.assertEqual(formatter.format(datetime.date(2004, 10, 31), 'EEEE'),
                         '1')
Example #49
0
def getLocaleFormatter(
    request=None,
    category="date",  # "date" | "time" | "dateTime"
    length="medium"  # "short" | "medium" | "long" | "full" | None
):
    """See: zope.i18n.locales.LocaleDates.getFormatter
    """
    if request is None:
        try:
            request = common.get_request()
        except NoInteraction:
            request = None
    if request and hasattr(request, "locale"):
        return request.locale.dates.getFormatter(category, length)
    else:
        return locales.getLocale(capi.default_language).dates.getFormatter(
            category, length)
Example #50
0
def getLocaleFormatter(
        request=None,
        category="date",    # "date" | "time" | "dateTime"
        length="medium"     # "short" | "medium" | "long" | "full" | None
    ):
    """See: zope.i18n.locales.LocaleDates.getFormatter
    """
    if request is None:
        try:
            request = common.get_request()
        except NoInteraction:
            request = None
    if request and hasattr(request, "locale"):
        return request.locale.dates.getFormatter(category, length)
    else:
        return locales.getLocale(capi.default_language).dates.getFormatter(
            category, length)
Example #51
0
    def _convertLanguageToLangCode(self, language):
        if not language:
            return ""
        locale = locales.getLocale('en')
        lang_in_german = locale.displayNames.languages

        if not hasattr(self, '_converter'):
            self._converter = {}
            util = getUtility(IVocabularyFactory,
                              u"recensio.policy.vocabularies.available_content_languages")
            vocab = util(self.context)
            for key, title in [(x.value, lang_in_german[x.value])
                               for x in vocab]:
                self._converter[title] = \
                    key
        for key, value in self._converter.items():
            if key.lower() in language.lower():
                return value
 def browser_language(self):
     language = 'en'
     pl = IUserPreferredLanguages(self.request)
     if pl is not None:
         languages = pl.getPreferredLanguages()
         for httplang in languages:
             parts = (httplang.split('-') + [None, None])[:3]
             if parts[0] == parts[1]:
                 # Avoid creating a country code for simple languages codes
                 parts = [parts[0], None, None]
             try:
                 locale = locales.getLocale(*parts)
                 language = locale.getLocaleID().replace('_', '-').lower()
                 break
             except LoadLocaleError:
                 # Just try the next combination
                 pass
     return language
Example #53
0
 def browser_language(self):
     language = 'en'
     pl = IUserPreferredLanguages(self.request)
     if pl is not None:
         languages = pl.getPreferredLanguages()
         for httplang in languages:
             parts = (httplang.split('-') + [None, None])[:3]
             if parts[0] == parts[1]:
                 # Avoid creating a country code for simple languages codes
                 parts = [parts[0], None, None]
             try:
                 locale = locales.getLocale(*parts)
                 language = locale.getLocaleID().replace('_', '-').lower()
                 break
             except LoadLocaleError:
                 # Just try the next combination
                 pass
     return language
Example #54
0
class TestLocaleAndProvider(TestCase):

    # Set the locale on the class so that test cases don't have
    # to pay to construct a new one each time.

    locales.loadLocale(None, None, None)
    locales.loadLocale('en', None, None)
    locales.loadLocale('en', 'US', None)
    locales.loadLocale('en', 'US', 'POSIX')
    locale = locales.getLocale('en', 'US', 'POSIX')

    def test_getTimeFormatter(self):
        formatter = self.locale.dates.getFormatter('time', 'medium')
        self.assertEqual(formatter.getPattern(), 'h:mm:ss a')
        self.assertEqual(formatter.format(datetime.time(12, 30, 10)),
                         '12:30:10 PM')
        self.assertEqual(formatter.parse('12:30:10 PM'),
                         datetime.time(12, 30, 10))

    def test_getDateFormatter(self):
        formatter = self.locale.dates.getFormatter('date', 'medium')
        self.assertEqual(formatter.getPattern(), 'MMM d, yyyy')
        self.assertEqual(formatter.format(datetime.date(2003, 1, 2)),
                         'Jan 2, 2003')
        self.assertEqual(formatter.parse('Jan 2, 2003'),
                         datetime.date(2003, 1, 2))

    def test_getDateTimeFormatter(self):
        formatter = self.locale.dates.getFormatter('dateTime', 'medium')
        self.assertEqual(formatter.getPattern(), 'MMM d, yyyy h:mm:ss a')
        self.assertEqual(
            formatter.format(datetime.datetime(2003, 1, 2, 12, 30)),
            'Jan 2, 2003 12:30:00 PM')
        self.assertEqual(formatter.parse('Jan 2, 2003 12:30:00 PM'),
                         datetime.datetime(2003, 1, 2, 12, 30))

    def test_getNumberFormatter(self):
        formatter = self.locale.numbers.getFormatter('decimal')
        self.assertEqual(formatter.getPattern(), '###0.###;-###0.###')
        self.assertEqual(formatter.format(1234.5678), '1234.568')
        self.assertEqual(formatter.format(-1234.5678), '-1234.568')
        self.assertEqual(formatter.parse('1234.567'), 1234.567)
        self.assertEqual(formatter.parse('-1234.567'), -1234.567)
 def translation_status(self):
     if ITranslatable.providedBy(self.context) and len(capi.pivot_languages):
         untranslated = list(capi.pivot_languages)
         if self.context.language in untranslated:
             untranslated.remove(self.context.language)
         for pivot_lang in untranslated:
             if translation.get_field_translations(self.context, pivot_lang):
                 untranslated.remove(pivot_lang)
         if len(untranslated):
             i18n_langs = []
             locale = locales.getLocale(get_default_language().split("-")[0], None)
             for lang in untranslated:
                 if locale and locale.displayNames and locale.displayNames.languages:
                     i18n_langs.append(locale.displayNames.languages.get(lang, lang))
                     continue
                 i18n_langs.append(lang)
             return ", ".join(i18n_langs)
         return translate(_("translated"), context=get_request())
     return translate("n/a", context=get_request())
def setupPortalContent(p):
    """
    Import default plone content
    """
    setupPlonePortalContent(p)

    language = p.Language()
    parts = (language.split('-') + [None, None])[:3]
    locale = locales.getLocale(*parts)
    target_language = base_language = locale.id.language

    util = getToolByName(p, 'translation_service')

    #    util = queryUtility(ITranslationDomain, 'ploomcake.installer')
    front_title = util and util.translate(
        u'front-title',
        'ploomcake.installer',
        target_language=target_language,
        context=p,
        default=front_page.title) or 'Ploomcake'
    front_desc = util and util.translate(u'front-description',
                                         'ploomcake.installer',
                                         target_language=target_language,
                                         context=p,
                                         default=front_page.desc) or ''
    front_text = util and util.translate(
        u'front-text',
        'ploomcake.installer',
        target_language=target_language,
        context=p,
        default=front_page.text) or 'Congratulations !'

    existing = p.keys()
    fp = p['front-page']

    fp.setTitle(front_title)
    fp.setDescription(front_desc)

    fp.setText(front_text, mimetype='text/html')

    fp.reindexObject()
Example #57
0
 def get_lang_data(code):
     lang_data = {}
     #try to extract native name from zope
     lang_parts = code.split("-")
     lang_code = lang_parts[0]
     territory = None
     if len(lang_parts) == 2:
         territory = lang_parts[1].upper()
     lang_locale = locales.getLocale(lang_code, territory)
     if not lang_locale.id.language:
         return
     lang_name = lang_locale.id.language
     if lang_locale.displayNames and lang_locale.displayNames.languages:
         lang_name = lang_locale.displayNames.languages.get(
             lang_code, "").capitalize()
     lang_data["name"] = lang_name
     locale_territory = lang_locale.displayNames.territories.get(
         territory, "")
     if locale_territory:
         lang_data["native"] = u"%s (%s)" % (lang_name, locale_territory)
     else:
         lang_data["native"] = lang_name
     return lang_data
 def translation_status(self):
     if ITranslatable.providedBy(self.context) and len(capi.pivot_languages):
         untranslated = list(capi.pivot_languages)
         if self.context.language in untranslated:
             untranslated.remove(self.context.language)
         for pivot_lang in untranslated:
             if translation.get_field_translations(self.context, pivot_lang):
                 untranslated.remove(pivot_lang)
         if len(untranslated):
             i18n_langs = []
             locale = locales.getLocale(get_default_language().split("-")[0], None)
             for lang in untranslated:
                 if (locale and 
                         locale.displayNames and 
                         locale.displayNames.languages
                     ):
                     i18n_langs.append(
                         locale.displayNames.languages.get(lang, lang))
                     continue
                 i18n_langs.append(lang)
             return ", ".join(i18n_langs)
         return translate(_("translated"), context=get_request())
     return translate("n/a", context=get_request())