diff --git a/opac/webapp/main/views.py b/opac/webapp/main/views.py index a6012dc8..81afc09c 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") + # Store available languages in g instead of session to avoid session cookie + g.langs = current_app.config.get("LANGUAGES") @main.after_request @@ -85,11 +86,8 @@ def add_header(response): return response -@main.after_request -def add_language_code(response): - language = session.get("lang", get_locale()) - response.set_cookie("language", language) - return response +# Removed add_language_code() to eliminate Set-Cookie: language header +# This allows CDN/Varnish to cache pages properly @main.before_app_request @@ -101,7 +99,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") @@ -112,55 +110,87 @@ def add_scielo_org_config_to_g(): @babel.localeselector def get_locale(): + """ + Determine language based on query parameter or Accept-Language header. + Does not use session/cookies to allow CDN/Varnish caching. + CDN can use Vary: Accept-Language for proper caching by language. + """ + # Cache the result in g to avoid repeated computation + if hasattr(g, 'lang'): + return g.lang + langs = current_app.config.get("LANGUAGES") + + # Check for explicit language in query parameter (for language switcher) + lang_from_query = request.args.get('lang') + if lang_from_query and lang_from_query in langs: + g.lang = lang_from_query + return g.lang + + # Fall back to Accept-Language header lang_from_headers = request.accept_languages.best_match(list(langs.keys())) - - if "lang" not in list(session.keys()): - session["lang"] = lang_from_headers - - 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") - - return session["lang"] + + # Use detected language or fall back to default + if lang_from_headers: + g.lang = lang_from_headers + else: + g.lang = current_app.config.get("BABEL_DEFAULT_LOCALE", "pt_BR") + + return g.lang @main.route("/set_locale//") def set_locale(lang_code): + """ + Language switcher endpoint. Instead of storing in session/cookie, + redirects to the same page with ?lang= query parameter. + This allows language selection without cookies, enabling CDN caching. + """ langs = current_app.config.get("LANGUAGES") if lang_code not in list(langs.keys()): abort(400, _("Código de idioma inválido")) referrer = request.referrer - hash = request.args.get("hash") - if hash: - referrer += "#" + hash - - # salvar o lang code na sessão - session["lang"] = lang_code - if referrer: - return redirect(referrer) - else: - return redirect("/") + if not referrer: + referrer = url_for('main.index') + + # Parse the referrer URL to add/update lang parameter + from urllib.parse import urlparse, parse_qs, urlencode, urlunparse + parsed = urlparse(referrer) + query_params = parse_qs(parsed.query) + query_params['lang'] = [lang_code] + + # Handle hash fragment + hash_fragment = request.args.get("hash", "") + + # Rebuild URL with updated query string + new_query = urlencode(query_params, doseq=True) + new_url = urlunparse(( + parsed.scheme, + parsed.netloc, + parsed.path, + parsed.params, + new_query, + hash_fragment + )) + + return redirect(new_url) def get_lang_from_session(): """ - Tenta retornar o idioma da seção, caso não consiga retorna - BABEL_DEFAULT_LOCALE. + Returns the current language. Updated to use get_locale() instead of session. + Kept for backward compatibility with existing code. """ - 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 +291,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 +357,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 +516,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 +606,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 +637,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 @@ -824,7 +854,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) @@ -871,7 +901,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) @@ -1035,7 +1065,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 a7142618..2bc211f3 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 6a810465..a5d3f00a 100644 --- a/opac/webapp/templates/article/includes/alternative_header.html +++ b/opac/webapp/templates/article/includes/alternative_header.html @@ -67,7 +67,7 @@

  • - + Busca
  • @@ -143,7 +143,7 @@

  • - + Blog SciELO em Perspectiva
  • diff --git a/opac/webapp/templates/article/includes/recent_articles_row.html b/opac/webapp/templates/article/includes/recent_articles_row.html index 2cf36060..f8e34903 100644 --- a/opac/webapp/templates/article/includes/recent_articles_row.html +++ b/opac/webapp/templates/article/includes/recent_articles_row.html @@ -5,10 +5,10 @@
    {% trans%}Volume{% endtrans %}: {{ article.issue.volume }} - {% trans%}Publicado em{% endtrans %}: {{ article.publication_date }}
    - {% if session.lang %} + {% if g.lang %} - {{ article.get_title_by_lang(session.lang[:2])|default(_('Documento sem título'), true)|striptags|capitalize }} + {{ article.get_title_by_lang(g.lang[:2])|default(_('Documento sem título'), true)|striptags|capitalize }} {% endif %} diff --git a/opac/webapp/templates/base.html b/opac/webapp/templates/base.html index 190ed482..980c35a5 100644 --- a/opac/webapp/templates/base.html +++ b/opac/webapp/templates/base.html @@ -146,7 +146,7 @@ // Garante que o valor do campo share_url é a URL corrente. $('#share_url').val(window.location.href); - //moment.locale('{{ session.lang }}'); + //moment.locale('{{ g.lang }}'); //$("#date").text(moment().format("L HH:mm:ss ZZ")); diff --git a/opac/webapp/templates/collection/includes/levelMenu_search.html b/opac/webapp/templates/collection/includes/levelMenu_search.html index 3d890dcd..87566252 100644 --- a/opac/webapp/templates/collection/includes/levelMenu_search.html +++ b/opac/webapp/templates/collection/includes/levelMenu_search.html @@ -4,7 +4,7 @@
    - +
    diff --git a/opac/webapp/templates/collection/includes/nav.html b/opac/webapp/templates/collection/includes/nav.html index 3637a8e3..ebf8ab8a 100644 --- a/opac/webapp/templates/collection/includes/nav.html +++ b/opac/webapp/templates/collection/includes/nav.html @@ -26,7 +26,7 @@
  • - + {% trans %}Busca{% endtrans %}
  • @@ -117,10 +117,10 @@
  • - {% if session.lang == 'pt_BR' %} + {% if g.lang == 'pt_BR' %} {% else %} - + {% endif %} {% trans %}Blog SciELO em Perspectiva{% endtrans %} diff --git a/opac/webapp/templates/includes/language.html b/opac/webapp/templates/includes/language.html index 37baecf1..57b9c370 100644 --- a/opac/webapp/templates/includes/language.html +++ b/opac/webapp/templates/includes/language.html @@ -3,9 +3,9 @@
  • - +
  • diff --git a/opac/webapp/templates/issue/includes/meta.html b/opac/webapp/templates/issue/includes/meta.html index e816f1be..33d0532c 100755 --- a/opac/webapp/templates/issue/includes/meta.html +++ b/opac/webapp/templates/issue/includes/meta.html @@ -3,7 +3,7 @@ - diff --git a/opac/webapp/templates/issue/toc.html b/opac/webapp/templates/issue/toc.html index dd5694d0..4252fbe8 100644 --- a/opac/webapp/templates/issue/toc.html +++ b/opac/webapp/templates/issue/toc.html @@ -195,22 +195,22 @@

    - {% if session.lang %} - {% with nova_variavel=article.get_section_by_lang(session.lang[:2])%} + {% if g.lang %} + {% with nova_variavel=article.get_section_by_lang(g.lang[:2])%} {% if nova_variavel %} {{ nova_variavel | safe }}
    {% endif %} {% endwith %} - {{ article.get_title_by_lang(session.lang[:2])|default(_('Documento sem título'), true) | safe }} + {{ article.get_title_by_lang(g.lang[:2])|default(_('Documento sem título'), true) | safe }} {% endif %} {%- for author in article.authors %} - {% if session.lang %} - {{- author|striptags -}} + {% if g.lang %} + {{- author|striptags -}} {% else %} {{- author|striptags -}} {% if not loop.last %};{% endif %} diff --git a/opac/webapp/templates/journal/detail.html b/opac/webapp/templates/journal/detail.html index 64f792c6..ed537b60 100644 --- a/opac/webapp/templates/journal/detail.html +++ b/opac/webapp/templates/journal/detail.html @@ -52,8 +52,8 @@ {# mission #} {% if journal.mission %}

    {% trans %}Nossa Missão{% endtrans %}

    - {% if session.lang %} -

    {{ journal.get_mission_by_lang(session.lang[:2])|safe|default(_("Periódico sem missão cadastrada"), true) }}

    + {% if g.lang %} +

    {{ journal.get_mission_by_lang(g.lang[:2])|safe|default(_("Periódico sem missão cadastrada"), true) }}

    {% endif %} {% endif %} {# mission #} @@ -107,8 +107,8 @@

    {% trans %}Sumário{% endtrans %}

    Press-releases - {% if session.lang != "pt_BR" %} - rss_feed + {% if g.lang != "pt_BR" %} + rss_feed {% else %} rss_feed {% endif %} @@ -229,8 +229,8 @@

    {% trans %}Notícias{% endtrans %}

    {% if journal.mission %}

    {% trans %}Nossa Missão{% endtrans %}

    - {% if session.lang %} -

    {{ journal.get_mission_by_lang(session.lang[:2])|safe|default(_("Periódico sem missão cadastrada"), true) }}

    + {% if g.lang %} +

    {{ journal.get_mission_by_lang(g.lang[:2])|safe|default(_("Periódico sem missão cadastrada"), true) }}

    {% endif %}
    {% endif %} @@ -290,8 +290,8 @@

    {% trans %}Sumário{% endtrans %}

    -->

    Press-releases - {% if session.lang != "pt_BR" %} - rss_feed + {% if g.lang != "pt_BR" %} + rss_feed {% else %} rss_feed {% endif %} diff --git a/opac/webapp/templates/journal/includes/alternative_header.html b/opac/webapp/templates/journal/includes/alternative_header.html index a1d84442..20d2e8fd 100644 --- a/opac/webapp/templates/journal/includes/alternative_header.html +++ b/opac/webapp/templates/journal/includes/alternative_header.html @@ -82,7 +82,7 @@

  • - search + search
  • {% if journal.scielo_issn or journal.eletronic_issn or journal.print_issn %} diff --git a/opac/webapp/templates/journal/includes/levelMenu.html b/opac/webapp/templates/journal/includes/levelMenu.html index adeb3b8e..36539f32 100644 --- a/opac/webapp/templates/journal/includes/levelMenu.html +++ b/opac/webapp/templates/journal/includes/levelMenu.html @@ -59,7 +59,7 @@
  • - {% trans %}Buscar{% endtrans %} + {% trans %}Buscar{% endtrans %} {% if journal.scielo_issn or journal.eletronic_issn or journal.print_issn %} show_chart {% trans %}Métricas{% endtrans %} @@ -92,7 +92,7 @@ {% trans %}Todos{% endtrans %} - {% trans %}Buscar{% endtrans %} + {% trans %}Buscar{% endtrans %} {% if journal.scielo_issn or journal.eletronic_issn or journal.print_issn %} {% trans %}Métricas{% endtrans %} {% else %} diff --git a/opac/webapp/templates/journal/includes/meta.html b/opac/webapp/templates/journal/includes/meta.html index b69c2c57..8031947c 100755 --- a/opac/webapp/templates/journal/includes/meta.html +++ b/opac/webapp/templates/journal/includes/meta.html @@ -3,6 +3,6 @@ - + diff --git a/opac/webapp/templates/macros/collection.html b/opac/webapp/templates/macros/collection.html index 5be43731..27246a4f 100644 --- a/opac/webapp/templates/macros/collection.html +++ b/opac/webapp/templates/macros/collection.html @@ -1,10 +1,10 @@ {% macro get_collection_name() -%} - {%- if session.lang == 'pt_BR' and g.collection.name_pt -%} + {%- if g.lang == 'pt_BR' and g.collection.name_pt -%} {{ g.collection.name_pt }} - {%- elif session.lang == 'en' and g.collection.name_en-%} + {%- elif g.lang == 'en' and g.collection.name_en-%} {{ g.collection.name_en }} - {%- elif session.lang == 'es' and g.collection.name_es-%} + {%- elif g.lang == 'es' and g.collection.name_es-%} {{ g.collection.name_es }} {%- else -%} {{ g.collection.name }} diff --git a/opac/webapp/utils/caching.py b/opac/webapp/utils/caching.py index 8625f8fa..f5210ebf 100644 --- a/opac/webapp/utils/caching.py +++ b/opac/webapp/utils/caching.py @@ -1,7 +1,7 @@ # Redis Cache Key Generation: import hashlib -from flask import current_app, request, session +from flask import current_app, request, g def _make_querystring_hash(): @@ -35,12 +35,12 @@ def cache_key_with_lang(): """ Função chamada no decorator @cache.cached Retorna a chave para usar no cache (redis) usando: - - o códiog do idioma armazenado na sessão (ou o default se não tiver) + - o código do idioma armazenado em g.lang (ou o default se não tiver) - o path do request """ default_lang = current_app.config.get("BABEL_DEFAULT_LOCALE") - language = session.get("lang", default_lang) + language = getattr(g, 'lang', default_lang) return _cache_key_format(language, request.path) @@ -48,12 +48,12 @@ def cache_key_with_lang_with_qs(): """ Função chamada no decorator @cache.cached Retorna a chave para usar no cache (redis) usando: - - o códiog do idioma armazenado na sessão (ou o default se não tiver) + - o código do idioma armazenado em g.lang (ou o default se não tiver) - o path do request - o hash gerado a partir dos parametros da querystring """ default_lang = current_app.config.get("BABEL_DEFAULT_LOCALE") - language = session.get("lang", default_lang) + language = getattr(g, 'lang', default_lang) qs_hash = _make_querystring_hash() return _cache_key_format(language, request.path, qs_hash)