diff --git a/setup.py b/setup.py index 771081d0..1c11afc3 100644 --- a/setup.py +++ b/setup.py @@ -75,9 +75,10 @@ def get_cmdclass(): cmdclass.update(dict(clean=octoprint_setuptools.CleanCommand.for_options(source_folder="src", eggs=["OctoPrint*.egg-info"]))) # add translation commands - translation_dir = os.path.join("src", "octoprint", "translations") + translation_dir = "translations" pot_file = os.path.join(translation_dir, "messages.pot") - cmdclass.update(octoprint_setuptools.get_babel_commandclasses(pot_file=pot_file, output_dir=translation_dir)) + bundled_dir = os.path.join("src", "octoprint", "translations") + cmdclass.update(octoprint_setuptools.get_babel_commandclasses(pot_file=pot_file, output_dir=translation_dir, pack_name_prefix="OctoPrint-i18n-", pack_path_prefix="", bundled_dir=bundled_dir)) return cmdclass diff --git a/src/octoprint/server/__init__.py b/src/octoprint/server/__init__.py index 0f6ea217..b217540a 100644 --- a/src/octoprint/server/__init__.py +++ b/src/octoprint/server/__init__.py @@ -7,7 +7,7 @@ __copyright__ = "Copyright (C) 2014 The OctoPrint Project - Released under terms import uuid from sockjs.tornado import SockJSRouter -from flask import Flask, render_template, send_from_directory, g, request, make_response, session, url_for +from flask import Flask, g, request, session from flask.ext.login import LoginManager, current_user from flask.ext.principal import Principal, Permission, RoleNeed, identity_loaded, UserNeed from flask.ext.babel import Babel, gettext, ngettext @@ -24,7 +24,7 @@ SUCCESS = {} NO_CONTENT = ("", 204) app = Flask("octoprint") -babel = Babel(app) +babel = None debug = False printer = None @@ -58,9 +58,6 @@ import octoprint.filemanager.analysis import octoprint.slicing from . import util -util.tornado.fix_ioloop_scheduling() -util.flask.enable_plugin_translations() - UI_API_KEY = ''.join('%02X' % ord(z) for z in uuid.uuid4().bytes) @@ -70,519 +67,8 @@ BRANCH = versions['branch'] if 'branch' in versions else None DISPLAY_VERSION = "%s (%s branch)" % (VERSION, BRANCH) if BRANCH else VERSION del versions - -def get_available_locale_identifiers(locales): - result = set() - - # add available translations - for locale in locales: - result.add(locale.language) - if locale.territory: - # if a territory is specified, add that too - result.add("%s_%s" % (locale.language, locale.territory)) - - return result - - -LOCALES = [Locale.parse("en")] + babel.list_translations() -LANGUAGES = get_available_locale_identifiers(LOCALES) - - -@app.before_request -def before_request(): - g.locale = get_locale() - -@app.after_request -def after_request(response): - # send no-cache headers with all POST responses - if request.method == "POST": - response.cache_control.no_cache = True - response.headers.add("X-Clacks-Overhead", "GNU Terry Pratchett") - return response - - -@babel.localeselector -def get_locale(): - if "l10n" in request.values: - return Locale.negotiate([request.values["l10n"]], LANGUAGES) - - if hasattr(g, "identity") and g.identity and userManager is not None: - userid = g.identity.id - try: - user_language = userManager.getUserSetting(userid, ("interface", "language")) - if user_language is not None and not user_language == "_default": - return Locale.negotiate([user_language], LANGUAGES) - except octoprint.users.UnknownUser: - pass - - default_language = settings().get(["appearance", "defaultLanguage"]) - if default_language is not None and not default_language == "_default" and default_language in LANGUAGES: - return Locale.negotiate([default_language], LANGUAGES) - - return request.accept_languages.best_match(LANGUAGES) - - -@app.route("/") -@util.flask.cached(refreshif=lambda: util.flask.cache_check_headers() or "_refresh" in request.values, key=lambda: "view/%s/%s" % (request.path, g.locale)) -def index(): - - #~~ a bunch of settings - - enable_gcodeviewer = settings().getBoolean(["gcodeViewer", "enabled"]) - enable_timelapse = (settings().get(["webcam", "snapshot"]) and settings().get(["webcam", "ffmpeg"])) - enable_systemmenu = settings().get(["system"]) is not None and settings().get(["system", "actions"]) is not None and len(settings().get(["system", "actions"])) > 0 - enable_accesscontrol = userManager is not None - preferred_stylesheet = settings().get(["devel", "stylesheet"]) - locales = dict((l.language, dict(language=l.language, display=l.display_name, english=l.english_name)) for l in LOCALES) - - #~~ prepare assets - - supported_stylesheets = ("css", "less") - assets = dict( - js=[], - stylesheets=[] - ) - assets["js"] = [ - url_for('static', filename='js/app/viewmodels/appearance.js'), - url_for('static', filename='js/app/viewmodels/connection.js'), - url_for('static', filename='js/app/viewmodels/control.js'), - url_for('static', filename='js/app/viewmodels/firstrun.js'), - url_for('static', filename='js/app/viewmodels/files.js'), - url_for('static', filename='js/app/viewmodels/loginstate.js'), - url_for('static', filename='js/app/viewmodels/navigation.js'), - url_for('static', filename='js/app/viewmodels/printerstate.js'), - url_for('static', filename='js/app/viewmodels/printerprofiles.js'), - url_for('static', filename='js/app/viewmodels/settings.js'), - url_for('static', filename='js/app/viewmodels/slicing.js'), - url_for('static', filename='js/app/viewmodels/temperature.js'), - url_for('static', filename='js/app/viewmodels/terminal.js'), - url_for('static', filename='js/app/viewmodels/users.js'), - url_for('static', filename='js/app/viewmodels/log.js'), - url_for('static', filename='js/app/viewmodels/usersettings.js') - ] - if enable_gcodeviewer: - assets["js"] += [ - url_for('static', filename='js/app/viewmodels/gcode.js'), - url_for('static', filename='gcodeviewer/js/ui.js'), - url_for('static', filename='gcodeviewer/js/gCodeReader.js'), - url_for('static', filename='gcodeviewer/js/renderer.js') - ] - if enable_timelapse: - assets["js"].append(url_for('static', filename='js/app/viewmodels/timelapse.js')) - - if preferred_stylesheet == "less": - assets["stylesheets"].append(("less", url_for('static', filename='less/octoprint.less'))) - elif preferred_stylesheet == "css": - assets["stylesheets"].append(("css", url_for('static', filename='css/octoprint.css'))) - - asset_plugins = pluginManager.get_implementations(octoprint.plugin.AssetPlugin) - for implementation in asset_plugins: - name = implementation._identifier - all_assets = implementation.get_assets() - - if "js" in all_assets: - for asset in all_assets["js"]: - assets["js"].append(url_for('plugin_assets', name=name, filename=asset)) - - if preferred_stylesheet in all_assets: - for asset in all_assets[preferred_stylesheet]: - assets["stylesheets"].append((preferred_stylesheet, url_for('plugin_assets', name=name, filename=asset))) - else: - for stylesheet in supported_stylesheets: - if not stylesheet in all_assets: - continue - - for asset in all_assets[stylesheet]: - assets["stylesheets"].append((stylesheet, url_for('plugin_assets', name=name, filename=asset))) - break - - ##~~ prepare templates - - templates = defaultdict(lambda: dict(order=[], entries=dict())) - - # rules for transforming template configs to template entries - template_rules = dict( - navbar=dict(div=lambda x: "navbar_plugin_" + x, template=lambda x: x + "_navbar.jinja2", to_entry=lambda data: data), - sidebar=dict(div=lambda x: "sidebar_plugin_" + x, template=lambda x: x + "_sidebar.jinja2", to_entry=lambda data: (data["name"], data)), - tab=dict(div=lambda x: "tab_plugin_" + x, template=lambda x: x + "_tab.jinja2", to_entry=lambda data: (data["name"], data)), - settings=dict(div=lambda x: "settings_plugin_" + x, template=lambda x: x + "_settings.jinja2", to_entry=lambda data: (data["name"], data)), - usersettings=dict(div=lambda x: "usersettings_plugin_" + x, template=lambda x: x + "_usersettings.jinja2", to_entry=lambda data: (data["name"], data)), - generic=dict(template=lambda x: x + ".jinja2", to_entry=lambda data: data) - ) - - # sorting orders - template_sorting = dict( - navbar=dict(add="prepend", key=None), - sidebar=dict(add="append", key="name"), - tab=dict(add="append", key="name"), - settings=dict(add="custom_append", key="name", custom_add_entries=lambda missing: dict(section_plugins=(gettext("Plugins"), None)), custom_add_order=lambda missing: ["section_plugins"] + missing), - usersettings=dict(add="append", key="name"), - generic=dict(add="append", key=None) - ) - - hooks = pluginManager.get_hooks("octoprint.ui.web.templatetypes") - for name, hook in hooks.items(): - try: - result = hook(dict(template_rules)) - except: - # TODO - pass - else: - if not isinstance(result, list): - continue - - for entry in result: - if not isinstance(entry, tuple) or not len(entry) == 3: - continue - - key, order, rule = entry - - # order defaults - if "add" not in order: - order["add"] = "prepend" - if "key" not in order: - order["key"] = "name" - - # rule defaults - if "div" not in rule: - # default div name: __plugin_ - div = "{name}_{key}_plugin_".format(**locals()) - rule["div"] = lambda x: div + x - if "template" not in rule: - # default template name: _plugin__