forked from AkkomaGang/akkoma
Allow user to register with custom language
This commit is contained in:
parent
1b77308644
commit
72bdb0640f
7 changed files with 93 additions and 3 deletions
|
@ -735,7 +735,8 @@ def register_changeset(struct, params \\ %{}, opts \\ []) do
|
||||||
:password_confirmation,
|
:password_confirmation,
|
||||||
:emoji,
|
:emoji,
|
||||||
:accepts_chat_messages,
|
:accepts_chat_messages,
|
||||||
:registration_reason
|
:registration_reason,
|
||||||
|
:language
|
||||||
])
|
])
|
||||||
|> validate_required([:name, :nickname, :password, :password_confirmation])
|
|> validate_required([:name, :nickname, :password, :password_confirmation])
|
||||||
|> validate_confirmation(:password)
|
|> validate_confirmation(:password)
|
||||||
|
|
|
@ -507,6 +507,11 @@ defp create_request do
|
||||||
type: :string,
|
type: :string,
|
||||||
nullable: true,
|
nullable: true,
|
||||||
description: "Invite token required when the registrations aren't public"
|
description: "Invite token required when the registrations aren't public"
|
||||||
|
},
|
||||||
|
language: %Schema{
|
||||||
|
type: :string,
|
||||||
|
nullable: true,
|
||||||
|
description: "User's preferred language for emails"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
example: %{
|
example: %{
|
||||||
|
|
|
@ -35,6 +35,14 @@ def language_tag do
|
||||||
|> String.replace("_", "-", global: true)
|
|> String.replace("_", "-", global: true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def normalize_locale(locale) do
|
||||||
|
if is_binary(locale) do
|
||||||
|
String.replace(locale, "-", "_")
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def supports_locale?(locale) do
|
def supports_locale?(locale) do
|
||||||
Pleroma.Web.Gettext
|
Pleroma.Web.Gettext
|
||||||
|> Gettext.known_locales()
|
|> Gettext.known_locales()
|
||||||
|
|
|
@ -217,7 +217,7 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p
|
||||||
|> Maps.put_if_present(:is_locked, params[:locked])
|
|> Maps.put_if_present(:is_locked, params[:locked])
|
||||||
# Note: param name is indeed :discoverable (not an error)
|
# Note: param name is indeed :discoverable (not an error)
|
||||||
|> Maps.put_if_present(:is_discoverable, params[:discoverable])
|
|> Maps.put_if_present(:is_discoverable, params[:discoverable])
|
||||||
|> Maps.put_if_present(:language, params[:language])
|
|> Maps.put_if_present(:language, Pleroma.Web.Gettext.normalize_locale(params[:language]))
|
||||||
|
|
||||||
# What happens here:
|
# What happens here:
|
||||||
#
|
#
|
||||||
|
|
|
@ -25,7 +25,7 @@ defp get_locale_from_header(conn) do
|
||||||
|
|
||||||
defp normalize_language_codes(codes) do
|
defp normalize_language_codes(codes) do
|
||||||
codes
|
codes
|
||||||
|> Enum.map(fn code -> String.replace(code, "-", "_") end)
|
|> Enum.map(fn code -> Pleroma.Web.Gettext.normalize_locale(code) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp extract_preferred_language(conn) do
|
defp extract_preferred_language(conn) do
|
||||||
|
|
|
@ -12,6 +12,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
|
||||||
alias Pleroma.UserInviteToken
|
alias Pleroma.UserInviteToken
|
||||||
|
|
||||||
def register_user(params, opts \\ []) do
|
def register_user(params, opts \\ []) do
|
||||||
|
fallback_language = Gettext.get_locale()
|
||||||
|
|
||||||
params =
|
params =
|
||||||
params
|
params
|
||||||
|> Map.take([:email, :token, :password])
|
|> Map.take([:email, :token, :password])
|
||||||
|
@ -20,6 +22,10 @@ def register_user(params, opts \\ []) do
|
||||||
|> Map.put(:name, Map.get(params, :fullname, params[:username]))
|
|> Map.put(:name, Map.get(params, :fullname, params[:username]))
|
||||||
|> Map.put(:password_confirmation, params[:password])
|
|> Map.put(:password_confirmation, params[:password])
|
||||||
|> Map.put(:registration_reason, params[:reason])
|
|> Map.put(:registration_reason, params[:reason])
|
||||||
|
|> Map.put(
|
||||||
|
:language,
|
||||||
|
Pleroma.Web.Gettext.normalize_locale(params[:language]) || fallback_language
|
||||||
|
)
|
||||||
|
|
||||||
if Pleroma.Config.get([:instance, :registrations_open]) do
|
if Pleroma.Config.get([:instance, :registrations_open]) do
|
||||||
create_user(params, opts)
|
create_user(params, opts)
|
||||||
|
|
|
@ -11,6 +11,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do
|
||||||
alias Pleroma.Web.ActivityPub.InternalFetchActor
|
alias Pleroma.Web.ActivityPub.InternalFetchActor
|
||||||
alias Pleroma.Web.CommonAPI
|
alias Pleroma.Web.CommonAPI
|
||||||
alias Pleroma.Web.OAuth.Token
|
alias Pleroma.Web.OAuth.Token
|
||||||
|
alias Pleroma.Web.Plugs.SetLocalePlug
|
||||||
|
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
@ -1586,6 +1587,75 @@ test "returns an error if captcha is invalid", %{conn: conn} do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "create account with language" do
|
||||||
|
setup %{conn: conn} do
|
||||||
|
app_token = insert(:oauth_token, user: nil)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> put_req_header("authorization", "Bearer " <> app_token.token)
|
||||||
|
|> put_req_header("content-type", "multipart/form-data")
|
||||||
|
|> put_req_cookie(SetLocalePlug.frontend_language_cookie_name(), "zh-Hans")
|
||||||
|
|> SetLocalePlug.call([])
|
||||||
|
|
||||||
|
[conn: conn]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "creates an account with language parameter", %{conn: conn} do
|
||||||
|
params = %{
|
||||||
|
username: "foo",
|
||||||
|
email: "foo@example.org",
|
||||||
|
password: "dupa.8",
|
||||||
|
agreement: true,
|
||||||
|
language: "ru"
|
||||||
|
}
|
||||||
|
|
||||||
|
res =
|
||||||
|
conn
|
||||||
|
|> post("/api/v1/accounts", params)
|
||||||
|
|
||||||
|
assert json_response_and_validate_schema(res, 200)
|
||||||
|
|
||||||
|
assert %{language: "ru"} = Pleroma.User.get_by_nickname("foo")
|
||||||
|
end
|
||||||
|
|
||||||
|
test "language parameter should be normalized", %{conn: conn} do
|
||||||
|
params = %{
|
||||||
|
username: "foo",
|
||||||
|
email: "foo@example.org",
|
||||||
|
password: "dupa.8",
|
||||||
|
agreement: true,
|
||||||
|
language: "ru-RU"
|
||||||
|
}
|
||||||
|
|
||||||
|
res =
|
||||||
|
conn
|
||||||
|
|> post("/api/v1/accounts", params)
|
||||||
|
|
||||||
|
assert json_response_and_validate_schema(res, 200)
|
||||||
|
|
||||||
|
assert %{language: "ru_RU"} = Pleroma.User.get_by_nickname("foo")
|
||||||
|
end
|
||||||
|
|
||||||
|
test "createing an account without language parameter should fallback to cookie/header language",
|
||||||
|
%{conn: conn} do
|
||||||
|
params = %{
|
||||||
|
username: "foo2",
|
||||||
|
email: "foo2@example.org",
|
||||||
|
password: "dupa.8",
|
||||||
|
agreement: true
|
||||||
|
}
|
||||||
|
|
||||||
|
res =
|
||||||
|
conn
|
||||||
|
|> post("/api/v1/accounts", params)
|
||||||
|
|
||||||
|
assert json_response_and_validate_schema(res, 200)
|
||||||
|
|
||||||
|
assert %{language: "zh_Hans"} = Pleroma.User.get_by_nickname("foo2")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "GET /api/v1/accounts/:id/lists - account_lists" do
|
describe "GET /api/v1/accounts/:id/lists - account_lists" do
|
||||||
test "returns lists to which the account belongs" do
|
test "returns lists to which the account belongs" do
|
||||||
%{user: user, conn: conn} = oauth_access(["read:lists"])
|
%{user: user, conn: conn} = oauth_access(["read:lists"])
|
||||||
|
|
Loading…
Reference in a new issue