Compare commits
	
		
			5 Commits
		
	
	
		
			5fd46c326f
			...
			41bcc2f456
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 41bcc2f456 | |||
| 947659b207 | |||
| 9ebca20dc6 | |||
| 3cbd62e84c | |||
| 67010640f0 | 
| @@ -1,6 +1,7 @@ | ||||
| # Cannery | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| The self-hosted firearm tracker website. | ||||
|  | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/static/images/cannery.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/static/images/cannery.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 84 KiB | 
							
								
								
									
										38
									
								
								assets/static/images/cannery.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								assets/static/images/cannery.svg
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| After Width: | Height: | Size: 516 KiB | 
| @@ -4,8 +4,7 @@ defmodule Cannery.ActivityLog do | ||||
|   """ | ||||
|  | ||||
|   import Ecto.Query, warn: false | ||||
|   import CanneryWeb.Gettext | ||||
|   alias Cannery.{Accounts.User, ActivityLog.ShotGroup, Ammo, Ammo.AmmoGroup, Repo} | ||||
|   alias Cannery.{Accounts.User, ActivityLog.ShotGroup, Ammo.AmmoGroup, Repo} | ||||
|   alias Ecto.{Changeset, Multi} | ||||
|  | ||||
|   @doc """ | ||||
| @@ -60,25 +59,24 @@ defmodule Cannery.ActivityLog do | ||||
|   """ | ||||
|   @spec create_shot_group(attrs :: map(), User.t(), AmmoGroup.t()) :: | ||||
|           {:ok, ShotGroup.t()} | {:error, Changeset.t(ShotGroup.t()) | nil} | ||||
|   def create_shot_group( | ||||
|         attrs, | ||||
|         %User{id: user_id}, | ||||
|         %AmmoGroup{id: ammo_group_id, count: ammo_group_count, user_id: user_id} = ammo_group | ||||
|       ) do | ||||
|     attrs = attrs |> Map.merge(%{"user_id" => user_id, "ammo_group_id" => ammo_group_id}) | ||||
|     changeset = %ShotGroup{} |> ShotGroup.create_changeset(attrs) | ||||
|     shot_group_count = changeset |> Changeset.get_field(:count) | ||||
|  | ||||
|     if shot_group_count > ammo_group_count do | ||||
|       error = dgettext("errors", "Count must be less than %{count}", count: ammo_group_count) | ||||
|       changeset = changeset |> Changeset.add_error(:count, error) | ||||
|       {:error, changeset} | ||||
|     else | ||||
|   def create_shot_group(attrs, user, ammo_group) do | ||||
|     Multi.new() | ||||
|       |> Multi.insert(:create_shot_group, changeset) | ||||
|     |> Multi.insert( | ||||
|       :create_shot_group, | ||||
|       %ShotGroup{} |> ShotGroup.create_changeset(user, ammo_group, attrs) | ||||
|     ) | ||||
|     |> Multi.run( | ||||
|       :ammo_group, | ||||
|       fn repo, %{create_shot_group: %{ammo_group_id: ammo_group_id, user_id: user_id}} -> | ||||
|         {:ok, | ||||
|          repo.one(from ag in AmmoGroup, where: ag.id == ^ammo_group_id and ag.user_id == ^user_id)} | ||||
|       end | ||||
|     ) | ||||
|     |> Multi.update( | ||||
|       :update_ammo_group, | ||||
|       fn %{create_shot_group: %{count: shot_group_count}, ammo_group: %{count: ammo_group_count}} -> | ||||
|         ammo_group |> AmmoGroup.range_changeset(%{"count" => ammo_group_count - shot_group_count}) | ||||
|       end | ||||
|     ) | ||||
|     |> Repo.transaction() | ||||
|     |> case do | ||||
| @@ -87,7 +85,6 @@ defmodule Cannery.ActivityLog do | ||||
|       {:error, _other_transaction, _value, _changes_so_far} -> {:error, nil} | ||||
|     end | ||||
|   end | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Updates a shot_group. | ||||
| @@ -104,35 +101,32 @@ defmodule Cannery.ActivityLog do | ||||
|   @spec update_shot_group(ShotGroup.t(), attrs :: map(), User.t()) :: | ||||
|           {:ok, ShotGroup.t()} | {:error, Changeset.t(ShotGroup.t()) | nil} | ||||
|   def update_shot_group( | ||||
|         %ShotGroup{count: count, user_id: user_id, ammo_group_id: ammo_group_id} = shot_group, | ||||
|         %ShotGroup{count: count, user_id: user_id} = shot_group, | ||||
|         attrs, | ||||
|         %User{id: user_id} = user | ||||
|       ) do | ||||
|     %{count: ammo_group_count, user_id: ^user_id} = | ||||
|       ammo_group = ammo_group_id |> Ammo.get_ammo_group!(user) | ||||
|  | ||||
|     changeset = shot_group |> ShotGroup.update_changeset(attrs) | ||||
|     new_shot_group_count = changeset |> Changeset.get_field(:count) | ||||
|     shot_diff_to_add = new_shot_group_count - count | ||||
|  | ||||
|     cond do | ||||
|       shot_diff_to_add > ammo_group_count -> | ||||
|         error = dgettext("errors", "Count must be less than %{count}", count: ammo_group_count) | ||||
|         changeset = changeset |> Changeset.add_error(:count, error) | ||||
|         {:error, changeset} | ||||
|  | ||||
|       new_shot_group_count <= 0 -> | ||||
|         error = dgettext("errors", "Count must be at least 1") | ||||
|         changeset = changeset |> Changeset.add_error(:count, error) | ||||
|         {:error, changeset} | ||||
|  | ||||
|       true -> | ||||
|     Multi.new() | ||||
|         |> Multi.update(:update_shot_group, changeset) | ||||
|     |> Multi.update( | ||||
|       :update_shot_group, | ||||
|       shot_group |> ShotGroup.update_changeset(user, attrs) | ||||
|     ) | ||||
|     |> Multi.run( | ||||
|       :ammo_group, | ||||
|       fn repo, %{update_shot_group: %{ammo_group_id: ammo_group_id, user_id: user_id}} -> | ||||
|         {:ok, | ||||
|          repo.one(from ag in AmmoGroup, where: ag.id == ^ammo_group_id and ag.user_id == ^user_id)} | ||||
|       end | ||||
|     ) | ||||
|     |> Multi.update( | ||||
|       :update_ammo_group, | ||||
|           ammo_group | ||||
|           |> AmmoGroup.range_changeset(%{"count" => ammo_group_count - shot_diff_to_add}) | ||||
|       fn %{ | ||||
|            update_shot_group: %{count: new_count}, | ||||
|            ammo_group: %{count: ammo_group_count} = ammo_group | ||||
|          } -> | ||||
|         shot_diff_to_add = new_count - count | ||||
|         new_ammo_group_count = ammo_group_count - shot_diff_to_add | ||||
|         ammo_group |> AmmoGroup.range_changeset(%{"count" => new_ammo_group_count}) | ||||
|       end | ||||
|     ) | ||||
|     |> Repo.transaction() | ||||
|     |> case do | ||||
| @@ -141,7 +135,6 @@ defmodule Cannery.ActivityLog do | ||||
|       {:error, _other_transaction, _value, _changes_so_far} -> {:error, nil} | ||||
|     end | ||||
|   end | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Deletes a shot_group. | ||||
| @@ -158,18 +151,27 @@ defmodule Cannery.ActivityLog do | ||||
|   @spec delete_shot_group(ShotGroup.t(), User.t()) :: | ||||
|           {:ok, ShotGroup.t()} | {:error, Changeset.t(ShotGroup.t())} | ||||
|   def delete_shot_group( | ||||
|         %ShotGroup{count: count, user_id: user_id, ammo_group_id: ammo_group_id} = shot_group, | ||||
|         %User{id: user_id} = user | ||||
|         %ShotGroup{user_id: user_id} = shot_group, | ||||
|         %User{id: user_id} | ||||
|       ) do | ||||
|     %{count: ammo_group_count, user_id: ^user_id} = | ||||
|       ammo_group = ammo_group_id |> Ammo.get_ammo_group!(user) | ||||
|  | ||||
|     Multi.new() | ||||
|     |> Multi.delete(:delete_shot_group, shot_group) | ||||
|     |> Multi.run( | ||||
|       :ammo_group, | ||||
|       fn repo, %{delete_shot_group: %{ammo_group_id: ammo_group_id, user_id: user_id}} -> | ||||
|         {:ok, | ||||
|          repo.one(from ag in AmmoGroup, where: ag.id == ^ammo_group_id and ag.user_id == ^user_id)} | ||||
|       end | ||||
|     ) | ||||
|     |> Multi.update( | ||||
|       :update_ammo_group, | ||||
|       ammo_group | ||||
|       |> AmmoGroup.range_changeset(%{"count" => ammo_group_count + count}) | ||||
|       fn %{ | ||||
|            delete_shot_group: %{count: count}, | ||||
|            ammo_group: %{count: ammo_group_count} = ammo_group | ||||
|          } -> | ||||
|         new_ammo_group_count = ammo_group_count + count | ||||
|         ammo_group |> AmmoGroup.range_changeset(%{"count" => new_ammo_group_count}) | ||||
|       end | ||||
|     ) | ||||
|     |> Repo.transaction() | ||||
|     |> case do | ||||
| @@ -178,21 +180,4 @@ defmodule Cannery.ActivityLog do | ||||
|       {:error, _other_transaction, _value, _changes_so_far} -> {:error, nil} | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Returns an `%Ecto.Changeset{}` for tracking shot_group changes. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> change_shot_group(shot_group) | ||||
|       %Ecto.Changeset{data: %ShotGroup{}} | ||||
|  | ||||
|   """ | ||||
|   @spec change_shot_group(ShotGroup.t() | ShotGroup.new_shot_group()) :: | ||||
|           Changeset.t(ShotGroup.t() | ShotGroup.new_shot_group()) | ||||
|   @spec change_shot_group(ShotGroup.t() | ShotGroup.new_shot_group(), attrs :: map()) :: | ||||
|           Changeset.t(ShotGroup.t() | ShotGroup.new_shot_group()) | ||||
|   def change_shot_group(%ShotGroup{} = shot_group, attrs \\ %{}) do | ||||
|     shot_group |> ShotGroup.update_changeset(attrs) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -4,8 +4,9 @@ defmodule Cannery.ActivityLog.ShotGroup do | ||||
|   """ | ||||
|  | ||||
|   use Ecto.Schema | ||||
|   import CanneryWeb.Gettext | ||||
|   import Ecto.Changeset | ||||
|   alias Cannery.{Accounts.User, ActivityLog.ShotGroup, Ammo.AmmoGroup} | ||||
|   alias Cannery.{Accounts.User, ActivityLog.ShotGroup, Ammo.AmmoGroup, Repo} | ||||
|   alias Ecto.{Changeset, UUID} | ||||
|  | ||||
|   @primary_key {:id, :binary_id, autogenerate: true} | ||||
| @@ -37,21 +38,84 @@ defmodule Cannery.ActivityLog.ShotGroup do | ||||
|   @type id :: UUID.t() | ||||
|  | ||||
|   @doc false | ||||
|   @spec create_changeset(new_shot_group(), attrs :: map()) :: Changeset.t(new_shot_group()) | ||||
|   def create_changeset(shot_group, attrs) do | ||||
|   @spec create_changeset( | ||||
|           new_shot_group(), | ||||
|           User.t() | any(), | ||||
|           AmmoGroup.t() | any(), | ||||
|           attrs :: map() | ||||
|         ) :: | ||||
|           Changeset.t(new_shot_group()) | ||||
|   def create_changeset( | ||||
|         shot_group, | ||||
|         %User{id: user_id}, | ||||
|         %AmmoGroup{id: ammo_group_id, user_id: user_id} = ammo_group, | ||||
|         attrs | ||||
|       ) | ||||
|       when not (user_id |> is_nil()) and not (ammo_group_id |> is_nil()) do | ||||
|     shot_group | ||||
|     |> cast(attrs, [:count, :notes, :date, :ammo_group_id, :user_id]) | ||||
|     |> change(user_id: user_id) | ||||
|     |> change(ammo_group_id: ammo_group_id) | ||||
|     |> cast(attrs, [:count, :notes, :date]) | ||||
|     |> validate_number(:count, greater_than: 0) | ||||
|     |> validate_create_shot_group_count(ammo_group) | ||||
|     |> validate_required([:count, :ammo_group_id, :user_id]) | ||||
|   end | ||||
|  | ||||
|   def create_changeset(shot_group, _invalid_user, _invalid_ammo_group, attrs) do | ||||
|     shot_group | ||||
|     |> cast(attrs, [:count, :notes, :date]) | ||||
|     |> validate_number(:count, greater_than: 0) | ||||
|     |> validate_required([:count, :ammo_group_id, :user_id]) | ||||
|     |> add_error(:invalid, dgettext("errors", "Please select a valid user and ammo group")) | ||||
|   end | ||||
|  | ||||
|   defp validate_create_shot_group_count(changeset, %AmmoGroup{count: ammo_group_count}) do | ||||
|     if changeset |> Changeset.get_field(:count) > ammo_group_count do | ||||
|       error = dgettext("errors", "Count must be less than %{count}", count: ammo_group_count) | ||||
|       changeset |> Changeset.add_error(:count, error) | ||||
|     else | ||||
|       changeset | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   @doc false | ||||
|   @spec update_changeset(t() | new_shot_group(), attrs :: map()) :: | ||||
|   @spec update_changeset(t() | new_shot_group(), User.t(), attrs :: map()) :: | ||||
|           Changeset.t(t() | new_shot_group()) | ||||
|   def update_changeset(shot_group, attrs) do | ||||
|   def update_changeset( | ||||
|         %ShotGroup{user_id: user_id} = shot_group, | ||||
|         %User{id: user_id} = user, | ||||
|         attrs | ||||
|       ) | ||||
|       when not (user_id |> is_nil()) do | ||||
|     shot_group | ||||
|     |> cast(attrs, [:count, :notes, :date]) | ||||
|     |> validate_number(:count, greater_than: 0) | ||||
|     |> validate_required([:count]) | ||||
|     |> validate_update_shot_group_count(shot_group, user) | ||||
|   end | ||||
|  | ||||
|   defp validate_update_shot_group_count( | ||||
|          changeset, | ||||
|          %ShotGroup{count: count} = shot_group, | ||||
|          %User{id: user_id} | ||||
|        ) | ||||
|        when not (user_id |> is_nil()) do | ||||
|     %{ammo_group: %AmmoGroup{count: ammo_group_count, user_id: ^user_id}} = | ||||
|       shot_group |> Repo.preload(:ammo_group) | ||||
|  | ||||
|     new_shot_group_count = changeset |> Changeset.get_field(:count) | ||||
|     shot_diff_to_add = new_shot_group_count - count | ||||
|  | ||||
|     cond do | ||||
|       shot_diff_to_add > ammo_group_count -> | ||||
|         error = dgettext("errors", "Count must be less than %{count}", count: ammo_group_count) | ||||
|         changeset |> Changeset.add_error(:count, error) | ||||
|  | ||||
|       new_shot_group_count <= 0 -> | ||||
|         changeset |> Changeset.add_error(:count, dgettext("errors", "Count must be at least 1")) | ||||
|  | ||||
|       true -> | ||||
|         changeset | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -3,6 +3,7 @@ defmodule Cannery.Ammo do | ||||
|   The Ammo context. | ||||
|   """ | ||||
|  | ||||
|   import CanneryWeb.Gettext | ||||
|   import Ecto.Query, warn: false | ||||
|   alias Cannery.{Accounts.User, Containers, Repo} | ||||
|   alias Cannery.ActivityLog.ShotGroup | ||||
| @@ -350,18 +351,21 @@ defmodule Cannery.Ammo do | ||||
|   def create_ammo_groups( | ||||
|         %{"ammo_type_id" => ammo_type_id, "container_id" => container_id} = attrs, | ||||
|         multiplier, | ||||
|         %User{id: user_id} = user | ||||
|         %User{} = user | ||||
|       ) | ||||
|       when multiplier >= 1 and multiplier <= @ammo_group_create_limit do | ||||
|     # validate ammo type and container ids belong to user | ||||
|     _valid_ammo_type = get_ammo_type!(ammo_type_id, user) | ||||
|     _valid_container = Containers.get_container!(container_id, user) | ||||
|  | ||||
|       when multiplier >= 1 and multiplier <= @ammo_group_create_limit and | ||||
|              not (ammo_type_id |> is_nil()) and not (container_id |> is_nil()) do | ||||
|     now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) | ||||
|  | ||||
|     changesets = | ||||
|       Enum.map(1..multiplier, fn _count -> | ||||
|         %AmmoGroup{} |> AmmoGroup.create_changeset(attrs |> Map.put("user_id", user_id)) | ||||
|         %AmmoGroup{} | ||||
|         |> AmmoGroup.create_changeset( | ||||
|           get_ammo_type!(ammo_type_id, user), | ||||
|           Containers.get_container!(container_id, user), | ||||
|           user, | ||||
|           attrs | ||||
|         ) | ||||
|       end) | ||||
|  | ||||
|     if changesets |> Enum.all?(fn %{valid?: valid} -> valid end) do | ||||
| @@ -386,8 +390,27 @@ defmodule Cannery.Ammo do | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   def create_ammo_groups(invalid_attrs, _multiplier, _user) do | ||||
|     {:error, %AmmoGroup{} |> AmmoGroup.create_changeset(invalid_attrs)} | ||||
|   def create_ammo_groups( | ||||
|         %{"ammo_type_id" => ammo_type_id, "container_id" => container_id} = attrs, | ||||
|         _multiplier, | ||||
|         user | ||||
|       ) | ||||
|       when not (ammo_type_id |> is_nil()) and not (container_id |> is_nil()) do | ||||
|     changeset = | ||||
|       %AmmoGroup{} | ||||
|       |> AmmoGroup.create_changeset( | ||||
|         get_ammo_type!(ammo_type_id, user), | ||||
|         Containers.get_container!(container_id, user), | ||||
|         user, | ||||
|         attrs | ||||
|       ) | ||||
|       |> Changeset.add_error(:multiplier, dgettext("errors", "Invalid multiplier")) | ||||
|  | ||||
|     {:error, changeset} | ||||
|   end | ||||
|  | ||||
|   def create_ammo_groups(invalid_attrs, _multiplier, user) do | ||||
|     {:error, %AmmoGroup{} |> AmmoGroup.create_changeset(nil, nil, user, invalid_attrs)} | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
| @@ -436,18 +459,4 @@ defmodule Cannery.Ammo do | ||||
|   @spec delete_ammo_group!(AmmoGroup.t(), User.t()) :: AmmoGroup.t() | ||||
|   def delete_ammo_group!(%AmmoGroup{user_id: user_id} = ammo_group, %User{id: user_id}), | ||||
|     do: ammo_group |> Repo.delete!() | ||||
|  | ||||
|   @doc """ | ||||
|   Returns an `%Changeset{}` for tracking ammo_group changes. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> change_ammo_group(ammo_group) | ||||
|       %Changeset{data: %AmmoGroup{}} | ||||
|  | ||||
|   """ | ||||
|   @spec change_ammo_group(AmmoGroup.t()) :: Changeset.t(AmmoGroup.t()) | ||||
|   @spec change_ammo_group(AmmoGroup.t(), attrs :: map()) :: Changeset.t(AmmoGroup.t()) | ||||
|   def change_ammo_group(%AmmoGroup{} = ammo_group, attrs \\ %{}), | ||||
|     do: AmmoGroup.update_changeset(ammo_group, attrs) | ||||
| end | ||||
|   | ||||
| @@ -7,6 +7,7 @@ defmodule Cannery.Ammo.AmmoGroup do | ||||
|   """ | ||||
|  | ||||
|   use Ecto.Schema | ||||
|   import CanneryWeb.Gettext | ||||
|   import Ecto.Changeset | ||||
|   alias Cannery.Ammo.{AmmoGroup, AmmoType} | ||||
|   alias Cannery.{Accounts.User, ActivityLog.ShotGroup, Containers.Container} | ||||
| @@ -48,22 +49,49 @@ defmodule Cannery.Ammo.AmmoGroup do | ||||
|   @type id :: UUID.t() | ||||
|  | ||||
|   @doc false | ||||
|   @spec create_changeset(new_ammo_group(), attrs :: map()) :: Changeset.t(new_ammo_group()) | ||||
|   def create_changeset(ammo_group, attrs) do | ||||
|   @spec create_changeset( | ||||
|           new_ammo_group(), | ||||
|           AmmoType.t() | nil, | ||||
|           Container.t() | nil, | ||||
|           User.t(), | ||||
|           attrs :: map() | ||||
|         ) :: Changeset.t(new_ammo_group()) | ||||
|   def create_changeset( | ||||
|         ammo_group, | ||||
|         %AmmoType{id: ammo_type_id}, | ||||
|         %Container{id: container_id, user_id: user_id}, | ||||
|         %User{id: user_id}, | ||||
|         attrs | ||||
|       ) | ||||
|       when not (ammo_type_id |> is_nil()) and not (container_id |> is_nil()) and | ||||
|              not (user_id |> is_nil()) do | ||||
|     ammo_group | ||||
|     |> cast(attrs, [:count, :price_paid, :notes, :staged, :ammo_type_id, :container_id, :user_id]) | ||||
|     |> change(ammo_type_id: ammo_type_id) | ||||
|     |> change(user_id: user_id) | ||||
|     |> change(container_id: container_id) | ||||
|     |> cast(attrs, [:count, :price_paid, :notes, :staged]) | ||||
|     |> validate_number(:count, greater_than: 0) | ||||
|     |> validate_required([:count, :staged, :ammo_type_id, :container_id, :user_id]) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Invalid changeset, used to prompt user to select ammo type and container | ||||
|   """ | ||||
|   def create_changeset(ammo_group, _invalid_ammo_type, _invalid_container, _invalid_user, attrs) do | ||||
|     ammo_group | ||||
|     |> cast(attrs, [:ammo_type_id, :container_id]) | ||||
|     |> validate_required([:ammo_type_id, :container_id]) | ||||
|     |> add_error(:invalid, dgettext("errors", "Please select an ammo type and container")) | ||||
|   end | ||||
|  | ||||
|   @doc false | ||||
|   @spec update_changeset(t() | new_ammo_group(), attrs :: map()) :: | ||||
|           Changeset.t(t() | new_ammo_group()) | ||||
|   def update_changeset(ammo_group, attrs) do | ||||
|     ammo_group | ||||
|     |> cast(attrs, [:count, :price_paid, :notes, :staged, :ammo_type_id, :container_id]) | ||||
|     |> cast(attrs, [:count, :price_paid, :notes, :staged]) | ||||
|     |> validate_number(:count, greater_than_or_equal_to: 0) | ||||
|     |> validate_required([:count, :staged, :ammo_type_id, :container_id, :user_id]) | ||||
|     |> validate_required([:count, :staged]) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
| @@ -75,6 +103,6 @@ defmodule Cannery.Ammo.AmmoGroup do | ||||
|   def range_changeset(ammo_group, attrs) do | ||||
|     ammo_group | ||||
|     |> cast(attrs, [:count, :staged]) | ||||
|     |> validate_required([:count, :staged, :ammo_type_id, :container_id, :user_id]) | ||||
|     |> validate_required([:count, :staged]) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -118,6 +118,6 @@ defmodule Cannery.Ammo.AmmoType do | ||||
|   def update_changeset(ammo_type, attrs) do | ||||
|     ammo_type | ||||
|     |> cast(attrs, changeset_fields()) | ||||
|     |> validate_required([:name, :user_id]) | ||||
|     |> validate_required(:name) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -55,6 +55,6 @@ defmodule Cannery.Containers.Container do | ||||
|   def update_changeset(container, attrs) do | ||||
|     container | ||||
|     |> cast(attrs, [:name, :desc, :type, :location]) | ||||
|     |> validate_required([:name, :type, :user_id]) | ||||
|     |> validate_required([:name, :type]) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -51,7 +51,7 @@ defmodule Cannery.Invites.Invite do | ||||
|   def update_changeset(invite, attrs) do | ||||
|     invite | ||||
|     |> cast(attrs, [:name, :uses_left, :disabled_at]) | ||||
|     |> validate_required([:name, :token, :user_id]) | ||||
|     |> validate_required([:name]) | ||||
|     |> validate_number(:uses_left, greater_than_or_equal_to: 0) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -47,6 +47,6 @@ defmodule Cannery.Tags.Tag do | ||||
|   def update_changeset(tag, attrs) do | ||||
|     tag | ||||
|     |> cast(attrs, [:name, :bg_color, :text_color]) | ||||
|     |> validate_required([:name, :bg_color, :text_color, :user_id]) | ||||
|     |> validate_required([:name, :bg_color, :text_color]) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -16,9 +16,10 @@ defmodule CanneryWeb.Components.AddShotGroupComponent do | ||||
|           }, | ||||
|           Socket.t() | ||||
|         ) :: {:ok, Socket.t()} | ||||
|   def update(%{ammo_group: _ammo_group, current_user: _current_user} = assigns, socket) do | ||||
|   def update(%{ammo_group: ammo_group, current_user: current_user} = assigns, socket) do | ||||
|     changeset = | ||||
|       %ShotGroup{date: NaiveDateTime.utc_now(), count: 1} |> ActivityLog.change_shot_group() | ||||
|       %ShotGroup{date: NaiveDateTime.utc_now(), count: 1} | ||||
|       |> ShotGroup.create_changeset(current_user, ammo_group, %{}) | ||||
|  | ||||
|     {:ok, socket |> assign(assigns) |> assign(:changeset, changeset)} | ||||
|   end | ||||
| @@ -27,21 +28,13 @@ defmodule CanneryWeb.Components.AddShotGroupComponent do | ||||
|   def handle_event( | ||||
|         "validate", | ||||
|         %{"shot_group" => shot_group_params}, | ||||
|         %{ | ||||
|           assigns: %{ | ||||
|             ammo_group: %AmmoGroup{id: ammo_group_id} = ammo_group, | ||||
|             current_user: %User{id: user_id} | ||||
|           } | ||||
|         } = socket | ||||
|         %{assigns: %{ammo_group: ammo_group, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     shot_group_params = | ||||
|       shot_group_params | ||||
|       |> process_params(ammo_group) | ||||
|       |> Map.merge(%{"ammo_group_id" => ammo_group_id, "user_id" => user_id}) | ||||
|     params = shot_group_params |> process_params(ammo_group) | ||||
|  | ||||
|     changeset = | ||||
|       %ShotGroup{} | ||||
|       |> ActivityLog.change_shot_group(shot_group_params) | ||||
|       |> ShotGroup.create_changeset(current_user, ammo_group, params) | ||||
|       |> Map.put(:action, :validate) | ||||
|  | ||||
|     {:noreply, socket |> assign(:changeset, changeset)} | ||||
| @@ -51,17 +44,12 @@ defmodule CanneryWeb.Components.AddShotGroupComponent do | ||||
|         "save", | ||||
|         %{"shot_group" => shot_group_params}, | ||||
|         %{ | ||||
|           assigns: %{ | ||||
|             ammo_group: %{id: ammo_group_id} = ammo_group, | ||||
|             current_user: %{id: user_id} = current_user, | ||||
|             return_to: return_to | ||||
|           } | ||||
|           assigns: %{ammo_group: ammo_group, current_user: current_user, return_to: return_to} | ||||
|         } = socket | ||||
|       ) do | ||||
|     socket = | ||||
|       shot_group_params | ||||
|       |> process_params(ammo_group) | ||||
|       |> Map.merge(%{"ammo_group_id" => ammo_group_id, "user_id" => user_id}) | ||||
|       |> ActivityLog.create_shot_group(current_user, ammo_group) | ||||
|       |> case do | ||||
|         {:ok, _shot_group} -> | ||||
|   | ||||
| @@ -22,7 +22,7 @@ defmodule CanneryWeb.Components.MoveAmmoGroupComponent do | ||||
|           assigns, | ||||
|         socket | ||||
|       ) do | ||||
|     changeset = Ammo.change_ammo_group(ammo_group) | ||||
|     changeset = ammo_group |> AmmoGroup.update_changeset(%{}) | ||||
|  | ||||
|     containers = | ||||
|       Containers.list_containers(current_user) | ||||
|   | ||||
| @@ -16,10 +16,16 @@ defmodule CanneryWeb.Components.Topbar do | ||||
|     <nav role="navigation" class="mb-8 px-8 py-4 w-full bg-primary-400"> | ||||
|       <div class="flex flex-col sm:flex-row justify-between items-center"> | ||||
|         <div class="mb-4 sm:mb-0 sm:mr-8 flex flex-row justify-start items-center space-x-2"> | ||||
|           <%= live_redirect("Cannery", | ||||
|             to: Routes.live_path(Endpoint, HomeLive), | ||||
|             class: "mx-2 my-1 leading-5 text-xl text-white hover:underline" | ||||
|           ) %> | ||||
|           <%= live_redirect to: Routes.live_path(Endpoint, HomeLive), | ||||
|             class: "inline mx-2 my-1 leading-5 text-xl text-white" | ||||
|             do %> | ||||
|             <img | ||||
|               src={Routes.static_path(Endpoint, "/images/cannery.svg")} | ||||
|               alt={gettext("Cannery logo")} | ||||
|               class="inline-block h-8 mx-1" | ||||
|             /> | ||||
|             <h1 class="inline hover:underline">Cannery</h1> | ||||
|           <% end %> | ||||
|  | ||||
|           <%= if @title_content do %> | ||||
|             <span class="mx-2 my-1"> | ||||
|   | ||||
| @@ -25,7 +25,7 @@ defmodule CanneryWeb.AmmoGroupLive.FormComponent do | ||||
|     socket = | ||||
|       socket | ||||
|       |> assign(:ammo_group_create_limit, @ammo_group_create_limit) | ||||
|       |> assign(:changeset, Ammo.change_ammo_group(ammo_group)) | ||||
|       |> assign(:changeset, ammo_group |> AmmoGroup.update_changeset(%{})) | ||||
|       |> assign(:ammo_types, Ammo.list_ammo_types(current_user)) | ||||
|       |> assign_new(:containers, fn -> Containers.list_containers(current_user) end) | ||||
|  | ||||
| @@ -36,7 +36,7 @@ defmodule CanneryWeb.AmmoGroupLive.FormComponent do | ||||
|   def handle_event( | ||||
|         "validate", | ||||
|         %{"ammo_group" => ammo_group_params}, | ||||
|         %{assigns: %{action: action, ammo_group: ammo_group}} = socket | ||||
|         %{assigns: %{action: action, ammo_group: ammo_group, current_user: user}} = socket | ||||
|       ) do | ||||
|     changeset_action = | ||||
|       case action do | ||||
| @@ -44,7 +44,24 @@ defmodule CanneryWeb.AmmoGroupLive.FormComponent do | ||||
|         :edit -> :update | ||||
|       end | ||||
|  | ||||
|     changeset = ammo_group |> Ammo.change_ammo_group(ammo_group_params) | ||||
|     changeset = | ||||
|       case action do | ||||
|         :new -> | ||||
|           ammo_type = | ||||
|             if ammo_group_params |> Map.has_key?("ammo_type_id"), | ||||
|               do: ammo_group_params |> Map.get("ammo_type_id") |> Ammo.get_ammo_type!(user), | ||||
|               else: nil | ||||
|  | ||||
|           container = | ||||
|             if ammo_group_params |> Map.has_key?("container_id"), | ||||
|               do: ammo_group_params |> Map.get("container_id") |> Containers.get_container!(user), | ||||
|               else: nil | ||||
|  | ||||
|           ammo_group |> AmmoGroup.create_changeset(ammo_type, container, user, ammo_group_params) | ||||
|  | ||||
|         :edit -> | ||||
|           ammo_group |> AmmoGroup.update_changeset(ammo_group_params) | ||||
|       end | ||||
|  | ||||
|     changeset = | ||||
|       case changeset |> Changeset.apply_action(changeset_action) do | ||||
|   | ||||
| @@ -5,6 +5,7 @@ defmodule CanneryWeb.HomeLive do | ||||
|  | ||||
|   use CanneryWeb, :live_view | ||||
|   alias Cannery.Accounts | ||||
|   alias CanneryWeb.Endpoint | ||||
|  | ||||
|   @impl true | ||||
|   def mount(_params, _session, socket) do | ||||
| @@ -36,6 +37,13 @@ defmodule CanneryWeb.HomeLive do | ||||
|   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> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| defmodule CanneryWeb.RangeLive.FormComponent do | ||||
|   @moduledoc """ | ||||
|   Livecomponent that can update or create a ShotGroup | ||||
|   Livecomponent that can update a ShotGroup | ||||
|   """ | ||||
|  | ||||
|   use CanneryWeb, :live_component | ||||
| @@ -24,7 +24,7 @@ defmodule CanneryWeb.RangeLive.FormComponent do | ||||
|         } = assigns, | ||||
|         socket | ||||
|       ) do | ||||
|     changeset = shot_group |> ActivityLog.change_shot_group() | ||||
|     changeset = shot_group |> ShotGroup.update_changeset(current_user, %{}) | ||||
|     ammo_group = Ammo.get_ammo_group!(ammo_group_id, current_user) | ||||
|     {:ok, socket |> assign(assigns) |> assign(ammo_group: ammo_group, changeset: changeset)} | ||||
|   end | ||||
| @@ -33,11 +33,11 @@ defmodule CanneryWeb.RangeLive.FormComponent do | ||||
|   def handle_event( | ||||
|         "validate", | ||||
|         %{"shot_group" => shot_group_params}, | ||||
|         %{assigns: %{shot_group: shot_group}} = socket | ||||
|         %{assigns: %{current_user: current_user, shot_group: shot_group}} = socket | ||||
|       ) do | ||||
|     changeset = | ||||
|       shot_group | ||||
|       |> ActivityLog.change_shot_group(shot_group_params) | ||||
|       |> ShotGroup.update_changeset(current_user, shot_group_params) | ||||
|       |> Map.put(:action, :validate) | ||||
|  | ||||
|     {:noreply, assign(socket, :changeset, changeset)} | ||||
|   | ||||
| @@ -66,7 +66,7 @@ msgid "Invite someone new!" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:106 | ||||
| #: lib/cannery_web/components/topbar.ex:112 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:48 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:48 | ||||
| @@ -97,7 +97,7 @@ msgid "New Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:99 | ||||
| #: lib/cannery_web/components/topbar.ex:105 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:25 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||
|   | ||||
| @@ -79,7 +79,7 @@ msgid "Invite someone new!" | ||||
| msgstr "Laden Sie jemanden ein!" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:106 | ||||
| #: lib/cannery_web/components/topbar.ex:112 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:48 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:48 | ||||
| @@ -110,7 +110,7 @@ msgid "New Tag" | ||||
| msgstr "Neuer Tag" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:99 | ||||
| #: lib/cannery_web/components/topbar.ex:105 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:25 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||
|   | ||||
| @@ -24,14 +24,14 @@ msgstr "" | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:56 | ||||
| #: lib/cannery_web/live/home_live.ex:64 | ||||
| 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" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:78 | ||||
| #: lib/cannery_web/live/home_live.ex:86 | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "Zugriff von jedem Internet-fähigen Gerät" | ||||
|  | ||||
| @@ -41,12 +41,12 @@ msgid "Admins" | ||||
| msgstr "Admins" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:92 | ||||
| #: lib/cannery_web/live/home_live.ex:100 | ||||
| msgid "Admins:" | ||||
| msgstr "Admins:" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:56 | ||||
| #: lib/cannery_web/components/topbar.ex:62 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 | ||||
| #: lib/cannery_web/live/range_live/index.ex:80 | ||||
| msgid "Ammo" | ||||
| @@ -124,7 +124,7 @@ msgid "Container" | ||||
| msgstr "Behälter" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:44 | ||||
| #: lib/cannery_web/components/topbar.ex:50 | ||||
| #: lib/cannery_web/live/container_live/index.ex:36 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:3 | ||||
| msgid "Containers" | ||||
| @@ -167,7 +167,7 @@ msgid "Disable" | ||||
| msgstr "Deaktivieren" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:53 | ||||
| #: lib/cannery_web/live/home_live.ex:61 | ||||
| msgid "Easy to Use:" | ||||
| msgstr "Einfache Anwendung:" | ||||
|  | ||||
| @@ -222,7 +222,7 @@ msgid "Incendiary" | ||||
| msgstr "Brandmunition" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:87 | ||||
| #: lib/cannery_web/live/home_live.ex:95 | ||||
| msgid "Instance Information" | ||||
| msgstr "Instanzinformationen" | ||||
|  | ||||
| @@ -232,12 +232,12 @@ msgid "Invite Disabled" | ||||
| msgstr "Einladung deaktiviert" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:118 | ||||
| #: lib/cannery_web/live/home_live.ex:126 | ||||
| msgid "Invite Only" | ||||
| msgstr "Nur mit Einladung" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:69 | ||||
| #: lib/cannery_web/components/topbar.ex:75 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:41 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||
| msgid "Invites" | ||||
| @@ -388,17 +388,17 @@ msgid "Primer type" | ||||
| msgstr "Zündertyp" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:117 | ||||
| #: lib/cannery_web/live/home_live.ex:125 | ||||
| msgid "Public Signups" | ||||
| msgstr "Öffentliche Registrierung" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:65 | ||||
| #: lib/cannery_web/live/home_live.ex:73 | ||||
| msgid "Secure:" | ||||
| msgstr "Sicher:" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:68 | ||||
| #: lib/cannery_web/live/home_live.ex:76 | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
| "Hosten Sie Ihre eigene Instanz oder verwenden Sie eine Instanz, der Sie " | ||||
| @@ -421,7 +421,7 @@ msgid "Show Ammo type" | ||||
| msgstr "Zeige Munitionsarten" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:75 | ||||
| #: lib/cannery_web/live/home_live.ex:83 | ||||
| msgid "Simple:" | ||||
| msgstr "Einfach:" | ||||
|  | ||||
| @@ -436,7 +436,7 @@ msgid "Stored in" | ||||
| msgstr "Gelagert in" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:38 | ||||
| #: lib/cannery_web/components/topbar.ex:44 | ||||
| #: lib/cannery_web/live/tag_live/index.ex:32 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:3 | ||||
| msgid "Tags" | ||||
| @@ -453,7 +453,7 @@ msgid "Text color" | ||||
| msgstr "Textfarbe" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| #: lib/cannery_web/live/home_live.ex:52 | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "Die selbst-gehostete Website zur Verwaltung von Schusswaffen" | ||||
|  | ||||
| @@ -492,12 +492,12 @@ msgid "Uses left" | ||||
| msgstr "Verbleibende Nutzung" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:40 | ||||
| #: lib/cannery_web/live/home_live.ex:48 | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "Willkommen %{name}" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.ex:77 | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "Ihre Daten bleiben bei Ihnen, Punkt" | ||||
|  | ||||
| @@ -507,7 +507,7 @@ msgid "No tags for this container" | ||||
| msgstr "Keine Tags für diesen Behälter" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:62 | ||||
| #: lib/cannery_web/components/topbar.ex:68 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:84 | ||||
| msgid "Range" | ||||
| msgstr "Schießplatz" | ||||
| @@ -863,27 +863,27 @@ msgid "Language" | ||||
| msgstr "Sprache" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:139 | ||||
| #: lib/cannery_web/live/home_live.ex:147 | ||||
| msgid "Get involved!" | ||||
| msgstr "Mach mit!" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:156 | ||||
| #: lib/cannery_web/live/home_live.ex:164 | ||||
| msgid "Help translate" | ||||
| msgstr "Hilf beim Übersetzen" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:165 | ||||
| #: lib/cannery_web/live/home_live.ex:173 | ||||
| msgid "Report bugs or request features" | ||||
| msgstr "Sende Bugs oder Erweiterungsvorschläge" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:147 | ||||
| #: lib/cannery_web/live/home_live.ex:155 | ||||
| msgid "View the source code" | ||||
| msgstr "Quellcode ansehen" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:50 | ||||
| #: lib/cannery_web/components/topbar.ex:56 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:3 | ||||
| msgid "Catalog" | ||||
| msgstr "" | ||||
| @@ -918,3 +918,14 @@ msgstr "Diese Munitionsgruppe ist nicht in einem Behälter" | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:27 | ||||
| msgid "Packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:24 | ||||
| #: lib/cannery_web/live/home_live.ex:42 | ||||
| msgid "Cannery logo" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| msgid "isn't he cute >:3" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -152,13 +152,13 @@ msgid "Tag could not be added" | ||||
| msgstr "Tag konnte nicht hinzugefügt werden" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log.ex:125 | ||||
| #: lib/cannery/activity_log/shot_group.ex:115 | ||||
| msgid "Count must be at least 1" | ||||
| msgstr "Anzahl muss mindestens 1 sein" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log.ex:73 | ||||
| #: lib/cannery/activity_log.ex:120 | ||||
| #: lib/cannery/activity_log/shot_group.ex:74 | ||||
| #: lib/cannery/activity_log/shot_group.ex:111 | ||||
| msgid "Count must be less than %{count}" | ||||
| msgstr "Anzahl muss weniger als %{count} betragen" | ||||
|  | ||||
| @@ -176,13 +176,28 @@ msgid "Tag could not be removed" | ||||
| msgstr "Tag konnte nicht gelöscht werden" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:126 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:143 | ||||
| msgid "Could not parse number of copies" | ||||
| msgstr "Konnte die Anzahl der Kopien nicht verstehen" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:111 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:128 | ||||
| msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" | ||||
| msgstr "" | ||||
| "Ungültige Nummer an Kopien. Muss zwischen 1 and %{max} liegen. War " | ||||
| "%{multiplier}" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/ammo.ex:407 | ||||
| msgid "Invalid multiplier" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/ammo/ammo_group.ex:84 | ||||
| msgid "Please select an ammo type and container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log/shot_group.ex:69 | ||||
| msgid "Please select a valid user and ammo group" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -113,7 +113,7 @@ msgid "Are you sure you want to delete your account?" | ||||
| msgstr "Sind Sie sicher, dass sie Ihren Account löschen möchten?" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:84 | ||||
| #: lib/cannery_web/components/topbar.ex:90 | ||||
| msgid "Are you sure you want to log out?" | ||||
| msgstr "Wirklich ausloggen?" | ||||
|  | ||||
| @@ -162,7 +162,7 @@ msgid "Please check your email to verify your account" | ||||
| msgstr "Bitte überprüfen Sie ihre Mailbox und bestätigen Sie das Nutzerkonto" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:96 | ||||
| #: lib/cannery_web/live/home_live.ex:104 | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "Registrieren Sie sich, um %{name} zu bearbeiten" | ||||
|  | ||||
| @@ -205,7 +205,7 @@ msgid "Adding..." | ||||
| msgstr "Füge hinzu..." | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/add_shot_group_component.ex:68 | ||||
| #: lib/cannery_web/components/add_shot_group_component.ex:56 | ||||
| msgid "Shots recorded successfully" | ||||
| msgstr "Schüsse erfolgreich dokumentiert" | ||||
|  | ||||
| @@ -283,12 +283,12 @@ msgid "Ammo unstaged succesfully" | ||||
| msgstr "Munition erfolgreich demarkiert" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:88 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:105 | ||||
| msgid "Ammo updated successfully" | ||||
| msgstr "Munitionsgruppe erfolgreich aktualisiert" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:147 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:164 | ||||
| msgid "Ammo added successfully" | ||||
| msgid_plural "Ammo added successfully" | ||||
| msgstr[0] "Munitionsgruppe erfolgreich aktualisiert" | ||||
|   | ||||
| @@ -11,12 +11,12 @@ msgid "" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:56 | ||||
| #: lib/cannery_web/live/home_live.ex:64 | ||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:78 | ||||
| #: lib/cannery_web/live/home_live.ex:86 | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -26,12 +26,12 @@ msgid "Admins" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:92 | ||||
| #: lib/cannery_web/live/home_live.ex:100 | ||||
| msgid "Admins:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:56 | ||||
| #: lib/cannery_web/components/topbar.ex:62 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 | ||||
| #: lib/cannery_web/live/range_live/index.ex:80 | ||||
| msgid "Ammo" | ||||
| @@ -109,7 +109,7 @@ msgid "Container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:44 | ||||
| #: lib/cannery_web/components/topbar.ex:50 | ||||
| #: lib/cannery_web/live/container_live/index.ex:36 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:3 | ||||
| msgid "Containers" | ||||
| @@ -152,7 +152,7 @@ msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:53 | ||||
| #: lib/cannery_web/live/home_live.ex:61 | ||||
| msgid "Easy to Use:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -207,7 +207,7 @@ msgid "Incendiary" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:87 | ||||
| #: lib/cannery_web/live/home_live.ex:95 | ||||
| msgid "Instance Information" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -217,12 +217,12 @@ msgid "Invite Disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:118 | ||||
| #: lib/cannery_web/live/home_live.ex:126 | ||||
| msgid "Invite Only" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:69 | ||||
| #: lib/cannery_web/components/topbar.ex:75 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:41 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||
| msgid "Invites" | ||||
| @@ -373,17 +373,17 @@ msgid "Primer type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:117 | ||||
| #: lib/cannery_web/live/home_live.ex:125 | ||||
| msgid "Public Signups" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:65 | ||||
| #: lib/cannery_web/live/home_live.ex:73 | ||||
| msgid "Secure:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:68 | ||||
| #: lib/cannery_web/live/home_live.ex:76 | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -404,7 +404,7 @@ msgid "Show Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:75 | ||||
| #: lib/cannery_web/live/home_live.ex:83 | ||||
| msgid "Simple:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -419,7 +419,7 @@ msgid "Stored in" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:38 | ||||
| #: lib/cannery_web/components/topbar.ex:44 | ||||
| #: lib/cannery_web/live/tag_live/index.ex:32 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:3 | ||||
| msgid "Tags" | ||||
| @@ -436,7 +436,7 @@ msgid "Text color" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| #: lib/cannery_web/live/home_live.ex:52 | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -475,12 +475,12 @@ msgid "Uses left" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:40 | ||||
| #: lib/cannery_web/live/home_live.ex:48 | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.ex:77 | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -490,7 +490,7 @@ msgid "No tags for this container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:62 | ||||
| #: lib/cannery_web/components/topbar.ex:68 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:84 | ||||
| msgid "Range" | ||||
| msgstr "" | ||||
| @@ -846,27 +846,27 @@ msgid "Language" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:139 | ||||
| #: lib/cannery_web/live/home_live.ex:147 | ||||
| msgid "Get involved!" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:156 | ||||
| #: lib/cannery_web/live/home_live.ex:164 | ||||
| msgid "Help translate" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:165 | ||||
| #: lib/cannery_web/live/home_live.ex:173 | ||||
| msgid "Report bugs or request features" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:147 | ||||
| #: lib/cannery_web/live/home_live.ex:155 | ||||
| msgid "View the source code" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:50 | ||||
| #: lib/cannery_web/components/topbar.ex:56 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:3 | ||||
| msgid "Catalog" | ||||
| msgstr "" | ||||
| @@ -901,3 +901,14 @@ msgstr "" | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:27 | ||||
| msgid "Packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:24 | ||||
| #: lib/cannery_web/live/home_live.ex:42 | ||||
| msgid "Cannery logo" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| msgid "isn't he cute >:3" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -67,7 +67,7 @@ msgid "Invite someone new!" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:106 | ||||
| #: lib/cannery_web/components/topbar.ex:112 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:48 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:48 | ||||
| @@ -98,7 +98,7 @@ msgid "New Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:99 | ||||
| #: lib/cannery_web/components/topbar.ex:105 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:25 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||
|   | ||||
| @@ -12,12 +12,12 @@ msgstr "" | ||||
| "Plural-Forms: nplurals=2\n" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:56 | ||||
| #: lib/cannery_web/live/home_live.ex:64 | ||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:78 | ||||
| #: lib/cannery_web/live/home_live.ex:86 | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -27,12 +27,12 @@ msgid "Admins" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:92 | ||||
| #: lib/cannery_web/live/home_live.ex:100 | ||||
| msgid "Admins:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:56 | ||||
| #: lib/cannery_web/components/topbar.ex:62 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 | ||||
| #: lib/cannery_web/live/range_live/index.ex:80 | ||||
| msgid "Ammo" | ||||
| @@ -110,7 +110,7 @@ msgid "Container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:44 | ||||
| #: lib/cannery_web/components/topbar.ex:50 | ||||
| #: lib/cannery_web/live/container_live/index.ex:36 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:3 | ||||
| msgid "Containers" | ||||
| @@ -153,7 +153,7 @@ msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:53 | ||||
| #: lib/cannery_web/live/home_live.ex:61 | ||||
| msgid "Easy to Use:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -208,7 +208,7 @@ msgid "Incendiary" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:87 | ||||
| #: lib/cannery_web/live/home_live.ex:95 | ||||
| msgid "Instance Information" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -218,12 +218,12 @@ msgid "Invite Disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:118 | ||||
| #: lib/cannery_web/live/home_live.ex:126 | ||||
| msgid "Invite Only" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:69 | ||||
| #: lib/cannery_web/components/topbar.ex:75 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:41 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||
| msgid "Invites" | ||||
| @@ -374,17 +374,17 @@ msgid "Primer type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:117 | ||||
| #: lib/cannery_web/live/home_live.ex:125 | ||||
| msgid "Public Signups" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:65 | ||||
| #: lib/cannery_web/live/home_live.ex:73 | ||||
| msgid "Secure:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:68 | ||||
| #: lib/cannery_web/live/home_live.ex:76 | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -405,7 +405,7 @@ msgid "Show Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:75 | ||||
| #: lib/cannery_web/live/home_live.ex:83 | ||||
| msgid "Simple:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -420,7 +420,7 @@ msgid "Stored in" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:38 | ||||
| #: lib/cannery_web/components/topbar.ex:44 | ||||
| #: lib/cannery_web/live/tag_live/index.ex:32 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:3 | ||||
| msgid "Tags" | ||||
| @@ -437,7 +437,7 @@ msgid "Text color" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| #: lib/cannery_web/live/home_live.ex:52 | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -476,12 +476,12 @@ msgid "Uses left" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:40 | ||||
| #: lib/cannery_web/live/home_live.ex:48 | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.ex:77 | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -491,7 +491,7 @@ msgid "No tags for this container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:62 | ||||
| #: lib/cannery_web/components/topbar.ex:68 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:84 | ||||
| msgid "Range" | ||||
| msgstr "" | ||||
| @@ -847,27 +847,27 @@ msgid "Language" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:139 | ||||
| #: lib/cannery_web/live/home_live.ex:147 | ||||
| msgid "Get involved!" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:156 | ||||
| #: lib/cannery_web/live/home_live.ex:164 | ||||
| msgid "Help translate" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:165 | ||||
| #: lib/cannery_web/live/home_live.ex:173 | ||||
| msgid "Report bugs or request features" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:147 | ||||
| #: lib/cannery_web/live/home_live.ex:155 | ||||
| msgid "View the source code" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:50 | ||||
| #: lib/cannery_web/components/topbar.ex:56 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:3 | ||||
| msgid "Catalog" | ||||
| msgstr "" | ||||
| @@ -902,3 +902,14 @@ msgstr "" | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:27 | ||||
| msgid "Packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:24 | ||||
| #: lib/cannery_web/live/home_live.ex:42 | ||||
| msgid "Cannery logo" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| msgid "isn't he cute >:3" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -139,13 +139,13 @@ msgid "Tag could not be added" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log.ex:125 | ||||
| #: lib/cannery/activity_log/shot_group.ex:115 | ||||
| msgid "Count must be at least 1" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log.ex:73 | ||||
| #: lib/cannery/activity_log.ex:120 | ||||
| #: lib/cannery/activity_log/shot_group.ex:74 | ||||
| #: lib/cannery/activity_log/shot_group.ex:111 | ||||
| msgid "Count must be less than %{count}" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -161,11 +161,26 @@ msgid "Tag could not be removed" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:126 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:143 | ||||
| msgid "Could not parse number of copies" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:111 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:128 | ||||
| msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/ammo.ex:407 | ||||
| msgid "Invalid multiplier" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/ammo/ammo_group.ex:84 | ||||
| msgid "Please select an ammo type and container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log/shot_group.ex:69 | ||||
| msgid "Please select a valid user and ammo group" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -99,7 +99,7 @@ msgid "Are you sure you want to delete your account?" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:84 | ||||
| #: lib/cannery_web/components/topbar.ex:90 | ||||
| msgid "Are you sure you want to log out?" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -144,7 +144,7 @@ msgid "Please check your email to verify your account" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:96 | ||||
| #: lib/cannery_web/live/home_live.ex:104 | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -185,7 +185,7 @@ msgid "Adding..." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/add_shot_group_component.ex:68 | ||||
| #: lib/cannery_web/components/add_shot_group_component.ex:56 | ||||
| msgid "Shots recorded successfully" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -263,12 +263,12 @@ msgid "Ammo unstaged succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:88 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:105 | ||||
| msgid "Ammo updated successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:147 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:164 | ||||
| msgid "Ammo added successfully" | ||||
| msgid_plural "Ammo added successfully" | ||||
| msgstr[0] "" | ||||
|   | ||||
| @@ -138,13 +138,13 @@ msgid "Tag could not be added" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log.ex:125 | ||||
| #: lib/cannery/activity_log/shot_group.ex:115 | ||||
| msgid "Count must be at least 1" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log.ex:73 | ||||
| #: lib/cannery/activity_log.ex:120 | ||||
| #: lib/cannery/activity_log/shot_group.ex:74 | ||||
| #: lib/cannery/activity_log/shot_group.ex:111 | ||||
| msgid "Count must be less than %{count}" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -160,11 +160,26 @@ msgid "Tag could not be removed" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:126 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:143 | ||||
| msgid "Could not parse number of copies" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:111 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:128 | ||||
| msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/ammo.ex:407 | ||||
| msgid "Invalid multiplier" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/ammo/ammo_group.ex:84 | ||||
| msgid "Please select an ammo type and container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log/shot_group.ex:69 | ||||
| msgid "Please select a valid user and ammo group" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -77,7 +77,7 @@ msgid "Invite someone new!" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:106 | ||||
| #: lib/cannery_web/components/topbar.ex:112 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:48 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:48 | ||||
| @@ -108,7 +108,7 @@ msgid "New Tag" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:99 | ||||
| #: lib/cannery_web/components/topbar.ex:105 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:25 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||
|   | ||||
| @@ -22,12 +22,12 @@ msgstr "" | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:56 | ||||
| #: lib/cannery_web/live/home_live.ex:64 | ||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:78 | ||||
| #: lib/cannery_web/live/home_live.ex:86 | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -37,12 +37,12 @@ msgid "Admins" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:92 | ||||
| #: lib/cannery_web/live/home_live.ex:100 | ||||
| msgid "Admins:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:56 | ||||
| #: lib/cannery_web/components/topbar.ex:62 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 | ||||
| #: lib/cannery_web/live/range_live/index.ex:80 | ||||
| msgid "Ammo" | ||||
| @@ -120,7 +120,7 @@ msgid "Container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:44 | ||||
| #: lib/cannery_web/components/topbar.ex:50 | ||||
| #: lib/cannery_web/live/container_live/index.ex:36 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:3 | ||||
| msgid "Containers" | ||||
| @@ -163,7 +163,7 @@ msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:53 | ||||
| #: lib/cannery_web/live/home_live.ex:61 | ||||
| msgid "Easy to Use:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -218,7 +218,7 @@ msgid "Incendiary" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:87 | ||||
| #: lib/cannery_web/live/home_live.ex:95 | ||||
| msgid "Instance Information" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -228,12 +228,12 @@ msgid "Invite Disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:118 | ||||
| #: lib/cannery_web/live/home_live.ex:126 | ||||
| msgid "Invite Only" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:69 | ||||
| #: lib/cannery_web/components/topbar.ex:75 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:41 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||
| msgid "Invites" | ||||
| @@ -384,17 +384,17 @@ msgid "Primer type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:117 | ||||
| #: lib/cannery_web/live/home_live.ex:125 | ||||
| msgid "Public Signups" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:65 | ||||
| #: lib/cannery_web/live/home_live.ex:73 | ||||
| msgid "Secure:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:68 | ||||
| #: lib/cannery_web/live/home_live.ex:76 | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -415,7 +415,7 @@ msgid "Show Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:75 | ||||
| #: lib/cannery_web/live/home_live.ex:83 | ||||
| msgid "Simple:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -430,7 +430,7 @@ msgid "Stored in" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:38 | ||||
| #: lib/cannery_web/components/topbar.ex:44 | ||||
| #: lib/cannery_web/live/tag_live/index.ex:32 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:3 | ||||
| msgid "Tags" | ||||
| @@ -447,7 +447,7 @@ msgid "Text color" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| #: lib/cannery_web/live/home_live.ex:52 | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -486,12 +486,12 @@ msgid "Uses left" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:40 | ||||
| #: lib/cannery_web/live/home_live.ex:48 | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.ex:77 | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -501,7 +501,7 @@ msgid "No tags for this container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:62 | ||||
| #: lib/cannery_web/components/topbar.ex:68 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:84 | ||||
| msgid "Range" | ||||
| msgstr "" | ||||
| @@ -857,27 +857,27 @@ msgid "Language" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:139 | ||||
| #: lib/cannery_web/live/home_live.ex:147 | ||||
| msgid "Get involved!" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:156 | ||||
| #: lib/cannery_web/live/home_live.ex:164 | ||||
| msgid "Help translate" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:165 | ||||
| #: lib/cannery_web/live/home_live.ex:173 | ||||
| msgid "Report bugs or request features" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:147 | ||||
| #: lib/cannery_web/live/home_live.ex:155 | ||||
| msgid "View the source code" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:50 | ||||
| #: lib/cannery_web/components/topbar.ex:56 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:3 | ||||
| msgid "Catalog" | ||||
| msgstr "" | ||||
| @@ -912,3 +912,14 @@ msgstr "" | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:27 | ||||
| msgid "Packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:24 | ||||
| #: lib/cannery_web/live/home_live.ex:42 | ||||
| msgid "Cannery logo" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| msgid "isn't he cute >:3" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -149,13 +149,13 @@ msgid "Tag could not be added" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log.ex:125 | ||||
| #: lib/cannery/activity_log/shot_group.ex:115 | ||||
| msgid "Count must be at least 1" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log.ex:73 | ||||
| #: lib/cannery/activity_log.ex:120 | ||||
| #: lib/cannery/activity_log/shot_group.ex:74 | ||||
| #: lib/cannery/activity_log/shot_group.ex:111 | ||||
| msgid "Count must be less than %{count}" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -171,11 +171,26 @@ msgid "Tag could not be removed" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:126 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:143 | ||||
| msgid "Could not parse number of copies" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:111 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:128 | ||||
| msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/ammo.ex:407 | ||||
| msgid "Invalid multiplier" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/ammo/ammo_group.ex:84 | ||||
| msgid "Please select an ammo type and container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log/shot_group.ex:69 | ||||
| msgid "Please select a valid user and ammo group" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -109,7 +109,7 @@ msgid "Are you sure you want to delete your account?" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:84 | ||||
| #: lib/cannery_web/components/topbar.ex:90 | ||||
| msgid "Are you sure you want to log out?" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -154,7 +154,7 @@ msgid "Please check your email to verify your account" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:96 | ||||
| #: lib/cannery_web/live/home_live.ex:104 | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -195,7 +195,7 @@ msgid "Adding..." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/add_shot_group_component.ex:68 | ||||
| #: lib/cannery_web/components/add_shot_group_component.ex:56 | ||||
| msgid "Shots recorded successfully" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -273,12 +273,12 @@ msgid "Ammo unstaged succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:88 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:105 | ||||
| msgid "Ammo updated successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:147 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:164 | ||||
| msgid "Ammo added successfully" | ||||
| msgid_plural "Ammo added successfully" | ||||
| msgstr[0] "" | ||||
|   | ||||
| @@ -79,7 +79,7 @@ msgid "Invite someone new!" | ||||
| msgstr "Invitez une nouvelle personne !" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:106 | ||||
| #: lib/cannery_web/components/topbar.ex:112 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:48 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:48 | ||||
| @@ -110,7 +110,7 @@ msgid "New Tag" | ||||
| msgstr "Nouveau tag" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:99 | ||||
| #: lib/cannery_web/components/topbar.ex:105 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:25 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:42 | ||||
|   | ||||
| @@ -24,14 +24,14 @@ msgstr "" | ||||
| ## date. Leave "msgstr"s empty as changing them here has no | ||||
| ## effect: edit them in PO (.po) files instead. | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:56 | ||||
| #: lib/cannery_web/live/home_live.ex:64 | ||||
| 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" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:78 | ||||
| #: lib/cannery_web/live/home_live.ex:86 | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "Accédez depuis n’importe quel appareil connecté à internet" | ||||
|  | ||||
| @@ -41,12 +41,12 @@ msgid "Admins" | ||||
| msgstr "Administrateur·ices" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:92 | ||||
| #: lib/cannery_web/live/home_live.ex:100 | ||||
| msgid "Admins:" | ||||
| msgstr "Administrateur·ices :" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:56 | ||||
| #: lib/cannery_web/components/topbar.ex:62 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 | ||||
| #: lib/cannery_web/live/range_live/index.ex:80 | ||||
| msgid "Ammo" | ||||
| @@ -124,7 +124,7 @@ msgid "Container" | ||||
| msgstr "Conteneur" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:44 | ||||
| #: lib/cannery_web/components/topbar.ex:50 | ||||
| #: lib/cannery_web/live/container_live/index.ex:36 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:3 | ||||
| msgid "Containers" | ||||
| @@ -167,7 +167,7 @@ msgid "Disable" | ||||
| msgstr "Désactiver" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:53 | ||||
| #: lib/cannery_web/live/home_live.ex:61 | ||||
| msgid "Easy to Use:" | ||||
| msgstr "Simple à utiliser :" | ||||
|  | ||||
| @@ -222,7 +222,7 @@ msgid "Incendiary" | ||||
| msgstr "Incendiaire" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:87 | ||||
| #: lib/cannery_web/live/home_live.ex:95 | ||||
| msgid "Instance Information" | ||||
| msgstr "Information de l’instance" | ||||
|  | ||||
| @@ -232,12 +232,12 @@ msgid "Invite Disabled" | ||||
| msgstr "Invitation désactivée" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:118 | ||||
| #: lib/cannery_web/live/home_live.ex:126 | ||||
| msgid "Invite Only" | ||||
| msgstr "Uniquement sur invitation" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:69 | ||||
| #: lib/cannery_web/components/topbar.ex:75 | ||||
| #: lib/cannery_web/live/invite_live/index.ex:41 | ||||
| #: lib/cannery_web/live/invite_live/index.html.heex:3 | ||||
| msgid "Invites" | ||||
| @@ -388,17 +388,17 @@ msgid "Primer type" | ||||
| msgstr "Type d’amorce" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:117 | ||||
| #: lib/cannery_web/live/home_live.ex:125 | ||||
| msgid "Public Signups" | ||||
| msgstr "Enregistrements publics" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:65 | ||||
| #: lib/cannery_web/live/home_live.ex:73 | ||||
| msgid "Secure:" | ||||
| msgstr "Sécurisé :" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:68 | ||||
| #: lib/cannery_web/live/home_live.ex:76 | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
| "Auto-hébergez votre propre instance ou utilisez celle d’une personne à " | ||||
| @@ -421,7 +421,7 @@ msgid "Show Ammo type" | ||||
| msgstr "Montrer le type de munition" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:75 | ||||
| #: lib/cannery_web/live/home_live.ex:83 | ||||
| msgid "Simple:" | ||||
| msgstr "Simple :" | ||||
|  | ||||
| @@ -436,7 +436,7 @@ msgid "Stored in" | ||||
| msgstr "Est stocké dans" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:38 | ||||
| #: lib/cannery_web/components/topbar.ex:44 | ||||
| #: lib/cannery_web/live/tag_live/index.ex:32 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:3 | ||||
| msgid "Tags" | ||||
| @@ -455,7 +455,7 @@ msgid "Text color" | ||||
| msgstr "Couleur du texte" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| #: lib/cannery_web/live/home_live.ex:52 | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "Le site web de suivi d’arme à feux auto-hébergé" | ||||
|  | ||||
| @@ -494,12 +494,12 @@ msgid "Uses left" | ||||
| msgstr "Utilisations restantes" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:40 | ||||
| #: lib/cannery_web/live/home_live.ex:48 | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "Bienvenue à %{name}" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.ex:77 | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "Vos données restent avec vous, point final" | ||||
|  | ||||
| @@ -509,7 +509,7 @@ msgid "No tags for this container" | ||||
| msgstr "Aucun tag pour ce conteneur" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:62 | ||||
| #: lib/cannery_web/components/topbar.ex:68 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.ex:84 | ||||
| msgid "Range" | ||||
| msgstr "Portée" | ||||
| @@ -865,27 +865,27 @@ msgid "Language" | ||||
| msgstr "Langue" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:139 | ||||
| #: lib/cannery_web/live/home_live.ex:147 | ||||
| msgid "Get involved!" | ||||
| msgstr "Impliquez-vous !" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:156 | ||||
| #: lib/cannery_web/live/home_live.ex:164 | ||||
| msgid "Help translate" | ||||
| msgstr "Aider à la traduction" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:165 | ||||
| #: lib/cannery_web/live/home_live.ex:173 | ||||
| msgid "Report bugs or request features" | ||||
| msgstr "Remonter des bugs ou une demande de fonctionnalité" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:147 | ||||
| #: lib/cannery_web/live/home_live.ex:155 | ||||
| msgid "View the source code" | ||||
| msgstr "Voir le code source" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:50 | ||||
| #: lib/cannery_web/components/topbar.ex:56 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:3 | ||||
| msgid "Catalog" | ||||
| msgstr "" | ||||
| @@ -920,3 +920,14 @@ msgstr "Ce groupe de munition n’est pas dans un conteneur" | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:27 | ||||
| msgid "Packs:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:24 | ||||
| #: lib/cannery_web/live/home_live.ex:42 | ||||
| msgid "Cannery logo" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:44 | ||||
| msgid "isn't he cute >:3" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -153,13 +153,13 @@ msgid "Tag could not be added" | ||||
| msgstr "Le tag n’a pas pu être ajouté" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log.ex:125 | ||||
| #: lib/cannery/activity_log/shot_group.ex:115 | ||||
| msgid "Count must be at least 1" | ||||
| msgstr "Le nombre doit être au moins égal à 1" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log.ex:73 | ||||
| #: lib/cannery/activity_log.ex:120 | ||||
| #: lib/cannery/activity_log/shot_group.ex:74 | ||||
| #: lib/cannery/activity_log/shot_group.ex:111 | ||||
| msgid "Count must be less than %{count}" | ||||
| msgstr "La quantité doit être inférieur à %{count}" | ||||
|  | ||||
| @@ -177,11 +177,26 @@ msgid "Tag could not be removed" | ||||
| msgstr "Le tag n’a pas pu être retiré" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:126 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:143 | ||||
| msgid "Could not parse number of copies" | ||||
| msgstr "Impossible d'analyser le nombre de copies" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:111 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:128 | ||||
| msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}" | ||||
| msgstr "Nombre de copies invalide, doit être 1 et %{max}. Été %{multiplier}" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/ammo.ex:407 | ||||
| msgid "Invalid multiplier" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/ammo/ammo_group.ex:84 | ||||
| msgid "Please select an ammo type and container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/activity_log/shot_group.ex:69 | ||||
| msgid "Please select a valid user and ammo group" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -114,7 +114,7 @@ msgid "Are you sure you want to delete your account?" | ||||
| msgstr "Êtes-vous certain·e de supprimer votre compte ?" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:84 | ||||
| #: lib/cannery_web/components/topbar.ex:90 | ||||
| msgid "Are you sure you want to log out?" | ||||
| msgstr "Êtes-vous certain·e de vouloir vous déconnecter ?" | ||||
|  | ||||
| @@ -163,7 +163,7 @@ msgid "Please check your email to verify your account" | ||||
| msgstr "Veuillez vérifier votre mél pour confirmer votre compte" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:96 | ||||
| #: lib/cannery_web/live/home_live.ex:104 | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "S’enregistrer pour mettre en place %{name}" | ||||
|  | ||||
| @@ -206,7 +206,7 @@ msgid "Adding..." | ||||
| msgstr "Ajout en cours…" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/add_shot_group_component.ex:68 | ||||
| #: lib/cannery_web/components/add_shot_group_component.ex:56 | ||||
| msgid "Shots recorded successfully" | ||||
| msgstr "Tirs enregistré avec succès" | ||||
|  | ||||
| @@ -284,12 +284,12 @@ msgid "Ammo unstaged succesfully" | ||||
| msgstr "Groupe de munition désélectionner avec succès" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:88 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:105 | ||||
| msgid "Ammo updated successfully" | ||||
| msgstr "Groupe de munition mis à jour avec succès" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:147 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:164 | ||||
| msgid "Ammo added successfully" | ||||
| msgid_plural "Ammo added successfully" | ||||
| msgstr[0] "Groupe de munition mis à jour avec succès" | ||||
|   | ||||
| @@ -98,7 +98,7 @@ msgid "Are you sure you want to delete your account?" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:84 | ||||
| #: lib/cannery_web/components/topbar.ex:90 | ||||
| msgid "Are you sure you want to log out?" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -143,7 +143,7 @@ msgid "Please check your email to verify your account" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:96 | ||||
| #: lib/cannery_web/live/home_live.ex:104 | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -184,7 +184,7 @@ msgid "Adding..." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/add_shot_group_component.ex:68 | ||||
| #: lib/cannery_web/components/add_shot_group_component.ex:56 | ||||
| msgid "Shots recorded successfully" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -262,12 +262,12 @@ msgid "Ammo unstaged succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:88 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:105 | ||||
| msgid "Ammo updated successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:147 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.ex:164 | ||||
| msgid "Ammo added successfully" | ||||
| msgid_plural "Ammo added successfully" | ||||
| msgstr[0] "" | ||||
|   | ||||
| @@ -178,10 +178,5 @@ defmodule Cannery.ActivityLogTest do | ||||
|         ActivityLog.get_shot_group!(shot_group.id, current_user) | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     test "change_shot_group/1 returns a shot_group changeset", | ||||
|          %{shot_group: shot_group} do | ||||
|       assert %Ecto.Changeset{} = ActivityLog.change_shot_group(shot_group) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -180,9 +180,5 @@ defmodule Cannery.AmmoTest do | ||||
|         Ammo.get_ammo_group!(ammo_group.id, current_user) | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     test "change_ammo_group/1 returns a ammo_group changeset", %{ammo_group: ammo_group} do | ||||
|       assert %Changeset{} = Ammo.change_ammo_group(ammo_group) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
		Reference in New Issue
	
	Block a user