diff --git a/CHANGELOG.md b/CHANGELOG.md
index adbe7e7..3c0339a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **CSV import – membership fee type column** – A `Fee Type`/`Beitragsart` column assigns each member's membership fee type; an unknown name falls back to the default fee type and is flagged in the preview with a link to create it.
- **CSV import – mapping preview** – After uploading a file, a preview shows how every column maps (with sample rows and warnings for ignored or unknown columns) and the import only starts once you confirm.
- **Dynamic CSV import templates** – The EN and DE import-template downloads now include the association's current custom fields instead of a fixed column set.
+- **Deactivate and reactivate members** – Members can be deactivated directly from the member page: a dialog picks the exit date (prefilled to today, future dates allowed); deactivated members can be reactivated, which clears the exit date.
+- **Tooltips and OIDC explanation** – Icon-only action buttons (including the Vereinfacht sync control) now carry tooltips and accessible labels, and the OIDC settings section explains that it enables single sign-on.
### Changed
- **Member bulk actions in one menu** – The actions above the member overview (open in email program, copy email addresses, export to CSV, export to PDF) are now collected in a single "Aktionen" dropdown instead of separate buttons. Without a selection they apply to all members, or to the currently filtered members; the trigger shows the active scope. Opening the email program is disabled when too many recipients are selected, with a hint to copy the addresses or use the export instead.
@@ -24,6 +26,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- **CSV date round-trip** – Date custom-field values are now exported as ISO-8601 (`YYYY-MM-DD`), so an exported CSV can be re-imported without date-parsing errors.
- **CSV import – fee-status columns ignored** – Columns such as `Bezahlstatus` / `Membership Fee Status` are always ignored on import and never stored as a custom-field value, even when a custom field of the same name exists.
+- **Column-header tooltips clipped** – Tooltips on the members-overview column headers are no longer clipped by the sticky table header.
+- **Text selection opens member** – Dragging to select text in a members-overview row (for example to copy an email) no longer opens the member details; a plain click still opens them.
## [1.2.0] - 2026-05-08
diff --git a/assets/js/app.js b/assets/js/app.js
index 4c7e3c5..a003e27 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -103,6 +103,29 @@ Hooks.TableRowKeydown = {
}
}
+// RowSelectionGuard: distinguish drag-to-select-text from a plain click on the members table.
+// LiveView fires the row navigation push (select_row_and_navigate) on any click. When the user
+// drags across a cell to select text (e.g. an email to copy) and releases, the mouseup produces a
+// non-empty text selection; in that case we swallow the click in the capture phase so navigation is
+// suppressed. A plain click leaves the selection collapsed and navigates as before.
+Hooks.RowSelectionGuard = {
+ mounted() {
+ this.handleClickCapture = (e) => {
+ const selection = window.getSelection()
+ if (selection && !selection.isCollapsed && selection.toString().trim() !== "") {
+ e.preventDefault()
+ e.stopPropagation()
+ }
+ }
+ // Capture phase so this runs before LiveView's bubbling phx-click handler.
+ this.el.addEventListener("click", this.handleClickCapture, true)
+ },
+
+ destroyed() {
+ this.el.removeEventListener("click", this.handleClickCapture, true)
+ }
+}
+
// FocusRestore hook: WCAG 2.4.3 — when a modal closes, focus returns to the trigger element (e.g. "Delete member" button)
Hooks.FocusRestore = {
mounted() {
diff --git a/lib/mv_web/components/core_components.ex b/lib/mv_web/components/core_components.ex
index 13c69a8..2ed22fd 100644
--- a/lib/mv_web/components/core_components.ex
+++ b/lib/mv_web/components/core_components.ex
@@ -1160,17 +1160,21 @@ defmodule MvWeb.CoreComponents do
end
# Combines column class with optional sticky header classes (desktop only; theme-friendly bg).
+ # hover:z-20/focus-within:z-20 lift the active header cell above sibling sticky cells (shared z-10)
+ # so its hover tooltip bubble is not clipped by an adjacent opaque bg-base-100 header background.
defp table_th_class(col, sticky_header) do
base = Map.get(col, :class)
- sticky = if sticky_header, do: "lg:sticky lg:top-0 bg-base-100 z-10", else: nil
+ sticky = if sticky_header, do: sticky_th_classes(), else: nil
[base, sticky] |> Enum.filter(& &1) |> Enum.join(" ")
end
- defp table_th_sticky_class(true),
- do: "lg:sticky lg:top-0 bg-base-100 z-10"
+ defp table_th_sticky_class(true), do: sticky_th_classes()
defp table_th_sticky_class(_), do: nil
+ defp sticky_th_classes,
+ do: "lg:sticky lg:top-0 bg-base-100 z-10 hover:z-20 focus-within:z-20"
+
@doc """
Renders a reorderable table (sortable list) with drag handle and keyboard support.
diff --git a/lib/mv_web/helpers/ash_error_helpers.ex b/lib/mv_web/helpers/ash_error_helpers.ex
new file mode 100644
index 0000000..2b9f2ae
--- /dev/null
+++ b/lib/mv_web/helpers/ash_error_helpers.ex
@@ -0,0 +1,34 @@
+defmodule MvWeb.Helpers.AshErrorHelpers do
+ @moduledoc """
+ Shared formatting for Ash errors surfaced as flash messages in the
+ member show LiveComponents.
+
+ Centralizes the translation of `Ash.Error.Invalid` / `Ash.Error.Forbidden`
+ (and plain string/unknown errors) into user-facing text so the components do
+ not each carry their own copy.
+ """
+ use Gettext, backend: MvWeb.Gettext
+
+ @doc """
+ Turns an Ash error into a human-readable, localized string.
+
+ - `Ash.Error.Invalid` — joins the individual error messages, falling back to
+ `inspect/1` for sub-errors that carry no `:message`.
+ - `Ash.Error.Forbidden` — a localized "not allowed" message.
+ - a binary — passed through unchanged (already a ready-to-show message).
+ - anything else — a localized generic error message.
+ """
+ def format_error(%Ash.Error.Invalid{errors: errors}) do
+ Enum.map_join(errors, ", ", fn
+ %{message: message} -> message
+ other -> inspect(other)
+ end)
+ end
+
+ def format_error(%Ash.Error.Forbidden{}) do
+ gettext("You are not allowed to perform this action.")
+ end
+
+ def format_error(error) when is_binary(error), do: error
+ def format_error(_error), do: gettext("An error occurred")
+end
diff --git a/lib/mv_web/live/global_settings_live.ex b/lib/mv_web/live/global_settings_live.ex
index 6a456fe..735c165 100644
--- a/lib/mv_web/live/global_settings_live.ex
+++ b/lib/mv_web/live/global_settings_live.ex
@@ -586,15 +586,25 @@ defmodule MvWeb.GlobalSettingsLive do
>
{gettext("Test Integration")}
- <.button
+ <.tooltip
:if={Mv.Config.vereinfacht_configured?()}
- type="button"
- variant="secondary"
- phx-click="sync_vereinfacht_contacts"
- phx-disable-with={gettext("Syncing...")}
+ content={
+ gettext(
+ "Creates a Vereinfacht finance contact for every member that does not have one yet."
+ )
+ }
+ position="top"
>
- {gettext("Sync all members without Vereinfacht contact")}
-
+ <.button
+ type="button"
+ variant="secondary"
+ phx-click="sync_vereinfacht_contacts"
+ phx-disable-with={gettext("Syncing...")}
+ aria-label={gettext("Sync all members without Vereinfacht contact")}
+ >
+ {gettext("Sync all members without Vereinfacht contact")}
+
+
<%= if @vereinfacht_test_result do %>
<.vereinfacht_test_result result={@vereinfacht_test_result} />
@@ -646,6 +656,11 @@ defmodule MvWeb.GlobalSettingsLive do
{gettext("OIDC (Single Sign-On)")}
+
+ {gettext(
+ "OIDC enables Single Sign-On: once configured, members sign in through your identity provider instead of a separate Mila password."
+ )}
+
<%= if @oidc_env_configured do %>
{gettext("Some values are set via environment variables. Those fields are read-only.")}
diff --git a/lib/mv_web/live/group_live/show.ex b/lib/mv_web/live/group_live/show.ex
index 7cd4378..ad24110 100644
--- a/lib/mv_web/live/group_live/show.ex
+++ b/lib/mv_web/live/group_live/show.ex
@@ -250,17 +250,19 @@ defmodule MvWeb.GroupLive.Show do
<% end %>
- <.button
- type="button"
- variant="primary"
- phx-click="add_selected_members"
- data-testid="group-show-add-selected-members-btn"
- disabled={Enum.empty?(@selected_member_ids)}
- aria-label={gettext("Add members")}
- class="join-item"
- >
- <.icon name="hero-plus" class="size-5" />
-
+ <.tooltip content={gettext("Add members")} position="top">
+ <.button
+ type="button"
+ variant="primary"
+ phx-click="add_selected_members"
+ data-testid="group-show-add-selected-members-btn"
+ disabled={Enum.empty?(@selected_member_ids)}
+ aria-label={gettext("Add members")}
+ class="join-item"
+ >
+ <.icon name="hero-plus" class="size-5" />
+
+
<.button
type="button"
variant="neutral"
diff --git a/lib/mv_web/live/member_live/index.html.heex b/lib/mv_web/live/member_live/index.html.heex
index cd2ef32..eb7085d 100644
--- a/lib/mv_web/live/member_live/index.html.heex
+++ b/lib/mv_web/live/member_live/index.html.heex
@@ -82,6 +82,8 @@
<%!-- On desktop (lg:), only the table area scrolls; header and filters stay visible. On mobile, normal flow. --%>
<% end %>
+ <%!-- Deactivate/reactivate sub-flow (gated on :update, owns its own modal) --%>
+ <.live_component
+ module={MvWeb.MemberLive.Show.DeactivateComponent}
+ id="member-deactivate"
+ member={@member}
+ current_user={@current_user}
+ />
+
<%!-- Danger zone: same section pattern as section_box (h2 outside border) --%>
<%= if can?(@current_user, :destroy, @member) do %>
diff --git a/lib/mv_web/live/member_live/show/deactivate_component.ex b/lib/mv_web/live/member_live/show/deactivate_component.ex
new file mode 100644
index 0000000..dad6008
--- /dev/null
+++ b/lib/mv_web/live/member_live/show/deactivate_component.ex
@@ -0,0 +1,191 @@
+defmodule MvWeb.MemberLive.Show.DeactivateComponent do
+ @moduledoc """
+ LiveComponent owning the member deactivate/reactivate sub-flow on the member show page.
+
+ ## Features
+ - Deactivate control (shown when the member has no exit_date)
+ - Reactivate control (shown when the member has an exit_date)
+ - Date-selection modal (default: today, future dates allowed) for deactivation
+ - Routes both actions through `Membership.update_member/2` with the real user actor,
+ inheriting the `exit_date > join_date` validation and the cycle-regeneration hook.
+
+ Controls are gated on `:update` permission for the member. On success the component
+ notifies the parent with `{:member_updated, member}`, which the parent already handles.
+ """
+ use MvWeb, :live_component
+
+ import MvWeb.Authorization, only: [can?: 3]
+ import MvWeb.Helpers.AshErrorHelpers, only: [format_error: 1]
+
+ alias Mv.Membership
+ alias MvWeb.Helpers.MemberHelpers
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+
+ <%= if @can_update do %>
+
+
+ {gettext("Membership status")}
+
+
+ <%= if @member.exit_date do %>
+
+ {gettext(
+ "This member is deactivated (exit date set). Reactivating clears the exit date."
+ )}
+
+ <.button
+ id="reactivate-member-trigger"
+ data-testid="member-reactivate"
+ variant="primary"
+ phx-click="reactivate"
+ phx-target={@myself}
+ aria-label={
+ gettext("Reactivate member %{name}", name: MemberHelpers.display_name(@member))
+ }
+ >
+ <.icon name="hero-arrow-uturn-left" class="size-4" />
+ {gettext("Reactivate member")}
+
+ <% else %>
+
+ {gettext(
+ "Deactivating this member records an exit date. You can reactivate them later."
+ )}
+
+ <.button
+ id="deactivate-member-trigger"
+ data-testid="member-deactivate"
+ variant="outline"
+ phx-click="open_modal"
+ phx-target={@myself}
+ aria-label={
+ gettext("Deactivate member %{name}", name: MemberHelpers.display_name(@member))
+ }
+ >
+ <.icon name="hero-arrow-right-on-rectangle" class="size-4" />
+ {gettext("Deactivate member")}
+
+ <% end %>
+
+
+ <% end %>
+
+ <%= if @show_modal do %>
+
+ <% end %>
+
+ """
+ end
+
+ @impl true
+ def update(assigns, socket) do
+ {:ok,
+ socket
+ |> assign(assigns)
+ |> assign(:can_update, can?(assigns.current_user, :update, assigns.member))
+ |> assign_new(:show_modal, fn -> false end)
+ |> assign_new(:exit_date, fn -> Date.utc_today() end)
+ |> assign_new(:error, fn -> nil end)}
+ end
+
+ @impl true
+ def handle_event("open_modal", _params, socket) do
+ {:noreply,
+ socket
+ |> assign(:show_modal, true)
+ |> assign(:exit_date, Date.utc_today())
+ |> assign(:error, nil)}
+ end
+
+ def handle_event("cancel_modal", _params, socket) do
+ {:noreply, close_modal(socket)}
+ end
+
+ def handle_event("dialog_keydown", %{"key" => key}, socket) when key in ["Escape", "Esc"] do
+ {:noreply, close_modal(socket)}
+ end
+
+ def handle_event("dialog_keydown", _params, socket), do: {:noreply, socket}
+
+ def handle_event("deactivate", %{"exit_date" => exit_date_str}, socket) do
+ case Date.from_iso8601(exit_date_str) do
+ {:ok, exit_date} ->
+ apply_exit_date(socket, exit_date, show_inline_error: true)
+
+ {:error, _reason} ->
+ {:noreply, assign(socket, :error, gettext("Invalid date format"))}
+ end
+ end
+
+ def handle_event("reactivate", _params, socket) do
+ apply_exit_date(socket, nil, show_inline_error: false)
+ end
+
+ defp apply_exit_date(socket, exit_date, opts) do
+ member = socket.assigns.member
+ actor = socket.assigns.current_user
+
+ case Membership.update_member(member, %{exit_date: exit_date}, actor: actor) do
+ {:ok, updated_member} ->
+ send(self(), {:member_updated, updated_member})
+
+ {:noreply,
+ socket
+ |> assign(:member, updated_member)
+ |> close_modal()}
+
+ {:error, error} ->
+ if opts[:show_inline_error] do
+ {:noreply, assign(socket, :error, format_error(error))}
+ else
+ send(self(), {:put_flash, :error, format_error(error)})
+ {:noreply, socket}
+ end
+ end
+ end
+
+ defp close_modal(socket) do
+ socket
+ |> assign(:show_modal, false)
+ |> assign(:error, nil)
+ end
+end
diff --git a/lib/mv_web/live/member_live/show/membership_fees_component.ex b/lib/mv_web/live/member_live/show/membership_fees_component.ex
index 0cba316..16ee5dc 100644
--- a/lib/mv_web/live/member_live/show/membership_fees_component.ex
+++ b/lib/mv_web/live/member_live/show/membership_fees_component.ex
@@ -15,6 +15,7 @@ defmodule MvWeb.MemberLive.Show.MembershipFeesComponent do
require Ash.Query
import MvWeb.LiveHelpers, only: [current_actor: 1]
import MvWeb.Authorization, only: [can?: 3]
+ import MvWeb.Helpers.AshErrorHelpers, only: [format_error: 1]
alias Mv.Membership
alias Mv.MembershipFees
@@ -143,16 +144,21 @@ defmodule MvWeb.MemberLive.Show.MembershipFeesComponent do
<%!-- Action Buttons (only when user has permission) --%>
- <.button
+ <.tooltip
:if={@member.membership_fee_type != nil and @can_create_cycle}
- phx-click="regenerate_cycles"
- phx-target={@myself}
- class={["btn btn-sm btn-outline", if(@regenerating, do: "btn-disabled", else: "")]}
- title={gettext("Generate cycles from the last existing cycle to today")}
+ content={gettext("Generate cycles from the last existing cycle to today")}
+ position="top"
>
- <.icon name="hero-arrow-path" class="size-4" />
- {if(@regenerating, do: gettext("Regenerating..."), else: gettext("Regenerate Cycles"))}
-
+ <.button
+ phx-click="regenerate_cycles"
+ phx-target={@myself}
+ class={["btn btn-sm btn-outline", if(@regenerating, do: "btn-disabled", else: "")]}
+ aria-label={gettext("Regenerate membership fee cycles")}
+ >
+ <.icon name="hero-arrow-path" class="size-4" />
+ {if(@regenerating, do: gettext("Regenerating..."), else: gettext("Regenerate Cycles"))}
+
+
<.button
:if={Enum.any?(@cycles) and @can_destroy_cycle}
variant="outline"
@@ -1139,17 +1145,6 @@ defmodule MvWeb.MemberLive.Show.MembershipFeesComponent do
defp format_status_label(:unpaid), do: gettext("Unpaid")
defp format_status_label(:suspended), do: gettext("Suspended")
- defp format_error(%Ash.Error.Invalid{} = error) do
- Enum.map_join(error.errors, ", ", fn e -> e.message end)
- end
-
- defp format_error(%Ash.Error.Forbidden{}) do
- gettext("You are not allowed to perform this action.")
- end
-
- defp format_error(error) when is_binary(error), do: error
- defp format_error(_error), do: gettext("An error occurred")
-
defp validate_cycle_not_exists(cycles, cycle_start) do
if Enum.any?(cycles, &(&1.cycle_start == cycle_start)) do
{:error, :cycle_exists}
diff --git a/lib/mv_web/live/membership_fee_settings_live.ex b/lib/mv_web/live/membership_fee_settings_live.ex
index 15030c1..4df6608 100644
--- a/lib/mv_web/live/membership_fee_settings_live.ex
+++ b/lib/mv_web/live/membership_fee_settings_live.ex
@@ -298,17 +298,22 @@ defmodule MvWeb.MembershipFeeSettingsLive do
<.icon name="hero-trash" class="size-4" />
- <.button
+ <.tooltip
:if={get_member_count(mft, @member_counts) == 0}
- variant="danger"
- size="sm"
- phx-click="delete"
- phx-value-id={mft.id}
- data-confirm={gettext("Are you sure?")}
- aria-label={gettext("Delete Membership Fee Type")}
+ content={gettext("Delete Membership Fee Type")}
+ position="left"
>
- <.icon name="hero-trash" class="size-4" />
-
+ <.button
+ variant="danger"
+ size="sm"
+ phx-click="delete"
+ phx-value-id={mft.id}
+ data-confirm={gettext("Are you sure?")}
+ aria-label={gettext("Delete Membership Fee Type")}
+ >
+ <.icon name="hero-trash" class="size-4" />
+
+
diff --git a/lib/mv_web/live/membership_fee_type_live/index.ex b/lib/mv_web/live/membership_fee_type_live/index.ex
index 65f840d..1d51ce1 100644
--- a/lib/mv_web/live/membership_fee_type_live/index.ex
+++ b/lib/mv_web/live/membership_fee_type_live/index.ex
@@ -115,17 +115,22 @@ defmodule MvWeb.MembershipFeeTypeLive.Index do
<.icon name="hero-trash" class="size-4" />
- <.button
+ <.tooltip
:if={get_member_count(mft, @member_counts) == 0}
- variant="danger"
- size="sm"
- phx-click="delete"
- phx-value-id={mft.id}
- data-confirm={gettext("Are you sure?")}
- aria-label={gettext("Delete Membership Fee Type")}
+ content={gettext("Delete Membership Fee Type")}
+ position="left"
>
- <.icon name="hero-trash" class="size-4" />
-
+ <.button
+ variant="danger"
+ size="sm"
+ phx-click="delete"
+ phx-value-id={mft.id}
+ data-confirm={gettext("Are you sure?")}
+ aria-label={gettext("Delete Membership Fee Type")}
+ >
+ <.icon name="hero-trash" class="size-4" />
+
+
diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po
index cf12baf..38ad3e5 100644
--- a/priv/gettext/de/LC_MESSAGES/default.po
+++ b/priv/gettext/de/LC_MESSAGES/default.po
@@ -39,6 +39,16 @@ msgstr[1] "%{count} Mitglieder haben Werte für dieses benutzerdefinierte Feld z
msgid "%{count} synced"
msgstr "%{count} synchronisiert"
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "%{field} from"
+msgstr "%{field} von"
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "%{field} to"
+msgstr "%{field} bis"
+
#: lib/mv/membership/import/member_csv.ex
#, elixir-autogen, elixir-format
msgid "(ISO-8601 format: YYYY-MM-DD)"
@@ -96,6 +106,11 @@ msgstr "Aktionen"
msgid "Active members"
msgstr "Aktive Mitglieder"
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Active only"
+msgstr "Nur aktive"
+
#: lib/mv_web/live/group_live/show.ex
#, elixir-autogen, elixir-format
msgid "Add Member"
@@ -153,6 +168,11 @@ msgstr "Alle benutzerdefinierten Feldwerte werden beim Löschen dieses benutzerd
msgid "All years combined (pie)"
msgstr "Alle Jahre zusammengefasst (Kreis)"
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Allow direct registration (/register)"
+msgstr "Direkte Registrierung erlauben (/register)"
+
#: lib/mv_web/live/membership_fee_type_live/form.ex
#, elixir-autogen, elixir-format
msgid "Already paid cycles will remain with the old amount."
@@ -171,7 +191,7 @@ msgstr "Betrag"
msgid "An account with this email already exists. Please verify your password to link your OIDC account."
msgstr "Ein Konto mit dieser E-Mail existiert bereits. Bitte gib dein Passwort ein, um dein OIDC-Konto zu verknüpfen."
-#: lib/mv_web/live/member_live/show/membership_fees_component.ex
+#: lib/mv_web/helpers/ash_error_helpers.ex
#: lib/mv_web/live/membership_fee_settings_live.ex
#: lib/mv_web/live/membership_fee_type_live/index.ex
#: lib/mv_web/live/role_live/helpers.ex
@@ -184,6 +204,11 @@ msgstr "Ein Fehler ist aufgetreten"
msgid "App URL (contact view link)"
msgstr "App-URL (Link zur Kontaktansicht)"
+#: lib/mv_web/live/join_request_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Applicant data"
+msgstr "Angaben des Antragstellers"
+
#: lib/mv_web/live/components/member_filter_component.ex
#, elixir-autogen, elixir-format
msgid "Apply filters"
@@ -273,6 +298,11 @@ msgstr "Verbindung wird wiederhergestellt"
msgid "Aug."
msgstr "Aug."
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Authentication"
+msgstr "Anmeldung"
+
#: lib/mv_web/controllers/auth_controller.ex
#, elixir-autogen, elixir-format
msgid "Authentication configuration error. Please contact the administrator."
@@ -320,6 +350,11 @@ msgstr "Zurück"
msgid "Back to groups list"
msgstr "Zurück zur Gruppenübersicht"
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Back to join form"
+msgstr "Zurück zu den Mitgliedsanträgen"
+
#: lib/mv_web/live/join_request_live/show.ex
#, elixir-autogen, elixir-format
msgid "Back to join requests"
@@ -390,6 +425,7 @@ msgstr "Kann jederzeit geändert werden. Änderungen des Betrags betreffen nur z
#: lib/mv_web/live/member_field_live/form_component.ex
#: lib/mv_web/live/member_live/form.ex
#: lib/mv_web/live/member_live/show.ex
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#: lib/mv_web/live/membership_fee_type_live/form.ex
#: lib/mv_web/live/role_live/show.ex
@@ -533,6 +569,11 @@ msgstr "Vereins-ID"
msgid "Club Settings"
msgstr "Vereinsdaten"
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Column"
+msgstr "Spalte"
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Completed"
@@ -563,6 +604,11 @@ msgstr "Änderung bestätigen"
msgid "Confirm Password"
msgstr "Passwort bestätigen"
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Confirm and Import"
+msgstr "Bestätigen und importieren"
+
#: lib/mv_web/templates/emails/user_confirmation.html.heex
#, elixir-autogen, elixir-format
msgid "Confirm my email"
@@ -666,11 +712,21 @@ msgid_plural "Copied %{count} email addresses to clipboard"
msgstr[0] "%{count} E-Mail-Adresse in die Zwischenablage kopiert"
msgstr[1] "%{count} E-Mail-Adressen in die Zwischenablage kopiert"
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Copy"
+msgstr "Kopieren"
+
#: lib/mv_web/components/bulk_actions_dropdown.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Copy email addresses"
msgstr "E-Mail-Adressen kopieren"
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Copy join page URL"
+msgstr "URL der Beitrittsseite kopieren"
+
#: lib/mv_web/live/datafields_live.ex
#, elixir-autogen, elixir-format
msgid "Could not load data fields. Please check your permissions."
@@ -719,11 +775,26 @@ msgstr "Mitglied erstellen"
msgid "Create a new cycle manually"
msgstr "Einen neuen Zyklus manuell erstellen"
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Create custom field"
+msgstr "Datenfeld erstellen"
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Create fee type"
+msgstr "Beitragsart erstellen"
+
#: lib/mv/membership/members_pdf.ex
#, elixir-autogen, elixir-format
msgid "Created at:"
msgstr "Erstellt am:"
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Creates a Vereinfacht finance contact for every member that does not have one yet."
+msgstr "Legt für jedes Mitglied ohne Vereinfacht-Kontakt einen Finanzkontakt an."
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Credit"
@@ -759,6 +830,16 @@ msgstr "Benutzerdefiniert"
msgid "Custom Fields"
msgstr "Benutzerdefinierte Felder"
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Custom date fields"
+msgstr "Benutzerdefinierte Datumsfelder"
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Custom field"
+msgstr "Benutzerdefiniertes Feld"
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Cycle"
@@ -833,6 +914,31 @@ msgstr "Datenfelder"
msgid "Date"
msgstr "Datum"
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Dates"
+msgstr "Daten"
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Deactivate"
+msgstr "Deaktivieren"
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Deactivate member"
+msgstr "Mitglied deaktivieren"
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Deactivate member %{name}"
+msgstr "Mitglied %{name} deaktivieren"
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Deactivating this member records an exit date. You can reactivate them later."
+msgstr "Wenn du dieses Mitglied deaktivierst, wird ein Austrittsdatum gesetzt. Du kannst es später wieder reaktivieren."
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Dec."
@@ -1030,6 +1136,16 @@ msgstr "Löschen"
msgid "Description"
msgstr "Beschreibung"
+#: lib/mv_web/live/custom_field_live/form_component.ex
+#, elixir-autogen, elixir-format
+msgid "Description for join form"
+msgstr "Beschreibung für das Beitrittsformular"
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Direct registration"
+msgstr "Direkte Registrierung"
+
#: lib/mv_web/live/import_live/components.ex
#, elixir-autogen, elixir-format
msgid "Download CSV templates:"
@@ -1179,6 +1295,22 @@ msgstr "Beispiele"
msgid "Exit Date"
msgstr "Austrittsdatum"
+#: lib/mv_web/live/components/member_filter_component.ex
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Exit date"
+msgstr "Austrittsdatum"
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Exit date from"
+msgstr "Austrittsdatum von"
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Exit date to"
+msgstr "Austrittsdatum bis"
+
#: lib/mv_web/live/statistics_live.ex
#, elixir-autogen, elixir-format
msgid "Exits"
@@ -1204,6 +1336,16 @@ msgstr "Mitglieder als CSV exportieren"
msgid "Export members to PDF"
msgstr "Mitglieder als PDF exportieren"
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Export to CSV"
+msgstr "Mitglieder als CSV exportieren"
+
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Export to PDF"
+msgstr "Mitglieder als PDF exportieren"
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Failed members:"
@@ -1300,6 +1442,11 @@ msgstr "Test-E-Mail konnte nicht gesendet werden. Bitte prüfe deine SMTP-Konfig
msgid "Failed to update cycle status: %{errors}"
msgstr "Fehler beim Aktualisieren des Zyklenstatus: %{errors}"
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Failed to update setting."
+msgstr "Einstellung konnte nicht gespeichert werden."
+
#: lib/mv_web/live/import_live/components.ex
#, elixir-autogen, elixir-format
msgid "Failed: %{count} row(s)"
@@ -1316,12 +1463,27 @@ msgstr "Feb."
msgid "Fee Type"
msgstr "Beitragsart"
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Fee status columns (Membership Fee Status, Bezahlstatus, Mitgliedsbeitragsstatus) are always ignored and cannot be imported."
+msgstr "Beitragsstatus-Spalten (Membership Fee Status, Bezahlstatus, Mitgliedsbeitragsstatus) werden immer ignoriert und können nicht importiert werden."
+
#: lib/mv_web/live/import_live/components.ex
#: lib/mv_web/live/statistics_live.ex
#, elixir-autogen, elixir-format
msgid "Fee type"
msgstr "Beitragsart"
+#: lib/mv/membership/import/member_csv.ex
+#, elixir-autogen, elixir-format
+msgid "Fee type '%{name}' not found; using the default fee type."
+msgstr "Beitragsart '%{name}' nicht gefunden; Standard-Beitragsart wird verwendet."
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Fee type column (recognized headers): Fee Type, fee type, fee_type, membership_fee_type, Beitragsart. Unknown fee types fall back to the default."
+msgstr "Beitragsart-Spalte (erkannte Spaltennamen): Fee Type, fee type, fee_type, membership_fee_type, Beitragsart. Unbekannte Beitragsarten erhalten die Standard-Beitragsart."
+
#: lib/mv_web/live/components/member_filter_component.ex
#, elixir-autogen, elixir-format
msgid "Fee types"
@@ -1367,6 +1529,11 @@ msgstr "Vorname"
msgid "Fixed after creation. Members can only switch between types with the same interval."
msgstr "Festgelegt nach der Erstellung. Mitglieder können nur zwischen Beitragsarten mit gleichem Intervall wechseln."
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "From"
+msgstr "Von"
+
#: lib/mv_web/live/statistics_live.ex
#, elixir-autogen, elixir-format
msgid "From %{first} to %{last} (relevant years with membership data)"
@@ -1452,6 +1619,21 @@ msgstr "Generierte Zyklen"
msgid "German Template"
msgstr "Deutsche Vorlage"
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Go to join form"
+msgstr "Zum Antragsformular"
+
+#: lib/mv_web/live/group_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Group %{name}"
+msgstr "Gruppe %{name}"
+
+#: lib/mv/membership/import/member_csv.ex
+#, elixir-autogen, elixir-format
+msgid "Group assignment failed: %{reason}"
+msgstr "Gruppenzuordnung fehlgeschlagen: %{reason}"
+
#: lib/mv_web/live/group_live/show.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Group deleted successfully."
@@ -1489,6 +1671,11 @@ msgstr "Gruppen"
msgid "Groups claim"
msgstr "Gruppenclaim"
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Groups column (recognized headers): Groups, Gruppen, Gruppe. Comma-separated group names are supported and missing groups are created automatically."
+msgstr "Gruppen-Spalte (erkannte Spaltennamen): Groups, Gruppen, Gruppe. Mehrere durch Komma getrennte Gruppennamen werden unterstützt; fehlende Gruppen werden automatisch erstellt."
+
#: lib/mv_web/helpers/membership_fee_helpers.ex
#: lib/mv_web/live/membership_fee_settings_live.ex
#: lib/mv_web/live/membership_fee_type_live/form.ex
@@ -1501,6 +1688,11 @@ msgstr "Halbjährlich"
msgid "History"
msgstr "Historie"
+#: lib/mv_web/controllers/page_controller.ex
+#, elixir-autogen, elixir-format
+msgid "Home"
+msgstr "Startseite"
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "Host"
@@ -1512,6 +1704,11 @@ msgstr "Host"
msgid "House Number"
msgstr "Hausnummer"
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "If disabled, users cannot sign up via /register; sign-in and the join form remain available."
+msgstr "Wenn deaktiviert, können sich Nutzer*innen nicht über /register anmelden; Anmeldung und Beitrittsformular bleiben verfügbar."
+
#: lib/mv_web/templates/emails/user_confirmation.html.heex
#, elixir-autogen, elixir-format
msgid "If you did not create an account, you can ignore this email."
@@ -1527,6 +1724,17 @@ msgstr "Wenn du das nicht angefordert hast, kannst du diese E-Mail ignorieren. D
msgid "If you did not submit this request, you can ignore this email."
msgstr "Wenn du diese Anfrage nicht gestellt hast, kannst du diese E-Mail ignorieren."
+#: lib/mv_web/templates/emails/join_already_member.html.heex
+#: lib/mv_web/templates/emails/join_already_pending.html.heex
+#, elixir-autogen, elixir-format
+msgid "If you have any questions, please contact us."
+msgstr "Bei Fragen kannst du dich gerne an uns wenden."
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Ignored (system-computed field)"
+msgstr "Ignoriert (vom System berechnetes Feld)"
+
#: lib/mv_web/components/layouts/sidebar.ex
#: lib/mv_web/live/import_live.ex
#, elixir-autogen, elixir-format, fuzzy
@@ -1563,6 +1771,11 @@ msgstr "Import-Status fehlt. Chunk %{idx} kann nicht verarbeitet werden."
msgid "Inactive members"
msgstr "Inaktive Mitglieder"
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Inactive only"
+msgstr "Nur ehemalige"
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "Include both letters and numbers"
@@ -1632,6 +1845,7 @@ msgstr "Ungültiges Betragsformat"
msgid "Invalid chunk index: %{idx}"
msgstr "Ungültiger Chunk-Index: %{idx}"
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Invalid date format"
@@ -1642,6 +1856,16 @@ msgstr "Ungültiges Datumsformat"
msgid "Invalid email address. Please enter a valid recipient address."
msgstr "Ungültige E-Mail-Adresse. Bitte gib eine gültige Empfängeradresse ein."
+#: lib/mv_web/controllers/join_confirm_controller.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Invalid link"
+msgstr "Ungültiger oder abgelaufener Link."
+
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Invalid or expired link"
+msgstr "Ungültiger oder abgelaufener Link."
+
#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
#, elixir-autogen, elixir-format
msgid "Invalid or expired link."
@@ -1657,6 +1881,11 @@ msgstr "Rechnung"
msgid "Jan."
msgstr "Jan."
+#: lib/mv_web/live/join_live.ex
+#, elixir-autogen, elixir-format
+msgid "Join"
+msgstr "Beitritt"
+
#: 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
@@ -1670,11 +1899,46 @@ msgstr "Beitrittsdatum"
msgid "Join Form"
msgstr "Beitrittsformular"
+#: lib/mv_web/controllers/join_confirm_controller.ex
+#, elixir-autogen, elixir-format
+msgid "Join confirmation"
+msgstr "Beitrittsbestätigung"
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Join date"
+msgstr "Beitrittsdatum"
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Join date from"
+msgstr "Beitrittsdatum von"
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Join date to"
+msgstr "Beitrittsdatum bis"
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "Join form enabled"
msgstr "Beitrittsformular aktiv"
+#: lib/mv_web/live/member_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Join form:"
+msgstr "Beitrittsformular:"
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Join page URL"
+msgstr "URL der Beitrittsseite"
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Join page URL copied to clipboard."
+msgstr "URL der Beitrittsseite in die Zwischenablage kopiert."
+
#: lib/mv_web/live/join_request_live/show.ex
#, elixir-autogen, elixir-format
msgid "Join request"
@@ -1764,6 +2028,17 @@ msgstr "Leer lassen, um den aktuellen Wert beizubehalten."
msgid "Line %{line}: %{message}"
msgstr "Zeile %{line}: %{message}"
+#: lib/mv_web/controllers/join_confirm_controller.ex
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Link expired"
+msgstr "Link abgelaufen"
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Link to the public join page (share this with applicants):"
+msgstr "Link zur öffentlichen Beitrittsseite (diesen Link mit Interessent*innen teilen):"
+
#: lib/mv_web/live/user_live/index.html.heex
#: lib/mv_web/live/user_live/show.ex
#, elixir-autogen, elixir-format, fuzzy
@@ -1847,6 +2122,11 @@ msgstr "Mitglied wurde erfolgreich %{action}"
msgid "Member %{club_name}"
msgstr "Mitglieder %{club_name}"
+#: lib/mv_web/live/member_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Member %{name}"
+msgstr "Mitglied %{name}"
+
#: lib/mv/membership/members_pdf.ex
#, elixir-autogen, elixir-format
msgid "Member count:"
@@ -1863,6 +2143,11 @@ msgstr "Mitglied wurde erfolgreich erstellt"
msgid "Member deleted successfully"
msgstr "Mitglied wurde erfolgreich gelöscht"
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Member field"
+msgstr "Mitgliedsfeld"
+
#: lib/mv_web/live/datafields_live.ex
#, elixir-autogen, elixir-format
msgid "Member field %{action} successfully"
@@ -1981,6 +2266,16 @@ msgstr "Mitgliedsbeitragsarten"
msgid "Membership Fees"
msgstr "Mitgliedsbeiträge"
+#: lib/mv_web/emails/join_already_member_email.ex
+#, elixir-autogen, elixir-format
+msgid "Membership application – already a member"
+msgstr "Mitgliedsantrag – bereits Mitglied"
+
+#: lib/mv_web/emails/join_already_pending_email.ex
+#, elixir-autogen, elixir-format
+msgid "Membership application – already under review"
+msgstr "Mitgliedsantrag – wird bereits geprüft"
+
#: lib/mv_web/components/layouts/sidebar.ex
#: lib/mv_web/live/membership_fee_settings_live.ex
#: lib/mv_web/live/membership_fee_type_live/index.ex
@@ -2026,6 +2321,11 @@ msgstr "Mitgliedsbeitragsart aktualisiert. Zyklen regeneriert."
msgid "Membership fee types define different membership fee structures. Each type has a fixed interval (monthly, quarterly, half-yearly, yearly) that cannot be changed after creation."
msgstr "Mitgliedsbeitragsarten definieren verschiedene Mitgliedsbeitragsstrukturen. Jede Art hat ein festes Intervall (monatlich, vierteljährlich, halbjährlich, jährlich), das nach der Erstellung nicht geändert werden kann."
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Membership status"
+msgstr "Mitgliedsstatus"
+
#: lib/mv/mailer.ex
#, elixir-autogen, elixir-format
msgid "Mila – Test email"
@@ -2203,6 +2503,11 @@ msgstr "Keine Mitgliedsbeitragszyklen gefunden. Zyklen werden automatisch generi
msgid "No membership fee type assigned"
msgstr "Keine Mitgliedsbeitragsart zugewiesen"
+#: lib/mv_web/live/import_live.ex
+#, elixir-autogen, elixir-format
+msgid "No prepared import to confirm. Please upload again."
+msgstr "Kein vorbereiteter Import zum Bestätigen. Bitte erneut hochladen."
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "No receipts"
@@ -2319,6 +2624,11 @@ msgstr "OIDC"
msgid "OIDC (Single Sign-On)"
msgstr "OIDC (Single Sign-On)"
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "OIDC enables Single Sign-On: once configured, members sign in through your identity provider instead of a separate Mila password."
+msgstr "OIDC aktiviert Single Sign-On: Sobald es eingerichtet ist, melden sich Mitglieder über deinen Identity-Provider an statt mit einem separaten Mila-Passwort."
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Oct."
@@ -2329,6 +2639,11 @@ msgstr "Okt."
msgid "Only OIDC sign-in (hide password login)"
msgstr "Nur OIDC-Anmeldung (Passwort-Login ausblenden)"
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Only OIDC sign-in is active. This option is disabled."
+msgstr "Nur OIDC-Anmeldung ist aktiv. Diese Option ist deaktiviert."
+
#: lib/mv_web/live/import_live.ex
#, elixir-autogen, elixir-format
msgid "Only administrators can import members from CSV files."
@@ -2345,6 +2660,11 @@ msgstr "Nur Administrator*innen oder die verknüpfte*n Benutzer*in(nen) können
msgid "Only possible if no members are assigned to this type."
msgstr "Nur möglich, wenn diesem Typ keine Mitglieder zugewiesen sind."
+#: lib/mv_web/controllers/auth_controller.ex
+#, elixir-autogen, elixir-format
+msgid "Only sign-in via Single Sign-On (SSO) is allowed."
+msgstr "Nur Anmeldung per Single Sign-On (SSO) ist erlaubt."
+
#: lib/mv_web/components/bulk_actions_dropdown.ex
#, elixir-autogen, elixir-format
msgid "Open in email program"
@@ -2489,6 +2809,11 @@ msgstr "Port"
msgid "Postal Code"
msgstr "Postleitzahl"
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Preview import"
+msgstr "Importvorschau"
+
#: lib/mv_web/live/import_live/components.ex
#, elixir-autogen, elixir-format
msgid "Processing chunk %{current} of %{total}..."
@@ -2511,6 +2836,21 @@ msgstr "Vierteljährlich"
msgid "Quarterly Interval - Joining Cycle Excluded"
msgstr "Vierteljährliches Intervall – Beitrittszeitraum nicht einbezogen"
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Range"
+msgstr "Zeitraum"
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Reactivate member"
+msgstr "Mitglied reaktivieren"
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Reactivate member %{name}"
+msgstr "Mitglied %{name} reaktivieren"
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Receipt"
@@ -2536,6 +2876,11 @@ msgstr "Weiterleitungs-URI"
msgid "Regenerate Cycles"
msgstr "Zyklen regenerieren"
+#: lib/mv_web/live/member_live/show/membership_fees_component.ex
+#, elixir-autogen, elixir-format
+msgid "Regenerate membership fee cycles"
+msgstr "Beitragszyklen neu generieren"
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Regenerating..."
@@ -2626,6 +2971,11 @@ msgstr "Geprüft am"
msgid "Role"
msgstr "Rolle"
+#: lib/mv_web/live/role_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Role %{name}"
+msgstr "Rolle %{name}"
+
#: lib/mv_web/live/role_live/show.ex
#, elixir-autogen, elixir-format
msgid "Role deleted successfully."
@@ -2653,16 +3003,46 @@ msgstr "Rolle erfolgreich gespeichert."
msgid "Roles"
msgstr "Rollen"
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Row 1"
+msgstr "Zeile 1"
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Row 2"
+msgstr "Zeile 2"
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Row 3"
+msgstr "Zeile 3"
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Rows with an empty fee type will get the default fee type."
+msgstr "Zeilen ohne Beitragsart erhalten die Standard-Beitragsart."
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "SMTP / E-Mail"
msgstr "SMTP / E-Mail"
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "SMTP environment configuration appears incomplete. Missing: %{keys}"
+msgstr "Die SMTP-Umgebungs-Konfiguration ist unvollständig. Fehlend: %{keys}"
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "SMTP error:"
msgstr "SMTP-Fehler:"
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "SMTP is fully managed via environment variables. All SMTP fields are read-only."
+msgstr "SMTP wird vollständig über Umgebungsvariablen verwaltet. Alle SMTP-Felder sind schreibgeschützt."
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "SMTP is not configured. Please set at least the SMTP host."
@@ -2918,6 +3298,11 @@ msgstr "In der Übersicht anzeigen"
msgid "Show/Hide Columns"
msgstr "Spalten ein-/ausblenden"
+#: lib/mv_web/live/auth/sign_in_live.ex
+#, elixir-autogen, elixir-format
+msgid "Sign in"
+msgstr "Anmelden"
+
#: lib/mv_web/live/datafields_live.ex
#, elixir-autogen, elixir-format
msgid "Slug does not match. Deletion cancelled."
@@ -2962,6 +3347,11 @@ msgstr "Statistik"
msgid "Status"
msgstr "Status"
+#: lib/mv_web/live/join_request_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Status and review"
+msgstr "Status und Prüfung"
+
#: lib/mv_web/live/member_live/form.ex
#: lib/mv_web/live/member_live/index.html.heex
#: lib/mv_web/translations/member_fields.ex
@@ -2969,6 +3359,11 @@ msgstr "Status"
msgid "Street"
msgstr "Straße"
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Submit new request"
+msgstr "Antrag absenden"
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "Submit request"
@@ -3091,6 +3486,11 @@ msgstr "Wird getestet..."
msgid "Text"
msgstr "Textfeld"
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Thank you"
+msgstr "Vielen Dank"
+
#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
#, elixir-autogen, elixir-format
msgid "Thank you, we have received your request."
@@ -3121,6 +3521,11 @@ msgstr "Die Absender-E-Mail muss auf den meisten SMTP-Servern dem SMTP-Nutzer ge
msgid "These fields are necessary for MILA to handle member identification and payment calculations in the future. Thus you cannot delete these fields but hide them in the member overview."
msgstr "Diese Datenfelder sind für MILA notwendig, um Mitglieder zu identifizieren und zukünftig Beitragszahlungen zu berechnen. Aus diesem Grund können sie nicht gelöscht, aber in der Übersicht ausgeblendet werden."
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "These groups will be created automatically: %{names}"
+msgstr "Diese Gruppen werden automatisch erstellt: %{names}"
+
#: lib/mv_web/live/custom_field_live/index_component.ex
#, elixir-autogen, elixir-format
msgid "These will appear in addition to other data when adding new members."
@@ -3169,6 +3574,11 @@ msgstr "Dies ist eine Test-E-Mail von Mila. Wenn du diese erhalten hast, funktio
msgid "This link has expired. Please submit the form again."
msgstr "Dieser Link ist abgelaufen. Bitte sende das Formular erneut ab."
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "This member is deactivated (exit date set). Reactivating clears the exit date."
+msgstr "Dieses Mitglied ist deaktiviert (Austrittsdatum gesetzt). Beim Reaktivieren wird das Austrittsdatum entfernt."
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "This user cannot be edited."
@@ -3189,6 +3599,11 @@ msgstr "Diese*r Benutzer*in ist über SSO (Single Sign-On) verbunden. Ein hier f
msgid "Tip: Paste email addresses into the BCC field for privacy compliance"
msgstr "Tipp: E-Mail-Adressen ins BCC-Feld einfügen, für Datenschutzkonformität"
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "To"
+msgstr "Bis"
+
#: lib/mv_web/live/group_live/show.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "To confirm deletion, please enter the group name:"
@@ -3209,6 +3624,11 @@ msgstr "Dunklen Modus umschalten"
msgid "Toggle sidebar"
msgstr "Sidebar umschalten"
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format
+msgid "Too many recipients for this function. Copy the addresses or export the list."
+msgstr "Zu viele Empfänger für diese Funktion. Kopiere die Adressen oder exportiere die Liste."
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "Too many requests. Please try again later."
@@ -3247,6 +3667,11 @@ msgstr "OIDC-Authentifizierung fehlgeschlagen. Bitte versuche es erneut."
msgid "Unable to sign in. Please try again."
msgstr "Anmeldung fehlgeschlagen. Bitte versuche es erneut."
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Unknown (ignored)"
+msgstr "Unbekannt (ignoriert)"
+
#: lib/mv/membership/import/member_csv.ex
#, elixir-autogen, elixir-format
msgid "Unknown column '%{header}' will be ignored. If this is a custom field, create it in Mila before importing."
@@ -3258,6 +3683,11 @@ msgstr "Unbekannte Spalte '%{header}' wird ignoriert. Falls dies ein Datenfeld i
msgid "Unknown error"
msgstr "Unbekannter Fehler"
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Unknown fee types (members get the default): %{names}"
+msgstr "Unbekannte Beitragsarten (Mitglieder erhalten den Standard): %{names}"
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "Unlink Member"
@@ -3278,6 +3708,11 @@ msgstr "Aufhebung der Verknüpfung geplant"
msgid "Unpaid"
msgstr "Unbezahlt"
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Use the data field name as the CSV column header in your file. Data fields must exist in Mila before importing, because unknown data field columns will be ignored."
+msgstr "Verwende die Namen der Datenfelder als Spaltennamen in der CSV-Datei. Datenfelder müssen in Mila bereits angelegt sein, da unbekannte Spaltennamen ignoriert werden."
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "User"
@@ -3288,6 +3723,11 @@ msgstr "Benutzer*in"
msgid "User %{action} successfully"
msgstr "Benutzer*in wurde erfolgreich %{action}"
+#: lib/mv_web/live/user_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "User %{email}"
+msgstr "Benutzer*in %{email}"
+
#: lib/mv_web/live/user_live/form.ex
#: lib/mv_web/live/user_live/show.ex
#, elixir-autogen, elixir-format
@@ -3402,11 +3842,26 @@ msgstr "Warnungen"
msgid "We can't find the internet"
msgstr "Keine Internetverbindung gefunden"
+#: lib/mv_web/live/join_live.ex
+#, elixir-autogen, elixir-format
+msgid "We could not send the confirmation email. Please try again later or contact support."
+msgstr "Die Bestätigungs-E-Mail konnte nicht versendet werden. Bitte versuche es später erneut oder wende dich an den Support."
+
#: lib/mv_web/templates/emails/join_confirmation.html.heex
#, elixir-autogen, elixir-format
msgid "We have received your membership request. To complete it, please click the link below."
msgstr "Wir haben deine Mitgliedschaftsanfrage erhalten. Bitte klicke zur Bestätigung auf den folgenden Link."
+#: lib/mv_web/templates/emails/join_already_member.html.heex
+#, elixir-autogen, elixir-format
+msgid "We have received your request. The email address you entered is already registered as a member."
+msgstr "Wir haben deine Anfrage erhalten. Die angegebene E-Mail-Adresse ist bereits als Mitglied registriert."
+
+#: lib/mv_web/templates/emails/join_already_pending.html.heex
+#, elixir-autogen, elixir-format
+msgid "We have received your request. You already have a membership application that is being reviewed."
+msgstr "Wir haben deine Anfrage erhalten. Du hast bereits einen Mitgliedsantrag, der geprüft wird."
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "We have saved your details. To complete your request, please click the link we sent to your email."
@@ -3417,6 +3872,11 @@ msgstr "Wir haben deine Angaben gespeichert. Um deinen Antrag abzuschließen, kl
msgid "Website"
msgstr "Webseite"
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "When did this member leave?"
+msgstr "Wann ist dieses Mitglied ausgetreten?"
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign-On button."
@@ -3461,12 +3921,17 @@ msgstr "Ja"
msgid "Yes/No-Selection"
msgstr "Ja/Nein-Auswahl"
+#: lib/mv_web/templates/emails/join_confirmation.html.heex
+#, elixir-autogen, elixir-format
+msgid "You already had a pending request. Here is a new confirmation link."
+msgstr "Du hattest bereits einen offenen Antrag. Hier ist ein neuer Bestätigungslink."
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "You are about to delete all %{count} cycles for this member."
msgstr "Du bist dabei, alle %{count} Zyklen für dieses Mitglied zu löschen."
-#: lib/mv_web/live/member_live/show/membership_fees_component.ex
+#: lib/mv_web/helpers/ash_error_helpers.ex
#, elixir-autogen, elixir-format
msgid "You are not allowed to perform this action."
msgstr "Du hast keine Berechtigung, diese Aktion auszuführen."
@@ -3481,6 +3946,11 @@ msgstr "Du bist jetzt angemeldet"
msgid "You are now signed out"
msgstr "Du bist jetzt abgemeldet"
+#: lib/mv_web/live/custom_field_live/form_component.ex
+#, elixir-autogen, elixir-format
+msgid "You can add links: full addresses (https://…) or as [link text](https://…)."
+msgstr "Du kannst Links einfügen: ganze Adressen (https://…) oder als [Linktext](https://…)."
+
#: lib/mv_web/live/member_live/form.ex
#, elixir-autogen, elixir-format
msgid "You do not have permission to %{action} members."
@@ -3525,6 +3995,11 @@ msgstr "Du hast dich bereits auf andere Weise angemeldet, aber dein Konto noch n
msgid "You requested a password reset. Click the link below to set a new password."
msgstr "Du hast die Zurücksetzung deines Passworts angefordert. Klicke auf den folgenden Link, um ein neues Passwort zu setzen."
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "You will receive an email once your application has been reviewed."
+msgstr "Du erhältst eine E-Mail, sobald dein Antrag geprüft wurde."
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "Your details are only used to process your membership application and to contact you. To prevent abuse we also process technical data (e.g. IP address) only as necessary."
@@ -3603,6 +4078,16 @@ msgstr "E-Mail"
msgid "email %{email} has already been taken"
msgstr "E-Mail %{email} wurde bereits verwendet"
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format
+msgid "filtered"
+msgstr "gefiltert"
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "join page URL in a new tab"
+msgstr "Beitrittslink in einem neuen Tab"
+
#: lib/mv_web/live/role_live/form.ex
#, elixir-autogen, elixir-format
msgid "normal_user - Create/Read/Update access"
@@ -3649,193 +4134,6 @@ msgstr "aktualisiert"
msgid "without %{name}"
msgstr "ohne %{name}"
-#: lib/mv_web/live/join_request_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Applicant data"
-msgstr "Angaben des Antragstellers"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Copy"
-msgstr "Kopieren"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Copy join page URL"
-msgstr "URL der Beitrittsseite kopieren"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Join page URL"
-msgstr "URL der Beitrittsseite"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Join page URL copied to clipboard."
-msgstr "URL der Beitrittsseite in die Zwischenablage kopiert."
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Link to the public join page (share this with applicants):"
-msgstr "Link zur öffentlichen Beitrittsseite (diesen Link mit Interessent*innen teilen):"
-
-#: lib/mv_web/live/join_request_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Status and review"
-msgstr "Status und Prüfung"
-
-#: lib/mv_web/live/join_live.ex
-#, elixir-autogen, elixir-format
-msgid "We could not send the confirmation email. Please try again later or contact support."
-msgstr "Die Bestätigungs-E-Mail konnte nicht versendet werden. Bitte versuche es später erneut oder wende dich an den Support."
-
-#: lib/mv_web/templates/emails/join_already_member.html.heex
-#: lib/mv_web/templates/emails/join_already_pending.html.heex
-#, elixir-autogen, elixir-format
-msgid "If you have any questions, please contact us."
-msgstr "Bei Fragen kannst du dich gerne an uns wenden."
-
-#: lib/mv_web/emails/join_already_member_email.ex
-#, elixir-autogen, elixir-format
-msgid "Membership application – already a member"
-msgstr "Mitgliedsantrag – bereits Mitglied"
-
-#: lib/mv_web/emails/join_already_pending_email.ex
-#, elixir-autogen, elixir-format
-msgid "Membership application – already under review"
-msgstr "Mitgliedsantrag – wird bereits geprüft"
-
-#: lib/mv_web/templates/emails/join_already_member.html.heex
-#, elixir-autogen, elixir-format
-msgid "We have received your request. The email address you entered is already registered as a member."
-msgstr "Wir haben deine Anfrage erhalten. Die angegebene E-Mail-Adresse ist bereits als Mitglied registriert."
-
-#: lib/mv_web/templates/emails/join_already_pending.html.heex
-#, elixir-autogen, elixir-format
-msgid "We have received your request. You already have a membership application that is being reviewed."
-msgstr "Wir haben deine Anfrage erhalten. Du hast bereits einen Mitgliedsantrag, der geprüft wird."
-
-#: lib/mv_web/templates/emails/join_confirmation.html.heex
-#, elixir-autogen, elixir-format
-msgid "You already had a pending request. Here is a new confirmation link."
-msgstr "Du hattest bereits einen offenen Antrag. Hier ist ein neuer Bestätigungslink."
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Back to join form"
-msgstr "Zurück zu den Mitgliedsanträgen"
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Go to join form"
-msgstr "Zum Antragsformular"
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Invalid or expired link"
-msgstr "Ungültiger oder abgelaufener Link."
-
-#: lib/mv_web/controllers/join_confirm_controller.ex
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Link expired"
-msgstr "Link abgelaufen"
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Submit new request"
-msgstr "Antrag absenden"
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Thank you"
-msgstr "Vielen Dank"
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "You will receive an email once your application has been reviewed."
-msgstr "Du erhältst eine E-Mail, sobald dein Antrag geprüft wurde."
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Allow direct registration (/register)"
-msgstr "Direkte Registrierung erlauben (/register)"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Authentication"
-msgstr "Anmeldung"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Direct registration"
-msgstr "Direkte Registrierung"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Failed to update setting."
-msgstr "Einstellung konnte nicht gespeichert werden."
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "If disabled, users cannot sign up via /register; sign-in and the join form remain available."
-msgstr "Wenn deaktiviert, können sich Nutzer*innen nicht über /register anmelden; Anmeldung und Beitrittsformular bleiben verfügbar."
-
-#: lib/mv_web/controllers/page_controller.ex
-#, elixir-autogen, elixir-format
-msgid "Home"
-msgstr "Startseite"
-
-#: lib/mv_web/controllers/join_confirm_controller.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Invalid link"
-msgstr "Ungültiger oder abgelaufener Link."
-
-#: lib/mv_web/live/join_live.ex
-#, elixir-autogen, elixir-format
-msgid "Join"
-msgstr "Beitritt"
-
-#: lib/mv_web/controllers/join_confirm_controller.ex
-#, elixir-autogen, elixir-format
-msgid "Join confirmation"
-msgstr "Beitrittsbestätigung"
-
-#: lib/mv_web/live/auth/sign_in_live.ex
-#, elixir-autogen, elixir-format
-msgid "Sign in"
-msgstr "Anmelden"
-
-#: lib/mv_web/live/group_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Group %{name}"
-msgstr "Gruppe %{name}"
-
-#: lib/mv_web/live/member_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Member %{name}"
-msgstr "Mitglied %{name}"
-
-#: lib/mv_web/live/role_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Role %{name}"
-msgstr "Rolle %{name}"
-
-#: lib/mv_web/live/user_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "User %{email}"
-msgstr "Benutzer*in %{email}"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Only OIDC sign-in is active. This option is disabled."
-msgstr "Nur OIDC-Anmeldung ist aktiv. Diese Option ist deaktiviert."
-
-#: lib/mv_web/controllers/auth_controller.ex
-#, elixir-autogen, elixir-format
-msgid "Only sign-in via Single Sign-On (SSO) is allowed."
-msgstr "Nur Anmeldung per Single Sign-On (SSO) ist erlaubt."
-
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgctxt "action"
@@ -3847,268 +4145,3 @@ msgstr "Öffnen"
msgctxt "status"
msgid "Open"
msgstr "Offen"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "join page URL in a new tab"
-msgstr "Beitrittslink in einem neuen Tab"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "SMTP environment configuration appears incomplete. Missing: %{keys}"
-msgstr "Die SMTP-Umgebungs-Konfiguration ist unvollständig. Fehlend: %{keys}"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "SMTP is fully managed via environment variables. All SMTP fields are read-only."
-msgstr "SMTP wird vollständig über Umgebungsvariablen verwaltet. Alle SMTP-Felder sind schreibgeschützt."
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "%{field} from"
-msgstr "%{field} von"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "%{field} to"
-msgstr "%{field} bis"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Active only"
-msgstr "Nur aktive"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Custom date fields"
-msgstr "Benutzerdefinierte Datumsfelder"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Dates"
-msgstr "Daten"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Exit date"
-msgstr "Austrittsdatum"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Exit date from"
-msgstr "Austrittsdatum von"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Exit date to"
-msgstr "Austrittsdatum bis"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "From"
-msgstr "Von"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Inactive only"
-msgstr "Nur ehemalige"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Join date"
-msgstr "Beitrittsdatum"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Join date from"
-msgstr "Beitrittsdatum von"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Join date to"
-msgstr "Beitrittsdatum bis"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Range"
-msgstr "Zeitraum"
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "To"
-msgstr "Bis"
-
-#: lib/mv_web/live/member_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Join form:"
-msgstr "Beitrittsformular:"
-
-#: lib/mv_web/live/custom_field_live/form_component.ex
-#, elixir-autogen, elixir-format
-msgid "Description for join form"
-msgstr "Beschreibung für das Beitrittsformular"
-
-#: lib/mv_web/live/custom_field_live/form_component.ex
-#, elixir-autogen, elixir-format
-msgid "You can add links: full addresses (https://…) or as [link text](https://…)."
-msgstr "Du kannst Links einfügen: ganze Adressen (https://…) oder als [Linktext](https://…)."
-
-#: lib/mv/membership/import/member_csv.ex
-#, elixir-autogen, elixir-format
-msgid "Fee type '%{name}' not found; using the default fee type."
-msgstr "Beitragsart '%{name}' nicht gefunden; Standard-Beitragsart wird verwendet."
-
-#: lib/mv/membership/import/member_csv.ex
-#, elixir-autogen, elixir-format
-msgid "Group assignment failed: %{reason}"
-msgstr "Gruppenzuordnung fehlgeschlagen: %{reason}"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Confirm and Import"
-msgstr "Bestätigen und importieren"
-
-#: lib/mv_web/live/import_live.ex
-#, elixir-autogen, elixir-format
-msgid "No prepared import to confirm. Please upload again."
-msgstr "Kein vorbereiteter Import zum Bestätigen. Bitte erneut hochladen."
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Preview import"
-msgstr "Importvorschau"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Column"
-msgstr "Spalte"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Custom field"
-msgstr "Benutzerdefiniertes Feld"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Ignored (system-computed field)"
-msgstr "Ignoriert (vom System berechnetes Feld)"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Member field"
-msgstr "Mitgliedsfeld"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Rows with an empty fee type will get the default fee type."
-msgstr "Zeilen ohne Beitragsart erhalten die Standard-Beitragsart."
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "These groups will be created automatically: %{names}"
-msgstr "Diese Gruppen werden automatisch erstellt: %{names}"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Unknown (ignored)"
-msgstr "Unbekannt (ignoriert)"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Unknown fee types (members get the default): %{names}"
-msgstr "Unbekannte Beitragsarten (Mitglieder erhalten den Standard): %{names}"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Fee status columns (Membership Fee Status, Bezahlstatus, Mitgliedsbeitragsstatus) are always ignored and cannot be imported."
-msgstr "Beitragsstatus-Spalten (Membership Fee Status, Bezahlstatus, Mitgliedsbeitragsstatus) werden immer ignoriert und können nicht importiert werden."
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Groups column (recognized headers): Groups, Gruppen, Gruppe. Comma-separated group names are supported and missing groups are created automatically."
-msgstr "Gruppen-Spalte (erkannte Spaltennamen): Groups, Gruppen, Gruppe. Mehrere durch Komma getrennte Gruppennamen werden unterstützt; fehlende Gruppen werden automatisch erstellt."
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Use the data field name as the CSV column header in your file. Data fields must exist in Mila before importing, because unknown data field columns will be ignored."
-msgstr "Verwende die Namen der Datenfelder als Spaltennamen in der CSV-Datei. Datenfelder müssen in Mila bereits angelegt sein, da unbekannte Spaltennamen ignoriert werden."
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Fee type column (recognized headers): Fee Type, fee type, fee_type, membership_fee_type, Beitragsart. Unknown fee types fall back to the default."
-msgstr "Beitragsart-Spalte (erkannte Spaltennamen): Fee Type, fee type, fee_type, membership_fee_type, Beitragsart. Unbekannte Beitragsarten erhalten die Standard-Beitragsart."
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Create custom field"
-msgstr "Datenfeld erstellen"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Create fee type"
-msgstr "Beitragsart erstellen"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Row 1"
-msgstr "Zeile 1"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Row 2"
-msgstr "Zeile 2"
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Row 3"
-msgstr "Zeile 3"
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Export to CSV"
-msgstr "Mitglieder als CSV exportieren"
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Export to PDF"
-msgstr "Mitglieder als PDF exportieren"
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format
-msgid "Too many recipients for this function. Copy the addresses or export the list."
-msgstr "Zu viele Empfänger für diese Funktion. Kopiere die Adressen oder exportiere die Liste."
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format
-msgid "filtered"
-msgstr "gefiltert"
-
-#~ #: lib/mv_web/components/export_dropdown.ex
-#~ #, elixir-autogen, elixir-format
-#~ msgid "CSV"
-#~ msgstr "CSV"
-
-#~ #: lib/mv_web/live/member_live/index.html.heex
-#~ #, elixir-autogen, elixir-format
-#~ msgid "Copy email addresses of selected members"
-#~ msgstr "E-Mail-Adressen der ausgewählten Mitglieder kopieren"
-
-#~ #: lib/mv_web/components/export_dropdown.ex
-#~ #, elixir-autogen, elixir-format, fuzzy
-#~ msgid "Export"
-#~ msgstr "Export"
-
-#~ #: lib/mv_web/live/member_live/index.ex
-#~ #, elixir-autogen, elixir-format
-#~ msgid "No members selected"
-#~ msgstr "Keine Mitglieder ausgewählt"
-
-#~ #: lib/mv_web/live/member_live/index.html.heex
-#~ #, elixir-autogen, elixir-format
-#~ msgid "Open email program with BCC recipients"
-#~ msgstr "E-Mail-Programm mit BCC-Empfänger*innen öffnen"
-
-#~ #: lib/mv_web/components/export_dropdown.ex
-#~ #, elixir-autogen, elixir-format
-#~ msgid "PDF"
-#~ msgstr "PDF"
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot
index 73cb815..3c21f67 100644
--- a/priv/gettext/default.pot
+++ b/priv/gettext/default.pot
@@ -40,6 +40,16 @@ msgstr[1] ""
msgid "%{count} synced"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "%{field} from"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "%{field} to"
+msgstr ""
+
#: lib/mv/membership/import/member_csv.ex
#, elixir-autogen, elixir-format
msgid "(ISO-8601 format: YYYY-MM-DD)"
@@ -97,6 +107,11 @@ msgstr ""
msgid "Active members"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Active only"
+msgstr ""
+
#: lib/mv_web/live/group_live/show.ex
#, elixir-autogen, elixir-format
msgid "Add Member"
@@ -154,6 +169,11 @@ msgstr ""
msgid "All years combined (pie)"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Allow direct registration (/register)"
+msgstr ""
+
#: lib/mv_web/live/membership_fee_type_live/form.ex
#, elixir-autogen, elixir-format
msgid "Already paid cycles will remain with the old amount."
@@ -172,7 +192,7 @@ msgstr ""
msgid "An account with this email already exists. Please verify your password to link your OIDC account."
msgstr ""
-#: lib/mv_web/live/member_live/show/membership_fees_component.ex
+#: lib/mv_web/helpers/ash_error_helpers.ex
#: lib/mv_web/live/membership_fee_settings_live.ex
#: lib/mv_web/live/membership_fee_type_live/index.ex
#: lib/mv_web/live/role_live/helpers.ex
@@ -185,6 +205,11 @@ msgstr ""
msgid "App URL (contact view link)"
msgstr ""
+#: lib/mv_web/live/join_request_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Applicant data"
+msgstr ""
+
#: lib/mv_web/live/components/member_filter_component.ex
#, elixir-autogen, elixir-format
msgid "Apply filters"
@@ -274,6 +299,11 @@ msgstr ""
msgid "Aug."
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Authentication"
+msgstr ""
+
#: lib/mv_web/controllers/auth_controller.ex
#, elixir-autogen, elixir-format
msgid "Authentication configuration error. Please contact the administrator."
@@ -321,6 +351,11 @@ msgstr ""
msgid "Back to groups list"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Back to join form"
+msgstr ""
+
#: lib/mv_web/live/join_request_live/show.ex
#, elixir-autogen, elixir-format
msgid "Back to join requests"
@@ -391,6 +426,7 @@ msgstr ""
#: lib/mv_web/live/member_field_live/form_component.ex
#: lib/mv_web/live/member_live/form.ex
#: lib/mv_web/live/member_live/show.ex
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#: lib/mv_web/live/membership_fee_type_live/form.ex
#: lib/mv_web/live/role_live/show.ex
@@ -534,6 +570,11 @@ msgstr ""
msgid "Club Settings"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Column"
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Completed"
@@ -564,6 +605,11 @@ msgstr ""
msgid "Confirm Password"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Confirm and Import"
+msgstr ""
+
#: lib/mv_web/templates/emails/user_confirmation.html.heex
#, elixir-autogen, elixir-format
msgid "Confirm my email"
@@ -667,11 +713,21 @@ msgid_plural "Copied %{count} email addresses to clipboard"
msgstr[0] ""
msgstr[1] ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Copy"
+msgstr ""
+
#: lib/mv_web/components/bulk_actions_dropdown.ex
#, elixir-autogen, elixir-format
msgid "Copy email addresses"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Copy join page URL"
+msgstr ""
+
#: lib/mv_web/live/datafields_live.ex
#, elixir-autogen, elixir-format
msgid "Could not load data fields. Please check your permissions."
@@ -720,11 +776,26 @@ msgstr ""
msgid "Create a new cycle manually"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Create custom field"
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Create fee type"
+msgstr ""
+
#: lib/mv/membership/members_pdf.ex
#, elixir-autogen, elixir-format
msgid "Created at:"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Creates a Vereinfacht finance contact for every member that does not have one yet."
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Credit"
@@ -760,6 +831,16 @@ msgstr ""
msgid "Custom Fields"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Custom date fields"
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Custom field"
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Cycle"
@@ -834,6 +915,31 @@ msgstr ""
msgid "Date"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Dates"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Deactivate"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Deactivate member"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Deactivate member %{name}"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Deactivating this member records an exit date. You can reactivate them later."
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Dec."
@@ -1031,6 +1137,16 @@ msgstr ""
msgid "Description"
msgstr ""
+#: lib/mv_web/live/custom_field_live/form_component.ex
+#, elixir-autogen, elixir-format
+msgid "Description for join form"
+msgstr ""
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Direct registration"
+msgstr ""
+
#: lib/mv_web/live/import_live/components.ex
#, elixir-autogen, elixir-format
msgid "Download CSV templates:"
@@ -1180,6 +1296,22 @@ msgstr ""
msgid "Exit Date"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Exit date"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Exit date from"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Exit date to"
+msgstr ""
+
#: lib/mv_web/live/statistics_live.ex
#, elixir-autogen, elixir-format
msgid "Exits"
@@ -1205,6 +1337,16 @@ msgstr ""
msgid "Export members to PDF"
msgstr ""
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format
+msgid "Export to CSV"
+msgstr ""
+
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format
+msgid "Export to PDF"
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "Failed members:"
@@ -1301,6 +1443,11 @@ msgstr ""
msgid "Failed to update cycle status: %{errors}"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Failed to update setting."
+msgstr ""
+
#: lib/mv_web/live/import_live/components.ex
#, elixir-autogen, elixir-format
msgid "Failed: %{count} row(s)"
@@ -1317,12 +1464,27 @@ msgstr ""
msgid "Fee Type"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Fee status columns (Membership Fee Status, Bezahlstatus, Mitgliedsbeitragsstatus) are always ignored and cannot be imported."
+msgstr ""
+
#: lib/mv_web/live/import_live/components.ex
#: lib/mv_web/live/statistics_live.ex
#, elixir-autogen, elixir-format
msgid "Fee type"
msgstr ""
+#: lib/mv/membership/import/member_csv.ex
+#, elixir-autogen, elixir-format
+msgid "Fee type '%{name}' not found; using the default fee type."
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Fee type column (recognized headers): Fee Type, fee type, fee_type, membership_fee_type, Beitragsart. Unknown fee types fall back to the default."
+msgstr ""
+
#: lib/mv_web/live/components/member_filter_component.ex
#, elixir-autogen, elixir-format
msgid "Fee types"
@@ -1368,6 +1530,11 @@ msgstr ""
msgid "Fixed after creation. Members can only switch between types with the same interval."
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "From"
+msgstr ""
+
#: lib/mv_web/live/statistics_live.ex
#, elixir-autogen, elixir-format
msgid "From %{first} to %{last} (relevant years with membership data)"
@@ -1453,6 +1620,21 @@ msgstr ""
msgid "German Template"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Go to join form"
+msgstr ""
+
+#: lib/mv_web/live/group_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Group %{name}"
+msgstr ""
+
+#: lib/mv/membership/import/member_csv.ex
+#, elixir-autogen, elixir-format
+msgid "Group assignment failed: %{reason}"
+msgstr ""
+
#: lib/mv_web/live/group_live/show.ex
#, elixir-autogen, elixir-format
msgid "Group deleted successfully."
@@ -1490,6 +1672,11 @@ msgstr ""
msgid "Groups claim"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Groups column (recognized headers): Groups, Gruppen, Gruppe. Comma-separated group names are supported and missing groups are created automatically."
+msgstr ""
+
#: lib/mv_web/helpers/membership_fee_helpers.ex
#: lib/mv_web/live/membership_fee_settings_live.ex
#: lib/mv_web/live/membership_fee_type_live/form.ex
@@ -1502,6 +1689,11 @@ msgstr ""
msgid "History"
msgstr ""
+#: lib/mv_web/controllers/page_controller.ex
+#, elixir-autogen, elixir-format
+msgid "Home"
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "Host"
@@ -1513,6 +1705,11 @@ msgstr ""
msgid "House Number"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "If disabled, users cannot sign up via /register; sign-in and the join form remain available."
+msgstr ""
+
#: lib/mv_web/templates/emails/user_confirmation.html.heex
#, elixir-autogen, elixir-format
msgid "If you did not create an account, you can ignore this email."
@@ -1528,6 +1725,17 @@ msgstr ""
msgid "If you did not submit this request, you can ignore this email."
msgstr ""
+#: lib/mv_web/templates/emails/join_already_member.html.heex
+#: lib/mv_web/templates/emails/join_already_pending.html.heex
+#, elixir-autogen, elixir-format
+msgid "If you have any questions, please contact us."
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Ignored (system-computed field)"
+msgstr ""
+
#: lib/mv_web/components/layouts/sidebar.ex
#: lib/mv_web/live/import_live.ex
#, elixir-autogen, elixir-format
@@ -1564,6 +1772,11 @@ msgstr ""
msgid "Inactive members"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Inactive only"
+msgstr ""
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "Include both letters and numbers"
@@ -1633,6 +1846,7 @@ msgstr ""
msgid "Invalid chunk index: %{idx}"
msgstr ""
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Invalid date format"
@@ -1643,6 +1857,16 @@ msgstr ""
msgid "Invalid email address. Please enter a valid recipient address."
msgstr ""
+#: lib/mv_web/controllers/join_confirm_controller.ex
+#, elixir-autogen, elixir-format
+msgid "Invalid link"
+msgstr ""
+
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Invalid or expired link"
+msgstr ""
+
#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
#, elixir-autogen, elixir-format
msgid "Invalid or expired link."
@@ -1658,6 +1882,11 @@ msgstr ""
msgid "Jan."
msgstr ""
+#: lib/mv_web/live/join_live.ex
+#, elixir-autogen, elixir-format
+msgid "Join"
+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
@@ -1671,11 +1900,46 @@ msgstr ""
msgid "Join Form"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_controller.ex
+#, elixir-autogen, elixir-format
+msgid "Join confirmation"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Join date"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Join date from"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Join date to"
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "Join form enabled"
msgstr ""
+#: lib/mv_web/live/member_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Join form:"
+msgstr ""
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Join page URL"
+msgstr ""
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Join page URL copied to clipboard."
+msgstr ""
+
#: lib/mv_web/live/join_request_live/show.ex
#, elixir-autogen, elixir-format
msgid "Join request"
@@ -1765,6 +2029,17 @@ msgstr ""
msgid "Line %{line}: %{message}"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_controller.ex
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Link expired"
+msgstr ""
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Link to the public join page (share this with applicants):"
+msgstr ""
+
#: lib/mv_web/live/user_live/index.html.heex
#: lib/mv_web/live/user_live/show.ex
#, elixir-autogen, elixir-format
@@ -1848,6 +2123,11 @@ msgstr ""
msgid "Member %{club_name}"
msgstr ""
+#: lib/mv_web/live/member_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Member %{name}"
+msgstr ""
+
#: lib/mv/membership/members_pdf.ex
#, elixir-autogen, elixir-format
msgid "Member count:"
@@ -1864,6 +2144,11 @@ msgstr ""
msgid "Member deleted successfully"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Member field"
+msgstr ""
+
#: lib/mv_web/live/datafields_live.ex
#, elixir-autogen, elixir-format
msgid "Member field %{action} successfully"
@@ -1982,6 +2267,16 @@ msgstr ""
msgid "Membership Fees"
msgstr ""
+#: lib/mv_web/emails/join_already_member_email.ex
+#, elixir-autogen, elixir-format
+msgid "Membership application – already a member"
+msgstr ""
+
+#: lib/mv_web/emails/join_already_pending_email.ex
+#, elixir-autogen, elixir-format
+msgid "Membership application – already under review"
+msgstr ""
+
#: lib/mv_web/components/layouts/sidebar.ex
#: lib/mv_web/live/membership_fee_settings_live.ex
#: lib/mv_web/live/membership_fee_type_live/index.ex
@@ -2027,6 +2322,11 @@ msgstr ""
msgid "Membership fee types define different membership fee structures. Each type has a fixed interval (monthly, quarterly, half-yearly, yearly) that cannot be changed after creation."
msgstr ""
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Membership status"
+msgstr ""
+
#: lib/mv/mailer.ex
#, elixir-autogen, elixir-format
msgid "Mila – Test email"
@@ -2204,6 +2504,11 @@ msgstr ""
msgid "No membership fee type assigned"
msgstr ""
+#: lib/mv_web/live/import_live.ex
+#, elixir-autogen, elixir-format
+msgid "No prepared import to confirm. Please upload again."
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "No receipts"
@@ -2320,6 +2625,11 @@ msgstr ""
msgid "OIDC (Single Sign-On)"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "OIDC enables Single Sign-On: once configured, members sign in through your identity provider instead of a separate Mila password."
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Oct."
@@ -2330,6 +2640,11 @@ msgstr ""
msgid "Only OIDC sign-in (hide password login)"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Only OIDC sign-in is active. This option is disabled."
+msgstr ""
+
#: lib/mv_web/live/import_live.ex
#, elixir-autogen, elixir-format
msgid "Only administrators can import members from CSV files."
@@ -2346,6 +2661,11 @@ msgstr ""
msgid "Only possible if no members are assigned to this type."
msgstr ""
+#: lib/mv_web/controllers/auth_controller.ex
+#, elixir-autogen, elixir-format
+msgid "Only sign-in via Single Sign-On (SSO) is allowed."
+msgstr ""
+
#: lib/mv_web/components/bulk_actions_dropdown.ex
#, elixir-autogen, elixir-format
msgid "Open in email program"
@@ -2490,6 +2810,11 @@ msgstr ""
msgid "Postal Code"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Preview import"
+msgstr ""
+
#: lib/mv_web/live/import_live/components.ex
#, elixir-autogen, elixir-format
msgid "Processing chunk %{current} of %{total}..."
@@ -2512,6 +2837,21 @@ msgstr ""
msgid "Quarterly Interval - Joining Cycle Excluded"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Range"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Reactivate member"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Reactivate member %{name}"
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Receipt"
@@ -2537,6 +2877,11 @@ msgstr ""
msgid "Regenerate Cycles"
msgstr ""
+#: lib/mv_web/live/member_live/show/membership_fees_component.ex
+#, elixir-autogen, elixir-format
+msgid "Regenerate membership fee cycles"
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Regenerating..."
@@ -2627,6 +2972,11 @@ msgstr ""
msgid "Role"
msgstr ""
+#: lib/mv_web/live/role_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Role %{name}"
+msgstr ""
+
#: lib/mv_web/live/role_live/show.ex
#, elixir-autogen, elixir-format
msgid "Role deleted successfully."
@@ -2654,16 +3004,46 @@ msgstr ""
msgid "Roles"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Row 1"
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Row 2"
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Row 3"
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Rows with an empty fee type will get the default fee type."
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "SMTP / E-Mail"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "SMTP environment configuration appears incomplete. Missing: %{keys}"
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "SMTP error:"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "SMTP is fully managed via environment variables. All SMTP fields are read-only."
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "SMTP is not configured. Please set at least the SMTP host."
@@ -2919,6 +3299,11 @@ msgstr ""
msgid "Show/Hide Columns"
msgstr ""
+#: lib/mv_web/live/auth/sign_in_live.ex
+#, elixir-autogen, elixir-format
+msgid "Sign in"
+msgstr ""
+
#: lib/mv_web/live/datafields_live.ex
#, elixir-autogen, elixir-format
msgid "Slug does not match. Deletion cancelled."
@@ -2963,6 +3348,11 @@ msgstr ""
msgid "Status"
msgstr ""
+#: lib/mv_web/live/join_request_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Status and review"
+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
@@ -2970,6 +3360,11 @@ msgstr ""
msgid "Street"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Submit new request"
+msgstr ""
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "Submit request"
@@ -3092,6 +3487,11 @@ msgstr ""
msgid "Text"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Thank you"
+msgstr ""
+
#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
#, elixir-autogen, elixir-format
msgid "Thank you, we have received your request."
@@ -3122,6 +3522,11 @@ msgstr ""
msgid "These fields are necessary for MILA to handle member identification and payment calculations in the future. Thus you cannot delete these fields but hide them in the member overview."
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "These groups will be created automatically: %{names}"
+msgstr ""
+
#: lib/mv_web/live/custom_field_live/index_component.ex
#, elixir-autogen, elixir-format
msgid "These will appear in addition to other data when adding new members."
@@ -3170,6 +3575,11 @@ msgstr ""
msgid "This link has expired. Please submit the form again."
msgstr ""
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "This member is deactivated (exit date set). Reactivating clears the exit date."
+msgstr ""
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "This user cannot be edited."
@@ -3190,6 +3600,11 @@ msgstr ""
msgid "Tip: Paste email addresses into the BCC field for privacy compliance"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "To"
+msgstr ""
+
#: lib/mv_web/live/group_live/show.ex
#, elixir-autogen, elixir-format
msgid "To confirm deletion, please enter the group name:"
@@ -3210,6 +3625,11 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format
+msgid "Too many recipients for this function. Copy the addresses or export the list."
+msgstr ""
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "Too many requests. Please try again later."
@@ -3248,6 +3668,11 @@ msgstr ""
msgid "Unable to sign in. Please try again."
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Unknown (ignored)"
+msgstr ""
+
#: lib/mv/membership/import/member_csv.ex
#, elixir-autogen, elixir-format
msgid "Unknown column '%{header}' will be ignored. If this is a custom field, create it in Mila before importing."
@@ -3259,6 +3684,11 @@ msgstr ""
msgid "Unknown error"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Unknown fee types (members get the default): %{names}"
+msgstr ""
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "Unlink Member"
@@ -3279,6 +3709,11 @@ msgstr ""
msgid "Unpaid"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Use the data field name as the CSV column header in your file. Data fields must exist in Mila before importing, because unknown data field columns will be ignored."
+msgstr ""
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "User"
@@ -3289,6 +3724,11 @@ msgstr ""
msgid "User %{action} successfully"
msgstr ""
+#: lib/mv_web/live/user_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "User %{email}"
+msgstr ""
+
#: lib/mv_web/live/user_live/form.ex
#: lib/mv_web/live/user_live/show.ex
#, elixir-autogen, elixir-format
@@ -3402,11 +3842,26 @@ msgstr ""
msgid "We can't find the internet"
msgstr ""
+#: lib/mv_web/live/join_live.ex
+#, elixir-autogen, elixir-format
+msgid "We could not send the confirmation email. Please try again later or contact support."
+msgstr ""
+
#: lib/mv_web/templates/emails/join_confirmation.html.heex
#, elixir-autogen, elixir-format
msgid "We have received your membership request. To complete it, please click the link below."
msgstr ""
+#: lib/mv_web/templates/emails/join_already_member.html.heex
+#, elixir-autogen, elixir-format
+msgid "We have received your request. The email address you entered is already registered as a member."
+msgstr ""
+
+#: lib/mv_web/templates/emails/join_already_pending.html.heex
+#, elixir-autogen, elixir-format
+msgid "We have received your request. You already have a membership application that is being reviewed."
+msgstr ""
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "We have saved your details. To complete your request, please click the link we sent to your email."
@@ -3417,6 +3872,11 @@ msgstr ""
msgid "Website"
msgstr ""
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "When did this member leave?"
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign-On button."
@@ -3461,12 +3921,17 @@ msgstr ""
msgid "Yes/No-Selection"
msgstr ""
+#: lib/mv_web/templates/emails/join_confirmation.html.heex
+#, elixir-autogen, elixir-format
+msgid "You already had a pending request. Here is a new confirmation link."
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "You are about to delete all %{count} cycles for this member."
msgstr ""
-#: lib/mv_web/live/member_live/show/membership_fees_component.ex
+#: lib/mv_web/helpers/ash_error_helpers.ex
#, elixir-autogen, elixir-format
msgid "You are not allowed to perform this action."
msgstr ""
@@ -3481,6 +3946,11 @@ msgstr ""
msgid "You are now signed out"
msgstr ""
+#: lib/mv_web/live/custom_field_live/form_component.ex
+#, elixir-autogen, elixir-format
+msgid "You can add links: full addresses (https://…) or as [link text](https://…)."
+msgstr ""
+
#: lib/mv_web/live/member_live/form.ex
#, elixir-autogen, elixir-format
msgid "You do not have permission to %{action} members."
@@ -3525,6 +3995,11 @@ msgstr ""
msgid "You requested a password reset. Click the link below to set a new password."
msgstr ""
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "You will receive an email once your application has been reviewed."
+msgstr ""
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "Your details are only used to process your membership application and to contact you. To prevent abuse we also process technical data (e.g. IP address) only as necessary."
@@ -3603,6 +4078,16 @@ msgstr ""
msgid "email %{email} has already been taken"
msgstr ""
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format
+msgid "filtered"
+msgstr ""
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "join page URL in a new tab"
+msgstr ""
+
#: lib/mv_web/live/role_live/form.ex
#, elixir-autogen, elixir-format
msgid "normal_user - Create/Read/Update access"
@@ -3649,193 +4134,6 @@ msgstr ""
msgid "without %{name}"
msgstr ""
-#: lib/mv_web/live/join_request_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Applicant data"
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Copy"
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Copy join page URL"
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Join page URL"
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Join page URL copied to clipboard."
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Link to the public join page (share this with applicants):"
-msgstr ""
-
-#: lib/mv_web/live/join_request_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Status and review"
-msgstr ""
-
-#: lib/mv_web/live/join_live.ex
-#, elixir-autogen, elixir-format
-msgid "We could not send the confirmation email. Please try again later or contact support."
-msgstr ""
-
-#: lib/mv_web/templates/emails/join_already_member.html.heex
-#: lib/mv_web/templates/emails/join_already_pending.html.heex
-#, elixir-autogen, elixir-format
-msgid "If you have any questions, please contact us."
-msgstr ""
-
-#: lib/mv_web/emails/join_already_member_email.ex
-#, elixir-autogen, elixir-format
-msgid "Membership application – already a member"
-msgstr ""
-
-#: lib/mv_web/emails/join_already_pending_email.ex
-#, elixir-autogen, elixir-format
-msgid "Membership application – already under review"
-msgstr ""
-
-#: lib/mv_web/templates/emails/join_already_member.html.heex
-#, elixir-autogen, elixir-format
-msgid "We have received your request. The email address you entered is already registered as a member."
-msgstr ""
-
-#: lib/mv_web/templates/emails/join_already_pending.html.heex
-#, elixir-autogen, elixir-format
-msgid "We have received your request. You already have a membership application that is being reviewed."
-msgstr ""
-
-#: lib/mv_web/templates/emails/join_confirmation.html.heex
-#, elixir-autogen, elixir-format
-msgid "You already had a pending request. Here is a new confirmation link."
-msgstr ""
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Back to join form"
-msgstr ""
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Go to join form"
-msgstr ""
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Invalid or expired link"
-msgstr ""
-
-#: lib/mv_web/controllers/join_confirm_controller.ex
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Link expired"
-msgstr ""
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Submit new request"
-msgstr ""
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Thank you"
-msgstr ""
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "You will receive an email once your application has been reviewed."
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Allow direct registration (/register)"
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Authentication"
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Direct registration"
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Failed to update setting."
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "If disabled, users cannot sign up via /register; sign-in and the join form remain available."
-msgstr ""
-
-#: lib/mv_web/controllers/page_controller.ex
-#, elixir-autogen, elixir-format
-msgid "Home"
-msgstr ""
-
-#: lib/mv_web/controllers/join_confirm_controller.ex
-#, elixir-autogen, elixir-format
-msgid "Invalid link"
-msgstr ""
-
-#: lib/mv_web/live/join_live.ex
-#, elixir-autogen, elixir-format
-msgid "Join"
-msgstr ""
-
-#: lib/mv_web/controllers/join_confirm_controller.ex
-#, elixir-autogen, elixir-format
-msgid "Join confirmation"
-msgstr ""
-
-#: lib/mv_web/live/auth/sign_in_live.ex
-#, elixir-autogen, elixir-format
-msgid "Sign in"
-msgstr ""
-
-#: lib/mv_web/live/group_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Group %{name}"
-msgstr ""
-
-#: lib/mv_web/live/member_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Member %{name}"
-msgstr ""
-
-#: lib/mv_web/live/role_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Role %{name}"
-msgstr ""
-
-#: lib/mv_web/live/user_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "User %{email}"
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Only OIDC sign-in is active. This option is disabled."
-msgstr ""
-
-#: lib/mv_web/controllers/auth_controller.ex
-#, elixir-autogen, elixir-format
-msgid "Only sign-in via Single Sign-On (SSO) is allowed."
-msgstr ""
-
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgctxt "action"
@@ -3847,238 +4145,3 @@ msgstr ""
msgctxt "status"
msgid "Open"
msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "join page URL in a new tab"
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "SMTP environment configuration appears incomplete. Missing: %{keys}"
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "SMTP is fully managed via environment variables. All SMTP fields are read-only."
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "%{field} from"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "%{field} to"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Active only"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Custom date fields"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Dates"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Exit date"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Exit date from"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Exit date to"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "From"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Inactive only"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Join date"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Join date from"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Join date to"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Range"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "To"
-msgstr ""
-
-#: lib/mv_web/live/member_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Join form:"
-msgstr ""
-
-#: lib/mv_web/live/custom_field_live/form_component.ex
-#, elixir-autogen, elixir-format
-msgid "Description for join form"
-msgstr ""
-
-#: lib/mv_web/live/custom_field_live/form_component.ex
-#, elixir-autogen, elixir-format
-msgid "You can add links: full addresses (https://…) or as [link text](https://…)."
-msgstr ""
-
-#: lib/mv/membership/import/member_csv.ex
-#, elixir-autogen, elixir-format
-msgid "Fee type '%{name}' not found; using the default fee type."
-msgstr ""
-
-#: lib/mv/membership/import/member_csv.ex
-#, elixir-autogen, elixir-format
-msgid "Group assignment failed: %{reason}"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Confirm and Import"
-msgstr ""
-
-#: lib/mv_web/live/import_live.ex
-#, elixir-autogen, elixir-format
-msgid "No prepared import to confirm. Please upload again."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Preview import"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Column"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Custom field"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Ignored (system-computed field)"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Member field"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Rows with an empty fee type will get the default fee type."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "These groups will be created automatically: %{names}"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Unknown (ignored)"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Unknown fee types (members get the default): %{names}"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Fee status columns (Membership Fee Status, Bezahlstatus, Mitgliedsbeitragsstatus) are always ignored and cannot be imported."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Groups column (recognized headers): Groups, Gruppen, Gruppe. Comma-separated group names are supported and missing groups are created automatically."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Use the data field name as the CSV column header in your file. Data fields must exist in Mila before importing, because unknown data field columns will be ignored."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Fee type column (recognized headers): Fee Type, fee type, fee_type, membership_fee_type, Beitragsart. Unknown fee types fall back to the default."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Create custom field"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Create fee type"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Row 1"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Row 2"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Row 3"
-msgstr ""
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format
-msgid "Export to CSV"
-msgstr ""
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format
-msgid "Export to PDF"
-msgstr ""
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format
-msgid "Too many recipients for this function. Copy the addresses or export the list."
-msgstr ""
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format
-msgid "filtered"
-msgstr ""
diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po
index 185be8b..cda87b5 100644
--- a/priv/gettext/en/LC_MESSAGES/default.po
+++ b/priv/gettext/en/LC_MESSAGES/default.po
@@ -40,6 +40,16 @@ msgstr[1] ""
msgid "%{count} synced"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "%{field} from"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "%{field} to"
+msgstr ""
+
#: lib/mv/membership/import/member_csv.ex
#, elixir-autogen, elixir-format
msgid "(ISO-8601 format: YYYY-MM-DD)"
@@ -97,6 +107,11 @@ msgstr ""
msgid "Active members"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Active only"
+msgstr ""
+
#: lib/mv_web/live/group_live/show.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Add Member"
@@ -154,6 +169,11 @@ msgstr ""
msgid "All years combined (pie)"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Allow direct registration (/register)"
+msgstr "Allow direct registration (/register)"
+
#: lib/mv_web/live/membership_fee_type_live/form.ex
#, elixir-autogen, elixir-format
msgid "Already paid cycles will remain with the old amount."
@@ -172,7 +192,7 @@ msgstr ""
msgid "An account with this email already exists. Please verify your password to link your OIDC account."
msgstr ""
-#: lib/mv_web/live/member_live/show/membership_fees_component.ex
+#: lib/mv_web/helpers/ash_error_helpers.ex
#: lib/mv_web/live/membership_fee_settings_live.ex
#: lib/mv_web/live/membership_fee_type_live/index.ex
#: lib/mv_web/live/role_live/helpers.ex
@@ -185,6 +205,11 @@ msgstr ""
msgid "App URL (contact view link)"
msgstr ""
+#: lib/mv_web/live/join_request_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Applicant data"
+msgstr "Applicant data"
+
#: lib/mv_web/live/components/member_filter_component.ex
#, elixir-autogen, elixir-format
msgid "Apply filters"
@@ -274,6 +299,11 @@ msgstr ""
msgid "Aug."
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Authentication"
+msgstr "Authentication"
+
#: lib/mv_web/controllers/auth_controller.ex
#, elixir-autogen, elixir-format
msgid "Authentication configuration error. Please contact the administrator."
@@ -321,6 +351,11 @@ msgstr ""
msgid "Back to groups list"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Back to join form"
+msgstr "Back to membership applications"
+
#: lib/mv_web/live/join_request_live/show.ex
#, elixir-autogen, elixir-format
msgid "Back to join requests"
@@ -391,6 +426,7 @@ msgstr ""
#: lib/mv_web/live/member_field_live/form_component.ex
#: lib/mv_web/live/member_live/form.ex
#: lib/mv_web/live/member_live/show.ex
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#: lib/mv_web/live/membership_fee_type_live/form.ex
#: lib/mv_web/live/role_live/show.ex
@@ -534,6 +570,11 @@ msgstr ""
msgid "Club Settings"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Column"
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Completed"
@@ -564,6 +605,11 @@ msgstr ""
msgid "Confirm Password"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Confirm and Import"
+msgstr ""
+
#: lib/mv_web/templates/emails/user_confirmation.html.heex
#, elixir-autogen, elixir-format
msgid "Confirm my email"
@@ -667,11 +713,21 @@ msgid_plural "Copied %{count} email addresses to clipboard"
msgstr[0] ""
msgstr[1] ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Copy"
+msgstr "Copy"
+
#: lib/mv_web/components/bulk_actions_dropdown.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Copy email addresses"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Copy join page URL"
+msgstr "Copy join page URL"
+
#: lib/mv_web/live/datafields_live.ex
#, elixir-autogen, elixir-format
msgid "Could not load data fields. Please check your permissions."
@@ -720,11 +776,26 @@ msgstr ""
msgid "Create a new cycle manually"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Create custom field"
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Create fee type"
+msgstr ""
+
#: lib/mv/membership/members_pdf.ex
#, elixir-autogen, elixir-format
msgid "Created at:"
msgstr "Created at:"
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Creates a Vereinfacht finance contact for every member that does not have one yet."
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Credit"
@@ -760,6 +831,16 @@ msgstr ""
msgid "Custom Fields"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Custom date fields"
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Custom field"
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Cycle"
@@ -834,6 +915,31 @@ msgstr ""
msgid "Date"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Dates"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Deactivate"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Deactivate member"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Deactivate member %{name}"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Deactivating this member records an exit date. You can reactivate them later."
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Dec."
@@ -1031,6 +1137,16 @@ msgstr ""
msgid "Description"
msgstr ""
+#: lib/mv_web/live/custom_field_live/form_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Description for join form"
+msgstr ""
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Direct registration"
+msgstr "Direct registration"
+
#: lib/mv_web/live/import_live/components.ex
#, elixir-autogen, elixir-format
msgid "Download CSV templates:"
@@ -1180,6 +1296,22 @@ msgstr ""
msgid "Exit Date"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Exit date"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Exit date from"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Exit date to"
+msgstr ""
+
#: lib/mv_web/live/statistics_live.ex
#, elixir-autogen, elixir-format
msgid "Exits"
@@ -1205,6 +1337,16 @@ msgstr ""
msgid "Export members to PDF"
msgstr ""
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Export to CSV"
+msgstr ""
+
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Export to PDF"
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Failed members:"
@@ -1301,6 +1443,11 @@ msgstr ""
msgid "Failed to update cycle status: %{errors}"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Failed to update setting."
+msgstr "Failed to update setting."
+
#: lib/mv_web/live/import_live/components.ex
#, elixir-autogen, elixir-format
msgid "Failed: %{count} row(s)"
@@ -1317,12 +1464,27 @@ msgstr ""
msgid "Fee Type"
msgstr "Fee Type"
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Fee status columns (Membership Fee Status, Bezahlstatus, Mitgliedsbeitragsstatus) are always ignored and cannot be imported."
+msgstr ""
+
#: lib/mv_web/live/import_live/components.ex
#: lib/mv_web/live/statistics_live.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Fee type"
msgstr ""
+#: lib/mv/membership/import/member_csv.ex
+#, elixir-autogen, elixir-format
+msgid "Fee type '%{name}' not found; using the default fee type."
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Fee type column (recognized headers): Fee Type, fee type, fee_type, membership_fee_type, Beitragsart. Unknown fee types fall back to the default."
+msgstr ""
+
#: lib/mv_web/live/components/member_filter_component.ex
#, elixir-autogen, elixir-format
msgid "Fee types"
@@ -1368,6 +1530,11 @@ msgstr ""
msgid "Fixed after creation. Members can only switch between types with the same interval."
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "From"
+msgstr ""
+
#: lib/mv_web/live/statistics_live.ex
#, elixir-autogen, elixir-format
msgid "From %{first} to %{last} (relevant years with membership data)"
@@ -1453,6 +1620,21 @@ msgstr ""
msgid "German Template"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Go to join form"
+msgstr "Go to join form"
+
+#: lib/mv_web/live/group_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Group %{name}"
+msgstr "Group %{name}"
+
+#: lib/mv/membership/import/member_csv.ex
+#, elixir-autogen, elixir-format
+msgid "Group assignment failed: %{reason}"
+msgstr ""
+
#: lib/mv_web/live/group_live/show.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Group deleted successfully."
@@ -1490,6 +1672,11 @@ msgstr ""
msgid "Groups claim"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Groups column (recognized headers): Groups, Gruppen, Gruppe. Comma-separated group names are supported and missing groups are created automatically."
+msgstr ""
+
#: lib/mv_web/helpers/membership_fee_helpers.ex
#: lib/mv_web/live/membership_fee_settings_live.ex
#: lib/mv_web/live/membership_fee_type_live/form.ex
@@ -1502,6 +1689,11 @@ msgstr ""
msgid "History"
msgstr ""
+#: lib/mv_web/controllers/page_controller.ex
+#, elixir-autogen, elixir-format
+msgid "Home"
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "Host"
@@ -1513,6 +1705,11 @@ msgstr ""
msgid "House Number"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "If disabled, users cannot sign up via /register; sign-in and the join form remain available."
+msgstr "If disabled, users cannot sign up via /register; sign-in and the join form remain available."
+
#: lib/mv_web/templates/emails/user_confirmation.html.heex
#, elixir-autogen, elixir-format
msgid "If you did not create an account, you can ignore this email."
@@ -1528,6 +1725,17 @@ msgstr "If you did not request this, you can ignore this email. Your password wi
msgid "If you did not submit this request, you can ignore this email."
msgstr "If you did not submit this request, you can ignore this email."
+#: lib/mv_web/templates/emails/join_already_member.html.heex
+#: lib/mv_web/templates/emails/join_already_pending.html.heex
+#, elixir-autogen, elixir-format
+msgid "If you have any questions, please contact us."
+msgstr "If you have any questions, please contact us."
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Ignored (system-computed field)"
+msgstr ""
+
#: lib/mv_web/components/layouts/sidebar.ex
#: lib/mv_web/live/import_live.ex
#, elixir-autogen, elixir-format, fuzzy
@@ -1564,6 +1772,11 @@ msgstr ""
msgid "Inactive members"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Inactive only"
+msgstr ""
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "Include both letters and numbers"
@@ -1633,6 +1846,7 @@ msgstr ""
msgid "Invalid chunk index: %{idx}"
msgstr ""
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Invalid date format"
@@ -1643,6 +1857,16 @@ msgstr ""
msgid "Invalid email address. Please enter a valid recipient address."
msgstr ""
+#: lib/mv_web/controllers/join_confirm_controller.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Invalid link"
+msgstr "Invalid or expired link."
+
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Invalid or expired link"
+msgstr "Invalid or expired link."
+
#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
#, elixir-autogen, elixir-format
msgid "Invalid or expired link."
@@ -1658,6 +1882,11 @@ msgstr ""
msgid "Jan."
msgstr ""
+#: lib/mv_web/live/join_live.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Join"
+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
@@ -1671,11 +1900,46 @@ msgstr ""
msgid "Join Form"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_controller.ex
+#, elixir-autogen, elixir-format
+msgid "Join confirmation"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Join date"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Join date from"
+msgstr ""
+
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Join date to"
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "Join form enabled"
msgstr ""
+#: lib/mv_web/live/member_live/show.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Join form:"
+msgstr ""
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Join page URL"
+msgstr "Join page URL"
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Join page URL copied to clipboard."
+msgstr "Join page URL copied to clipboard."
+
#: lib/mv_web/live/join_request_live/show.ex
#, elixir-autogen, elixir-format
msgid "Join request"
@@ -1765,6 +2029,17 @@ msgstr ""
msgid "Line %{line}: %{message}"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_controller.ex
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Link expired"
+msgstr "Link expired"
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Link to the public join page (share this with applicants):"
+msgstr "Link to the public join page (share this with applicants):"
+
#: lib/mv_web/live/user_live/index.html.heex
#: lib/mv_web/live/user_live/show.ex
#, elixir-autogen, elixir-format, fuzzy
@@ -1848,6 +2123,11 @@ msgstr ""
msgid "Member %{club_name}"
msgstr "Member %{club_name}"
+#: lib/mv_web/live/member_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Member %{name}"
+msgstr "Member %{name}"
+
#: lib/mv/membership/members_pdf.ex
#, elixir-autogen, elixir-format
msgid "Member count:"
@@ -1864,6 +2144,11 @@ msgstr "Member created successfully"
msgid "Member deleted successfully"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Member field"
+msgstr ""
+
#: lib/mv_web/live/datafields_live.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Member field %{action} successfully"
@@ -1982,6 +2267,16 @@ msgstr ""
msgid "Membership Fees"
msgstr ""
+#: lib/mv_web/emails/join_already_member_email.ex
+#, elixir-autogen, elixir-format
+msgid "Membership application – already a member"
+msgstr "Membership application – already a member"
+
+#: lib/mv_web/emails/join_already_pending_email.ex
+#, elixir-autogen, elixir-format
+msgid "Membership application – already under review"
+msgstr "Membership application – already under review"
+
#: lib/mv_web/components/layouts/sidebar.ex
#: lib/mv_web/live/membership_fee_settings_live.ex
#: lib/mv_web/live/membership_fee_type_live/index.ex
@@ -2027,6 +2322,11 @@ msgstr ""
msgid "Membership fee types define different membership fee structures. Each type has a fixed interval (monthly, quarterly, half-yearly, yearly) that cannot be changed after creation."
msgstr ""
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Membership status"
+msgstr ""
+
#: lib/mv/mailer.ex
#, elixir-autogen, elixir-format
msgid "Mila – Test email"
@@ -2204,6 +2504,11 @@ msgstr ""
msgid "No membership fee type assigned"
msgstr ""
+#: lib/mv_web/live/import_live.ex
+#, elixir-autogen, elixir-format
+msgid "No prepared import to confirm. Please upload again."
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "No receipts"
@@ -2320,6 +2625,11 @@ msgstr ""
msgid "OIDC (Single Sign-On)"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "OIDC enables Single Sign-On: once configured, members sign in through your identity provider instead of a separate Mila password."
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Oct."
@@ -2330,6 +2640,11 @@ msgstr ""
msgid "Only OIDC sign-in (hide password login)"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "Only OIDC sign-in is active. This option is disabled."
+msgstr ""
+
#: lib/mv_web/live/import_live.ex
#, elixir-autogen, elixir-format
msgid "Only administrators can import members from CSV files."
@@ -2346,6 +2661,11 @@ msgstr ""
msgid "Only possible if no members are assigned to this type."
msgstr ""
+#: lib/mv_web/controllers/auth_controller.ex
+#, elixir-autogen, elixir-format
+msgid "Only sign-in via Single Sign-On (SSO) is allowed."
+msgstr ""
+
#: lib/mv_web/components/bulk_actions_dropdown.ex
#, elixir-autogen, elixir-format
msgid "Open in email program"
@@ -2490,6 +2810,11 @@ msgstr ""
msgid "Postal Code"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Preview import"
+msgstr ""
+
#: lib/mv_web/live/import_live/components.ex
#, elixir-autogen, elixir-format
msgid "Processing chunk %{current} of %{total}..."
@@ -2512,6 +2837,21 @@ msgstr ""
msgid "Quarterly Interval - Joining Cycle Excluded"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "Range"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Reactivate member"
+msgstr ""
+
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "Reactivate member %{name}"
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Receipt"
@@ -2537,6 +2877,11 @@ msgstr ""
msgid "Regenerate Cycles"
msgstr ""
+#: lib/mv_web/live/member_live/show/membership_fees_component.ex
+#, elixir-autogen, elixir-format
+msgid "Regenerate membership fee cycles"
+msgstr ""
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "Regenerating..."
@@ -2627,6 +2972,11 @@ msgstr "Review date"
msgid "Role"
msgstr ""
+#: lib/mv_web/live/role_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Role %{name}"
+msgstr "Role %{name}"
+
#: lib/mv_web/live/role_live/show.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Role deleted successfully."
@@ -2654,16 +3004,46 @@ msgstr ""
msgid "Roles"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Row 1"
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Row 2"
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Row 3"
+msgstr ""
+
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Rows with an empty fee type will get the default fee type."
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "SMTP / E-Mail"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "SMTP environment configuration appears incomplete. Missing: %{keys}"
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "SMTP error:"
msgstr ""
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "SMTP is fully managed via environment variables. All SMTP fields are read-only."
+msgstr "SMTP is fully managed via environment variables. All SMTP fields are read-only."
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "SMTP is not configured. Please set at least the SMTP host."
@@ -2919,6 +3299,11 @@ msgstr ""
msgid "Show/Hide Columns"
msgstr ""
+#: lib/mv_web/live/auth/sign_in_live.ex
+#, elixir-autogen, elixir-format
+msgid "Sign in"
+msgstr ""
+
#: lib/mv_web/live/datafields_live.ex
#, elixir-autogen, elixir-format
msgid "Slug does not match. Deletion cancelled."
@@ -2963,6 +3348,11 @@ msgstr ""
msgid "Status"
msgstr ""
+#: lib/mv_web/live/join_request_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "Status and review"
+msgstr "Status and review"
+
#: lib/mv_web/live/member_live/form.ex
#: lib/mv_web/live/member_live/index.html.heex
#: lib/mv_web/translations/member_fields.ex
@@ -2970,6 +3360,11 @@ msgstr ""
msgid "Street"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Submit new request"
+msgstr "Submit new request"
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "Submit request"
@@ -3092,6 +3487,11 @@ msgstr ""
msgid "Text"
msgstr ""
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "Thank you"
+msgstr "Thank you"
+
#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
#, elixir-autogen, elixir-format
msgid "Thank you, we have received your request."
@@ -3122,6 +3522,11 @@ msgstr ""
msgid "These fields are necessary for MILA to handle member identification and payment calculations in the future. Thus you cannot delete these fields but hide them in the member overview."
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "These groups will be created automatically: %{names}"
+msgstr ""
+
#: lib/mv_web/live/custom_field_live/index_component.ex
#, elixir-autogen, elixir-format
msgid "These will appear in addition to other data when adding new members."
@@ -3170,6 +3575,11 @@ msgstr ""
msgid "This link has expired. Please submit the form again."
msgstr "This link has expired. Please submit the form again."
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "This member is deactivated (exit date set). Reactivating clears the exit date."
+msgstr ""
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "This user cannot be edited."
@@ -3190,6 +3600,11 @@ msgstr ""
msgid "Tip: Paste email addresses into the BCC field for privacy compliance"
msgstr ""
+#: lib/mv_web/live/components/member_filter_component.ex
+#, elixir-autogen, elixir-format
+msgid "To"
+msgstr ""
+
#: lib/mv_web/live/group_live/show.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "To confirm deletion, please enter the group name:"
@@ -3210,6 +3625,11 @@ msgstr ""
msgid "Toggle sidebar"
msgstr ""
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format
+msgid "Too many recipients for this function. Copy the addresses or export the list."
+msgstr ""
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "Too many requests. Please try again later."
@@ -3248,6 +3668,11 @@ msgstr ""
msgid "Unable to sign in. Please try again."
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Unknown (ignored)"
+msgstr ""
+
#: lib/mv/membership/import/member_csv.ex
#, elixir-autogen, elixir-format
msgid "Unknown column '%{header}' will be ignored. If this is a custom field, create it in Mila before importing."
@@ -3259,6 +3684,11 @@ msgstr "Unknown column '%{header}' will be ignored. If this is a custom field, c
msgid "Unknown error"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format
+msgid "Unknown fee types (members get the default): %{names}"
+msgstr ""
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "Unlink Member"
@@ -3279,6 +3709,11 @@ msgstr ""
msgid "Unpaid"
msgstr ""
+#: lib/mv_web/live/import_live/components.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Use the data field name as the CSV column header in your file. Data fields must exist in Mila before importing, because unknown data field columns will be ignored."
+msgstr ""
+
#: lib/mv_web/live/user_live/form.ex
#, elixir-autogen, elixir-format
msgid "User"
@@ -3289,6 +3724,11 @@ msgstr ""
msgid "User %{action} successfully"
msgstr ""
+#: lib/mv_web/live/user_live/show.ex
+#, elixir-autogen, elixir-format
+msgid "User %{email}"
+msgstr "User %{email}"
+
#: lib/mv_web/live/user_live/form.ex
#: lib/mv_web/live/user_live/show.ex
#, elixir-autogen, elixir-format, fuzzy
@@ -3402,11 +3842,26 @@ msgstr ""
msgid "We can't find the internet"
msgstr ""
+#: lib/mv_web/live/join_live.ex
+#, elixir-autogen, elixir-format
+msgid "We could not send the confirmation email. Please try again later or contact support."
+msgstr ""
+
#: lib/mv_web/templates/emails/join_confirmation.html.heex
#, elixir-autogen, elixir-format
msgid "We have received your membership request. To complete it, please click the link below."
msgstr "We have received your membership request. To complete it, please click the link below."
+#: lib/mv_web/templates/emails/join_already_member.html.heex
+#, elixir-autogen, elixir-format
+msgid "We have received your request. The email address you entered is already registered as a member."
+msgstr "We have received your request. The email address you entered is already registered as a member."
+
+#: lib/mv_web/templates/emails/join_already_pending.html.heex
+#, elixir-autogen, elixir-format
+msgid "We have received your request. You already have a membership application that is being reviewed."
+msgstr "We have received your request. You already have a membership application that is being reviewed."
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "We have saved your details. To complete your request, please click the link we sent to your email."
@@ -3417,6 +3872,11 @@ msgstr ""
msgid "Website"
msgstr ""
+#: lib/mv_web/live/member_live/show/deactivate_component.ex
+#, elixir-autogen, elixir-format
+msgid "When did this member leave?"
+msgstr ""
+
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign-On button."
@@ -3461,12 +3921,17 @@ msgstr ""
msgid "Yes/No-Selection"
msgstr ""
+#: lib/mv_web/templates/emails/join_confirmation.html.heex
+#, elixir-autogen, elixir-format
+msgid "You already had a pending request. Here is a new confirmation link."
+msgstr "You already had a pending request. Here is a new confirmation link."
+
#: lib/mv_web/live/member_live/show/membership_fees_component.ex
#, elixir-autogen, elixir-format
msgid "You are about to delete all %{count} cycles for this member."
msgstr ""
-#: lib/mv_web/live/member_live/show/membership_fees_component.ex
+#: lib/mv_web/helpers/ash_error_helpers.ex
#, elixir-autogen, elixir-format
msgid "You are not allowed to perform this action."
msgstr ""
@@ -3481,6 +3946,11 @@ msgstr ""
msgid "You are now signed out"
msgstr ""
+#: lib/mv_web/live/custom_field_live/form_component.ex
+#, elixir-autogen, elixir-format
+msgid "You can add links: full addresses (https://…) or as [link text](https://…)."
+msgstr ""
+
#: lib/mv_web/live/member_live/form.ex
#, elixir-autogen, elixir-format
msgid "You do not have permission to %{action} members."
@@ -3525,6 +3995,11 @@ msgstr ""
msgid "You requested a password reset. Click the link below to set a new password."
msgstr "You requested a password reset. Click the link below to set a new password."
+#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
+#, elixir-autogen, elixir-format
+msgid "You will receive an email once your application has been reviewed."
+msgstr "You will receive an email once your application has been reviewed."
+
#: lib/mv_web/live/join_live.ex
#, elixir-autogen, elixir-format
msgid "Your details are only used to process your membership application and to contact you. To prevent abuse we also process technical data (e.g. IP address) only as necessary."
@@ -3603,6 +4078,16 @@ msgstr ""
msgid "email %{email} has already been taken"
msgstr ""
+#: lib/mv_web/components/bulk_actions_dropdown.ex
+#, elixir-autogen, elixir-format
+msgid "filtered"
+msgstr ""
+
+#: lib/mv_web/live/global_settings_live.ex
+#, elixir-autogen, elixir-format
+msgid "join page URL in a new tab"
+msgstr "join page URL in a new tab"
+
#: lib/mv_web/live/role_live/form.ex
#, elixir-autogen, elixir-format
msgid "normal_user - Create/Read/Update access"
@@ -3649,193 +4134,6 @@ msgstr ""
msgid "without %{name}"
msgstr "without %{name}"
-#: lib/mv_web/live/join_request_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Applicant data"
-msgstr "Applicant data"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Copy"
-msgstr "Copy"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Copy join page URL"
-msgstr "Copy join page URL"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Join page URL"
-msgstr "Join page URL"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Join page URL copied to clipboard."
-msgstr "Join page URL copied to clipboard."
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Link to the public join page (share this with applicants):"
-msgstr "Link to the public join page (share this with applicants):"
-
-#: lib/mv_web/live/join_request_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Status and review"
-msgstr "Status and review"
-
-#: lib/mv_web/live/join_live.ex
-#, elixir-autogen, elixir-format
-msgid "We could not send the confirmation email. Please try again later or contact support."
-msgstr ""
-
-#: lib/mv_web/templates/emails/join_already_member.html.heex
-#: lib/mv_web/templates/emails/join_already_pending.html.heex
-#, elixir-autogen, elixir-format
-msgid "If you have any questions, please contact us."
-msgstr "If you have any questions, please contact us."
-
-#: lib/mv_web/emails/join_already_member_email.ex
-#, elixir-autogen, elixir-format
-msgid "Membership application – already a member"
-msgstr "Membership application – already a member"
-
-#: lib/mv_web/emails/join_already_pending_email.ex
-#, elixir-autogen, elixir-format
-msgid "Membership application – already under review"
-msgstr "Membership application – already under review"
-
-#: lib/mv_web/templates/emails/join_already_member.html.heex
-#, elixir-autogen, elixir-format
-msgid "We have received your request. The email address you entered is already registered as a member."
-msgstr "We have received your request. The email address you entered is already registered as a member."
-
-#: lib/mv_web/templates/emails/join_already_pending.html.heex
-#, elixir-autogen, elixir-format
-msgid "We have received your request. You already have a membership application that is being reviewed."
-msgstr "We have received your request. You already have a membership application that is being reviewed."
-
-#: lib/mv_web/templates/emails/join_confirmation.html.heex
-#, elixir-autogen, elixir-format
-msgid "You already had a pending request. Here is a new confirmation link."
-msgstr "You already had a pending request. Here is a new confirmation link."
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Back to join form"
-msgstr "Back to membership applications"
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Go to join form"
-msgstr "Go to join form"
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Invalid or expired link"
-msgstr "Invalid or expired link."
-
-#: lib/mv_web/controllers/join_confirm_controller.ex
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Link expired"
-msgstr "Link expired"
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Submit new request"
-msgstr "Submit new request"
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "Thank you"
-msgstr "Thank you"
-
-#: lib/mv_web/controllers/join_confirm_html/confirm.html.heex
-#, elixir-autogen, elixir-format
-msgid "You will receive an email once your application has been reviewed."
-msgstr "You will receive an email once your application has been reviewed."
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Allow direct registration (/register)"
-msgstr "Allow direct registration (/register)"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Authentication"
-msgstr "Authentication"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Direct registration"
-msgstr "Direct registration"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Failed to update setting."
-msgstr "Failed to update setting."
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "If disabled, users cannot sign up via /register; sign-in and the join form remain available."
-msgstr "If disabled, users cannot sign up via /register; sign-in and the join form remain available."
-
-#: lib/mv_web/controllers/page_controller.ex
-#, elixir-autogen, elixir-format
-msgid "Home"
-msgstr ""
-
-#: lib/mv_web/controllers/join_confirm_controller.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Invalid link"
-msgstr "Invalid or expired link."
-
-#: lib/mv_web/live/join_live.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Join"
-msgstr ""
-
-#: lib/mv_web/controllers/join_confirm_controller.ex
-#, elixir-autogen, elixir-format
-msgid "Join confirmation"
-msgstr ""
-
-#: lib/mv_web/live/auth/sign_in_live.ex
-#, elixir-autogen, elixir-format
-msgid "Sign in"
-msgstr ""
-
-#: lib/mv_web/live/group_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Group %{name}"
-msgstr "Group %{name}"
-
-#: lib/mv_web/live/member_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Member %{name}"
-msgstr "Member %{name}"
-
-#: lib/mv_web/live/role_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "Role %{name}"
-msgstr "Role %{name}"
-
-#: lib/mv_web/live/user_live/show.ex
-#, elixir-autogen, elixir-format
-msgid "User %{email}"
-msgstr "User %{email}"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "Only OIDC sign-in is active. This option is disabled."
-msgstr ""
-
-#: lib/mv_web/controllers/auth_controller.ex
-#, elixir-autogen, elixir-format
-msgid "Only sign-in via Single Sign-On (SSO) is allowed."
-msgstr ""
-
#: lib/mv_web/live/global_settings_live.ex
#, elixir-autogen, elixir-format
msgctxt "action"
@@ -3847,268 +4145,3 @@ msgstr "Open"
msgctxt "status"
msgid "Open"
msgstr "Open"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "join page URL in a new tab"
-msgstr "join page URL in a new tab"
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "SMTP environment configuration appears incomplete. Missing: %{keys}"
-msgstr ""
-
-#: lib/mv_web/live/global_settings_live.ex
-#, elixir-autogen, elixir-format
-msgid "SMTP is fully managed via environment variables. All SMTP fields are read-only."
-msgstr "SMTP is fully managed via environment variables. All SMTP fields are read-only."
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "%{field} from"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "%{field} to"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Active only"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Custom date fields"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Dates"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Exit date"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Exit date from"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Exit date to"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "From"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Inactive only"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Join date"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Join date from"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Join date to"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "Range"
-msgstr ""
-
-#: lib/mv_web/live/components/member_filter_component.ex
-#, elixir-autogen, elixir-format
-msgid "To"
-msgstr ""
-
-#: lib/mv_web/live/member_live/show.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Join form:"
-msgstr ""
-
-#: lib/mv_web/live/custom_field_live/form_component.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Description for join form"
-msgstr ""
-
-#: lib/mv_web/live/custom_field_live/form_component.ex
-#, elixir-autogen, elixir-format
-msgid "You can add links: full addresses (https://…) or as [link text](https://…)."
-msgstr ""
-
-#: lib/mv/membership/import/member_csv.ex
-#, elixir-autogen, elixir-format
-msgid "Fee type '%{name}' not found; using the default fee type."
-msgstr ""
-
-#: lib/mv/membership/import/member_csv.ex
-#, elixir-autogen, elixir-format
-msgid "Group assignment failed: %{reason}"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Confirm and Import"
-msgstr ""
-
-#: lib/mv_web/live/import_live.ex
-#, elixir-autogen, elixir-format
-msgid "No prepared import to confirm. Please upload again."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Preview import"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Column"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Custom field"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Ignored (system-computed field)"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Member field"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Rows with an empty fee type will get the default fee type."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "These groups will be created automatically: %{names}"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Unknown (ignored)"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Unknown fee types (members get the default): %{names}"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Fee status columns (Membership Fee Status, Bezahlstatus, Mitgliedsbeitragsstatus) are always ignored and cannot be imported."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Groups column (recognized headers): Groups, Gruppen, Gruppe. Comma-separated group names are supported and missing groups are created automatically."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Use the data field name as the CSV column header in your file. Data fields must exist in Mila before importing, because unknown data field columns will be ignored."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Fee type column (recognized headers): Fee Type, fee type, fee_type, membership_fee_type, Beitragsart. Unknown fee types fall back to the default."
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Create custom field"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Create fee type"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Row 1"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Row 2"
-msgstr ""
-
-#: lib/mv_web/live/import_live/components.ex
-#, elixir-autogen, elixir-format
-msgid "Row 3"
-msgstr ""
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Export to CSV"
-msgstr ""
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format, fuzzy
-msgid "Export to PDF"
-msgstr ""
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format
-msgid "Too many recipients for this function. Copy the addresses or export the list."
-msgstr ""
-
-#: lib/mv_web/components/bulk_actions_dropdown.ex
-#, elixir-autogen, elixir-format
-msgid "filtered"
-msgstr ""
-
-#~ #: lib/mv_web/components/export_dropdown.ex
-#~ #, elixir-autogen, elixir-format
-#~ msgid "CSV"
-#~ msgstr ""
-
-#~ #: lib/mv_web/live/member_live/index.html.heex
-#~ #, elixir-autogen, elixir-format
-#~ msgid "Copy email addresses of selected members"
-#~ msgstr ""
-
-#~ #: lib/mv_web/components/export_dropdown.ex
-#~ #, elixir-autogen, elixir-format, fuzzy
-#~ msgid "Export"
-#~ msgstr ""
-
-#~ #: lib/mv_web/live/member_live/index.ex
-#~ #, elixir-autogen, elixir-format, fuzzy
-#~ msgid "No members selected"
-#~ msgstr ""
-
-#~ #: lib/mv_web/live/member_live/index.html.heex
-#~ #, elixir-autogen, elixir-format
-#~ msgid "Open email program with BCC recipients"
-#~ msgstr ""
-
-#~ #: lib/mv_web/components/export_dropdown.ex
-#~ #, elixir-autogen, elixir-format
-#~ msgid "PDF"
-#~ msgstr ""
diff --git a/test/mv_web/helpers/ash_error_helpers_test.exs b/test/mv_web/helpers/ash_error_helpers_test.exs
new file mode 100644
index 0000000..921f07d
--- /dev/null
+++ b/test/mv_web/helpers/ash_error_helpers_test.exs
@@ -0,0 +1,63 @@
+defmodule MvWeb.Helpers.AshErrorHelpersTest do
+ @moduledoc """
+ Tests for format_error/1, the shared Ash error formatter used by the
+ member show LiveComponents.
+ """
+ use Mv.DataCase, async: true
+
+ import MvWeb.Helpers.AshErrorHelpers
+
+ describe "format_error/1" do
+ test "joins messages of an Ash.Error.Invalid with commas" do
+ error = %Ash.Error.Invalid{
+ errors: [%{message: "exit_date must be after join_date"}, %{message: "another"}]
+ }
+
+ assert format_error(error) == "exit_date must be after join_date, another"
+ end
+
+ test "falls back to inspect for invalid sub-errors without a message" do
+ error = %Ash.Error.Invalid{errors: [:boom]}
+
+ assert format_error(error) == inspect(:boom)
+ end
+
+ test "returns a localized message for an Ash.Error.Forbidden" do
+ assert format_error(%Ash.Error.Forbidden{}) =~ "allowed"
+ end
+
+ test "passes through a plain binary unchanged" do
+ assert format_error("custom message") == "custom message"
+ end
+
+ test "returns a generic localized message for anything else" do
+ assert format_error(:unexpected) == "An error occurred"
+ end
+
+ test "renders the genuine update_member validation error as a user-facing message" do
+ system_actor = Mv.Helpers.SystemActor.get_system_actor()
+
+ {:ok, member} =
+ Mv.Membership.create_member(
+ %{
+ first_name: "Exit",
+ last_name: "Validation",
+ email: "exit-validation-#{System.unique_integer([:positive])}@example.com",
+ join_date: ~D[2024-01-01]
+ },
+ actor: system_actor
+ )
+
+ # exit_date earlier than join_date triggers the resource validation
+ {:error, %Ash.Error.Invalid{} = error} =
+ Mv.Membership.update_member(member, %{exit_date: ~D[2023-12-31]}, actor: system_actor)
+
+ formatted = format_error(error)
+
+ # The real Ash sub-error must surface its localized :message, not an inspect()'d struct.
+ assert formatted == "cannot be before join date"
+ refute formatted =~ "InvalidAttribute"
+ refute formatted =~ "%{"
+ end
+ end
+end
diff --git a/test/mv_web/live/global_settings_live_test.exs b/test/mv_web/live/global_settings_live_test.exs
index 9be12b9..6b886ae 100644
--- a/test/mv_web/live/global_settings_live_test.exs
+++ b/test/mv_web/live/global_settings_live_test.exs
@@ -283,4 +283,48 @@ defmodule MvWeb.GlobalSettingsLiveTest do
end
end
end
+
+ describe "OIDC section explanation (§1.1)" do
+ setup %{conn: conn} do
+ user = create_test_user(%{email: "admin@example.com"})
+ conn = conn_with_oidc_user(conn, user)
+ {:ok, conn: conn}
+ end
+
+ test "OIDC section shows a Single Sign-On explanation", %{conn: conn} do
+ {:ok, view, _html} = live(conn, ~p"/settings")
+
+ assert has_element?(view, "[data-testid='oidc-sso-description']")
+
+ assert view |> element("[data-testid='oidc-sso-description']") |> render() =~
+ "Single Sign-On"
+ end
+ end
+
+ describe "Vereinfacht sync control tooltip (§1.9)" do
+ setup %{conn: conn} do
+ user = create_test_user(%{email: "admin@example.com"})
+ conn = conn_with_oidc_user(conn, user)
+
+ System.put_env("VEREINFACHT_API_URL", "https://example.test/api/v1")
+ System.put_env("VEREINFACHT_API_KEY", "test-key")
+ System.put_env("VEREINFACHT_CLUB_ID", "club-1")
+
+ on_exit(fn ->
+ System.delete_env("VEREINFACHT_API_URL")
+ System.delete_env("VEREINFACHT_API_KEY")
+ System.delete_env("VEREINFACHT_CLUB_ID")
+ end)
+
+ {:ok, conn: conn}
+ end
+
+ test "global Vereinfacht sync control carries a tooltip and accessible label", %{conn: conn} do
+ {:ok, view, _html} = live(conn, ~p"/settings")
+
+ # The sync button is wrapped in a <.tooltip> (data-tip) and carries an aria-label
+ assert has_element?(view, ".tooltip[data-tip] button[phx-click=sync_vereinfacht_contacts]")
+ assert has_element?(view, "button[phx-click=sync_vereinfacht_contacts][aria-label]")
+ end
+ end
end
diff --git a/test/mv_web/live/member_live/deactivate_test.exs b/test/mv_web/live/member_live/deactivate_test.exs
new file mode 100644
index 0000000..2e7a6a7
--- /dev/null
+++ b/test/mv_web/live/member_live/deactivate_test.exs
@@ -0,0 +1,108 @@
+defmodule MvWeb.MemberLive.DeactivateTest do
+ @moduledoc """
+ Tests for the member deactivate/reactivate sub-flow on the member show page,
+ driven through the parent LiveView (the DeactivateComponent is stateful).
+ """
+ use MvWeb.ConnCase, async: true
+ import Phoenix.LiveViewTest
+ use Gettext, backend: MvWeb.Gettext
+
+ alias Mv.Fixtures
+
+ defp reload_member(member) do
+ Ash.get!(Mv.Membership.Member, member.id, actor: Mv.Helpers.SystemActor.get_system_actor())
+ end
+
+ describe "deactivate/reactivate control visibility (§1.6, §1.8)" do
+ @tag role: :admin
+ test "shows Deactivate and hides Reactivate when member has no exit_date", %{conn: conn} do
+ member = Fixtures.member_fixture()
+
+ {:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
+
+ assert has_element?(view, "[data-testid=member-deactivate]")
+ refute has_element?(view, "[data-testid=member-reactivate]")
+ end
+
+ @tag role: :admin
+ test "shows Reactivate and hides Deactivate when member has an exit_date", %{conn: conn} do
+ member = Fixtures.member_fixture(%{exit_date: Date.utc_today()})
+
+ {:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
+
+ assert has_element?(view, "[data-testid=member-reactivate]")
+ refute has_element?(view, "[data-testid=member-deactivate]")
+ end
+
+ @tag role: :read_only
+ test "hides the deactivate/reactivate control for a user without :update permission", %{
+ conn: conn
+ } do
+ member = Fixtures.member_fixture()
+
+ {:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
+
+ refute has_element?(view, "[data-testid=member-deactivate]")
+ refute has_element?(view, "[data-testid=member-reactivate]")
+ end
+ end
+
+ describe "deactivate modal (§1.3)" do
+ @tag role: :admin
+ test "opening the deactivate modal prefills the date input with today", %{conn: conn} do
+ member = Fixtures.member_fixture()
+
+ {:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
+
+ view
+ |> element("[data-testid=member-deactivate]")
+ |> render_click()
+
+ assert has_element?(
+ view,
+ ~s(#deactivate-exit-date[value="#{Date.to_iso8601(Date.utc_today())}"])
+ )
+ end
+ end
+
+ describe "submitting the deactivate modal (§1.2)" do
+ @tag role: :admin
+ test "submitting the deactivate modal with a future date sets exit_date", %{conn: conn} do
+ member = Fixtures.member_fixture(%{join_date: Date.utc_today()})
+ future_date = Date.add(Date.utc_today(), 30)
+
+ {:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
+
+ view
+ |> element("[data-testid=member-deactivate]")
+ |> render_click()
+
+ view
+ |> element("#deactivate-member-modal form")
+ |> render_submit(%{"exit_date" => Date.to_iso8601(future_date)})
+
+ assert reload_member(member).exit_date == future_date
+
+ # UI flips to offering Reactivate
+ assert has_element?(view, "[data-testid=member-reactivate]")
+ end
+ end
+
+ describe "reactivate (§1.7)" do
+ @tag role: :admin
+ test "reactivating a member clears exit_date", %{conn: conn} do
+ member = Fixtures.member_fixture(%{exit_date: Date.utc_today()})
+
+ {:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
+
+ view
+ |> element("[data-testid=member-reactivate]")
+ |> render_click()
+
+ assert reload_member(member).exit_date == nil
+
+ # UI flips back to offering Deactivate
+ assert has_element?(view, "[data-testid=member-deactivate]")
+ end
+ end
+end
diff --git a/test/mv_web/member_live/index_test.exs b/test/mv_web/member_live/index_test.exs
index c37c0fd..0cde8fd 100644
--- a/test/mv_web/member_live/index_test.exs
+++ b/test/mv_web/member_live/index_test.exs
@@ -111,6 +111,17 @@ defmodule MvWeb.MemberLive.IndexTest do
end
end
+ describe "drag-select vs click guard (§3.3)" do
+ @describetag :ui
+
+ test "members table carries the row-selection guard hook", %{conn: conn} do
+ conn = conn_with_oidc_user(conn)
+ {:ok, view, _html} = live(conn, ~p"/members")
+
+ assert has_element?(view, "[phx-hook=RowSelectionGuard][id=members-table-guard]")
+ end
+ end
+
describe "translations" do
@describetag :ui
diff --git a/test/mv_web/member_live/show_membership_fees_test.exs b/test/mv_web/member_live/show_membership_fees_test.exs
index 59dc471..394d743 100644
--- a/test/mv_web/member_live/show_membership_fees_test.exs
+++ b/test/mv_web/member_live/show_membership_fees_test.exs
@@ -55,6 +55,22 @@ defmodule MvWeb.MemberLive.ShowMembershipFeesTest do
|> Ash.create!(actor: system_actor)
end
+ describe "cycle-regeneration control tooltip (§3.5 icon/tooltip audit)" do
+ test "the regenerate_cycles control carries a tooltip and accessible label", %{conn: conn} do
+ fee_type = create_fee_type(%{interval: :yearly})
+ member = Mv.Fixtures.member_fixture(%{membership_fee_type_id: fee_type.id})
+
+ {:ok, view, _html} = live(conn, "/members/#{member.id}")
+
+ view
+ |> element("button[phx-click='switch_tab'][phx-value-tab='membership_fees']")
+ |> render_click()
+
+ assert has_element?(view, ".tooltip[data-tip] button[phx-click=regenerate_cycles]")
+ assert has_element?(view, "button[phx-click=regenerate_cycles][aria-label]")
+ end
+ end
+
describe "cycles table display" do
test "displays all cycles for member", %{conn: conn} do
fee_type = create_fee_type(%{interval: :yearly})