forked from shibao/cannery
		
	add locale as per user setting
This commit is contained in:
		| @@ -109,7 +109,7 @@ In `dev` mode, Cannery will listen for these environment variables at runtime. | |||||||
|   Defaults to `false`. |   Defaults to `false`. | ||||||
| - `POOL_SIZE`: Controls the pool size to use with PostgreSQL. Defaults to `10`. | - `POOL_SIZE`: Controls the pool size to use with PostgreSQL. Defaults to `10`. | ||||||
| - `REGISTRATION`: Controls if user sign-up should be invite only or set to public. Set to `public` to enable public registration. Defaults to `invite`. | - `REGISTRATION`: Controls if user sign-up should be invite only or set to public. Set to `public` to enable public registration. Defaults to `invite`. | ||||||
| - `LOCALE`: Sets a custom locale. Defaults to `en_US`. | - `LOCALE`: Sets a custom default locale. Defaults to `en_US`. | ||||||
|   - Available options: `en_US`, `de`, and `fr` |   - Available options: `en_US`, `de`, and `fr` | ||||||
|  |  | ||||||
| ## `MIX_ENV=test` | ## `MIX_ENV=test` | ||||||
|   | |||||||
| @@ -63,7 +63,7 @@ You can use the following environment variables to configure Cannery in | |||||||
|   with `docker run -it shibaobun/cannery mix phx.gen.secret` and set for server to start. |   with `docker run -it shibaobun/cannery mix phx.gen.secret` and set for server to start. | ||||||
| - `REGISTRATION`: Controls if user sign-up should be invite only or set to | - `REGISTRATION`: Controls if user sign-up should be invite only or set to | ||||||
|   public. Set to `public` to enable public registration. Defaults to `invite`. |   public. Set to `public` to enable public registration. Defaults to `invite`. | ||||||
| - `LOCALE`: Sets a custom locale. Defaults to `en_US` | - `LOCALE`: Sets a custom default locale. Defaults to `en_US` | ||||||
|   - Available options: `en_US`, `de`, and `fr` |   - Available options: `en_US`, `de`, and `fr` | ||||||
| - `SMTP_HOST`: The url for your SMTP email provider. Must be set | - `SMTP_HOST`: The url for your SMTP email provider. Must be set | ||||||
| - `SMTP_PORT`: The port for your SMTP relay. Defaults to `587`. | - `SMTP_PORT`: The port for your SMTP relay. Defaults to `587`. | ||||||
|   | |||||||
| @@ -269,6 +269,35 @@ defmodule Cannery.Accounts do | |||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |   @doc """ | ||||||
|  |   Returns an `%Changeset{}` for changing the user locale. | ||||||
|  |  | ||||||
|  |   ## Examples | ||||||
|  |  | ||||||
|  |       iex> change_user_locale(user) | ||||||
|  |       %Changeset{data: %User{}} | ||||||
|  |  | ||||||
|  |   """ | ||||||
|  |   @spec change_user_locale(User.t()) :: Changeset.t(User.t()) | ||||||
|  |   def change_user_locale(%{locale: locale} = user), do: User.locale_changeset(user, locale) | ||||||
|  |  | ||||||
|  |   @doc """ | ||||||
|  |   Updates the user locale. | ||||||
|  |  | ||||||
|  |   ## Examples | ||||||
|  |  | ||||||
|  |       iex> update_user_locale(user, "valid locale") | ||||||
|  |       {:ok, %User{}} | ||||||
|  |  | ||||||
|  |       iex> update_user_password(user, "invalid locale") | ||||||
|  |       {:error, %Changeset{}} | ||||||
|  |  | ||||||
|  |   """ | ||||||
|  |   @spec update_user_locale(User.t(), locale :: String.t()) :: | ||||||
|  |           {:ok, User.t()} | {:error, Changeset.t(User.t())} | ||||||
|  |   def update_user_locale(user, locale), | ||||||
|  |     do: user |> User.locale_changeset(locale) |> Repo.update() | ||||||
|  |  | ||||||
|   @doc """ |   @doc """ | ||||||
|   Deletes a user. must be performed by an admin or the same user! |   Deletes a user. must be performed by an admin or the same user! | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,6 +18,7 @@ defmodule Cannery.Accounts.User do | |||||||
|     field :hashed_password, :string |     field :hashed_password, :string | ||||||
|     field :confirmed_at, :naive_datetime |     field :confirmed_at, :naive_datetime | ||||||
|     field :role, Ecto.Enum, values: [:admin, :user], default: :user |     field :role, Ecto.Enum, values: [:admin, :user], default: :user | ||||||
|  |     field :locale, :string | ||||||
|  |  | ||||||
|     has_many :invites, Invite, on_delete: :delete_all |     has_many :invites, Invite, on_delete: :delete_all | ||||||
|  |  | ||||||
| @@ -31,6 +32,7 @@ defmodule Cannery.Accounts.User do | |||||||
|           hashed_password: String.t(), |           hashed_password: String.t(), | ||||||
|           confirmed_at: NaiveDateTime.t(), |           confirmed_at: NaiveDateTime.t(), | ||||||
|           role: atom(), |           role: atom(), | ||||||
|  |           locale: String.t() | nil, | ||||||
|           invites: [Invite.t()], |           invites: [Invite.t()], | ||||||
|           inserted_at: NaiveDateTime.t(), |           inserted_at: NaiveDateTime.t(), | ||||||
|           updated_at: NaiveDateTime.t() |           updated_at: NaiveDateTime.t() | ||||||
| @@ -60,7 +62,7 @@ defmodule Cannery.Accounts.User do | |||||||
|           Changeset.t(t() | new_user()) |           Changeset.t(t() | new_user()) | ||||||
|   def registration_changeset(user, attrs, opts \\ []) do |   def registration_changeset(user, attrs, opts \\ []) do | ||||||
|     user |     user | ||||||
|     |> cast(attrs, [:email, :password, :role]) |     |> cast(attrs, [:email, :password, :role, :locale]) | ||||||
|     |> validate_email() |     |> validate_email() | ||||||
|     |> validate_password(opts) |     |> validate_password(opts) | ||||||
|   end |   end | ||||||
| @@ -185,4 +187,14 @@ defmodule Cannery.Accounts.User do | |||||||
|       do: changeset, |       do: changeset, | ||||||
|       else: changeset |> add_error(:current_password, dgettext("errors", "is not valid")) |       else: changeset |> add_error(:current_password, dgettext("errors", "is not valid")) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |   @doc """ | ||||||
|  |   A changeset for changing the user's locale | ||||||
|  |   """ | ||||||
|  |   @spec locale_changeset(t() | Changeset.t(t()), locale :: String.t() | nil) :: Changeset.t(t()) | ||||||
|  |   def locale_changeset(user_or_changeset, locale) do | ||||||
|  |     user_or_changeset | ||||||
|  |     |> cast(%{"locale" => locale}, [:locale]) | ||||||
|  |     |> validate_required(:locale) | ||||||
|  |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -47,6 +47,7 @@ defmodule CanneryWeb do | |||||||
|       use Phoenix.LiveView, |       use Phoenix.LiveView, | ||||||
|         layout: {CanneryWeb.LayoutView, "live.html"} |         layout: {CanneryWeb.LayoutView, "live.html"} | ||||||
|  |  | ||||||
|  |       on_mount CanneryWeb.InitAssigns | ||||||
|       unquote(view_helpers()) |       unquote(view_helpers()) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|   | |||||||
| @@ -10,10 +10,11 @@ defmodule CanneryWeb.UserSettingsController do | |||||||
|     render(conn, "edit.html", page_title: gettext("Settings")) |     render(conn, "edit.html", page_title: gettext("Settings")) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def update(conn, %{"action" => "update_email"} = params) do |   def update(%{assigns: %{current_user: user}} = conn, %{ | ||||||
|     %{"current_password" => password, "user" => user_params} = params |         "action" => "update_email", | ||||||
|     user = conn.assigns.current_user |         "current_password" => password, | ||||||
|  |         "user" => user_params | ||||||
|  |       }) do | ||||||
|     case Accounts.apply_user_email(user, password, user_params) do |     case Accounts.apply_user_email(user, password, user_params) do | ||||||
|       {:ok, applied_user} -> |       {:ok, applied_user} -> | ||||||
|         Accounts.deliver_update_email_instructions( |         Accounts.deliver_update_email_instructions( | ||||||
| @@ -33,14 +34,15 @@ defmodule CanneryWeb.UserSettingsController do | |||||||
|         |> redirect(to: Routes.user_settings_path(conn, :edit)) |         |> redirect(to: Routes.user_settings_path(conn, :edit)) | ||||||
|  |  | ||||||
|       {:error, changeset} -> |       {:error, changeset} -> | ||||||
|         render(conn, "edit.html", email_changeset: changeset) |         conn |> render("edit.html", email_changeset: changeset) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def update(conn, %{"action" => "update_password"} = params) do |   def update(%{assigns: %{current_user: user}} = conn, %{ | ||||||
|     %{"current_password" => password, "user" => user_params} = params |         "action" => "update_password", | ||||||
|     user = conn.assigns.current_user |         "current_password" => password, | ||||||
|  |         "user" => user_params | ||||||
|  |       }) do | ||||||
|     case Accounts.update_user_password(user, password, user_params) do |     case Accounts.update_user_password(user, password, user_params) do | ||||||
|       {:ok, user} -> |       {:ok, user} -> | ||||||
|         conn |         conn | ||||||
| @@ -49,12 +51,27 @@ defmodule CanneryWeb.UserSettingsController do | |||||||
|         |> UserAuth.log_in_user(user) |         |> UserAuth.log_in_user(user) | ||||||
|  |  | ||||||
|       {:error, changeset} -> |       {:error, changeset} -> | ||||||
|         render(conn, "edit.html", password_changeset: changeset) |         conn |> render("edit.html", password_changeset: changeset) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def confirm_email(conn, %{"token" => token}) do |   def update( | ||||||
|     case Accounts.update_user_email(conn.assigns.current_user, token) do |         %{assigns: %{current_user: user}} = conn, | ||||||
|  |         %{"action" => "update_locale", "user" => %{"locale" => locale}} | ||||||
|  |       ) do | ||||||
|  |     case Accounts.update_user_locale(user, locale) do | ||||||
|  |       {:ok, _user} -> | ||||||
|  |         conn | ||||||
|  |         |> put_flash(:info, dgettext("prompts", "Language updated successfully.")) | ||||||
|  |         |> redirect(to: Routes.user_settings_path(conn, :edit)) | ||||||
|  |  | ||||||
|  |       {:error, changeset} -> | ||||||
|  |         conn |> render("edit.html", locale_changeset: changeset) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def confirm_email(%{assigns: %{current_user: user}} = conn, %{"token" => token}) do | ||||||
|  |     case Accounts.update_user_email(user, token) do | ||||||
|       :ok -> |       :ok -> | ||||||
|         conn |         conn | ||||||
|         |> put_flash(:info, dgettext("prompts", "Email changed successfully.")) |         |> put_flash(:info, dgettext("prompts", "Email changed successfully.")) | ||||||
| @@ -84,11 +101,10 @@ defmodule CanneryWeb.UserSettingsController do | |||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   defp assign_email_and_password_changesets(conn, _opts) do |   defp assign_email_and_password_changesets(%{assigns: %{current_user: user}} = conn, _opts) do | ||||||
|     user = conn.assigns.current_user |  | ||||||
|  |  | ||||||
|     conn |     conn | ||||||
|     |> assign(:email_changeset, Accounts.change_user_email(user)) |     |> assign(:email_changeset, Accounts.change_user_email(user)) | ||||||
|     |> assign(:password_changeset, Accounts.change_user_password(user)) |     |> assign(:password_changeset, Accounts.change_user_password(user)) | ||||||
|  |     |> assign(:locale_changeset, Accounts.change_user_locale(user)) | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -8,8 +8,8 @@ defmodule CanneryWeb.AmmoGroupLive.Index do | |||||||
|   alias CanneryWeb.Endpoint |   alias CanneryWeb.Endpoint | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def mount(_params, session, socket) do |   def mount(_params, _session, socket) do | ||||||
|     {:ok, socket |> assign_defaults(session) |> display_ammo_groups()} |     {:ok, socket |> display_ammo_groups()} | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   | |||||||
| @@ -10,9 +10,7 @@ defmodule CanneryWeb.AmmoGroupLive.Show do | |||||||
|   alias Phoenix.LiveView.Socket |   alias Phoenix.LiveView.Socket | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def mount(_params, session, socket) do |   def mount(_params, _session, socket), do: {:ok, socket} | ||||||
|     {:ok, socket |> assign_defaults(session)} |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def handle_params( |   def handle_params( | ||||||
|   | |||||||
| @@ -9,8 +9,8 @@ defmodule CanneryWeb.AmmoTypeLive.Index do | |||||||
|   alias CanneryWeb.Endpoint |   alias CanneryWeb.Endpoint | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def mount(_params, session, socket) do |   def mount(_params, _session, socket) do | ||||||
|     {:ok, socket |> assign_defaults(session) |> list_ammo_types()} |     {:ok, socket |> list_ammo_types()} | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   | |||||||
| @@ -9,9 +9,7 @@ defmodule CanneryWeb.AmmoTypeLive.Show do | |||||||
|   alias CanneryWeb.Endpoint |   alias CanneryWeb.Endpoint | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def mount(_params, session, socket) do |   def mount(_params, _session, socket), do: {:ok, socket} | ||||||
|     {:ok, socket |> assign_defaults(session)} |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def handle_params(%{"id" => id}, _params, %{assigns: %{current_user: current_user}} = socket) do |   def handle_params(%{"id" => id}, _params, %{assigns: %{current_user: current_user}} = socket) do | ||||||
|   | |||||||
| @@ -10,9 +10,7 @@ defmodule CanneryWeb.ContainerLive.Index do | |||||||
|   alias Ecto.Changeset |   alias Ecto.Changeset | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def mount(_params, session, socket) do |   def mount(_params, _session, socket), do: {:ok, socket} | ||||||
|     {:ok, socket |> assign_defaults(session)} |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do |   def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do | ||||||
|   | |||||||
| @@ -11,9 +11,7 @@ defmodule CanneryWeb.ContainerLive.Show do | |||||||
|   alias Phoenix.LiveView.Socket |   alias Phoenix.LiveView.Socket | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def mount(_params, session, socket) do |   def mount(_params, _session, socket), do: {:ok, socket} | ||||||
|     {:ok, socket |> assign_defaults(session)} |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def handle_params( |   def handle_params( | ||||||
|   | |||||||
| @@ -7,14 +7,9 @@ defmodule CanneryWeb.HomeLive do | |||||||
|   alias Cannery.Accounts |   alias Cannery.Accounts | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def mount(_params, session, socket) do |   def mount(_params, _session, socket) do | ||||||
|     admins = Accounts.list_users_by_role(:admin) |     admins = Accounts.list_users_by_role(:admin) | ||||||
|  |     socket = socket |> assign(page_title: "Home", query: "", results: %{}, admins: admins) | ||||||
|     socket = |  | ||||||
|       socket |  | ||||||
|       |> assign_defaults(session) |  | ||||||
|       |> assign(page_title: "Home", query: "", results: %{}, admins: admins) |  | ||||||
|  |  | ||||||
|     {:ok, socket} |     {:ok, socket} | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										19
									
								
								lib/cannery_web/live/init_assigns.ex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								lib/cannery_web/live/init_assigns.ex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | defmodule CanneryWeb.InitAssigns do | ||||||
|  |   @moduledoc """ | ||||||
|  |   Ensures common `assigns` are applied to all LiveViews attaching this hook. | ||||||
|  |   """ | ||||||
|  |   import Phoenix.LiveView | ||||||
|  |   alias Cannery.Accounts | ||||||
|  |  | ||||||
|  |   def on_mount(:default, _params, %{"locale" => locale, "user_token" => user_token}, socket) do | ||||||
|  |     Gettext.put_locale(locale) | ||||||
|  |  | ||||||
|  |     socket = | ||||||
|  |       socket | ||||||
|  |       |> assign_new(:current_user, fn -> Accounts.get_user_by_session_token(user_token) end) | ||||||
|  |  | ||||||
|  |     {:cont, socket} | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def on_mount(:default, _params, _session, socket), do: {:cont, socket} | ||||||
|  | end | ||||||
| @@ -10,9 +10,7 @@ defmodule CanneryWeb.InviteLive.Index do | |||||||
|   alias Phoenix.LiveView.JS |   alias Phoenix.LiveView.JS | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def mount(_params, session, socket) do |   def mount(_params, _session, %{assigns: %{current_user: current_user}} = socket) do | ||||||
|     %{assigns: %{current_user: current_user}} = socket = socket |> assign_defaults(session) |  | ||||||
|  |  | ||||||
|     socket = |     socket = | ||||||
|       if current_user |> Map.get(:role) == :admin do |       if current_user |> Map.get(:role) == :admin do | ||||||
|         socket |> display_invites() |         socket |> display_invites() | ||||||
|   | |||||||
| @@ -3,20 +3,9 @@ defmodule CanneryWeb.LiveHelpers do | |||||||
|   Contains common helper functions for liveviews |   Contains common helper functions for liveviews | ||||||
|   """ |   """ | ||||||
|  |  | ||||||
|   import Phoenix.LiveView |  | ||||||
|   import Phoenix.LiveView.Helpers |   import Phoenix.LiveView.Helpers | ||||||
|   alias Cannery.Accounts |  | ||||||
|   alias Phoenix.LiveView.JS |   alias Phoenix.LiveView.JS | ||||||
|  |  | ||||||
|   def assign_defaults(socket, %{"user_token" => user_token} = _session) do |  | ||||||
|     socket |  | ||||||
|     |> assign_new(:current_user, fn -> Accounts.get_user_by_session_token(user_token) end) |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   def assign_defaults(socket, _session) do |  | ||||||
|     socket |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   @doc """ |   @doc """ | ||||||
|   Renders a live component inside a modal. |   Renders a live component inside a modal. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,9 +10,7 @@ defmodule CanneryWeb.RangeLive.Index do | |||||||
|   alias Phoenix.LiveView.Socket |   alias Phoenix.LiveView.Socket | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def mount(_params, session, socket) do |   def mount(_params, _session, socket), do: {:ok, socket |> display_shot_groups()} | ||||||
|     {:ok, socket |> assign_defaults(session) |> display_shot_groups()} |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do |   def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do | ||||||
|   | |||||||
| @@ -9,9 +9,7 @@ defmodule CanneryWeb.TagLive.Index do | |||||||
|   alias CanneryWeb.Endpoint |   alias CanneryWeb.Endpoint | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def mount(_params, session, socket) do |   def mount(_params, _session, socket), do: {:ok, socket |> display_tags()} | ||||||
|     {:ok, socket |> assign_defaults(session) |> display_tags()} |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   @impl true |   @impl true | ||||||
|   def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do |   def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do | ||||||
|   | |||||||
| @@ -11,8 +11,17 @@ defmodule CanneryWeb.Router do | |||||||
|     plug :protect_from_forgery |     plug :protect_from_forgery | ||||||
|     plug :put_secure_browser_headers |     plug :put_secure_browser_headers | ||||||
|     plug :fetch_current_user |     plug :fetch_current_user | ||||||
|  |     plug :put_user_locale, default: Application.get_env(:gettext, :default_locale, "en_US") | ||||||
|  |   end | ||||||
|  |  | ||||||
|     Gettext.put_locale(Application.get_env(:gettext, :default_locale, "en_US")) |   defp put_user_locale(%{assigns: %{current_user: %{locale: locale}}} = conn, default: default) do | ||||||
|  |     Gettext.put_locale(locale || default) | ||||||
|  |     conn |> put_session(:locale, locale || default) | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   defp put_user_locale(conn, default: default) do | ||||||
|  |     Gettext.put_locale(default) | ||||||
|  |     conn |> put_session(:locale, default) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   pipeline :require_admin do |   pipeline :require_admin do | ||||||
|   | |||||||
| @@ -30,6 +30,15 @@ | |||||||
|     <%= password_input(f, :password, required: true, class: "input input-primary col-span-2") %> |     <%= password_input(f, :password, required: true, class: "input input-primary col-span-2") %> | ||||||
|     <%= error_tag(f, :password, "col-span-3") %> |     <%= error_tag(f, :password, "col-span-3") %> | ||||||
|  |  | ||||||
|  |     <%= label(f, :locale, gettext("Language"), class: "title text-lg text-primary-600") %> | ||||||
|  |     <%= select( | ||||||
|  |       f, | ||||||
|  |       :locale, | ||||||
|  |       [{gettext("English"), "en_US"}, {gettext("German"), "de"}, {gettext("French"), "fr"}], | ||||||
|  |       class: "input input-primary col-span-2" | ||||||
|  |     ) %> | ||||||
|  |     <%= error_tag(f, :locale) %> | ||||||
|  |  | ||||||
|     <%= submit(dgettext("actions", "Register"), class: "mx-auto btn btn-primary col-span-3") %> |     <%= submit(dgettext("actions", "Register"), class: "mx-auto btn btn-primary col-span-3") %> | ||||||
|   <% end %> |   <% end %> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,17 +1,16 @@ | |||||||
| <div class="mx-auto mb-8 max-w-2xl flex flex-col justify-center items-center space-y-4"> | <div class="mx-auto mb-8 max-w-2xl flex flex-col justify-center items-center text-center space-y-4"> | ||||||
|   <h1 class="pb-4 title text-primary-600 text-xl"> |   <h1 class="pb-4 title text-primary-600 text-xl"> | ||||||
|     <%= gettext("Settings") %> |     <%= gettext("Settings") %> | ||||||
|   </h1> |   </h1> | ||||||
|  |  | ||||||
|   <hr class="hr" /> |   <hr class="hr" /> | ||||||
|  |  | ||||||
|   <%= form_for @email_changeset, |   <.form | ||||||
|            Routes.user_settings_path(@conn, :update), |     let={f} | ||||||
|            [ |     for={@email_changeset} | ||||||
|              class: |     action={Routes.user_settings_path(@conn, :update)} | ||||||
|                "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" |     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||||
|            ], |   > | ||||||
|            fn f -> %> |  | ||||||
|     <h3 class="title text-primary-600 text-lg col-span-3"> |     <h3 class="title text-primary-600 text-lg col-span-3"> | ||||||
|       <%= dgettext("actions", "Change email") %> |       <%= dgettext("actions", "Change email") %> | ||||||
|     </h3> |     </h3> | ||||||
| @@ -45,17 +44,16 @@ | |||||||
|     <%= submit(dgettext("actions", "Change email"), |     <%= submit(dgettext("actions", "Change email"), | ||||||
|       class: "mx-auto btn btn-primary col-span-3" |       class: "mx-auto btn btn-primary col-span-3" | ||||||
|     ) %> |     ) %> | ||||||
|   <% end %> |   </.form> | ||||||
|  |  | ||||||
|   <hr class="hr" /> |   <hr class="hr" /> | ||||||
|  |  | ||||||
|   <%= form_for @password_changeset, |   <.form | ||||||
|            Routes.user_settings_path(@conn, :update), |     let={f} | ||||||
|            [ |     for={@password_changeset} | ||||||
|              class: |     action={Routes.user_settings_path(@conn, :update)} | ||||||
|                "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" |     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||||
|            ], |   > | ||||||
|            fn f -> %> |  | ||||||
|     <h3 class="title text-primary-600 text-lg col-span-3"> |     <h3 class="title text-primary-600 text-lg col-span-3"> | ||||||
|       <%= dgettext("actions", "Change password") %> |       <%= dgettext("actions", "Change password") %> | ||||||
|     </h3> |     </h3> | ||||||
| @@ -101,8 +99,44 @@ | |||||||
|     <%= submit(dgettext("actions", "Change password"), |     <%= submit(dgettext("actions", "Change password"), | ||||||
|       class: "mx-auto btn btn-primary col-span-3" |       class: "mx-auto btn btn-primary col-span-3" | ||||||
|     ) %> |     ) %> | ||||||
|  |   </.form> | ||||||
|  |  | ||||||
|  |   <hr class="hr" /> | ||||||
|  |  | ||||||
|  |   <.form | ||||||
|  |     let={f} | ||||||
|  |     for={@locale_changeset} | ||||||
|  |     action={Routes.user_settings_path(@conn, :update)} | ||||||
|  |     class="flex flex-col space-y-4 justify-center items-center" | ||||||
|  |   > | ||||||
|  |     <h3 class="title text-primary-600 text-lg"> | ||||||
|  |       <%= dgettext("actions", "Change Language") %> | ||||||
|  |     </h3> | ||||||
|  |  | ||||||
|  |     <%= if @locale_changeset.action && not @locale_changeset.valid? do %> | ||||||
|  |       <div class="alert alert-danger"> | ||||||
|  |         <p> | ||||||
|  |           <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> | ||||||
|  |         </p> | ||||||
|  |       </div> | ||||||
|     <% end %> |     <% end %> | ||||||
|  |  | ||||||
|  |     <%= hidden_input(f, :action, name: "action", value: "update_locale") %> | ||||||
|  |  | ||||||
|  |     <%= select( | ||||||
|  |       f, | ||||||
|  |       :locale, | ||||||
|  |       [{gettext("English"), "en_US"}, {gettext("German"), "de"}, {gettext("French"), "fr"}], | ||||||
|  |       class: "mx-2 my-1 min-w-md input input-primary" | ||||||
|  |     ) %> | ||||||
|  |     <%= error_tag(f, :locale) %> | ||||||
|  |  | ||||||
|  |     <%= submit(dgettext("actions", "Change language"), | ||||||
|  |       class: "whitespace-nowrap mx-auto btn btn-primary", | ||||||
|  |       data: [qa: dgettext("prompts", "Are you sure you want to change your language?")] | ||||||
|  |     ) %> | ||||||
|  |   </.form> | ||||||
|  |  | ||||||
|   <hr class="hr" /> |   <hr class="hr" /> | ||||||
|  |  | ||||||
|   <%= link(dgettext("actions", "Delete User"), |   <%= link(dgettext("actions", "Delete User"), | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								mix.exs
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								mix.exs
									
									
									
									
									
								
							| @@ -13,6 +13,7 @@ defmodule Cannery.MixProject do | |||||||
|       deps: deps(), |       deps: deps(), | ||||||
|       dialyzer: [plt_add_apps: [:ex_unit]], |       dialyzer: [plt_add_apps: [:ex_unit]], | ||||||
|       consolidate_protocols: Mix.env() not in [:dev, :test], |       consolidate_protocols: Mix.env() not in [:dev, :test], | ||||||
|  |       preferred_cli_env: [test: :test], | ||||||
|       # ExDoc |       # ExDoc | ||||||
|       name: "Cannery", |       name: "Cannery", | ||||||
|       source_url: "https://gitea.bubbletea.dev/shibao/cannery", |       source_url: "https://gitea.bubbletea.dev/shibao/cannery", | ||||||
| @@ -91,6 +92,7 @@ defmodule Cannery.MixProject do | |||||||
|         "dialyzer", |         "dialyzer", | ||||||
|         "credo --strict", |         "credo --strict", | ||||||
|         "format --check-formatted", |         "format --check-formatted", | ||||||
|  |         "ecto.drop --quiet", | ||||||
|         "ecto.create --quiet", |         "ecto.create --quiet", | ||||||
|         "ecto.migrate --quiet", |         "ecto.migrate --quiet", | ||||||
|         "test" |         "test" | ||||||
|   | |||||||
| @@ -31,14 +31,14 @@ msgid "Add your first type!" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:16 | #: lib/cannery_web/templates/user_settings/edit.html.heex:15 | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:45 | #: lib/cannery_web/templates/user_settings/edit.html.heex:44 | ||||||
| msgid "Change email" | msgid "Change email" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:60 | #: lib/cannery_web/templates/user_settings/edit.html.heex:58 | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:101 | #: lib/cannery_web/templates/user_settings/edit.html.heex:99 | ||||||
| msgid "Change password" | msgid "Change password" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -48,12 +48,12 @@ msgid "Create Invite" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:108 | #: lib/cannery_web/templates/user_settings/edit.html.heex:142 | ||||||
| msgid "Delete User" | msgid "Delete User" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:43 | #: lib/cannery_web/templates/user_registration/new.html.heex:52 | ||||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:3 | #: lib/cannery_web/templates/user_reset_password/new.html.heex:3 | ||||||
| #: lib/cannery_web/templates/user_session/new.html.heex:45 | #: lib/cannery_web/templates/user_session/new.html.heex:45 | ||||||
| msgid "Forgot your password?" | msgid "Forgot your password?" | ||||||
| @@ -67,7 +67,7 @@ msgstr "" | |||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/components/topbar.ex:106 | #: lib/cannery_web/components/topbar.ex:106 | ||||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:39 | #: lib/cannery_web/templates/user_registration/new.html.heex:48 | ||||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:48 | #: lib/cannery_web/templates/user_reset_password/edit.html.heex:48 | ||||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:30 | #: lib/cannery_web/templates/user_reset_password/new.html.heex:30 | ||||||
| #: lib/cannery_web/templates/user_session/new.html.heex:3 | #: lib/cannery_web/templates/user_session/new.html.heex:3 | ||||||
| @@ -104,7 +104,7 @@ msgstr "" | |||||||
| #: lib/cannery_web/components/topbar.ex:99 | #: lib/cannery_web/components/topbar.ex:99 | ||||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:25 | #: lib/cannery_web/templates/user_confirmation/new.html.heex:25 | ||||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:33 | #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:43 | #: lib/cannery_web/templates/user_reset_password/edit.html.heex:43 | ||||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:25 | #: lib/cannery_web/templates/user_reset_password/new.html.heex:25 | ||||||
| #: lib/cannery_web/templates/user_session/new.html.heex:40 | #: lib/cannery_web/templates/user_session/new.html.heex:40 | ||||||
| @@ -201,3 +201,13 @@ msgstr "" | |||||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:66 | #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:66 | ||||||
| msgid "Create" | msgid "Create" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|  | #, elixir-autogen, elixir-format | ||||||
|  | #: lib/cannery_web/templates/user_settings/edit.html.heex:113 | ||||||
|  | msgid "Change Language" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #, elixir-autogen, elixir-format | ||||||
|  | #: lib/cannery_web/templates/user_settings/edit.html.heex:134 | ||||||
|  | msgid "Change language" | ||||||
|  | msgstr "" | ||||||
|   | |||||||
| @@ -11,12 +11,12 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:61 | #: lib/cannery_web/live/home_live.ex:56 | ||||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:83 | #: lib/cannery_web/live/home_live.ex:78 | ||||||
| msgid "Access from any internet-capable device" | msgid "Access from any internet-capable device" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -26,14 +26,14 @@ msgid "Admins" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:97 | #: lib/cannery_web/live/home_live.ex:92 | ||||||
| msgid "Admins:" | msgid "Admins:" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/components/topbar.ex:50 | #: lib/cannery_web/components/topbar.ex:50 | ||||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 | #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 | ||||||
| #: lib/cannery_web/live/range_live/index.ex:82 | #: lib/cannery_web/live/range_live/index.ex:80 | ||||||
| msgid "Ammo" | msgid "Ammo" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -110,7 +110,7 @@ msgstr "" | |||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/components/topbar.ex:44 | #: lib/cannery_web/components/topbar.ex:44 | ||||||
| #: lib/cannery_web/live/container_live/index.ex:38 | #: lib/cannery_web/live/container_live/index.ex:36 | ||||||
| #: lib/cannery_web/live/container_live/index.html.heex:3 | #: lib/cannery_web/live/container_live/index.html.heex:3 | ||||||
| msgid "Containers" | msgid "Containers" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -152,29 +152,29 @@ msgid "Disable" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:58 | #: lib/cannery_web/live/home_live.ex:53 | ||||||
| msgid "Easy to Use:" | msgid "Easy to Use:" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:38 | #: lib/cannery_web/live/ammo_group_live/index.ex:38 | ||||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:42 | #: lib/cannery_web/live/ammo_group_live/show.ex:40 | ||||||
| msgid "Edit Ammo group" | msgid "Edit Ammo group" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:23 | #: lib/cannery_web/live/ammo_type_live/index.ex:23 | ||||||
| #: lib/cannery_web/live/ammo_type_live/show.ex:47 | #: lib/cannery_web/live/ammo_type_live/show.ex:45 | ||||||
| msgid "Edit Ammo type" | msgid "Edit Ammo type" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/invite_live/index.ex:35 | #: lib/cannery_web/live/invite_live/index.ex:33 | ||||||
| msgid "Edit Invite" | msgid "Edit Invite" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/tag_live/index.ex:23 | #: lib/cannery_web/live/tag_live/index.ex:21 | ||||||
| msgid "Edit Tag" | msgid "Edit Tag" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -208,7 +208,7 @@ msgid "Incendiary" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:92 | #: lib/cannery_web/live/home_live.ex:87 | ||||||
| msgid "Instance Information" | msgid "Instance Information" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -218,13 +218,13 @@ msgid "Invite Disabled" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:123 | #: lib/cannery_web/live/home_live.ex:118 | ||||||
| msgid "Invite Only" | msgid "Invite Only" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/components/topbar.ex:69 | #: lib/cannery_web/components/topbar.ex:69 | ||||||
| #: lib/cannery_web/live/invite_live/index.ex:43 | #: lib/cannery_web/live/invite_live/index.ex:41 | ||||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||||
| msgid "Invites" | msgid "Invites" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -288,17 +288,17 @@ msgid "New Ammo type" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/container_live/index.ex:33 | #: lib/cannery_web/live/container_live/index.ex:31 | ||||||
| msgid "New Container" | msgid "New Container" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/invite_live/index.ex:39 | #: lib/cannery_web/live/invite_live/index.ex:37 | ||||||
| msgid "New Invite" | msgid "New Invite" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/tag_live/index.ex:29 | #: lib/cannery_web/live/tag_live/index.ex:27 | ||||||
| msgid "New Tag" | msgid "New Tag" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -341,9 +341,9 @@ msgstr "" | |||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:30 | #: lib/cannery_web/components/add_shot_group_component.html.heex:30 | ||||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:41 | #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:41 | ||||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:90 | #: lib/cannery_web/live/ammo_group_live/show.ex:88 | ||||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:29 | #: lib/cannery_web/live/range_live/form_component.html.heex:29 | ||||||
| #: lib/cannery_web/live/range_live/index.ex:84 | #: lib/cannery_web/live/range_live/index.ex:82 | ||||||
| msgid "Notes" | msgid "Notes" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -384,17 +384,17 @@ msgid "Primer type" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:122 | #: lib/cannery_web/live/home_live.ex:117 | ||||||
| msgid "Public Signups" | msgid "Public Signups" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:70 | #: lib/cannery_web/live/home_live.ex:65 | ||||||
| msgid "Secure:" | msgid "Secure:" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:73 | #: lib/cannery_web/live/home_live.ex:68 | ||||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | msgid "Self-host your own instance, or use an instance from someone you trust." | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -410,17 +410,17 @@ msgid "Settings" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:41 | #: lib/cannery_web/live/ammo_group_live/show.ex:39 | ||||||
| msgid "Show Ammo group" | msgid "Show Ammo group" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_type_live/show.ex:46 | #: lib/cannery_web/live/ammo_type_live/show.ex:44 | ||||||
| msgid "Show Ammo type" | msgid "Show Ammo type" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:80 | #: lib/cannery_web/live/home_live.ex:75 | ||||||
| msgid "Simple:" | msgid "Simple:" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -436,7 +436,7 @@ msgstr "" | |||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/components/topbar.ex:38 | #: lib/cannery_web/components/topbar.ex:38 | ||||||
| #: lib/cannery_web/live/tag_live/index.ex:34 | #: lib/cannery_web/live/tag_live/index.ex:32 | ||||||
| #: lib/cannery_web/live/tag_live/index.html.heex:3 | #: lib/cannery_web/live/tag_live/index.html.heex:3 | ||||||
| msgid "Tags" | msgid "Tags" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -452,7 +452,7 @@ msgid "Text color" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:49 | #: lib/cannery_web/live/home_live.ex:44 | ||||||
| msgid "The self-hosted firearm tracker website" | msgid "The self-hosted firearm tracker website" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -496,12 +496,12 @@ msgid "Uses left" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:45 | #: lib/cannery_web/live/home_live.ex:40 | ||||||
| msgid "Welcome to %{name}" | msgid "Welcome to %{name}" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:74 | #: lib/cannery_web/live/home_live.ex:69 | ||||||
| msgid "Your data stays with you, period" | msgid "Your data stays with you, period" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -522,8 +522,8 @@ msgid "Range day" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:91 | #: lib/cannery_web/live/ammo_group_live/show.ex:89 | ||||||
| #: lib/cannery_web/live/range_live/index.ex:85 | #: lib/cannery_web/live/range_live/index.ex:83 | ||||||
| msgid "Date" | msgid "Date" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -572,13 +572,13 @@ msgid "Date (UTC)" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:39 | #: lib/cannery_web/live/ammo_group_live/show.ex:37 | ||||||
| #: lib/cannery_web/live/range_live/index.ex:34 | #: lib/cannery_web/live/range_live/index.ex:32 | ||||||
| msgid "Edit Shot Records" | msgid "Edit Shot Records" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/range_live/index.ex:40 | #: lib/cannery_web/live/range_live/index.ex:38 | ||||||
| msgid "New Shot Records" | msgid "New Shot Records" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -593,19 +593,19 @@ msgid "Rounds left" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:89 | #: lib/cannery_web/live/ammo_group_live/show.ex:87 | ||||||
| #: lib/cannery_web/live/range_live/index.ex:83 | #: lib/cannery_web/live/range_live/index.ex:81 | ||||||
| msgid "Rounds shot" | msgid "Rounds shot" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/range_live/index.ex:46 | #: lib/cannery_web/live/range_live/index.ex:44 | ||||||
| msgid "Shot Records" | msgid "Shot Records" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:32 | #: lib/cannery_web/live/ammo_group_live/index.ex:32 | ||||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:40 | #: lib/cannery_web/live/ammo_group_live/show.ex:38 | ||||||
| msgid "Move Ammo group" | msgid "Move Ammo group" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -675,18 +675,18 @@ msgid "UPC" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:80 | #: lib/cannery_web/templates/user_settings/edit.html.heex:78 | ||||||
| msgid "Confirm new password" | msgid "Confirm new password" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:33 | #: lib/cannery_web/templates/user_settings/edit.html.heex:32 | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:89 | #: lib/cannery_web/templates/user_settings/edit.html.heex:87 | ||||||
| msgid "Current password" | msgid "Current password" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:73 | #: lib/cannery_web/templates/user_settings/edit.html.heex:71 | ||||||
| msgid "New password" | msgid "New password" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -718,14 +718,14 @@ msgid "Loading..." | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/container_live/index.ex:29 | #: lib/cannery_web/live/container_live/index.ex:27 | ||||||
| #: lib/cannery_web/live/container_live/show.ex:97 | #: lib/cannery_web/live/container_live/show.ex:95 | ||||||
| msgid "Edit %{name}" | msgid "Edit %{name}" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/container_live/index.ex:48 | #: lib/cannery_web/live/container_live/index.ex:46 | ||||||
| #: lib/cannery_web/live/container_live/show.ex:98 | #: lib/cannery_web/live/container_live/show.ex:96 | ||||||
| msgid "Edit %{name} tags" | msgid "Edit %{name} tags" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -735,7 +735,7 @@ msgid "Rounds:" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/container_live/show.ex:96 | #: lib/cannery_web/live/container_live/show.ex:94 | ||||||
| msgid "Show %{name}" | msgid "Show %{name}" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -816,8 +816,8 @@ msgid "Reset your password" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:38 | #: lib/cannery_web/live/ammo_group_live/show.ex:36 | ||||||
| #: lib/cannery_web/live/range_live/index.ex:28 | #: lib/cannery_web/live/range_live/index.ex:26 | ||||||
| msgid "Record Shots" | msgid "Record Shots" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -847,3 +847,26 @@ msgstr "" | |||||||
| #: lib/cannery_web/components/user_card.ex:30 | #: lib/cannery_web/components/user_card.ex:30 | ||||||
| msgid "User registered on" | msgid "User registered on" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|  | #, elixir-autogen, elixir-format | ||||||
|  | #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||||
|  | #: lib/cannery_web/templates/user_settings/edit.html.heex:129 | ||||||
|  | msgid "English" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #, elixir-autogen, elixir-format | ||||||
|  | #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||||
|  | #: lib/cannery_web/templates/user_settings/edit.html.heex:129 | ||||||
|  | msgid "French" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #, elixir-autogen, elixir-format | ||||||
|  | #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||||
|  | #: lib/cannery_web/templates/user_settings/edit.html.heex:129 | ||||||
|  | msgid "German" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #, elixir-autogen, elixir-format | ||||||
|  | #: lib/cannery_web/templates/user_registration/new.html.heex:33 | ||||||
|  | msgid "Language" | ||||||
|  | msgstr "" | ||||||
|   | |||||||
| @@ -16,18 +16,18 @@ msgid "Container must be empty before deleting" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/container_live/index.ex:71 | #: lib/cannery_web/live/container_live/index.ex:69 | ||||||
| #: lib/cannery_web/live/container_live/show.ex:73 | #: lib/cannery_web/live/container_live/show.ex:71 | ||||||
| msgid "Could not delete %{name}: %{error}" | msgid "Could not delete %{name}: %{error}" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/container_live/index.ex:59 | #: lib/cannery_web/live/container_live/index.ex:57 | ||||||
| msgid "Could not find that container" | msgid "Could not find that container" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:67 | #: lib/cannery_web/controllers/user_settings_controller.ex:84 | ||||||
| msgid "Email change link is invalid or it has expired." | msgid "Email change link is invalid or it has expired." | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -59,8 +59,9 @@ msgstr "" | |||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:16 | #: lib/cannery_web/templates/user_registration/new.html.heex:16 | ||||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:16 | #: lib/cannery_web/templates/user_reset_password/edit.html.heex:16 | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:22 | #: lib/cannery_web/templates/user_settings/edit.html.heex:21 | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:66 | #: lib/cannery_web/templates/user_settings/edit.html.heex:64 | ||||||
|  | #: lib/cannery_web/templates/user_settings/edit.html.heex:119 | ||||||
| msgid "Oops, something went wrong! Please check the errors below." | msgid "Oops, something went wrong! Please check the errors below." | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -82,7 +83,7 @@ msgid "Sorry, this invite was not found or expired" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:82 | #: lib/cannery_web/controllers/user_settings_controller.ex:99 | ||||||
| msgid "Unable to delete user" | msgid "Unable to delete user" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -97,7 +98,7 @@ msgid "User confirmation link is invalid or it has expired." | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/invite_live/index.ex:20 | #: lib/cannery_web/live/invite_live/index.ex:18 | ||||||
| msgid "You are not authorized to view this page" | msgid "You are not authorized to view this page" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -107,22 +108,22 @@ msgid "You are not authorized to view this page." | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery/accounts/user.ex:128 | #: lib/cannery/accounts/user.ex:130 | ||||||
| msgid "did not change" | msgid "did not change" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery/accounts/user.ex:149 | #: lib/cannery/accounts/user.ex:151 | ||||||
| msgid "does not match password" | msgid "does not match password" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery/accounts/user.ex:186 | #: lib/cannery/accounts/user.ex:188 | ||||||
| msgid "is not valid" | msgid "is not valid" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery/accounts/user.ex:82 | #: lib/cannery/accounts/user.ex:84 | ||||||
| msgid "must have the @ sign and no spaces" | msgid "must have the @ sign and no spaces" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -20,31 +20,31 @@ msgstr "" | |||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:41 | #: lib/cannery_web/live/ammo_type_live/index.ex:41 | ||||||
| #: lib/cannery_web/live/ammo_type_live/show.ex:40 | #: lib/cannery_web/live/ammo_type_live/show.ex:38 | ||||||
| #: lib/cannery_web/live/invite_live/index.ex:55 | #: lib/cannery_web/live/invite_live/index.ex:53 | ||||||
| #: lib/cannery_web/live/invite_live/index.ex:135 | #: lib/cannery_web/live/invite_live/index.ex:133 | ||||||
| #: lib/cannery_web/live/tag_live/index.ex:40 | #: lib/cannery_web/live/tag_live/index.ex:38 | ||||||
| msgid "%{name} deleted succesfully" | msgid "%{name} deleted succesfully" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/invite_live/index.ex:111 | #: lib/cannery_web/live/invite_live/index.ex:109 | ||||||
| msgid "%{name} disabled succesfully" | msgid "%{name} disabled succesfully" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/invite_live/index.ex:89 | #: lib/cannery_web/live/invite_live/index.ex:87 | ||||||
| msgid "%{name} enabled succesfully" | msgid "%{name} enabled succesfully" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/container_live/index.ex:64 | #: lib/cannery_web/live/container_live/index.ex:62 | ||||||
| #: lib/cannery_web/live/container_live/show.ex:63 | #: lib/cannery_web/live/container_live/show.ex:61 | ||||||
| msgid "%{name} has been deleted" | msgid "%{name} has been deleted" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/invite_live/index.ex:69 | #: lib/cannery_web/live/invite_live/index.ex:67 | ||||||
| msgid "%{name} updated succesfully" | msgid "%{name} updated succesfully" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -57,13 +57,13 @@ msgid "%{name} updated successfully" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:28 | #: lib/cannery_web/controllers/user_settings_controller.ex:29 | ||||||
| msgid "A link to confirm your email change has been sent to the new address." | msgid "A link to confirm your email change has been sent to the new address." | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:56 | #: lib/cannery_web/live/ammo_group_live/index.ex:56 | ||||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:52 | #: lib/cannery_web/live/ammo_group_live/show.ex:50 | ||||||
| msgid "Ammo group deleted succesfully" | msgid "Ammo group deleted succesfully" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -99,7 +99,7 @@ msgid "Are you sure you want to delete this ammo?" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:112 | #: lib/cannery_web/templates/user_settings/edit.html.heex:146 | ||||||
| msgid "Are you sure you want to delete your account?" | msgid "Are you sure you want to delete your account?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -114,7 +114,7 @@ msgid "Are you sure you want to make %{name} unlimited?" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:60 | #: lib/cannery_web/controllers/user_settings_controller.ex:77 | ||||||
| msgid "Email changed successfully." | msgid "Email changed successfully." | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -139,7 +139,7 @@ msgid "Password reset successfully." | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:47 | #: lib/cannery_web/controllers/user_settings_controller.ex:49 | ||||||
| msgid "Password updated successfully." | msgid "Password updated successfully." | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -149,7 +149,7 @@ msgid "Please check your email to verify your account" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/home_live.ex:101 | #: lib/cannery_web/live/home_live.ex:96 | ||||||
| msgid "Register to setup %{name}" | msgid "Register to setup %{name}" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -165,7 +165,7 @@ msgid "Saving..." | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:78 | #: lib/cannery_web/controllers/user_settings_controller.ex:95 | ||||||
| msgid "Your account has been deleted" | msgid "Your account has been deleted" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -180,7 +180,7 @@ msgid "%{name} added successfully" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/container_live/show.ex:39 | #: lib/cannery_web/live/container_live/show.ex:37 | ||||||
| msgid "%{tag_name} has been removed from %{container_name}" | msgid "%{tag_name} has been removed from %{container_name}" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -200,19 +200,19 @@ msgid "Are you sure you want to unstage this ammo?" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/range_live/index.ex:70 | #: lib/cannery_web/live/range_live/index.ex:68 | ||||||
| msgid "Ammo group unstaged succesfully" | msgid "Ammo group unstaged succesfully" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:132 | #: lib/cannery_web/live/ammo_group_live/show.ex:130 | ||||||
| #: lib/cannery_web/live/range_live/index.ex:130 | #: lib/cannery_web/live/range_live/index.ex:128 | ||||||
| msgid "Are you sure you want to delete this shot record?" | msgid "Are you sure you want to delete this shot record?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:80 | #: lib/cannery_web/live/ammo_group_live/show.ex:78 | ||||||
| #: lib/cannery_web/live/range_live/index.ex:56 | #: lib/cannery_web/live/range_live/index.ex:54 | ||||||
| msgid "Shot records deleted succesfully" | msgid "Shot records deleted succesfully" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -232,7 +232,7 @@ msgid "Ammo moved to %{name} successfully" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #, elixir-autogen, elixir-format | #, elixir-autogen, elixir-format | ||||||
| #: lib/cannery_web/live/invite_live/index.ex:123 | #: lib/cannery_web/live/invite_live/index.ex:121 | ||||||
| msgid "Copied to clipboard" | msgid "Copied to clipboard" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -258,3 +258,13 @@ msgid "Ammo group created successfully" | |||||||
| msgid_plural "Ammo groups created successfully" | msgid_plural "Ammo groups created successfully" | ||||||
| msgstr[0] "" | msgstr[0] "" | ||||||
| msgstr[1] "" | msgstr[1] "" | ||||||
|  |  | ||||||
|  | #, elixir-autogen, elixir-format | ||||||
|  | #: lib/cannery_web/templates/user_settings/edit.html.heex:136 | ||||||
|  | msgid "Are you sure you want to change your language?" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #, elixir-autogen, elixir-format | ||||||
|  | #: lib/cannery_web/controllers/user_settings_controller.ex:65 | ||||||
|  | msgid "Language updated successfully." | ||||||
|  | msgstr "" | ||||||
|   | |||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | defmodule Cannery.Repo.Migrations.AddLocaleSetting do | ||||||
|  |   use Ecto.Migration | ||||||
|  |  | ||||||
|  |   def change do | ||||||
|  |     alter table("users") do | ||||||
|  |       add :locale, :string | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
		Reference in New Issue
	
	Block a user