def translation(lang):
    try:
        with ZipFile(PACKAGE_PATH) as f:
            mo = f.read('tm/mos/{0}.mo'.format(lang))
    except KeyError:
        return NullTranslations()
    else:
        return GNUTranslations(BytesIO(mo))
Example #2
0
def set_language(language):
    global translations

    try:
        with open(
                pkg_resources.resource_filename(
                    "middlewared",
                    f"locale/{language}/LC_MESSAGES/middlewared.mo"),
                "rb") as f:
            translations = GNUTranslations(f)

        return True
    except Exception as e:
        if language != "en":
            logger.warning("Failed to set language %r: %r", language, e)

        translations = NullTranslations()

        return False
    def testPoFile(self):
        """ Testing po file """
        po = self.po
        product = self.product
        pot_cat = self.pot_cat
        pot_len = self.pot_len
        poName = getFileFromPath(po)
        localesLayout = False
        if 'LC_MESSAGES' in po:
            localesLayout = True

        file = open(po, 'r')
        try:
            lines = file.readlines()
        except IOError as msg:
            self.fail('Can\'t read po file %s:\n%s' % (poName, msg))
        file.close()
        try:
            mo = msgfmt.Msgfmt(lines)
        except msgfmt.PoSyntaxError as msg:
            self.fail('PoSyntaxError: Invalid po data syntax in file %s:\n%s' %
                      (poName, msg))
        except SyntaxError as msg:
            self.fail(
                'SyntaxError: Invalid po data syntax in file %s (Can\'t parse file with eval():\n%s'
                % (poName, msg))
        except Exception as msg:
            self.fail('Unknown error while parsing the po file %s:\n%s' %
                      (poName, msg))
        try:
            tro = GNUTranslations(mo.getAsFile())
        except UnicodeDecodeError as msg:
            self.fail('UnicodeDecodeError in file %s:\n%s' % (poName, msg))
        except msgfmt.PoSyntaxError as msg:
            self.fail('PoSyntaxError: Invalid po data syntax in file %s:\n%s' %
                      (poName, msg))

        domain = tro._info.get('domain', None)
        if localesLayout:
            self.failIf(domain,
                        'Po file %s has a domain set inside the file!' % po)
        else:
            self.failUnless(domain, 'Po file %s has no domain!' % po)

        language = tro._info.get('language-code', None)
        if localesLayout:
            self.failIf(language, 'Po file %s has a language set inside!' % po)
        else:
            self.failUnless(language, 'Po file %s has no language!' % po)

        if localesLayout:
            fileLang = getLanguageFromLocalesPath(po)
        else:
            fileLang = getLanguageFromPath(po)
            language = language.replace('_', '-')
            self.failUnless(
                fileLang == language,
                'The file %s has the wrong name or wrong language code. expected: %s, got: %s'
                % (poName, fileLang, language))

        if fileLang != 'en':
            po_cat = catalog.MessageCatalog(filename=po)

            if pot_len != len(po_cat):
                missing = [msg for msg in pot_cat if msg not in po_cat]
                additional = [msg for msg in po_cat if msg not in pot_cat]

                self.fail(
                    '%s missing and %s additional messages in %s:\nmissing: %s\nadditional: %s'
                    % (len(missing), len(additional), poName, missing,
                       additional))

        msgcatalog = [(msg, tro._catalog.get(msg)) for msg in tro._catalog
                      if msg]

        for msg, msgstr in msgcatalog:
            # every ${foo} is properly closed
            if '${' in msgstr:
                status, error = self.isMalformedMessageVariable(msgstr)
                self.failIf(status,
                            '%s in file %s:\n %s' % (error, poName, msg))
            # no html-entities in msgstr
            if '&' in msgstr and ';' in msgstr:
                status, error = self.isEntity(msgstr)
                self.failIf(status,
                            '%s in file %s:\n %s' % (error, poName, msg))
            # all ${foo}'s from the default should be present in the translation
            default = pot_cat.getDefault(msg)
            default_vars = self.getMessageVariables(msg, default)
            if not default_vars is []:
                status, error = self.isMessageVariablesMissing(
                    msgstr, default_vars=default_vars)
                self.failIf(status, '%s in file %s: %s' % (error, poName, msg))
Example #4
0
 def __call__(self, language_code=None):
     if language_code in ('en', None):
         return NullTranslations()
     mo_file = 'mailman-%s.mo' % language_code
     with open_binary('mailman.testing', mo_file) as fp:
         return GNUTranslations(fp)