diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/emails/user_email.ex | 534 | ||||
| -rw-r--r-- | lib/pleroma/user.ex | 1 | ||||
| -rw-r--r-- | lib/pleroma/web/gettext.ex | 22 | ||||
| -rw-r--r-- | lib/pleroma/web/plugs/set_locale_plug.ex | 4 | 
4 files changed, 301 insertions, 260 deletions
| diff --git a/lib/pleroma/emails/user_email.ex b/lib/pleroma/emails/user_email.ex index cd06ab23c..24adfabd7 100644 --- a/lib/pleroma/emails/user_email.ex +++ b/lib/pleroma/emails/user_email.ex @@ -30,68 +30,75 @@ defmodule Pleroma.Emails.UserEmail do    @spec welcome(User.t(), map()) :: Swoosh.Email.t()    def welcome(user, opts \\ %{}) do -    new() -    |> to(recipient(user)) -    |> from(Map.get(opts, :sender, sender())) -    |> subject( -      Map.get( -        opts, -        :subject, -        Gettext.dpgettext("static_pages", "welcome email subject", "Welcome to %{instance_name}!", -          instance_name: instance_name() +    Gettext.with_locale_or_default user.language do +      new() +      |> to(recipient(user)) +      |> from(Map.get(opts, :sender, sender())) +      |> subject( +        Map.get( +          opts, +          :subject, +          Gettext.dpgettext( +            "static_pages", +            "welcome email subject", +            "Welcome to %{instance_name}!", +            instance_name: instance_name() +          )          )        ) -    ) -    |> html_body( -      Map.get( -        opts, -        :html, -        Gettext.dpgettext( -          "static_pages", -          "welcome email html body", -          "Welcome to %{instance_name}!", -          instance_name: instance_name() +      |> html_body( +        Map.get( +          opts, +          :html, +          Gettext.dpgettext( +            "static_pages", +            "welcome email html body", +            "Welcome to %{instance_name}!", +            instance_name: instance_name() +          )          )        ) -    ) -    |> text_body( -      Map.get( -        opts, -        :text, -        Gettext.dpgettext( -          "static_pages", -          "welcome email text body", -          "Welcome to %{instance_name}!", -          instance_name: instance_name() +      |> text_body( +        Map.get( +          opts, +          :text, +          Gettext.dpgettext( +            "static_pages", +            "welcome email text body", +            "Welcome to %{instance_name}!", +            instance_name: instance_name() +          )          )        ) -    ) +    end    end    def password_reset_email(user, token) when is_binary(token) do -    password_reset_url = Router.Helpers.reset_password_url(Endpoint, :reset, token) - -    html_body = -      Gettext.dpgettext( -        "static_pages", -        "password reset email body", -        """ -        <h3>Reset your password at %{instance_name}</h3> -        <p>Someone has requested password change for your account at %{instance_name}.</p> -        <p>If it was you, visit the following link to proceed: <a href="%{password_reset_url}">reset password</a>.</p> -        <p>If it was someone else, nothing to worry about: your data is secure and your password has not been changed.</p> -        """, -        instance_name: instance_name(), -        password_reset_url: password_reset_url -      ) +    Gettext.with_locale_or_default user.language do +      password_reset_url = Router.Helpers.reset_password_url(Endpoint, :reset, token) + +      html_body = +        Gettext.dpgettext( +          "static_pages", +          "password reset email body", +          """ +          <h3>Reset your password at %{instance_name}</h3> +          <p>Someone has requested password change for your account at %{instance_name}.</p> +          <p>If it was you, visit the following link to proceed: <a href="%{password_reset_url}">reset password</a>.</p> +          <p>If it was someone else, nothing to worry about: your data is secure and your password has not been changed.</p> +          """, +          instance_name: instance_name(), +          password_reset_url: password_reset_url +        ) -    new() -    |> to(recipient(user)) -    |> from(sender()) -    |> subject( -      Gettext.dpgettext("static_pages", "password reset email subject", "Password reset") -    ) -    |> html_body(html_body) +      new() +      |> to(recipient(user)) +      |> from(sender()) +      |> subject( +        Gettext.dpgettext("static_pages", "password reset email subject", "Password reset") +      ) +      |> html_body(html_body) +    end    end    def user_invitation_email( @@ -100,128 +107,136 @@ defmodule Pleroma.Emails.UserEmail do          to_email,          to_name \\ nil        ) do -    registration_url = -      Router.Helpers.redirect_url( -        Endpoint, -        :registration_page, -        user_invite_token.token -      ) +    Gettext.with_locale_or_default user.language do +      registration_url = +        Router.Helpers.redirect_url( +          Endpoint, +          :registration_page, +          user_invite_token.token +        ) -    html_body = -      Gettext.dpgettext( -        "static_pages", -        "user invitation email body", -        """ -        <h3>You are invited to %{instance_name}</h3> -        <p>%{inviter_name} invites you to join %{instance_name}, an instance of Pleroma federated social networking platform.</p> -        <p>Click the following link to register: <a href="%{registration_url}">accept invitation</a>.</p> -        """, -        instance_name: instance_name(), -        inviter_name: user.name, -        registration_url: registration_url -      ) +      html_body = +        Gettext.dpgettext( +          "static_pages", +          "user invitation email body", +          """ +          <h3>You are invited to %{instance_name}</h3> +          <p>%{inviter_name} invites you to join %{instance_name}, an instance of Pleroma federated social networking platform.</p> +          <p>Click the following link to register: <a href="%{registration_url}">accept invitation</a>.</p> +          """, +          instance_name: instance_name(), +          inviter_name: user.name, +          registration_url: registration_url +        ) -    new() -    |> to(recipient(to_email, to_name)) -    |> from(sender()) -    |> subject( -      Gettext.dpgettext( -        "static_pages", -        "user invitation email subject", -        "Invitation to %{instance_name}", -        instance_name: instance_name() +      new() +      |> to(recipient(to_email, to_name)) +      |> from(sender()) +      |> subject( +        Gettext.dpgettext( +          "static_pages", +          "user invitation email subject", +          "Invitation to %{instance_name}", +          instance_name: instance_name() +        )        ) -    ) -    |> html_body(html_body) +      |> html_body(html_body) +    end    end    def account_confirmation_email(user) do -    confirmation_url = -      Router.Helpers.confirm_email_url( -        Endpoint, -        :confirm_email, -        user.id, -        to_string(user.confirmation_token) -      ) +    Gettext.with_locale_or_default user.language do +      confirmation_url = +        Router.Helpers.confirm_email_url( +          Endpoint, +          :confirm_email, +          user.id, +          to_string(user.confirmation_token) +        ) -    html_body = -      Gettext.dpgettext( -        "static_pages", -        "confirmation email body", -        """ -        <h3>Thank you for registering on %{instance_name}</h3> -        <p>Email confirmation is required to activate the account.</p> -        <p>Please click the following link to <a href="%{confirmation_url}">activate your account</a>.</p> -        """, -        instance_name: instance_name(), -        confirmation_url: confirmation_url -      ) +      html_body = +        Gettext.dpgettext( +          "static_pages", +          "confirmation email body", +          """ +          <h3>Thank you for registering on %{instance_name}</h3> +          <p>Email confirmation is required to activate the account.</p> +          <p>Please click the following link to <a href="%{confirmation_url}">activate your account</a>.</p> +          """, +          instance_name: instance_name(), +          confirmation_url: confirmation_url +        ) -    new() -    |> to(recipient(user)) -    |> from(sender()) -    |> subject( -      Gettext.dpgettext( -        "static_pages", -        "confirmation email subject", -        "%{instance_name} account confirmation", -        instance_name: instance_name() +      new() +      |> to(recipient(user)) +      |> from(sender()) +      |> subject( +        Gettext.dpgettext( +          "static_pages", +          "confirmation email subject", +          "%{instance_name} account confirmation", +          instance_name: instance_name() +        )        ) -    ) -    |> html_body(html_body) +      |> html_body(html_body) +    end    end    def approval_pending_email(user) do -    html_body = -      Gettext.dpgettext( -        "static_pages", -        "approval pending email body", -        """ -        <h3>Awaiting Approval</h3> -        <p>Your account at %{instance_name} is being reviewed by staff. You will receive another email once your account is approved.</p> -        """, -        instance_name: instance_name() -      ) +    Gettext.with_locale_or_default user.language do +      html_body = +        Gettext.dpgettext( +          "static_pages", +          "approval pending email body", +          """ +          <h3>Awaiting Approval</h3> +          <p>Your account at %{instance_name} is being reviewed by staff. You will receive another email once your account is approved.</p> +          """, +          instance_name: instance_name() +        ) -    new() -    |> to(recipient(user)) -    |> from(sender()) -    |> subject( -      Gettext.dpgettext( -        "static_pages", -        "approval pending email subject", -        "Your account is awaiting approval" +      new() +      |> to(recipient(user)) +      |> from(sender()) +      |> subject( +        Gettext.dpgettext( +          "static_pages", +          "approval pending email subject", +          "Your account is awaiting approval" +        )        ) -    ) -    |> html_body(html_body) +      |> html_body(html_body) +    end    end    def successful_registration_email(user) do -    html_body = -      Gettext.dpgettext( -        "static_pages", -        "successful registration email body", -        """ -        <h3>Hello @%{nickname},</h3> -        <p>Your account at %{instance_name} has been registered successfully.</p> -        <p>No further action is required to activate your account.</p> -        """, -        nickname: user.nickname, -        instance_name: instance_name() -      ) +    Gettext.with_locale_or_default user.language do +      html_body = +        Gettext.dpgettext( +          "static_pages", +          "successful registration email body", +          """ +          <h3>Hello @%{nickname},</h3> +          <p>Your account at %{instance_name} has been registered successfully.</p> +          <p>No further action is required to activate your account.</p> +          """, +          nickname: user.nickname, +          instance_name: instance_name() +        ) -    new() -    |> to(recipient(user)) -    |> from(sender()) -    |> subject( -      Gettext.dpgettext( -        "static_pages", -        "successful registration email subject", -        "Account registered on %{instance_name}", -        instance_name: instance_name() +      new() +      |> to(recipient(user)) +      |> from(sender()) +      |> subject( +        Gettext.dpgettext( +          "static_pages", +          "successful registration email subject", +          "Account registered on %{instance_name}", +          instance_name: instance_name() +        )        ) -    ) -    |> html_body(html_body) +      |> html_body(html_body) +    end    end    @doc """ @@ -231,76 +246,78 @@ defmodule Pleroma.Emails.UserEmail do    """    @spec digest_email(User.t()) :: Swoosh.Email.t() | nil    def digest_email(user) do -    notifications = Pleroma.Notification.for_user_since(user, user.last_digest_emailed_at) - -    mentions = -      notifications -      |> Enum.filter(&(&1.activity.data["type"] == "Create")) -      |> Enum.map(fn notification -> -        object = Pleroma.Object.normalize(notification.activity, fetch: false) - -        if not is_nil(object) do -          object = update_in(object.data["content"], &format_links/1) - -          %{ -            data: notification, -            object: object, -            from: User.get_by_ap_id(notification.activity.actor) -          } -        end -      end) -      |> Enum.filter(& &1) - -    followers = -      notifications -      |> Enum.filter(&(&1.activity.data["type"] == "Follow")) -      |> Enum.map(fn notification -> -        from = User.get_by_ap_id(notification.activity.actor) - -        if not is_nil(from) do -          %{ -            data: notification, -            object: Pleroma.Object.normalize(notification.activity, fetch: false), -            from: User.get_by_ap_id(notification.activity.actor) -          } -        end -      end) -      |> Enum.filter(& &1) - -    unless Enum.empty?(mentions) do -      styling = Config.get([__MODULE__, :styling]) -      logo = Config.get([__MODULE__, :logo]) - -      html_data = %{ -        instance: instance_name(), -        user: user, -        mentions: mentions, -        followers: followers, -        unsubscribe_link: unsubscribe_url(user, "digest"), -        styling: styling -      } - -      logo_path = -        if is_nil(logo) do -          Path.join(:code.priv_dir(:pleroma), "static/static/logo.svg") -        else -          Path.join(Config.get([:instance, :static_dir]), logo) -        end - -      new() -      |> to(recipient(user)) -      |> from(sender()) -      |> subject( -        Gettext.dpgettext( -          "static_pages", -          "digest email subject", -          "Your digest from %{instance_name}", -          instance_name: instance_name() +    Gettext.with_locale_or_default user.language do +      notifications = Pleroma.Notification.for_user_since(user, user.last_digest_emailed_at) + +      mentions = +        notifications +        |> Enum.filter(&(&1.activity.data["type"] == "Create")) +        |> Enum.map(fn notification -> +          object = Pleroma.Object.normalize(notification.activity, fetch: false) + +          if not is_nil(object) do +            object = update_in(object.data["content"], &format_links/1) + +            %{ +              data: notification, +              object: object, +              from: User.get_by_ap_id(notification.activity.actor) +            } +          end +        end) +        |> Enum.filter(& &1) + +      followers = +        notifications +        |> Enum.filter(&(&1.activity.data["type"] == "Follow")) +        |> Enum.map(fn notification -> +          from = User.get_by_ap_id(notification.activity.actor) + +          if not is_nil(from) do +            %{ +              data: notification, +              object: Pleroma.Object.normalize(notification.activity, fetch: false), +              from: User.get_by_ap_id(notification.activity.actor) +            } +          end +        end) +        |> Enum.filter(& &1) + +      unless Enum.empty?(mentions) do +        styling = Config.get([__MODULE__, :styling]) +        logo = Config.get([__MODULE__, :logo]) + +        html_data = %{ +          instance: instance_name(), +          user: user, +          mentions: mentions, +          followers: followers, +          unsubscribe_link: unsubscribe_url(user, "digest"), +          styling: styling +        } + +        logo_path = +          if is_nil(logo) do +            Path.join(:code.priv_dir(:pleroma), "static/static/logo.svg") +          else +            Path.join(Config.get([:instance, :static_dir]), logo) +          end + +        new() +        |> to(recipient(user)) +        |> from(sender()) +        |> subject( +          Gettext.dpgettext( +            "static_pages", +            "digest email subject", +            "Your digest from %{instance_name}", +            instance_name: instance_name() +          )          ) -      ) -      |> put_layout(false) -      |> render_body("digest.html", html_data) -      |> attachment(Swoosh.Attachment.new(logo_path, filename: "logo.svg", type: :inline)) +        |> put_layout(false) +        |> render_body("digest.html", html_data) +        |> attachment(Swoosh.Attachment.new(logo_path, filename: "logo.svg", type: :inline)) +      end      end    end @@ -330,44 +347,47 @@ defmodule Pleroma.Emails.UserEmail do    def backup_is_ready_email(backup, admin_user_id \\ nil) do      %{user: user} = Pleroma.Repo.preload(backup, :user) -    download_url = Pleroma.Web.PleromaAPI.BackupView.download_url(backup) -    html_body = -      if is_nil(admin_user_id) do -        Gettext.dpgettext( -          "static_pages", -          "account archive email body - self-requested", -          """ -          <p>You requested a full backup of your Pleroma account. It's ready for download:</p> -          <p><a href="%{download_url}">%{download_url}</a></p> -          """, -          download_url: download_url -        ) -      else -        admin = Pleroma.Repo.get(User, admin_user_id) +    Gettext.with_locale_or_default user.language do +      download_url = Pleroma.Web.PleromaAPI.BackupView.download_url(backup) + +      html_body = +        if is_nil(admin_user_id) do +          Gettext.dpgettext( +            "static_pages", +            "account archive email body - self-requested", +            """ +            <p>You requested a full backup of your Pleroma account. It's ready for download:</p> +            <p><a href="%{download_url}">%{download_url}</a></p> +            """, +            download_url: download_url +          ) +        else +          admin = Pleroma.Repo.get(User, admin_user_id) + +          Gettext.dpgettext( +            "static_pages", +            "account archive email body - admin requested", +            """ +            <p>Admin @%{admin_nickname} requested a full backup of your Pleroma account. It's ready for download:</p> +            <p><a href="%{download_url}">%{download_url}</a></p> +            """, +            admin_nickname: admin.nickname, +            download_url: download_url +          ) +        end +      new() +      |> to(recipient(user)) +      |> from(sender()) +      |> subject(          Gettext.dpgettext(            "static_pages", -          "account archive email body - admin requested", -          """ -          <p>Admin @%{admin_nickname} requested a full backup of your Pleroma account. It's ready for download:</p> -          <p><a href="%{download_url}">%{download_url}</a></p> -          """, -          admin_nickname: admin.nickname, -          download_url: download_url +          "account archive email subject", +          "Your account archive is ready"          ) -      end - -    new() -    |> to(recipient(user)) -    |> from(sender()) -    |> subject( -      Gettext.dpgettext( -        "static_pages", -        "account archive email subject", -        "Your account archive is ready"        ) -    ) -    |> html_body(html_body) +      |> html_body(html_body) +    end    end  end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 36177bda3..cc8a26b48 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -156,6 +156,7 @@ defmodule Pleroma.User do      field(:last_status_at, :naive_datetime)      field(:birthday, :date)      field(:show_birthday, :boolean, default: false) +    field(:language, :string)      embeds_one(        :notification_settings, diff --git a/lib/pleroma/web/gettext.ex b/lib/pleroma/web/gettext.ex index c8a739c2b..e85290496 100644 --- a/lib/pleroma/web/gettext.ex +++ b/lib/pleroma/web/gettext.ex @@ -34,4 +34,26 @@ defmodule Pleroma.Web.Gettext do      Gettext.get_locale()      |> String.replace("_", "-", global: true)    end + +  def supports_locale?(locale) do +    Pleroma.Web.Gettext +    |> Gettext.known_locales() +    |> Enum.member?(locale) +  end + +  def locale_or_default(locale) do +    if supports_locale?(locale) do +      locale +    else +      Gettext.get_locale() +    end +  end + +  defmacro with_locale_or_default(locale, do: fun) do +    quote do +      Gettext.with_locale(Pleroma.Web.Gettext.locale_or_default(unquote(locale)), fn -> +        unquote(fun) +      end) +    end +  end  end diff --git a/lib/pleroma/web/plugs/set_locale_plug.ex b/lib/pleroma/web/plugs/set_locale_plug.ex index a9387ba7e..3c3fffa81 100644 --- a/lib/pleroma/web/plugs/set_locale_plug.ex +++ b/lib/pleroma/web/plugs/set_locale_plug.ex @@ -64,9 +64,7 @@ defmodule Pleroma.Web.Plugs.SetLocalePlug do    end    defp supported_locale?(locale) do -    Pleroma.Web.Gettext -    |> Gettext.known_locales() -    |> Enum.member?(locale) +    Pleroma.Web.Gettext.supports_locale?(locale)    end    defp parse_language_option(string) do | 
