@@ -110,5 +110,36 @@ | |||
{%- endblock %} | |||
<!-- csrf_token --> | |||
{%- block body_include %}{{ body_include or "" }}{% endblock -%} | |||
<script > | |||
frappe.ready(() => { | |||
if (frappe.session.user === 'Guest') { | |||
frappe.call("frappe.translate.get_all_languages", { | |||
with_language_name: true | |||
}).then(res => { | |||
let languages = res.message; | |||
languages.forEach(language_doc => { | |||
$("#language-switcher") | |||
.append( | |||
$("<option></option>") | |||
.attr("value", language_doc.language_code) | |||
.text(language_doc.language_name) | |||
); | |||
}); | |||
$("#language-switcher").removeClass('hide'); | |||
const language = localStorage.getItem('preferred-language'); | |||
$("#language-switcher").val(language || 'en'); | |||
$("#language-switcher").change((e) => { | |||
let lang = $("#language-switcher").val(); | |||
localStorage.setItem('preferred-language', $("#language-switcher").val()) | |||
frappe.call("frappe.translate.set_preferred_language_cookie", { | |||
"preferred_language": lang | |||
}).then(() => { | |||
window.location.reload(); | |||
}); | |||
}); | |||
}); | |||
} | |||
}) | |||
</script> | |||
</body> | |||
</html> |
@@ -21,5 +21,8 @@ | |||
<div class="collapse navbar-collapse" id="navbarSupportedContent"> | |||
{% include "templates/includes/navbar/navbar_items.html" %} | |||
</div> | |||
<div class="form-group mb-0"> | |||
<select class="form-control hide" id="language-switcher"></select> | |||
</div> | |||
</div> | |||
</nav> |
@@ -7,7 +7,7 @@ | |||
<li class="nav-item dropdown {% if submenu %} dropdown-submenu {% endif %}"> | |||
<a class="nav-link dropdown-toggle" href="#" id="{{ dropdown_id }}" role="button" | |||
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | |||
{{ item.label }} | |||
{{ _(item.label) }} | |||
</a> | |||
<ul class="dropdown-menu" aria-labelledby="{{ dropdown_id }}"> | |||
{% for child in item.child_items %} | |||
@@ -20,7 +20,7 @@ | |||
<li class="dropdown {% if submenu %} dropdown-submenu {% endif %}"> | |||
<a class="dropdown-item dropdown-toggle" href="#" id="{{ dropdown_id }}" role="button" | |||
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | |||
{{ item.label }} | |||
{{ _(item.label) }} | |||
</a> | |||
<ul class="dropdown-menu" aria-labelledby="{{ dropdown_id }}"> | |||
{% for child in item.child_items %} | |||
@@ -36,13 +36,13 @@ | |||
<li class="nav-item"> | |||
<a class="nav-link" href="{{ (item.url or '')|abs_url }}" | |||
{% if item.open_in_new_tab %} target="_blank" {% endif %}> | |||
{{ item.label }} | |||
{{ _(item.label) }} | |||
</a> | |||
</li> | |||
{% else %} | |||
<a class="dropdown-item" href="{{ (item.url or '') | abs_url }}" | |||
{% if item.open_in_new_tab %} target="_blank" {% endif %}> | |||
{{ item.label }} | |||
{{ _(item.label) }} | |||
</a> | |||
{% endif %} | |||
@@ -21,6 +21,11 @@ import itertools, operator | |||
def guess_language(lang_list=None): | |||
"""Set `frappe.local.lang` from HTTP headers at beginning of request""" | |||
user_preferred_language = frappe.request.cookies.get('preferred_language') | |||
is_guest_user = not frappe.session.user or frappe.session.user == 'Guest' | |||
if is_guest_user and user_preferred_language: | |||
return user_preferred_language | |||
lang_codes = frappe.request.accept_languages.values() | |||
if not lang_codes: | |||
return frappe.local.lang | |||
@@ -77,14 +82,6 @@ def set_default_language(lang): | |||
frappe.db.set_default("lang", lang) | |||
frappe.local.lang = lang | |||
def get_all_languages(): | |||
"""Returns all language codes ar, ch etc""" | |||
def _get(): | |||
if not frappe.db: | |||
frappe.connect() | |||
return frappe.db.sql_list('select name from tabLanguage') | |||
return frappe.cache().get_value('languages', _get) | |||
def get_lang_dict(): | |||
"""Returns all languages in dict format, full name is the key e.g. `{"english":"en"}`""" | |||
return dict(frappe.db.sql('select language_name, name from tabLanguage')) | |||
@@ -244,6 +241,8 @@ def get_translation_dict_from_file(path, lang, app): | |||
return translation_map | |||
def get_user_translations(lang): | |||
if not frappe.db: | |||
frappe.connect() | |||
out = frappe.cache().hget('lang_user_translations', lang) | |||
if out is None: | |||
out = {} | |||
@@ -813,3 +812,24 @@ def get_contribution_status(message_id): | |||
def get_translator_url(): | |||
return frappe.get_hooks()['translator_url'][0] | |||
@frappe.whitelist(allow_guest=True) | |||
def get_all_languages(with_language_name=False): | |||
"""Returns all language codes ar, ch etc""" | |||
def get_language_codes(): | |||
return frappe.db.sql_list('select name from tabLanguage') | |||
def get_all_language_with_name(): | |||
return frappe.db.get_all('language', ['language_code', 'language_name']) | |||
if not frappe.db: | |||
frappe.connect() | |||
if with_language_name: | |||
return frappe.cache().get_value('languages_with_name', get_all_language_with_name) | |||
else: | |||
return frappe.cache().get_value('languages', get_language_codes) | |||
@frappe.whitelist(allow_guest=True) | |||
def set_preferred_language_cookie(preferred_language): | |||
frappe.local.cookie_manager.set_cookie("preferred_language", preferred_language) |