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

Reply via email to