diff --git a/frappe/__init__.py b/frappe/__init__.py index 9e176e6077..1c528606e5 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -642,6 +642,9 @@ def get_installed_apps(sort=False): if getattr(flags, "in_install_db", True): return [] + if not db: + connect() + installed = json.loads(db.get_global("installed_apps") or "[]") if sort: diff --git a/frappe/auth.py b/frappe/auth.py index 2cff14e097..8a644b3c1d 100644 --- a/frappe/auth.py +++ b/frappe/auth.py @@ -32,7 +32,7 @@ class HTTPRequest: frappe.local.request_ip = '127.0.0.1' # language - self.set_lang(frappe.request.accept_languages.values()) + self.set_lang() # load cookies frappe.local.cookie_manager = CookieManager() @@ -70,9 +70,9 @@ class HTTPRequest: frappe.local.flags.disable_traceback = True frappe.throw(_("Invalid Request"), frappe.CSRFTokenError) - def set_lang(self, lang_codes): + def set_lang(self): from frappe.translate import guess_language - frappe.local.lang = guess_language(lang_codes) + frappe.local.lang = guess_language() def get_db_name(self): """get database name from conf""" diff --git a/frappe/translate.py b/frappe/translate.py index 8e8ec88a44..d348609ad5 100644 --- a/frappe/translate.py +++ b/frappe/translate.py @@ -15,13 +15,15 @@ from frappe.utils.jinja import render_include from jinja2 import TemplateError import itertools, operator -def guess_language(lang_codes): +def guess_language(lang_list=None): """Set `frappe.local.lang` from HTTP headers at beginning of request""" + lang_codes = frappe.request.accept_languages.values() if not lang_codes: return frappe.local.lang guess = None - lang_list = get_all_languages() or [] + if not lang_list: + lang_list = get_all_languages() or [] for l in lang_codes: code = l.strip() @@ -536,4 +538,4 @@ def rename_language(old_name, new_name): frappe.db.set_value("System Settings", "System Settings", "language", new_name) frappe.db.sql("""update `tabUser` set language=%(new_name)s where language=%(old_name)s""", - { "old_name": old_name, "new_name": new_name }) \ No newline at end of file + { "old_name": old_name, "new_name": new_name }) diff --git a/frappe/website/render.py b/frappe/website/render.py index c83d745ccb..2dedba7004 100644 --- a/frappe/website/render.py +++ b/frappe/website/render.py @@ -13,16 +13,16 @@ from werkzeug.routing import Map, Rule, NotFound from frappe.website.context import get_context from frappe.website.utils import get_home_page, can_cache, delete_page_cache from frappe.website.router import clear_sitemap +from frappe.translate import guess_language class PageNotFoundError(Exception): pass def render(path, http_status_code=None): """render html page""" path = resolve_path(path.strip("/ ")) - set_lang() try: - data = render_page(path) + data = render_page_by_language(path) except frappe.DoesNotExistError, e: doctype, name = get_doctype_from_path(path) if doctype and name: @@ -59,47 +59,6 @@ def render(path, http_status_code=None): return build_response(path, data, http_status_code or 200) -def set_lang(): - """Set user's lang if not Guest or use default lang""" - frappe.local.lang = getattr(frappe.local, "user_lang", None) or frappe.db.get_default("lang") - -def render_403(e, pathname): - path = "message" - frappe.local.message = """
{error}
-- {login} -
""".format(error=cstr(e.message), login=_("Login"), pathname=frappe.local.path) - frappe.local.message_title = _("Not Permitted") - return render_page(path), e.http_status_code - -def get_doctype_from_path(path): - doctypes = frappe.db.sql_list("select name from tabDocType") - - parts = path.split("/") - - doctype = parts[0] - name = parts[1] if len(parts) > 1 else None - - if doctype in doctypes: - return doctype, name - - # try scrubbed - doctype = doctype.replace("_", " ").title() - if doctype in doctypes: - return doctype, name - - return None, None - -def add_csrf_token(data): - if is_ajax() or frappe.session.user == "Guest" or not frappe.local.session.data.csrf_token: - pass - - else: - data = data.replace("", ''.format( - frappe.local.session.data.csrf_token)) - - return data - def build_response(path, data, http_status_code, headers=None): # build response response = Response() @@ -114,6 +73,23 @@ def build_response(path, data, http_status_code, headers=None): return response +def render_page_by_language(path): + translated_languages = frappe.get_hooks("translated_languages_for_website") + user_lang = guess_language(translated_languages) + if translated_languages and user_lang in translated_languages: + try: + if path and path != "index": + lang_path = '{0}/{1}'.format(user_lang, path) + else: + lang_path = user_lang # index + + return render_page(lang_path) + except frappe.DoesNotExistError: + return render_page(path) + + else: + return render_page(path) + def render_page(path): """get page html""" out = None @@ -234,3 +210,40 @@ def clear_cache(path=None): for method in frappe.get_hooks("website_clear_cache"): frappe.get_attr(method)(path) + +def render_403(e, pathname): + path = "message" + frappe.local.message = """{error}
++ {login} +
""".format(error=cstr(e.message), login=_("Login"), pathname=frappe.local.path) + frappe.local.message_title = _("Not Permitted") + return render_page(path), e.http_status_code + +def get_doctype_from_path(path): + doctypes = frappe.db.sql_list("select name from tabDocType") + + parts = path.split("/") + + doctype = parts[0] + name = parts[1] if len(parts) > 1 else None + + if doctype in doctypes: + return doctype, name + + # try scrubbed + doctype = doctype.replace("_", " ").title() + if doctype in doctypes: + return doctype, name + + return None, None + +def add_csrf_token(data): + if is_ajax() or frappe.session.user == "Guest" or not frappe.local.session.data.csrf_token: + pass + + else: + data = data.replace("", ''.format( + frappe.local.session.data.csrf_token)) + + return data