class GettextMessageCatalog(object): """A message catalog based on GNU gettext and Python's gettext module.""" implements(IGlobalMessageCatalog) def __init__(self, language, domain, path_to_file): """Initialize the message catalog""" self.language = language self.domain = domain self._path_to_file = path_to_file self.reload() self._catalog.add_fallback(_KeyErrorRaisingFallback()) def reload(self): 'See IMessageCatalog' fp = open(self._path_to_file, 'rb') try: self._catalog = GNUTranslations(fp) finally: fp.close() def getMessage(self, id): 'See IMessageCatalog' return self._catalog.ugettext(id) def queryMessage(self, id, default=None): 'See IMessageCatalog' try: return self._catalog.ugettext(id) except KeyError: return default def getIdentifier(self): 'See IMessageCatalog' return self._path_to_file
def process_dir(dirpath, filenames, projects): ''' Process a directory ''' translations = GNUTranslations( open(os.path.join(options.podir, options.lang + '.mo'))) loader = TemplateLoader(['.'], callback=lambda template: template.filters.insert( 0, Translator(translations.ugettext))) for fn in filenames: if fn.endswith('~') or fn.endswith('.swp'): continue src_file = os.path.join(dirpath, fn) dest_file = os.path.join( options.output, src_file[len(options.input):]) + '.' + options.lang # Hideous curpage = src_file[len(options.input):].rstrip('.html') relpath = '../' * (dest_file.count('/') - 1) relpath = relpath.rstrip('/') if relpath == '': relpath = '.' if not os.path.exists(os.path.dirname(dest_file)): os.makedirs(os.path.dirname(dest_file)) template = loader.load(src_file) # Variables made availble to all templates page = template.generate( _=lambda text: Markup(translations.ugettext(text)), lang=options.lang, path=options.basepath, relpath=relpath, curpage=curpage, projects=projects).render(method='html', doctype='html') output = open(dest_file, 'w') output.write(page) output.close()
class MOFile(File): class_mimetypes = ['application/x-gettext-translation'] class_extension = 'mo' def _load_state_from_file(self, file): self.translations = GNUTranslations(file) def gettext(self, message): """Returns the translation for the given message. """ return self.translations.ugettext(message)
def translate(lang, text): trans = None if lang in _CACHE: trans = _CACHE[lang] else: mpath = get_lc_messages_path(lang) if mpath is not None: with ZipFile(P('localization/locales.zip', allow_user_override=False), 'r') as zf: try: buf = cStringIO.StringIO(zf.read(mpath + '/messages.mo')) except: pass else: trans = GNUTranslations(buf) _CACHE[lang] = trans if trans is None: return getattr(__builtins__, '_', lambda x: x)(text) return trans.ugettext(text)
def translate(lang, text): trans = None if lang in _CACHE: trans = _CACHE[lang] else: mpath = get_lc_messages_path(lang) if mpath is not None: with ZipFile(P('localization/locales.zip', allow_user_override=False), 'r') as zf: try: buf = io.BytesIO(zf.read(mpath + '/messages.mo')) except Exception: pass else: trans = GNUTranslations(buf) _CACHE[lang] = trans if trans is None: return getattr(__builtins__, '_', lambda x: x)(text) return trans.ugettext(text)
def process_dir(dirpath, filenames): ''' Process a directory ''' if options.podir and options.lang: translations = GNUTranslations(open(os.path.join(options.podir, options.lang + '.mo'))) if int(get_distribution('genshi').version[2]) < 6: loader = TemplateLoader(['.'], callback=lambda template: template.filters.insert(0, Translator(translations.ugettext))) else: loader = TemplateLoader(['.'], callback=lambda template: template.filters.insert(0, Translator(translations))) for fn in filenames: if fn.endswith('~') or fn.endswith('.swp'): continue src_file = os.path.join(dirpath, fn) if options.rss: sys.setrecursionlimit(1500) for line in fileinput.input(src_file): if line.find('feedparse')>0: match = re.split('^.*feedparse\(\'', line) feedurl = re.split('\'\)', match[1]) feedparse(feedurl[0]) continue; release_date = None if schedule is not None: release_date = schedule(globalvar.release['next_id']) # We need to localize the date format. First, set locale to the original format locale.setlocale(locale.LC_ALL, 'en_US') # Then convert to time_struct alpha = time.strptime(release_date[globalvar.release['next_id']]['alpha'], "%Y-%b-%d") beta = time.strptime(release_date[globalvar.release['next_id']]['beta'], "%Y-%b-%d") final = time.strptime(release_date[globalvar.release['next_id']]['final'], "%Y-%b-%d") # Stort the US format for further processing alpha_us = time.strftime("%Y-%b-%d", alpha) beta_us = time.strftime("%Y-%b-%d", beta) final_us = time.strftime("%Y-%b-%d", final) # Let's slice the US date for the calendar png beta_cal = beta_us[-2:] final_cal = final_us[-2:] # Move to the right locale (if known) try: locale.setlocale(locale.LC_ALL, locale.locale_alias[options.lang.lower()]) except: pass # Convert back! alpha = convert_date(alpha) beta = convert_date(beta) final = convert_date(final) locale.setlocale(locale.LC_ALL, 'en_US') release_date = {'alpha':alpha, 'beta':beta, 'final':final, 'alpha_us':alpha_us, 'beta_us':beta_us, 'final_us':final_us, 'beta_cal':beta_cal, 'final_cal':final_cal} ec2 = None if get_amis is not None: ec2 = get_amis() dest_file = os.path.join(options.output, src_file[len(options.input):]) + '.' + options.lang # Hideous curpage = src_file[len(options.input):].rstrip('.html') relpath = '../' * (dest_file.count('/') - 1) relpath = relpath.rstrip('/') if relpath == '': relpath = '.' safe_makedir(os.path.dirname(dest_file)) template = loader.load(src_file) # Variables made availble to all templates page = template.generate( _=lambda text: translations.ugettext(text), feedparse=feedparse, lang=options.lang, relpath=relpath, path=options.basepath, curpage=curpage, global_variables=globalvar, schedule = release_date, ec2_ami = ec2 ).render(method='html', doctype='html', encoding='utf-8') output = open(dest_file, 'w') output.write(page) output.close()