From 98b784502449a1adeee81929598e676e3e6b51ba Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 11:37:43 +0000 Subject: [PATCH 1/3] Initial plan From 883ce8b6b9bea801e64d742a87854901b77ca8eb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 11:45:02 +0000 Subject: [PATCH 2/3] Replace cookie-based language with Accept-Language header for CDN caching MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove language cookie (add_language_code after_request handler) - Move session["langs"] to g.langs to avoid session modification on every request - Modify get_locale() to not auto-write to session; only read session["lang"] (set by explicit language switch), fall back to Accept-Language header - Add Vary: Accept-Language header and remove Vary: Cookie - Set g.lang in before_request for template usage - Update caching.py to use get_locale() instead of session.get("lang") - Update all templates: session.lang → g.lang, session.langs → g.langs Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com> --- opac/webapp/main/views.py | 54 +++++++++---------- opac/webapp/templates/admin/opac_base.html | 2 +- .../article/includes/alternative_header.html | 6 +-- .../templates/article/includes/header.html | 2 +- .../article/includes/recent_articles_row.html | 4 +- opac/webapp/templates/base.html | 2 +- .../templates/collection/includes/header.html | 2 +- .../collection/includes/levelMenu_search.html | 2 +- .../templates/collection/includes/nav.html | 8 +-- opac/webapp/templates/includes/language.html | 8 +-- .../issue/includes/alternative_header.html | 2 +- opac/webapp/templates/issue/toc.html | 10 ++-- opac/webapp/templates/journal/detail.html | 16 +++--- .../journal/includes/alternative_header.html | 2 +- .../templates/journal/includes/header.html | 2 +- .../templates/journal/includes/levelMenu.html | 4 +- .../templates/journal/includes/meta.html | 2 +- opac/webapp/templates/macros/collection.html | 6 +-- opac/webapp/utils/caching.py | 13 +++-- 19 files changed, 70 insertions(+), 77 deletions(-) diff --git a/opac/webapp/main/views.py b/opac/webapp/main/views.py index 3d6a8d9e9..852022375 100644 --- a/opac/webapp/main/views.py +++ b/opac/webapp/main/views.py @@ -73,7 +73,8 @@ def add_collection_to_g(): @main.before_app_request def add_langs(): - session["langs"] = current_app.config.get("LANGUAGES") + g.langs = current_app.config.get("LANGUAGES") + g.lang = get_locale() @main.after_request @@ -82,13 +83,8 @@ def add_header(response): "CACHE_CONTROL_MAX_AGE_HEADER" ) response.headers["x-content-type-options"] = "nosniff" - return response - - -@main.after_request -def add_language_code(response): - language = session.get("lang", get_locale()) - response.set_cookie("language", language) + response.vary.add("Accept-Language") + response.vary.discard("Cookie") return response @@ -101,7 +97,7 @@ def add_forms_to_g(): @main.before_app_request def add_scielo_org_config_to_g(): - language = session.get("lang", get_locale()) + language = get_locale() scielo_org_links = { # if language doesnt exists set the 'en' to SciELO ORG links. key: url.get(language, "en") @@ -113,17 +109,18 @@ def add_scielo_org_config_to_g(): @babel.localeselector def get_locale(): langs = current_app.config.get("LANGUAGES") - lang_from_headers = request.accept_languages.best_match(list(langs.keys())) - if "lang" not in list(session.keys()): - session["lang"] = lang_from_headers + # If user explicitly set language via set_locale, use that + if "lang" in session: + return session["lang"] - if not lang_from_headers and not session["lang"]: - # Caso não seja possível detectar o idioma e não tenhamos a chave lang - # no seção, fixamos o idioma padrão. - session["lang"] = current_app.config.get("BABEL_DEFAULT_LOCALE") + # Otherwise, use Accept-Language header + lang_from_headers = request.accept_languages.best_match(list(langs.keys())) + if lang_from_headers: + return lang_from_headers - return session["lang"] + # Default locale + return current_app.config.get("BABEL_DEFAULT_LOCALE") @main.route("/set_locale//") @@ -151,16 +148,13 @@ def get_lang_from_session(): Tenta retornar o idioma da seção, caso não consiga retorna BABEL_DEFAULT_LOCALE. """ - try: - return session["lang"] - except KeyError: - return current_app.config.get("BABEL_DEFAULT_LOCALE") + return get_locale() @main.route("/") @cache.cached(key_prefix=cache_key_with_lang) def index(): - language = session.get("lang", get_locale()) + language = get_locale() news = controllers.get_latest_news_by_lang(language) tweets = controllers.get_collection_tweets() @@ -261,7 +255,7 @@ def collection_list_thematic(): @main.route("/journals/feed/") @cache.cached(key_prefix=cache_key_with_lang) def collection_list_feed(): - language = session.get("lang", get_locale()) + language = get_locale() collection = controllers.get_current_collection() title = "SciELO - %s - %s" % ( @@ -327,7 +321,7 @@ def collection_list_feed(): @main.route("/about/", methods=["GET"]) @cache.cached(key_prefix=cache_key_with_lang_with_qs) def about_collection(slug_name=None): - language = session.get("lang", get_locale()) + language = get_locale() context = {} page = None @@ -486,7 +480,7 @@ def journal_detail(url_seg): abort(404, JOURNAL_UNPUBLISH + _(journal.unpublish_reason)) # todo: ajustar para que seja só noticias relacionadas ao periódico - language = session.get("lang", get_locale()) + language = get_locale() news = controllers.get_latest_news_by_lang(language) # Press releases @@ -576,7 +570,7 @@ def journal_feed(url_seg): subtitle=utils.get_label_issue(last_issue), ) - feed_language = session.get("lang", get_locale()) + feed_language = get_locale() feed_language = feed_language[:2].lower() for article in articles: @@ -607,7 +601,7 @@ def journal_feed(url_seg): @main.route("/journal//about/", methods=["GET"]) @cache.cached(key_prefix=cache_key_with_lang) def about_journal(url_seg): - language = session.get("lang", get_locale()) + language = get_locale() journal = controllers.get_journal_by_url_seg(url_seg) content = None @@ -834,7 +828,7 @@ def issue_grid(url_seg): abort(404, JOURNAL_UNPUBLISH + _(journal.unpublish_reason)) # idioma da sessão - language = session.get("lang", get_locale()) + language = get_locale() # A ordenação padrão da função ``get_issues_by_jid``: "-year", "-volume", "-order" issues_data = controllers.get_issues_for_grid_by_jid(journal.id, is_public=True) @@ -881,7 +875,7 @@ def issue_toc(url_seg, url_seg_issue): filter_section_enable = bool(current_app.config["FILTER_SECTION_ENABLE"]) # idioma da sessão - language = session.get("lang", get_locale()) + language = get_locale() # obtém o issue issue = controllers.get_issue_by_url_seg(url_seg, url_seg_issue) @@ -1045,7 +1039,7 @@ def issue_feed(url_seg, url_seg_issue): subtitle=utils.get_label_issue(issue), ) - feed_language = session.get("lang", get_locale()) + feed_language = get_locale() for article in articles: # ######### TODO: Revisar ######### diff --git a/opac/webapp/templates/admin/opac_base.html b/opac/webapp/templates/admin/opac_base.html index a71426188..2bc211f32 100644 --- a/opac/webapp/templates/admin/opac_base.html +++ b/opac/webapp/templates/admin/opac_base.html @@ -30,7 +30,7 @@ {% for k,v in config.LANGUAGES.items() %} - {% if k == session['lang'] %} + {% if k == g.lang %} {{ v }} {% else %} {{ v }} diff --git a/opac/webapp/templates/article/includes/alternative_header.html b/opac/webapp/templates/article/includes/alternative_header.html index fe49d0e8d..315a43ab2 100644 --- a/opac/webapp/templates/article/includes/alternative_header.html +++ b/opac/webapp/templates/article/includes/alternative_header.html @@ -45,7 +45,7 @@