diff --git a/web/pgadmin/__init__.py b/web/pgadmin/__init__.py index ceff7aaabec..696f982168b 100644 --- a/web/pgadmin/__init__.py +++ b/web/pgadmin/__init__.py @@ -328,12 +328,12 @@ def get_locale(): 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 + session['PGADMIN_LANGUAGE'] = language + elif 'PGADMIN_LANGUAGE' in session: + language = session.get('PGADMIN_LANGUAGE', language) + elif 'PGADMIN_LANGUAGE' in request.cookies: + language = request.cookies.get( + 'PGADMIN_LANGUAGE', language ) return language diff --git a/web/pgadmin/preferences/__init__.py b/web/pgadmin/preferences/__init__.py index 66152b31ad2..4dec271d2de 100644 --- a/web/pgadmin/preferences/__init__.py +++ b/web/pgadmin/preferences/__init__.py @@ -289,7 +289,7 @@ def save(): config.COOKIE_DEFAULT_DOMAIN != 'localhost': domain['domain'] = config.COOKIE_DEFAULT_DOMAIN - setattr(session, 'PGADMIN_LANGUAGE', language) + session['PGADMIN_LANGUAGE'] = language response.set_cookie("PGADMIN_LANGUAGE", value=language, path=config.SESSION_COOKIE_PATH, secure=config.SESSION_COOKIE_SECURE, diff --git a/web/pgadmin/tests/__init__.py b/web/pgadmin/tests/__init__.py new file mode 100644 index 00000000000..c69ae19d4a5 --- /dev/null +++ b/web/pgadmin/tests/__init__.py @@ -0,0 +1,8 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2026, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## diff --git a/web/pgadmin/tests/test_get_locale.py b/web/pgadmin/tests/test_get_locale.py new file mode 100644 index 00000000000..ed72ad57a81 --- /dev/null +++ b/web/pgadmin/tests/test_get_locale.py @@ -0,0 +1,54 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2026, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +"""Verify that the Babel locale_selector registered in create_app() reads +the selected UI language back from the session and cookie on requests that +don't include the 'language' form field (issue #10347). +""" + +import config +from pgadmin.utils.route import BaseTestGenerator + + +class GetLocaleTestCase(BaseTestGenerator): + """Exercises pgadmin.__init__.create_app()'s get_locale() directly via + the Babel extension, bypassing the need for a database connection. + """ + + # No server interaction needed, so skip BaseTestGenerator.setUp's + # connect_server(). + def setUp(self): + self._orig_server_mode = config.SERVER_MODE + config.SERVER_MODE = True + + def tearDown(self): + config.SERVER_MODE = self._orig_server_mode + + def _get_locale(self): + return self.app.extensions['babel'].locale_selector() + + def runTest(self): + # The 'language' form field sets the language for this request and + # must persist it to the session for subsequent requests. + from flask import session + with self.app.test_request_context( + '/', method='POST', data={'language': 'fr'}): + self.assertEqual(self._get_locale(), 'fr') + self.assertEqual(session.get('PGADMIN_LANGUAGE'), 'fr') + + # A request with no 'language' field but an existing session value + # must keep using that language. + with self.app.test_request_context('/'): + session['PGADMIN_LANGUAGE'] = 'de' + self.assertEqual(self._get_locale(), 'de') + + # With no session value, the PGADMIN_LANGUAGE cookie must be read. + with self.app.test_request_context( + '/', headers={'Cookie': 'PGADMIN_LANGUAGE=it'}): + self.assertEqual(self._get_locale(), 'it')