Просмотр исходного кода

[features] build multi-lingual website

version-14
Rushabh Mehta 9 лет назад
committed by Anand Doshi
Родитель
Сommit
dd9d73062a
4 измененных файлов: 67 добавлений и 49 удалений
  1. +3
    -0
      frappe/__init__.py
  2. +3
    -3
      frappe/auth.py
  3. +5
    -3
      frappe/translate.py
  4. +56
    -43
      frappe/website/render.py

+ 3
- 0
frappe/__init__.py Просмотреть файл

@@ -642,6 +642,9 @@ def get_installed_apps(sort=False):
if getattr(flags, "in_install_db", True): if getattr(flags, "in_install_db", True):
return [] return []


if not db:
connect()

installed = json.loads(db.get_global("installed_apps") or "[]") installed = json.loads(db.get_global("installed_apps") or "[]")


if sort: if sort:


+ 3
- 3
frappe/auth.py Просмотреть файл

@@ -32,7 +32,7 @@ class HTTPRequest:
frappe.local.request_ip = '127.0.0.1' frappe.local.request_ip = '127.0.0.1'


# language # language
self.set_lang(frappe.request.accept_languages.values())
self.set_lang()


# load cookies # load cookies
frappe.local.cookie_manager = CookieManager() frappe.local.cookie_manager = CookieManager()
@@ -70,9 +70,9 @@ class HTTPRequest:
frappe.local.flags.disable_traceback = True frappe.local.flags.disable_traceback = True
frappe.throw(_("Invalid Request"), frappe.CSRFTokenError) frappe.throw(_("Invalid Request"), frappe.CSRFTokenError)


def set_lang(self, lang_codes):
def set_lang(self):
from frappe.translate import guess_language from frappe.translate import guess_language
frappe.local.lang = guess_language(lang_codes)
frappe.local.lang = guess_language()


def get_db_name(self): def get_db_name(self):
"""get database name from conf""" """get database name from conf"""


+ 5
- 3
frappe/translate.py Просмотреть файл

@@ -15,13 +15,15 @@ from frappe.utils.jinja import render_include
from jinja2 import TemplateError from jinja2 import TemplateError
import itertools, operator 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""" """Set `frappe.local.lang` from HTTP headers at beginning of request"""
lang_codes = frappe.request.accept_languages.values()
if not lang_codes: if not lang_codes:
return frappe.local.lang return frappe.local.lang


guess = None guess = None
lang_list = get_all_languages() or []
if not lang_list:
lang_list = get_all_languages() or []


for l in lang_codes: for l in lang_codes:
code = l.strip() 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.set_value("System Settings", "System Settings", "language", new_name)


frappe.db.sql("""update `tabUser` set language=%(new_name)s where language=%(old_name)s""", frappe.db.sql("""update `tabUser` set language=%(new_name)s where language=%(old_name)s""",
{ "old_name": old_name, "new_name": new_name })
{ "old_name": old_name, "new_name": new_name })

+ 56
- 43
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.context import get_context
from frappe.website.utils import get_home_page, can_cache, delete_page_cache from frappe.website.utils import get_home_page, can_cache, delete_page_cache
from frappe.website.router import clear_sitemap from frappe.website.router import clear_sitemap
from frappe.translate import guess_language


class PageNotFoundError(Exception): pass class PageNotFoundError(Exception): pass


def render(path, http_status_code=None): def render(path, http_status_code=None):
"""render html page""" """render html page"""
path = resolve_path(path.strip("/ ")) path = resolve_path(path.strip("/ "))
set_lang()


try: try:
data = render_page(path)
data = render_page_by_language(path)
except frappe.DoesNotExistError, e: except frappe.DoesNotExistError, e:
doctype, name = get_doctype_from_path(path) doctype, name = get_doctype_from_path(path)
if doctype and name: 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) 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 = """<p><strong>{error}</strong></p>
<p>
<a href="/login?redirect-to=/{pathname}" class="btn btn-primary">{login}</a>
</p>""".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("<!-- csrf_token -->", '<script>frappe.csrf_token = "{0}";</script>'.format(
frappe.local.session.data.csrf_token))

return data

def build_response(path, data, http_status_code, headers=None): def build_response(path, data, http_status_code, headers=None):
# build response # build response
response = Response() response = Response()
@@ -114,6 +73,23 @@ def build_response(path, data, http_status_code, headers=None):


return response 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): def render_page(path):
"""get page html""" """get page html"""
out = None out = None
@@ -234,3 +210,40 @@ def clear_cache(path=None):


for method in frappe.get_hooks("website_clear_cache"): for method in frappe.get_hooks("website_clear_cache"):
frappe.get_attr(method)(path) frappe.get_attr(method)(path)

def render_403(e, pathname):
path = "message"
frappe.local.message = """<p><strong>{error}</strong></p>
<p>
<a href="/login?redirect-to=/{pathname}" class="btn btn-primary">{login}</a>
</p>""".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("<!-- csrf_token -->", '<script>frappe.csrf_token = "{0}";</script>'.format(
frappe.local.session.data.csrf_token))

return data

Загрузка…
Отмена
Сохранить