def _configure_babel(cls, course): with common_utils.ZipAwareOpen(): # Internally, babel uses the 'en' locale, and we must configure it # before we make babel calls. localedata.load('en') # Also load the course's default language. localedata.load(course.default_locale)
def babel_patched_load(name, merge_inherited=True): # Load additional languages into the babel # cache. We do this so we can add Haitian Creole # using french as a model. _cache_lock.acquire() try: data = _cache.get(name) if not data: # Load inherited data if name == 'root' or not merge_inherited: data = {} else: parts = name.split('_') if len(parts) == 1: parent = 'root' else: parent = '_'.join(parts[:-1]) data = load(parent).copy() filename = os.path.join(_mydirname, '%s.dat' % name) fileobj = open(filename, 'rb') try: if name != 'root' and merge_inherited: merge(data, pickle.load(fileobj)) else: data = pickle.load(fileobj) _cache[name] = data finally: fileobj.close() return data finally: _cache_lock.release()
def test_gettext_compilation(locale): # Test that new plural form elements introduced in recent CLDR versions # are compiled "down" to `n` when emitting Gettext rules. ru_rules = localedata.load(locale)['plural_form'].rules chars = 'ivwft' # Test that these rules are valid for this test; i.e. that they contain at least one # of the gettext-unsupported characters. assert any((" " + ch + " ") in rule for ch in chars for rule in ru_rules.values()) # Then test that the generated value indeed does not contain these. ru_rules_gettext = plural.to_gettext(ru_rules) assert not any(ch in ru_rules_gettext for ch in chars)
def format_price(value, currency): """ Format decimal value as currency """ try: value = Decimal(value) except (TypeError, InvalidOperation): return '' language = get_language() if not language: language = settings.LANGUAGE_CODE locale_code = to_locale(language) if not localedata.exists(locale_code): localedata.load(locale_code) locale = Locale(locale_code) currency_format = locale.currency_formats.get('standard') pattern = currency_format.pattern pattern = re.sub( '(\xa4+)', '<span class="currency">\\1</span>', pattern) result = format_currency(value, currency, pattern, locale=locale_code) return mark_safe(result)
def test_locale_name_cleanup(): """ Test that locale identifiers are cleaned up to avoid directory traversal. """ no_exist_name = os.path.join(tempfile.gettempdir(), "babel%d.dat" % random.randint(1, 99999)) with open(no_exist_name, "wb") as f: pickle.dump({}, f) try: name = os.path.splitext( os.path.relpath(no_exist_name, localedata._dirname))[0] except ValueError: if sys.platform == "win32": pytest.skip("unable to form relpath") raise assert not localedata.exists(name) with pytest.raises(IOError): localedata.load(name) with pytest.raises(UnknownLocaleError): Locale(name)
def __init__(self, settings=None): if settings is None: #To allow override and make it easier to run tests. reg = get_current_registry() settings = reg.getUtility(ISettings) self.default_locale_name = settings['default_locale_name'].strip() available_languages = [x for x in settings['available_languages'].split()] translatable_languages = copy(available_languages) if self.default_locale_name in translatable_languages: translatable_languages.remove(self.default_locale_name) self.available_languages = tuple(available_languages) self.translatable_languages = tuple(translatable_languages) self.lang_names = {} self.default_lang_names = {} for lang in self.available_languages: data = load(lang) self.lang_names[lang] = data['languages'][lang] data = load(self.default_locale_name) self.default_lang_names[lang] = data['languages'][lang]
def main(): parser = OptionParser(usage='%prog [options] locale [path]') parser.add_option('--noinherit', action='store_false', dest='inherit', help='do not merge inherited data into locale data') parser.add_option('--resolve', action='store_true', dest='resolve', help='resolve aliases in locale data') parser.set_defaults(inherit=True, resolve=False) options, args = parser.parse_args() if len(args) not in (1, 2): parser.error('incorrect number of arguments') data = load(args[0], merge_inherited=options.inherit) if options.resolve: data = LocaleDataDict(data) if len(args) > 1: for key in args[1].split('.'): data = data[key] if isinstance(data, dict): data = dict(data.items()) pprint(data)
def pull_lang_code(endpoint, values): ''' Carga el código de idioma en la variable global. ''' all_langs = current_app.config["ALL_LANGS"] # obtiene el idioma de la URL g.url_lang = None if values is not None: g.url_lang = values.pop('lang', None) # si esta lista de idiomas permitidos if g.url_lang and g.url_lang in all_langs: g.lang = g.url_lang # si el usuario esta logueado y tiene establecido el idioma se asigna ese elif "user" in session and "lang" in session["user"]: g.lang = session["user"]["lang"] # si no esta logueado y ha elegido un idioma elif "lang" in session: g.lang = session["lang"] else: accept = request.accept_languages.values() # si viene, se coge el que mas convenga dependiendo del que tenga establecido en su navegador o el idioma por defecto locale = Locale.negotiate((option.replace("-","_") for option in accept), all_langs) if accept else None if locale: g.lang = locale.language else: g.lang = app.config["LANGS"][0] # valor por defecto si todo falla if g.lang not in all_langs: logging.warn("Wrong language choosen.") g.lang = current_app.config["LANGS"][0] # se carga la lista de idiomas como se dice en cada idioma g.languages = OrderedDict((code, (localedata.load(code)["languages"], code in current_app.config["BETA_LANGS"])) for code in all_langs) g.beta_lang = g.lang in current_app.config["BETA_LANGS"]
def create_app(config=None, debug=False): ''' Inicializa la aplicación Flask. Carga los siguientes módulos: - index: página de inicio - page: páginas estáticas - user: gestión del usuario - files: búsqueda y obtención de ficheros - status: servicio de monitorización de la aplicación Y además, inicializa los siguientes servicios: - Configuración: carga valores por defecto y modifica con el @param config - Web Assets: compilación y compresión de recursos estáticos - i18n: detección de idioma en la URL y catálogos de mensajes - Cache y auth: Declarados en el módulo services - Files y users: Clases para acceso a datos ''' app = Flask(__name__) app.config.from_object(defaults) app.debug = debug # Configuración if config: app.config.from_object(config) # Gestión centralizada de errores logging.getLogger().setLevel(logging.DEBUG if debug else logging.INFO) if app.config["SENTRY_DSN"]: sentry.init_app(app) # Configuración dependiente de la versión del código revision_filename_path = os.path.join(os.path.dirname(app.root_path), "revision") if os.path.exists(revision_filename_path): f = open(revision_filename_path, "r") data = f.read() f.close() revisions = tuple( tuple(i.strip() for i in line.split("#")[0].split()) for line in data.strip().split("\n") if line.strip() and not line.strip().startswith("#")) revision_hash = md5(data).hexdigest() app.config.update( CACHE_KEY_PREFIX = "%s%s/" % ( app.config["CACHE_KEY_PREFIX"] if "CACHE_KEY_PREFIX" in app.config else "", revision_hash ), REVISION_HASH = revision_hash, REVISION = revisions ) else: app.config.update( REVISION_HASH = None, REVISION = () ) # Registra filtros de plantillas register_filters(app) # Registra valores/funciones para plantillas app.jinja_env.globals["u"] = u # Oauth init_oauth(app) # Blueprints app.register_blueprint(index) app.register_blueprint(page) app.register_blueprint(user) app.register_blueprint(files) app.register_blueprint(api) add_labs(app) # Labs (blueprints y alternativas en pruebas) # Web Assets if not os.path.isdir(app.static_folder+"/gen"): os.mkdir(app.static_folder+"/gen") assets = Environment(app) assets.debug = app.debug assets.url=app.static_url_path register_filter(JsSlimmer) register_filter(CssSlimmer) assets.register('css_all', 'css/jquery-ui.css', Bundle('css/main.css', filters='pyscss', output='gen/main.css', debug=False), filters='css_slimmer', output='gen/foofind.css') assets.register('css_ie', 'css/ie.css', filters='css_slimmer', output='gen/ie.css') assets.register('css_ie7', 'css/ie7.css', filters='css_slimmer', output='gen/ie7.css') assets.register('css_search', 'css/jquery-ui.css', Bundle('css/search.css', filters='pyscss', output='gen/s.css', debug=False), filters='css_slimmer', output='gen/search.css') assets.register('css_labs', 'css/jquery-ui.css', Bundle('css/labs.css', filters='pyscss', output='gen/l.css', debug=False), filters='css_slimmer', output='gen/labs.css') assets.register('css_admin', Bundle('css/admin.css', filters='css_slimmer', output='gen/admin.css')) assets.register('js_all', Bundle('js/jquery.js', 'js/jquery-ui.js', 'js/jquery.ui.selectmenu.js', 'js/files.js', filters='rjsmin', output='gen/foofind.js'), ) assets.register('js_ie', Bundle('js/html5shiv.js', 'js/jquery-extra-selectors.js', 'js/selectivizr.js', filters='rjsmin', output='gen/ie.js')) assets.register('js_labs', Bundle('js/jquery.js', 'js/jquery-ui.js', 'js/labs.js', filters='rjsmin', output='gen/labs.js')) assets.register('js_admin', Bundle('js/jquery.js', 'js/admin.js', filters='rjsmin', output='gen/admin.js')) # Detección de idioma @app.url_defaults def add_language_code(endpoint, values): ''' Añade el código de idioma a una URL que lo incluye. ''' if 'lang' in values or not g.lang: return if app.url_map.is_endpoint_expecting(endpoint, 'lang'): values['lang'] = g.lang pull_lang_code_languages = tuple( (code,localedata.load(code)["languages"][code].capitalize(), code in app.config["BETA_LANGS"]) for code in app.config["ALL_LANGS"]) @app.url_value_preprocessor def pull_lang_code(endpoint, values): ''' Carga el código de idioma en la variable global. ''' # obtiene el idioma de la URL g.url_lang = None if values is not None: g.url_lang = values.pop('lang', None) # si esta lista de idiomas permitidos if g.url_lang and g.url_lang in app.config["ALL_LANGS"]: g.lang = g.url_lang # si el usuario esta logueado y tiene establecido el idioma se asigna ese elif "user" in session and "lang" in session["user"]: g.lang = session["user"]["lang"] # si no esta logueado y ha elegido un idioma elif "lang" in session: g.lang = session["lang"] else: accept = request.accept_languages.values() # si viene, se coge el que mas convenga dependiendo del que tenga establecido en su navegador o el idioma por defecto locale = Locale.negotiate((option.replace("-","_") for option in accept), app.config["ALL_LANGS"]) if accept else None if locale: g.lang = locale.language else: g.lang = app.config["LANGS"][0] # valor por defecto si todo falla # se carga la lista de idiomas como se dice en cada idioma g.languages = pull_lang_code_languages g.beta_lang = g.lang in app.config["BETA_LANGS"] # Traducciones babel.init_app(app) @babel.localeselector def get_locale(): ''' Devuelve el código del idioma activo. ''' try: return g.lang except: return "en" # Cache cache.init_app(app) # Autenticación auth.setup_app(app) auth.login_view="user.login" auth.login_message="login_required" @auth.user_loader def load_user(userid): user = User(userid) if not user.has_data: data = usersdb.find_userid(userid) if data is None: return None user.set_data(data) return user # Mail mail.init_app(app) # Acceso a bases de datos filesdb.init_app(app) usersdb.init_app(app) pagesdb.init_app(app) feedbackdb.init_app(app) configdb.init_app(app) # Servicio de búsqueda @app.before_first_request def init_search(): searchd_servers = [(server["_id"], str(server["sp"]), int(server["spp"])) for server in filesdb.get_servers() if "sp" in server] stats = {server[0]:filesdb.get_server_stats(server[0]) for server in searchd_servers} searchd.init_app(app, searchd_servers, stats) init_search_stats() # Taming taming.init_app(app) # Refresco del contador de ficheros lastcount = [filesdb.count_files()] def countupdater(): lastcount[0] = long(filesdb.count_files()) eventmanager.interval(app.config["COUNT_UPDATE_INTERVAL"], countupdater) # Refresco de conexiones eventmanager.interval(app.config["FOOCONN_UPDATE_INTERVAL"], filesdb.load_servers_conn) # Refresco de configuración configdb.pull() eventmanager.interval(app.config["CONFIG_UPDATE_INTERVAL"], configdb.pull) # Profiler profiler.init_app(app, feedbackdb) # Carga la traducción alternativa fallback_lang = support.Translations.load(os.path.join(app.root_path, 'translations'), ["en"]) # Unittesting unit.init_app(app) # Inicializa init_labs(app) if app.config["UNITTEST_INTERVAL"]: eventmanager.timeout(20, unit.run_tests) eventmanager.interval(app.config["UNITTEST_INTERVAL"], unit.run_tests) # Inicio del eventManager eventmanager.start() @app.before_request def before_request(): # No preprocesamos la peticiones a static if request.path.startswith("/static"): return # si el idioma de la URL es inválido, devuelve página no encontrada if g.url_lang and not g.url_lang in app.config["ALL_LANGS"]: abort(404) # ignora peticiones sin blueprint if request.blueprint is None: if request.path.endswith("/"): if "?" in request.url: return redirect(request.url_root[:-1] + request.path + request.url[request.url.find("?"):], 301) return redirect(request.url[:-1], 301) return # si no es el idioma alternativo, lo añade por si no se encuentra el mensaje if g.lang!="en": get_translations().add_fallback(fallback_lang) # dominio de la web g.domain = request.url_root[8:-1] if request.url_root.startswith("https") else request.url_root[7:-1] # título de la página por defecto g.title = g.domain # contador de archivos totales g.count_files = lastcount[0] # Páginas de error @app.errorhandler(400) @app.errorhandler(401) @app.errorhandler(403) @app.errorhandler(404) @app.errorhandler(405) @app.errorhandler(408) @app.errorhandler(409) @app.errorhandler(410) @app.errorhandler(411) @app.errorhandler(412) @app.errorhandler(413) @app.errorhandler(414) @app.errorhandler(415) @app.errorhandler(416) @app.errorhandler(417) @app.errorhandler(418) @app.errorhandler(500) @app.errorhandler(501) @app.errorhandler(502) @app.errorhandler(503) def all_errors(e): error = str(e.code) if hasattr(e,"code") else "500" message_msgid = "error_%s_message" % error message_msgstr = _(message_msgid) if message_msgstr == message_msgid: message_msgstr = _("error_500_message") description_msgid = "error_%s_description" % error description_msgstr = _(description_msgid) if description_msgstr == description_msgid and hasattr(e,"description"): message_msgstr = _("error_500_description") try: g.title = "%s %s" % (error, message_msgstr) g.count_files = lastcount[0] return render_template('error.html', zone="errorhandler", error=error, description=description_msgstr), int(error) except Exception as ex: #si el error ha llegado sin contexto se encarga el servidor de él logging.warn(ex) return make_response("",error) return app
def test_load(): assert localedata.load('en_US')['languages']['sv'] == 'Swedish' assert localedata.load('en_US') is localedata.load('en_US')
def translate(): ''' Edita la traducción a un idioma ''' def fix_values(entry,sample=False): ''' Si la traduccion contiene campos de valores los sustituimos por ______[X] y ponemos un ejemplo de uso, además se eliminan los saltos de linea ''' result=re.finditer(r'(%\(([^\)]+)\)([s|d]))', entry.msgstr) subs=dict() # se cargan los ejemplos si es necesario if entry.msgid in samples: subs=samples[entry.msgid] # para cada valor encontrado se sustituye por _____[X] for i,item in enumerate(result): entry.msgstr=entry.msgstr.replace(item.group(1),"_____["+str(i+1)+"]") # para los ejemplos numericos se utiliza uno aleatorio if item.group(3)=="d": subs[item.group(2)]=random.randint(2,10) if sample: if subs!={}: return (entry.msgid,(entry.msgstr,_(entry.msgid,**subs))) else: return (entry.msgid,(entry.msgstr,False)) # se sustituyen los saltos de linea html y se devuelve todo return (entry.msgid,entry.msgstr.replace("<br>","\n").replace("<br />","\n").replace("<br/>","\n") if "<br" in entry.msgstr else entry.msgstr) languages = localedata.load(g.lang)["languages"] keystrcoll = cmp_to_key(locale.strcoll) form = None forml = SelectLanguageForm(request.form) forml.lang.choices = [("", "-- "+_("choose_language")+" --")] + sorted( ((code, localedata.load(code)["languages"][code].capitalize()+" ("+languages[code].capitalize()+")") for code, language in languages.items() if code in current_app.config["TRANSLATE_LANGS"] and not code in current_app.config["LANGS"] and localedata.exists(code) and code in localedata.load(code)["languages"]), key=lambda x: keystrcoll(x[1])) total=99999 no_translation=0 msgids=[] lang_edit = request.args.get("lang") if not lang_edit in languages: lang_edit = None formfields = {} # mostrar el idioma a traducir if lang_edit is not None: forml.lang.default=lang_edit # cargar idioma actual current_lang = dict(fix_values(entry,True) for entry in polib.pofile(lang_path(g.lang))) # si existe el idioma se carga, sino vacio lpath = lang_path(lang_edit) new_lang = dict(fix_values(entry) for entry in polib.pofile(lpath)) if lpath else {} # recorre los ids en ingles y los coge el mensaje del idioma actual y el valor del nuevo for i, (msgid, msgstr) in enumerate(fix_values(entry,True) for entry in polib.pofile(lang_path("en"))): # se excluyen los textos legales que concluyen con safe_ if not msgid.startswith(("safe_","admin_")): # si no esta traducida la cadena en el idioma actual se deja vacio if not msgid in new_lang: no_translation+=1 new_lang[msgid]="" # si el mensaje esta traducido al idioma actual se usa, sino se usa el ingles if msgid in current_lang: msg=current_lang[msgid][0] description=current_lang[msgid][1] else: msg=msgstr[0] description=msgstr[1] # si la traduccion es mayor de 80 caracteres se utiliza un textarea en vez de un input text length=len(new_lang[msgid] or msg) if length>80: formfields[msgid]=TextAreaField(msg,default=new_lang[msgid],description=description) # se le establecen las filas al text area dependiendo del tamaño de la traduccion formfields["_args_%s" % msgid]={"rows":length/50} else: formfields[msgid]=TextField(msg,default=new_lang[msgid],description=description) formfields["_args_%s" % msgid]={} #se añade a la lista que se le envia al formulario msgids.append(msgid) total=float(len(msgids)) form=expanded_instance(TranslateForm, formfields, request.form, prefix="translate_") # si es el envio de la traducción if request.method == 'POST' and form.validate(): pagesdb.create_translation({"ip":request.remote_addr,"user_lang":g.lang,"dest_lang":lang_edit,"texts":{field.short_name: field.data for field in form if not field.short_name in ("captcha", "submit_form") and field.data!=new_lang[field.short_name]}}) flash("translation_sent") return redirect(url_for('index.home')) if lang_edit: forml.lang.data = lang_edit # sino se muestra la seleccion de idioma a traducir g.title+=_("translate_to_your_language") return render_template('pages/translate.html', page_title=_("translate_to_your_language"), lang=lang_edit, forml=forml, form=form, msgids=msgids, complete=round(((total-no_translation)/total)*100,2))
def create_app(config=None, debug=False): ''' Inicializa la aplicación Flask. Carga los siguientes módulos: - index: página de inicio - page: páginas estáticas - user: gestión del usuario - files: búsqueda y obtención de ficheros - status: servicio de monitorización de la aplicación Y además, inicializa los siguientes servicios: - Configuración: carga valores por defecto y modifica con el @param config - Web Assets: compilación y compresión de recursos estáticos - i18n: detección de idioma en la URL y catálogos de mensajes - Cache y auth: Declarados en el módulo services - Files y users: Clases para acceso a datos ''' app = Flask(__name__) app.config.from_object(defaults) app.debug = debug # Configuración if config: app.config.from_object(config) # Configuración dependiente de la versión del código revision_filename_path = os.path.join(os.path.dirname(app.root_path), "revision") if os.path.exists(revision_filename_path): f = open(revision_filename_path, "r") data = f.read() f.close() revisions = tuple( tuple(i.strip() for i in line.split("#")[0].split()) for line in data.strip().split("\n") if line.strip() and not line.strip().startswith("#")) revision_hash = md5(data).hexdigest() app.config.update( CACHE_KEY_PREFIX = "%s%s/" % ( app.config["CACHE_KEY_PREFIX"] if "CACHE_KEY_PREFIX" in app.config else "", revision_hash ), REVISION_HASH = revision_hash, REVISION = revisions ) else: app.config.update( REVISION_HASH = None, REVISION = () ) # Gestión centralizada de errores sentry.init_app(app) logging.getLogger().setLevel(logging.DEBUG if debug else logging.INFO) setup_logging(SentryHandler(sentry.client)) # Registra filtros de plantillas register_filters(app) # Oauth init_oauth(app) # Blueprints app.register_blueprint(index) app.register_blueprint(page) app.register_blueprint(user) app.register_blueprint(files) app.register_blueprint(control) app.register_blueprint(api) # Web Assets if not os.path.isdir(app.static_folder+"/gen"): os.mkdir(app.static_folder+"/gen") assets = Environment(app) assets.debug = app.debug register_filter(JsSlimmer) register_filter(CssSlimmer) assets.register('js_all', Bundle('js/jquery.js', 'js/jquery-ui.js', 'js/files.js', filters='rjsmin', output='gen/packed.js')) assets.register('css_all', Bundle('css/main.css', filters=('css_slimmer',), output='gen/packed.css')) assets.register('css_ie7', Bundle('css/ie7.css', filters=('css_slimmer',), output='gen/ie7.css')) assets.register('js_admin', Bundle('js/jquery.js', 'js/admin.js', filters='rjsmin', output='gen/admin_packed.js')) assets.register('css_admin', Bundle('css/admin.css', filters=('css_slimmer',), output='gen/admin_packed.css')) # Detección de idioma @app.url_defaults def add_language_code(endpoint, values): ''' Añade el código de idioma a una URL que lo incluye. ''' if 'lang' in values or not g.lang: return if app.url_map.is_endpoint_expecting(endpoint, 'lang'): values['lang'] = g.lang pull_lang_code_languages = tuple( (code,localedata.load(code)["languages"][code].capitalize(), code in app.config["BETA_LANGS"]) for code in app.config["ALL_LANGS"]) @app.url_value_preprocessor def pull_lang_code(endpoint, values): ''' Carga el código de idioma en la variable global. ''' # obtiene el idioma de la URL g.url_lang = None if values is not None: g.url_lang = values.pop('lang', None) # si esta lista de idiomas permitidos if g.url_lang and g.url_lang in app.config["ALL_LANGS"]: g.lang = g.url_lang # si el usuario esta logueado y tiene establecido el idioma se asigna ese elif "user" in session and "lang" in session["user"]: g.lang = session["user"]["lang"] # sino se coge el que mas convenga dependiendo del que tenga establecido en su navegador o el idioma por defecto elif request.accept_languages.values()!=[]: g.lang = request.accept_languages.best_match(app.config["ALL_LANGS"],app.config["LANGS"][0]) # y sino se pone el idioma por defecto else: g.lang = app.config["LANGS"][0] # se carga la lista de idiomas como se dice en cada idioma g.languages = pull_lang_code_languages g.beta_lang = g.lang in app.config["BETA_LANGS"] # Traducciones babel.init_app(app) @babel.localeselector def get_locale(): ''' Devuelve el código del idioma activo. ''' try: return g.lang except: return "en" # Cache cache.init_app(app) # Autenticación auth.setup_app(app) auth.login_view="user.login" auth.login_message="login_required" @auth.user_loader def load_user(userid): user = User(userid) if not user.has_data: data = usersdb.find_userid(userid) if data is None: return None user.set_data(data) return user # Mail mail.init_app(app) # Acceso a bases de datos filesdb.init_app(app) usersdb.init_app(app) pagesdb.init_app(app) feedbackdb.init_app(app) # Actualizador del contador de ficheros lastcount = [filesdb.count_files()] def countupdater(): lastcount[0] = long(filesdb.count_files()) eventmanager.interval(app.config["COUNT_UPDATE_INTERVAL"], countupdater) # Refresco de conexiones eventmanager.interval(app.config["FOOCONN_UPDATE_INTERVAL"], filesdb.load_servers_conn) profiler.init_app(app, feedbackdb) # Carga la traducción alternativa fallback_lang = support.Translations.load(os.path.join(app.root_path, 'translations'), ["en"]) @app.before_request def before_request(): # si el idioma de la URL es inválido, devuelve página no encontrada if g.url_lang and not g.url_lang in app.config["ALL_LANGS"]: abort(404) # quita todas las / finales de una URL if request.path != '/' and request.path.endswith('/'): return redirect(u(request.url).replace(u(request.path), u(request.path)[:-1]),301) # ignora peticiones sin blueprint if request.blueprint is None: return # si no es el idioma alternativo, lo añade por si no se encuentra el mensaje if g.lang!="en": get_translations().add_fallback(fallback_lang) # dominio de la web g.domain = request.url_root[7:-1] if "https" not in request.url_root else request.url_root[8:-1] # título de la página por defecto g.title = g.domain # contador de archivos totales g.count_files = lastcount[0] ''' # TODO: Buscar una forma mejor de hacer esto @app.after_request def after_request(response): if response.mimetype == "text/html": response.data = html_slimmer(response.data) return response ''' # Páginas de error @app.errorhandler(400) @app.errorhandler(401) @app.errorhandler(403) @app.errorhandler(404) @app.errorhandler(405) @app.errorhandler(408) @app.errorhandler(409) @app.errorhandler(410) @app.errorhandler(411) @app.errorhandler(412) @app.errorhandler(413) @app.errorhandler(414) @app.errorhandler(415) @app.errorhandler(416) @app.errorhandler(417) @app.errorhandler(418) @app.errorhandler(500) @app.errorhandler(501) @app.errorhandler(502) @app.errorhandler(503) def all_errors(e): error=str(e.code) message=_("error_"+error+"_message") description=_("error_"+error+"_description") g.title=error+" "+message if message!="error_"+error+"_message" else e.message.replace("<p>","").replace("</p>","") g.count_files = lastcount[0] return render_template('error.html', zone="errorhandler", error=error, description=description if description!="error_"+error+"_description" else e.description.replace("<p>","").replace("</p>","") ), e.code return app
def test_reserved_locale_names(): for name in ("con", "aux", "nul", "prn", "com8", "lpt5"): with pytest.raises(ValueError): localedata.load(name) with pytest.raises(ValueError): Locale(name)
def _data(self): if self.__data is None: self.__data = localedata.LocaleDataDict(localedata.load(str(self))) return self.__data
def translate(): ''' Edita la traducción a un idioma ''' languages = localedata.load(g.lang)["languages"] keystrcoll = cmp_to_key(locale.strcoll) form = None forml = SelectLanguageForm(request.form) forml.lang.choices = [("", "-- "+_("choose_language")+" --")] + sorted( ((code, localedata.load(code)["languages"][code].capitalize()+" ("+languages[code].capitalize()+")") for code, language in languages.items() if code in current_app.config["TRANSLATE_LANGS"] and not code in current_app.config["LANGS"] and localedata.exists(code) and code in localedata.load(code)["languages"]), key=lambda x: keystrcoll(x[1])) total=99999 no_translation=0 msgids=[] lang_edit = request.args.get("lang") if not lang_edit in languages: lang_edit = None formfields = {} # mostrar el idioma a traducir if lang_edit is not None: forml.lang.default=lang_edit # cargar idioma actual current_lang = dict(fix_lang_values(entry,True) for entry in polib.pofile(lang_path(g.lang))) # si existe el idioma se carga, sino vacio lpath = lang_path(lang_edit) new_lang = dict(fix_lang_values(entry) for entry in polib.pofile(lpath)) if lpath else {} # recorre los ids en ingles y los coge el mensaje del idioma actual y el valor del nuevo for i, (msgid, msgstr) in enumerate(fix_lang_values(entry,True) for entry in polib.pofile(lang_path("en"))): # se excluyen los textos legales que concluyen con safe_ if not msgid.startswith(current_app.config["PRIVATE_MSGID_PREFIXES"]): # si no esta traducida la cadena en el idioma actual se deja vacio if not msgid in new_lang: no_translation+=1 new_lang[msgid]="" # si el mensaje esta traducido al idioma actual se usa, sino se usa el ingles if msgid in current_lang: msg=current_lang[msgid][0] description=current_lang[msgid][1] else: msg=msgstr[0] description=msgstr[1] # si la traduccion es mayor de 80 caracteres se utiliza un textarea en vez de un input text length=len(new_lang[msgid] or msg) if length>50: formfields[msgid]=TextAreaField(msg,default=new_lang[msgid],description=description) # se le establecen las filas al text area dependiendo del tamaño de la traduccion formfields["_args_%s" % msgid]={"rows":length/15} else: formfields[msgid]=TextField(msg,default=new_lang[msgid],description=description) formfields["_args_%s" % msgid]={} #se añade a la lista que se le envia al formulario msgids.append(msgid) total=float(len(msgids)) form=expanded_instance(TranslateForm, formfields, request.form, prefix="translate_") # si es el envio de la traducción if request.method == 'POST' and form.validate(): pagesdb.create_translation({"ip":request.remote_addr,"user_lang":g.lang,"dest_lang":lang_edit,"texts":{field.short_name: field.data for field in form if not field.short_name in ("captcha", "submit_form") and field.data!=new_lang[field.short_name]}}) flash("translation_sent") return redirect(url_for('index.home')) if lang_edit: forml.lang.data = lang_edit # sino se muestra la seleccion de idioma a traducir g.title+=_("translate_to_your_language") return render_template('pages/translate.html', page_title=_("translate_to_your_language"), pagination=["submitlink","submitlink",2,2], lang=lang_edit, forml=forml, form=form, pname="translate", msgids=msgids, complete=round(((total-no_translation)/total)*100,2))