From a20d22de43a443e36c89b732d9df7e57c07f7deb Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Bodas Date: Fri, 2 Oct 2020 17:53:45 +0530 Subject: [PATCH] i18n: Move locale select logic in home to i18n.py. Part of #16094. Moved the language selection preference logic from home.py to a new function in i18n.py to avoid repetition in analytics views and home views. --- zerver/lib/home.py | 17 ++++++----------- zerver/lib/i18n.py | 23 ++++++++++++++++++++++- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/zerver/lib/home.py b/zerver/lib/home.py index 3ef808ae3f..37006b3a1f 100644 --- a/zerver/lib/home.py +++ b/zerver/lib/home.py @@ -10,6 +10,7 @@ from two_factor.utils import default_device from zerver.lib.events import do_events_register from zerver.lib.i18n import ( + get_and_set_request_language, get_language_list, get_language_list_for_templates, get_language_name, @@ -136,17 +137,11 @@ def build_page_params_for_home_page_load( furthest_read_time = get_furthest_read_time(user_profile) - # We pick a language for the user as follows: - # * First priority is the language in the URL, for debugging. - # * If not in the URL, we use the language from the user's settings. - request_language = translation.get_language_from_path(request.path_info) - if request_language is None: - request_language = register_ret['default_language'] - translation.activate(request_language) - - # We also save the language to the user's session, so that - # something reasonable will happen in logged-in portico pages. - request.session[translation.LANGUAGE_SESSION_KEY] = translation.get_language() + request_language = get_and_set_request_language( + request, + register_ret['default_language'], + translation.get_language_from_path(request.path_info) + ) two_fa_enabled = ( settings.TWO_FACTOR_AUTHENTICATION_ENABLED and user_profile is not None diff --git a/zerver/lib/i18n.py b/zerver/lib/i18n.py index 6ce54740ac..ee1765adcc 100644 --- a/zerver/lib/i18n.py +++ b/zerver/lib/i18n.py @@ -5,10 +5,12 @@ import operator import os from functools import lru_cache from itertools import zip_longest -from typing import Any, Dict, List +from typing import Any, Dict, List, Optional import orjson from django.conf import settings +from django.http import HttpRequest +from django.utils import translation @lru_cache() @@ -84,3 +86,22 @@ def get_language_translation_data(language: str) -> Dict[str, str]: except FileNotFoundError: print(f'Translation for {language} not found at {path}') return {} + +def get_and_set_request_language( + request: HttpRequest, + user_configured_language: str, + testing_url_language: Optional[str]=None +) -> str: + # We pick a language for the user as follows: + # * First priority is the language in the URL, for debugging. + # * If not in the URL, we use the language from the user's settings. + request_language = testing_url_language + if request_language is None: + request_language = user_configured_language + translation.activate(request_language) + + # We also save the language to the user's session, so that + # something reasonable will happen in logged-in portico pages. + request.session[translation.LANGUAGE_SESSION_KEY] = translation.get_language() + + return request_language