diff --git a/bookwyrm/forms.py b/bookwyrm/forms.py index 5acde9ea..c112186a 100644 --- a/bookwyrm/forms.py +++ b/bookwyrm/forms.py @@ -144,6 +144,7 @@ class EditUserForm(CustomForm): "default_post_privacy", "discoverable", "preferred_timezone", + "preferred_language", ] help_texts = {f: None for f in fields} diff --git a/bookwyrm/migrations/0106_user_preferred_language.py b/bookwyrm/migrations/0106_user_preferred_language.py new file mode 100644 index 00000000..a77030a0 --- /dev/null +++ b/bookwyrm/migrations/0106_user_preferred_language.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.5 on 2021-10-06 19:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0105_alter_connector_connector_file"), + ] + + operations = [ + migrations.AddField( + model_name="user", + name="preferred_language", + field=models.CharField( + blank=True, + choices=[ + ("en-us", "English"), + ("de-de", "German"), + ("es", "Spanish"), + ("fr-fr", "French"), + ("zh-hans", "Simplified Chinese"), + ("zh-hant", "Traditional Chinese"), + ], + max_length=255, + null=True, + ), + ), + ] diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index 637baa6e..d7945843 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -17,7 +17,7 @@ from bookwyrm.connectors import get_data, ConnectorException from bookwyrm.models.shelf import Shelf from bookwyrm.models.status import Status, Review from bookwyrm.preview_images import generate_user_preview_image_task -from bookwyrm.settings import DOMAIN, ENABLE_PREVIEW_IMAGES, USE_HTTPS +from bookwyrm.settings import DOMAIN, ENABLE_PREVIEW_IMAGES, USE_HTTPS, LANGUAGES from bookwyrm.signatures import create_key_pair from bookwyrm.tasks import app from bookwyrm.utils import regex @@ -133,6 +133,12 @@ class User(OrderedCollectionPageMixin, AbstractUser): default=str(pytz.utc), max_length=255, ) + preferred_language = models.CharField( + choices=LANGUAGES, + null=True, + blank=True, + max_length=255, + ) deactivation_reason = models.CharField( max_length=255, choices=DeactivationReason, null=True, blank=True ) diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index b2f90487..00ce9e4a 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -30,6 +30,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) LOCALE_PATHS = [ os.path.join(BASE_DIR, "locale"), ] +LANGUAGE_COOKIE_NAME = env.str("LANGUAGE_COOKIE_NAME", "django_language") DEFAULT_AUTO_FIELD = "django.db.models.AutoField" diff --git a/bookwyrm/templates/preferences/edit_user.html b/bookwyrm/templates/preferences/edit_user.html index f3cabbc7..72c49dbe 100644 --- a/bookwyrm/templates/preferences/edit_user.html +++ b/bookwyrm/templates/preferences/edit_user.html @@ -91,6 +91,12 @@ {{ form.preferred_timezone }} +
+ +
+ {{ form.preferred_language }} +
+
diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py index f31b41ff..f28d0102 100644 --- a/bookwyrm/views/helpers.py +++ b/bookwyrm/views/helpers.py @@ -7,8 +7,9 @@ from dateutil.parser import ParserError from requests import HTTPError from django.http import Http404 +from django.utils import translation -from bookwyrm import activitypub, models +from bookwyrm import activitypub, models, settings from bookwyrm.connectors import ConnectorException, get_data from bookwyrm.status import create_generated_note from bookwyrm.utils import regex @@ -144,3 +145,11 @@ def load_date_in_user_tz_as_utc(date_str: str, user: models.User) -> datetime: return date.replace(tzinfo=user_tz).astimezone(dateutil.tz.UTC) except ParserError: return None + + +def set_language(user, response): + """Updates a user's language""" + if user.preferred_language: + translation.activate(user.preferred_language) + response.set_cookie(settings.LANGUAGE_COOKIE_NAME, user.preferred_language) + return response diff --git a/bookwyrm/views/login.py b/bookwyrm/views/login.py index e96d421a..91fda35a 100644 --- a/bookwyrm/views/login.py +++ b/bookwyrm/views/login.py @@ -11,6 +11,7 @@ from django.views.decorators.debug import sensitive_variables, sensitive_post_pa from bookwyrm import forms, models from bookwyrm.settings import DOMAIN +from bookwyrm.views.helpers import set_language # pylint: disable=no-self-use @@ -55,8 +56,8 @@ class Login(View): login(request, user) user.update_active_date() if request.POST.get("first_login"): - return redirect("get-started-profile") - return redirect(request.GET.get("next", "/")) + return set_language(user, redirect("get-started-profile")) + return set_language(user, redirect(request.GET.get("next", "/"))) # maybe the user is pending email confirmation if models.User.objects.filter( diff --git a/bookwyrm/views/preferences/edit_user.py b/bookwyrm/views/preferences/edit_user.py index 275304d7..a1b5b363 100644 --- a/bookwyrm/views/preferences/edit_user.py +++ b/bookwyrm/views/preferences/edit_user.py @@ -11,6 +11,7 @@ from django.utils.decorators import method_decorator from django.views import View from bookwyrm import forms +from bookwyrm.views.helpers import set_language # pylint: disable=no-self-use @@ -33,9 +34,9 @@ class EditUser(View): data = {"form": form, "user": request.user} return TemplateResponse(request, "preferences/edit_user.html", data) - save_user_form(form) + user = save_user_form(form) - return redirect("user-feed", request.user.localname) + return set_language(user, redirect("user-feed", request.user.localname)) def save_user_form(form):