From 1d06a4ba5452f1f31e2fce61e26f49cbe649d8a2 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Fri, 30 Oct 2026 22:59:30 +0100 Subject: [PATCH 1/6] Preserve Markdown identifiers through the translation pipeline Protect complete comments, code blocks, anchors and Tera expressions before segmentation. Keep literal spans opaque through prose cleanup and localize only actual Markdown link targets. Signed-off-by: Alexander Borsuk --- tmp/test_tooling.py | 105 ++++++++++++++++++++++++++++- tmp/test_xml_roundtrip.py | 17 ++++- tools/markdown_xml.py | 64 ++++++++++++++++-- tools/translate_md.py | 137 +++++++++++++++++--------------------- 4 files changed, 236 insertions(+), 87 deletions(-) diff --git a/tmp/test_tooling.py b/tmp/test_tooling.py index f85215c9f..ba7679b4a 100644 --- a/tmp/test_tooling.py +++ b/tmp/test_tooling.py @@ -8,6 +8,7 @@ import unittest from pathlib import Path from unittest.mock import patch +from xml.etree import ElementTree ROOT = Path(__file__).resolve().parent.parent sys.path.insert(0, str(ROOT / "tools")) @@ -24,7 +25,9 @@ visible_text, ) from translate_check import ERROR, check_translation, emphasis_faults # noqa: E402 -from translate_md import _segments, register_ok, tidy # noqa: E402 +from translate_md import ( # noqa: E402 + _segments, localize_zola_links, register_ok, tidy, translate_post, translate_text, +) class FakeResponse: @@ -122,6 +125,98 @@ def test_nested_frontmatter_prose_and_placeholders_are_checked(self): ["'extra.form.submit_once' must keep the placeholder(s) verbatim"], ) + def test_sentence_initial_occitan_address_is_detected(self): + self.assertFalse(register_ok("Vòstre pagament es estat anullat.", "oc")[0]) + self.assertTrue(register_ok("Ton pagament es estat anullat.", "oc")[0]) + + def test_translation_pipeline_preserves_ignored_spans_and_repairs_prose(self): + source = '''"Hello"... Use `print("hello...")` and ``a ` b``. + +Before {{ value | replace(from="}}", to="{done}") }} after. + + + +{{ }} + +~~~text +## Internal code +print("hello...") +~~~ + +````text +``` +Internal code +``` +```` + +Read [ the docs, ](https://example.com/a_(b)?next=...) now. +''' + expected = source.replace('"Hello"...', '“Hello”…').replace( + '[ the docs, ](https://example.com/a_(b)?next=...)', + '[the docs](https://example.com/a_(b)?next=...),', + ) + + def identity(payloads, *args, **kwargs): + for payload in payloads: + ElementTree.fromstring(f"{payload}") + self.assertNotIn("Internal", payload) + self.assertNotIn('print(', payload) + self.assertNotIn('replace(', payload) + self.assertNotIn('https://', payload) + return payloads, None + + with patch("translate_md.brands_visible", return_value=False), \ + patch("translate_md.deepl_translate", side_effect=identity): + self.assertEqual(translate_text(source, "zh-Hans", use_glossary=False), expected) + + def test_soft_line_break_inside_formatting_keeps_api_text_valid_xml(self): + source = "Before **two\nlines** after.\n\nNext paragraph." + with patch("translate_md.brands_visible", return_value=False), \ + patch("translate_md.deepl_translate", side_effect=lambda texts, *a, **k: (texts, None)) as request: + self.assertEqual(translate_text(source, "fr", use_glossary=False), source) + for payload in request.call_args.args[0]: + ElementTree.fromstring(f"{payload}") + + def test_frontmatter_cleanup_preserves_code_and_extra_fields(self): + source = '''--- +title: 'Use `print("hello...")`' +extra: + label: "Leave this field unchanged..." +--- + +Body. +''' + with patch("translate_md.brands_visible", return_value=False), \ + patch("translate_md.get_glossary_id", return_value=None), \ + patch("translate_md.deepl_translate", side_effect=lambda texts, *a, **k: (texts, None)): + translated = translate_post(source, "fr", use_glossary=False) + from markdown_frontmatter import strip_frontmatter + self.assertEqual(strip_frontmatter(source)[1], strip_frontmatter(translated)[1]) + + def test_links_localize_without_translating_protected_examples(self): + target = "@/contribute/index.md" + source = f'[Organic Maps]({target})\n\n`[example]({target})`' + with patch("translate_md.brands_visible", return_value=False), \ + patch("translate_md.deepl_translate") as request: + translated = translate_text(source, "fr", use_glossary=False) + self.assertEqual(translated, f'[Organic Maps](@/contribute/index.fr.md)\n\n`[example]({target})`') + request.assert_not_called() + for literal in [f'[docs](https://example.com "Example {target}")', + f'example']: + self.assertEqual(localize_zola_links(literal, "fr"), literal) + + def test_tidy_keeps_literal_spans_while_unquoting_brands(self): + self.assertEqual( + tidy('"Organic Maps" says "hello"... `print("hello...")`', "fr"), + 'Organic Maps says «hello»… `print("hello...")`', + ) + def test_source_keep_declarations_are_verified(self): source = """--- title: Privacy @@ -179,8 +274,12 @@ def test_code_span_inside_bold_is_valid_emphasis(self): ) def test_fenced_code_never_enters_translation_payload(self): - payloads, _ = _segments("Before\n```bash\necho hello\n```\nAfter") - self.assertEqual(payloads, ["Before", "After"]) + for fence in ["```bash\necho hello\n```", "~~~bash\necho hello\n~~~", + "````\n```\nInternal\n```\n````"]: + with self.subTest(fence=fence): + payloads, _ = _segments(f"Before\n{fence}\nAfter") + self.assertEqual(payloads, ["Before", "After"]) + self.assertEqual(_segments("Before\n~~~bash\nInternal")[0], ["Before"]) def test_probe_builds_unknown_and_variant_targets(self): terms = load_terms() diff --git a/tmp/test_xml_roundtrip.py b/tmp/test_xml_roundtrip.py index 2714ce2a7..c69ca2043 100644 --- a/tmp/test_xml_roundtrip.py +++ b/tmp/test_xml_roundtrip.py @@ -67,7 +67,15 @@ def roundtrip(md: str) -> tuple[bool, str]: "image": "![A screenshot](/images/shot.png) above.", "code span": "Use the `--dry-run` flag.", "fenced code": "```python\nprint('hi')\n```", + "tilde fence": "~~~python\nprint('hi')\n~~~", + "longer fence containing backticks": "````\n```\ncode\n```\n````", + "unclosed fence": "~~~python\nprint('hi')", "component": "{{ }}", + "component expression arguments": "{{ }}", + "Tera quoted closing braces": '{{ value | replace(from="}}", to="{done}") }}', + "layout comment": "", + "multiline comment with markers": "", + "heading anchor": "## Other ways to donate {#other-ways}", "component inside html": ( '' @@ -153,7 +161,8 @@ def roundtrip(md: str) -> tuple[bool, str]: ok, detail = False, f" {e}\n payload: {payload[:160]!r}" check(f"valid XML: {name}", ok, detail) -# Stash indices must each be referenced exactly once. +# Used stash indices must be valid and unique. Protecting a whole span can +# leave intermediate heading/list marker entries unused. for name, md in CASES.items(): payload, ctx = to_xml(md) used = [int(i) for i in re.findall(r"(\d+)", payload)] @@ -184,6 +193,8 @@ def roundtrip(md: str) -> tuple[bool, str]: ("raw HTML", re.compile(r"</?(?:br|pre|sdk|div|span|img|table)\b")), ("a list marker", re.compile(r"(?m)^[ \t]*[-*+][ \t]+")), ("a heading marker", re.compile(r"(?m)^[ \t]*#{1,6}[ \t]+")), + ("a heading anchor", re.compile(r"\{#[^\s}]+\}")), + ("an HTML comment", re.compile(r"<!--")), ("a brand name", re.compile("|".join( re.escape(b) for b in ["Organic Maps", "OpenStreetMap", "ID Editor", "Google Play", "App Store", "F-Droid"]))), @@ -211,6 +222,10 @@ def purity_problems(md: str) -> list[str]: "autolink": "Visit now.", "code span": "Use the `--dry-run` flag.", "component": "{{ }}", + "component expression arguments": "{{ }}", + "Tera quoted closing braces": '{{ value | replace(from="}}", to="{done}") }}', + "layout comment": "", + "heading anchor": "## Other ways to donate {#other-ways}", "attribution": "- Fixed a crash _(Kiryl Kaveryn)_", "brand": "Organic Maps uses OpenStreetMap data.", "raw html": "✅ No ads
", diff --git a/tools/markdown_xml.py b/tools/markdown_xml.py index 645b3e09b..796b88fda 100644 --- a/tools/markdown_xml.py +++ b/tools/markdown_xml.py @@ -96,9 +96,10 @@ def find_balanced_close(s: str, start: int, open_ch: str, close_ch: str) -> int: return -1 -_FENCE_RE = re.compile(r"```[\s\S]*?```") -_CODE_RE = re.compile(r"`[^`\n]+`") -_TERA_RE = re.compile(r"\{\{[^}]*\}\}") +_FENCE_RE = re.compile(r"(?m)^ {0,3}(`{3,}|~{3,})([^\n]*)(?:\n|$)") +_CODE_RE = re.compile(r"(`+)(?!`)([^\n]*?)(?") +_ANCHOR_RE = re.compile(r"\{#[^}\n]+\}") # Autolinks cover URLs, explicit schemes and bare e-mail addresses. The corpus # contains , which no HTML-tag pattern matches. _AUTOLINK_RE = re.compile( @@ -146,6 +147,45 @@ def repl(m: re.Match) -> str: return _MARKER_RE.sub(repl, md) +def _tera_end(text: str, start: int) -> int: + """End of an expression with nested component arguments and quoted braces.""" + depth = 0 + quote = None + i = start + while i < len(text): + char = text[i] + if char == "\\": + i += 2 + continue + if quote: + if char == quote: + quote = None + elif char in "\"'": + quote = char + elif char == "{": + depth += 1 + elif char == "}": + depth -= 1 + if depth == 0: + return i + 1 if text[i - 1:i + 1] == "}}" else -1 + i += 1 + return -1 + + +def _fence_end(text: str, start: int) -> int: + """End of a Markdown fence, including an unclosed block at end of input.""" + opening = _FENCE_RE.match(text, start) + if not opening: + return -1 + marker, info = opening.groups() + if marker[0] == "`" and "`" in info: + return -1 + closing = re.compile( + rf"(?m)^ {{0,3}}{re.escape(marker[0])}{{{len(marker)},}}[ \t]*(?=\n|$)", + ).search(text, opening.end()) + return closing.end() if closing else len(text) + + def to_xml(md: str, protect_brands: bool = True) -> tuple[str, Context]: """Convert markdown to an XML payload plus the context to reverse it.""" if "" in md or "" in md: @@ -175,6 +215,12 @@ def emit_plain(upto: int) -> None: out.append(flush_text(s[plain_start:upto])) plain_start = upto + def protect_span(text: str) -> str: + # Heading/list markers were protected before scanning. Restore any inside a + # wholesale span so comments/code never retain a nested placeholder on return. + original = re.sub(r"(\d+)", lambda m: ctx.stash[int(m[1])], text) + return ctx.protect(original) + while i < n: c = s[i] @@ -192,16 +238,22 @@ def emit_plain(upto: int) -> None: continue # --- spans that are protected wholesale ------------------------- + end = _tera_end(s, i) if s.startswith("{{", i) else _fence_end(s, i) + if end != -1: + emit_plain(i) + out.append(protect_span(s[i:end])) + i = plain_start = end + continue matched = None - for rx in (_FENCE_RE, _CODE_RE, _TERA_RE, _AUTOLINK_RE, - _LINKDEF_RE, _ATTRIB_RE, _HTML_RE): + for rx in (_CODE_RE, _AUTOLINK_RE, + _LINKDEF_RE, _ATTRIB_RE, _COMMENT_RE, _ANCHOR_RE, _HTML_RE): m = rx.match(s, i) if m: matched = m break if matched: emit_plain(i) - out.append(ctx.protect(matched.group(0))) + out.append(protect_span(matched.group(0))) i = plain_start = matched.end() continue diff --git a/tools/translate_md.py b/tools/translate_md.py index 4738be0da..e89bba393 100755 --- a/tools/translate_md.py +++ b/tools/translate_md.py @@ -32,7 +32,7 @@ import sys from pathlib import Path -from markdown_xml import to_xml, from_xml, find_balanced_close +from markdown_xml import Context, to_xml, from_xml from deepl_glossary import ( translate as deepl_translate, get_glossary_id, @@ -135,7 +135,7 @@ def formality_pref(lang: str) -> str: "mr": (r"(? list[str]: _LINK_LABEL_PUNCTUATION = ",.;:!?、,。;:!?" -def _is_escaped(text: str, index: int) -> bool: - backslashes = 0 - index -= 1 - while index >= 0 and text[index] == "\\": - backslashes += 1 - index -= 1 - return backslashes % 2 == 1 - - -def _move_link_label_punctuation(text: str) -> str: - """Move punctuation from the end of a label to after its inline link.""" - out: list[str] = [] - copied = 0 - search = 0 - while True: - start = text.find("[", search) - if start < 0: - break - if _is_escaped(text, start) or (start > 0 and text[start - 1] == "!"): - search = start + 1 - continue - label_end = find_balanced_close(text, start, "[", "]") - if label_end < 0 or label_end + 1 >= len(text) or text[label_end + 1] != "(": - search = start + 1 - continue - target_end = find_balanced_close(text, label_end + 1, "(", ")") - label = text[start + 1:label_end] - if target_end < 0 or not label or label[-1] not in _LINK_LABEL_PUNCTUATION: - search = start + 1 - continue - - punctuation = label[-1] - out.append(text[copied:start]) - out.append(f"[{label[:-1]}]{text[label_end + 1:target_end + 1]}{punctuation}") - copied = target_end + 1 - search = copied - out.append(text[copied:]) - return "".join(out) +def tidy(text: str, lang: str) -> str: + """Repair translated prose while preserving literal Markdown spans.""" + payload, ctx = to_xml(text, protect_brands=False) + return from_xml(_tidy_payload(payload, ctx, lang), ctx) + + +def _tidy_payload(text: str, ctx: Context, lang: str) -> str: + """Keep ignored code, URLs and components opaque until repairs finish.""" + def readable(m: re.Match) -> str: + original = ctx.stash[int(m[1])] + # Markers need whitespace cleanup; brands need surrounding quotes removed. + # Their literal values are safe prose here. All other ignored spans stay hidden. + if original in BRANDS_TO_UNQUOTE or re.fullmatch(r"(?:[-*+]|#{1,6}|\d+\.)[ \t]+", original): + return original + return m.group(0) + text = re.sub(r"(\d+)", readable, text) + text = re.sub(r"()[  ]+", r"\1", text) + text = re.sub(r"[  ]+()", r"\1", text) -def tidy(text: str, lang: str) -> str: - """Repair the predictable damage a translator does to markdown.""" - # DeepL emits "[label ](url)" and "[ label](url)". - text = re.sub(r"[  ]+\]\(", "](", text) - text = re.sub(r"\[[  ]+", "[", text) + def move_punctuation(m: re.Match) -> str: + punctuation, tag = m.groups() + if ctx.wrappers[tag][1].startswith("]("): + return f"{punctuation}" + return m.group(0) - # Punctuation dragged inside a link label: "[下载,](url)" -> "[下载](url)," - text = _move_link_label_punctuation(text) + text = re.sub( + rf"([{re.escape(_LINK_LABEL_PUNCTUATION)}])", + move_punctuation, text, + ) # The translator adds a space after the ignored list/heading marker token, # leaving "- item" and "## Heading". @@ -340,53 +322,54 @@ def _sub(m: re.Match, right=right) -> str: def localize_zola_links(text: str, lang: str) -> str: - """Point @/… links at the translated page when that page exists.""" + """Localize Markdown link targets without touching code or HTML attributes.""" def repl(m: re.Match) -> str: - target = m.group(1) + target = m.group(2) if re.search(r"\.[a-zA-Z-]+\.md$", target): return m.group(0) # already localized candidate = target[:-3] + f".{lang}.md" if (REPO_ROOT / "content" / candidate).is_file(): - return f"@/{candidate}" + return f"{m.group(1)}{candidate}" return m.group(0) - return re.sub(r"@/([^)\s]+?\.md)", repl, text) + payload, ctx = to_xml(text, protect_brands=False) + for tag, (opening, closing) in ctx.wrappers.items(): + if tag.startswith("a") and closing.startswith("]("): + ctx.wrappers[tag] = (opening, re.sub( + r"^(\]\([ \t]*@/)([^\s]+?\.md)(?=[#?\s)])", repl, closing, + )) + return from_xml(payload, ctx) # ------------------------------------------------------------- the translator def _segments(body: str, visible_brands: bool = True) -> tuple[list[str], list[tuple]]: - """Split into translatable payloads plus a plan to rebuild the text.""" + """Protect complete spans, then split at newlines outside formatting tags.""" payloads: list[str] = [] plan: list[tuple] = [] - fence: tuple[str, int] | None = None - for line in body.split("\n"): - if fence is not None: - plan.append(("verbatim", line)) - char, length = fence - if re.match(rf"^ {{0,3}}{re.escape(char)}{{{length},}}[ \t]*$", line): - fence = None - continue - - opening = re.match(r"^ {0,3}(`{3,}|~{3,})(.*)$", line) - if opening and not ( - opening.group(1).startswith("`") and "`" in opening.group(2) - ): - marker = opening.group(1) - fence = (marker[0], len(marker)) - plan.append(("verbatim", line)) - continue - + payload, ctx = to_xml(body, protect_brands=not visible_brands) + chunks: list[str] = [] + depth = start = 0 + # A formatting span may cross a soft line break. Each API text must still be + # well-formed XML, so keep that span together as one translation unit. + for m in re.finditer(r"|\n", payload): + if m[0] == "\n": + if depth == 0: + chunks.append(payload[start:m.start()]) + start = m.end() + else: + depth += -1 if m[0].startswith("\d+|", "", payload).strip(): - plan.append(("verbatim", line)) + if not re.sub(r"\d+|", "", line).strip(): + plan.append(("verbatim", from_xml(line, ctx))) continue plan.append(("text", len(payloads), ctx)) - payloads.append(payload) + payloads.append(line) return payloads, plan @@ -399,7 +382,7 @@ def _rebuild(plan: list[tuple], translated: list[str], lang: str) -> str: out.append(step[1]) else: _, idx, ctx = step - out.append(tidy(from_xml(translated[idx], ctx), lang)) + out.append(from_xml(_tidy_payload(translated[idx], ctx, lang), ctx)) return "\n".join(out) @@ -407,7 +390,7 @@ def translate_text(body: str, lang: str, use_glossary: bool = True) -> str: """Translate markdown body text into `lang`, preserving all structure.""" payloads, plan = _segments(body, brands_visible(lang)) if not payloads: - return body + return localize_zola_links(body, lang) target = DEEPL_TARGET.get(lang, lang.upper()) extra = [("tag_handling", "xml"), ("ignore_tags", "x")] @@ -457,7 +440,7 @@ def translate_post(raw: str, lang: str, use_glossary: bool = True) -> str: if err: raise RuntimeError(f"DeepL failed for {lang} frontmatter: {err}") for (key, _), ctx, res in zip(fields, ctxs, out): - new_values[key] = tidy(from_xml(res, ctx), lang) + new_values[key] = from_xml(_tidy_payload(res, ctx, lang), ctx) # Rewrite the frontmatter line-wise so unrelated fields keep their exact # formatting — round-tripping through a YAML dumper would reflow them. From d981e4335ac3e9cd4c4b459e84dfcc204be68311 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Fri, 30 Oct 2026 23:01:26 +0100 Subject: [PATCH 2/6] Share and simplify the localized donation checkout Use one form for donation entry points with recurring terms, custom-amount selection, inline validation and cancellation recovery. Keep EUR presets and submitted currency consistent without JavaScript. Signed-off-by: Alexander Borsuk --- content/donate/subscribe/index.af.md | 19 +- content/donate/subscribe/index.ar.md | 19 +- content/donate/subscribe/index.ca.md | 17 +- content/donate/subscribe/index.cs.md | 17 +- content/donate/subscribe/index.cy.md | 19 +- content/donate/subscribe/index.de.md | 17 +- content/donate/subscribe/index.el.md | 19 +- content/donate/subscribe/index.es.md | 17 +- content/donate/subscribe/index.et.md | 19 +- content/donate/subscribe/index.eu.md | 19 +- content/donate/subscribe/index.fa-IR.md | 19 +- content/donate/subscribe/index.fr.md | 17 +- content/donate/subscribe/index.gl.md | 19 +- content/donate/subscribe/index.he.md | 19 +- content/donate/subscribe/index.hi.md | 19 +- content/donate/subscribe/index.hu.md | 17 +- content/donate/subscribe/index.id.md | 19 +- content/donate/subscribe/index.it.md | 17 +- content/donate/subscribe/index.ja.md | 17 +- content/donate/subscribe/index.lt.md | 17 +- content/donate/subscribe/index.md | 17 +- content/donate/subscribe/index.ml.md | 19 +- content/donate/subscribe/index.mr.md | 19 +- content/donate/subscribe/index.nl.md | 17 +- content/donate/subscribe/index.oc.md | 19 +- content/donate/subscribe/index.pl.md | 17 +- content/donate/subscribe/index.pt-BR.md | 19 +- content/donate/subscribe/index.pt.md | 17 +- content/donate/subscribe/index.ru.md | 19 +- content/donate/subscribe/index.sv.md | 17 +- content/donate/subscribe/index.te.md | 19 +- content/donate/subscribe/index.tr.md | 19 +- content/donate/subscribe/index.uk.md | 19 +- content/donate/subscribe/index.zh-Hans.md | 19 +- sass/_donate_form.scss | 410 ++++++++++++++++++++-- static/js/donate-subscribe.js | 97 +++-- templates/_donate_form.html | 105 ++++++ templates/base.html | 2 + templates/donate-subscribe.html | 107 +----- 39 files changed, 1001 insertions(+), 338 deletions(-) create mode 100644 templates/_donate_form.html diff --git a/content/donate/subscribe/index.af.md b/content/donate/subscribe/index.af.md index 168c6d9d2..7d6760e29 100644 --- a/content/donate/subscribe/index.af.md +++ b/content/donate/subscribe/index.af.md @@ -13,9 +13,9 @@ extra: amount_label: Bedrag other_label: Ander bedrag currency_label: Geldeenheid - email_label: E-pos (aanbeveel) - email_why: Ons sal ’n bevestiging stuur, jou voor elke betaling herinner en jou ’n kansellasieskakel met een klik gee. Niks anders nie — geen bemarking nie. - email_warning: Sonder ’n e-pos kan ons nie betalingsherinnerings of ’n kansellasieskakel stuur nie — jy sal ons moet kontak om te kanselleer. + email_label: "E-pos (opsioneel)" + email_why: "Kry 'n bevestiging, herinnerings en 'n kansellasieskakel. Geen bemarking nie." + email_warning: "Sonder e-pos, kontak ons om jou herhalende skenking te kanselleer." name_label: Naam (opsioneel) name_why: Sodat ons jou in die dankie-e-pos kan aanspreek. submit: Gaan voort met veilige betaling @@ -23,10 +23,17 @@ extra: submit_month: Skenk {amount} maandeliks submit_year: Skenk {amount} jaarliks submit_loading: Herlei na veilige betaling… - secure_note: Jy voltooi die betaling op Mollie, ons betalingsverskaffer. Kaartbesonderhede raak nooit ons bedieners nie. + secure_note: "Veilige betaling met Mollie. Kaartbesonderhede raak nooit ons bedieners nie." error_amount: Voer asseblief ’n geldige bedrag in. error_amount_range: Voer ’n bedrag tussen {min} en {max} in. - other_ways: Ander maniere om te skenk (PayPal, bankoordrag, kripto…) + other_ways: "Ander maniere om te skenk" + form_title: "Doen 'n skenking" + other_preset_label: "Ander" + email_why_once: "Vir 'n skenkingbevestiging. Geen bemarking." + recurrence_once: "{amount} · Eenmalig" + recurrence_month: "{amount} nou, daarna maandeliks totdat jy kanselleer." + recurrence_year: "{amount} nou, daarna jaarliks totdat jy kanselleer." + canceled_notice: "Jou betaling is gekanselleer. Jy kan weer probeer of 'n ander manier kies om te skenk." --- -Organic Maps is gratis vir almal danksy jou skenkings. Geen advertensies nie. Geen opsporing nie. Oopbron. \ No newline at end of file +Organic Maps is gratis vir almal danksy jou skenkings. Geen advertensies nie. Geen opsporing nie. Oopbron. diff --git a/content/donate/subscribe/index.ar.md b/content/donate/subscribe/index.ar.md index 0d2e36c7e..f83229385 100644 --- a/content/donate/subscribe/index.ar.md +++ b/content/donate/subscribe/index.ar.md @@ -13,9 +13,9 @@ extra: amount_label: المبلغ other_label: مبلغ آخر currency_label: العملة - email_label: البريد الإلكتروني (موصى به) - email_why: سنرسل إليك تأكيدًا، وسنذكرك قبل كل عملية خصم، وسنزودك برابط للإلغاء بنقرة واحدة. لا شيء غير ذلك — لا تسويق. - email_warning: بدون عنوان بريد إلكتروني، لا يمكننا إرسال تذكيرات بالدفع أو رابط الإلغاء — وسيتعين عليك الاتصال بنا لإلغاء التبرع. + email_label: "البريد الإلكتروني (اختياري)" + email_why: "احصل على رسالة تأكيد وتذكيرات ورابط للإلغاء. بدون رسائل تسويقية." + email_warning: "إذا تركت البريد الإلكتروني فارغًا، اتصل بنا لإلغاء تبرعك الدوري." name_label: الاسم (اختياري) name_why: حتى نتمكن من مخاطبتك في رسالة الشكر عبر البريد الإلكتروني. submit: المتابعة لإتمام عملية الدفع الآمنة @@ -23,10 +23,17 @@ extra: submit_month: تبرع بـ{amount} شهريًا submit_year: تبرع بـ{amount} سنويًا submit_loading: إعادة التوجيه إلى صفحة الدفع الآمنة… - secure_note: ستتم عملية الدفع عبر Mollie، مزود خدمات الدفع الذي نتعامل معه. لا تمر تفاصيل البطاقة أبدًا عبر خوادمنا. + secure_note: "الدفع الآمن عبر Mollie. لا تمر تفاصيل البطاقة عبر خوادمنا أبدًا." error_amount: يرجى إدخال مبلغ صحيح. error_amount_range: أدخل مبلغًا يتراوح بين {min} و{max}. - other_ways: طرق أخرى للتبرع (PayPal، التحويل المصرفي، العملات المشفرة…) + other_ways: "طرق أخرى للتبرع" + form_title: "تبرع" + other_preset_label: "أخرى" + email_why_once: "للحصول على تأكيد التبرع. بدون رسائل تسويقية." + recurrence_once: "{amount} · مرة واحدة" + recurrence_month: "{amount} الآن، ثم شهريًا حتى تلغي التبرع الدوري." + recurrence_year: "{amount} الآن، ثم سنويًا حتى تلغي التبرع الدوري." + canceled_notice: "تم إلغاء دفعتك. يمكنك المحاولة مرة أخرى أو اختيار طريقة أخرى للتبرع." --- -تطبيق Organic Maps مجاني للجميع بفضل تبرعاتك. خالٍ من الإعلانات. خالٍ من أدوات التتبع. مفتوح المصدر. \ No newline at end of file +تطبيق Organic Maps مجاني للجميع بفضل تبرعاتك. خالٍ من الإعلانات. خالٍ من أدوات التتبع. مفتوح المصدر. diff --git a/content/donate/subscribe/index.ca.md b/content/donate/subscribe/index.ca.md index 4055ed13d..8115b209f 100644 --- a/content/donate/subscribe/index.ca.md +++ b/content/donate/subscribe/index.ca.md @@ -13,9 +13,9 @@ extra: amount_label: Import other_label: Un altre import currency_label: Moneda - email_label: Correu electrònic (recomanat) - email_why: T’enviarem una confirmació, un recordatori abans de cada càrrec i un enllaç per cancel·lar amb un clic. Res més — sense màrqueting. - email_warning: Sense correu no podem enviar recordatoris de pagament ni un enllaç de cancel·lació — hauries de contactar-nos per cancel·lar. + email_label: "Correu electrònic (opcional)" + email_why: "Rebràs una confirmació, recordatoris i un enllaç per cancel·lar. Sense publicitat." + email_warning: "Si no indiques el correu electrònic, contacta amb nosaltres per cancel·lar la donació periòdica." name_label: Nom (opcional) name_why: Per poder adreçar-nos a tu al correu d’agraïment. submit: Continua al pagament segur @@ -23,10 +23,17 @@ extra: submit_month: Dona {amount} al mes submit_year: Dona {amount} a l’any submit_loading: Redirigint al pagament segur… - secure_note: Completaràs el pagament a Mollie, el nostre proveïdor de pagaments. Les dades de la targeta mai no toquen els nostres servidors. + secure_note: "Pagament segur amb Mollie. Les dades de la targeta mai no arriben als nostres servidors." error_amount: Introdueix un import vàlid. error_amount_range: Introdueix un import entre {min} i {max}. - other_ways: Altres maneres de donar (PayPal, transferència, cripto…) + other_ways: "Altres maneres de donar" + form_title: "Fes una donació" + other_preset_label: "Altra" + email_why_once: "Per a la confirmació de la donació. Sense màrqueting." + recurrence_once: "{amount} · Únic" + recurrence_month: "{amount} ara, i després cada mes fins que cancel·lis la donació." + recurrence_year: "{amount} ara, i després cada any fins que cancel·lis la donació." + canceled_notice: "El teu pagament s'ha cancel·lat. Pots tornar-ho a provar o triar una altra manera de fer una donació." --- L’aplicació Organic Maps és gratuïta per a tothom gràcies als teus donatius. Sense anuncis. Sense rastrejadors. Codi obert. diff --git a/content/donate/subscribe/index.cs.md b/content/donate/subscribe/index.cs.md index 67aeaef89..d1c70dc99 100644 --- a/content/donate/subscribe/index.cs.md +++ b/content/donate/subscribe/index.cs.md @@ -13,9 +13,9 @@ extra: amount_label: Částka other_label: Jiná částka currency_label: Měna - email_label: E-mail (doporučeno) - email_why: Pošleme vám potvrzení, připomenutí před každou platbou a odkaz na zrušení jedním kliknutím. Nic víc — žádný marketing. - email_warning: Bez e-mailu nemůžeme posílat připomenutí plateb ani odkaz na zrušení — pro zrušení byste nás museli kontaktovat. + email_label: "E-mail (volitelné)" + email_why: "Obdržíte potvrzení, upomínky a odkaz pro zrušení. Žádné marketingové zprávy." + email_warning: "Pokud e-mail neuvedete, pro zrušení pravidelného příspěvku nás kontaktujte." name_label: Jméno (nepovinné) name_why: Abychom vás mohli oslovit v děkovném e-mailu. submit: Pokračovat k bezpečné platbě @@ -23,10 +23,17 @@ extra: submit_month: Darovat {amount} měsíčně submit_year: Darovat {amount} ročně submit_loading: Přesměrování na bezpečnou platbu… - secure_note: Platbu dokončíte u Mollie, našeho poskytovatele plateb. Údaje o kartě se nikdy nedostanou na naše servery. + secure_note: "Bezpečná platba přes Mollie. Údaje o kartě se nikdy nedostanou na naše servery." error_amount: Zadejte platnou částku. error_amount_range: Zadejte částku mezi {min} a {max}. - other_ways: Další způsoby, jak přispět (PayPal, převod, kryptoměny…) + other_ways: "Další možnosti, jak přispět" + form_title: "Přispějte" + other_preset_label: "Ostatní" + email_why_once: "Pro potvrzení daru. Žádné marketingové účely." + recurrence_once: "{amount} · Jednorázově" + recurrence_month: "{amount} nyní, poté každý měsíc, dokud příspěvek nezrušíte." + recurrence_year: "{amount} nyní, poté každý rok, dokud příspěvek nezrušíte." + canceled_notice: "Vaše platba byla zrušena. Můžete to zkusit znovu nebo zvolit jiný způsob darování." --- Aplikace Organic Maps je zdarma pro všechny díky vašim darům. Bez reklam. Bez sledování. Open source. diff --git a/content/donate/subscribe/index.cy.md b/content/donate/subscribe/index.cy.md index d7b564d85..b5afff1f6 100644 --- a/content/donate/subscribe/index.cy.md +++ b/content/donate/subscribe/index.cy.md @@ -13,9 +13,9 @@ extra: amount_label: Swm other_label: Swm arall currency_label: Arian cyfred - email_label: E-bost (argymhellir) - email_why: Byddwn yn anfon cadarnhad, yn dy atgoffa cyn pob tâl, ac yn rhoi dolen canslo un clic i ti. Dim byd arall — dim marchnata. - email_warning: Heb e-bost, ni allwn anfon nodiadau atgoffa am daliad na dolen canslo — byddai angen i ti gysylltu â ni i ganslo. + email_label: "E-bost (dewisol)" + email_why: "Cael cadarnhad, negeseuon atgoffa a dolen ganslo. Dim marchnata." + email_warning: "Heb e-bost, cysyllta â ni i ganslo dy rodd reolaidd." name_label: Enw (dewisol) name_why: Er mwyn i ni allu dy annerch yn yr e-bost diolch. submit: Parhau i dalu’n ddiogel @@ -23,10 +23,17 @@ extra: submit_month: Rhoi {amount} yn fisol submit_year: Rhoi {amount} yn flynyddol submit_loading: Ailgyfeirio i dalu’n ddiogel… - secure_note: Byddi di’n cwblhau’r taliad ar Mollie, ein darparwr taliadau. Nid yw manylion dy gerdyn byth yn cyrraedd ein gweinyddion. + secure_note: "Taliad diogel gyda Mollie. Nid yw manylion dy gerdyn byth yn cyrraedd ein gweinyddion." error_amount: Rho swm dilys. error_amount_range: Rho swm rhwng {min} a {max}. - other_ways: Ffyrdd eraill o gyfrannu (PayPal, trosglwyddiad banc, crypto…) + other_ways: "Ffyrdd eraill o gyfrannu" + form_title: "Gwna rodd" + other_preset_label: "Arall" + email_why_once: "I gadarnhau rhodd. Dim marchnata." + recurrence_once: "{amount} · Un-tro" + recurrence_month: "{amount} nawr, yna bob mis nes i ti ganslo." + recurrence_year: "{amount} nawr, yna bob blwyddyn nes i ti ganslo." + canceled_notice: "Cafodd dy daliad ei ganslo. Galli di roi cynnig arall arni neu ddewis ffordd arall o gyfrannu." --- -Mae Organic Maps am ddim i bawb diolch i dy roddion. Dim hysbysebion. Dim olrhainwyr. Ffynhonnell agored. \ No newline at end of file +Mae Organic Maps am ddim i bawb diolch i dy roddion. Dim hysbysebion. Dim olrhainwyr. Ffynhonnell agored. diff --git a/content/donate/subscribe/index.de.md b/content/donate/subscribe/index.de.md index 8d1ac5d9b..30382aa6f 100644 --- a/content/donate/subscribe/index.de.md +++ b/content/donate/subscribe/index.de.md @@ -15,9 +15,9 @@ extra: amount_label: Betrag other_label: Anderer Betrag currency_label: Währung - email_label: E-Mail (empfohlen) - email_why: Wir senden dir eine Bestätigung, erinnern dich vor jeder Abbuchung und geben dir einen Abbrechen-Link mit einem Klick. Sonst nichts — kein Marketing. - email_warning: Ohne E-Mail können wir keine Zahlungserinnerungen und keinen Kündigungslink senden — zum Beenden müsstest du uns kontaktieren. + email_label: "E-Mail (optional)" + email_why: "Bestätigung, Erinnerungen und Kündigungslink. Keine Werbung." + email_warning: "Ohne E-Mail-Adresse musst du uns zum Kündigen deiner regelmäßigen Spende kontaktieren." name_label: Name (optional) name_why: Damit wir dich in der Dankes-E-Mail ansprechen können. submit: Weiter zur sicheren Zahlung @@ -25,10 +25,17 @@ extra: submit_month: '{amount} monatlich spenden' submit_year: '{amount} jährlich spenden' submit_loading: Weiterleitung zur sicheren Zahlung… - secure_note: Du schließt die Zahlung bei Mollie ab, unserem Zahlungsanbieter. Kartendaten erreichen unsere Server nie. + secure_note: "Sichere Zahlung über Mollie. Deine Kartendaten werden niemals auf unseren Servern gespeichert." error_amount: Bitte gib einen gültigen Betrag ein. error_amount_range: Bitte gib einen Betrag zwischen {min} und {max} ein. - other_ways: Weitere Spendenmöglichkeiten (PayPal, Überweisung, Krypto…) + other_ways: "Weitere Spendenmöglichkeiten" + form_title: "Jetzt spenden" + other_preset_label: "Andere" + email_why_once: "Für eine Spendenbestätigung. Keine Werbung." + recurrence_once: "{amount} · Einmalig" + recurrence_month: "{amount} jetzt, danach monatlich, bis du kündigst." + recurrence_year: "{amount} jetzt, danach jährlich, bis du kündigst." + canceled_notice: "Deine Zahlung wurde storniert. Du kannst es erneut versuchen oder eine andere Spendenmöglichkeit wählen." --- Organic Maps ist dank deiner Spenden für alle kostenlos. Keine Werbung. Keine Tracker. Open Source. diff --git a/content/donate/subscribe/index.el.md b/content/donate/subscribe/index.el.md index 80aed9d0b..6c76b4e76 100644 --- a/content/donate/subscribe/index.el.md +++ b/content/donate/subscribe/index.el.md @@ -13,9 +13,9 @@ extra: amount_label: Ποσό other_label: Άλλο ποσό currency_label: Νόμισμα - email_label: Email (συνιστάται) - email_why: Θα σου στείλουμε επιβεβαίωση, θα σου υπενθυμίσουμε πριν από κάθε χρέωση και θα σου δώσουμε έναν σύνδεσμο ακύρωσης με ένα κλικ. Τίποτα άλλο — χωρίς διαφημιστικά μηνύματα. - email_warning: Χωρίς διεύθυνση email δεν μπορούμε να στείλουμε υπενθυμίσεις πληρωμής ή σύνδεσμο ακύρωσης — θα πρέπει να επικοινωνήσεις μαζί μας για να ακυρώσεις τη δωρεά. + email_label: "Email (προαιρετικό)" + email_why: "Λάβε επιβεβαίωση, υπενθυμίσεις και σύνδεσμο ακύρωσης. Χωρίς διαφημιστικά μηνύματα." + email_warning: "Αν δεν δώσεις email, επικοινώνησε μαζί μας για να ακυρώσεις την τακτική δωρεά σου." name_label: Όνομα (προαιρετικό) name_why: Για να μπορέσουμε να σου απευθυνθούμε στο email ευχαριστίας. submit: Συνέχεια στην ασφαλή πληρωμή @@ -23,10 +23,17 @@ extra: submit_month: Κάνε μηνιαία δωρεά {amount} submit_year: Κάνε ετήσια δωρεά {amount} submit_loading: Ανακατεύθυνση σε ασφαλή πληρωμή… - secure_note: Θα ολοκληρώσεις την πληρωμή στη Mollie, τον πάροχο πληρωμών μας. Τα στοιχεία της κάρτας δεν φτάνουν ποτέ στους διακομιστές μας. + secure_note: "Ασφαλής πληρωμή μέσω του Mollie. Τα στοιχεία της κάρτας δεν αποθηκεύονται ποτέ στους διακομιστές μας." error_amount: Παρακαλώ πληκτρολόγησε ένα έγκυρο ποσό. error_amount_range: Πληκτρολόγησε ένα ποσό μεταξύ {min} και {max}. - other_ways: Άλλοι τρόποι δωρεάς (PayPal, τραπεζική μεταφορά, κρυπτονομίσματα…) + other_ways: "Άλλοι τρόποι δωρεάς" + form_title: "Κάνε μια δωρεά" + other_preset_label: "Άλλα" + email_why_once: "Για επιβεβαίωση δωρεάς. Χωρίς διαφημιστικά μηνύματα." + recurrence_once: "{amount} · Εφάπαξ" + recurrence_month: "{amount} τώρα και μετά κάθε μήνα, μέχρι να ακυρώσεις τη δωρεά." + recurrence_year: "{amount} τώρα και μετά κάθε χρόνο, μέχρι να ακυρώσεις τη δωρεά." + canceled_notice: "Η πληρωμή σου ακυρώθηκε. Μπορείς να δοκιμάσεις ξανά ή να επιλέξεις έναν άλλο τρόπο δωρεάς." --- -Το Organic Maps είναι δωρεάν για όλους χάρη στις δωρεές σου. Χωρίς διαφημίσεις. Χωρίς προγράμματα παρακολούθησης. Ανοιχτού κώδικα. \ No newline at end of file +Το Organic Maps είναι δωρεάν για όλους χάρη στις δωρεές σου. Χωρίς διαφημίσεις. Χωρίς προγράμματα παρακολούθησης. Ανοιχτού κώδικα. diff --git a/content/donate/subscribe/index.es.md b/content/donate/subscribe/index.es.md index c6a6f8b84..d1fb63999 100644 --- a/content/donate/subscribe/index.es.md +++ b/content/donate/subscribe/index.es.md @@ -13,9 +13,9 @@ extra: amount_label: Importe other_label: Otro importe currency_label: Moneda - email_label: Correo electrónico (recomendado) - email_why: Te enviaremos una confirmación, un recordatorio antes de cada cobro y un enlace para cancelar con un clic. Nada más — sin marketing. - email_warning: Sin correo no podemos enviar recordatorios de pago ni un enlace de cancelación — tendrías que contactarnos para cancelar. + email_label: "Correo electrónico (opcional)" + email_why: "Recibe una confirmación, recordatorios y un enlace para darte de baja. Sin publicidad." + email_warning: "Sin un correo electrónico, contáctanos para cancelar tu donación periódica." name_label: Nombre (opcional) name_why: Para dirigirnos a ti en el correo de agradecimiento. submit: Continuar al pago seguro @@ -23,10 +23,17 @@ extra: submit_month: Donar {amount} al mes submit_year: Donar {amount} al año submit_loading: Redirigiendo al pago seguro… - secure_note: Completarás el pago en Mollie, nuestro proveedor de pagos. Los datos de la tarjeta nunca tocan nuestros servidores. + secure_note: "Pago seguro con Mollie. Los datos de tu tarjeta nunca pasan por nuestros servidores." error_amount: Introduce un importe válido. error_amount_range: Introduce un importe entre {min} y {max}. - other_ways: Otras formas de donar (PayPal, transferencia, cripto…) + other_ways: "Otras formas de hacer donaciones" + form_title: "Haz una donación" + other_preset_label: "Otro" + email_why_once: "Para recibir un recibo de tu donación. Sin publicidad." + recurrence_once: "{amount} · Única" + recurrence_month: "{amount} ahora y después cada mes, hasta que canceles la donación." + recurrence_year: "{amount} ahora y después cada año, hasta que canceles la donación." + canceled_notice: "Tu pago se ha cancelado. Puedes volver a intentarlo o elegir otra forma de hacer una donación." --- Organic Maps es gratis para todos gracias a tus donaciones. Sin anuncios. Sin rastreadores. Código abierto. diff --git a/content/donate/subscribe/index.et.md b/content/donate/subscribe/index.et.md index 0a6e74d5d..2258ef12e 100644 --- a/content/donate/subscribe/index.et.md +++ b/content/donate/subscribe/index.et.md @@ -13,9 +13,9 @@ extra: amount_label: Summa other_label: Muu summa currency_label: Valuuta - email_label: E-post (soovitatav) - email_why: Saadame sulle kinnituse, tuletame enne iga makset meelde ja anname ühe klõpsuga tühistamislingi. Ei midagi muud – mingit turundust. - email_warning: Ilma e-posti aadressita ei saa me saata maksemeeldetuletusi ega tühistamislinki – tühistamiseks peaksid meiega ühendust võtma. + email_label: "E-post (vabatahtlik)" + email_why: "Saad kinnituse, meeldetuletused ja tühistamislingi. Ei mingit reklaami." + email_warning: "Kui sa e-posti aadressi ei lisa, võta korduva annetuse tühistamiseks meiega ühendust." name_label: Nimi (valikuline) name_why: Et saaksime sinu poole tänukirjas nimepidi pöörduda. submit: Jätka turvalise makse sooritamisega @@ -23,10 +23,17 @@ extra: submit_month: Anneta {amount} kuus submit_year: Anneta {amount} aastas submit_loading: Suunatakse edasi turvalisele maksele… - secure_note: Makse lõpetad meie maksevahendaja Mollie lehel. Kaardiandmed ei jõua kunagi meie serveritesse. + secure_note: "Turvaline maksmine teenuse Mollie kaudu. Kaardiandmed ei jõua kunagi meie serveritesse." error_amount: Palun sisesta kehtiv summa. error_amount_range: Sisesta summa vahemikus {min} kuni {max}. - other_ways: Muud annetusvõimalused (PayPal, pangaülekanne, krüptovaluuta…) + other_ways: "Muud annetusvõimalused" + form_title: "Tee annetus" + other_preset_label: "Muu" + email_why_once: "Annetuse kinnituse saamiseks. Ei mingit turundust." + recurrence_once: "{amount} · Ühekordne" + recurrence_month: "{amount} nüüd, seejärel iga kuu, kuni annetuse tühistad." + recurrence_year: "{amount} nüüd, seejärel igal aastal, kuni annetuse tühistad." + canceled_notice: "Sinu makse tühistati. Võid proovida uuesti või valida mõne muu annetamisviisi." --- -Tänu sinu annetustele on Organic Maps kõigile tasuta. Ilma reklaamideta. Ilma jälgijateta. Avatud lähtekoodiga. \ No newline at end of file +Tänu sinu annetustele on Organic Maps kõigile tasuta. Ilma reklaamideta. Ilma jälgijateta. Avatud lähtekoodiga. diff --git a/content/donate/subscribe/index.eu.md b/content/donate/subscribe/index.eu.md index 6bb54caf3..c4e4a08c6 100644 --- a/content/donate/subscribe/index.eu.md +++ b/content/donate/subscribe/index.eu.md @@ -13,9 +13,9 @@ extra: amount_label: Zenbatekoa other_label: Beste zenbateko bat currency_label: Moneta - email_label: Posta elektronikoa (gomendatua) - email_why: Berrespen bat bidaliko dizugu, kobrantza bakoitzaren aurretik gogoraraziko dizugu eta klik bakarreko ezeztatzeko esteka bat emango dizugu. Beste ezer ez — marketinik gabe. - email_warning: Posta elektronikorik gabe ezin ditugu ordainketa-gogorarazpenak edo ezeztatzeko esteka bidali — ezeztatzeko gurekin harremanetan jarri beharko zenuke. + email_label: "Posta elektronikoa (aukerakoa)" + email_why: "Jasoko duzu baieztapen bat, gogorarazpenak eta bertan behera uzteko esteka bat. Ez dago marketinerik." + email_warning: "Helbide elektronikorik gabe, jar zaitez gurekin harremanetan aldizkako dohaintza bertan behera uzteko." name_label: Izena (aukerakoa) name_why: Eskerrak emateko mezuan izenez zuzendu ahal izateko. submit: Jarraitu ordainketa segurura @@ -23,10 +23,17 @@ extra: submit_month: Eman {amount} hilero submit_year: Eman {amount} urtero submit_loading: Ordainketa segurura birbideratzen… - secure_note: Ordainketa Mollie-n amaituko duzu, gure ordainketa-hornitzailean. Txartelaren datuak ez dira inoiz gure zerbitzarietatik pasatzen. + secure_note: "Mollie bidezko ordainketa segurua. Txartelaren xehetasunak inoiz ez dira gure zerbitzarietara iristen." error_amount: Mesedez, sartu baliozko zenbateko bat. error_amount_range: Sartu {min} eta {max} arteko zenbateko bat. - other_ways: Dohaintza egiteko beste modu batzuk (PayPal, banku-transferentzia, kriptoa…) + other_ways: "Doneatzeko beste modu batzuk" + form_title: "Egin dohaintza" + other_preset_label: "Besteak" + email_why_once: "Dohaintza-berrespenarako. Ez marketinerako." + recurrence_once: "{amount} · Behin bakarrik" + recurrence_month: "{amount} orain, eta gero hilero, dohaintza bertan behera utzi arte." + recurrence_year: "{amount} orain, eta gero urtero, dohaintza bertan behera utzi arte." + canceled_notice: "Zure ordainketa bertan behera utzi da. Berriro saiatu zaitezke edo beste modu bat aukeratu dohaintza egiteko." --- -Organic Maps doakoa da denontzat, zure dohaintzei esker. Iragarkirik gabe. Jarraipen-tresnarik gabe. Iturburu irekia. \ No newline at end of file +Organic Maps doakoa da denontzat, zure dohaintzei esker. Iragarkirik gabe. Jarraipen-tresnarik gabe. Iturburu irekia. diff --git a/content/donate/subscribe/index.fa-IR.md b/content/donate/subscribe/index.fa-IR.md index 35fad6ec8..d39d03da4 100644 --- a/content/donate/subscribe/index.fa-IR.md +++ b/content/donate/subscribe/index.fa-IR.md @@ -13,9 +13,9 @@ extra: amount_label: مبلغ other_label: مبلغ دیگر currency_label: واحد پول - email_label: ایمیل (توصیه می‌شود) - email_why: یک تأییدیه برایتان می‌فرستیم، پیش از هر برداشت به شما یادآوری می‌کنیم و یک لینک لغو یک‌کلیکی در اختیارتان می‌گذاریم. همین و بس — بدون بازاریابی. - email_warning: بدون ایمیل نمی‌توانیم یادآوری‌های پرداخت یا لینک لغو را برایتان بفرستیم — برای لغو باید با ما تماس بگیرید. + email_label: "ایمیل (اختیاری)" + email_why: "دریافت تأییدیه، یادآوری‌ها و لینک لغو. بدون بازاریابی." + email_warning: "اگر ایمیل را وارد نکنید، برای لغو کمک مالی دوره‌ای با ما تماس بگیرید." name_label: نام (اختیاری) name_why: تا بتوانیم در ایمیل تشکر شما را خطاب قرار دهیم. submit: ادامه به پرداخت امن @@ -23,10 +23,17 @@ extra: submit_month: اهدای ماهانهٔ {amount} submit_year: اهدای سالانهٔ {amount} submit_loading: در حال انتقال به پرداخت امن… - secure_note: پرداخت را در Mollie، ارائه‌دهندهٔ پرداخت ما، نهایی می‌کنید. اطلاعات کارت هرگز وارد سرورهای ما نمی‌شود. + secure_note: "پرداخت امن با Mollie. جزئیات کارت هرگز به سرورهای ما منتقل نمی‌شود." error_amount: لطفاً مبلغ معتبری وارد کنید. error_amount_range: مبلغی بین {min} و {max} وارد کنید. - other_ways: روش‌های دیگر کمک مالی (PayPal، انتقال بانکی، رمزارز…) + other_ways: "سایر روش‌های اهداء" + form_title: "کمک مالی" + other_preset_label: "دیگر" + email_why_once: "برای تأیید اهداء. بدون بازاریابی." + recurrence_once: "{amount} · یک‌باره" + recurrence_month: "{amount} اکنون، سپس هر ماه تا زمانی که کمک مالی را لغو کنید." + recurrence_year: "{amount} اکنون، سپس هر سال تا زمانی که کمک مالی را لغو کنید." + canceled_notice: "پرداخت شما لغو شد. می‌توانید دوباره تلاش کنید یا روش دیگری برای اهدای کمک انتخاب کنید." --- -Organic Maps به لطف کمک‌های شما برای همه رایگان است. بدون تبلیغات. بدون ردیاب. متن‌باز. \ No newline at end of file +Organic Maps به لطف کمک‌های شما برای همه رایگان است. بدون تبلیغات. بدون ردیاب. متن‌باز. diff --git a/content/donate/subscribe/index.fr.md b/content/donate/subscribe/index.fr.md index 9f2a2c06a..e953337c8 100644 --- a/content/donate/subscribe/index.fr.md +++ b/content/donate/subscribe/index.fr.md @@ -13,9 +13,9 @@ extra: amount_label: Montant other_label: Autre montant currency_label: Devise - email_label: E-mail (recommandé) - email_why: Nous t’enverrons une confirmation, un rappel avant chaque prélèvement et un lien d’annulation en un clic. Rien d’autre — pas de marketing. - email_warning: Sans e-mail, nous ne pouvons envoyer ni rappels de paiement ni lien d’annulation — tu devrais nous contacter pour annuler. + email_label: "E-mail (facultatif)" + email_why: "Tu recevras une confirmation, des rappels et un lien pour te désabonner. Pas de pub." + email_warning: "Sans adresse e-mail, contacte-nous pour annuler ton don régulier." name_label: Nom (facultatif) name_why: Pour pouvoir t’adresser le message de remerciement. submit: Continuer vers le paiement sécurisé @@ -23,10 +23,17 @@ extra: submit_month: Donner {amount} par mois submit_year: Donner {amount} par an submit_loading: Redirection vers le paiement sécurisé… - secure_note: Tu finaliseras le paiement chez Mollie, notre prestataire de paiement. Les données de carte ne touchent jamais nos serveurs. + secure_note: "Paiement sécurisé via Mollie. Les données de ta carte ne passent jamais par nos serveurs." error_amount: Saisis un montant valide. error_amount_range: Saisis un montant entre {min} et {max}. - other_ways: Autres façons de donner (PayPal, virement, crypto…) + other_ways: "Autres moyens de faire un don" + form_title: "Faire un don" + other_preset_label: "Autre" + email_why_once: "Pour recevoir une attestation de don. Pas de pub." + recurrence_once: "{amount} · Ponctuel" + recurrence_month: "{amount} maintenant, puis chaque mois jusqu’à l’annulation de ton don." + recurrence_year: "{amount} maintenant, puis chaque année jusqu’à l’annulation de ton don." + canceled_notice: "Ton paiement a été annulé. Tu peux réessayer ou choisir un autre moyen de faire un don." --- L’application Organic Maps est gratuite pour tout le monde grâce à tes dons. Pas de publicité. Pas de trackers. Open-source. diff --git a/content/donate/subscribe/index.gl.md b/content/donate/subscribe/index.gl.md index 5bda6f924..d665df95a 100644 --- a/content/donate/subscribe/index.gl.md +++ b/content/donate/subscribe/index.gl.md @@ -13,9 +13,9 @@ extra: amount_label: Importe other_label: Outro importe currency_label: Moeda - email_label: Correo electrónico (recomendado) - email_why: Enviaremos unha confirmación, lembrarémosche antes de cada cargo e ofrecerémosche un enlace de cancelación cun só clic. Nada máis — sen marketing. - email_warning: Sen un correo electrónico non podemos enviar recordatorios de pago nin un enlace de cancelación — terías que contactar connosco para cancelar. + email_label: "Correo electrónico (opcional)" + email_why: "Recibe unha confirmación, recordatorios e un enlace de cancelación. Sen marketing." + email_warning: "Sen un enderezo de correo electrónico, contacta connosco para cancelar a túa doazón periódica." name_label: Nome (opcional) name_why: Para que poidamos dirixirnos a ti no correo electrónico de agradecemento. submit: Continuar co pago seguro @@ -23,10 +23,17 @@ extra: submit_month: Doa {amount} mensualmente submit_year: Doa {amount} anualmente submit_loading: Redirixindo ao pago seguro… - secure_note: Rematarás o pago en Mollie, o noso provedor de pagos. Os datos da tarxeta nunca chegan aos nosos servidores. + secure_note: "Pago seguro con Mollie. Os datos da tarxeta nunca tocan os nosos servidores." error_amount: Por favor, introduce un importe válido. error_amount_range: Introduce un importe entre {min} e {max}. - other_ways: Outras formas de doar (PayPal, transferencia bancaria, criptomoedas…) + other_ways: "Outras formas de doar" + form_title: "Fai unha doazón" + other_preset_label: "Outro" + email_why_once: "Para a confirmación da doazón. Sen marketing." + recurrence_once: "{amount} · Puntual" + recurrence_month: "{amount} agora, e despois cada mes ata que canceles a doazón." + recurrence_year: "{amount} agora, e despois cada ano ata que canceles a doazón." + canceled_notice: "O teu pago foi cancelado. Podes tentar de novo ou escoller outra forma de doar." --- -Organic Maps é gratuíto para todos grazas ás túas doazóns. Sen anuncios. Sen rastrexadores. Código aberto. \ No newline at end of file +Organic Maps é gratuíto para todos grazas ás túas doazóns. Sen anuncios. Sen rastrexadores. Código aberto. diff --git a/content/donate/subscribe/index.he.md b/content/donate/subscribe/index.he.md index 8dde5bc43..8f177e36e 100644 --- a/content/donate/subscribe/index.he.md +++ b/content/donate/subscribe/index.he.md @@ -13,9 +13,9 @@ extra: amount_label: סכום other_label: סכום אחר currency_label: מטבע - email_label: דוא״ל (מומלץ) - email_why: נשלח לכם אישור, נזכיר לכם לפני כל חיוב וניתן לכם קישור לביטול בלחיצה אחת. זה הכול — ללא שיווק. - email_warning: ללא כתובת דוא״ל לא נוכל לשלוח תזכורות תשלום או קישור לביטול — תצטרכו ליצור איתנו קשר כדי לבטל. + email_label: "דוא\"ל (לא חובה)" + email_why: "קבל אישור, תזכורות וקישור לביטול. ללא פרסומות." + email_warning: "ללא כתובת דוא״ל, אפשר לפנות אלינו כדי לבטל את התרומה הקבועה." name_label: שם (לא חובה) name_why: כדי שנוכל לפנות אליכם במייל התודה. submit: המשיכו לתשלום מאובטח @@ -23,10 +23,17 @@ extra: submit_month: תרמו {amount} מדי חודש submit_year: תרמו {amount} מדי שנה submit_loading: מפנים לתשלום מאובטח… - secure_note: את התשלום תשלימו ב-Mollie, ספק התשלומים שלנו. פרטי הכרטיס לעולם אינם מגיעים לשרתים שלנו. + secure_note: "תשלום מאובטח באמצעות Mollie. פרטי כרטיס האשראי אינם עוברים דרך השרתים שלנו בשום שלב." error_amount: אנא הזינו סכום תקין. error_amount_range: הזינו סכום בין {min} ל-{max}. - other_ways: דרכים נוספות לתרומה (PayPal, העברה בנקאית, קריפטו…) + other_ways: "דרכים נוספות לתרום" + form_title: "לתרום" + other_preset_label: "אחר" + email_why_once: "לקבלת אישור על התרומה. ללא פרסומות." + recurrence_once: "{amount} · חד-פעמית" + recurrence_month: "{amount} עכשיו, ואחר כך מדי חודש עד לביטול התרומה." + recurrence_year: "{amount} עכשיו, ואחר כך מדי שנה עד לביטול התרומה." + canceled_notice: "התשלום שלך בוטל. תוכל לנסות שוב או לבחור דרך אחרת לתרום." --- -Organic Maps זמין בחינם לכולם בזכות התרומות שלכם. ללא פרסומות. ללא רכיבי מעקב. קוד פתוח. \ No newline at end of file +Organic Maps זמין בחינם לכולם בזכות התרומות שלכם. ללא פרסומות. ללא רכיבי מעקב. קוד פתוח. diff --git a/content/donate/subscribe/index.hi.md b/content/donate/subscribe/index.hi.md index 92a877362..fd65c16f2 100644 --- a/content/donate/subscribe/index.hi.md +++ b/content/donate/subscribe/index.hi.md @@ -13,9 +13,9 @@ extra: amount_label: राशि other_label: अन्य राशि currency_label: मुद्रा - email_label: ईमेल (अनुशंसित) - email_why: हम एक पुष्टिकरण भेजेंगे, प्रत्येक चार्ज से पहले आपको याद दिलाएँगे, और एक-क्लिक रद्द करने का लिंक देंगे। बस इतना ही — कोई मार्केटिंग नहीं। - email_warning: ईमेल के बिना हम भुगतान की याद दिलाने वाले संदेश या रद्दीकरण लिंक नहीं भेज सकते — रद्द करने के लिए आपको हमसे संपर्क करना होगा। + email_label: "ईमेल (वैकल्पिक)" + email_why: "पुष्टि, अनुस्मारक और रद्द करने का लिंक प्राप्त करें। कोई मार्केटिंग नहीं।" + email_warning: "ईमेल न देने पर, नियमित दान रद्द करने के लिए हमसे संपर्क करें।" name_label: नाम (वैकल्पिक) name_why: ताकि हम धन्यवाद ईमेल में आपको संबोधित कर सकें। submit: सुरक्षित भुगतान के लिए आगे बढ़ें @@ -23,10 +23,17 @@ extra: submit_month: "{amount} मासिक दान करें" submit_year: "{amount} वार्षिक दान करें" submit_loading: सुरक्षित भुगतान की ओर पुनर्निर्देशित किया जा रहा है… - secure_note: आप भुगतान हमारे भुगतान प्रदाता Mollie पर पूरा करेंगे। कार्ड का विवरण कभी हमारे सर्वर तक नहीं पहुँचता। + secure_note: "Mollie के साथ सुरक्षित भुगतान करें। कार्ड विवरण कभी भी हमारे सर्वर पर नहीं पहुँचते।" error_amount: कृपया एक मान्य राशि दर्ज करें। error_amount_range: "{min} और {max} के बीच की राशि दर्ज करें।" - other_ways: दान करने के अन्य तरीके (PayPal, बैंक हस्तांतरण, क्रिप्टो…) + other_ways: "दान करने के अन्य तरीके" + form_title: "दान करें" + other_preset_label: "अन्य" + email_why_once: "दान की पुष्टि के लिए। कोई विपणन नहीं।" + recurrence_once: "{amount} · एकमुश्त" + recurrence_month: "{amount} अभी, फिर दान रद्द करने तक हर महीने।" + recurrence_year: "{amount} अभी, फिर दान रद्द करने तक हर साल।" + canceled_notice: "आपका भुगतान रद्द कर दिया गया है। आप फिर से प्रयास कर सकते हैं या दान करने का कोई अन्य तरीका चुन सकते हैं।" --- -Organic Maps आपके दान की बदौलत सभी के लिए मुफ़्त है। कोई विज्ञापन नहीं। कोई ट्रैकर नहीं। ओपन सोर्स। \ No newline at end of file +Organic Maps आपके दान की बदौलत सभी के लिए मुफ़्त है। कोई विज्ञापन नहीं। कोई ट्रैकर नहीं। ओपन सोर्स। diff --git a/content/donate/subscribe/index.hu.md b/content/donate/subscribe/index.hu.md index 6cbdec922..1f8cf4d67 100644 --- a/content/donate/subscribe/index.hu.md +++ b/content/donate/subscribe/index.hu.md @@ -13,9 +13,9 @@ extra: amount_label: Összeg other_label: Más összeg currency_label: Pénznem - email_label: E-mail (ajánlott) - email_why: Küldünk visszaigazolást, minden terhelés előtt emlékeztetőt, és egy kattintással lemondható linket. Semmi mást — semmi marketing. - email_warning: E-mail nélkül nem tudunk fizetési emlékeztetőt és lemondó linket küldeni — a lemondáshoz kapcsolatba kellene lépned velünk. + email_label: "E-mail (opcionális)" + email_why: "Visszaigazolás, emlékeztetők és lemondási hivatkozás. Nincs marketing." + email_warning: "Ha nem adsz meg e-mail-címet, keress minket az ismétlődő adomány lemondásához." name_label: Név (nem kötelező) name_why: Hogy megszólíthassunk a köszönő e-mailben. submit: Tovább a biztonságos fizetéshez @@ -23,10 +23,17 @@ extra: submit_month: '{amount} adományozása havonta' submit_year: '{amount} adományozása évente' submit_loading: Átirányítás a biztonságos fizetéshez… - secure_note: A fizetést a Mollie-nál, a fizetési szolgáltatónknál fejezed be. A kártyaadatok soha nem érintik a szervereinket. + secure_note: "Biztonságos fizetés a Mollie oldalon. A kártyaadatok soha nem kerülnek a szerverünkre." error_amount: Adj meg érvényes összeget. error_amount_range: Adj meg egy összeget {min} és {max} között. - other_ways: Más támogatási módok (PayPal, átutalás, kripto…) + other_ways: "Egyéb adományozási lehetőségek" + form_title: "Adományozz" + other_preset_label: "Egyéb" + email_why_once: "Adományozási visszaigazoláshoz. Nincs marketing." + recurrence_once: "{amount} · Egyszeri" + recurrence_month: "{amount} most, majd havonta, amíg le nem mondod az adományt." + recurrence_year: "{amount} most, majd évente, amíg le nem mondod az adományt." + canceled_notice: "A befizetésed törlésre került. Megpróbálhatod újra, vagy választhatsz egy másik adományozási módot." --- Az Organic Maps mindenki számára ingyenes az adományodnak köszönhetően. Nincs reklám. Nincs nyomkövetés. Nyílt forráskódú. diff --git a/content/donate/subscribe/index.id.md b/content/donate/subscribe/index.id.md index fee1aecdb..296844f70 100644 --- a/content/donate/subscribe/index.id.md +++ b/content/donate/subscribe/index.id.md @@ -13,9 +13,9 @@ extra: amount_label: Jumlah other_label: Jumlah lain currency_label: Mata uang - email_label: Email (disarankan) - email_why: Kami akan mengirimkan konfirmasi, mengingatkan kamu sebelum setiap penagihan, dan memberikan tautan pembatalan satu klik. Tidak ada yang lain — tanpa pemasaran. - email_warning: Tanpa alamat email, kami tidak dapat mengirimkan pengingat pembayaran atau tautan pembatalan — kamu harus menghubungi kami untuk membatalkannya. + email_label: "Email (opsional)" + email_why: "Dapatkan konfirmasi, pengingat, dan tautan pembatalan. Tanpa promosi." + email_warning: "Tanpa alamat email, hubungi kami untuk membatalkan donasi rutin kamu." name_label: Nama (opsional) name_why: Agar kami dapat menyapa kamu dalam email ucapan terima kasih. submit: Lanjutkan ke pembayaran aman @@ -23,10 +23,17 @@ extra: submit_month: Donasi {amount} setiap bulan submit_year: Donasi {amount} setiap tahun submit_loading: Sedang dialihkan ke halaman pembayaran yang aman… - secure_note: Kamu akan menyelesaikan pembayaran melalui Mollie, penyedia layanan pembayaran kami. Detail kartu kamu tidak pernah tersimpan di server kami. + secure_note: "Pembayaran aman melalui Mollie. Rincian kartu tidak pernah tersimpan di server kami." error_amount: Silakan masukkan jumlah yang valid. error_amount_range: Masukkan jumlah antara {min} dan {max}. - other_ways: Cara lain untuk berdonasi (PayPal, transfer bank, kripto…) + other_ways: "Cara lain untuk berdonasi" + form_title: "Berikan donasi" + other_preset_label: "Lainnya" + email_why_once: "Untuk konfirmasi donasi. Tanpa promosi." + recurrence_once: "{amount} · Sekali saja" + recurrence_month: "{amount} sekarang, lalu setiap bulan sampai kamu membatalkan donasinya." + recurrence_year: "{amount} sekarang, lalu setiap tahun sampai kamu membatalkan donasinya." + canceled_notice: "Pembayaran kamu telah dibatalkan. Kamu dapat mencoba lagi atau memilih cara lain untuk berdonasi." --- -Organic Maps gratis untuk semua orang berkat donasi kamu. Tanpa iklan. Tanpa pelacak. Sumber terbuka. \ No newline at end of file +Organic Maps gratis untuk semua orang berkat donasi kamu. Tanpa iklan. Tanpa pelacak. Sumber terbuka. diff --git a/content/donate/subscribe/index.it.md b/content/donate/subscribe/index.it.md index 4535bdd50..57a97e60a 100644 --- a/content/donate/subscribe/index.it.md +++ b/content/donate/subscribe/index.it.md @@ -13,9 +13,9 @@ extra: amount_label: Importo other_label: Altro importo currency_label: Valuta - email_label: E-mail (consigliata) - email_why: Ti invieremo una conferma, un promemoria prima di ogni addebito e un link per annullare con un clic. Nient’altro — niente marketing. - email_warning: Senza e-mail non possiamo inviare promemoria di pagamento né un link di annullamento — per annullare dovresti contattarci. + email_label: "Email (facoltativa)" + email_why: "Ricevi una conferma, dei promemoria e un link per annullare l’iscrizione. Niente pubblicità." + email_warning: "Senza un indirizzo e-mail, contattaci per annullare la tua donazione ricorrente." name_label: Nome (facoltativo) name_why: Per rivolgerci a te nell’e-mail di ringraziamento. submit: Continua al pagamento sicuro @@ -23,10 +23,17 @@ extra: submit_month: Dona {amount} al mese submit_year: Dona {amount} all’anno submit_loading: Reindirizzamento al pagamento sicuro… - secure_note: Completerai il pagamento su Mollie, il nostro fornitore di pagamenti. I dati della carta non toccano mai i nostri server. + secure_note: "Pagamento sicuro con Mollie. I dati della carta non passano mai dai nostri server." error_amount: Inserisci un importo valido. error_amount_range: Inserisci un importo tra {min} e {max}. - other_ways: Altri modi per donare (PayPal, bonifico, cripto…) + other_ways: "Altri modi per donare" + form_title: "Fai una donazione" + other_preset_label: "Altro" + email_why_once: "Per ricevere la conferma della donazione. Nessuna comunicazione commerciale." + recurrence_once: "{amount} · Una tantum" + recurrence_month: "{amount} ora, poi ogni mese fino all’annullamento della donazione." + recurrence_year: "{amount} ora, poi ogni anno fino all’annullamento della donazione." + canceled_notice: "Il tuo pagamento è stato annullato. Puoi riprovare oppure scegliere un altro modo per fare una donazione." --- L’app Organic Maps è gratuita per tutti grazie alle tue donazioni. Nessuna pubblicità. Nessun tracker. Open-source. diff --git a/content/donate/subscribe/index.ja.md b/content/donate/subscribe/index.ja.md index 94ec57a5c..d38585217 100644 --- a/content/donate/subscribe/index.ja.md +++ b/content/donate/subscribe/index.ja.md @@ -13,9 +13,9 @@ extra: amount_label: 金額 other_label: その他の金額 currency_label: 通貨 - email_label: メールアドレス(推奨) - email_why: 確認メールをお送りし、請求の前に毎回お知らせするとともに、ワンクリックで解約できるリンクをご案内します。それ以外のメール(マーケティングなど)はお送りしません。 - email_warning: メールアドレスをご入力いただかない場合、支払い前のお知らせや解約用リンクをお送りできません。解約するには、当プロジェクトへご連絡いただく必要があります。 + email_label: "メールアドレス(任意)" + email_why: "確認メール、リマインダー、およびキャンセル用リンクが届く。マーケティングメールは送られない。" + email_warning: "メールアドレスを入力しない場合、定期寄付を取り消すには連絡が必要。" name_label: 名前(任意) name_why: お礼のメールでお名前を添えるためです。 submit: 安全な決済に進む @@ -23,10 +23,17 @@ extra: submit_month: 毎月 {amount} を寄付する submit_year: 毎年 {amount} を寄付する submit_loading: 安全な決済ページに移動しています… - secure_note: 決済は、決済代行サービス Mollie のサイトで完了します。カード情報が当プロジェクトのサーバーを通ることはありません。 + secure_note: "Mollie による安全な決済。カード情報は当社のサーバーには一切保存されない。" error_amount: 有効な金額を入力してください。 error_amount_range: "{min} から {max} の範囲で金額を入力してください。" - other_ways: その他の寄付方法(PayPal、銀行振込、暗号資産など) + other_ways: "その他の寄付方法" + form_title: "寄付をする" + other_preset_label: "その他" + email_why_once: "寄付の確認用。営業目的ではない。" + recurrence_once: "{amount} · 1回限り" + recurrence_month: "{amount}を今寄付し、その後は取り消すまで毎月寄付。" + recurrence_year: "{amount}を今寄付し、その後は取り消すまで毎年寄付。" + canceled_notice: "お支払いはキャンセルされた。再度試すか、別の寄付方法を選択できる。" --- 皆さまの寄付により、Organic Maps は誰でも無料で利用できます。広告なし。トラッカーなし。オープンソース。 diff --git a/content/donate/subscribe/index.lt.md b/content/donate/subscribe/index.lt.md index 7e3eea3e0..6f4abe759 100644 --- a/content/donate/subscribe/index.lt.md +++ b/content/donate/subscribe/index.lt.md @@ -13,9 +13,9 @@ extra: amount_label: Suma other_label: Kita suma currency_label: Valiuta - email_label: El. paštas (rekomenduojama) - email_why: Atsiųsime patvirtinimą, priminimą prieš kiekvieną nurašymą ir atšaukimo nuorodą vienu paspaudimu. Nieko daugiau — jokios rinkodaros. - email_warning: Be el. pašto negalime siųsti mokėjimo priminimų ar atšaukimo nuorodos — norėdami atšaukti, turėtumėte susisiekti su mumis. + email_label: "El. paštas (neprivaloma)" + email_why: "Gausite patvirtinimą, priminimus ir nuorodą atšaukti. Jokių reklaminių pranešimų." + email_warning: "Nenurodę el. pašto, susisiekite su mumis dėl periodinės aukos atšaukimo." name_label: Vardas (nebūtina) name_why: Kad galėtume kreiptis į jus padėkos laiške. submit: Tęsti į saugų mokėjimą @@ -23,10 +23,17 @@ extra: submit_month: Aukoti {amount} kas mėnesį submit_year: Aukoti {amount} kasmet submit_loading: Nukreipiama į saugų mokėjimą… - secure_note: Mokėjimą užbaigsite Mollie — mūsų mokėjimų teikėjo — puslapyje. Kortelės duomenys niekada nepasiekia mūsų serverių. + secure_note: "Saugus mokėjimas naudojant Mollie. Kortelės duomenys niekada nepasiekia mūsų serverių." error_amount: Įveskite tinkamą sumą. error_amount_range: Įveskite sumą nuo {min} iki {max}. - other_ways: Kiti paramos būdai (PayPal, pavedimas, kriptovaliutos…) + other_ways: "Kiti būdai paaukoti" + form_title: "Paaukokite" + other_preset_label: "Kita" + email_why_once: "Norėdami gauti patvirtinimą apie auką. Jokių reklamos pranešimų." + recurrence_once: "{amount} · Vienkartinė" + recurrence_month: "{amount} dabar, vėliau kas mėnesį, kol auką atšauksite." + recurrence_year: "{amount} dabar, vėliau kasmet, kol auką atšauksite." + canceled_notice: "Jūsų mokėjimas buvo atšauktas. Galite pabandyti dar kartą arba pasirinkti kitą aukojimo būdą." --- Organic Maps programa nemokama visiems jūsų aukų dėka. Jokių reklamų. Jokių sekiklių. Atviras kodas. diff --git a/content/donate/subscribe/index.md b/content/donate/subscribe/index.md index 7d25d9360..68af949ef 100644 --- a/content/donate/subscribe/index.md +++ b/content/donate/subscribe/index.md @@ -6,16 +6,19 @@ weight: 110 extra: preview_image: donate/donate.png form: + form_title: Make a donation interval_label: How often? once: One-time monthly: Monthly yearly: Yearly amount_label: Amount other_label: Other amount + other_preset_label: Other currency_label: Currency - email_label: Email (recommended) - email_why: We’ll send a confirmation, remind you before each charge, and give you a one-click cancel link. Nothing else — no marketing. - email_warning: Without an email we can’t send payment reminders or a cancellation link — you would need to contact us to cancel. + email_label: Email (optional) + email_why: Get a confirmation, reminders and a cancel link. No marketing. + email_why_once: For a donation confirmation. No marketing. + email_warning: Without email, contact us to cancel your recurring donation. name_label: Name (optional) name_why: So we can address you in the thank-you email. submit: Continue to secure payment @@ -23,10 +26,14 @@ extra: submit_month: Donate {amount} monthly submit_year: Donate {amount} yearly submit_loading: Redirecting to secure payment… - secure_note: You’ll finish the payment on Mollie, our payment provider. Card details never touch our servers. + secure_note: Secure payment with Mollie. Card details never touch our servers. error_amount: Please enter a valid amount. error_amount_range: Enter an amount between {min} and {max}. - other_ways: Other ways to donate (PayPal, bank transfer, crypto…) + other_ways: Other ways to donate + recurrence_once: '{amount} · One-time' + recurrence_month: '{amount} now, then monthly until you cancel.' + recurrence_year: '{amount} now, then yearly until you cancel.' + canceled_notice: Your payment was canceled. You can try again or choose another way to donate. --- Organic Maps is free for everyone thanks to your donations. No ads. No trackers. Open source. diff --git a/content/donate/subscribe/index.ml.md b/content/donate/subscribe/index.ml.md index 44966dab7..c3138204c 100644 --- a/content/donate/subscribe/index.ml.md +++ b/content/donate/subscribe/index.ml.md @@ -13,9 +13,9 @@ extra: amount_label: തുക other_label: മറ്റൊരു തുക currency_label: കറൻസി - email_label: ഇമെയിൽ (ശുപാർശ ചെയ്യുന്നു) - email_why: ഞങ്ങൾ ഒരു സ്ഥിരീകരണം അയയ്‌ക്കും, ഓരോ ചാർജിനും മുമ്പായി നിങ്ങളെ ഓർമ്മിപ്പിക്കും, ഒറ്റ ക്ലിക്കിൽ റദ്ദാക്കാനുള്ള ഒരു ലിങ്ക് നൽകും. അത്രമാത്രം — വിപണന സന്ദേശങ്ങളൊന്നുമില്ല. - email_warning: ഇമെയിൽ ഇല്ലെങ്കിൽ ഞങ്ങൾക്ക് പണമടയ്ക്കാനുള്ള ഓർമ്മപ്പെടുത്തലുകളോ റദ്ദാക്കാനുള്ള ലിങ്കോ അയക്കാൻ കഴിയില്ല — റദ്ദാക്കുന്നതിന് നിങ്ങൾ ഞങ്ങളെ ബന്ധപ്പെടേണ്ടിവരും. + email_label: "ഇമെയിൽ (ഓപ്ഷണൽ)" + email_why: "സ്ഥിരീകരണവും ഓർമ്മപ്പെടുത്തലുകളും റദ്ദാക്കാനുള്ള ലിങ്കും ലഭിക്കും. മാർക്കറ്റിംഗില്ല." + email_warning: "ഇമെയിൽ നൽകുന്നില്ലെങ്കിൽ, ആവർത്തന സംഭാവന റദ്ദാക്കാൻ ഞങ്ങളെ ബന്ധപ്പെടുക." name_label: പേര് (ഓപ്ഷണൽ) name_why: നന്ദി അറിയിക്കുന്ന ഇമെയിലിൽ നിങ്ങളെ അഭിസംബോധന ചെയ്യാൻ വേണ്ടി. submit: സുരക്ഷിത പേയ്‌മെന്റിലേക്ക് തുടരുക @@ -23,10 +23,17 @@ extra: submit_month: പ്രതിമാസം {amount} സംഭാവന ചെയ്യുക submit_year: പ്രതിവർഷം {amount} സംഭാവന ചെയ്യുക submit_loading: സുരക്ഷിത പേയ്‌മെന്റിലേക്ക് മാറ്റുന്നു… - secure_note: ഞങ്ങളുടെ പേയ്‌മെന്റ് ദാതാവായ Mollie-യിൽ വെച്ചാണ് നിങ്ങൾ പണമടയ്ക്കൽ പൂർത്തിയാക്കുന്നത്. കാർഡ് വിവരങ്ങൾ ഒരിക്കലും ഞങ്ങളുടെ സെർവറുകളിൽ എത്തുന്നില്ല. + secure_note: "Mollie ഉപയോഗിച്ച് സുരക്ഷിതമായ പേയ്മെൻ്റ്. കാർഡ് വിവരങ്ങൾ ഒരിക്കലും ഞങ്ങളുടെ സെർവറുകളിൽ എത്തുന്നില്ല." error_amount: ദയവായി സാധുവായ ഒരു തുക നൽകുക. error_amount_range: "{min}-നും {max}-നും ഇടയിൽ ഒരു തുക നൽകുക." - other_ways: സംഭാവന നൽകാനുള്ള മറ്റ് വഴികൾ (PayPal, ബാങ്ക് ട്രാൻസ്ഫർ, ക്രിപ്റ്റോ…) + other_ways: "സംഭാവന നൽകാനുള്ള മറ്റ് വഴികൾ" + form_title: "സംഭാവന നൽകുക" + other_preset_label: "മറ്റുള്ളവ" + email_why_once: "സംഭാവനയുടെ സ്ഥിരീകരണത്തിനായി. വിപണനത്തിനായി അല്ല." + recurrence_once: "{amount} · ഒറ്റത്തവണ" + recurrence_month: "{amount} ഇപ്പോൾ, തുടർന്ന് സംഭാവന റദ്ദാക്കുന്നതുവരെ എല്ലാ മാസവും." + recurrence_year: "{amount} ഇപ്പോൾ, തുടർന്ന് സംഭാവന റദ്ദാക്കുന്നതുവരെ എല്ലാ വർഷവും." + canceled_notice: "നിങ്ങളുടെ പേയ്‌മെൻ്റ് റദ്ദാക്കപ്പെട്ടു. നിങ്ങൾക്ക് വീണ്ടും ശ്രമിക്കുകയോ സംഭാവന നൽകുന്നതിനായി മറ്റൊരു മാർഗ്ഗം തിരഞ്ഞെടുക്കുകയോ ചെയ്യാം." --- -നിങ്ങളുടെ സംഭാവനകൾക്ക് നന്ദി, Organic Maps എല്ലാവർക്കും സൗജന്യമാണ്. പരസ്യങ്ങളില്ല. ട്രാക്കറുകളില്ല. ഓപ്പൺ സോഴ്സ്. \ No newline at end of file +നിങ്ങളുടെ സംഭാവനകൾക്ക് നന്ദി, Organic Maps എല്ലാവർക്കും സൗജന്യമാണ്. പരസ്യങ്ങളില്ല. ട്രാക്കറുകളില്ല. ഓപ്പൺ സോഴ്സ്. diff --git a/content/donate/subscribe/index.mr.md b/content/donate/subscribe/index.mr.md index dddac6159..ea3bfcef3 100644 --- a/content/donate/subscribe/index.mr.md +++ b/content/donate/subscribe/index.mr.md @@ -13,9 +13,9 @@ extra: amount_label: रक्कम other_label: इतर रक्कम currency_label: चलन - email_label: ईमेल (शिफारस केलेले) - email_why: आम्ही पुष्टीकरण पाठवू, प्रत्येक चार्जपूर्वी तुम्हाला स्मरण करून देऊ, आणि एक-क्लिक रद्द करण्याची लिंक देऊ. इतकेच — कोणतेही मार्केटिंग नाही. - email_warning: ईमेलशिवाय आम्ही पेमेंट स्मरणपत्रे किंवा रद्द करण्याची लिंक पाठवू शकत नाही — रद्द करण्यासाठी तुम्हाला आमच्याशी संपर्क साधावा लागेल. + email_label: "ईमेल (ऐच्छिक)" + email_why: "पुष्टी, स्मरणपत्रे आणि रद्द करण्याचा दुवा मिळवा. कोणतेही विपणन नाही." + email_warning: "ईमेल न दिल्यास, नियमित देणगी रद्द करण्यासाठी आमच्याशी संपर्क साधा." name_label: नाव (ऐच्छिक) name_why: जेणेकरून आम्ही तुम्हाला धन्यवाद ईमेलमध्ये संबोधित करू शकू. submit: सुरक्षित पेमेंटकडे पुढे जा @@ -23,10 +23,17 @@ extra: submit_month: "{amount} मासिक देणगी द्या" submit_year: "{amount} वार्षिक देणगी द्या" submit_loading: सुरक्षित पेमेंटसाठी पुनर्निर्देशित करत आहे… - secure_note: तुम्ही आमचे पेमेंट प्रदाता Mollie वर पेमेंट पूर्ण कराल. कार्ड तपशील कधीही आमच्या सर्व्हरवर येत नाहीत. + secure_note: "Mollie सह सुरक्षित पेमेंट. कार्ड तपशील कधीही आमच्या सर्व्हरवर येत नाहीत." error_amount: कृपया वैध रक्कम प्रविष्ट करा. error_amount_range: "{min} ते {max} या दरम्यानची रक्कम प्रविष्ट करा." - other_ways: दान करण्याचे इतर मार्ग (PayPal, बँक हस्तांतरण, क्रिप्टो…) + other_ways: "दान करण्याचे इतर मार्ग" + form_title: "दान करा" + other_preset_label: "इतर" + email_why_once: "दान पुष्टीकरणासाठी. विपणनासाठी नाही." + recurrence_once: "{amount} · एकदाच" + recurrence_month: "{amount} आता, त्यानंतर देणगी रद्द करेपर्यंत दरमहा." + recurrence_year: "{amount} आता, त्यानंतर देणगी रद्द करेपर्यंत दरवर्षी." + canceled_notice: "तुमचे पेमेंट रद्द करण्यात आले आहे. तुम्ही पुन्हा प्रयत्न करू शकता किंवा देणगी देण्यासाठी दुसरा मार्ग निवडू शकता." --- -तुमच्या देणग्यांमुळे Organic Maps सर्वांसाठी मोफत आहे. कोणतीही जाहिरात नाही. कोणतेही ट्रॅकर नाहीत. मुक्त स्रोत. \ No newline at end of file +तुमच्या देणग्यांमुळे Organic Maps सर्वांसाठी मोफत आहे. कोणतीही जाहिरात नाही. कोणतेही ट्रॅकर नाहीत. मुक्त स्रोत. diff --git a/content/donate/subscribe/index.nl.md b/content/donate/subscribe/index.nl.md index 5a610c4b0..0ef8c90e5 100644 --- a/content/donate/subscribe/index.nl.md +++ b/content/donate/subscribe/index.nl.md @@ -13,9 +13,9 @@ extra: amount_label: Bedrag other_label: Ander bedrag currency_label: Valuta - email_label: E-mail (aanbevolen) - email_why: We sturen je een bevestiging, herinneren je vóór elke afschrijving en geven je een opzeglink met één klik. Verder niets — geen marketing. - email_warning: Zonder e-mail kunnen we geen betalingsherinneringen of opzeglink sturen — om op te zeggen zou je contact met ons moeten opnemen. + email_label: "E-mail (optioneel)" + email_why: "Je krijgt een bevestiging, herinneringen en een link om af te melden. Geen marketing." + email_warning: "Zonder e-mailadres moet je contact met ons opnemen om je periodieke donatie stop te zetten." name_label: Naam (optioneel) name_why: Zodat we je persoonlijk kunnen bedanken in de e-mail. submit: Doorgaan naar veilige betaling @@ -23,10 +23,17 @@ extra: submit_month: Doneer {amount} per maand submit_year: Doneer {amount} per jaar submit_loading: Doorsturen naar veilige betaling… - secure_note: Je rondt de betaling af bij Mollie, onze betaalprovider. Kaartgegevens bereiken onze servers nooit. + secure_note: "Veilig betalen via Mollie. Je kaartgegevens komen nooit op onze servers terecht." error_amount: Voer een geldig bedrag in. error_amount_range: Voer een bedrag in tussen {min} en {max}. - other_ways: Andere manieren om te doneren (PayPal, overschrijving, crypto…) + other_ways: "Andere manieren om te doneren" + form_title: "Doneer" + other_preset_label: "Overig" + email_why_once: "Voor een donatiebevestiging. Geen reclame." + recurrence_once: "{amount} · Eenmalig" + recurrence_month: "{amount} nu, daarna elke maand totdat je de donatie stopzet." + recurrence_year: "{amount} nu, daarna elk jaar totdat je de donatie stopzet." + canceled_notice: "Je betaling is geannuleerd. Je kunt het nog eens proberen of een andere manier kiezen om te doneren." --- De Organic Maps app is gratis voor iedereen dankzij je donaties. Geen advertenties. Geen trackers. Open-source. diff --git a/content/donate/subscribe/index.oc.md b/content/donate/subscribe/index.oc.md index 1953ac0da..451d133a8 100644 --- a/content/donate/subscribe/index.oc.md +++ b/content/donate/subscribe/index.oc.md @@ -13,9 +13,9 @@ extra: amount_label: Montant other_label: Autre montant currency_label: Moneda - email_label: Corrièr electronic (recomandat) - email_why: Te mandarem una confirmacion, te remembrarem abans cada prelevament, e te balharem un ligam d’anullacion amb un sol clic. Res mai — pas de marketing. - email_warning: Sens adreça de corrièr electronic, te podèm pas mandar de rapèls de pagament ni un ligam d’anullacion — caldriá que nos contactes per anullar. + email_label: "Corrièr electronic (opcional)" + email_why: "Recebràs una confirmacion, de rapèls e un ligam per anullar. Pas de publicitat." + email_warning: "Sens adreça de corrièr electronic, contacta-nos per anullar ton don regular." name_label: Nom (opcional) name_why: Per poder nos adreçar a tu dins lo corrièr electronic de mercejament. submit: Contunhar cap al pagament securizat @@ -23,10 +23,17 @@ extra: submit_month: Dona {amount} cada mes submit_year: Dona {amount} cada an submit_loading: Redireccion cap al pagament securizat… - secure_note: Acabaràs lo pagament sus Mollie, nòstre prestador de pagaments. Las informacions de ta carta tocan pas jamai nòstres servidors. + secure_note: "Pagament segur amb Mollie. Los detalhs de la carta non tocan jamai nòstres servidors." error_amount: Indica un montant valid. error_amount_range: Indica un montant entre {min} e {max}. - other_ways: Autras manièras de donar (PayPal, transferiment bancari, criptomoneda…) + other_ways: "Autras manièras de donar" + form_title: "Fai un don" + other_preset_label: "Autre" + email_why_once: "Per la confirmacion de la donacion. Pas de marketing." + recurrence_once: "{amount} · Un còp" + recurrence_month: "{amount} ara, puèi cada mes fins que tu anulles lo don." + recurrence_year: "{amount} ara, puèi cada an fins que tu anulles lo don." + canceled_notice: "Ton pagament es estat anullat. Pòdes tornar ensajar o causir una autra manièra de donar." --- -Organic Maps es gratuit per totes gràcias a tas donacions. Pas de publicitat. Pas de traçaires. Còdi dobèrt. \ No newline at end of file +Organic Maps es gratuit per totes gràcias a tas donacions. Pas de publicitat. Pas de traçaires. Còdi dobèrt. diff --git a/content/donate/subscribe/index.pl.md b/content/donate/subscribe/index.pl.md index f3dde2ba5..1154f154e 100644 --- a/content/donate/subscribe/index.pl.md +++ b/content/donate/subscribe/index.pl.md @@ -13,9 +13,9 @@ extra: amount_label: Kwota other_label: Inna kwota currency_label: Waluta - email_label: E-mail (zalecany) - email_why: Wyślemy potwierdzenie, przypomnienie przed każdym obciążeniem i link do anulowania jednym kliknięciem. Nic więcej — żadnego marketingu. - email_warning: Bez adresu e-mail nie możemy wysyłać przypomnień o płatnościach ani linku do anulowania — aby zrezygnować, trzeba by się z nami skontaktować. + email_label: "E-mail (opcjonalnie)" + email_why: "Otrzymasz potwierdzenie, przypomnienia i link do anulowania. Żadnych wiadomości marketingowych." + email_warning: "Bez adresu e-mail skontaktuj się z nami, aby anulować regularną darowiznę." name_label: Imię (opcjonalnie) name_why: Abyśmy mogli zwrócić się do Ciebie w wiadomości z podziękowaniem. submit: Przejdź do bezpiecznej płatności @@ -23,10 +23,17 @@ extra: submit_month: Przekazuj {amount} miesięcznie submit_year: Przekazuj {amount} rocznie submit_loading: Przekierowywanie do bezpiecznej płatności… - secure_note: Płatność dokończysz w Mollie, naszym operatorze płatności. Dane karty nigdy nie trafiają na nasze serwery. + secure_note: "Bezpieczna płatność przez Mollie. Dane karty nigdy nie trafiają na nasze serwery." error_amount: Podaj prawidłową kwotę. error_amount_range: Podaj kwotę od {min} do {max}. - other_ways: Inne sposoby wsparcia (PayPal, przelew, kryptowaluty…) + other_ways: "Inne sposoby przekazania darowizny" + form_title: "Przekaż darowiznę" + other_preset_label: "Inne" + email_why_once: "Potwierdzenie wpłaty. Żadnych wiadomości marketingowych." + recurrence_once: "{amount} · Jednorazowo" + recurrence_month: "{amount} teraz, potem co miesiąc, aż anulujesz darowiznę." + recurrence_year: "{amount} teraz, potem co rok, aż anulujesz darowiznę." + canceled_notice: "Twoja płatność została anulowana. Możesz spróbować jeszcze raz albo wybrać inną formę wpłaty." --- Aplikacja Organic Maps jest darmowa dla wszystkich dzięki twoim darowiznom. Bez reklam. Bez śledzenia. Open source. diff --git a/content/donate/subscribe/index.pt-BR.md b/content/donate/subscribe/index.pt-BR.md index ecb0455c5..af9a261a0 100644 --- a/content/donate/subscribe/index.pt-BR.md +++ b/content/donate/subscribe/index.pt-BR.md @@ -13,9 +13,9 @@ extra: amount_label: Valor other_label: Outro valor currency_label: Moeda - email_label: E-mail (recomendado) - email_why: Vamos te enviar uma confirmação, te lembrar antes de cada cobrança e te dar um link para cancelar com um clique. Só isso — nada de marketing. - email_warning: Sem um e-mail, não podemos enviar lembretes de pagamento nem um link de cancelamento — você precisaria entrar em contato conosco para cancelar. + email_label: "E-mail (opcional)" + email_why: "Receba uma confirmação, lembretes e um link para cancelar. Sem propaganda." + email_warning: "Sem endereço de e-mail, entre em contato conosco para cancelar sua doação recorrente." name_label: Nome (opcional) name_why: Assim, podemos nos dirigir a você no e-mail de agradecimento. submit: Continuar para o pagamento seguro @@ -23,10 +23,17 @@ extra: submit_month: Doar {amount} por mês submit_year: Doar {amount} por ano submit_loading: Redirecionando para o pagamento seguro… - secure_note: Você vai concluir o pagamento no Mollie, nosso provedor de pagamentos. Os dados do cartão nunca passam pelos nossos servidores. + secure_note: "Pagamento seguro com o Mollie. Os dados do cartão nunca passam pelos nossos servidores." error_amount: Por favor, digite um valor válido. error_amount_range: Digite um valor entre {min} e {max}. - other_ways: Outras formas de doar (PayPal, transferência bancária, criptomoedas…) + other_ways: "Outras formas de doar" + form_title: "Faça uma doação" + other_preset_label: "Outro" + email_why_once: "Para receber uma confirmação da doação. Sem marketing." + recurrence_once: "{amount} · Única" + recurrence_month: "{amount} agora, depois todos os meses até você cancelar a doação." + recurrence_year: "{amount} agora, depois todos os anos até você cancelar a doação." + canceled_notice: "Seu pagamento foi cancelado. Você pode tentar de novo ou escolher outra forma de doar." --- -Organic Maps é gratuito para todo mundo graças às suas doações. Sem anúncios. Sem rastreadores. Código aberto. \ No newline at end of file +Organic Maps é gratuito para todo mundo graças às suas doações. Sem anúncios. Sem rastreadores. Código aberto. diff --git a/content/donate/subscribe/index.pt.md b/content/donate/subscribe/index.pt.md index efe424fd2..18a2bcf46 100644 --- a/content/donate/subscribe/index.pt.md +++ b/content/donate/subscribe/index.pt.md @@ -13,9 +13,9 @@ extra: amount_label: Valor other_label: Outro valor currency_label: Moeda - email_label: E-mail (recomendado) - email_why: Enviaremos uma confirmação, um lembrete antes de cada cobrança e um link para cancelar com um clique. Nada mais — sem marketing. - email_warning: Sem e-mail não podemos enviar lembretes de pagamento nem um link de cancelamento — para cancelar terias de nos contactar. + email_label: "E-mail (opcional)" + email_why: "Recebe uma confirmação, lembretes e um link para cancelar. Sem publicidade." + email_warning: "Sem endereço de e-mail, contacta-nos para cancelar o teu donativo recorrente." name_label: Nome (opcional) name_why: Para nos dirigirmos a ti no e-mail de agradecimento. submit: Continuar para o pagamento seguro @@ -23,10 +23,17 @@ extra: submit_month: Doar {amount} por mês submit_year: Doar {amount} por ano submit_loading: A redirecionar para o pagamento seguro… - secure_note: Concluirás o pagamento na Mollie, o nosso fornecedor de pagamentos. Os dados do cartão nunca tocam os nossos servidores. + secure_note: "Pagamento seguro através do Mollie. Os dados do cartão nunca passam pelos nossos servidores." error_amount: Introduz um valor válido. error_amount_range: Introduz um valor entre {min} e {max}. - other_ways: Outras formas de doar (PayPal, transferência, cripto…) + other_ways: "Outras formas de fazer uma doação" + form_title: "Faz uma doação" + other_preset_label: "Outro" + email_why_once: "Para receberes uma confirmação da doação. Sem publicidade." + recurrence_once: "{amount} · Única" + recurrence_month: "{amount} agora, depois todos os meses até cancelares o donativo." + recurrence_year: "{amount} agora, depois todos os anos até cancelares o donativo." + canceled_notice: "O teu pagamento foi cancelado. Podes tentar novamente ou escolher outra forma de fazer uma doação." --- A app Organic Maps é gratuita para todos graças às tuas doações. Sem anúncios. Sem rastreadores. Código aberto. diff --git a/content/donate/subscribe/index.ru.md b/content/donate/subscribe/index.ru.md index f2dfeade5..dfc7638ab 100644 --- a/content/donate/subscribe/index.ru.md +++ b/content/donate/subscribe/index.ru.md @@ -13,9 +13,9 @@ extra: amount_label: Сумма other_label: Другая сумма currency_label: Валюта - email_label: Электронная почта (рекомендуется) - email_why: Мы отправим подтверждение, напомним перед каждым списанием и дадим ссылку для отмены в один клик. Ничего больше — никакого маркетинга. - email_warning: Без адреса электронной почты мы не сможем присылать напоминания о платежах и ссылку для отмены — вам придётся связаться с нами, чтобы отменить пожертвование. + email_label: "Электронная почта (необязательно)" + email_why: "Подтверждение, напоминания и ссылка для отмены. Без рекламы." + email_warning: "Без адреса почты для отмены регулярного пожертвования нужно связаться с нами." name_label: Имя (необязательно) name_why: Чтобы мы могли обратиться к вам по имени в благодарственном письме. submit: Перейти к безопасной оплате @@ -23,10 +23,17 @@ extra: submit_month: Пожертвовать {amount} ежемесячно submit_year: Пожертвовать {amount} ежегодно submit_loading: Перенаправление на страницу безопасной оплаты… - secure_note: Вы завершите оплату на стороне Mollie, нашего платёжного провайдера. Данные карты никогда не попадают на наши серверы. + secure_note: "Безопасная оплата через Mollie. Данные вашей карты никогда не попадают на наши серверы." error_amount: Пожалуйста, введите корректную сумму. error_amount_range: Введите сумму от {min} до {max}. - other_ways: Другие способы пожертвовать (PayPal, банковский перевод, криптовалюта…) + other_ways: "Другие способы сделать пожертвование" + form_title: "Сделайте пожертвование" + other_preset_label: "Другая" + email_why_once: "Для подтверждения пожертвования. Без рекламных рассылок." + recurrence_once: "{amount} · Разово" + recurrence_month: "{amount} сейчас, затем ежемесячно до отмены пожертвования." + recurrence_year: "{amount} сейчас, затем ежегодно до отмены пожертвования." + canceled_notice: "Ваш платёж был отменён. Вы можете повторить попытку или выбрать другой способ пожертвования." --- -Благодаря вашим пожертвованиям приложение Organic Maps доступно всем бесплатно. Без рекламы. Без слежки. С открытым исходным кодом. \ No newline at end of file +Благодаря вашим пожертвованиям приложение Organic Maps доступно всем бесплатно. Без рекламы. Без слежки. С открытым исходным кодом. diff --git a/content/donate/subscribe/index.sv.md b/content/donate/subscribe/index.sv.md index 2aae91e9b..c199c0800 100644 --- a/content/donate/subscribe/index.sv.md +++ b/content/donate/subscribe/index.sv.md @@ -13,9 +13,9 @@ extra: amount_label: Belopp other_label: Annat belopp currency_label: Valuta - email_label: E-post (rekommenderas) - email_why: Vi skickar en bekräftelse, en påminnelse före varje dragning och en avslutslänk med ett klick. Inget annat — ingen marknadsföring. - email_warning: Utan e-post kan vi inte skicka betalningspåminnelser eller någon avslutslänk — du skulle behöva kontakta oss för att avsluta. + email_label: "E-post (valfritt)" + email_why: "Få en bekräftelse, påminnelser och en länk för att avregistrera dig. Ingen marknadsföring." + email_warning: "Utan e-postadress behöver du kontakta oss för att avsluta din återkommande donation." name_label: Namn (valfritt) name_why: Så att vi kan tilltala dig i tackmejlet. submit: Fortsätt till säker betalning @@ -23,10 +23,17 @@ extra: submit_month: Donera {amount} per månad submit_year: Donera {amount} per år submit_loading: Omdirigerar till säker betalning… - secure_note: Du slutför betalningen hos Mollie, vår betalleverantör. Kortuppgifter når aldrig våra servrar. + secure_note: "Säker betalning via Mollie. Kortuppgifterna lagras aldrig på våra servrar." error_amount: Ange ett giltigt belopp. error_amount_range: Ange ett belopp mellan {min} och {max}. - other_ways: Andra sätt att donera (PayPal, banköverföring, krypto…) + other_ways: "Andra sätt att donera" + form_title: "Gör en donation" + other_preset_label: "Annat" + email_why_once: "För en bekräftelse på din donation. Ingen marknadsföring." + recurrence_once: "{amount} · Engångsbelopp" + recurrence_month: "{amount} nu, sedan varje månad tills du avslutar donationen." + recurrence_year: "{amount} nu, sedan varje år tills du avslutar donationen." + canceled_notice: "Din betalning har avbrutits. Du kan försöka igen eller välja ett annat sätt att donera." --- Organic Maps är gratis för alla tack vare dina donationer. Inga annonser. Inga spårare. Öppen källkod. diff --git a/content/donate/subscribe/index.te.md b/content/donate/subscribe/index.te.md index 6ea49f0e3..1c0a435df 100644 --- a/content/donate/subscribe/index.te.md +++ b/content/donate/subscribe/index.te.md @@ -13,9 +13,9 @@ extra: amount_label: మొత్తం other_label: ఇతర మొత్తం currency_label: కరెన్సీ - email_label: ఇమెయిల్ (సిఫార్సు చేయబడింది) - email_why: మేము నిర్ధారణ ఇమెయిల్ పంపుతాము, ప్రతి ఛార్జీకి ముందు మీకు గుర్తు చేస్తాము, ఒకే క్లిక్‌తో రద్దు చేసుకునే లింక్‌ను ఇస్తాము. మరేమీ లేదు — మార్కెటింగ్ ఉండదు. - email_warning: ఇమెయిల్ లేకపోతే మేము చెల్లింపు రిమైండర్‌లు లేదా రద్దు లింక్‌ను పంపలేము — రద్దు చేయడానికి మీరు మమ్మల్ని సంప్రదించవలసి ఉంటుంది. + email_label: "ఇమెయిల్ (ఐచ్ఛికం)" + email_why: "ధృవీకరణ, రిమైండర్‌లు మరియు రద్దు లింక్‌ను పొందండి. మార్కెటింగ్ లేదు." + email_warning: "ఇమెయిల్ ఇవ్వకపోతే, పునరావృత విరాళాన్ని రద్దు చేయడానికి మమ్మల్ని సంప్రదించండి." name_label: పేరు (ఐచ్ఛికం) name_why: ధన్యవాదాల ఇమెయిల్‌లో మిమ్మల్ని సంబోధించడానికి. submit: సురక్షిత చెల్లింపునకు కొనసాగండి @@ -23,10 +23,17 @@ extra: submit_month: "ప్రతి నెలా {amount} విరాళం ఇవ్వండి" submit_year: "ప్రతి సంవత్సరం {amount} విరాళం ఇవ్వండి" submit_loading: సురక్షిత చెల్లింపునకు మళ్లించబడుతోంది… - secure_note: మీరు మా చెల్లింపు ప్రదాత అయిన Mollieలో చెల్లింపును పూర్తి చేస్తారు. కార్డు వివరాలు ఎప్పుడూ మా సర్వర్‌లను తాకవు. + secure_note: "Mollieతో సురక్షితమైన చెల్లింపు. కార్డ్ వివరాలు మా సర్వర్‌లను ఎప్పుడూ తాకవు." error_amount: దయచేసి చెల్లుబాటు అయ్యే మొత్తాన్ని నమోదు చేయండి. error_amount_range: "{min} మరియు {max} మధ్య మొత్తాన్ని నమోదు చేయండి." - other_ways: విరాళం ఇవ్వడానికి ఇతర మార్గాలు (PayPal, బ్యాంక్ బదిలీ, క్రిప్టో…) + other_ways: "విరాళం ఇవ్వడానికి ఇతర మార్గాలు" + form_title: "విరాళం ఇవ్వండి" + other_preset_label: "ఇతర" + email_why_once: "విరాళం నిర్ధారణ కోసం. మార్కెటింగ్ లేదు." + recurrence_once: "{amount} · ఒకసారి" + recurrence_month: "{amount} ఇప్పుడు, ఆపై విరాళాన్ని రద్దు చేసే వరకు ప్రతి నెల." + recurrence_year: "{amount} ఇప్పుడు, ఆపై విరాళాన్ని రద్దు చేసే వరకు ప్రతి సంవత్సరం." + canceled_notice: "మీ చెల్లింపు రద్దు చేయబడింది. మీరు మళ్ళీ ప్రయత్నించవచ్చు లేదా విరాళం ఇవ్వడానికి మరొక మార్గాన్ని ఎంచుకోవచ్చు." --- -మీ విరాళాల వల్ల Organic Maps అందరికీ ఉచితం. ప్రకటనలు లేవు. ట్రాకర్లు లేవు. ఓపెన్ సోర్స్. \ No newline at end of file +మీ విరాళాల వల్ల Organic Maps అందరికీ ఉచితం. ప్రకటనలు లేవు. ట్రాకర్లు లేవు. ఓపెన్ సోర్స్. diff --git a/content/donate/subscribe/index.tr.md b/content/donate/subscribe/index.tr.md index bf74f27ad..25d796c0e 100644 --- a/content/donate/subscribe/index.tr.md +++ b/content/donate/subscribe/index.tr.md @@ -13,9 +13,9 @@ extra: amount_label: Tutar other_label: Başka bir tutar currency_label: Para birimi - email_label: E-posta (önerilir) - email_why: Sana bir onay mesajı göndereceğiz, her ödeme öncesinde hatırlatma yapacağız ve tek tıklamayla iptal edebileceğin bir bağlantı sunacağız. Başka hiçbir şey yok — pazarlama yok. - email_warning: E-posta adresin olmadan ödeme hatırlatmaları veya iptal bağlantısı gönderemeyiz; iptal etmek için bizimle iletişime geçmen gerekir. + email_label: "E-posta (isteğe bağlı)" + email_why: "Onay, hatırlatmalar ve iptal bağlantısı al. Pazarlama mesajı yok." + email_warning: "E-posta adresi vermezsen düzenli bağışını iptal etmek için bizimle iletişime geç." name_label: Ad (isteğe bağlı) name_why: Böylece teşekkür e-postasında sana hitap edebiliriz. submit: Güvenli ödemeye devam et @@ -23,10 +23,17 @@ extra: submit_month: Aylık {amount} bağış yap submit_year: Yıllık {amount} bağış yap submit_loading: Güvenli ödeme sayfasına yönlendiriliyor… - secure_note: Ödeme işlemini ödeme sağlayıcımız olan Mollie üzerinden tamamlayacaksın. Kart bilgileri hiçbir zaman sunucularımıza ulaşmaz. + secure_note: "Mollie ile güvenli ödeme. Kart bilgilerin sunucularımıza asla ulaşmaz." error_amount: Lütfen geçerli bir tutar gir. error_amount_range: "{min} ile {max} arasında bir tutar gir." - other_ways: Bağış yapmanın diğer yolları (PayPal, banka havalesi, kripto para…) + other_ways: "Bağış yapmanın diğer yolları" + form_title: "Bağış yap" + other_preset_label: "Diğer" + email_why_once: "Bağış teyidi için. Pazarlama amaçlı değildir." + recurrence_once: "{amount} · Tek seferlik" + recurrence_month: "{amount} şimdi, ardından bağışı iptal edene kadar her ay." + recurrence_year: "{amount} şimdi, ardından bağışı iptal edene kadar her yıl." + canceled_notice: "Ödemen iptal edildi. Tekrar deneyebilir veya başka bir bağış yöntemi seçebilirsin." --- -Organic Maps, bağışların sayesinde herkes için ücretsizdir. Reklam yok. İzleme araçları yok. Açık kaynak. \ No newline at end of file +Organic Maps, bağışların sayesinde herkes için ücretsizdir. Reklam yok. İzleme araçları yok. Açık kaynak. diff --git a/content/donate/subscribe/index.uk.md b/content/donate/subscribe/index.uk.md index 5f37f830a..deac492d0 100644 --- a/content/donate/subscribe/index.uk.md +++ b/content/donate/subscribe/index.uk.md @@ -13,9 +13,9 @@ extra: amount_label: Сума other_label: Інша сума currency_label: Валюта - email_label: Електронна пошта (рекомендується) - email_why: Ми надішлемо підтвердження, нагадаємо вам перед кожним списанням коштів і надамо посилання для скасування одним кліком. І більше нічого — жодного маркетингу. - email_warning: Без адреси електронної пошти ми не зможемо надсилати нагадування про платежі або посилання для скасування — щоб скасувати, вам доведеться написати нам. + email_label: "Електронна пошта (не обов’язково)" + email_why: "Отримайте підтвердження, нагадування та посилання для скасування. Без реклами." + email_warning: "Без адреси пошти для скасування регулярної пожертви потрібно зв’язатися з нами." name_label: Ім’я (необов’язково) name_why: Щоб ми могли звернутися до вас у листі з подякою. submit: Перейти до безпечної оплати @@ -23,10 +23,17 @@ extra: submit_month: Пожертвувати {amount} щомісяця submit_year: Пожертвувати {amount} щорічно submit_loading: Перенаправлення на сторінку безпечної оплати… - secure_note: Оплату ви завершите на Mollie — у нашого платіжного провайдера. Дані картки ніколи не потрапляють на наші сервери. + secure_note: "Безпечна оплата через Mollie. Дані картки ніколи не потрапляють на наші сервери." error_amount: Будь ласка, введіть коректну суму. error_amount_range: Введіть суму в діапазоні від {min} до {max}. - other_ways: Інші способи пожертвувати (PayPal, банківський переказ, криптовалюта…) + other_ways: "Інші способи зробити пожертву" + form_title: "Зробити пожертву" + other_preset_label: "Інше" + email_why_once: "Для підтвердження пожертви. Без реклами." + recurrence_once: "{amount} · Одноразово" + recurrence_month: "{amount} зараз, потім щомісяця до скасування пожертви." + recurrence_year: "{amount} зараз, потім щороку до скасування пожертви." + canceled_notice: "Ваш платіж було скасовано. Ви можете спробувати ще раз або вибрати інший спосіб пожертвування." --- -Organic Maps є безкоштовним для всіх завдяки вашим пожертвам. Без реклами. Без трекерів. З відкритим кодом. \ No newline at end of file +Organic Maps є безкоштовним для всіх завдяки вашим пожертвам. Без реклами. Без трекерів. З відкритим кодом. diff --git a/content/donate/subscribe/index.zh-Hans.md b/content/donate/subscribe/index.zh-Hans.md index d3e01e1bf..0d9aec3ab 100644 --- a/content/donate/subscribe/index.zh-Hans.md +++ b/content/donate/subscribe/index.zh-Hans.md @@ -13,9 +13,9 @@ extra: amount_label: 金额 other_label: 其他金额 currency_label: 货币 - email_label: 电子邮件(推荐) - email_why: 我们会发送确认邮件,在每次扣款前提醒你,并提供一键取消链接。仅此而已——不做任何营销。 - email_warning: 如果没有电子邮件地址,我们就无法发送付款提醒或取消链接——你需要联系我们才能取消。 + email_label: "电子邮件(可选)" + email_why: "获取确认信息、提醒和取消链接。无营销内容。" + email_warning: "如果不填写电子邮件地址,请联系我们取消定期捐款。" name_label: 姓名(可选) name_why: 这样我们才能在感谢邮件中称呼你。 submit: 继续前往安全支付 @@ -23,10 +23,17 @@ extra: submit_month: 每月捐款 {amount} submit_year: 每年捐款 {amount} submit_loading: 正在跳转至安全支付页面…… - secure_note: 你将在我们的支付服务提供商 Mollie 上完成支付。银行卡信息绝不会经过我们的服务器。 + secure_note: "通过Mollie进行安全支付。你的信用卡信息绝不会存储在我们的服务器上。" error_amount: 请输入有效的金额。 error_amount_range: 请输入 {min} 至 {max} 之间的金额。 - other_ways: 其他捐赠方式(PayPal、银行转账、加密货币等) + other_ways: "其他捐赠方式" + form_title: "捐款" + other_preset_label: "其他" + email_why_once: "用于确认捐款。不进行营销。" + recurrence_once: "{amount} · 一次性" + recurrence_month: "现在捐赠 {amount},之后每月捐赠,直到你取消。" + recurrence_year: "现在捐赠 {amount},之后每年捐赠,直到你取消。" + canceled_notice: "你的付款已被取消。你可以重试,或选择其他捐赠方式。" --- -多亏了你的捐款,Organic Maps 对所有人免费开放。无广告。无追踪器。开源。 \ No newline at end of file +多亏了你的捐款,Organic Maps 对所有人免费开放。无广告。无追踪器。开源。 diff --git a/sass/_donate_form.scss b/sass/_donate_form.scss index ca2c67988..3c117e222 100644 --- a/sass/_donate_form.scss +++ b/sass/_donate_form.scss @@ -1,5 +1,5 @@ -// Donation subscribe/manage form (/donate/subscribe/, /donate/manage/). -// Mobile-first, logical properties for RTL, dark-mode block at the bottom. +// Shared donation checkout, focused landing page and donation management form. +// Responsive grid, logical properties for RTL, dark-mode block at the bottom. // The brand greens. main.scss consumes them too (.thanks-card), which works because this // partial is imported first. Interpolated as #{...} inside an `outline` shorthand: stylelint's @@ -7,6 +7,78 @@ $donateAccent: #006c35; $donateAccentDark: #4caf50; +.donate-layout { + display: grid; + // The form spans both rows; its expansion must not stretch the intro row. + grid-template: + "intro form" min-content + "impact form" 1fr / minmax(0, 1.1fr) minmax(0, 1fr); + gap: 1.5rem 3rem; + align-items: start; + margin-block: 2rem 3rem; +} + +.donate-intro { + grid-area: intro; + + h1 { + font-size: 2.25rem; + line-height: 1.15; + border: 0; + padding: 0; + margin-block-start: 0; + } + + p { + color: #555; + } + + p:last-child { + font-size: 0.9rem; + color: $donateAccent; + margin-block-end: 0; + } +} + +.donate-impact { + grid-area: impact; + + h2 { + font-size: 1.25rem; + border: 0; + margin-block-start: 0; + } + + li { + margin-block-end: 1rem; + + &::marker { + color: $donateAccent; + } + + strong { + display: block; + } + } +} + +.donate-card { + grid-area: form; + min-width: 0; + padding: 1.5rem; + border: 1px solid #dce4dd; + border-radius: 16px; + background: #fbfdfb; + scroll-margin-block-start: 1rem; + + h2 { + font-size: 1.25rem; + border: 0; + padding: 0; + margin-block: 0 1rem; + } +} + .donate-form-page { max-width: 30rem; margin-inline: auto; @@ -20,13 +92,44 @@ $donateAccentDark: #4caf50; color: #555; } +.donate-focused-header { + display: flex; + justify-content: space-between; + align-items: center; + max-width: 30rem; + margin-inline: auto; + padding-block: 0.25rem 0.75rem; +} + +.donate-brand { + display: inline-flex; + align-items: center; + gap: 0.5rem; + font-weight: 600; + color: $donateAccent; + text-decoration: none; + + .top_menu_logo { + width: 28px; + height: 28px; + margin: 0; + } +} + +.donate-focused-page h1 { + border: 0; + padding: 0; + margin-block: 1rem 0.75rem; +} + .donate-form { margin-block-start: 1rem; .donate-fieldset { border: 0; padding: 0; - margin: 0 0 1.1rem; + min-width: 0; + margin: 0 0 1rem; legend { font-weight: 600; @@ -35,19 +138,6 @@ $donateAccentDark: #4caf50; } } - .donate-custom-row { - display: flex; - align-items: center; - gap: 0.5rem; - flex-wrap: wrap; - margin-block: 0.8rem 0.2rem; - - label { - flex-basis: 100%; - font-weight: 600; - } - } - input[type="text"], input[type="email"], select { @@ -61,8 +151,37 @@ $donateAccentDark: #4caf50; box-sizing: border-box; } - #amount-custom { - flex: 1 1 8rem; + .donate-amount-header { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 0.5rem; + margin-block-end: 0.6rem; + + > span { + font-weight: 600; + } + } + + .donate-currency { + display: inline-flex; + align-items: center; + gap: 0.4rem; + font-size: 0.8rem; + color: #555; + + select { + max-width: 8rem; + padding-inline: 0.35rem; + } + } + + .donate-recurrence { + display: block; + font-size: 0.8rem; + color: #666; + margin-block-start: 0.5rem; } .donate-field { @@ -93,16 +212,18 @@ $donateAccentDark: #4caf50; input[type="radio"] { position: absolute; opacity: 0; - width: 0; - height: 0; + width: 1px; + height: 1px; + label { display: inline-block; - min-width: 3.2rem; - padding: 0.6rem 1rem; + min-width: 0; + min-height: 2.75rem; + box-sizing: border-box; + padding: 0.6rem 0.4rem; text-align: center; border: 1px solid #bbb; - border-radius: 999px; + border-radius: 9px; cursor: pointer; user-select: none; } @@ -117,14 +238,67 @@ $donateAccentDark: #4caf50; outline: 3px solid #{$donateAccent}; outline-offset: 2px; } + } + } + + .donate-pills.donate-amounts { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(4rem, 1fr)); + gap: 0.4rem; + + input[type="radio"] + label { + font-size: 0.95rem; + overflow-wrap: anywhere; + } + } + + .donate-pills.donate-intervals { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0.25rem; + padding: 0.25rem; + background: #edf2ed; + border-radius: 10px; + + input[type="radio"] { + + label { + font-size: 0.9rem; + border-color: transparent; + overflow-wrap: anywhere; + } - &[hidden] + label, - + label[hidden] { - display: none; + &:checked + label { + background: #fff; + color: $donateAccent; + box-shadow: 0 1px 4px #00000014; + font-weight: 600; } } } + .donate-other { + min-width: 0; + min-height: 2.75rem; + padding: 0.6rem 0.4rem; + border: 1px solid #bbb; + border-radius: 9px; + background: #fff; + color: inherit; + font-size: 0.9rem; + overflow-wrap: anywhere; + + &[aria-pressed="true"] { + background: $donateAccent; + border-color: $donateAccent; + color: #fff; + } + + &:focus-visible { + outline: 3px solid #{$donateAccent}; + outline-offset: 2px; + } + } + .donate-warning { display: block; margin-block-start: 0.4rem; @@ -137,7 +311,7 @@ $donateAccentDark: #4caf50; font-size: 1.1rem; font-weight: 600; padding: 0.9rem 1rem; - margin-block-start: 1.2rem; + margin-block-start: 0.75rem; background: $donateAccent; color: #fff; border: 0; @@ -156,13 +330,144 @@ $donateAccentDark: #4caf50; } .donate-secure-note { - font-size: 0.85rem; + font-size: 0.8rem; + line-height: 1.4; color: #666; text-align: center; + margin-block: 0.6rem 0.75rem; } .donate-alt { text-align: center; + font-size: 0.9rem; + margin-block-end: 0; + } + + [hidden] { + display: none; + } +} + +.donate-manage-link { + font-size: 0.85rem; + text-align: center; + margin-block: 1rem 0; +} + +.donate-card .donate-form { + margin-block-start: 0; +} + +.donate-canceled { + padding: 0.75rem; + border-radius: 8px; + background: #edf2ed; +} + +.donate-alternatives { + border-top: 1px solid #dce4dd; + padding-block: 1rem 2rem; + + h2 { + font-size: 1.4rem; + border: 0; + scroll-margin-block-start: 1rem; + } +} + +.donate-methods { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); + gap: 0.75rem; + margin-block: 1.5rem; + + form { + margin: 0; + } + + a, + button { + display: flex; + align-items: center; + gap: 0.6rem; + width: 100%; + height: 100%; + min-height: 3rem; + box-sizing: border-box; + border: 1px solid #dce4dd; + border-radius: 9px; + padding: 0.5rem 0.75rem; + background: #fff; + color: inherit; + text-decoration: none; + font-size: 0.9rem; + cursor: pointer; + text-align: start; + + &:hover { + border-color: $donateAccent; + } + } + + img { + flex-shrink: 0; + width: 2rem; + height: 2rem; + object-fit: contain; + background: #fff; + border-radius: 4px; + } +} + +.donate-method-details { + border-top: 1px solid #dce4dd; + padding-block: 0.5rem; + scroll-margin-block-start: 1rem; + + summary:first-child { + min-height: 2.75rem; + box-sizing: border-box; + padding-block: 0.6rem; + font-weight: 600; + cursor: pointer; + } +} + +.donate-table-scroll { + overflow: auto; + max-width: 100%; + margin-block: 0.75rem; + + table { + min-width: 28rem; + width: 100%; + border-collapse: collapse; + text-align: start; + } + + td, + th { + padding: 0.5rem; + } +} + +@media (width <= 768px) { + .donate-layout { + grid-template: "intro" auto "form" auto "impact" auto / minmax(0, 1fr); + gap: 1.25rem; + margin-block: 1.5rem 2rem; + } + + .donate-intro h1 { + font-size: 1.75rem; + } + + .donate-card { + padding: 1rem; + + h2 { + display: none; + } } } @@ -180,11 +485,48 @@ $donateAccentDark: #4caf50; @media (prefers-color-scheme: dark) { .donate-form-intro, + .donate-intro p, + .donate-form .donate-currency, + .donate-form .donate-recurrence, .donate-form .donate-field small, .donate-form .donate-secure-note { color: #999; } + .donate-intro p:last-child, + .donate-brand, + .donate-impact li::marker { + color: $donateAccentDark; + } + + .donate-card { + background: #181c19; + border-color: #444; + } + + .donate-alternatives, + .donate-method-details { + border-color: #444; + } + + .donate-methods a, + .donate-methods button, + .donate-form .donate-other { + background: #1e1e1e; + border-color: #444; + } + + .donate-form .donate-other[aria-pressed="true"] { + background: $donateAccentDark; + border-color: $donateAccentDark; + color: #000; + } + + .donate-form .donate-pills.donate-intervals, + .donate-canceled { + background: #252c26; + } + .donate-form { .donate-pills input[type="radio"] { + label { @@ -221,5 +563,17 @@ $donateAccentDark: #4caf50; .donate-warning { color: #e8a06a; } + + .donate-pills.donate-intervals input[type="radio"] { + + label { + border-color: transparent; + } + + &:checked + label { + background: #171c18; + border-color: transparent; + color: $donateAccentDark; + } + } } } diff --git a/static/js/donate-subscribe.js b/static/js/donate-subscribe.js index 9ac310632..cb9ee26d2 100644 --- a/static/js/donate-subscribe.js +++ b/static/js/donate-subscribe.js @@ -1,4 +1,4 @@ -// Progressive enhancement for /donate/subscribe/. The form works without this file: +// Shared enhancement for /donate/ and /donate/subscribe/. The form works without this file: // plain POST to donate-api, which redirects to Mollie hosted checkout. (function () { 'use strict'; @@ -22,15 +22,22 @@ var pageLang = document.documentElement.lang || 'en'; var currencySelect = document.getElementById('currency'); + currencySelect.disabled = false; + document.getElementById('currency-fallback').disabled = true; var customInput = document.getElementById('amount-custom'); var emailInput = document.getElementById('email'); var nameInput = document.getElementById('donor-name'); + var otherButton = document.getElementById('amount-other'); + var customRow = document.getElementById('donate-custom-row'); + var recurrence = document.getElementById('donate-recurrence'); + var emailBenefits = document.getElementById('email-benefits'); var emailWarning = document.getElementById('email-warning'); var amountError = document.getElementById('amount-error'); var submitButton = document.getElementById('donate-submit'); var defaultSubmitLabel = submitButton.textContent; var presetInputs = form.querySelectorAll('input[name="amount"]'); var intervalInputs = form.querySelectorAll('input[name="interval"]'); + var customActive = customInput.value.trim() !== ''; var DRAFT_KEY = 'organicmaps-donate-checkout-draft-v2'; // This limits restoration, not browser storage retention: sessionStorage has no expiry. var DRAFT_RESTORE_WINDOW = 30 * 60 * 1000; @@ -42,7 +49,7 @@ } // Preset amounts per interval, in EUR-equivalent units. Index 1 is the default. - var PRESETS = { once: [5, 10, 25, 50], month: [3, 5, 10], year: [25, 35, 70] }; + var PRESETS = { once: [5, 10, 25, 50], month: [3, 5, 10, 20], year: [25, 35, 50, 70] }; // Per-currency rules mirrored from donate-api config.ts (CURRENCIES): inclusive min/max in // major units and the decimals Mollie accepts. `whole` marks a currency the donor may only // enter in whole units — PayPal has no sub-unit for HUF or TWD, and Mollie rounds such an @@ -213,20 +220,15 @@ for (var i = 0; i < presetInputs.length; i++) { var input = presetInputs[i]; var label = presetLabels[i]; - var visible = i < presets.length; - input.hidden = !visible; - if (label) label.hidden = !visible; - if (visible) { - var value = scalePreset(presets[i], currency); - input.value = String(value); - if (label) label.textContent = formatAmount(value, currency); - } else { - input.checked = false; - } + var value = scalePreset(presets[i], currency); + input.value = String(value); + label.textContent = formatAmount(value, currency); } - // Keep the donor's pick across currency/interval changes; otherwise the middle preset. - if (customInput.value.trim() === '') { - presetInputs[keep >= 0 && keep < presets.length ? keep : 1].checked = true; + // Keep the donor's pick across currency/interval changes; otherwise use the default. + if (!customActive) { + presetInputs[keep >= 0 ? keep : 1].checked = true; + } else { + uncheckPresets(); } } @@ -245,14 +247,23 @@ var pattern = submitButton.getAttribute('data-label-' + selectedInterval()); submitButton.textContent = isNaN(num) || !pattern ? defaultSubmitLabel : pattern.replace('{amount}', formatAmount(num, currencySelect.value)); + var summary = recurrence.getAttribute('data-label-' + selectedInterval()); + recurrence.hidden = isNaN(num) || !summary; + recurrence.textContent = recurrence.hidden ? '' : summary.replace('{amount}', formatAmount(num, currencySelect.value)); } function refreshEmailWarning() { var show = selectedInterval() !== 'once' && emailInput.value.trim() === ''; emailWarning.hidden = !show; - // Hidden elements referenced by aria-describedby are still read out, so only reference - // the warning while it is shown. - emailInput.setAttribute('aria-describedby', show ? 'email-why email-warning' : 'email-why'); + // The warning lives within the helper, rather than being referenced separately and + // announced twice. One-time donations only need a confirmation address. + emailBenefits.textContent = emailBenefits.getAttribute(selectedInterval() === 'once' ? 'data-once' : 'data-recurring'); + } + + function refreshCustomVisibility() { + otherButton.hidden = false; + otherButton.setAttribute('aria-pressed', customActive ? 'true' : 'false'); + customRow.hidden = !customActive; } function showAmountError(message) { @@ -296,6 +307,7 @@ refreshPlaceholder(); refreshSubmitLabel(); refreshEmailWarning(); + refreshCustomVisibility(); } function hasCurrency(code) { @@ -354,15 +366,20 @@ if (qAmount) { var preset = null; for (var i = 0; i < presetInputs.length; i++) { - if (!presetInputs[i].hidden && presetInputs[i].value === qAmount) preset = presetInputs[i]; + if (presetInputs[i].value === qAmount) preset = presetInputs[i]; } // Checking a radio clears the rest of its group, so one assignment covers either branch. - if (preset) preset.checked = true; - else { + if (preset) { + customInput.value = ''; + customActive = false; + preset.checked = true; + } else { customInput.value = qAmount; + customActive = true; uncheckPresets(); } refreshSubmitLabel(); + refreshCustomVisibility(); } if (returnDraft) { @@ -370,11 +387,14 @@ if (typeof returnDraft.name === 'string' && returnDraft.name) nameInput.value = returnDraft.name; refreshEmailWarning(); } + document.getElementById('donate-canceled').hidden = !canceledCheckout; function onPresetChange() { customInput.value = ''; + customActive = false; hideAmountError(); refreshSubmitLabel(); + refreshCustomVisibility(); } for (var i = 0; i < intervalInputs.length; i++) intervalInputs[i].addEventListener('change', refresh); @@ -385,16 +405,26 @@ if (!amountError.hidden) validateAmount(); }); customInput.addEventListener('input', function () { - if (customInput.value.trim() !== '') uncheckPresets(); - else if (checkedPreset() === -1) presetInputs[1].checked = true; // never leave nothing chosen + customActive = true; + uncheckPresets(); + hideAmountError(); + refreshSubmitLabel(); + }); + otherButton.addEventListener('click', function () { + customActive = true; + uncheckPresets(); hideAmountError(); + refreshCustomVisibility(); refreshSubmitLabel(); + customInput.focus(); }); emailInput.addEventListener('input', refreshEmailWarning); form.addEventListener('submit', function (event) { if (!validateAmount()) { event.preventDefault(); + customActive = true; + refreshCustomVisibility(); customInput.focus(); return; } @@ -426,4 +456,25 @@ refreshSubmitLabel(); } }); + + // A section fragment must reveal its target inside a collapsed disclosure. + function revealDonationSection() { + var target; + try { target = document.getElementById(decodeURIComponent(window.location.hash.substring(1))); } catch (e) {} + var section = target; + while (section && section.tagName.toLowerCase() !== 'details') section = section.parentElement; + if (!section || (' ' + section.className + ' ').indexOf(' donate-method-details ') === -1) return; + section.open = true; + target.scrollIntoView(); + } + revealDonationSection(); + window.addEventListener('hashchange', revealDonationSection); + // Clicking the same fragment again does not emit hashchange. Reopen a disclosure + // that the donor closed after following its payment-method shortcut. + var sectionLinks = document.querySelectorAll('.donate-methods a[href^="#"]'); + for (var i = 0; i < sectionLinks.length; i++) { + sectionLinks[i].addEventListener('click', function () { + if (this.getAttribute('href') === window.location.hash) revealDonationSection(); + }); + } })(); diff --git a/templates/_donate_form.html b/templates/_donate_form.html new file mode 100644 index 000000000..adec6d9c4 --- /dev/null +++ b/templates/_donate_form.html @@ -0,0 +1,105 @@ +{# Shared by the main donation page and the focused app/direct-link landing page. + f is the localized subscribe page's extra.form; return_to is an API enum, never a URL. #} + +{% set manage = get_page(path="donate/manage/index.md") %} +{% set translated = [t for t in manage.translations if t.lang == lang] | first %} +{% if translated %}{% set manage = translated %}{% endif %} + diff --git a/templates/base.html b/templates/base.html index d424553ae..598171a52 100644 --- a/templates/base.html +++ b/templates/base.html @@ -184,7 +184,9 @@
+ {% block header %} {% include 'top_menu.html' %} + {% endblock header %}
diff --git a/templates/donate-subscribe.html b/templates/donate-subscribe.html index b59b485d7..916393529 100644 --- a/templates/donate-subscribe.html +++ b/templates/donate-subscribe.html @@ -1,110 +1,23 @@ {% extends 'base.html' %} +{% block header %} + +{% endblock header %} + {% block content %} {% set f = resource.extra.form %} {# Same translated-page lookup as top_menu.html / bottom_menu.html, falling back to English. #} {% set donate = get_page(path="donate/index.md") %} {% set translated = [t for t in donate.translations if t.lang == lang] | first %} {% if translated %}{% set donate = translated %}{% endif %} -