1717
1818# ------------------------------------------------------------------------
1919import logging
20+ from typing import Optional
2021
2122from django .conf import settings as django_settings
2223from django .db import models
23- from django .http import HttpResponseRedirect
24+ from django .http import HttpResponseRedirect , HttpRequest
2425from django .utils import translation
25- from django .utils .html import mark_safe
26+ from django .utils .safestring import mark_safe
2627from django .utils .translation import gettext_lazy as _
2728
2829from feincms import extensions , settings
3334# ------------------------------------------------------------------------
3435logger = logging .getLogger (__name__ )
3536
36- LANGUAGE_COOKIE_NAME = django_settings .LANGUAGE_COOKIE_NAME
37- if hasattr (translation , "LANGUAGE_SESSION_KEY" ):
38- LANGUAGE_SESSION_KEY = translation .LANGUAGE_SESSION_KEY
39- else :
40- # Django 1.6
41- LANGUAGE_SESSION_KEY = LANGUAGE_COOKIE_NAME
42-
37+ LANGUAGE_COOKIE_NAME : str = django_settings .LANGUAGE_COOKIE_NAME
38+ LANGUAGE_SESSION_KEY = translation .LANGUAGE_SESSION_KEY
39+ PRIMARY_LANGUAGE : str = django_settings .LANGUAGES [0 ][0 ]
4340
4441# ------------------------------------------------------------------------
45- def user_has_language_set (request ) :
42+ def user_has_language_set (request : HttpRequest ) -> bool :
4643 """
4744 Determine whether the user has explicitely set a language earlier on.
4845 This is taken later on as an indication that we should not mess with the
@@ -59,18 +56,18 @@ def user_has_language_set(request):
5956
6057
6158# ------------------------------------------------------------------------
62- def translation_allowed_language (select_language ) :
59+ def translation_allowed_language (select_language : str ) -> str :
6360 "Check for feincms specific set of allowed front end languages."
6461 if settings .FEINCMS_FRONTEND_LANGUAGES :
6562 language = select_language [:2 ]
6663 if language not in settings .FEINCMS_FRONTEND_LANGUAGES :
67- select_language = django_settings . LANGUAGES [ 0 ][ 0 ]
64+ select_language = PRIMARY_LANGUAGE
6865
6966 return select_language
7067
7168
7269# ------------------------------------------------------------------------
73- def translation_set_language (request , select_language ) :
70+ def translation_set_language (request : HttpRequest , select_language : str ) -> Optional [ HttpResponseRedirect ] :
7471 """
7572 Set and activate a language, if that language is available.
7673 """
@@ -85,15 +82,17 @@ def translation_set_language(request, select_language):
8582 # other messages and other applications. It is *highly* recommended to
8683 # create a new django.po for the language instead of
8784 # using this behaviour.
88- select_language = django_settings . LANGUAGES [ 0 ][ 0 ]
85+ select_language = PRIMARY_LANGUAGE
8986 fallback = True
9087
9188 translation .activate (select_language )
92- request .LANGUAGE_CODE = translation .get_language ()
89+ request .LANGUAGE_CODE = translation .get_language () # type: ignore
9390
9491 if hasattr (request , "session" ):
9592 # User has a session, then set this language there
96- if select_language != request .session .get (LANGUAGE_SESSION_KEY ):
93+ current_session_language = request .session .get (LANGUAGE_SESSION_KEY , PRIMARY_LANGUAGE )
94+
95+ if select_language != current_session_language :
9796 request .session [LANGUAGE_SESSION_KEY ] = select_language
9897 elif request .method == "GET" and not fallback :
9998 # No session is active. We need to set a cookie for the language
@@ -102,7 +101,7 @@ def translation_set_language(request, select_language):
102101 # Only do this when request method is GET (mainly, do not abort
103102 # POST requests)
104103 response = HttpResponseRedirect (request .get_full_path ())
105- response .set_cookie (str (LANGUAGE_COOKIE_NAME ), select_language )
104+ response .set_cookie (str (LANGUAGE_COOKIE_NAME ), select_language , samesite = "Lax" )
106105 return response
107106
108107
@@ -161,7 +160,7 @@ def handle_model(self):
161160 _ ("language" ),
162161 max_length = 10 ,
163162 choices = django_settings .LANGUAGES ,
164- default = django_settings . LANGUAGES [ 0 ][ 0 ] ,
163+ default = PRIMARY_LANGUAGE ,
165164 ),
166165 )
167166 cls .add_to_class (
@@ -173,7 +172,7 @@ def handle_model(self):
173172 null = True ,
174173 verbose_name = _ ("translation of" ),
175174 related_name = "translations" ,
176- limit_choices_to = {"language" : django_settings . LANGUAGES [ 0 ][ 0 ] },
175+ limit_choices_to = {"language" : PRIMARY_LANGUAGE },
177176 help_text = _ ("Leave this empty for entries in the primary language." ),
178177 ),
179178 )
@@ -250,7 +249,7 @@ def get_original_translation(self, *args, **kwargs):
250249 "Page pk=%d (%s) has no primary language translation (%s)" ,
251250 self .pk ,
252251 self .language ,
253- django_settings . LANGUAGES [ 0 ][ 0 ] ,
252+ PRIMARY_LANGUAGE ,
254253 )
255254 return self
256255
0 commit comments