Improve activity location privacy and lifecycle UX
This commit is contained in:
parent
a0e45707a3
commit
cbb13d6888
|
|
@ -1181,11 +1181,43 @@ html {
|
|||
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) {
|
||||
.request-location-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.activity-location-workspace[data-location-mode="hidden"] .request-location-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.request-location-map {
|
||||
min-height: 26rem;
|
||||
}
|
||||
|
|
@ -1239,6 +1271,10 @@ html {
|
|||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.activity-location-workspace .request-location-modes {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.request-location-mode {
|
||||
min-height: 3.75rem;
|
||||
justify-content: flex-start;
|
||||
|
|
|
|||
|
|
@ -1784,6 +1784,7 @@ export const Hooks = {
|
|||
this.markerMode = null
|
||||
this.mapLoaded = false
|
||||
this.mapUnavailable = false
|
||||
this.preserveHiddenCoordinates = this.el.dataset.preserveHiddenCoordinates === "true"
|
||||
this.areaSourceId = `${this.el.id}-selection-area`
|
||||
this.areaFillId = `${this.el.id}-selection-fill`
|
||||
this.areaLineId = `${this.el.id}-selection-line`
|
||||
|
|
@ -1874,11 +1875,14 @@ export const Hooks = {
|
|||
return
|
||||
}
|
||||
|
||||
this.setStatus(
|
||||
this.mode() === "approximate_public"
|
||||
const mode = this.mode()
|
||||
const message = mode === "hidden" && this.preserveHiddenCoordinates
|
||||
? this.el.dataset.privateSelectedLabel
|
||||
: mode === "approximate_public"
|
||||
? this.el.dataset.areaSelectedLabel
|
||||
: this.el.dataset.pointSelectedLabel
|
||||
)
|
||||
|
||||
this.setStatus(message)
|
||||
}
|
||||
|
||||
this.focusSelection = () => {
|
||||
|
|
@ -1887,7 +1891,7 @@ export const Hooks = {
|
|||
|
||||
this.map.flyTo({
|
||||
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()
|
||||
|
||||
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()
|
||||
|
|
@ -1956,7 +1963,11 @@ export const Hooks = {
|
|||
if (!this.marker) {
|
||||
this.markerMode = mode
|
||||
this.marker = new maplibregl.Marker({
|
||||
color: mode === "approximate_public" ? "#16725b" : "#d6573b",
|
||||
color: mode === "approximate_public"
|
||||
? "#16725b"
|
||||
: mode === "exact_private"
|
||||
? "#6152a3"
|
||||
: "#d6573b",
|
||||
draggable: true
|
||||
})
|
||||
.setLngLat([coordinates.longitude, coordinates.latitude])
|
||||
|
|
@ -1967,12 +1978,16 @@ export const Hooks = {
|
|||
"aria-label",
|
||||
mode === "approximate_public"
|
||||
? this.el.dataset.areaMarkerLabel
|
||||
: mode === "exact_private"
|
||||
? this.el.dataset.privateMarkerLabel
|
||||
: this.el.dataset.pointMarkerLabel
|
||||
)
|
||||
markerElement.setAttribute(
|
||||
"title",
|
||||
mode === "approximate_public"
|
||||
? this.el.dataset.areaMarkerLabel
|
||||
: mode === "exact_private"
|
||||
? this.el.dataset.privateMarkerLabel
|
||||
: this.el.dataset.pointMarkerLabel
|
||||
)
|
||||
|
||||
|
|
@ -2009,7 +2024,7 @@ export const Hooks = {
|
|||
|
||||
if (!this.mapLoaded) return
|
||||
|
||||
if (mode === "hidden") {
|
||||
if (mode === "hidden" && !this.preserveHiddenCoordinates) {
|
||||
this.removeMarker()
|
||||
this.setAreaData(emptyFeatureCollection())
|
||||
return
|
||||
|
|
@ -2032,14 +2047,17 @@ export const Hooks = {
|
|||
}
|
||||
|
||||
this.setAreaData(emptyFeatureCollection())
|
||||
this.ensureSelectionMarker(coordinates, mode)
|
||||
this.ensureSelectionMarker(
|
||||
coordinates,
|
||||
mode === "hidden" ? "exact_private" : mode
|
||||
)
|
||||
}
|
||||
|
||||
this.syncMode = () => {
|
||||
const mode = this.mode()
|
||||
this.el.dataset.locationMode = mode
|
||||
|
||||
if (mode === "hidden") {
|
||||
if (mode === "hidden" && !this.preserveHiddenCoordinates) {
|
||||
this.clearCoordinates()
|
||||
this.setStatus(this.el.dataset.hiddenLabel)
|
||||
} else {
|
||||
|
|
@ -2093,11 +2111,7 @@ export const Hooks = {
|
|||
: raw
|
||||
|
||||
this.setCoordinates(selected, {center: true})
|
||||
this.setStatus(
|
||||
this.mode() === "approximate_public"
|
||||
? this.el.dataset.areaSelectedLabel
|
||||
: this.el.dataset.pointSelectedLabel
|
||||
)
|
||||
this.setSelectionStatus()
|
||||
button.disabled = false
|
||||
},
|
||||
() => {
|
||||
|
|
@ -2169,17 +2183,13 @@ export const Hooks = {
|
|||
})
|
||||
|
||||
this.map.on("click", event => {
|
||||
if (this.mode() === "hidden") return
|
||||
if (this.mode() === "hidden" && !this.preserveHiddenCoordinates) return
|
||||
|
||||
this.setCoordinates(
|
||||
{latitude: event.lngLat.lat, longitude: event.lngLat.lng},
|
||||
{center: true}
|
||||
)
|
||||
this.setStatus(
|
||||
this.mode() === "approximate_public"
|
||||
? this.el.dataset.areaSelectedLabel
|
||||
: this.el.dataset.pointSelectedLabel
|
||||
)
|
||||
this.setSelectionStatus()
|
||||
})
|
||||
|
||||
this.syncMode()
|
||||
|
|
|
|||
|
|
@ -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 organizer.page.getByLabel("Total group capacity").fill("3");
|
||||
await organizer.page
|
||||
.getByLabel("Approximate public meeting area")
|
||||
.getByLabel("Public meeting area or landmark")
|
||||
.fill("E2E central public café");
|
||||
await organizer.page.getByLabel("Public map visibility").selectOption("approximate_public");
|
||||
await organizer.page.getByLabel("Latitude").fill("50.4501");
|
||||
await organizer.page.getByLabel("Longitude").fill("30.5234");
|
||||
await organizer.page
|
||||
.getByRole("radio", { name: /Approximate area/ })
|
||||
.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.getByRole("button", { name: "Publish activity" }).click();
|
||||
await expect(organizer.page).toHaveURL(/\/activities\/[0-9a-f-]+$/);
|
||||
|
|
|
|||
|
|
@ -152,7 +152,16 @@ defmodule Mix.Tasks.Wnh.StagingFullE2e do
|
|||
|
||||
message_ids = ids(Message, :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)
|
||||
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
|
||||
unexpected? =
|
||||
Repo.exists?(
|
||||
from assignment in Assignment,
|
||||
from(assignment in Assignment,
|
||||
where:
|
||||
assignment.id in ^assignment_ids and
|
||||
(assignment.request_id not in ^request_ids or assignment.helper_id not in ^user_ids)
|
||||
)
|
||||
)
|
||||
|
||||
if unexpected?,
|
||||
|
|
@ -324,14 +334,16 @@ defmodule Mix.Tasks.Wnh.StagingFullE2e do
|
|||
defp validate_activity_membership!(activity_ids, user_ids) do
|
||||
unexpected_participant? =
|
||||
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
|
||||
)
|
||||
)
|
||||
|
||||
unexpected_message? =
|
||||
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
|
||||
)
|
||||
)
|
||||
|
||||
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
|
||||
unexpected? =
|
||||
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
|
||||
)
|
||||
)
|
||||
|
||||
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
|
||||
unexpected_report? =
|
||||
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
|
||||
)
|
||||
)
|
||||
|
||||
unexpected_proposal? =
|
||||
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
|
||||
)
|
||||
)
|
||||
|
||||
unexpected_signal? =
|
||||
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
|
||||
)
|
||||
)
|
||||
|
||||
if unexpected_report? or unexpected_proposal? or unexpected_signal? do
|
||||
|
|
@ -380,18 +396,20 @@ defmodule Mix.Tasks.Wnh.StagingFullE2e do
|
|||
) do
|
||||
unexpected_support_request? =
|
||||
Repo.exists?(
|
||||
from request in SupportRequest,
|
||||
from(request in SupportRequest,
|
||||
where:
|
||||
request.reviewed_by_id in ^user_ids and
|
||||
request.id not in ^support_request_ids
|
||||
)
|
||||
)
|
||||
|
||||
unexpected_content_removal_notice? =
|
||||
Repo.exists?(
|
||||
from notice in Notice,
|
||||
from(notice in Notice,
|
||||
where:
|
||||
notice.reviewed_by_id in ^user_ids and
|
||||
notice.id not in ^content_removal_notice_ids
|
||||
)
|
||||
)
|
||||
|
||||
if unexpected_support_request? or unexpected_content_removal_notice? do
|
||||
|
|
@ -445,7 +463,7 @@ defmodule Mix.Tasks.Wnh.StagingFullE2e do
|
|||
end
|
||||
|
||||
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)}")
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -824,7 +824,19 @@ defmodule WhoNeedHelp.Activities do
|
|||
[activity],
|
||||
^condition or
|
||||
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,
|
||||
^west,
|
||||
^south,
|
||||
|
|
@ -894,7 +906,7 @@ defmodule WhoNeedHelp.Activities do
|
|||
do: is_binary(area) and String.trim(area) != ""
|
||||
|
||||
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
|
||||
longitude_in_viewport?(longitude, viewport)
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ defmodule WhoNeedHelp.TrackingPresenceCleanup do
|
|||
":tracking_presence_cleanup_grace_ms must be a non-negative integer"
|
||||
end
|
||||
|
||||
{:ok, %{grace_ms: grace_ms}}
|
||||
{:ok, %{grace_ms: grace_ms, pending: %{}}}
|
||||
end
|
||||
|
||||
@impl GenServer
|
||||
|
|
@ -36,24 +36,41 @@ defmodule WhoNeedHelp.TrackingPresenceCleanup do
|
|||
{:maybe_stop, key, assignment_id, user_id, tracking_session_id},
|
||||
state
|
||||
) do
|
||||
Process.send_after(
|
||||
self(),
|
||||
{:maybe_stop_after_grace, key, assignment_id, user_id, tracking_session_id},
|
||||
state.grace_ms
|
||||
)
|
||||
cleanup_key = {key, assignment_id, user_id, tracking_session_id}
|
||||
|
||||
{: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
|
||||
|
||||
@impl GenServer
|
||||
def handle_info(
|
||||
{:maybe_stop_after_grace, key, assignment_id, user_id, tracking_session_id},
|
||||
state
|
||||
) do
|
||||
if Presence.get_by_key(Presence.tracking_topic(), key) == [] do
|
||||
Tracking.stop_browser_session(assignment_id, user_id, tracking_session_id)
|
||||
end
|
||||
def handle_info({:maybe_stop_after_grace, cleanup_key, token}, state) do
|
||||
case Map.get(state.pending, cleanup_key) do
|
||||
%{token: ^token} ->
|
||||
{key, assignment_id, user_id, tracking_session_id} = cleanup_key
|
||||
|
||||
{: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
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ defmodule WhoNeedHelpWeb.ActivityLive.New do
|
|||
|> assign(:structured_fields, [])
|
||||
|> assign(:structured_touched_keys, [])
|
||||
|> assign(:structured_submit_attempted, false)
|
||||
|> assign(:submission_errors, [])
|
||||
|> assign(:form, to_form(Activities.change_activity(%Activity{})))}
|
||||
end
|
||||
|
||||
|
|
@ -37,6 +38,7 @@ defmodule WhoNeedHelpWeb.ActivityLive.New do
|
|||
socket
|
||||
|> assign(:form, to_form(changeset))
|
||||
|> assign(:structured_touched_keys, touched_keys)
|
||||
|> maybe_refresh_submission_errors(changeset)
|
||||
|> assign_category(params)}
|
||||
end
|
||||
|
||||
|
|
@ -55,6 +57,7 @@ defmodule WhoNeedHelpWeb.ActivityLive.New do
|
|||
socket
|
||||
|> assign(:form, to_form(changeset))
|
||||
|> assign(:structured_submit_attempted, true)
|
||||
|> assign(:submission_errors, submission_errors(changeset))
|
||||
|> assign_category(params)}
|
||||
|
||||
{:error, reason} ->
|
||||
|
|
@ -82,6 +85,24 @@ defmodule WhoNeedHelpWeb.ActivityLive.New do
|
|||
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
|
||||
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 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
|
||||
def render(assigns) do
|
||||
~H"""
|
||||
|
|
@ -292,54 +322,206 @@ defmodule WhoNeedHelpWeb.ActivityLive.New do
|
|||
min="2"
|
||||
label={gettext("Total group capacity")}
|
||||
/>
|
||||
<.input
|
||||
field={@form[:location_label]}
|
||||
label={gettext("Approximate public meeting area")}
|
||||
placeholder={gettext("City centre, near the main entrance")}
|
||||
/>
|
||||
<.input
|
||||
field={@form[:location_visibility]}
|
||||
type="select"
|
||||
label={gettext("Public map visibility")}
|
||||
options={[
|
||||
{gettext("Approximate area"), "approximate_public"},
|
||||
{gettext("Hidden"), "hidden"}
|
||||
]}
|
||||
/>
|
||||
<div class="rounded-2xl bg-base-200 p-5">
|
||||
<button
|
||||
type="button"
|
||||
phx-hook="LocationPicker"
|
||||
id="activity-location-picker"
|
||||
data-latitude-target="#activity-latitude"
|
||||
data-longitude-target="#activity-longitude"
|
||||
data-unavailable-label={gettext("Location is unavailable in this browser.")}
|
||||
data-added-label={gettext("Location added.")}
|
||||
data-permission-denied-label={gettext("Location permission was denied.")}
|
||||
class="btn btn-outline btn-sm"
|
||||
>
|
||||
{gettext("Use my current foreground location")}
|
||||
</button>
|
||||
<p class="mt-2 text-xs text-base-content/60">
|
||||
{gettext("Exact coordinates are shown only to participants you approve.")}
|
||||
</p>
|
||||
<div class="mt-3 grid grid-cols-2 gap-3">
|
||||
<section
|
||||
id="activity-location-workspace"
|
||||
phx-hook="RequestLocationPicker"
|
||||
data-location-mode={location_mode(@form)}
|
||||
data-preserve-hidden-coordinates="true"
|
||||
data-private-center="true"
|
||||
data-allowed-radii="1000"
|
||||
data-map-target="#activity-location-map"
|
||||
data-latitude-target="#activity-latitude"
|
||||
data-longitude-target="#activity-longitude"
|
||||
data-status-target="#activity-location-status"
|
||||
data-map-ready-label={
|
||||
gettext("Choose the public meeting point on the map or use your current location.")
|
||||
}
|
||||
data-area-selected-label={
|
||||
gettext(
|
||||
"Meeting point selected. Before approval, people see only its approximate area."
|
||||
)
|
||||
}
|
||||
data-point-selected-label={gettext("Meeting point selected.")}
|
||||
data-private-selected-label={
|
||||
gettext("Private meeting point selected. It appears only after approval.")
|
||||
}
|
||||
data-area-marker-label={gettext("Drag to move the meeting area")}
|
||||
data-point-marker-label={gettext("Drag to move the exact meeting point")}
|
||||
data-private-marker-label={gettext("Drag to move the private meeting point")}
|
||||
data-hidden-label={
|
||||
gettext("Select a meeting point. It will remain hidden until you approve someone.")
|
||||
}
|
||||
data-location-unavailable-label={gettext("Location is unavailable in this browser.")}
|
||||
data-map-retry-label={gettext("Try map again")}
|
||||
data-location-denied-label={gettext("Location permission was denied.")}
|
||||
class="request-location-workspace activity-location-workspace"
|
||||
>
|
||||
<div>
|
||||
<.input
|
||||
field={@form[:latitude]}
|
||||
id="activity-latitude"
|
||||
type="number"
|
||||
step="any"
|
||||
label={gettext("Latitude")}
|
||||
/>
|
||||
<.input
|
||||
field={@form[:longitude]}
|
||||
id="activity-longitude"
|
||||
type="number"
|
||||
step="any"
|
||||
label={gettext("Longitude")}
|
||||
field={@form[:location_label]}
|
||||
label={gettext("Public meeting area or landmark")}
|
||||
placeholder={gettext("City centre, near the main entrance")}
|
||||
/>
|
||||
<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>
|
||||
|
||||
<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">
|
||||
<.input
|
||||
field={@form[:safety_confirmed]}
|
||||
|
|
|
|||
|
|
@ -535,6 +535,7 @@ defmodule WhoNeedHelpWeb.ActivityLive.Show do
|
|||
|
||||
<aside class="space-y-5">
|
||||
<div
|
||||
:if={@coordinates}
|
||||
id="activity-detail-map"
|
||||
phx-hook="AidMap"
|
||||
phx-update="ignore"
|
||||
|
|
@ -546,7 +547,24 @@ defmodule WhoNeedHelpWeb.ActivityLive.Show do
|
|||
data-map-recenter-label={gettext("Show location on 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>
|
||||
<p class="mt-2 text-base-content/65">
|
||||
<%= if @approved? do %>
|
||||
|
|
|
|||
|
|
@ -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."
|
||||
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
|
||||
msgid "Activity details"
|
||||
msgstr ""
|
||||
|
|
@ -205,7 +205,7 @@ msgstr ""
|
|||
msgid "Activity is unavailable."
|
||||
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
|
||||
msgid "Activity published. You approve every participant."
|
||||
msgstr ""
|
||||
|
|
@ -216,7 +216,7 @@ msgid "Activity restored."
|
|||
msgstr ""
|
||||
|
||||
#: 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
|
||||
msgid "Activity type"
|
||||
msgstr ""
|
||||
|
|
@ -278,17 +278,12 @@ msgid "Approved participants"
|
|||
msgstr ""
|
||||
|
||||
#: 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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Approximate area"
|
||||
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/request_live/show.ex:996
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -425,7 +420,7 @@ msgstr ""
|
|||
msgid "Choose a category, urgency, and safe location visibility."
|
||||
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
|
||||
msgid "Choose activity"
|
||||
msgstr ""
|
||||
|
|
@ -435,15 +430,15 @@ msgstr ""
|
|||
msgid "Choose category"
|
||||
msgstr ""
|
||||
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:212
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:239
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:242
|
||||
#: 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:371
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Choose…"
|
||||
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
|
||||
msgid "City centre, near the main entrance"
|
||||
msgstr ""
|
||||
|
|
@ -459,7 +454,7 @@ msgstr ""
|
|||
msgid "Close"
|
||||
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
|
||||
msgid "Coffee and conversation"
|
||||
msgstr ""
|
||||
|
|
@ -524,7 +519,7 @@ msgstr ""
|
|||
msgid "Confirm your account and ensure it is active first."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Confirm your email and ensure your account is active before publishing."
|
||||
|
|
@ -549,7 +544,7 @@ msgid "Create activity"
|
|||
msgstr ""
|
||||
|
||||
#: 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
|
||||
msgid "Create an activity"
|
||||
msgstr ""
|
||||
|
|
@ -601,7 +596,7 @@ msgstr ""
|
|||
msgid "Default location visibility"
|
||||
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
|
||||
msgid "Describe the public plan, approximate duration, and who might enjoy it."
|
||||
msgstr ""
|
||||
|
|
@ -683,11 +678,6 @@ msgstr ""
|
|||
msgid "Exact address after matching"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
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."
|
||||
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/request_live/show.ex:997
|
||||
#, 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."
|
||||
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
|
||||
msgid "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point."
|
||||
msgstr ""
|
||||
|
|
@ -904,13 +893,13 @@ msgstr ""
|
|||
msgid "Join requests are closed."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Join requests close"
|
||||
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/request_live/new.ex:668
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -968,7 +957,7 @@ msgstr ""
|
|||
msgid "Logged out successfully."
|
||||
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/request_live/new.ex:682
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -1103,7 +1092,7 @@ msgstr ""
|
|||
msgid "New password"
|
||||
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/request_live/new.ex:379
|
||||
#: lib/who_need_help_web/live/request_live/show.ex:877
|
||||
|
|
@ -1289,7 +1278,7 @@ msgstr ""
|
|||
msgid "Pickup notes"
|
||||
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
|
||||
msgid "Plan and expectations"
|
||||
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."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Public profile URL"
|
||||
|
|
@ -1394,12 +1378,12 @@ msgstr ""
|
|||
msgid "Public reputation"
|
||||
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
|
||||
msgid "Publish a clear public plan. Join requests stay pending until you approve them."
|
||||
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
|
||||
msgid "Publish activity"
|
||||
msgstr ""
|
||||
|
|
@ -1414,7 +1398,7 @@ msgstr ""
|
|||
msgid "Publish request"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Publishing…"
|
||||
|
|
@ -1697,7 +1681,7 @@ msgstr ""
|
|||
msgid "Short bio"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Short title"
|
||||
|
|
@ -1978,7 +1962,7 @@ msgstr ""
|
|||
msgid "Today"
|
||||
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/category_proposal_live.ex:85
|
||||
#: lib/who_need_help_web/live/profile_live.ex:59
|
||||
|
|
@ -2009,7 +1993,7 @@ msgstr ""
|
|||
msgid "Total"
|
||||
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
|
||||
msgid "Total group capacity"
|
||||
msgstr ""
|
||||
|
|
@ -2057,7 +2041,7 @@ msgstr ""
|
|||
msgid "Urgent help"
|
||||
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
|
||||
msgid "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information."
|
||||
msgstr ""
|
||||
|
|
@ -2072,11 +2056,6 @@ msgstr ""
|
|||
msgid "Use light theme"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Use private chat and optional live location sharing."
|
||||
|
|
@ -2215,7 +2194,7 @@ msgstr ""
|
|||
msgid "Write a safe coordination message…"
|
||||
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/request_live/new.ex:373
|
||||
#: lib/who_need_help_web/live/request_live/show.ex:875
|
||||
|
|
@ -2452,7 +2431,7 @@ msgstr ""
|
|||
msgid "← All requests"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "← Back to activities"
|
||||
|
|
@ -2578,7 +2557,7 @@ msgstr ""
|
|||
msgid "Could not complete the action. Please try again."
|
||||
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
|
||||
msgid "Could not publish the activity. Please try again."
|
||||
msgstr ""
|
||||
|
|
@ -4038,6 +4017,7 @@ msgstr ""
|
|||
msgid "Date"
|
||||
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/request_live/new.ex:660
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -4125,14 +4105,14 @@ msgstr ""
|
|||
msgid "In 3 hours"
|
||||
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/request_live/new.ex:484
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Location is unavailable in this browser."
|
||||
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/request_live/new.ex:486
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -4283,7 +4263,7 @@ msgstr ""
|
|||
msgid "Signing in does not create a new account."
|
||||
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
|
||||
msgid "Starts at"
|
||||
msgstr ""
|
||||
|
|
@ -4309,6 +4289,7 @@ msgstr ""
|
|||
msgid "This activity is closed. The group chat remains available as read-only history."
|
||||
msgstr ""
|
||||
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:366
|
||||
#: lib/who_need_help_web/live/request_live/new.ex:503
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "This description is visible to everyone. Do not enter a private address."
|
||||
|
|
@ -4385,6 +4366,7 @@ msgstr ""
|
|||
msgid "Use another email"
|
||||
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/request_live/new.ex:595
|
||||
#, 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/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/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/notification_live.ex:602
|
||||
#: lib/who_need_help_web/live/notification_live.ex:621
|
||||
|
|
@ -4652,7 +4636,7 @@ msgstr ""
|
|||
msgid "Try map again"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{field} is required."
|
||||
|
|
@ -4665,13 +4649,13 @@ msgstr ""
|
|||
msgid "Both reviews are now visible on participant profiles."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Check the category details and try again."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Choose a valid value for %{field}."
|
||||
|
|
@ -6470,7 +6454,7 @@ msgstr ""
|
|||
msgid "A specific option inside an existing category"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Can't find the right option? Propose a category"
|
||||
|
|
@ -6507,7 +6491,7 @@ msgstr ""
|
|||
msgid "New subcategory"
|
||||
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
|
||||
msgid "No matching activity. You can propose a new one."
|
||||
msgstr ""
|
||||
|
|
@ -6522,7 +6506,7 @@ msgstr ""
|
|||
msgid "No matching main category"
|
||||
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
|
||||
msgid "Search activity categories"
|
||||
msgstr ""
|
||||
|
|
@ -6593,11 +6577,6 @@ msgstr ""
|
|||
msgid "Android push notifications are not available yet."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Map marker"
|
||||
|
|
@ -6657,3 +6636,110 @@ msgstr ""
|
|||
#, elixir-autogen, elixir-format
|
||||
msgid "Who Need Help connects adults who need urgent local help with nearby volunteers."
|
||||
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 ""
|
||||
|
|
|
|||
|
|
@ -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."
|
||||
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
|
||||
msgid "Activity details"
|
||||
msgstr "Activity details"
|
||||
|
|
@ -205,7 +205,7 @@ msgstr "Activity hidden."
|
|||
msgid "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
|
||||
msgid "Activity published. You approve every participant."
|
||||
msgstr "Activity published. You approve every participant."
|
||||
|
|
@ -216,7 +216,7 @@ msgid "Activity restored."
|
|||
msgstr "Activity restored."
|
||||
|
||||
#: 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
|
||||
msgid "Activity type"
|
||||
msgstr "Activity type"
|
||||
|
|
@ -278,17 +278,12 @@ msgid "Approved participants"
|
|||
msgstr "Approved participants"
|
||||
|
||||
#: 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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "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/request_live/show.ex:996
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -425,7 +420,7 @@ msgstr "Changing..."
|
|||
msgid "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
|
||||
msgid "Choose activity"
|
||||
msgstr "Choose activity"
|
||||
|
|
@ -435,15 +430,15 @@ msgstr "Choose activity"
|
|||
msgid "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:239
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:242
|
||||
#: 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:371
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "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
|
||||
msgid "City centre, near the main entrance"
|
||||
msgstr "City centre, near the main entrance"
|
||||
|
|
@ -459,7 +454,7 @@ msgstr "Clear"
|
|||
msgid "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
|
||||
msgid "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."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Confirm your email and ensure your account is active before publishing."
|
||||
|
|
@ -549,7 +544,7 @@ msgid "Create activity"
|
|||
msgstr "Create activity"
|
||||
|
||||
#: 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
|
||||
msgid "Create an activity"
|
||||
msgstr "Create an activity"
|
||||
|
|
@ -601,7 +596,7 @@ msgstr "Decline"
|
|||
msgid "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
|
||||
msgid "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"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
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."
|
||||
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/request_live/show.ex:997
|
||||
#, 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."
|
||||
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
|
||||
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."
|
||||
|
|
@ -904,13 +893,13 @@ msgstr "Invalid email or password"
|
|||
msgid "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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "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/request_live/new.ex:668
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -968,7 +957,7 @@ msgstr "Log in only this time"
|
|||
msgid "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/request_live/new.ex:682
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -1103,7 +1092,7 @@ msgstr "Network"
|
|||
msgid "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/request_live/new.ex:379
|
||||
#: lib/who_need_help_web/live/request_live/show.ex:877
|
||||
|
|
@ -1289,7 +1278,7 @@ msgstr "Pickup instructions (optional)"
|
|||
msgid "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
|
||||
msgid "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."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Public profile URL"
|
||||
|
|
@ -1394,12 +1378,12 @@ msgstr "Public profile URL"
|
|||
msgid "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
|
||||
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."
|
||||
|
||||
#: 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
|
||||
msgid "Publish activity"
|
||||
msgstr "Publish activity"
|
||||
|
|
@ -1414,7 +1398,7 @@ msgstr "Publish proposal"
|
|||
msgid "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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Publishing…"
|
||||
|
|
@ -1697,7 +1681,7 @@ msgstr "Share only non-sensitive instructions. Exact details can wait for the ma
|
|||
msgid "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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Short title"
|
||||
|
|
@ -1978,7 +1962,7 @@ msgstr "To see sent emails, visit"
|
|||
msgid "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/category_proposal_live.ex:85
|
||||
#: 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"
|
||||
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
|
||||
msgid "Total group capacity"
|
||||
msgstr "Total group capacity"
|
||||
|
|
@ -2057,7 +2041,7 @@ msgstr "Urgency"
|
|||
msgid "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
|
||||
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."
|
||||
|
|
@ -2072,11 +2056,6 @@ msgstr "Use dark theme"
|
|||
msgid "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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Use private chat and optional live location sharing."
|
||||
|
|
@ -2215,7 +2194,7 @@ msgstr "Withdraw from this request"
|
|||
msgid "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/request_live/new.ex:373
|
||||
#: lib/who_need_help_web/live/request_live/show.ex:875
|
||||
|
|
@ -2452,7 +2431,7 @@ msgstr "verified"
|
|||
msgid "← 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
|
||||
#, elixir-autogen, elixir-format
|
||||
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."
|
||||
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
|
||||
msgid "Could not publish the activity. Please try again."
|
||||
msgstr "Could not publish the activity. Please try again."
|
||||
|
|
@ -4038,6 +4017,7 @@ msgstr ""
|
|||
msgid "Date"
|
||||
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/request_live/new.ex:660
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -4125,14 +4105,14 @@ msgstr ""
|
|||
msgid "In 3 hours"
|
||||
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/request_live/new.ex:484
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Location is unavailable in this browser."
|
||||
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/request_live/new.ex:486
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -4283,7 +4263,7 @@ msgstr ""
|
|||
msgid "Signing in does not create a new account."
|
||||
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
|
||||
msgid "Starts at"
|
||||
msgstr "Starts at"
|
||||
|
|
@ -4309,6 +4289,7 @@ msgstr ""
|
|||
msgid "This activity is closed. The group chat remains available as read-only history."
|
||||
msgstr ""
|
||||
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:366
|
||||
#: lib/who_need_help_web/live/request_live/new.ex:503
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "This description is visible to everyone. Do not enter a private address."
|
||||
|
|
@ -4385,6 +4366,7 @@ msgstr ""
|
|||
msgid "Use another email"
|
||||
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/request_live/new.ex:595
|
||||
#, 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/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/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/notification_live.ex:602
|
||||
#: lib/who_need_help_web/live/notification_live.ex:621
|
||||
|
|
@ -4652,7 +4636,7 @@ msgstr ""
|
|||
msgid "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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{field} is required."
|
||||
|
|
@ -4665,13 +4649,13 @@ msgstr ""
|
|||
msgid "Both reviews are now visible on participant profiles."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Check the category details and try again."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
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"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Can't find the right option? Propose a category"
|
||||
|
|
@ -6507,7 +6491,7 @@ msgstr "New main category"
|
|||
msgid "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
|
||||
msgid "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"
|
||||
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
|
||||
msgid "Search activity categories"
|
||||
msgstr "Search activity categories"
|
||||
|
|
@ -6593,11 +6577,6 @@ msgstr "Search languages"
|
|||
msgid "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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Map marker"
|
||||
|
|
@ -6657,3 +6636,110 @@ msgstr "Waiting for Android notification permission and token…"
|
|||
#, elixir-autogen, elixir-format
|
||||
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."
|
||||
|
||||
#: 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."
|
||||
|
|
|
|||
|
|
@ -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
|
||||
msgid "Activity details"
|
||||
msgstr "Детали активности"
|
||||
|
|
@ -216,7 +216,7 @@ msgstr "Активность скрыта."
|
|||
msgid "Activity is unavailable."
|
||||
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
|
||||
msgid "Activity published. You approve every participant."
|
||||
msgstr "Активность опубликована. Вы одобряете каждого участника."
|
||||
|
|
@ -227,7 +227,7 @@ msgid "Activity restored."
|
|||
msgstr "Активность восстановлена."
|
||||
|
||||
#: 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
|
||||
msgid "Activity type"
|
||||
msgstr "Тип активности"
|
||||
|
|
@ -289,17 +289,12 @@ msgid "Approved participants"
|
|||
msgstr "Одобренные участники"
|
||||
|
||||
#: 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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Approximate area"
|
||||
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/request_live/show.ex:996
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -442,7 +437,7 @@ msgid "Choose a category, urgency, and safe location visibility."
|
|||
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
|
||||
msgid "Choose activity"
|
||||
msgstr "Выберите активность"
|
||||
|
|
@ -452,15 +447,15 @@ msgstr "Выберите активность"
|
|||
msgid "Choose category"
|
||||
msgstr "Выберите категорию"
|
||||
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:212
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:239
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:242
|
||||
#: 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:371
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Choose…"
|
||||
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
|
||||
msgid "City centre, near the main entrance"
|
||||
msgstr "Центр города, рядом с главным входом"
|
||||
|
|
@ -476,7 +471,7 @@ msgstr "Очистить"
|
|||
msgid "Close"
|
||||
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
|
||||
msgid "Coffee and conversation"
|
||||
msgstr "Кофе и разговоры"
|
||||
|
|
@ -543,7 +538,7 @@ msgstr "Подтвердите новый пароль"
|
|||
msgid "Confirm your account and ensure it is active first."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Confirm your email and ensure your account is active before publishing."
|
||||
|
|
@ -570,7 +565,7 @@ msgid "Create activity"
|
|||
msgstr "Создать активность"
|
||||
|
||||
#: 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
|
||||
msgid "Create an activity"
|
||||
msgstr "Создать активность"
|
||||
|
|
@ -624,7 +619,7 @@ msgstr "Отклонить"
|
|||
msgid "Default location visibility"
|
||||
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
|
||||
msgid "Describe the public plan, approximate duration, and who might enjoy it."
|
||||
msgstr ""
|
||||
|
|
@ -716,11 +711,6 @@ msgstr "Введите код передачи"
|
|||
msgid "Exact address after matching"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Exact for active match"
|
||||
|
|
@ -865,7 +855,6 @@ msgstr ""
|
|||
"\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/request_live/show.ex:997
|
||||
#, 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
|
||||
msgid "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point."
|
||||
msgstr ""
|
||||
|
|
@ -977,13 +966,13 @@ msgstr "Неверная электронная почта или пароль"
|
|||
msgid "Join requests are closed."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Join requests close"
|
||||
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/request_live/new.ex:668
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -1043,7 +1032,7 @@ msgstr "Войти только сейчас"
|
|||
msgid "Logged out successfully."
|
||||
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/request_live/new.ex:682
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -1189,7 +1178,7 @@ msgstr "Сеть"
|
|||
msgid "New password"
|
||||
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/request_live/new.ex:379
|
||||
#: lib/who_need_help_web/live/request_live/show.ex:877
|
||||
|
|
@ -1379,7 +1368,7 @@ msgstr "Инструкции для получения (необязательн
|
|||
msgid "Pickup notes"
|
||||
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
|
||||
msgid "Plan and expectations"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Public profile URL"
|
||||
|
|
@ -1495,14 +1479,14 @@ msgstr "URL публичного профиля"
|
|||
msgid "Public reputation"
|
||||
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
|
||||
msgid "Publish a clear public plan. Join requests stay pending until you approve them."
|
||||
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
|
||||
msgid "Publish activity"
|
||||
msgstr "Опубликовать активность"
|
||||
|
|
@ -1517,7 +1501,7 @@ msgstr "Опубликовать предложение"
|
|||
msgid "Publish request"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Publishing…"
|
||||
|
|
@ -1810,7 +1794,7 @@ msgstr ""
|
|||
msgid "Short bio"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Short title"
|
||||
|
|
@ -2101,7 +2085,7 @@ msgstr "Чтобы посмотреть отправленные письма,
|
|||
msgid "Today"
|
||||
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/category_proposal_live.ex:85
|
||||
#: lib/who_need_help_web/live/profile_live.ex:59
|
||||
|
|
@ -2132,7 +2116,7 @@ msgstr "Слишком много писем для входа за настро
|
|||
msgid "Total"
|
||||
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
|
||||
msgid "Total group capacity"
|
||||
msgstr "Общий размер группы"
|
||||
|
|
@ -2180,7 +2164,7 @@ msgstr "Срочность"
|
|||
msgid "Urgent help"
|
||||
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
|
||||
msgid "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information."
|
||||
msgstr ""
|
||||
|
|
@ -2198,11 +2182,6 @@ msgstr "Включить тёмную тему"
|
|||
msgid "Use light theme"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Use private chat and optional live location sharing."
|
||||
|
|
@ -2349,7 +2328,7 @@ msgstr "Отказаться от этой заявки"
|
|||
msgid "Write a safe coordination message…"
|
||||
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/request_live/new.ex:373
|
||||
#: lib/who_need_help_web/live/request_live/show.ex:875
|
||||
|
|
@ -2592,7 +2571,7 @@ msgstr "подтверждено"
|
|||
msgid "← All requests"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "← Back to activities"
|
||||
|
|
@ -2718,7 +2697,7 @@ msgstr "Не удалось завершить модерацию. Попроб
|
|||
msgid "Could not complete the action. Please try again."
|
||||
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
|
||||
msgid "Could not publish the activity. Please try again."
|
||||
msgstr "Не удалось опубликовать активность. Попробуйте ещё раз."
|
||||
|
|
@ -4178,6 +4157,7 @@ msgstr "Не удалось скопировать"
|
|||
msgid "Date"
|
||||
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/request_live/new.ex:660
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -4265,14 +4245,14 @@ msgstr "Через 1 час"
|
|||
msgid "In 3 hours"
|
||||
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/request_live/new.ex:484
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Location is unavailable in this browser."
|
||||
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/request_live/new.ex:486
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -4423,7 +4403,7 @@ msgstr "Запрос на вход обработан"
|
|||
msgid "Signing in does not create a new account."
|
||||
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
|
||||
msgid "Starts at"
|
||||
msgstr "Начало"
|
||||
|
|
@ -4449,6 +4429,7 @@ msgstr "Сайт обработал ваш запрос на регистрац
|
|||
msgid "This activity is closed. The group chat remains available as read-only history."
|
||||
msgstr "Эта активность закрыта. История группового чата доступна только для чтения."
|
||||
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:366
|
||||
#: lib/who_need_help_web/live/request_live/new.ex:503
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "This description is visible to everyone. Do not enter a private address."
|
||||
|
|
@ -4525,6 +4506,7 @@ msgstr "Укажите безопасное публичное место вст
|
|||
msgid "Use another email"
|
||||
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/request_live/new.ex:595
|
||||
#, 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/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/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/notification_live.ex:602
|
||||
#: lib/who_need_help_web/live/notification_live.ex:621
|
||||
|
|
@ -4793,7 +4777,7 @@ msgstr "Вместе"
|
|||
msgid "Try map again"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{field} is required."
|
||||
|
|
@ -4806,13 +4790,13 @@ msgstr "Поле «%{field}» обязательно."
|
|||
msgid "Both reviews are now visible on participant profiles."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Check the category details and try again."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Choose a valid value for %{field}."
|
||||
|
|
@ -6613,7 +6597,7 @@ msgstr "Новая широкая группа помощи или меропр
|
|||
msgid "A specific option inside an existing category"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Can't find the right option? Propose a category"
|
||||
|
|
@ -6650,7 +6634,7 @@ msgstr "Новая основная категория"
|
|||
msgid "New subcategory"
|
||||
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
|
||||
msgid "No matching activity. You can propose a new one."
|
||||
msgstr "Подходящее мероприятие не найдено. Вы можете предложить новое."
|
||||
|
|
@ -6665,7 +6649,7 @@ msgstr "Подходящий тип помощи не найден. Вы мож
|
|||
msgid "No matching main category"
|
||||
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
|
||||
msgid "Search activity categories"
|
||||
msgstr "Поиск категорий мероприятий"
|
||||
|
|
@ -6736,11 +6720,6 @@ msgstr "Поиск языков"
|
|||
msgid "Android push notifications are not available yet."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Map marker"
|
||||
|
|
@ -6800,3 +6779,110 @@ msgstr "Ожидаем разрешения на уведомления и то
|
|||
#, elixir-autogen, elixir-format
|
||||
msgid "Who Need Help connects adults who need urgent local help with nearby volunteers."
|
||||
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 "Выберите место встречи на карте или используйте своё текущее местоположение."
|
||||
|
|
|
|||
|
|
@ -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
|
||||
msgid "Activity details"
|
||||
msgstr "Деталі активності"
|
||||
|
|
@ -216,7 +216,7 @@ msgstr "Активність приховано."
|
|||
msgid "Activity is unavailable."
|
||||
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
|
||||
msgid "Activity published. You approve every participant."
|
||||
msgstr "Активність опубліковано. Ви схвалюєте кожного учасника."
|
||||
|
|
@ -227,7 +227,7 @@ msgid "Activity restored."
|
|||
msgstr "Активність відновлено."
|
||||
|
||||
#: 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
|
||||
msgid "Activity type"
|
||||
msgstr "Тип активності"
|
||||
|
|
@ -289,17 +289,12 @@ msgid "Approved participants"
|
|||
msgstr "Схвалені учасники"
|
||||
|
||||
#: 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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Approximate area"
|
||||
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/request_live/show.ex:996
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -442,7 +437,7 @@ msgid "Choose a category, urgency, and safe location visibility."
|
|||
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
|
||||
msgid "Choose activity"
|
||||
msgstr "Оберіть активність"
|
||||
|
|
@ -452,15 +447,15 @@ msgstr "Оберіть активність"
|
|||
msgid "Choose category"
|
||||
msgstr "Виберіть категорію"
|
||||
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:212
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:239
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:242
|
||||
#: 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:371
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Choose…"
|
||||
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
|
||||
msgid "City centre, near the main entrance"
|
||||
msgstr "Центр міста, біля головного входу"
|
||||
|
|
@ -476,7 +471,7 @@ msgstr "Очистити"
|
|||
msgid "Close"
|
||||
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
|
||||
msgid "Coffee and conversation"
|
||||
msgstr "Кава й розмова"
|
||||
|
|
@ -544,7 +539,7 @@ msgid "Confirm your account and ensure it is active first."
|
|||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Confirm your email and ensure your account is active before publishing."
|
||||
|
|
@ -571,7 +566,7 @@ msgid "Create activity"
|
|||
msgstr "Створити активність"
|
||||
|
||||
#: 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
|
||||
msgid "Create an activity"
|
||||
msgstr "Створити активність"
|
||||
|
|
@ -625,7 +620,7 @@ msgstr "Відхилити"
|
|||
msgid "Default location visibility"
|
||||
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
|
||||
msgid "Describe the public plan, approximate duration, and who might enjoy it."
|
||||
msgstr ""
|
||||
|
|
@ -715,11 +710,6 @@ msgstr "Введіть код передачі"
|
|||
msgid "Exact address after matching"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Exact for active match"
|
||||
|
|
@ -864,7 +854,6 @@ msgstr ""
|
|||
"\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/request_live/show.ex:997
|
||||
#, 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
|
||||
msgid "I will approve participants individually, keep sensitive details in the approved group, and use an appropriate public first meeting point."
|
||||
msgstr ""
|
||||
|
|
@ -975,13 +964,13 @@ msgstr "Неправильна електронна пошта або парол
|
|||
msgid "Join requests are closed."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Join requests close"
|
||||
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/request_live/new.ex:668
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -1041,7 +1030,7 @@ msgstr "Увійти лише зараз"
|
|||
msgid "Logged out successfully."
|
||||
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/request_live/new.ex:682
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -1185,7 +1174,7 @@ msgstr "Мережа"
|
|||
msgid "New password"
|
||||
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/request_live/new.ex:379
|
||||
#: lib/who_need_help_web/live/request_live/show.ex:877
|
||||
|
|
@ -1375,7 +1364,7 @@ msgstr "Інструкції для отримання (необов’язко
|
|||
msgid "Pickup notes"
|
||||
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
|
||||
msgid "Plan and expectations"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Public profile URL"
|
||||
|
|
@ -1491,14 +1475,14 @@ msgstr "URL публічного профілю"
|
|||
msgid "Public reputation"
|
||||
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
|
||||
msgid "Publish a clear public plan. Join requests stay pending until you approve them."
|
||||
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
|
||||
msgid "Publish activity"
|
||||
msgstr "Опублікувати активність"
|
||||
|
|
@ -1513,7 +1497,7 @@ msgstr "Оприлюднити пропозицію"
|
|||
msgid "Publish request"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Publishing…"
|
||||
|
|
@ -1807,7 +1791,7 @@ msgstr ""
|
|||
msgid "Short bio"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Short title"
|
||||
|
|
@ -2098,7 +2082,7 @@ msgstr "Щоб переглянути надіслані листи, відкр
|
|||
msgid "Today"
|
||||
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/category_proposal_live.ex:85
|
||||
#: lib/who_need_help_web/live/profile_live.ex:59
|
||||
|
|
@ -2129,7 +2113,7 @@ msgstr "Забагато листів для входу протягом нал
|
|||
msgid "Total"
|
||||
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
|
||||
msgid "Total group capacity"
|
||||
msgstr "Загальний розмір групи"
|
||||
|
|
@ -2177,7 +2161,7 @@ msgstr "Терміновість"
|
|||
msgid "Urgent help"
|
||||
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
|
||||
msgid "Use a public first meeting point. Do not publish a home address, access code, travel document, or other sensitive information."
|
||||
msgstr ""
|
||||
|
|
@ -2194,11 +2178,6 @@ msgstr "Увімкнути темну тему"
|
|||
msgid "Use light theme"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Use private chat and optional live location sharing."
|
||||
|
|
@ -2345,7 +2324,7 @@ msgstr "Відмовитися від цієї заявки"
|
|||
msgid "Write a safe coordination message…"
|
||||
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/request_live/new.ex:373
|
||||
#: lib/who_need_help_web/live/request_live/show.ex:875
|
||||
|
|
@ -2586,7 +2565,7 @@ msgstr "підтверджено"
|
|||
msgid "← All requests"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "← Back to activities"
|
||||
|
|
@ -2712,7 +2691,7 @@ msgstr "Не вдалося завершити модерацію. Спробу
|
|||
msgid "Could not complete the action. Please try again."
|
||||
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
|
||||
msgid "Could not publish the activity. Please try again."
|
||||
msgstr "Не вдалося опублікувати активність. Спробуйте ще раз."
|
||||
|
|
@ -4172,6 +4151,7 @@ msgstr "Не вдалося скопіювати"
|
|||
msgid "Date"
|
||||
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/request_live/new.ex:660
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -4259,14 +4239,14 @@ msgstr "За 1 годину"
|
|||
msgid "In 3 hours"
|
||||
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/request_live/new.ex:484
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Location is unavailable in this browser."
|
||||
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/request_live/new.ex:486
|
||||
#, elixir-autogen, elixir-format
|
||||
|
|
@ -4417,7 +4397,7 @@ msgstr "Запит на вхід оброблено"
|
|||
msgid "Signing in does not create a new account."
|
||||
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
|
||||
msgid "Starts at"
|
||||
msgstr "Початок"
|
||||
|
|
@ -4443,6 +4423,7 @@ msgstr "Сайт обробив ваш запит на реєстрацію."
|
|||
msgid "This activity is closed. The group chat remains available as read-only history."
|
||||
msgstr "Цю активність закрито. Історія групового чату доступна лише для читання."
|
||||
|
||||
#: lib/who_need_help_web/live/activity_live/new.ex:366
|
||||
#: lib/who_need_help_web/live/request_live/new.ex:503
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "This description is visible to everyone. Do not enter a private address."
|
||||
|
|
@ -4519,6 +4500,7 @@ msgstr "Вкажіть безпечне публічне місце зустрі
|
|||
msgid "Use another email"
|
||||
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/request_live/new.ex:595
|
||||
#, 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/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/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/notification_live.ex:602
|
||||
#: lib/who_need_help_web/live/notification_live.ex:621
|
||||
|
|
@ -4787,7 +4771,7 @@ msgstr "Разом"
|
|||
msgid "Try map again"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "%{field} is required."
|
||||
|
|
@ -4800,13 +4784,13 @@ msgstr "Поле «%{field}» обов’язкове."
|
|||
msgid "Both reviews are now visible on participant profiles."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Check the category details and try again."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Choose a valid value for %{field}."
|
||||
|
|
@ -6607,7 +6591,7 @@ msgstr "Нова широка група допомоги або заходів"
|
|||
msgid "A specific option inside an existing category"
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Can't find the right option? Propose a category"
|
||||
|
|
@ -6644,7 +6628,7 @@ msgstr "Нова основна категорія"
|
|||
msgid "New subcategory"
|
||||
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
|
||||
msgid "No matching activity. You can propose a new one."
|
||||
msgstr "Відповідний захід не знайдено. Ви можете запропонувати новий."
|
||||
|
|
@ -6659,7 +6643,7 @@ msgstr "Відповідний тип допомоги не знайдено. В
|
|||
msgid "No matching main category"
|
||||
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
|
||||
msgid "Search activity categories"
|
||||
msgstr "Пошук категорій заходів"
|
||||
|
|
@ -6730,11 +6714,6 @@ msgstr "Пошук мов"
|
|||
msgid "Android push notifications are not available yet."
|
||||
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
|
||||
#, elixir-autogen, elixir-format
|
||||
msgid "Map marker"
|
||||
|
|
@ -6794,3 +6773,110 @@ msgstr "Очікуємо на дозвіл для сповіщень і токе
|
|||
#, elixir-autogen, elixir-format
|
||||
msgid "Who Need Help connects adults who need urgent local help with nearby volunteers."
|
||||
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 "Оберіть місце зустрічі на карті або скористайтеся своїм поточним місцезнаходженням."
|
||||
|
|
|
|||
|
|
@ -383,6 +383,42 @@ defmodule WhoNeedHelp.ActivitiesTest do
|
|||
refute far_away.id in ids
|
||||
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
|
||||
for {offset, index} <- Enum.with_index([0.0, 0.00005, 0.0001], 1) do
|
||||
assert {:ok, _activity} =
|
||||
|
|
|
|||
|
|
@ -314,6 +314,101 @@ defmodule WhoNeedHelpWeb.MutualAidLiveTest do
|
|||
live(conn, "/activities/not-a-uuid")
|
||||
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
|
||||
category = Catalog.seed_defaults()
|
||||
requester = user_fixture(display_name: "Realtime requester")
|
||||
|
|
@ -664,8 +759,9 @@ defmodule WhoNeedHelpWeb.MutualAidLiveTest do
|
|||
{:ok, view, html} = live(conn, ~p"/activities/new")
|
||||
assert html =~ "Social activity — Hiking"
|
||||
refute html =~ "Medicine pickup status"
|
||||
assert html =~ ~s(data-added-label="Location added.")
|
||||
assert html =~ ~s(data-permission-denied-label="Location permission was denied.")
|
||||
assert html =~ ~s(phx-hook="RequestLocationPicker")
|
||||
assert html =~ ~s(data-preserve-hidden-coordinates="true")
|
||||
assert html =~ ~s(data-location-denied-label="Location permission was denied.")
|
||||
|
||||
html =
|
||||
render_change(view, "validate", %{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user