diff --git a/lib/mv_web/components/core_components.ex b/lib/mv_web/components/core_components.ex index d19b1eb..a23381d 100644 --- a/lib/mv_web/components/core_components.ex +++ b/lib/mv_web/components/core_components.ex @@ -153,7 +153,7 @@ defmodule MvWeb.CoreComponents do aria-haspopup="menu" aria-expanded={@open} aria-controls={@id} - class="btn btn-ghost" + class="btn" phx-click="toggle_dropdown" phx-target={@phx_target} data-testid="dropdown-button" @@ -236,6 +236,30 @@ defmodule MvWeb.CoreComponents do """ end + @doc """ + Renders a section in with a border similar to cards. + + + ## Examples + + <.form_section title={gettext("Personal Data")}> +

input

+ + """ + attr :title, :string, required: true + slot :inner_block, required: true + + def form_section(assigns) do + ~H""" +
+

{@title}

+
+ {render_slot(@inner_block)} +
+
+ """ + end + @doc """ Renders an input with label and error messages. @@ -434,7 +458,7 @@ defmodule MvWeb.CoreComponents do ~H"""
-

+

{render_slot(@inner_block)}

@@ -474,6 +498,7 @@ defmodule MvWeb.CoreComponents do slot :col, required: true do attr :label, :string + attr :class, :string attr :col_click, :any, doc: "optional column-specific click handler that overrides row_click" end @@ -490,7 +515,7 @@ defmodule MvWeb.CoreComponents do - +
{col[:label]}{col[:label]} <.live_component module={MvWeb.Components.SortHeaderComponent} @@ -514,7 +539,34 @@ defmodule MvWeb.CoreComponents do (col[:col_click] && col[:col_click].(@row_item.(row))) || (@row_click && @row_click.(row)) } - class={["max-w-xs truncate", (col[:col_click] || @row_click) && "hover:cursor-pointer"]} + class={ + col_class = Map.get(col, :class) + has_click = col[:col_click] || @row_click + classes = ["max-w-xs"] + + classes = + if col_class == nil || (col_class && !String.contains?(col_class, "text-center")) do + ["truncate" | classes] + else + classes + end + + classes = + if has_click do + ["hover:cursor-pointer" | classes] + else + classes + end + + classes = + if col_class do + [col_class | classes] + else + classes + end + + Enum.join(classes, " ") + } > {render_slot(col, @row_item.(row))} diff --git a/lib/mv_web/live/components/field_visibility_dropdown_component.ex b/lib/mv_web/live/components/field_visibility_dropdown_component.ex index 642273c..5fc0abf 100644 --- a/lib/mv_web/live/components/field_visibility_dropdown_component.ex +++ b/lib/mv_web/live/components/field_visibility_dropdown_component.ex @@ -152,9 +152,25 @@ defmodule MvWeb.Components.FieldVisibilityDropdownComponent do defp field_to_string(field) when is_atom(field), do: Atom.to_string(field) defp field_to_string(field) when is_binary(field), do: field - defp format_field_label(field) do + defp format_field_label(field) when is_atom(field) do + MvWeb.Translations.MemberFields.label(field) + end + + defp format_field_label(field) when is_binary(field) do + case safe_to_existing_atom(field) do + {:ok, atom} -> MvWeb.Translations.MemberFields.label(atom) + :error -> fallback_label(field) + end + end + + defp safe_to_existing_atom(string) do + {:ok, String.to_existing_atom(string)} + rescue + ArgumentError -> :error + end + + defp fallback_label(field) do field - |> field_to_string() |> String.replace("_", " ") |> String.split() |> Enum.map_join(" ", &String.capitalize/1) diff --git a/lib/mv_web/live/components/payment_filter_component.ex b/lib/mv_web/live/components/payment_filter_component.ex index c9dc731..47556dd 100644 --- a/lib/mv_web/live/components/payment_filter_component.ex +++ b/lib/mv_web/live/components/payment_filter_component.ex @@ -44,7 +44,7 @@ defmodule MvWeb.Components.PaymentFilterComponent do - + <.icon name="hero-plus" /> {gettext("New Custom field")} + - + <%!-- Show form when creating or editing --%> +
+ <.live_component + module={MvWeb.CustomFieldLive.FormComponent} + id={@form_id} + custom_field={@editing_custom_field} + on_save={ + fn custom_field, action -> send(self(), {:custom_field_saved, custom_field, action}) end + } + on_cancel={fn -> send_update(__MODULE__, id: @id, show_form: false) end} + /> +
+ + <%!-- Hide table when form is visible --%> + <.table + :if={!@show_form} + id="custom_fields" + rows={@streams.custom_fields} + row_click={ + fn {_id, custom_field} -> + JS.push("edit_custom_field", value: %{id: custom_field.id}, target: @myself) + end + } + > + <:col :let={{_id, custom_field}} label={gettext("Name")}>{custom_field.name} + + <:col :let={{_id, custom_field}} label={gettext("Value Type")}> + {@field_type_label.(custom_field.value_type)} + + + <:col :let={{_id, custom_field}} label={gettext("Description")}> + {custom_field.description} + + + <:col + :let={{_id, custom_field}} + label={gettext("Show in overview")} + class="max-w-[9.375rem] text-center" + > + + {gettext("Yes")} + + + {gettext("No")} + + + + <:action :let={{_id, custom_field}}> + <.link phx-click={ + JS.push("edit_custom_field", value: %{id: custom_field.id}, target: @myself) + }> + {gettext("Edit")} + + + + <:action :let={{_id, custom_field}}> + <.link phx-click={ + JS.push("prepare_delete", value: %{id: custom_field.id}, target: @myself) + }> + {gettext("Delete")} + + + + + <%!-- Delete Confirmation Modal --%> + + + + """ end diff --git a/lib/mv_web/live/global_settings_live.ex b/lib/mv_web/live/global_settings_live.ex index bb919cb..0b3ec1c 100644 --- a/lib/mv_web/live/global_settings_live.ex +++ b/lib/mv_web/live/global_settings_live.ex @@ -46,22 +46,22 @@ defmodule MvWeb.GlobalSettingsLive do <%!-- Club Settings Section --%> - <.header> - {gettext("Club Settings")} - - <.form for={@form} id="settings-form" phx-change="validate" phx-submit="save"> - <.input - field={@form[:club_name]} - type="text" - label={gettext("Association Name")} - required - /> - - <.button phx-disable-with={gettext("Saving...")} variant="primary"> - {gettext("Save Settings")} - - + <.form_section title={gettext("Club Settings")}> + <.form for={@form} id="settings-form" phx-change="validate" phx-submit="save"> +
+ <.input + field={@form[:club_name]} + type="text" + label={gettext("Association Name")} + required + /> +
+ <.button phx-disable-with={gettext("Saving...")} variant="primary"> + {gettext("Save Settings")} + + + <%!-- Custom Fields Section --%> <.live_component module={MvWeb.CustomFieldLive.IndexComponent} diff --git a/lib/mv_web/live/member_live/form.ex b/lib/mv_web/live/member_live/form.ex index 5380d0f..87148ad 100644 --- a/lib/mv_web/live/member_live/form.ex +++ b/lib/mv_web/live/member_live/form.ex @@ -348,25 +348,6 @@ defmodule MvWeb.MemberLive.Form do defp return_path("show", nil), do: ~p"/members" defp return_path("show", member), do: ~p"/members/#{member.id}" - # ----------------------------------------------------------------- - # Helper Components - # ----------------------------------------------------------------- - - # Renders a form section box with border and title. - attr :title, :string, required: true - slot :inner_block, required: true - - defp form_section(assigns) do - ~H""" -
-

{@title}

-
- {render_slot(@inner_block)} -
-
- """ - end - # ----------------------------------------------------------------- # Helper Functions for Custom Fields # ----------------------------------------------------------------- diff --git a/lib/mv_web/translations/field_types.ex b/lib/mv_web/translations/field_types.ex new file mode 100644 index 0000000..969f20b --- /dev/null +++ b/lib/mv_web/translations/field_types.ex @@ -0,0 +1,21 @@ +defmodule MvWeb.Translations.FieldTypes do + @moduledoc """ + Helper module to dynamically translate field types. + + ## Features + - Can be used in templates to dynamically translate technical field type words to human friendly text + + ## Example + assigns = assign(assigns, :field_type_label, &MvWeb.Translations.FieldTypes.label/1) + In template: + <%= @field_type_label.(custom_field.value_type) %> + """ + use Gettext, backend: MvWeb.Gettext + + @spec label(atom()) :: String.t() + def label(:string), do: gettext("Text") + def label(:integer), do: gettext("Number") + def label(:boolean), do: gettext("Yes/No-Selection") + def label(:date), do: gettext("Date") + def label(:email), do: gettext("E-Mail") +end diff --git a/lib/mv_web/translations/member_fields.ex b/lib/mv_web/translations/member_fields.ex new file mode 100644 index 0000000..3750bcb --- /dev/null +++ b/lib/mv_web/translations/member_fields.ex @@ -0,0 +1,41 @@ +defmodule MvWeb.Translations.MemberFields do + @moduledoc """ + Helper module to dynamically translate member field names. + + ## Features + - Translates technical field names (atoms) to human-friendly localized text + - Used primarily in the field visibility dropdown component + + ## Example + + iex> MvWeb.Translations.MemberFields.label(:first_name) + "Vorname" # when locale is "de" + + iex> MvWeb.Translations.MemberFields.label(:first_name) + "First Name" # when locale is "en" + """ + use Gettext, backend: MvWeb.Gettext + + @spec label(atom()) :: String.t() + def label(:first_name), do: gettext("First Name") + def label(:last_name), do: gettext("Last Name") + def label(:email), do: gettext("Email") + def label(:paid), do: gettext("Paid") + def label(:phone_number), do: gettext("Phone") + def label(:join_date), do: gettext("Join Date") + def label(:exit_date), do: gettext("Exit Date") + def label(:notes), do: gettext("Notes") + def label(:city), do: gettext("City") + def label(:street), do: gettext("Street") + def label(:house_number), do: gettext("House Number") + def label(:postal_code), do: gettext("Postal Code") + + # Fallback for unknown fields + def label(field) do + field + |> to_string() + |> String.replace("_", " ") + |> String.split() + |> Enum.map_join(" ", &String.capitalize/1) + end +end diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index bb781f7..25f685d 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -29,6 +29,7 @@ msgstr "Verbindung wird wiederhergestellt" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "City" msgstr "Stadt" @@ -48,7 +49,7 @@ msgstr "Löschen" #: lib/mv_web/live/user_live/index.html.heex #, elixir-autogen, elixir-format msgid "Edit" -msgstr "Bearbeite" +msgstr "Bearbeiten" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex @@ -63,12 +64,14 @@ msgstr "Mitglied bearbeiten" #: lib/mv_web/live/user_live/form.ex #: lib/mv_web/live/user_live/index.html.heex #: lib/mv_web/live/user_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Email" msgstr "E-Mail" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "First Name" msgstr "Vorname" @@ -76,12 +79,14 @@ msgstr "Vorname" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Join Date" msgstr "Beitrittsdatum" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Last Name" msgstr "Nachname" @@ -115,11 +120,13 @@ msgstr "schließen" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Exit Date" msgstr "Austrittsdatum" #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "House Number" msgstr "Hausnummer" @@ -127,6 +134,7 @@ msgstr "Hausnummer" #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Notes" msgstr "Notizen" @@ -136,6 +144,7 @@ msgstr "Notizen" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Paid" msgstr "Bezahlt" @@ -147,6 +156,7 @@ msgstr "Telefonnummer" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Postal Code" msgstr "Postleitzahl" @@ -167,6 +177,7 @@ msgstr "Speichern..." #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Street" msgstr "Straße" @@ -214,7 +225,7 @@ msgstr "Falsche E-Mail oder Passwort" #: lib/mv_web/live/member_live/form.ex #, elixir-autogen, elixir-format msgid "Member %{action} successfully" -msgstr "Mitglied %{action} erfolgreich" +msgstr "Mitglied wurde erfolgreich %{action}" #: lib/mv_web/controllers/auth_controller.ex #, elixir-autogen, elixir-format @@ -418,9 +429,9 @@ msgid "Admin Note" msgstr "Administrator*innen-Hinweis" #: lib/mv_web/live/user_live/form.ex -#, elixir-autogen, elixir-format +#, elixir-autogen, elixir-format, fuzzy msgid "As an administrator, you can directly set a new password for this user using the same secure Ash Authentication system." -msgstr "Als Administrator*in können Sie direkt ein neues Passwort für diese*n Benutzer*in setzen, wobei das gleiche sichere Ash Authentication System verwendet wird." +msgstr "Als Administrator*in können Sie direkt ein neues Passwort für diese*n Benutzer*in setzen." #: lib/mv_web/live/user_live/form.ex #, elixir-autogen, elixir-format @@ -656,9 +667,10 @@ msgid "To confirm deletion, please enter this text:" msgstr "Um die Löschung zu bestätigen, gib bitte folgenden Text ein:" #: lib/mv_web/live/custom_field_live/form_component.ex +#: lib/mv_web/live/custom_field_live/index_component.ex #, elixir-autogen, elixir-format msgid "Show in overview" -msgstr "In der Mitglieder-Übersicht anzeigen" +msgstr "In Übersicht anzeigen" #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format @@ -869,6 +881,7 @@ msgstr "Persönliche Daten" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Phone" msgstr "Telefon" @@ -904,96 +917,96 @@ msgstr "Mitglied erstellen" #, elixir-autogen, elixir-format msgid "%{count} period selected" msgid_plural "%{count} periods selected" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%{count} Zyklus ausgewählt" +msgstr[1] "%{count} Zyklen ausgewählt" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "About Contribution Types" -msgstr "" +msgstr "Über Beitragsarten" #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Amount" -msgstr "" +msgstr "Betrag" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Back to Settings" -msgstr "" +msgstr "Zurück zu den Einstellungen" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Can be changed at any time. Amount changes affect future periods only." -msgstr "" +msgstr "Kann jederzeit geändert werden. Änderungen des Betrags betreffen nur zukünftige Zyklen." #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Cannot delete - members assigned" -msgstr "" +msgstr "Löschen nicht möglich – es sind Mitglieder zugewiesen" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Change Contribution Type" -msgstr "" +msgstr "Beitragsart ändern" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Configure global settings for membership contributions." -msgstr "" +msgstr "Globale Einstellungen für Mitgliedsbeiträge konfigurieren." #: lib/mv_web/components/layouts/navbar.ex #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format, fuzzy msgid "Contribution Settings" -msgstr "Beitrag" +msgstr "Beitragseinstellungen" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format, fuzzy msgid "Contribution Start" -msgstr "Beitrag" +msgstr "Beitragsbeginn" #: lib/mv_web/components/layouts/navbar.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format, fuzzy msgid "Contribution Types" -msgstr "Beitrag" +msgstr "Beitragsarten" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format, fuzzy msgid "Contribution start" -msgstr "Beitrag" +msgstr "Beitragsbeginn" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format, fuzzy msgid "Contribution type" -msgstr "Beitrag" +msgstr "Beitragsart" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Contribution types define different membership fee structures. Each type has a fixed interval (monthly, quarterly, half-yearly, yearly) that cannot be changed after creation." -msgstr "" +msgstr "Beitragsarten definieren verschiedene Beitragsmodelle. Jede Art hat einen festen Zyklus (monatlich, vierteljährlich, halbjährlich, jährlich), der nach Erstellung nicht mehr geändert werden kann." #: lib/mv_web/components/layouts/navbar.ex #, elixir-autogen, elixir-format, fuzzy msgid "Contributions" -msgstr "Beitrag" +msgstr "Beiträge" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format, fuzzy msgid "Contributions for %{name}" -msgstr "Beitrag" +msgstr "Beiträge für %{name}" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Current" -msgstr "" +msgstr "Aktuell" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Default Contribution Type" -msgstr "" +msgstr "Standard-Beitragsart" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format, fuzzy @@ -1003,28 +1016,28 @@ msgstr "Löschen" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Example: Member Contribution View" -msgstr "" +msgstr "Beispiel: Ansicht Mitgliedsbeiträge" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Examples" -msgstr "" +msgstr "Beispiele" #: lib/mv_web/live/contribution_settings_live.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Family" -msgstr "" +msgstr "Familie" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Fixed after creation. Members can only switch between types with the same interval." -msgstr "" +msgstr "Festgelegt nach der Erstellung. Mitglieder können nur zwischen Beitragsarten mit gleichem Intervall wechseln." #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Generated periods" -msgstr "" +msgstr "Generierte Zyklen" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format, fuzzy @@ -1036,29 +1049,29 @@ msgstr "Vereinsdaten" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Half-yearly" -msgstr "" +msgstr "Halbjährlich" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Half-yearly contribution for supporting members" -msgstr "" +msgstr "Halbjährlicher Beitrag für Fördermitglieder" #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Honorary" -msgstr "" +msgstr "Ehrenamtlich" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Include joining period" -msgstr "" +msgstr "Beitrittsdatum einbeziehen" #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Interval" -msgstr "" +msgstr "Zyklus" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format, fuzzy @@ -1068,240 +1081,240 @@ msgstr "Beitrittsdatum" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Joining year - reduced to 0" -msgstr "" +msgstr "Beitrittsjahr – auf 0 reduziert" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Manage contribution types for membership fees." -msgstr "" +msgstr "Beitragsarten für Mitgliedsbeiträge verwalten." #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Mark as Paid" -msgstr "" +msgstr "Als bezahlt markieren" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Mark as Suspended" -msgstr "" +msgstr "Als pausiert markieren" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Mark as Unpaid" -msgstr "" +msgstr "Als unbezahlt markieren" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Member Contributions" -msgstr "" +msgstr "Mitgliedsbeiträge" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Member pays for the year they joined" -msgstr "" +msgstr "Mitglied zahlt für das Beitrittsjahr" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Member pays from the joining month" -msgstr "" +msgstr "Mitglied zahlt ab Beitrittsmonat" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Member pays from the next full quarter" -msgstr "" +msgstr "Mitglied zahlt ab dem nächsten vollständigen Quartal" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Member pays from the next full year" -msgstr "" +msgstr "Mitglied zahlt ab dem nächsten vollständigen Jahr" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format, fuzzy msgid "Member since" -msgstr "Mitglieder" +msgstr "Mitglied seit" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Members can only switch between contribution types with the same payment interval (e.g., yearly to yearly). This prevents complex period overlaps." -msgstr "" +msgstr "Mitglieder können nur zwischen Beitragsarten mit demselben Zahlungszyklus wechseln (z. B. jährlich zu jährlich). Dadurch werden komplexe Überlappungen vermieden." #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/contribution_settings_live.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format, fuzzy msgid "Monthly" -msgstr "monatlich" +msgstr "Monatlich" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Monthly Interval - Joining Period Included" -msgstr "" +msgstr "Monatliches Intervall – Beitrittszeitraum einbezogen" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Monthly fee for students and trainees" -msgstr "" +msgstr "Monatlicher Beitrag für Studierende und Auszubildende" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Name & Amount" -msgstr "" +msgstr "Name & Betrag" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format, fuzzy msgid "New Contribution Type" -msgstr "Beitrag" +msgstr "Neue Beitragsart" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "No fee for honorary members" -msgstr "" +msgstr "Kein Beitrag für ehrenamtliche Mitglieder" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Only possible if no members are assigned to this type." -msgstr "" +msgstr "Nur möglich, wenn diesem Typ keine Mitglieder zugewiesen sind." #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Open Contributions" -msgstr "" +msgstr "Offene Beiträge" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Paid via bank transfer" -msgstr "" +msgstr "Bezahlt durch Überweisung" #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/contribution_settings_live.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Preview Mockup" -msgstr "" +msgstr "Vorschau" #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/contribution_settings_live.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Quarterly" -msgstr "" +msgstr "Vierteljährlich" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Quarterly Interval - Joining Period Excluded" -msgstr "" +msgstr "Vierteljährliches Intervall – Beitrittszeitraum nicht einbezogen" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Quarterly fee for family memberships" -msgstr "" +msgstr "Vierteljährlicher Beitrag für Familienmitgliedschaften" #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/contribution_settings_live.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Reduced" -msgstr "" +msgstr "Reduziert" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Reduced fee for unemployed, pensioners, or low income" -msgstr "" +msgstr "Ermäßigter Beitrag für Arbeitslose, Rentner*innen oder Geringverdienende" #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/contribution_settings_live.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Regular" -msgstr "" +msgstr "Regulär" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Reopen" -msgstr "" +msgstr "Wieder öffnen" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "See how the contribution periods will be displayed for an individual member. This example shows Maria Weber with multiple contribution periods." -msgstr "" +msgstr "Beispielhafte Anzeige der Beitragsperioden für ein einzelnes Mitglied. In diesem Beispiel wird Maria Weber mit mehreren Zyklen angezeigt." #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Standard membership fee for regular members" -msgstr "" +msgstr "Regulärer Mitgliedsbeitrag für Vollmitglieder" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Status" -msgstr "" +msgstr "Status" #: lib/mv_web/live/contribution_settings_live.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Student" -msgstr "" +msgstr "Student" #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "Supporting Member" -msgstr "" +msgstr "Fördermitglied" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Suspend" -msgstr "" +msgstr "Pausieren" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Suspended" -msgstr "" +msgstr "Pausiert" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "This contribution type is automatically assigned to all new members. Can be changed individually per member." -msgstr "" +msgstr "Dieser Beitragstyp wird automatisch neuen Mitgliedern zugewiesen. Kann individuell angepasst werden." #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/contribution_settings_live.ex #: lib/mv_web/live/contribution_type_live/index.ex #, elixir-autogen, elixir-format msgid "This page is not functional and only displays the planned features." -msgstr "" +msgstr "Diese Seite ist nicht funktionsfähig und zeigt nur geplante Funktionen." #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Time Period" -msgstr "" +msgstr "Zeitraum" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Total Contributions" -msgstr "" +msgstr "Gesamtbeiträge" #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Unpaid" -msgstr "" +msgstr "Unbezahlt" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "View Example Member" -msgstr "" +msgstr "Beispielmitglied anzeigen" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "When active: Members pay from the period of their joining." -msgstr "" +msgstr "Wenn aktiviert: Mitglieder zahlen ab dem Zeitraum ihres Beitritts." #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "When inactive: Members pay from the next full period after joining." -msgstr "" +msgstr "Wenn deaktiviert: Mitglieder zahlen ab dem nächsten vollen Beitragszyklus nach dem Beitritt." #: lib/mv_web/live/contribution_period_live/show.ex #, elixir-autogen, elixir-format msgid "Why are not all contribution types shown?" -msgstr "" +msgstr "Warum werden nicht alle Beitragsarten angezeigt?" #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/contribution_settings_live.ex @@ -1313,12 +1326,12 @@ msgstr "jährlich" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Yearly Interval - Joining Period Excluded" -msgstr "" +msgstr "Jährliches Intervall – Beitrittszeitraum nicht einbezogen" #: lib/mv_web/live/contribution_settings_live.ex #, elixir-autogen, elixir-format msgid "Yearly Interval - Joining Period Included" -msgstr "" +msgstr "Jährliches Intervall – Beitrittszeitraum einbezogen" #: lib/mv_web/live/components/field_visibility_dropdown_component.ex #, elixir-autogen, elixir-format @@ -1363,7 +1376,7 @@ msgstr "Zurück zur Felderliste" #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format, fuzzy msgid "Custom field deleted successfully" -msgstr "Benutzerdefiniertes Feld erfolgreich %{action}" +msgstr "Benutzerdefiniertes Feld erfolgreich gelöscht" #: lib/mv_web/live/custom_field_live/form_component.ex #, elixir-autogen, elixir-format, fuzzy @@ -1385,11 +1398,6 @@ msgstr "Benutzerdefiniertes Feld speichern" msgid "New Custom field" msgstr "Benutzerdefiniertes Feld speichern" -#: lib/mv_web/live/custom_field_live/index_component.ex -#, elixir-autogen, elixir-format, fuzzy -msgid "Show in Overview" -msgstr "In der Mitglieder-Übersicht anzeigen" - #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format msgid "Slug does not match. Deletion cancelled." @@ -1405,6 +1413,31 @@ msgstr "Diese Felder können zusätzlich zu den normalen Daten ausgefüllt werde msgid "Value Type" msgstr "Wertetyp" +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Date" +msgstr "Datum" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "E-Mail" +msgstr "E-Mail" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Number" +msgstr "Zahl" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Text" +msgstr "Textfeld" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Yes/No-Selection" +msgstr "Ja/Nein-Auswahl" + #~ #: lib/mv_web/live/custom_field_live/show.ex #~ #, elixir-autogen, elixir-format #~ msgid "Auto-generated identifier (immutable)" @@ -1450,6 +1483,11 @@ msgstr "Wertetyp" #~ msgid "OIDC ID" #~ msgstr "OIDC ID" +#~ #: lib/mv_web/live/custom_field_live/index_component.ex +#~ #, elixir-autogen, elixir-format, fuzzy +#~ msgid "Show in Overview" +#~ msgstr "In der Mitglieder-Übersicht anzeigen" + #~ #: lib/mv_web/live/member_live/show.ex #~ #, elixir-autogen, elixir-format #~ msgid "This is a member record from your database." diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 7581d62..a7ab36b 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -30,6 +30,7 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "City" msgstr "" @@ -64,12 +65,14 @@ msgstr "" #: lib/mv_web/live/user_live/form.ex #: lib/mv_web/live/user_live/index.html.heex #: lib/mv_web/live/user_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Email" msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "First Name" msgstr "" @@ -77,12 +80,14 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Join Date" msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Last Name" msgstr "" @@ -116,11 +121,13 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Exit Date" msgstr "" #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "House Number" msgstr "" @@ -128,6 +135,7 @@ msgstr "" #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Notes" msgstr "" @@ -137,6 +145,7 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Paid" msgstr "" @@ -148,6 +157,7 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Postal Code" msgstr "" @@ -168,6 +178,7 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Street" msgstr "" @@ -657,6 +668,7 @@ msgid "To confirm deletion, please enter this text:" msgstr "" #: lib/mv_web/live/custom_field_live/form_component.ex +#: lib/mv_web/live/custom_field_live/index_component.ex #, elixir-autogen, elixir-format msgid "Show in overview" msgstr "" @@ -870,6 +882,7 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Phone" msgstr "" @@ -1386,11 +1399,6 @@ msgstr "" msgid "New Custom field" msgstr "" -#: lib/mv_web/live/custom_field_live/index_component.ex -#, elixir-autogen, elixir-format -msgid "Show in Overview" -msgstr "" - #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format msgid "Slug does not match. Deletion cancelled." @@ -1405,3 +1413,28 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Value Type" msgstr "" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Date" +msgstr "" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "E-Mail" +msgstr "" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Number" +msgstr "" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Text" +msgstr "" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Yes/No-Selection" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index dc86840..e2a1876 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -30,6 +30,7 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "City" msgstr "" @@ -64,12 +65,14 @@ msgstr "" #: lib/mv_web/live/user_live/form.ex #: lib/mv_web/live/user_live/index.html.heex #: lib/mv_web/live/user_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Email" msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "First Name" msgstr "" @@ -77,12 +80,14 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Join Date" msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Last Name" msgstr "" @@ -116,11 +121,13 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Exit Date" msgstr "" #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "House Number" msgstr "" @@ -128,6 +135,7 @@ msgstr "" #: lib/mv_web/live/contribution_period_live/show.ex #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Notes" msgstr "" @@ -137,6 +145,7 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Paid" msgstr "" @@ -148,6 +157,7 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Postal Code" msgstr "" @@ -168,6 +178,7 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/index.html.heex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Street" msgstr "" @@ -198,14 +209,14 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #, elixir-autogen, elixir-format msgid "create" -msgstr "" +msgstr "created" #: lib/mv_web/live/custom_field_live/form_component.ex #: lib/mv_web/live/custom_field_value_live/form.ex #: lib/mv_web/live/member_live/form.ex #, elixir-autogen, elixir-format msgid "update" -msgstr "" +msgstr "updated" #: lib/mv_web/controllers/auth_controller.ex #, elixir-autogen, elixir-format @@ -657,6 +668,7 @@ msgid "To confirm deletion, please enter this text:" msgstr "" #: lib/mv_web/live/custom_field_live/form_component.ex +#: lib/mv_web/live/custom_field_live/index_component.ex #, elixir-autogen, elixir-format msgid "Show in overview" msgstr "" @@ -870,6 +882,7 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex #: lib/mv_web/live/member_live/show.ex +#: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format, fuzzy msgid "Phone" msgstr "" @@ -1386,11 +1399,6 @@ msgstr "" msgid "New Custom field" msgstr "" -#: lib/mv_web/live/custom_field_live/index_component.ex -#, elixir-autogen, elixir-format, fuzzy -msgid "Show in Overview" -msgstr "" - #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format msgid "Slug does not match. Deletion cancelled." @@ -1406,6 +1414,31 @@ msgstr "" msgid "Value Type" msgstr "" +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Date" +msgstr "" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "E-Mail" +msgstr "" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Number" +msgstr "" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Text" +msgstr "" + +#: lib/mv_web/translations/field_types.ex +#, elixir-autogen, elixir-format +msgid "Yes/No-Selection" +msgstr "" + #~ #: lib/mv_web/live/custom_field_live/show.ex #~ #, elixir-autogen, elixir-format #~ msgid "Auto-generated identifier (immutable)" @@ -1449,6 +1482,11 @@ msgstr "" #~ msgid "OIDC ID" #~ msgstr "" +#~ #: lib/mv_web/live/custom_field_live/index_component.ex +#~ #, elixir-autogen, elixir-format, fuzzy +#~ msgid "Show in Overview" +#~ msgstr "" + #~ #: lib/mv_web/live/member_live/show.ex #~ #, elixir-autogen, elixir-format #~ msgid "This is a member record from your database." diff --git a/test/mv_web/member_live/index_test.exs b/test/mv_web/member_live/index_test.exs index 9e3323f..30b61c7 100644 --- a/test/mv_web/member_live/index_test.exs +++ b/test/mv_web/member_live/index_test.exs @@ -51,7 +51,7 @@ defmodule MvWeb.MemberLive.IndexTest do |> render_submit() |> follow_redirect(conn, "/members") - assert has_element?(index_view, "#flash-group", "Mitglied erstellt erfolgreich") + assert has_element?(index_view, "#flash-group", "Mitglied wurde erfolgreich erstellt") end test "shows translated flash message after creating a member in English", %{conn: conn} do @@ -71,7 +71,7 @@ defmodule MvWeb.MemberLive.IndexTest do |> render_submit() |> follow_redirect(conn, "/members") - assert has_element?(index_view, "#flash-group", "Member create successfully") + assert has_element?(index_view, "#flash-group", "Member created successfully") end describe "sorting integration" do