Hi,
Please find the attached updated patch.
Thanks,
Khushboo
On Fri, Mar 17, 2017 at 4:20 PM, Dave Page <[email protected]> wrote:
> Hi
>
> On Fri, Mar 17, 2017 at 10:25 AM, Khushboo Vashi
> <[email protected]> wrote:
> > Hi,
> >
> > On Mon, Mar 13, 2017 at 4:09 PM, Dave Page <[email protected]> wrote:
> >>
> >> Hi
> >>
> >> On Fri, Mar 10, 2017 at 1:55 PM, Khushboo Vashi
> >> <[email protected]> wrote:
> >> > 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.
> >>
> >> I found some issues with this patch - though it's possible those
> >> issues existed previously in some, perhaps all cases:
> >>
> >> - The Polish translation has a bug in it that causes a syntax error in
> >> sqleditor.js. I fixed that with:
> >>
> >> -msgstr "Całkowity czas wykonania zapytania: %s\n"
> >> +msgstr "Całkowity czas wykonania zapytania: %s"
> >>
> >> - If I choose a language for the first time at login, then the
> >> top-level menu bar isn't translated. If I completely refresh the page,
> >> then that is resolved. We haven't loaded the main page at this point I
> >> don't think, so I wouldn't expect to see this (though, maybe it is
> >> being cached so we need to ensure it gets invalidated)?
> >>
> > This was my code issue which I have fixed now.
> > When we receive the first request (after hitting Login button), I have
> set
> > that language selection into the session.
> > If no session then it will pick up from the cookie.
> >
> >>
> >> - Like the top menu bar, the preferences panel doesn't seem to pickup
> >> the new language until a hard refresh is performed. For example, the
> >> attached screenshot is the result of me selecting Chinese at login,
> >> having previously used Polish. Perhaps we need to add "lang=cn" or
> >> similar to all URLs to force the cache to distinguish between
> >> languages?
> >>
> > In the preferences module, The aci-tree labels were not translated, that
> has
> > been fixed now.
> > As I have introduced the session variable, so, I think we don't require
> to
> > pass "lang=cn" to the URLS
> >
> >>
> >> - s/misc/Misc (the preference category).
> >>
> > I have changed it to Miscellaneous. (Like pgAdmin 3)
>
> That's much better. The only issues I see now are:
>
> - The descriptive help strings in the preferences dialogue are always
> shown in English
>
> Fixed
> - I'm seeing "miscellaneous" in all languages, not "Miscellaneous" or
> the translated version (e.g. "Pozostałe")
>
Fixed
> Thanks.
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>
diff --git a/web/pgadmin/__init__.py b/web/pgadmin/__init__.py
index 1a14325..1054bde 100644
--- a/web/pgadmin/__init__.py
+++ b/web/pgadmin/__init__.py
@@ -14,7 +14,7 @@ import os, sys, time
from collections import defaultdict
from importlib import import_module
-from flask import Flask, abort, request, current_app
+from flask import Flask, abort, request, current_app, session
from flask_babel import Babel, gettext
from flask_htmlmin import HTMLMIN
from flask_login import user_logged_in
@@ -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,29 @@ 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('miscellaneous', False)
+ if misc_preference:
+ user_languages = misc_preference.preference(
+ 'user_language'
+ )
+ if user_languages:
+ language = user_languages.get() or language
+ else:
+ # If language is available in get request then return the same
+ # otherwise check the session or cookie
+ data = request.form
+ if 'language' in data:
+ language = data['language'] or language
+ setattr(session, 'PGADMIN_LANGUAGE', language)
+ elif hasattr(session, 'PGADMIN_LANGUAGE'):
+ language = getattr(session, 'PGADMIN_LANGUAGE', language)
+ elif hasattr(request.cookies, 'PGADMIN_LANGUAGE'):
+ language = getattr(request.cookies, 'PGADMIN_LANGUAGE', language)
+
return language
##########################################################################
@@ -270,6 +293,27 @@ def create_app(app_name=None):
driver.init_app(app)
##########################################################################
+ # Register language to the preferences after login
+ ##########################################################################
+ @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('miscellaneous')
+ user_languages = misc_preference.preference(
+ 'user_language'
+ )
+
+ if user_languages and language:
+ language = user_languages.set(language)
+
+
+ ##########################################################################
# Register any local servers we can discover
##########################################################################
@user_logged_in.connect_via(app)
diff --git a/web/pgadmin/browser/__init__.py b/web/pgadmin/browser/__init__.py
index 18c7fbd..c801623 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('miscellaneous')
+ user_languages = misc_preference.preference(
+ 'user_language'
)
+ language = 'en'
+ if user_languages:
+ language = user_languages.get() or 'en'
+
+ response.set_cookie("PGADMIN_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..80ecd43 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('miscellaneous', _('Miscellaneous'))
+
+ lang_options = []
+ for lang in config.LANGUAGES:
+ lang_options.append({'label': config.LANGUAGES[lang],
+ 'value': lang})
+
+ # Register options for the User language settings
+ language = self.misc_preference.register(
+ 'miscellaneous', '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..42015de 100644
--- a/web/pgadmin/preferences/__init__.py
+++ b/web/pgadmin/preferences/__init__.py
@@ -13,7 +13,7 @@ side and for getting/setting preferences.
"""
import simplejson as json
-from flask import render_template, url_for, Response, request
+from flask import render_template, url_for, Response, request, session
from flask_babel import gettext
from flask_login import current_user
from flask_security import login_required
@@ -109,23 +109,28 @@ def preferences(module=None, preference=None):
res = []
def label(p):
- return p['label']
+ return gettext(p['label'])
for m in pref:
if len(m['categories']):
om = {
"id": m['id'],
- "label": m['label'],
+ "label": gettext(m['label']),
"inode": True,
"open": True,
"branch": []
}
for c in m['categories']:
+ for p in c['preferences']:
+ if 'label' in p:
+ p['label'] = gettext(p['label'])
+ if 'help_str' in p:
+ p['help_str'] = gettext(p['help_str'])
oc = {
"id": c['id'],
"mid": m['id'],
- "label": c['label'],
+ "label": gettext(c['label']),
"inode": False,
"open": False,
"preferences": sorted(c['preferences'], key=label)
@@ -155,4 +160,23 @@ def save(pid):
if not res:
return internal_server_error(errormsg=msg)
- return success_return()
+ response = success_return()
+
+ # Set cookie & session 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('miscellaneous')
+ user_languages = misc_preference.preference(
+ 'user_language'
+ )
+
+ language = 'en'
+ if user_languages:
+ language = user_languages.get() or language
+
+ setattr(session, 'PGADMIN_LANGUAGE', language)
+ response.set_cookie("PGADMIN_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..21646f4 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('PGADMIN_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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers