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))
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))
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)