Improve activity location privacy and lifecycle UX

This commit is contained in:
SimpleTest 2026-07-28 04:14:51 +03:00
parent a0e45707a3
commit cbb13d6888
14 changed files with 1124 additions and 352 deletions

View File

@ -1181,11 +1181,43 @@ html {
display: flex; display: flex;
} }
.activity-location-workspace .request-location-modes {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.activity-location-workspace .request-location-radius,
.activity-location-workspace [data-hidden-guidance] {
display: none;
}
.activity-location-workspace[data-location-mode="hidden"] .request-location-grid {
grid-template-columns: minmax(0, 1fr) minmax(14rem, 17rem);
}
.activity-location-workspace[data-location-mode="hidden"] .request-location-map,
.activity-location-workspace[data-location-mode="hidden"] .request-location-controls,
.activity-location-workspace[data-location-mode="hidden"] .request-location-manual {
display: block;
}
.activity-location-workspace[data-location-mode="hidden"] .request-location-hidden-state,
.activity-location-workspace[data-location-mode="hidden"] [data-approximate-guidance] {
display: none;
}
.activity-location-workspace[data-location-mode="hidden"] [data-hidden-guidance] {
display: flex;
}
@media (max-width: 63.999rem) { @media (max-width: 63.999rem) {
.request-location-grid { .request-location-grid {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
.activity-location-workspace[data-location-mode="hidden"] .request-location-grid {
grid-template-columns: 1fr;
}
.request-location-map { .request-location-map {
min-height: 26rem; min-height: 26rem;
} }
@ -1239,6 +1271,10 @@ html {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
.activity-location-workspace .request-location-modes {
grid-template-columns: 1fr;
}
.request-location-mode { .request-location-mode {
min-height: 3.75rem; min-height: 3.75rem;
justify-content: flex-start; justify-content: flex-start;

View File

@ -1784,6 +1784,7 @@ export const Hooks = {
this.markerMode = null this.markerMode = null
this.mapLoaded = false this.mapLoaded = false
this.mapUnavailable = false this.mapUnavailable = false
this.preserveHiddenCoordinates = this.el.dataset.preserveHiddenCoordinates === "true"
this.areaSourceId = `${this.el.id}-selection-area` this.areaSourceId = `${this.el.id}-selection-area`
this.areaFillId = `${this.el.id}-selection-fill` this.areaFillId = `${this.el.id}-selection-fill`
this.areaLineId = `${this.el.id}-selection-line` this.areaLineId = `${this.el.id}-selection-line`
@ -1874,11 +1875,14 @@ export const Hooks = {
return return
} }
this.setStatus( const mode = this.mode()
this.mode() === "approximate_public" const message = mode === "hidden" && this.preserveHiddenCoordinates
? this.el.dataset.privateSelectedLabel
: mode === "approximate_public"
? this.el.dataset.areaSelectedLabel ? this.el.dataset.areaSelectedLabel
: this.el.dataset.pointSelectedLabel : this.el.dataset.pointSelectedLabel
)
this.setStatus(message)
} }
this.focusSelection = () => { this.focusSelection = () => {
@ -1887,7 +1891,7 @@ export const Hooks = {
this.map.flyTo({ this.map.flyTo({
center: [coordinates.longitude, coordinates.latitude], center: [coordinates.longitude, coordinates.latitude],
zoom: this.mode() === "exact_public" ? 15 : 13 zoom: this.mode() === "approximate_public" ? 13 : 15
}) })
} }
@ -1903,7 +1907,10 @@ export const Hooks = {
this.renderSelection() this.renderSelection()
if (center && this.map) { if (center && this.map) {
this.map.flyTo({center: [longitude, latitude], zoom: this.mode() === "exact_public" ? 15 : 13}) this.map.flyTo({
center: [longitude, latitude],
zoom: this.mode() === "approximate_public" ? 13 : 15
})
} }
if (notify) this.notifyCoordinatesChanged() if (notify) this.notifyCoordinatesChanged()
@ -1956,7 +1963,11 @@ export const Hooks = {
if (!this.marker) { if (!this.marker) {
this.markerMode = mode this.markerMode = mode
this.marker = new maplibregl.Marker({ this.marker = new maplibregl.Marker({
color: mode === "approximate_public" ? "#16725b" : "#d6573b", color: mode === "approximate_public"
? "#16725b"
: mode === "exact_private"
? "#6152a3"
: "#d6573b",
draggable: true draggable: true
}) })
.setLngLat([coordinates.longitude, coordinates.latitude]) .setLngLat([coordinates.longitude, coordinates.latitude])
@ -1967,12 +1978,16 @@ export const Hooks = {
"aria-label", "aria-label",
mode === "approximate_public" mode === "approximate_public"
? this.el.dataset.areaMarkerLabel ? this.el.dataset.areaMarkerLabel
: mode === "exact_private"
? this.el.dataset.privateMarkerLabel
: this.el.dataset.pointMarkerLabel : this.el.dataset.pointMarkerLabel
) )
markerElement.setAttribute( markerElement.setAttribute(
"title", "title",
mode === "approximate_public" mode === "approximate_public"
? this.el.dataset.areaMarkerLabel ? this.el.dataset.areaMarkerLabel
: mode === "exact_private"
? this.el.dataset.privateMarkerLabel
: this.el.dataset.pointMarkerLabel : this.el.dataset.pointMarkerLabel
) )
@ -2009,7 +2024,7 @@ export const Hooks = {
if (!this.mapLoaded) return if (!this.mapLoaded) return
if (mode === "hidden") { if (mode === "hidden" && !this.preserveHiddenCoordinates) {
this.removeMarker() this.removeMarker()
this.setAreaData(emptyFeatureCollection()) this.setAreaData(emptyFeatureCollection())
return return
@ -2032,14 +2047,17 @@ export const Hooks = {
} }
this.setAreaData(emptyFeatureCollection()) this.setAreaData(emptyFeatureCollection())
this.ensureSelectionMarker(coordinates, mode) this.ensureSelectionMarker(
coordinates,
mode === "hidden" ? "exact_private" : mode
)
} }
this.syncMode = () => { this.syncMode = () => {
const mode = this.mode() const mode = this.mode()
this.el.dataset.locationMode = mode this.el.dataset.locationMode = mode
if (mode === "hidden") { if (mode === "hidden" && !this.preserveHiddenCoordinates) {
this.clearCoordinates() this.clearCoordinates()
this.setStatus(this.el.dataset.hiddenLabel) this.setStatus(this.el.dataset.hiddenLabel)
} else { } else {
@ -2093,11 +2111,7 @@ export const Hooks = {
: raw : raw
this.setCoordinates(selected, {center: true}) this.setCoordinates(selected, {center: true})
this.setStatus( this.setSelectionStatus()
this.mode() === "approximate_public"
? this.el.dataset.areaSelectedLabel
: this.el.dataset.pointSelectedLabel
)
button.disabled = false button.disabled = false
}, },
() => { () => {
@ -2169,17 +2183,13 @@ export const Hooks = {
}) })
this.map.on("click", event => { this.map.on("click", event => {
if (this.mode() === "hidden") return if (this.mode() === "hidden" && !this.preserveHiddenCoordinates) return
this.setCoordinates( this.setCoordinates(
{latitude: event.lngLat.lat, longitude: event.lngLat.lng}, {latitude: event.lngLat.lat, longitude: event.lngLat.lng},
{center: true} {center: true}
) )
this.setStatus( this.setSelectionStatus()
this.mode() === "approximate_public"
? this.el.dataset.areaSelectedLabel
: this.el.dataset.pointSelectedLabel
)
}) })
this.syncMode() this.syncMode()

View File

@ -75,11 +75,14 @@ test("activity approval, privacy controls, reporting, and moderation work end to
await joinDeadlinePicker.getByLabel("Time").fill(joinDeadline.slice(11, 16)); await joinDeadlinePicker.getByLabel("Time").fill(joinDeadline.slice(11, 16));
await organizer.page.getByLabel("Total group capacity").fill("3"); await organizer.page.getByLabel("Total group capacity").fill("3");
await organizer.page await organizer.page
.getByLabel("Approximate public meeting area") .getByLabel("Public meeting area or landmark")
.fill("E2E central public café"); .fill("E2E central public café");
await organizer.page.getByLabel("Public map visibility").selectOption("approximate_public"); await organizer.page
await organizer.page.getByLabel("Latitude").fill("50.4501"); .getByRole("radio", { name: /Approximate area/ })
await organizer.page.getByLabel("Longitude").fill("30.5234"); .check();
await organizer.page.locator("#activity-location-manual summary").click();
await organizer.page.locator("#activity-latitude").fill("50.4501");
await organizer.page.locator("#activity-longitude").fill("30.5234");
await organizer.page.locator("#activity-form input[type=checkbox]").check(); await organizer.page.locator("#activity-form input[type=checkbox]").check();
await organizer.page.getByRole("button", { name: "Publish activity" }).click(); await organizer.page.getByRole("button", { name: "Publish activity" }).click();
await expect(organizer.page).toHaveURL(/\/activities\/[0-9a-f-]+$/); await expect(organizer.page).toHaveURL(/\/activities\/[0-9a-f-]+$/);

View File

@ -152,7 +152,16 @@ defmodule Mix.Tasks.Wnh.StagingFullE2e do
message_ids = ids(Message, :assignment_id, assignment_ids) message_ids = ids(Message, :assignment_id, assignment_ids)
tracking_session_ids = ids(TrackingSession, :assignment_id, assignment_ids) tracking_session_ids = ids(TrackingSession, :assignment_id, assignment_ids)
notification_ids = ids(Notification, :user_id, user_ids)
notification_ids =
Notification
|> where(
[notification],
notification.user_id in ^user_ids or
fragment("?->>'request_id'", notification.data) in ^request_ids
)
|> select([notification], notification.id)
|> Repo.all()
activity_ids = ids(Activity, :creator_id, user_ids) activity_ids = ids(Activity, :creator_id, user_ids)
validate_activity_membership!(activity_ids, user_ids) validate_activity_membership!(activity_ids, user_ids)
@ -311,10 +320,11 @@ defmodule Mix.Tasks.Wnh.StagingFullE2e do
defp validate_assignments!(assignment_ids, request_ids, user_ids) do defp validate_assignments!(assignment_ids, request_ids, user_ids) do
unexpected? = unexpected? =
Repo.exists?( Repo.exists?(
from assignment in Assignment, from(assignment in Assignment,
where: where:
assignment.id in ^assignment_ids and assignment.id in ^assignment_ids and
(assignment.request_id not in ^request_ids or assignment.helper_id not in ^user_ids) (assignment.request_id not in ^request_ids or assignment.helper_id not in ^user_ids)
)
) )
if unexpected?, if unexpected?,
@ -324,14 +334,16 @@ defmodule Mix.Tasks.Wnh.StagingFullE2e do
defp validate_activity_membership!(activity_ids, user_ids) do defp validate_activity_membership!(activity_ids, user_ids) do
unexpected_participant? = unexpected_participant? =
Repo.exists?( Repo.exists?(
from participant in Participant, from(participant in Participant,
where: participant.user_id in ^user_ids and participant.activity_id not in ^activity_ids where: participant.user_id in ^user_ids and participant.activity_id not in ^activity_ids
)
) )
unexpected_message? = unexpected_message? =
Repo.exists?( Repo.exists?(
from message in ActivityMessage, from(message in ActivityMessage,
where: message.sender_id in ^user_ids and message.activity_id not in ^activity_ids where: message.sender_id in ^user_ids and message.activity_id not in ^activity_ids
)
) )
if unexpected_participant? or unexpected_message? do if unexpected_participant? or unexpected_message? do
@ -342,8 +354,9 @@ defmodule Mix.Tasks.Wnh.StagingFullE2e do
defp validate_category_votes!(proposal_ids, user_ids) do defp validate_category_votes!(proposal_ids, user_ids) do
unexpected? = unexpected? =
Repo.exists?( Repo.exists?(
from vote in CategoryVote, from(vote in CategoryVote,
where: vote.user_id in ^user_ids and vote.proposal_id not in ^proposal_ids where: vote.user_id in ^user_ids and vote.proposal_id not in ^proposal_ids
)
) )
if unexpected?, do: Mix.raise("a full staging fixture vote targets a non-fixture proposal") if unexpected?, do: Mix.raise("a full staging fixture vote targets a non-fixture proposal")
@ -352,20 +365,23 @@ defmodule Mix.Tasks.Wnh.StagingFullE2e do
defp validate_reviewed_records!(user_ids, report_ids, proposal_ids) do defp validate_reviewed_records!(user_ids, report_ids, proposal_ids) do
unexpected_report? = unexpected_report? =
Repo.exists?( Repo.exists?(
from report in Report, from(report in Report,
where: report.reviewed_by_id in ^user_ids and report.id not in ^report_ids where: report.reviewed_by_id in ^user_ids and report.id not in ^report_ids
)
) )
unexpected_proposal? = unexpected_proposal? =
Repo.exists?( Repo.exists?(
from proposal in CategoryProposal, from(proposal in CategoryProposal,
where: proposal.reviewed_by_id in ^user_ids and proposal.id not in ^proposal_ids where: proposal.reviewed_by_id in ^user_ids and proposal.id not in ^proposal_ids
)
) )
unexpected_signal? = unexpected_signal? =
Repo.exists?( Repo.exists?(
from signal in AbuseSignal, from(signal in AbuseSignal,
where: signal.reviewed_by_id in ^user_ids and signal.subject_id not in ^user_ids where: signal.reviewed_by_id in ^user_ids and signal.subject_id not in ^user_ids
)
) )
if unexpected_report? or unexpected_proposal? or unexpected_signal? do if unexpected_report? or unexpected_proposal? or unexpected_signal? do
@ -380,18 +396,20 @@ defmodule Mix.Tasks.Wnh.StagingFullE2e do
) do ) do
unexpected_support_request? = unexpected_support_request? =
Repo.exists?( Repo.exists?(
from request in SupportRequest, from(request in SupportRequest,
where: where:
request.reviewed_by_id in ^user_ids and request.reviewed_by_id in ^user_ids and
request.id not in ^support_request_ids request.id not in ^support_request_ids
)
) )
unexpected_content_removal_notice? = unexpected_content_removal_notice? =
Repo.exists?( Repo.exists?(
from notice in Notice, from(notice in Notice,
where: where:
notice.reviewed_by_id in ^user_ids and notice.reviewed_by_id in ^user_ids and
notice.id not in ^content_removal_notice_ids notice.id not in ^content_removal_notice_ids
)
) )
if unexpected_support_request? or unexpected_content_removal_notice? do if unexpected_support_request? or unexpected_content_removal_notice? do
@ -445,7 +463,7 @@ defmodule Mix.Tasks.Wnh.StagingFullE2e do
end end
defp assert_prefix_unused!(context) do defp assert_prefix_unused!(context) do
if Repo.exists?(from user in User, where: like(user.email, ^"#{prefix(context.run_id)}%")) do if Repo.exists?(from(user in User, where: like(user.email, ^"#{prefix(context.run_id)}%"))) do
Mix.raise("staging E2E users still exist for #{inspect(context.run_id)}") Mix.raise("staging E2E users still exist for #{inspect(context.run_id)}")
end end
end end

View File

@ -824,7 +824,19 @@ defmodule WhoNeedHelp.Activities do
[activity], [activity],
^condition or ^condition or
fragment( fragment(
"ST_Intersects(?, ST_MakeEnvelope(?, ?, ?, ?, 4326))", """
ST_Intersects(
ST_SetSRID(
ST_MakePoint(
round(ST_X(?)::numeric, 2)::double precision,
round(ST_Y(?)::numeric, 2)::double precision
),
4326
),
ST_MakeEnvelope(?, ?, ?, ?, 4326)
)
""",
activity.location,
activity.location, activity.location,
^west, ^west,
^south, ^south,
@ -894,7 +906,7 @@ defmodule WhoNeedHelp.Activities do
do: is_binary(area) and String.trim(area) != "" do: is_binary(area) and String.trim(area) != ""
defp viewport_matches?(activity, %DiscoveryViewport{} = viewport, _area) do defp viewport_matches?(activity, %DiscoveryViewport{} = viewport, _area) do
%{latitude: latitude, longitude: longitude} = Activity.exact_coordinates(activity) %{latitude: latitude, longitude: longitude} = Activity.public_coordinates(activity)
latitude >= viewport.south and latitude <= viewport.north and latitude >= viewport.south and latitude <= viewport.north and
longitude_in_viewport?(longitude, viewport) longitude_in_viewport?(longitude, viewport)

View File

@ -28,7 +28,7 @@ defmodule WhoNeedHelp.TrackingPresenceCleanup do
":tracking_presence_cleanup_grace_ms must be a non-negative integer" ":tracking_presence_cleanup_grace_ms must be a non-negative integer"
end end
{:ok, %{grace_ms: grace_ms}} {:ok, %{grace_ms: grace_ms, pending: %{}}}
end end
@impl GenServer @impl GenServer
@ -36,24 +36,41 @@ defmodule WhoNeedHelp.TrackingPresenceCleanup do
{:maybe_stop, key, assignment_id, user_id, tracking_session_id}, {:maybe_stop, key, assignment_id, user_id, tracking_session_id},
state state
) do ) do
Process.send_after( cleanup_key = {key, assignment_id, user_id, tracking_session_id}
self(),
{:maybe_stop_after_grace, key, assignment_id, user_id, tracking_session_id},
state.grace_ms
)
{:noreply, state} case Map.get(state.pending, cleanup_key) do
%{timer_ref: timer_ref} -> Process.cancel_timer(timer_ref)
nil -> :ok
end
token = make_ref()
timer_ref =
Process.send_after(
self(),
{:maybe_stop_after_grace, cleanup_key, token},
state.grace_ms
)
pending = Map.put(state.pending, cleanup_key, %{timer_ref: timer_ref, token: token})
{:noreply, %{state | pending: pending}}
end end
@impl GenServer @impl GenServer
def handle_info( def handle_info({:maybe_stop_after_grace, cleanup_key, token}, state) do
{:maybe_stop_after_grace, key, assignment_id, user_id, tracking_session_id}, case Map.get(state.pending, cleanup_key) do
state %{token: ^token} ->
) do {key, assignment_id, user_id, tracking_session_id} = cleanup_key
if Presence.get_by_key(Presence.tracking_topic(), key) == [] do
Tracking.stop_browser_session(assignment_id, user_id, tracking_session_id)
end
{:noreply, state} if Presence.get_by_key(Presence.tracking_topic(), key) == [] do
Tracking.stop_browser_session(assignment_id, user_id, tracking_session_id)
end
{:noreply, %{state | pending: Map.delete(state.pending, cleanup_key)}}
_stale_or_cancelled ->
{:noreply, state}
end
end end
end end

View File

@ -15,6 +15,7 @@ defmodule WhoNeedHelpWeb.ActivityLive.New do
|> assign(:structured_fields, []) |> assign(:structured_fields, [])
|> assign(:structured_touched_keys, []) |> assign(:structured_touched_keys, [])
|> assign(:structured_submit_attempted, false) |> assign(:structured_submit_attempted, false)
|> assign(:submission_errors, [])
|> assign(:form, to_form(Activities.change_activity(%Activity{})))} |> assign(:form, to_form(Activities.change_activity(%Activity{})))}
end end
@ -37,6 +38,7 @@ defmodule WhoNeedHelpWeb.ActivityLive.New do
socket socket
|> assign(:form, to_form(changeset)) |> assign(:form, to_form(changeset))
|> assign(:structured_touched_keys, touched_keys) |> assign(:structured_touched_keys, touched_keys)
|> maybe_refresh_submission_errors(changeset)
|> assign_category(params)} |> assign_category(params)}
end end
@ -55,6 +57,7 @@ defmodule WhoNeedHelpWeb.ActivityLive.New do
socket socket
|> assign(:form, to_form(changeset)) |> assign(:form, to_form(changeset))
|> assign(:structured_submit_attempted, true) |> assign(:structured_submit_attempted, true)
|> assign(:submission_errors, submission_errors(changeset))
|> assign_category(params)} |> assign_category(params)}
{:error, reason} -> {:error, reason} ->
@ -82,6 +85,24 @@ defmodule WhoNeedHelpWeb.ActivityLive.New do
end) end)
end end
defp maybe_refresh_submission_errors(%{assigns: %{submission_errors: []}} = socket, _changeset),
do: socket
defp maybe_refresh_submission_errors(socket, changeset),
do: assign(socket, :submission_errors, submission_errors(changeset))
defp submission_errors(changeset) do
changeset.errors
|> Enum.map(fn
{:location, _error} ->
{:location, gettext("Choose the meeting point on the map or use your current location.")}
{field, error} ->
{field, "#{Phoenix.Naming.humanize(field)}: #{translate_error(error)}"}
end)
|> Enum.uniq()
end
defp assign_category(socket, params) do defp assign_category(socket, params) do
category = Enum.find(socket.assigns.categories, &(&1.id == params["category_id"])) category = Enum.find(socket.assigns.categories, &(&1.id == params["category_id"]))
@ -139,6 +160,15 @@ defmodule WhoNeedHelpWeb.ActivityLive.New do
defp error_message(_reason), do: gettext("Could not publish the activity. Please try again.") defp error_message(_reason), do: gettext("Could not publish the activity. Please try again.")
defp location_mode(form) do
case to_string(form[:location_visibility].value || "approximate_public") do
"hidden" -> "hidden"
_approximate_or_missing -> "approximate_public"
end
end
defp coordinate_value(form, key), do: Map.get(form.params || %{}, key, "")
@impl true @impl true
def render(assigns) do def render(assigns) do
~H""" ~H"""
@ -292,54 +322,206 @@ defmodule WhoNeedHelpWeb.ActivityLive.New do
min="2" min="2"
label={gettext("Total group capacity")} label={gettext("Total group capacity")}
/> />
<.input <section
field={@form[:location_label]} id="activity-location-workspace"
label={gettext("Approximate public meeting area")} phx-hook="RequestLocationPicker"
placeholder={gettext("City centre, near the main entrance")} data-location-mode={location_mode(@form)}
/> data-preserve-hidden-coordinates="true"
<.input data-private-center="true"
field={@form[:location_visibility]} data-allowed-radii="1000"
type="select" data-map-target="#activity-location-map"
label={gettext("Public map visibility")} data-latitude-target="#activity-latitude"
options={[ data-longitude-target="#activity-longitude"
{gettext("Approximate area"), "approximate_public"}, data-status-target="#activity-location-status"
{gettext("Hidden"), "hidden"} data-map-ready-label={
]} gettext("Choose the public meeting point on the map or use your current location.")
/> }
<div class="rounded-2xl bg-base-200 p-5"> data-area-selected-label={
<button gettext(
type="button" "Meeting point selected. Before approval, people see only its approximate area."
phx-hook="LocationPicker" )
id="activity-location-picker" }
data-latitude-target="#activity-latitude" data-point-selected-label={gettext("Meeting point selected.")}
data-longitude-target="#activity-longitude" data-private-selected-label={
data-unavailable-label={gettext("Location is unavailable in this browser.")} gettext("Private meeting point selected. It appears only after approval.")
data-added-label={gettext("Location added.")} }
data-permission-denied-label={gettext("Location permission was denied.")} data-area-marker-label={gettext("Drag to move the meeting area")}
class="btn btn-outline btn-sm" data-point-marker-label={gettext("Drag to move the exact meeting point")}
> data-private-marker-label={gettext("Drag to move the private meeting point")}
{gettext("Use my current foreground location")} data-hidden-label={
</button> gettext("Select a meeting point. It will remain hidden until you approve someone.")
<p class="mt-2 text-xs text-base-content/60"> }
{gettext("Exact coordinates are shown only to participants you approve.")} data-location-unavailable-label={gettext("Location is unavailable in this browser.")}
</p> data-map-retry-label={gettext("Try map again")}
<div class="mt-3 grid grid-cols-2 gap-3"> data-location-denied-label={gettext("Location permission was denied.")}
class="request-location-workspace activity-location-workspace"
>
<div>
<.input <.input
field={@form[:latitude]} field={@form[:location_label]}
id="activity-latitude" label={gettext("Public meeting area or landmark")}
type="number" placeholder={gettext("City centre, near the main entrance")}
step="any"
label={gettext("Latitude")}
/>
<.input
field={@form[:longitude]}
id="activity-longitude"
type="number"
step="any"
label={gettext("Longitude")}
/> />
<p class="mt-1 text-sm text-base-content/60">
{gettext("This description is visible to everyone. Do not enter a private address.")}
</p>
</div> </div>
</div>
<fieldset class="mt-5">
<legend class="mb-2 font-bold">
{gettext("What should people see before approval?")}
</legend>
<div class="request-location-modes">
<label class="request-location-mode">
<input
type="radio"
name="activity[location_visibility]"
value="approximate_public"
checked={location_mode(@form) == "approximate_public"}
data-location-mode-input
/>
<.icon name="hero-map" class="size-5" />
<span>
<strong>{gettext("Approximate area")}</strong>
<small>{gettext("Recommended for discoverability")}</small>
</span>
</label>
<label class="request-location-mode">
<input
type="radio"
name="activity[location_visibility]"
value="hidden"
checked={location_mode(@form) == "hidden"}
data-location-mode-input
/>
<.icon name="hero-eye-slash" class="size-5" />
<span>
<strong>{gettext("No public map")}</strong>
<small>{gettext("People can find it by the area description")}</small>
</span>
</label>
</div>
</fieldset>
<div class="request-location-grid mt-4">
<div class="request-location-map-shell">
<div
id="activity-location-map"
phx-update="ignore"
data-map-unavailable-label={
gettext("The map is unavailable. You can enter coordinates manually.")
}
data-map-retry-label={gettext("Try map again")}
class="aid-map request-location-map"
/>
<div class="request-location-map-hint">
<.icon name="hero-hand-raised" class="size-4 shrink-0" />
<span data-approximate-map-hint>
{gettext("Click the map or drag the pin to choose the meeting point")}
</span>
<span data-exact-map-hint>
{gettext("Click the map or drag the pin to choose the meeting point")}
</span>
</div>
</div>
<aside class="request-location-controls">
<button
type="button"
data-use-current-location
class="btn btn-outline btn-info w-full"
>
<.icon name="hero-paper-airplane" class="size-5" />
{gettext("Use my location")}
</button>
<div class="request-location-privacy mt-4" data-approximate-guidance>
<.icon name="hero-shield-check" class="size-6 shrink-0" />
<div>
<strong>{gettext("The public map stays approximate")}</strong>
<p>
{gettext(
"Only people you approve receive the exact meeting point and group chat."
)}
</p>
</div>
</div>
<div class="request-location-after-match mt-4" data-hidden-guidance>
<.icon name="hero-lock-closed" class="size-6 shrink-0" />
<div>
<strong>{gettext("The public map stays hidden")}</strong>
<p>
{gettext(
"People can search by the public area description. Approved participants receive the exact point."
)}
</p>
</div>
</div>
</aside>
</div>
<p
id="activity-location-status"
role="status"
aria-live="polite"
class="mt-3 min-h-5 text-sm font-medium text-base-content/65"
>
{gettext("Choose the public meeting point on the map or use your current location.")}
</p>
<details
id="activity-location-manual"
phx-update="ignore"
class="request-location-manual mt-3"
>
<summary>{gettext("Enter coordinates manually")}</summary>
<p class="mt-2 text-xs text-base-content/60">
{gettext(
"These coordinates are the exact meeting point. They are revealed only after approval."
)}
</p>
<div class="mt-3 grid grid-cols-2 gap-3">
<label class="fieldset">
<span class="label">{gettext("Latitude")}</span>
<input
id="activity-latitude"
name="activity[latitude]"
type="number"
step="any"
min="-90"
max="90"
value={coordinate_value(@form, "latitude")}
class="input w-full"
data-coordinate-input
/>
</label>
<label class="fieldset">
<span class="label">{gettext("Longitude")}</span>
<input
id="activity-longitude"
name="activity[longitude]"
type="number"
step="any"
min="-180"
max="180"
value={coordinate_value(@form, "longitude")}
class="input w-full"
data-coordinate-input
/>
</label>
</div>
</details>
<p
:for={{:location, message} <- @submission_errors}
id="activity-location-error"
class="mt-3 flex items-center gap-2 text-sm font-semibold text-error"
>
<.icon name="hero-exclamation-circle" class="size-5" />
{message}
</p>
</section>
<div class="rounded-2xl border border-base-300 p-4 text-sm"> <div class="rounded-2xl border border-base-300 p-4 text-sm">
<.input <.input
field={@form[:safety_confirmed]} field={@form[:safety_confirmed]}

View File

@ -535,6 +535,7 @@ defmodule WhoNeedHelpWeb.ActivityLive.Show do
<aside class="space-y-5"> <aside class="space-y-5">
<div <div
:if={@coordinates}
id="activity-detail-map" id="activity-detail-map"
phx-hook="AidMap" phx-hook="AidMap"
phx-update="ignore" phx-update="ignore"
@ -546,7 +547,24 @@ defmodule WhoNeedHelpWeb.ActivityLive.Show do
data-map-recenter-label={gettext("Show location on map")} data-map-recenter-label={gettext("Show location on map")}
class="aid-map" class="aid-map"
/> />
<div class="rounded-2xl bg-base-200 p-5 text-sm"> <div
:if={is_nil(@coordinates)}
id="activity-detail-map-hidden"
class="rounded-2xl border border-base-300 bg-base-200 p-5 text-sm"
>
<div class="flex items-start gap-3">
<.icon name="hero-eye-slash" class="mt-0.5 size-6 shrink-0 text-primary" />
<div>
<h2 class="font-bold">{gettext("The public map stays hidden")}</h2>
<p class="mt-2 text-base-content/65">
{gettext(
"People can search by the public area description. Approved participants receive the exact point."
)}
</p>
</div>
</div>
</div>
<div :if={@coordinates} class="rounded-2xl bg-base-200 p-5 text-sm">
<h2 class="font-bold">{gettext("Location privacy")}</h2> <h2 class="font-bold">{gettext("Location privacy")}</h2>
<p class="mt-2 text-base-content/65"> <p class="mt-2 text-base-content/65">
<%= if @approved? do %> <%= if @approved? do %>

View File

@ -189,7 +189,7 @@ msgstr ""
msgid "Activities are optional plans, not urgent help, and do not affect helper reputation. Meet in a suitable public place first. Organizers approve every participant; exact coordinates and group chat are limited to approved participants. Share route and safety plans for hikes, and never publish home addresses, access codes, or travel documents." msgid "Activities are optional plans, not urgent help, and do not affect helper reputation. Meet in a suitable public place first. Organizers approve every participant; exact coordinates and group chat are limited to approved participants. Share route and safety plans for hikes, and never publish home addresses, access codes, or travel documents."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:200 #: lib/who_need_help_web/live/activity_live/new.ex:230
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity details" msgid "Activity details"
msgstr "" msgstr ""
@ -205,7 +205,7 @@ msgstr ""
msgid "Activity is unavailable." msgid "Activity is unavailable."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:50 #: lib/who_need_help_web/live/activity_live/new.ex:52
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity published. You approve every participant." msgid "Activity published. You approve every participant."
msgstr "" msgstr ""
@ -216,7 +216,7 @@ msgid "Activity restored."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/index.ex:385 #: lib/who_need_help_web/live/activity_live/index.ex:385
#: lib/who_need_help_web/live/activity_live/new.ex:174 #: lib/who_need_help_web/live/activity_live/new.ex:204
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity type" msgid "Activity type"
msgstr "" msgstr ""
@ -278,17 +278,12 @@ msgid "Approved participants"
msgstr "" msgstr ""
#: lib/who_need_help_web/controllers/page_html/home.html.heex:80 #: lib/who_need_help_web/controllers/page_html/home.html.heex:80
#: lib/who_need_help_web/live/activity_live/new.ex:305 #: lib/who_need_help_web/live/activity_live/new.ex:385
#: lib/who_need_help_web/live/request_live/new.ex:520 #: lib/who_need_help_web/live/request_live/new.ex:520
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Approximate area" msgid "Approximate area"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:297
#, elixir-autogen, elixir-format
msgid "Approximate public meeting area"
msgstr ""
#: lib/who_need_help_web/live/profile_live.ex:163 #: lib/who_need_help_web/live/profile_live.ex:163
#: lib/who_need_help_web/live/request_live/show.ex:996 #: lib/who_need_help_web/live/request_live/show.ex:996
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -425,7 +420,7 @@ msgstr ""
msgid "Choose a category, urgency, and safe location visibility." msgid "Choose a category, urgency, and safe location visibility."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:175 #: lib/who_need_help_web/live/activity_live/new.ex:205
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose activity" msgid "Choose activity"
msgstr "" msgstr ""
@ -435,15 +430,15 @@ msgstr ""
msgid "Choose category" msgid "Choose category"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:212 #: lib/who_need_help_web/live/activity_live/new.ex:242
#: lib/who_need_help_web/live/activity_live/new.ex:239 #: lib/who_need_help_web/live/activity_live/new.ex:269
#: lib/who_need_help_web/live/request_live/new.ex:344 #: lib/who_need_help_web/live/request_live/new.ex:344
#: lib/who_need_help_web/live/request_live/new.ex:371 #: lib/who_need_help_web/live/request_live/new.ex:371
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose…" msgid "Choose…"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:298 #: lib/who_need_help_web/live/activity_live/new.ex:363
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "City centre, near the main entrance" msgid "City centre, near the main entrance"
msgstr "" msgstr ""
@ -459,7 +454,7 @@ msgstr ""
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:269 #: lib/who_need_help_web/live/activity_live/new.ex:299
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Coffee and conversation" msgid "Coffee and conversation"
msgstr "" msgstr ""
@ -524,7 +519,7 @@ msgstr ""
msgid "Confirm your account and ensure it is active first." msgid "Confirm your account and ensure it is active first."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:135 #: lib/who_need_help_web/live/activity_live/new.ex:156
#: lib/who_need_help_web/live/request_live/new.ex:235 #: lib/who_need_help_web/live/request_live/new.ex:235
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Confirm your email and ensure your account is active before publishing." msgid "Confirm your email and ensure your account is active before publishing."
@ -549,7 +544,7 @@ msgid "Create activity"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/index.ex:535 #: lib/who_need_help_web/live/activity_live/index.ex:535
#: lib/who_need_help_web/live/activity_live/new.ex:150 #: lib/who_need_help_web/live/activity_live/new.ex:180
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Create an activity" msgid "Create an activity"
msgstr "" msgstr ""
@ -601,7 +596,7 @@ msgstr ""
msgid "Default location visibility" msgid "Default location visibility"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:276 #: lib/who_need_help_web/live/activity_live/new.ex:306
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Describe the public plan, approximate duration, and who might enjoy it." msgid "Describe the public plan, approximate duration, and who might enjoy it."
msgstr "" msgstr ""
@ -683,11 +678,6 @@ msgstr ""
msgid "Exact address after matching" msgid "Exact address after matching"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:324
#, elixir-autogen, elixir-format
msgid "Exact coordinates are shown only to participants you approve."
msgstr ""
#: lib/who_need_help_web/live/profile_live.ex:164 #: lib/who_need_help_web/live/profile_live.ex:164
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Exact for active match" msgid "Exact for active match"
@ -805,7 +795,6 @@ msgstr ""
msgid "Hi %{email},\n\nYou can log into your account by visiting the URL below:\n\n%{url}\n\nIf you didn't request this email, please ignore this." msgid "Hi %{email},\n\nYou can log into your account by visiting the URL below:\n\n%{url}\n\nIf you didn't request this email, please ignore this."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:306
#: lib/who_need_help_web/live/profile_live.ex:162 #: lib/who_need_help_web/live/profile_live.ex:162
#: lib/who_need_help_web/live/request_live/show.ex:997 #: lib/who_need_help_web/live/request_live/show.ex:997
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -845,7 +834,7 @@ msgstr ""
msgid "I confirm this is not an emergency, there is no immediate danger, and the requested task is lawful." msgid "I confirm this is not an emergency, there is no immediate danger, and the requested task is lawful."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:348 #: lib/who_need_help_web/live/activity_live/new.ex:526
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point." msgid "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point."
msgstr "" msgstr ""
@ -904,13 +893,13 @@ msgstr ""
msgid "Join requests are closed." msgid "Join requests are closed."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:286 #: lib/who_need_help_web/live/activity_live/new.ex:316
#: lib/who_need_help_web/live/activity_live/show.ex:387 #: lib/who_need_help_web/live/activity_live/show.ex:387
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Join requests close" msgid "Join requests close"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:332 #: lib/who_need_help_web/live/activity_live/new.ex:482
#: lib/who_need_help_web/live/notification_live.ex:686 #: lib/who_need_help_web/live/notification_live.ex:686
#: lib/who_need_help_web/live/request_live/new.ex:668 #: lib/who_need_help_web/live/request_live/new.ex:668
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -968,7 +957,7 @@ msgstr ""
msgid "Logged out successfully." msgid "Logged out successfully."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:339 #: lib/who_need_help_web/live/activity_live/new.ex:496
#: lib/who_need_help_web/live/notification_live.ex:700 #: lib/who_need_help_web/live/notification_live.ex:700
#: lib/who_need_help_web/live/request_live/new.ex:682 #: lib/who_need_help_web/live/request_live/new.ex:682
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1103,7 +1092,7 @@ msgstr ""
msgid "New password" msgid "New password"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:244 #: lib/who_need_help_web/live/activity_live/new.ex:274
#: lib/who_need_help_web/live/activity_live/show.ex:300 #: lib/who_need_help_web/live/activity_live/show.ex:300
#: lib/who_need_help_web/live/request_live/new.ex:379 #: lib/who_need_help_web/live/request_live/new.ex:379
#: lib/who_need_help_web/live/request_live/show.ex:877 #: lib/who_need_help_web/live/request_live/show.ex:877
@ -1289,7 +1278,7 @@ msgstr ""
msgid "Pickup notes" msgid "Pickup notes"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:274 #: lib/who_need_help_web/live/activity_live/new.ex:304
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Plan and expectations" msgid "Plan and expectations"
msgstr "" msgstr ""
@ -1378,11 +1367,6 @@ msgstr ""
msgid "Public location can be hidden, approximate, or explicitly exact. Live tracking is optional. A browser shares only while its page is open; Android shows a persistent foreground-service notification while sharing. The current exact point is deleted when sharing stops, a match ends, or either participant blocks the other; derived movement and proximity evidence may remain." msgid "Public location can be hidden, approximate, or explicitly exact. Live tracking is optional. A browser shares only while its page is open; Android shows a persistent foreground-service notification while sharing. The current exact point is deleted when sharing stops, a match ends, or either participant blocks the other; derived movement and proximity evidence may remain."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:303
#, elixir-autogen, elixir-format
msgid "Public map visibility"
msgstr ""
#: lib/who_need_help_web/live/profile_live.ex:326 #: lib/who_need_help_web/live/profile_live.ex:326
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Public profile URL" msgid "Public profile URL"
@ -1394,12 +1378,12 @@ msgstr ""
msgid "Public reputation" msgid "Public reputation"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:152 #: lib/who_need_help_web/live/activity_live/new.ex:182
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publish a clear public plan. Join requests stay pending until you approve them." msgid "Publish a clear public plan. Join requests stay pending until you approve them."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:360 #: lib/who_need_help_web/live/activity_live/new.ex:538
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publish activity" msgid "Publish activity"
msgstr "" msgstr ""
@ -1414,7 +1398,7 @@ msgstr ""
msgid "Publish request" msgid "Publish request"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:358 #: lib/who_need_help_web/live/activity_live/new.ex:536
#: lib/who_need_help_web/live/request_live/new.ex:742 #: lib/who_need_help_web/live/request_live/new.ex:742
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publishing…" msgid "Publishing…"
@ -1697,7 +1681,7 @@ msgstr ""
msgid "Short bio" msgid "Short bio"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:268 #: lib/who_need_help_web/live/activity_live/new.ex:298
#: lib/who_need_help_web/live/request_live/new.ex:411 #: lib/who_need_help_web/live/request_live/new.ex:411
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Short title" msgid "Short title"
@ -1978,7 +1962,7 @@ msgstr ""
msgid "Today" msgid "Today"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:138 #: lib/who_need_help_web/live/activity_live/new.ex:159
#: lib/who_need_help_web/live/activity_live/show.ex:336 #: lib/who_need_help_web/live/activity_live/show.ex:336
#: lib/who_need_help_web/live/category_proposal_live.ex:85 #: lib/who_need_help_web/live/category_proposal_live.ex:85
#: lib/who_need_help_web/live/profile_live.ex:59 #: lib/who_need_help_web/live/profile_live.ex:59
@ -2009,7 +1993,7 @@ msgstr ""
msgid "Total" msgid "Total"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:293 #: lib/who_need_help_web/live/activity_live/new.ex:323
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Total group capacity" msgid "Total group capacity"
msgstr "" msgstr ""
@ -2057,7 +2041,7 @@ msgstr ""
msgid "Urgent help" msgid "Urgent help"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:158 #: lib/who_need_help_web/live/activity_live/new.ex:188
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information." msgid "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information."
msgstr "" msgstr ""
@ -2072,11 +2056,6 @@ msgstr ""
msgid "Use light theme" msgid "Use light theme"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:321
#, elixir-autogen, elixir-format
msgid "Use my current foreground location"
msgstr ""
#: lib/who_need_help_web/controllers/page_html/home.html.heex:251 #: lib/who_need_help_web/controllers/page_html/home.html.heex:251
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Use private chat and optional live location sharing." msgid "Use private chat and optional live location sharing."
@ -2215,7 +2194,7 @@ msgstr ""
msgid "Write a safe coordination message…" msgid "Write a safe coordination message…"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:241 #: lib/who_need_help_web/live/activity_live/new.ex:271
#: lib/who_need_help_web/live/activity_live/show.ex:298 #: lib/who_need_help_web/live/activity_live/show.ex:298
#: lib/who_need_help_web/live/request_live/new.ex:373 #: lib/who_need_help_web/live/request_live/new.ex:373
#: lib/who_need_help_web/live/request_live/show.ex:875 #: lib/who_need_help_web/live/request_live/show.ex:875
@ -2452,7 +2431,7 @@ msgstr ""
msgid "← All requests" msgid "← All requests"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:148 #: lib/who_need_help_web/live/activity_live/new.ex:178
#: lib/who_need_help_web/live/activity_live/show.ex:352 #: lib/who_need_help_web/live/activity_live/show.ex:352
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "← Back to activities" msgid "← Back to activities"
@ -2578,7 +2557,7 @@ msgstr ""
msgid "Could not complete the action. Please try again." msgid "Could not complete the action. Please try again."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:140 #: lib/who_need_help_web/live/activity_live/new.ex:161
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not publish the activity. Please try again." msgid "Could not publish the activity. Please try again."
msgstr "" msgstr ""
@ -4038,6 +4017,7 @@ msgstr ""
msgid "Date" msgid "Date"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:474
#: lib/who_need_help_web/live/notification_live.ex:683 #: lib/who_need_help_web/live/notification_live.ex:683
#: lib/who_need_help_web/live/request_live/new.ex:660 #: lib/who_need_help_web/live/request_live/new.ex:660
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -4125,14 +4105,14 @@ msgstr ""
msgid "In 3 hours" msgid "In 3 hours"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:316 #: lib/who_need_help_web/live/activity_live/new.ex:354
#: lib/who_need_help_web/live/notification_live.ex:601 #: lib/who_need_help_web/live/notification_live.ex:601
#: lib/who_need_help_web/live/request_live/new.ex:484 #: lib/who_need_help_web/live/request_live/new.ex:484
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location is unavailable in this browser." msgid "Location is unavailable in this browser."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:318 #: lib/who_need_help_web/live/activity_live/new.ex:356
#: lib/who_need_help_web/live/notification_live.ex:603 #: lib/who_need_help_web/live/notification_live.ex:603
#: lib/who_need_help_web/live/request_live/new.ex:486 #: lib/who_need_help_web/live/request_live/new.ex:486
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -4283,7 +4263,7 @@ msgstr ""
msgid "Signing in does not create a new account." msgid "Signing in does not create a new account."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:282 #: lib/who_need_help_web/live/activity_live/new.ex:312
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Starts at" msgid "Starts at"
msgstr "" msgstr ""
@ -4309,6 +4289,7 @@ msgstr ""
msgid "This activity is closed. The group chat remains available as read-only history." msgid "This activity is closed. The group chat remains available as read-only history."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:366
#: lib/who_need_help_web/live/request_live/new.ex:503 #: lib/who_need_help_web/live/request_live/new.ex:503
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "This description is visible to everyone. Do not enter a private address." msgid "This description is visible to everyone. Do not enter a private address."
@ -4385,6 +4366,7 @@ msgstr ""
msgid "Use another email" msgid "Use another email"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:435
#: lib/who_need_help_web/live/notification_live.ex:636 #: lib/who_need_help_web/live/notification_live.ex:636
#: lib/who_need_help_web/live/request_live/new.ex:595 #: lib/who_need_help_web/live/request_live/new.ex:595
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -4641,6 +4623,8 @@ msgstr ""
#: lib/who_need_help_web/components/layouts/root.html.heex:6 #: lib/who_need_help_web/components/layouts/root.html.heex:6
#: lib/who_need_help_web/controllers/page_html/home.html.heex:160 #: lib/who_need_help_web/controllers/page_html/home.html.heex:160
#: lib/who_need_help_web/live/activity_live/index.ex:496 #: lib/who_need_help_web/live/activity_live/index.ex:496
#: lib/who_need_help_web/live/activity_live/new.ex:355
#: lib/who_need_help_web/live/activity_live/new.ex:414
#: lib/who_need_help_web/live/activity_live/show.ex:545 #: lib/who_need_help_web/live/activity_live/show.ex:545
#: lib/who_need_help_web/live/notification_live.ex:602 #: lib/who_need_help_web/live/notification_live.ex:602
#: lib/who_need_help_web/live/notification_live.ex:621 #: lib/who_need_help_web/live/notification_live.ex:621
@ -4652,7 +4636,7 @@ msgstr ""
msgid "Try map again" msgid "Try map again"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:124 #: lib/who_need_help_web/live/activity_live/new.ex:145
#: lib/who_need_help_web/live/request_live/new.ex:193 #: lib/who_need_help_web/live/request_live/new.ex:193
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{field} is required." msgid "%{field} is required."
@ -4665,13 +4649,13 @@ msgstr ""
msgid "Both reviews are now visible on participant profiles." msgid "Both reviews are now visible on participant profiles."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:127 #: lib/who_need_help_web/live/activity_live/new.ex:148
#: lib/who_need_help_web/live/request_live/new.ex:196 #: lib/who_need_help_web/live/request_live/new.ex:196
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Check the category details and try again." msgid "Check the category details and try again."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:130 #: lib/who_need_help_web/live/activity_live/new.ex:151
#: lib/who_need_help_web/live/request_live/new.ex:199 #: lib/who_need_help_web/live/request_live/new.ex:199
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose a valid value for %{field}." msgid "Choose a valid value for %{field}."
@ -6470,7 +6454,7 @@ msgstr ""
msgid "A specific option inside an existing category" msgid "A specific option inside an existing category"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:183 #: lib/who_need_help_web/live/activity_live/new.ex:213
#: lib/who_need_help_web/live/request_live/new.ex:311 #: lib/who_need_help_web/live/request_live/new.ex:311
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Can't find the right option? Propose a category" msgid "Can't find the right option? Propose a category"
@ -6507,7 +6491,7 @@ msgstr ""
msgid "New subcategory" msgid "New subcategory"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:177 #: lib/who_need_help_web/live/activity_live/new.ex:207
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No matching activity. You can propose a new one." msgid "No matching activity. You can propose a new one."
msgstr "" msgstr ""
@ -6522,7 +6506,7 @@ msgstr ""
msgid "No matching main category" msgid "No matching main category"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:176 #: lib/who_need_help_web/live/activity_live/new.ex:206
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search activity categories" msgid "Search activity categories"
msgstr "" msgstr ""
@ -6593,11 +6577,6 @@ msgstr ""
msgid "Android push notifications are not available yet." msgid "Android push notifications are not available yet."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:317
#, elixir-autogen, elixir-format
msgid "Location added."
msgstr ""
#: lib/who_need_help_web/components/layouts/root.html.heex:9 #: lib/who_need_help_web/components/layouts/root.html.heex:9
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Map marker" msgid "Map marker"
@ -6657,3 +6636,110 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Who Need Help connects adults who need urgent local help with nearby volunteers." msgid "Who Need Help connects adults who need urgent local help with nearby volunteers."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:337
#: lib/who_need_help_web/live/activity_live/new.ex:470
#, elixir-autogen, elixir-format
msgid "Choose the public meeting point on the map or use your current location."
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:420
#: lib/who_need_help_web/live/activity_live/new.ex:423
#, elixir-autogen, elixir-format
msgid "Click the map or drag the pin to choose the meeting point"
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:349
#, elixir-autogen, elixir-format
msgid "Drag to move the exact meeting point"
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:348
#, elixir-autogen, elixir-format
msgid "Drag to move the meeting area"
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:350
#, elixir-autogen, elixir-format
msgid "Drag to move the private meeting point"
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:344
#, elixir-autogen, elixir-format
msgid "Meeting point selected."
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:340
#, elixir-autogen, elixir-format
msgid "Meeting point selected. Before approval, people see only its approximate area."
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:399
#, elixir-autogen, elixir-format
msgid "No public map"
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:443
#, elixir-autogen, elixir-format
msgid "Only people you approve receive the exact meeting point and group chat."
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:400
#, elixir-autogen, elixir-format
msgid "People can find it by the area description"
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:455
#, elixir-autogen, elixir-format
msgid "People can search by the public area description. Approved participants receive the exact point."
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:346
#, elixir-autogen, elixir-format
msgid "Private meeting point selected. It appears only after approval."
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:362
#, elixir-autogen, elixir-format
msgid "Public meeting area or landmark"
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:386
#, elixir-autogen, elixir-format
msgid "Recommended for discoverability"
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:352
#, elixir-autogen, elixir-format
msgid "Select a meeting point. It will remain hidden until you approve someone."
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:412
#, elixir-autogen, elixir-format
msgid "The map is unavailable. You can enter coordinates manually."
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:441
#, elixir-autogen, elixir-format
msgid "The public map stays approximate"
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:453
#, elixir-autogen, elixir-format
msgid "The public map stays hidden"
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:476
#, elixir-autogen, elixir-format
msgid "These coordinates are the exact meeting point. They are revealed only after approval."
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:372
#, elixir-autogen, elixir-format
msgid "What should people see before approval?"
msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:98
#, elixir-autogen, elixir-format
msgid "Choose the meeting point on the map or use your current location."
msgstr ""

View File

@ -189,7 +189,7 @@ msgstr "Activities"
msgid "Activities are optional plans, not urgent help, and do not affect helper reputation. Meet in a suitable public place first. Organizers approve every participant; exact coordinates and group chat are limited to approved participants. Share route and safety plans for hikes, and never publish home addresses, access codes, or travel documents." msgid "Activities are optional plans, not urgent help, and do not affect helper reputation. Meet in a suitable public place first. Organizers approve every participant; exact coordinates and group chat are limited to approved participants. Share route and safety plans for hikes, and never publish home addresses, access codes, or travel documents."
msgstr "Activities are optional plans, not urgent help, and do not affect helper reputation. Meet in a suitable public place first. Organizers approve every participant; exact coordinates and group chat are limited to approved participants. Share route and safety plans for hikes, and never publish home addresses, access codes, or travel documents." msgstr "Activities are optional plans, not urgent help, and do not affect helper reputation. Meet in a suitable public place first. Organizers approve every participant; exact coordinates and group chat are limited to approved participants. Share route and safety plans for hikes, and never publish home addresses, access codes, or travel documents."
#: lib/who_need_help_web/live/activity_live/new.ex:200 #: lib/who_need_help_web/live/activity_live/new.ex:230
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity details" msgid "Activity details"
msgstr "Activity details" msgstr "Activity details"
@ -205,7 +205,7 @@ msgstr "Activity hidden."
msgid "Activity is unavailable." msgid "Activity is unavailable."
msgstr "Activity is unavailable." msgstr "Activity is unavailable."
#: lib/who_need_help_web/live/activity_live/new.ex:50 #: lib/who_need_help_web/live/activity_live/new.ex:52
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity published. You approve every participant." msgid "Activity published. You approve every participant."
msgstr "Activity published. You approve every participant." msgstr "Activity published. You approve every participant."
@ -216,7 +216,7 @@ msgid "Activity restored."
msgstr "Activity restored." msgstr "Activity restored."
#: lib/who_need_help_web/live/activity_live/index.ex:385 #: lib/who_need_help_web/live/activity_live/index.ex:385
#: lib/who_need_help_web/live/activity_live/new.ex:174 #: lib/who_need_help_web/live/activity_live/new.ex:204
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity type" msgid "Activity type"
msgstr "Activity type" msgstr "Activity type"
@ -278,17 +278,12 @@ msgid "Approved participants"
msgstr "Approved participants" msgstr "Approved participants"
#: lib/who_need_help_web/controllers/page_html/home.html.heex:80 #: lib/who_need_help_web/controllers/page_html/home.html.heex:80
#: lib/who_need_help_web/live/activity_live/new.ex:305 #: lib/who_need_help_web/live/activity_live/new.ex:385
#: lib/who_need_help_web/live/request_live/new.ex:520 #: lib/who_need_help_web/live/request_live/new.ex:520
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Approximate area" msgid "Approximate area"
msgstr "Approximate area" msgstr "Approximate area"
#: lib/who_need_help_web/live/activity_live/new.ex:297
#, elixir-autogen, elixir-format
msgid "Approximate public meeting area"
msgstr "Approximate public meeting area"
#: lib/who_need_help_web/live/profile_live.ex:163 #: lib/who_need_help_web/live/profile_live.ex:163
#: lib/who_need_help_web/live/request_live/show.ex:996 #: lib/who_need_help_web/live/request_live/show.ex:996
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -425,7 +420,7 @@ msgstr "Changing..."
msgid "Choose a category, urgency, and safe location visibility." msgid "Choose a category, urgency, and safe location visibility."
msgstr "Choose a category, urgency, and safe location visibility." msgstr "Choose a category, urgency, and safe location visibility."
#: lib/who_need_help_web/live/activity_live/new.ex:175 #: lib/who_need_help_web/live/activity_live/new.ex:205
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose activity" msgid "Choose activity"
msgstr "Choose activity" msgstr "Choose activity"
@ -435,15 +430,15 @@ msgstr "Choose activity"
msgid "Choose category" msgid "Choose category"
msgstr "Choose category" msgstr "Choose category"
#: lib/who_need_help_web/live/activity_live/new.ex:212 #: lib/who_need_help_web/live/activity_live/new.ex:242
#: lib/who_need_help_web/live/activity_live/new.ex:239 #: lib/who_need_help_web/live/activity_live/new.ex:269
#: lib/who_need_help_web/live/request_live/new.ex:344 #: lib/who_need_help_web/live/request_live/new.ex:344
#: lib/who_need_help_web/live/request_live/new.ex:371 #: lib/who_need_help_web/live/request_live/new.ex:371
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose…" msgid "Choose…"
msgstr "Choose…" msgstr "Choose…"
#: lib/who_need_help_web/live/activity_live/new.ex:298 #: lib/who_need_help_web/live/activity_live/new.ex:363
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "City centre, near the main entrance" msgid "City centre, near the main entrance"
msgstr "City centre, near the main entrance" msgstr "City centre, near the main entrance"
@ -459,7 +454,7 @@ msgstr "Clear"
msgid "Close" msgid "Close"
msgstr "Close" msgstr "Close"
#: lib/who_need_help_web/live/activity_live/new.ex:269 #: lib/who_need_help_web/live/activity_live/new.ex:299
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Coffee and conversation" msgid "Coffee and conversation"
msgstr "Coffee and conversation" msgstr "Coffee and conversation"
@ -524,7 +519,7 @@ msgstr "Confirm new password"
msgid "Confirm your account and ensure it is active first." msgid "Confirm your account and ensure it is active first."
msgstr "Confirm your account and ensure it is active first." msgstr "Confirm your account and ensure it is active first."
#: lib/who_need_help_web/live/activity_live/new.ex:135 #: lib/who_need_help_web/live/activity_live/new.ex:156
#: lib/who_need_help_web/live/request_live/new.ex:235 #: lib/who_need_help_web/live/request_live/new.ex:235
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Confirm your email and ensure your account is active before publishing." msgid "Confirm your email and ensure your account is active before publishing."
@ -549,7 +544,7 @@ msgid "Create activity"
msgstr "Create activity" msgstr "Create activity"
#: lib/who_need_help_web/live/activity_live/index.ex:535 #: lib/who_need_help_web/live/activity_live/index.ex:535
#: lib/who_need_help_web/live/activity_live/new.ex:150 #: lib/who_need_help_web/live/activity_live/new.ex:180
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Create an activity" msgid "Create an activity"
msgstr "Create an activity" msgstr "Create an activity"
@ -601,7 +596,7 @@ msgstr "Decline"
msgid "Default location visibility" msgid "Default location visibility"
msgstr "Default location visibility" msgstr "Default location visibility"
#: lib/who_need_help_web/live/activity_live/new.ex:276 #: lib/who_need_help_web/live/activity_live/new.ex:306
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Describe the public plan, approximate duration, and who might enjoy it." msgid "Describe the public plan, approximate duration, and who might enjoy it."
msgstr "Describe the public plan, approximate duration, and who might enjoy it." msgstr "Describe the public plan, approximate duration, and who might enjoy it."
@ -683,11 +678,6 @@ msgstr "Enter handover code"
msgid "Exact address after matching" msgid "Exact address after matching"
msgstr "Exact address after matching" msgstr "Exact address after matching"
#: lib/who_need_help_web/live/activity_live/new.ex:324
#, elixir-autogen, elixir-format
msgid "Exact coordinates are shown only to participants you approve."
msgstr "Exact coordinates are shown only to participants you approve."
#: lib/who_need_help_web/live/profile_live.ex:164 #: lib/who_need_help_web/live/profile_live.ex:164
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Exact for active match" msgid "Exact for active match"
@ -805,7 +795,6 @@ msgstr "Hi %{email},\n\nYou can confirm your account by visiting the URL below:\
msgid "Hi %{email},\n\nYou can log into your account by visiting the URL below:\n\n%{url}\n\nIf you didn't request this email, please ignore this." msgid "Hi %{email},\n\nYou can log into your account by visiting the URL below:\n\n%{url}\n\nIf you didn't request this email, please ignore this."
msgstr "Hi %{email},\n\nYou can log into your account by visiting the URL below:\n\n%{url}\n\nIf you didn't request this email, please ignore this." msgstr "Hi %{email},\n\nYou can log into your account by visiting the URL below:\n\n%{url}\n\nIf you didn't request this email, please ignore this."
#: lib/who_need_help_web/live/activity_live/new.ex:306
#: lib/who_need_help_web/live/profile_live.ex:162 #: lib/who_need_help_web/live/profile_live.ex:162
#: lib/who_need_help_web/live/request_live/show.ex:997 #: lib/who_need_help_web/live/request_live/show.ex:997
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -845,7 +834,7 @@ msgstr "I confirm there is no immediate danger, people and vehicles are away fro
msgid "I confirm this is not an emergency, there is no immediate danger, and the requested task is lawful." msgid "I confirm this is not an emergency, there is no immediate danger, and the requested task is lawful."
msgstr "I confirm this is not an emergency, there is no immediate danger, and the requested task is lawful." msgstr "I confirm this is not an emergency, there is no immediate danger, and the requested task is lawful."
#: lib/who_need_help_web/live/activity_live/new.ex:348 #: lib/who_need_help_web/live/activity_live/new.ex:526
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point." msgid "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point."
msgstr "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point." msgstr "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point."
@ -904,13 +893,13 @@ msgstr "Invalid email or password"
msgid "Join requests are closed." msgid "Join requests are closed."
msgstr "Join requests are closed." msgstr "Join requests are closed."
#: lib/who_need_help_web/live/activity_live/new.ex:286 #: lib/who_need_help_web/live/activity_live/new.ex:316
#: lib/who_need_help_web/live/activity_live/show.ex:387 #: lib/who_need_help_web/live/activity_live/show.ex:387
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Join requests close" msgid "Join requests close"
msgstr "Join requests close" msgstr "Join requests close"
#: lib/who_need_help_web/live/activity_live/new.ex:332 #: lib/who_need_help_web/live/activity_live/new.ex:482
#: lib/who_need_help_web/live/notification_live.ex:686 #: lib/who_need_help_web/live/notification_live.ex:686
#: lib/who_need_help_web/live/request_live/new.ex:668 #: lib/who_need_help_web/live/request_live/new.ex:668
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -968,7 +957,7 @@ msgstr "Log in only this time"
msgid "Logged out successfully." msgid "Logged out successfully."
msgstr "Logged out successfully." msgstr "Logged out successfully."
#: lib/who_need_help_web/live/activity_live/new.ex:339 #: lib/who_need_help_web/live/activity_live/new.ex:496
#: lib/who_need_help_web/live/notification_live.ex:700 #: lib/who_need_help_web/live/notification_live.ex:700
#: lib/who_need_help_web/live/request_live/new.ex:682 #: lib/who_need_help_web/live/request_live/new.ex:682
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1103,7 +1092,7 @@ msgstr "Network"
msgid "New password" msgid "New password"
msgstr "New password" msgstr "New password"
#: lib/who_need_help_web/live/activity_live/new.ex:244 #: lib/who_need_help_web/live/activity_live/new.ex:274
#: lib/who_need_help_web/live/activity_live/show.ex:300 #: lib/who_need_help_web/live/activity_live/show.ex:300
#: lib/who_need_help_web/live/request_live/new.ex:379 #: lib/who_need_help_web/live/request_live/new.ex:379
#: lib/who_need_help_web/live/request_live/show.ex:877 #: lib/who_need_help_web/live/request_live/show.ex:877
@ -1289,7 +1278,7 @@ msgstr "Pickup instructions (optional)"
msgid "Pickup notes" msgid "Pickup notes"
msgstr "Pickup notes" msgstr "Pickup notes"
#: lib/who_need_help_web/live/activity_live/new.ex:274 #: lib/who_need_help_web/live/activity_live/new.ex:304
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Plan and expectations" msgid "Plan and expectations"
msgstr "Plan and expectations" msgstr "Plan and expectations"
@ -1378,11 +1367,6 @@ msgstr "Proposals and votes guide moderators. Approval remains a human decision.
msgid "Public location can be hidden, approximate, or explicitly exact. Live tracking is optional. A browser shares only while its page is open; Android shows a persistent foreground-service notification while sharing. The current exact point is deleted when sharing stops, a match ends, or either participant blocks the other; derived movement and proximity evidence may remain." msgid "Public location can be hidden, approximate, or explicitly exact. Live tracking is optional. A browser shares only while its page is open; Android shows a persistent foreground-service notification while sharing. The current exact point is deleted when sharing stops, a match ends, or either participant blocks the other; derived movement and proximity evidence may remain."
msgstr "Public location can be hidden, approximate, or explicitly exact. Live tracking is optional. A browser shares only while its page is open; Android shows a persistent foreground-service notification while sharing. The current exact point is deleted when sharing stops, a match ends, or either participant blocks the other; derived movement and proximity evidence may remain." msgstr "Public location can be hidden, approximate, or explicitly exact. Live tracking is optional. A browser shares only while its page is open; Android shows a persistent foreground-service notification while sharing. The current exact point is deleted when sharing stops, a match ends, or either participant blocks the other; derived movement and proximity evidence may remain."
#: lib/who_need_help_web/live/activity_live/new.ex:303
#, elixir-autogen, elixir-format
msgid "Public map visibility"
msgstr "Public map visibility"
#: lib/who_need_help_web/live/profile_live.ex:326 #: lib/who_need_help_web/live/profile_live.ex:326
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Public profile URL" msgid "Public profile URL"
@ -1394,12 +1378,12 @@ msgstr "Public profile URL"
msgid "Public reputation" msgid "Public reputation"
msgstr "Public reputation" msgstr "Public reputation"
#: lib/who_need_help_web/live/activity_live/new.ex:152 #: lib/who_need_help_web/live/activity_live/new.ex:182
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publish a clear public plan. Join requests stay pending until you approve them." msgid "Publish a clear public plan. Join requests stay pending until you approve them."
msgstr "Publish a clear public plan. Join requests stay pending until you approve them." msgstr "Publish a clear public plan. Join requests stay pending until you approve them."
#: lib/who_need_help_web/live/activity_live/new.ex:360 #: lib/who_need_help_web/live/activity_live/new.ex:538
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publish activity" msgid "Publish activity"
msgstr "Publish activity" msgstr "Publish activity"
@ -1414,7 +1398,7 @@ msgstr "Publish proposal"
msgid "Publish request" msgid "Publish request"
msgstr "Publish request" msgstr "Publish request"
#: lib/who_need_help_web/live/activity_live/new.ex:358 #: lib/who_need_help_web/live/activity_live/new.ex:536
#: lib/who_need_help_web/live/request_live/new.ex:742 #: lib/who_need_help_web/live/request_live/new.ex:742
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publishing…" msgid "Publishing…"
@ -1697,7 +1681,7 @@ msgstr "Share only non-sensitive instructions. Exact details can wait for the ma
msgid "Short bio" msgid "Short bio"
msgstr "Short bio" msgstr "Short bio"
#: lib/who_need_help_web/live/activity_live/new.ex:268 #: lib/who_need_help_web/live/activity_live/new.ex:298
#: lib/who_need_help_web/live/request_live/new.ex:411 #: lib/who_need_help_web/live/request_live/new.ex:411
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Short title" msgid "Short title"
@ -1978,7 +1962,7 @@ msgstr "To see sent emails, visit"
msgid "Today" msgid "Today"
msgstr "Today" msgstr "Today"
#: lib/who_need_help_web/live/activity_live/new.ex:138 #: lib/who_need_help_web/live/activity_live/new.ex:159
#: lib/who_need_help_web/live/activity_live/show.ex:336 #: lib/who_need_help_web/live/activity_live/show.ex:336
#: lib/who_need_help_web/live/category_proposal_live.ex:85 #: lib/who_need_help_web/live/category_proposal_live.ex:85
#: lib/who_need_help_web/live/profile_live.ex:59 #: lib/who_need_help_web/live/profile_live.ex:59
@ -2009,7 +1993,7 @@ msgstr "Too many sign-in emails in the configured time window."
msgid "Total" msgid "Total"
msgstr "Total" msgstr "Total"
#: lib/who_need_help_web/live/activity_live/new.ex:293 #: lib/who_need_help_web/live/activity_live/new.ex:323
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Total group capacity" msgid "Total group capacity"
msgstr "Total group capacity" msgstr "Total group capacity"
@ -2057,7 +2041,7 @@ msgstr "Urgency"
msgid "Urgent help" msgid "Urgent help"
msgstr "Urgent help" msgstr "Urgent help"
#: lib/who_need_help_web/live/activity_live/new.ex:158 #: lib/who_need_help_web/live/activity_live/new.ex:188
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information." msgid "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information."
msgstr "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information." msgstr "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information."
@ -2072,11 +2056,6 @@ msgstr "Use dark theme"
msgid "Use light theme" msgid "Use light theme"
msgstr "Use light theme" msgstr "Use light theme"
#: lib/who_need_help_web/live/activity_live/new.ex:321
#, elixir-autogen, elixir-format
msgid "Use my current foreground location"
msgstr "Use my current foreground location"
#: lib/who_need_help_web/controllers/page_html/home.html.heex:251 #: lib/who_need_help_web/controllers/page_html/home.html.heex:251
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Use private chat and optional live location sharing." msgid "Use private chat and optional live location sharing."
@ -2215,7 +2194,7 @@ msgstr "Withdraw from this request"
msgid "Write a safe coordination message…" msgid "Write a safe coordination message…"
msgstr "Write a safe coordination message…" msgstr "Write a safe coordination message…"
#: lib/who_need_help_web/live/activity_live/new.ex:241 #: lib/who_need_help_web/live/activity_live/new.ex:271
#: lib/who_need_help_web/live/activity_live/show.ex:298 #: lib/who_need_help_web/live/activity_live/show.ex:298
#: lib/who_need_help_web/live/request_live/new.ex:373 #: lib/who_need_help_web/live/request_live/new.ex:373
#: lib/who_need_help_web/live/request_live/show.ex:875 #: lib/who_need_help_web/live/request_live/show.ex:875
@ -2452,7 +2431,7 @@ msgstr "verified"
msgid "← All requests" msgid "← All requests"
msgstr "← All requests" msgstr "← All requests"
#: lib/who_need_help_web/live/activity_live/new.ex:148 #: lib/who_need_help_web/live/activity_live/new.ex:178
#: lib/who_need_help_web/live/activity_live/show.ex:352 #: lib/who_need_help_web/live/activity_live/show.ex:352
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "← Back to activities" msgid "← Back to activities"
@ -2578,7 +2557,7 @@ msgstr "Could not complete moderation. Please try again."
msgid "Could not complete the action. Please try again." msgid "Could not complete the action. Please try again."
msgstr "Could not complete the action. Please try again." msgstr "Could not complete the action. Please try again."
#: lib/who_need_help_web/live/activity_live/new.ex:140 #: lib/who_need_help_web/live/activity_live/new.ex:161
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not publish the activity. Please try again." msgid "Could not publish the activity. Please try again."
msgstr "Could not publish the activity. Please try again." msgstr "Could not publish the activity. Please try again."
@ -4038,6 +4017,7 @@ msgstr ""
msgid "Date" msgid "Date"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:474
#: lib/who_need_help_web/live/notification_live.ex:683 #: lib/who_need_help_web/live/notification_live.ex:683
#: lib/who_need_help_web/live/request_live/new.ex:660 #: lib/who_need_help_web/live/request_live/new.ex:660
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -4125,14 +4105,14 @@ msgstr ""
msgid "In 3 hours" msgid "In 3 hours"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:316 #: lib/who_need_help_web/live/activity_live/new.ex:354
#: lib/who_need_help_web/live/notification_live.ex:601 #: lib/who_need_help_web/live/notification_live.ex:601
#: lib/who_need_help_web/live/request_live/new.ex:484 #: lib/who_need_help_web/live/request_live/new.ex:484
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location is unavailable in this browser." msgid "Location is unavailable in this browser."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:318 #: lib/who_need_help_web/live/activity_live/new.ex:356
#: lib/who_need_help_web/live/notification_live.ex:603 #: lib/who_need_help_web/live/notification_live.ex:603
#: lib/who_need_help_web/live/request_live/new.ex:486 #: lib/who_need_help_web/live/request_live/new.ex:486
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -4283,7 +4263,7 @@ msgstr ""
msgid "Signing in does not create a new account." msgid "Signing in does not create a new account."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:282 #: lib/who_need_help_web/live/activity_live/new.ex:312
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Starts at" msgid "Starts at"
msgstr "Starts at" msgstr "Starts at"
@ -4309,6 +4289,7 @@ msgstr ""
msgid "This activity is closed. The group chat remains available as read-only history." msgid "This activity is closed. The group chat remains available as read-only history."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:366
#: lib/who_need_help_web/live/request_live/new.ex:503 #: lib/who_need_help_web/live/request_live/new.ex:503
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "This description is visible to everyone. Do not enter a private address." msgid "This description is visible to everyone. Do not enter a private address."
@ -4385,6 +4366,7 @@ msgstr ""
msgid "Use another email" msgid "Use another email"
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:435
#: lib/who_need_help_web/live/notification_live.ex:636 #: lib/who_need_help_web/live/notification_live.ex:636
#: lib/who_need_help_web/live/request_live/new.ex:595 #: lib/who_need_help_web/live/request_live/new.ex:595
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
@ -4641,6 +4623,8 @@ msgstr ""
#: lib/who_need_help_web/components/layouts/root.html.heex:6 #: lib/who_need_help_web/components/layouts/root.html.heex:6
#: lib/who_need_help_web/controllers/page_html/home.html.heex:160 #: lib/who_need_help_web/controllers/page_html/home.html.heex:160
#: lib/who_need_help_web/live/activity_live/index.ex:496 #: lib/who_need_help_web/live/activity_live/index.ex:496
#: lib/who_need_help_web/live/activity_live/new.ex:355
#: lib/who_need_help_web/live/activity_live/new.ex:414
#: lib/who_need_help_web/live/activity_live/show.ex:545 #: lib/who_need_help_web/live/activity_live/show.ex:545
#: lib/who_need_help_web/live/notification_live.ex:602 #: lib/who_need_help_web/live/notification_live.ex:602
#: lib/who_need_help_web/live/notification_live.ex:621 #: lib/who_need_help_web/live/notification_live.ex:621
@ -4652,7 +4636,7 @@ msgstr ""
msgid "Try map again" msgid "Try map again"
msgstr "Try map again" msgstr "Try map again"
#: lib/who_need_help_web/live/activity_live/new.ex:124 #: lib/who_need_help_web/live/activity_live/new.ex:145
#: lib/who_need_help_web/live/request_live/new.ex:193 #: lib/who_need_help_web/live/request_live/new.ex:193
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{field} is required." msgid "%{field} is required."
@ -4665,13 +4649,13 @@ msgstr ""
msgid "Both reviews are now visible on participant profiles." msgid "Both reviews are now visible on participant profiles."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:127 #: lib/who_need_help_web/live/activity_live/new.ex:148
#: lib/who_need_help_web/live/request_live/new.ex:196 #: lib/who_need_help_web/live/request_live/new.ex:196
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Check the category details and try again." msgid "Check the category details and try again."
msgstr "" msgstr ""
#: lib/who_need_help_web/live/activity_live/new.ex:130 #: lib/who_need_help_web/live/activity_live/new.ex:151
#: lib/who_need_help_web/live/request_live/new.ex:199 #: lib/who_need_help_web/live/request_live/new.ex:199
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose a valid value for %{field}." msgid "Choose a valid value for %{field}."
@ -6470,7 +6454,7 @@ msgstr "A new broad group of help or activities"
msgid "A specific option inside an existing category" msgid "A specific option inside an existing category"
msgstr "A specific option inside an existing category" msgstr "A specific option inside an existing category"
#: lib/who_need_help_web/live/activity_live/new.ex:183 #: lib/who_need_help_web/live/activity_live/new.ex:213
#: lib/who_need_help_web/live/request_live/new.ex:311 #: lib/who_need_help_web/live/request_live/new.ex:311
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Can't find the right option? Propose a category" msgid "Can't find the right option? Propose a category"
@ -6507,7 +6491,7 @@ msgstr "New main category"
msgid "New subcategory" msgid "New subcategory"
msgstr "New subcategory" msgstr "New subcategory"
#: lib/who_need_help_web/live/activity_live/new.ex:177 #: lib/who_need_help_web/live/activity_live/new.ex:207
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No matching activity. You can propose a new one." msgid "No matching activity. You can propose a new one."
msgstr "No matching activity. You can propose a new one." msgstr "No matching activity. You can propose a new one."
@ -6522,7 +6506,7 @@ msgstr "No matching help type. You can propose a new one."
msgid "No matching main category" msgid "No matching main category"
msgstr "No matching main category" msgstr "No matching main category"
#: lib/who_need_help_web/live/activity_live/new.ex:176 #: lib/who_need_help_web/live/activity_live/new.ex:206
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search activity categories" msgid "Search activity categories"
msgstr "Search activity categories" msgstr "Search activity categories"
@ -6593,11 +6577,6 @@ msgstr "Search languages"
msgid "Android push notifications are not available yet." msgid "Android push notifications are not available yet."
msgstr "Android push notifications are not available yet." msgstr "Android push notifications are not available yet."
#: lib/who_need_help_web/live/activity_live/new.ex:317
#, elixir-autogen, elixir-format
msgid "Location added."
msgstr "Location added."
#: lib/who_need_help_web/components/layouts/root.html.heex:9 #: lib/who_need_help_web/components/layouts/root.html.heex:9
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Map marker" msgid "Map marker"
@ -6657,3 +6636,110 @@ msgstr "Waiting for Android notification permission and token…"
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Who Need Help connects adults who need urgent local help with nearby volunteers." msgid "Who Need Help connects adults who need urgent local help with nearby volunteers."
msgstr "Who Need Help connects adults who need urgent local help with nearby volunteers." msgstr "Who Need Help connects adults who need urgent local help with nearby volunteers."
#: lib/who_need_help_web/live/activity_live/new.ex:337
#: lib/who_need_help_web/live/activity_live/new.ex:470
#, elixir-autogen, elixir-format
msgid "Choose the public meeting point on the map or use your current location."
msgstr "Choose the public meeting point on the map or use your current location."
#: lib/who_need_help_web/live/activity_live/new.ex:420
#: lib/who_need_help_web/live/activity_live/new.ex:423
#, elixir-autogen, elixir-format
msgid "Click the map or drag the pin to choose the meeting point"
msgstr "Click the map or drag the pin to choose the meeting point"
#: lib/who_need_help_web/live/activity_live/new.ex:349
#, elixir-autogen, elixir-format
msgid "Drag to move the exact meeting point"
msgstr "Drag to move the exact meeting point"
#: lib/who_need_help_web/live/activity_live/new.ex:348
#, elixir-autogen, elixir-format
msgid "Drag to move the meeting area"
msgstr "Drag to move the meeting area"
#: lib/who_need_help_web/live/activity_live/new.ex:350
#, elixir-autogen, elixir-format
msgid "Drag to move the private meeting point"
msgstr "Drag to move the private meeting point"
#: lib/who_need_help_web/live/activity_live/new.ex:344
#, elixir-autogen, elixir-format
msgid "Meeting point selected."
msgstr "Meeting point selected."
#: lib/who_need_help_web/live/activity_live/new.ex:340
#, elixir-autogen, elixir-format
msgid "Meeting point selected. Before approval, people see only its approximate area."
msgstr "Meeting point selected. Before approval, people see only its approximate area."
#: lib/who_need_help_web/live/activity_live/new.ex:399
#, elixir-autogen, elixir-format
msgid "No public map"
msgstr "No public map"
#: lib/who_need_help_web/live/activity_live/new.ex:443
#, elixir-autogen, elixir-format
msgid "Only people you approve receive the exact meeting point and group chat."
msgstr "Only people you approve receive the exact meeting point and group chat."
#: lib/who_need_help_web/live/activity_live/new.ex:400
#, elixir-autogen, elixir-format
msgid "People can find it by the area description"
msgstr "People can find it by the area description"
#: lib/who_need_help_web/live/activity_live/new.ex:455
#, elixir-autogen, elixir-format
msgid "People can search by the public area description. Approved participants receive the exact point."
msgstr "People can search by the public area description. Approved participants receive the exact point."
#: lib/who_need_help_web/live/activity_live/new.ex:346
#, elixir-autogen, elixir-format
msgid "Private meeting point selected. It appears only after approval."
msgstr "Private meeting point selected. It appears only after approval."
#: lib/who_need_help_web/live/activity_live/new.ex:362
#, elixir-autogen, elixir-format
msgid "Public meeting area or landmark"
msgstr "Public meeting area or landmark"
#: lib/who_need_help_web/live/activity_live/new.ex:386
#, elixir-autogen, elixir-format
msgid "Recommended for discoverability"
msgstr "Recommended for discoverability"
#: lib/who_need_help_web/live/activity_live/new.ex:352
#, elixir-autogen, elixir-format
msgid "Select a meeting point. It will remain hidden until you approve someone."
msgstr "Select a meeting point. It will remain hidden until you approve someone."
#: lib/who_need_help_web/live/activity_live/new.ex:412
#, elixir-autogen, elixir-format
msgid "The map is unavailable. You can enter coordinates manually."
msgstr "The map is unavailable. You can enter coordinates manually."
#: lib/who_need_help_web/live/activity_live/new.ex:441
#, elixir-autogen, elixir-format
msgid "The public map stays approximate"
msgstr "The public map stays approximate"
#: lib/who_need_help_web/live/activity_live/new.ex:453
#, elixir-autogen, elixir-format
msgid "The public map stays hidden"
msgstr "The public map stays hidden"
#: lib/who_need_help_web/live/activity_live/new.ex:476
#, elixir-autogen, elixir-format
msgid "These coordinates are the exact meeting point. They are revealed only after approval."
msgstr "These coordinates are the exact meeting point. They are revealed only after approval."
#: lib/who_need_help_web/live/activity_live/new.ex:372
#, elixir-autogen, elixir-format
msgid "What should people see before approval?"
msgstr "What should people see before approval?"
#: lib/who_need_help_web/live/activity_live/new.ex:98
#, elixir-autogen, elixir-format
msgid "Choose the meeting point on the map or use your current location."
msgstr "Choose the meeting point on the map or use your current location."

View File

@ -200,7 +200,7 @@ msgstr ""
"походов согласуйте маршрут и меры безопасности и никогда не публикуйте " "походов согласуйте маршрут и меры безопасности и никогда не публикуйте "
"домашние адреса, коды доступа или документы для поездки." "домашние адреса, коды доступа или документы для поездки."
#: lib/who_need_help_web/live/activity_live/new.ex:200 #: lib/who_need_help_web/live/activity_live/new.ex:230
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity details" msgid "Activity details"
msgstr "Детали активности" msgstr "Детали активности"
@ -216,7 +216,7 @@ msgstr "Активность скрыта."
msgid "Activity is unavailable." msgid "Activity is unavailable."
msgstr "Активность недоступна." msgstr "Активность недоступна."
#: lib/who_need_help_web/live/activity_live/new.ex:50 #: lib/who_need_help_web/live/activity_live/new.ex:52
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity published. You approve every participant." msgid "Activity published. You approve every participant."
msgstr "Активность опубликована. Вы одобряете каждого участника." msgstr "Активность опубликована. Вы одобряете каждого участника."
@ -227,7 +227,7 @@ msgid "Activity restored."
msgstr "Активность восстановлена." msgstr "Активность восстановлена."
#: lib/who_need_help_web/live/activity_live/index.ex:385 #: lib/who_need_help_web/live/activity_live/index.ex:385
#: lib/who_need_help_web/live/activity_live/new.ex:174 #: lib/who_need_help_web/live/activity_live/new.ex:204
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity type" msgid "Activity type"
msgstr "Тип активности" msgstr "Тип активности"
@ -289,17 +289,12 @@ msgid "Approved participants"
msgstr "Одобренные участники" msgstr "Одобренные участники"
#: lib/who_need_help_web/controllers/page_html/home.html.heex:80 #: lib/who_need_help_web/controllers/page_html/home.html.heex:80
#: lib/who_need_help_web/live/activity_live/new.ex:305 #: lib/who_need_help_web/live/activity_live/new.ex:385
#: lib/who_need_help_web/live/request_live/new.ex:520 #: lib/who_need_help_web/live/request_live/new.ex:520
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Approximate area" msgid "Approximate area"
msgstr "Примерный район" msgstr "Примерный район"
#: lib/who_need_help_web/live/activity_live/new.ex:297
#, elixir-autogen, elixir-format
msgid "Approximate public meeting area"
msgstr "Примерный публичный район встречи"
#: lib/who_need_help_web/live/profile_live.ex:163 #: lib/who_need_help_web/live/profile_live.ex:163
#: lib/who_need_help_web/live/request_live/show.ex:996 #: lib/who_need_help_web/live/request_live/show.ex:996
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -442,7 +437,7 @@ msgid "Choose a category, urgency, and safe location visibility."
msgstr "" msgstr ""
"Выберите категорию, срочность и безопасный уровень видимости геопозиции." "Выберите категорию, срочность и безопасный уровень видимости геопозиции."
#: lib/who_need_help_web/live/activity_live/new.ex:175 #: lib/who_need_help_web/live/activity_live/new.ex:205
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose activity" msgid "Choose activity"
msgstr "Выберите активность" msgstr "Выберите активность"
@ -452,15 +447,15 @@ msgstr "Выберите активность"
msgid "Choose category" msgid "Choose category"
msgstr "Выберите категорию" msgstr "Выберите категорию"
#: lib/who_need_help_web/live/activity_live/new.ex:212 #: lib/who_need_help_web/live/activity_live/new.ex:242
#: lib/who_need_help_web/live/activity_live/new.ex:239 #: lib/who_need_help_web/live/activity_live/new.ex:269
#: lib/who_need_help_web/live/request_live/new.ex:344 #: lib/who_need_help_web/live/request_live/new.ex:344
#: lib/who_need_help_web/live/request_live/new.ex:371 #: lib/who_need_help_web/live/request_live/new.ex:371
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose…" msgid "Choose…"
msgstr "Выберите…" msgstr "Выберите…"
#: lib/who_need_help_web/live/activity_live/new.ex:298 #: lib/who_need_help_web/live/activity_live/new.ex:363
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "City centre, near the main entrance" msgid "City centre, near the main entrance"
msgstr "Центр города, рядом с главным входом" msgstr "Центр города, рядом с главным входом"
@ -476,7 +471,7 @@ msgstr "Очистить"
msgid "Close" msgid "Close"
msgstr "Закрыть" msgstr "Закрыть"
#: lib/who_need_help_web/live/activity_live/new.ex:269 #: lib/who_need_help_web/live/activity_live/new.ex:299
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Coffee and conversation" msgid "Coffee and conversation"
msgstr "Кофе и разговоры" msgstr "Кофе и разговоры"
@ -543,7 +538,7 @@ msgstr "Подтвердите новый пароль"
msgid "Confirm your account and ensure it is active first." msgid "Confirm your account and ensure it is active first."
msgstr "Подтвердите свою учетную запись и убедитесь, что она активна." msgstr "Подтвердите свою учетную запись и убедитесь, что она активна."
#: lib/who_need_help_web/live/activity_live/new.ex:135 #: lib/who_need_help_web/live/activity_live/new.ex:156
#: lib/who_need_help_web/live/request_live/new.ex:235 #: lib/who_need_help_web/live/request_live/new.ex:235
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Confirm your email and ensure your account is active before publishing." msgid "Confirm your email and ensure your account is active before publishing."
@ -570,7 +565,7 @@ msgid "Create activity"
msgstr "Создать активность" msgstr "Создать активность"
#: lib/who_need_help_web/live/activity_live/index.ex:535 #: lib/who_need_help_web/live/activity_live/index.ex:535
#: lib/who_need_help_web/live/activity_live/new.ex:150 #: lib/who_need_help_web/live/activity_live/new.ex:180
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Create an activity" msgid "Create an activity"
msgstr "Создать активность" msgstr "Создать активность"
@ -624,7 +619,7 @@ msgstr "Отклонить"
msgid "Default location visibility" msgid "Default location visibility"
msgstr "Видимость местоположения по умолчанию" msgstr "Видимость местоположения по умолчанию"
#: lib/who_need_help_web/live/activity_live/new.ex:276 #: lib/who_need_help_web/live/activity_live/new.ex:306
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Describe the public plan, approximate duration, and who might enjoy it." msgid "Describe the public plan, approximate duration, and who might enjoy it."
msgstr "" msgstr ""
@ -716,11 +711,6 @@ msgstr "Введите код передачи"
msgid "Exact address after matching" msgid "Exact address after matching"
msgstr "Точный адрес после назначения помощника" msgstr "Точный адрес после назначения помощника"
#: lib/who_need_help_web/live/activity_live/new.ex:324
#, elixir-autogen, elixir-format
msgid "Exact coordinates are shown only to participants you approve."
msgstr "Точные координаты показаны только участникам, которых вы одобряете."
#: lib/who_need_help_web/live/profile_live.ex:164 #: lib/who_need_help_web/live/profile_live.ex:164
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Exact for active match" msgid "Exact for active match"
@ -865,7 +855,6 @@ msgstr ""
"\n" "\n"
"Если вы не запрашивали это письмо, просто проигнорируйте его." "Если вы не запрашивали это письмо, просто проигнорируйте его."
#: lib/who_need_help_web/live/activity_live/new.ex:306
#: lib/who_need_help_web/live/profile_live.ex:162 #: lib/who_need_help_web/live/profile_live.ex:162
#: lib/who_need_help_web/live/request_live/show.ex:997 #: lib/who_need_help_web/live/request_live/show.ex:997
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -910,7 +899,7 @@ msgstr ""
"Я подтверждаю, что это не экстренная ситуация, непосредственной опасности " "Я подтверждаю, что это не экстренная ситуация, непосредственной опасности "
"нет, а запрашиваемая помощь законна." "нет, а запрашиваемая помощь законна."
#: lib/who_need_help_web/live/activity_live/new.ex:348 #: lib/who_need_help_web/live/activity_live/new.ex:526
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point." msgid "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point."
msgstr "" msgstr ""
@ -977,13 +966,13 @@ msgstr "Неверная электронная почта или пароль"
msgid "Join requests are closed." msgid "Join requests are closed."
msgstr "Приём заявок на участие закрыт." msgstr "Приём заявок на участие закрыт."
#: lib/who_need_help_web/live/activity_live/new.ex:286 #: lib/who_need_help_web/live/activity_live/new.ex:316
#: lib/who_need_help_web/live/activity_live/show.ex:387 #: lib/who_need_help_web/live/activity_live/show.ex:387
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Join requests close" msgid "Join requests close"
msgstr "Приём заявок завершается" msgstr "Приём заявок завершается"
#: lib/who_need_help_web/live/activity_live/new.ex:332 #: lib/who_need_help_web/live/activity_live/new.ex:482
#: lib/who_need_help_web/live/notification_live.ex:686 #: lib/who_need_help_web/live/notification_live.ex:686
#: lib/who_need_help_web/live/request_live/new.ex:668 #: lib/who_need_help_web/live/request_live/new.ex:668
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1043,7 +1032,7 @@ msgstr "Войти только сейчас"
msgid "Logged out successfully." msgid "Logged out successfully."
msgstr "Вы успешно вышли." msgstr "Вы успешно вышли."
#: lib/who_need_help_web/live/activity_live/new.ex:339 #: lib/who_need_help_web/live/activity_live/new.ex:496
#: lib/who_need_help_web/live/notification_live.ex:700 #: lib/who_need_help_web/live/notification_live.ex:700
#: lib/who_need_help_web/live/request_live/new.ex:682 #: lib/who_need_help_web/live/request_live/new.ex:682
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1189,7 +1178,7 @@ msgstr "Сеть"
msgid "New password" msgid "New password"
msgstr "Новый пароль" msgstr "Новый пароль"
#: lib/who_need_help_web/live/activity_live/new.ex:244 #: lib/who_need_help_web/live/activity_live/new.ex:274
#: lib/who_need_help_web/live/activity_live/show.ex:300 #: lib/who_need_help_web/live/activity_live/show.ex:300
#: lib/who_need_help_web/live/request_live/new.ex:379 #: lib/who_need_help_web/live/request_live/new.ex:379
#: lib/who_need_help_web/live/request_live/show.ex:877 #: lib/who_need_help_web/live/request_live/show.ex:877
@ -1379,7 +1368,7 @@ msgstr "Инструкции для получения (необязательн
msgid "Pickup notes" msgid "Pickup notes"
msgstr "Инструкции по получению" msgstr "Инструкции по получению"
#: lib/who_need_help_web/live/activity_live/new.ex:274 #: lib/who_need_help_web/live/activity_live/new.ex:304
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Plan and expectations" msgid "Plan and expectations"
msgstr "План и ожидания" msgstr "План и ожидания"
@ -1479,11 +1468,6 @@ msgstr ""
"одним участником другого; производные признаки движения и близости могут " "одним участником другого; производные признаки движения и близости могут "
"сохраняться." "сохраняться."
#: lib/who_need_help_web/live/activity_live/new.ex:303
#, elixir-autogen, elixir-format
msgid "Public map visibility"
msgstr "Видимость на публичной карте"
#: lib/who_need_help_web/live/profile_live.ex:326 #: lib/who_need_help_web/live/profile_live.ex:326
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Public profile URL" msgid "Public profile URL"
@ -1495,14 +1479,14 @@ msgstr "URL публичного профиля"
msgid "Public reputation" msgid "Public reputation"
msgstr "Публичная репутация" msgstr "Публичная репутация"
#: lib/who_need_help_web/live/activity_live/new.ex:152 #: lib/who_need_help_web/live/activity_live/new.ex:182
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publish a clear public plan. Join requests stay pending until you approve them." msgid "Publish a clear public plan. Join requests stay pending until you approve them."
msgstr "" msgstr ""
"Опубликуйте понятный публичный план. Заявки на участие будут ожидать, пока " "Опубликуйте понятный публичный план. Заявки на участие будут ожидать, пока "
"вы их не одобрите." "вы их не одобрите."
#: lib/who_need_help_web/live/activity_live/new.ex:360 #: lib/who_need_help_web/live/activity_live/new.ex:538
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publish activity" msgid "Publish activity"
msgstr "Опубликовать активность" msgstr "Опубликовать активность"
@ -1517,7 +1501,7 @@ msgstr "Опубликовать предложение"
msgid "Publish request" msgid "Publish request"
msgstr "Опубликовать заявку" msgstr "Опубликовать заявку"
#: lib/who_need_help_web/live/activity_live/new.ex:358 #: lib/who_need_help_web/live/activity_live/new.ex:536
#: lib/who_need_help_web/live/request_live/new.ex:742 #: lib/who_need_help_web/live/request_live/new.ex:742
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publishing…" msgid "Publishing…"
@ -1810,7 +1794,7 @@ msgstr ""
msgid "Short bio" msgid "Short bio"
msgstr "Кратко о себе" msgstr "Кратко о себе"
#: lib/who_need_help_web/live/activity_live/new.ex:268 #: lib/who_need_help_web/live/activity_live/new.ex:298
#: lib/who_need_help_web/live/request_live/new.ex:411 #: lib/who_need_help_web/live/request_live/new.ex:411
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Short title" msgid "Short title"
@ -2101,7 +2085,7 @@ msgstr "Чтобы посмотреть отправленные письма,
msgid "Today" msgid "Today"
msgstr "Сегодня" msgstr "Сегодня"
#: lib/who_need_help_web/live/activity_live/new.ex:138 #: lib/who_need_help_web/live/activity_live/new.ex:159
#: lib/who_need_help_web/live/activity_live/show.ex:336 #: lib/who_need_help_web/live/activity_live/show.ex:336
#: lib/who_need_help_web/live/category_proposal_live.ex:85 #: lib/who_need_help_web/live/category_proposal_live.ex:85
#: lib/who_need_help_web/live/profile_live.ex:59 #: lib/who_need_help_web/live/profile_live.ex:59
@ -2132,7 +2116,7 @@ msgstr "Слишком много писем для входа за настро
msgid "Total" msgid "Total"
msgstr "Всего" msgstr "Всего"
#: lib/who_need_help_web/live/activity_live/new.ex:293 #: lib/who_need_help_web/live/activity_live/new.ex:323
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Total group capacity" msgid "Total group capacity"
msgstr "Общий размер группы" msgstr "Общий размер группы"
@ -2180,7 +2164,7 @@ msgstr "Срочность"
msgid "Urgent help" msgid "Urgent help"
msgstr "Срочная помощь" msgstr "Срочная помощь"
#: lib/who_need_help_web/live/activity_live/new.ex:158 #: lib/who_need_help_web/live/activity_live/new.ex:188
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information." msgid "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information."
msgstr "" msgstr ""
@ -2198,11 +2182,6 @@ msgstr "Включить тёмную тему"
msgid "Use light theme" msgid "Use light theme"
msgstr "Включить светлую тему" msgstr "Включить светлую тему"
#: lib/who_need_help_web/live/activity_live/new.ex:321
#, elixir-autogen, elixir-format
msgid "Use my current foreground location"
msgstr "Использовать мою текущую геопозицию"
#: lib/who_need_help_web/controllers/page_html/home.html.heex:251 #: lib/who_need_help_web/controllers/page_html/home.html.heex:251
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Use private chat and optional live location sharing." msgid "Use private chat and optional live location sharing."
@ -2349,7 +2328,7 @@ msgstr "Отказаться от этой заявки"
msgid "Write a safe coordination message…" msgid "Write a safe coordination message…"
msgstr "Напишите безопасное сообщение для координации…" msgstr "Напишите безопасное сообщение для координации…"
#: lib/who_need_help_web/live/activity_live/new.ex:241 #: lib/who_need_help_web/live/activity_live/new.ex:271
#: lib/who_need_help_web/live/activity_live/show.ex:298 #: lib/who_need_help_web/live/activity_live/show.ex:298
#: lib/who_need_help_web/live/request_live/new.ex:373 #: lib/who_need_help_web/live/request_live/new.ex:373
#: lib/who_need_help_web/live/request_live/show.ex:875 #: lib/who_need_help_web/live/request_live/show.ex:875
@ -2592,7 +2571,7 @@ msgstr "подтверждено"
msgid "← All requests" msgid "← All requests"
msgstr "← Все заявки" msgstr "← Все заявки"
#: lib/who_need_help_web/live/activity_live/new.ex:148 #: lib/who_need_help_web/live/activity_live/new.ex:178
#: lib/who_need_help_web/live/activity_live/show.ex:352 #: lib/who_need_help_web/live/activity_live/show.ex:352
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "← Back to activities" msgid "← Back to activities"
@ -2718,7 +2697,7 @@ msgstr "Не удалось завершить модерацию. Попроб
msgid "Could not complete the action. Please try again." msgid "Could not complete the action. Please try again."
msgstr "Не удалось выполнить действие. Попробуйте ещё раз." msgstr "Не удалось выполнить действие. Попробуйте ещё раз."
#: lib/who_need_help_web/live/activity_live/new.ex:140 #: lib/who_need_help_web/live/activity_live/new.ex:161
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not publish the activity. Please try again." msgid "Could not publish the activity. Please try again."
msgstr "Не удалось опубликовать активность. Попробуйте ещё раз." msgstr "Не удалось опубликовать активность. Попробуйте ещё раз."
@ -4178,6 +4157,7 @@ msgstr "Не удалось скопировать"
msgid "Date" msgid "Date"
msgstr "Дата" msgstr "Дата"
#: lib/who_need_help_web/live/activity_live/new.ex:474
#: lib/who_need_help_web/live/notification_live.ex:683 #: lib/who_need_help_web/live/notification_live.ex:683
#: lib/who_need_help_web/live/request_live/new.ex:660 #: lib/who_need_help_web/live/request_live/new.ex:660
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -4265,14 +4245,14 @@ msgstr "Через 1 час"
msgid "In 3 hours" msgid "In 3 hours"
msgstr "Через 3 часа" msgstr "Через 3 часа"
#: lib/who_need_help_web/live/activity_live/new.ex:316 #: lib/who_need_help_web/live/activity_live/new.ex:354
#: lib/who_need_help_web/live/notification_live.ex:601 #: lib/who_need_help_web/live/notification_live.ex:601
#: lib/who_need_help_web/live/request_live/new.ex:484 #: lib/who_need_help_web/live/request_live/new.ex:484
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location is unavailable in this browser." msgid "Location is unavailable in this browser."
msgstr "Геопозиция недоступна в этом браузере." msgstr "Геопозиция недоступна в этом браузере."
#: lib/who_need_help_web/live/activity_live/new.ex:318 #: lib/who_need_help_web/live/activity_live/new.ex:356
#: lib/who_need_help_web/live/notification_live.ex:603 #: lib/who_need_help_web/live/notification_live.ex:603
#: lib/who_need_help_web/live/request_live/new.ex:486 #: lib/who_need_help_web/live/request_live/new.ex:486
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -4423,7 +4403,7 @@ msgstr "Запрос на вход обработан"
msgid "Signing in does not create a new account." msgid "Signing in does not create a new account."
msgstr "Вход не создаёт новый аккаунт." msgstr "Вход не создаёт новый аккаунт."
#: lib/who_need_help_web/live/activity_live/new.ex:282 #: lib/who_need_help_web/live/activity_live/new.ex:312
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Starts at" msgid "Starts at"
msgstr "Начало" msgstr "Начало"
@ -4449,6 +4429,7 @@ msgstr "Сайт обработал ваш запрос на регистрац
msgid "This activity is closed. The group chat remains available as read-only history." msgid "This activity is closed. The group chat remains available as read-only history."
msgstr "Эта активность закрыта. История группового чата доступна только для чтения." msgstr "Эта активность закрыта. История группового чата доступна только для чтения."
#: lib/who_need_help_web/live/activity_live/new.ex:366
#: lib/who_need_help_web/live/request_live/new.ex:503 #: lib/who_need_help_web/live/request_live/new.ex:503
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "This description is visible to everyone. Do not enter a private address." msgid "This description is visible to everyone. Do not enter a private address."
@ -4525,6 +4506,7 @@ msgstr "Укажите безопасное публичное место вст
msgid "Use another email" msgid "Use another email"
msgstr "Использовать другую почту" msgstr "Использовать другую почту"
#: lib/who_need_help_web/live/activity_live/new.ex:435
#: lib/who_need_help_web/live/notification_live.ex:636 #: lib/who_need_help_web/live/notification_live.ex:636
#: lib/who_need_help_web/live/request_live/new.ex:595 #: lib/who_need_help_web/live/request_live/new.ex:595
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -4782,6 +4764,8 @@ msgstr "Вместе"
#: lib/who_need_help_web/components/layouts/root.html.heex:6 #: lib/who_need_help_web/components/layouts/root.html.heex:6
#: lib/who_need_help_web/controllers/page_html/home.html.heex:160 #: lib/who_need_help_web/controllers/page_html/home.html.heex:160
#: lib/who_need_help_web/live/activity_live/index.ex:496 #: lib/who_need_help_web/live/activity_live/index.ex:496
#: lib/who_need_help_web/live/activity_live/new.ex:355
#: lib/who_need_help_web/live/activity_live/new.ex:414
#: lib/who_need_help_web/live/activity_live/show.ex:545 #: lib/who_need_help_web/live/activity_live/show.ex:545
#: lib/who_need_help_web/live/notification_live.ex:602 #: lib/who_need_help_web/live/notification_live.ex:602
#: lib/who_need_help_web/live/notification_live.ex:621 #: lib/who_need_help_web/live/notification_live.ex:621
@ -4793,7 +4777,7 @@ msgstr "Вместе"
msgid "Try map again" msgid "Try map again"
msgstr "Попробовать карту снова" msgstr "Попробовать карту снова"
#: lib/who_need_help_web/live/activity_live/new.ex:124 #: lib/who_need_help_web/live/activity_live/new.ex:145
#: lib/who_need_help_web/live/request_live/new.ex:193 #: lib/who_need_help_web/live/request_live/new.ex:193
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{field} is required." msgid "%{field} is required."
@ -4806,13 +4790,13 @@ msgstr "Поле «%{field}» обязательно."
msgid "Both reviews are now visible on participant profiles." msgid "Both reviews are now visible on participant profiles."
msgstr "Оба отзыва теперь видны в профилях участников." msgstr "Оба отзыва теперь видны в профилях участников."
#: lib/who_need_help_web/live/activity_live/new.ex:127 #: lib/who_need_help_web/live/activity_live/new.ex:148
#: lib/who_need_help_web/live/request_live/new.ex:196 #: lib/who_need_help_web/live/request_live/new.ex:196
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Check the category details and try again." msgid "Check the category details and try again."
msgstr "Проверьте детали категории и повторите попытку." msgstr "Проверьте детали категории и повторите попытку."
#: lib/who_need_help_web/live/activity_live/new.ex:130 #: lib/who_need_help_web/live/activity_live/new.ex:151
#: lib/who_need_help_web/live/request_live/new.ex:199 #: lib/who_need_help_web/live/request_live/new.ex:199
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose a valid value for %{field}." msgid "Choose a valid value for %{field}."
@ -6613,7 +6597,7 @@ msgstr "Новая широкая группа помощи или меропр
msgid "A specific option inside an existing category" msgid "A specific option inside an existing category"
msgstr "Конкретный вариант внутри существующей категории" msgstr "Конкретный вариант внутри существующей категории"
#: lib/who_need_help_web/live/activity_live/new.ex:183 #: lib/who_need_help_web/live/activity_live/new.ex:213
#: lib/who_need_help_web/live/request_live/new.ex:311 #: lib/who_need_help_web/live/request_live/new.ex:311
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Can't find the right option? Propose a category" msgid "Can't find the right option? Propose a category"
@ -6650,7 +6634,7 @@ msgstr "Новая основная категория"
msgid "New subcategory" msgid "New subcategory"
msgstr "Новая подкатегория" msgstr "Новая подкатегория"
#: lib/who_need_help_web/live/activity_live/new.ex:177 #: lib/who_need_help_web/live/activity_live/new.ex:207
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No matching activity. You can propose a new one." msgid "No matching activity. You can propose a new one."
msgstr "Подходящее мероприятие не найдено. Вы можете предложить новое." msgstr "Подходящее мероприятие не найдено. Вы можете предложить новое."
@ -6665,7 +6649,7 @@ msgstr "Подходящий тип помощи не найден. Вы мож
msgid "No matching main category" msgid "No matching main category"
msgstr "Подходящая основная категория не найдена" msgstr "Подходящая основная категория не найдена"
#: lib/who_need_help_web/live/activity_live/new.ex:176 #: lib/who_need_help_web/live/activity_live/new.ex:206
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search activity categories" msgid "Search activity categories"
msgstr "Поиск категорий мероприятий" msgstr "Поиск категорий мероприятий"
@ -6736,11 +6720,6 @@ msgstr "Поиск языков"
msgid "Android push notifications are not available yet." msgid "Android push notifications are not available yet."
msgstr "Push-уведомления Android пока недоступны." msgstr "Push-уведомления Android пока недоступны."
#: lib/who_need_help_web/live/activity_live/new.ex:317
#, elixir-autogen, elixir-format
msgid "Location added."
msgstr "Местоположение добавлено."
#: lib/who_need_help_web/components/layouts/root.html.heex:9 #: lib/who_need_help_web/components/layouts/root.html.heex:9
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Map marker" msgid "Map marker"
@ -6800,3 +6779,110 @@ msgstr "Ожидаем разрешения на уведомления и то
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Who Need Help connects adults who need urgent local help with nearby volunteers." msgid "Who Need Help connects adults who need urgent local help with nearby volunteers."
msgstr "Who Need Help связывает взрослых, которым нужна срочная помощь поблизости, с находящимися рядом волонтёрами." msgstr "Who Need Help связывает взрослых, которым нужна срочная помощь поблизости, с находящимися рядом волонтёрами."
#: lib/who_need_help_web/live/activity_live/new.ex:337
#: lib/who_need_help_web/live/activity_live/new.ex:470
#, elixir-autogen, elixir-format
msgid "Choose the public meeting point on the map or use your current location."
msgstr "Выберите публичное место встречи на карте или используйте своё текущее местоположение."
#: lib/who_need_help_web/live/activity_live/new.ex:420
#: lib/who_need_help_web/live/activity_live/new.ex:423
#, elixir-autogen, elixir-format
msgid "Click the map or drag the pin to choose the meeting point"
msgstr "Нажмите на карту или перетащите маркер, чтобы выбрать место встречи"
#: lib/who_need_help_web/live/activity_live/new.ex:349
#, elixir-autogen, elixir-format
msgid "Drag to move the exact meeting point"
msgstr "Перетащите, чтобы переместить точное место встречи"
#: lib/who_need_help_web/live/activity_live/new.ex:348
#, elixir-autogen, elixir-format
msgid "Drag to move the meeting area"
msgstr "Перетащите, чтобы переместить область встречи"
#: lib/who_need_help_web/live/activity_live/new.ex:350
#, elixir-autogen, elixir-format
msgid "Drag to move the private meeting point"
msgstr "Перетащите, чтобы переместить приватное место встречи"
#: lib/who_need_help_web/live/activity_live/new.ex:344
#, elixir-autogen, elixir-format
msgid "Meeting point selected."
msgstr "Место встречи выбрано."
#: lib/who_need_help_web/live/activity_live/new.ex:340
#, elixir-autogen, elixir-format
msgid "Meeting point selected. Before approval, people see only its approximate area."
msgstr "Место встречи выбрано. До одобрения люди видят только примерную область."
#: lib/who_need_help_web/live/activity_live/new.ex:399
#, elixir-autogen, elixir-format
msgid "No public map"
msgstr "Без публичной карты"
#: lib/who_need_help_web/live/activity_live/new.ex:443
#, elixir-autogen, elixir-format
msgid "Only people you approve receive the exact meeting point and group chat."
msgstr "Точное место встречи и групповой чат получат только одобренные вами участники."
#: lib/who_need_help_web/live/activity_live/new.ex:400
#, elixir-autogen, elixir-format
msgid "People can find it by the area description"
msgstr "Активность можно найти по описанию района"
#: lib/who_need_help_web/live/activity_live/new.ex:455
#, elixir-autogen, elixir-format
msgid "People can search by the public area description. Approved participants receive the exact point."
msgstr "Люди могут искать по публичному описанию района. Одобренные участники получат точное место."
#: lib/who_need_help_web/live/activity_live/new.ex:346
#, elixir-autogen, elixir-format
msgid "Private meeting point selected. It appears only after approval."
msgstr "Приватное место встречи выбрано. Оно появится только после одобрения."
#: lib/who_need_help_web/live/activity_live/new.ex:362
#, elixir-autogen, elixir-format
msgid "Public meeting area or landmark"
msgstr "Публичный район или ориентир места встречи"
#: lib/who_need_help_web/live/activity_live/new.ex:386
#, elixir-autogen, elixir-format
msgid "Recommended for discoverability"
msgstr "Рекомендуется, чтобы активность было проще найти"
#: lib/who_need_help_web/live/activity_live/new.ex:352
#, elixir-autogen, elixir-format
msgid "Select a meeting point. It will remain hidden until you approve someone."
msgstr "Выберите место встречи. Оно останется скрытым, пока вы не одобрите участника."
#: lib/who_need_help_web/live/activity_live/new.ex:412
#, elixir-autogen, elixir-format
msgid "The map is unavailable. You can enter coordinates manually."
msgstr "Карта недоступна. Введите координаты вручную."
#: lib/who_need_help_web/live/activity_live/new.ex:441
#, elixir-autogen, elixir-format
msgid "The public map stays approximate"
msgstr "На публичной карте показана только примерная область"
#: lib/who_need_help_web/live/activity_live/new.ex:453
#, elixir-autogen, elixir-format
msgid "The public map stays hidden"
msgstr "Публичная карта остаётся скрытой"
#: lib/who_need_help_web/live/activity_live/new.ex:476
#, elixir-autogen, elixir-format
msgid "These coordinates are the exact meeting point. They are revealed only after approval."
msgstr "Эти координаты задают точное место встречи. Они раскрываются только после одобрения."
#: lib/who_need_help_web/live/activity_live/new.ex:372
#, elixir-autogen, elixir-format
msgid "What should people see before approval?"
msgstr "Что должны видеть люди до одобрения?"
#: lib/who_need_help_web/live/activity_live/new.ex:98
#, elixir-autogen, elixir-format
msgid "Choose the meeting point on the map or use your current location."
msgstr "Выберите место встречи на карте или используйте своё текущее местоположение."

View File

@ -200,7 +200,7 @@ msgstr ""
"узгодьте маршрут і заходи безпеки та ніколи не публікуйте домашні адреси, " "узгодьте маршрут і заходи безпеки та ніколи не публікуйте домашні адреси, "
"коди доступу чи документи для подорожі." "коди доступу чи документи для подорожі."
#: lib/who_need_help_web/live/activity_live/new.ex:200 #: lib/who_need_help_web/live/activity_live/new.ex:230
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity details" msgid "Activity details"
msgstr "Деталі активності" msgstr "Деталі активності"
@ -216,7 +216,7 @@ msgstr "Активність приховано."
msgid "Activity is unavailable." msgid "Activity is unavailable."
msgstr "Активність недоступна." msgstr "Активність недоступна."
#: lib/who_need_help_web/live/activity_live/new.ex:50 #: lib/who_need_help_web/live/activity_live/new.ex:52
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity published. You approve every participant." msgid "Activity published. You approve every participant."
msgstr "Активність опубліковано. Ви схвалюєте кожного учасника." msgstr "Активність опубліковано. Ви схвалюєте кожного учасника."
@ -227,7 +227,7 @@ msgid "Activity restored."
msgstr "Активність відновлено." msgstr "Активність відновлено."
#: lib/who_need_help_web/live/activity_live/index.ex:385 #: lib/who_need_help_web/live/activity_live/index.ex:385
#: lib/who_need_help_web/live/activity_live/new.ex:174 #: lib/who_need_help_web/live/activity_live/new.ex:204
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Activity type" msgid "Activity type"
msgstr "Тип активності" msgstr "Тип активності"
@ -289,17 +289,12 @@ msgid "Approved participants"
msgstr "Схвалені учасники" msgstr "Схвалені учасники"
#: lib/who_need_help_web/controllers/page_html/home.html.heex:80 #: lib/who_need_help_web/controllers/page_html/home.html.heex:80
#: lib/who_need_help_web/live/activity_live/new.ex:305 #: lib/who_need_help_web/live/activity_live/new.ex:385
#: lib/who_need_help_web/live/request_live/new.ex:520 #: lib/who_need_help_web/live/request_live/new.ex:520
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Approximate area" msgid "Approximate area"
msgstr "Орієнтовний район" msgstr "Орієнтовний район"
#: lib/who_need_help_web/live/activity_live/new.ex:297
#, elixir-autogen, elixir-format
msgid "Approximate public meeting area"
msgstr "Орієнтовний публічний район зустрічі"
#: lib/who_need_help_web/live/profile_live.ex:163 #: lib/who_need_help_web/live/profile_live.ex:163
#: lib/who_need_help_web/live/request_live/show.ex:996 #: lib/who_need_help_web/live/request_live/show.ex:996
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -442,7 +437,7 @@ msgid "Choose a category, urgency, and safe location visibility."
msgstr "" msgstr ""
"Оберіть категорію, терміновість і безпечний рівень видимості геопозиції." "Оберіть категорію, терміновість і безпечний рівень видимості геопозиції."
#: lib/who_need_help_web/live/activity_live/new.ex:175 #: lib/who_need_help_web/live/activity_live/new.ex:205
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose activity" msgid "Choose activity"
msgstr "Оберіть активність" msgstr "Оберіть активність"
@ -452,15 +447,15 @@ msgstr "Оберіть активність"
msgid "Choose category" msgid "Choose category"
msgstr "Виберіть категорію" msgstr "Виберіть категорію"
#: lib/who_need_help_web/live/activity_live/new.ex:212 #: lib/who_need_help_web/live/activity_live/new.ex:242
#: lib/who_need_help_web/live/activity_live/new.ex:239 #: lib/who_need_help_web/live/activity_live/new.ex:269
#: lib/who_need_help_web/live/request_live/new.ex:344 #: lib/who_need_help_web/live/request_live/new.ex:344
#: lib/who_need_help_web/live/request_live/new.ex:371 #: lib/who_need_help_web/live/request_live/new.ex:371
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose…" msgid "Choose…"
msgstr "Оберіть…" msgstr "Оберіть…"
#: lib/who_need_help_web/live/activity_live/new.ex:298 #: lib/who_need_help_web/live/activity_live/new.ex:363
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "City centre, near the main entrance" msgid "City centre, near the main entrance"
msgstr "Центр міста, біля головного входу" msgstr "Центр міста, біля головного входу"
@ -476,7 +471,7 @@ msgstr "Очистити"
msgid "Close" msgid "Close"
msgstr "Закрити" msgstr "Закрити"
#: lib/who_need_help_web/live/activity_live/new.ex:269 #: lib/who_need_help_web/live/activity_live/new.ex:299
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Coffee and conversation" msgid "Coffee and conversation"
msgstr "Кава й розмова" msgstr "Кава й розмова"
@ -544,7 +539,7 @@ msgid "Confirm your account and ensure it is active first."
msgstr "" msgstr ""
"Спочатку підтвердьте обліковий запис і переконайтеся, що він активний." "Спочатку підтвердьте обліковий запис і переконайтеся, що він активний."
#: lib/who_need_help_web/live/activity_live/new.ex:135 #: lib/who_need_help_web/live/activity_live/new.ex:156
#: lib/who_need_help_web/live/request_live/new.ex:235 #: lib/who_need_help_web/live/request_live/new.ex:235
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Confirm your email and ensure your account is active before publishing." msgid "Confirm your email and ensure your account is active before publishing."
@ -571,7 +566,7 @@ msgid "Create activity"
msgstr "Створити активність" msgstr "Створити активність"
#: lib/who_need_help_web/live/activity_live/index.ex:535 #: lib/who_need_help_web/live/activity_live/index.ex:535
#: lib/who_need_help_web/live/activity_live/new.ex:150 #: lib/who_need_help_web/live/activity_live/new.ex:180
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Create an activity" msgid "Create an activity"
msgstr "Створити активність" msgstr "Створити активність"
@ -625,7 +620,7 @@ msgstr "Відхилити"
msgid "Default location visibility" msgid "Default location visibility"
msgstr "Типова видимість геопозиції" msgstr "Типова видимість геопозиції"
#: lib/who_need_help_web/live/activity_live/new.ex:276 #: lib/who_need_help_web/live/activity_live/new.ex:306
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Describe the public plan, approximate duration, and who might enjoy it." msgid "Describe the public plan, approximate duration, and who might enjoy it."
msgstr "" msgstr ""
@ -715,11 +710,6 @@ msgstr "Введіть код передачі"
msgid "Exact address after matching" msgid "Exact address after matching"
msgstr "Точна адреса після призначення помічника" msgstr "Точна адреса після призначення помічника"
#: lib/who_need_help_web/live/activity_live/new.ex:324
#, elixir-autogen, elixir-format
msgid "Exact coordinates are shown only to participants you approve."
msgstr "Точні координати показуються лише схваленим вами учасникам."
#: lib/who_need_help_web/live/profile_live.ex:164 #: lib/who_need_help_web/live/profile_live.ex:164
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Exact for active match" msgid "Exact for active match"
@ -864,7 +854,6 @@ msgstr ""
"\n" "\n"
"Якщо ви не запитували цей лист, просто проігноруйте його." "Якщо ви не запитували цей лист, просто проігноруйте його."
#: lib/who_need_help_web/live/activity_live/new.ex:306
#: lib/who_need_help_web/live/profile_live.ex:162 #: lib/who_need_help_web/live/profile_live.ex:162
#: lib/who_need_help_web/live/request_live/show.ex:997 #: lib/who_need_help_web/live/request_live/show.ex:997
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -909,7 +898,7 @@ msgstr ""
"Я підтверджую, що це не екстрена ситуація, безпосередньої небезпеки немає, а" "Я підтверджую, що це не екстрена ситуація, безпосередньої небезпеки немає, а"
" запитувана допомога є законною." " запитувана допомога є законною."
#: lib/who_need_help_web/live/activity_live/new.ex:348 #: lib/who_need_help_web/live/activity_live/new.ex:526
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point." msgid "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point."
msgstr "" msgstr ""
@ -975,13 +964,13 @@ msgstr "Неправильна електронна пошта або парол
msgid "Join requests are closed." msgid "Join requests are closed."
msgstr "Подання заявок на участь закрито." msgstr "Подання заявок на участь закрито."
#: lib/who_need_help_web/live/activity_live/new.ex:286 #: lib/who_need_help_web/live/activity_live/new.ex:316
#: lib/who_need_help_web/live/activity_live/show.ex:387 #: lib/who_need_help_web/live/activity_live/show.ex:387
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Join requests close" msgid "Join requests close"
msgstr "Приймання заявок завершується" msgstr "Приймання заявок завершується"
#: lib/who_need_help_web/live/activity_live/new.ex:332 #: lib/who_need_help_web/live/activity_live/new.ex:482
#: lib/who_need_help_web/live/notification_live.ex:686 #: lib/who_need_help_web/live/notification_live.ex:686
#: lib/who_need_help_web/live/request_live/new.ex:668 #: lib/who_need_help_web/live/request_live/new.ex:668
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1041,7 +1030,7 @@ msgstr "Увійти лише зараз"
msgid "Logged out successfully." msgid "Logged out successfully."
msgstr "Ви успішно вийшли." msgstr "Ви успішно вийшли."
#: lib/who_need_help_web/live/activity_live/new.ex:339 #: lib/who_need_help_web/live/activity_live/new.ex:496
#: lib/who_need_help_web/live/notification_live.ex:700 #: lib/who_need_help_web/live/notification_live.ex:700
#: lib/who_need_help_web/live/request_live/new.ex:682 #: lib/who_need_help_web/live/request_live/new.ex:682
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -1185,7 +1174,7 @@ msgstr "Мережа"
msgid "New password" msgid "New password"
msgstr "Новий пароль" msgstr "Новий пароль"
#: lib/who_need_help_web/live/activity_live/new.ex:244 #: lib/who_need_help_web/live/activity_live/new.ex:274
#: lib/who_need_help_web/live/activity_live/show.ex:300 #: lib/who_need_help_web/live/activity_live/show.ex:300
#: lib/who_need_help_web/live/request_live/new.ex:379 #: lib/who_need_help_web/live/request_live/new.ex:379
#: lib/who_need_help_web/live/request_live/show.ex:877 #: lib/who_need_help_web/live/request_live/show.ex:877
@ -1375,7 +1364,7 @@ msgstr "Інструкції для отримання (необов’язко
msgid "Pickup notes" msgid "Pickup notes"
msgstr "Інструкції з отримання" msgstr "Інструкції з отримання"
#: lib/who_need_help_web/live/activity_live/new.ex:274 #: lib/who_need_help_web/live/activity_live/new.ex:304
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Plan and expectations" msgid "Plan and expectations"
msgstr "План і очікування" msgstr "План і очікування"
@ -1475,11 +1464,6 @@ msgstr ""
" одним учасником іншого; похідні ознаки руху й близькості можуть " " одним учасником іншого; похідні ознаки руху й близькості можуть "
"зберігатися." "зберігатися."
#: lib/who_need_help_web/live/activity_live/new.ex:303
#, elixir-autogen, elixir-format
msgid "Public map visibility"
msgstr "Видимість на публічній мапі"
#: lib/who_need_help_web/live/profile_live.ex:326 #: lib/who_need_help_web/live/profile_live.ex:326
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Public profile URL" msgid "Public profile URL"
@ -1491,14 +1475,14 @@ msgstr "URL публічного профілю"
msgid "Public reputation" msgid "Public reputation"
msgstr "Публічна репутація" msgstr "Публічна репутація"
#: lib/who_need_help_web/live/activity_live/new.ex:152 #: lib/who_need_help_web/live/activity_live/new.ex:182
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publish a clear public plan. Join requests stay pending until you approve them." msgid "Publish a clear public plan. Join requests stay pending until you approve them."
msgstr "" msgstr ""
"Опублікуйте зрозумілий публічний план. Заявки на участь очікуватимуть, доки " "Опублікуйте зрозумілий публічний план. Заявки на участь очікуватимуть, доки "
"ви їх не схвалите." "ви їх не схвалите."
#: lib/who_need_help_web/live/activity_live/new.ex:360 #: lib/who_need_help_web/live/activity_live/new.ex:538
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publish activity" msgid "Publish activity"
msgstr "Опублікувати активність" msgstr "Опублікувати активність"
@ -1513,7 +1497,7 @@ msgstr "Оприлюднити пропозицію"
msgid "Publish request" msgid "Publish request"
msgstr "Опублікувати заявку" msgstr "Опублікувати заявку"
#: lib/who_need_help_web/live/activity_live/new.ex:358 #: lib/who_need_help_web/live/activity_live/new.ex:536
#: lib/who_need_help_web/live/request_live/new.ex:742 #: lib/who_need_help_web/live/request_live/new.ex:742
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Publishing…" msgid "Publishing…"
@ -1807,7 +1791,7 @@ msgstr ""
msgid "Short bio" msgid "Short bio"
msgstr "Коротко про себе" msgstr "Коротко про себе"
#: lib/who_need_help_web/live/activity_live/new.ex:268 #: lib/who_need_help_web/live/activity_live/new.ex:298
#: lib/who_need_help_web/live/request_live/new.ex:411 #: lib/who_need_help_web/live/request_live/new.ex:411
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Short title" msgid "Short title"
@ -2098,7 +2082,7 @@ msgstr "Щоб переглянути надіслані листи, відкр
msgid "Today" msgid "Today"
msgstr "Сьогодні" msgstr "Сьогодні"
#: lib/who_need_help_web/live/activity_live/new.ex:138 #: lib/who_need_help_web/live/activity_live/new.ex:159
#: lib/who_need_help_web/live/activity_live/show.ex:336 #: lib/who_need_help_web/live/activity_live/show.ex:336
#: lib/who_need_help_web/live/category_proposal_live.ex:85 #: lib/who_need_help_web/live/category_proposal_live.ex:85
#: lib/who_need_help_web/live/profile_live.ex:59 #: lib/who_need_help_web/live/profile_live.ex:59
@ -2129,7 +2113,7 @@ msgstr "Забагато листів для входу протягом нал
msgid "Total" msgid "Total"
msgstr "Загалом" msgstr "Загалом"
#: lib/who_need_help_web/live/activity_live/new.ex:293 #: lib/who_need_help_web/live/activity_live/new.ex:323
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Total group capacity" msgid "Total group capacity"
msgstr "Загальний розмір групи" msgstr "Загальний розмір групи"
@ -2177,7 +2161,7 @@ msgstr "Терміновість"
msgid "Urgent help" msgid "Urgent help"
msgstr "Термінова допомога" msgstr "Термінова допомога"
#: lib/who_need_help_web/live/activity_live/new.ex:158 #: lib/who_need_help_web/live/activity_live/new.ex:188
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information." msgid "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information."
msgstr "" msgstr ""
@ -2194,11 +2178,6 @@ msgstr "Увімкнути темну тему"
msgid "Use light theme" msgid "Use light theme"
msgstr "Увімкнути світлу тему" msgstr "Увімкнути світлу тему"
#: lib/who_need_help_web/live/activity_live/new.ex:321
#, elixir-autogen, elixir-format
msgid "Use my current foreground location"
msgstr "Використати мою поточну геопозицію"
#: lib/who_need_help_web/controllers/page_html/home.html.heex:251 #: lib/who_need_help_web/controllers/page_html/home.html.heex:251
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Use private chat and optional live location sharing." msgid "Use private chat and optional live location sharing."
@ -2345,7 +2324,7 @@ msgstr "Відмовитися від цієї заявки"
msgid "Write a safe coordination message…" msgid "Write a safe coordination message…"
msgstr "Напишіть безпечне повідомлення для координації…" msgstr "Напишіть безпечне повідомлення для координації…"
#: lib/who_need_help_web/live/activity_live/new.ex:241 #: lib/who_need_help_web/live/activity_live/new.ex:271
#: lib/who_need_help_web/live/activity_live/show.ex:298 #: lib/who_need_help_web/live/activity_live/show.ex:298
#: lib/who_need_help_web/live/request_live/new.ex:373 #: lib/who_need_help_web/live/request_live/new.ex:373
#: lib/who_need_help_web/live/request_live/show.ex:875 #: lib/who_need_help_web/live/request_live/show.ex:875
@ -2586,7 +2565,7 @@ msgstr "підтверджено"
msgid "← All requests" msgid "← All requests"
msgstr "← Усі заявки" msgstr "← Усі заявки"
#: lib/who_need_help_web/live/activity_live/new.ex:148 #: lib/who_need_help_web/live/activity_live/new.ex:178
#: lib/who_need_help_web/live/activity_live/show.ex:352 #: lib/who_need_help_web/live/activity_live/show.ex:352
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "← Back to activities" msgid "← Back to activities"
@ -2712,7 +2691,7 @@ msgstr "Не вдалося завершити модерацію. Спробу
msgid "Could not complete the action. Please try again." msgid "Could not complete the action. Please try again."
msgstr "Не вдалося завершити дію. Спробуйте ще раз." msgstr "Не вдалося завершити дію. Спробуйте ще раз."
#: lib/who_need_help_web/live/activity_live/new.ex:140 #: lib/who_need_help_web/live/activity_live/new.ex:161
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Could not publish the activity. Please try again." msgid "Could not publish the activity. Please try again."
msgstr "Не вдалося опублікувати активність. Спробуйте ще раз." msgstr "Не вдалося опублікувати активність. Спробуйте ще раз."
@ -4172,6 +4151,7 @@ msgstr "Не вдалося скопіювати"
msgid "Date" msgid "Date"
msgstr "Дата" msgstr "Дата"
#: lib/who_need_help_web/live/activity_live/new.ex:474
#: lib/who_need_help_web/live/notification_live.ex:683 #: lib/who_need_help_web/live/notification_live.ex:683
#: lib/who_need_help_web/live/request_live/new.ex:660 #: lib/who_need_help_web/live/request_live/new.ex:660
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -4259,14 +4239,14 @@ msgstr "За 1 годину"
msgid "In 3 hours" msgid "In 3 hours"
msgstr "За 3 години" msgstr "За 3 години"
#: lib/who_need_help_web/live/activity_live/new.ex:316 #: lib/who_need_help_web/live/activity_live/new.ex:354
#: lib/who_need_help_web/live/notification_live.ex:601 #: lib/who_need_help_web/live/notification_live.ex:601
#: lib/who_need_help_web/live/request_live/new.ex:484 #: lib/who_need_help_web/live/request_live/new.ex:484
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Location is unavailable in this browser." msgid "Location is unavailable in this browser."
msgstr "Геопозиція недоступна в цьому браузері." msgstr "Геопозиція недоступна в цьому браузері."
#: lib/who_need_help_web/live/activity_live/new.ex:318 #: lib/who_need_help_web/live/activity_live/new.ex:356
#: lib/who_need_help_web/live/notification_live.ex:603 #: lib/who_need_help_web/live/notification_live.ex:603
#: lib/who_need_help_web/live/request_live/new.ex:486 #: lib/who_need_help_web/live/request_live/new.ex:486
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -4417,7 +4397,7 @@ msgstr "Запит на вхід оброблено"
msgid "Signing in does not create a new account." msgid "Signing in does not create a new account."
msgstr "Вхід не створює новий обліковий запис." msgstr "Вхід не створює новий обліковий запис."
#: lib/who_need_help_web/live/activity_live/new.ex:282 #: lib/who_need_help_web/live/activity_live/new.ex:312
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Starts at" msgid "Starts at"
msgstr "Початок" msgstr "Початок"
@ -4443,6 +4423,7 @@ msgstr "Сайт обробив ваш запит на реєстрацію."
msgid "This activity is closed. The group chat remains available as read-only history." msgid "This activity is closed. The group chat remains available as read-only history."
msgstr "Цю активність закрито. Історія групового чату доступна лише для читання." msgstr "Цю активність закрито. Історія групового чату доступна лише для читання."
#: lib/who_need_help_web/live/activity_live/new.ex:366
#: lib/who_need_help_web/live/request_live/new.ex:503 #: lib/who_need_help_web/live/request_live/new.ex:503
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "This description is visible to everyone. Do not enter a private address." msgid "This description is visible to everyone. Do not enter a private address."
@ -4519,6 +4500,7 @@ msgstr "Вкажіть безпечне публічне місце зустрі
msgid "Use another email" msgid "Use another email"
msgstr "Використати іншу пошту" msgstr "Використати іншу пошту"
#: lib/who_need_help_web/live/activity_live/new.ex:435
#: lib/who_need_help_web/live/notification_live.ex:636 #: lib/who_need_help_web/live/notification_live.ex:636
#: lib/who_need_help_web/live/request_live/new.ex:595 #: lib/who_need_help_web/live/request_live/new.ex:595
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
@ -4776,6 +4758,8 @@ msgstr "Разом"
#: lib/who_need_help_web/components/layouts/root.html.heex:6 #: lib/who_need_help_web/components/layouts/root.html.heex:6
#: lib/who_need_help_web/controllers/page_html/home.html.heex:160 #: lib/who_need_help_web/controllers/page_html/home.html.heex:160
#: lib/who_need_help_web/live/activity_live/index.ex:496 #: lib/who_need_help_web/live/activity_live/index.ex:496
#: lib/who_need_help_web/live/activity_live/new.ex:355
#: lib/who_need_help_web/live/activity_live/new.ex:414
#: lib/who_need_help_web/live/activity_live/show.ex:545 #: lib/who_need_help_web/live/activity_live/show.ex:545
#: lib/who_need_help_web/live/notification_live.ex:602 #: lib/who_need_help_web/live/notification_live.ex:602
#: lib/who_need_help_web/live/notification_live.ex:621 #: lib/who_need_help_web/live/notification_live.ex:621
@ -4787,7 +4771,7 @@ msgstr "Разом"
msgid "Try map again" msgid "Try map again"
msgstr "Спробувати карту знову" msgstr "Спробувати карту знову"
#: lib/who_need_help_web/live/activity_live/new.ex:124 #: lib/who_need_help_web/live/activity_live/new.ex:145
#: lib/who_need_help_web/live/request_live/new.ex:193 #: lib/who_need_help_web/live/request_live/new.ex:193
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{field} is required." msgid "%{field} is required."
@ -4800,13 +4784,13 @@ msgstr "Поле «%{field}» обов’язкове."
msgid "Both reviews are now visible on participant profiles." msgid "Both reviews are now visible on participant profiles."
msgstr "Обидва відгуки тепер видно в профілях учасників." msgstr "Обидва відгуки тепер видно в профілях учасників."
#: lib/who_need_help_web/live/activity_live/new.ex:127 #: lib/who_need_help_web/live/activity_live/new.ex:148
#: lib/who_need_help_web/live/request_live/new.ex:196 #: lib/who_need_help_web/live/request_live/new.ex:196
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Check the category details and try again." msgid "Check the category details and try again."
msgstr "Перевірте деталі категорії та спробуйте ще раз." msgstr "Перевірте деталі категорії та спробуйте ще раз."
#: lib/who_need_help_web/live/activity_live/new.ex:130 #: lib/who_need_help_web/live/activity_live/new.ex:151
#: lib/who_need_help_web/live/request_live/new.ex:199 #: lib/who_need_help_web/live/request_live/new.ex:199
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Choose a valid value for %{field}." msgid "Choose a valid value for %{field}."
@ -6607,7 +6591,7 @@ msgstr "Нова широка група допомоги або заходів"
msgid "A specific option inside an existing category" msgid "A specific option inside an existing category"
msgstr "Конкретний варіант усередині наявної категорії" msgstr "Конкретний варіант усередині наявної категорії"
#: lib/who_need_help_web/live/activity_live/new.ex:183 #: lib/who_need_help_web/live/activity_live/new.ex:213
#: lib/who_need_help_web/live/request_live/new.ex:311 #: lib/who_need_help_web/live/request_live/new.ex:311
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Can't find the right option? Propose a category" msgid "Can't find the right option? Propose a category"
@ -6644,7 +6628,7 @@ msgstr "Нова основна категорія"
msgid "New subcategory" msgid "New subcategory"
msgstr "Нова підкатегорія" msgstr "Нова підкатегорія"
#: lib/who_need_help_web/live/activity_live/new.ex:177 #: lib/who_need_help_web/live/activity_live/new.ex:207
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "No matching activity. You can propose a new one." msgid "No matching activity. You can propose a new one."
msgstr "Відповідний захід не знайдено. Ви можете запропонувати новий." msgstr "Відповідний захід не знайдено. Ви можете запропонувати новий."
@ -6659,7 +6643,7 @@ msgstr "Відповідний тип допомоги не знайдено. В
msgid "No matching main category" msgid "No matching main category"
msgstr "Відповідну основну категорію не знайдено" msgstr "Відповідну основну категорію не знайдено"
#: lib/who_need_help_web/live/activity_live/new.ex:176 #: lib/who_need_help_web/live/activity_live/new.ex:206
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search activity categories" msgid "Search activity categories"
msgstr "Пошук категорій заходів" msgstr "Пошук категорій заходів"
@ -6730,11 +6714,6 @@ msgstr "Пошук мов"
msgid "Android push notifications are not available yet." msgid "Android push notifications are not available yet."
msgstr "Push-сповіщення Android поки недоступні." msgstr "Push-сповіщення Android поки недоступні."
#: lib/who_need_help_web/live/activity_live/new.ex:317
#, elixir-autogen, elixir-format
msgid "Location added."
msgstr "Місцезнаходження додано."
#: lib/who_need_help_web/components/layouts/root.html.heex:9 #: lib/who_need_help_web/components/layouts/root.html.heex:9
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Map marker" msgid "Map marker"
@ -6794,3 +6773,110 @@ msgstr "Очікуємо на дозвіл для сповіщень і токе
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Who Need Help connects adults who need urgent local help with nearby volunteers." msgid "Who Need Help connects adults who need urgent local help with nearby volunteers."
msgstr "Who Need Help з’єднує дорослих, яким потрібна термінова допомога поруч, із місцевими волонтерами." msgstr "Who Need Help з’єднує дорослих, яким потрібна термінова допомога поруч, із місцевими волонтерами."
#: lib/who_need_help_web/live/activity_live/new.ex:337
#: lib/who_need_help_web/live/activity_live/new.ex:470
#, elixir-autogen, elixir-format
msgid "Choose the public meeting point on the map or use your current location."
msgstr "Оберіть публічне місце зустрічі на карті або скористайтеся своїм поточним місцезнаходженням."
#: lib/who_need_help_web/live/activity_live/new.ex:420
#: lib/who_need_help_web/live/activity_live/new.ex:423
#, elixir-autogen, elixir-format
msgid "Click the map or drag the pin to choose the meeting point"
msgstr "Натисніть на карту або перетягніть маркер, щоб обрати місце зустрічі"
#: lib/who_need_help_web/live/activity_live/new.ex:349
#, elixir-autogen, elixir-format
msgid "Drag to move the exact meeting point"
msgstr "Перетягніть, щоб перемістити точне місце зустрічі"
#: lib/who_need_help_web/live/activity_live/new.ex:348
#, elixir-autogen, elixir-format
msgid "Drag to move the meeting area"
msgstr "Перетягніть, щоб перемістити область зустрічі"
#: lib/who_need_help_web/live/activity_live/new.ex:350
#, elixir-autogen, elixir-format
msgid "Drag to move the private meeting point"
msgstr "Перетягніть, щоб перемістити приватне місце зустрічі"
#: lib/who_need_help_web/live/activity_live/new.ex:344
#, elixir-autogen, elixir-format
msgid "Meeting point selected."
msgstr "Місце зустрічі вибрано."
#: lib/who_need_help_web/live/activity_live/new.ex:340
#, elixir-autogen, elixir-format
msgid "Meeting point selected. Before approval, people see only its approximate area."
msgstr "Місце зустрічі вибрано. До схвалення люди бачать лише приблизну область."
#: lib/who_need_help_web/live/activity_live/new.ex:399
#, elixir-autogen, elixir-format
msgid "No public map"
msgstr "Без публічної карти"
#: lib/who_need_help_web/live/activity_live/new.ex:443
#, elixir-autogen, elixir-format
msgid "Only people you approve receive the exact meeting point and group chat."
msgstr "Точне місце зустрічі та груповий чат отримають лише схвалені вами учасники."
#: lib/who_need_help_web/live/activity_live/new.ex:400
#, elixir-autogen, elixir-format
msgid "People can find it by the area description"
msgstr "Активність можна знайти за описом району"
#: lib/who_need_help_web/live/activity_live/new.ex:455
#, elixir-autogen, elixir-format
msgid "People can search by the public area description. Approved participants receive the exact point."
msgstr "Люди можуть шукати за публічним описом району. Схвалені учасники отримають точне місце."
#: lib/who_need_help_web/live/activity_live/new.ex:346
#, elixir-autogen, elixir-format
msgid "Private meeting point selected. It appears only after approval."
msgstr "Приватне місце зустрічі вибрано. Воно з’явиться лише після схвалення."
#: lib/who_need_help_web/live/activity_live/new.ex:362
#, elixir-autogen, elixir-format
msgid "Public meeting area or landmark"
msgstr "Публічний район або орієнтир місця зустрічі"
#: lib/who_need_help_web/live/activity_live/new.ex:386
#, elixir-autogen, elixir-format
msgid "Recommended for discoverability"
msgstr "Рекомендовано, щоб активність було легше знайти"
#: lib/who_need_help_web/live/activity_live/new.ex:352
#, elixir-autogen, elixir-format
msgid "Select a meeting point. It will remain hidden until you approve someone."
msgstr "Оберіть місце зустрічі. Воно залишатиметься прихованим, доки ви не схвалите учасника."
#: lib/who_need_help_web/live/activity_live/new.ex:412
#, elixir-autogen, elixir-format
msgid "The map is unavailable. You can enter coordinates manually."
msgstr "Карта недоступна. Введіть координати вручну."
#: lib/who_need_help_web/live/activity_live/new.ex:441
#, elixir-autogen, elixir-format
msgid "The public map stays approximate"
msgstr "На публічній карті показано лише приблизну область"
#: lib/who_need_help_web/live/activity_live/new.ex:453
#, elixir-autogen, elixir-format
msgid "The public map stays hidden"
msgstr "Публічна карта залишається прихованою"
#: lib/who_need_help_web/live/activity_live/new.ex:476
#, elixir-autogen, elixir-format
msgid "These coordinates are the exact meeting point. They are revealed only after approval."
msgstr "Ці координати задають точне місце зустрічі. Їх буде розкрито лише після схвалення."
#: lib/who_need_help_web/live/activity_live/new.ex:372
#, elixir-autogen, elixir-format
msgid "What should people see before approval?"
msgstr "Що мають бачити люди до схвалення?"
#: lib/who_need_help_web/live/activity_live/new.ex:98
#, elixir-autogen, elixir-format
msgid "Choose the meeting point on the map or use your current location."
msgstr "Оберіть місце зустрічі на карті або скористайтеся своїм поточним місцезнаходженням."

View File

@ -383,6 +383,42 @@ defmodule WhoNeedHelp.ActivitiesTest do
refute far_away.id in ids refute far_away.id in ids
end end
test "activity discovery filters by the published approximate point, not the exact point",
context do
{:ok, activity} =
Activities.create_activity(
context.organizer_scope,
context.attrs
|> Map.put("title", "Privacy-safe viewport activity")
|> Map.put("latitude", "50.4501")
|> Map.put("longitude", "30.5234")
)
exact_only_viewport = viewport!(30.523, 50.449, 30.524, 50.451, 16)
exact_only_entries =
context.outsider_scope
|> Activities.paginate_open_activities(%{},
viewport: exact_only_viewport,
limit: 100
)
|> Map.fetch!(:entries)
refute Enum.any?(exact_only_entries, &(&1.id == activity.id))
published_point_viewport = viewport!(30.519, 50.449, 30.521, 50.451, 16)
published_entries =
context.outsider_scope
|> Activities.paginate_open_activities(%{},
viewport: published_point_viewport,
limit: 100
)
|> Map.fetch!(:entries)
assert Enum.any?(published_entries, &(&1.id == activity.id))
end
test "activity map discovery clusters dense points and keeps sparse points", context do test "activity map discovery clusters dense points and keeps sparse points", context do
for {offset, index} <- Enum.with_index([0.0, 0.00005, 0.0001], 1) do for {offset, index} <- Enum.with_index([0.0, 0.00005, 0.0001], 1) do
assert {:ok, _activity} = assert {:ok, _activity} =

View File

@ -314,6 +314,101 @@ defmodule WhoNeedHelpWeb.MutualAidLiveTest do
live(conn, "/activities/not-a-uuid") live(conn, "/activities/not-a-uuid")
end end
test "activity creation uses the privacy-aware map picker", %{conn: conn} do
Catalog.seed_defaults()
{:ok, view, _html} = live(conn, ~p"/activities/new")
assert has_element?(
view,
"#activity-location-workspace[phx-hook='RequestLocationPicker'][data-preserve-hidden-coordinates='true']"
)
assert has_element?(view, "#activity-location-map[phx-update='ignore']")
assert has_element?(
view,
"input[name='activity[location_visibility]'][value='approximate_public'][checked]"
)
assert has_element?(
view,
"input[name='activity[location_visibility]'][value='hidden']"
)
assert has_element?(view, "#activity-latitude[data-coordinate-input]")
assert has_element?(view, "#activity-longitude[data-coordinate-input]")
assert has_element?(view, "#activity-location-manual[phx-update='ignore']")
refute has_element?(view, "#activity-location-picker[phx-hook='LocationPicker']")
html =
render_change(view, "validate", %{
"activity" => %{
"location_visibility" => "hidden",
"latitude" => "",
"longitude" => ""
}
})
refute html =~ "Choose the meeting point on the map or use your current location."
html =
render_submit(view, "save", %{
"activity" => %{
"location_visibility" => "hidden",
"latitude" => "",
"longitude" => ""
}
})
assert html =~ "Choose the meeting point on the map or use your current location."
end
test "activity with hidden public location omits the map until approval", %{
scope: organizer_scope
} do
Catalog.seed_defaults()
participant = user_fixture(display_name: "Hidden-map participant")
cinema =
Catalog.list_categories(:activity)
|> Enum.find(&(&1.slug == "cinema-meetup"))
attrs =
activity_attrs(cinema)
|> Map.put("location_visibility", "hidden")
|> Map.put("structured_data", %{"film_or_genre" => "Public screening"})
{:ok, activity} = Activities.create_activity(organizer_scope, attrs)
{:ok, participant_view, html} =
build_conn()
|> log_in_user(participant)
|> live(~p"/activities/#{activity.id}")
assert html =~ "The public map stays hidden"
assert has_element?(participant_view, "#activity-detail-map-hidden")
refute has_element?(participant_view, "#activity-detail-map")
participant_view
|> element("button[phx-click='join']")
|> render_click()
organizer = organizer_scope.user
{:ok, organizer_view, _html} =
build_conn()
|> log_in_user(organizer)
|> live(~p"/activities/#{activity.id}")
organizer_view
|> element("button[phx-click='approve']")
|> render_click()
assert has_element?(participant_view, "#activity-detail-map")
refute has_element?(participant_view, "#activity-detail-map-hidden")
end
test "request index applies PubSub updates without a full page reload" do test "request index applies PubSub updates without a full page reload" do
category = Catalog.seed_defaults() category = Catalog.seed_defaults()
requester = user_fixture(display_name: "Realtime requester") requester = user_fixture(display_name: "Realtime requester")
@ -664,8 +759,9 @@ defmodule WhoNeedHelpWeb.MutualAidLiveTest do
{:ok, view, html} = live(conn, ~p"/activities/new") {:ok, view, html} = live(conn, ~p"/activities/new")
assert html =~ "Social activity — Hiking" assert html =~ "Social activity — Hiking"
refute html =~ "Medicine pickup status" refute html =~ "Medicine pickup status"
assert html =~ ~s(data-added-label="Location added.") assert html =~ ~s(phx-hook="RequestLocationPicker")
assert html =~ ~s(data-permission-denied-label="Location permission was denied.") assert html =~ ~s(data-preserve-hidden-coordinates="true")
assert html =~ ~s(data-location-denied-label="Location permission was denied.")
html = html =
render_change(view, "validate", %{ render_change(view, "validate", %{