Skip to content

Commit

Permalink
Merge pull request #12813 from surajshetty3416/website-language-switcher
Browse files Browse the repository at this point in the history
  • Loading branch information
surajshetty3416 committed Apr 8, 2021
2 parents 3a7823e + b41c5b5 commit 66720e0
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 12 deletions.
34 changes: 34 additions & 0 deletions frappe/templates/base.html
Expand Up @@ -110,5 +110,39 @@
{%- 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 language_list = res.message;
let language = frappe.get_cookie('preferred_language');
let language_codes = [];
language_list.forEach(language_doc => {
language_codes.push(language_doc.language_code)
$("#language-switcher")
.append(
$("<option></option>")
.attr("value", language_doc.language_code)
.text(language_doc.language_name)
);
});
$("#language-switcher").removeClass('hide');
language = language || language_codes.includes(navigator.language) ? navigator.language : 'en';
$("#language-switcher").val(language);
document.documentElement.lang = language;
$("#language-switcher").change((e) => {
let lang = $("#language-switcher").val();
frappe.call("frappe.translate.set_preferred_language_cookie", {
"preferred_language": lang
}).then(() => {
window.location.reload();
});
});
});
}
})
</script>
</body>
</html>
3 changes: 3 additions & 0 deletions frappe/templates/includes/navbar/navbar.html
Expand Up @@ -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>
8 changes: 4 additions & 4 deletions frappe/templates/includes/navbar/navbar_items.html
Expand Up @@ -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 %}
Expand All @@ -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 %}
Expand All @@ -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 %}

Expand Down
36 changes: 28 additions & 8 deletions frappe/translate.py
Expand Up @@ -21,6 +21,11 @@

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
Expand Down Expand Up @@ -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'))
Expand Down Expand Up @@ -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 = {}
Expand Down Expand Up @@ -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)

0 comments on commit 66720e0

Please sign in to comment.