Compare commits
	
		
			13 Commits
		
	
	
		
			0.8.1
			...
			9c4a32896f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9c4a32896f | |||
| c8cadd6246 | |||
| 3f143262d4 | |||
| 42e2d1c76e | |||
| 064d2d3988 | |||
| f6b5fc17fa | |||
| 2c0a4dd7ca | |||
| 47dab6490d | |||
| 084173909e | |||
| 2f8af8ae4f | |||
| 2cf705c46f | |||
| 725df05521 | |||
| 3ae890c193 | 
							
								
								
									
										19
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								.drone.yml
									
									
									
									
									
								
							| @@ -13,20 +13,24 @@ steps: | ||||
|     mount: | ||||
|       - _build | ||||
|       - deps | ||||
|       - assets/node_modules/ | ||||
|       - .npm | ||||
|       - .mix | ||||
|  | ||||
| - name: test | ||||
|   image: elixir:1.14.1-alpine | ||||
|   environment: | ||||
|     TEST_DATABASE_URL: ecto://postgres:postgres@database/cannery_test | ||||
|     HOST: testing.example.tld | ||||
|     MIX_HOME: /drone/src/.mix | ||||
|     MIX_ARCHIVES: /drone/src/.mix/archives | ||||
|     MIX_ENV: test | ||||
|   commands: | ||||
|   - apk add --no-cache build-base npm git python3 | ||||
|   - mix local.rebar --force | ||||
|   - mix local.hex --force | ||||
|   - apk add --no-cache build-base npm git | ||||
|   - mix local.rebar --force --if-missing | ||||
|   - mix local.hex --force --if-missing | ||||
|   - mix deps.get | ||||
|   - mix deps.compile | ||||
|   - npm --prefix ./assets ci --progress=false --no-audit --loglevel=error | ||||
|   - npm set cache .npm | ||||
|   - npm --prefix ./assets ci --no-audit --prefer-offline | ||||
|   - npm run --prefix ./assets deploy | ||||
|   - mix do phx.digest, gettext.extract | ||||
|   - mix test.all | ||||
| @@ -76,7 +80,8 @@ steps: | ||||
|     mount: | ||||
|       - _build | ||||
|       - deps | ||||
|       - assets/node_modules/ | ||||
|       - .npm | ||||
|       - .mix | ||||
|  | ||||
| services: | ||||
| - name: database | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| elixir 1.14.1-otp-25 | ||||
| erlang 25.1.2 | ||||
| nodejs 18.12.1 | ||||
| nodejs 18.9.1 | ||||
|   | ||||
| @@ -1,3 +1,10 @@ | ||||
| # v0.8.2 | ||||
| - Fix bug with public registration | ||||
| - Improve templates | ||||
| - Improve invites, record usage | ||||
| - Fix padding on more pages when using chrome | ||||
| - Add oban metrics to server log and live dashboard | ||||
|  | ||||
| # v0.8.1 | ||||
| - Update dependencies | ||||
| - Show topbar on form submit/page refresh | ||||
|   | ||||
| @@ -3,8 +3,8 @@ | ||||
|   "description": " ", | ||||
|   "license": "MIT", | ||||
|   "engines": { | ||||
|     "node": "18.12.1", | ||||
|     "npm": "8.19.2" | ||||
|     "node": "v18.9.1", | ||||
|     "npm": "8.10.0" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "deploy": "NODE_ENV=production webpack --mode production", | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 14 KiB | 
| @@ -11,6 +11,8 @@ config :cannery, | ||||
|   ecto_repos: [Cannery.Repo], | ||||
|   generators: [binary_id: true] | ||||
|  | ||||
| config :cannery, Cannery.Accounts, registration: System.get_env("REGISTRATION", "invite") | ||||
|  | ||||
| # Configures the endpoint | ||||
| config :cannery, CanneryWeb.Endpoint, | ||||
|   url: [scheme: "https", host: System.get_env("HOST") || "localhost", port: "443"], | ||||
| @@ -18,8 +20,7 @@ config :cannery, CanneryWeb.Endpoint, | ||||
|   secret_key_base: "KH59P0iZixX5gP/u+zkxxG8vAAj6vgt0YqnwEB5JP5K+E567SsqkCz69uWShjE7I", | ||||
|   render_errors: [view: CanneryWeb.ErrorView, accepts: ~w(html json), layout: false], | ||||
|   pubsub_server: Cannery.PubSub, | ||||
|   live_view: [signing_salt: "zOLgd3lr"], | ||||
|   registration: System.get_env("REGISTRATION") || "invite" | ||||
|   live_view: [signing_salt: "zOLgd3lr"] | ||||
|  | ||||
| config :cannery, Cannery.Application, automigrate: false | ||||
|  | ||||
|   | ||||
| @@ -64,8 +64,9 @@ config :cannery, CanneryWeb.Endpoint, | ||||
|     ] | ||||
|   ] | ||||
|  | ||||
| # Do not include metadata nor timestamps in development logs | ||||
| config :logger, :console, format: "[$level] $message\n" | ||||
| config :logger, :console, | ||||
|   format: "[$level] $message $metadata\n\n", | ||||
|   metadata: [:data] | ||||
|  | ||||
| # Set a higher stacktrace during development. Avoid configuring such | ||||
| # in production as building large stacktraces may be expensive. | ||||
|   | ||||
| @@ -52,8 +52,11 @@ config :cannery, CanneryWeb.Endpoint, | ||||
|     ip: interface, | ||||
|     port: String.to_integer(System.get_env("PORT", "4000")) | ||||
|   ], | ||||
|   server: true, | ||||
|   registration: System.get_env("REGISTRATION", "invite") | ||||
|   server: true | ||||
|  | ||||
| if config_env() in [:dev, :prod] do | ||||
|   config :cannery, Cannery.Accounts, registration: System.get_env("REGISTRATION", "invite") | ||||
| end | ||||
|  | ||||
| if config_env() == :prod do | ||||
|   # The secret key base is used to sign/encrypt cookies and other secrets. | ||||
|   | ||||
| @@ -22,6 +22,9 @@ config :cannery, CanneryWeb.Endpoint, | ||||
| # In test we don't send emails. | ||||
| config :cannery, Cannery.Mailer, adapter: Swoosh.Adapters.Test | ||||
|  | ||||
| # Don't require invites for signups | ||||
| config :cannery, Cannery.Accounts, registration: "public" | ||||
|  | ||||
| # Print only warnings and errors during test | ||||
| config :logger, level: :warn | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   import Ecto.Query, warn: false | ||||
|   alias Cannery.{Mailer, Repo} | ||||
|   alias Cannery.Accounts.{User, UserToken} | ||||
|   alias Cannery.Accounts.{Invite, Invites, User, UserToken} | ||||
|   alias Ecto.{Changeset, Multi} | ||||
|   alias Oban.Job | ||||
|  | ||||
| @@ -16,23 +16,27 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> get_user_by_email("foo@example.com") | ||||
|       %User{} | ||||
|       iex> register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with %User{} <- get_user_by_email("foo@example.com"), do: :passed | ||||
|       :passed | ||||
|  | ||||
|       iex> get_user_by_email("unknown@example.com") | ||||
|       nil | ||||
|  | ||||
|   """ | ||||
|   @spec get_user_by_email(email :: String.t()) :: User.t() | nil | ||||
|   def get_user_by_email(email) when is_binary(email), do: Repo.get_by(User, email: email) | ||||
|   def get_user_by_email(email) when is_binary(email) do | ||||
|     Repo.get_by(User, email: email) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Gets a user by email and password. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> get_user_by_email_and_password("foo@example.com", "correct_password") | ||||
|       %User{} | ||||
|       iex> register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with %User{} <- get_user_by_email_and_password("foo@example.com", "valid_password"), do: :passed | ||||
|       :passed | ||||
|  | ||||
|       iex> get_user_by_email_and_password("foo@example.com", "invalid_password") | ||||
|       nil | ||||
| @@ -53,28 +57,33 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> get_user!(123) | ||||
|       %User{} | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> get_user!(user.id) | ||||
|       user | ||||
|  | ||||
|       iex> get_user!(456) | ||||
|       > get_user!() | ||||
|       ** (Ecto.NoResultsError) | ||||
|  | ||||
|   """ | ||||
|   @spec get_user!(User.t()) :: User.t() | ||||
|   def get_user!(id), do: Repo.get!(User, id) | ||||
|   def get_user!(id) do | ||||
|     Repo.get!(User, id) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Returns all users grouped by role. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> list_users_by_role(%User{id: 123, role: :admin}) | ||||
|       [admin: [%User{}], user: [%User{}, %User{}]] | ||||
|       iex> {:ok, user1} = register_user(%{email: "foo1@example.com", password: "valid_password"}) | ||||
|       iex> {:ok, user2} = register_user(%{email: "foo2@example.com", password: "valid_password"}) | ||||
|       iex> with %{admin: [^user1], user: [^user2]} <- list_all_users_by_role(user1), do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec list_all_users_by_role(User.t()) :: %{String.t() => [User.t()]} | ||||
|   @spec list_all_users_by_role(User.t()) :: %{User.role() => [User.t()]} | ||||
|   def list_all_users_by_role(%User{role: :admin}) do | ||||
|     Repo.all(from u in User, order_by: u.email) |> Enum.group_by(fn user -> user.role end) | ||||
|     Repo.all(from u in User, order_by: u.email) |> Enum.group_by(fn %{role: role} -> role end) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
| @@ -82,13 +91,13 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> list_users_by_role(%User{id: 123, role: :admin}) | ||||
|       [%User{}] | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with [^user] <- list_users_by_role(:admin), do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec list_users_by_role(User.role()) :: [User.t()] | ||||
|   def list_users_by_role(role) do | ||||
|     role = role |> to_string() | ||||
|   @spec list_users_by_role(:admin) :: [User.t()] | ||||
|   def list_users_by_role(:admin = role) do | ||||
|     Repo.all(from u in User, where: u.role == ^role, order_by: u.email) | ||||
|   end | ||||
|  | ||||
| @@ -99,26 +108,38 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> register_user(%{field: value}) | ||||
|       {:ok, %User{}} | ||||
|       iex> with {:ok, %User{email: "foo@example.com"}} <- | ||||
|       ...>        register_user(%{email: "foo@example.com", password: "valid_password"}), | ||||
|       ...>      do: :passed | ||||
|       :passed | ||||
|  | ||||
|       iex> register_user(%{field: bad_value}) | ||||
|       {:error, %Changeset{}} | ||||
|       iex> with {:error, %Changeset{}} <- register_user(%{email: "foo@example"}), do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec register_user(attrs :: map()) :: {:ok, User.t()} | {:error, User.changeset()} | ||||
|   def register_user(attrs) do | ||||
|   @spec register_user(attrs :: map()) :: | ||||
|           {:ok, User.t()} | {:error, :invalid_token | User.changeset()} | ||||
|   @spec register_user(attrs :: map(), Invite.token() | nil) :: | ||||
|           {:ok, User.t()} | {:error, :invalid_token | User.changeset()} | ||||
|   def register_user(attrs, invite_token \\ nil) do | ||||
|     Multi.new() | ||||
|     |> Multi.one(:users_count, from(u in User, select: count(u.id), distinct: true)) | ||||
|     |> Multi.insert(:add_user, fn %{users_count: count} -> | ||||
|     |> Multi.run(:use_invite, fn _changes_so_far, _repo -> | ||||
|       if allow_registration?() and invite_token |> is_nil() do | ||||
|         {:ok, nil} | ||||
|       else | ||||
|         Invites.use_invite(invite_token) | ||||
|       end | ||||
|     end) | ||||
|     |> Multi.insert(:add_user, fn %{users_count: count, use_invite: invite} -> | ||||
|       # if no registered users, make first user an admin | ||||
|       role = if count == 0, do: "admin", else: "user" | ||||
|  | ||||
|       User.registration_changeset(attrs) |> User.role_changeset(role) | ||||
|       role = if count == 0, do: :admin, else: :user | ||||
|       User.registration_changeset(attrs, invite) |> User.role_changeset(role) | ||||
|     end) | ||||
|     |> Repo.transaction() | ||||
|     |> case do | ||||
|       {:ok, %{add_user: user}} -> {:ok, user} | ||||
|       {:error, :use_invite, :invalid_token, _changes_so_far} -> {:error, :invalid_token} | ||||
|       {:error, :add_user, changeset, _changes_so_far} -> {:error, changeset} | ||||
|     end | ||||
|   end | ||||
| @@ -128,14 +149,18 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> change_user_registration(user) | ||||
|       %Changeset{data: %User{}} | ||||
|       iex> with %Changeset{} <- change_user_registration(), do: :passed | ||||
|       :passed | ||||
|  | ||||
|       iex> with %Changeset{} <- change_user_registration(%{password: "hi"}), do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec change_user_registration() :: User.changeset() | ||||
|   @spec change_user_registration(attrs :: map()) :: User.changeset() | ||||
|   def change_user_registration(attrs \\ %{}), | ||||
|     do: User.registration_changeset(attrs, hash_password: false) | ||||
|   def change_user_registration(attrs \\ %{}) do | ||||
|     User.registration_changeset(attrs, nil, hash_password: false) | ||||
|   end | ||||
|  | ||||
|   ## Settings | ||||
|  | ||||
| @@ -144,25 +169,29 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> change_user_email(user) | ||||
|       %Changeset{data: %User{}} | ||||
|       iex> with %Changeset{} <- change_user_email(%User{email: "foo@example.com"}), do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec change_user_email(User.t()) :: User.changeset() | ||||
|   @spec change_user_email(User.t(), attrs :: map()) :: User.changeset() | ||||
|   def change_user_email(user, attrs \\ %{}), do: User.email_changeset(user, attrs) | ||||
|   def change_user_email(user, attrs \\ %{}) do | ||||
|     User.email_changeset(user, attrs) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Returns an `%Changeset{}` for changing the user role. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> change_user_role(user) | ||||
|       %Changeset{data: %User{}} | ||||
|       iex> with %Changeset{} <- change_user_role(%User{}, :user), do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec change_user_role(User.t(), User.role()) :: User.changeset() | ||||
|   def change_user_role(user, role), do: User.role_changeset(user, role) | ||||
|   def change_user_role(user, role) do | ||||
|     User.role_changeset(user, role) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Emulates that the email will change without actually changing | ||||
| @@ -170,11 +199,17 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> apply_user_email(user, "valid password", %{email: ...}) | ||||
|       {:ok, %User{}} | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with {:ok, %User{}} <- | ||||
|       ...>        apply_user_email(user, "valid_password", %{email: "new_email@account.com"}), | ||||
|       ...>      do: :passed | ||||
|       :passed | ||||
|  | ||||
|       iex> apply_user_email(user, "invalid password", %{email: ...}) | ||||
|       {:error, %Changeset{}} | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with {:error, %Changeset{}} <- | ||||
|       ...>        apply_user_email(user, "invalid password", %{email: "new_email@account"}), | ||||
|       ...>      do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec apply_user_email(User.t(), email :: String.t(), attrs :: map()) :: | ||||
| @@ -219,8 +254,12 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> deliver_update_email_instructions(user, current_email, &Routes.user_update_email_url(conn, :edit, &1)) | ||||
|       {:ok, %{to: ..., body: ...}} | ||||
|       iex> {:ok, %{id: user_id} = user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with %Oban.Job{ | ||||
|       ...>        args: %{email: :update_email, user_id: ^user_id, attrs: %{url: "example url"}} | ||||
|       ...>      } <- deliver_update_email_instructions(user, "new_foo@example.com", fn _token -> "example url" end), | ||||
|       ...>      do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec deliver_update_email_instructions(User.t(), current_email :: String.t(), function) :: | ||||
| @@ -237,24 +276,34 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> change_user_password(user) | ||||
|       %Changeset{data: %User{}} | ||||
|       iex> with %Changeset{} <- change_user_password(%User{}), do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec change_user_password(User.t(), attrs :: map()) :: User.changeset() | ||||
|   def change_user_password(user, attrs \\ %{}), | ||||
|     do: User.password_changeset(user, attrs, hash_password: false) | ||||
|   def change_user_password(user, attrs \\ %{}) do | ||||
|     User.password_changeset(user, attrs, hash_password: false) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Updates the user password. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> update_user_password(user, "valid password", %{password: ...}) | ||||
|       {:ok, %User{}} | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with {:ok, %User{}} <- | ||||
|       ...>         reset_user_password(user, %{ | ||||
|       ...>           password: "new password", | ||||
|       ...>           password_confirmation: "new password" | ||||
|       ...>         }), | ||||
|       ...>      do: :passed | ||||
|       :passed | ||||
|  | ||||
|       iex> update_user_password(user, "invalid password", %{password: ...}) | ||||
|       {:error, %Changeset{}} | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with {:error, %Changeset{}} <- | ||||
|       ...>        update_user_password(user, "invalid password", %{password: "123"}), | ||||
|       ...>      do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec update_user_password(User.t(), String.t(), attrs :: map()) :: | ||||
| @@ -276,49 +325,57 @@ defmodule Cannery.Accounts do | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Returns an `%Changeset{}` for changing the user locale. | ||||
|   Returns an `Ecto.Changeset.t()` for changing the user locale. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> change_user_locale(user) | ||||
|       %Changeset{data: %User{}} | ||||
|       iex> with %Changeset{} <- change_user_locale(%User{}), do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec change_user_locale(User.t()) :: User.changeset() | ||||
|   def change_user_locale(%{locale: locale} = user), do: User.locale_changeset(user, locale) | ||||
|   def change_user_locale(%{locale: locale} = user) do | ||||
|     User.locale_changeset(user, locale) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Updates the user locale. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> update_user_locale(user, "valid locale") | ||||
|       {:ok, %User{}} | ||||
|  | ||||
|       iex> update_user_password(user, "invalid locale") | ||||
|       {:error, %Changeset{}} | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with {:ok, %User{}} <- update_user_locale(user, "en_US"), do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec update_user_locale(User.t(), locale :: String.t()) :: | ||||
|           {:ok, User.t()} | {:error, User.changeset()} | ||||
|   def update_user_locale(user, locale), | ||||
|     do: user |> User.locale_changeset(locale) |> Repo.update() | ||||
|   def update_user_locale(user, locale) do | ||||
|     user |> User.locale_changeset(locale) |> Repo.update() | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Deletes a user. must be performed by an admin or the same user! | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> delete_user!(user_to_delete, %User{id: 123, role: :admin}) | ||||
|       %User{} | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with %User{} <- delete_user!(user, %User{id: 123, role: :admin}), do: :passed | ||||
|       :passed | ||||
|  | ||||
|       iex> delete_user!(%User{id: 123}, %User{id: 123}) | ||||
|       %User{} | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with %User{} <- delete_user!(user, user), do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec delete_user!(user_to_delete :: User.t(), User.t()) :: User.t() | ||||
|   def delete_user!(user, %User{role: :admin}), do: user |> Repo.delete!() | ||||
|   def delete_user!(%User{id: user_id} = user, %User{id: user_id}), do: user |> Repo.delete!() | ||||
|   def delete_user!(user, %User{role: :admin}) do | ||||
|     user |> Repo.delete!() | ||||
|   end | ||||
|  | ||||
|   def delete_user!(%User{id: user_id} = user, %User{id: user_id}) do | ||||
|     user |> Repo.delete!() | ||||
|   end | ||||
|  | ||||
|   ## Session | ||||
|  | ||||
| @@ -346,7 +403,7 @@ defmodule Cannery.Accounts do | ||||
|   """ | ||||
|   @spec delete_session_token(token :: String.t()) :: :ok | ||||
|   def delete_session_token(token) do | ||||
|     Repo.delete_all(UserToken.token_and_context_query(token, "session")) | ||||
|     UserToken.token_and_context_query(token, "session") |> Repo.delete_all() | ||||
|     :ok | ||||
|   end | ||||
|  | ||||
| @@ -355,19 +412,45 @@ defmodule Cannery.Accounts do | ||||
|   """ | ||||
|   @spec allow_registration?() :: boolean() | ||||
|   def allow_registration? do | ||||
|     Application.get_env(:cannery, CanneryWeb.Endpoint)[:registration] == "public" or | ||||
|     Application.get_env(:cannery, Cannery.Accounts)[:registration] == "public" or | ||||
|       list_users_by_role(:admin) |> Enum.empty?() | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Checks if user is an admin | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> is_admin?(user) | ||||
|       true | ||||
|  | ||||
|       iex> is_admin?(%User{id: Ecto.UUID.generate()}) | ||||
|       false | ||||
|  | ||||
|   """ | ||||
|   @spec is_admin?(User.t()) :: boolean() | ||||
|   def is_admin?(%User{id: user_id}) do | ||||
|     Repo.one(from u in User, where: u.id == ^user_id and u.role == :admin) | ||||
|     |> is_nil() | ||||
|     Repo.exists?(from u in User, where: u.id == ^user_id, where: u.role == :admin) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Checks to see if user has the admin role | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> is_already_admin?(user) | ||||
|       true | ||||
|  | ||||
|       iex> is_already_admin?(%User{}) | ||||
|       false | ||||
|  | ||||
|   """ | ||||
|   @spec is_already_admin?(User.t() | nil) :: boolean() | ||||
|   def is_already_admin?(%User{role: :admin}), do: true | ||||
|   def is_already_admin?(_invalid_user), do: false | ||||
|  | ||||
|   ## Confirmation | ||||
|  | ||||
|   @doc """ | ||||
| @@ -375,10 +458,16 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> deliver_user_confirmation_instructions(user, &Routes.user_confirmation_url(conn, :confirm, &1)) | ||||
|       {:ok, %{to: ..., body: ...}} | ||||
|       iex> {:ok, %{id: user_id} = user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with %Oban.Job{ | ||||
|       ...>   args: %{email: :welcome, user_id: ^user_id, attrs: %{url: "example url"}} | ||||
|       ...> } <- deliver_user_confirmation_instructions(user, fn _token -> "example url" end), | ||||
|       ...> do: :passed | ||||
|       :passed | ||||
|  | ||||
|       iex> deliver_user_confirmation_instructions(confirmed_user, &Routes.user_confirmation_url(conn, :confirm, &1)) | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> user = user |> User.confirm_changeset() |> Repo.update!() | ||||
|       iex> deliver_user_confirmation_instructions(user, fn _token -> "example url" end) | ||||
|       {:error, :already_confirmed} | ||||
|  | ||||
|   """ | ||||
| @@ -425,8 +514,12 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> deliver_user_reset_password_instructions(user, &Routes.user_reset_password_url(conn, :edit, &1)) | ||||
|       {:ok, %{to: ..., body: ...}} | ||||
|       iex> {:ok, %{id: user_id} = user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with %Oban.Job{args: %{ | ||||
|       ...>        email: :reset_password, user_id: ^user_id, attrs: %{url: "example url"}} | ||||
|       ...>    } <- deliver_user_reset_password_instructions(user, fn _token -> "example url" end), | ||||
|       ...>    do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec deliver_user_reset_password_instructions(User.t(), function()) :: Job.t() | ||||
| @@ -442,8 +535,11 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> get_user_by_reset_password_token("validtoken") | ||||
|       %User{} | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> {encoded_token, user_token} = UserToken.build_email_token(user, "reset_password") | ||||
|       iex> Repo.insert!(user_token) | ||||
|       iex> with %User{} <- get_user_by_reset_password_token(encoded_token), do: :passed | ||||
|       :passed | ||||
|  | ||||
|       iex> get_user_by_reset_password_token("invalidtoken") | ||||
|       nil | ||||
| @@ -464,11 +560,20 @@ defmodule Cannery.Accounts do | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> reset_user_password(user, %{password: "new long password", password_confirmation: "new long password"}) | ||||
|       {:ok, %User{}} | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with {:ok, %User{}} <- | ||||
|       ...>         reset_user_password(user, %{ | ||||
|       ...>           password: "new password", | ||||
|       ...>           password_confirmation: "new password" | ||||
|       ...>         }), | ||||
|       ...>      do: :passed | ||||
|       :passed | ||||
|  | ||||
|       iex> reset_user_password(user, %{password: "valid", password_confirmation: "not the same"}) | ||||
|       {:error, %Changeset{}} | ||||
|       iex> {:ok, user} = register_user(%{email: "foo@example.com", password: "valid_password"}) | ||||
|       iex> with {:error, %Changeset{}} <- | ||||
|       ...>        reset_user_password(user, %{password: "valid", password_confirmation: "not the same"}), | ||||
|       ...>      do: :passed | ||||
|       :passed | ||||
|  | ||||
|   """ | ||||
|   @spec reset_user_password(User.t(), attrs :: map()) :: | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| defmodule Cannery.Invites.Invite do | ||||
| defmodule Cannery.Accounts.Invite do | ||||
|   @moduledoc """ | ||||
|   An invite, created by an admin to allow someone to join their instance. An | ||||
|   invite can be enabled or disabled, and can have an optional number of uses if | ||||
| @@ -7,8 +7,8 @@ defmodule Cannery.Invites.Invite do | ||||
| 
 | ||||
|   use Ecto.Schema | ||||
|   import Ecto.Changeset | ||||
|   alias Ecto.{Changeset, UUID} | ||||
|   alias Cannery.{Accounts.User, Invites.Invite} | ||||
|   alias Cannery.Accounts.User | ||||
|   alias Ecto.{Association, Changeset, UUID} | ||||
| 
 | ||||
|   @primary_key {:id, :binary_id, autogenerate: true} | ||||
|   @foreign_key_type :binary_id | ||||
| @@ -18,33 +18,37 @@ defmodule Cannery.Invites.Invite do | ||||
|     field :uses_left, :integer, default: nil | ||||
|     field :disabled_at, :naive_datetime | ||||
| 
 | ||||
|     belongs_to :user, User | ||||
|     belongs_to :created_by, User | ||||
| 
 | ||||
|     has_many :users, User | ||||
| 
 | ||||
|     timestamps() | ||||
|   end | ||||
| 
 | ||||
|   @type t :: %Invite{ | ||||
|   @type t :: %__MODULE__{ | ||||
|           id: id(), | ||||
|           name: String.t(), | ||||
|           token: String.t(), | ||||
|           token: token(), | ||||
|           uses_left: integer() | nil, | ||||
|           disabled_at: NaiveDateTime.t(), | ||||
|           user: User.t(), | ||||
|           user_id: User.id(), | ||||
|           created_by: User.t() | nil | Association.NotLoaded.t(), | ||||
|           created_by_id: User.id() | nil, | ||||
|           users: [User.t()] | Association.NotLoaded.t(), | ||||
|           inserted_at: NaiveDateTime.t(), | ||||
|           updated_at: NaiveDateTime.t() | ||||
|         } | ||||
|   @type new_invite :: %Invite{} | ||||
|   @type new_invite :: %__MODULE__{} | ||||
|   @type id :: UUID.t() | ||||
|   @type changeset :: Changeset.t(t() | new_invite()) | ||||
|   @type token :: String.t() | ||||
| 
 | ||||
|   @doc false | ||||
|   @spec create_changeset(User.t(), token :: binary(), attrs :: map()) :: changeset() | ||||
|   @spec create_changeset(User.t(), token(), attrs :: map()) :: changeset() | ||||
|   def create_changeset(%User{id: user_id}, token, attrs) do | ||||
|     %Invite{} | ||||
|     |> change(token: token, user_id: user_id) | ||||
|     %__MODULE__{} | ||||
|     |> change(token: token, created_by_id: user_id) | ||||
|     |> cast(attrs, [:name, :uses_left, :disabled_at]) | ||||
|     |> validate_required([:name, :token, :user_id]) | ||||
|     |> validate_required([:name, :token, :created_by_id]) | ||||
|     |> validate_number(:uses_left, greater_than_or_equal_to: 0) | ||||
|   end | ||||
| 
 | ||||
							
								
								
									
										198
									
								
								lib/cannery/accounts/invites.ex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								lib/cannery/accounts/invites.ex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,198 @@ | ||||
| defmodule Cannery.Accounts.Invites do | ||||
|   @moduledoc """ | ||||
|   The Invites context. | ||||
|   """ | ||||
|  | ||||
|   import Ecto.Query, warn: false | ||||
|   alias Ecto.Multi | ||||
|   alias Cannery.Accounts.{Invite, User} | ||||
|   alias Cannery.Repo | ||||
|  | ||||
|   @invite_token_length 20 | ||||
|  | ||||
|   @doc """ | ||||
|   Returns the list of invites. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> list_invites(%User{id: 123, role: :admin}) | ||||
|       [%Invite{}, ...] | ||||
|  | ||||
|   """ | ||||
|   @spec list_invites(User.t()) :: [Invite.t()] | ||||
|   def list_invites(%User{role: :admin}) do | ||||
|     Repo.all(from i in Invite, order_by: i.name) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Gets a single invite for a user | ||||
|  | ||||
|   Raises `Ecto.NoResultsError` if the Invite does not exist. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> get_invite!(123, %User{id: 123, role: :admin}) | ||||
|       %Invite{} | ||||
|  | ||||
|       > get_invite!(456, %User{id: 123, role: :admin}) | ||||
|       ** (Ecto.NoResultsError) | ||||
|  | ||||
|   """ | ||||
|   @spec get_invite!(Invite.id(), User.t()) :: Invite.t() | ||||
|   def get_invite!(id, %User{role: :admin}) do | ||||
|     Repo.get!(Invite, id) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Returns if an invite token is still valid | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> valid_invite_token?("valid_token") | ||||
|       %Invite{} | ||||
|  | ||||
|       iex> valid_invite_token?("invalid_token") | ||||
|       nil | ||||
|   """ | ||||
|   @spec valid_invite_token?(Invite.token() | nil) :: boolean() | ||||
|   def valid_invite_token?(token) when token in [nil, ""], do: false | ||||
|  | ||||
|   def valid_invite_token?(token) do | ||||
|     Repo.exists?( | ||||
|       from i in Invite, | ||||
|         where: i.token == ^token, | ||||
|         where: i.disabled_at |> is_nil() | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Uses invite by decrementing uses_left, or marks invite invalid if it's been | ||||
|   completely used. | ||||
|   """ | ||||
|   @spec use_invite(Invite.token()) :: {:ok, Invite.t()} | {:error, :invalid_token} | ||||
|   def use_invite(invite_token) do | ||||
|     Multi.new() | ||||
|     |> Multi.run(:invite, fn _changes_so_far, _repo -> | ||||
|       invite_token |> get_invite_by_token() | ||||
|     end) | ||||
|     |> Multi.update(:decrement_invite, fn %{invite: invite} -> | ||||
|       decrement_invite_changeset(invite) | ||||
|     end) | ||||
|     |> Repo.transaction() | ||||
|     |> case do | ||||
|       {:ok, %{decrement_invite: invite}} -> {:ok, invite} | ||||
|       {:error, :invite, :invalid_token, _changes_so_far} -> {:error, :invalid_token} | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   @spec get_invite_by_token(Invite.token() | nil) :: {:ok, Invite.t()} | {:error, :invalid_token} | ||||
|   defp get_invite_by_token(token) when token in [nil, ""], do: {:error, :invalid_token} | ||||
|  | ||||
|   defp get_invite_by_token(token) do | ||||
|     Repo.one( | ||||
|       from i in Invite, | ||||
|         where: i.token == ^token, | ||||
|         where: i.disabled_at |> is_nil() | ||||
|     ) | ||||
|     |> case do | ||||
|       nil -> {:error, :invalid_token} | ||||
|       invite -> {:ok, invite} | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   @spec get_use_count(Invite.t(), User.t()) :: non_neg_integer() | ||||
|   def get_use_count(%Invite{id: invite_id}, %User{role: :admin}) do | ||||
|     Repo.one( | ||||
|       from u in User, | ||||
|         where: u.invite_id == ^invite_id, | ||||
|         select: count(u.id) | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   @spec decrement_invite_changeset(Invite.t()) :: Invite.changeset() | ||||
|   defp decrement_invite_changeset(%Invite{uses_left: nil} = invite) do | ||||
|     invite |> Invite.update_changeset(%{}) | ||||
|   end | ||||
|  | ||||
|   defp decrement_invite_changeset(%Invite{uses_left: 1} = invite) do | ||||
|     now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) | ||||
|     invite |> Invite.update_changeset(%{uses_left: 0, disabled_at: now}) | ||||
|   end | ||||
|  | ||||
|   defp decrement_invite_changeset(%Invite{uses_left: uses_left} = invite) do | ||||
|     invite |> Invite.update_changeset(%{uses_left: uses_left - 1}) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Creates a invite. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> create_invite(%User{id: 123, role: :admin}, %{field: value}) | ||||
|       {:ok, %Invite{}} | ||||
|  | ||||
|       iex> create_invite(%User{id: 123, role: :admin}, %{field: bad_value}) | ||||
|       {:error, %Changeset{}} | ||||
|  | ||||
|   """ | ||||
|   @spec create_invite(User.t(), attrs :: map()) :: | ||||
|           {:ok, Invite.t()} | {:error, Invite.changeset()} | ||||
|   def create_invite(%User{role: :admin} = user, attrs) do | ||||
|     token = | ||||
|       :crypto.strong_rand_bytes(@invite_token_length) | ||||
|       |> Base.url_encode64() | ||||
|       |> binary_part(0, @invite_token_length) | ||||
|  | ||||
|     Invite.create_changeset(user, token, attrs) |> Repo.insert() | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Updates a invite. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> update_invite(invite, %{field: new_value}, %User{id: 123, role: :admin}) | ||||
|       {:ok, %Invite{}} | ||||
|  | ||||
|       iex> update_invite(invite, %{field: bad_value}, %User{id: 123, role: :admin}) | ||||
|       {:error, %Changeset{}} | ||||
|  | ||||
|   """ | ||||
|   @spec update_invite(Invite.t(), attrs :: map(), User.t()) :: | ||||
|           {:ok, Invite.t()} | {:error, Invite.changeset()} | ||||
|   def update_invite(invite, attrs, %User{role: :admin}) do | ||||
|     invite |> Invite.update_changeset(attrs) |> Repo.update() | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Deletes a invite. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> delete_invite(invite, %User{id: 123, role: :admin}) | ||||
|       {:ok, %Invite{}} | ||||
|  | ||||
|       iex> delete_invite(invite, %User{id: 123, role: :admin}) | ||||
|       {:error, %Changeset{}} | ||||
|  | ||||
|   """ | ||||
|   @spec delete_invite(Invite.t(), User.t()) :: | ||||
|           {:ok, Invite.t()} | {:error, Invite.changeset()} | ||||
|   def delete_invite(invite, %User{role: :admin}) do | ||||
|     invite |> Repo.delete() | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Deletes a invite. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> delete_invite(invite, %User{id: 123, role: :admin}) | ||||
|       %Invite{} | ||||
|  | ||||
|   """ | ||||
|   @spec delete_invite!(Invite.t(), User.t()) :: Invite.t() | ||||
|   def delete_invite!(invite, %User{role: :admin}) do | ||||
|     invite |> Repo.delete!() | ||||
|   end | ||||
| end | ||||
| @@ -1,13 +1,13 @@ | ||||
| defmodule Cannery.Accounts.User do | ||||
|   @moduledoc """ | ||||
|   A cannery user | ||||
|   A Cannery user | ||||
|   """ | ||||
|  | ||||
|   use Ecto.Schema | ||||
|   import Ecto.Changeset | ||||
|   import CanneryWeb.Gettext | ||||
|   alias Ecto.{Changeset, UUID} | ||||
|   alias Cannery.{Accounts.User, Invites.Invite} | ||||
|   alias Ecto.{Association, Changeset, UUID} | ||||
|   alias Cannery.Accounts.{Invite, User} | ||||
|  | ||||
|   @derive {Jason.Encoder, | ||||
|            only: [ | ||||
| @@ -15,7 +15,9 @@ defmodule Cannery.Accounts.User do | ||||
|              :email, | ||||
|              :confirmed_at, | ||||
|              :role, | ||||
|              :locale | ||||
|              :locale, | ||||
|              :inserted_at, | ||||
|              :updated_at | ||||
|            ]} | ||||
|   @derive {Inspect, except: [:password]} | ||||
|   @primary_key {:id, :binary_id, autogenerate: true} | ||||
| @@ -28,7 +30,9 @@ defmodule Cannery.Accounts.User do | ||||
|     field :role, Ecto.Enum, values: [:admin, :user], default: :user | ||||
|     field :locale, :string | ||||
|  | ||||
|     has_many :invites, Invite, on_delete: :delete_all | ||||
|     has_many :created_invites, Invite, foreign_key: :created_by_id | ||||
|  | ||||
|     belongs_to :invite, Invite | ||||
|  | ||||
|     timestamps() | ||||
|   end | ||||
| @@ -41,14 +45,16 @@ defmodule Cannery.Accounts.User do | ||||
|           confirmed_at: NaiveDateTime.t(), | ||||
|           role: role(), | ||||
|           locale: String.t() | nil, | ||||
|           invites: [Invite.t()], | ||||
|           created_invites: [Invite.t()] | Association.NotLoaded.t(), | ||||
|           invite: Invite.t() | nil | Association.NotLoaded.t(), | ||||
|           invite_id: Invite.id() | nil, | ||||
|           inserted_at: NaiveDateTime.t(), | ||||
|           updated_at: NaiveDateTime.t() | ||||
|         } | ||||
|   @type new_user :: %User{} | ||||
|   @type id :: UUID.t() | ||||
|   @type changeset :: Changeset.t(t() | new_user()) | ||||
|   @type role :: :admin | :user | String.t() | ||||
|   @type role :: :admin | :user | ||||
|  | ||||
|   @doc """ | ||||
|   A user changeset for registration. | ||||
| @@ -67,11 +73,12 @@ defmodule Cannery.Accounts.User do | ||||
|       validations on a LiveView form), this option can be set to `false`. | ||||
|       Defaults to `true`. | ||||
|   """ | ||||
|   @spec registration_changeset(attrs :: map()) :: changeset() | ||||
|   @spec registration_changeset(attrs :: map(), opts :: keyword()) :: changeset() | ||||
|   def registration_changeset(attrs, opts \\ []) do | ||||
|   @spec registration_changeset(attrs :: map(), Invite.t() | nil) :: changeset() | ||||
|   @spec registration_changeset(attrs :: map(), Invite.t() | nil, opts :: keyword()) :: changeset() | ||||
|   def registration_changeset(attrs, invite, opts \\ []) do | ||||
|     %User{} | ||||
|     |> cast(attrs, [:email, :password, :locale]) | ||||
|     |> put_change(:invite_id, if(invite, do: invite.id)) | ||||
|     |> validate_email() | ||||
|     |> validate_password(opts) | ||||
|   end | ||||
| @@ -81,7 +88,7 @@ defmodule Cannery.Accounts.User do | ||||
|   """ | ||||
|   @spec role_changeset(t() | new_user() | changeset(), role()) :: changeset() | ||||
|   def role_changeset(user, role) do | ||||
|     user |> cast(%{"role" => role}, [:role]) | ||||
|     user |> change(role: role) | ||||
|   end | ||||
|  | ||||
|   @spec validate_email(changeset()) :: changeset() | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| defmodule Cannery.Accounts.UserToken do | ||||
|   @moduledoc """ | ||||
|   Schema for serialized user session and authentication tokens | ||||
|   Schema for a user's session token | ||||
|   """ | ||||
|  | ||||
|   use Ecto.Schema | ||||
|   import Ecto.Query | ||||
|   alias Ecto.{Query, UUID} | ||||
|   alias Cannery.{Accounts.User, Accounts.UserToken} | ||||
|   alias Cannery.Accounts.User | ||||
|   alias Ecto.{Association, UUID} | ||||
|  | ||||
|   @hash_algorithm :sha256 | ||||
|   @rand_size 32 | ||||
| @@ -30,27 +30,27 @@ defmodule Cannery.Accounts.UserToken do | ||||
|     timestamps(updated_at: false) | ||||
|   end | ||||
|  | ||||
|   @type t :: %UserToken{ | ||||
|   @type t :: %__MODULE__{ | ||||
|           id: id(), | ||||
|           token: String.t(), | ||||
|           token: token(), | ||||
|           context: String.t(), | ||||
|           sent_to: String.t(), | ||||
|           user: User.t(), | ||||
|           user_id: User.id(), | ||||
|           user: User.t() | Association.NotLoaded.t(), | ||||
|           user_id: User.id() | nil, | ||||
|           inserted_at: NaiveDateTime.t() | ||||
|         } | ||||
|   @type new_token :: %UserToken{} | ||||
|   @type new_user_token :: %__MODULE__{} | ||||
|   @type id :: UUID.t() | ||||
|   @type token :: binary() | ||||
|  | ||||
|   @doc """ | ||||
|   Generates a token that will be stored in a signed place, | ||||
|   such as session or cookie. As they are signed, those | ||||
|   tokens do not need to be hashed. | ||||
|   """ | ||||
|   @spec build_session_token(User.t()) :: {token :: String.t(), new_token()} | ||||
|   def build_session_token(%{id: user_id}) do | ||||
|   def build_session_token(user) do | ||||
|     token = :crypto.strong_rand_bytes(@rand_size) | ||||
|     {token, %UserToken{token: token, context: "session", user_id: user_id}} | ||||
|     {token, %__MODULE__{token: token, context: "session", user_id: user.id}} | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
| @@ -58,7 +58,6 @@ defmodule Cannery.Accounts.UserToken do | ||||
|  | ||||
|   The query returns the user found by the token. | ||||
|   """ | ||||
|   @spec verify_session_token_query(token :: String.t()) :: {:ok, Query.t()} | ||||
|   def verify_session_token_query(token) do | ||||
|     query = | ||||
|       from token in token_and_context_query(token, "session"), | ||||
| @@ -77,19 +76,16 @@ defmodule Cannery.Accounts.UserToken do | ||||
|   The token is valid for a week as long as users don't change | ||||
|   their email. | ||||
|   """ | ||||
|   @spec build_email_token(User.t(), context :: String.t()) :: {token :: String.t(), new_token()} | ||||
|   def build_email_token(user, context) do | ||||
|     build_hashed_token(user, context, user.email) | ||||
|   end | ||||
|  | ||||
|   @spec build_hashed_token(User.t(), String.t(), String.t()) :: | ||||
|           {String.t(), new_token()} | ||||
|   defp build_hashed_token(user, context, sent_to) do | ||||
|     token = :crypto.strong_rand_bytes(@rand_size) | ||||
|     hashed_token = :crypto.hash(@hash_algorithm, token) | ||||
|  | ||||
|     {Base.url_encode64(token, padding: false), | ||||
|      %UserToken{ | ||||
|      %__MODULE__{ | ||||
|        token: hashed_token, | ||||
|        context: context, | ||||
|        sent_to: sent_to, | ||||
| @@ -102,8 +98,6 @@ defmodule Cannery.Accounts.UserToken do | ||||
|  | ||||
|   The query returns the user found by the token. | ||||
|   """ | ||||
|   @spec verify_email_token_query(token :: String.t(), context :: String.t()) :: | ||||
|           {:ok, Query.t()} | :error | ||||
|   def verify_email_token_query(token, context) do | ||||
|     case Base.url_decode64(token, padding: false) do | ||||
|       {:ok, decoded_token} -> | ||||
| @@ -123,7 +117,6 @@ defmodule Cannery.Accounts.UserToken do | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   @spec days_for_context(context :: <<_::56>>) :: non_neg_integer() | ||||
|   defp days_for_context("confirm"), do: @confirm_validity_in_days | ||||
|   defp days_for_context("reset_password"), do: @reset_password_validity_in_days | ||||
|  | ||||
| @@ -132,8 +125,6 @@ defmodule Cannery.Accounts.UserToken do | ||||
|  | ||||
|   The query returns the user token record. | ||||
|   """ | ||||
|   @spec verify_change_email_token_query(token :: String.t(), context :: String.t()) :: | ||||
|           {:ok, Query.t()} | :error | ||||
|   def verify_change_email_token_query(token, context) do | ||||
|     case Base.url_decode64(token, padding: false) do | ||||
|       {:ok, decoded_token} -> | ||||
| @@ -153,21 +144,18 @@ defmodule Cannery.Accounts.UserToken do | ||||
|   @doc """ | ||||
|   Returns the given token with the given context. | ||||
|   """ | ||||
|   @spec token_and_context_query(token :: String.t(), context :: String.t()) :: Query.t() | ||||
|   def token_and_context_query(token, context) do | ||||
|     from UserToken, where: [token: ^token, context: ^context] | ||||
|     from __MODULE__, where: [token: ^token, context: ^context] | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Gets all tokens for the given user for the given contexts. | ||||
|   """ | ||||
|   @spec user_and_contexts_query(User.t(), contexts :: :all | nonempty_maybe_improper_list()) :: | ||||
|           Query.t() | ||||
|   def user_and_contexts_query(%{id: user_id}, :all) do | ||||
|     from t in UserToken, where: t.user_id == ^user_id | ||||
|   def user_and_contexts_query(user, :all) do | ||||
|     from t in __MODULE__, where: t.user_id == ^user.id | ||||
|   end | ||||
|  | ||||
|   def user_and_contexts_query(%{id: user_id}, [_ | _] = contexts) do | ||||
|     from t in UserToken, where: t.user_id == ^user_id and t.context in ^contexts | ||||
|   def user_and_contexts_query(user, [_ | _] = contexts) do | ||||
|     from t in __MODULE__, where: t.user_id == ^user.id and t.context in ^contexts | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -4,6 +4,7 @@ defmodule Cannery.Application do | ||||
|   @moduledoc false | ||||
|  | ||||
|   use Application | ||||
|   alias Cannery.Logger | ||||
|  | ||||
|   @impl true | ||||
|   def start(_type, _args) do | ||||
| @@ -17,16 +18,24 @@ defmodule Cannery.Application do | ||||
|       # Start the Endpoint (http/https) | ||||
|       CanneryWeb.Endpoint, | ||||
|       # Add Oban | ||||
|       {Oban, oban_config()} | ||||
|       {Oban, oban_config()}, | ||||
|       Cannery.Repo.Migrator | ||||
|       # Start a worker by calling: Cannery.Worker.start_link(arg) | ||||
|       # {Cannery.Worker, arg} | ||||
|     ] | ||||
|  | ||||
|     # Automatically migrate on start in prod | ||||
|     children = | ||||
|       if Application.get_env(:cannery, Cannery.Application, automigrate: false)[:automigrate], | ||||
|         do: children ++ [Cannery.Repo.Migrator], | ||||
|         else: children | ||||
|     # Oban events logging https://hexdocs.pm/oban/Oban.html#module-reporting-errors | ||||
|     :ok = | ||||
|       :telemetry.attach_many( | ||||
|         "oban-logger", | ||||
|         [ | ||||
|           [:oban, :job, :exception], | ||||
|           [:oban, :job, :start], | ||||
|           [:oban, :job, :stop] | ||||
|         ], | ||||
|         &Logger.handle_event/4, | ||||
|         [] | ||||
|       ) | ||||
|  | ||||
|     # See https://hexdocs.pm/elixir/Supervisor.html | ||||
|     # for other strategies and supported options | ||||
|   | ||||
| @@ -1,155 +0,0 @@ | ||||
| defmodule Cannery.Invites do | ||||
|   @moduledoc """ | ||||
|   The Invites context. | ||||
|   """ | ||||
|  | ||||
|   import Ecto.Query, warn: false | ||||
|   alias Cannery.{Accounts.User, Invites.Invite, Repo} | ||||
|  | ||||
|   @invite_token_length 20 | ||||
|  | ||||
|   @doc """ | ||||
|   Returns the list of invites. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> list_invites(%User{id: 123, role: :admin}) | ||||
|       [%Invite{}, ...] | ||||
|  | ||||
|   """ | ||||
|   @spec list_invites(User.t()) :: [Invite.t()] | ||||
|   def list_invites(%User{role: :admin}) do | ||||
|     Repo.all(from i in Invite, order_by: i.name) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Gets a single invite. | ||||
|  | ||||
|   Raises `Ecto.NoResultsError` if the Invite does not exist. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> get_invite!(123, %User{id: 123, role: :admin}) | ||||
|       %Invite{} | ||||
|  | ||||
|       iex> get_invite!(456, %User{id: 123, role: :admin}) | ||||
|       ** (Ecto.NoResultsError) | ||||
|  | ||||
|   """ | ||||
|   @spec get_invite!(Invite.id(), User.t()) :: Invite.t() | ||||
|   def get_invite!(id, %User{role: :admin}) do | ||||
|     Repo.get!(Invite, id) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Returns a valid invite or nil based on the attempted token | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> get_invite_by_token("valid_token") | ||||
|       %Invite{} | ||||
|  | ||||
|       iex> get_invite_by_token("invalid_token") | ||||
|       nil | ||||
|   """ | ||||
|   @spec get_invite_by_token(token :: String.t() | nil) :: Invite.t() | nil | ||||
|   def get_invite_by_token(nil), do: nil | ||||
|   def get_invite_by_token(""), do: nil | ||||
|  | ||||
|   def get_invite_by_token(token) do | ||||
|     Repo.one( | ||||
|       from(i in Invite, | ||||
|         where: i.token == ^token and i.disabled_at |> is_nil() | ||||
|       ) | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Uses invite by decrementing uses_left, or marks invite invalid if it's been | ||||
|   completely used. | ||||
|   """ | ||||
|   @spec use_invite!(Invite.t()) :: Invite.t() | ||||
|   def use_invite!(%Invite{uses_left: nil} = invite), do: invite | ||||
|  | ||||
|   def use_invite!(%Invite{uses_left: uses_left} = invite) do | ||||
|     new_uses_left = uses_left - 1 | ||||
|  | ||||
|     attrs = | ||||
|       if new_uses_left <= 0 do | ||||
|         now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) | ||||
|         %{"uses_left" => 0, "disabled_at" => now} | ||||
|       else | ||||
|         %{"uses_left" => new_uses_left} | ||||
|       end | ||||
|  | ||||
|     invite |> Invite.update_changeset(attrs) |> Repo.update!() | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Creates a invite. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> create_invite(%User{id: 123, role: :admin}, %{field: value}) | ||||
|       {:ok, %Invite{}} | ||||
|  | ||||
|       iex> create_invite(%User{id: 123, role: :admin}, %{field: bad_value}) | ||||
|       {:error, %Changeset{}} | ||||
|  | ||||
|   """ | ||||
|   @spec create_invite(User.t(), attrs :: map()) :: | ||||
|           {:ok, Invite.t()} | {:error, Invite.changeset()} | ||||
|   def create_invite(%User{role: :admin} = user, attrs) do | ||||
|     token = | ||||
|       :crypto.strong_rand_bytes(@invite_token_length) | ||||
|       |> Base.url_encode64() | ||||
|       |> binary_part(0, @invite_token_length) | ||||
|  | ||||
|     Invite.create_changeset(user, token, attrs) |> Repo.insert() | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Updates a invite. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> update_invite(invite, %{field: new_value}, %User{id: 123, role: :admin}) | ||||
|       {:ok, %Invite{}} | ||||
|  | ||||
|       iex> update_invite(invite, %{field: bad_value}, %User{id: 123, role: :admin}) | ||||
|       {:error, %Changeset{}} | ||||
|  | ||||
|   """ | ||||
|   @spec update_invite(Invite.t(), attrs :: map(), User.t()) :: | ||||
|           {:ok, Invite.t()} | {:error, Invite.changeset()} | ||||
|   def update_invite(invite, attrs, %User{role: :admin}), | ||||
|     do: invite |> Invite.update_changeset(attrs) |> Repo.update() | ||||
|  | ||||
|   @doc """ | ||||
|   Deletes a invite. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> delete_invite(invite, %User{id: 123, role: :admin}) | ||||
|       {:ok, %Invite{}} | ||||
|  | ||||
|       iex> delete_invite(invite, %User{id: 123, role: :admin}) | ||||
|       {:error, %Changeset{}} | ||||
|  | ||||
|   """ | ||||
|   @spec delete_invite(Invite.t(), User.t()) :: | ||||
|           {:ok, Invite.t()} | {:error, Invite.changeset()} | ||||
|   def delete_invite(invite, %User{role: :admin}), do: invite |> Repo.delete() | ||||
|  | ||||
|   @doc """ | ||||
|   Deletes a invite. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> delete_invite(invite, %User{id: 123, role: :admin}) | ||||
|       %Invite{} | ||||
|  | ||||
|   """ | ||||
|   @spec delete_invite!(Invite.t(), User.t()) :: Invite.t() | ||||
|   def delete_invite!(invite, %User{role: :admin}), do: invite |> Repo.delete!() | ||||
| end | ||||
							
								
								
									
										63
									
								
								lib/cannery/logger.ex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								lib/cannery/logger.ex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| defmodule Cannery.Logger do | ||||
|   @moduledoc """ | ||||
|   Custom logger for telemetry events | ||||
|  | ||||
|   Oban implementation taken from | ||||
|   https://hexdocs.pm/oban/Oban.html#module-reporting-errors | ||||
|   """ | ||||
|  | ||||
|   require Logger | ||||
|  | ||||
|   def handle_event([:oban, :job, :exception], measure, %{stacktrace: stacktrace} = meta, _config) do | ||||
|     data = | ||||
|       get_oban_job_data(meta, measure) | ||||
|       |> Map.put(:stacktrace, Exception.format_stacktrace(stacktrace)) | ||||
|       |> pretty_encode() | ||||
|  | ||||
|     Logger.error(meta.reason, data: data) | ||||
|   end | ||||
|  | ||||
|   def handle_event([:oban, :job, :start], measure, meta, _config) do | ||||
|     data = get_oban_job_data(meta, measure) |> pretty_encode() | ||||
|     Logger.info("Started oban job", data: data) | ||||
|   end | ||||
|  | ||||
|   def handle_event([:oban, :job, :stop], measure, meta, _config) do | ||||
|     data = get_oban_job_data(meta, measure) |> pretty_encode() | ||||
|     Logger.info("Finished oban job", data: data) | ||||
|   end | ||||
|  | ||||
|   def handle_event([:oban, :job, unhandled_event], measure, meta, _config) do | ||||
|     data = | ||||
|       get_oban_job_data(meta, measure) | ||||
|       |> Map.put(:event, unhandled_event) | ||||
|       |> pretty_encode() | ||||
|  | ||||
|     Logger.warning("Unhandled oban job event", data: data) | ||||
|   end | ||||
|  | ||||
|   def handle_event(unhandled_event, measure, meta, config) do | ||||
|     data = | ||||
|       pretty_encode(%{ | ||||
|         event: unhandled_event, | ||||
|         meta: meta, | ||||
|         measurements: measure, | ||||
|         config: config | ||||
|       }) | ||||
|  | ||||
|     Logger.warning("Unhandled telemetry event", data: data) | ||||
|   end | ||||
|  | ||||
|   defp get_oban_job_data(%{job: job}, measure) do | ||||
|     %{ | ||||
|       job: job |> Map.take([:id, :args, :meta, :queue, :worker]), | ||||
|       measurements: measure | ||||
|     } | ||||
|   end | ||||
|  | ||||
|   defp pretty_encode(data) do | ||||
|     data | ||||
|     |> Jason.encode!() | ||||
|     |> Jason.Formatter.pretty_print() | ||||
|   end | ||||
| end | ||||
| @@ -11,12 +11,15 @@ defmodule Cannery.Repo.Migrator do | ||||
|   end | ||||
|  | ||||
|   def init(_opts) do | ||||
|     migrate!() | ||||
|     {:ok, nil} | ||||
|     {:ok, if(automigrate_enabled?(), do: migrate!())} | ||||
|   end | ||||
|  | ||||
|   def migrate! do | ||||
|     path = Application.app_dir(:cannery, "priv/repo/migrations") | ||||
|     Ecto.Migrator.run(Cannery.Repo, path, :up, all: true) | ||||
|   end | ||||
|  | ||||
|   defp automigrate_enabled? do | ||||
|     Application.get_env(:cannery, Cannery.Application, automigrate: false)[:automigrate] | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -72,16 +72,14 @@ defmodule CanneryWeb do | ||||
|     quote do | ||||
|       use Phoenix.Router | ||||
|  | ||||
|       import Phoenix.{Controller, LiveView.Router} | ||||
|       # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse | ||||
|       import Plug.Conn | ||||
|       import Phoenix.Controller | ||||
|       import Phoenix.LiveView.Router | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   def channel do | ||||
|     quote do | ||||
|       # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse | ||||
|       use Phoenix.Channel | ||||
|       # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse | ||||
|       import CanneryWeb.Gettext | ||||
| @@ -95,15 +93,10 @@ defmodule CanneryWeb do | ||||
|       use Phoenix.HTML | ||||
|  | ||||
|       # Import LiveView and .heex helpers (live_render, live_patch, <.form>, etc) | ||||
|       # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse | ||||
|       import Phoenix.Component | ||||
|  | ||||
|       # Import basic rendering functionality (render, render_layout, etc) | ||||
|       # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse | ||||
|       import Phoenix.View | ||||
|  | ||||
|       # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse | ||||
|       import CanneryWeb.{ErrorHelpers, Gettext, LiveHelpers, ViewHelpers} | ||||
|       import Phoenix.{Component, View} | ||||
|  | ||||
|       alias CanneryWeb.Endpoint | ||||
|       alias CanneryWeb.Router.Helpers, as: Routes | ||||
|     end | ||||
|   | ||||
| @@ -12,11 +12,12 @@ | ||||
|     phx-change="validate" | ||||
|     phx-submit="save" | ||||
|   > | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|       <div class="invalid-feedback col-span-3 text-center"> | ||||
|         <%= changeset_errors(@changeset) %> | ||||
|       </div> | ||||
|     <% end %> | ||||
|     <div | ||||
|       :if={@changeset.action && not @changeset.valid?()} | ||||
|       class="invalid-feedback col-span-3 text-center" | ||||
|     > | ||||
|       <%= changeset_errors(@changeset) %> | ||||
|     </div> | ||||
|  | ||||
|     <%= label(f, :ammo_left, gettext("Rounds left"), class: "title text-lg text-primary-600") %> | ||||
|     <%= number_input(f, :ammo_left, | ||||
|   | ||||
| @@ -23,9 +23,10 @@ defmodule CanneryWeb.Components.AmmoGroupCard do | ||||
|     ~H""" | ||||
|     <div | ||||
|       id={"ammo_group-#{@ammo_group.id}"} | ||||
|       class="mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center | ||||
|             border border-gray-400 rounded-lg shadow-lg hover:shadow-md | ||||
|             transition-all duration-300 ease-in-out" | ||||
|       class="mx-4 my-2 px-8 py-4 | ||||
|         flex flex-col justify-center items-center | ||||
|         border border-gray-400 rounded-lg shadow-lg hover:shadow-md | ||||
|         transition-all duration-300 ease-in-out" | ||||
|     > | ||||
|       <.link navigate={Routes.ammo_group_show_path(Endpoint, :show, @ammo_group)} class="mb-2 link"> | ||||
|         <h1 class="title text-xl title-primary-500"> | ||||
| @@ -39,31 +40,28 @@ defmodule CanneryWeb.Components.AmmoGroupCard do | ||||
|           <%= if @ammo_group.count == 0, do: gettext("Empty"), else: @ammo_group.count %> | ||||
|         </span> | ||||
|  | ||||
|         <%= if @ammo_group |> Ammo.get_original_count() != @ammo_group.count do %> | ||||
|           <span class="rounded-lg title text-lg"> | ||||
|             <%= gettext("Original Count:") %> | ||||
|             <%= @ammo_group |> Ammo.get_original_count() %> | ||||
|           </span> | ||||
|         <% end %> | ||||
|         <span | ||||
|           :if={@ammo_group |> Ammo.get_original_count() != @ammo_group.count} | ||||
|           class="rounded-lg title text-lg" | ||||
|         > | ||||
|           <%= gettext("Original Count:") %> | ||||
|           <%= @ammo_group |> Ammo.get_original_count() %> | ||||
|         </span> | ||||
|  | ||||
|         <%= if @ammo_group.notes do %> | ||||
|           <span class="rounded-lg title text-lg"> | ||||
|             <%= gettext("Notes:") %> | ||||
|             <%= @ammo_group.notes %> | ||||
|           </span> | ||||
|         <% end %> | ||||
|         <span :if={@ammo_group.notes} class="rounded-lg title text-lg"> | ||||
|           <%= gettext("Notes:") %> | ||||
|           <%= @ammo_group.notes %> | ||||
|         </span> | ||||
|  | ||||
|         <span class="rounded-lg title text-lg"> | ||||
|           <%= gettext("Purchased on:") %> | ||||
|           <.date date={@ammo_group.purchased_on} /> | ||||
|         </span> | ||||
|  | ||||
|         <%= if @ammo_group |> Ammo.get_last_used_shot_group() do %> | ||||
|           <span class="rounded-lg title text-lg"> | ||||
|             <%= gettext("Last used on:") %> | ||||
|             <.date date={@ammo_group |> Ammo.get_last_used_shot_group() |> Map.get(:date)} /> | ||||
|           </span> | ||||
|         <% end %> | ||||
|         <span :if={@ammo_group |> Ammo.get_last_used_shot_group()} class="rounded-lg title text-lg"> | ||||
|           <%= gettext("Last used on:") %> | ||||
|           <.date date={@ammo_group |> Ammo.get_last_used_shot_group() |> Map.get(:date)} /> | ||||
|         </span> | ||||
|  | ||||
|         <%= if @ammo_group.price_paid do %> | ||||
|           <span class="rounded-lg title text-lg"> | ||||
| @@ -81,25 +79,24 @@ defmodule CanneryWeb.Components.AmmoGroupCard do | ||||
|           </span> | ||||
|         <% end %> | ||||
|  | ||||
|         <%= if @show_container and @ammo_group.container do %> | ||||
|           <span class="rounded-lg title text-lg"> | ||||
|             <%= gettext("Container:") %> | ||||
|         <span :if={@show_container and @ammo_group.container} class="rounded-lg title text-lg"> | ||||
|           <%= gettext("Container:") %> | ||||
|  | ||||
|             <.link | ||||
|               navigate={Routes.container_show_path(Endpoint, :show, @ammo_group.container)} | ||||
|               class="link" | ||||
|             > | ||||
|               <%= @ammo_group.container.name %> | ||||
|             </.link> | ||||
|           </span> | ||||
|         <% end %> | ||||
|           <.link | ||||
|             navigate={Routes.container_show_path(Endpoint, :show, @ammo_group.container)} | ||||
|             class="link" | ||||
|           > | ||||
|             <%= @ammo_group.container.name %> | ||||
|           </.link> | ||||
|         </span> | ||||
|       </div> | ||||
|  | ||||
|       <%= if assigns |> Map.has_key?(:inner_block) do %> | ||||
|         <div class="mt-4 flex space-x-4 justify-center items-center"> | ||||
|           <%= render_slot(@inner_block) %> | ||||
|         </div> | ||||
|       <% end %> | ||||
|       <div | ||||
|         :if={assigns |> Map.has_key?(:inner_block)} | ||||
|         class="mt-4 flex space-x-4 justify-center items-center" | ||||
|       > | ||||
|         <%= render_slot(@inner_block) %> | ||||
|       </div> | ||||
|     </div> | ||||
|     """ | ||||
|   end | ||||
|   | ||||
| @@ -23,7 +23,8 @@ defmodule CanneryWeb.Components.ContainerCard do | ||||
|     ~H""" | ||||
|     <div | ||||
|       id={"container-#{@container.id}"} | ||||
|       class="overflow-hidden max-w-full mx-4 mb-4 px-8 py-4 flex flex-col justify-center items-center space-y-4 | ||||
|       class="overflow-hidden max-w-full mx-4 mb-4 px-8 py-4 | ||||
|         flex flex-col justify-center items-center space-y-4 | ||||
|         border border-gray-400 rounded-lg shadow-lg hover:shadow-md | ||||
|         transition-all duration-300 ease-in-out" | ||||
|     > | ||||
| @@ -34,24 +35,20 @@ defmodule CanneryWeb.Components.ContainerCard do | ||||
|           </h1> | ||||
|         </.link> | ||||
|  | ||||
|         <%= if @container.desc do %> | ||||
|           <span class="rounded-lg title text-lg"> | ||||
|             <%= gettext("Description:") %> | ||||
|             <%= @container.desc %> | ||||
|           </span> | ||||
|         <% end %> | ||||
|         <span :if={@container.desc} class="rounded-lg title text-lg"> | ||||
|           <%= gettext("Description:") %> | ||||
|           <%= @container.desc %> | ||||
|         </span> | ||||
|  | ||||
|         <span class="rounded-lg title text-lg"> | ||||
|           <%= gettext("Type:") %> | ||||
|           <%= @container.type %> | ||||
|         </span> | ||||
|  | ||||
|         <%= if @container.location do %> | ||||
|           <span class="rounded-lg title text-lg"> | ||||
|             <%= gettext("Location:") %> | ||||
|             <%= @container.location %> | ||||
|           </span> | ||||
|         <% end %> | ||||
|         <span :if={@container.location} class="rounded-lg title text-lg"> | ||||
|           <%= gettext("Location:") %> | ||||
|           <%= @container.location %> | ||||
|         </span> | ||||
|  | ||||
|         <%= unless @container.ammo_groups |> Enum.empty?() do %> | ||||
|           <span class="rounded-lg title text-lg"> | ||||
| @@ -66,21 +63,18 @@ defmodule CanneryWeb.Components.ContainerCard do | ||||
|         <% end %> | ||||
|  | ||||
|         <div class="flex flex-wrap justify-center items-center"> | ||||
|           <%= unless @container.tags |> Enum.empty?() do %> | ||||
|             <%= for tag <- @container.tags do %> | ||||
|               <.simple_tag_card tag={tag} /> | ||||
|             <% end %> | ||||
|           <% end %> | ||||
|           <.simple_tag_card :for={tag <- @container.tags} :if={@container.tags} tag={tag} /> | ||||
|  | ||||
|           <%= render_slot(@tag_actions) %> | ||||
|         </div> | ||||
|       </div> | ||||
|  | ||||
|       <%= if assigns |> Map.has_key?(:inner_block) do %> | ||||
|         <div class="flex space-x-4 justify-center items-center"> | ||||
|           <%= render_slot(@inner_block) %> | ||||
|         </div> | ||||
|       <% end %> | ||||
|       <div | ||||
|         :if={assigns |> Map.has_key?(:inner_block)} | ||||
|         class="flex space-x-4 justify-center items-center" | ||||
|       > | ||||
|         <%= render_slot(@inner_block) %> | ||||
|       </div> | ||||
|     </div> | ||||
|     """ | ||||
|   end | ||||
|   | ||||
| @@ -135,11 +135,7 @@ defmodule CanneryWeb.Components.ContainerTableComponent do | ||||
|     {container.tags |> Enum.map(fn %{name: name} -> name end), | ||||
|      ~H""" | ||||
|      <div class="flex flex-wrap justify-center items-center"> | ||||
|        <%= unless @container.tags |> Enum.empty?() do %> | ||||
|          <%= for tag <- @container.tags do %> | ||||
|            <TagCard.simple_tag_card tag={tag} /> | ||||
|          <% end %> | ||||
|        <% end %> | ||||
|        <TagCard.simple_tag_card :for={tag <- @container.tags} :if={@container.tags} tag={tag} /> | ||||
|  | ||||
|        <%= render_slot(@tag_actions, @container) %> | ||||
|      </div> | ||||
|   | ||||
| @@ -4,23 +4,24 @@ defmodule CanneryWeb.Components.InviteCard do | ||||
|   """ | ||||
|  | ||||
|   use CanneryWeb, :component | ||||
|   alias Cannery.Invites.Invite | ||||
|   alias Cannery.Accounts.{Invite, Invites, User} | ||||
|   alias CanneryWeb.Endpoint | ||||
|  | ||||
|   attr :invite, Invite, required: true | ||||
|   attr :current_user, User, required: true | ||||
|   slot(:inner_block) | ||||
|   slot(:code_actions) | ||||
|  | ||||
|   def invite_card(assigns) do | ||||
|     assigns = assigns |> assign_new(:code_actions, fn -> [] end) | ||||
|   def invite_card(%{invite: invite, current_user: current_user} = assigns) do | ||||
|     assigns = | ||||
|       assigns | ||||
|       |> assign(:use_count, Invites.get_use_count(invite, current_user)) | ||||
|       |> assign_new(:code_actions, fn -> [] end) | ||||
|  | ||||
|     ~H""" | ||||
|     <div | ||||
|       id={"invite-#{@invite.id}"} | ||||
|       class="mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center space-y-4 | ||||
|     <div class="mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center space-y-4 | ||||
|       border border-gray-400 rounded-lg shadow-lg hover:shadow-md | ||||
|       transition-all duration-300 ease-in-out" | ||||
|     > | ||||
|       transition-all duration-300 ease-in-out"> | ||||
|       <h1 class="title text-xl"> | ||||
|         <%= @invite.name %> | ||||
|       </h1> | ||||
| @@ -29,8 +30,8 @@ defmodule CanneryWeb.Components.InviteCard do | ||||
|         <h2 class="title text-md"> | ||||
|           <%= if @invite.uses_left do %> | ||||
|             <%= gettext( | ||||
|               "Uses Left: %{uses_left}", | ||||
|               uses_left: @invite.uses_left | ||||
|               "Uses Left: %{uses_left_count}", | ||||
|               uses_left_count: @invite.uses_left | ||||
|             ) %> | ||||
|           <% else %> | ||||
|             <%= gettext("Uses Left: Unlimited") %> | ||||
| @@ -47,6 +48,10 @@ defmodule CanneryWeb.Components.InviteCard do | ||||
|         filename={@invite.name} | ||||
|       /> | ||||
|  | ||||
|       <h2 :if={@use_count != 0} class="title text-md"> | ||||
|         <%= gettext("Uses: %{uses_count}", uses_count: @use_count) %> | ||||
|       </h2> | ||||
|  | ||||
|       <div class="flex flex-row flex-wrap justify-center items-center"> | ||||
|         <code | ||||
|           id={"code-#{@invite.id}"} | ||||
| @@ -56,11 +61,9 @@ defmodule CanneryWeb.Components.InviteCard do | ||||
|         <%= render_slot(@code_actions) %> | ||||
|       </div> | ||||
|  | ||||
|       <%= if @inner_block do %> | ||||
|         <div class="flex space-x-4 justify-center items-center"> | ||||
|           <%= render_slot(@inner_block) %> | ||||
|         </div> | ||||
|       <% end %> | ||||
|       <div :if={@inner_block} class="flex space-x-4 justify-center items-center"> | ||||
|         <%= render_slot(@inner_block) %> | ||||
|       </div> | ||||
|     </div> | ||||
|     """ | ||||
|   end | ||||
|   | ||||
| @@ -34,20 +34,19 @@ | ||||
|       </tr> | ||||
|     </thead> | ||||
|     <tbody> | ||||
|       <%= for {values, i} <- @rows |> Enum.with_index() do %> | ||||
|         <tr class={if i |> Integer.is_even(), do: @row_class, else: @alternate_row_class}> | ||||
|           <%= for %{key: key} = value <- @columns do %> | ||||
|             <td class={["p-2", value[:class]]}> | ||||
|               <%= case values |> Map.get(key) do %> | ||||
|                 <% {_custom_sort_value, value} -> %> | ||||
|                   <%= value %> | ||||
|                 <% value -> %> | ||||
|                   <%= value %> | ||||
|               <% end %> | ||||
|             </td> | ||||
|       <tr | ||||
|         :for={{values, i} <- @rows |> Enum.with_index()} | ||||
|         class={if i |> Integer.is_even(), do: @row_class, else: @alternate_row_class} | ||||
|       > | ||||
|         <td :for={%{key: key} = value <- @columns} class={["p-2", value[:class]]}> | ||||
|           <%= case values |> Map.get(key) do %> | ||||
|             <% {_custom_sort_value, value} -> %> | ||||
|               <%= value %> | ||||
|             <% value -> %> | ||||
|               <%= value %> | ||||
|           <% end %> | ||||
|         </tr> | ||||
|       <% end %> | ||||
|         </td> | ||||
|       </tr> | ||||
|     </tbody> | ||||
|   </table> | ||||
| </div> | ||||
|   | ||||
| @@ -14,8 +14,8 @@ defmodule CanneryWeb.Components.TagCard do | ||||
|     <div | ||||
|       id={"tag-#{@tag.id}"} | ||||
|       class="mx-4 mb-4 px-8 py-4 space-x-4 flex justify-center items-center | ||||
|           border border-gray-400 rounded-lg shadow-lg hover:shadow-md | ||||
|           transition-all duration-300 ease-in-out" | ||||
|         border border-gray-400 rounded-lg shadow-lg hover:shadow-md | ||||
|         transition-all duration-300 ease-in-out" | ||||
|     > | ||||
|       <.simple_tag_card tag={@tag} /> | ||||
|       <%= render_slot(@inner_block) %> | ||||
|   | ||||
| @@ -119,16 +119,14 @@ defmodule CanneryWeb.Components.Topbar do | ||||
|               </li> | ||||
|             <% end %> | ||||
|           <% else %> | ||||
|             <%= if Accounts.allow_registration?() do %> | ||||
|               <li class="mx-2 my-1"> | ||||
|                 <.link | ||||
|                   navigate={Routes.user_registration_path(Endpoint, :new)} | ||||
|                   class="text-primary-600 text-white hover:underline truncate" | ||||
|                 > | ||||
|                   <%= dgettext("actions", "Register") %> | ||||
|                 </.link> | ||||
|               </li> | ||||
|             <% end %> | ||||
|             <li :if={Accounts.allow_registration?()} class="mx-2 my-1"> | ||||
|               <.link | ||||
|                 navigate={Routes.user_registration_path(Endpoint, :new)} | ||||
|                 class="text-primary-600 text-white hover:underline truncate" | ||||
|               > | ||||
|                 <%= dgettext("actions", "Register") %> | ||||
|               </.link> | ||||
|             </li> | ||||
|             <li class="mx-2 my-1"> | ||||
|               <.link | ||||
|                 navigate={Routes.user_session_path(Endpoint, :new)} | ||||
|   | ||||
| @@ -14,8 +14,8 @@ defmodule CanneryWeb.Components.UserCard do | ||||
|     <div | ||||
|       id={"user-#{@user.id}"} | ||||
|       class="mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center text-center | ||||
|           border border-gray-400 rounded-lg shadow-lg hover:shadow-md | ||||
|           transition-all duration-300 ease-in-out" | ||||
|         border border-gray-400 rounded-lg shadow-lg hover:shadow-md | ||||
|         transition-all duration-300 ease-in-out" | ||||
|     > | ||||
|       <h1 class="px-4 py-2 rounded-lg title text-xl break-all"> | ||||
|         <%= @user.email %> | ||||
| @@ -43,11 +43,9 @@ defmodule CanneryWeb.Components.UserCard do | ||||
|         </p> | ||||
|       </h3> | ||||
|  | ||||
|       <%= if @inner_block do %> | ||||
|         <div class="px-4 py-2 flex space-x-4 justify-center items-center"> | ||||
|           <%= render_slot(@inner_block) %> | ||||
|         </div> | ||||
|       <% end %> | ||||
|       <div :if={@inner_block} class="px-4 py-2 flex space-x-4 justify-center items-center"> | ||||
|         <%= render_slot(@inner_block) %> | ||||
|       </div> | ||||
|     </div> | ||||
|     """ | ||||
|   end | ||||
|   | ||||
| @@ -1,14 +1,12 @@ | ||||
| defmodule CanneryWeb.UserRegistrationController do | ||||
|   use CanneryWeb, :controller | ||||
|   import CanneryWeb.Gettext | ||||
|   alias Cannery.{Accounts, Invites} | ||||
|   alias Cannery.{Accounts, Accounts.Invites} | ||||
|   alias CanneryWeb.{Endpoint, HomeLive} | ||||
|  | ||||
|   def new(conn, %{"invite" => invite_token}) do | ||||
|     invite = Invites.get_invite_by_token(invite_token) | ||||
|  | ||||
|     if invite do | ||||
|       conn |> render_new(invite) | ||||
|     if Invites.valid_invite_token?(invite_token) do | ||||
|       conn |> render_new(invite_token) | ||||
|     else | ||||
|       conn | ||||
|       |> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired")) | ||||
| @@ -27,19 +25,17 @@ defmodule CanneryWeb.UserRegistrationController do | ||||
|   end | ||||
|  | ||||
|   # renders new user registration page | ||||
|   defp render_new(conn, invite \\ nil) do | ||||
|   defp render_new(conn, invite_token \\ nil) do | ||||
|     render(conn, "new.html", | ||||
|       changeset: Accounts.change_user_registration(), | ||||
|       invite: invite, | ||||
|       invite_token: invite_token, | ||||
|       page_title: gettext("Register") | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   def create(conn, %{"user" => %{"invite_token" => invite_token}} = attrs) do | ||||
|     invite = Invites.get_invite_by_token(invite_token) | ||||
|  | ||||
|     if invite do | ||||
|       conn |> create_user(attrs, invite) | ||||
|     if Invites.valid_invite_token?(invite_token) do | ||||
|       conn |> create_user(attrs, invite_token) | ||||
|     else | ||||
|       conn | ||||
|       |> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired")) | ||||
| @@ -57,13 +53,9 @@ defmodule CanneryWeb.UserRegistrationController do | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   defp create_user(conn, %{"user" => user_params}, invite \\ nil) do | ||||
|     case Accounts.register_user(user_params) do | ||||
|   defp create_user(conn, %{"user" => user_params}, invite_token \\ nil) do | ||||
|     case Accounts.register_user(user_params, invite_token) do | ||||
|       {:ok, user} -> | ||||
|         unless invite |> is_nil() do | ||||
|           invite |> Invites.use_invite!() | ||||
|         end | ||||
|  | ||||
|         Accounts.deliver_user_confirmation_instructions( | ||||
|           user, | ||||
|           &Routes.user_confirmation_url(conn, :confirm, &1) | ||||
| @@ -73,8 +65,13 @@ defmodule CanneryWeb.UserRegistrationController do | ||||
|         |> put_flash(:info, dgettext("prompts", "Please check your email to verify your account")) | ||||
|         |> redirect(to: Routes.user_session_path(Endpoint, :new)) | ||||
|  | ||||
|       {:error, :invalid_token} -> | ||||
|         conn | ||||
|         |> put_flash(:error, dgettext("errors", "Sorry, this invite was not found or expired")) | ||||
|         |> redirect(to: Routes.live_path(Endpoint, HomeLive)) | ||||
|  | ||||
|       {:error, %Ecto.Changeset{} = changeset} -> | ||||
|         conn |> render("new.html", changeset: changeset, invite: invite) | ||||
|         conn |> render("new.html", changeset: changeset, invite_token: invite_token) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -12,11 +12,12 @@ | ||||
|     phx-submit="save" | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|   > | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|       <div class="invalid-feedback col-span-3 text-center"> | ||||
|         <%= changeset_errors(@changeset) %> | ||||
|       </div> | ||||
|     <% end %> | ||||
|     <div | ||||
|       :if={@changeset.action && not @changeset.valid?()} | ||||
|       class="invalid-feedback col-span-3 text-center" | ||||
|     > | ||||
|       <%= changeset_errors(@changeset) %> | ||||
|     </div> | ||||
|  | ||||
|     <%= label(f, :ammo_type_id, gettext("Ammo type"), class: "title text-lg text-primary-600") %> | ||||
|     <%= select(f, :ammo_type_id, ammo_type_options(@ammo_types), | ||||
| @@ -59,8 +60,8 @@ | ||||
|     ) %> | ||||
|     <%= error_tag(f, :container_id, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= cond do %> | ||||
|       <% @action in [:new, :clone] -> %> | ||||
|     <%= case @action do %> | ||||
|       <% action when action in [:new, :clone] -> %> | ||||
|         <hr class="hr col-span-3" /> | ||||
|  | ||||
|         <%= label(f, :multiplier, gettext("Copies"), class: "title text-lg text-primary-600") %> | ||||
| @@ -77,7 +78,7 @@ | ||||
|         ) %> | ||||
|  | ||||
|         <%= error_tag(f, :multiplier, "col-span-3 text-center") %> | ||||
|       <% @action == :edit -> %> | ||||
|       <% :edit -> %> | ||||
|         <%= submit(dgettext("actions", "Save"), | ||||
|           phx_disable_with: dgettext("prompts", "Saving..."), | ||||
|           class: "mx-auto col-span-3 btn btn-primary" | ||||
|   | ||||
| @@ -3,12 +3,13 @@ | ||||
|     <%= gettext("Ammo") %> | ||||
|   </h1> | ||||
|  | ||||
|   <%= if @ammo_groups |> Enum.empty?() and @search |> is_nil() do %> | ||||
|     <h2 class="title text-xl text-primary-600"> | ||||
|       <%= gettext("No Ammo") %> | ||||
|       <%= display_emoji("😔") %> | ||||
|     </h2> | ||||
|   <% end %> | ||||
|   <h2 | ||||
|     :if={@ammo_groups |> Enum.empty?() and @search |> is_nil()} | ||||
|     class="title text-xl text-primary-600" | ||||
|   > | ||||
|     <%= gettext("No Ammo") %> | ||||
|     <%= display_emoji("😔") %> | ||||
|   </h2> | ||||
|  | ||||
|   <%= cond do %> | ||||
|     <% @containers_count == 0 -> %> | ||||
|   | ||||
| @@ -11,11 +11,12 @@ | ||||
|     phx-submit="save" | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|   > | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|       <div class="invalid-feedback col-span-3 text-center"> | ||||
|         <%= changeset_errors(@changeset) %> | ||||
|       </div> | ||||
|     <% end %> | ||||
|     <div | ||||
|       :if={@changeset.action && not @changeset.valid?()} | ||||
|       class="invalid-feedback col-span-3 text-center" | ||||
|     > | ||||
|       <%= changeset_errors(@changeset) %> | ||||
|     </div> | ||||
|  | ||||
|     <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :name, class: "text-center col-span-2 input input-primary") %> | ||||
|   | ||||
| @@ -104,17 +104,18 @@ | ||||
|   <% end %> | ||||
| </div> | ||||
|  | ||||
| <%= if @live_action in [:new, :edit, :clone] do %> | ||||
|   <.modal return_to={Routes.ammo_type_index_path(Endpoint, :index)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.AmmoTypeLive.FormComponent} | ||||
|       id={@ammo_type.id || :new} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       ammo_type={@ammo_type} | ||||
|       return_to={Routes.ammo_type_index_path(Endpoint, :index)} | ||||
|       current_user={@current_user} | ||||
|       } | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
| <.modal | ||||
|   :if={@live_action in [:new, :edit, :clone]} | ||||
|   return_to={Routes.ammo_type_index_path(Endpoint, :index)} | ||||
| > | ||||
|   <.live_component | ||||
|     module={CanneryWeb.AmmoTypeLive.FormComponent} | ||||
|     id={@ammo_type.id || :new} | ||||
|     title={@page_title} | ||||
|     action={@live_action} | ||||
|     ammo_type={@ammo_type} | ||||
|     return_to={Routes.ammo_type_index_path(Endpoint, :index)} | ||||
|     current_user={@current_user} | ||||
|     } | ||||
|   /> | ||||
| </.modal> | ||||
|   | ||||
| @@ -3,13 +3,14 @@ | ||||
|     <%= @ammo_type.name %> | ||||
|   </h1> | ||||
|  | ||||
|   <%= if @ammo_type.desc do %> | ||||
|     <span class="max-w-2xl w-full px-8 py-4 rounded-lg | ||||
|       text-center title text-lg | ||||
|       border border-primary-600"> | ||||
|       <%= @ammo_type.desc %> | ||||
|     </span> | ||||
|   <% end %> | ||||
|   <span | ||||
|     :if={@ammo_type.desc} | ||||
|     class="max-w-2xl w-full px-8 py-4 rounded-lg | ||||
|     text-center title text-lg | ||||
|     border border-primary-600" | ||||
|   > | ||||
|     <%= @ammo_type.desc %> | ||||
|   </span> | ||||
|  | ||||
|   <div class="flex space-x-4 justify-center items-center text-primary-600"> | ||||
|     <.link | ||||
| @@ -185,25 +186,28 @@ | ||||
|         </.live_component> | ||||
|       <% else %> | ||||
|         <div class="flex flex-wrap justify-center items-stretch"> | ||||
|           <%= for ammo_group <- @ammo_groups do %> | ||||
|             <.ammo_group_card ammo_group={ammo_group} show_container={true} /> | ||||
|           <% end %> | ||||
|           <.ammo_group_card | ||||
|             :for={ammo_group <- @ammo_groups} | ||||
|             ammo_group={ammo_group} | ||||
|             show_container={true} | ||||
|           /> | ||||
|         </div> | ||||
|       <% end %> | ||||
|     <% end %> | ||||
|   </div> | ||||
| </div> | ||||
|  | ||||
| <%= if @live_action in [:edit] do %> | ||||
|   <.modal return_to={Routes.ammo_type_show_path(Endpoint, :show, @ammo_type)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.AmmoTypeLive.FormComponent} | ||||
|       id={@ammo_type.id} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       ammo_type={@ammo_type} | ||||
|       return_to={Routes.ammo_type_show_path(Endpoint, :show, @ammo_type)} | ||||
|       current_user={@current_user} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
| <.modal | ||||
|   :if={@live_action == :edit} | ||||
|   return_to={Routes.ammo_type_show_path(Endpoint, :show, @ammo_type)} | ||||
| > | ||||
|   <.live_component | ||||
|     module={CanneryWeb.AmmoTypeLive.FormComponent} | ||||
|     id={@ammo_type.id} | ||||
|     title={@page_title} | ||||
|     action={@live_action} | ||||
|     ammo_type={@ammo_type} | ||||
|     return_to={Routes.ammo_type_show_path(Endpoint, :show, @ammo_type)} | ||||
|     current_user={@current_user} | ||||
|   /> | ||||
| </.modal> | ||||
|   | ||||
| @@ -4,34 +4,31 @@ | ||||
|   </h2> | ||||
|  | ||||
|   <div class="flex flex-wrap justify-center items-center"> | ||||
|     <%= for tag <- @container.tags do %> | ||||
|       <.link | ||||
|         href="#" | ||||
|         class="mx-2 my-1 px-4 py-2 rounded-lg title text-xl" | ||||
|         style={"color: #{tag.text_color}; background-color: #{tag.bg_color}"} | ||||
|         phx-click="delete" | ||||
|         phx-value-tag-id={tag.id} | ||||
|         phx-target={@myself} | ||||
|         data-confirm={ | ||||
|           dgettext( | ||||
|             "prompts", | ||||
|             "Are you sure you want to remove the %{tag_name} tag from %{container_name}?", | ||||
|             tag_name: tag.name, | ||||
|             container_name: @container.name | ||||
|           ) | ||||
|         } | ||||
|       > | ||||
|         <%= tag.name %> | ||||
|         <i class="fa-fw fa-sm fas fa-trash"></i> | ||||
|       </.link> | ||||
|     <% end %> | ||||
|     <.link | ||||
|       :for={tag <- @container.tags} | ||||
|       href="#" | ||||
|       class="mx-2 my-1 px-4 py-2 rounded-lg title text-xl" | ||||
|       style={"color: #{tag.text_color}; background-color: #{tag.bg_color}"} | ||||
|       phx-click="delete" | ||||
|       phx-value-tag-id={tag.id} | ||||
|       phx-target={@myself} | ||||
|       data-confirm={ | ||||
|         dgettext( | ||||
|           "prompts", | ||||
|           "Are you sure you want to remove the %{tag_name} tag from %{container_name}?", | ||||
|           tag_name: tag.name, | ||||
|           container_name: @container.name | ||||
|         ) | ||||
|       } | ||||
|     > | ||||
|       <%= tag.name %> | ||||
|       <i class="fa-fw fa-sm fas fa-trash"></i> | ||||
|     </.link> | ||||
|  | ||||
|     <%= if @container.tags |> Enum.empty?() do %> | ||||
|       <h2 class="title text-xl text-primary-600"> | ||||
|         <%= gettext("No tags") %> | ||||
|         <%= display_emoji("😔") %> | ||||
|       </h2> | ||||
|     <% end %> | ||||
|     <h2 :if={@container.tags |> Enum.empty?()} class="title text-xl text-primary-600"> | ||||
|       <%= gettext("No tags") %> | ||||
|       <%= display_emoji("😔") %> | ||||
|     </h2> | ||||
|   </div> | ||||
|  | ||||
|   <%= unless tag_options(@tags, @container) |> Enum.empty?() do %> | ||||
|   | ||||
| @@ -11,11 +11,12 @@ | ||||
|     phx-change="validate" | ||||
|     phx-submit="save" | ||||
|   > | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|       <div class="invalid-feedback col-span-3 text-center"> | ||||
|         <%= changeset_errors(@changeset) %> | ||||
|       </div> | ||||
|     <% end %> | ||||
|     <div | ||||
|       :if={@changeset.action && not @changeset.valid?()} | ||||
|       class="invalid-feedback col-span-3 text-center" | ||||
|     > | ||||
|       <%= changeset_errors(@changeset) %> | ||||
|     </div> | ||||
|  | ||||
|     <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :name, | ||||
|   | ||||
| @@ -99,78 +99,73 @@ | ||||
|       </.live_component> | ||||
|     <% else %> | ||||
|       <div class="w-full flex flex-row flex-wrap justify-center items-stretch"> | ||||
|         <%= for container <- @containers do %> | ||||
|           <.container_card container={container}> | ||||
|             <:tag_actions> | ||||
|               <div class="mx-4 my-2"> | ||||
|                 <.link | ||||
|                   patch={Routes.container_index_path(Endpoint, :edit_tags, container)} | ||||
|                   class="text-primary-600 link" | ||||
|                 > | ||||
|                   <i class="fa-fw fa-lg fas fa-tags"></i> | ||||
|                 </.link> | ||||
|               </div> | ||||
|             </:tag_actions> | ||||
|             <.link | ||||
|               patch={Routes.container_index_path(Endpoint, :edit, container)} | ||||
|               class="text-primary-600 link" | ||||
|               data-qa={"edit-#{container.id}"} | ||||
|             > | ||||
|               <i class="fa-fw fa-lg fas fa-edit"></i> | ||||
|             </.link> | ||||
|         <.container_card :for={container <- @containers} container={container}> | ||||
|           <:tag_actions> | ||||
|             <div class="mx-4 my-2"> | ||||
|               <.link | ||||
|                 patch={Routes.container_index_path(Endpoint, :edit_tags, container)} | ||||
|                 class="text-primary-600 link" | ||||
|               > | ||||
|                 <i class="fa-fw fa-lg fas fa-tags"></i> | ||||
|               </.link> | ||||
|             </div> | ||||
|           </:tag_actions> | ||||
|           <.link | ||||
|             patch={Routes.container_index_path(Endpoint, :edit, container)} | ||||
|             class="text-primary-600 link" | ||||
|             data-qa={"edit-#{container.id}"} | ||||
|           > | ||||
|             <i class="fa-fw fa-lg fas fa-edit"></i> | ||||
|           </.link> | ||||
|  | ||||
|             <.link | ||||
|               patch={Routes.container_index_path(Endpoint, :clone, container)} | ||||
|               class="text-primary-600 link" | ||||
|               data-qa={"clone-#{container.id}"} | ||||
|             > | ||||
|               <i class="fa-fw fa-lg fas fa-copy"></i> | ||||
|             </.link> | ||||
|           <.link | ||||
|             patch={Routes.container_index_path(Endpoint, :clone, container)} | ||||
|             class="text-primary-600 link" | ||||
|             data-qa={"clone-#{container.id}"} | ||||
|           > | ||||
|             <i class="fa-fw fa-lg fas fa-copy"></i> | ||||
|           </.link> | ||||
|  | ||||
|             <.link | ||||
|               href="#" | ||||
|               class="text-primary-600 link" | ||||
|               phx-click="delete" | ||||
|               phx-value-id={container.id} | ||||
|               data-confirm={ | ||||
|                 dgettext("prompts", "Are you sure you want to delete %{name}?", | ||||
|                   name: container.name | ||||
|                 ) | ||||
|               } | ||||
|               data-qa={"delete-#{container.id}"} | ||||
|             > | ||||
|               <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|             </.link> | ||||
|           </.container_card> | ||||
|         <% end %> | ||||
|           <.link | ||||
|             href="#" | ||||
|             class="text-primary-600 link" | ||||
|             phx-click="delete" | ||||
|             phx-value-id={container.id} | ||||
|             data-confirm={ | ||||
|               dgettext("prompts", "Are you sure you want to delete %{name}?", name: container.name) | ||||
|             } | ||||
|             data-qa={"delete-#{container.id}"} | ||||
|           > | ||||
|             <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|           </.link> | ||||
|         </.container_card> | ||||
|       </div> | ||||
|     <% end %> | ||||
|   <% end %> | ||||
| </div> | ||||
|  | ||||
| <%= if @live_action in [:new, :edit, :clone] do %> | ||||
|   <.modal return_to={Routes.container_index_path(Endpoint, :index)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.ContainerLive.FormComponent} | ||||
|       id={@container.id || :new} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       container={@container} | ||||
|       return_to={Routes.container_index_path(Endpoint, :index)} | ||||
|       current_user={@current_user} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
| <.modal | ||||
|   :if={@live_action in [:new, :edit, :clone]} | ||||
|   return_to={Routes.container_index_path(Endpoint, :index)} | ||||
| > | ||||
|   <.live_component | ||||
|     module={CanneryWeb.ContainerLive.FormComponent} | ||||
|     id={@container.id || :new} | ||||
|     title={@page_title} | ||||
|     action={@live_action} | ||||
|     container={@container} | ||||
|     return_to={Routes.container_index_path(Endpoint, :index)} | ||||
|     current_user={@current_user} | ||||
|   /> | ||||
| </.modal> | ||||
|  | ||||
| <%= if @live_action == :edit_tags do %> | ||||
|   <.modal return_to={Routes.container_index_path(Endpoint, :index)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.ContainerLive.EditTagsComponent} | ||||
|       id={@container.id} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       container={@container} | ||||
|       current_user={@current_user} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
| <.modal :if={@live_action == :edit_tags} return_to={Routes.container_index_path(Endpoint, :index)}> | ||||
|   <.live_component | ||||
|     module={CanneryWeb.ContainerLive.EditTagsComponent} | ||||
|     id={@container.id} | ||||
|     title={@page_title} | ||||
|     action={@live_action} | ||||
|     container={@container} | ||||
|     current_user={@current_user} | ||||
|   /> | ||||
| </.modal> | ||||
|   | ||||
| @@ -3,24 +3,20 @@ | ||||
|     <%= @container.name %> | ||||
|   </h1> | ||||
|  | ||||
|   <%= if @container.desc do %> | ||||
|     <span class="rounded-lg title text-lg"> | ||||
|       <%= gettext("Description:") %> | ||||
|       <%= @container.desc %> | ||||
|     </span> | ||||
|   <% end %> | ||||
|   <span :if={@container.desc} class="rounded-lg title text-lg"> | ||||
|     <%= gettext("Description:") %> | ||||
|     <%= @container.desc %> | ||||
|   </span> | ||||
|  | ||||
|   <span class="rounded-lg title text-lg"> | ||||
|     <%= gettext("Type:") %> | ||||
|     <%= @container.type %> | ||||
|   </span> | ||||
|  | ||||
|   <%= if @container.location do %> | ||||
|     <span class="rounded-lg title text-lg"> | ||||
|       <%= gettext("Location:") %> | ||||
|       <%= @container.location %> | ||||
|     </span> | ||||
|   <% end %> | ||||
|   <span :if={@container.location} class="rounded-lg title text-lg"> | ||||
|     <%= gettext("Location:") %> | ||||
|     <%= @container.location %> | ||||
|   </span> | ||||
|  | ||||
|   <%= unless @ammo_groups |> Enum.empty?() do %> | ||||
|     <span class="rounded-lg title text-lg"> | ||||
| @@ -82,9 +78,7 @@ | ||||
|     </div> | ||||
|   <% else %> | ||||
|     <div class="flex flex-wrap justify-center items-center"> | ||||
|       <%= for tag <- @container.tags do %> | ||||
|         <.simple_tag_card tag={tag} /> | ||||
|       <% end %> | ||||
|       <.simple_tag_card :for={tag <- @container.tags} tag={tag} /> | ||||
|  | ||||
|       <div class="mx-4 my-2"> | ||||
|         <.link | ||||
| @@ -134,39 +128,39 @@ | ||||
|         </.live_component> | ||||
|       <% else %> | ||||
|         <div class="flex flex-wrap justify-center items-stretch"> | ||||
|           <%= for ammo_group <- @ammo_groups do %> | ||||
|             <.ammo_group_card ammo_group={ammo_group} /> | ||||
|           <% end %> | ||||
|           <.ammo_group_card :for={ammo_group <- @ammo_groups} ammo_group={ammo_group} /> | ||||
|         </div> | ||||
|       <% end %> | ||||
|     <% end %> | ||||
|   </div> | ||||
| </div> | ||||
|  | ||||
| <%= if @live_action in [:edit] do %> | ||||
|   <.modal return_to={Routes.container_show_path(Endpoint, :show, @container)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.ContainerLive.FormComponent} | ||||
|       id={@container.id} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       container={@container} | ||||
|       return_to={Routes.container_show_path(Endpoint, :show, @container)} | ||||
|       current_user={@current_user} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
| <.modal | ||||
|   :if={@live_action == :edit} | ||||
|   return_to={Routes.container_show_path(Endpoint, :show, @container)} | ||||
| > | ||||
|   <.live_component | ||||
|     module={CanneryWeb.ContainerLive.FormComponent} | ||||
|     id={@container.id} | ||||
|     title={@page_title} | ||||
|     action={@live_action} | ||||
|     container={@container} | ||||
|     return_to={Routes.container_show_path(Endpoint, :show, @container)} | ||||
|     current_user={@current_user} | ||||
|   /> | ||||
| </.modal> | ||||
|  | ||||
| <%= if @live_action == :edit_tags do %> | ||||
|   <.modal return_to={Routes.container_show_path(Endpoint, :show, @container)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.ContainerLive.EditTagsComponent} | ||||
|       id={@container.id} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       container={@container} | ||||
|       return_to={Routes.container_show_path(Endpoint, :show, @container)} | ||||
|       current_user={@current_user} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
| <.modal | ||||
|   :if={@live_action == :edit_tags} | ||||
|   return_to={Routes.container_show_path(Endpoint, :show, @container)} | ||||
| > | ||||
|   <.live_component | ||||
|     module={CanneryWeb.ContainerLive.EditTagsComponent} | ||||
|     id={@container.id} | ||||
|     title={@page_title} | ||||
|     action={@live_action} | ||||
|     container={@container} | ||||
|     return_to={Routes.container_show_path(Endpoint, :show, @container)} | ||||
|     current_user={@current_user} | ||||
|   /> | ||||
| </.modal> | ||||
|   | ||||
| @@ -15,162 +15,4 @@ defmodule CanneryWeb.HomeLive do | ||||
|     socket = socket |> assign(page_title: gettext("Home"), admins: admins, version: @version) | ||||
|     {:ok, socket} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def render(assigns) do | ||||
|     ~H""" | ||||
|     <div class="mx-auto px-8 sm:px-16 flex flex-col justify-center items-center text-center space-y-4 max-w-3xl"> | ||||
|       <img | ||||
|         src={Routes.static_path(Endpoint, "/images/cannery.svg")} | ||||
|         alt={gettext("Cannery logo")} | ||||
|         class="inline-block w-32 hover:-mt-2 hover:mb-2 transition-all duration-500 ease-in-out" | ||||
|         title={gettext("isn't he cute >:3")} | ||||
|       /> | ||||
|  | ||||
|       <h1 class="title text-primary-600 text-2xl"> | ||||
|         <%= gettext("Welcome to %{name}", name: "Cannery") %> | ||||
|       </h1> | ||||
|  | ||||
|       <h2 class="title text-primary-600 text-lg"> | ||||
|         <%= gettext("The self-hosted firearm tracker website") %> | ||||
|       </h2> | ||||
|  | ||||
|       <hr class="hr" /> | ||||
|  | ||||
|       <ul class="flex flex-col space-y-4 text-center"> | ||||
|         <li class="flex flex-col justify-center items-center | ||||
|           space-y-2"> | ||||
|           <b class="whitespace-nowrap"> | ||||
|             <%= gettext("Easy to Use:") %> | ||||
|           </b> | ||||
|           <p> | ||||
|             <%= gettext( | ||||
|               "%{name} lets you easily keep an eye on your ammo levels before and after range day", | ||||
|               name: "Cannery" | ||||
|             ) %> | ||||
|           </p> | ||||
|         </li> | ||||
|         <li class="flex flex-col justify-center items-center | ||||
|           space-y-2"> | ||||
|           <b class="whitespace-nowrap"> | ||||
|             <%= gettext("Secure:") %> | ||||
|           </b> | ||||
|           <p> | ||||
|             <%= gettext("Self-host your own instance, or use an instance from someone you trust.") %> | ||||
|             <%= gettext("Your data stays with you, period") %> | ||||
|           </p> | ||||
|         </li> | ||||
|         <li class="flex flex-col justify-center items-center | ||||
|           space-y-2"> | ||||
|           <b class="whitespace-nowrap"> | ||||
|             <%= gettext("Simple:") %> | ||||
|           </b> | ||||
|           <p> | ||||
|             <%= gettext("Access from any internet-capable device") %> | ||||
|           </p> | ||||
|         </li> | ||||
|       </ul> | ||||
|  | ||||
|       <hr class="hr" /> | ||||
|  | ||||
|       <ul class="flex flex-col space-y-2 text-center justify-center"> | ||||
|         <h2 class="title text-primary-600 text-lg"> | ||||
|           <%= gettext("Instance Information") %> | ||||
|         </h2> | ||||
|  | ||||
|         <li class="flex flex-col justify-center space-x-2"> | ||||
|           <b> | ||||
|             <%= gettext("Admins:") %> | ||||
|           </b> | ||||
|           <p> | ||||
|             <%= if @admins |> Enum.empty?() do %> | ||||
|               <.link | ||||
|                 href={Routes.user_registration_path(CanneryWeb.Endpoint, :new)} | ||||
|                 class="hover:underline" | ||||
|               > | ||||
|                 <%= dgettext("prompts", "Register to setup %{name}", name: "Cannery") %> | ||||
|               </.link> | ||||
|             <% else %> | ||||
|               <div class="flex flex-wrap justify-center space-x-2"> | ||||
|                 <%= for admin <- @admins do %> | ||||
|                   <a class="hover:underline" href={"mailto:#{admin.email}"}> | ||||
|                     <%= admin.email %> | ||||
|                   </a> | ||||
|                 <% end %> | ||||
|               </div> | ||||
|             <% end %> | ||||
|           </p> | ||||
|         </li> | ||||
|  | ||||
|         <li class="flex flex-row justify-center space-x-2"> | ||||
|           <b>Registration:</b> | ||||
|           <p> | ||||
|             <%= Application.get_env(:cannery, CanneryWeb.Endpoint)[:registration] | ||||
|             |> case do | ||||
|               "public" -> gettext("Public Signups") | ||||
|               _ -> gettext("Invite Only") | ||||
|             end %> | ||||
|           </p> | ||||
|         </li> | ||||
|  | ||||
|         <li class="flex flex-row justify-center items-center space-x-2"> | ||||
|           <b>Version:</b> | ||||
|           <.link | ||||
|             href="https://gitea.bubbletea.dev/shibao/cannery/src/branch/stable/CHANGELOG.md" | ||||
|             class="flex flex-row justify-center items-center space-x-2 hover:underline" | ||||
|             target="_blank" | ||||
|             rel="noopener noreferrer" | ||||
|           > | ||||
|             <p> | ||||
|               <%= @version %> | ||||
|             </p> | ||||
|             <i class="fas fa-md fa-info-circle"></i> | ||||
|           </.link> | ||||
|         </li> | ||||
|       </ul> | ||||
|  | ||||
|       <hr class="hr" /> | ||||
|  | ||||
|       <ul class="flex flex-col space-y-2 text-center justify-center"> | ||||
|         <h2 class="title text-primary-600 text-lg"> | ||||
|           <%= gettext("Get involved!") %> | ||||
|         </h2> | ||||
|  | ||||
|         <li class="flex flex-col justify-center space-x-2"> | ||||
|           <.link | ||||
|             class="flex flex-row justify-center items-center space-x-2 hover:underline" | ||||
|             href="https://gitea.bubbletea.dev/shibao/cannery" | ||||
|             target="_blank" | ||||
|             rel="noopener noreferrer" | ||||
|           > | ||||
|             <p><%= gettext("View the source code") %></p> | ||||
|             <i class="fas fa-md fa-code"></i> | ||||
|           </.link> | ||||
|         </li> | ||||
|         <li class="flex flex-col justify-center space-x-2"> | ||||
|           <.link | ||||
|             class="flex flex-row justify-center items-center space-x-2 hover:underline" | ||||
|             href="https://weblate.bubbletea.dev/engage/cannery" | ||||
|             target="_blank" | ||||
|             rel="noopener noreferrer" | ||||
|           > | ||||
|             <p><%= gettext("Help translate") %></p> | ||||
|             <i class="fas fa-md fa-language"></i> | ||||
|           </.link> | ||||
|         </li> | ||||
|         <li class="flex flex-col justify-center space-x-2"> | ||||
|           <.link | ||||
|             class="flex flex-row justify-center items-center space-x-2 hover:underline" | ||||
|             href="https://gitea.bubbletea.dev/shibao/cannery/issues/new" | ||||
|             target="_blank" | ||||
|             rel="noopener noreferrer" | ||||
|           > | ||||
|             <p><%= gettext("Report bugs or request features") %></p> | ||||
|             <i class="fas fa-md fa-spider"></i> | ||||
|           </.link> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|     """ | ||||
|   end | ||||
| end | ||||
|   | ||||
							
								
								
									
										144
									
								
								lib/cannery_web/live/home_live.html.heex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								lib/cannery_web/live/home_live.html.heex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,144 @@ | ||||
| <div class="mx-auto px-8 sm:px-16 flex flex-col justify-center items-center text-center space-y-4 max-w-3xl"> | ||||
|   <img | ||||
|     src={Routes.static_path(Endpoint, "/images/cannery.svg")} | ||||
|     alt={gettext("Cannery logo")} | ||||
|     class="inline-block w-32 hover:-mt-2 hover:mb-2 transition-all duration-500 ease-in-out" | ||||
|     title={gettext("isn't he cute >:3")} | ||||
|   /> | ||||
|  | ||||
|   <h1 class="title text-primary-600 text-2xl"> | ||||
|     <%= gettext("Welcome to Cannery") %> | ||||
|   </h1> | ||||
|  | ||||
|   <h2 class="title text-primary-600 text-lg"> | ||||
|     <%= gettext("The self-hosted firearm tracker website") %> | ||||
|   </h2> | ||||
|  | ||||
|   <hr class="hr" /> | ||||
|  | ||||
|   <ul class="flex flex-col space-y-4 text-center"> | ||||
|     <li class="flex flex-col justify-center items-center | ||||
|       space-y-2"> | ||||
|       <b class="whitespace-nowrap"> | ||||
|         <%= gettext("Easy to Use:") %> | ||||
|       </b> | ||||
|       <p> | ||||
|         <%= gettext( | ||||
|           "Cannery lets you easily keep an eye on your ammo levels before and after range day" | ||||
|         ) %> | ||||
|       </p> | ||||
|     </li> | ||||
|     <li class="flex flex-col justify-center items-center space-y-2"> | ||||
|       <b class="whitespace-nowrap"> | ||||
|         <%= gettext("Secure:") %> | ||||
|       </b> | ||||
|       <p> | ||||
|         <%= gettext("Self-host your own instance, or use an instance from someone you trust.") %> | ||||
|         <%= gettext("Your data stays with you, period") %> | ||||
|       </p> | ||||
|     </li> | ||||
|     <li class="flex flex-col justify-center items-center | ||||
|       space-y-2"> | ||||
|       <b class="whitespace-nowrap"> | ||||
|         <%= gettext("Simple:") %> | ||||
|       </b> | ||||
|       <p> | ||||
|         <%= gettext("Access from any internet-capable device") %> | ||||
|       </p> | ||||
|     </li> | ||||
|   </ul> | ||||
|  | ||||
|   <hr class="hr" /> | ||||
|  | ||||
|   <ul class="flex flex-col space-y-2 text-center justify-center"> | ||||
|     <h2 class="title text-primary-600 text-lg"> | ||||
|       <%= gettext("Instance Information") %> | ||||
|     </h2> | ||||
|  | ||||
|     <li class="flex flex-col justify-center space-x-2"> | ||||
|       <b> | ||||
|         <%= gettext("Admins:") %> | ||||
|       </b> | ||||
|       <p> | ||||
|         <%= if @admins |> Enum.empty?() do %> | ||||
|           <.link href={Routes.user_registration_path(Endpoint, :new)} class="hover:underline"> | ||||
|             <%= dgettext("prompts", "Register to setup Cannery") %> | ||||
|           </.link> | ||||
|         <% else %> | ||||
|           <div class="flex flex-wrap justify-center space-x-2"> | ||||
|             <a :for={%{email: email} <- @admins} class="hover:underline" href={"mailto:#{email}"}> | ||||
|               <%= email %> | ||||
|             </a> | ||||
|           </div> | ||||
|         <% end %> | ||||
|       </p> | ||||
|     </li> | ||||
|  | ||||
|     <li class="flex flex-row justify-center space-x-2"> | ||||
|       <b><%= gettext("Registration:") %></b> | ||||
|       <p> | ||||
|         <%= case Application.get_env(:cannery, Cannery.Accounts)[:registration] do | ||||
|           "public" -> gettext("Public Signups") | ||||
|           _ -> gettext("Invite Only") | ||||
|         end %> | ||||
|       </p> | ||||
|     </li> | ||||
|  | ||||
|     <li class="flex flex-row justify-center items-center space-x-2"> | ||||
|       <b><%= gettext("Version:") %></b> | ||||
|       <.link | ||||
|         href="https://gitea.bubbletea.dev/shibao/cannery/src/branch/stable/CHANGELOG.md" | ||||
|         class="flex flex-row justify-center items-center space-x-2 hover:underline" | ||||
|         target="_blank" | ||||
|         rel="noopener noreferrer" | ||||
|       > | ||||
|         <p> | ||||
|           <%= @version %> | ||||
|         </p> | ||||
|         <i class="fas fa-md fa-info-circle"></i> | ||||
|       </.link> | ||||
|     </li> | ||||
|   </ul> | ||||
|  | ||||
|   <hr class="hr" /> | ||||
|  | ||||
|   <ul class="flex flex-col space-y-2 text-center justify-center"> | ||||
|     <h2 class="title text-primary-600 text-lg"> | ||||
|       <%= gettext("Get involved!") %> | ||||
|     </h2> | ||||
|  | ||||
|     <li class="flex flex-col justify-center space-x-2"> | ||||
|       <.link | ||||
|         class="flex flex-row justify-center items-center space-x-2 hover:underline" | ||||
|         href="https://gitea.bubbletea.dev/shibao/cannery" | ||||
|         target="_blank" | ||||
|         rel="noopener noreferrer" | ||||
|       > | ||||
|         <p><%= gettext("View the source code") %></p> | ||||
|         <i class="fas fa-md fa-code"></i> | ||||
|       </.link> | ||||
|     </li> | ||||
|     <li class="flex flex-col justify-center space-x-2"> | ||||
|       <.link | ||||
|         class="flex flex-row justify-center items-center space-x-2 hover:underline" | ||||
|         href="https://weblate.bubbletea.dev/engage/cannery" | ||||
|         target="_blank" | ||||
|         rel="noopener noreferrer" | ||||
|       > | ||||
|         <p><%= gettext("Help translate") %></p> | ||||
|         <i class="fas fa-md fa-language"></i> | ||||
|       </.link> | ||||
|     </li> | ||||
|     <li class="flex flex-col justify-center space-x-2"> | ||||
|       <.link | ||||
|         class="flex flex-row justify-center items-center space-x-2 hover:underline" | ||||
|         href="https://gitea.bubbletea.dev/shibao/cannery/issues/new" | ||||
|         target="_blank" | ||||
|         rel="noopener noreferrer" | ||||
|       > | ||||
|         <p><%= gettext("Report bugs or request features") %></p> | ||||
|         <i class="fas fa-md fa-spider"></i> | ||||
|       </.link> | ||||
|     </li> | ||||
|   </ul> | ||||
| </div> | ||||
| @@ -1,11 +1,11 @@ | ||||
| defmodule CanneryWeb.InviteLive.FormComponent do | ||||
|   @moduledoc """ | ||||
|   Livecomponent that can update or create an Cannery.Invites.Invite | ||||
|   Livecomponent that can update or create an Cannery.Accounts.Invite | ||||
|   """ | ||||
|  | ||||
|   use CanneryWeb, :live_component | ||||
|   alias Cannery.{Accounts.User, Invites, Invites.Invite} | ||||
|   alias Ecto.Changeset | ||||
|   alias Cannery.Accounts.{Invite, Invites, User} | ||||
|   alias Phoenix.LiveView.Socket | ||||
|  | ||||
|   @impl true | ||||
|   | ||||
| @@ -11,11 +11,12 @@ | ||||
|     phx-change="validate" | ||||
|     phx-submit="save" | ||||
|   > | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|       <div class="invalid-feedback col-span-3 text-center"> | ||||
|         <%= changeset_errors(@changeset) %> | ||||
|       </div> | ||||
|     <% end %> | ||||
|     <div | ||||
|       :if={@changeset.action && not @changeset.valid?()} | ||||
|       class="invalid-feedback col-span-3 text-center" | ||||
|     > | ||||
|       <%= changeset_errors(@changeset) %> | ||||
|     </div> | ||||
|  | ||||
|     <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :name, class: "input input-primary col-span-2") %> | ||||
| @@ -25,7 +26,7 @@ | ||||
|     <%= number_input(f, :uses_left, min: 0, class: "input input-primary col-span-2") %> | ||||
|     <%= error_tag(f, :uses_left, "col-span-3") %> | ||||
|     <span class="col-span-3 text-primary-400 italic text-center"> | ||||
|       <%= gettext("Leave \"Uses left\" blank to make invite unlimited") %> | ||||
|       <%= gettext(~s/Leave "Uses left" blank to make invite unlimited/) %> | ||||
|     </span> | ||||
|  | ||||
|     <%= submit(dgettext("actions", "Save"), | ||||
|   | ||||
| @@ -1,11 +1,12 @@ | ||||
| defmodule CanneryWeb.InviteLive.Index do | ||||
|   @moduledoc """ | ||||
|   Liveview to show a Cannery.Invites.Invite index | ||||
|   Liveview to show a Cannery.Accounts.Invite index | ||||
|   """ | ||||
|  | ||||
|   use CanneryWeb, :live_view | ||||
|   import CanneryWeb.Components.{InviteCard, UserCard} | ||||
|   alias Cannery.{Accounts, Invites, Invites.Invite} | ||||
|   alias Cannery.Accounts | ||||
|   alias Cannery.Accounts.{Invite, Invites} | ||||
|   alias CanneryWeb.{Endpoint, HomeLive} | ||||
|   alias Phoenix.LiveView.JS | ||||
|  | ||||
| @@ -17,7 +18,7 @@ defmodule CanneryWeb.InviteLive.Index do | ||||
|       else | ||||
|         prompt = dgettext("errors", "You are not authorized to view this page") | ||||
|         return_to = Routes.live_path(Endpoint, HomeLive) | ||||
|         socket |> put_flash(:error, prompt) |> push_navigate(to: return_to) | ||||
|         socket |> put_flash(:error, prompt) |> push_redirect(to: return_to) | ||||
|       end | ||||
|  | ||||
|     {:ok, socket} | ||||
| @@ -50,7 +51,7 @@ defmodule CanneryWeb.InviteLive.Index do | ||||
|     %{name: invite_name} = | ||||
|       id |> Invites.get_invite!(current_user) |> Invites.delete_invite!(current_user) | ||||
|  | ||||
|     prompt = dgettext("prompts", "%{name} deleted succesfully", name: invite_name) | ||||
|     prompt = dgettext("prompts", "%{invite_name} deleted succesfully", invite_name: invite_name) | ||||
|     {:noreply, socket |> put_flash(:info, prompt) |> display_invites()} | ||||
|   end | ||||
|  | ||||
| @@ -61,10 +62,12 @@ defmodule CanneryWeb.InviteLive.Index do | ||||
|       ) do | ||||
|     socket = | ||||
|       Invites.get_invite!(id, current_user) | ||||
|       |> Invites.update_invite(%{"uses_left" => nil}, current_user) | ||||
|       |> Invites.update_invite(%{uses_left: nil}, current_user) | ||||
|       |> case do | ||||
|         {:ok, %{name: invite_name}} -> | ||||
|           prompt = dgettext("prompts", "%{name} updated succesfully", name: invite_name) | ||||
|           prompt = | ||||
|             dgettext("prompts", "%{invite_name} updated succesfully", invite_name: invite_name) | ||||
|  | ||||
|           socket |> put_flash(:info, prompt) |> display_invites() | ||||
|  | ||||
|         {:error, changeset} -> | ||||
| @@ -81,10 +84,12 @@ defmodule CanneryWeb.InviteLive.Index do | ||||
|       ) do | ||||
|     socket = | ||||
|       Invites.get_invite!(id, current_user) | ||||
|       |> Invites.update_invite(%{"uses_left" => nil, "disabled_at" => nil}, current_user) | ||||
|       |> Invites.update_invite(%{uses_left: nil, disabled_at: nil}, current_user) | ||||
|       |> case do | ||||
|         {:ok, %{name: invite_name}} -> | ||||
|           prompt = dgettext("prompts", "%{name} enabled succesfully", name: invite_name) | ||||
|           prompt = | ||||
|             dgettext("prompts", "%{invite_name} enabled succesfully", invite_name: invite_name) | ||||
|  | ||||
|           socket |> put_flash(:info, prompt) |> display_invites() | ||||
|  | ||||
|         {:error, changeset} -> | ||||
| @@ -103,10 +108,12 @@ defmodule CanneryWeb.InviteLive.Index do | ||||
|  | ||||
|     socket = | ||||
|       Invites.get_invite!(id, current_user) | ||||
|       |> Invites.update_invite(%{"uses_left" => 0, "disabled_at" => now}, current_user) | ||||
|       |> Invites.update_invite(%{uses_left: 0, disabled_at: now}, current_user) | ||||
|       |> case do | ||||
|         {:ok, %{name: invite_name}} -> | ||||
|           prompt = dgettext("prompts", "%{name} disabled succesfully", name: invite_name) | ||||
|           prompt = | ||||
|             dgettext("prompts", "%{invite_name} disabled succesfully", invite_name: invite_name) | ||||
|  | ||||
|           socket |> put_flash(:info, prompt) |> display_invites() | ||||
|  | ||||
|         {:error, changeset} -> | ||||
| @@ -130,7 +137,7 @@ defmodule CanneryWeb.InviteLive.Index do | ||||
|       ) do | ||||
|     %{email: user_email} = Accounts.get_user!(id) |> Accounts.delete_user!(current_user) | ||||
|  | ||||
|     prompt = dgettext("prompts", "%{name} deleted succesfully", name: user_email) | ||||
|     prompt = dgettext("prompts", "%{user_email} deleted succesfully", user_email: user_email) | ||||
|  | ||||
|     {:noreply, socket |> put_flash(:info, prompt) |> display_invites()} | ||||
|   end | ||||
|   | ||||
| @@ -19,69 +19,65 @@ | ||||
|   <% end %> | ||||
|  | ||||
|   <div class="w-full flex flex-row flex-wrap justify-center items-stretch"> | ||||
|     <%= for invite <- @invites do %> | ||||
|       <.invite_card invite={invite}> | ||||
|         <:code_actions> | ||||
|           <form phx-submit="copy_to_clipboard"> | ||||
|             <button | ||||
|               type="submit" | ||||
|               class="mx-2 my-1 btn btn-primary" | ||||
|               phx-click={JS.dispatch("cannery:clipcopy", to: "#code-#{invite.id}")} | ||||
|             > | ||||
|               <%= dgettext("actions", "Copy to clipboard") %> | ||||
|             </button> | ||||
|           </form> | ||||
|         </:code_actions> | ||||
|         <.link | ||||
|           patch={Routes.invite_index_path(Endpoint, :edit, invite)} | ||||
|           class="text-primary-600 link" | ||||
|           data-qa={"edit-#{invite.id}"} | ||||
|         > | ||||
|           <i class="fa-fw fa-lg fas fa-edit"></i> | ||||
|         </.link> | ||||
|  | ||||
|         <.link | ||||
|           href="#" | ||||
|           class="text-primary-600 link" | ||||
|           phx-click="delete_invite" | ||||
|           phx-value-id={invite.id} | ||||
|           data-confirm={ | ||||
|             dgettext("prompts", "Are you sure you want to delete the invite for %{name}?", | ||||
|               name: invite.name | ||||
|             ) | ||||
|           } | ||||
|           data-qa={"delete-#{invite.id}"} | ||||
|         > | ||||
|           <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|         </.link> | ||||
|  | ||||
|         <%= if invite.disabled_at |> is_nil() do %> | ||||
|           <a href="#" class="btn btn-primary" phx-click="disable_invite" phx-value-id={invite.id}> | ||||
|             <%= dgettext("actions", "Disable") %> | ||||
|           </a> | ||||
|         <% else %> | ||||
|           <a href="#" class="btn btn-primary" phx-click="enable_invite" phx-value-id={invite.id}> | ||||
|             <%= dgettext("actions", "Enable") %> | ||||
|           </a> | ||||
|         <% end %> | ||||
|  | ||||
|         <%= if invite.disabled_at |> is_nil() and not (invite.uses_left |> is_nil()) do %> | ||||
|           <a | ||||
|             href="#" | ||||
|             class="btn btn-primary" | ||||
|             phx-click="set_unlimited" | ||||
|             phx-value-id={invite.id} | ||||
|             data-confirm={ | ||||
|               dgettext("prompts", "Are you sure you want to make %{name} unlimited?", | ||||
|                 name: invite.name | ||||
|               ) | ||||
|             } | ||||
|     <.invite_card :for={invite <- @invites} invite={invite} current_user={@current_user}> | ||||
|       <:code_actions> | ||||
|         <form phx-submit="copy_to_clipboard"> | ||||
|           <button | ||||
|             type="submit" | ||||
|             class="mx-2 my-1 btn btn-primary" | ||||
|             phx-click={JS.dispatch("cannery:clipcopy", to: "#code-#{invite.id}")} | ||||
|           > | ||||
|             <%= dgettext("actions", "Set Unlimited") %> | ||||
|           </a> | ||||
|         <% end %> | ||||
|       </.invite_card> | ||||
|     <% end %> | ||||
|             <%= dgettext("actions", "Copy to clipboard") %> | ||||
|           </button> | ||||
|         </form> | ||||
|       </:code_actions> | ||||
|       <.link | ||||
|         patch={Routes.invite_index_path(Endpoint, :edit, invite)} | ||||
|         class="text-primary-600 link" | ||||
|         data-qa={"edit-#{invite.id}"} | ||||
|       > | ||||
|         <i class="fa-fw fa-lg fas fa-edit"></i> | ||||
|       </.link> | ||||
|  | ||||
|       <.link | ||||
|         href="#" | ||||
|         class="text-primary-600 link" | ||||
|         phx-click="delete_invite" | ||||
|         phx-value-id={invite.id} | ||||
|         data-confirm={ | ||||
|           dgettext("prompts", "Are you sure you want to delete the invite for %{invite_name}?", | ||||
|             invite_name: invite.name | ||||
|           ) | ||||
|         } | ||||
|         data-qa={"delete-#{invite.id}"} | ||||
|       > | ||||
|         <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|       </.link> | ||||
|  | ||||
|       <a | ||||
|         href="#" | ||||
|         class="btn btn-primary" | ||||
|         phx-click={if invite.disabled_at, do: "enable_invite", else: "disable_invite"} | ||||
|         phx-value-id={invite.id} | ||||
|       > | ||||
|         <%= if invite.disabled_at, do: gettext("Enable"), else: gettext("Disable") %> | ||||
|       </a> | ||||
|  | ||||
|       <a | ||||
|         :if={invite.disabled_at |> is_nil() and not (invite.uses_left |> is_nil())} | ||||
|         href="#" | ||||
|         class="btn btn-primary" | ||||
|         phx-click="set_unlimited" | ||||
|         phx-value-id={invite.id} | ||||
|         data-confirm={ | ||||
|           dgettext("prompts", "Are you sure you want to make %{invite_name} unlimited?", | ||||
|             invite_name: invite.name | ||||
|           ) | ||||
|         } | ||||
|       > | ||||
|         <%= dgettext("actions", "Set Unlimited") %> | ||||
|       </a> | ||||
|     </.invite_card> | ||||
|   </div> | ||||
|  | ||||
|   <%= unless @admins |> Enum.empty?() do %> | ||||
| @@ -92,25 +88,23 @@ | ||||
|     </h1> | ||||
|  | ||||
|     <div class="w-full flex flex-row flex-wrap justify-center items-stretch"> | ||||
|       <%= for admin <- @admins do %> | ||||
|         <.user_card user={admin}> | ||||
|           <.link | ||||
|             href="#" | ||||
|             class="text-primary-600 link" | ||||
|             phx-click="delete_user" | ||||
|             phx-value-id={admin.id} | ||||
|             data-confirm={ | ||||
|               dgettext( | ||||
|                 "prompts", | ||||
|                 "Are you sure you want to delete %{email}? This action is permanent!", | ||||
|                 email: admin.email | ||||
|               ) | ||||
|             } | ||||
|           > | ||||
|             <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|           </.link> | ||||
|         </.user_card> | ||||
|       <% end %> | ||||
|       <.user_card :for={admin <- @admins} user={admin}> | ||||
|         <.link | ||||
|           href="#" | ||||
|           class="text-primary-600 link" | ||||
|           phx-click="delete_user" | ||||
|           phx-value-id={admin.id} | ||||
|           data-confirm={ | ||||
|             dgettext( | ||||
|               "prompts", | ||||
|               "Are you sure you want to delete %{email}? This action is permanent!", | ||||
|               email: admin.email | ||||
|             ) | ||||
|           } | ||||
|         > | ||||
|           <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|         </.link> | ||||
|       </.user_card> | ||||
|     </div> | ||||
|   <% end %> | ||||
|  | ||||
| @@ -122,39 +116,35 @@ | ||||
|     </h1> | ||||
|  | ||||
|     <div class="w-full flex flex-row flex-wrap justify-center items-stretch"> | ||||
|       <%= for user <- @users do %> | ||||
|         <.user_card user={user}> | ||||
|           <.link | ||||
|             href="#" | ||||
|             class="text-primary-600 link" | ||||
|             phx-click="delete_user" | ||||
|             phx-value-id={user.id} | ||||
|             data-confirm={ | ||||
|               dgettext( | ||||
|                 "prompts", | ||||
|                 "Are you sure you want to delete %{email}? This action is permanent!", | ||||
|                 email: user.email | ||||
|               ) | ||||
|             } | ||||
|           > | ||||
|             <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|           </.link> | ||||
|         </.user_card> | ||||
|       <% end %> | ||||
|       <.user_card :for={user <- @users} user={user}> | ||||
|         <.link | ||||
|           href="#" | ||||
|           class="text-primary-600 link" | ||||
|           phx-click="delete_user" | ||||
|           phx-value-id={user.id} | ||||
|           data-confirm={ | ||||
|             dgettext( | ||||
|               "prompts", | ||||
|               "Are you sure you want to delete %{email}? This action is permanent!", | ||||
|               email: user.email | ||||
|             ) | ||||
|           } | ||||
|         > | ||||
|           <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|         </.link> | ||||
|       </.user_card> | ||||
|     </div> | ||||
|   <% end %> | ||||
| </div> | ||||
|  | ||||
| <%= if @live_action in [:new, :edit] do %> | ||||
|   <.modal return_to={Routes.invite_index_path(Endpoint, :index)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.InviteLive.FormComponent} | ||||
|       id={@invite.id || :new} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       invite={@invite} | ||||
|       return_to={Routes.invite_index_path(Endpoint, :index)} | ||||
|       current_user={@current_user} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
| <.modal :if={@live_action in [:new, :edit]} return_to={Routes.invite_index_path(Endpoint, :index)}> | ||||
|   <.live_component | ||||
|     module={CanneryWeb.InviteLive.FormComponent} | ||||
|     id={@invite.id || :new} | ||||
|     title={@page_title} | ||||
|     action={@live_action} | ||||
|     invite={@invite} | ||||
|     return_to={Routes.invite_index_path(Endpoint, :index)} | ||||
|     current_user={@current_user} | ||||
|   /> | ||||
| </.modal> | ||||
|   | ||||
| @@ -31,10 +31,10 @@ defmodule CanneryWeb.LiveHelpers do | ||||
|       patch={@return_to} | ||||
|       id="modal-bg" | ||||
|       class="fade-in fixed z-10 left-0 top-0 | ||||
|          w-full h-full overflow-hidden | ||||
|          p-8 flex flex-col justify-center items-center cursor-auto" | ||||
|         w-full h-full overflow-hidden | ||||
|         p-8 flex flex-col justify-center items-center cursor-auto" | ||||
|       style="background-color: rgba(0,0,0,0.4);" | ||||
|       phx_remove={hide_modal()} | ||||
|       phx-remove={hide_modal()} | ||||
|     > | ||||
|       <span class="hidden"></span> | ||||
|     </.link> | ||||
| @@ -48,18 +48,18 @@ defmodule CanneryWeb.LiveHelpers do | ||||
|       <div | ||||
|         id="modal-content" | ||||
|         class="fade-in-scale w-full max-w-3xl relative | ||||
|         pointer-events-auto overflow-hidden | ||||
|         px-8 py-4 sm:py-8 flex flex-col justify-center items-center | ||||
|         flex flex-col justify-start items-center | ||||
|         bg-white border-2 rounded-lg" | ||||
|           pointer-events-auto overflow-hidden | ||||
|           px-8 py-4 sm:py-8 | ||||
|           flex flex-col justify-start items-center | ||||
|           bg-white border-2 rounded-lg" | ||||
|       > | ||||
|         <.link | ||||
|           patch={@return_to} | ||||
|           id="close" | ||||
|           class="absolute top-8 right-10 | ||||
|                       text-gray-500 hover:text-gray-800 | ||||
|                       transition-all duration-500 ease-in-out" | ||||
|           phx_remove={hide_modal()} | ||||
|             text-gray-500 hover:text-gray-800 | ||||
|             transition-all duration-500 ease-in-out" | ||||
|           phx-remove={hide_modal()} | ||||
|         > | ||||
|           <i class="fa-fw fa-lg fas fa-times"></i> | ||||
|         </.link> | ||||
| @@ -106,8 +106,8 @@ defmodule CanneryWeb.LiveHelpers do | ||||
|         data-qa={@id} | ||||
|         { | ||||
|           if assigns |> Map.has_key?(:target), | ||||
|             do: %{"phx-click" => @action, "phx-value-value" => @value, "phx-target" => @target}, | ||||
|             else: %{"phx-click" => @action, "phx-value-value" => @value} | ||||
|             do: %{"phx-click": @action, "phx-value-value": @value, "phx-target": @target}, | ||||
|             else: %{"phx-click": @action, "phx-value-value": @value} | ||||
|         } | ||||
|       /> | ||||
|       <div class="w-11 h-6 bg-gray-300 rounded-full peer | ||||
|   | ||||
| @@ -12,11 +12,12 @@ | ||||
|     phx-change="validate" | ||||
|     phx-submit="save" | ||||
|   > | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|       <div class="invalid-feedback col-span-3 text-center"> | ||||
|         <%= changeset_errors(@changeset) %> | ||||
|       </div> | ||||
|     <% end %> | ||||
|     <div | ||||
|       :if={@changeset.action && not @changeset.valid?()} | ||||
|       class="invalid-feedback col-span-3 text-center" | ||||
|     > | ||||
|       <%= changeset_errors(@changeset) %> | ||||
|     </div> | ||||
|  | ||||
|     <%= label(f, :count, gettext("Shots fired"), class: "title text-lg text-primary-600") %> | ||||
|     <%= number_input(f, :count, | ||||
|   | ||||
| @@ -18,28 +18,26 @@ | ||||
|     </.link> | ||||
|  | ||||
|     <div class="w-full flex flex-row flex-wrap justify-center items-stretch"> | ||||
|       <%= for ammo_group <- @ammo_groups do %> | ||||
|         <.ammo_group_card ammo_group={ammo_group}> | ||||
|           <button | ||||
|             type="button" | ||||
|             class="btn btn-primary" | ||||
|             phx-click="toggle_staged" | ||||
|             phx-value-ammo_group_id={ammo_group.id} | ||||
|             data-confirm={"#{dgettext("prompts", "Are you sure you want to unstage this ammo?")}"} | ||||
|           > | ||||
|             <%= if ammo_group.staged, | ||||
|               do: dgettext("actions", "Unstage from range"), | ||||
|               else: dgettext("actions", "Stage for range") %> | ||||
|           </button> | ||||
|       <.ammo_group_card :for={ammo_group <- @ammo_groups} ammo_group={ammo_group}> | ||||
|         <button | ||||
|           type="button" | ||||
|           class="btn btn-primary" | ||||
|           phx-click="toggle_staged" | ||||
|           phx-value-ammo_group_id={ammo_group.id} | ||||
|           data-confirm={"#{dgettext("prompts", "Are you sure you want to unstage this ammo?")}"} | ||||
|         > | ||||
|           <%= if ammo_group.staged, | ||||
|             do: dgettext("actions", "Unstage from range"), | ||||
|             else: dgettext("actions", "Stage for range") %> | ||||
|         </button> | ||||
|  | ||||
|           <.link | ||||
|             patch={Routes.range_index_path(Endpoint, :add_shot_group, ammo_group)} | ||||
|             class="btn btn-primary" | ||||
|           > | ||||
|             <%= dgettext("actions", "Record shots") %> | ||||
|           </.link> | ||||
|         </.ammo_group_card> | ||||
|       <% end %> | ||||
|         <.link | ||||
|           patch={Routes.range_index_path(Endpoint, :add_shot_group, ammo_group)} | ||||
|           class="btn btn-primary" | ||||
|         > | ||||
|           <%= dgettext("actions", "Record shots") %> | ||||
|         </.link> | ||||
|       </.ammo_group_card> | ||||
|     </div> | ||||
|   <% end %> | ||||
|  | ||||
| @@ -128,30 +126,29 @@ | ||||
|   <% end %> | ||||
| </div> | ||||
|  | ||||
| <%= if @live_action in [:edit] do %> | ||||
|   <.modal return_to={Routes.range_index_path(Endpoint, :index)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.RangeLive.FormComponent} | ||||
|       id={@shot_group.id} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       shot_group={@shot_group} | ||||
|       return_to={Routes.range_index_path(Endpoint, :index)} | ||||
|       current_user={@current_user} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
| <.modal :if={@live_action == :edit} return_to={Routes.range_index_path(Endpoint, :index)}> | ||||
|   <.live_component | ||||
|     module={CanneryWeb.RangeLive.FormComponent} | ||||
|     id={@shot_group.id} | ||||
|     title={@page_title} | ||||
|     action={@live_action} | ||||
|     shot_group={@shot_group} | ||||
|     return_to={Routes.range_index_path(Endpoint, :index)} | ||||
|     current_user={@current_user} | ||||
|   /> | ||||
| </.modal> | ||||
|  | ||||
| <%= if @live_action in [:add_shot_group] do %> | ||||
|   <.modal return_to={Routes.range_index_path(Endpoint, :index)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.Components.AddShotGroupComponent} | ||||
|       id={:new} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       ammo_group={@ammo_group} | ||||
|       return_to={Routes.range_index_path(Endpoint, :index)} | ||||
|       current_user={@current_user} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
| <.modal | ||||
|   :if={@live_action == :add_shot_group} | ||||
|   return_to={Routes.range_index_path(Endpoint, :index)} | ||||
| > | ||||
|   <.live_component | ||||
|     module={CanneryWeb.Components.AddShotGroupComponent} | ||||
|     id={:new} | ||||
|     title={@page_title} | ||||
|     action={@live_action} | ||||
|     ammo_group={@ammo_group} | ||||
|     return_to={Routes.range_index_path(Endpoint, :index)} | ||||
|     current_user={@current_user} | ||||
|   /> | ||||
| </.modal> | ||||
|   | ||||
| @@ -50,53 +50,6 @@ defmodule CanneryWeb.TagLive.FormComponent do | ||||
|     socket |> assign(:changeset, changeset) | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def render(assigns) do | ||||
|     ~H""" | ||||
|     <div> | ||||
|       <h2 class="mb-8 text-center title text-xl text-primary-600"> | ||||
|         <%= @title %> | ||||
|       </h2> | ||||
|       <.form | ||||
|         :let={f} | ||||
|         for={@changeset} | ||||
|         id="tag-form" | ||||
|         class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|         phx-target={@myself} | ||||
|         phx-change="validate" | ||||
|         phx-submit="save" | ||||
|       > | ||||
|         <%= if @changeset.action && not @changeset.valid? do %> | ||||
|           <div class="invalid-feedback col-span-3 text-center"> | ||||
|             <%= changeset_errors(@changeset) %> | ||||
|           </div> | ||||
|         <% end %> | ||||
|  | ||||
|         <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %> | ||||
|         <%= text_input(f, :name, class: "input input-primary col-span-2") %> | ||||
|         <%= error_tag(f, :name, "col-span-3") %> | ||||
|  | ||||
|         <%= label(f, :bg_color, gettext("Background color"), class: "title text-lg text-primary-600") %> | ||||
|         <span id="tag-bg-color-input" class="mx-auto col-span-2" phx-update="ignore"> | ||||
|           <%= color_input(f, :bg_color) %> | ||||
|         </span> | ||||
|         <%= error_tag(f, :bg_color, "col-span-3") %> | ||||
|  | ||||
|         <%= label(f, :text_color, gettext("Text color"), class: "title text-lg text-primary-600") %> | ||||
|         <span id="tag-text-color-input" class="mx-auto col-span-2" phx-update="ignore"> | ||||
|           <%= color_input(f, :text_color) %> | ||||
|         </span> | ||||
|         <%= error_tag(f, :text_color, "col-span-3") %> | ||||
|  | ||||
|         <%= submit(dgettext("actions", "Save"), | ||||
|           class: "mx-auto btn btn-primary col-span-3", | ||||
|           phx_disable_with: dgettext("prompts", "Saving...") | ||||
|         ) %> | ||||
|       </.form> | ||||
|     </div> | ||||
|     """ | ||||
|   end | ||||
|  | ||||
|   defp save_tag( | ||||
|          %{assigns: %{tag: tag, current_user: current_user, return_to: return_to}} = socket, | ||||
|          :edit, | ||||
|   | ||||
							
								
								
									
										42
									
								
								lib/cannery_web/live/tag_live/form_component.html.heex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								lib/cannery_web/live/tag_live/form_component.html.heex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| <div> | ||||
|   <h2 class="mb-8 text-center title text-xl text-primary-600"> | ||||
|     <%= @title %> | ||||
|   </h2> | ||||
|   <.form | ||||
|     :let={f} | ||||
|     for={@changeset} | ||||
|     id="tag-form" | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     phx-target={@myself} | ||||
|     phx-change="validate" | ||||
|     phx-submit="save" | ||||
|   > | ||||
|     <div | ||||
|       :if={@changeset.action && not @changeset.valid?()} | ||||
|       class="invalid-feedback col-span-3 text-center" | ||||
|     > | ||||
|       <%= changeset_errors(@changeset) %> | ||||
|     </div> | ||||
|  | ||||
|     <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :name, class: "input input-primary col-span-2") %> | ||||
|     <%= error_tag(f, :name, "col-span-3") %> | ||||
|  | ||||
|     <%= label(f, :bg_color, gettext("Background color"), class: "title text-lg text-primary-600") %> | ||||
|     <span id="tag-bg-color-input" class="mx-auto col-span-2" phx-update="ignore"> | ||||
|       <%= color_input(f, :bg_color) %> | ||||
|     </span> | ||||
|     <%= error_tag(f, :bg_color, "col-span-3") %> | ||||
|  | ||||
|     <%= label(f, :text_color, gettext("Text color"), class: "title text-lg text-primary-600") %> | ||||
|     <span id="tag-text-color-input" class="mx-auto col-span-2" phx-update="ignore"> | ||||
|       <%= color_input(f, :text_color) %> | ||||
|     </span> | ||||
|     <%= error_tag(f, :text_color, "col-span-3") %> | ||||
|  | ||||
|     <%= submit(dgettext("actions", "Save"), | ||||
|       class: "mx-auto btn btn-primary col-span-3", | ||||
|       phx_disable_with: dgettext("prompts", "Saving...") | ||||
|     ) %> | ||||
|   </.form> | ||||
| </div> | ||||
| @@ -45,44 +45,40 @@ | ||||
|     </h2> | ||||
|   <% else %> | ||||
|     <div class="flex flex-row flex-wrap justify-center items-stretch"> | ||||
|       <%= for tag <- @tags do %> | ||||
|         <.tag_card tag={tag}> | ||||
|           <.link | ||||
|             patch={Routes.tag_index_path(Endpoint, :edit, tag)} | ||||
|             class="text-primary-600 link" | ||||
|             data-qa={"edit-#{tag.id}"} | ||||
|           > | ||||
|             <i class="fa-fw fa-lg fas fa-edit"></i> | ||||
|           </.link> | ||||
|       <.tag_card :for={tag <- @tags} tag={tag}> | ||||
|         <.link | ||||
|           patch={Routes.tag_index_path(Endpoint, :edit, tag)} | ||||
|           class="text-primary-600 link" | ||||
|           data-qa={"edit-#{tag.id}"} | ||||
|         > | ||||
|           <i class="fa-fw fa-lg fas fa-edit"></i> | ||||
|         </.link> | ||||
|  | ||||
|           <.link | ||||
|             href="#" | ||||
|             class="text-primary-600 link" | ||||
|             phx-click="delete" | ||||
|             phx-value-id={tag.id} | ||||
|             data-confirm={ | ||||
|               dgettext("prompts", "Are you sure you want to delete %{name}?", name: tag.name) | ||||
|             } | ||||
|             data-qa={"delete-#{tag.id}"} | ||||
|           > | ||||
|             <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|           </.link> | ||||
|         </.tag_card> | ||||
|       <% end %> | ||||
|         <.link | ||||
|           href="#" | ||||
|           class="text-primary-600 link" | ||||
|           phx-click="delete" | ||||
|           phx-value-id={tag.id} | ||||
|           data-confirm={ | ||||
|             dgettext("prompts", "Are you sure you want to delete %{name}?", name: tag.name) | ||||
|           } | ||||
|           data-qa={"delete-#{tag.id}"} | ||||
|         > | ||||
|           <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|         </.link> | ||||
|       </.tag_card> | ||||
|     </div> | ||||
|   <% end %> | ||||
| </div> | ||||
|  | ||||
| <%= if @live_action in [:new, :edit] do %> | ||||
|   <.modal return_to={Routes.tag_index_path(Endpoint, :index)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.TagLive.FormComponent} | ||||
|       id={@tag.id || :new} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       tag={@tag} | ||||
|       return_to={Routes.tag_index_path(Endpoint, :index)} | ||||
|       current_user={@current_user} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
| <.modal :if={@live_action in [:new, :edit]} return_to={Routes.tag_index_path(Endpoint, :index)}> | ||||
|   <.live_component | ||||
|     module={CanneryWeb.TagLive.FormComponent} | ||||
|     id={@tag.id || :new} | ||||
|     title={@page_title} | ||||
|     action={@live_action} | ||||
|     tag={@tag} | ||||
|     return_to={Routes.tag_index_path(Endpoint, :index)} | ||||
|     current_user={@current_user} | ||||
|   /> | ||||
| </.modal> | ||||
|   | ||||
| @@ -57,6 +57,30 @@ defmodule CanneryWeb.Telemetry do | ||||
|           "The time the connection spent waiting before being checked out for the query" | ||||
|       ), | ||||
|  | ||||
|       # Oban Metrics | ||||
|       counter("oban.job.exception", | ||||
|         tags: [:queue, :worker], | ||||
|         event_name: [:oban, :job, :exception], | ||||
|         measurement: :duration, | ||||
|         description: "Number of oban jobs that raised an exception" | ||||
|       ), | ||||
|       counter("oban.job.start", | ||||
|         tags: [:queue, :worker], | ||||
|         event_name: [:oban, :job, :start], | ||||
|         measurement: :system_time, | ||||
|         description: "Number of oban jobs started" | ||||
|       ), | ||||
|       summary("oban.job.stop.duration", | ||||
|         tags: [:queue, :worker], | ||||
|         unit: {:native, :millisecond}, | ||||
|         description: "Length of time spent processing the oban job" | ||||
|       ), | ||||
|       summary("oban.job.stop.queue_time", | ||||
|         tags: [:queue, :worker], | ||||
|         unit: {:native, :millisecond}, | ||||
|         description: "Time the oban job spent waiting in milliseconds" | ||||
|       ), | ||||
|  | ||||
|       # VM Metrics | ||||
|       summary("vm.memory.total", unit: {:byte, :kilobyte}), | ||||
|       summary("vm.total_run_queue_lengths.total"), | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
|     <title> | ||||
|       <%= dgettext("errors", "Error") %>| Cannery | ||||
|       <%= dgettext("errors", "Error") %> | <%= gettext("Cannery") %> | ||||
|     </title> | ||||
|     <link rel="stylesheet" href="/css/app.css" /> | ||||
|     <script defer type="text/javascript" src="/js/app.js"> | ||||
|   | ||||
| @@ -3,16 +3,12 @@ | ||||
|     <.topbar current_user={assigns[:current_user]}></.topbar> | ||||
|  | ||||
|     <div class="mx-8 my-2 flex flex-col space-y-4 text-center"> | ||||
|       <%= if get_flash(@conn, :info) do %> | ||||
|         <p class="alert alert-info" role="alert"> | ||||
|           <%= get_flash(@conn, :info) %> | ||||
|         </p> | ||||
|       <% end %> | ||||
|       <%= if get_flash(@conn, :error) do %> | ||||
|         <p class="alert alert-danger" role="alert"> | ||||
|           <%= get_flash(@conn, :error) %> | ||||
|         </p> | ||||
|       <% end %> | ||||
|       <p :if={get_flash(@conn, :info)} class="alert alert-info" role="alert"> | ||||
|         <%= get_flash(@conn, :info) %> | ||||
|       </p> | ||||
|       <p :if={get_flash(@conn, :error)} class="alert alert-danger" role="alert"> | ||||
|         <%= get_flash(@conn, :error) %> | ||||
|       </p> | ||||
|     </div> | ||||
|   </header> | ||||
|  | ||||
|   | ||||
| @@ -3,22 +3,25 @@ | ||||
|     <.topbar current_user={assigns[:current_user]}></.topbar> | ||||
|  | ||||
|     <div class="mx-8 my-2 flex flex-col space-y-4 text-center"> | ||||
|       <%= if @flash && @flash |> Map.has_key?("info") do %> | ||||
|         <p class="alert alert-info" role="alert" phx-click="lv:clear-flash" phx-value-key="info"> | ||||
|           <%= live_flash(@flash, "info") %> | ||||
|         </p> | ||||
|       <% end %> | ||||
|       <p | ||||
|         :if={@flash && @flash |> Map.has_key?("info")} | ||||
|         class="alert alert-info" | ||||
|         role="alert" | ||||
|         phx-click="lv:clear-flash" | ||||
|         phx-value-key="info" | ||||
|       > | ||||
|         <%= live_flash(@flash, "info") %> | ||||
|       </p> | ||||
|  | ||||
|       <%= if @flash && @flash |> Map.has_key?("error") do %> | ||||
|         <p | ||||
|           class="alert alert-danger" | ||||
|           role="alert" | ||||
|           phx-click="lv:clear-flash" | ||||
|           phx-value-key="error" | ||||
|         > | ||||
|           <%= live_flash(@flash, "error") %> | ||||
|         </p> | ||||
|       <% end %> | ||||
|       <p | ||||
|         :if={@flash && @flash |> Map.has_key?("error")} | ||||
|         class="alert alert-danger" | ||||
|         role="alert" | ||||
|         phx-click="lv:clear-flash" | ||||
|         phx-value-key="error" | ||||
|       > | ||||
|         <%= live_flash(@flash, "error") %> | ||||
|       </p> | ||||
|     </div> | ||||
|   </header> | ||||
|  | ||||
|   | ||||
| @@ -1,31 +1,32 @@ | ||||
| <div class="mx-auto mb-8 max-w-2xl flex flex-col justify-center items-center space-y-4"> | ||||
| <div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4"> | ||||
|   <h1 class="title text-primary-600 text-xl"> | ||||
|     <%= dgettext("actions", "Resend confirmation instructions") %> | ||||
|   </h1> | ||||
|  | ||||
|   <%= form_for :user, | ||||
|            Routes.user_confirmation_path(@conn, :create), | ||||
|            [ | ||||
|              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 -> %> | ||||
|   <.form | ||||
|     :let={f} | ||||
|     for={:user} | ||||
|     action={Routes.user_confirmation_path(@conn, :create)} | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|   > | ||||
|     <%= label(f, :email, class: "title text-lg text-primary-600") %> | ||||
|     <%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %> | ||||
|  | ||||
|     <%= submit(dgettext("actions", "Resend confirmation instructions"), | ||||
|       class: "mx-auto btn btn-primary col-span-3" | ||||
|     ) %> | ||||
|   <% end %> | ||||
|   </.form> | ||||
|  | ||||
|   <hr class="hr" /> | ||||
|  | ||||
|   <div class="flex flex-row justify-center items-center space-x-4"> | ||||
|     <%= if Accounts.allow_registration?() do %> | ||||
|       <.link href={Routes.user_registration_path(@conn, :new)} class="btn btn-primary"> | ||||
|         <%= dgettext("actions", "Register") %> | ||||
|       </.link> | ||||
|     <% end %> | ||||
|     <.link | ||||
|       :if={Accounts.allow_registration?()} | ||||
|       href={Routes.user_registration_path(@conn, :new)} | ||||
|       class="btn btn-primary" | ||||
|     > | ||||
|       <%= dgettext("actions", "Register") %> | ||||
|     </.link> | ||||
|     <.link href={Routes.user_session_path(@conn, :new)} class="btn btn-primary"> | ||||
|       <%= dgettext("actions", "Log in") %> | ||||
|     </.link> | ||||
|   | ||||
| @@ -1,25 +1,20 @@ | ||||
| <div class="mx-auto mb-8 max-w-2xl flex flex-col justify-center items-center space-y-4"> | ||||
| <div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4"> | ||||
|   <h1 class="title text-primary-600 text-xl"> | ||||
|     <%= dgettext("actions", "Register") %> | ||||
|   </h1> | ||||
|  | ||||
|   <%= form_for @changeset, | ||||
|            Routes.user_registration_path(@conn, :create), | ||||
|            [ | ||||
|              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 -> %> | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|       <div class="alert alert-danger col-span-3"> | ||||
|         <p> | ||||
|           <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> | ||||
|         </p> | ||||
|       </div> | ||||
|     <% end %> | ||||
|   <.form | ||||
|     :let={f} | ||||
|     for={@changeset} | ||||
|     action={Routes.user_registration_path(@conn, :create)} | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|   > | ||||
|     <p :if={@changeset.action && not @changeset.valid?()} class="alert alert-danger col-span-3"> | ||||
|       <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> | ||||
|     </p> | ||||
|  | ||||
|     <%= if @invite do %> | ||||
|       <%= hidden_input(f, :invite_token, value: @invite.token) %> | ||||
|     <%= if @invite_token do %> | ||||
|       <%= hidden_input(f, :invite_token, value: @invite_token) %> | ||||
|     <% end %> | ||||
|  | ||||
|     <%= label(f, :email, class: "title text-lg text-primary-600") %> | ||||
| @@ -34,13 +29,13 @@ | ||||
|     <%= select( | ||||
|       f, | ||||
|       :locale, | ||||
|       [{gettext("English"), "en_US"}, {gettext("German"), "de"}, {gettext("French"), "fr"}], | ||||
|       [{gettext("English"), "en_US"}], | ||||
|       class: "input input-primary col-span-2" | ||||
|     ) %> | ||||
|     <%= error_tag(f, :locale) %> | ||||
|  | ||||
|     <%= submit(dgettext("actions", "Register"), class: "mx-auto btn btn-primary col-span-3") %> | ||||
|   <% end %> | ||||
|   </.form> | ||||
|  | ||||
|   <hr class="hr" /> | ||||
|  | ||||
|   | ||||
| @@ -1,22 +1,19 @@ | ||||
| <div class="mx-auto mb-8 max-w-2xl flex flex-col justify-center items-center space-y-4"> | ||||
| <div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4"> | ||||
|   <h1 class="title text-primary-600 text-xl"> | ||||
|     <%= dgettext("actions", "Reset password") %> | ||||
|   </h1> | ||||
|  | ||||
|   <%= form_for @changeset, | ||||
|            Routes.user_reset_password_path(@conn, :update, @token), | ||||
|            [ | ||||
|              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 -> %> | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|       <div class="alert alert-danger col-span-3"> | ||||
|         <p> | ||||
|           <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> | ||||
|         </p> | ||||
|       </div> | ||||
|     <% end %> | ||||
|   <.form | ||||
|     :let={f} | ||||
|     for={@changeset} | ||||
|     action={Routes.user_reset_password_path(@conn, :update, @token)} | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|   > | ||||
|     <div :if={@changeset.action && not @changeset.valid?()} class="alert alert-danger col-span-3"> | ||||
|       <p> | ||||
|         <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> | ||||
|       </p> | ||||
|     </div> | ||||
|  | ||||
|     <%= label(f, :password, "New password", class: "title text-lg text-primary-600") %> | ||||
|     <%= password_input(f, :password, required: true, class: "input input-primary col-span-2") %> | ||||
| @@ -34,16 +31,18 @@ | ||||
|     <%= submit(dgettext("actions", "Reset password"), | ||||
|       class: "mx-auto btn btn-primary col-span-3" | ||||
|     ) %> | ||||
|   <% end %> | ||||
|   </.form> | ||||
|  | ||||
|   <hr class="hr" /> | ||||
|  | ||||
|   <div class="flex flex-row justify-center items-center space-x-4"> | ||||
|     <%= if Accounts.allow_registration?() do %> | ||||
|       <.link href={Routes.user_registration_path(@conn, :new)} class="btn btn-primary"> | ||||
|         <%= dgettext("actions", "Register") %> | ||||
|       </.link> | ||||
|     <% end %> | ||||
|     <.link | ||||
|       :if={Accounts.allow_registration?()} | ||||
|       href={Routes.user_registration_path(@conn, :new)} | ||||
|       class="btn btn-primary" | ||||
|     > | ||||
|       <%= dgettext("actions", "Register") %> | ||||
|     </.link> | ||||
|     <.link href={Routes.user_session_path(@conn, :new)} class="btn btn-primary"> | ||||
|       <%= dgettext("actions", "Log in") %> | ||||
|     </.link> | ||||
|   | ||||
| @@ -1,31 +1,32 @@ | ||||
| <div class="mx-auto mb-8 max-w-2xl flex flex-col justify-center items-center space-y-4"> | ||||
| <div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4"> | ||||
|   <h1 class="title text-primary-600 text-xl"> | ||||
|     <%= dgettext("actions", "Forgot your password?") %> | ||||
|   </h1> | ||||
|  | ||||
|   <%= form_for :user, | ||||
|            Routes.user_reset_password_path(@conn, :create), | ||||
|            [ | ||||
|              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 -> %> | ||||
|   <.form | ||||
|     :let={f} | ||||
|     for={:user} | ||||
|     action={Routes.user_reset_password_path(@conn, :create)} | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|   > | ||||
|     <%= label(f, :email, class: "title text-lg text-primary-600") %> | ||||
|     <%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %> | ||||
|  | ||||
|     <%= submit(dgettext("actions", "Send instructions to reset password"), | ||||
|       class: "mx-auto btn btn-primary col-span-3" | ||||
|     ) %> | ||||
|   <% end %> | ||||
|   </.form> | ||||
|  | ||||
|   <hr class="hr" /> | ||||
|  | ||||
|   <div class="flex flex-row justify-center items-center space-x-4"> | ||||
|     <%= if Accounts.allow_registration?() do %> | ||||
|       <.link href={Routes.user_registration_path(@conn, :new)} class="btn btn-primary"> | ||||
|         <%= dgettext("actions", "Register") %> | ||||
|       </.link> | ||||
|     <% end %> | ||||
|     <.link | ||||
|       :if={Accounts.allow_registration?()} | ||||
|       href={Routes.user_registration_path(@conn, :new)} | ||||
|       class="btn btn-primary" | ||||
|     > | ||||
|       <%= dgettext("actions", "Register") %> | ||||
|     </.link> | ||||
|     <.link href={Routes.user_session_path(@conn, :new)} class="btn btn-primary"> | ||||
|       <%= dgettext("actions", "Log in") %> | ||||
|     </.link> | ||||
|   | ||||
| @@ -1,23 +1,20 @@ | ||||
| <div class="mx-auto mb-8 max-w-2xl flex flex-col justify-center items-center space-y-4"> | ||||
| <div class="mx-auto pb-8 max-w-2xl flex flex-col justify-center items-center space-y-4"> | ||||
|   <h1 class="title text-primary-600 text-xl"> | ||||
|     <%= dgettext("actions", "Log in") %> | ||||
|   </h1> | ||||
|  | ||||
|   <%= form_for @conn, | ||||
|            Routes.user_session_path(@conn, :create), | ||||
|            [ | ||||
|              as: :user, | ||||
|              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 -> %> | ||||
|     <%= if @error_message do %> | ||||
|       <div class="alert alert-danger col-span-3"> | ||||
|         <p> | ||||
|           <%= @error_message %> | ||||
|         </p> | ||||
|       </div> | ||||
|     <% end %> | ||||
|   <.form | ||||
|     :let={f} | ||||
|     for={@conn} | ||||
|     action={Routes.user_session_path(@conn, :create)} | ||||
|     as="user" | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|   > | ||||
|     <div :if={@error_message} class="alert alert-danger col-span-3"> | ||||
|       <p> | ||||
|         <%= @error_message %> | ||||
|       </p> | ||||
|     </div> | ||||
|  | ||||
|     <%= label(f, :email, class: "title text-lg text-primary-600") %> | ||||
|     <%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %> | ||||
| @@ -31,16 +28,18 @@ | ||||
|     <%= checkbox(f, :remember_me, class: "checkbox col-span-2") %> | ||||
|  | ||||
|     <%= submit(dgettext("actions", "Log in"), class: "mx-auto btn btn-primary col-span-3") %> | ||||
|   <% end %> | ||||
|   </.form> | ||||
|  | ||||
|   <hr class="hr" /> | ||||
|  | ||||
|   <div class="flex flex-row justify-center items-center space-x-4"> | ||||
|     <%= if Accounts.allow_registration?() do %> | ||||
|       <.link href={Routes.user_registration_path(@conn, :new)} class="btn btn-primary"> | ||||
|         <%= dgettext("actions", "Register") %> | ||||
|       </.link> | ||||
|     <% end %> | ||||
|     <.link | ||||
|       :if={Accounts.allow_registration?()} | ||||
|       href={Routes.user_registration_path(@conn, :new)} | ||||
|       class="btn btn-primary" | ||||
|     > | ||||
|       <%= dgettext("actions", "Register") %> | ||||
|     </.link> | ||||
|     <.link href={Routes.user_reset_password_path(@conn, :new)} class="btn btn-primary"> | ||||
|       <%= dgettext("actions", "Forgot your password?") %> | ||||
|     </.link> | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| <div class="mx-auto mb-8 max-w-2xl flex flex-col justify-center items-center text-center space-y-4"> | ||||
| <div class="mx-auto pb-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"> | ||||
|     <%= gettext("Settings") %> | ||||
|   </h1> | ||||
| @@ -15,13 +15,14 @@ | ||||
|       <%= dgettext("actions", "Change email") %> | ||||
|     </h3> | ||||
|  | ||||
|     <%= if @email_changeset.action && not @email_changeset.valid? do %> | ||||
|       <div class="alert alert-danger col-span-3"> | ||||
|         <p> | ||||
|           <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> | ||||
|         </p> | ||||
|       </div> | ||||
|     <% end %> | ||||
|     <div | ||||
|       :if={@email_changeset.action && not @email_changeset.valid?()} | ||||
|       class="alert alert-danger col-span-3" | ||||
|     > | ||||
|       <p> | ||||
|         <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> | ||||
|       </p> | ||||
|     </div> | ||||
|  | ||||
|     <%= hidden_input(f, :action, name: "action", value: "update_email") %> | ||||
|  | ||||
| @@ -58,13 +59,14 @@ | ||||
|       <%= dgettext("actions", "Change password") %> | ||||
|     </h3> | ||||
|  | ||||
|     <%= if @password_changeset.action && not @password_changeset.valid? do %> | ||||
|       <div class="alert alert-danger col-span-3"> | ||||
|         <p> | ||||
|           <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> | ||||
|         </p> | ||||
|       </div> | ||||
|     <% end %> | ||||
|     <div | ||||
|       :if={@password_changeset.action && not @password_changeset.valid?()} | ||||
|       class="alert alert-danger col-span-3" | ||||
|     > | ||||
|       <p> | ||||
|         <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> | ||||
|       </p> | ||||
|     </div> | ||||
|  | ||||
|     <%= hidden_input(f, :action, name: "action", value: "update_password") %> | ||||
|  | ||||
| @@ -113,13 +115,14 @@ | ||||
|       <%= 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 %> | ||||
|     <div | ||||
|       :if={@locale_changeset.action && not @locale_changeset.valid?()} | ||||
|       class="alert alert-danger" | ||||
|     > | ||||
|       <p> | ||||
|         <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %> | ||||
|       </p> | ||||
|     </div> | ||||
|  | ||||
|     <%= hidden_input(f, :action, name: "action", value: "update_locale") %> | ||||
|  | ||||
|   | ||||
| @@ -17,11 +17,13 @@ defmodule CanneryWeb.ErrorHelpers do | ||||
|     assigns = %{extra_class: extra_class, form: form, field: field} | ||||
|  | ||||
|     ~H""" | ||||
|     <%= for error <- Keyword.get_values(@form.errors, @field) do %> | ||||
|       <span class={["invalid-feedback", @extra_class]} phx-feedback-for={input_name(@form, @field)}> | ||||
|         <%= translate_error(error) %> | ||||
|       </span> | ||||
|     <% end %> | ||||
|     <span | ||||
|       :for={error <- Keyword.get_values(@form.errors, @field)} | ||||
|       class={["invalid-feedback", @extra_class]} | ||||
|       phx-feedback-for={input_name(@form, @field)} | ||||
|     > | ||||
|       <%= translate_error(error) %> | ||||
|     </span> | ||||
|     """ | ||||
|   end | ||||
|  | ||||
|   | ||||
| @@ -7,11 +7,11 @@ defmodule CanneryWeb.LayoutView do | ||||
|   # so we instruct Elixir to not warn if the dashboard route is missing. | ||||
|   @compile {:no_warn_undefined, {Routes, :live_dashboard_path, 2}} | ||||
|  | ||||
|   def get_title(conn) do | ||||
|     if conn.assigns |> Map.has_key?(:title) do | ||||
|       "Cannery | #{conn.assigns.title}" | ||||
|     else | ||||
|       "Cannery" | ||||
|     end | ||||
|   def get_title(%{assigns: %{title: title}}) when title not in [nil, ""] do | ||||
|     gettext("Cannery | %{title}", title: title) | ||||
|   end | ||||
|  | ||||
|   def get_title(_conn) do | ||||
|     gettext("Cannery") | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -16,19 +16,18 @@ defmodule CanneryWeb.ViewHelpers do | ||||
|  | ||||
|   def datetime(assigns) do | ||||
|     ~H""" | ||||
|     <%= if @datetime do %> | ||||
|       <time | ||||
|         datetime={cast_datetime(@datetime)} | ||||
|         x-data={"{ | ||||
|           datetime: | ||||
|             Intl.DateTimeFormat([], {dateStyle: 'short', timeStyle: 'long'}) | ||||
|               .format(new Date(\"#{cast_datetime(@datetime)}\")) | ||||
|         }"} | ||||
|         x-text="datetime" | ||||
|       > | ||||
|         <%= cast_datetime(@datetime) %> | ||||
|       </time> | ||||
|     <% end %> | ||||
|     <time | ||||
|       :if={@datetime} | ||||
|       datetime={cast_datetime(@datetime)} | ||||
|       x-data={"{ | ||||
|         datetime: | ||||
|           Intl.DateTimeFormat([], {dateStyle: 'short', timeStyle: 'long'}) | ||||
|             .format(new Date(\"#{cast_datetime(@datetime)}\")) | ||||
|       }"} | ||||
|       x-text="datetime" | ||||
|     > | ||||
|       <%= cast_datetime(@datetime) %> | ||||
|     </time> | ||||
|     """ | ||||
|   end | ||||
|  | ||||
| @@ -48,19 +47,18 @@ defmodule CanneryWeb.ViewHelpers do | ||||
|  | ||||
|   def date(assigns) do | ||||
|     ~H""" | ||||
|     <%= if @date do %> | ||||
|       <time | ||||
|         datetime={@date |> Date.to_iso8601(:extended)} | ||||
|         x-data={"{ | ||||
|           date: | ||||
|             Intl.DateTimeFormat([], {timeZone: 'Etc/UTC', dateStyle: 'short'}) | ||||
|               .format(new Date(\"#{@date |> Date.to_iso8601(:extended)}\")) | ||||
|         }"} | ||||
|         x-text="date" | ||||
|       > | ||||
|         <%= @date |> Date.to_iso8601(:extended) %> | ||||
|       </time> | ||||
|     <% end %> | ||||
|     <time | ||||
|       :if={@date} | ||||
|       datetime={@date |> Date.to_iso8601(:extended)} | ||||
|       x-data={"{ | ||||
|         date: | ||||
|           Intl.DateTimeFormat([], {timeZone: 'Etc/UTC', dateStyle: 'short'}) | ||||
|             .format(new Date(\"#{@date |> Date.to_iso8601(:extended)}\")) | ||||
|       }"} | ||||
|       x-text="date" | ||||
|     > | ||||
|       <%= @date |> Date.to_iso8601(:extended) %> | ||||
|     </time> | ||||
|     """ | ||||
|   end | ||||
|  | ||||
|   | ||||
							
								
								
									
										4
									
								
								mix.exs
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								mix.exs
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ defmodule Cannery.MixProject do | ||||
|   def project do | ||||
|     [ | ||||
|       app: :cannery, | ||||
|       version: "0.8.1", | ||||
|       version: "0.8.2", | ||||
|       elixir: "1.14.1", | ||||
|       elixirc_paths: elixirc_paths(Mix.env()), | ||||
|       compilers: Mix.compilers(), | ||||
| @@ -34,7 +34,7 @@ defmodule Cannery.MixProject do | ||||
|   def application do | ||||
|     [ | ||||
|       mod: {Cannery.Application, []}, | ||||
|       extra_applications: [:logger, :runtime_tools, :os_mon] | ||||
|       extra_applications: [:logger, :runtime_tools, :os_mon, :crypto] | ||||
|     ] | ||||
|   end | ||||
|  | ||||
|   | ||||
| @@ -12,12 +12,12 @@ msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:62 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:36 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add your first box!" | ||||
| msgstr "" | ||||
| @@ -33,13 +33,13 @@ msgid "Add your first type!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:15 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change email" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:58 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:99 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:59 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:101 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change password" | ||||
| msgstr "" | ||||
| @@ -49,14 +49,14 @@ msgstr "" | ||||
| msgid "Create Invite" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:162 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Delete User" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:52 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:47 | ||||
| #: 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:44 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Forgot your password?" | ||||
| msgstr "" | ||||
| @@ -66,13 +66,13 @@ msgstr "" | ||||
| msgid "Invite someone new!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:137 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:49 | ||||
| #: 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/components/topbar.ex:135 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:47 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Log in" | ||||
| msgstr "" | ||||
| @@ -97,51 +97,51 @@ msgstr "" | ||||
| msgid "New Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:128 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:26 | ||||
| #: lib/cannery_web/components/topbar.ex:127 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:26 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Resend confirmation instructions" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:34 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reset password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:53 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:81 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:156 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:91 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Save" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Send instructions to reset password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:80 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Why not add one?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:50 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add" | ||||
| msgstr "" | ||||
| @@ -156,9 +156,9 @@ msgstr "" | ||||
| msgid "Why not get some ready to shoot?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:100 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:101 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:101 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Record shots" | ||||
| msgstr "" | ||||
| @@ -178,27 +178,27 @@ msgstr "" | ||||
| msgid "Select" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copy to clipboard" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add a container first" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:74 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Create" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:113 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change Language" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:139 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:142 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change language" | ||||
| msgstr "" | ||||
| @@ -208,44 +208,34 @@ msgstr "" | ||||
| msgid "View in Catalog" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add an ammo type first" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:80 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:78 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Set Unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:86 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage for range" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage from range" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:153 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:156 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Export Data as JSON" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -25,12 +25,12 @@ msgstr "" | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:62 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add Ammo" | ||||
| msgstr "Munition hinzufügen" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:36 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add your first box!" | ||||
| msgstr "Fügen Sie ihre erste Box hinzu!" | ||||
| @@ -46,13 +46,13 @@ msgid "Add your first type!" | ||||
| msgstr "Fügen Sie ihre erste Munitionsart hinzu!" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:15 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change email" | ||||
| msgstr "Mailadresse ändern" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:58 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:99 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:59 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:101 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change password" | ||||
| msgstr "Passwort ändern" | ||||
| @@ -62,14 +62,14 @@ msgstr "Passwort ändern" | ||||
| msgid "Create Invite" | ||||
| msgstr "Einladung erstellen" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:162 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Delete User" | ||||
| msgstr "Benutzer löschen" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:52 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:47 | ||||
| #: 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:44 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Forgot your password?" | ||||
| msgstr "Passwort vergessen?" | ||||
| @@ -79,13 +79,13 @@ msgstr "Passwort vergessen?" | ||||
| msgid "Invite someone new!" | ||||
| msgstr "Laden Sie jemanden ein!" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:137 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:49 | ||||
| #: 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/components/topbar.ex:135 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:47 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Log in" | ||||
| msgstr "Einloggen" | ||||
| @@ -110,51 +110,51 @@ msgstr "Neuer Behälter" | ||||
| msgid "New Tag" | ||||
| msgstr "Neuer Tag" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:128 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:26 | ||||
| #: lib/cannery_web/components/topbar.ex:127 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:26 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "Registrieren" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Resend confirmation instructions" | ||||
| msgstr "Bestätigungsmail erneut senden" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:34 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reset password" | ||||
| msgstr "Passwort zurücksetzen" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:53 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:81 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:156 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:91 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Save" | ||||
| msgstr "Speichern" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Send instructions to reset password" | ||||
| msgstr "Anleitung zum Passwort zurücksetzen zusenden" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:80 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Why not add one?" | ||||
| msgstr "Warum fügen Sie keine hinzu?" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:50 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add" | ||||
| msgstr "Hinzufügen" | ||||
| @@ -169,9 +169,9 @@ msgstr "Munition markieren" | ||||
| msgid "Why not get some ready to shoot?" | ||||
| msgstr "Warum nicht einige für den Schießstand auswählen?" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:100 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:101 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:101 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Record shots" | ||||
| msgstr "Schüsse dokumentieren" | ||||
| @@ -191,27 +191,27 @@ msgstr "Behälter verschieben" | ||||
| msgid "Select" | ||||
| msgstr "Markieren" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copy to clipboard" | ||||
| msgstr "In die Zwischenablage kopieren" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add a container first" | ||||
| msgstr "Zuerst einen Behälter hinzufügen" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:74 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Create" | ||||
| msgstr "Erstellen" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:113 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change Language" | ||||
| msgstr "Sprache wechseln" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:139 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:142 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change language" | ||||
| msgstr "Sprache wechseln" | ||||
| @@ -221,44 +221,34 @@ msgstr "Sprache wechseln" | ||||
| msgid "View in Catalog" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add an ammo type first" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:80 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:78 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Set Unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:86 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage for range" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage from range" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:153 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:156 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Export Data as JSON" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -14,33 +14,17 @@ msgstr "" | ||||
| "Plural-Forms: nplurals=2; plural=n != 1;\n" | ||||
| "X-Generator: Weblate 4.12.1\n" | ||||
|  | ||||
| ## This file is a PO Template file. | ||||
| ## | ||||
| ## "msgid"s here are often extracted from source code. | ||||
| ## Add new translations manually only if they're dynamic | ||||
| ## translations that can't be statically extracted. | ||||
| ## | ||||
| ## Run "mix gettext.extract" to bring this file up to | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/home_live.ex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
| "Mit %{name} können Sie ihren Munitionsbestand vor und nach dem Schießen " | ||||
| "leicht im Auge behalten" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.html.heex:46 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "Zugriff von jedem Internet-fähigen Gerät" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:91 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins" | ||||
| msgstr "Admins" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:83 | ||||
| #: lib/cannery_web/live/home_live.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins:" | ||||
| msgstr "Admins:" | ||||
| @@ -55,60 +39,60 @@ msgid "Ammo" | ||||
| msgstr "Munition" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:89 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Ammo type" | ||||
| msgstr "Munitionsarten" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Background color" | ||||
| msgstr "Hintergrundfarbe" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:141 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Blank" | ||||
| msgstr "Knallpatrone" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:69 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Brass" | ||||
| msgstr "Messing" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet core" | ||||
| msgstr "Projektilkern" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet type" | ||||
| msgstr "Patronenart" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:49 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:59 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Caliber" | ||||
| msgstr "Kaliber" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:48 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cartridge" | ||||
| msgstr "Patrone" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:50 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:66 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Case material" | ||||
| msgstr "Gehäusematerial" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:65 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:57 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container" | ||||
| msgstr "Behälter" | ||||
| @@ -122,42 +106,42 @@ msgid "Containers" | ||||
| msgstr "Behälter" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:66 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:145 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Corrosive" | ||||
| msgstr "Korrosiv" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:76 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count" | ||||
| msgstr "Anzahl" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:38 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:8 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count:" | ||||
| msgstr "Anzahl:" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:25 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description" | ||||
| msgstr "Beschreibung" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:8 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:7 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description:" | ||||
| msgstr "Beschreibung:" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| #: lib/cannery_web/live/home_live.html.heex:23 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Easy to Use:" | ||||
| msgstr "Einfache Anwendung:" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:33 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:34 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Edit Invite" | ||||
| msgstr "Einladung bearbeiten" | ||||
| @@ -167,95 +151,95 @@ msgstr "Einladung bearbeiten" | ||||
| msgid "Edit Tag" | ||||
| msgstr "Tag bearbeiten" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Example bullet type abbreviations" | ||||
| msgstr "Beispiel Munitionstyp Abkürzungen" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "FMJ" | ||||
| msgstr "VM" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:59 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Grains" | ||||
| msgstr "Körner" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Incendiary" | ||||
| msgstr "Brandmunition" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:78 | ||||
| #: lib/cannery_web/live/home_live.html.heex:55 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Instance Information" | ||||
| msgstr "Instanzinformationen" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:41 | ||||
| #: lib/cannery_web/components/invite_card.ex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Disabled" | ||||
| msgstr "Einladung deaktiviert" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:111 | ||||
| #: lib/cannery_web/live/home_live.html.heex:82 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Only" | ||||
| msgstr "Nur mit Einladung" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:90 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:41 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:42 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invites" | ||||
| msgstr "Einladungen" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Keep me logged in for 60 days" | ||||
| msgstr "Für 60 Tage eingeloggt bleiben" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:48 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:69 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location" | ||||
| msgstr "Standort" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:51 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:20 | ||||
| #: lib/cannery_web/components/container_card.ex:49 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:17 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location:" | ||||
| msgstr "Standort:" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:38 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Magazine, Clip, Ammo Box, etc" | ||||
| msgstr "Magazin, Ladestreifen, Munitionskiste usw." | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:149 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Manufacturer" | ||||
| msgstr "Hersteller" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Metal ammo can with the anime girl sticker" | ||||
| msgstr "Metallene Munitionskiste mit Anime-Girl-Sticker" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:23 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "My cool ammo can" | ||||
| msgstr "Meine coole Munitionskiste" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:45 | ||||
| #: lib/cannery_web/components/container_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:21 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Name" | ||||
| msgstr "Name" | ||||
| @@ -272,7 +256,7 @@ msgstr "Neuer Munitionstyp" | ||||
| msgid "New Container" | ||||
| msgstr "Neuer Behälter" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:37 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New Invite" | ||||
| msgstr "Neue Einladung" | ||||
| @@ -282,13 +266,13 @@ msgstr "Neue Einladung" | ||||
| msgid "New Tag" | ||||
| msgstr "Neuer Tag" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:8 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:70 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:71 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No Ammo" | ||||
| msgstr "Keine Munition" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:166 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:167 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No ammo for this type" | ||||
| msgstr "Keine Munition dieser Art" | ||||
| @@ -304,68 +288,68 @@ msgstr "Kein Behälter" | ||||
| msgid "No invites" | ||||
| msgstr "Keine Einladung" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags" | ||||
| msgstr "Keine Tags" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:37 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:38 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:81 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:43 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:93 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:29 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes" | ||||
| msgstr "Bemerkungen" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:51 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:52 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes:" | ||||
| msgstr "Bemerkungen:" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:46 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "On the bookshelf" | ||||
| msgstr "Auf dem Bücherregal" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Pressure" | ||||
| msgstr "Druck" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:78 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:35 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid" | ||||
| msgstr "Kaufpreis" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:70 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid:" | ||||
| msgstr "Kaufpreis:" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:61 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:119 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Primer type" | ||||
| msgstr "Zündertyp" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:110 | ||||
| #: lib/cannery_web/live/home_live.html.heex:81 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Public Signups" | ||||
| msgstr "Öffentliche Registrierung" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:56 | ||||
| #: lib/cannery_web/live/home_live.html.heex:33 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Secure:" | ||||
| msgstr "Sicher:" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:59 | ||||
| #: lib/cannery_web/live/home_live.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
| @@ -378,12 +362,12 @@ msgstr "" | ||||
| msgid "Settings" | ||||
| msgstr "Einstellungen" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:66 | ||||
| #: lib/cannery_web/live/home_live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Simple:" | ||||
| msgstr "Einfach:" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:48 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Steel" | ||||
| msgstr "Stahl" | ||||
| @@ -407,56 +391,51 @@ msgstr "Tags" | ||||
| msgid "Tags can be added to your containers to help you organize" | ||||
| msgstr "Tags können zur besseren Ordnung einem Behälter hinzugefügt werden" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:85 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Text color" | ||||
| msgstr "Textfarbe" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:35 | ||||
| #: lib/cannery_web/live/home_live.html.heex:14 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "Die selbst-gehostete Website zur Verwaltung von Schusswaffen" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Tracer" | ||||
| msgstr "Leuchtspur" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:49 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:68 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type" | ||||
| msgstr "Art" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:45 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:14 | ||||
| #: lib/cannery_web/components/container_card.ex:44 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:12 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type:" | ||||
| msgstr "Art:" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Users" | ||||
| msgstr "Benutzer" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses left" | ||||
| msgstr "Verbleibende Nutzung" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "Willkommen %{name}" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:60 | ||||
| #: lib/cannery_web/live/home_live.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "Ihre Daten bleiben bei Ihnen, Punkt" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:72 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags for this container" | ||||
| msgstr "Keine Tags für diesen Behälter" | ||||
| @@ -472,15 +451,15 @@ msgstr "Schießplatz" | ||||
| msgid "Range day" | ||||
| msgstr "Range Day" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:45 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:46 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:44 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:94 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:36 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Date" | ||||
| msgstr "Datum" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shots fired" | ||||
| msgstr "Schüsse abgegeben" | ||||
| @@ -507,21 +486,21 @@ msgstr "Schießkladde editieren" | ||||
| msgid "New Shot Records" | ||||
| msgstr "Neue Schießkladde" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:50 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:48 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No shots recorded" | ||||
| msgstr "Keine Schüsse dokumentiert" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:21 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:25 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:22 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds left" | ||||
| msgstr "Patronen verbleibend" | ||||
|  | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:42 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds shot" | ||||
| msgstr "Patronen abgefeuert" | ||||
| @@ -533,7 +512,7 @@ msgid "Shot Records" | ||||
| msgstr "Schießkladde" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:38 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:117 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:118 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "Munition verschieben" | ||||
| @@ -543,91 +522,91 @@ msgstr "Munition verschieben" | ||||
| msgid "No other containers" | ||||
| msgstr "Kein weiterer Behälter" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:55 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:53 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shot log" | ||||
| msgstr "Schießkladde" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:71 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:78 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:69 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:76 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:153 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:225 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:180 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "$%{amount}" | ||||
| msgstr "$%{amount}" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bimetal" | ||||
| msgstr "Bimetall" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Jacket type" | ||||
| msgstr "Patronenhülse" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:52 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Muzzle velocity" | ||||
| msgstr "Mündungsgeschwindigkeit" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder grains per charge" | ||||
| msgstr "Pulverkörner pro Ladung" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:53 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder type" | ||||
| msgstr "Pulverart" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:153 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "UPC" | ||||
| msgstr "UPC" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:78 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Confirm new password" | ||||
| msgstr "Passwort bestätigen" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:87 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:89 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Current password" | ||||
| msgstr "Derzeitiges Passwort" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:71 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New password" | ||||
| msgstr "Neues Passwort" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage" | ||||
| msgstr "Markiert" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage" | ||||
| msgstr "Demarkiert" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:62 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Firing type" | ||||
| msgstr "Patronenhülsenform" | ||||
|  | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:40 | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reconnecting..." | ||||
| msgstr "Neu verbinden..." | ||||
| @@ -644,16 +623,16 @@ msgstr "%{name} bearbeiten" | ||||
| msgid "Edit %{name} tags" | ||||
| msgstr "Editiere %{name} Tags" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:67 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:39 | ||||
| #: lib/cannery_web/components/container_card.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:68 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:35 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds:" | ||||
| msgstr "Patronen:" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:222 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:179 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:142 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:143 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No cost information" | ||||
| msgstr "Keine Preisinformationen" | ||||
| @@ -703,7 +682,7 @@ msgstr "Passwort vergessen?" | ||||
| msgid "Log in" | ||||
| msgstr "Einloggen" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:34 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "Registrieren" | ||||
| @@ -719,55 +698,53 @@ msgstr "Passwort zurücksetzen" | ||||
| msgid "Record Shots" | ||||
| msgstr "Schüsse dokumentieren" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:66 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copies" | ||||
| msgstr "Kopien" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:123 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:124 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Added on:" | ||||
| msgstr "Hinzugefügt am:" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:130 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "English" | ||||
| msgstr "Englisch" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:132 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:135 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "French" | ||||
| msgstr "Französisch" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:131 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:134 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "German" | ||||
| msgstr "Deutsch" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Language" | ||||
| msgstr "Sprache" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:136 | ||||
| #: lib/cannery_web/live/home_live.html.heex:107 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Get involved!" | ||||
| msgstr "Mach mit!" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:157 | ||||
| #: lib/cannery_web/live/home_live.html.heex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Help translate" | ||||
| msgstr "Hilf beim Übersetzen" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:168 | ||||
| #: lib/cannery_web/live/home_live.html.heex:139 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Report bugs or request features" | ||||
| msgstr "Sende Bugs oder Erweiterungsvorschläge" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:146 | ||||
| #: lib/cannery_web/live/home_live.html.heex:117 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View the source code" | ||||
| msgstr "Quellcode ansehen" | ||||
| @@ -790,7 +767,7 @@ msgstr "Munitionstyp bearbeiten" | ||||
| msgid "Move Ammo" | ||||
| msgstr "Munition verschieben" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:119 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:113 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "No ammo in this container" | ||||
| msgstr "Keine Munitionsgruppe in diesem Behälter" | ||||
| @@ -805,38 +782,38 @@ msgstr "Zeige Munitionsarten" | ||||
| msgid "This ammo is not in a container" | ||||
| msgstr "Diese Munitionsgruppe ist nicht in einem Behälter" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:95 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:30 | ||||
| #: lib/cannery_web/components/container_card.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:96 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:25 | ||||
| #: lib/cannery_web/live/home_live.ex:25 | ||||
| #: lib/cannery_web/live/home_live.html.heex:4 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery logo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:27 | ||||
| #: lib/cannery_web/live/home_live.html.heex:6 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "isn't he cute >:3" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:28 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:29 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Leave \"Uses left\" blank to make invite unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:86 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:83 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Container:" | ||||
| msgstr "Behälter" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:63 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:152 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:153 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Show used" | ||||
| msgstr "" | ||||
| @@ -864,9 +841,9 @@ msgstr "" | ||||
| msgid "Rounds" | ||||
| msgstr "Patronen:" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:158 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:159 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View as table" | ||||
| msgstr "" | ||||
| @@ -876,7 +853,7 @@ msgstr "" | ||||
| msgid "Total ever packs" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total ever packs:" | ||||
| msgstr "" | ||||
| @@ -886,7 +863,7 @@ msgstr "" | ||||
| msgid "Total ever rounds" | ||||
| msgstr "Summe aller Patronen" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:84 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total ever rounds:" | ||||
| msgstr "Summe abgegebener Schüsse:" | ||||
| @@ -896,7 +873,7 @@ msgstr "Summe abgegebener Schüsse:" | ||||
| msgid "Used packs" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Used packs:" | ||||
| msgstr "" | ||||
| @@ -906,17 +883,17 @@ msgstr "" | ||||
| msgid "Used rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Used rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:33 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:34 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Used up!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:66 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Rounds shot chart" | ||||
| msgstr "Patronen abgefeuert" | ||||
| @@ -1017,7 +994,7 @@ msgid "UPC:" | ||||
| msgstr "UPC" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:120 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Average CPR" | ||||
| msgstr "" | ||||
| @@ -1028,7 +1005,7 @@ msgstr "" | ||||
| msgid "Edit %{ammo_type_name}" | ||||
| msgstr "%{name} bearbeiten" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:40 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:231 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Empty" | ||||
| @@ -1039,7 +1016,7 @@ msgstr "" | ||||
| msgid "CPR" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:77 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "CPR:" | ||||
| msgstr "" | ||||
| @@ -1049,7 +1026,7 @@ msgstr "" | ||||
| msgid "Original Count" | ||||
| msgstr "Ursprüngliche Anzahl:" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:44 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:47 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Original Count:" | ||||
| msgstr "Ursprüngliche Anzahl:" | ||||
| @@ -1059,12 +1036,12 @@ msgstr "Ursprüngliche Anzahl:" | ||||
| msgid "Home" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:33 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total rounds:" | ||||
| msgstr "Summe abgegebener Schüsse:" | ||||
| @@ -1074,7 +1051,7 @@ msgstr "Summe abgegebener Schüsse:" | ||||
| msgid "Last used on" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:63 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Last used on:" | ||||
| msgstr "" | ||||
| @@ -1085,7 +1062,7 @@ msgid "Never used" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Purchased on" | ||||
| msgstr "" | ||||
| @@ -1112,7 +1089,7 @@ msgstr "Keine Munitionsarten" | ||||
| msgid "Search catalog" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:58 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Search ammo" | ||||
| msgstr "" | ||||
| @@ -1127,18 +1104,20 @@ msgstr "" | ||||
| msgid "Search tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:83 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Search shot records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:136 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Spanish" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/error/error.html.heex:8 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:13 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:14 | ||||
| #: lib/cannery_web/views/layout_view.ex:15 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Cannery" | ||||
| msgstr "" | ||||
| @@ -1158,12 +1137,63 @@ msgstr "Benutzer registriert am" | ||||
| msgid "User was confirmed at%{confirmed_datetime}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:31 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: %{uses_left}" | ||||
| msgstr "Verbleibende Nutzung:" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:36 | ||||
| #: lib/cannery_web/components/invite_card.ex:37 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: Unlimited" | ||||
| msgstr "Verbleibende Nutzung:" | ||||
|  | ||||
| ## This file is a PO Template file. | ||||
| ## | ||||
| ## "msgid"s here are often extracted from source code. | ||||
| ## Add new translations manually only if they're dynamic | ||||
| ## translations that can't be statically extracted. | ||||
| ## | ||||
| ## Run "mix gettext.extract" to bring this file up to | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/home_live.html.heex:26 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Cannery lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
| "Mit %{name} können Sie ihren Munitionsbestand vor und nach dem Schießen " | ||||
| "leicht im Auge behalten" | ||||
|  | ||||
| #: lib/cannery_web/views/layout_view.ex:11 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery | %{title}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:78 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Registration:" | ||||
| msgstr "Registrieren" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:88 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Version:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:10 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Welcome to Cannery" | ||||
| msgstr "Willkommen %{name}" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:32 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: %{uses_left_count}" | ||||
| msgstr "Verbleibende Nutzung:" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses: %{uses_count}" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -69,11 +69,11 @@ msgstr "Ungültige Mailadresse oder Passwort" | ||||
| msgid "Not found" | ||||
| msgstr "Nicht gefunden" | ||||
|  | ||||
| #: 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_settings/edit.html.heex:21 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:64 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:119 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:13 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:14 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:23 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:67 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:123 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Oops, something went wrong! Please check the errors below." | ||||
| msgstr "Oops, etwas ist schiefgegangen. Bitte beachten Sie den Fehler unten." | ||||
| @@ -83,14 +83,15 @@ msgstr "Oops, etwas ist schiefgegangen. Bitte beachten Sie den Fehler unten." | ||||
| msgid "Reset password link is invalid or it has expired." | ||||
| msgstr "Link zum Passwort zurücksetzen ist ungültig oder abgelaufen." | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:24 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:55 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:22 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:51 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, public registration is disabled" | ||||
| msgstr "Entschuldigung, aber öffentliche Registrierung ist deaktiviert" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:14 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:45 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:12 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:41 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:70 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, this invite was not found or expired" | ||||
| msgstr "" | ||||
| @@ -111,7 +112,7 @@ msgstr "Unbefugt" | ||||
| msgid "User confirmation link is invalid or it has expired." | ||||
| msgstr "Nutzerkonto Bestätigungslink ist ungültig oder abgelaufen." | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:18 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:19 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You are not authorized to view this page" | ||||
| msgstr "Sie sind nicht berechtigt, diese Seite aufzurufen" | ||||
| @@ -121,22 +122,22 @@ msgstr "Sie sind nicht berechtigt, diese Seite aufzurufen" | ||||
| msgid "You are not authorized to view this page." | ||||
| msgstr "Sie sind nicht berechtigt, diese Seite aufzurufen." | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:137 | ||||
| #: lib/cannery/accounts/user.ex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "did not change" | ||||
| msgstr "hat sich nicht geändert" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:158 | ||||
| #: lib/cannery/accounts/user.ex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "does not match password" | ||||
| msgstr "Passwort stimmt nicht überein" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:195 | ||||
| #: lib/cannery/accounts/user.ex:202 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "is not valid" | ||||
| msgstr "ist nicht gültig" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:92 | ||||
| #: lib/cannery/accounts/user.ex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "must have the @ sign and no spaces" | ||||
| msgstr "Muss ein @ Zeichen und keine Leerzeichen haben" | ||||
| @@ -197,7 +198,7 @@ msgstr "" | ||||
| msgid "Please select an ammo type and container" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:69 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your browser does not support the canvas element." | ||||
| msgstr "" | ||||
|   | ||||
| @@ -26,45 +26,28 @@ msgstr "" | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:86 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:89 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:80 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:126 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} created successfully" | ||||
| msgstr "%{name} erfolgreich erstellt" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:73 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.ex:55 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:53 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:133 | ||||
| #: lib/cannery_web/live/tag_live/index.ex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} deleted succesfully" | ||||
| msgstr "%{name} erfolgreich gelöscht" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:109 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} disabled succesfully" | ||||
| msgstr "%{name} erfolgreich deaktiviert" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} enabled succesfully" | ||||
| msgstr "%{name} erfolgreich aktiviert" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.ex:85 | ||||
| #: lib/cannery_web/live/container_live/show.ex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} has been deleted" | ||||
| msgstr "%{name} wurde gelöscht" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated succesfully" | ||||
| msgstr "%{name} erfolgreich aktualisiert" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:67 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:70 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:62 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:108 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:61 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated successfully" | ||||
| msgstr "%{name} erfolgreich aktualisiert" | ||||
| @@ -74,8 +57,8 @@ msgstr "%{name} erfolgreich aktualisiert" | ||||
| msgid "A link to confirm your email change has been sent to the new address." | ||||
| msgstr "Eine Mail zum Bestätigen ihre Mailadresse wurde Ihnen zugesandt." | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:103 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:133 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:98 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{email}? This action is permanent!" | ||||
| msgstr "" | ||||
| @@ -83,25 +66,20 @@ msgstr "" | ||||
| "zurückgenommen werden!" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:136 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:59 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:135 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:55 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{name}?" | ||||
| msgstr "Sind Sie sicher, dass sie %{name} löschen möchten?" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:49 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete the invite for %{name}?" | ||||
| msgstr "Sind Sie sicher, dass sie die Einladung für %{name} löschen möchten?" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:153 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this ammo?" | ||||
| msgstr "Sind Sie sicher, dass sie diese Munition löschen möchten?" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:160 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:163 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete your account?" | ||||
| msgstr "Sind Sie sicher, dass sie Ihren Account löschen möchten?" | ||||
| @@ -111,11 +89,6 @@ msgstr "Sind Sie sicher, dass sie Ihren Account löschen möchten?" | ||||
| msgid "Are you sure you want to log out?" | ||||
| msgstr "Wirklich ausloggen?" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to make %{name} unlimited?" | ||||
| msgstr "Sind Sie sicher, dass sie %{name} auf unbegrenzt setzen möchten?" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:77 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Email changed successfully." | ||||
| @@ -150,23 +123,18 @@ msgstr "Passwort erfolgreich zurückgesetzt." | ||||
| msgid "Password updated successfully." | ||||
| msgstr "Passwort erfolgreich geändert." | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:73 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:65 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Please check your email to verify your account" | ||||
| msgstr "Bitte überprüfen Sie ihre Mailbox und bestätigen Sie das Nutzerkonto" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:91 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "Registrieren Sie sich, um %{name} zu bearbeiten" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:55 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:52 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:33 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:93 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:158 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:53 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:43 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Saving..." | ||||
| msgstr "Speichere..." | ||||
| @@ -193,7 +161,7 @@ msgstr "%{name} erfolgreich hinzugefügt" | ||||
| msgid "%{tag_name} has been removed from %{container_name}" | ||||
| msgstr "%{tag_name} wurde von %{container_name} entfernt" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:55 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Adding..." | ||||
| msgstr "Füge hinzu..." | ||||
| @@ -203,13 +171,13 @@ msgstr "Füge hinzu..." | ||||
| msgid "Shots recorded successfully" | ||||
| msgstr "Schüsse erfolgreich dokumentiert" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:28 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:27 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to unstage this ammo?" | ||||
| msgstr "Sind sie sicher, dass Sie diese Munition demarkieren möchten?" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:142 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:118 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:116 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this shot record?" | ||||
| msgstr "Sind sie sicher, dass sie die Schießkladde löschen möchten?" | ||||
| @@ -235,7 +203,7 @@ msgstr "%{email} erfolgreich bestätigt." | ||||
| msgid "Ammo moved to %{name} successfully" | ||||
| msgstr "Munition erfolgreich zu %{name} verschoben" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copied to clipboard" | ||||
| msgstr "Der Zwischenablage hinzugefügt" | ||||
| @@ -245,18 +213,18 @@ msgstr "Der Zwischenablage hinzugefügt" | ||||
| msgid "%{name} removed successfully" | ||||
| msgstr "%{name} erfolgreich entfernt" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:17 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:18 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You'll need to" | ||||
| msgstr "Sie müssen" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Creating..." | ||||
| msgstr "Erstellen..." | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:141 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to change your language?" | ||||
| msgstr "Möchten Sie die Sprache wechseln?" | ||||
| @@ -290,7 +258,47 @@ msgstr[0] "Munitionsgruppe erfolgreich aktualisiert" | ||||
| msgstr[1] "Munitionsgruppe erfolgreich aktualisiert" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:90 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:29 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" | ||||
| msgstr "Sind Sie sicher, dass sie %{name} löschen möchten?" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:65 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Register to setup Cannery" | ||||
| msgstr "Registrieren Sie sich, um %{name} zu bearbeiten" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:54 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} deleted succesfully" | ||||
| msgstr "%{name} erfolgreich gelöscht" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:115 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} disabled succesfully" | ||||
| msgstr "%{name} erfolgreich deaktiviert" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:91 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} enabled succesfully" | ||||
| msgstr "%{name} erfolgreich aktiviert" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:69 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} updated succesfully" | ||||
| msgstr "%{name} erfolgreich aktualisiert" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:140 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{user_email} deleted succesfully" | ||||
| msgstr "%{name} erfolgreich gelöscht" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:48 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to delete the invite for %{invite_name}?" | ||||
| msgstr "Sind Sie sicher, dass sie die Einladung für %{name} löschen möchten?" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:73 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to make %{invite_name} unlimited?" | ||||
| msgstr "Sind Sie sicher, dass sie %{name} auf unbegrenzt setzen möchten?" | ||||
|   | ||||
| @@ -10,22 +10,17 @@ | ||||
| msgid "" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.html.heex:46 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:91 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:83 | ||||
| #: lib/cannery_web/live/home_live.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins:" | ||||
| msgstr "" | ||||
| @@ -40,60 +35,60 @@ msgid "Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:89 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Background color" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:141 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Blank" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:69 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Brass" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet core" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:49 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:59 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Caliber" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:48 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cartridge" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:50 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:66 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Case material" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:65 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:57 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container" | ||||
| msgstr "" | ||||
| @@ -107,42 +102,42 @@ msgid "Containers" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:66 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:145 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Corrosive" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:76 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:38 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:8 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:25 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:8 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:7 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| #: lib/cannery_web/live/home_live.html.heex:23 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Easy to Use:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:33 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:34 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Edit Invite" | ||||
| msgstr "" | ||||
| @@ -152,95 +147,95 @@ msgstr "" | ||||
| msgid "Edit Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Example bullet type abbreviations" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "FMJ" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:59 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Grains" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Incendiary" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:78 | ||||
| #: lib/cannery_web/live/home_live.html.heex:55 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Instance Information" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:41 | ||||
| #: lib/cannery_web/components/invite_card.ex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:111 | ||||
| #: lib/cannery_web/live/home_live.html.heex:82 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Only" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:90 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:41 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:42 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invites" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Keep me logged in for 60 days" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:48 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:69 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:51 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:20 | ||||
| #: lib/cannery_web/components/container_card.ex:49 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:17 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:38 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Magazine, Clip, Ammo Box, etc" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:149 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Manufacturer" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Metal ammo can with the anime girl sticker" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:23 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "My cool ammo can" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:45 | ||||
| #: lib/cannery_web/components/container_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:21 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Name" | ||||
| msgstr "" | ||||
| @@ -257,7 +252,7 @@ msgstr "" | ||||
| msgid "New Container" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:37 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New Invite" | ||||
| msgstr "" | ||||
| @@ -267,13 +262,13 @@ msgstr "" | ||||
| msgid "New Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:8 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:70 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:71 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:166 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:167 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No ammo for this type" | ||||
| msgstr "" | ||||
| @@ -289,68 +284,68 @@ msgstr "" | ||||
| msgid "No invites" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:37 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:38 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:81 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:43 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:93 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:29 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:51 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:52 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:46 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "On the bookshelf" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Pressure" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:78 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:35 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:70 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:61 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:119 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Primer type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:110 | ||||
| #: lib/cannery_web/live/home_live.html.heex:81 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Public Signups" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:56 | ||||
| #: lib/cannery_web/live/home_live.html.heex:33 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Secure:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:59 | ||||
| #: lib/cannery_web/live/home_live.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
| @@ -361,12 +356,12 @@ msgstr "" | ||||
| msgid "Settings" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:66 | ||||
| #: lib/cannery_web/live/home_live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Simple:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:48 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Steel" | ||||
| msgstr "" | ||||
| @@ -390,56 +385,51 @@ msgstr "" | ||||
| msgid "Tags can be added to your containers to help you organize" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:85 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Text color" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:35 | ||||
| #: lib/cannery_web/live/home_live.html.heex:14 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Tracer" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:49 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:68 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:45 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:14 | ||||
| #: lib/cannery_web/components/container_card.ex:44 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:12 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Users" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses left" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:60 | ||||
| #: lib/cannery_web/live/home_live.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:72 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags for this container" | ||||
| msgstr "" | ||||
| @@ -455,15 +445,15 @@ msgstr "" | ||||
| msgid "Range day" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:45 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:46 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:44 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:94 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:36 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Date" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shots fired" | ||||
| msgstr "" | ||||
| @@ -490,21 +480,21 @@ msgstr "" | ||||
| msgid "New Shot Records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:50 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:48 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No shots recorded" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:21 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:25 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:22 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds left" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:42 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds shot" | ||||
| msgstr "" | ||||
| @@ -516,7 +506,7 @@ msgid "Shot Records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:38 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:117 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:118 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "" | ||||
| @@ -526,91 +516,91 @@ msgstr "" | ||||
| msgid "No other containers" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:55 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:53 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shot log" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:71 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:78 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:69 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:76 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:153 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:225 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:180 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "$%{amount}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bimetal" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Jacket type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:52 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Muzzle velocity" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder grains per charge" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:53 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:153 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "UPC" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:78 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Confirm new password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:87 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:89 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Current password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:71 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:62 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Firing type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:40 | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reconnecting..." | ||||
| msgstr "" | ||||
| @@ -627,16 +617,16 @@ msgstr "" | ||||
| msgid "Edit %{name} tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:67 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:39 | ||||
| #: lib/cannery_web/components/container_card.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:68 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:35 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:222 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:179 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:142 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:143 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No cost information" | ||||
| msgstr "" | ||||
| @@ -686,7 +676,7 @@ msgstr "" | ||||
| msgid "Log in" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:34 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "" | ||||
| @@ -702,55 +692,53 @@ msgstr "" | ||||
| msgid "Record Shots" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:66 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copies" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:123 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:124 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Added on:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:130 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "English" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:132 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:135 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "French" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:131 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:134 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "German" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Language" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:136 | ||||
| #: lib/cannery_web/live/home_live.html.heex:107 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Get involved!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:157 | ||||
| #: lib/cannery_web/live/home_live.html.heex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Help translate" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:168 | ||||
| #: lib/cannery_web/live/home_live.html.heex:139 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Report bugs or request features" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:146 | ||||
| #: lib/cannery_web/live/home_live.html.heex:117 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View the source code" | ||||
| msgstr "" | ||||
| @@ -773,7 +761,7 @@ msgstr "" | ||||
| msgid "Move Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:119 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:113 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No ammo in this container" | ||||
| msgstr "" | ||||
| @@ -788,38 +776,38 @@ msgstr "" | ||||
| msgid "This ammo is not in a container" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:95 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:30 | ||||
| #: lib/cannery_web/components/container_card.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:96 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:25 | ||||
| #: lib/cannery_web/live/home_live.ex:25 | ||||
| #: lib/cannery_web/live/home_live.html.heex:4 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery logo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:27 | ||||
| #: lib/cannery_web/live/home_live.html.heex:6 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "isn't he cute >:3" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:28 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:29 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Leave \"Uses left\" blank to make invite unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:86 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:83 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:63 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:152 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:153 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Show used" | ||||
| msgstr "" | ||||
| @@ -847,9 +835,9 @@ msgstr "" | ||||
| msgid "Rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:158 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:159 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View as table" | ||||
| msgstr "" | ||||
| @@ -859,7 +847,7 @@ msgstr "" | ||||
| msgid "Total ever packs" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total ever packs:" | ||||
| msgstr "" | ||||
| @@ -869,7 +857,7 @@ msgstr "" | ||||
| msgid "Total ever rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:84 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total ever rounds:" | ||||
| msgstr "" | ||||
| @@ -879,7 +867,7 @@ msgstr "" | ||||
| msgid "Used packs" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Used packs:" | ||||
| msgstr "" | ||||
| @@ -889,17 +877,17 @@ msgstr "" | ||||
| msgid "Used rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Used rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:33 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:34 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Used up!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:66 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds shot chart" | ||||
| msgstr "" | ||||
| @@ -1000,7 +988,7 @@ msgid "UPC:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:120 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Average CPR" | ||||
| msgstr "" | ||||
| @@ -1011,7 +999,7 @@ msgstr "" | ||||
| msgid "Edit %{ammo_type_name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:40 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:231 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Empty" | ||||
| @@ -1022,7 +1010,7 @@ msgstr "" | ||||
| msgid "CPR" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:77 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "CPR:" | ||||
| msgstr "" | ||||
| @@ -1032,7 +1020,7 @@ msgstr "" | ||||
| msgid "Original Count" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:44 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Original Count:" | ||||
| msgstr "" | ||||
| @@ -1042,12 +1030,12 @@ msgstr "" | ||||
| msgid "Home" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:33 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total rounds:" | ||||
| msgstr "" | ||||
| @@ -1057,7 +1045,7 @@ msgstr "" | ||||
| msgid "Last used on" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:63 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Last used on:" | ||||
| msgstr "" | ||||
| @@ -1068,7 +1056,7 @@ msgid "Never used" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Purchased on" | ||||
| msgstr "" | ||||
| @@ -1095,7 +1083,7 @@ msgstr "" | ||||
| msgid "Search catalog" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:58 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Search ammo" | ||||
| msgstr "" | ||||
| @@ -1110,18 +1098,20 @@ msgstr "" | ||||
| msgid "Search tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:83 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Search shot records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:136 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Spanish" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/error/error.html.heex:8 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:13 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:14 | ||||
| #: lib/cannery_web/views/layout_view.ex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery" | ||||
| msgstr "" | ||||
| @@ -1141,12 +1131,52 @@ msgstr "" | ||||
| msgid "User was confirmed at%{confirmed_datetime}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses Left: %{uses_left}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:36 | ||||
| #: lib/cannery_web/components/invite_card.ex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses Left: Unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/views/layout_view.ex:11 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery | %{title}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:78 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Registration:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:88 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Version:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:10 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Welcome to Cannery" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses Left: %{uses_left_count}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses: %{uses_count}" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -12,12 +12,12 @@ msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:62 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:36 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add your first box!" | ||||
| msgstr "" | ||||
| @@ -33,13 +33,13 @@ msgid "Add your first type!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:15 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change email" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:58 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:99 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:59 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:101 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change password" | ||||
| msgstr "" | ||||
| @@ -49,14 +49,14 @@ msgstr "" | ||||
| msgid "Create Invite" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:162 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Delete User" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:52 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:47 | ||||
| #: 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:44 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Forgot your password?" | ||||
| msgstr "" | ||||
| @@ -66,13 +66,13 @@ msgstr "" | ||||
| msgid "Invite someone new!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:137 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:49 | ||||
| #: 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/components/topbar.ex:135 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:47 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Log in" | ||||
| msgstr "" | ||||
| @@ -97,51 +97,51 @@ msgstr "" | ||||
| msgid "New Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:128 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:26 | ||||
| #: lib/cannery_web/components/topbar.ex:127 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:26 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Resend confirmation instructions" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:34 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reset password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:53 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:81 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:156 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:91 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Save" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Send instructions to reset password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:80 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Why not add one?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:50 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add" | ||||
| msgstr "" | ||||
| @@ -156,9 +156,9 @@ msgstr "" | ||||
| msgid "Why not get some ready to shoot?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:100 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:101 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:101 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Record shots" | ||||
| msgstr "" | ||||
| @@ -178,27 +178,27 @@ msgstr "" | ||||
| msgid "Select" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copy to clipboard" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add a container first" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:74 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Create" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:113 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change Language" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:139 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:142 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change language" | ||||
| msgstr "" | ||||
| @@ -208,44 +208,34 @@ msgstr "" | ||||
| msgid "View in Catalog" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add an ammo type first" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:80 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:78 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Set Unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:86 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage for range" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage from range" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:153 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:156 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Export Data as JSON" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -10,22 +10,17 @@ msgid "" | ||||
| msgstr "" | ||||
| "Language: en\n" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.html.heex:46 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:91 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:83 | ||||
| #: lib/cannery_web/live/home_live.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins:" | ||||
| msgstr "" | ||||
| @@ -40,60 +35,60 @@ msgid "Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:89 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Background color" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:141 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Blank" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:69 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Brass" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet core" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:49 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:59 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Caliber" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:48 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cartridge" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:50 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:66 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Case material" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:65 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:57 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container" | ||||
| msgstr "" | ||||
| @@ -107,42 +102,42 @@ msgid "Containers" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:66 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:145 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Corrosive" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:76 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:38 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:8 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:25 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:8 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:7 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| #: lib/cannery_web/live/home_live.html.heex:23 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Easy to Use:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:33 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:34 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Edit Invite" | ||||
| msgstr "" | ||||
| @@ -152,95 +147,95 @@ msgstr "" | ||||
| msgid "Edit Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Example bullet type abbreviations" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "FMJ" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:59 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Grains" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Incendiary" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:78 | ||||
| #: lib/cannery_web/live/home_live.html.heex:55 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Instance Information" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:41 | ||||
| #: lib/cannery_web/components/invite_card.ex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:111 | ||||
| #: lib/cannery_web/live/home_live.html.heex:82 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Only" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:90 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:41 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:42 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invites" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Keep me logged in for 60 days" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:48 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:69 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:51 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:20 | ||||
| #: lib/cannery_web/components/container_card.ex:49 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:17 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:38 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Magazine, Clip, Ammo Box, etc" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:149 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Manufacturer" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Metal ammo can with the anime girl sticker" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:23 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "My cool ammo can" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:45 | ||||
| #: lib/cannery_web/components/container_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:21 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Name" | ||||
| msgstr "" | ||||
| @@ -257,7 +252,7 @@ msgstr "" | ||||
| msgid "New Container" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:37 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New Invite" | ||||
| msgstr "" | ||||
| @@ -267,13 +262,13 @@ msgstr "" | ||||
| msgid "New Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:8 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:70 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:71 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:166 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:167 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No ammo for this type" | ||||
| msgstr "" | ||||
| @@ -289,68 +284,68 @@ msgstr "" | ||||
| msgid "No invites" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:37 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:38 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:81 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:43 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:93 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:29 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:51 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:52 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:46 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "On the bookshelf" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Pressure" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:78 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:35 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:70 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:61 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:119 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Primer type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:110 | ||||
| #: lib/cannery_web/live/home_live.html.heex:81 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Public Signups" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:56 | ||||
| #: lib/cannery_web/live/home_live.html.heex:33 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Secure:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:59 | ||||
| #: lib/cannery_web/live/home_live.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
| @@ -361,12 +356,12 @@ msgstr "" | ||||
| msgid "Settings" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:66 | ||||
| #: lib/cannery_web/live/home_live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Simple:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:48 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Steel" | ||||
| msgstr "" | ||||
| @@ -390,56 +385,51 @@ msgstr "" | ||||
| msgid "Tags can be added to your containers to help you organize" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:85 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Text color" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:35 | ||||
| #: lib/cannery_web/live/home_live.html.heex:14 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Tracer" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:49 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:68 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:45 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:14 | ||||
| #: lib/cannery_web/components/container_card.ex:44 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:12 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Users" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses left" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:60 | ||||
| #: lib/cannery_web/live/home_live.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:72 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags for this container" | ||||
| msgstr "" | ||||
| @@ -455,15 +445,15 @@ msgstr "" | ||||
| msgid "Range day" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:45 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:46 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:44 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:94 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:36 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Date" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shots fired" | ||||
| msgstr "" | ||||
| @@ -490,21 +480,21 @@ msgstr "" | ||||
| msgid "New Shot Records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:50 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:48 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No shots recorded" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:21 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:25 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:22 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds left" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:42 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds shot" | ||||
| msgstr "" | ||||
| @@ -516,7 +506,7 @@ msgid "Shot Records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:38 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:117 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:118 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "" | ||||
| @@ -526,91 +516,91 @@ msgstr "" | ||||
| msgid "No other containers" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:55 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:53 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shot log" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:71 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:78 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:69 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:76 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:153 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:225 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:180 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "$%{amount}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bimetal" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Jacket type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:52 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Muzzle velocity" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder grains per charge" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:53 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:153 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "UPC" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:78 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Confirm new password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:87 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:89 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Current password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:71 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:62 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Firing type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:40 | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reconnecting..." | ||||
| msgstr "" | ||||
| @@ -627,16 +617,16 @@ msgstr "" | ||||
| msgid "Edit %{name} tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:67 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:39 | ||||
| #: lib/cannery_web/components/container_card.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:68 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:35 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:222 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:179 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:142 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:143 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No cost information" | ||||
| msgstr "" | ||||
| @@ -686,7 +676,7 @@ msgstr "" | ||||
| msgid "Log in" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:34 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "" | ||||
| @@ -702,55 +692,53 @@ msgstr "" | ||||
| msgid "Record Shots" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:66 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copies" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:123 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:124 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Added on:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:130 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "English" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:132 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:135 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "French" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:131 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:134 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "German" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Language" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:136 | ||||
| #: lib/cannery_web/live/home_live.html.heex:107 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Get involved!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:157 | ||||
| #: lib/cannery_web/live/home_live.html.heex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Help translate" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:168 | ||||
| #: lib/cannery_web/live/home_live.html.heex:139 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Report bugs or request features" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:146 | ||||
| #: lib/cannery_web/live/home_live.html.heex:117 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View the source code" | ||||
| msgstr "" | ||||
| @@ -773,7 +761,7 @@ msgstr "" | ||||
| msgid "Move Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:119 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:113 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "No ammo in this container" | ||||
| msgstr "" | ||||
| @@ -788,38 +776,38 @@ msgstr "" | ||||
| msgid "This ammo is not in a container" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:95 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:30 | ||||
| #: lib/cannery_web/components/container_card.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:96 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:25 | ||||
| #: lib/cannery_web/live/home_live.ex:25 | ||||
| #: lib/cannery_web/live/home_live.html.heex:4 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery logo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:27 | ||||
| #: lib/cannery_web/live/home_live.html.heex:6 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "isn't he cute >:3" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:28 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:29 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Leave \"Uses left\" blank to make invite unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:86 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:83 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Container:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:63 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:152 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:153 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Show used" | ||||
| msgstr "" | ||||
| @@ -847,9 +835,9 @@ msgstr "" | ||||
| msgid "Rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:158 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:159 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View as table" | ||||
| msgstr "" | ||||
| @@ -859,7 +847,7 @@ msgstr "" | ||||
| msgid "Total ever packs" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total ever packs:" | ||||
| msgstr "" | ||||
| @@ -869,7 +857,7 @@ msgstr "" | ||||
| msgid "Total ever rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:84 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total ever rounds:" | ||||
| msgstr "" | ||||
| @@ -879,7 +867,7 @@ msgstr "" | ||||
| msgid "Used packs" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Used packs:" | ||||
| msgstr "" | ||||
| @@ -889,17 +877,17 @@ msgstr "" | ||||
| msgid "Used rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Used rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:33 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:34 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Used up!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:66 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Rounds shot chart" | ||||
| msgstr "" | ||||
| @@ -1000,7 +988,7 @@ msgid "UPC:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:120 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Average CPR" | ||||
| msgstr "" | ||||
| @@ -1011,7 +999,7 @@ msgstr "" | ||||
| msgid "Edit %{ammo_type_name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:40 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:231 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Empty" | ||||
| @@ -1022,7 +1010,7 @@ msgstr "" | ||||
| msgid "CPR" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:77 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "CPR:" | ||||
| msgstr "" | ||||
| @@ -1032,7 +1020,7 @@ msgstr "" | ||||
| msgid "Original Count" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:44 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:47 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Original Count:" | ||||
| msgstr "" | ||||
| @@ -1042,12 +1030,12 @@ msgstr "" | ||||
| msgid "Home" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:33 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total rounds:" | ||||
| msgstr "" | ||||
| @@ -1057,7 +1045,7 @@ msgstr "" | ||||
| msgid "Last used on" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:63 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Last used on:" | ||||
| msgstr "" | ||||
| @@ -1068,7 +1056,7 @@ msgid "Never used" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Purchased on" | ||||
| msgstr "" | ||||
| @@ -1095,7 +1083,7 @@ msgstr "" | ||||
| msgid "Search catalog" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:58 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Search ammo" | ||||
| msgstr "" | ||||
| @@ -1110,18 +1098,20 @@ msgstr "" | ||||
| msgid "Search tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:83 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Search shot records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:136 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Spanish" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/error/error.html.heex:8 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:13 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:14 | ||||
| #: lib/cannery_web/views/layout_view.ex:15 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Cannery" | ||||
| msgstr "" | ||||
| @@ -1141,12 +1131,52 @@ msgstr "" | ||||
| msgid "User was confirmed at%{confirmed_datetime}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:31 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: %{uses_left}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:36 | ||||
| #: lib/cannery_web/components/invite_card.ex:37 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: Unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:26 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Cannery lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/views/layout_view.ex:11 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery | %{title}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:78 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Registration:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:88 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Version:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:10 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Welcome to Cannery" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:32 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: %{uses_left_count}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses: %{uses_count}" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -56,11 +56,11 @@ msgstr "" | ||||
| msgid "Not found" | ||||
| msgstr "" | ||||
|  | ||||
| #: 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_settings/edit.html.heex:21 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:64 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:119 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:13 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:14 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:23 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:67 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:123 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Oops, something went wrong! Please check the errors below." | ||||
| msgstr "" | ||||
| @@ -70,14 +70,15 @@ msgstr "" | ||||
| msgid "Reset password link is invalid or it has expired." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:24 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:55 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:22 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:51 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, public registration is disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:14 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:45 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:12 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:41 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:70 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, this invite was not found or expired" | ||||
| msgstr "" | ||||
| @@ -97,7 +98,7 @@ msgstr "" | ||||
| msgid "User confirmation link is invalid or it has expired." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:18 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:19 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You are not authorized to view this page" | ||||
| msgstr "" | ||||
| @@ -107,23 +108,23 @@ msgstr "" | ||||
| msgid "You are not authorized to view this page." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:137 | ||||
| #: lib/cannery/accounts/user.ex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "did not change" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:158 | ||||
| #: lib/cannery/accounts/user.ex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "does not match password" | ||||
| msgstr "" | ||||
|  | ||||
| ## From Ecto.Changeset.put_change/3 | ||||
| #: lib/cannery/accounts/user.ex:195 | ||||
| #: lib/cannery/accounts/user.ex:202 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "is not valid" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:92 | ||||
| #: lib/cannery/accounts/user.ex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "must have the @ sign and no spaces" | ||||
| msgstr "" | ||||
| @@ -180,7 +181,7 @@ msgstr "" | ||||
| msgid "Please select an ammo type and container" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:69 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your browser does not support the canvas element." | ||||
| msgstr "" | ||||
|   | ||||
| @@ -13,45 +13,28 @@ msgstr "" | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:86 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:89 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:80 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:126 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} created successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:73 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.ex:55 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:53 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:133 | ||||
| #: lib/cannery_web/live/tag_live/index.ex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} deleted succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:109 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} disabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} enabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.ex:85 | ||||
| #: lib/cannery_web/live/container_live/show.ex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} has been deleted" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:67 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:70 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:62 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:108 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:61 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated successfully" | ||||
| msgstr "" | ||||
| @@ -61,32 +44,27 @@ msgstr "" | ||||
| msgid "A link to confirm your email change has been sent to the new address." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:103 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:133 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:98 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{email}? This action is permanent!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:136 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:59 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:135 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:55 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{name}?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:49 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete the invite for %{name}?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:153 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this ammo?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:160 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:163 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete your account?" | ||||
| msgstr "" | ||||
| @@ -96,11 +74,6 @@ msgstr "" | ||||
| msgid "Are you sure you want to log out?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to make %{name} unlimited?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:77 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Email changed successfully." | ||||
| @@ -131,23 +104,18 @@ msgstr "" | ||||
| msgid "Password updated successfully." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:73 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:65 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Please check your email to verify your account" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:91 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:55 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:52 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:33 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:93 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:158 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:53 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:43 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Saving..." | ||||
| msgstr "" | ||||
| @@ -172,7 +140,7 @@ msgstr "" | ||||
| msgid "%{tag_name} has been removed from %{container_name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:55 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Adding..." | ||||
| msgstr "" | ||||
| @@ -182,13 +150,13 @@ msgstr "" | ||||
| msgid "Shots recorded successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:28 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:27 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to unstage this ammo?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:142 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:118 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:116 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this shot record?" | ||||
| msgstr "" | ||||
| @@ -214,7 +182,7 @@ msgstr "" | ||||
| msgid "Ammo moved to %{name} successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copied to clipboard" | ||||
| msgstr "" | ||||
| @@ -224,18 +192,18 @@ msgstr "" | ||||
| msgid "%{name} removed successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:17 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:18 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You'll need to" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Creating..." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:141 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to change your language?" | ||||
| msgstr "" | ||||
| @@ -269,7 +237,47 @@ msgstr[0] "" | ||||
| msgstr[1] "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:90 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:29 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:65 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Register to setup Cannery" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:54 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} deleted succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:115 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} disabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:91 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} enabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:69 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} updated succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:140 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{user_email} deleted succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:48 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to delete the invite for %{invite_name}?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:73 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to make %{invite_name} unlimited?" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -56,11 +56,11 @@ msgstr "" | ||||
| msgid "Not found" | ||||
| msgstr "" | ||||
|  | ||||
| #: 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_settings/edit.html.heex:21 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:64 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:119 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:13 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:14 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:23 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:67 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:123 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Oops, something went wrong! Please check the errors below." | ||||
| msgstr "" | ||||
| @@ -70,14 +70,15 @@ msgstr "" | ||||
| msgid "Reset password link is invalid or it has expired." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:24 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:55 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:22 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:51 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, public registration is disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:14 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:45 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:12 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:41 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:70 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, this invite was not found or expired" | ||||
| msgstr "" | ||||
| @@ -97,7 +98,7 @@ msgstr "" | ||||
| msgid "User confirmation link is invalid or it has expired." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:18 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:19 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You are not authorized to view this page" | ||||
| msgstr "" | ||||
| @@ -107,22 +108,22 @@ msgstr "" | ||||
| msgid "You are not authorized to view this page." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:137 | ||||
| #: lib/cannery/accounts/user.ex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "did not change" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:158 | ||||
| #: lib/cannery/accounts/user.ex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "does not match password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:195 | ||||
| #: lib/cannery/accounts/user.ex:202 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "is not valid" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:92 | ||||
| #: lib/cannery/accounts/user.ex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "must have the @ sign and no spaces" | ||||
| msgstr "" | ||||
| @@ -179,7 +180,7 @@ msgstr "" | ||||
| msgid "Please select an ammo type and container" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:69 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your browser does not support the canvas element." | ||||
| msgstr "" | ||||
|   | ||||
| @@ -25,12 +25,12 @@ msgstr "" | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:62 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add Ammo" | ||||
| msgstr "Añadir Munición" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:36 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add your first box!" | ||||
| msgstr "¡Añade tu primera caja!" | ||||
| @@ -46,13 +46,13 @@ msgid "Add your first type!" | ||||
| msgstr "¡Añade tu primer tipo!" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:15 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change email" | ||||
| msgstr "Cambiar correo electrónico" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:58 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:99 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:59 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:101 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change password" | ||||
| msgstr "Cambiar contraseña" | ||||
| @@ -62,14 +62,14 @@ msgstr "Cambiar contraseña" | ||||
| msgid "Create Invite" | ||||
| msgstr "Crear Invitación" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:162 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Delete User" | ||||
| msgstr "Eliminar cuenta de Usuario" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:52 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:47 | ||||
| #: 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:44 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Forgot your password?" | ||||
| msgstr "¿Has olvidado tu contraseña?" | ||||
| @@ -79,13 +79,13 @@ msgstr "¿Has olvidado tu contraseña?" | ||||
| msgid "Invite someone new!" | ||||
| msgstr "¡Invita a alguien nuevo!" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:137 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:49 | ||||
| #: 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/components/topbar.ex:135 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:47 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Log in" | ||||
| msgstr "Entrar" | ||||
| @@ -110,51 +110,51 @@ msgstr "Nuevo Contenedor" | ||||
| msgid "New Tag" | ||||
| msgstr "Nueva Etiqueta" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:128 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:26 | ||||
| #: lib/cannery_web/components/topbar.ex:127 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:26 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "Registrarse" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Resend confirmation instructions" | ||||
| msgstr "Reenviar instrucciones de confirmación" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:34 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reset password" | ||||
| msgstr "Resetear contraseña" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:53 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:81 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:156 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:91 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Save" | ||||
| msgstr "Guardar" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Send instructions to reset password" | ||||
| msgstr "Enviar instrucciones para reestablecer contraseña" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:80 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Why not add one?" | ||||
| msgstr "¿Por qué no añadir una?" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:50 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add" | ||||
| msgstr "Añadir" | ||||
| @@ -169,9 +169,9 @@ msgstr "Preparar munición" | ||||
| msgid "Why not get some ready to shoot?" | ||||
| msgstr "¿Por qué no preparar parte para disparar?" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:100 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:101 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:101 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Record shots" | ||||
| msgstr "Tiros récord" | ||||
| @@ -191,27 +191,27 @@ msgstr "Mover contenedores" | ||||
| msgid "Select" | ||||
| msgstr "Seleccionar" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copy to clipboard" | ||||
| msgstr "Copiar al portapapeles" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add a container first" | ||||
| msgstr "añade primero un contenedor" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:74 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Create" | ||||
| msgstr "Crear" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:113 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change Language" | ||||
| msgstr "Cambiar Lenguaje" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:139 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:142 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change language" | ||||
| msgstr "Cambiar lenguaje" | ||||
| @@ -221,44 +221,34 @@ msgstr "Cambiar lenguaje" | ||||
| msgid "View in Catalog" | ||||
| msgstr "Ver en Catalogo" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add an ammo type first" | ||||
| msgstr "añade primero un tipo de munición" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "Desactivar" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "Activar" | ||||
|  | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "Mover munición" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:80 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:78 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Set Unlimited" | ||||
| msgstr "Activar ilimitados" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:86 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage for range" | ||||
| msgstr "Preparar para el campo de tiro" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage from range" | ||||
| msgstr "Desmontar del campo de tiro" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:153 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:156 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Export Data as JSON" | ||||
| msgstr "Exportar datos como JSON" | ||||
|   | ||||
| @@ -14,33 +14,17 @@ msgstr "" | ||||
| "Plural-Forms: nplurals=2; plural=n != 1;\n" | ||||
| "X-Generator: Weblate 4.14.2\n" | ||||
|  | ||||
| ## This file is a PO Template file. | ||||
| ## | ||||
| ## "msgid"s here are often extracted from source code. | ||||
| ## Add new translations manually only if they're dynamic | ||||
| ## translations that can't be statically extracted. | ||||
| ## | ||||
| ## Run "mix gettext.extract" to bring this file up to | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/home_live.ex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
| "%{name} te permite mantener un ojo en tus niveles de munición antes y " | ||||
| "después de un día en el campo de tiro" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.html.heex:46 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "Acceso desde cualquier dispositivo con conexión a internet" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:91 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins" | ||||
| msgstr "Administradores" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:83 | ||||
| #: lib/cannery_web/live/home_live.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins:" | ||||
| msgstr "Aministradores:" | ||||
| @@ -55,60 +39,60 @@ msgid "Ammo" | ||||
| msgstr "Munición" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:89 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Ammo type" | ||||
| msgstr "Tipo de munición" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Background color" | ||||
| msgstr "Color de fondo" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:141 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Blank" | ||||
| msgstr "Fogueo" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:69 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Brass" | ||||
| msgstr "Latón" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet core" | ||||
| msgstr "Núcleo de bala" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet type" | ||||
| msgstr "Tipo de bala" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:49 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:59 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Caliber" | ||||
| msgstr "Calibre" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:48 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cartridge" | ||||
| msgstr "Cartucho" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:50 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:66 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Case material" | ||||
| msgstr "Material del casquillo" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:65 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:57 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container" | ||||
| msgstr "Contenedor" | ||||
| @@ -122,42 +106,42 @@ msgid "Containers" | ||||
| msgstr "Contenedores" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:66 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:145 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Corrosive" | ||||
| msgstr "Corrosiva" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:76 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count" | ||||
| msgstr "Cantidad" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:38 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:8 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count:" | ||||
| msgstr "Cantidad:" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:25 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description" | ||||
| msgstr "Descripción" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:8 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:7 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description:" | ||||
| msgstr "Descripción:" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| #: lib/cannery_web/live/home_live.html.heex:23 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Easy to Use:" | ||||
| msgstr "Facil de Usar:" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:33 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:34 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Edit Invite" | ||||
| msgstr "Editar Invitación" | ||||
| @@ -167,95 +151,95 @@ msgstr "Editar Invitación" | ||||
| msgid "Edit Tag" | ||||
| msgstr "Editar Etiqueta" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Example bullet type abbreviations" | ||||
| msgstr "Abreviaciones de tipo de bala ejemplo" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "FMJ" | ||||
| msgstr "Bala encamisada" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:59 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Grains" | ||||
| msgstr "Grano" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Incendiary" | ||||
| msgstr "Incendiaria" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:78 | ||||
| #: lib/cannery_web/live/home_live.html.heex:55 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Instance Information" | ||||
| msgstr "Información de Instancia" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:41 | ||||
| #: lib/cannery_web/components/invite_card.ex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Disabled" | ||||
| msgstr "Invitación Desactivada" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:111 | ||||
| #: lib/cannery_web/live/home_live.html.heex:82 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Only" | ||||
| msgstr "Solo Invitación" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:90 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:41 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:42 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invites" | ||||
| msgstr "Invitaciones" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Keep me logged in for 60 days" | ||||
| msgstr "Mantener registrado durante 60 días" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:48 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:69 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location" | ||||
| msgstr "Localización" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:51 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:20 | ||||
| #: lib/cannery_web/components/container_card.ex:49 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:17 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location:" | ||||
| msgstr "Localización:" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:38 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Magazine, Clip, Ammo Box, etc" | ||||
| msgstr "Cargador, Clip, Caja de Munición, etc" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:149 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Manufacturer" | ||||
| msgstr "Fabricante" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Metal ammo can with the anime girl sticker" | ||||
| msgstr "Lata de munición metálica con la pegatina de chica de anime" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:23 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "My cool ammo can" | ||||
| msgstr "Mi lata de munición guapa" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:45 | ||||
| #: lib/cannery_web/components/container_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:21 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Name" | ||||
| msgstr "Nombre" | ||||
| @@ -272,7 +256,7 @@ msgstr "Nuevo tipo de Munición" | ||||
| msgid "New Container" | ||||
| msgstr "Nuevo Contenedor" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:37 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New Invite" | ||||
| msgstr "Nueva Invitación" | ||||
| @@ -282,13 +266,13 @@ msgstr "Nueva Invitación" | ||||
| msgid "New Tag" | ||||
| msgstr "Nueva Etiqueta" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:8 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:70 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:71 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No Ammo" | ||||
| msgstr "Sin Munición" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:166 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:167 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No ammo for this type" | ||||
| msgstr "Sin munición para este tipo" | ||||
| @@ -304,68 +288,68 @@ msgstr "Sin contenedores" | ||||
| msgid "No invites" | ||||
| msgstr "Sin invitaciones" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags" | ||||
| msgstr "Sin etiquetas" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:37 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:38 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:81 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:43 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:93 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:29 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes" | ||||
| msgstr "Notas" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:51 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:52 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes:" | ||||
| msgstr "Notas:" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:46 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "On the bookshelf" | ||||
| msgstr "En la estantería" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Pressure" | ||||
| msgstr "Presión" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:78 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:35 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid" | ||||
| msgstr "Precio pagado" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:70 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid:" | ||||
| msgstr "Precio pagado:" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:61 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:119 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Primer type" | ||||
| msgstr "Tipo de espoleta" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:110 | ||||
| #: lib/cannery_web/live/home_live.html.heex:81 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Public Signups" | ||||
| msgstr "Registro Público" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:56 | ||||
| #: lib/cannery_web/live/home_live.html.heex:33 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Secure:" | ||||
| msgstr "Seguro:" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:59 | ||||
| #: lib/cannery_web/live/home_live.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
| @@ -378,12 +362,12 @@ msgstr "" | ||||
| msgid "Settings" | ||||
| msgstr "Ajustes" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:66 | ||||
| #: lib/cannery_web/live/home_live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Simple:" | ||||
| msgstr "Simple:" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:48 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Steel" | ||||
| msgstr "Acero" | ||||
| @@ -408,56 +392,51 @@ msgid "Tags can be added to your containers to help you organize" | ||||
| msgstr "" | ||||
| "Etiquetas pueden ser añadidas a tus contenedores para ayudarte a organizar" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:85 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Text color" | ||||
| msgstr "Color del texto" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:35 | ||||
| #: lib/cannery_web/live/home_live.html.heex:14 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "La página de seguimiento de armas autogestionada" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Tracer" | ||||
| msgstr "Trazadora" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:49 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:68 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type" | ||||
| msgstr "Tipo" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:45 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:14 | ||||
| #: lib/cannery_web/components/container_card.ex:44 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:12 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type:" | ||||
| msgstr "Tipo:" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Users" | ||||
| msgstr "Usuarios" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses left" | ||||
| msgstr "Usos restantes" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "Bienvenide a %{name}" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:60 | ||||
| #: lib/cannery_web/live/home_live.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "Tus datos se quedan contigo, sin excepciones" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:72 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags for this container" | ||||
| msgstr "Contenedor sin etiquetas" | ||||
| @@ -473,15 +452,15 @@ msgstr "Campo de tiro" | ||||
| msgid "Range day" | ||||
| msgstr "Día de disparar" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:45 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:46 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:44 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:94 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:36 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Date" | ||||
| msgstr "Fecha" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shots fired" | ||||
| msgstr "Tiros disparados" | ||||
| @@ -508,21 +487,21 @@ msgstr "Editar Tiros Récord" | ||||
| msgid "New Shot Records" | ||||
| msgstr "Nuevos Tiros Récord" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:50 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:48 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No shots recorded" | ||||
| msgstr "No se han grabado tiros" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:21 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:25 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:22 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds left" | ||||
| msgstr "Balas restantes" | ||||
|  | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:42 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds shot" | ||||
| msgstr "Balas disparadas" | ||||
| @@ -534,7 +513,7 @@ msgid "Shot Records" | ||||
| msgstr "Récords de Tiro" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:38 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:117 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:118 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "Mover munición" | ||||
| @@ -544,91 +523,91 @@ msgstr "Mover munición" | ||||
| msgid "No other containers" | ||||
| msgstr "No hay otros contenedores" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:55 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:53 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shot log" | ||||
| msgstr "Registro de tiros" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:71 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:78 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:69 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:76 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:153 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:225 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:180 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "$%{amount}" | ||||
| msgstr "$%{amount}" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bimetal" | ||||
| msgstr "Bimetal" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Jacket type" | ||||
| msgstr "Tipo de camisa" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:52 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Muzzle velocity" | ||||
| msgstr "Velocidad de boca" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder grains per charge" | ||||
| msgstr "Granos de polvora por carga" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:53 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder type" | ||||
| msgstr "Tipo de polvora" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:153 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "UPC" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:78 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Confirm new password" | ||||
| msgstr "Confirme contraseña nueva" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:87 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:89 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Current password" | ||||
| msgstr "Contraseña actual" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:71 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New password" | ||||
| msgstr "Nueva contraseña" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage" | ||||
| msgstr "Preparar" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage" | ||||
| msgstr "Retirar" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:62 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Firing type" | ||||
| msgstr "Tipo de fuego" | ||||
|  | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:40 | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reconnecting..." | ||||
| msgstr "Reconectando..." | ||||
| @@ -645,16 +624,16 @@ msgstr "Editar %{name}" | ||||
| msgid "Edit %{name} tags" | ||||
| msgstr "Editar etiquetas de %{name}" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:67 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:39 | ||||
| #: lib/cannery_web/components/container_card.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:68 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:35 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds:" | ||||
| msgstr "Balas:" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:222 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:179 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:142 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:143 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No cost information" | ||||
| msgstr "No hay información de coste" | ||||
| @@ -704,7 +683,7 @@ msgstr "¿Olvidó su contraseña?" | ||||
| msgid "Log in" | ||||
| msgstr "Entrar" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:34 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "Registrarse" | ||||
| @@ -720,55 +699,53 @@ msgstr "Reestablecer contraseña" | ||||
| msgid "Record Shots" | ||||
| msgstr "Tiros Récord" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:66 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copies" | ||||
| msgstr "Copias" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:123 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:124 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Added on:" | ||||
| msgstr "Añadido en:" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:130 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "English" | ||||
| msgstr "Inglés" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:132 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:135 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "French" | ||||
| msgstr "Francés" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:131 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:134 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "German" | ||||
| msgstr "Alemán" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Language" | ||||
| msgstr "Idioma" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:136 | ||||
| #: lib/cannery_web/live/home_live.html.heex:107 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Get involved!" | ||||
| msgstr "¡Implícate!" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:157 | ||||
| #: lib/cannery_web/live/home_live.html.heex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Help translate" | ||||
| msgstr "Ayuda a traducir" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:168 | ||||
| #: lib/cannery_web/live/home_live.html.heex:139 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Report bugs or request features" | ||||
| msgstr "Informar de errores o solicitar funciones" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:146 | ||||
| #: lib/cannery_web/live/home_live.html.heex:117 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View the source code" | ||||
| msgstr "Ver código fuente" | ||||
| @@ -791,7 +768,7 @@ msgstr "Editar Munición" | ||||
| msgid "Move Ammo" | ||||
| msgstr "Mover Munición" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:119 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:113 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No ammo in this container" | ||||
| msgstr "No hay munición en este contenedor" | ||||
| @@ -806,39 +783,39 @@ msgstr "Mostrar Munición" | ||||
| msgid "This ammo is not in a container" | ||||
| msgstr "Esta munición no está en un contenedor" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:95 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:30 | ||||
| #: lib/cannery_web/components/container_card.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:96 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Packs:" | ||||
| msgstr "Paquetes:" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:25 | ||||
| #: lib/cannery_web/live/home_live.ex:25 | ||||
| #: lib/cannery_web/live/home_live.html.heex:4 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery logo" | ||||
| msgstr "Logo de cannery" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:27 | ||||
| #: lib/cannery_web/live/home_live.html.heex:6 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "isn't he cute >:3" | ||||
| msgstr "acaso no es mono >:3" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:28 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:29 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Leave \"Uses left\" blank to make invite unlimited" | ||||
| msgstr "" | ||||
| "Deje \"Usos restantes\" en blanco para hacer las invitaciónes ilimitadas" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:86 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:83 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container:" | ||||
| msgstr "Contenedor:" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:63 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:152 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:153 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Show used" | ||||
| msgstr "Mostrar usadas" | ||||
| @@ -866,9 +843,9 @@ msgstr "Paquetes" | ||||
| msgid "Rounds" | ||||
| msgstr "Balas" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:158 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:159 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View as table" | ||||
| msgstr "Ver como tabla" | ||||
| @@ -878,7 +855,7 @@ msgstr "Ver como tabla" | ||||
| msgid "Total ever packs" | ||||
| msgstr "Paquetes totales" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total ever packs:" | ||||
| msgstr "Paquetes totales:" | ||||
| @@ -888,7 +865,7 @@ msgstr "Paquetes totales:" | ||||
| msgid "Total ever rounds" | ||||
| msgstr "Balas totales" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:84 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total ever rounds:" | ||||
| msgstr "Balas totales:" | ||||
| @@ -898,7 +875,7 @@ msgstr "Balas totales:" | ||||
| msgid "Used packs" | ||||
| msgstr "Paquetes usados" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Used packs:" | ||||
| msgstr "Paquetes usados:" | ||||
| @@ -908,17 +885,17 @@ msgstr "Paquetes usados:" | ||||
| msgid "Used rounds" | ||||
| msgstr "Balas usadas" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Used rounds:" | ||||
| msgstr "Balas usadas:" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:33 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:34 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Used up!" | ||||
| msgstr "¡Acabada!" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:66 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Rounds shot chart" | ||||
| msgstr "Tabla de disparos" | ||||
| @@ -1019,7 +996,7 @@ msgid "UPC:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:120 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Average CPR" | ||||
| msgstr "" | ||||
| @@ -1030,7 +1007,7 @@ msgstr "" | ||||
| msgid "Edit %{ammo_type_name}" | ||||
| msgstr "Editar %{ammo_type_name}" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:40 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:231 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Empty" | ||||
| @@ -1041,7 +1018,7 @@ msgstr "Vacio" | ||||
| msgid "CPR" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:77 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "CPR:" | ||||
| msgstr "" | ||||
| @@ -1051,7 +1028,7 @@ msgstr "" | ||||
| msgid "Original Count" | ||||
| msgstr "Cantidad Original" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:44 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Original Count:" | ||||
| msgstr "Cantidad Original:" | ||||
| @@ -1061,12 +1038,12 @@ msgstr "Cantidad Original:" | ||||
| msgid "Home" | ||||
| msgstr "Menu principal" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total packs:" | ||||
| msgstr "Paquetes totales:" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:33 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total rounds:" | ||||
| msgstr "Balas totales:" | ||||
| @@ -1076,7 +1053,7 @@ msgstr "Balas totales:" | ||||
| msgid "Last used on" | ||||
| msgstr "Usada por última vez en" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:63 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Last used on:" | ||||
| msgstr "Usada por última vez en:" | ||||
| @@ -1087,7 +1064,7 @@ msgid "Never used" | ||||
| msgstr "Nunca usada" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Purchased on" | ||||
| msgstr "Comprada en" | ||||
| @@ -1114,7 +1091,7 @@ msgstr "Sin tipo de Munición" | ||||
| msgid "Search catalog" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:58 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Search ammo" | ||||
| msgstr "" | ||||
| @@ -1129,18 +1106,20 @@ msgstr "" | ||||
| msgid "Search tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:83 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Search shot records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:136 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Spanish" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/error/error.html.heex:8 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:13 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:14 | ||||
| #: lib/cannery_web/views/layout_view.ex:15 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Cannery" | ||||
| msgstr "Logo de cannery" | ||||
| @@ -1160,12 +1139,63 @@ msgstr "Usuario registrado en" | ||||
| msgid "User was confirmed at%{confirmed_datetime}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:31 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: %{uses_left}" | ||||
| msgstr "Usos Restantes:" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:36 | ||||
| #: lib/cannery_web/components/invite_card.ex:37 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: Unlimited" | ||||
| msgstr "Usos Restantes:" | ||||
|  | ||||
| ## This file is a PO Template file. | ||||
| ## | ||||
| ## "msgid"s here are often extracted from source code. | ||||
| ## Add new translations manually only if they're dynamic | ||||
| ## translations that can't be statically extracted. | ||||
| ## | ||||
| ## Run "mix gettext.extract" to bring this file up to | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/home_live.html.heex:26 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Cannery lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
| "%{name} te permite mantener un ojo en tus niveles de munición antes y " | ||||
| "después de un día en el campo de tiro" | ||||
|  | ||||
| #: lib/cannery_web/views/layout_view.ex:11 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery | %{title}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:78 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Registration:" | ||||
| msgstr "Registrarse" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:88 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Version:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:10 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Welcome to Cannery" | ||||
| msgstr "Bienvenide a %{name}" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:32 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: %{uses_left_count}" | ||||
| msgstr "Usos Restantes:" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses: %{uses_count}" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -69,11 +69,11 @@ msgstr "Correo o contraseña incorrecta" | ||||
| msgid "Not found" | ||||
| msgstr "No se encontró" | ||||
|  | ||||
| #: 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_settings/edit.html.heex:21 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:64 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:119 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:13 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:14 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:23 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:67 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:123 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Oops, something went wrong! Please check the errors below." | ||||
| msgstr "" | ||||
| @@ -86,14 +86,15 @@ msgid "Reset password link is invalid or it has expired." | ||||
| msgstr "" | ||||
| "El enlace de reestablecimiento de la contraseña es inválido o ha caducado." | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:24 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:55 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:22 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:51 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, public registration is disabled" | ||||
| msgstr "Lo sentimos, el registro público no está habilitado" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:14 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:45 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:12 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:41 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:70 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, this invite was not found or expired" | ||||
| msgstr "Lo sentimos, esta invitación no es válida o ha caducado" | ||||
| @@ -113,7 +114,7 @@ msgstr "No autorizado" | ||||
| msgid "User confirmation link is invalid or it has expired." | ||||
| msgstr "El enlace de confirmación de usuario no es válido o ha caducado." | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:18 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:19 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You are not authorized to view this page" | ||||
| msgstr "No está autorizado a ver esta página" | ||||
| @@ -123,22 +124,22 @@ msgstr "No está autorizado a ver esta página" | ||||
| msgid "You are not authorized to view this page." | ||||
| msgstr "No está autorizado a ver esta página." | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:137 | ||||
| #: lib/cannery/accounts/user.ex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "did not change" | ||||
| msgstr "no cambió" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:158 | ||||
| #: lib/cannery/accounts/user.ex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "does not match password" | ||||
| msgstr "no coincide con la contraseña" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:195 | ||||
| #: lib/cannery/accounts/user.ex:202 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "is not valid" | ||||
| msgstr "no es válido" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:92 | ||||
| #: lib/cannery/accounts/user.ex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "must have the @ sign and no spaces" | ||||
| msgstr "debe tener el signo @ y no contener espacios" | ||||
| @@ -195,7 +196,7 @@ msgstr "Multiplicador inválido" | ||||
| msgid "Please select an ammo type and container" | ||||
| msgstr "Por favor escoja un tipo de munición y un contenedor" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:69 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your browser does not support the canvas element." | ||||
| msgstr "Su navegador no es compatible con el elemento lienzo." | ||||
|   | ||||
| @@ -26,45 +26,28 @@ msgstr "" | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:86 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:89 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:80 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:126 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} created successfully" | ||||
| msgstr "%{name} creado exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:73 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.ex:55 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:53 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:133 | ||||
| #: lib/cannery_web/live/tag_live/index.ex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} deleted succesfully" | ||||
| msgstr "%{name} borrado exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:109 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} disabled succesfully" | ||||
| msgstr "%{name} desactivado exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} enabled succesfully" | ||||
| msgstr "%{name} activado exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.ex:85 | ||||
| #: lib/cannery_web/live/container_live/show.ex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} has been deleted" | ||||
| msgstr "%{name} ha sido borrado" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated succesfully" | ||||
| msgstr "%{name} actualizado exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:67 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:70 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:62 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:108 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:61 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated successfully" | ||||
| msgstr "%{name} actualizado exitosamente" | ||||
| @@ -76,32 +59,27 @@ msgstr "" | ||||
| "Un enlace para confirmar el correo electrónico ha sido enviado a la nueva " | ||||
| "dirección." | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:103 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:133 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:98 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{email}? This action is permanent!" | ||||
| msgstr "Está seguro que desea eliminar %{email}? Esta acción es permanente!" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:136 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:59 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:135 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:55 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{name}?" | ||||
| msgstr "Está seguro que desea eliminar %{name}?" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:49 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete the invite for %{name}?" | ||||
| msgstr "Está seguro que quiere eliminar la invitación para %{name}?" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:153 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this ammo?" | ||||
| msgstr "Está seguro que desea eliminar esta munición?" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:160 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:163 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete your account?" | ||||
| msgstr "Está seguro que desea eliminar su cuenta?" | ||||
| @@ -111,11 +89,6 @@ msgstr "Está seguro que desea eliminar su cuenta?" | ||||
| msgid "Are you sure you want to log out?" | ||||
| msgstr "Está seguro que desea cerrar sesión?" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to make %{name} unlimited?" | ||||
| msgstr "Está seguro que desea hacer %{name} ilimitado?" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:77 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Email changed successfully." | ||||
| @@ -150,23 +123,18 @@ msgstr "Contraseña reiniciada exitosamente." | ||||
| msgid "Password updated successfully." | ||||
| msgstr "Contraseña cambiada exitosamente." | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:73 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:65 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Please check your email to verify your account" | ||||
| msgstr "Por favor chequea el correo para verificar tu cuenta" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:91 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "Regístrese para configurar %{name}" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:55 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:52 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:33 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:93 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:158 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:53 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:43 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Saving..." | ||||
| msgstr "Guardando..." | ||||
| @@ -192,7 +160,7 @@ msgstr "%{name} añadido exitosamente" | ||||
| msgid "%{tag_name} has been removed from %{container_name}" | ||||
| msgstr "se ha removido %{tag_name} de %{container_name}" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:55 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Adding..." | ||||
| msgstr "Añadiendo..." | ||||
| @@ -202,13 +170,13 @@ msgstr "Añadiendo..." | ||||
| msgid "Shots recorded successfully" | ||||
| msgstr "Tiros registrados exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:28 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:27 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to unstage this ammo?" | ||||
| msgstr "Está seguro que desea desmontar esta munición?" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:142 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:118 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:116 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this shot record?" | ||||
| msgstr "¿Está segure que quiere borrar este récord de disparos?" | ||||
| @@ -234,7 +202,7 @@ msgstr "%{email} confirmado exitosamente." | ||||
| msgid "Ammo moved to %{name} successfully" | ||||
| msgstr "Munición movida a %{name} exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copied to clipboard" | ||||
| msgstr "Copiado al portapapeles" | ||||
| @@ -244,18 +212,18 @@ msgstr "Copiado al portapapeles" | ||||
| msgid "%{name} removed successfully" | ||||
| msgstr "%{name} eliminado exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:17 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:18 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You'll need to" | ||||
| msgstr "Necesitará hacerlo" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Creating..." | ||||
| msgstr "Creando..." | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:141 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to change your language?" | ||||
| msgstr "¿Está segure de que quiere cambiar el idioma?" | ||||
| @@ -289,9 +257,49 @@ msgstr[0] "Munición añadida exitosamente" | ||||
| msgstr[1] "Municiones añadidas exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:90 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:29 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" | ||||
| msgstr "" | ||||
| "¿Está seguro de que quiere borrar %{name}? ¡Esto también borrará todos los " | ||||
| "tipos de munición %{name}!" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:65 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Register to setup Cannery" | ||||
| msgstr "Regístrese para configurar %{name}" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:54 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} deleted succesfully" | ||||
| msgstr "%{name} borrado exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:115 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} disabled succesfully" | ||||
| msgstr "%{name} desactivado exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:91 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} enabled succesfully" | ||||
| msgstr "%{name} activado exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:69 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} updated succesfully" | ||||
| msgstr "%{name} actualizado exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:140 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{user_email} deleted succesfully" | ||||
| msgstr "%{name} borrado exitosamente" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:48 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to delete the invite for %{invite_name}?" | ||||
| msgstr "Está seguro que quiere eliminar la invitación para %{name}?" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:73 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to make %{invite_name} unlimited?" | ||||
| msgstr "Está seguro que desea hacer %{name} ilimitado?" | ||||
|   | ||||
| @@ -25,12 +25,12 @@ msgstr "" | ||||
| # # effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:62 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add Ammo" | ||||
| msgstr "ajouter munition" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:36 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add your first box!" | ||||
| msgstr "Ajoutez votre première caisse !" | ||||
| @@ -46,13 +46,13 @@ msgid "Add your first type!" | ||||
| msgstr "Ajoutez votre premier type !" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:15 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change email" | ||||
| msgstr "Changer le mél" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:58 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:99 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:59 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:101 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change password" | ||||
| msgstr "Changer le mot de passe" | ||||
| @@ -62,14 +62,14 @@ msgstr "Changer le mot de passe" | ||||
| msgid "Create Invite" | ||||
| msgstr "Créer une invitation" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:162 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Delete User" | ||||
| msgstr "Supprimer utilisateur" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:52 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:47 | ||||
| #: 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:44 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Forgot your password?" | ||||
| msgstr "Mot de passe oublié ?" | ||||
| @@ -79,13 +79,13 @@ msgstr "Mot de passe oublié ?" | ||||
| msgid "Invite someone new!" | ||||
| msgstr "Invitez une nouvelle personne !" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:137 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:49 | ||||
| #: 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/components/topbar.ex:135 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:47 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Log in" | ||||
| msgstr "Se connecter" | ||||
| @@ -110,51 +110,51 @@ msgstr "Nouveau conteneur" | ||||
| msgid "New Tag" | ||||
| msgstr "Nouveau tag" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:128 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:26 | ||||
| #: lib/cannery_web/components/topbar.ex:127 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:26 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "S’enregistrer" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Resend confirmation instructions" | ||||
| msgstr "Renvoyer les instructions de confirmation" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:34 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reset password" | ||||
| msgstr "Réinitialisé le mot de passe" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:53 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:81 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:156 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:91 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Save" | ||||
| msgstr "Sauvegarder" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Send instructions to reset password" | ||||
| msgstr "Envoyer les instructions pour réinitialiser le mot de passe" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:80 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Why not add one?" | ||||
| msgstr "Pourquoi pas en ajouter un ?" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:50 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add" | ||||
| msgstr "Ajouter" | ||||
| @@ -169,9 +169,9 @@ msgstr "Munition préparée" | ||||
| msgid "Why not get some ready to shoot?" | ||||
| msgstr "Pourquoi pas en préparer pour tirer ?" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:100 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:101 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:101 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Record shots" | ||||
| msgstr "Enregistrer des tirs" | ||||
| @@ -191,27 +191,27 @@ msgstr "Déplacer les conteneurs" | ||||
| msgid "Select" | ||||
| msgstr "Sélectionner" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copy to clipboard" | ||||
| msgstr "Copier dans le presse-papier" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add a container first" | ||||
| msgstr "ajouter un conteneur en premier" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:74 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Create" | ||||
| msgstr "Créer" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:113 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change Language" | ||||
| msgstr "Changer la langue" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:139 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:142 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change language" | ||||
| msgstr "Changer la langue" | ||||
| @@ -221,44 +221,34 @@ msgstr "Changer la langue" | ||||
| msgid "View in Catalog" | ||||
| msgstr "Voir en catalogue" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add an ammo type first" | ||||
| msgstr "Ajoutez d'abord un type de munitions" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:80 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:78 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Set Unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:86 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage for range" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage from range" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:153 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:156 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Export Data as JSON" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -14,33 +14,17 @@ msgstr "" | ||||
| "Plural-Forms: nplurals=2; plural=n > 1;\n" | ||||
| "X-Generator: Weblate 4.12.2\n" | ||||
|  | ||||
| # # This file is a PO Template file. | ||||
| # # | ||||
| # # "msgid"s here are often extracted from source code. | ||||
| # # Add new translations manually only if they're dynamic | ||||
| # # translations that can't be statically extracted. | ||||
| # # | ||||
| # # Run "mix gettext.extract" to bring this file up to | ||||
| # # date. Leave "msgstr"s empty as changing them here has no | ||||
| # # effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/home_live.ex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
| "%{name} vous permet de facilement garder un œil sur votre niveau de munition " | ||||
| "avant et après une journée de stand" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.html.heex:46 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "Accédez depuis n’importe quel appareil connecté à internet" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:91 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins" | ||||
| msgstr "Administrateur·ices" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:83 | ||||
| #: lib/cannery_web/live/home_live.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins:" | ||||
| msgstr "Administrateur·ices :" | ||||
| @@ -55,60 +39,60 @@ msgid "Ammo" | ||||
| msgstr "Munition" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:89 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Ammo type" | ||||
| msgstr "Type de munition" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Background color" | ||||
| msgstr "Couleur de fond" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:141 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Blank" | ||||
| msgstr "Vide" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:69 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Brass" | ||||
| msgstr "Cuivre" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet core" | ||||
| msgstr "Noyau de balle" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet type" | ||||
| msgstr "Type de balle" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:49 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:59 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Caliber" | ||||
| msgstr "Calibre" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:48 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cartridge" | ||||
| msgstr "Cartouche" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:50 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:66 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Case material" | ||||
| msgstr "Matériau de la caisse" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:65 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:57 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container" | ||||
| msgstr "Conteneur" | ||||
| @@ -122,42 +106,42 @@ msgid "Containers" | ||||
| msgstr "Conteneurs" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:66 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:145 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Corrosive" | ||||
| msgstr "Corrosive" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:76 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count" | ||||
| msgstr "Quantité" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:38 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:8 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count:" | ||||
| msgstr "Quantité :" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:25 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description" | ||||
| msgstr "Description" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:8 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:7 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description:" | ||||
| msgstr "Description :" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| #: lib/cannery_web/live/home_live.html.heex:23 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Easy to Use:" | ||||
| msgstr "Simple à utiliser :" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:33 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:34 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Edit Invite" | ||||
| msgstr "Modifier l’invitation" | ||||
| @@ -167,95 +151,95 @@ msgstr "Modifier l’invitation" | ||||
| msgid "Edit Tag" | ||||
| msgstr "Modifier le tag" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Example bullet type abbreviations" | ||||
| msgstr "Exemple d’abréviations de type de balle" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "FMJ" | ||||
| msgstr "FMJ" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:59 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Grains" | ||||
| msgstr "Graines" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Incendiary" | ||||
| msgstr "Incendiaire" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:78 | ||||
| #: lib/cannery_web/live/home_live.html.heex:55 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Instance Information" | ||||
| msgstr "Information de l’instance" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:41 | ||||
| #: lib/cannery_web/components/invite_card.ex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Disabled" | ||||
| msgstr "Invitation désactivée" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:111 | ||||
| #: lib/cannery_web/live/home_live.html.heex:82 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Only" | ||||
| msgstr "Uniquement sur invitation" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:90 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:41 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:42 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invites" | ||||
| msgstr "Invitations" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Keep me logged in for 60 days" | ||||
| msgstr "Me garder authentifié durant 60 jours" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:48 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:69 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location" | ||||
| msgstr "Localisation" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:51 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:20 | ||||
| #: lib/cannery_web/components/container_card.ex:49 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:17 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location:" | ||||
| msgstr "Localisation :" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:38 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Magazine, Clip, Ammo Box, etc" | ||||
| msgstr "Chargeur, lame-chargeur, boite de munition, etc." | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:149 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Manufacturer" | ||||
| msgstr "Fabricant" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Metal ammo can with the anime girl sticker" | ||||
| msgstr "Boite de munition avec le sticker de fille d’animation" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:23 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "My cool ammo can" | ||||
| msgstr "Ma superbe boite de munition" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:45 | ||||
| #: lib/cannery_web/components/container_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:21 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Name" | ||||
| msgstr "Nom" | ||||
| @@ -272,7 +256,7 @@ msgstr "Nouveau type de munition" | ||||
| msgid "New Container" | ||||
| msgstr "Nouveau conteneur" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:37 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New Invite" | ||||
| msgstr "Nouvelle invitation" | ||||
| @@ -282,13 +266,13 @@ msgstr "Nouvelle invitation" | ||||
| msgid "New Tag" | ||||
| msgstr "Nouveau tag" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:8 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:70 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:71 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No Ammo" | ||||
| msgstr "Aucune munition" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:166 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:167 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No ammo for this type" | ||||
| msgstr "Aucune munition pour ce type" | ||||
| @@ -304,68 +288,68 @@ msgstr "Aucun conteneur" | ||||
| msgid "No invites" | ||||
| msgstr "Aucune invitation" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags" | ||||
| msgstr "Aucun tag" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:37 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:38 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:81 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:43 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:93 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:29 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes" | ||||
| msgstr "Notes" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:51 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:52 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes:" | ||||
| msgstr "Notes :" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:46 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "On the bookshelf" | ||||
| msgstr "Sur l’étagère" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Pressure" | ||||
| msgstr "Pression" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:78 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:35 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid" | ||||
| msgstr "Prix payé" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:70 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid:" | ||||
| msgstr "Prix payé :" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:61 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:119 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Primer type" | ||||
| msgstr "Type d’amorce" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:110 | ||||
| #: lib/cannery_web/live/home_live.html.heex:81 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Public Signups" | ||||
| msgstr "Enregistrements publics" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:56 | ||||
| #: lib/cannery_web/live/home_live.html.heex:33 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Secure:" | ||||
| msgstr "Sécurisé :" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:59 | ||||
| #: lib/cannery_web/live/home_live.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
| @@ -378,12 +362,12 @@ msgstr "" | ||||
| msgid "Settings" | ||||
| msgstr "Paramètres" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:66 | ||||
| #: lib/cannery_web/live/home_live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Simple:" | ||||
| msgstr "Simple :" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:48 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Steel" | ||||
| msgstr "Acier" | ||||
| @@ -409,56 +393,51 @@ msgstr "" | ||||
| "Des tags peuvent être ajouté sur vos conteneurs pour vous aider à vous " | ||||
| "organiser" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:85 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Text color" | ||||
| msgstr "Couleur du texte" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:35 | ||||
| #: lib/cannery_web/live/home_live.html.heex:14 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "Le site web de suivi d’arme à feux auto-hébergé" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Tracer" | ||||
| msgstr "Traceuse" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:49 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:68 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type" | ||||
| msgstr "Type" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:45 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:14 | ||||
| #: lib/cannery_web/components/container_card.ex:44 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:12 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type:" | ||||
| msgstr "Type :" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Users" | ||||
| msgstr "Utilisateurs" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses left" | ||||
| msgstr "Utilisations restantes" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "Bienvenue à %{name}" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:60 | ||||
| #: lib/cannery_web/live/home_live.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "Vos données restent avec vous, point final" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:72 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags for this container" | ||||
| msgstr "Aucun tag pour ce conteneur" | ||||
| @@ -474,15 +453,15 @@ msgstr "Portée" | ||||
| msgid "Range day" | ||||
| msgstr "Journée de stand" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:45 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:46 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:44 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:94 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:36 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Date" | ||||
| msgstr "Date" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shots fired" | ||||
| msgstr "Tirs réalisés" | ||||
| @@ -509,21 +488,21 @@ msgstr "Modifier les enregistrements de tir" | ||||
| msgid "New Shot Records" | ||||
| msgstr "Nouveaux enregistrements de tir" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:50 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:48 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No shots recorded" | ||||
| msgstr "Aucun tir enregistré" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:21 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:25 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:22 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds left" | ||||
| msgstr "Cartouches restantes" | ||||
|  | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:42 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds shot" | ||||
| msgstr "Cartouches tirées" | ||||
| @@ -535,7 +514,7 @@ msgid "Shot Records" | ||||
| msgstr "Enregistrements de tir" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:38 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:117 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:118 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "Déplacer munition" | ||||
| @@ -545,91 +524,91 @@ msgstr "Déplacer munition" | ||||
| msgid "No other containers" | ||||
| msgstr "Aucun autre conteneur" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:55 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:53 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shot log" | ||||
| msgstr "Évènements de tir" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:71 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:78 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:69 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:76 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:153 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:225 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:180 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "$%{amount}" | ||||
| msgstr "%{amount} $" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bimetal" | ||||
| msgstr "Bi-métal" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Jacket type" | ||||
| msgstr "Type de douille" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:52 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Muzzle velocity" | ||||
| msgstr "Vélocité du canon" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder grains per charge" | ||||
| msgstr "Graines de poudre par charge" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:53 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder type" | ||||
| msgstr "Type de poudre" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:153 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "UPC" | ||||
| msgstr "UPC" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:78 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Confirm new password" | ||||
| msgstr "Confirmez le nouveau mot de passe" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:87 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:89 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Current password" | ||||
| msgstr "Mot de passe actuel" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:71 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New password" | ||||
| msgstr "Nouveau mot de passe" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage" | ||||
| msgstr "Sélectionné" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage" | ||||
| msgstr "Désélectionner" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:62 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Firing type" | ||||
| msgstr "Type d’allumage" | ||||
|  | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:40 | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reconnecting..." | ||||
| msgstr "Reconnexion en cours…" | ||||
| @@ -646,16 +625,16 @@ msgstr "Éditer %{name}" | ||||
| msgid "Edit %{name} tags" | ||||
| msgstr "Éditer les tags de %{name}" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:67 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:39 | ||||
| #: lib/cannery_web/components/container_card.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:68 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:35 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds:" | ||||
| msgstr "Cartouches :" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:222 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:179 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:142 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:143 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No cost information" | ||||
| msgstr "Aucune information de prix" | ||||
| @@ -705,7 +684,7 @@ msgstr "Mot de passe oublié ?" | ||||
| msgid "Log in" | ||||
| msgstr "Se connecter" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:34 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "S’enregistrer" | ||||
| @@ -721,55 +700,53 @@ msgstr "Réinitialiser votre mot de passe" | ||||
| msgid "Record Shots" | ||||
| msgstr "Enregistrer des tirs" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:66 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copies" | ||||
| msgstr "Exemplaires" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:123 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:124 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Added on:" | ||||
| msgstr "Ajouté le :" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:130 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "English" | ||||
| msgstr "Anglais" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:132 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:135 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "French" | ||||
| msgstr "Français" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:131 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:134 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "German" | ||||
| msgstr "Allemand" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Language" | ||||
| msgstr "Langue" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:136 | ||||
| #: lib/cannery_web/live/home_live.html.heex:107 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Get involved!" | ||||
| msgstr "Impliquez-vous !" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:157 | ||||
| #: lib/cannery_web/live/home_live.html.heex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Help translate" | ||||
| msgstr "Aider à la traduction" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:168 | ||||
| #: lib/cannery_web/live/home_live.html.heex:139 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Report bugs or request features" | ||||
| msgstr "Remonter des bugs ou une demande de fonctionnalité" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:146 | ||||
| #: lib/cannery_web/live/home_live.html.heex:117 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View the source code" | ||||
| msgstr "Voir le code source" | ||||
| @@ -792,7 +769,7 @@ msgstr "Éditer le type de munition" | ||||
| msgid "Move Ammo" | ||||
| msgstr "Déplacer munition" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:119 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:113 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "No ammo in this container" | ||||
| msgstr "Aucun groupe de munition pour ce conteneur" | ||||
| @@ -807,39 +784,39 @@ msgstr "Montrer le type de munition" | ||||
| msgid "This ammo is not in a container" | ||||
| msgstr "Ce groupe de munition n’est pas dans un conteneur" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:95 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:30 | ||||
| #: lib/cannery_web/components/container_card.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:96 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Packs:" | ||||
| msgstr "Packages :" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:25 | ||||
| #: lib/cannery_web/live/home_live.ex:25 | ||||
| #: lib/cannery_web/live/home_live.html.heex:4 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery logo" | ||||
| msgstr "Logo de Cannery" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:27 | ||||
| #: lib/cannery_web/live/home_live.html.heex:6 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "isn't he cute >:3" | ||||
| msgstr "N'est-il mignon >:3" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:28 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:29 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Leave \"Uses left\" blank to make invite unlimited" | ||||
| msgstr "" | ||||
| "Laissez \"Utilisations restantes\" vide pour rendre l'invitation illimitée" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:86 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:83 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Container:" | ||||
| msgstr "Conteneur" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:63 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:152 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:153 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Show used" | ||||
| msgstr "" | ||||
| @@ -867,9 +844,9 @@ msgstr "Packages :" | ||||
| msgid "Rounds" | ||||
| msgstr "Cartouches :" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:158 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:159 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View as table" | ||||
| msgstr "" | ||||
| @@ -879,7 +856,7 @@ msgstr "" | ||||
| msgid "Total ever packs" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total ever packs:" | ||||
| msgstr "" | ||||
| @@ -889,7 +866,7 @@ msgstr "" | ||||
| msgid "Total ever rounds" | ||||
| msgstr "Quantité de cartouches" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:84 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total ever rounds:" | ||||
| msgstr "Nombre totale de cartouches tirées :" | ||||
| @@ -899,7 +876,7 @@ msgstr "Nombre totale de cartouches tirées :" | ||||
| msgid "Used packs" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Used packs:" | ||||
| msgstr "" | ||||
| @@ -909,17 +886,17 @@ msgstr "" | ||||
| msgid "Used rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Used rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:33 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:34 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Used up!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:66 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Rounds shot chart" | ||||
| msgstr "Cartouches tirées" | ||||
| @@ -1020,7 +997,7 @@ msgid "UPC:" | ||||
| msgstr "UPC" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:120 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Average CPR" | ||||
| msgstr "" | ||||
| @@ -1031,7 +1008,7 @@ msgstr "" | ||||
| msgid "Edit %{ammo_type_name}" | ||||
| msgstr "Éditer %{name}" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:40 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:231 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Empty" | ||||
| @@ -1042,7 +1019,7 @@ msgstr "" | ||||
| msgid "CPR" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:77 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "CPR:" | ||||
| msgstr "" | ||||
| @@ -1052,7 +1029,7 @@ msgstr "" | ||||
| msgid "Original Count" | ||||
| msgstr "Nombre original :" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:44 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:47 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Original Count:" | ||||
| msgstr "Nombre original :" | ||||
| @@ -1062,12 +1039,12 @@ msgstr "Nombre original :" | ||||
| msgid "Home" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:33 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total rounds:" | ||||
| msgstr "Nombre totale de cartouches tirées :" | ||||
| @@ -1077,7 +1054,7 @@ msgstr "Nombre totale de cartouches tirées :" | ||||
| msgid "Last used on" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:63 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Last used on:" | ||||
| msgstr "" | ||||
| @@ -1088,7 +1065,7 @@ msgid "Never used" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Purchased on" | ||||
| msgstr "" | ||||
| @@ -1115,7 +1092,7 @@ msgstr "Aucun type de munition" | ||||
| msgid "Search catalog" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:58 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Search ammo" | ||||
| msgstr "" | ||||
| @@ -1130,18 +1107,20 @@ msgstr "" | ||||
| msgid "Search tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:83 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Search shot records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:136 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Spanish" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/error/error.html.heex:8 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:13 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:14 | ||||
| #: lib/cannery_web/views/layout_view.ex:15 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Cannery" | ||||
| msgstr "Logo de Cannery" | ||||
| @@ -1161,12 +1140,63 @@ msgstr "Utilisateur·ice enregistré·e le" | ||||
| msgid "User was confirmed at%{confirmed_datetime}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:31 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: %{uses_left}" | ||||
| msgstr "Utilisations restantes :" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:36 | ||||
| #: lib/cannery_web/components/invite_card.ex:37 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: Unlimited" | ||||
| msgstr "Utilisations restantes :" | ||||
|  | ||||
| # # This file is a PO Template file. | ||||
| # # | ||||
| # # "msgid"s here are often extracted from source code. | ||||
| # # Add new translations manually only if they're dynamic | ||||
| # # translations that can't be statically extracted. | ||||
| # # | ||||
| # # Run "mix gettext.extract" to bring this file up to | ||||
| # # date. Leave "msgstr"s empty as changing them here has no | ||||
| # # effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/home_live.html.heex:26 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Cannery lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
| "%{name} vous permet de facilement garder un œil sur votre niveau de munition " | ||||
| "avant et après une journée de stand" | ||||
|  | ||||
| #: lib/cannery_web/views/layout_view.ex:11 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery | %{title}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:78 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Registration:" | ||||
| msgstr "S’enregistrer" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:88 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Version:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:10 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Welcome to Cannery" | ||||
| msgstr "Bienvenue à %{name}" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:32 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: %{uses_left_count}" | ||||
| msgstr "Utilisations restantes :" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses: %{uses_count}" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -69,11 +69,11 @@ msgstr "Mél ou mot de passe invalide" | ||||
| msgid "Not found" | ||||
| msgstr "Pas trouvé" | ||||
|  | ||||
| #: 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_settings/edit.html.heex:21 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:64 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:119 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:13 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:14 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:23 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:67 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:123 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Oops, something went wrong! Please check the errors below." | ||||
| msgstr "" | ||||
| @@ -85,14 +85,15 @@ msgstr "" | ||||
| msgid "Reset password link is invalid or it has expired." | ||||
| msgstr "Le lien de réinitialisation de mot de passe est invalide ou expiré." | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:24 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:55 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:22 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:51 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, public registration is disabled" | ||||
| msgstr "Désolé, l’enregistrement public est désactivé" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:14 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:45 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:12 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:41 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:70 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, this invite was not found or expired" | ||||
| msgstr "Désolé, cette invitation n’est pas trouvée ou est expirée" | ||||
| @@ -112,7 +113,7 @@ msgstr "Non autorisé·e" | ||||
| msgid "User confirmation link is invalid or it has expired." | ||||
| msgstr "Le lien de confirmation d’utilisateur·ice est invalide ou a expiré." | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:18 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:19 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You are not authorized to view this page" | ||||
| msgstr "Vous n’êtes pas autorisé·e à voir cette page" | ||||
| @@ -122,22 +123,22 @@ msgstr "Vous n’êtes pas autorisé·e à voir cette page" | ||||
| msgid "You are not authorized to view this page." | ||||
| msgstr "Vous n’êtes pas autorisé·e à voir cette page." | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:137 | ||||
| #: lib/cannery/accounts/user.ex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "did not change" | ||||
| msgstr "est inchangé" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:158 | ||||
| #: lib/cannery/accounts/user.ex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "does not match password" | ||||
| msgstr "le mot de passe ne correspond pas" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:195 | ||||
| #: lib/cannery/accounts/user.ex:202 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "is not valid" | ||||
| msgstr "n’est pas valide" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:92 | ||||
| #: lib/cannery/accounts/user.ex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "must have the @ sign and no spaces" | ||||
| msgstr "doit contenir le symbole @ et aucune espace" | ||||
| @@ -196,7 +197,7 @@ msgstr "Multiplicateur invalide" | ||||
| msgid "Please select an ammo type and container" | ||||
| msgstr "Veuillez choisir un type de munitions et un conteneur" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:69 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your browser does not support the canvas element." | ||||
| msgstr "" | ||||
|   | ||||
| @@ -26,45 +26,28 @@ msgstr "" | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:86 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:89 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:80 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:126 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} created successfully" | ||||
| msgstr "%{name} créé· avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:73 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.ex:55 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:53 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:133 | ||||
| #: lib/cannery_web/live/tag_live/index.ex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} deleted succesfully" | ||||
| msgstr "%{name} supprimé· avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:109 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} disabled succesfully" | ||||
| msgstr "%{name} supprimé·e avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} enabled succesfully" | ||||
| msgstr "%{name} activé·e avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.ex:85 | ||||
| #: lib/cannery_web/live/container_live/show.ex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} has been deleted" | ||||
| msgstr "%{name} a été supprimé·e" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated succesfully" | ||||
| msgstr "%{name} mis à jour avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:67 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:70 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:62 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:108 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:61 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated successfully" | ||||
| msgstr "%{name} mis à jour avec succès" | ||||
| @@ -76,33 +59,28 @@ msgstr "" | ||||
| "Un lien pour confirmer votre changement de mél a été envoyé à la nouvelle " | ||||
| "adresse." | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:103 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:133 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:98 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{email}? This action is permanent!" | ||||
| msgstr "" | ||||
| "Êtes-vous certain·e de supprimer %{email} ? Cette action est définitive !" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:136 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:59 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:135 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:55 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{name}?" | ||||
| msgstr "Êtes-vous certain·e de supprimer %{name} ?" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:49 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete the invite for %{name}?" | ||||
| msgstr "Êtes-vous certain·e de supprimer l’invitation pour %{name} ?" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:153 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this ammo?" | ||||
| msgstr "Êtes-vous certain·e de supprimer cette munition ?" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:160 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:163 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete your account?" | ||||
| msgstr "Êtes-vous certain·e de supprimer votre compte ?" | ||||
| @@ -112,11 +90,6 @@ msgstr "Êtes-vous certain·e de supprimer votre compte ?" | ||||
| msgid "Are you sure you want to log out?" | ||||
| msgstr "Êtes-vous certain·e de vouloir vous déconnecter ?" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to make %{name} unlimited?" | ||||
| msgstr "Êtes-vous certain·e de vouloir rendre %{name} illimité ?" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:77 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Email changed successfully." | ||||
| @@ -151,23 +124,18 @@ msgstr "Mot de passe réinitialiser avec succès." | ||||
| msgid "Password updated successfully." | ||||
| msgstr "Mot de passe mis à jour avec succès." | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:73 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:65 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Please check your email to verify your account" | ||||
| msgstr "Veuillez vérifier votre mél pour confirmer votre compte" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:91 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "S’enregistrer pour mettre en place %{name}" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:55 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:52 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:33 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:93 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:158 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:53 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:43 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Saving..." | ||||
| msgstr "Sauvegarde en cours…" | ||||
| @@ -194,7 +162,7 @@ msgstr "%{name} a été ajouté avec succès" | ||||
| msgid "%{tag_name} has been removed from %{container_name}" | ||||
| msgstr "%{tag_name} a été retiré de %{container_name}" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:55 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Adding..." | ||||
| msgstr "Ajout en cours…" | ||||
| @@ -204,13 +172,13 @@ msgstr "Ajout en cours…" | ||||
| msgid "Shots recorded successfully" | ||||
| msgstr "Tirs enregistré avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:28 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:27 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to unstage this ammo?" | ||||
| msgstr "Êtes-vous certain·e de vouloir désélectionner cette munition ?" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:142 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:118 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:116 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this shot record?" | ||||
| msgstr "Êtes-vous certain·e de vouloir supprimer cet enregistrement de tir ?" | ||||
| @@ -236,7 +204,7 @@ msgstr "%{email} confirmé avec succès." | ||||
| msgid "Ammo moved to %{name} successfully" | ||||
| msgstr "Munition déplacée à %{name} avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copied to clipboard" | ||||
| msgstr "Copié dans le presse-papier" | ||||
| @@ -246,18 +214,18 @@ msgstr "Copié dans le presse-papier" | ||||
| msgid "%{name} removed successfully" | ||||
| msgstr "%{name} retiré avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:17 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:18 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You'll need to" | ||||
| msgstr "Vous aurez besoin de" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Creating..." | ||||
| msgstr "Création en cours…" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:141 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to change your language?" | ||||
| msgstr "Êtes-vous certain·e de vouloir changer votre langue ?" | ||||
| @@ -291,7 +259,47 @@ msgstr[0] "Groupe de munition mis à jour avec succès" | ||||
| msgstr[1] "Groupe de munition mis à jour avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:90 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:29 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" | ||||
| msgstr "Êtes-vous certain·e de supprimer %{name} ?" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:65 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Register to setup Cannery" | ||||
| msgstr "S’enregistrer pour mettre en place %{name}" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:54 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} deleted succesfully" | ||||
| msgstr "%{name} supprimé· avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:115 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} disabled succesfully" | ||||
| msgstr "%{name} supprimé·e avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:91 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} enabled succesfully" | ||||
| msgstr "%{name} activé·e avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:69 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} updated succesfully" | ||||
| msgstr "%{name} mis à jour avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:140 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{user_email} deleted succesfully" | ||||
| msgstr "%{name} supprimé· avec succès" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:48 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to delete the invite for %{invite_name}?" | ||||
| msgstr "Êtes-vous certain·e de supprimer l’invitation pour %{name} ?" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:73 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to make %{invite_name} unlimited?" | ||||
| msgstr "Êtes-vous certain·e de vouloir rendre %{name} illimité ?" | ||||
|   | ||||
| @@ -23,12 +23,12 @@ msgstr "" | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:62 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:36 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add your first box!" | ||||
| msgstr "" | ||||
| @@ -44,13 +44,13 @@ msgid "Add your first type!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:15 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change email" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:58 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:99 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:59 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:101 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change password" | ||||
| msgstr "" | ||||
| @@ -60,14 +60,14 @@ msgstr "" | ||||
| msgid "Create Invite" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:162 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Delete User" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:52 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:47 | ||||
| #: 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:44 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Forgot your password?" | ||||
| msgstr "" | ||||
| @@ -77,13 +77,13 @@ msgstr "" | ||||
| msgid "Invite someone new!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:137 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:49 | ||||
| #: 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/components/topbar.ex:135 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:47 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Log in" | ||||
| msgstr "" | ||||
| @@ -108,51 +108,51 @@ msgstr "" | ||||
| msgid "New Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:128 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:26 | ||||
| #: lib/cannery_web/components/topbar.ex:127 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:26 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Resend confirmation instructions" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:34 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reset password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:53 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:81 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:156 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:91 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:54 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Save" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:15 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Send instructions to reset password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:80 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Why not add one?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:53 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:50 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Add" | ||||
| msgstr "" | ||||
| @@ -167,9 +167,9 @@ msgstr "" | ||||
| msgid "Why not get some ready to shoot?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:100 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:101 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:101 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Record shots" | ||||
| msgstr "" | ||||
| @@ -189,27 +189,27 @@ msgstr "" | ||||
| msgid "Select" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copy to clipboard" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add a container first" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:74 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Create" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:113 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change Language" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:139 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:142 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Change language" | ||||
| msgstr "" | ||||
| @@ -219,44 +219,34 @@ msgstr "" | ||||
| msgid "View in Catalog" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "add an ammo type first" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:80 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:78 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Set Unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:86 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:32 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage for range" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:31 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage from range" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:153 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:156 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Export Data as JSON" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -12,31 +12,17 @@ msgstr "" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "X-Generator: Translate Toolkit 3.7.3\n" | ||||
|  | ||||
| ## This file is a PO Template file. | ||||
| ## | ||||
| ## "msgid"s here are often extracted from source code. | ||||
| ## Add new translations manually only if they're dynamic | ||||
| ## translations that can't be statically extracted. | ||||
| ## | ||||
| ## Run "mix gettext.extract" to bring this file up to | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/home_live.ex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.html.heex:46 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:91 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:83 | ||||
| #: lib/cannery_web/live/home_live.html.heex:60 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Admins:" | ||||
| msgstr "" | ||||
| @@ -51,60 +37,60 @@ msgid "Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:89 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Background color" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:141 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Blank" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:69 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Brass" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:45 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet core" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bullet type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:49 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:59 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Caliber" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:48 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cartridge" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:50 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:66 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Case material" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:65 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:57 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container" | ||||
| msgstr "" | ||||
| @@ -118,42 +104,42 @@ msgid "Containers" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:66 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:145 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Corrosive" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:76 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:38 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:8 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Count:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:25 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:8 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:7 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Description:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| #: lib/cannery_web/live/home_live.html.heex:23 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Easy to Use:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:33 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:34 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Edit Invite" | ||||
| msgstr "" | ||||
| @@ -163,95 +149,95 @@ msgstr "" | ||||
| msgid "Edit Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Example bullet type abbreviations" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:40 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:41 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "FMJ" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:59 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Grains" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Incendiary" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:78 | ||||
| #: lib/cannery_web/live/home_live.html.heex:55 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Instance Information" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:41 | ||||
| #: lib/cannery_web/components/invite_card.ex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:111 | ||||
| #: lib/cannery_web/live/home_live.html.heex:82 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invite Only" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:90 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:41 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:42 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Invites" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:28 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Keep me logged in for 60 days" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:48 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:69 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:51 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:20 | ||||
| #: lib/cannery_web/components/container_card.ex:49 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:17 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Location:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:38 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Magazine, Clip, Ammo Box, etc" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:67 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:149 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Manufacturer" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Metal ammo can with the anime girl sticker" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:23 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "My cool ammo can" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:45 | ||||
| #: lib/cannery_web/components/container_table_component.ex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:20 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:21 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Name" | ||||
| msgstr "" | ||||
| @@ -268,7 +254,7 @@ msgstr "" | ||||
| msgid "New Container" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:37 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:38 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New Invite" | ||||
| msgstr "" | ||||
| @@ -278,13 +264,13 @@ msgstr "" | ||||
| msgid "New Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:8 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:70 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:71 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:166 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:167 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No ammo for this type" | ||||
| msgstr "" | ||||
| @@ -300,68 +286,68 @@ msgstr "" | ||||
| msgid "No invites" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:31 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:29 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:10 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:37 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:38 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:81 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:43 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:93 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:29 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:30 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:51 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:52 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Notes:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:46 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:47 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "On the bookshelf" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Pressure" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:78 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:35 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:70 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Price paid:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:61 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:119 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Primer type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:110 | ||||
| #: lib/cannery_web/live/home_live.html.heex:81 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Public Signups" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:56 | ||||
| #: lib/cannery_web/live/home_live.html.heex:33 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Secure:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:59 | ||||
| #: lib/cannery_web/live/home_live.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
| @@ -372,12 +358,12 @@ msgstr "" | ||||
| msgid "Settings" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:66 | ||||
| #: lib/cannery_web/live/home_live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Simple:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:48 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Steel" | ||||
| msgstr "" | ||||
| @@ -401,56 +387,51 @@ msgstr "" | ||||
| msgid "Tags can be added to your containers to help you organize" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:85 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Text color" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:35 | ||||
| #: lib/cannery_web/live/home_live.html.heex:14 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Tracer" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_table_component.ex:49 | ||||
| #: lib/cannery_web/components/move_ammo_group_component.ex:68 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:35 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:36 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:45 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:14 | ||||
| #: lib/cannery_web/components/container_card.ex:44 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:12 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Type:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Users" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:24 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:25 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses left" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:31 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:60 | ||||
| #: lib/cannery_web/live/home_live.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:72 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:68 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No tags for this container" | ||||
| msgstr "" | ||||
| @@ -466,15 +447,15 @@ msgstr "" | ||||
| msgid "Range day" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:45 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:46 | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:44 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:94 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:36 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:37 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Date" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:21 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:22 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shots fired" | ||||
| msgstr "" | ||||
| @@ -501,21 +482,21 @@ msgstr "" | ||||
| msgid "New Shot Records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:50 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:48 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No shots recorded" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:21 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:25 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:22 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds left" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/shot_group_table_component.ex:42 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:92 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds shot" | ||||
| msgstr "" | ||||
| @@ -527,7 +508,7 @@ msgid "Shot Records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:38 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:117 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:118 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Move ammo" | ||||
| msgstr "" | ||||
| @@ -537,91 +518,91 @@ msgstr "" | ||||
| msgid "No other containers" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:55 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:53 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Shot log" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:71 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:78 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:69 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:76 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:153 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:225 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:180 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:137 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "$%{amount}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Bimetal" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Jacket type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:52 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Muzzle velocity" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder grains per charge" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:53 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:90 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Powder type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:153 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "UPC" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:78 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:80 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Confirm new password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:87 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:89 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Current password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:71 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "New password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Stage" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:94 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Unstage" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:62 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Firing type" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:40 | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:43 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Reconnecting..." | ||||
| msgstr "" | ||||
| @@ -638,16 +619,16 @@ msgstr "" | ||||
| msgid "Edit %{name} tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:67 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:39 | ||||
| #: lib/cannery_web/components/container_card.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:68 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:35 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:222 | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:179 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:142 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:143 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No cost information" | ||||
| msgstr "" | ||||
| @@ -697,7 +678,7 @@ msgstr "" | ||||
| msgid "Log in" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:34 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:32 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register" | ||||
| msgstr "" | ||||
| @@ -713,55 +694,53 @@ msgstr "" | ||||
| msgid "Record Shots" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:66 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copies" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:123 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:124 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Added on:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:130 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:32 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "English" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:132 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:135 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "French" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:37 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:131 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:134 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "German" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Language" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:136 | ||||
| #: lib/cannery_web/live/home_live.html.heex:107 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Get involved!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:157 | ||||
| #: lib/cannery_web/live/home_live.html.heex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Help translate" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:168 | ||||
| #: lib/cannery_web/live/home_live.html.heex:139 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Report bugs or request features" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:146 | ||||
| #: lib/cannery_web/live/home_live.html.heex:117 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View the source code" | ||||
| msgstr "" | ||||
| @@ -784,7 +763,7 @@ msgstr "" | ||||
| msgid "Move Ammo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:119 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:113 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "No ammo in this container" | ||||
| msgstr "" | ||||
| @@ -799,38 +778,38 @@ msgstr "" | ||||
| msgid "This ammo is not in a container" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/container_card.ex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:95 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:30 | ||||
| #: lib/cannery_web/components/container_card.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:96 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:26 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/topbar.ex:25 | ||||
| #: lib/cannery_web/live/home_live.ex:25 | ||||
| #: lib/cannery_web/live/home_live.html.heex:4 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery logo" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:27 | ||||
| #: lib/cannery_web/live/home_live.html.heex:6 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "isn't he cute >:3" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:28 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:29 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Leave \"Uses left\" blank to make invite unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:86 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:83 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Container:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:63 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:152 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:153 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Show used" | ||||
| msgstr "" | ||||
| @@ -858,9 +837,9 @@ msgstr "" | ||||
| msgid "Rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:158 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:159 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:39 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:105 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "View as table" | ||||
| msgstr "" | ||||
| @@ -870,7 +849,7 @@ msgstr "" | ||||
| msgid "Total ever packs" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:112 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Total ever packs:" | ||||
| msgstr "" | ||||
| @@ -880,7 +859,7 @@ msgstr "" | ||||
| msgid "Total ever rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:84 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total ever rounds:" | ||||
| msgstr "" | ||||
| @@ -890,7 +869,7 @@ msgstr "" | ||||
| msgid "Used packs" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:104 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Used packs:" | ||||
| msgstr "" | ||||
| @@ -900,17 +879,17 @@ msgstr "" | ||||
| msgid "Used rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:76 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Used rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:33 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:34 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Used up!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:66 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Rounds shot chart" | ||||
| msgstr "" | ||||
| @@ -1011,7 +990,7 @@ msgid "UPC:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_type_table_component.ex:120 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:133 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Average CPR" | ||||
| msgstr "" | ||||
| @@ -1022,7 +1001,7 @@ msgstr "" | ||||
| msgid "Edit %{ammo_type_name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:39 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:40 | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:231 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Empty" | ||||
| @@ -1033,7 +1012,7 @@ msgstr "" | ||||
| msgid "CPR" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:77 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "CPR:" | ||||
| msgstr "" | ||||
| @@ -1043,7 +1022,7 @@ msgstr "" | ||||
| msgid "Original Count" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:44 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:47 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Original Count:" | ||||
| msgstr "" | ||||
| @@ -1053,12 +1032,12 @@ msgstr "" | ||||
| msgid "Home" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:24 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:33 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Total rounds:" | ||||
| msgstr "" | ||||
| @@ -1068,7 +1047,7 @@ msgstr "" | ||||
| msgid "Last used on" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:63 | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:62 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Last used on:" | ||||
| msgstr "" | ||||
| @@ -1079,7 +1058,7 @@ msgid "Never used" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/ammo_group_table_component.ex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:42 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Purchased on" | ||||
| msgstr "" | ||||
| @@ -1106,7 +1085,7 @@ msgstr "" | ||||
| msgid "Search catalog" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:58 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Search ammo" | ||||
| msgstr "" | ||||
| @@ -1121,18 +1100,20 @@ msgstr "" | ||||
| msgid "Search tags" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:85 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:83 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Search shot records" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:133 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:136 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Spanish" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/error/error.html.heex:8 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:13 | ||||
| #: lib/cannery_web/templates/layout/root.html.heex:14 | ||||
| #: lib/cannery_web/views/layout_view.ex:15 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Cannery" | ||||
| msgstr "" | ||||
| @@ -1152,12 +1133,61 @@ msgstr "" | ||||
| msgid "User was confirmed at%{confirmed_datetime}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:31 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: %{uses_left}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:36 | ||||
| #: lib/cannery_web/components/invite_card.ex:37 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: Unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| ## This file is a PO Template file. | ||||
| ## | ||||
| ## "msgid"s here are often extracted from source code. | ||||
| ## Add new translations manually only if they're dynamic | ||||
| ## translations that can't be statically extracted. | ||||
| ## | ||||
| ## Run "mix gettext.extract" to bring this file up to | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #: lib/cannery_web/live/home_live.html.heex:26 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Cannery lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/views/layout_view.ex:11 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Cannery | %{title}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:78 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Registration:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:88 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Version:" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:10 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Welcome to Cannery" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Enable" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:32 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Uses Left: %{uses_left_count}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/invite_card.ex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Uses: %{uses_count}" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -70,11 +70,11 @@ msgstr "Seoladh email nó pasfhocal neamhbhailí" | ||||
| msgid "Not found" | ||||
| msgstr "Ní feidir é a fáil" | ||||
|  | ||||
| #: 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_settings/edit.html.heex:21 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:64 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:119 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:13 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:14 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:23 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:67 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:123 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Oops, something went wrong! Please check the errors below." | ||||
| msgstr "" | ||||
| @@ -86,14 +86,15 @@ msgstr "" | ||||
| msgid "Reset password link is invalid or it has expired." | ||||
| msgstr "Tá nasc an pasfhocail a athrú neamhbailí nó as dáta." | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:24 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:55 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:22 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:51 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, public registration is disabled" | ||||
| msgstr "Tá brón orainn, tá clarú póiblí bactha" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:14 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:45 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:12 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:41 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:70 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Sorry, this invite was not found or expired" | ||||
| msgstr "Tá brón orainn, ní feidir an cuireadh seo a fáil nó tá sé as dáta" | ||||
| @@ -113,7 +114,7 @@ msgstr "Níl cead agaibh" | ||||
| msgid "User confirmation link is invalid or it has expired." | ||||
| msgstr "Tá nasc an úsáideoir a deimhnigh neamhbailí nó as dáta." | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:18 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:19 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You are not authorized to view this page" | ||||
| msgstr "Níl cead agaibh féachaint ar an leathanach seo" | ||||
| @@ -123,22 +124,22 @@ msgstr "Níl cead agaibh féachaint ar an leathanach seo" | ||||
| msgid "You are not authorized to view this page." | ||||
| msgstr "Níl cead agaibh féachaint ar an leathanach seo." | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:137 | ||||
| #: lib/cannery/accounts/user.ex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "did not change" | ||||
| msgstr "Níor athraigh sé" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:158 | ||||
| #: lib/cannery/accounts/user.ex:165 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "does not match password" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:195 | ||||
| #: lib/cannery/accounts/user.ex:202 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "is not valid" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery/accounts/user.ex:92 | ||||
| #: lib/cannery/accounts/user.ex:99 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "must have the @ sign and no spaces" | ||||
| msgstr "" | ||||
| @@ -195,7 +196,7 @@ msgstr "" | ||||
| msgid "Please select an ammo type and container" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:69 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Your browser does not support the canvas element." | ||||
| msgstr "" | ||||
|   | ||||
| @@ -24,45 +24,28 @@ msgstr "" | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:86 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:89 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:80 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:126 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} created successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:73 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.ex:55 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:53 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:133 | ||||
| #: lib/cannery_web/live/tag_live/index.ex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} deleted succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:109 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} disabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} enabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.ex:85 | ||||
| #: lib/cannery_web/live/container_live/show.ex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} has been deleted" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:67 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:70 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:62 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:108 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:61 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated successfully" | ||||
| msgstr "" | ||||
| @@ -72,32 +55,27 @@ msgstr "" | ||||
| msgid "A link to confirm your email change has been sent to the new address." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:103 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:133 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:98 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{email}? This action is permanent!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:136 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:59 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:135 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:55 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{name}?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:49 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete the invite for %{name}?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:153 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this ammo?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:160 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:163 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete your account?" | ||||
| msgstr "" | ||||
| @@ -107,11 +85,6 @@ msgstr "" | ||||
| msgid "Are you sure you want to log out?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to make %{name} unlimited?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:77 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Email changed successfully." | ||||
| @@ -142,23 +115,18 @@ msgstr "" | ||||
| msgid "Password updated successfully." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:73 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:65 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Please check your email to verify your account" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:91 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:55 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:52 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:33 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:93 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:158 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:53 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:43 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Saving..." | ||||
| msgstr "" | ||||
| @@ -183,7 +151,7 @@ msgstr "" | ||||
| msgid "%{tag_name} has been removed from %{container_name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:55 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Adding..." | ||||
| msgstr "" | ||||
| @@ -193,13 +161,13 @@ msgstr "" | ||||
| msgid "Shots recorded successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:28 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:27 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to unstage this ammo?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:142 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:118 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:116 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this shot record?" | ||||
| msgstr "" | ||||
| @@ -225,7 +193,7 @@ msgstr "" | ||||
| msgid "Ammo moved to %{name} successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copied to clipboard" | ||||
| msgstr "" | ||||
| @@ -235,18 +203,18 @@ msgstr "" | ||||
| msgid "%{name} removed successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:17 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:18 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You'll need to" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Creating..." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:141 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to change your language?" | ||||
| msgstr "" | ||||
| @@ -280,7 +248,47 @@ msgstr[0] "" | ||||
| msgstr[1] "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:90 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:29 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:65 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Register to setup Cannery" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:54 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} deleted succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:115 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} disabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:91 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} enabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:69 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{invite_name} updated succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:140 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "%{user_email} deleted succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:48 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to delete the invite for %{invite_name}?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:73 | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| msgid "Are you sure you want to make %{invite_name} unlimited?" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -13,45 +13,28 @@ msgstr "" | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:86 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:89 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:80 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:126 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:79 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} created successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:73 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.ex:55 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:53 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:133 | ||||
| #: lib/cannery_web/live/tag_live/index.ex:64 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} deleted succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:109 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} disabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:87 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} enabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.ex:85 | ||||
| #: lib/cannery_web/live/container_live/show.ex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} has been deleted" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:67 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.ex:67 | ||||
| #: lib/cannery_web/live/container_live/form_component.ex:70 | ||||
| #: lib/cannery_web/live/invite_live/form_component.ex:62 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:108 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:61 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{name} updated successfully" | ||||
| msgstr "" | ||||
| @@ -61,32 +44,27 @@ msgstr "" | ||||
| msgid "A link to confirm your email change has been sent to the new address." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:103 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:133 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:98 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:126 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{email}? This action is permanent!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:92 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:136 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:59 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:135 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:55 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:63 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{name}?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:49 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete the invite for %{name}?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:153 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this ammo?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:160 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:163 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete your account?" | ||||
| msgstr "" | ||||
| @@ -96,11 +74,6 @@ msgstr "" | ||||
| msgid "Are you sure you want to log out?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:75 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to make %{name} unlimited?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:77 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Email changed successfully." | ||||
| @@ -131,23 +104,18 @@ msgstr "" | ||||
| msgid "Password updated successfully." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:73 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:65 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Please check your email to verify your account" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.ex:91 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:55 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:82 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:52 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:33 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/tag_live/form_component.ex:93 | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:56 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:158 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:53 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:34 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:43 | ||||
| #: lib/cannery_web/live/tag_live/form_component.html.heex:39 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Saving..." | ||||
| msgstr "" | ||||
| @@ -172,7 +140,7 @@ msgstr "" | ||||
| msgid "%{tag_name} has been removed from %{container_name}" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:55 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:52 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Adding..." | ||||
| msgstr "" | ||||
| @@ -182,13 +150,13 @@ msgstr "" | ||||
| msgid "Shots recorded successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:28 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:27 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to unstage this ammo?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/show.ex:142 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:118 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:116 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete this shot record?" | ||||
| msgstr "" | ||||
| @@ -214,7 +182,7 @@ msgstr "" | ||||
| msgid "Ammo moved to %{name} successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:121 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:128 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Copied to clipboard" | ||||
| msgstr "" | ||||
| @@ -224,18 +192,18 @@ msgstr "" | ||||
| msgid "%{name} removed successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:17 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:27 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:18 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:28 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "You'll need to" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:75 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:76 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Creating..." | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:141 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:144 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to change your language?" | ||||
| msgstr "" | ||||
| @@ -269,7 +237,47 @@ msgstr[0] "" | ||||
| msgstr[1] "" | ||||
|  | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:90 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:28 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:29 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete %{name}? This will delete all %{name} type ammo as well!" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/home_live.html.heex:65 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Register to setup Cannery" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:54 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{invite_name} deleted succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:115 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{invite_name} disabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:91 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{invite_name} enabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:69 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{invite_name} updated succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.ex:140 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "%{user_email} deleted succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:48 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to delete the invite for %{invite_name}?" | ||||
| msgstr "" | ||||
|  | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:73 | ||||
| #, elixir-autogen, elixir-format | ||||
| msgid "Are you sure you want to make %{invite_name} unlimited?" | ||||
| msgstr "" | ||||
|   | ||||
							
								
								
									
										11
									
								
								priv/repo/migrations/20230204191547_record_invites.exs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								priv/repo/migrations/20230204191547_record_invites.exs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| defmodule Cannery.Repo.Migrations.RecordInvites do | ||||
|   use Ecto.Migration | ||||
|  | ||||
|   def change do | ||||
|     alter table(:users) do | ||||
|       add :invite_id, references(:invites, type: :binary_id) | ||||
|     end | ||||
|  | ||||
|     rename table(:invites), :user_id, to: :created_by_id | ||||
|   end | ||||
| end | ||||
							
								
								
									
										176
									
								
								test/cannery/accounts/invites_test.exs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								test/cannery/accounts/invites_test.exs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| defmodule Cannery.InvitesTest do | ||||
|   @moduledoc """ | ||||
|   This module tests the Cannery.Accounts.Invites context | ||||
|   """ | ||||
|  | ||||
|   use Cannery.DataCase | ||||
|   alias Cannery.Accounts | ||||
|   alias Cannery.Accounts.{Invite, Invites} | ||||
|   alias Ecto.Changeset | ||||
|  | ||||
|   @moduletag :invites_test | ||||
|  | ||||
|   @valid_attrs %{ | ||||
|     "name" => "some name" | ||||
|   } | ||||
|   @invalid_attrs %{ | ||||
|     "name" => nil, | ||||
|     "token" => nil | ||||
|   } | ||||
|  | ||||
|   describe "invites" do | ||||
|     setup do | ||||
|       current_user = admin_fixture() | ||||
|       {:ok, invite} = Invites.create_invite(current_user, @valid_attrs) | ||||
|       [invite: invite, current_user: current_user] | ||||
|     end | ||||
|  | ||||
|     test "list_invites/0 returns all invites", %{invite: invite, current_user: current_user} do | ||||
|       assert Invites.list_invites(current_user) == [invite] | ||||
|     end | ||||
|  | ||||
|     test "get_invite!/1 returns the invite with given id", | ||||
|          %{invite: invite, current_user: current_user} do | ||||
|       assert Invites.get_invite!(invite.id, current_user) == invite | ||||
|     end | ||||
|  | ||||
|     test "valid_invite_token? returns for valid and invalid invite tokens", | ||||
|          %{invite: %{token: token}} do | ||||
|       refute Invites.valid_invite_token?(nil) | ||||
|       refute Invites.valid_invite_token?("") | ||||
|       assert Invites.valid_invite_token?(token) | ||||
|     end | ||||
|  | ||||
|     test "valid_invite_token? does not return true for a disabled invite by token", | ||||
|          %{invite: %{token: token} = invite, current_user: current_user} do | ||||
|       assert Invites.valid_invite_token?(token) | ||||
|  | ||||
|       {:ok, _invite} = Invites.update_invite(invite, %{uses_left: 1}, current_user) | ||||
|       {:ok, _invite} = Invites.use_invite(token) | ||||
|  | ||||
|       refute Invites.valid_invite_token?(token) | ||||
|     end | ||||
|  | ||||
|     test "get_use_count/2 returns the correct invite usage", | ||||
|          %{invite: %{token: token} = invite, current_user: current_user} do | ||||
|       assert 0 == Invites.get_use_count(invite, current_user) | ||||
|  | ||||
|       assert {:ok, _user} = | ||||
|                Accounts.register_user( | ||||
|                  %{"email" => unique_user_email(), "password" => valid_user_password()}, | ||||
|                  token | ||||
|                ) | ||||
|  | ||||
|       assert 1 == Invites.get_use_count(invite, current_user) | ||||
|  | ||||
|       assert {:ok, _user} = | ||||
|                Accounts.register_user( | ||||
|                  %{"email" => unique_user_email(), "password" => valid_user_password()}, | ||||
|                  token | ||||
|                ) | ||||
|  | ||||
|       assert 2 == Invites.get_use_count(invite, current_user) | ||||
|     end | ||||
|  | ||||
|     test "use_invite/1 successfully uses an unlimited invite", | ||||
|          %{invite: %{token: token} = invite, current_user: current_user} do | ||||
|       {:ok, invite} = Invites.update_invite(invite, %{uses_left: nil}, current_user) | ||||
|       assert {:ok, ^invite} = Invites.use_invite(token) | ||||
|       assert {:ok, ^invite} = Invites.use_invite(token) | ||||
|       assert {:ok, ^invite} = Invites.use_invite(token) | ||||
|     end | ||||
|  | ||||
|     test "use_invite/1 successfully decrements an invite", | ||||
|          %{invite: %{token: token} = invite, current_user: current_user} do | ||||
|       {:ok, _invite} = Invites.update_invite(invite, %{uses_left: 10}, current_user) | ||||
|       assert {:ok, %{uses_left: 9}} = Invites.use_invite(token) | ||||
|       assert {:ok, %{uses_left: 8}} = Invites.use_invite(token) | ||||
|       assert {:ok, %{uses_left: 7}} = Invites.use_invite(token) | ||||
|     end | ||||
|  | ||||
|     test "use_invite/1 successfully disactivates an invite", | ||||
|          %{invite: %{token: token} = invite, current_user: current_user} do | ||||
|       {:ok, _invite} = Invites.update_invite(invite, %{uses_left: 1}, current_user) | ||||
|       assert {:ok, %{uses_left: 0, disabled_at: disabled_at}} = Invites.use_invite(token) | ||||
|       assert not is_nil(disabled_at) | ||||
|     end | ||||
|  | ||||
|     test "use_invite/1 does not work on disactivated invite", | ||||
|          %{invite: %{token: token} = invite, current_user: current_user} do | ||||
|       {:ok, _invite} = Invites.update_invite(invite, %{uses_left: 1}, current_user) | ||||
|       {:ok, _invite} = Invites.use_invite(token) | ||||
|       assert {:error, :invalid_token} = Invites.use_invite(token) | ||||
|     end | ||||
|  | ||||
|     test "create_invite/1 with valid data creates an unlimited invite", | ||||
|          %{current_user: current_user} do | ||||
|       assert {:ok, %Invite{} = invite} = | ||||
|                Invites.create_invite(current_user, %{ | ||||
|                  "name" => "some name" | ||||
|                }) | ||||
|  | ||||
|       assert invite.name == "some name" | ||||
|     end | ||||
|  | ||||
|     test "create_invite/1 with valid data creates a limited invite", | ||||
|          %{current_user: current_user} do | ||||
|       assert {:ok, %Invite{} = invite} = | ||||
|                Invites.create_invite(current_user, %{ | ||||
|                  "name" => "some name", | ||||
|                  "uses_left" => 10 | ||||
|                }) | ||||
|  | ||||
|       assert invite.name == "some name" | ||||
|       assert invite.uses_left == 10 | ||||
|     end | ||||
|  | ||||
|     test "create_invite/1 with invalid data returns error changeset", | ||||
|          %{current_user: current_user} do | ||||
|       assert {:error, %Changeset{}} = Invites.create_invite(current_user, @invalid_attrs) | ||||
|     end | ||||
|  | ||||
|     test "update_invite/2 can set an invite to be limited", | ||||
|          %{invite: invite, current_user: current_user} do | ||||
|       assert {:ok, %Invite{} = new_invite} = | ||||
|                Invites.update_invite( | ||||
|                  invite, | ||||
|                  %{"name" => "some updated name", "uses_left" => 5}, | ||||
|                  current_user | ||||
|                ) | ||||
|  | ||||
|       assert new_invite.name == "some updated name" | ||||
|       assert new_invite.uses_left == 5 | ||||
|     end | ||||
|  | ||||
|     test "update_invite/2 can set an invite to be unlimited", | ||||
|          %{invite: invite, current_user: current_user} do | ||||
|       {:ok, invite} = Invites.update_invite(invite, %{"uses_left" => 5}, current_user) | ||||
|  | ||||
|       assert {:ok, %Invite{} = new_invite} = | ||||
|                Invites.update_invite( | ||||
|                  invite, | ||||
|                  %{"name" => "some updated name", "uses_left" => nil}, | ||||
|                  current_user | ||||
|                ) | ||||
|  | ||||
|       assert new_invite.name == "some updated name" | ||||
|       assert new_invite.uses_left |> is_nil() | ||||
|     end | ||||
|  | ||||
|     test "update_invite/2 with invalid data returns error changeset", | ||||
|          %{invite: invite, current_user: current_user} do | ||||
|       assert {:error, %Changeset{}} = Invites.update_invite(invite, @invalid_attrs, current_user) | ||||
|       assert invite == Invites.get_invite!(invite.id, current_user) | ||||
|     end | ||||
|  | ||||
|     test "delete_invite/1 deletes the invite", %{invite: invite, current_user: current_user} do | ||||
|       assert {:ok, %Invite{}} = Invites.delete_invite(invite, current_user) | ||||
|       assert_raise Ecto.NoResultsError, fn -> Invites.get_invite!(invite.id, current_user) end | ||||
|     end | ||||
|  | ||||
|     test "delete_invite!/1 deletes the invite", %{invite: invite, current_user: current_user} do | ||||
|       assert %Invite{} = Invites.delete_invite!(invite, current_user) | ||||
|       assert_raise Ecto.NoResultsError, fn -> Invites.get_invite!(invite.id, current_user) end | ||||
|     end | ||||
|   end | ||||
| end | ||||
| @@ -5,11 +5,13 @@ defmodule Cannery.AccountsTest do | ||||
|  | ||||
|   use Cannery.DataCase | ||||
|   alias Cannery.Accounts | ||||
|   alias Cannery.Accounts.{User, UserToken} | ||||
|   alias Cannery.Accounts.{Invites, User, UserToken} | ||||
|   alias Ecto.Changeset | ||||
|  | ||||
|   @moduletag :accounts_test | ||||
|  | ||||
|   doctest Accounts, import: true | ||||
|  | ||||
|   describe "get_user_by_email/1" do | ||||
|     test "does not return the user if the email does not exist" do | ||||
|       refute Accounts.get_user_by_email("unknown@example.com") | ||||
| @@ -100,6 +102,17 @@ defmodule Cannery.AccountsTest do | ||||
|       assert is_nil(user.confirmed_at) | ||||
|       assert is_nil(user.password) | ||||
|     end | ||||
|  | ||||
|     test "records used invite during registration" do | ||||
|       {:ok, %{id: invite_id, token: token}} = | ||||
|         admin_fixture() |> Invites.create_invite(%{"name" => "my invite"}) | ||||
|  | ||||
|       assert {:ok, %{invite_id: ^invite_id}} = | ||||
|                Accounts.register_user( | ||||
|                  %{"email" => unique_user_email(), "password" => valid_user_password()}, | ||||
|                  token | ||||
|                ) | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   describe "change_user_registration/2" do | ||||
| @@ -303,9 +316,9 @@ defmodule Cannery.AccountsTest do | ||||
|     end | ||||
|  | ||||
|     test "deletes all tokens for the given user", %{user: user} do | ||||
|       _token = Accounts.generate_user_session_token(user) | ||||
|       _session_token = Accounts.generate_user_session_token(user) | ||||
|  | ||||
|       {:ok, _user} = | ||||
|       {:ok, _} = | ||||
|         Accounts.update_user_password(user, valid_user_password(), %{ | ||||
|           "password" => "new valid password" | ||||
|         }) | ||||
| @@ -500,7 +513,7 @@ defmodule Cannery.AccountsTest do | ||||
|     end | ||||
|  | ||||
|     test "deletes all tokens for the given user", %{user: user} do | ||||
|       _token = Accounts.generate_user_session_token(user) | ||||
|       _session_token = Accounts.generate_user_session_token(user) | ||||
|       {:ok, _user} = Accounts.reset_user_password(user, %{"password" => "new valid password"}) | ||||
|       refute Repo.get_by(UserToken, user_id: user.id) | ||||
|     end | ||||
|   | ||||
| @@ -1,72 +0,0 @@ | ||||
| defmodule Cannery.InvitesTest do | ||||
|   @moduledoc """ | ||||
|   This module tests the Invites context | ||||
|   """ | ||||
|  | ||||
|   use Cannery.DataCase | ||||
|   alias Cannery.{Invites, Invites.Invite} | ||||
|   alias Ecto.Changeset | ||||
|  | ||||
|   @moduletag :invites_test | ||||
|  | ||||
|   @valid_attrs %{ | ||||
|     "name" => "some name", | ||||
|     "token" => "some token" | ||||
|   } | ||||
|   @update_attrs %{ | ||||
|     "name" => "some updated name", | ||||
|     "token" => "some updated token" | ||||
|   } | ||||
|   @invalid_attrs %{ | ||||
|     "name" => nil, | ||||
|     "token" => nil | ||||
|   } | ||||
|  | ||||
|   describe "invites" do | ||||
|     setup do | ||||
|       current_user = admin_fixture() | ||||
|       {:ok, invite} = Invites.create_invite(current_user, @valid_attrs) | ||||
|       [invite: invite, current_user: current_user] | ||||
|     end | ||||
|  | ||||
|     test "list_invites/0 returns all invites", %{invite: invite, current_user: current_user} do | ||||
|       assert Invites.list_invites(current_user) == [invite] | ||||
|     end | ||||
|  | ||||
|     test "get_invite!/1 returns the invite with given id", | ||||
|          %{invite: invite, current_user: current_user} do | ||||
|       assert Invites.get_invite!(invite.id, current_user) == invite | ||||
|     end | ||||
|  | ||||
|     test "create_invite/1 with valid data creates a invite", | ||||
|          %{current_user: current_user} do | ||||
|       assert {:ok, %Invite{} = invite} = Invites.create_invite(current_user, @valid_attrs) | ||||
|       assert invite.name == "some name" | ||||
|     end | ||||
|  | ||||
|     test "create_invite/1 with invalid data returns error changeset", | ||||
|          %{current_user: current_user} do | ||||
|       assert {:error, %Changeset{}} = Invites.create_invite(current_user, @invalid_attrs) | ||||
|     end | ||||
|  | ||||
|     test "update_invite/2 with valid data updates the invite", | ||||
|          %{invite: invite, current_user: current_user} do | ||||
|       assert {:ok, %Invite{} = new_invite} = | ||||
|                Invites.update_invite(invite, @update_attrs, current_user) | ||||
|  | ||||
|       assert new_invite.name == "some updated name" | ||||
|       assert new_invite.token == new_invite.token | ||||
|     end | ||||
|  | ||||
|     test "update_invite/2 with invalid data returns error changeset", | ||||
|          %{invite: invite, current_user: current_user} do | ||||
|       assert {:error, %Changeset{}} = Invites.update_invite(invite, @invalid_attrs, current_user) | ||||
|       assert invite == Invites.get_invite!(invite.id, current_user) | ||||
|     end | ||||
|  | ||||
|     test "delete_invite/1 deletes the invite", %{invite: invite, current_user: current_user} do | ||||
|       assert {:ok, %Invite{}} = Invites.delete_invite(invite, current_user) | ||||
|       assert_raise Ecto.NoResultsError, fn -> Invites.get_invite!(invite.id, current_user) end | ||||
|     end | ||||
|   end | ||||
| end | ||||
| @@ -8,14 +8,7 @@ defmodule CanneryWeb.ExportControllerTest do | ||||
|  | ||||
|   @moduletag :export_controller_test | ||||
|  | ||||
|   setup %{conn: conn} do | ||||
|     current_user = user_fixture() |> confirm_user() | ||||
|  | ||||
|     [ | ||||
|       current_user: current_user, | ||||
|       conn: conn |> log_in_user(current_user) | ||||
|     ] | ||||
|   end | ||||
|   setup [:register_and_log_in_user] | ||||
|  | ||||
|   defp add_data(%{current_user: current_user}) do | ||||
|     ammo_type = ammo_type_fixture(current_user) | ||||
| @@ -124,7 +117,9 @@ defmodule CanneryWeb.ExportControllerTest do | ||||
|         "email" => current_user.email, | ||||
|         "id" => current_user.id, | ||||
|         "locale" => current_user.locale, | ||||
|         "role" => to_string(current_user.role) | ||||
|         "role" => to_string(current_user.role), | ||||
|         "inserted_at" => current_user.inserted_at |> NaiveDateTime.to_iso8601(), | ||||
|         "updated_at" => current_user.updated_at |> NaiveDateTime.to_iso8601() | ||||
|       } | ||||
|  | ||||
|       json_resp = conn |> json_response(200) | ||||
|   | ||||
| @@ -6,7 +6,7 @@ defmodule CanneryWeb.InviteLiveTest do | ||||
|   use CanneryWeb.ConnCase | ||||
|   import Phoenix.LiveViewTest | ||||
|   import CanneryWeb.Gettext | ||||
|   alias Cannery.Invites | ||||
|   alias Cannery.Accounts.Invites | ||||
|  | ||||
|   @moduletag :invite_live_test | ||||
|   @create_attrs %{"name" => "some name"} | ||||
| @@ -40,13 +40,14 @@ defmodule CanneryWeb.InviteLiveTest do | ||||
|       #        |> form("#invite-form", invite: @invalid_attrs) | ||||
|       #        |> render_change() =~ dgettext("errors", "can't be blank") | ||||
|  | ||||
|       {:ok, _view, html} = | ||||
|       {:ok, _live, html} = | ||||
|         index_live | ||||
|         |> form("#invite-form", invite: @create_attrs) | ||||
|         |> render_submit() | ||||
|         |> follow_redirect(conn, Routes.invite_index_path(conn, :index)) | ||||
|  | ||||
|       assert html =~ dgettext("prompts", "%{name} created successfully", name: "some name") | ||||
|       assert html =~ | ||||
|                dgettext("prompts", "%{invite_name} created successfully", invite_name: "some name") | ||||
|  | ||||
|       assert html =~ "some name" | ||||
|     end | ||||
| @@ -63,14 +64,16 @@ defmodule CanneryWeb.InviteLiveTest do | ||||
|       #        |> form("#invite-form", invite: @invalid_attrs) | ||||
|       #        |> render_change() =~ dgettext("errors", "can't be blank") | ||||
|  | ||||
|       {:ok, _view, html} = | ||||
|       {:ok, _live, html} = | ||||
|         index_live | ||||
|         |> form("#invite-form", invite: @update_attrs) | ||||
|         |> render_submit() | ||||
|         |> follow_redirect(conn, Routes.invite_index_path(conn, :index)) | ||||
|  | ||||
|       assert html =~ | ||||
|                dgettext("prompts", "%{name} updated successfully", name: "some updated name") | ||||
|                dgettext("prompts", "%{invite_name} updated successfully", | ||||
|                  invite_name: "some updated name" | ||||
|                ) | ||||
|  | ||||
|       assert html =~ "some updated name" | ||||
|     end | ||||
|   | ||||
| @@ -43,7 +43,7 @@ defmodule Cannery.DataCase do | ||||
|   """ | ||||
|   def errors_on(changeset) do | ||||
|     Ecto.Changeset.traverse_errors(changeset, fn {message, opts} -> | ||||
|       Regex.replace(~r"%{(\w+)}", message, fn _content, key -> | ||||
|       Regex.replace(~r"%{(\w+)}", message, fn _capture, key -> | ||||
|         opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string() | ||||
|       end) | ||||
|     end) | ||||
|   | ||||
| @@ -21,8 +21,8 @@ defmodule Cannery.Fixtures do | ||||
|   def unique_user_email, do: "user#{System.unique_integer()}@example.com" | ||||
|   def valid_user_password, do: "hello world!" | ||||
|  | ||||
|   @spec user_fixture() :: Accounts.User.t() | ||||
|   @spec user_fixture(attrs :: map()) :: Accounts.User.t() | ||||
|   @spec user_fixture() :: User.t() | ||||
|   @spec user_fixture(attrs :: map()) :: User.t() | ||||
|   def user_fixture(attrs \\ %{}) do | ||||
|     attrs | ||||
|     |> Enum.into(%{ | ||||
| @@ -33,8 +33,8 @@ defmodule Cannery.Fixtures do | ||||
|     |> unwrap_ok_tuple() | ||||
|   end | ||||
|  | ||||
|   @spec admin_fixture() :: Accounts.User.t() | ||||
|   @spec admin_fixture(attrs :: map()) :: Accounts.User.t() | ||||
|   @spec admin_fixture() :: User.t() | ||||
|   @spec admin_fixture(attrs :: map()) :: User.t() | ||||
|   def admin_fixture(attrs \\ %{}) do | ||||
|     attrs | ||||
|     |> Enum.into(%{ | ||||
| @@ -43,7 +43,7 @@ defmodule Cannery.Fixtures do | ||||
|     }) | ||||
|     |> Accounts.register_user() | ||||
|     |> unwrap_ok_tuple() | ||||
|     |> User.role_changeset("admin") | ||||
|     |> User.role_changeset(:admin) | ||||
|     |> Repo.update!() | ||||
|   end | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user