Hi, Please find the attached patch for #2190: Move language selection to Preferences.
Moved the user language selection into Preferences. For the desktop mode, if the user has selected the language from the Preferences then that will be reflected otherwise English will be the default language. For the server mode, we have given an option on the log-in page to choose the language. We drop the cookie for the selected language and also update the preferences for the same. So, the app will be loaded with the language which the user has selected on the log-in page. If the user will change the language from the preferences, then the cookie will be changed and also this change will be reflected on the log-in page next time. Thanks, Khushboo
diff --git a/web/pgadmin/__init__.py b/web/pgadmin/__init__.py index 1a14325..e2775c7 100644 --- a/web/pgadmin/__init__.py +++ b/web/pgadmin/__init__.py @@ -29,6 +29,8 @@ from pgadmin.utils.session import create_session_interface from werkzeug.local import LocalProxy from werkzeug.utils import find_modules +from pgadmin.utils.preferences import Preferences + from pgadmin.model import db, Role, Server, ServerGroup, User, Version, Keys # If script is running under python3, it will not have the xrange function @@ -189,8 +191,25 @@ def create_app(app_name=None): @babel.localeselector def get_locale(): - """Get the best language for the user.""" - language = request.accept_languages.best_match(config.LANGUAGES.keys()) + """Get the language for the user.""" + language = 'en' + if config.SERVER_MODE is False: + # Get the user language preference from the miscellaneous module + misc_preference = Preferences.module('misc') + user_languages = misc_preference.preference( + 'user_language' + ) + if user_languages: + language = user_languages.get() or 'en' + else: + # If language is available in get request then return the same + # otherwise check the cokkie + data = request.form + if 'language' in data: + language = data['language'] or 'en' + else: + language = request.cookies.get('pgadmin4_user_language') or 'en' + return language ########################################################################## @@ -269,6 +288,24 @@ def create_app(app_name=None): ########################################################################## driver.init_app(app) + @user_logged_in.connect_via(app) + def register_language(sender, user): + # After logged in, set the language in the preferences if we get from + # the login page + data = request.form + if 'language' in data: + language = data['language'] + + # Set the user language preference + misc_preference = Preferences.module('misc') + user_languages = misc_preference.preference( + 'user_language' + ) + + if user_languages and language: + language = user_languages.set(language) + + ########################################################################## # Register any local servers we can discover ########################################################################## diff --git a/web/pgadmin/browser/__init__.py b/web/pgadmin/browser/__init__.py index 18c7fbd..7508a5c 100644 --- a/web/pgadmin/browser/__init__.py +++ b/web/pgadmin/browser/__init__.py @@ -11,7 +11,8 @@ import json from abc import ABCMeta, abstractmethod, abstractproperty import six -from flask import current_app, render_template, url_for, make_response, flash +from flask import current_app, render_template, url_for, make_response, flash,\ + Response, request from flask_babel import gettext from flask_login import current_user from flask_security import login_required @@ -473,13 +474,26 @@ def index(): flash(msg, 'warning') - return render_template( + response = Response(render_template( MODULE_NAME + "/index.html", username=current_user.email, is_admin=current_user.has_role("Administrator"), _=gettext + )) + + # Set the language cookie after login, so next time the user will have that + # same option at the login time. + misc_preference = Preferences.module('misc') + user_languages = misc_preference.preference( + 'user_language' ) + language = 'en' + if user_languages: + language = user_languages.get() or 'en' + + response.set_cookie("pgadmin4_user_language", language) + return response @blueprint.route("/js/browser.js") @login_required diff --git a/web/pgadmin/misc/__init__.py b/web/pgadmin/misc/__init__.py index e88b606..a97cafc 100644 --- a/web/pgadmin/misc/__init__.py +++ b/web/pgadmin/misc/__init__.py @@ -13,6 +13,7 @@ import pgadmin.utils.driver as driver from flask import url_for, render_template, Response from flask_babel import gettext as _ from pgadmin.utils import PgAdminModule +from pgadmin.utils.preferences import Preferences import config @@ -41,6 +42,25 @@ class MiscModule(PgAdminModule): ) return stylesheets + def register_preferences(self): + """ + Register preferences for this module. + """ + self.misc_preference = Preferences('misc', _('Miscellaneous')) + + lang_options = [] + for lang in config.LANGUAGES: + lang_options.append({'label': config.LANGUAGES[lang], + 'value': lang}) + + # Register options for the User language settings + self.language = self.misc_preference.register( + 'misc', 'user_language', + _("User language"), 'options', 'en', + category_label=_('User language'), + options=lang_options + ) + # Initialise the module blueprint = MiscModule(MODULE_NAME, __name__) diff --git a/web/pgadmin/preferences/__init__.py b/web/pgadmin/preferences/__init__.py index 9b7b362..3eab8d9 100644 --- a/web/pgadmin/preferences/__init__.py +++ b/web/pgadmin/preferences/__init__.py @@ -155,4 +155,22 @@ def save(pid): if not res: return internal_server_error(errormsg=msg) - return success_return() + response = success_return() + + # Set cookie for language settings. + # This will execute every time as could not find the better way to know + # that which preference is getting updated. + + misc_preference = Preferences.module('misc') + user_languages = misc_preference.preference( + 'user_language' + ) + + language = 'en' + if user_languages: + language = user_languages.get() or 'en' + + response.set_cookie("pgadmin4_user_language", language) + + return response + diff --git a/web/pgadmin/preferences/templates/preferences/preferences.js b/web/pgadmin/preferences/templates/preferences/preferences.js index 9fc1778..dc0e8e2 100644 --- a/web/pgadmin/preferences/templates/preferences/preferences.js +++ b/web/pgadmin/preferences/templates/preferences/preferences.js @@ -218,7 +218,11 @@ define( var opts = []; // Convert the array to SelectControl understandable options. _.each(p.options, function(o) { - opts.push({'label': o, 'value': o}); + if('label' in o && 'value' in o){ + opts.push({'label': o.label, 'value': o.value}); + } else { + opts.push({'label': o, 'value': o}); + } }); p.options = opts; return 'select2'; diff --git a/web/pgadmin/static/css/pgadmin.css b/web/pgadmin/static/css/pgadmin.css index 9729d51..67e8b41 100644 --- a/web/pgadmin/static/css/pgadmin.css +++ b/web/pgadmin/static/css/pgadmin.css @@ -767,3 +767,16 @@ lgg-el-container[el=md] .pg-el-lg-8, .show_progress { cursor: progress; } +.user-language { + margin-top: 10px; +} +.user-language label{ + float:left; + font-weight: normal !important; +} +.user-language div{ + float:left; +} +.user-language select{ + height: 25px !important; +} \ No newline at end of file diff --git a/web/pgadmin/templates/security/login_user.html b/web/pgadmin/templates/security/login_user.html index 259c1b0..fef04ed 100644 --- a/web/pgadmin/templates/security/login_user.html +++ b/web/pgadmin/templates/security/login_user.html @@ -3,10 +3,21 @@ {% block panel_body %} <form action="{{ url_for_security('login') }}" method="POST" name="login_user_form"> {{ login_user_form.hidden_tag() }} + {% set user_language = request.cookies.get('pgadmin4_user_language') or 'en' %} <fieldset> {{ render_field_with_errors(login_user_form.email, "text") }} {{ render_field_with_errors(login_user_form.password, "password") }} <input class="btn btn-lg btn-success btn-block" type="submit" value="{{ _('Login') }}"> + <div class="pgadmin-control-group form-group pg-el-xs-12 user-language"> + <label class="help-block pg-el-sm-3">{{ _("Continue with") }}</label> + <div class="pgadmin-controls pg-el-sm-9"> + <select class="form-control" name="language" value="{{user_language}}"> + {% for key, lang in config.LANGUAGES.items() %} + <option value="{{key}}" {% if user_language == key %}selected{% endif %}>{{lang}}</option> + {% endfor %} + </select> + </div> + </div> </fieldset> </form> <span class="help-block">{{ _('Forgotten your <a href="%(url)s">password</a>?', url=url_for('security.forgot_password')) }}</span> diff --git a/web/pgadmin/utils/preferences.py b/web/pgadmin/utils/preferences.py index e0da6c8..932351d 100644 --- a/web/pgadmin/utils/preferences.py +++ b/web/pgadmin/utils/preferences.py @@ -126,8 +126,9 @@ class _Preference(object): current_app.logger.exeception(e) return self.default if self._type == 'options': - if res.value in self.options: - return res.value + for opt in self.options: + if 'value' in opt and opt['value'] == res.value: + return res.value return self.default if self._type == 'text': if res.value == '': @@ -184,7 +185,12 @@ class _Preference(object): current_app.logger.exeception(e) return False, gettext("Invalid value for a datetime option.") elif self._type == 'options': - if value not in self.options: + has_value = False + for opt in self.options: + if 'value' in opt and opt['value'] == value: + has_value = True + + if not has_value: return False, gettext("Invalid value for an options option.") pref = UserPrefTable.query.filter_by(
-- Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgadmin-hackers