Compare commits

...
Author SHA1 Message Date
HampusandGitHub dd8ed6f205 fix(app): react at once when picking a +: autocomplete emoji (#3010) 2026-09-28 12:30:45 +02:00
HampusandGitHub ed8c412415 perf(gateway): make channel moves cheap in large guilds (#3008) 2026-09-28 02:07:47 +02:00
HampusandGitHub 12417a6942 fix(app): keep the caret after inserted emoji (#3007) 2026-09-28 01:56:08 +02:00
HampusandGitHub d05f6c9aaa fix(gateway): push held users whose sessions end during grace (#3006) 2026-09-28 01:47:55 +02:00
HampusandGitHub 0ca035c547 fix(messages): accept null version on legacy message rows (#3004) 2026-09-28 01:10:52 +02:00
HampusandGitHub dfd46ccc2c ci(gateway): drop cached gateway build output before compiling (#3003) 2026-09-28 01:08:52 +02:00
HampusandGitHub f6df3169ca fix(app): use +:shortcode: for reactions, no space before emoji (#3001) 2026-09-28 00:48:23 +02:00
HampusandGitHub 5b280898c5 refactor(push): retire the push service delivery experiment (#3000) 2026-09-28 00:45:22 +02:00
HampusandGitHub 2a9e25c788 fix(dev): drop the stray -- from the tunnel public URL hint (#2999) 2026-09-28 00:43:32 +02:00
HampusandGitHub 463c03fb6d feat(app): make +emoji react on send and target replies (#2998) 2026-09-28 00:08:40 +02:00
HampusandGitHub 153dad11e1 feat(installer): let upgrades copy the uploads uncompressed (#2995) 2026-09-27 23:51:24 +02:00
HampusandGitHub e2d05a44a8 fix(push): stop retrying relay rate limit refusals (#2993) 2026-09-27 23:29:27 +02:00
HampusandGitHub 30ba55bd4d fix(gateway): parse push relay hosts as binaries (#2989) 2026-09-27 21:22:45 +02:00
HampusandGitHub 9def9fbef6 feat(api): accept CIDR ranges in FLUXER_API_IP_BAN_EXEMPT_IPS (#2988) 2026-09-27 21:19:35 +02:00
HampusandGitHub fa3fd0027c fix(i18n): translate the push relay notice strings (#2987) 2026-09-27 21:15:33 +02:00
HampusandGitHub 7e1b934637 feat(captcha): add ALTCHA proof-of-work captcha experiment (#2986) 2026-09-27 21:02:55 +02:00
HampusandGitHub 33a118d12a docs(readme): list the Google Play beta first for Android (#2985) 2026-09-27 20:49:39 +02:00
HampusandGitHub 01f53a168d feat(push): gate relay delivery on operator consent (#2984) 2026-09-27 20:33:10 +02:00
HampusandGitHub 336b8b7dcd fix(forward): make an @silent comment silence the forward too (#2983) 2026-09-27 20:13:14 +02:00
HampusandGitHub 48d0034239 fix(app-proxy): trust the Play app signing certificate (#2982) 2026-09-27 19:37:40 +02:00
HampusandGitHub 677ef8491e fix(desktop): back off failed app loads and offer a retry (#2980) 2026-09-27 16:18:01 +02:00
HampusandGitHub 6a6119ed1e fix(push): preview forwarded message content (#2979) 2026-09-27 13:33:22 +02:00
HampusandGitHub 931327d1dc fix(push): stop sending notifications for system messages (#2978) 2026-09-27 13:33:18 +02:00
HampusandGitHub 858a2d9e2b fix(oauth): stop granting scopes the user turned off (#2968) 2026-09-26 13:48:23 +02:00
HampusandGitHub 841fb7af41 feat(auth): migrate passkeys to fluxer.com (#2964) 2026-09-25 22:33:50 +02:00
HampusandGitHub 08e65d41c0 fix(api): clear the perks-sanitized latch when premium returns (#2963) 2026-09-25 20:13:00 +02:00
HampusandGitHub f76c4dc041 fix(api): cancel only the subscription the refund belongs to (#2962) 2026-09-25 20:10:54 +02:00
HampusandGitHub f1f8ba2031 fix(app): add copy link to link channel context menus (#2959) 2026-09-25 18:16:20 +02:00
HampusandGitHub 5ab8d745c0 fix(i18n): correct the fluxer.com migration translations (#2958) 2026-09-25 17:46:07 +02:00
HampusandGitHub ff62bc89a4 feat(app): add passkey popup bridge for password managers (#2957) 2026-09-25 17:43:19 +02:00
HampusandGitHub 838bbdb5ec fix(app): only start the domain migration when the app opens (#2956) 2026-09-25 16:44:58 +02:00
HampusandGitHub 1c36a59b2c feat(app): rework quick switcher ranking and show origin icons (#2953) 2026-09-25 13:59:25 +02:00
HampusandGitHub 6730a242db feat(web): prepare the fluxer.com domain migration (#2952) 2026-09-25 13:43:34 +02:00
HampusandGitHub e62ae77643 refactor(config): trim the default passkey origin list (#2951) 2026-09-25 13:42:02 +02:00
HampusandGitHub f4f39e6a89 feat(app): show where forward destinations come from (#2950) 2026-09-25 13:12:17 +02:00
HampusandGitHub 00bf74cef5 fix(app): handle swapped overwrites when comparing channels (#2949) 2026-09-24 23:38:04 +02:00
HampusandGitHub c1c45d835f fix(app): only parse markdown in rich embeds (#2948) 2026-09-24 22:50:34 +02:00
HampusandGitHub bbfe809bef fix(app): crop animated images on web with libwebp (#2947) 2026-09-24 22:45:53 +02:00
HampusandGitHub e0843ac4f5 fix(app): keep guild folder expansion state local (#2944) 2026-09-24 17:52:33 +02:00
HampusandGitHub 43741cdad8 fix(gateway): always trim the connect snapshot for guild connects (#2943) 2026-09-24 17:09:48 +02:00
HampusandGitHub b8e3807262 Revert "fix(push): deliver direct messages without holding them" (#2942) 2026-09-24 17:09:44 +02:00
HampusandGitHub 3304f01a84 chore(i18n): recompile uk error catalog (#2941) 2026-09-24 17:09:36 +02:00
fluxer-weblate[bot]andGitHub 2ba463235b chore(i18n): update translations from Weblate (#2909) 2026-09-24 16:25:26 +02:00
fluxer-weblate[bot]andGitHub 15136fed59 chore(i18n): update translations from Weblate (#2923) 2026-09-24 16:25:05 +02:00
HampusandGitHub 6013581dd9 fix(push): deliver direct messages without holding them (#2938) 2026-09-24 16:21:42 +02:00
HampusandGitHub 7a91f128e9 fix(app-proxy): drop link preview metadata on self-hosted (#2936) 2026-09-24 16:07:00 +02:00
HampusandGitHub 963ffc5550 feat(push): scope read clears to the enrolled cohort (#2935) 2026-09-24 15:15:45 +02:00
HampusandGitHub a90991612c fix(gateway): truncate reads on an expired outbox entry (#2934) 2026-09-24 15:04:24 +02:00
HampusandGitHub 50ad23b760 fix(api): run the notification extension on every iOS alert (#2933) 2026-09-24 15:04:01 +02:00
HampusandGitHub 425dab983b fix(push): restore iOS avatars and stop misrouting relay endpoints (#2932) 2026-09-24 15:03:32 +02:00
HampusandGitHub a0825e77c4 feat(voice): ship the screen share delivery rework to everyone (#2931) 2026-09-24 14:57:40 +02:00
HampusandGitHub 88038a1d5b fix(voice): stop direct input capturing microphones in stereo (#2929) 2026-09-24 14:51:05 +02:00
HampusandGitHub c2c0fdb445 fix(app): make corner volume control the focused stream (#2928) 2026-09-24 14:04:05 +02:00
HampusandGitHub dcd5f09d6a feat(api): add env toggles for automatic phone flagging (#2927) 2026-09-24 03:36:35 +02:00
HampusandGitHub 590b1f36fd docs(downloads): document the canary apt and dnf repositories (#2926) 2026-09-24 03:29:52 +02:00
HampusandGitHub 168ac727f1 fix(desktop): set the deb package synopsis (#2925) 2026-09-24 03:29:33 +02:00
HampusandGitHub deb86dd92e fix(admin): format users list search hint (#2924) 2026-09-24 02:12:37 +02:00
omsterandGitHub 7ccec4d3b8 feat(admin): hint text for * search in user page (#2922) 2026-09-24 01:56:17 +02:00
omsterandGitHub 2f38bcdf26 fix(admin): ordering fixes for admin user search and meilisearch (#2920) 2026-09-24 01:45:56 +02:00
HampusandGitHub f2785941aa fix(app): point self-hosted users at their instance admins (#2921) 2026-09-24 01:42:33 +02:00
HampusandGitHub ea9f83a443 fix(push): keep read-state clears alive as long as the alert (#2919) 2026-09-24 01:26:18 +02:00
HampusandGitHub bd6ca7290e fix(api): allow deleting messages without send permission (#2918) 2026-09-24 01:14:01 +02:00
HampusandGitHub b85e975fb5 feat(push): deliver our own relay endpoints in process (#2917) 2026-09-24 01:07:09 +02:00
HampusandGitHub b6e504f68c fix(push): keep device tokens out of logs (#2916) 2026-09-24 00:33:50 +02:00
HampusandGitHub 5fde6eb484 feat(push): ring Android calls and harden the relay (#2915) 2026-09-24 00:07:15 +02:00
HampusandGitHub b16989d567 feat(push): ring incoming calls on Apple PushKit devices (#2911) 2026-09-23 20:21:08 +02:00
HampusandGitHub c9754ac11a fix(api): exempt internal rpc from the client ip check (#2910) 2026-09-23 18:03:36 +02:00
fluxer-weblate[bot]andGitHub f34e4a5115 chore(i18n): update translations from Weblate (#2903) 2026-09-23 17:28:25 +02:00
fluxer-weblate[bot]andGitHub 44b3615298 chore(i18n): update translations from Weblate (#2904) 2026-09-23 17:27:59 +02:00
HampusandGitHub 211e98307d perf(push): cache endpoint guard dns verdicts (#2907) 2026-09-23 17:27:19 +02:00
HampusandGitHub 18c303abf6 feat(push): relay notifications as encrypted web push (#2906) 2026-09-23 14:04:55 +02:00
JiraliteandGitHub 7021a58090 fix: allow copying message snapshots (#2905) 2026-09-23 14:01:10 +02:00
WagnerandGitHub 320725a587 fix(desktop): capture full pipewire quantum on linux (#2481) 2026-09-22 21:37:20 +02:00
fluxer-weblate[bot]andGitHub 8450edc072 chore(i18n): update translations from Weblate (#2895) 2026-09-22 21:28:24 +02:00
omsterandGitHub a1e2bf2c8d feat(dev/linux): select the wayland backend when reachable in the native desktop app (#2899)
Signed-off-by: omstr <[email protected]>
2026-09-22 21:27:59 +02:00
HampusandGitHub 82b2f4ec5e fix(app): put jxl and other image attachments in the mosaic (#2902) 2026-09-22 21:18:39 +02:00
HampusandGitHub c92e5d03a7 fix(api): accept any image or video attachment as embed media (#2901) 2026-09-22 21:18:35 +02:00
HampusandGitHub 91340c5c84 fix(markdown): compile the parser wasm asynchronously (#2900) 2026-09-22 19:58:38 +02:00
HampusandGitHub 045dd5d027 test(api): make the harvest token tamper test deterministic (#2894) 2026-09-22 02:20:18 +02:00
HampusandGitHub a21b9c4659 docs(readme): clean up the download prose (#2893) 2026-09-22 02:08:42 +02:00
HampusandGitHub 4b1b869802 docs(readme): point Linux installs at Flathub (#2892) 2026-09-22 02:04:06 +02:00
HampusandGitHub 1ab7e7dfcc fix(api): unfurl links to a self-hosted instance's own domain (#2891) 2026-09-22 02:00:51 +02:00
HampusandGitHub 31c53d2dff fix(app): stop pending stickers from reloading the channel (#2890) 2026-09-22 02:00:26 +02:00
HampusandGitHub 412a1ae79d perf(api): stop ledgering session payment reconciliation (#2889) 2026-09-22 01:37:21 +02:00
HampusandGitHub 0b2306ec3d fix(api): honour default TTLs and expire stale job ledger rows (#2887) 2026-09-21 23:16:39 +02:00
HampusandGitHub 242ed3a934 fix(desktop): drop orphaned Squirrel uninstall entry (#2885) 2026-09-21 20:03:33 +02:00
HampusandGitHub 70e1ce682a feat(emoji): add Unicode 17 emoji and fix mixed skin tones (#2883) 2026-09-21 16:26:06 +02:00
HampusandGitHub 7601bf98ee fix(channel): sync a cleared group DM name without a reload (#2882) 2026-09-21 15:34:18 +02:00
c7ec2a0f58 chore(tooling): Ignore .vscode/ in .gitignore (#2868)
Co-authored-by: Hampus <[email protected]>
2026-09-21 13:29:33 +02:00
XeonandGitHub 6a5e0056a8 fix(flatpak): Add a release tag and make small corrections (#2872) 2026-09-21 13:28:36 +02:00
HampusandGitHub 78d105b46e fix(desktop): stop looping on an update that never installs (#2879) 2026-09-21 03:36:11 +02:00
HampusandGitHub c68d62b8a0 fix(voice): darken screen share source titles in light theme (#2878) 2026-09-21 01:20:54 +02:00
HampusandGitHub df58020f4c fix(api): keep premium paid for after a subscription cancels (#2875) 2026-09-20 23:50:49 +02:00
HampusandGitHub f052ce05aa fix(workspace): point the Erlang extension at the repo root (#2871) 2026-09-20 19:49:06 +02:00
HampusandGitHub eedfd9275f fix(api): only require permissions a channel overwrite grants (#2867) 2026-09-20 17:56:22 +02:00
HampusandGitHub 416af4bec4 fix(docs): correct the flatpak and dnf signing instructions (#2865) 2026-09-20 16:42:33 +02:00
HampusandGitHub 108d282ddd chore(deps): pin pnpm 11 so the lockfile parses for packagers (#2864) 2026-09-20 15:30:50 +02:00
HampusandGitHub a6103244b0 docs(readme): fix the license wording and shrink the preview (#2862) 2026-09-20 15:11:06 +02:00
HampusandGitHub 38935c83c5 docs(readme): document every download and install method (#2861) 2026-09-20 15:05:54 +02:00
HampusandGitHub c157ab5752 feat(voice): rework screen share delivery behind an experiment (#2859) 2026-09-20 06:10:20 +02:00
HampusandGitHub 574a93257c docs(downloads): the pacman repository is signed (#2858) 2026-09-20 05:54:28 +02:00
HampusandGitHub ba7d8781cf feat(auth): make passkey two-factor authentication opt-in (#2857) 2026-09-20 05:06:50 +02:00
HampusandGitHub 3256af8d92 refactor(app-proxy): remove the stable time freeze (#2856) 2026-09-20 04:02:47 +02:00
HampusandGitHub 86043212f2 docs(downloads): one pacman repository holds both channels (#2855) 2026-09-20 02:50:08 +02:00
HampusandGitHub 5d85e88532 fix(search): suggest yourself in DM from: and mentions: filters (#2854) 2026-09-20 01:24:43 +02:00
HampusandGitHub e2abfd476a feat(api): redirect desktop downloads to pkgs (#2853) 2026-09-20 01:20:30 +02:00
HampusandGitHub 487febac8e fix(voice): make stereo microphones work in studio and custom (#2852) 2026-09-20 00:19:53 +02:00
HampusandGitHub a3454e8245 fix(installer): name the services that are not ready (#2851) 2026-09-19 23:34:08 +02:00
HampusandGitHub bf7567b768 fix(user): push guild member updates on profile field changes (#2850) 2026-09-19 23:30:25 +02:00
HampusandGitHub ac3450ab32 feat(ci): publish appimage zsync control files (#2849) 2026-09-19 22:22:54 +02:00
HampusandGitHub 5d034becb8 fix(installer): stop waiting for an absent bucket initialiser (#2848) 2026-09-19 22:14:13 +02:00
HampusandGitHub f9397d0db9 feat(ci): publish linux repositories from the desktop release (#2847) 2026-09-19 22:01:06 +02:00
HampusandGitHub 9005139dc8 fix(voice): stop stereo microphones publishing as mono (#2846) 2026-09-19 21:54:38 +02:00
HampusandGitHub d93604afa2 fix(voice): let screen shares use the hardware H.264 encoder (#2845) 2026-09-19 21:54:30 +02:00
HampusandGitHub c4f0b2ece0 feat(desktop): self-update appimages in place (#2843) 2026-09-19 19:06:53 +02:00
HampusandGitHub 98a42f612b fix(desktop): supersede the legacy linux packages on upgrade (#2842) 2026-09-19 18:50:37 +02:00
HampusandGitHub cc75e1318d fix(ci): raise the macos minimum to 13.0 (#2841) 2026-09-19 18:35:05 +02:00
HampusandGitHub 9027cbdf3e fix(voice): send screen shares at the quality the user picked (#2840) 2026-09-19 16:46:22 +02:00
HampusandGitHub 2119e10ed5 chore(static): update marketing screenshots and readme cover (#2839) 2026-09-19 16:44:32 +02:00
HampusandGitHub 87f3eb3c81 feat(desktop): add flatpak and arch packaging inputs (#2838) 2026-09-19 15:31:41 +02:00
HampusandGitHub f9bb8bd585 test(voice): remove the slow screen share delivery proof (#2836) 2026-09-19 02:33:32 +02:00
HampusandGitHub bc47a724af fix(voice): stop screen shares failing to reach their viewers (#2835) 2026-09-19 02:17:25 +02:00
HampusandGitHub f32356801d feat(api): make tor and breached password lookups opt-in (#2834) 2026-09-19 01:22:17 +02:00
HampusandGitHub efd677f32b feat(api): exempt configured ASNs from abusive IP auto-bans (#2833) 2026-09-18 23:01:58 +02:00
HampusandGitHub 3cec27ba57 fix(static): vendor the deepfilternet 1.3.0 assets (#2832) 2026-09-18 18:47:42 +02:00
HampusandGitHub 1f810ba04d fix(api): drop the upload segment signal and dead exports (#2831) 2026-09-18 17:35:58 +02:00
HampusandGitHub 522cf08e61 feat(media-proxy): sign attachment URLs and gate origins (#2830) 2026-09-18 15:57:32 +02:00
HampusandGitHub 025c01ab13 fix(api): chunk guild permission batch RPC over 100 guilds (#2829) 2026-09-18 12:54:03 +02:00
HampusandGitHub dc41b53d60 fix(desktop): drop redundant casts flagged by clippy 1.98 (#2826) 2026-09-17 21:28:48 +02:00
HampusandGitHub 3b552e00ef chore(deps): upgrade all dependencies, toolchains and images (#2825) 2026-09-17 21:08:56 +02:00
HampusandGitHub 56e04e7b53 test(backend): remove duplicate and useless tests (#2820) 2026-09-17 15:32:25 +02:00
HampusandGitHub deac653a9e test(app): remove useless frontend tests (#2819) 2026-09-17 15:05:36 +02:00
HampusandGitHub ed9528834d fix(gateway): stop dead sessions leaving voice states behind (#2818) 2026-09-17 14:55:18 +02:00
HampusandGitHub 4cecbf1f43 fix(auth): disable TOTP with one code instead of two (#2816) 2026-09-17 04:21:50 +02:00
HampusandGitHub b019f4a91f fix(gateway): act on voice states in the voice server (#2815) 2026-09-17 03:59:36 +02:00
HampusandGitHub 34b6ecfbd2 chore(admin): remove the heap snapshot endpoint (#2814) 2026-09-16 18:56:01 +02:00
HampusandGitHub 4ef9c4c65b fix(api): restore commas in geoip location labels (#2812) 2026-09-16 18:27:50 +02:00
HampusandGitHub 3276039e41 feat(admin): audit admin reads and filter the log by access (#2811) 2026-09-16 17:23:03 +02:00
HampusandGitHub 03d1354562 chore(voice): remove voice reconciliation leftovers (#2810) 2026-09-16 17:09:57 +02:00
HampusandGitHub 964845d7a7 chore(voice): remove the recon service (#2808) 2026-09-16 16:53:30 +02:00
HampusandGitHub 3bc5dd8e0f fix(gateway): always clear expired custom statuses (#2807) 2026-09-16 16:52:22 +02:00
HampusandGitHub 17292fd6a5 fix(app): stop plain unicode symbols rendering as color emoji (#2806) 2026-09-16 16:33:13 +02:00
TarekandGitHub f753659899 feat(instance): make the status page URL configurable (#1159) 2026-09-16 15:20:37 +02:00
HampusandGitHub 7412ec3395 refactor(api): purge cache by canonical media prefix (#2802) 2026-09-16 02:32:36 +02:00
HampusandGitHub 570c8776c4 fix(api): require manage messages to remove others' reactions (#2799) 2026-09-15 18:16:55 +02:00
HampusandGitHub 910db6734b feat(experiments): ship seven treatments to everyone (#2798) 2026-09-15 18:03:35 +02:00
HampusandGitHub 9e614026d7 fix(api): stop exporting the change feed stats type (#2797) 2026-09-15 17:27:09 +02:00
HampusandGitHub b38e7c6433 feat(api): publish object storage changes to a JetStream feed (#2796) 2026-09-15 17:20:26 +02:00
HampusandGitHub 83c8e91955 fix(app): fit the user area popout shadow to its card (#2795) 2026-09-15 17:11:43 +02:00
HampusandGitHub 0532dd0440 fix(app): stop guild banner jumps and restore hover animation (#2792) 2026-09-15 09:31:52 +02:00
HampusandGitHub a08615e306 fix(gateway): match member search on username and global name (#2791) 2026-09-15 08:48:33 +02:00
HampusandGitHub f4c5fee17e feat(app): rank forward destinations and preview the message (#2790) 2026-09-15 07:23:26 +02:00
HampusandGitHub c5aaf65a10 fix(app): list friends with closed DMs in the forward modal (#2787) 2026-09-15 00:39:18 +02:00
HampusandGitHub 951e39da3d feat(api): add expression source guild routes (#2786) 2026-09-15 00:31:47 +02:00
HampusandGitHub b693d84d2b fix(openapi): restore named discriminated union branches (#2785) 2026-09-14 23:42:26 +02:00
HampusandGitHub 9bbf6c513b fix(installer): say what the email prompt is for (#2784) 2026-09-14 23:07:03 +02:00
HampusandGitHub 50cec92738 fix(api): batch member user lookups on guild load (#2783) 2026-09-14 23:06:36 +02:00
HampusandGitHub c212d315f4 fix(app): gate reworked typing indicators behind an experiment (#2782) 2026-09-14 21:54:52 +02:00
HampusandGitHub 1861432a53 fix(app): scope message rings and reach the composer by key (#2781) 2026-09-14 21:44:12 +02:00
HampusandGitHub d0c6146429 feat(app): gate a collapsing guild header behind an experiment (#2779) 2026-09-14 21:15:31 +02:00
HampusandGitHub 550e6b05a1 fix(app): show hover highlight and inset the focus ring (#2778) 2026-09-14 20:51:59 +02:00
HampusandGitHub 5b6949170f chore(donations): drop the donor email case backfill script (#2776) 2026-09-14 20:45:38 +02:00
HampusandGitHub f32bc37794 fix(guild): correct activity log sentence presentation (#2777) 2026-09-14 20:43:08 +02:00
HampusandGitHub 8ee2279b4b feat(donations): add Nordic currencies, raise amount ceilings (#2775) 2026-09-14 20:27:24 +02:00
HampusandGitHub 6339c3b8ad feat(app): gate the expression info card behind an experiment (#2773) 2026-09-14 20:14:58 +02:00
HampusandGitHub 7c9274847f feat(gateway): list bot ready guilds as unavailable (#2774) 2026-09-14 20:08:26 +02:00
HampusandGitHub 5d1dddc093 fix(deps): update rustls for RUSTSEC-2026-0285 (#2772) 2026-09-14 19:01:22 +02:00
HampusandGitHub 04481d7235 fix(app): keep blockquotes open across pasted lines (#2771) 2026-09-14 18:54:04 +02:00
Hampus Kraft a3d6cf37cb fix(guild): render activity log entries deterministically (#2766) 2026-09-14 17:39:19 +02:00
HampusandGitHub ed10f9d323 fix(app): gate blocked group rendering behind an experiment (#2763) 2026-09-14 16:08:19 +02:00
HampusandGitHub 4b278a0da8 fix(app): gate one-Tab message focus behind an experiment (#2762) 2026-09-14 15:55:00 +02:00
HampusandGitHub 1281045648 fix(app): gate single-source message hover behind an experiment (#2761) 2026-09-14 15:37:37 +02:00
HampusandGitHub 69c42cff90 docs: reword vague sentences and fix wrong claims (#2760) 2026-09-14 15:18:53 +02:00
HampusandGitHub 7d56481aba fix(app): copy selected message text without markdown (#2759) 2026-09-14 14:53:53 +02:00
HampusandGitHub 91a2604e9e fix(admin): apply audit logs and side effects to bulk actions (#2758) 2026-09-14 14:34:43 +02:00
HampusandGitHub a9dc74a520 fix(app): hide unread channels in muted collapsed categories (#2752) 2026-09-13 23:59:28 +02:00
HampusandGitHub a9cc04d277 fix(media-proxy): retry relay uploads on dropped connections (#2751) 2026-09-13 23:35:09 +02:00
HampusandGitHub 8cb097f954 fix(i18n): review translations and fix i18n library misuse (#2750) 2026-09-13 22:58:09 +02:00
HampusandGitHub 78f783f0c4 fix(media-proxy): retry dropped connections and log the cause (#2749) 2026-09-13 22:39:13 +02:00
Hampus Kraft d14998ff69 fix(app): back off image, reaction and settings retries on 429 (#2743) 2026-09-13 21:04:31 +02:00
HampusandGitHub ca7ddd9272 refactor(api): drop Bunny for pluggable cache purge adapters (#2742) 2026-09-13 20:28:56 +02:00
HampusandGitHub 84dcf6b8a8 refactor(imports): replace relative imports with path aliases (#2741) 2026-09-13 20:18:22 +02:00
3913 changed files with 415501 additions and 381193 deletions
+9 -11
View File
@@ -1,14 +1,14 @@
FROM chrislusf/seaweedfs:4.31 AS seaweedfs
FROM chrislusf/seaweedfs:4.47 AS seaweedfs
FROM erlang:28.5.0.1
FROM erlang:28.5.0.6
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=1000
ARG NODE_MAJOR=24
ARG ELP_VERSION=2026-02-27
ARG PNPM_VERSION=10.29.3
ARG WASM_BINDGEN_VERSION=0.2.123
ARG NODE_MAJOR=26
ARG ELP_VERSION=2026-08-10
ARG PNPM_VERSION=11.27.0
ARG WASM_BINDGEN_VERSION=0.2.128
ENV DEBIAN_FRONTEND=noninteractive
@@ -131,7 +131,8 @@ RUN apt-get update \
RUN curl --retry 5 --retry-delay 2 --retry-all-errors -fsSL https://deb.nodesource.com/setup_${NODE_MAJOR}.x | bash - \
&& apt-get install -y --no-install-recommends nodejs \
&& rm -rf /var/lib/apt/lists/* \
&& corepack enable
&& npm install -g "pnpm@${PNPM_VERSION}" \
&& pnpm --version
RUN python3 -m pip install --break-system-packages --no-cache-dir awscli
@@ -167,7 +168,7 @@ RUN ARCH="$(dpkg --print-architecture)" \
arm64) ELP_ARCH="aarch64" ;; \
*) echo "Unsupported architecture for ELP: $ARCH" >&2; exit 1 ;; \
esac \
&& curl --retry 5 --retry-delay 2 --retry-all-errors -fsSL "https://github.com/WhatsApp/erlang-language-platform/releases/download/${ELP_VERSION}/elp-linux-${ELP_ARCH}-unknown-linux-gnu-otp-28.tar.gz" -o /tmp/elp.tgz \
&& curl --retry 5 --retry-delay 2 --retry-all-errors -fsSL "https://github.com/WhatsApp/erlang-language-platform/releases/download/${ELP_VERSION}/elp-linux-${ELP_ARCH}-unknown-linux-gnu-otp-28.5.tar.gz" -o /tmp/elp.tgz \
&& tar -C /usr/local/bin -xzf /tmp/elp.tgz elp \
&& chmod +x /usr/local/bin/elp \
&& rm /tmp/elp.tgz
@@ -194,7 +195,4 @@ RUN curl --retry 5 --retry-delay 2 --retry-all-errors -fsSL https://sh.rustup.rs
&& cargo install wasm-bindgen-cli --version "${WASM_BINDGEN_VERSION}" --locked \
&& rm -rf "/home/${USERNAME}/.cargo/registry" "/home/${USERNAME}/.cargo/git"
RUN corepack prepare "pnpm@${PNPM_VERSION}" --activate \
&& pnpm --version
WORKDIR /workspaces/fluxer
+5 -1
View File
@@ -38,7 +38,11 @@
"customizations": {
"vscode": {
"settings": {
"editor.defaultFormatter": "biomejs.biome"
"editor.defaultFormatter": "biomejs.biome",
"erlang.includePaths": ["."],
"search.exclude": {
"**/_build/default/lib/fluxer_gateway": true
}
},
"extensions": [
"biomejs.biome",
+6 -5
View File
@@ -9,7 +9,7 @@ services:
init: true
environment:
DOCKER_HOST: unix:///var/run/docker.sock
npm_config_store_dir: /home/vscode/.local/share/pnpm/store
pnpm_config_store_dir: /home/vscode/.local/share/pnpm/store
FLUXER_PUBLIC_PORT: "${FLUXER_DEV_PROXY_PORT:-8088}"
FLUXER_PUBLIC_URL: "http://localhost:${FLUXER_DEV_PROXY_PORT:-8088}"
FLUXER_API_ENDPOINT: "http://localhost:${FLUXER_DEV_PROXY_PORT:-8088}/api"
@@ -292,13 +292,13 @@ services:
start_period: 5s
valkey:
image: valkey/valkey:8.1.7-alpine
image: valkey/valkey:9.1.2-alpine
command: ["valkey-server", "--save", "", "--appendonly", "no"]
ports:
- "127.0.0.1:${FLUXER_DEV_VALKEY_PORT:-6379}:6379"
nats:
image: nats:2.14.2-alpine
image: nats:2.14.7-alpine
command: ["-js", "-sd", "/data", "-m", "8222"]
volumes:
- nats-data:/data
@@ -321,9 +321,10 @@ services:
- "127.0.0.1:${FLUXER_DEV_LIVEKIT_UDP_PORT:-7882}:${FLUXER_DEV_LIVEKIT_UDP_PORT:-7882}/udp"
meilisearch:
image: getmeili/meilisearch:v1.12
image: getmeili/meilisearch:v1.53
environment:
MEILI_NO_ANALYTICS: "true"
MEILI_UPGRADE_DB: "true"
MEILI_MASTER_KEY: fluxer-dev-meilisearch
volumes:
- meilisearch-data:/meili_data
@@ -337,7 +338,7 @@ services:
start_period: 5s
mailpit:
image: axllent/mailpit:v1.30
image: axllent/mailpit:v1.31
environment:
MP_DATABASE: /data/mailpit.db
MP_MAX_MESSAGES: 5000
+1
View File
@@ -32,6 +32,7 @@
/fluxer_docs/.astro/
/fluxer_app/.devserver-cache.json
/fluxer_app/pkgs/libfluxcore/
/fluxer_app/pkgs/libfluxwebp/
/fluxer_app/src/features/i18n/locales/*/messages.mjs
/fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
/fluxer_app/src/features/theme/styles/generated/
+2 -2
View File
@@ -28,9 +28,9 @@ f:media_proxy:
f:messages:
- changed-files:
- any-glob-to-any-file: fluxer_messages/**/*
f:recon:
f:push:
- changed-files:
- any-glob-to-any-file: fluxer_recon/**/*
- any-glob-to-any-file: fluxer_push/**/*
f:snowflakes:
- changed-files:
- any-glob-to-any-file: fluxer_snowflakes/**/*
+12 -12
View File
@@ -58,13 +58,13 @@ jobs:
outputs:
build_version: ${{ steps.vars.outputs.build_version }}
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: Create token
id: create-token
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1
@@ -101,19 +101,19 @@ jobs:
- platform: arm64
runner: ubuntu-24.04-arm
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: resolve source date
id: source
run: echo "date=$(TZ=UTC git log -1 --no-show-signature --pretty=%cd --date=format-local:%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT"
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5
- uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ github.token }}
- uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf
- uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc
with:
context: ${{ inputs.context }}
file: ${{ inputs.dockerfile }}
@@ -141,15 +141,15 @@ jobs:
contents: write
packages: write
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5
- uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee
toolchain: "1.98.1"
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -43,13 +43,13 @@ jobs:
outputs:
build_version: ${{ steps.vars.outputs.build_version }}
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: set variables
id: vars
run: >-
@@ -71,20 +71,19 @@ jobs:
BUILD_VERSION: ${{ needs.meta.outputs.build_version }}
PUBLIC_ASSET_BASE_URL: ""
BUNDLE_LOCAL_ASSETS: "true"
FLUXER_APP_PROXY_TIME_FREEZE_ENABLED: "false"
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: prepare docker config
run: >-
tools/ci/run.sh build-app-proxy
--step prepare_docker_config
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069
- name: configure ghcr auth
env:
GHCR_USERNAME: ${{ github.actor }}
@@ -131,19 +130,19 @@ jobs:
- platform: arm64
runner: ubuntu-24.04-arm
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: resolve source date
id: source
run: echo "date=$(TZ=UTC git log -1 --no-show-signature --pretty=%cd --date=format-local:%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT"
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5
- uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf
- uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc
with:
context: .
file: fluxer_app_proxy/Dockerfile
@@ -155,7 +154,6 @@ jobs:
BUILD_VERSION=${{ needs.meta.outputs.build_version }}
SOURCE_SHA=${{ github.sha }}
SOURCE_DATE=${{ steps.source.outputs.date }}
FLUXER_APP_PROXY_TIME_FREEZE_ENABLED=false
APP_ASSETS_REF=ghcr.io/${{ env.GHCR_OWNER }}/fluxer-app-proxy-self-hosted:${{ needs.meta.outputs.build_version }}-assets
APP_ASSETS_PLATFORM=linux/amd64
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_OWNER }}/fluxer-app-proxy-self-hosted:buildcache-${{ matrix.platform }}
@@ -173,15 +171,15 @@ jobs:
contents: write
packages: write
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5
- uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee
toolchain: "1.98.1"
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f
with:
registry: ghcr.io
username: ${{ github.actor }}
+20 -20
View File
@@ -43,13 +43,13 @@ jobs:
outputs:
build_version: ${{ steps.vars.outputs.build_version }}
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: set variables
id: vars
run: >-
@@ -67,18 +67,18 @@ jobs:
contents: read
packages: write
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: prepare docker config
run: >-
tools/ci/run.sh build-app-proxy
--step prepare_docker_config
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069
- name: configure ghcr auth
env:
GHCR_USERNAME: ${{ github.actor }}
@@ -131,13 +131,13 @@ jobs:
contents: read
packages: write
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: resolve source date
id: source
run: echo "date=$(TZ=UTC git log -1 --no-show-signature --pretty=%cd --date=format-local:%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT"
@@ -145,7 +145,7 @@ jobs:
run: >-
tools/ci/run.sh build-app-proxy
--step prepare_docker_config
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069
- name: configure ghcr auth
env:
GHCR_USERNAME: ${{ github.actor }}
@@ -178,19 +178,19 @@ jobs:
contents: read
packages: write
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: resolve source date
id: source
run: echo "date=$(TZ=UTC git log -1 --no-show-signature --pretty=%cd --date=format-local:%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT"
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5
- uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf
- uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc
with:
context: .
file: fluxer_app_proxy/Dockerfile
@@ -219,15 +219,15 @@ jobs:
contents: write
packages: write
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5
- uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee
toolchain: "1.98.1"
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f
with:
registry: ghcr.io
username: ${{ github.actor }}
+68 -109
View File
@@ -11,11 +11,6 @@ on:
- stable
- canary
default: stable
test_build:
description: Stash artifacts under desktop-test/ instead of desktop/ (API will not pick these up as a release).
required: false
default: false
type: boolean
build_version:
description: Explicit Fluxer CalVer build version (YYYY.MDD.MICRO, UTC HHMMSS without leading zeroes) to use instead of automatic UTC clock allocation.
required: false
@@ -32,13 +27,12 @@ permissions:
actions: read
concurrency:
group: desktop-${{ inputs.channel }}-${{ inputs.test_build && 'test' || 'release' }}
group: desktop-${{ inputs.channel }}
cancel-in-progress: true
env:
CHANNEL: ${{ inputs.channel }}
BUILD_CHANNEL: ${{ inputs.channel == 'canary' && 'canary' || 'stable' }}
TEST_BUILD: ${{ inputs.test_build && 'true' || 'false' }}
jobs:
meta:
@@ -53,19 +47,17 @@ jobs:
pub_date: ${{ steps.meta.outputs.pub_date }}
channel: ${{ steps.meta.outputs.channel }}
build_channel: ${{ steps.meta.outputs.build_channel }}
test_build: ${{ steps.meta.outputs.test_build }}
s3_prefix: ${{ steps.meta.outputs.s3_prefix }}
source_sha: ${{ steps.meta.outputs.source_sha }}
steps:
- name: Checkout source
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
ref: main
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: Create token
id: create-token
@@ -85,7 +77,6 @@ jobs:
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-desktop
--step set_metadata
--channel "${{ inputs.channel }}"
--test-build "${{ inputs.test_build }}"
matrix:
name: Resolve build matrix
@@ -98,12 +89,12 @@ jobs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout source
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: Build platform matrix
id: set-matrix
@@ -113,7 +104,7 @@ jobs:
--skip-targets "${{ inputs.skip_targets }}"
build:
name: Build ${{ matrix.platform }} (${{ matrix.arch }}, ${{ matrix.desktop_variant }})
name: Build ${{ matrix.platform }} (${{ matrix.arch }})
needs:
- meta
- matrix
@@ -137,41 +128,34 @@ jobs:
PUBLIC_BUILD_VERSION: ${{ needs.meta.outputs.version }}
PUB_DATE: ${{ needs.meta.outputs.pub_date }}
SOURCE_SHA: ${{ needs.meta.outputs.source_sha }}
S3_DESKTOP_PREFIX: ${{ needs.meta.outputs.s3_prefix }}
DESKTOP_HANDOFF_PREFIX: _handoff/desktop/${{ needs.meta.outputs.build_channel }}/${{ needs.meta.outputs.version }}/${{ needs.meta.outputs.source_sha }}
S3_ENDPOINT: ${{ vars.DOWNLOADS_S3_ENDPOINT }}
S3_BUCKET: ${{ vars.DOWNLOADS_S3_BUCKET }}
AWS_ACCESS_KEY_ID: ${{ secrets.DOWNLOADS_AWS_ACCESS_KEY_ID || secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.DOWNLOADS_AWS_SECRET_ACCESS_KEY || secrets.AWS_SECRET_ACCESS_KEY }}
DESKTOP_PLATFORM: ${{ matrix.platform }}
DESKTOP_ARCH: ${{ matrix.arch }}
DESKTOP_VARIANT: ${{ matrix.desktop_variant }}
PLATFORM: ${{ matrix.platform }}
ARCH: ${{ matrix.arch }}
ELECTRON_ARCH: ${{ matrix.electron_arch }}
steps:
- name: Checkout CI helpers
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
ref: ${{ needs.meta.outputs.source_sha }}
path: _ci
- name: Checkout source
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
ref: ${{ needs.meta.outputs.source_sha }}
path: source
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: Set up Python (Windows)
if: runner.os == 'Windows'
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
with:
python-version: "3.13"
python-version: "3.14"
- name: Ensure python3 command (Windows)
if: runner.os == 'Windows'
@@ -196,14 +180,14 @@ jobs:
--step set_workdir_unix
- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: 24
node-version: 26
- name: Set up pnpm via corepack
- name: Set up pnpm
run: >-
cargo run --locked --quiet --manifest-path ${{ github.workspace }}/_ci/tools/ci/Cargo.toml -- build-desktop
--step setup_pnpm_corepack
--step setup_pnpm
- name: Resolve pnpm store path (Windows)
if: runner.os == 'Windows'
@@ -247,9 +231,9 @@ jobs:
- name: Set up Rust toolchain (Unix)
if: matrix.platform != 'windows'
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
targets: ${{ matrix.platform == 'macos' && 'aarch64-apple-darwin,x86_64-apple-darwin' || (matrix.arch == 'arm64' && 'aarch64-unknown-linux-gnu' || 'x86_64-unknown-linux-gnu') }}
- name: Install MSVC ARM64 build tools
@@ -260,7 +244,7 @@ jobs:
- name: Set up MSVC env (Windows)
if: matrix.platform == 'windows'
uses: TheMrMilchmann/setup-msvc-dev@79dac248aac9d0059f86eae9d8b5bfab4e95e97c
uses: TheMrMilchmann/setup-msvc-dev@368ef7d1ee4d1171b31d4a7f67f4d954f903f5a9
with:
arch: ${{ matrix.arch == 'arm64' && 'amd64_arm64' || 'amd64' }}
@@ -302,9 +286,9 @@ jobs:
- name: Set up .NET SDK (Windows)
if: matrix.platform == 'windows'
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68
with:
dotnet-version: "8.0.x"
dotnet-version: "10.0.x"
- name: Install Velopack CLI
if: matrix.platform == 'windows'
@@ -363,7 +347,7 @@ jobs:
- name: Azure login for Artifact Signing
if: matrix.platform == 'windows'
uses: azure/login@532459ea530d8321f2fb9bb10d1e0bcf23869a43
uses: azure/login@a641126d1b8aa4d1fa005f4f92df94a3a4c4c906
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
@@ -477,6 +461,12 @@ jobs:
cargo run --locked --quiet --manifest-path ${{ github.workspace }}/_ci/tools/ci/Cargo.toml -- build-desktop
--step prepare_artifacts_unix
- name: Build AppImage update feed (Linux)
if: matrix.platform == 'linux'
run: >-
cargo run --locked --quiet --manifest-path ${{ github.workspace }}/_ci/tools/ci/Cargo.toml -- build-desktop
--step build_appimage_update_feed
- name: Normalize updater YAML (macOS)
if: matrix.platform == 'macos'
run: >-
@@ -495,13 +485,23 @@ jobs:
cargo run --locked --quiet --manifest-path ${{ github.workspace }}/_ci/tools/ci/Cargo.toml -- build-desktop
--step generate_checksums_windows
- name: Upload artifacts to S3 handoff
- name: Stage build artifacts
id: handoff
run: >-
cargo run --locked --quiet --manifest-path ${{ github.workspace }}/_ci/tools/ci/Cargo.toml -- build-desktop
--step upload_handoff
--step stage_handoff
- name: Upload build artifacts
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: ${{ steps.handoff.outputs.artifact_name }}
path: upload_staging
if-no-files-found: error
retention-days: 1
compression-level: 0
upload:
name: Upload to S3
name: Assemble desktop release assets
if: ${{ !cancelled() && needs.build.result == 'success' }}
needs:
- meta
@@ -520,34 +520,26 @@ jobs:
BUILD_VERSION: ${{ needs.meta.outputs.version }}
PUBLIC_BUILD_VERSION: ${{ needs.meta.outputs.version }}
PUB_DATE: ${{ needs.meta.outputs.pub_date }}
TEST_BUILD: ${{ needs.meta.outputs.test_build }}
SOURCE_SHA: ${{ needs.meta.outputs.source_sha }}
S3_DESKTOP_PREFIX: ${{ needs.meta.outputs.s3_prefix }}
DESKTOP_HANDOFF_PREFIX: _handoff/desktop/${{ needs.meta.outputs.build_channel }}/${{ needs.meta.outputs.version }}/${{ needs.meta.outputs.source_sha }}
DESKTOP_RELEASE_ASSETS_PREFIX: _handoff/desktop-release-assets/${{ needs.meta.outputs.build_channel }}/${{ needs.meta.outputs.version }}/${{ needs.meta.outputs.source_sha }}
DESKTOP_METADATA_PREFIX: _handoff/desktop-metadata/${{ needs.meta.outputs.build_channel }}/${{ needs.meta.outputs.version }}/${{ needs.meta.outputs.source_sha }}
S3_ENDPOINT: ${{ vars.DOWNLOADS_S3_ENDPOINT }}
S3_BUCKET: ${{ vars.DOWNLOADS_S3_BUCKET }}
PUBLIC_DL_BASE: https://api.fluxer.app/dl
AWS_ACCESS_KEY_ID: ${{ secrets.DOWNLOADS_AWS_ACCESS_KEY_ID || secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.DOWNLOADS_AWS_SECRET_ACCESS_KEY || secrets.AWS_SECRET_ACCESS_KEY }}
steps:
- name: Checkout source
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
ref: ${{ needs.meta.outputs.source_sha }}
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: Download S3 handoff artifacts
run: >-
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-desktop
--step download_handoff
- name: Download build artifacts
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
with:
path: artifacts
pattern: fluxer-desktop-${{ needs.meta.outputs.build_channel }}-*
- name: Build S3 payload layout (+ manifest.json)
- name: Build payload layout (+ manifest.json)
env:
VERSION: ${{ needs.meta.outputs.version }}
PUB_DATE: ${{ needs.meta.outputs.pub_date }}
@@ -556,42 +548,27 @@ jobs:
--step build_payload
- name: Prepare GitHub release assets
if: needs.meta.outputs.test_build != 'true'
run: >-
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-desktop
--step prepare_release_assets
- name: Publish GitHub release descriptor
if: needs.meta.outputs.test_build != 'true'
run: >-
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-desktop
--step publish_release_descriptor
- name: Upload payload to S3
run: >-
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-desktop
--step upload_payload
- name: Upload GitHub release asset handoff
if: needs.meta.outputs.test_build != 'true'
run: >-
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-desktop
--step upload_release_assets
- name: Upload GitHub release assets
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: fluxer-desktop-release-assets
path: release_assets
if-no-files-found: error
retention-days: 1
compression-level: 0
- name: Build summary
run: >-
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-desktop
--step build_summary
- name: Cleanup S3 handoff
if: ${{ success() }}
run: >-
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-desktop
--step cleanup_handoff
publish_release:
name: Publish GitHub desktop release
if: ${{ !cancelled() && needs.upload.result == 'success' && needs.meta.outputs.test_build != 'true' }}
if: ${{ !cancelled() && needs.upload.result == 'success' }}
needs:
- meta
- upload
@@ -603,28 +580,22 @@ jobs:
env:
CHANNEL: ${{ needs.meta.outputs.build_channel }}
VERSION: ${{ needs.meta.outputs.version }}
S3_DESKTOP_PREFIX: ${{ needs.meta.outputs.s3_prefix }}
DESKTOP_RELEASE_ASSETS_PREFIX: _handoff/desktop-release-assets/${{ needs.meta.outputs.build_channel }}/${{ needs.meta.outputs.version }}/${{ needs.meta.outputs.source_sha }}
DESKTOP_METADATA_PREFIX: _handoff/desktop-metadata/${{ needs.meta.outputs.build_channel }}/${{ needs.meta.outputs.version }}/${{ needs.meta.outputs.source_sha }}
S3_ENDPOINT: ${{ vars.DOWNLOADS_S3_ENDPOINT }}
S3_BUCKET: ${{ vars.DOWNLOADS_S3_BUCKET }}
AWS_ACCESS_KEY_ID: ${{ secrets.DOWNLOADS_AWS_ACCESS_KEY_ID || secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.DOWNLOADS_AWS_SECRET_ACCESS_KEY || secrets.AWS_SECRET_ACCESS_KEY }}
steps:
- name: Checkout source
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
ref: ${{ needs.meta.outputs.source_sha }}
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: Download GitHub release assets
run: >-
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-desktop
--step download_release_assets
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
with:
name: fluxer-desktop-release-assets
path: release_assets
- name: Create token
id: create-token
@@ -656,15 +627,3 @@ jobs:
release_args+=(--prerelease)
fi
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- "${release_args[@]}"
- name: Publish GitHub release readiness marker
env:
SOURCE_SHA: ${{ needs.meta.outputs.source_sha }}
run: >-
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-desktop
--step publish_release_marker
- name: Publish payload metadata to S3
run: >-
cargo run --locked --quiet --manifest-path tools/ci/Cargo.toml -- build-desktop
--step publish_payload_metadata
@@ -1,5 +1,5 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
name: build recon
name: build push
on:
workflow_dispatch:
@@ -31,6 +31,6 @@ jobs:
uses: ./.github/workflows/_build-image.yaml
secrets: inherit
with:
image: fluxer-recon
dockerfile: fluxer_recon/Dockerfile
image: fluxer-push
dockerfile: fluxer_push/Dockerfile
build-version: ${{ inputs['build-version'] }}
+6 -6
View File
@@ -19,22 +19,22 @@ jobs:
timeout-minutes: 15
steps:
- name: Checkout fluxer
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: Install pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413
- name: Install Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: '24'
node-version: '26'
cache: 'pnpm'
- name: Install dependencies
+6 -6
View File
@@ -35,24 +35,24 @@ jobs:
permission-pull-requests: write
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
token: ${{ steps.create-token.outputs.token }}
fetch-depth: 0
persist-credentials: false
- name: Set up Rust toolchain
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: Install pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413
- name: Install Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: "24"
node-version: "26"
cache: "pnpm"
- name: Install dependencies
+6 -6
View File
@@ -40,7 +40,7 @@ jobs:
permission-pull-requests: write
- name: Checkout Weblate branch
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
token: ${{ steps.create-token.outputs.token }}
ref: ${{ env.WEBLATE_BRANCH }}
@@ -48,17 +48,17 @@ jobs:
persist-credentials: false
- name: Set up Rust toolchain
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: Install pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413
- name: Install Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: "24"
node-version: "26"
cache: "pnpm"
- name: Install dependencies
+1 -1
View File
@@ -19,7 +19,7 @@ jobs:
permission-pull-requests: write
- name: Label pull request
uses: actions/labeler@f27b608878404679385c85cfa523b85ccb86e213
uses: actions/labeler@bf12e9b00b37c5c0ca2b87b79b2daf7891dbda13
with:
repo-token: ${{ steps.create-token.outputs.token }}
configuration-path: .github/labeller.yaml
+5 -5
View File
@@ -56,15 +56,15 @@ jobs:
contents: write
packages: read
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
- uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5
- uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee
toolchain: "1.98.1"
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f
with:
registry: ghcr.io
username: ${{ github.actor }}
+81 -56
View File
@@ -28,12 +28,12 @@ jobs:
FLUXER_CI_BIN: ${{ github.workspace }}/target/debug/fluxer-ci
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
targets: wasm32-unknown-unknown
- name: Restore ci helper
@@ -42,7 +42,7 @@ jobs:
with:
path: target/debug/fluxer-ci
key: >-
fluxer-ci-bin-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'Cargo.toml',
fluxer-ci-bin-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'Cargo.toml',
'tools/ci/Cargo.toml', 'tools/ci/src/**', 'tools/ci/templates/**') }}
- name: Build ci helper
@@ -55,16 +55,16 @@ jobs:
with:
path: target/debug/fluxer-ci
key: >-
fluxer-ci-bin-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'Cargo.toml',
fluxer-ci-bin-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'Cargo.toml',
'tools/ci/Cargo.toml', 'tools/ci/src/**', 'tools/ci/templates/**') }}
- name: Install pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413
- name: Install Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: '24'
node-version: '26'
cache: 'pnpm'
- name: Install dependencies
@@ -83,12 +83,12 @@ jobs:
PNPM_TEST_WORKSPACE_CONCURRENCY: '2'
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
targets: wasm32-unknown-unknown
- name: Restore ci helper
@@ -97,7 +97,7 @@ jobs:
with:
path: target/debug/fluxer-ci
key: >-
fluxer-ci-bin-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'Cargo.toml',
fluxer-ci-bin-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'Cargo.toml',
'tools/ci/Cargo.toml', 'tools/ci/src/**', 'tools/ci/templates/**') }}
- name: Build ci helper
@@ -105,12 +105,12 @@ jobs:
run: cargo build --locked --package fluxer-ci
- name: Install pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413
- name: Install Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: '24'
node-version: '26'
cache: 'pnpm'
- name: Install dependencies
@@ -123,12 +123,16 @@ jobs:
with:
path: |
fluxer_app/pkgs/libfluxcore
fluxer_app/pkgs/libfluxwebp
fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
key: >-
app-wasm-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
app-wasm-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts',
'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock',
'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**',
'fluxer_app/rust/libfluxwebp/Cargo.toml', 'fluxer_app/rust/libfluxwebp/Cargo.lock',
'fluxer_app/rust/libfluxwebp/src/**', 'fluxer_app/rust/libfluxwebp/shim/**',
'fluxer_app/rust/libfluxwebp/simd/**',
'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml',
'packages/markdown_parser/rust/src/**') }}
@@ -142,12 +146,16 @@ jobs:
with:
path: |
fluxer_app/pkgs/libfluxcore
fluxer_app/pkgs/libfluxwebp
fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
key: >-
app-wasm-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
app-wasm-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts',
'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock',
'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**',
'fluxer_app/rust/libfluxwebp/Cargo.toml', 'fluxer_app/rust/libfluxwebp/Cargo.lock',
'fluxer_app/rust/libfluxwebp/src/**', 'fluxer_app/rust/libfluxwebp/shim/**',
'fluxer_app/rust/libfluxwebp/simd/**',
'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml',
'packages/markdown_parser/rust/src/**') }}
@@ -156,21 +164,21 @@ jobs:
timeout-minutes: 45
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
components: clippy, rustfmt
- name: Install pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413
- name: Install Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: '24'
node-version: '26'
cache: 'pnpm'
- name: Cache cargo
@@ -185,11 +193,14 @@ jobs:
rust-${{ runner.os }}-${{ hashFiles('fluxer_media_proxy/tools/install-native-deps.sh') }}-
- name: Install cargo-deny
run: cargo install cargo-deny --version 0.19.6 --locked
run: cargo install cargo-deny --version 0.20.2 --locked
- name: Check Rust dependencies
run: cargo deny --locked check -D warnings
- name: Check libfluxwebp dependencies
run: cargo deny --manifest-path fluxer_app/rust/libfluxwebp/Cargo.toml --config deny.toml --locked check licenses bans sources
- name: Check desktop native dependencies
run: tools/ci/check-desktop-native-workspaces.sh dependencies
@@ -242,6 +253,9 @@ jobs:
- name: Check formatting
run: cargo fmt --all -- --check
- name: Check formatting (libfluxwebp)
run: cargo fmt --manifest-path fluxer_app/rust/libfluxwebp/Cargo.toml -- --check
- name: Check formatting (desktop native workspaces)
run: tools/ci/check-desktop-native-workspaces.sh fmt
@@ -273,12 +287,12 @@ jobs:
FLUXER_CI_BIN: ${{ github.workspace }}/target/debug/fluxer-ci
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
- name: Cache cargo (gateway NIFs)
uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6
@@ -294,7 +308,7 @@ jobs:
with:
path: target/debug/fluxer-ci
key: >-
fluxer-ci-bin-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'Cargo.toml',
fluxer-ci-bin-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'Cargo.toml',
'tools/ci/Cargo.toml', 'tools/ci/src/**', 'tools/ci/templates/**') }}
- name: Build ci helper
@@ -305,7 +319,7 @@ jobs:
uses: erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124
with:
otp-version: '28'
rebar3-version: '3.24.0'
rebar3-version: '3.27.0'
- name: Restore rebar3 dependencies
id: rebar3-cache
@@ -317,10 +331,13 @@ jobs:
!fluxer_gateway/_build/default/lib/fluxer_gateway/**
!fluxer_gateway/_build/test/lib/fluxer_gateway/**
key: >-
rebar3-${{ runner.os }}-otp28-rebar3.24.0-${{ hashFiles('fluxer_gateway/rebar.lock',
rebar3-${{ runner.os }}-otp28-rebar3.27.0-${{ hashFiles('fluxer_gateway/rebar.lock',
'fluxer_gateway/rebar.config') }}
restore-keys: |
rebar3-${{ runner.os }}-otp28-rebar3.24.0-
rebar3-${{ runner.os }}-otp28-rebar3.27.0-
- name: Drop restored gateway build output
run: rm -rf fluxer_gateway/_build/default/lib/fluxer_gateway fluxer_gateway/_build/test/lib/fluxer_gateway
- name: Check formatting
run: |
@@ -348,7 +365,7 @@ jobs:
!fluxer_gateway/_build/default/lib/fluxer_gateway/**
!fluxer_gateway/_build/test/lib/fluxer_gateway/**
key: >-
rebar3-${{ runner.os }}-otp28-rebar3.24.0-${{ hashFiles('fluxer_gateway/rebar.lock',
rebar3-${{ runner.os }}-otp28-rebar3.27.0-${{ hashFiles('fluxer_gateway/rebar.lock',
'fluxer_gateway/rebar.config') }}
knip:
@@ -358,12 +375,12 @@ jobs:
FLUXER_CI_BIN: ${{ github.workspace }}/target/debug/fluxer-ci
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Set up Rust toolchain (CI helpers)
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de
with:
toolchain: "1.93.0"
toolchain: "1.98.1"
targets: wasm32-unknown-unknown
- name: Restore ci helper
@@ -372,7 +389,7 @@ jobs:
with:
path: target/debug/fluxer-ci
key: >-
fluxer-ci-bin-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'Cargo.toml',
fluxer-ci-bin-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'Cargo.toml',
'tools/ci/Cargo.toml', 'tools/ci/src/**', 'tools/ci/templates/**') }}
- name: Build ci helper
@@ -380,12 +397,12 @@ jobs:
run: cargo build --locked --package fluxer-ci
- name: Install pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413
- name: Install Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: '24'
node-version: '26'
cache: 'pnpm'
- name: Install dependencies
@@ -398,12 +415,16 @@ jobs:
with:
path: |
fluxer_app/pkgs/libfluxcore
fluxer_app/pkgs/libfluxwebp
fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
key: >-
app-wasm-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
app-wasm-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts',
'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock',
'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**',
'fluxer_app/rust/libfluxwebp/Cargo.toml', 'fluxer_app/rust/libfluxwebp/Cargo.lock',
'fluxer_app/rust/libfluxwebp/src/**', 'fluxer_app/rust/libfluxwebp/shim/**',
'fluxer_app/rust/libfluxwebp/simd/**',
'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml',
'packages/markdown_parser/rust/src/**') }}
@@ -417,12 +438,16 @@ jobs:
with:
path: |
fluxer_app/pkgs/libfluxcore
fluxer_app/pkgs/libfluxwebp
fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
key: >-
app-wasm-${{ runner.os }}-1.93.0-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
app-wasm-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts',
'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock',
'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**',
'fluxer_app/rust/libfluxwebp/Cargo.toml', 'fluxer_app/rust/libfluxwebp/Cargo.lock',
'fluxer_app/rust/libfluxwebp/src/**', 'fluxer_app/rust/libfluxwebp/shim/**',
'fluxer_app/rust/libfluxwebp/simd/**',
'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml',
'packages/markdown_parser/rust/src/**') }}
@@ -431,15 +456,15 @@ jobs:
timeout-minutes: 15
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Install pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413
- name: Install Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: '24'
node-version: '26'
cache: 'pnpm'
- name: Install dependencies
@@ -456,15 +481,15 @@ jobs:
timeout-minutes: 25
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Install pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413
- name: Install Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: '24'
node-version: '26'
cache: 'pnpm'
- name: Install dependencies
@@ -490,15 +515,15 @@ jobs:
timeout-minutes: 15
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Install pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413
- name: Install Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020
with:
node-version: '24'
node-version: '26'
cache: 'pnpm'
- name: Install dependencies
@@ -515,12 +540,12 @@ jobs:
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Set up Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
with:
python-version: "3.13"
python-version: "3.14"
- name: Install font tooling
run: python3 -m pip install -r tools/fonts/requirements.txt
+2
View File
@@ -10,6 +10,7 @@
/.direnv/
/.fluxer/
/.pnpm-store/
/.vscode/
**/*.css.d.ts
**/*.tsbuildinfo
@@ -25,6 +26,7 @@
/fluxer_app/.devserver-cache.json
/fluxer_app/pkgs/libfluxcore/
/fluxer_app/pkgs/libfluxwebp/
/fluxer_app/src/features/i18n/locales/*/messages.mjs
/fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
/fluxer_app/src/features/theme/styles/generated/
Generated
+860 -867
View File
File diff suppressed because it is too large Load Diff
+1 -2
View File
@@ -7,15 +7,14 @@ members = [
"fluxer_gifs",
"fluxer_svc",
"fluxer_messages",
"fluxer_push",
"fluxer_snowflakes",
"tools/ci",
"tools/content/update-frozen-snapshot",
"tools/dev",
"tools/i18n_auto",
"fluxer_users",
"fluxer_unfurl",
"packages/markdown_parser/rust",
"fluxer_recon",
]
exclude = [
"packages/markdown_parser/rust/fuzz",
+158 -3
View File
@@ -6,18 +6,173 @@
</p>
<p align="center">
<a href="https://fluxer.app/donate">
<img src="https://img.shields.io/badge/Donate-fluxer.app%2Fdonate-brightgreen" alt="Donate" /></a>
<a href="https://fluxer.app/download">
<img src="https://img.shields.io/badge/Download-fluxer.app-4641D9" alt="Download" /></a>
<a href="https://docs.fluxer.app">
<img src="https://img.shields.io/badge/Docs-docs.fluxer.app-blue" alt="Documentation" /></a>
<a href="https://fluxer.app/donate">
<img src="https://img.shields.io/badge/Donate-fluxer.app%2Fdonate-brightgreen" alt="Donate" /></a>
<a href="./LICENSE">
<img src="https://img.shields.io/badge/License-AGPLv3-purple" alt="AGPLv3 License" /></a>
</p>
<p align="center">
<a href="https://flathub.org/apps/app.fluxer.Fluxer">
<img src="https://dl.flathub.org/assets/badges/flathub-badge-en.svg" alt="Get it on Flathub" height="60" /></a>
</p>
# Fluxer
Fluxer is a free and open source instant messaging and VoIP chat app built for friends, groups, and communities.
<p align="center">
<img src="./fluxer_static/marketing/screenshots/desktop-readme-1920w.png" alt="Fluxer app showcase" width="900">
<img src="./fluxer_static/marketing/screenshots/desktop-readme-1920w.png" alt="Fluxer running side by side on a desktop monitor and a phone" width="640">
</p>
## Download
| Windows | macOS | Linux | Android | iOS |
| --- | --- | --- | --- | --- |
| [Installer (x64)][win-setup-x64] | [Disk image][mac-dmg] | [Flathub][flathub] | [Google Play (beta)][android-play] | [TestFlight][ios-testflight] |
| [Installer (ARM64)][win-setup-arm64] | | [deb (x64)][linux-deb-x64] | [APK (beta)][android-apk] | |
| [Portable (x64)][win-portable-x64] | | [deb (ARM64)][linux-deb-arm64] | [Obtainium (beta)][obtainium] | |
| [Portable (ARM64)][win-portable-arm64] | | [rpm (x64)][linux-rpm-x64] | | |
| | | [rpm (ARM64)][linux-rpm-arm64] | | |
| | | [AppImage (x64)][linux-appimage-x64] | | |
| | | [AppImage (ARM64)][linux-appimage-arm64] | | |
| | | [tar.gz (x64)][linux-targz-x64] | | |
| | | [tar.gz (ARM64)][linux-targz-arm64] | | |
The macOS disk image runs on both Apple silicon and Intel. Windows and Linux need the build matching your processor.
On Linux, prefer a repository over a single file so Fluxer updates with the rest of your system.
## Linux package repositories
The package is `fluxer` for stable and `fluxer-canary` for canary. apt and dnf subscribe to one channel per entry file. pacman and Flatpak serve both from one repository.
### Flatpak
Stable is on [Flathub][flathub], the easiest route on most desktops:
```sh
flatpak install flathub app.fluxer.Fluxer
```
Flathub has stable only. To use Fluxer's own repository, open [the stable][flatpak-ref] or [the canary][flatpak-canary-ref] reference file and your software manager takes over. Some desktops also accept `flatpak+https://pkgs.fluxer.com/flatpak/fluxer.flatpakref` in the address bar.
From a terminal:
```sh
flatpak install https://pkgs.fluxer.com/flatpak/fluxer.flatpakref
```
### Debian and Ubuntu
```sh
sudo install -d -m 0755 /etc/apt/keyrings
sudo curl -fsSL -o /etc/apt/keyrings/fluxer-archive-keyring.gpg https://pkgs.fluxer.com/keys/fluxer-archive-keyring.gpg
sudo curl -fsSL -o /etc/apt/sources.list.d/fluxer.sources https://pkgs.fluxer.com/deb/fluxer.sources
sudo apt update && sudo apt install fluxer
```
For canary, use the canary entry file and package.
```sh
sudo curl -fsSL -o /etc/apt/sources.list.d/fluxer-canary.sources https://pkgs.fluxer.com/deb/fluxer-canary.sources
sudo apt update && sudo apt install fluxer-canary
```
A `.deb` installed from a download only updates once its channel's entry is added.
### Fedora and RHEL
```sh
sudo curl -fsSL -o /etc/yum.repos.d/fluxer.repo https://pkgs.fluxer.com/rpm/fluxer.repo
sudo dnf install fluxer
```
For canary, use the canary entry file and package.
```sh
sudo curl -fsSL -o /etc/yum.repos.d/fluxer-canary.repo https://pkgs.fluxer.com/rpm/fluxer-canary.repo
sudo dnf install fluxer-canary
```
RHEL, Rocky, Alma and CentOS Stream need `sudo dnf install epel-release` first, because their base repositories lack `libXScrnSaver`. Fedora does not.
### Arch Linux
The repository is signed, so pacman needs the key once:
```sh
sudo pacman-key --init
curl -fsSL -o /tmp/fluxer-archive-keyring.asc https://pkgs.fluxer.com/keys/fluxer-archive-keyring.asc
sudo pacman-key --add /tmp/fluxer-archive-keyring.asc
sudo pacman-key --lsign-key 09D01339EE128925F75E675C855C5BDE34D205D2
```
`--lsign-key` is what makes pacman trust it. Then add the repository:
```sh
sudo tee -a /etc/pacman.conf >/dev/null <<'REPO'
[fluxer]
SigLevel = Required TrustedOnly
Server = https://pkgs.fluxer.com/arch/$repo/os/$arch
REPO
sudo pacman -Syu fluxer
```
Write `$repo` and `$arch` literally. Both are pacman variables, not shell ones, hence the quoted heredoc.
Full setup notes, including canary, are in the [Linux repositories documentation][docs-linux].
## Other ways to run it
- [Open Fluxer in a browser](https://web.fluxer.app), no install needed.
- [Host your own instance][docs-selfhost] from this repository.
## Documentation
- [Documentation home][docs]
- [Downloads][docs-downloads]
- [Self-hosting][docs-selfhost]
## License
The source is licensed under the [AGPL-3.0-or-later](./LICENSE) license.
Fluxer branding, icons, default avatars, badge artwork, screenshots and marketing
imagery are copyright Fluxer, all rights reserved, as set out in
[fluxer_static/LICENSE](./fluxer_static/LICENSE). Third-party material keeps its own
terms, listed in
[fluxer_static/THIRD_PARTY_LICENSES.md](./fluxer_static/THIRD_PARTY_LICENSES.md).
Public availability of this repository does not grant trademark, brand, or
endorsement rights.
[win-setup-x64]: https://pkgs.fluxer.com/desktop/stable/win32/x64/latest/setup
[win-setup-arm64]: https://pkgs.fluxer.com/desktop/stable/win32/arm64/latest/setup
[win-portable-x64]: https://pkgs.fluxer.com/desktop/stable/win32/x64/latest/portable
[win-portable-arm64]: https://pkgs.fluxer.com/desktop/stable/win32/arm64/latest/portable
[mac-dmg]: https://pkgs.fluxer.com/desktop/stable/darwin/arm64/latest/dmg
[linux-deb-x64]: https://pkgs.fluxer.com/desktop/stable/linux/x64/latest/deb
[linux-deb-arm64]: https://pkgs.fluxer.com/desktop/stable/linux/arm64/latest/deb
[linux-rpm-x64]: https://pkgs.fluxer.com/desktop/stable/linux/x64/latest/rpm
[linux-rpm-arm64]: https://pkgs.fluxer.com/desktop/stable/linux/arm64/latest/rpm
[linux-appimage-x64]: https://pkgs.fluxer.com/desktop/stable/linux/x64/latest/appimage
[linux-appimage-arm64]: https://pkgs.fluxer.com/desktop/stable/linux/arm64/latest/appimage
[linux-targz-x64]: https://pkgs.fluxer.com/desktop/stable/linux/x64/latest/tar_gz
[linux-targz-arm64]: https://pkgs.fluxer.com/desktop/stable/linux/arm64/latest/tar_gz
[flatpak-ref]: https://pkgs.fluxer.com/flatpak/fluxer.flatpakref
[flatpak-canary-ref]: https://pkgs.fluxer.com/flatpak/fluxer-canary.flatpakref
[flathub]: https://flathub.org/apps/app.fluxer.Fluxer
[android-play]: https://play.google.com/store/apps/details?id=com.fluxer
[android-apk]: https://github.com/fluxerapp/flutter_client/releases
[obtainium]: https://obtainium.imranr.dev/
[ios-testflight]: https://testflight.apple.com/join/PKZR6pK9
[docs]: https://docs.fluxer.app
[docs-downloads]: https://docs.fluxer.app/downloads/overview/
[docs-linux]: https://docs.fluxer.app/downloads/linux-repositories/
[docs-selfhost]: https://docs.fluxer.app/operator/get-started/
+3 -2
View File
@@ -48,7 +48,7 @@
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"preset": "recommended",
"complexity": {
"noForEach": "off",
"noImportantStyles": "off",
@@ -83,6 +83,7 @@
}
},
"useConst": "error",
"noDescendingSpecificity": "off",
"noNonNullAssertion": "off",
"noParameterAssign": "off",
"noRestrictedImports": {
@@ -98,7 +99,7 @@
}
},
"a11y": {
"recommended": true,
"preset": "recommended",
"useAriaPropsForRole": "error",
"useValidAriaRole": "error",
"useValidAriaValues": "error",
+1 -6
View File
@@ -52,7 +52,6 @@ FLUXER_S3_SECRET_ACCESS_KEY=fluxer-secret
FLUXER_S3_FORCE_PATH_STYLE=true
FLUXER_S3_BUCKET_CDN=fluxer
FLUXER_S3_BUCKET_UPLOADS=fluxer-uploads
FLUXER_S3_BUCKET_DOWNLOADS=fluxer-downloads
FLUXER_S3_BUCKET_REPORTS=fluxer-reports
FLUXER_S3_BUCKET_HARVESTS=fluxer-harvests
FLUXER_S3_BUCKET_STATIC=fluxer-static
@@ -65,11 +64,6 @@ FLUXER_LIVEKIT_API_SECRET=fluxer-livekit-development-secret
FLUXER_LIVEKIT_WEBHOOK_URL=http://localhost:8088/api/webhooks/livekit
FLUXER_LIVEKIT_DEFAULT_REGION={"id":"local","name":"Local","emoji":"LC","latitude":59.3293,"longitude":18.0686}
FLUXER_RECON_MODE=observing
FLUXER_RECON_EXPECTED_ROOMS=64
FLUXER_RECON_WARMUP_SECONDS=15
FLUXER_RECON_MAX_HOT_ROOMS=8
FLUXER_API_PORT=8080
FLUXER_API_PRESIGNED_ATTACHMENT_UPLOADS_ENABLED=true
FLUXER_API_WORKER_MODE=all_lanes
@@ -135,6 +129,7 @@ PUBLIC_RELEASE_CHANNEL=canary
PUBLIC_BOOTSTRAP_API_ENDPOINT=/api
PUBLIC_BOOTSTRAP_API_PUBLIC_ENDPOINT=http://localhost:8088/api
FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64=Zmx1eGVyLWRldi11cGxvYWQtcmVsYXktc2VjcmV0LTAwMDA=
FLUXER_MEDIA_PROXY_ATTACHMENT_URL_SECRETS_BASE64=Zmx1eGVyLWRldi1hdHRhY2htZW50LXVybC1zZWNyZXQ=
AWS_EC2_METADATA_DISABLED=true
AWS_ACCESS_KEY_ID=fluxer
AWS_SECRET_ACCESS_KEY=fluxer-secret
+18 -10
View File
@@ -79,34 +79,42 @@ deny = [
{ crate = "fuse-sys", reason = "libfuse2 FFI crate; Fluxer AppImages must not reintroduce libfuse2 through native Rust dependencies" },
]
skip = [
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older digest API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older digest API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older crypto API" },
{ crate = "[email protected].7", reason = "transitive dependency requires the older digest API" },
{ crate = "[email protected].6", reason = "transitive dependency requires the older digest API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older digest API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older hashbrown API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older randomness API" },
{ crate = "[email protected]", reason = "transitive dependency requires the prior randomness API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older hashbrown API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older hashbrown API" },
{ crate = "[email protected]", reason = "transitive dependency requires the prior hashbrown API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older digest API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older HTTP API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older HTTP body API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older WASI API" },
{ crate = "[email protected].6", reason = "transitive dependency requires the older randomness API" },
{ crate = "[email protected].4", reason = "transitive dependency requires the prior randomness API" },
{ crate = "[email protected].8", reason = "transitive dependency requires the older randomness API" },
{ crate = "[email protected].5", reason = "transitive dependency requires the prior randomness API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older randomness API" },
{ crate = "[email protected]", reason = "transitive dependency requires the prior randomness API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older randomness API" },
{ crate = "[email protected]", reason = "transitive dependency requires the prior randomness API" },
{ crate = "[email protected].6", reason = "transitive dependency requires the older digest API" },
{ crate = "[email protected].7", reason = "transitive dependency requires the older digest API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older digest API" },
{ crate = "s[email protected]0", reason = "transitive dependency requires the older socket API" },
{ crate = "s[email protected].0", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]+wasi-snapshot-preview1", reason = "transitive dependency requires the legacy WASI API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older release line" },
{ crate = "[email protected]", reason = "transitive dependency requires the older Windows API" },
{ crate = "[email protected]", reason = "transitive dependency requires the prior Windows API" },
{ crate = "[email protected]", reason = "transitive dependency requires the older WASI binding API" },
]
skip-tree = []
+117 -185
View File
@@ -1,108 +1,64 @@
# Every variable docker-compose.yml reads is named here, uncommented when it has
# no default and commented with its default when it has one. A name absent from
# this file reaches a service only through a Compose override. Compose expands
# top to bottom, so a line using ${...} must sit below every name it reads.
# Every variable docker-compose.yml reads, uncommented when it has no default and
# commented with its default when it has one. Compose expands top to bottom, so a
# line using ${...} must sit below every name it reads.
FLUXER_DOMAIN=chat.example.com
FLUXER_PUBLIC_SCHEME=https
FLUXER_PUBLIC_PORT=443
# The lines above are the address browsers use, and every advertised endpoint
# carries FLUXER_PUBLIC_PORT. They do not move what the host publishes.
# FLUXER_HTTP_PORT and FLUXER_HTTPS_PORT below do that, and a non-default port
# needs the matching one set as well. Complete recipes sit beside them.
# The address browsers use. FLUXER_HTTP_PORT and FLUXER_HTTPS_PORT below decide
# which host ports Fluxer binds.
# How browsers reach this instance.
#
# Default: Fluxer binds 80 and 443 and gets its own Let's Encrypt certificate.
# Point DNS at this host.
#
# Behind your own reverse proxy (nginx, Traefik, HAProxy, Cloudflare Tunnel,
# another Caddy): uncomment COMPOSE_FILE below. Fluxer then serves plain HTTP on
# 127.0.0.1:8080 instead, and your proxy forwards everything to it. Keep
# FLUXER_PUBLIC_SCHEME and FLUXER_PUBLIC_PORT describing the PUBLIC address your
# proxy serves, not this local port.
# By default Fluxer binds 80 and 443 and gets its own certificate. Point DNS here.
# Behind your own reverse proxy, uncomment this instead: Fluxer then serves plain
# HTTP on 127.0.0.1:8080. Keep the scheme and port above describing the public
# address, not this one.
#COMPOSE_FILE=docker-compose.yml:docker-compose.proxy.yml
# Where the plain-HTTP port binds when the proxy overlay is in use. Leave it on
# loopback when the proxy runs on this host. Use 0.0.0.0:8080 only when the proxy
# is on another machine, and firewall the port to that machine.
# Where that plain-HTTP port binds. Use 0.0.0.0:8080 only when the proxy is on
# another machine, and firewall it to that machine.
#FLUXER_EDGE_BIND=127.0.0.1:8080
# Which upstream hops may set X-Forwarded-For. Fluxer rewrites the header from
# this to the real client address, so IP bans, rate limits and abuse detection
# see the caller rather than the proxy. The default covers proxies on private or
# loopback addresses, which is every same-host setup. Set it to your proxy's
# address if it reaches Fluxer from a public IP.
# Which hops may set X-Forwarded-For. The default covers private and loopback
# addresses. Set your proxy's address if it reaches Fluxer from a public IP.
#FLUXER_EDGE_TRUSTED_PROXIES=private_ranges
# The origin browsers see, without a trailing slash. Leave it unset and each
# service builds one from the three values at the top of this file. Set it and it
# wins: every service reads the host, the scheme and the port out of it and
# ignores those three names. Use it when browsers reach the instance on a host
# FLUXER_DOMAIN does not name. It has to be a bare origin, a scheme and a host
# and an optional port and nothing after them, or the services refuse to start.
# It does not move the edge listener or the published ports either, so set the
# publish below to the port written here.
# The origin browsers see, no trailing slash. Set it when browsers reach the
# instance on a host FLUXER_DOMAIN does not name, and it wins over the three
# values above. Scheme, host and optional port only. It does not move the
# published ports.
#FLUXER_PUBLIC_ORIGIN=https://chat.example.com
# Overrides the address the edge listens on inside its container. Compose builds
# it from FLUXER_PUBLIC_SCHEME and FLUXER_DOMAIN with no port, and the edge keeps
# its container ports at 80 and 443 whatever the public port is. Caddy matches a
# site by host and ignores the port in the Host header, so a request arriving on
# a non-default published port still lands on this site. Put a port in this value
# only if you also publish that same container port below, or nothing will be
# listening where the publish points. Honoured in the default mode only:
# docker-compose.proxy.yml sets the literal :8080 and tunnel.compose.yml the
# literal :80, and Compose lets the last file win, so a value here is discarded
# under either overlay with no warning. Set it for an unusual default-mode
# layout, such as serving several hostnames. Write the scheme into it: a bare
# hostname means automatic HTTPS on 443 whatever FLUXER_PUBLIC_SCHEME says.
# The address the edge listens on inside its container. Both proxy overlays set
# this themselves, so a value here is ignored under either. Include the scheme.
#FLUXER_EDGE_SITE_ADDRESS=https://chat.example.com
# The old name for the value above, read only when FLUXER_EDGE_SITE_ADDRESS is
# unset, so an existing .env keeps the listener it already had.
# The old name for the line above, read only when it is unset.
#FLUXER_CADDY_SITE_ADDRESS=
# Host side of the edge's publishes, and the only names that decide which host
# ports Fluxer binds. The container side is fixed. Container 80 carries the
# HTTP to HTTPS redirect and the Let's Encrypt HTTP challenge under an https
# scheme, and the site itself under an http one. Container 443 carries the TLS
# site. FLUXER_HTTPS_PORT moves the TCP and the UDP publish together, because
# HTTP/3 needs both on the same port. Both take an optional bind address in front
# of the port, and 127.0.0.1 keeps the publish off every public interface. Give
# them different host ports: the same host port on both is two publishes of one
# port and the edge refuses to start.
# Host ports. Container 80 handles the redirect and the certificate challenge,
# container 443 the TLS site. FLUXER_HTTPS_PORT moves TCP and UDP together, since
# HTTP/3 needs both. Both accept a bind address. Give them different host ports.
#FLUXER_HTTP_PORT=80
#FLUXER_HTTPS_PORT=443
#FLUXER_HTTP_PORT=127.0.0.1:80
#FLUXER_HTTPS_PORT=127.0.0.1:443
# HTTPS on 8443, complete. Host 80 stays published and still answers the ACME
# challenge. Let's Encrypt only ever connects to the public 80 or 443, so the
# certificate is issued if a router in front forwards public 80 to this host and
# is not issued otherwise. Serve your own certificate from the Caddyfile when it
# cannot.
# HTTPS on 8443. Host 80 stays published for the certificate challenge, which
# only ever arrives on public 80 or 443. Serve your own certificate if nothing
# forwards those.
#FLUXER_PUBLIC_PORT=8443
#FLUXER_HTTPS_PORT=8443
# Plain HTTP on 19080, complete. The port 80 publish moves to 19080, so nothing
# binds host 80. Under an http scheme nothing listens on container 443, so the
# last line parks that publish on loopback for a host that wants 443 for
# something else. Drop it and 443 is published and idle, which is what earlier
# releases did.
# Plain HTTP on 19080. Nothing binds host 80, and the last line parks the idle
# 443 publish on loopback.
#FLUXER_PUBLIC_SCHEME=http
#FLUXER_PUBLIC_PORT=19080
#FLUXER_HTTP_PORT=19080
#FLUXER_HTTPS_PORT=127.0.0.1:443
# A tunnel or another proxy in front of the stack needs no HTTPS publish at all.
# tunnel.compose.yml ships beside this file and replaces Caddy's published ports
# with a single loopback HTTP publish, so nothing binds 443, and points the edge
# at plain HTTP on that publish so it stops redirecting to https. FLUXER_HTTP_PORT
# still moves that one publish. Set the line below and plain docker compose
# commands pick the file up, or add it to your own -f flags if you pass any. The
# file uses the !override tag, which needs Compose 2.24.4 or newer.
# A tunnel needs no HTTPS publish. tunnel.compose.yml ships beside this file and
# leaves one loopback HTTP publish. Needs Compose 2.24.4 or newer.
#COMPOSE_FILE=docker-compose.yml:tunnel.compose.yml
FLUXER_REGISTRY_OWNER=fluxerapp
@@ -111,11 +67,8 @@ FLUXER_IMAGE_TAG=v1
POSTGRES_PASSWORD=CHANGE_ME
MEILI_MASTER_KEY=CHANGE_ME
# The stack ships its own Postgres and its own object store, and points at both
# by service name. Set these to run either one outside the stack. Leave them
# unset and the bundled services are used. Taking a service out of the stack
# means an upgrade skips the backup step that reaches into it, and backing that
# store up belongs to whoever runs it.
# Set these to run Postgres or the object store outside the stack. Backing up a
# store you moved out is yours to arrange, and an upgrade skips it.
#FLUXER_POSTGRES_HOST=db.example.com
#FLUXER_POSTGRES_PORT=5432
#FLUXER_POSTGRES_DATABASE=fluxer
@@ -125,19 +78,15 @@ MEILI_MASTER_KEY=CHANGE_ME
#FLUXER_S3_PUBLIC_ENDPOINT=https://cdn.example.com
#FLUXER_S3_REGION=eu-central-1
#FLUXER_S3_FORCE_PATH_STYLE=false
# Bucket names. The bundled object store creates whichever names these hold, so
# the two stay in step. An object store outside the stack needs the buckets to
# Bucket names. The bundled store creates these. An outside store needs them to
# exist already.
#FLUXER_S3_BUCKET_CDN=fluxer
#FLUXER_S3_BUCKET_UPLOADS=fluxer-uploads
#FLUXER_S3_BUCKET_DOWNLOADS=fluxer-downloads
#FLUXER_S3_BUCKET_REPORTS=fluxer-reports
#FLUXER_S3_BUCKET_HARVESTS=fluxer-harvests
# The rest of the bundled services, pointed somewhere else the same way. Leave a
# line unset and the service in the stack is used. Taking a service out of the
# stack goes in an override file listed in COMPOSE_FILE, because an upgrade
# replaces docker-compose.yml.
# The other bundled services, pointed elsewhere. Removing a service from the
# stack belongs in an override file, since an upgrade replaces docker-compose.yml.
#FLUXER_KV_URL=redis://cache.example.com:6379/0
#FLUXER_NATS_URL=nats://mq.example.com:4222
#FLUXER_NATS_JETSTREAM_URL=nats://mq.example.com:4222
@@ -145,24 +94,27 @@ MEILI_MASTER_KEY=CHANGE_ME
#FLUXER_SEARCH_URL=https://search.example.com
#FLUXER_LIVEKIT_INTERNAL_URL=http://livekit.example.com:7880
# Voice off. The livekit service still runs until an override file takes it out.
# Voice off. The livekit service still runs until an override removes it.
#FLUXER_LIVEKIT_ENABLED=false
# Optional systems, each off unless the instance is configured for it.
# Optional systems, each off unless configured.
#FLUXER_SMS_ENABLED=false
#FLUXER_STRIPE_ENABLED=false
#FLUXER_NCMEC_ENABLED=false
#FLUXER_CLAMAV_ENABLED=false
# The client address. Set the header name a proxy in front actually writes, and
# turn the trust off when nothing sits in front, because a trusted header an
# attacker can set is a spoofed client address.
# Outside lookups, off unless turned on. The Tor exit list comes from
# onionoo.torproject.org and the breached password check asks
# api.pwnedpasswords.com.
#FLUXER_TOR_EXIT_LIST_ENABLED=true
#FLUXER_BREACHED_PASSWORD_CHECK_ENABLED=true
# The client address. Name the header your proxy actually writes, and turn the
# trust off when nothing sits in front.
#FLUXER_CLIENT_IP_HEADER_NAME=cf-connecting-ip
#FLUXER_TRUST_CLIENT_IP_HEADER=true
# How much the services write. trace, debug, info, warn, error or fatal. Every
# service names the object storage endpoint and its addressing at info on start,
# so a bucket that answers 404 is visible without raising this.
# How much the services write. trace, debug, info, warn, error or fatal.
#LOG_LEVEL=debug
FLUXER_S3_ACCESS_KEY=fluxer
@@ -177,32 +129,49 @@ FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64=CHANGE_ME
FLUXER_ADMIN_SECRET_KEY_BASE=CHANGE_ME
FLUXER_ADMIN_OAUTH_CLIENT_SECRET=CHANGE_ME
# The token every service sends to NATS. The bundled NATS runs without
# authentication, so this stays empty unless a Compose override points the stack
# at an external NATS that requires a token. Compose forwards the name to every
# container that connects.
# The token every service sends to NATS. The bundled NATS needs none, so this
# stays empty unless an override points at an external one.
#FLUXER_NATS_AUTH_TOKEN=
FLUXER_VAPID_PUBLIC_KEY=CHANGE_ME
FLUXER_VAPID_PRIVATE_KEY=CHANGE_ME
# The VAPID contact address defaults to admin@ followed by FLUXER_DOMAIN. Set it
# only if that mailbox does not exist.
# Defaults to admin@ followed by FLUXER_DOMAIN. Set it if that mailbox does not
# exist.
#[email protected]
# Passkeys follow FLUXER_DOMAIN by default. Set these only if browsers reach the
# instance on a different host, and note that changing FLUXER_PASSKEY_RP_ID
# invalidates every passkey already registered against the old value.
# Passkeys follow FLUXER_DOMAIN. Set these only if browsers use another host.
# Changing the RP ID invalidates every passkey registered against the old value.
#FLUXER_PASSKEY_RP_ID=chat.example.com
#FLUXER_PASSKEY_RP_NAME=Fluxer
#FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS=https://chat.example.com
#FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS=http://chat.example.com:19080
# Extra Content-Security-Policy sources, appended to the built-in ones. Set these
# only when a browser must reach an origin the defaults do not cover, such as a
# voice server hosted on a domain other than FLUXER_DOMAIN. Separate several
# sources with spaces or commas. Every one of them is empty by default, and the
# three carrying a value below are illustrations, not defaults.
# Notification jobs the push container holds at once, 1 to 1000000.
#FLUXER_PUSH_SERVICE_QUEUE_CAPACITY=10000
# Provider requests the push container sends at once, 1 to 65536.
#FLUXER_PUSH_SERVICE_SEND_CONCURRENCY=256
# Optional media policies, both off by default. See the operator docs.
#
# CORS limits which web origins may read media. A request with no Origin is
# always served. Add https://web.fluxer.app if people use the hosted client.
#
# Signatures make an attachment read need a signed URL, so a copied link stops
# working. Needs a secret from openssl rand -base64 32, first entry signs and
# every entry verifies.
#
# Each mode is off, report or enforce. Start at report. media-proxy reads these
# at start, so apply with docker compose up -d media-proxy.
#FLUXER_MEDIA_PROXY_CORS_MODE=enforce
#FLUXER_MEDIA_PROXY_CORS_ALLOWED_ORIGINS=https://chat.example.com,https://web.fluxer.app
#FLUXER_MEDIA_PROXY_ATTACHMENT_URL_SECRETS_BASE64=
#FLUXER_MEDIA_PROXY_ATTACHMENT_SIGNATURE_MODE=enforce
# Extra Content-Security-Policy sources, appended to the built-in ones. Set one
# only when a browser must reach an origin the defaults do not cover. Separate
# several with spaces or commas. The three values below are illustrations.
#FLUXER_CSP_EXTRA_DEFAULT_SRC=
#FLUXER_CSP_EXTRA_CONNECT_SRC=wss://livekit.example.com:7881
#FLUXER_CSP_EXTRA_IMG_SRC=https://cdn.example.com
@@ -214,39 +183,29 @@ FLUXER_VAPID_PRIVATE_KEY=CHANGE_ME
#FLUXER_CSP_EXTRA_WORKER_SRC=
#FLUXER_CSP_EXTRA_MANIFEST_SRC=
# One report-uri for Content-Security-Policy violation reports. Empty leaves the
# directive off the header.
# One report-uri for CSP violation reports. Empty leaves the directive off.
#FLUXER_CSP_REPORT_URI=
# Allow the SSO identity provider to resolve to a private or internal address.
# Off by default: the API refuses to call non-public addresses so a misconfigured
# provider URL cannot be used to reach internal services. Turn it on only when the
# provider genuinely lives on your own network, such as split-horizon DNS or a LAN
# identity provider, and only when you trust everyone who can configure SSO.
# Let the SSO provider resolve to a private address. Off by default, so a
# misconfigured provider URL cannot reach internal services. Turn it on only for
# a provider on your own network.
#FLUXER_SSO_ALLOW_PRIVATE_ADDRESSES=true
# Both reach LiveKit as LIVEKIT_KEYS and the webhook signing key, and the API as
# FLUXER_LIVEKIT_API_KEY and FLUXER_LIVEKIT_API_SECRET. Change them together.
# These reach both LiveKit and the api. Change them together.
LIVEKIT_API_KEY=fluxer
LIVEKIT_API_SECRET=CHANGE_ME
# The URL browsers use for voice signalling. Compose builds it from
# FLUXER_PUBLIC_ORIGIN, or from FLUXER_PUBLIC_SCHEME, FLUXER_DOMAIN and
# FLUXER_PUBLIC_PORT, as that origin followed by /livekit. The client rewrites a
# leading http to ws itself. Set it only when LiveKit is served from another
# host.
# The URL browsers use for voice signalling. Built from the public origin plus
# /livekit. Set it only when LiveKit is served from another host.
#FLUXER_LIVEKIT_URL=
# Media ports. LiveKit advertises these in ICE candidates, so the host must
# forward the same numbers.
# Media ports. LiveKit advertises these, so forward the same numbers.
#FLUXER_LIVEKIT_TCP_PORT=7881
#FLUXER_LIVEKIT_UDP_PORT=7882
# LiveKit finds the address browsers dial by asking a STUN server. A host that
# cannot reach one over UDP stops with "could not resolve external IP", and the
# address is then set by hand: put it in FLUXER_LIVEKIT_NODE_IP and set
# FLUXER_LIVEKIT_USE_EXTERNAL_IP to false. Point the STUN entries at another
# server to keep the lookup and leave Google out of it.
# LiveKit finds its public address over STUN. A host that cannot reach one stops
# with "could not resolve external IP", so set the address by hand instead, or
# point STUN elsewhere.
#FLUXER_LIVEKIT_USE_EXTERNAL_IP=false
#FLUXER_LIVEKIT_NODE_IP=203.0.113.10
#FLUXER_LIVEKIT_STUN_PRIMARY=stun.l.google.com:19302
@@ -273,11 +232,9 @@ FLUXER_CAPTCHA_TURNSTILE_SITE_KEY=
FLUXER_CAPTCHA_TURNSTILE_SECRET_KEY=
FLUXER_DISCOVERY_ENABLED=true
# Container memory. The limits sum to 18.25 GiB, which is a sum of ceilings and
# not an allocation, so the defaults fit a host with 8 GB and are sized for 16 GB.
# The reservations are cgroup memory.low, which biases the kernel away from
# reclaiming from services whose death takes the instance down. They reserve
# nothing. Lower the limits on a smaller host.
# Container memory. These are ceilings, not allocations, and the defaults suit a
# 16 GB host. The reservations bias the kernel away from reclaiming from services
# whose death takes the instance down. Lower the limits on a smaller host.
#FLUXER_CADDY_MEMORY_LIMIT=256mb
#FLUXER_POSTGRES_MEMORY_LIMIT=5gb
#FLUXER_POSTGRES_MEMORY_RESERVATION=3gb
@@ -294,6 +251,7 @@ FLUXER_DISCOVERY_ENABLED=true
#FLUXER_GATEWAY_MEMORY_LIMIT=1gb
#FLUXER_GATEWAY_MEMORY_RESERVATION=384mb
#FLUXER_MEDIA_PROXY_MEMORY_LIMIT=512mb
#FLUXER_PUSH_MEMORY_LIMIT=256mb
#FLUXER_STATIC_PROXY_MEMORY_LIMIT=256mb
#FLUXER_APP_PROXY_MEMORY_LIMIT=256mb
#FLUXER_SNOWFLAKES_MEMORY_LIMIT=128mb
@@ -308,80 +266,54 @@ FLUXER_DISCOVERY_ENABLED=true
#FLUXER_UNFURL_SHARD_MEMORY_LIMIT=256mb
#FLUXER_ADMIN_MEMORY_LIMIT=256mb
# Meilisearch indexing memory. Keep it well under FLUXER_MEILISEARCH_MEMORY_LIMIT,
# which is the container ceiling the indexer shares with the search process.
# Meilisearch indexing memory. Keep it well under the container limit above.
#FLUXER_MEILISEARCH_MAX_INDEXING_MEMORY=384mb
# SeaweedFS heap ceiling. Go collects against this value instead of against the
# container limit, which it cannot see, so without it an upload burst grows the
# heap past FLUXER_SEAWEEDFS_MEMORY_LIMIT and the kernel OOM-kills the container
# mid-upload (exit 137). Keep it near three quarters of that limit, and raise both
# together: the peak is the parts of one upload in flight at once, which is 25 MB
# times 20 for a 500 MB attachment.
# SeaweedFS heap ceiling. Go cannot see the container limit, so without this an
# upload burst gets the container OOM-killed. Keep it near three quarters of
# FLUXER_SEAWEEDFS_MEMORY_LIMIT and raise both together.
#FLUXER_SEAWEEDFS_GOMEMLIMIT=1536MiB
# Node sizes its own heap from the container memory limit by default, at roughly
# 55 percent of it, which always leaves room for the buffers and stacks that live
# outside the heap. Leave these unset unless you have a reason to pin the value.
# Any value set here must stay well below the container limit above: a heap ceiling
# above the container limit makes the kernel OOM-kill the container (exit 137, no
# diagnostics) instead of Node reporting a JavaScript heap out of memory error.
# Node sizes its heap from the container limit by default. Leave these unset
# unless you need to pin it. A heap ceiling above the container limit gets the
# container OOM-killed instead of reporting a heap error.
#FLUXER_API_NODE_HEAP_MB=1792
#FLUXER_WORKER_NODE_HEAP_MB=1792
# Bundled Postgres tuning. Keep these consistent with FLUXER_POSTGRES_MEMORY_LIMIT:
# budget roughly shared_buffers + (server max_connections x 12 MB) +
# (3 x autovacuum_work_mem) + 300 MB for page cache and WAL. Note this is the
# server setting, distinct from the per-service FLUXER_POSTGRES_MAX_CONNECTIONS
# pool sizes used by the api, worker and shards.
# Bundled Postgres tuning. Keep it consistent with the memory limit above. This
# is the server setting, not the per-service pool sizes.
#FLUXER_POSTGRES_SERVER_MAX_CONNECTIONS=150
#FLUXER_POSTGRES_SHARED_BUFFERS=512MB
#FLUXER_POSTGRES_EFFECTIVE_CACHE_SIZE=2GB
#FLUXER_POSTGRES_WORK_MEM=8MB
#FLUXER_POSTGRES_MAINTENANCE_WORK_MEM=256MB
#FLUXER_POSTGRES_AUTOVACUUM_WORK_MEM=128MB
#FLUXER_POSTGRES_SHM_SIZE=1gb
# The bundled Valkey holds durable state as well as cache. The bulk message
# deletion queue and the account deletion queue are sorted sets with no expiry,
# and nothing else stores the first of the two. It therefore runs with an
# append-only file on a named volume and with noeviction, so an over-limit write
# fails loudly instead of silently deleting queued work. Distributed locks all
# carry a TTL and are not what the durability is for. Only change the policy if
# you have moved that durable state elsewhere.
# The bundled Valkey holds durable state as well as cache, so it runs with an
# append-only file and with noeviction, which fails an over-limit write instead
# of dropping queued work. Change the policy only if that state lives elsewhere.
#FLUXER_VALKEY_MAXMEMORY=192mb
#FLUXER_VALKEY_MAXMEMORY_POLICY=noeviction
# The gateway derives its BEAM scheduler count from the container CPU quota,
# clamped to this range. The floor matters: a single scheduler lets one blocking
# operation stall every websocket on the node. The ceiling stops a large host
# from starting far more schedulers than the container can actually use.
# The gateway derives its scheduler count from the CPU quota, clamped here. One
# scheduler lets a single blocking operation stall every websocket on the node.
#FLUXER_ERLANG_SCHEDULERS_MIN=2
#FLUXER_ERLANG_SCHEDULERS_MAX=16
# In-flight request ceiling for the services Compose forwards it to: the users
# and messages routers and their shards. Leave it unset and each service uses its
# built-in default. Set it and the one value replaces that default on all of
# them, so size it for the busiest. The built-in defaults are 192 for
# messages, 320 for snowflakes and 64 elsewhere, and they govern every service
# Compose does not forward this to. A router holds a slot for the whole round
# trip to its shard, so this is a ceiling on requests in flight at once and not a
# rate: too low a value does not slow requests down, it rejects them, and the api
# turns that rejection into a 503.
# In-flight request ceiling for the users and messages routers and their shards.
# One value replaces the built-in default on all of them, so size it for the
# busiest. Too low a value rejects requests rather than slowing them, and the api
# turns that into a 503.
#FLUXER_SVC_MAX_CONCURRENT_REQUESTS=192
# The api and the Rust services name their fixed Postgres statement shapes so the
# server can reuse their plans. Named prepared statements require a session that
# outlives the transaction, so set this to false if you put a transaction-pooling
# connection pooler such as PgBouncer in front of Postgres. One setting governs
# every service. The bundled compose talks to Postgres directly, where naming is
# a win and the default is correct.
# Named prepared statements need a session that outlives the transaction, so set
# this to false behind a transaction-pooling connection pooler. The bundled
# compose talks to Postgres directly, where the default is correct.
#FLUXER_POSTGRES_PREPARED_STATEMENTS=true
# The api bounds how long a client may take to send a request. The header timeout
# covers the request line and headers only, while the request timeout covers the
# whole exchange, so a slow uploader is bounded by the second value and not by
# the first. Raise both if you front large uploads or serve clients on high
# latency links. The header timeout is clamped down to the request timeout, so
# raising it alone does nothing. Both are milliseconds, between 1000 and 3600000.
# How long a client may take to send a request. The header timeout covers the
# request line and headers, the request timeout the whole exchange, and the first
# is clamped down to the second. Milliseconds, 1000 to 3600000.
#FLUXER_API_HEADERS_TIMEOUT_MS=30000
#FLUXER_API_REQUEST_TIMEOUT_MS=120000
+39 -11
View File
@@ -24,6 +24,8 @@ x-fluxer-env: &fluxer-env
FLUXER_CLIENT_IP_HEADER_NAME: ${FLUXER_CLIENT_IP_HEADER_NAME:-x-forwarded-for}
FLUXER_API_HEADERS_TIMEOUT_MS: ${FLUXER_API_HEADERS_TIMEOUT_MS:-30000}
FLUXER_API_REQUEST_TIMEOUT_MS: ${FLUXER_API_REQUEST_TIMEOUT_MS:-120000}
FLUXER_TOR_EXIT_LIST_ENABLED: "${FLUXER_TOR_EXIT_LIST_ENABLED:-false}"
FLUXER_BREACHED_PASSWORD_CHECK_ENABLED: "${FLUXER_BREACHED_PASSWORD_CHECK_ENABLED:-false}"
FLUXER_KV_URL: ${FLUXER_KV_URL:-redis://valkey:6379/0}
FLUXER_NATS_URL: ${FLUXER_NATS_URL:-nats://nats:4222}
@@ -44,7 +46,6 @@ x-fluxer-env: &fluxer-env
FLUXER_S3_FORCE_PATH_STYLE: "${FLUXER_S3_FORCE_PATH_STYLE:-true}"
FLUXER_S3_BUCKET_CDN: ${FLUXER_S3_BUCKET_CDN:-fluxer}
FLUXER_S3_BUCKET_UPLOADS: ${FLUXER_S3_BUCKET_UPLOADS:-fluxer-uploads}
FLUXER_S3_BUCKET_DOWNLOADS: ${FLUXER_S3_BUCKET_DOWNLOADS:-fluxer-downloads}
FLUXER_S3_BUCKET_REPORTS: ${FLUXER_S3_BUCKET_REPORTS:-fluxer-reports}
FLUXER_S3_BUCKET_HARVESTS: ${FLUXER_S3_BUCKET_HARVESTS:-fluxer-harvests}
AWS_ACCESS_KEY_ID: ${FLUXER_S3_ACCESS_KEY:?set FLUXER_S3_ACCESS_KEY in .env}
@@ -97,6 +98,7 @@ x-fluxer-env: &fluxer-env
FLUXER_GATEWAY_RPC_AUTH_TOKEN: ${FLUXER_GATEWAY_RPC_AUTH_TOKEN:?set FLUXER_GATEWAY_RPC_AUTH_TOKEN in .env}
FLUXER_MEDIA_PROXY_SECRET_KEY: ${FLUXER_MEDIA_PROXY_SECRET_KEY:?set FLUXER_MEDIA_PROXY_SECRET_KEY in .env}
FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64: ${FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64:?set FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64 in .env}
FLUXER_MEDIA_PROXY_ATTACHMENT_URL_SECRETS_BASE64: ${FLUXER_MEDIA_PROXY_ATTACHMENT_URL_SECRETS_BASE64:-}
FLUXER_ADMIN_SECRET_KEY_BASE: ${FLUXER_ADMIN_SECRET_KEY_BASE:?set FLUXER_ADMIN_SECRET_KEY_BASE in .env}
FLUXER_ADMIN_OAUTH_CLIENT_SECRET: ${FLUXER_ADMIN_OAUTH_CLIENT_SECRET:?set FLUXER_ADMIN_OAUTH_CLIENT_SECRET in .env}
@@ -122,7 +124,7 @@ x-fluxer-svc-healthcheck: &fluxer-svc-healthcheck
services:
edge:
image: caddy:2.10-alpine
image: caddy:2.11-alpine
deploy:
resources:
limits:
@@ -186,7 +188,7 @@ services:
-c autovacuum_vacuum_cost_limit=2000
-c track_io_timing=on
-c shared_preload_libraries=pg_stat_statements
shm_size: 256mb
shm_size: ${FLUXER_POSTGRES_SHM_SIZE:-1gb}
environment:
POSTGRES_DB: fluxer
POSTGRES_USER: fluxer
@@ -200,7 +202,7 @@ services:
retries: 10
valkey:
image: valkey/valkey:8.1-alpine
image: valkey/valkey:9.1-alpine
deploy:
resources:
limits:
@@ -236,7 +238,7 @@ services:
retries: 10
meilisearch:
image: getmeili/meilisearch:v1.12
image: getmeili/meilisearch:v1.53
deploy:
resources:
limits:
@@ -246,6 +248,7 @@ services:
environment:
MEILI_ENV: production
MEILI_NO_ANALYTICS: "true"
MEILI_UPGRADE_DB: "true"
MEILI_MAX_INDEXING_MEMORY: ${FLUXER_MEILISEARCH_MAX_INDEXING_MEMORY:-384mb}
MEILI_MASTER_KEY: ${MEILI_MASTER_KEY:?set MEILI_MASTER_KEY in .env}
volumes:
@@ -257,7 +260,7 @@ services:
retries: 10
seaweedfs:
image: chrislusf/seaweedfs:4.34
image: chrislusf/seaweedfs:4.47
deploy:
resources:
limits:
@@ -266,7 +269,7 @@ services:
networks: [fluxer]
environment:
GOMEMLIMIT: ${FLUXER_SEAWEEDFS_GOMEMLIMIT:-1536MiB}
command: ["server", "-s3", "-dir=/data"]
command: ["server", "-s3", "-dir=/data", "-master.telemetry=false"]
volumes:
- seaweedfs-data:/data
healthcheck:
@@ -277,7 +280,7 @@ services:
start_period: 60s
seaweedfs-init:
image: chrislusf/seaweedfs:4.34
image: chrislusf/seaweedfs:4.47
deploy:
resources:
limits:
@@ -291,14 +294,13 @@ services:
FLUXER_S3_SECRET_KEY: ${FLUXER_S3_SECRET_KEY:?set FLUXER_S3_SECRET_KEY in .env}
FLUXER_S3_BUCKET_CDN: ${FLUXER_S3_BUCKET_CDN:-fluxer}
FLUXER_S3_BUCKET_UPLOADS: ${FLUXER_S3_BUCKET_UPLOADS:-fluxer-uploads}
FLUXER_S3_BUCKET_DOWNLOADS: ${FLUXER_S3_BUCKET_DOWNLOADS:-fluxer-downloads}
FLUXER_S3_BUCKET_REPORTS: ${FLUXER_S3_BUCKET_REPORTS:-fluxer-reports}
FLUXER_S3_BUCKET_HARVESTS: ${FLUXER_S3_BUCKET_HARVESTS:-fluxer-harvests}
entrypoint:
- /bin/sh
- -c
- >
buckets="$$FLUXER_S3_BUCKET_CDN $$FLUXER_S3_BUCKET_UPLOADS $$FLUXER_S3_BUCKET_DOWNLOADS $$FLUXER_S3_BUCKET_REPORTS $$FLUXER_S3_BUCKET_HARVESTS";
buckets="$$FLUXER_S3_BUCKET_CDN $$FLUXER_S3_BUCKET_UPLOADS $$FLUXER_S3_BUCKET_REPORTS $$FLUXER_S3_BUCKET_HARVESTS";
missing="$$buckets";
for attempt in $$(seq 1 60); do
if ! nc -z seaweedfs 9333 2>/dev/null; then
@@ -413,7 +415,6 @@ services:
NODE_OPTIONS: --enable-source-maps${FLUXER_WORKER_NODE_HEAP_MB:+ --max-old-space-size=$FLUXER_WORKER_NODE_HEAP_MB}
FLUXER_API_WORKER_MODE: all_lanes
FLUXER_API_WORKER_ENABLE_CRON_SCHEDULER: "true"
FLUXER_API_WORKER_ENABLE_VOICE_RECONCILIATION: "true"
FLUXER_POSTGRES_MAX_CONNECTIONS: "25"
healthcheck:
test: ["CMD", "node", "-e", "const age=Date.now()-require('node:fs').statSync('/tmp/fluxer-worker-heartbeat').mtimeMs;if(age>30000){console.error('worker heartbeat is '+Math.round(age)+'ms old');process.exit(1)}"]
@@ -473,11 +474,38 @@ services:
FLUXER_MEDIA_PROXY_MODE: upload
FLUXER_MEDIA_PROXY_STORAGE_BACKEND: s3
FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT: ${FLUXER_PUBLIC_ORIGIN:-${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}}/media
FLUXER_MEDIA_PROXY_CORS_MODE: ${FLUXER_MEDIA_PROXY_CORS_MODE:-off}
FLUXER_MEDIA_PROXY_CORS_ALLOWED_ORIGINS: ${FLUXER_MEDIA_PROXY_CORS_ALLOWED_ORIGINS:-${FLUXER_PUBLIC_ORIGIN:-${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}:${FLUXER_PUBLIC_PORT:-443}}}
FLUXER_MEDIA_PROXY_ATTACHMENT_SIGNATURE_MODE: ${FLUXER_MEDIA_PROXY_ATTACHMENT_SIGNATURE_MODE:-off}
FLUXER_S3_READ_SIGNED: "true"
depends_on:
seaweedfs-init: {condition: service_completed_successfully}
nats: {condition: service_healthy}
push:
<<: *fluxer-service
image: ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-push:${FLUXER_IMAGE_TAG:-v1}
deploy:
resources:
limits:
memory: ${FLUXER_PUSH_MEMORY_LIMIT:-256mb}
environment:
<<: *fluxer-env
FLUXER_PUSH_SERVICE_HOST: 0.0.0.0
FLUXER_PUSH_SERVICE_PORT: "8126"
FLUXER_PUSH_SERVICE_QUEUE_CAPACITY: "${FLUXER_PUSH_SERVICE_QUEUE_CAPACITY:-}"
FLUXER_PUSH_SERVICE_SEND_CONCURRENCY: "${FLUXER_PUSH_SERVICE_SEND_CONCURRENCY:-}"
healthcheck:
test: ["CMD", "/usr/local/bin/fluxer-push", "healthcheck"]
interval: 10s
timeout: 5s
retries: 30
start_period: 60s
start_interval: 1s
depends_on:
nats: {condition: service_healthy}
api: {condition: service_healthy}
static-proxy:
<<: *fluxer-service
image: ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-static:${FLUXER_IMAGE_TAG:-v1}
+13 -13
View File
@@ -9,32 +9,32 @@ build = "build.rs"
[dependencies]
anyhow = "1.0.104"
axum = { version = "0.8.9", features = ["macros"] }
base64 = "0.22.1"
base64 = "0.23.1"
chrono = { version = "0.4", default-features = false, features = ["serde"] }
cookie = "0.18.1"
cookie = "0.18.2"
fluxer_common = { path = "../fluxer_common" }
hmac = "0.13.0"
maud = { version = "0.27.0", features = ["axum"] }
rand = "0.10"
regress = "0.11"
reqwest = { version = "0.13.4", default-features = false, features = ["json", "rustls"] }
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.150"
regress = "0.12"
reqwest = { version = "0.13.5", default-features = false, features = ["json", "rustls"] }
serde = { version = "1.0.229", features = ["derive"] }
serde_json = "1.0.151"
sha2 = "0.11.0"
time = { version = "0.3.47", features = ["formatting", "parsing"] }
tokio = { version = "1.52.3", features = ["macros", "net", "rt-multi-thread", "signal"] }
time = { version = "0.3.55", features = ["formatting", "parsing"] }
tokio = { version = "1.53.1", features = ["macros", "net", "rt-multi-thread", "signal"] }
tower = { version = "0.5.3", features = ["util"] }
tower-http = { version = "0.6.11", features = ["compression-gzip", "trace"] }
tower-http = { version = "0.7.1", features = ["compression-gzip", "trace"] }
tracing = "0.1.44"
tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
url = "2.5"
urlencoding = "2.1.3"
progenitor-client = { version = "0.14.0", default-features = false }
progenitor-client = { version = "0.15.0", default-features = false }
[build-dependencies]
openapiv3 = "2.2.0"
prettyplease = "0.2"
progenitor = { version = "0.14.0", default-features = false }
prettyplease = "0.3"
progenitor = { version = "0.15.0", default-features = false }
serde_json = "1"
sha2 = "0.11.0"
syn = "2"
syn = "3"
+3 -3
View File
@@ -1,6 +1,6 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
FROM rust:1-bookworm AS builder
FROM rust:1-trixie AS builder
ARG BUILD_VERSION=""
ARG TARGETARCH
@@ -9,7 +9,7 @@ WORKDIR /usr/src/app
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates nodejs npm pkg-config \
&& npm install -g pnpm@10.29.3 \
&& npm install -g pnpm@11.27.0 \
&& rm -rf /var/lib/apt/lists/*
RUN npm install --no-audit --no-fund @tailwindcss/[email protected] [email protected]
@@ -57,7 +57,7 @@ RUN test "$(ls target/release/build/fluxer_admin-*/out/static/fonts/*.woff2 | wc
&& ls target/release/build/fluxer_admin-*/out/static/fonts/fonts.*.css \
&& echo "Latin-core fonts bundled successfully"
FROM debian:bookworm-slim AS runtime
FROM debian:trixie-slim AS runtime
ARG BUILD_VERSION=""
ARG SOURCE_SHA=""
+313 -2
View File
@@ -38,6 +38,8 @@ fn generate_admin_api(manifest_dir: &Path, out_dir: &Path) {
let mut spec: openapiv3::OpenAPI =
serde_json::from_str(&json_str).expect("failed to parse openapi-admin.json");
adapt_progenitor_throttled_errors(&mut spec);
relax_guild_audit_log_schemas(&mut spec);
relax_progenitor_schema_strictness(&mut spec);
let mut settings = progenitor::GenerationSettings::new();
settings.with_interface(progenitor::InterfaceStyle::Positional);
@@ -52,9 +54,9 @@ fn generate_admin_api(manifest_dir: &Path, out_dir: &Path) {
.generate_tokens(&spec)
.expect("failed to generate admin API client");
let content = prettyplease::unparse(
let content = relax_required_nullable_fields(&prettyplease::unparse(
&syn::parse2::<syn::File>(tokens).expect("failed to parse generated tokens"),
);
));
let output_path = out_dir.join("admin_api_generated.rs");
fs::write(&output_path, content).expect("failed to write generated API code");
@@ -141,6 +143,315 @@ fn adapt_progenitor_throttled_errors(spec: &mut openapiv3::OpenAPI) {
}
}
fn relax_guild_audit_log_schemas(spec: &mut openapiv3::OpenAPI) {
let components = spec.components.as_mut().expect("missing API components");
let entry = object_schema_mut(components, "GuildAuditLogEntryResponse");
entry.additional_properties = None;
let openapiv3::ReferenceOr::Item(options) = entry
.properties
.get_mut("options")
.expect("GuildAuditLogEntryResponse has no options property")
else {
panic!("GuildAuditLogEntryResponse options must be an inline schema");
};
let openapiv3::SchemaKind::Type(openapiv3::Type::Object(options)) = &mut options.schema_kind
else {
panic!("GuildAuditLogEntryResponse options must be an object schema");
};
options.additional_properties = None;
let change = object_schema_mut(components, "AuditLogChangeSchema");
change.additional_properties = None;
for property in ["old_value", "new_value"] {
change.properties.insert(
property.to_string(),
openapiv3::ReferenceOr::Item(Box::new(openapiv3::Schema {
schema_data: openapiv3::SchemaData::default(),
schema_kind: openapiv3::SchemaKind::Any(openapiv3::AnySchema::default()),
})),
);
}
}
fn object_schema_mut<'a>(
components: &'a mut openapiv3::Components,
name: &str,
) -> &'a mut openapiv3::ObjectType {
let Some(openapiv3::ReferenceOr::Item(schema)) = components.schemas.get_mut(name) else {
panic!("missing inline {name} schema");
};
let openapiv3::SchemaKind::Type(openapiv3::Type::Object(object)) = &mut schema.schema_kind
else {
panic!("{name} must be an object schema");
};
object
}
const MAX_SCHEMA_REFERENCE_DEPTH: usize = 32;
fn relax_required_nullable_fields(generated: &str) -> String {
const PRESENCE_CHECK: &str =
"#[serde(deserialize_with = \"::std::option::Option::deserialize\")]";
generated
.lines()
.filter(|line| line.trim() != PRESENCE_CHECK)
.flat_map(|line| [line, "\n"])
.collect()
}
fn relax_progenitor_schema_strictness(spec: &mut openapiv3::OpenAPI) {
let registry = spec.components.clone().unwrap_or_default();
if let Some(components) = spec.components.as_mut() {
for schema in components.schemas.values_mut() {
relax_schema_reference(schema, &registry);
}
for response in components.responses.values_mut() {
if let openapiv3::ReferenceOr::Item(response) = response {
relax_response(response, &registry);
}
}
for parameter in components.parameters.values_mut() {
if let openapiv3::ReferenceOr::Item(parameter) = parameter {
relax_parameter(parameter, &registry);
}
}
for request_body in components.request_bodies.values_mut() {
if let openapiv3::ReferenceOr::Item(request_body) = request_body {
relax_content(&mut request_body.content, &registry);
}
}
for header in components.headers.values_mut() {
if let openapiv3::ReferenceOr::Item(header) = header {
relax_parameter_format(&mut header.format, &registry);
}
}
}
for path in spec.paths.paths.values_mut() {
let openapiv3::ReferenceOr::Item(path) = path else {
continue;
};
for parameter in &mut path.parameters {
if let openapiv3::ReferenceOr::Item(parameter) = parameter {
relax_parameter(parameter, &registry);
}
}
for operation in [
&mut path.get,
&mut path.put,
&mut path.post,
&mut path.delete,
&mut path.options,
&mut path.head,
&mut path.patch,
&mut path.trace,
]
.into_iter()
.flatten()
{
for parameter in &mut operation.parameters {
if let openapiv3::ReferenceOr::Item(parameter) = parameter {
relax_parameter(parameter, &registry);
}
}
if let Some(openapiv3::ReferenceOr::Item(request_body)) =
operation.request_body.as_mut()
{
relax_content(&mut request_body.content, &registry);
}
for response in operation
.responses
.responses
.values_mut()
.chain(operation.responses.default.iter_mut())
{
if let openapiv3::ReferenceOr::Item(response) = response {
relax_response(response, &registry);
}
}
}
}
}
fn relax_response(response: &mut openapiv3::Response, registry: &openapiv3::Components) {
relax_content(&mut response.content, registry);
for header in response.headers.values_mut() {
if let openapiv3::ReferenceOr::Item(header) = header {
relax_parameter_format(&mut header.format, registry);
}
}
}
fn relax_content(content: &mut openapiv3::Content, registry: &openapiv3::Components) {
for media_type in content.values_mut() {
if let Some(schema) = media_type.schema.as_mut() {
relax_schema_reference(schema, registry);
}
}
}
fn relax_parameter(parameter: &mut openapiv3::Parameter, registry: &openapiv3::Components) {
let format = match parameter {
openapiv3::Parameter::Query { parameter_data, .. }
| openapiv3::Parameter::Header { parameter_data, .. }
| openapiv3::Parameter::Path { parameter_data, .. }
| openapiv3::Parameter::Cookie { parameter_data, .. } => &mut parameter_data.format,
};
relax_parameter_format(format, registry);
}
fn relax_parameter_format(
format: &mut openapiv3::ParameterSchemaOrContent,
registry: &openapiv3::Components,
) {
match format {
openapiv3::ParameterSchemaOrContent::Schema(schema) => {
relax_schema_reference(schema, registry)
}
openapiv3::ParameterSchemaOrContent::Content(content) => relax_content(content, registry),
}
}
fn relax_schema_reference(
schema: &mut openapiv3::ReferenceOr<openapiv3::Schema>,
registry: &openapiv3::Components,
) {
if let openapiv3::ReferenceOr::Item(schema) = schema {
relax_schema(schema, registry);
}
}
fn relax_boxed_schema_reference(
schema: &mut openapiv3::ReferenceOr<Box<openapiv3::Schema>>,
registry: &openapiv3::Components,
) {
if let openapiv3::ReferenceOr::Item(schema) = schema {
relax_schema(schema, registry);
}
}
fn relax_schema(schema: &mut openapiv3::Schema, registry: &openapiv3::Components) {
if flattens_objects_beside_scalars(&schema.schema_kind, registry) {
schema.schema_kind = openapiv3::SchemaKind::Any(openapiv3::AnySchema::default());
return;
}
match &mut schema.schema_kind {
openapiv3::SchemaKind::Type(openapiv3::Type::Object(object)) => {
relax_additional_properties(&mut object.additional_properties, registry);
for property in object.properties.values_mut() {
relax_boxed_schema_reference(property, registry);
}
}
openapiv3::SchemaKind::Type(openapiv3::Type::Array(array)) => {
if let Some(items) = array.items.as_mut() {
relax_boxed_schema_reference(items, registry);
}
}
openapiv3::SchemaKind::Type(_) => {}
openapiv3::SchemaKind::OneOf { one_of: subschemas }
| openapiv3::SchemaKind::AllOf { all_of: subschemas }
| openapiv3::SchemaKind::AnyOf { any_of: subschemas } => {
for subschema in subschemas {
relax_schema_reference(subschema, registry);
}
}
openapiv3::SchemaKind::Not { not } => relax_schema_reference(not, registry),
openapiv3::SchemaKind::Any(any) => {
relax_additional_properties(&mut any.additional_properties, registry);
for property in any.properties.values_mut() {
relax_boxed_schema_reference(property, registry);
}
if let Some(items) = any.items.as_mut() {
relax_boxed_schema_reference(items, registry);
}
for subschema in any
.one_of
.iter_mut()
.chain(any.all_of.iter_mut())
.chain(any.any_of.iter_mut())
{
relax_schema_reference(subschema, registry);
}
if let Some(not) = any.not.as_mut() {
relax_schema_reference(not, registry);
}
}
}
}
fn relax_additional_properties(
additional_properties: &mut Option<openapiv3::AdditionalProperties>,
registry: &openapiv3::Components,
) {
match additional_properties {
Some(openapiv3::AdditionalProperties::Any(false)) => *additional_properties = None,
Some(openapiv3::AdditionalProperties::Schema(schema)) => {
relax_schema_reference(schema, registry)
}
_ => {}
}
}
fn flattens_objects_beside_scalars(
schema_kind: &openapiv3::SchemaKind,
registry: &openapiv3::Components,
) -> bool {
let subschemas = match schema_kind {
openapiv3::SchemaKind::OneOf { one_of } => one_of,
openapiv3::SchemaKind::AnyOf { any_of } => any_of,
_ => return false,
};
let mut objects = false;
let mut scalars = false;
for subschema in subschemas {
if resolves_to_object(subschema, registry, MAX_SCHEMA_REFERENCE_DEPTH) {
objects = true;
} else {
scalars = true;
}
}
objects && scalars
}
fn resolves_to_object(
schema: &openapiv3::ReferenceOr<openapiv3::Schema>,
registry: &openapiv3::Components,
depth: usize,
) -> bool {
let Some(depth) = depth.checked_sub(1) else {
return false;
};
let schema = match schema {
openapiv3::ReferenceOr::Reference { reference } => {
let Some(target) = reference
.strip_prefix("#/components/schemas/")
.and_then(|name| registry.schemas.get(name))
else {
return false;
};
return resolves_to_object(target, registry, depth);
}
openapiv3::ReferenceOr::Item(schema) => schema,
};
match &schema.schema_kind {
openapiv3::SchemaKind::Type(openapiv3::Type::Object(_)) => true,
openapiv3::SchemaKind::Type(_) => false,
openapiv3::SchemaKind::OneOf { one_of: subschemas }
| openapiv3::SchemaKind::AllOf { all_of: subschemas }
| openapiv3::SchemaKind::AnyOf { any_of: subschemas } => subschemas
.iter()
.any(|subschema| resolves_to_object(subschema, registry, depth)),
openapiv3::SchemaKind::Not { .. } => false,
openapiv3::SchemaKind::Any(any) => {
any.typ.as_deref() == Some("object")
|| !any.properties.is_empty()
|| any.additional_properties.is_some()
}
}
}
struct Face {
css_family: String,
weight: u64,
+270 -105
View File
@@ -933,6 +933,22 @@
},
"description": "Filter by target entity ID (user, channel, role, invite code, etc.)"
},
{
"name": "access",
"in": "query",
"required": false,
"schema": {
"description": "Only return entries recorded by reads or only entries recorded by writes",
"x-enumNames": ["read", "write"],
"x-enumDescriptions": [
"An entry recorded by an operation that only reads data",
"An entry recorded by an operation that changes data or triggers work"
],
"enum": ["read", "write"],
"type": "string"
},
"description": "Only return entries recorded by reads or only entries recorded by writes"
},
{
"name": "sort_by",
"in": "query",
@@ -1667,7 +1683,7 @@
"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}
}
},
"description": "Enqueue one background administrative job. The `task` discriminator selects both the body variant and the ACL evaluated for the request: `update_user_flags` needs bulk:update:user_flags, `update_suspicious_activity_flags` needs bulk:update:suspicious_activity, `update_guild_features` needs bulk:update:guild_features, `add_guild_members` needs bulk:add:guild_members, `schedule_user_deletion` needs bulk:delete:users, and `delete_user_messages` needs bulk:delete:user_messages. Returns a job_id immediately; observe progress at /admin/jobs/:job_id. Note: the schedule_user_deletion worker skips Stripe refunds, session termination, and identifier banning — apply those separately for high-risk accounts.",
"description": "Enqueue one background administrative job. The `task` discriminator selects both the body variant and the ACL evaluated for the request: `update_user_flags` needs bulk:update:user_flags, `update_suspicious_activity_flags` needs bulk:update:suspicious_activity, `update_guild_features` needs bulk:update:guild_features, `add_guild_members` needs bulk:add:guild_members, `schedule_user_deletion` needs bulk:delete:users, and `delete_user_messages` needs bulk:delete:user_messages. Returns a job_id immediately; observe progress at /admin/jobs/:job_id.",
"security": [{"adminApiKey": []}],
"requestBody": {
"required": true,
@@ -5427,59 +5443,6 @@
}
}
},
"/admin/system/heap-snapshots": {
"post": {
"operationId": "create_admin_system_heap_snapshot",
"summary": "Create a V8 heap snapshot",
"tags": ["Admin"],
"responses": {
"200": {
"description": "Success",
"content": {"application/octet-stream": {"schema": {"$ref": "#/components/schemas/HeapSnapshotResponse"}}}
},
"400": {
"description": "Bad Request - The request was malformed or contained invalid data",
"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}
},
"401": {
"description": "Unauthorized - Authentication is required or the token is invalid",
"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}
},
"403": {
"description": "Forbidden - You do not have permission to perform this action",
"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}
},
"429": {
"description": "Too Many Requests - You are being rate limited",
"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ThrottledError"}}},
"headers": {
"Retry-After": {
"description": "Number of seconds to wait before retrying (only on 429)",
"schema": {"type": "integer"}
},
"X-RateLimit-Limit": {
"description": "The number of requests that can be made in the current window",
"schema": {"type": "integer"}
},
"X-RateLimit-Remaining": {
"description": "The number of remaining requests that can be made",
"schema": {"type": "integer"}
},
"X-RateLimit-Reset": {
"description": "Unix timestamp when the rate limit resets",
"schema": {"type": "integer"}
}
}
},
"500": {
"description": "Internal Server Error - An unexpected error occurred",
"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}
}
},
"description": "Writes a V8 heap snapshot of the current process and returns the snapshot file. Used for diagnosing memory leaks. Requires SYSTEM_HEAP_SNAPSHOT permission.",
"security": [{"adminApiKey": []}]
}
},
"/admin/users": {
"get": {
"operationId": "list_admin_users",
@@ -9874,7 +9837,7 @@
"type": "object",
"properties": {
"acls": {
"maxItems": 112,
"maxItems": 111,
"type": "array",
"items": {"$ref": "#/components/schemas/AdminAclType"},
"description": "List of access control permissions to assign"
@@ -9904,7 +9867,6 @@
"required": ["users", "total"],
"additionalProperties": false
},
"HeapSnapshotResponse": {"type": "string", "format": "binary", "description": "V8 heap snapshot file"},
"SendSystemDmRequest": {
"type": "object",
"properties": {
@@ -10562,6 +10524,9 @@
},
"gateway_rollout": {"$ref": "#/components/schemas/GatewayRolloutConfigResponse"},
"voice_noise_suppression": {"$ref": "#/components/schemas/VoiceNoiseSuppressionConfigResponse"},
"push_relay": {"$ref": "#/components/schemas/PushRelayConfigResponse"},
"domain_migration": {"$ref": "#/components/schemas/DomainMigrationConfigResponse"},
"altcha_captcha": {"$ref": "#/components/schemas/AltchaCaptchaConfigResponse"},
"experiment_delivery": {"$ref": "#/components/schemas/ExperimentDeliveryConfigResponse"},
"registration": {
"type": "object",
@@ -10579,13 +10544,13 @@
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"expires_at": {
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"max_uses": {"nullable": true, "type": "integer", "minimum": 1, "maximum": 9007199254740991},
"use_count": {"type": "integer", "minimum": 0, "maximum": 9007199254740991},
@@ -10593,14 +10558,14 @@
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"approval_required": {"type": "boolean"},
"last_used_at": {
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"last_used_by_user_id": {
"nullable": true,
@@ -10636,7 +10601,7 @@
"requested_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"registration_url_id": {"nullable": true, "type": "string", "minLength": 1, "maxLength": 128},
"client_ip": {"nullable": true, "type": "string"}
@@ -10671,7 +10636,9 @@
"logo_url": {"nullable": true, "type": "string"},
"wordmark_url": {"nullable": true, "type": "string"},
"favicon_url": {"nullable": true, "type": "string"},
"theme_color": {"nullable": true, "type": "string"}
"theme_color": {"nullable": true, "type": "string"},
"status_page_url": {"nullable": true, "type": "string"},
"status_page_incident_history_url": {"nullable": true, "type": "string"}
},
"required": [
"product_name",
@@ -10680,7 +10647,9 @@
"logo_url",
"wordmark_url",
"favicon_url",
"theme_color"
"theme_color",
"status_page_url",
"status_page_incident_history_url"
],
"additionalProperties": false
},
@@ -10889,12 +10858,14 @@
"min_lifetime_days": {
"nullable": true,
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
},
"max_lifetime_days": {
"nullable": true,
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
},
@@ -10902,12 +10873,14 @@
"renew_threshold_days": {
"nullable": true,
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
},
"renew_window_days": {
"nullable": true,
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
},
@@ -10918,15 +10891,31 @@
"min_size_mb": {"type": "number", "minimum": 0, "exclusiveMinimum": true},
"max_size_mb": {"type": "number", "minimum": 0, "exclusiveMinimum": true},
"max_eligible_size_mb": {"type": "number", "minimum": 0, "exclusiveMinimum": true},
"min_lifetime_days": {"type": "integer", "exclusiveMinimum": true, "maximum": 9007199254740991},
"max_lifetime_days": {"type": "integer", "exclusiveMinimum": true, "maximum": 9007199254740991},
"curve": {"type": "number", "minimum": 0, "maximum": 1},
"renew_threshold_days": {
"min_lifetime_days": {
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
},
"renew_window_days": {"type": "integer", "exclusiveMinimum": true, "maximum": 9007199254740991}
"max_lifetime_days": {
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
},
"curve": {"type": "number", "minimum": 0, "maximum": 1},
"renew_threshold_days": {
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
},
"renew_window_days": {
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
}
},
"required": [
"enabled",
@@ -10965,6 +10954,9 @@
"sso",
"gateway_rollout",
"voice_noise_suppression",
"push_relay",
"domain_migration",
"altcha_captcha",
"experiment_delivery",
"registration",
"self_hosted",
@@ -10983,7 +10975,7 @@
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"max_uses": {"nullable": true, "type": "integer", "minimum": 1, "maximum": 1000000},
"approval_required": {"default": false, "type": "boolean"}
@@ -11001,13 +10993,13 @@
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"expires_at": {
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"max_uses": {"nullable": true, "type": "integer", "minimum": 1, "maximum": 9007199254740991},
"use_count": {"type": "integer", "minimum": 0, "maximum": 9007199254740991},
@@ -11015,14 +11007,14 @@
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"approval_required": {"type": "boolean"},
"last_used_at": {
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"last_used_by_user_id": {
"nullable": true,
@@ -11099,6 +11091,15 @@
"nullable": true,
"allOf": [{"$ref": "#/components/schemas/VoiceNoiseSuppressionConfigUpdateRequest"}]
},
"push_relay": {"nullable": true, "allOf": [{"$ref": "#/components/schemas/PushRelayConfigUpdateRequest"}]},
"domain_migration": {
"nullable": true,
"allOf": [{"$ref": "#/components/schemas/DomainMigrationConfigUpdateRequest"}]
},
"altcha_captcha": {
"nullable": true,
"allOf": [{"$ref": "#/components/schemas/AltchaCaptchaConfigUpdateRequest"}]
},
"experiment_delivery": {
"nullable": true,
"allOf": [{"$ref": "#/components/schemas/ExperimentDeliveryConfigUpdateRequest"}]
@@ -11144,7 +11145,9 @@
"logo_url": {"nullable": true, "type": "string", "maxLength": 2048},
"wordmark_url": {"nullable": true, "type": "string", "maxLength": 2048},
"favicon_url": {"nullable": true, "type": "string", "maxLength": 2048},
"theme_color": {"nullable": true, "type": "string", "maxLength": 64}
"theme_color": {"nullable": true, "type": "string", "maxLength": 64},
"status_page_url": {"nullable": true, "type": "string", "maxLength": 2048},
"status_page_incident_history_url": {"nullable": true, "type": "string", "maxLength": 2048}
}
},
"setup": {"nullable": true, "type": "object", "properties": {"configured": {"type": "boolean"}}},
@@ -11254,12 +11257,14 @@
"min_lifetime_days": {
"nullable": true,
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
},
"max_lifetime_days": {
"nullable": true,
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
},
@@ -11267,12 +11272,14 @@
"renew_threshold_days": {
"nullable": true,
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
},
"renew_window_days": {
"nullable": true,
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
}
@@ -11304,7 +11311,7 @@
"properties": {
"enabled": {"type": "boolean"},
"window_hours": {"type": "number", "minimum": 0, "exclusiveMinimum": true, "maximum": 8760},
"member_threshold": {"type": "integer", "exclusiveMinimum": true, "maximum": 1000000}
"member_threshold": {"type": "integer", "minimum": 0, "exclusiveMinimum": true, "maximum": 1000000}
}
}
}
@@ -12621,6 +12628,16 @@
}
},
"action": {"type": "string", "minLength": 1, "maxLength": 256},
"access": {
"description": "Whether the recorded operation read data or changed it",
"x-enumNames": ["read", "write"],
"x-enumDescriptions": [
"An entry recorded by an operation that only reads data",
"An entry recorded by an operation that changes data or triggers work"
],
"enum": ["read", "write"],
"type": "string"
},
"audit_log_reason": {"nullable": true, "type": "string", "minLength": 1, "maxLength": 4000},
"metadata": {"type": "object", "additionalProperties": {"type": "string", "maxLength": 4000}},
"created_at": {"type": "string"}
@@ -12638,6 +12655,7 @@
"related_guilds",
"related_channels",
"action",
"access",
"audit_log_reason",
"metadata",
"created_at"
@@ -12726,7 +12744,7 @@
},
"acls": {
"description": "Replacement list of access control permissions for the key",
"maxItems": 112,
"maxItems": 111,
"type": "array",
"items": {"$ref": "#/components/schemas/AdminAclType"}
}
@@ -12744,7 +12762,7 @@
"type": "string"
},
"acls": {
"maxItems": 112,
"maxItems": 111,
"type": "array",
"items": {"type": "string"},
"description": "List of access control permissions for the key"
@@ -12774,7 +12792,7 @@
"maximum": 365
},
"acls": {
"maxItems": 112,
"maxItems": 111,
"type": "array",
"items": {"$ref": "#/components/schemas/AdminAclType"},
"description": "List of access control permissions for the key"
@@ -12795,7 +12813,7 @@
"type": "string"
},
"acls": {
"maxItems": 112,
"maxItems": 111,
"type": "array",
"items": {"type": "string"},
"description": "List of access control permissions for the key"
@@ -12808,7 +12826,7 @@
"type": "object",
"properties": {
"acls": {
"maxItems": 112,
"maxItems": 111,
"type": "array",
"items": {"type": "string", "minLength": 1, "maxLength": 64},
"description": "Every admin access control permission the admin API recognises"
@@ -12899,7 +12917,6 @@
"report:view",
"report:view:reporter_pii",
"system_dm:send",
"system:heap_snapshot",
"user:cancel:bulk_message_deletion",
"user:delete",
"user:disable:suspicious",
@@ -13011,14 +13028,14 @@
"description": "ISO 8601 timestamp when the bot token was created",
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"client_secret_created_at": {
"nullable": true,
"description": "ISO 8601 timestamp when the client secret was created",
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"version": {
"description": "The optimistic locking version of the application record",
@@ -13446,7 +13463,7 @@
"timestamp": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
"description": "The ISO 8601 timestamp of when the message was created"
},
"edited_timestamp": {
@@ -13454,7 +13471,7 @@
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"pinned": {"type": "boolean", "description": "Whether the message is pinned"},
"mention_everyone": {"type": "boolean", "description": "Whether the message mentions @everyone"},
@@ -13554,7 +13571,7 @@
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": ["participants"],
@@ -13591,7 +13608,7 @@
"timestamp": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
"description": "The ISO 8601 timestamp of when the message was created"
},
"edited_timestamp": {
@@ -13599,7 +13616,7 @@
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"pinned": {"type": "boolean", "description": "Whether the message is pinned"},
"mention_everyone": {"type": "boolean", "description": "Whether the message mentions @everyone"},
@@ -13699,7 +13716,7 @@
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": ["participants"],
@@ -13863,7 +13880,7 @@
"timestamp": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
"description": "The ISO 8601 timestamp of when the original message was created"
},
"edited_timestamp": {
@@ -13871,7 +13888,7 @@
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"mentions": {
"description": "The user IDs mentioned in the snapshot",
@@ -14040,7 +14057,7 @@
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"description": {"description": "The description of the embed", "nullable": true, "type": "string"},
"author": {
@@ -14252,7 +14269,7 @@
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"description": {"description": "The description of the embed", "nullable": true, "type": "string"},
"author": {
@@ -14917,7 +14934,10 @@
"nullable": true,
"type": "string"
},
"reason": {"description": "The reason provided for the action", "type": "string"},
"reason": {
"description": "The audit log reason. For bans and timeouts without an X-Audit-Log-Reason header this is the reason sent in the request body",
"type": "string"
},
"options": {
"description": "Additional options depending on action type",
"type": "object",
@@ -14925,15 +14945,22 @@
"channel_id": {"description": "Channel ID for relevant actions", "type": "string"},
"count": {"description": "Count of items affected", "type": "number"},
"delete_member_days": {
"description": "Number of days of messages to delete on member ban",
"description": "Deprecated. Whole days of messages deleted, written only by bans recorded before delete_message_seconds",
"type": "string"
},
"delete_message_seconds": {
"description": "Seconds of the banned user's messages that the ban deleted, present only when positive",
"type": "number"
},
"id": {"description": "ID of the affected entity", "type": "string"},
"integration_type": {"description": "Type of integration", "type": "number"},
"message_id": {"description": "Message ID for relevant actions", "type": "string"},
"members_removed": {"description": "Number of members removed", "type": "number"},
"role_name": {"description": "Name of the role", "type": "string"},
"type": {"description": "Type identifier", "type": "number"},
"role_name": {"description": "Name of the role when the entry was written", "type": "string"},
"type": {
"description": "Channel type for CHANNEL_CREATE, CHANNEL_UPDATE and CHANNEL_DELETE. Overwrite target type (0 role, 1 member) for CHANNEL_OVERWRITE_*",
"type": "number"
},
"inviter_id": {"description": "ID of the user who created the invite", "type": "string"},
"max_age": {"description": "Maximum age of the invite in seconds", "type": "number"},
"max_uses": {"description": "Maximum number of uses for the invite", "type": "number"},
@@ -15114,7 +15141,7 @@
"joined_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
"description": "ISO8601 timestamp of when the user joined the guild"
},
"mute": {"type": "boolean", "description": "Whether the member is muted in voice channels"},
@@ -15124,7 +15151,7 @@
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"profile_flags": {"nullable": true, "allOf": [{"$ref": "#/components/schemas/GuildMemberProfileFlags"}]},
"mention_flags": {
@@ -15166,6 +15193,48 @@
"poll_jitter_percent": {"type": "integer", "minimum": 0, "maximum": 50}
}
},
"AltchaCaptchaConfigUpdateRequest": {
"type": "object",
"properties": {
"enabled": {"type": "boolean"},
"rollout_basis_points": {"type": "integer", "minimum": 0, "maximum": 10000},
"rollout_salt": {"type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[\\x20-\\x7e]+$"},
"included_user_ids": {
"maxItems": 1000,
"type": "array",
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
},
"excluded_user_ids": {
"maxItems": 1000,
"type": "array",
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
},
"anonymous_enabled": {"type": "boolean"},
"cost": {"type": "integer", "minimum": 1000, "maximum": 100000},
"max_counter": {"type": "integer", "minimum": 100, "maximum": 1000000}
}
},
"DomainMigrationConfigUpdateRequest": {
"type": "object",
"properties": {
"enabled": {"type": "boolean"},
"rollout_basis_points": {"type": "integer", "minimum": 0, "maximum": 10000},
"rollout_salt": {"type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[\\x20-\\x7e]+$"},
"included_user_ids": {
"maxItems": 1000,
"type": "array",
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
},
"excluded_user_ids": {
"maxItems": 1000,
"type": "array",
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
},
"anonymous_rollout_basis_points": {"type": "integer", "minimum": 0, "maximum": 10000},
"standalone_forwarding": {"type": "boolean"}
}
},
"PushRelayConfigUpdateRequest": {"type": "object", "properties": {"relay_consent_accepted": {"type": "boolean"}}},
"VoiceNoiseSuppressionConfigUpdateRequest": {
"type": "object",
"properties": {
@@ -15201,7 +15270,6 @@
"required": ["guild_id", "backend"]
}
},
"stereo_enabled": {"type": "boolean"},
"suppression_strength": {"type": "integer", "minimum": 0, "maximum": 100}
}
},
@@ -15232,6 +15300,104 @@
"required": ["poll_interval_seconds", "poll_jitter_percent"],
"additionalProperties": false
},
"AltchaCaptchaConfigResponse": {
"type": "object",
"properties": {
"enabled": {"default": false, "type": "boolean"},
"config_version": {"default": 0, "type": "integer", "minimum": 0, "maximum": 9007199254740991},
"rollout_basis_points": {"default": 0, "type": "integer", "minimum": 0, "maximum": 10000},
"rollout_salt": {
"default": "altcha-captcha-v1",
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[\\x20-\\x7e]+$"
},
"included_user_ids": {
"default": [],
"maxItems": 1000,
"type": "array",
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
},
"excluded_user_ids": {
"default": [],
"maxItems": 1000,
"type": "array",
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
},
"anonymous_enabled": {"default": false, "type": "boolean"},
"cost": {"default": 5000, "type": "integer", "minimum": 1000, "maximum": 100000},
"max_counter": {"default": 10000, "type": "integer", "minimum": 100, "maximum": 1000000}
},
"required": [
"enabled",
"config_version",
"rollout_basis_points",
"rollout_salt",
"included_user_ids",
"excluded_user_ids",
"anonymous_enabled",
"cost",
"max_counter"
],
"additionalProperties": false
},
"DomainMigrationConfigResponse": {
"type": "object",
"properties": {
"enabled": {"default": false, "type": "boolean"},
"config_version": {"default": 0, "type": "integer", "minimum": 0, "maximum": 9007199254740991},
"rollout_basis_points": {"default": 0, "type": "integer", "minimum": 0, "maximum": 10000},
"rollout_salt": {
"default": "domain-migration-v1",
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[\\x20-\\x7e]+$"
},
"included_user_ids": {
"default": [],
"maxItems": 1000,
"type": "array",
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
},
"excluded_user_ids": {
"default": [],
"maxItems": 1000,
"type": "array",
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
},
"anonymous_rollout_basis_points": {"default": 0, "type": "integer", "minimum": 0, "maximum": 10000},
"standalone_forwarding": {"default": false, "type": "boolean"}
},
"required": [
"enabled",
"config_version",
"rollout_basis_points",
"rollout_salt",
"included_user_ids",
"excluded_user_ids",
"anonymous_rollout_basis_points",
"standalone_forwarding"
],
"additionalProperties": false
},
"PushRelayConfigResponse": {
"type": "object",
"properties": {
"relay_consent_accepted": {"default": false, "type": "boolean"},
"relay_consent_accepted_at": {
"default": null,
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"relay_consent_accepted_by": {"default": null, "nullable": true, "type": "string", "pattern": "^\\d{1,20}$"}
},
"required": ["relay_consent_accepted", "relay_consent_accepted_at", "relay_consent_accepted_by"],
"additionalProperties": false
},
"VoiceNoiseSuppressionConfigResponse": {
"type": "object",
"properties": {
@@ -15276,7 +15442,6 @@
"additionalProperties": false
}
},
"stereo_enabled": {"default": false, "type": "boolean"},
"suppression_strength": {"default": 80, "type": "integer", "minimum": 0, "maximum": 100}
},
"required": [
@@ -15290,7 +15455,6 @@
"included_user_ids",
"excluded_user_ids",
"guild_overrides",
"stereo_enabled",
"suppression_strength"
],
"additionalProperties": false
@@ -15428,7 +15592,7 @@
"pending_bulk_message_deletion_at": {"nullable": true, "type": "string"},
"deletion_reason_code": {"nullable": true, "allOf": [{"$ref": "#/components/schemas/Int32Type"}]},
"deletion_public_reason": {"nullable": true, "type": "string"},
"acls": {"maxItems": 112, "type": "array", "items": {"type": "string"}},
"acls": {"maxItems": 111, "type": "array", "items": {"type": "string"}},
"traits": {"maxItems": 100, "type": "array", "items": {"type": "string"}},
"has_totp": {"type": "boolean"},
"authenticator_types": {"maxItems": 10, "type": "array", "items": {"$ref": "#/components/schemas/Int32Type"}},
@@ -15576,9 +15740,10 @@
"id": {"type": "string", "description": "The credential ID"},
"name": {"type": "string", "description": "User-assigned name for the credential"},
"created_at": {"type": "string", "description": "When the credential was registered"},
"last_used_at": {"nullable": true, "description": "When the credential was last used", "type": "string"}
"last_used_at": {"nullable": true, "description": "When the credential was last used", "type": "string"},
"rp_id": {"type": "string", "description": "Relying party ID the passkey belongs to"}
},
"required": ["id", "name", "created_at", "last_used_at"],
"required": ["id", "name", "created_at", "last_used_at", "rp_id"],
"additionalProperties": false
},
"VoiceServerAdminResponse": {
-2
View File
@@ -79,7 +79,6 @@ pub const REPORT_RESOLVE: &str = "report:resolve";
pub const REPORT_VIEW: &str = "report:view";
pub const REPORT_VIEW_REPORTER_PII: &str = "report:view:reporter_pii";
pub const SYSTEM_DM_SEND: &str = "system_dm:send";
pub const SYSTEM_HEAP_SNAPSHOT: &str = "system:heap_snapshot";
pub const USER_CANCEL_BULK_MESSAGE_DELETION: &str = "user:cancel:bulk_message_deletion";
pub const USER_DELETE: &str = "user:delete";
pub const USER_DISABLE_SUSPICIOUS: &str = "user:disable:suspicious";
@@ -192,7 +191,6 @@ pub const ALL_ACLS: &[&str] = &[
REPORT_VIEW,
REPORT_VIEW_REPORTER_PII,
SYSTEM_DM_SEND,
SYSTEM_HEAP_SNAPSHOT,
USER_CANCEL_BULK_MESSAGE_DELETION,
USER_DELETE,
USER_DISABLE_SUSPICIOUS,
+41
View File
@@ -10,6 +10,7 @@ pub struct SearchAuditLogsParams {
pub admin_user_id: Option<String>,
pub target_id: Option<String>,
pub target_type: Option<String>,
pub access: Option<String>,
pub sort_by: Option<String>,
pub sort_order: Option<String>,
pub limit: u32,
@@ -21,6 +22,12 @@ impl AdminApiClient {
&self,
params: &SearchAuditLogsParams,
) -> ApiResult<AuditLogsListResponse> {
let access = params
.access
.as_deref()
.map(audit_access)
.transpose()?
.map(|value| value.to_string());
let sort_by = params
.sort_by
.as_deref()
@@ -46,6 +53,7 @@ impl AdminApiClient {
params.target_type.as_deref().unwrap_or_default(),
),
("target_id", params.target_id.as_deref().unwrap_or_default()),
("access", access.as_deref().unwrap_or_default()),
("sort_by", sort_by.as_deref().unwrap_or_default()),
("sort_order", sort_order.as_deref().unwrap_or_default()),
("limit", limit.as_str()),
@@ -55,6 +63,11 @@ impl AdminApiClient {
}
}
fn audit_access(value: &str) -> ApiResult<generated_types::ListAdminAuditLogsAccess> {
generated_types::ListAdminAuditLogsAccess::try_from(value)
.map_err(|e| ApiError::Parse(e.to_string()))
}
fn audit_sort_by(value: &str) -> ApiResult<generated_types::ListAdminAuditLogsSortBy> {
let value = match value {
"created_at" => "createdAt",
@@ -83,6 +96,13 @@ mod tests {
assert_eq!(audit_sort_order("desc").unwrap().to_string(), "desc");
}
#[test]
fn accepts_only_known_access_filters() {
assert_eq!(audit_access("read").unwrap().to_string(), "read");
assert_eq!(audit_access("write").unwrap().to_string(), "write");
assert!(audit_access("all").is_err());
}
#[test]
fn rejects_lossy_audit_totals() {
for total in [serde_json::json!(1.5), serde_json::json!(-1)] {
@@ -99,6 +119,7 @@ mod tests {
"admin_user_id": "234567890123456789",
"admin_user": null,
"action": "USER_UPDATE",
"access": "write",
"target_id": "345678901234567890",
"target_type": "user",
"target_user": null,
@@ -118,6 +139,26 @@ mod tests {
assert_eq!(generated.logs[0].action.to_string(), "USER_UPDATE");
let response: AuditLogsListResponse = serde_json::from_value(json.clone()).unwrap();
assert_eq!(response.logs[0].access.as_deref(), Some("write"));
assert_eq!(serde_json::to_value(response).unwrap(), json);
}
#[test]
fn deserializes_audit_entries_from_an_api_without_access() {
let json = serde_json::json!({
"logs": [{
"log_id": "123456789012345678",
"admin_user_id": "234567890123456789",
"action": "USER_UPDATE",
"target_id": "345678901234567890",
"target_type": "user",
"audit_log_reason": null,
"metadata": {},
"created_at": "2026-09-11T12:00:00.000Z"
}],
"total": 1
});
let response: AuditLogsListResponse = serde_json::from_value(json).unwrap();
assert_eq!(response.logs[0].access, None);
}
}
+7 -5
View File
@@ -14,8 +14,8 @@ impl AdminApiClient {
audit_log_reason: Option<&str>,
) -> ApiResult<BulkJobResponse> {
let body = generated_types::AdminBulkJobCreateRequest::UpdateUserFlags {
add_flags: user_flags(add_flags),
remove_flags: user_flags(remove_flags),
add_flags: user_flags(add_flags)?,
remove_flags: user_flags(remove_flags)?,
user_ids: snowflakes(user_ids),
};
self.post_typed_with_reason("/admin/bulk-jobs", &body, audit_log_reason)
@@ -112,11 +112,13 @@ fn snowflakes(values: &[String]) -> Vec<generated_types::SnowflakeType> {
values.iter().map(|value| snowflake(value)).collect()
}
fn user_flags(values: &[String]) -> Vec<generated_types::UserFlags> {
fn user_flags(values: &[String]) -> ApiResult<Vec<generated_types::UserFlags>> {
values
.iter()
.cloned()
.map(generated_types::UserFlags::from)
.map(|value| {
generated_types::UserFlags::try_from(value.as_str())
.map_err(|error| ApiError::Parse(error.to_string()))
})
.collect()
}
+2
View File
@@ -9,6 +9,8 @@ pub struct AuditLogEntry {
#[serde(default)]
pub admin_user: Option<AuditLogUserSummary>,
pub action: String,
#[serde(default)]
pub access: Option<String>,
pub target_id: String,
pub target_type: String,
#[serde(default)]
+184 -5
View File
@@ -23,6 +23,12 @@ pub struct InstanceConfigResponse {
#[serde(default)]
pub voice_noise_suppression: VoiceNoiseSuppressionConfigResponse,
#[serde(default)]
pub push_relay: PushRelayConfigResponse,
#[serde(default)]
pub domain_migration: DomainMigrationConfigResponse,
#[serde(default)]
pub altcha_captcha: AltchaCaptchaConfigResponse,
#[serde(default)]
pub experiment_delivery: ExperimentDeliveryConfigResponse,
}
@@ -326,6 +332,8 @@ pub struct AppBrandingConfigResponse {
pub wordmark_url: Option<String>,
pub favicon_url: Option<String>,
pub theme_color: Option<String>,
pub status_page_url: Option<String>,
pub status_page_incident_history_url: Option<String>,
}
impl Default for AppBrandingConfigResponse {
@@ -338,6 +346,8 @@ impl Default for AppBrandingConfigResponse {
wordmark_url: None,
favicon_url: None,
theme_color: None,
status_page_url: None,
status_page_incident_history_url: None,
}
}
}
@@ -442,7 +452,11 @@ impl VoiceE2eeScope {
}
}
pub const VOICE_NS_MAX_TARGETED_USERS: usize = 1_000;
pub const EXPERIMENT_MAX_TARGETED_USERS: usize = 1_000;
pub const DOMAIN_MIGRATION_DEFAULT_SALT: &str = "domain-migration-v1";
pub const ALTCHA_CAPTCHA_DEFAULT_SALT: &str = "altcha-captcha-v1";
pub const ALTCHA_CAPTCHA_COST_RANGE: std::ops::RangeInclusive<u32> = 1_000..=100_000;
pub const ALTCHA_CAPTCHA_MAX_COUNTER_RANGE: std::ops::RangeInclusive<u32> = 100..=1_000_000;
pub const VOICE_NS_MAX_GUILD_OVERRIDES: usize = 200;
impl NoiseSuppressionBackend {
@@ -488,7 +502,6 @@ pub struct VoiceNoiseSuppressionConfigResponse {
pub included_user_ids: Vec<String>,
pub excluded_user_ids: Vec<String>,
pub guild_overrides: Vec<VoiceNoiseSuppressionGuildOverride>,
pub stereo_enabled: bool,
pub suppression_strength: u32,
}
@@ -505,7 +518,6 @@ impl Default for VoiceNoiseSuppressionConfigResponse {
included_user_ids: Vec::new(),
excluded_user_ids: Vec::new(),
guild_overrides: Vec::new(),
stereo_enabled: false,
suppression_strength: 80,
}
}
@@ -532,11 +544,119 @@ pub struct VoiceNoiseSuppressionConfigUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub guild_overrides: Option<Vec<VoiceNoiseSuppressionGuildOverride>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stereo_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suppression_strength: Option<u32>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(default)]
pub struct PushRelayConfigResponse {
pub relay_consent_accepted: bool,
pub relay_consent_accepted_at: Option<String>,
pub relay_consent_accepted_by: Option<String>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct PushRelayConfigUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub relay_consent_accepted: Option<bool>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(default)]
pub struct DomainMigrationConfigResponse {
pub enabled: bool,
pub config_version: u64,
pub rollout_basis_points: u32,
pub rollout_salt: String,
pub included_user_ids: Vec<String>,
pub excluded_user_ids: Vec<String>,
pub anonymous_rollout_basis_points: u32,
pub standalone_forwarding: bool,
}
impl Default for DomainMigrationConfigResponse {
fn default() -> Self {
Self {
enabled: false,
config_version: 0,
rollout_basis_points: 0,
rollout_salt: DOMAIN_MIGRATION_DEFAULT_SALT.to_owned(),
included_user_ids: Vec::new(),
excluded_user_ids: Vec::new(),
anonymous_rollout_basis_points: 0,
standalone_forwarding: false,
}
}
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct DomainMigrationConfigUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rollout_basis_points: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rollout_salt: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub included_user_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub excluded_user_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub anonymous_rollout_basis_points: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub standalone_forwarding: Option<bool>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(default)]
pub struct AltchaCaptchaConfigResponse {
pub enabled: bool,
pub config_version: u64,
pub rollout_basis_points: u32,
pub rollout_salt: String,
pub included_user_ids: Vec<String>,
pub excluded_user_ids: Vec<String>,
pub anonymous_enabled: bool,
pub cost: u32,
pub max_counter: u32,
}
impl Default for AltchaCaptchaConfigResponse {
fn default() -> Self {
Self {
enabled: false,
config_version: 0,
rollout_basis_points: 0,
rollout_salt: ALTCHA_CAPTCHA_DEFAULT_SALT.to_owned(),
included_user_ids: Vec::new(),
excluded_user_ids: Vec::new(),
anonymous_enabled: false,
cost: 5_000,
max_counter: 10_000,
}
}
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct AltchaCaptchaConfigUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rollout_basis_points: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rollout_salt: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub included_user_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub excluded_user_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub anonymous_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cost: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_counter: Option<u32>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(default)]
pub struct ExperimentDeliveryConfigResponse {
@@ -653,6 +773,12 @@ pub struct InstanceConfigUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub voice_noise_suppression: Option<VoiceNoiseSuppressionConfigUpdateRequest>,
#[serde(skip_serializing_if = "Option::is_none")]
pub push_relay: Option<PushRelayConfigUpdateRequest>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domain_migration: Option<DomainMigrationConfigUpdateRequest>,
#[serde(skip_serializing_if = "Option::is_none")]
pub altcha_captcha: Option<AltchaCaptchaConfigUpdateRequest>,
#[serde(skip_serializing_if = "Option::is_none")]
pub experiment_delivery: Option<ExperimentDeliveryConfigUpdateRequest>,
}
@@ -858,6 +984,10 @@ pub struct AppBrandingConfigUpdateRequest {
pub favicon_url: Option<Option<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub theme_color: Option<Option<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status_page_url: Option<Option<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status_page_incident_history_url: Option<Option<String>>,
}
#[derive(Clone, Debug, Default, Serialize)]
@@ -986,18 +1116,42 @@ mod tests {
.expect("admin schema");
let noise = serde_json::from_value::<VoiceNoiseSuppressionConfigResponse>(json!({}))
.expect("default noise config");
let domain_migration = serde_json::from_value::<DomainMigrationConfigResponse>(json!({}))
.expect("default domain migration config");
let altcha_captcha = serde_json::from_value::<AltchaCaptchaConfigResponse>(json!({}))
.expect("default altcha captcha config");
let delivery = serde_json::from_value::<ExperimentDeliveryConfigResponse>(json!({}))
.expect("default delivery config");
let noise = serde_json::to_value(noise).expect("serializable noise config");
let domain_migration =
serde_json::to_value(domain_migration).expect("serializable domain migration config");
let altcha_captcha =
serde_json::to_value(altcha_captcha).expect("serializable altcha captcha config");
let delivery = serde_json::to_value(delivery).expect("serializable delivery config");
let generated_noise: generated_types::VoiceNoiseSuppressionConfigResponse =
serde_json::from_value(noise.clone()).expect("generated noise config contract");
let generated_domain_migration: generated_types::DomainMigrationConfigResponse =
serde_json::from_value(domain_migration.clone())
.expect("generated domain migration config contract");
let generated_altcha_captcha: generated_types::AltchaCaptchaConfigResponse =
serde_json::from_value(altcha_captcha.clone())
.expect("generated altcha captcha config contract");
let generated_delivery: generated_types::ExperimentDeliveryConfigResponse =
serde_json::from_value(delivery.clone()).expect("generated delivery config contract");
assert_eq!(
serde_json::to_value(generated_noise).expect("serializable generated noise config"),
noise
);
assert_eq!(
serde_json::to_value(generated_domain_migration)
.expect("serializable generated domain migration config"),
domain_migration
);
assert_eq!(
serde_json::to_value(generated_altcha_captcha)
.expect("serializable generated altcha captcha config"),
altcha_captcha
);
assert_eq!(
serde_json::to_value(generated_delivery)
.expect("serializable generated delivery config"),
@@ -1005,6 +1159,8 @@ mod tests {
);
for (name, value) in [
("VoiceNoiseSuppressionConfigResponse", noise),
("DomainMigrationConfigResponse", domain_migration),
("AltchaCaptchaConfigResponse", altcha_captcha),
("ExperimentDeliveryConfigResponse", delivery),
] {
for (field, value) in value.as_object().expect("config object") {
@@ -1040,4 +1196,27 @@ mod tests {
json!({})
);
}
#[test]
fn domain_migration_update_preserves_empty_lists_and_omitted_fields() {
let update = DomainMigrationConfigUpdateRequest {
included_user_ids: Some(Vec::new()),
excluded_user_ids: Some(Vec::new()),
..Default::default()
};
let value = serde_json::to_value(update).expect("serializable update");
serde_json::from_value::<generated_types::DomainMigrationConfigUpdateRequest>(
value.clone(),
)
.expect("generated update contract");
assert_eq!(
value,
json!({"included_user_ids": [], "excluded_user_ids": []})
);
assert_eq!(
serde_json::to_value(DomainMigrationConfigUpdateRequest::default())
.expect("serializable update"),
json!({})
);
}
}
+7 -5
View File
@@ -95,8 +95,8 @@ impl AdminApiClient {
remove_flags: &[String],
) -> ApiResult<AdminUser> {
let body = generated_types::AdminUserFlagsUpdateRequest {
add_flags: user_flags(add_flags),
remove_flags: user_flags(remove_flags),
add_flags: user_flags(add_flags)?,
remove_flags: user_flags(remove_flags)?,
};
let response = self
.generated()
@@ -567,11 +567,13 @@ fn bool_param(value: bool) -> &'static str {
if value { "true" } else { "false" }
}
fn user_flags(values: &[String]) -> Vec<generated_types::UserFlags> {
fn user_flags(values: &[String]) -> ApiResult<Vec<generated_types::UserFlags>> {
values
.iter()
.cloned()
.map(generated_types::UserFlags::from)
.map(|value| {
generated_types::UserFlags::try_from(value.as_str())
.map_err(|error| ApiError::Parse(error.to_string()))
})
.collect()
}
+2 -1
View File
@@ -121,6 +121,7 @@ pub async fn render(
admin_user_id: None,
target_id: Some(guild_id.to_owned()),
target_type: Some("guild".to_owned()),
access: Some("write".to_owned()),
sort_by: Some("created_at".to_owned()),
sort_order: Some("desc".to_owned()),
limit: 50,
@@ -134,7 +135,7 @@ pub async fn render(
@if let Some(resp) = resp {
@if resp.logs.is_empty() {
p class="text-sm text-neutral-500" {
"No admin audit log entries for this guild."
"No admin write actions have been recorded for this guild."
}
} @else {
(table_container(table(maud::html! {
+1 -1
View File
@@ -80,7 +80,7 @@ async fn reports_list(
return reports_error_page(
config,
&auth.0,
"That page is out of range. The reports search returns at most the first 10000 reports, so narrow the filters and start again.",
"That page is out of range. The reports search returns at most the first 10000 reports. Narrow the filters and start again.",
);
}
let search_query = query.q.as_deref().and_then(clean_string);
+3
View File
@@ -28,6 +28,7 @@ struct AuditLogsQuery {
admin_user_id: Option<String>,
target_id: Option<String>,
target_type: Option<String>,
access: Option<String>,
sort_by: Option<String>,
sort_order: Option<String>,
limit: Option<u32>,
@@ -119,6 +120,7 @@ async fn audit_logs_page(
admin_user_id: query.admin_user_id.as_deref().unwrap_or(""),
target_id: query.target_id.as_deref().unwrap_or(""),
target_type: query.target_type.as_deref().unwrap_or(""),
access: query.access.as_deref().unwrap_or(""),
sort_by: query.sort_by.as_deref().unwrap_or("createdAt"),
sort_order: query.sort_order.as_deref().unwrap_or("desc"),
limit,
@@ -131,6 +133,7 @@ async fn audit_logs_page(
admin_user_id: nonempty(params.admin_user_id),
target_id: nonempty(params.target_id),
target_type: nonempty(params.target_type),
access: nonempty(params.access),
sort_by: Some(params.sort_by.to_owned()),
sort_order: Some(params.sort_order.to_owned()),
limit,
+338 -55
View File
@@ -4,22 +4,24 @@ use crate::{
api::{
client::AdminApiClient,
types::{
AppBrandingConfigUpdateRequest, AppLegalConfigUpdateRequest,
AppPublicConfigUpdateRequest, AppRegistrationConfigUpdateRequest,
AppSetupConfigUpdateRequest, CreateRegistrationUrlRequest,
DeferredPhoneGateUpdateRequest, ExperimentDeliveryConfigUpdateRequest,
GatewayRolloutConfigUpdateRequest, GatewayRolloutMode,
InstanceAttachmentDecayUpdateRequest, InstanceBlueskyIntegrationUpdateRequest,
InstanceBlueskyKeyIntegrationUpdateRequest, InstanceCaptchaIntegrationUpdateRequest,
InstanceConfigUpdateRequest, InstanceEmailIntegrationUpdateRequest,
InstanceEmailSmtpIntegrationUpdateRequest, InstanceEmailSmtpTestRequest,
InstanceGifIntegrationUpdateRequest, InstanceIntegrationsUpdateRequest,
InstanceMediaUpdateRequest, InstancePolicyUpdateRequest,
InstanceRegistrationConfigUpdateRequest, InstanceServicesUpdateRequest,
InstanceYoutubeIntegrationUpdateRequest, LimitConfigUpdateRequest, LimitRule,
LimitRuleFilters, NoiseSuppressionBackend, PremiumMode, RegistrationMode,
SsoConfigUpdateRequest, VOICE_NS_MAX_GUILD_OVERRIDES, VOICE_NS_MAX_TARGETED_USERS,
VoiceE2eeScope, VoiceNoiseSuppressionConfigUpdateRequest,
ALTCHA_CAPTCHA_COST_RANGE, ALTCHA_CAPTCHA_MAX_COUNTER_RANGE,
AltchaCaptchaConfigUpdateRequest, AppBrandingConfigUpdateRequest,
AppLegalConfigUpdateRequest, AppPublicConfigUpdateRequest,
AppRegistrationConfigUpdateRequest, AppSetupConfigUpdateRequest,
CreateRegistrationUrlRequest, DeferredPhoneGateUpdateRequest,
DomainMigrationConfigUpdateRequest, EXPERIMENT_MAX_TARGETED_USERS,
ExperimentDeliveryConfigUpdateRequest, GatewayRolloutConfigUpdateRequest,
GatewayRolloutMode, InstanceAttachmentDecayUpdateRequest,
InstanceBlueskyIntegrationUpdateRequest, InstanceBlueskyKeyIntegrationUpdateRequest,
InstanceCaptchaIntegrationUpdateRequest, InstanceConfigUpdateRequest,
InstanceEmailIntegrationUpdateRequest, InstanceEmailSmtpIntegrationUpdateRequest,
InstanceEmailSmtpTestRequest, InstanceGifIntegrationUpdateRequest,
InstanceIntegrationsUpdateRequest, InstanceMediaUpdateRequest,
InstancePolicyUpdateRequest, InstanceRegistrationConfigUpdateRequest,
InstanceServicesUpdateRequest, InstanceYoutubeIntegrationUpdateRequest,
LimitConfigUpdateRequest, LimitRule, LimitRuleFilters, NoiseSuppressionBackend,
PremiumMode, PushRelayConfigUpdateRequest, RegistrationMode, SsoConfigUpdateRequest,
VOICE_NS_MAX_GUILD_OVERRIDES, VoiceE2eeScope, VoiceNoiseSuppressionConfigUpdateRequest,
VoiceNoiseSuppressionGuildOverride,
},
},
@@ -207,6 +209,18 @@ pub async fn instance_config_post(
Ok(update) => instance_config_result(client.update_instance_config(&update).await),
Err(message) => FlashData::error(message),
},
"update_push_relay" => {
let update = build_push_relay_update(&form);
instance_config_result(client.update_instance_config(&update).await)
}
"update_domain_migration" => match build_domain_migration_update(&form) {
Ok(update) => instance_config_result(client.update_instance_config(&update).await),
Err(message) => FlashData::error(message),
},
"update_altcha_captcha" => match build_altcha_captcha_update(&form) {
Ok(update) => instance_config_result(client.update_instance_config(&update).await),
Err(message) => FlashData::error(message),
},
"update_experiment_delivery" => match build_experiment_delivery_update(&form) {
Ok(update) => instance_config_result(client.update_instance_config(&update).await),
Err(message) => FlashData::error(message),
@@ -447,10 +461,10 @@ fn build_gateway_rollout_update(form: &MultiValueForm) -> InstanceConfigUpdateRe
}
}
const VOICE_NS_ROLLOUT_BASIS_POINTS_MAX: u32 = 10_000;
const EXPERIMENT_ROLLOUT_BASIS_POINTS_MAX: u32 = 10_000;
const VOICE_NS_SUPPRESSION_STRENGTH_MAX: u32 = 100;
const VOICE_NS_MAX_ROLLOUT_SALT_CHARS: usize = 64;
const VOICE_NS_MAX_SNOWFLAKE_LENGTH: usize = 20;
const EXPERIMENT_MAX_ROLLOUT_SALT_CHARS: usize = 64;
const EXPERIMENT_MAX_SNOWFLAKE_LENGTH: usize = 20;
const EXPERIMENT_MIN_POLL_INTERVAL_SECONDS: u64 = 60;
const EXPERIMENT_MAX_POLL_INTERVAL_SECONDS: u64 = 86_400;
const EXPERIMENT_MAX_POLL_JITTER_PERCENT: u32 = 50;
@@ -476,35 +490,51 @@ where
Ok(Some(value))
}
fn parse_voice_noise_suppression_rollout_salt(
fn parse_experiment_rollout_salt(
form: &MultiValueForm,
key: &str,
) -> Result<Option<String>, String> {
let Some(raw) = form.first("voice_ns_rollout_salt") else {
let Some(raw) = form.first(key) else {
return Ok(None);
};
let salt = raw.trim();
if salt.is_empty() || salt.encode_utf16().count() > VOICE_NS_MAX_ROLLOUT_SALT_CHARS {
if salt.is_empty() || salt.encode_utf16().count() > EXPERIMENT_MAX_ROLLOUT_SALT_CHARS {
return Err(format!(
"Rollout salt must be between 1 and {VOICE_NS_MAX_ROLLOUT_SALT_CHARS} characters"
"Rollout salt must be between 1 and {EXPERIMENT_MAX_ROLLOUT_SALT_CHARS} characters"
));
}
Ok(Some(salt.to_owned()))
}
fn is_voice_noise_suppression_snowflake(value: &str) -> bool {
fn parse_ascii_experiment_rollout_salt(
form: &MultiValueForm,
key: &str,
) -> Result<Option<String>, String> {
let salt = parse_experiment_rollout_salt(form, key)?;
if let Some(value) = salt.as_deref()
&& !value
.bytes()
.all(|byte| byte.is_ascii_graphic() || byte == b' ')
{
return Err("Rollout salt must use printable ASCII".to_owned());
}
Ok(salt)
}
fn is_experiment_snowflake(value: &str) -> bool {
!value.is_empty()
&& value.len() <= VOICE_NS_MAX_SNOWFLAKE_LENGTH
&& value.len() <= EXPERIMENT_MAX_SNOWFLAKE_LENGTH
&& value.bytes().all(|byte| byte.is_ascii_digit())
}
fn parse_voice_noise_suppression_user_ids(value: &str, label: &str) -> Result<Vec<String>, String> {
fn parse_experiment_user_ids(value: &str, label: &str) -> Result<Vec<String>, String> {
let mut ids: Vec<String> = Vec::new();
for (index, candidate) in value.split([',', '\n', '\r']).enumerate() {
let candidate = candidate.trim();
if candidate.is_empty() {
continue;
}
if !is_voice_noise_suppression_snowflake(candidate) {
if !is_experiment_snowflake(candidate) {
return Err(format!(
"{label} entry {} must contain 1 to 20 decimal digits",
index + 1
@@ -513,9 +543,9 @@ fn parse_voice_noise_suppression_user_ids(value: &str, label: &str) -> Result<Ve
if ids.iter().any(|existing| existing == candidate) {
continue;
}
if ids.len() == VOICE_NS_MAX_TARGETED_USERS {
if ids.len() == EXPERIMENT_MAX_TARGETED_USERS {
return Err(format!(
"{label} must contain at most {VOICE_NS_MAX_TARGETED_USERS} unique IDs"
"{label} must contain at most {EXPERIMENT_MAX_TARGETED_USERS} unique IDs"
));
}
ids.push(candidate.to_owned());
@@ -536,7 +566,7 @@ fn parse_voice_noise_suppression_guild_overrides(
format!("Guild overrides line {line_number} must use guild_id=backend")
})?;
let guild_id = guild_id.trim();
if !is_voice_noise_suppression_snowflake(guild_id) {
if !is_experiment_snowflake(guild_id) {
return Err(format!(
"Guild overrides line {line_number} must use a guild ID with 1 to 20 decimal digits"
));
@@ -602,21 +632,20 @@ fn build_voice_noise_suppression_update(
"voice_ns_rollout_basis_points",
"Rollout basis points",
0,
VOICE_NS_ROLLOUT_BASIS_POINTS_MAX,
EXPERIMENT_ROLLOUT_BASIS_POINTS_MAX,
)?,
rollout_salt: parse_voice_noise_suppression_rollout_salt(form)?,
included_user_ids: Some(parse_voice_noise_suppression_user_ids(
rollout_salt: parse_experiment_rollout_salt(form, "voice_ns_rollout_salt")?,
included_user_ids: Some(parse_experiment_user_ids(
form.first("voice_ns_included_user_ids").unwrap_or_default(),
"Included user IDs",
)?),
excluded_user_ids: Some(parse_voice_noise_suppression_user_ids(
excluded_user_ids: Some(parse_experiment_user_ids(
form.first("voice_ns_excluded_user_ids").unwrap_or_default(),
"Excluded user IDs",
)?),
guild_overrides: Some(parse_voice_noise_suppression_guild_overrides(
form.first("voice_ns_guild_overrides").unwrap_or_default(),
)?),
stereo_enabled: Some(form.bool_value("voice_ns_stereo_enabled")),
suppression_strength: parse_form_number(
form,
"voice_ns_suppression_strength",
@@ -629,6 +658,99 @@ fn build_voice_noise_suppression_update(
})
}
fn build_push_relay_update(form: &MultiValueForm) -> InstanceConfigUpdateRequest {
InstanceConfigUpdateRequest {
push_relay: Some(PushRelayConfigUpdateRequest {
relay_consent_accepted: Some(form.bool_value("push_relay_consent_accepted")),
}),
..Default::default()
}
}
fn build_domain_migration_update(
form: &MultiValueForm,
) -> Result<InstanceConfigUpdateRequest, String> {
Ok(InstanceConfigUpdateRequest {
domain_migration: Some(DomainMigrationConfigUpdateRequest {
enabled: Some(form.bool_value("domain_migration_enabled")),
rollout_basis_points: parse_form_number(
form,
"domain_migration_rollout_basis_points",
"Rollout basis points",
0,
EXPERIMENT_ROLLOUT_BASIS_POINTS_MAX,
)?,
rollout_salt: parse_ascii_experiment_rollout_salt(
form,
"domain_migration_rollout_salt",
)?,
included_user_ids: Some(parse_experiment_user_ids(
form.first("domain_migration_included_user_ids")
.unwrap_or_default(),
"Included user IDs",
)?),
excluded_user_ids: Some(parse_experiment_user_ids(
form.first("domain_migration_excluded_user_ids")
.unwrap_or_default(),
"Excluded user IDs",
)?),
anonymous_rollout_basis_points: parse_form_number(
form,
"domain_migration_anonymous_rollout_basis_points",
"Anonymous rollout basis points",
0,
EXPERIMENT_ROLLOUT_BASIS_POINTS_MAX,
)?,
standalone_forwarding: Some(form.bool_value("domain_migration_standalone_forwarding")),
}),
..Default::default()
})
}
fn build_altcha_captcha_update(
form: &MultiValueForm,
) -> Result<InstanceConfigUpdateRequest, String> {
Ok(InstanceConfigUpdateRequest {
altcha_captcha: Some(AltchaCaptchaConfigUpdateRequest {
enabled: Some(form.bool_value("altcha_captcha_enabled")),
rollout_basis_points: parse_form_number(
form,
"altcha_captcha_rollout_basis_points",
"Rollout basis points",
0,
EXPERIMENT_ROLLOUT_BASIS_POINTS_MAX,
)?,
rollout_salt: parse_ascii_experiment_rollout_salt(form, "altcha_captcha_rollout_salt")?,
included_user_ids: Some(parse_experiment_user_ids(
form.first("altcha_captcha_included_user_ids")
.unwrap_or_default(),
"Included user IDs",
)?),
excluded_user_ids: Some(parse_experiment_user_ids(
form.first("altcha_captcha_excluded_user_ids")
.unwrap_or_default(),
"Excluded user IDs",
)?),
anonymous_enabled: Some(form.bool_value("altcha_captcha_anonymous_enabled")),
cost: parse_form_number(
form,
"altcha_captcha_cost",
"Cost",
*ALTCHA_CAPTCHA_COST_RANGE.start(),
*ALTCHA_CAPTCHA_COST_RANGE.end(),
)?,
max_counter: parse_form_number(
form,
"altcha_captcha_max_counter",
"Maximum counter",
*ALTCHA_CAPTCHA_MAX_COUNTER_RANGE.start(),
*ALTCHA_CAPTCHA_MAX_COUNTER_RANGE.end(),
)?,
}),
..Default::default()
})
}
fn build_experiment_delivery_update(
form: &MultiValueForm,
) -> Result<InstanceConfigUpdateRequest, String> {
@@ -683,6 +805,8 @@ fn build_app_public_update(form: &MultiValueForm) -> InstanceConfigUpdateRequest
wordmark_url: optional("app_wordmark_url"),
favicon_url: optional("app_favicon_url"),
theme_color: optional("app_theme_color"),
status_page_url: optional("app_status_page_url"),
status_page_incident_history_url: optional("app_status_page_incident_history_url"),
}),
setup: Some(AppSetupConfigUpdateRequest {
configured: Some(form.bool_value("app_setup_configured")),
@@ -1244,7 +1368,6 @@ mod tests {
.expect("voice noise suppression update");
assert_eq!(update.enabled, Some(true));
assert_eq!(update.allow_user_override, Some(true));
assert_eq!(update.stereo_enabled, Some(false));
assert_eq!(
update.default_backend,
Some(NoiseSuppressionBackend::Rnnoise)
@@ -1270,7 +1393,6 @@ mod tests {
serde_json::json!({"voice_noise_suppression": {
"enabled": false,
"allow_user_override": false,
"stereo_enabled": false,
"enabled_backends": [],
"included_user_ids": [],
"excluded_user_ids": [],
@@ -1305,9 +1427,9 @@ mod tests {
}
#[test]
fn parse_voice_noise_suppression_user_ids_splits_newlines_and_commas() {
fn parse_experiment_user_ids_splits_newlines_and_commas() {
assert_eq!(
parse_voice_noise_suppression_user_ids(" 1 ,2\n3\r\n 4 ,, 5 ", "Included user IDs")
parse_experiment_user_ids(" 1 ,2\n3\r\n 4 ,, 5 ", "Included user IDs")
.expect("valid IDs"),
vec![
"1".to_owned(),
@@ -1320,16 +1442,15 @@ mod tests {
}
#[test]
fn parse_voice_noise_suppression_user_ids_dedupes_preserving_order() {
fn parse_experiment_user_ids_dedupes_preserving_order() {
assert_eq!(
parse_voice_noise_suppression_user_ids("20,10,20,10,30", "Included user IDs")
.expect("valid IDs"),
parse_experiment_user_ids("20,10,20,10,30", "Included user IDs").expect("valid IDs"),
vec!["20".to_owned(), "10".to_owned(), "30".to_owned()]
);
}
#[test]
fn parse_voice_noise_suppression_user_ids_rejects_non_digit_and_overlong_values() {
fn parse_experiment_user_ids_rejects_non_digit_and_overlong_values() {
for value in [
"abc",
"12a",
@@ -1339,11 +1460,8 @@ mod tests {
"<script>",
] {
assert_eq!(
parse_voice_noise_suppression_user_ids(
&format!("123,{value}"),
"Included user IDs"
)
.expect_err("invalid ID"),
parse_experiment_user_ids(&format!("123,{value}"), "Included user IDs")
.expect_err("invalid ID"),
"Included user IDs entry 2 must contain 1 to 20 decimal digits",
"{value}"
);
@@ -1351,18 +1469,17 @@ mod tests {
}
#[test]
fn parse_voice_noise_suppression_user_ids_rejects_exceeding_the_cap() {
let value = (0..VOICE_NS_MAX_TARGETED_USERS)
fn parse_experiment_user_ids_rejects_exceeding_the_cap() {
let value = (0..EXPERIMENT_MAX_TARGETED_USERS)
.map(|index| index.to_string())
.collect::<Vec<_>>()
.join("\n");
let ids =
parse_voice_noise_suppression_user_ids(&format!("{value}\n999"), "Included user IDs")
.expect("valid IDs at cap");
assert_eq!(ids.len(), VOICE_NS_MAX_TARGETED_USERS);
let ids = parse_experiment_user_ids(&format!("{value}\n999"), "Included user IDs")
.expect("valid IDs at cap");
assert_eq!(ids.len(), EXPERIMENT_MAX_TARGETED_USERS);
assert_eq!(ids.last(), Some(&"999".to_owned()));
assert_eq!(
parse_voice_noise_suppression_user_ids(&format!("{value}\n1000"), "Included user IDs")
parse_experiment_user_ids(&format!("{value}\n1000"), "Included user IDs")
.expect_err("too many IDs"),
"Included user IDs must contain at most 1000 unique IDs"
);
@@ -1555,6 +1672,172 @@ mod tests {
}
}
#[test]
fn build_domain_migration_update_reads_the_rollout_fields() {
let form = MultiValueForm::parse(
b"domain_migration_enabled=true&domain_migration_rollout_basis_points=%20250%20&domain_migration_rollout_salt=%20domain-migration-v2%20&domain_migration_included_user_ids=1500000000000000001%0A1500000000000000002&domain_migration_excluded_user_ids=1500000000000000003%2C%201500000000000000004&domain_migration_anonymous_rollout_basis_points=%20100%20&domain_migration_standalone_forwarding=true",
);
let update = build_domain_migration_update(&form)
.expect("valid form")
.domain_migration
.expect("domain migration update");
assert_eq!(update.enabled, Some(true));
assert_eq!(update.rollout_basis_points, Some(250));
assert_eq!(update.rollout_salt, Some("domain-migration-v2".to_owned()));
assert_eq!(
update.included_user_ids,
Some(vec![
"1500000000000000001".to_owned(),
"1500000000000000002".to_owned()
])
);
assert_eq!(
update.excluded_user_ids,
Some(vec![
"1500000000000000003".to_owned(),
"1500000000000000004".to_owned()
])
);
assert_eq!(update.anonymous_rollout_basis_points, Some(100));
assert_eq!(update.standalone_forwarding, Some(true));
}
#[test]
fn build_domain_migration_update_leaves_the_feature_inert_when_nothing_is_submitted() {
let form = MultiValueForm::parse(b"_csrf=token");
let request = build_domain_migration_update(&form).expect("valid form");
assert_eq!(
serde_json::to_value(request).expect("serializable update"),
serde_json::json!({"domain_migration": {
"enabled": false,
"included_user_ids": [],
"excluded_user_ids": [],
"standalone_forwarding": false,
}})
);
}
#[test]
fn build_domain_migration_update_rejects_invalid_rollout_fields() {
for (form, message) in [
(
"domain_migration_rollout_basis_points=10001",
"Rollout basis points must be a whole number between 0 and 10000",
),
(
"domain_migration_anonymous_rollout_basis_points=10001",
"Anonymous rollout basis points must be a whole number between 0 and 10000",
),
(
"domain_migration_anonymous_rollout_basis_points=abc",
"Anonymous rollout basis points must be a whole number between 0 and 10000",
),
(
"domain_migration_rollout_salt=%20%20",
"Rollout salt must be between 1 and 64 characters",
),
(
"domain_migration_rollout_salt=caf%C3%A9",
"Rollout salt must use printable ASCII",
),
(
"domain_migration_included_user_ids=123%2Cinvalid",
"Included user IDs entry 2 must contain 1 to 20 decimal digits",
),
(
"domain_migration_excluded_user_ids=123%2Cinvalid",
"Excluded user IDs entry 2 must contain 1 to 20 decimal digits",
),
] {
let form = MultiValueForm::parse(form.as_bytes());
assert_eq!(
build_domain_migration_update(&form).expect_err("invalid rollout field"),
message
);
}
}
#[test]
fn build_push_relay_update_reads_the_consent_checkbox() {
let unchecked = build_push_relay_update(&MultiValueForm::parse(b"_csrf=token"));
assert_eq!(
serde_json::to_value(&unchecked).expect("serialize update"),
serde_json::json!({"push_relay": {"relay_consent_accepted": false}})
);
let checked = build_push_relay_update(&MultiValueForm::parse(
b"_csrf=token&push_relay_consent_accepted=true",
));
assert_eq!(
serde_json::to_value(&checked).expect("serialize update"),
serde_json::json!({"push_relay": {"relay_consent_accepted": true}})
);
}
#[test]
fn build_altcha_captcha_update_reads_the_rollout_and_difficulty_fields() {
let form = MultiValueForm::parse(
b"altcha_captcha_enabled=true&altcha_captcha_rollout_basis_points=%20500%20&altcha_captcha_rollout_salt=%20altcha-captcha-v2%20&altcha_captcha_included_user_ids=1500000000000000001&altcha_captcha_excluded_user_ids=1500000000000000002&altcha_captcha_anonymous_enabled=true&altcha_captcha_cost=2000&altcha_captcha_max_counter=%20400%20",
);
let update = build_altcha_captcha_update(&form)
.expect("valid form")
.altcha_captcha
.expect("altcha captcha update");
assert_eq!(update.enabled, Some(true));
assert_eq!(update.rollout_basis_points, Some(500));
assert_eq!(update.rollout_salt, Some("altcha-captcha-v2".to_owned()));
assert_eq!(
update.included_user_ids,
Some(vec!["1500000000000000001".to_owned()])
);
assert_eq!(
update.excluded_user_ids,
Some(vec!["1500000000000000002".to_owned()])
);
assert_eq!(update.anonymous_enabled, Some(true));
assert_eq!(update.cost, Some(2000));
assert_eq!(update.max_counter, Some(400));
}
#[test]
fn build_altcha_captcha_update_leaves_the_feature_inert_when_nothing_is_submitted() {
let form = MultiValueForm::parse(b"_csrf=token");
let request = build_altcha_captcha_update(&form).expect("valid form");
assert_eq!(
serde_json::to_value(request).expect("serializable update"),
serde_json::json!({"altcha_captcha": {
"enabled": false,
"included_user_ids": [],
"excluded_user_ids": [],
"anonymous_enabled": false,
}})
);
}
#[test]
fn build_altcha_captcha_update_rejects_difficulty_outside_the_supported_range() {
for (form, message) in [
(
"altcha_captcha_cost=999",
"Cost must be a whole number between 1000 and 100000",
),
(
"altcha_captcha_max_counter=1000001",
"Maximum counter must be a whole number between 100 and 1000000",
),
(
"altcha_captcha_rollout_basis_points=10001",
"Rollout basis points must be a whole number between 0 and 10000",
),
] {
let form = MultiValueForm::parse(form.as_bytes());
assert_eq!(
build_altcha_captcha_update(&form).expect_err("invalid field"),
message
);
}
}
#[test]
fn build_experiment_delivery_update_leaves_both_fields_unchanged_when_absent() {
let form = MultiValueForm::parse(b"_csrf=token");
+7 -10
View File
@@ -73,15 +73,11 @@ pub async fn render(
.map(|r| r.sessions)
.map_err(|error| tracing::warn!(%error, user_id, "admin API request failed: list user sessions"))
.unwrap_or_default();
let webauthn_credentials = if u.authenticator_types.contains(&2) {
client
.list_webauthn_credentials(user_id)
.await
.map_err(|error| tracing::warn!(%error, user_id, "admin API request failed: list webauthn credentials"))
.unwrap_or_default()
} else {
Vec::new()
};
let webauthn_credentials = client
.list_webauthn_credentials(user_id)
.await
.map_err(|error| tracing::warn!(%error, user_id, "admin API request failed: list webauthn credentials"))
.unwrap_or_default();
Some(tabs::account::account_tab(
config,
&u,
@@ -244,7 +240,8 @@ pub async fn render(
query: None,
admin_user_id: None,
target_id: Some(user_id.to_owned()),
target_type: Some("user".to_owned()),
target_type: None,
access: Some("write".to_owned()),
sort_by: Some("created_at".to_owned()),
sort_order: Some("desc".to_owned()),
limit,
@@ -72,7 +72,7 @@ pub fn audit_logs_for_target(
let total_pages = total.div_ceil(u64::from(PAGE_SIZE)).max(1);
let page_number = u64::from(current_page) + 1;
let all_logs_href = format!(
"{base_path}/audit-logs?target_id={}",
"{base_path}/audit-logs?target_id={}&access=write",
urlencoding::encode(target_id)
);
@@ -94,7 +94,7 @@ pub fn audit_logs_for_target(
}
}
@if entries.is_empty() {
(empty_state("No admin actions have been recorded against this entity."))
(empty_state("No admin write actions have been recorded against this entity."))
} @else {
(table_container(html! {
(table(html! {
@@ -54,6 +54,7 @@ pub const NAV_SECTIONS: &[NavSection] = &[
"bulk-actions",
[
acl::BULK_UPDATE_USER_FLAGS,
acl::BULK_UPDATE_SUSPICIOUS_ACTIVITY,
acl::BULK_UPDATE_GUILD_FEATURES,
acl::BULK_ADD_GUILD_MEMBERS,
acl::BULK_DELETE_USERS,
@@ -264,3 +265,27 @@ pub const NAV_SECTIONS: &[NavSection] = &[
)],
},
];
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn bulk_actions_nav_covers_every_acl_the_page_renders_a_section_for() {
let item = NAV_SECTIONS
.iter()
.flat_map(|section| section.items)
.find(|item| item.active_key == "bulk-actions")
.expect("bulk actions nav item");
for required in [
acl::BULK_UPDATE_USER_FLAGS,
acl::BULK_UPDATE_SUSPICIOUS_ACTIVITY,
acl::BULK_UPDATE_GUILD_FEATURES,
acl::BULK_ADD_GUILD_MEMBERS,
acl::BULK_DELETE_USERS,
acl::BULK_DELETE_USER_MESSAGES,
] {
assert!(item.required_acls.contains(&required), "{required}");
}
}
}
@@ -22,6 +22,7 @@ pub struct AuditLogsParams<'a> {
pub admin_user_id: &'a str,
pub target_id: &'a str,
pub target_type: &'a str,
pub access: &'a str,
pub sort_by: &'a str,
pub sort_order: &'a str,
pub limit: u32,
@@ -33,6 +34,7 @@ fn filters_section(base: &str, params: &AuditLogsParams<'_>) -> Markup {
("", "Any"),
("user", "User"),
("guild", "Guild"),
("bulk_job", "Bulk job"),
("email_domain", "Email domain"),
("ip", "IP"),
("phrase", "Phrase"),
@@ -41,6 +43,11 @@ fn filters_section(base: &str, params: &AuditLogsParams<'_>) -> Markup {
("file_sha", "File SHA"),
("email", "Email"),
];
let access_options: &[(&str, &str)] = &[
("", "All entries"),
("write", "Writes only"),
("read", "Reads only"),
];
let sort_options: &[(&str, &str)] = &[("createdAt", "Created at"), ("relevance", "Relevance")];
let order_options: &[(&str, &str)] = &[("desc", "Newest first"), ("asc", "Oldest first")];
let limit_options: &[(&str, &str)] =
@@ -59,6 +66,7 @@ fn filters_section(base: &str, params: &AuditLogsParams<'_>) -> Markup {
"Filter by admin user ID..."))
(select_input("target_type", "Target type",
target_type_options, params.target_type))
(select_input("access", "Access", access_options, params.access))
(select_input("sort_by", "Sort by", sort_options, params.sort_by))
(select_input("sort_order", "Order", order_options, params.sort_order))
(select_input("limit", "Page size", limit_options, &limit_str))
@@ -80,6 +88,7 @@ fn build_pagination_url(base: &str, page: u32, params: &AuditLogsParams<'_>) ->
("admin_user_id", params.admin_user_id),
("target_id", params.target_id),
("target_type", params.target_type),
("access", params.access),
("sort_by", params.sort_by),
("sort_order", params.sort_order),
]
@@ -156,3 +165,48 @@ pub fn audit_logs_page(
};
admin_layout(config, auth, "Audit Logs", "audit-logs", None, content)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn target_type_filter_offers_bulk_jobs() {
let params = AuditLogsParams {
query: "",
admin_user_id: "",
target_id: "",
target_type: "bulk_job",
access: "",
sort_by: "createdAt",
sort_order: "desc",
limit: 50,
current_page: 0,
};
let markup = filters_section("/admin", &params).into_string();
assert!(markup.contains(r#"<option value="bulk_job" selected>Bulk job</option>"#));
assert!(markup.contains(r#"<option value="" selected>All entries</option>"#));
}
#[test]
fn access_filter_survives_form_and_pagination() {
let params = AuditLogsParams {
query: "",
admin_user_id: "",
target_id: "1500000000000000001",
target_type: "",
access: "read",
sort_by: "createdAt",
sort_order: "desc",
limit: 50,
current_page: 0,
};
let markup = filters_section("/admin", &params).into_string();
assert!(markup.contains(r#"<select id="access" name="access""#));
assert!(markup.contains(r#"<option value="read" selected>Reads only</option>"#));
assert_eq!(
build_pagination_url("/admin", 1, &params),
"/admin/audit-logs?page=1&target_id=1500000000000000001&access=read&sort_by=createdAt&sort_order=desc&limit=50"
);
}
}
@@ -126,6 +126,14 @@ pub fn target_cell(base: &str, entry: &AuditLogEntry) -> Markup {
}
}))
},
"bulk_job" => html! {
(job_link(base, &entry.target_id, html! {
div class="flex flex-col" {
span class="text-sm font-medium" { "Bulk job" }
span class="text-xs text-neutral-500 break-all" { "ID: " (&entry.target_id) }
}
}))
},
"message" => html! {
div class="flex flex-col" {
span class="text-sm font-medium" { "Message" }
@@ -147,6 +155,15 @@ pub fn target_cell(base: &str, entry: &AuditLogEntry) -> Markup {
}
}
fn job_link(base: &str, job_id: &str, display: Markup) -> Markup {
html! {
a href={(base) "/jobs/" (job_id)} title={"Job " (job_id)}
class="text-neutral-900 underline decoration-neutral-300 hover:text-neutral-600 hover:decoration-neutral-500 text-sm" {
(display)
}
}
}
fn channel_href(base: &str, channel_id: &str) -> String {
format!(
"{base}/messages?channel_id={}&context_limit=50",
@@ -310,3 +327,36 @@ pub fn audit_log_table_body(base: &str, entries: &[AuditLogEntry]) -> Markup {
}
})
}
#[cfg(test)]
mod tests {
use super::*;
fn entry(target_type: &str, target_id: &str) -> AuditLogEntry {
serde_json::from_value(serde_json::json!({
"log_id": "1900000000000000001",
"admin_user_id": "1500000000000000001",
"action": "bulk_schedule_deletion",
"target_id": target_id,
"target_type": target_type,
"audit_log_reason": "Raid cleanup",
"created_at": "2026-09-14T12:00:00.000Z"
}))
.expect("audit log fixture must deserialize")
}
#[test]
fn bulk_job_targets_link_to_the_job_detail_page() {
let markup = target_cell("/admin", &entry("bulk_job", "1900000000000000002")).into_string();
assert!(markup.contains(r#"href="/admin/jobs/1900000000000000002""#));
assert!(markup.contains("Bulk job"));
assert!(!markup.contains("/admin/users/"));
}
#[test]
fn unknown_target_types_stay_unlinked() {
let markup = target_cell("/admin", &entry("email_domain", "spam.example")).into_string();
assert!(!markup.contains("<a "));
assert!(markup.contains("Email domain"));
}
}
@@ -7,8 +7,8 @@ use crate::{
templates::{
components::{
form::{
checkbox, csrf_input, danger_button, form_actions, form_field_group, select_input,
submit_button, text_input, textarea_input,
FORM_SELECT_CLASS, checkbox, csrf_input, danger_button, form_actions,
form_field_group, select_chevron, submit_button, text_input, textarea_input,
},
page_container::page_header,
section_card::section_card_simple,
@@ -395,16 +395,33 @@ fn bulk_schedule_deletion_section(base: &str, csrf_token: &str) -> Markup {
(csrf_input(csrf_token))
div class="space-y-4" {
(textarea_input("user_ids", "User IDs (one per line)", "123456789\n987654321", "", 5, true))
(select_input("reason_code", "Deletion Reason", DELETION_REASONS, "1"))
(form_field_group("Deletion Reason", "reason_code", true, None,
Some("User requested skips identifier bans and pending report resolution. Every other reason applies them."),
html! {
div class="relative" {
select id="reason_code" name="reason_code" required
class=(FORM_SELECT_CLASS) {
option value="" selected { "Select a reason" }
@for &(value, label) in DELETION_REASONS {
option value=(value) { (label) }
}
}
(select_chevron())
}
},
))
(text_input("public_reason", "Public Reason (optional)", "", "Terms of service violation"))
(form_field_group("Days Until Deletion", "days_until_deletion", true, None, None, html! {
input type="number" id="days_until_deletion" name="days_until_deletion"
value="14" min="14" required
class="w-full rounded-lg border border-neutral-300 bg-white \
text-neutral-900 text-sm h-8 px-3 py-1.5 \
focus:border-brand-primary focus:outline-none \
focus:ring-2 focus:ring-brand-primary/20";
}))
(form_field_group("Days Until Deletion", "days_until_deletion", true, None,
Some("Moderation reasons are held for at least 60 days. Only User requested allows 14."),
html! {
input type="number" id="days_until_deletion" name="days_until_deletion"
value="60" min="14" max="365" required
class="w-full rounded-lg border border-neutral-300 bg-white \
text-neutral-900 text-sm h-8 px-3 py-1.5 \
focus:border-brand-primary focus:outline-none \
focus:ring-2 focus:ring-brand-primary/20";
},
))
(text_input("audit_log_reason", "Audit Log Reason (optional)", "", "Reason for this bulk operation"))
(form_actions(html! {
(danger_button("Schedule Deletion"))
@@ -449,6 +466,21 @@ mod tests {
assert!(!markup.contains(r#"value="CLONE_STICKER_DISABLED""#));
}
#[test]
fn deletion_form_has_no_preselected_reason() {
let markup = bulk_schedule_deletion_section("/admin", "csrf").into_string();
assert!(markup.contains(r#"<option value="" selected>Select a reason</option>"#));
for (value, _) in DELETION_REASONS {
assert!(!markup.contains(&format!(r#"<option value="{value}" selected>"#)));
}
}
#[test]
fn deletion_form_defaults_to_the_moderation_retention_floor() {
let markup = bulk_schedule_deletion_section("/admin", "csrf").into_string();
assert!(markup.contains(r#"name="days_until_deletion" value="60" min="14" max="365""#));
}
#[test]
fn remove_grid_can_clear_the_deprecated_clone_features() {
let markup = guild_feature_checkbox_grid("remove_features[]", true).into_string();
@@ -2,12 +2,14 @@
use crate::{
api::types::{
AppPublicConfigResponse, ExperimentDeliveryConfigResponse, GatewayRolloutConfigResponse,
InstanceConfigResponse, InstanceIntegrationsResponse, InstanceMediaResponse,
InstancePolicyResponse, InstanceRegistrationResponse, LimitConfigResponse,
NoiseSuppressionBackend, PendingRegistrationResponse, RegistrationUrlResponse,
SsoConfigResponse, VOICE_NS_MAX_GUILD_OVERRIDES, VOICE_NS_MAX_TARGETED_USERS,
VoiceNoiseSuppressionConfigResponse,
ALTCHA_CAPTCHA_COST_RANGE, ALTCHA_CAPTCHA_DEFAULT_SALT, ALTCHA_CAPTCHA_MAX_COUNTER_RANGE,
AltchaCaptchaConfigResponse, AppPublicConfigResponse, DOMAIN_MIGRATION_DEFAULT_SALT,
DomainMigrationConfigResponse, EXPERIMENT_MAX_TARGETED_USERS,
ExperimentDeliveryConfigResponse, GatewayRolloutConfigResponse, InstanceConfigResponse,
InstanceIntegrationsResponse, InstanceMediaResponse, InstancePolicyResponse,
InstanceRegistrationResponse, LimitConfigResponse, NoiseSuppressionBackend,
PendingRegistrationResponse, PushRelayConfigResponse, RegistrationUrlResponse,
SsoConfigResponse, VOICE_NS_MAX_GUILD_OVERRIDES, VoiceNoiseSuppressionConfigResponse,
},
config::AdminConfig,
middleware::auth::AuthContext,
@@ -135,6 +137,13 @@ pub fn instance_config_page(
(integrations_config_section(base, csrf_token, &instance_config.integrations))
},
))
(config_group(
"Push notifications",
"Consent for the relay that delivers official mobile app notifications.",
html! {
(push_relay_section(base, csrf_token, &instance_config.push_relay))
},
))
(config_group(
"Media & retention",
"Attachment expiry rules that can be changed without editing environment variables.",
@@ -148,6 +157,8 @@ pub fn instance_config_page(
html! {
(gateway_rollout_section(base, csrf_token, &instance_config.gateway_rollout))
(voice_noise_suppression_section(base, csrf_token, &instance_config.voice_noise_suppression))
(domain_migration_section(base, csrf_token, &instance_config.domain_migration))
(altcha_captcha_section(base, csrf_token, &instance_config.altcha_captcha))
(experiment_delivery_section(base, csrf_token, &instance_config.experiment_delivery))
@if let Some(limit_config) = limit_config {
(limit_config_section(base, limit_config))
@@ -848,6 +859,18 @@ fn app_public_config_section(
app_public.branding.favicon_url.as_deref().unwrap_or(""),
"https://example.com/favicon.ico",
))
(text_input(
"app_status_page_url",
"Status page URL",
app_public.branding.status_page_url.as_deref().unwrap_or(""),
"https://fluxerstatus.com",
))
(text_input(
"app_status_page_incident_history_url",
"Status page history URL",
app_public.branding.status_page_incident_history_url.as_deref().unwrap_or(""),
"https://fluxerstatus.com/history",
))
}
div class="space-y-2" {
(checkbox(
@@ -1093,12 +1116,12 @@ fn voice_noise_suppression_section(
))
(entry_count_hint(
voice_noise_suppression.included_user_ids.len(),
VOICE_NS_MAX_TARGETED_USERS,
EXPERIMENT_MAX_TARGETED_USERS,
))
p class="text-xs text-neutral-500" {
"One snowflake per line, or comma separated. These users are targeted \
regardless of the percentage above. IDs must contain 1 to 20 decimal \
digits. Invalid entries prevent the save; blank entries and duplicate \
digits. Invalid entries prevent the save. Blank entries and duplicate \
IDs are ignored."
}
}
@@ -1113,11 +1136,11 @@ fn voice_noise_suppression_section(
))
(entry_count_hint(
voice_noise_suppression.excluded_user_ids.len(),
VOICE_NS_MAX_TARGETED_USERS,
EXPERIMENT_MAX_TARGETED_USERS,
))
p class="text-xs text-neutral-500" {
"Same format. Exclusion wins over both the always-on list and the \
percentage, so this is the per-user kill switch."
percentage. This is the per-user kill switch."
}
}
@@ -1145,17 +1168,6 @@ fn voice_noise_suppression_section(
}
h3 class="text-sm font-semibold text-neutral-900" { "Processing" }
(checkbox(
"voice_ns_stereo_enabled",
"true",
"Process stereo input instead of downmixing to mono",
voice_noise_suppression.stereo_enabled,
true,
))
p class="text-xs text-neutral-500" {
"Costs more CPU on the client. Leave off unless you are testing stereo \
capture."
}
div class="grid grid-cols-1 gap-4 sm:grid-cols-2" {
(number_field(
"voice_ns_suppression_strength",
@@ -1175,6 +1187,348 @@ fn voice_noise_suppression_section(
)
}
fn push_relay_section(
base: &str,
csrf_token: &str,
push_relay: &PushRelayConfigResponse,
) -> Markup {
let status = if push_relay.relay_consent_accepted {
("Accepted", BadgeVariant::Success)
} else {
("Not accepted", BadgeVariant::Default)
};
let accepted_at =
format_optional_admin_timestamp(push_relay.relay_consent_accepted_at.as_deref(), "Never");
let accepted_by = push_relay
.relay_consent_accepted_by
.as_deref()
.unwrap_or("Nobody");
section_card_with_description(
"Push Relay",
"Official mobile app notifications travel through Fluxer's relay to Apple and Google. \
The relay delivers them only after an operator accepts its privacy notice.",
html! {
form method="post" action={(base) "/instance-config?action=update_push_relay"} {
(csrf_input(csrf_token))
div class="space-y-6" {
div class="flex flex-wrap items-center gap-2" {
h3 class="text-sm font-semibold text-neutral-900" { "Relay consent" }
(badge(status.0, status.1))
}
(checkbox(
"push_relay_consent_accepted",
"true",
"Accept the push relay supplemental privacy notice",
push_relay.relay_consent_accepted,
true,
))
p class="text-xs text-neutral-500" {
"Until this is accepted official mobile app notifications are dropped. \
Self-hosted UnifiedPush and ntfy endpoints never reach the relay and are \
unaffected. "
a href="https://fluxer.com/push-relay" target="_blank" rel="noreferrer"
class="text-neutral-900 underline decoration-neutral-300 hover:text-neutral-600 hover:decoration-neutral-500" {
"Read the notice"
}
}
div class="grid grid-cols-1 gap-4 sm:grid-cols-2" {
(form_field_group("Accepted at", "push_relay_consent_accepted_at", false, None, None,
html! {
input type="text" id="push_relay_consent_accepted_at"
value=(accepted_at)
disabled class=(FORM_INPUT_CLASS);
},
))
(form_field_group("Accepted by user ID", "push_relay_consent_accepted_by", false, None, None,
html! {
input type="text" id="push_relay_consent_accepted_by"
value=(accepted_by)
disabled class=(FORM_INPUT_CLASS);
},
))
}
(form_actions(html! {
(submit_button("Save Push Relay Settings"))
}))
}
}
},
)
}
fn domain_migration_section(
base: &str,
csrf_token: &str,
domain_migration: &DomainMigrationConfigResponse,
) -> Markup {
let status = if domain_migration.enabled {
("Live", BadgeVariant::Success)
} else {
("Inert", BadgeVariant::Default)
};
let included_user_ids = domain_migration.included_user_ids.join("\n");
let excluded_user_ids = domain_migration.excluded_user_ids.join("\n");
section_card_with_description(
"Domain Migration",
"Moves web clients of the official instance from the legacy web app origin to the new \
one. Selected accounts copy their local data across and continue on the new origin. \
Clients of other instances read this configuration and ignore it.",
html! {
form method="post" action={(base) "/instance-config?action=update_domain_migration"} {
(csrf_input(csrf_token))
div class="space-y-6" {
div class="flex flex-wrap items-center gap-2" {
h3 class="text-sm font-semibold text-neutral-900" { "Master switch" }
(badge(status.0, status.1))
span class="text-xs text-neutral-500" {
"Config version " (domain_migration.config_version)
}
}
(checkbox(
"domain_migration_enabled",
"true",
"Move selected web clients to the new origin",
domain_migration.enabled,
true,
))
p class="text-xs text-neutral-500" {
"Off is the safe state and the kill switch. With this unchecked no client \
starts a migration and clients that already migrated stop forwarding the \
legacy origin, so the rollout and targeting fields below have no effect at all."
}
h3 class="text-sm font-semibold text-neutral-900" { "Installed apps" }
(checkbox(
"domain_migration_standalone_forwarding",
"true",
"Forward installed desktop web apps to the new origin",
domain_migration.standalone_forwarding,
true,
))
p class="text-xs text-neutral-500" {
"Leave this off until the manifest scope extension and the association file \
are live and verified. While it is off, installed Chromium desktop apps copy \
their data across but stay on the legacy origin and offer to install the new \
app. Installed mobile and Safari apps never forward either way."
}
h3 class="text-sm font-semibold text-neutral-900" { "Rollout" }
(number_field(
"domain_migration_rollout_basis_points",
"Rollout (basis points)",
&domain_migration.rollout_basis_points.to_string(),
Some(0), Some(10000), "1",
Some("Share of logged-in users bucketed into the migration, in basis points: 0 is nobody, 100 is 1%, 10000 is everybody."),
))
(number_field(
"domain_migration_anonymous_rollout_basis_points",
"Anonymous rollout (basis points)",
&domain_migration.anonymous_rollout_basis_points.to_string(),
Some(0), Some(10000), "1",
Some("Share of logged-out devices sent to the new origin, in basis points. Each device is bucketed on its own random ID."),
))
div class="flex flex-col gap-2" {
(text_input(
"domain_migration_rollout_salt",
"Rollout Salt",
&domain_migration.rollout_salt,
DOMAIN_MIGRATION_DEFAULT_SALT,
))
p class="text-xs text-neutral-500" {
"Seeds the bucketing hash for users and devices. Changing it reshuffles \
which users and devices fall inside the percentages above. Leave it \
alone to keep the current cohort stable."
}
}
div class="flex flex-col gap-2" {
(textarea_input(
"domain_migration_included_user_ids",
"Always-on User IDs",
"1500000000000000001\n1500000000000000002",
&included_user_ids,
4,
false,
))
(entry_count_hint(
domain_migration.included_user_ids.len(),
EXPERIMENT_MAX_TARGETED_USERS,
))
p class="text-xs text-neutral-500" {
"One snowflake per line, or comma separated. These users are targeted \
regardless of the percentage above. IDs must contain 1 to 20 decimal \
digits. Invalid entries prevent the save. Blank entries and duplicate \
IDs are ignored."
}
}
div class="flex flex-col gap-2" {
(textarea_input(
"domain_migration_excluded_user_ids",
"Never-on User IDs",
"1500000000000000003\n1500000000000000004",
&excluded_user_ids,
4,
false,
))
(entry_count_hint(
domain_migration.excluded_user_ids.len(),
EXPERIMENT_MAX_TARGETED_USERS,
))
p class="text-xs text-neutral-500" {
"Same format. Exclusion wins over both the always-on list and the \
percentage. It stops new migrations only. A user who already moved \
stays on the new origin."
}
}
(form_actions(html! {
(submit_button("Save Domain Migration Configuration"))
}))
}
}
},
)
}
fn altcha_captcha_section(
base: &str,
csrf_token: &str,
altcha_captcha: &AltchaCaptchaConfigResponse,
) -> Markup {
let status = if altcha_captcha.enabled {
("Live", BadgeVariant::Success)
} else {
("Inert", BadgeVariant::Default)
};
let included_user_ids = altcha_captcha.included_user_ids.join("\n");
let excluded_user_ids = altcha_captcha.excluded_user_ids.join("\n");
section_card_with_description(
"ALTCHA Captcha",
"Replaces the configured captcha provider with an ALTCHA proof-of-work check for the \
selected requesters. The API issues and verifies every challenge itself, so no third \
party is involved. Requests only need a captcha where one is already required, so this \
does nothing while captcha is off for the instance.",
html! {
form method="post" action={(base) "/instance-config?action=update_altcha_captcha"} {
(csrf_input(csrf_token))
div class="space-y-6" {
div class="flex flex-wrap items-center gap-2" {
h3 class="text-sm font-semibold text-neutral-900" { "Master switch" }
(badge(status.0, status.1))
span class="text-xs text-neutral-500" {
"Config version " (altcha_captcha.config_version)
}
}
(checkbox(
"altcha_captcha_enabled",
"true",
"Serve ALTCHA to the selected requesters",
altcha_captcha.enabled,
true,
))
p class="text-xs text-neutral-500" {
"Off is the safe state and the kill switch. With this unchecked every \
requester gets the configured provider and ALTCHA answers are rejected."
}
h3 class="text-sm font-semibold text-neutral-900" { "Logged-out requests" }
(checkbox(
"altcha_captcha_anonymous_enabled",
"true",
"Serve ALTCHA to logged-out requests",
altcha_captcha.anonymous_enabled,
true,
))
p class="text-xs text-neutral-500" {
"Covers registration, login and password reset. These requests have no \
account to bucket, so this switch applies to all of them at once."
}
h3 class="text-sm font-semibold text-neutral-900" { "Rollout" }
(number_field(
"altcha_captcha_rollout_basis_points",
"Rollout (basis points)",
&altcha_captcha.rollout_basis_points.to_string(),
Some(0), Some(10000), "1",
Some("Share of logged-in users bucketed into ALTCHA, in basis points: 0 is nobody, 100 is 1%, 10000 is everybody."),
))
div class="flex flex-col gap-2" {
(text_input(
"altcha_captcha_rollout_salt",
"Rollout Salt",
&altcha_captcha.rollout_salt,
ALTCHA_CAPTCHA_DEFAULT_SALT,
))
p class="text-xs text-neutral-500" {
"Seeds the bucketing hash. Changing it reshuffles which users fall \
inside the percentage above."
}
}
div class="flex flex-col gap-2" {
(textarea_input(
"altcha_captcha_included_user_ids",
"Always-on User IDs",
"1500000000000000001\n1500000000000000002",
&included_user_ids,
4,
false,
))
(entry_count_hint(
altcha_captcha.included_user_ids.len(),
EXPERIMENT_MAX_TARGETED_USERS,
))
p class="text-xs text-neutral-500" {
"One snowflake per line, or comma separated. These users get ALTCHA \
regardless of the percentage above. Invalid entries prevent the save."
}
}
div class="flex flex-col gap-2" {
(textarea_input(
"altcha_captcha_excluded_user_ids",
"Never-on User IDs",
"1500000000000000003\n1500000000000000004",
&excluded_user_ids,
4,
false,
))
(entry_count_hint(
altcha_captcha.excluded_user_ids.len(),
EXPERIMENT_MAX_TARGETED_USERS,
))
p class="text-xs text-neutral-500" {
"Same format. Exclusion wins over both the always-on list and the percentage."
}
}
h3 class="text-sm font-semibold text-neutral-900" { "Difficulty" }
(number_field(
"altcha_captcha_cost",
"Cost (PBKDF2 iterations per attempt)",
&altcha_captcha.cost.to_string(),
Some(*ALTCHA_CAPTCHA_COST_RANGE.start()),
Some(*ALTCHA_CAPTCHA_COST_RANGE.end()),
"1",
Some("The API spends one attempt at this cost to issue each challenge."),
))
(number_field(
"altcha_captcha_max_counter",
"Maximum counter",
&altcha_captcha.max_counter.to_string(),
Some(*ALTCHA_CAPTCHA_MAX_COUNTER_RANGE.start()),
Some(*ALTCHA_CAPTCHA_MAX_COUNTER_RANGE.end()),
"1",
Some("Each challenge hides its answer between half this value and this value. The client tries counters from 0 until it finds it, so solve time grows with cost times this value. At the defaults a recent laptop takes about 3 seconds."),
))
(form_actions(html! {
(submit_button("Save ALTCHA Configuration"))
}))
}
}
},
)
}
fn experiment_delivery_section(
base: &str,
csrf_token: &str,
@@ -1183,7 +1537,7 @@ fn experiment_delivery_section(
section_card_with_description(
"Experiment Delivery",
"How often every client revalidates its experiment assignments. This is instance-wide \
and covers every experiment, not just the one above. Raising the interval sheds \
and covers every experiment, not just the ones above. Raising the interval sheds \
request volume and makes a change take longer to reach a client. Raising the jitter \
spreads a fleet that has synchronised on one tick back out across the interval.",
html! {
@@ -1818,10 +2172,57 @@ mod tests {
assert!(!markup.contains("at the cap"));
}
#[test]
fn domain_migration_section_shows_both_rollouts_and_list_counts() {
let domain_migration = DomainMigrationConfigResponse {
anonymous_rollout_basis_points: 250,
included_user_ids: vec!["1500000000000000001".to_owned()],
excluded_user_ids: vec![
"1500000000000000002".to_owned(),
"1500000000000000003".to_owned(),
],
..DomainMigrationConfigResponse::default()
};
let markup = domain_migration_section("/admin", "csrf", &domain_migration).into_string();
assert!(markup.contains("action=update_domain_migration"));
assert!(markup.contains("domain_migration_enabled"));
assert!(markup.contains("name=\"domain_migration_anonymous_rollout_basis_points\""));
assert!(markup.contains("value=\"250\""));
assert!(markup.contains("name=\"domain_migration_standalone_forwarding\""));
assert!(markup.contains("1 of 1000 stored"));
assert!(markup.contains("2 of 1000 stored"));
assert!(!markup.contains("at the cap"));
}
#[test]
fn push_relay_section_shows_the_consent_toggle() {
let accepted = PushRelayConfigResponse {
relay_consent_accepted: true,
relay_consent_accepted_at: Some("2026-09-27T10:11:12.000Z".to_owned()),
relay_consent_accepted_by: Some("1130650140672000000".to_owned()),
};
let markup = push_relay_section("/admin", "csrf", &accepted).into_string();
assert!(markup.contains("action=update_push_relay"));
assert!(markup.contains("name=\"push_relay_consent_accepted\""));
assert!(markup.contains("https://fluxer.com/push-relay"));
assert!(markup.contains("value=\"Sep 27, 2026, 10:11 AM UTC\""));
assert!(markup.contains("value=\"1130650140672000000\""));
assert!(!markup.contains("name=\"push_relay_consent_accepted_at\""));
assert!(!markup.contains("name=\"push_relay_consent_accepted_by\""));
assert!(!markup.to_lowercase().contains("rollout"));
let unaccepted =
push_relay_section("/admin", "csrf", &PushRelayConfigResponse::default()).into_string();
assert!(unaccepted.contains("name=\"push_relay_consent_accepted\""));
assert!(unaccepted.contains("Not accepted"));
assert!(unaccepted.contains("value=\"Never\""));
assert!(unaccepted.contains("value=\"Nobody\""));
}
#[test]
fn voice_noise_suppression_section_flags_a_list_at_its_cap() {
let voice_noise_suppression = VoiceNoiseSuppressionConfigResponse {
included_user_ids: (0..VOICE_NS_MAX_TARGETED_USERS)
included_user_ids: (0..EXPERIMENT_MAX_TARGETED_USERS)
.map(|index| index.to_string())
.collect(),
..VoiceNoiseSuppressionConfigResponse::default()
@@ -114,7 +114,10 @@ pub fn users_list_page(
let content = html! {
div class="space-y-6" {
(page_header("Users", None))
div class="rounded-lg bg-white transition-all border border-neutral-200 p-4" {
div class="rounded-lg bg-white transition-all border border-neutral-200 p-3" {
p class="mb-1 text-xs text-neutral-500" {
"For example, type " span class="font-mono" { "*" } " in to search for all users."
}
(search_form(base, params))
}
(results_markup)
+411 -1
View File
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
use fluxer_admin::api::generated::types as generated_types;
use fluxer_admin::api::types;
#[test]
@@ -229,6 +230,7 @@ fn deserialize_audit_logs_response() {
"target_type": "user",
"target_id": "1130958221824557056",
"action": "list_user_sessions",
"access": "read",
"audit_log_reason": null,
"metadata": {"session_count": "3"},
"created_at": "2026-05-26T13:21:47.138Z"
@@ -242,11 +244,418 @@ fn deserialize_audit_logs_response() {
assert_eq!(resp.logs.len(), 1);
assert_eq!(resp.logs[0].log_id, "1508822460457747580");
assert_eq!(resp.logs[0].action, "list_user_sessions");
assert_eq!(resp.logs[0].access.as_deref(), Some("read"));
assert_eq!(resp.logs[0].target_type, "user");
assert!(resp.logs[0].audit_log_reason.is_none());
assert_eq!(resp.logs[0].metadata.get("session_count").unwrap(), "3");
}
#[test]
fn deserialize_guild_audit_logs_with_unknown_keys() {
let json = r#"{
"audit_log_entries": [
{
"id": "1508822460457747581",
"action_type": 22,
"user_id": "1130650140672000000",
"target_id": "1130958221824557056",
"reason": "spam",
"options": {
"delete_message_seconds": 3600,
"future_option": {"nested": true}
},
"changes": [
{"key": "future_change", "future_field": 1}
],
"future_entry_field": "ignored"
},
{
"id": "1508822460457747580",
"action_type": 31,
"user_id": "1130650140672000000",
"target_id": "1130958221824557057",
"options": {
"id": "1130958221824557057",
"type": 0,
"channel_id": "1130958221824557058",
"role_name": "Moderators"
},
"changes": [
{"key": "permissions_diff", "new_value": {"added": ["SEND_MESSAGES"], "removed": []}}
]
},
{
"id": "1508822460457747579",
"action_type": 11,
"user_id": "1130650140672000000",
"target_id": "1130958221824557059",
"options": {"type": 998},
"changes": [
{"key": "name", "old_value": "old-name", "new_value": "new-name"},
{"key": "position", "old_value": 3, "new_value": 4},
{"key": "nsfw", "new_value": true},
{"key": "roles", "new_value": ["1130958221824557060", "1130958221824557061"]}
]
}
],
"users": [],
"webhooks": []
}"#;
let resp: generated_types::ListGuildAuditLogsResponse = serde_json::from_str(json).unwrap();
assert_eq!(resp.audit_log_entries.len(), 3);
let ban = &resp.audit_log_entries[0];
assert_eq!(*ban.action_type, 22);
assert_eq!(ban.reason.as_deref(), Some("spam"));
assert!(ban.options.is_some());
assert_eq!(ban.changes.len(), 1);
assert_eq!(ban.changes[0].key, "future_change");
assert!(ban.changes[0].new_value.is_none());
let role_update = &resp.audit_log_entries[1];
let options = role_update.options.as_ref().unwrap();
assert_eq!(options.role_name.as_deref(), Some("Moderators"));
assert_eq!(options.channel_id.as_deref(), Some("1130958221824557058"));
assert_eq!(options.type_, Some(0.0));
assert_eq!(role_update.changes[0].key, "permissions_diff");
assert!(role_update.changes[0].new_value.is_some());
let channel_update = &resp.audit_log_entries[2];
assert_eq!(channel_update.changes.len(), 4);
assert_eq!(
channel_update.changes[0]
.old_value
.as_ref()
.and_then(|value| value.as_str()),
Some("old-name")
);
assert_eq!(
channel_update.changes[0]
.new_value
.as_ref()
.and_then(|value| value.as_str()),
Some("new-name")
);
assert_eq!(
channel_update.changes[1]
.new_value
.as_ref()
.and_then(|value| value.as_i64()),
Some(4)
);
assert_eq!(
channel_update.changes[2]
.new_value
.as_ref()
.and_then(|value| value.as_bool()),
Some(true)
);
assert_eq!(
channel_update.changes[3]
.new_value
.as_ref()
.and_then(|value| value.as_array())
.map(|value| value.len()),
Some(2)
);
}
#[test]
fn deserialize_instance_config_response_with_unknown_keys() {
let json = r##"{
"sso": {
"enabled": true,
"enforced": false,
"display_name": "Fluxer SSO",
"issuer": "https://id.example.com",
"authorization_url": "https://id.example.com/authorize",
"token_url": "https://id.example.com/token",
"userinfo_url": "https://id.example.com/userinfo",
"jwks_url": "https://id.example.com/jwks.json",
"client_id": "fluxer-admin",
"client_secret_set": true,
"scope": "openid profile email",
"allowed_domains": ["fluxer.com"],
"auto_provision": true,
"redirect_uri": "https://fluxer.com/sso/callback"
},
"gateway_rollout": {
"session_rollout_percentage": 100,
"session_rollout_mode": "modulo",
"guild_rollout_percentage": 100,
"rpc_request_timeout_ms": 10000,
"max_concurrent_session_starts": 512,
"max_concurrent_guild_starts": 256,
"gateway_dispatch_relay_shards": 32,
"gateway_dispatch_relay_max_queue": 50000,
"voice_e2ee_scope": "guild_feature_only",
"future_rollout_knob": 3
},
"voice_noise_suppression": {
"enabled": true,
"config_version": 4,
"default_backend": "rnnoise",
"enabled_backends": ["none", "standard", "rnnoise"],
"allow_user_override": true,
"rollout_basis_points": 10000,
"rollout_salt": "voice-ns-v1",
"included_user_ids": [],
"excluded_user_ids": [],
"guild_overrides": [],
"suppression_strength": 80,
"future_presentation_knob": "verbose",
"future_knob": 7,
"future_object_knob": {"nested": true},
"future_list_knob": ["a", "b"]
},
"push_relay": {
"relay_consent_accepted": true,
"relay_consent_accepted_at": "2026-09-27T10:11:12.000Z",
"relay_consent_accepted_by": "1130650140672000000"
},
"domain_migration": {
"enabled": true,
"config_version": 2,
"rollout_basis_points": 2500,
"rollout_salt": "domain-migration-v1",
"included_user_ids": ["1500000000000000001"],
"excluded_user_ids": [],
"future_migration_knob": 9,
"anonymous_rollout_basis_points": 100,
"standalone_forwarding": true
},
"altcha_captcha": {
"enabled": true,
"config_version": 3,
"rollout_basis_points": 500,
"rollout_salt": "altcha-captcha-v1",
"included_user_ids": [],
"excluded_user_ids": ["1500000000000000003"],
"anonymous_enabled": true,
"cost": 5000,
"max_counter": 10000,
"future_altcha_knob": "argon2id"
},
"experiment_delivery": {"poll_interval_seconds": 300, "poll_jitter_percent": 15},
"registration": {
"mode": "open",
"admin_registration_urls_enabled": false,
"urls": [],
"pending_registrations": []
},
"self_hosted": false,
"app_public": {
"branding": {
"product_name": "Fluxer",
"icon_url": "https://cdn.example.com/icon.png",
"symbol_url": "https://cdn.example.com/symbol.svg",
"logo_url": "https://cdn.example.com/logo.svg",
"wordmark_url": "https://cdn.example.com/wordmark.svg",
"favicon_url": "https://cdn.example.com/favicon.ico",
"theme_color": "#5865f2",
"future_asset_url": "https://cdn.example.com/future.png"
},
"setup": {"configured": true},
"legal": {
"terms_url": "https://fluxer.com/terms",
"privacy_url": "https://fluxer.com/privacy"
},
"registration": {"collect_date_of_birth": true}
},
"policy": {
"single_community_enabled": false,
"single_community_guild_id": null,
"direct_messages_disabled": false,
"direct_messages_locked": false,
"premium_mode": "mirror",
"services": {
"gif_enabled": true,
"youtube_enabled": true,
"bluesky_enabled": false,
"future_service_enabled": true
},
"services_resolved": {
"gif_enabled": true,
"youtube_enabled": true,
"bluesky_enabled": false
},
"services_available": {"gif": true, "youtube": true, "bluesky": false},
"deferred_phone_gate": {
"enabled": false,
"window_hours": 24,
"member_threshold": 100
}
},
"integrations": {
"gif": {"klipy_api_key_set": true, "effective_available": true},
"youtube": {"api_key_set": true, "effective_available": true},
"captcha": {
"provider": "hcaptcha",
"effective_provider": "hcaptcha",
"hcaptcha_site_key": "site",
"hcaptcha_secret_key_set": true,
"turnstile_site_key": "",
"turnstile_secret_key_set": false,
"effective_enabled": true
},
"email": {
"enabled": true,
"effective_enabled": true,
"provider": "smtp",
"effective_provider": "smtp",
"from_email": "[email protected]",
"from_name": "Fluxer",
"smtp": {
"host": "smtp.example.com",
"port": 587,
"username": "fluxer",
"password_set": true,
"secure": true
},
"disable_new_ip_authorization": false,
"effective_disable_new_ip_authorization": false
},
"bluesky": {
"enabled": false,
"effective_enabled": false,
"client_name": "Fluxer",
"client_uri": "https://fluxer.com",
"logo_uri": "https://cdn.example.com/logo.svg",
"tos_uri": "https://fluxer.com/terms",
"policy_uri": "https://fluxer.com/privacy",
"key_count": 0
}
},
"media": {
"attachment_decay": {
"enabled": true,
"min_size_mb": 10,
"max_size_mb": 500,
"max_eligible_size_mb": 500,
"min_lifetime_days": 30,
"max_lifetime_days": 365,
"curve": 2,
"renew_threshold_days": 7,
"renew_window_days": 14,
"effective": {
"enabled": true,
"min_size_mb": 10,
"max_size_mb": 500,
"max_eligible_size_mb": 500,
"min_lifetime_days": 30,
"max_lifetime_days": 365,
"curve": 2,
"renew_threshold_days": 7,
"renew_window_days": 14,
"future_curve": 1.5
}
}
},
"future_section": {"enabled": true, "rollout_basis_points": 10000},
"future_flag": 3
}"##;
let resp: generated_types::InstanceConfigResponse = serde_json::from_str(json).expect(
"the build.rs relaxation must keep unknown response keys from failing the whole response",
);
assert!(!resp.self_hosted);
assert!(resp.voice_noise_suppression.enabled);
assert_eq!(resp.voice_noise_suppression.config_version, 4);
assert_eq!(resp.voice_noise_suppression.rollout_basis_points, 10000);
assert_eq!(*resp.voice_noise_suppression.rollout_salt, "voice-ns-v1");
assert_eq!(resp.voice_noise_suppression.enabled_backends.len(), 3);
assert!(resp.domain_migration.enabled);
assert_eq!(resp.domain_migration.config_version, 2);
assert_eq!(resp.domain_migration.rollout_basis_points, 2500);
assert_eq!(*resp.domain_migration.rollout_salt, "domain-migration-v1");
assert_eq!(resp.domain_migration.included_user_ids.len(), 1);
assert_eq!(resp.domain_migration.anonymous_rollout_basis_points, 100);
assert!(resp.domain_migration.standalone_forwarding);
assert!(resp.push_relay.relay_consent_accepted);
assert!(resp.altcha_captcha.enabled);
assert_eq!(resp.altcha_captcha.config_version, 3);
assert!(resp.altcha_captcha.anonymous_enabled);
assert_eq!(resp.altcha_captcha.excluded_user_ids.len(), 1);
assert_eq!(resp.altcha_captcha.max_counter, 10000);
assert_eq!(resp.experiment_delivery.poll_interval_seconds, 300);
assert!(resp.policy.single_community_guild_id.is_none());
assert_eq!(resp.policy.services.gif_enabled, Some(true));
assert_eq!(resp.app_public.branding.product_name, "Fluxer");
assert!(resp.media.attachment_decay.effective.enabled);
let without_unknown_keys = json
.replace("\"future_rollout_knob\": 3,", "")
.replace("\"future_presentation_knob\": \"verbose\",", "")
.replace("\"future_knob\": 7,", "")
.replace("\"future_migration_knob\": 9,", "")
.replace("\"future_object_knob\": {\"nested\": true},", "")
.replace("\"future_list_knob\": [\"a\", \"b\"],", "")
.replace(
"\"future_asset_url\": \"https://cdn.example.com/future.png\",",
"",
)
.replace("\"future_service_enabled\": true,", "")
.replace("\"future_curve\": 1.5,", "")
.replace(
"\"future_section\": {\"enabled\": true, \"rollout_basis_points\": 10000},",
"",
)
.replace("\"future_flag\": 3,", "");
let baseline: generated_types::InstanceConfigResponse =
serde_json::from_str(&without_unknown_keys).expect("known keys alone still deserialize");
assert_eq!(
serde_json::to_value(&baseline).unwrap(),
serde_json::to_value(&resp).unwrap()
);
}
#[test]
fn deserialize_push_relay_config() {
let accepted: types::PushRelayConfigResponse = serde_json::from_str(
r#"{
"relay_consent_accepted": true,
"relay_consent_accepted_at": "2026-09-27T10:11:12.000Z",
"relay_consent_accepted_by": "1130650140672000000"
}"#,
)
.expect("an accepted relay consent must deserialize");
assert!(accepted.relay_consent_accepted);
assert_eq!(
accepted.relay_consent_accepted_at.as_deref(),
Some("2026-09-27T10:11:12.000Z")
);
assert_eq!(
accepted.relay_consent_accepted_by.as_deref(),
Some("1130650140672000000")
);
let empty: types::PushRelayConfigResponse =
serde_json::from_str("{}").expect("an empty push relay config must deserialize");
assert!(!empty.relay_consent_accepted);
assert!(empty.relay_consent_accepted_at.is_none());
assert!(empty.relay_consent_accepted_by.is_none());
}
#[test]
fn serialize_push_relay_update_omits_an_unset_consent() {
assert_eq!(
serde_json::to_value(types::PushRelayConfigUpdateRequest::default()).unwrap(),
serde_json::json!({})
);
let with = types::PushRelayConfigUpdateRequest {
relay_consent_accepted: Some(true),
};
assert_eq!(
serde_json::to_value(&with).unwrap(),
serde_json::json!({"relay_consent_accepted": true})
);
}
#[test]
fn deserialize_search_reports_response() {
let json = r#"{
@@ -521,7 +930,8 @@ fn deserialize_webauthn_credentials_response() {
"id": "credential-a",
"name": "YubiKey",
"created_at": "2026-05-26T12:00:00.000Z",
"last_used_at": null
"last_used_at": null,
"rp_id": "fluxer.com"
},
{
"id": "credential-b",
+92 -1
View File
@@ -168,6 +168,39 @@ async fn detail_tab_routes_return_layout_or_fragments_by_route_shape() {
}
}
#[tokio::test]
async fn target_audit_log_tabs_request_write_entries_only() {
let app = setup().await;
for path in [
"/users/1500000000000000001/tabs/audit_logs",
"/guilds/1600000000000000001/tabs/audit_logs",
] {
let fragment = get(&app, path, &[]).await;
assert!(fragment.contains("Temp ban"), "{path}\n{fragment}");
assert!(!fragment.contains("Get user"), "{path}\n{fragment}");
}
}
#[tokio::test]
async fn audit_log_page_forwards_the_access_filter() {
let app = setup().await;
let all = get(&app, "/audit-logs", &[]).await;
assert!(all.contains("Temp ban"), "{all}");
assert!(all.contains("Get user"), "{all}");
assert!(
all.contains(r#"<option value="" selected>All entries</option>"#),
"{all}"
);
let reads = get(&app, "/audit-logs?access=read", &[]).await;
assert!(reads.contains("Get user"), "{reads}");
assert!(!reads.contains("Temp ban"), "{reads}");
assert!(
reads.contains(r#"<option value="read" selected>Reads only</option>"#),
"{reads}"
);
}
#[tokio::test]
async fn report_routes_keep_layout_and_fragment_contract() {
let app = setup().await;
@@ -432,6 +465,7 @@ async fn mutating_admin_pages_render_usable_csrf_tokens() {
"/instance-config?action=update_gateway_rollout",
"/instance-config?action=update_sso",
"/instance-config?action=update_voice_noise_suppression",
"/instance-config?action=update_domain_migration",
"/instance-config?action=update_experiment_delivery",
][..],
),
@@ -783,6 +817,9 @@ async fn spawn_mock_api() -> String {
async fn mock_api(method: Method, uri: Uri) -> Response {
let path = uri.path().to_owned();
if method == Method::PATCH && path == "/admin/instance/config" {
return json_response(instance_config());
}
match (method, path.as_str()) {
(Method::GET, "/admin/users/@me") => json_response(json!({ "user": admin_user() })),
(Method::GET, "/admin/api-keys") => json_response(json!([])),
@@ -844,6 +881,25 @@ async fn mock_api(method: Method, uri: Uri) -> Response {
json_response(instance_config_without_pending_registrations())
}
(Method::GET, "/admin/limit-config") => json_response(limit_config()),
(Method::GET, "/admin/audit-logs") => {
let access = uri.query().and_then(|query| {
url::form_urlencoded::parse(query.as_bytes())
.find(|(key, _)| key == "access")
.map(|(_, value)| value.into_owned())
});
let logs = [
audit_log_entry("1900000000000000101", "get_user", "read"),
audit_log_entry("1900000000000000102", "temp_ban", "write"),
]
.into_iter()
.filter(|entry| {
access
.as_deref()
.is_none_or(|access| entry.access.to_string() == access)
})
.collect::<Vec<_>>();
json_response(json!({ "total": logs.len(), "logs": logs }))
}
_ => (StatusCode::NOT_FOUND, Json(json!({ "error": "not found" }))).into_response(),
}
}
@@ -975,6 +1031,32 @@ fn guild_fixtures_match_generated_response_contracts() {
assert_eq!(detail.member_count, 12);
}
fn audit_log_entry(
log_id: &str,
action: &str,
access: &str,
) -> generated_types::AdminAuditLogResponseSchema {
serde_json::from_value(json!({
"log_id": log_id,
"admin_user_id": "1500000000000000000",
"admin_user": null,
"target_type": "user",
"target_id": "1500000000000000001",
"target_user": null,
"target_guild": null,
"target_channel": null,
"related_users": {},
"related_guilds": {},
"related_channels": {},
"action": action,
"access": access,
"audit_log_reason": null,
"metadata": {},
"created_at": "2026-09-16T12:00:00.000Z"
}))
.expect("audit log fixture must match the generated response contract")
}
fn searched_application() -> Value {
json!({
"id": "1700000000000000001",
@@ -1116,9 +1198,18 @@ fn instance_config() -> Value {
"included_user_ids": [],
"excluded_user_ids": [],
"guild_overrides": [],
"stereo_enabled": false,
"suppression_strength": 80
},
"domain_migration": {
"enabled": false,
"config_version": 0,
"rollout_basis_points": 0,
"rollout_salt": "domain-migration-v1",
"included_user_ids": [],
"excluded_user_ids": [],
"anonymous_rollout_basis_points": 0,
"standalone_forwarding": false
},
"experiment_delivery": {
"poll_interval_seconds": 300,
"poll_jitter_percent": 15
+8 -12
View File
@@ -1,11 +1,11 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
ARG BUILD_VERSION
FROM node:24-bookworm-slim AS base
FROM node:26-trixie-slim AS base
WORKDIR /usr/src/app
RUN corepack enable && corepack prepare pnpm@10.29.3 --activate
RUN npm install -g pnpm@11.27.0
FROM base AS deploy
@@ -23,9 +23,9 @@ COPY . .
RUN pnpm install --frozen-lockfile
RUN pnpm --filter fluxer_api run build
RUN pnpm deploy --legacy --filter=fluxer_api --prod --config.allowUnusedPatches=true /out
RUN pnpm deploy --legacy --filter=fluxer_api --prod --config.allow-unused-patches=true /out
FROM node:24-bookworm-slim
FROM node:26-trixie-slim
ARG BUILD_VERSION
ARG SOURCE_SHA
@@ -45,32 +45,28 @@ LABEL app.fluxer.build-version="${BUILD_VERSION}"
WORKDIR /usr/src/app/fluxer_api
RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' > /etc/apt/sources.list.d/backports.list && \
apt-get update && apt-get install -y --no-install-recommends \
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
ffmpeg \
libimage-exiftool-perl \
libwebp7 \
libwebpmux3 \
libheif1 \
libvips42 && \
apt-get install -y --no-install-recommends -t bookworm-backports \
libheif-plugin-libde265 \
libheif-plugin-dav1d && \
libheif-plugin-dav1d \
libvips42t64 && \
rm -rf /var/lib/apt/lists/*
RUN corepack enable && corepack prepare pnpm@10.29.3 --activate
RUN npm install -g pnpm@11.27.0
COPY --from=deploy /out ./
COPY --from=deploy /usr/src/app/fluxer_api/dist ./dist
COPY --from=deploy /usr/src/app/tsconfigs /usr/src/app/tsconfigs
RUN rm -rf pkgs && \
mkdir -p /usr/src/app/.cache/corepack && \
chown -R 65532:65532 /usr/src/app
ENV HOME=/usr/src/app
ENV COREPACK_HOME=/usr/src/app/.cache/corepack
ENV NODE_ENV=production
ENV NODE_OPTIONS="--enable-source-maps"
ENV NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
+9 -7
View File
@@ -5,19 +5,19 @@
"scripts": {
"build": "node scripts/build.mjs",
"test": "vitest run",
"typecheck": "tsgo --noEmit",
"typecheck": "tsc --noEmit",
"dev": "tsx watch --clear-screen=false src/AppEntrypoint.ts",
"start": "tsx src/AppEntrypoint.ts",
"start:worker": "tsx src/WorkerEntrypoint.ts"
},
"dependencies": {
"@atproto/api": "catalog:",
"@atproto/jwk-jose": "catalog:",
"@atproto/oauth-client-node": "catalog:",
"@aws-sdk/client-s3": "catalog:",
"@aws-sdk/lib-storage": "catalog:",
"@aws-sdk/s3-request-presigner": "catalog:",
"@bluesky-social/jwk-jose": "catalog:",
"@bluesky-social/oauth-client-node": "catalog:",
"@bufbuild/protobuf": "^2.12.0",
"@bufbuild/protobuf": "^2.15.0",
"@elastic/elasticsearch": "catalog:",
"@fluxer/config": "workspace:*",
"@fluxer/constants": "workspace:*",
@@ -34,6 +34,8 @@
"@hono/node-server": "catalog:",
"@messageformat/core": "catalog:",
"@messageformat/parser": "catalog:",
"@nats-io/jetstream": "catalog:",
"@nats-io/transport-node": "catalog:",
"@pkgs/cache": "workspace:*",
"@pkgs/captcha": "workspace:*",
"@pkgs/cassandra": "workspace:*",
@@ -54,6 +56,7 @@
"@simplewebauthn/server": "catalog:",
"@types/node": "catalog:",
"@vvo/tzdb": "catalog:",
"altcha-lib": "catalog:",
"archiver": "catalog:",
"argon2": "catalog:",
"bowser": "catalog:",
@@ -71,7 +74,6 @@
"lodash": "catalog:",
"maxmind": "catalog:",
"mime": "catalog:",
"nats": "catalog:",
"nodemailer": "catalog:",
"pg": "catalog:",
"pino": "catalog:",
@@ -88,10 +90,10 @@
"devDependencies": {
"@types/archiver": "catalog:",
"@types/lodash": "catalog:",
"@typescript/native-preview": "catalog:",
"esbuild": "catalog:",
"msw": "catalog:",
"typescript": "catalog:ts7",
"vitest": "catalog:"
},
"packageManager": "pnpm@10.29.3"
"packageManager": "pnpm@11.27.0"
}
+2 -2
View File
@@ -9,14 +9,14 @@
"scripts": {
"test": "vitest run",
"test:watch": "vitest",
"typecheck": "tsgo --noEmit"
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@pkgs/kv_client": "workspace:*"
},
"devDependencies": {
"@types/node": "catalog:",
"@typescript/native-preview": "catalog:",
"typescript": "catalog:ts7",
"vitest": "catalog:"
}
}
+5 -3
View File
@@ -7,14 +7,16 @@
"./*": "./*"
},
"scripts": {
"typecheck": "tsgo --noEmit"
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@fluxer/logger": "workspace:*",
"itty-time": "catalog:"
"altcha-lib": "catalog:",
"itty-time": "catalog:",
"zod": "catalog:"
},
"devDependencies": {
"@types/node": "catalog:",
"@typescript/native-preview": "catalog:"
"typescript": "catalog:ts7"
}
}
@@ -5,7 +5,7 @@ export interface VerifyCaptchaParams {
remoteIp?: string;
}
export type CaptchaProviderType = 'hcaptcha' | 'recaptcha' | 'turnstile' | 'test' | 'unavailable';
export type CaptchaProviderType = 'hcaptcha' | 'recaptcha' | 'turnstile' | 'altcha' | 'test' | 'unavailable';
export interface ICaptchaProvider {
readonly type: CaptchaProviderType;
@@ -0,0 +1,107 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {LoggerInterface} from '@fluxer/logger/src/LoggerInterface';
import type {CaptchaProviderType, ICaptchaProvider, VerifyCaptchaParams} from '@pkgs/captcha/src/ICaptchaProvider';
import {createChallenge, randomInt, verifySolution} from 'altcha-lib';
import {deriveKey} from 'altcha-lib/algorithms/pbkdf2';
import type {Challenge} from 'altcha-lib/types';
import {ms} from 'itty-time';
import {z} from 'zod';
export const ALTCHA_ALGORITHM = 'PBKDF2/SHA-256';
const ALTCHA_CHALLENGE_TTL_MS = ms('10 minutes');
const ALTCHA_MAX_TOKEN_LENGTH = 4096;
const HEX_PATTERN = /^[0-9a-f]+$/u;
const AltchaPayloadSchema = z.object({
challenge: z.object({
parameters: z.looseObject({
algorithm: z.literal(ALTCHA_ALGORITHM),
nonce: z.string().regex(HEX_PATTERN),
salt: z.string().regex(HEX_PATTERN),
cost: z.number().int().positive(),
keyLength: z.number().int().positive(),
keyPrefix: z.string().regex(HEX_PATTERN),
keySignature: z.string().regex(HEX_PATTERN),
expiresAt: z.number().int().positive(),
}),
signature: z.string().regex(HEX_PATTERN),
}),
solution: z.object({
counter: z.number().int().min(0),
derivedKey: z.string().regex(HEX_PATTERN),
time: z.number().optional(),
}),
});
type AltchaPayload = z.infer<typeof AltchaPayloadSchema>;
export interface AltchaProviderOptions {
hmacSignatureSecret: string;
hmacKeySignatureSecret: string;
cost: number;
maxCounter: number;
claimChallenge: (signature: string, ttlSeconds: number) => Promise<boolean>;
logger?: LoggerInterface;
now?: () => number;
}
function decodePayload(token: string): AltchaPayload | null {
if (token.length > ALTCHA_MAX_TOKEN_LENGTH) return null;
try {
const parsed = AltchaPayloadSchema.safeParse(JSON.parse(Buffer.from(token, 'base64').toString('utf8')));
return parsed.success ? parsed.data : null;
} catch {
return null;
}
}
export class AltchaProvider implements ICaptchaProvider {
readonly type: CaptchaProviderType = 'altcha';
private readonly options: AltchaProviderOptions;
private readonly now: () => number;
constructor(options: AltchaProviderOptions) {
this.options = options;
this.now = options.now ?? Date.now;
}
async createChallenge(): Promise<Challenge> {
const {cost, maxCounter, hmacSignatureSecret, hmacKeySignatureSecret} = this.options;
return await createChallenge({
algorithm: ALTCHA_ALGORITHM,
cost,
counter: randomInt(maxCounter, Math.ceil(maxCounter / 2)),
deriveKey,
expiresAt: new Date(this.now() + ALTCHA_CHALLENGE_TTL_MS),
hmacSignatureSecret,
hmacKeySignatureSecret,
});
}
async verify({token}: VerifyCaptchaParams): Promise<boolean> {
const payload = decodePayload(token);
if (!payload) return false;
try {
const result = await verifySolution({
challenge: payload.challenge,
solution: payload.solution,
deriveKey,
hmacSignatureSecret: this.options.hmacSignatureSecret,
hmacKeySignatureSecret: this.options.hmacKeySignatureSecret,
});
if (!result.verified) {
this.options.logger?.warn(
{expired: result.expired, invalidSignature: result.invalidSignature, invalidSolution: result.invalidSolution},
'ALTCHA verification failed',
);
return false;
}
} catch (error) {
this.options.logger?.error({error}, 'Error verifying ALTCHA payload');
return false;
}
const ttlSeconds = Math.max(1, payload.challenge.parameters.expiresAt - Math.floor(this.now() / 1000));
return await this.options.claimChallenge(payload.challenge.signature, ttlSeconds);
}
}
+2 -2
View File
@@ -7,13 +7,13 @@
"./*": "./*"
},
"scripts": {
"typecheck": "tsgo --noEmit"
"typecheck": "tsc --noEmit"
},
"dependencies": {
"cassandra-driver": "catalog:"
},
"devDependencies": {
"@types/node": "catalog:",
"@typescript/native-preview": "catalog:"
"typescript": "catalog:ts7"
}
}
@@ -7,7 +7,7 @@
"./*": "./*"
},
"scripts": {
"typecheck": "tsgo --noEmit"
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@elastic/elasticsearch": "catalog:",
@@ -15,6 +15,6 @@
},
"devDependencies": {
"@types/node": "catalog:",
"@typescript/native-preview": "catalog:"
"typescript": "catalog:ts7"
}
}
@@ -3,11 +3,11 @@
import type {Client} from '@elastic/elasticsearch';
import type {SortCombinations} from '@elastic/elasticsearch/lib/api/types';
import type {AuditLogSearchFilters, SearchableAuditLog} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters, esTermFilter} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {compactFilters, esTermFilter, esTermsFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
function buildAuditLogFilters(filters: AuditLogSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
@@ -15,6 +15,10 @@ function buildAuditLogFilters(filters: AuditLogSearchFilters): Array<Elasticsear
if (filters.targetType) clauses.push(esTermFilter('targetType', filters.targetType));
if (filters.targetId) clauses.push(esTermFilter('targetId', filters.targetId));
if (filters.action) clauses.push(esTermFilter('action', filters.action));
if (filters.actions && filters.actions.length > 0) clauses.push(esTermsFilter('action.keyword', filters.actions));
if (filters.excludeActions && filters.excludeActions.length > 0) {
clauses.push({bool: {must_not: [esTermsFilter('action.keyword', filters.excludeActions)]}});
}
return compactFilters(clauses);
}
@@ -3,11 +3,11 @@
import type {Client} from '@elastic/elasticsearch';
import type {SortCombinations} from '@elastic/elasticsearch/lib/api/types';
import type {GuildSearchFilters, SearchableGuild} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters, esAndTerms, esTermFilter} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {compactFilters, esAndTerms, esTermFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
function buildGuildFilters(filters: GuildSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
@@ -6,11 +6,17 @@ import type {
GuildMemberSearchFilters,
SearchableGuildMember,
} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters, esAndTerms, esRangeFilter, esTermFilter, esTermsFilter} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {
compactFilters,
esAndTerms,
esRangeFilter,
esTermFilter,
esTermsFilter,
} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
function buildGuildMemberFilters(filters: GuildMemberSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
@@ -11,9 +11,9 @@ import type {
SortResults,
} from '@elastic/elasticsearch/lib/api/types';
import type {ISearchAdapter, SearchOptions, SearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters} from '../ElasticsearchFilterUtils';
import type {ElasticsearchIndexDefinition} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {compactFilters} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import type {ElasticsearchIndexDefinition} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
const ELASTICSEARCH_MAX_RESULT_WINDOW = 10000;
const DEEP_PAGINATION_BATCH_SIZE = 1000;
@@ -4,11 +4,17 @@ import type {Client} from '@elastic/elasticsearch';
import type {SortCombinations} from '@elastic/elasticsearch/lib/api/types';
import type {SearchOptions, SearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {MessageSearchFilters, SearchableMessage} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters, esAndTerms, esExcludeAny, esTermFilter, esTermsFilter} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {
compactFilters,
esAndTerms,
esExcludeAny,
esTermFilter,
esTermsFilter,
} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
const HAS_FIELD_MAP: Record<string, string> = {
image: 'hasImage',
@@ -3,11 +3,16 @@
import type {Client} from '@elastic/elasticsearch';
import type {SortCombinations} from '@elastic/elasticsearch/lib/api/types';
import type {ReportSearchFilters, SearchableReport} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters, esExistsFilter, esNotExistsFilter, esTermFilter} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {
compactFilters,
esExistsFilter,
esNotExistsFilter,
esTermFilter,
} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
function buildReportFilters(filters: ReportSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
@@ -3,7 +3,9 @@
import type {Client} from '@elastic/elasticsearch';
import type {SortCombinations} from '@elastic/elasticsearch/lib/api/types';
import type {SearchableUser, UserSearchFilters} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {
compactFilters,
esAndTerms,
@@ -11,10 +13,8 @@ import {
esNotExistsFilter,
esRangeFilter,
esTermFilter,
} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
function buildUserFilters(filters: UserSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
+2 -3
View File
@@ -9,7 +9,7 @@
"scripts": {
"test": "vitest run",
"test:watch": "vitest",
"typecheck": "tsgo --noEmit"
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@fluxer/i18n": "workspace:*",
@@ -19,8 +19,7 @@
},
"devDependencies": {
"@types/node": "catalog:",
"@types/nodemailer": "catalog:",
"@typescript/native-preview": "catalog:",
"typescript": "catalog:ts7",
"vitest": "catalog:"
}
}
+9 -2
View File
@@ -9,6 +9,13 @@ import type {IEmailService} from '@pkgs/email/src/IEmailService';
import {ms} from 'itty-time';
const logger = createLogger('email-service');
const DEFAULT_LOCALE = 'en-US';
function formatMinorUnitAmount(amountMinor: number, currency: string, locale: string | null): string {
const formatter = new Intl.NumberFormat(locale || DEFAULT_LOCALE, {style: 'currency', currency});
const fractionDigits = formatter.resolvedOptions().maximumFractionDigits ?? 2;
return formatter.format(amountMinor / 10 ** fractionDigits);
}
export class EmailService implements IEmailService {
private readonly config: EmailConfig;
@@ -127,7 +134,7 @@ export class EmailService implements IEmailService {
async sendUnbanNotification(
email: string,
username: string,
reason: string,
reason: string | null,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'unban_notification', locale, {username, reason});
@@ -301,7 +308,7 @@ export class EmailService implements IEmailService {
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'donation_confirmation', locale, {
amount: (amountCents / 100).toFixed(2),
amount: formatMinorUnitAmount(amountCents, currency, locale),
currency: currency.toUpperCase(),
interval,
manageUrl,
+6 -1
View File
@@ -43,7 +43,12 @@ export interface IEmailService {
deletionDate: Date,
locale?: string | null,
): Promise<boolean>;
sendUnbanNotification(email: string, username: string, reason: string, locale?: string | null): Promise<boolean>;
sendUnbanNotification(
email: string,
username: string,
reason: string | null,
locale?: string | null,
): Promise<boolean>;
sendScheduledDeletionNotification(
email: string,
username: string,
@@ -2,7 +2,7 @@
import {createLogger} from '@fluxer/logger/src/Logger';
import type {EmailMessage, IEmailProvider} from '@pkgs/email/src/EmailProviderTypes';
import nodemailer from 'nodemailer';
import nodemailer, {type Transporter} from 'nodemailer';
const logger = createLogger('@pkgs/email/src/SmtpEmailProvider');
@@ -18,7 +18,7 @@ interface SmtpEmailConfig {
}
export class SmtpEmailProvider implements IEmailProvider {
private readonly transporter: nodemailer.Transporter;
private readonly transporter: Transporter;
constructor(config: SmtpEmailConfig) {
this.transporter = nodemailer.createTransport({
@@ -126,11 +126,11 @@ export class TestEmailService implements ITestEmailService {
async sendUnbanNotification(
email: string,
username: string,
reason: string,
reason: string | null,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(`Unban notification sent to ${email} for user ${username}, reason: ${reason}`);
return this.record(email, 'unban_notification', {reason});
this.logger.info(`Unban notification sent to ${email} for user ${username}, reason: ${reason ?? 'none'}`);
return this.record(email, 'unban_notification', {reason: reason ?? ''});
}
async sendScheduledDeletionNotification(
@@ -1,39 +1,39 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {EmailTemplate, EmailTemplateKey} from '@pkgs/email/src/email_i18n/EmailI18nTypes.generated';
import EMAIL_I18N_AR_MESSAGES from './locales/ar';
import EMAIL_I18N_BG_MESSAGES from './locales/bg';
import EMAIL_I18N_CS_MESSAGES from './locales/cs';
import EMAIL_I18N_DA_MESSAGES from './locales/da';
import EMAIL_I18N_DE_MESSAGES from './locales/de';
import EMAIL_I18N_EL_MESSAGES from './locales/el';
import EMAIL_I18N_EN_GB_MESSAGES from './locales/en-GB';
import EMAIL_I18N_ES_419_MESSAGES from './locales/es-419';
import EMAIL_I18N_ES_ES_MESSAGES from './locales/es-ES';
import EMAIL_I18N_FI_MESSAGES from './locales/fi';
import EMAIL_I18N_FR_MESSAGES from './locales/fr';
import EMAIL_I18N_HE_MESSAGES from './locales/he';
import EMAIL_I18N_HI_MESSAGES from './locales/hi';
import EMAIL_I18N_HR_MESSAGES from './locales/hr';
import EMAIL_I18N_HU_MESSAGES from './locales/hu';
import EMAIL_I18N_ID_MESSAGES from './locales/id';
import EMAIL_I18N_IT_MESSAGES from './locales/it';
import EMAIL_I18N_JA_MESSAGES from './locales/ja';
import EMAIL_I18N_KO_MESSAGES from './locales/ko';
import EMAIL_I18N_LT_MESSAGES from './locales/lt';
import EMAIL_I18N_NL_MESSAGES from './locales/nl';
import EMAIL_I18N_NO_MESSAGES from './locales/no';
import EMAIL_I18N_PL_MESSAGES from './locales/pl';
import EMAIL_I18N_PT_BR_MESSAGES from './locales/pt-BR';
import EMAIL_I18N_RO_MESSAGES from './locales/ro';
import EMAIL_I18N_RU_MESSAGES from './locales/ru';
import EMAIL_I18N_SV_SE_MESSAGES from './locales/sv-SE';
import EMAIL_I18N_TH_MESSAGES from './locales/th';
import EMAIL_I18N_TR_MESSAGES from './locales/tr';
import EMAIL_I18N_UK_MESSAGES from './locales/uk';
import EMAIL_I18N_VI_MESSAGES from './locales/vi';
import EMAIL_I18N_ZH_CN_MESSAGES from './locales/zh-CN';
import EMAIL_I18N_ZH_TW_MESSAGES from './locales/zh-TW';
import EMAIL_I18N_AR_MESSAGES from '@pkgs/email/src/email_i18n/locales/ar';
import EMAIL_I18N_BG_MESSAGES from '@pkgs/email/src/email_i18n/locales/bg';
import EMAIL_I18N_CS_MESSAGES from '@pkgs/email/src/email_i18n/locales/cs';
import EMAIL_I18N_DA_MESSAGES from '@pkgs/email/src/email_i18n/locales/da';
import EMAIL_I18N_DE_MESSAGES from '@pkgs/email/src/email_i18n/locales/de';
import EMAIL_I18N_EL_MESSAGES from '@pkgs/email/src/email_i18n/locales/el';
import EMAIL_I18N_EN_GB_MESSAGES from '@pkgs/email/src/email_i18n/locales/en-GB';
import EMAIL_I18N_ES_419_MESSAGES from '@pkgs/email/src/email_i18n/locales/es-419';
import EMAIL_I18N_ES_ES_MESSAGES from '@pkgs/email/src/email_i18n/locales/es-ES';
import EMAIL_I18N_FI_MESSAGES from '@pkgs/email/src/email_i18n/locales/fi';
import EMAIL_I18N_FR_MESSAGES from '@pkgs/email/src/email_i18n/locales/fr';
import EMAIL_I18N_HE_MESSAGES from '@pkgs/email/src/email_i18n/locales/he';
import EMAIL_I18N_HI_MESSAGES from '@pkgs/email/src/email_i18n/locales/hi';
import EMAIL_I18N_HR_MESSAGES from '@pkgs/email/src/email_i18n/locales/hr';
import EMAIL_I18N_HU_MESSAGES from '@pkgs/email/src/email_i18n/locales/hu';
import EMAIL_I18N_ID_MESSAGES from '@pkgs/email/src/email_i18n/locales/id';
import EMAIL_I18N_IT_MESSAGES from '@pkgs/email/src/email_i18n/locales/it';
import EMAIL_I18N_JA_MESSAGES from '@pkgs/email/src/email_i18n/locales/ja';
import EMAIL_I18N_KO_MESSAGES from '@pkgs/email/src/email_i18n/locales/ko';
import EMAIL_I18N_LT_MESSAGES from '@pkgs/email/src/email_i18n/locales/lt';
import EMAIL_I18N_NL_MESSAGES from '@pkgs/email/src/email_i18n/locales/nl';
import EMAIL_I18N_NO_MESSAGES from '@pkgs/email/src/email_i18n/locales/no';
import EMAIL_I18N_PL_MESSAGES from '@pkgs/email/src/email_i18n/locales/pl';
import EMAIL_I18N_PT_BR_MESSAGES from '@pkgs/email/src/email_i18n/locales/pt-BR';
import EMAIL_I18N_RO_MESSAGES from '@pkgs/email/src/email_i18n/locales/ro';
import EMAIL_I18N_RU_MESSAGES from '@pkgs/email/src/email_i18n/locales/ru';
import EMAIL_I18N_SV_SE_MESSAGES from '@pkgs/email/src/email_i18n/locales/sv-SE';
import EMAIL_I18N_TH_MESSAGES from '@pkgs/email/src/email_i18n/locales/th';
import EMAIL_I18N_TR_MESSAGES from '@pkgs/email/src/email_i18n/locales/tr';
import EMAIL_I18N_UK_MESSAGES from '@pkgs/email/src/email_i18n/locales/uk';
import EMAIL_I18N_VI_MESSAGES from '@pkgs/email/src/email_i18n/locales/vi';
import EMAIL_I18N_ZH_CN_MESSAGES from '@pkgs/email/src/email_i18n/locales/zh-CN';
import EMAIL_I18N_ZH_TW_MESSAGES from '@pkgs/email/src/email_i18n/locales/zh-TW';
export const EMAIL_I18N_LOCALE_MESSAGES = {
ar: EMAIL_I18N_AR_MESSAGES,
@@ -17,7 +17,7 @@ export const EMAIL_I18N_MESSAGES = {
},
donation_confirmation: {
subject: 'Thank you for your {product_name} donation',
body: 'Hello,\n\nThank you for your donation to {product_name}! Your {interval, select,\n month {recurring donation}\n year {recurring donation}\n other {one-time donation}\n} has been {interval, select,\n month {set up}\n year {set up}\n other {processed}\n} successfully.\n\nDonation details:\nAmount: {amount} {currency} {interval, select,\n month {per month}\n year {per year}\n other {}\n}\n\nStripe will email you a separate receipt with your invoice PDF shortly. This includes all payment details and can be used for tax purposes.\n\nYou can view your donation history, download invoices, {interval, select,\n month {and manage or cancel your subscription}\n year {and manage or cancel your subscription}\n other {and manage future donations}\n} at any time using this link:\n\n{manageUrl}\n\nYour support helps keep {product_name} running. Thank you!\n\n– {product_name} Team',
body: 'Hello,\n\nThank you for your donation to {product_name}! Your {interval, select,\n month {recurring donation}\n year {recurring donation}\n other {one-time donation}\n} has been {interval, select,\n month {set up}\n year {set up}\n other {processed}\n} successfully.\n\nDonation details:\nAmount: {amount} {interval, select,\n month {per month}\n year {per year}\n other {}\n}\n\nStripe will email you a separate receipt with your invoice PDF shortly. This includes all payment details and can be used for tax purposes.\n\nYou can view your donation history, download invoices, {interval, select,\n month {and manage or cancel your subscription}\n year {and manage or cancel your subscription}\n other {and manage future donations}\n} at any time using this link:\n\n{manageUrl}\n\nYour support helps keep {product_name} running. Thank you!\n\n– {product_name} Team',
},
donation_magic_link: {
subject: 'Manage your {product_name} donations',
@@ -65,7 +65,7 @@ export const EMAIL_I18N_MESSAGES = {
},
password_change_verification: {
subject: 'Confirm your {product_name} password change',
body: "Hello {username},\n\nWe received a request to change the password on your {product_name} account.\n\nTo confirm this change, enter this code in the app:\n\n{code}\n\nThis code expires at {expiresAt}.\n\nIf you didn't request this, someone may have access to your account. Change your password immediately and enable two-factor authentication.\n\n– {product_name} Team",
body: "Hello {username},\n\nWe received a request to change the password on your {product_name} account.\n\nTo confirm this change, enter this code in the app:\n\n{code}\n\nThis code expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you didn't request this, someone may have access to your account. Change your password immediately and enable two-factor authentication.\n\n– {product_name} Team",
},
password_reset: {
subject: 'Reset your {product_name} password',
@@ -111,6 +111,6 @@ export interface EmailTemplateVariables {
};
unban_notification: {
username: string;
reason: string;
reason: string | null;
};
}
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_AR_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "ØŠŲ… ØŠØđØ·ŲŠŲ„ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų…ØĪŲ‚ØŠŲ‹Ø§",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nŲ„Ų‚ØŊ Ų‚Ų…Ų†Ø§ ØĻØŠØđØ·ŲŠŲ„ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų…ØĪŲ‚ØŠŲ‹Ø§ Ų„ØĢŲ†Ų†Ø§ Ø§ŲƒØŠØīŲŲ†Ø§ Ų†ØīØ§Ø·Ų‹Ø§ Ų…ØīØĻŲˆŲ‡Ų‹Ø§.\n\n{reason, select,\n null {}\n other {Ø§Ų„ØģØĻØĻ: {reason}}\n}\n\nŲ„Ø§ØģØŠØđاØŊØĐ Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻŲƒØŒ Øģ؊ح؊ا؎ ØĨŲ„Ų‰ ØĨØđاØŊØĐ ØŠØđŲŠŲŠŲ† ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃:\n\n{forgotUrl}\n\nØĻØđØŊ ØĨØđاØŊØĐ ØŠØđŲŠŲŠŲ† ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻŲƒØŒ ØģØŠØŠŲ…ŲƒŲ† Ų…Ų† ØŠØģØŽŲŠŲ„ Ø§Ų„ØŊØŪŲˆŲ„ Ų…ØąØĐ ØĢØŪØąŲ‰.\n\nØĨذا ŲƒŲ†ØŠ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ų‡Ø°Ø§ Ø­ØŊØŦ ØđŲ† Ø·ØąŲŠŲ‚ Ø§Ų„ØŪØ·ØĢ، ŲŠØąØŽŲ‰ Ø§Ų„Ø§ØŠØĩØ§Ų„ ØĻŲØąŲŠŲ‚ Ø§Ų„ØŊØđŲ… Ų„ØŊŲŠŲ†Ø§.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nŲ„Ų‚ØŊ Ų‚Ų…Ų†Ø§ ØĻØŠØđØ·ŲŠŲ„ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų…ØĪŲ‚ØŠŲ‹Ø§ Ų„ØĢŲ†Ų†Ø§ Ø§ŲƒØŠØīŲŲ†Ø§ Ų†ØīØ§Ø·Ų‹Ø§ Ų…ØīØĻŲˆŲ‡Ų‹Ø§.\n\n{reason, select,\n null {}\n other {Ø§Ų„ØģØĻØĻ: {reason}}\n}\n\nŲ„Ø§ØģØŠØđاØŊØĐ Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻŲƒØŒ Øģ؊ح؊ا؎ ØĨŲ„Ų‰ ØĨØđاØŊØĐ ØŠØđŲŠŲŠŲ† ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃:\n\n{forgotUrl}\n\nØĻØđØŊ ØĨØđاØŊØĐ ØŠØđŲŠŲŠŲ† ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻŲƒØŒ ØģØŠØŠŲ…ŲƒŲ† Ų…Ų† ØŠØģØŽŲŠŲ„ Ø§Ų„ØŊØŪŲˆŲ„ Ų…ØąØĐ ØĢØŪØąŲ‰.\n\nØĨذا ŲƒŲ†ØŠ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ų‡Ø°Ø§ Ø­ØŊØŦ ØđŲ† Ø·ØąŲŠŲ‚ Ø§Ų„ØŪØ·ØĢ، ŲŠØąØŽŲ‰ Ø§Ų„Ø§ØŠØĩØ§Ų„ ØĻŲØąŲŠŲ‚ Ø§Ų„ØŊØđŲ… Ų„ØŊŲŠŲ†Ø§.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
},
"account_scheduled_deletion": {
"subject": "ØģŲŠØŠŲ… Ø­Ø°Ų Ø­ØģاØĻ؃ ؁؊ {product_name} Ų†Ų‡Ø§ØĶŲŠŲ‹Ø§",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nØŠŲ… ØŽØŊŲˆŲ„ØĐ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų„Ų„Ø­Ø°Ų Ø§Ų„ØŊاØĶŲ… ØĻØģØĻØĻ Ø§Ų†ØŠŲ‡Ø§ŲƒØ§ØŠ Ų„ØīØąŲˆØ· Ø§Ų„ØŪØŊŲ…ØĐ ØĢ؈ ØĨØąØīاØŊا؊ Ø§Ų„Ų…ØŽØŠŲ…Øđ Ø§Ų„ØŪاØĩØĐ ØĻŲ†Ø§.\n\nØ§Ų„Ø­Ø°Ų Ø§Ų„Ų…ØŽØŊŲˆŲ„: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Ø§Ų„ØģØĻØĻ: {reason}}\n}\n\nŲ‡Ø°Ø§ ØĨØŽØąØ§ØĄ ØŠŲ†ŲŲŠØ°ŲŠ ؎اØŊ. ØģŲŠØŠŲ… Ø­Ø°Ų ØĻŲŠØ§Ų†Ø§ØŠ Ø­ØģاØĻ؃ Ų†Ų‡Ø§ØĶŲŠŲ‹Ø§ ؁؊ Ø§Ų„ØŠØ§ØąŲŠØŪ Ø§Ų„Ų…Ø­ØŊØŊ.\n\nŲŠØąØŽŲ‰ Ų…ØąØ§ØŽØđØĐ:\n- ØīØąŲˆØ· Ø§Ų„ØŪØŊŲ…ØĐ: {termsUrl}\n- ØĨØąØīاØŊا؊ Ø§Ų„Ų…ØŽØŠŲ…Øđ: {guidelinesUrl}\n\nØđŲ…Ų„ŲŠØĐ Ø§Ų„Ø§ØģØŠØĶŲ†Ø§Ų:\nØĨذا ŲƒŲ†ØŠ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ų‚ØąØ§Øą Ø§Ų„ØŠŲ†ŲŲŠØ° Ų‡Ø°Ø§ ŲƒØ§Ų† ØšŲŠØą ØĩØ­ŲŠØ­ ØĢ؈ ØšŲŠØą Ų…ØĻØąØąØŒ Ų„ØŊ؊؃ 60 ŲŠŲˆŲ…Ų‹Ø§ Ų„ØŠŲ‚ØŊŲŠŲ… اØģØŠØĶŲ†Ø§Ų. ØĢØąØģŲ„ ØĻØąŲŠØŊŲ‹Ø§ ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠŲ‹Ø§ ØĨŲ„Ų‰ {appeals_email} Ų…Ų† ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų‡Ø°Ø§.\n\n؁؊ اØģØŠØĶŲ†Ø§ŲŲƒ:\n- اØīØąØ­ ØĻ؈ØķŲˆØ­ Ų„Ų…Ø§Ø°Ø§ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ų‚ØąØ§Øą Ø§Ų„ØŠŲ†ŲŲŠØ° ŲƒØ§Ų† ØšŲŠØą ØĩØ­ŲŠØ­ ØĢ؈ ØšŲŠØą Ų…ØĻØąØą\n- Ų‚ØŊŲ… ØĢ؊ ØŊŲ„ŲŠŲ„ ØĢ؈ ØģŲŠØ§Ų‚ Ø°ŲŠ ØĩŲ„ØĐ\n\nØģŲŠŲ‚ŲˆŲ… ØđØķ؈ Ų…Ų† ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name} ØĻŲ…ØąØ§ØŽØđØĐ اØģØŠØĶŲ†Ø§ŲŲƒ ŲˆŲ‚ØŊ ŲŠŲˆŲ‚Ų Ø§Ų„Ø­Ø°Ų Ø§Ų„Ų…ØđŲ„Ų‚ Ø­ØŠŲ‰ ŲŠØŠŲ… Ø§Ų„ØŠŲˆØĩŲ„ ØĨŲ„Ų‰ Ų‚ØąØ§Øą Ų†Ų‡Ø§ØĶ؊.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nØŠŲ…ØŠ ØŽØŊŲˆŲ„ØĐ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų„Ų„Ø­Ø°Ų Ø§Ų„ØŊاØĶŲ… ØĻØģØĻØĻ Ø§Ų†ØŠŲ‡Ø§ŲƒØ§ØŠ Ų„ØīØąŲˆØ· Ø§Ų„ØŪØŊŲ…ØĐ ØĢ؈ ØĨØąØīاØŊا؊ Ø§Ų„Ų…ØŽØŠŲ…Øđ Ø§Ų„ØŪاØĩØĐ ØĻŲ†Ø§.\n\nØ§Ų„Ø­Ø°Ų Ø§Ų„Ų…ØŽØŊŲˆŲ„: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Ø§Ų„ØģØĻØĻ: {reason}}\n}\n\nŲ‡Ø°Ø§ ØĨØŽØąØ§ØĄ ØĨŲ†ŲØ§Ø° ؎اØŊ. ØģŲŠØŠŲ… Ø­Ø°Ų ØĻŲŠØ§Ų†Ø§ØŠ Ø­ØģاØĻ؃ Ų†Ų‡Ø§ØĶŲŠŲ‹Ø§ ؁؊ Ø§Ų„ØŠØ§ØąŲŠØŪ Ø§Ų„Ų…Ø­ØŊØŊ.\n\nŲŠØąØŽŲ‰ Ų…ØąØ§ØŽØđØĐ:\n- ØīØąŲˆØ· Ø§Ų„ØŪØŊŲ…ØĐ: {termsUrl}\n- ØĨØąØīاØŊا؊ Ø§Ų„Ų…ØŽØŠŲ…Øđ: {guidelinesUrl}\n\nØđŲ…Ų„ŲŠØĐ Ø§Ų„Ø§ØģØŠØĶŲ†Ø§Ų:\nØĨذا ŲƒŲ†ØŠ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ų‚ØąØ§Øą Ø§Ų„ØĨŲ†ŲØ§Ø° Ų‡Ø°Ø§ ŲƒØ§Ų† ØšŲŠØą ØĩØ­ŲŠØ­ ØĢ؈ ØšŲŠØą Ų…ØĻØąØąØŒ Ų„ØŊ؊؃ 60 ŲŠŲˆŲ…Ų‹Ø§ Ų„ØŠŲ‚ØŊŲŠŲ… اØģØŠØĶŲ†Ø§Ų. ØĢØąØģŲ„ ØĻØąŲŠØŊŲ‹Ø§ ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠŲ‹Ø§ ØĨŲ„Ų‰ {appeals_email} Ų…Ų† ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų‡Ø°Ø§.\n\n؁؊ اØģØŠØĶŲ†Ø§ŲŲƒ:\n- اØīØąØ­ ØĻ؈ØķŲˆØ­ ØģØĻØĻ اØđØŠŲ‚Ø§ØŊ؃ ØĢŲ† Ų‚ØąØ§Øą Ø§Ų„ØĨŲ†ŲØ§Ø° ŲƒØ§Ų† ØšŲŠØą ØĩØ­ŲŠØ­ ØĢ؈ ØšŲŠØą Ų…ØĻØąØą\n- Ų‚ØŊŲ… ØĢ؊ ØŊŲ„ŲŠŲ„ ØĢ؈ ØģŲŠØ§Ų‚ Ø°ŲŠ ØĩŲ„ØĐ\n\nØģŲŠŲ‚ŲˆŲ… ØđØķ؈ Ų…Ų† ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name} ØĻŲ…ØąØ§ØŽØđØĐ اØģØŠØĶŲ†Ø§ŲŲƒ ŲˆŲ‚ØŊ ŲŠŲˆŲ‚Ų Ø§Ų„Ø­Ø°Ų Ø§Ų„Ų…ØđŲ„Ų‚ Ų…ØĪŲ‚ØŠŲ‹Ø§ ØĨŲ„Ų‰ Ø­ŲŠŲ† Ø§Ų„ØŠŲˆØĩŲ„ ØĨŲ„Ų‰ Ų‚ØąØ§Øą Ų†Ų‡Ø§ØĶ؊.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
},
"account_temp_banned": {
"subject": "ØŠŲ… ØŠØđŲ„ŲŠŲ‚ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų…ØĪŲ‚ØŠŲ‹Ø§",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nØŠŲ… ØŠØđŲ„ŲŠŲ‚ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų…ØĪŲ‚ØŠŲ‹Ø§ Ų„Ø§Ų†ØŠŲ‡Ø§Ųƒ ØīØąŲˆØ· Ø§Ų„ØŪØŊŲ…ØĐ ØĢ؈ ØĨØąØīاØŊا؊ Ø§Ų„Ų…ØŽØŠŲ…Øđ Ø§Ų„ØŪاØĩØĐ ØĻŲ†Ø§.\n\nØ§Ų„Ų…ØŊØĐ: {durationHours, plural,\n =1 {ØģاØđØĐ ŲˆØ§Ø­ØŊØĐ} zero {0 ØģاØđا؊} two {ØģاØđØŠØ§Ų†}\n few {ØģاØđا؊} many {ØģاØđØĐ} other {# ØģاØđØĐ}\n}\nŲ…ØđŲ„Ų‚ Ø­ØŠŲ‰: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Ø§Ų„ØģØĻØĻ: {reason}}\n}\n\nØŪŲ„Ø§Ų„ Ų‡Ø°Ų‡ Ø§Ų„ŲØŠØąØĐ، Ų„Ų† ØŠØŠŲ…ŲƒŲ† Ų…Ų† Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻ؃.\n\nŲŠØąØŽŲ‰ Ų…ØąØ§ØŽØđØĐ:\n- ØīØąŲˆØ· Ø§Ų„ØŪØŊŲ…ØĐ: {termsUrl}\n- ØĨØąØīاØŊا؊ Ø§Ų„Ų…ØŽØŠŲ…Øđ: {guidelinesUrl}\n\nØĨذا ŲƒŲ†ØŠ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ų‚ØąØ§Øą Ø§Ų„ØŠŲ†ŲŲŠØ° Ų‡Ø°Ø§ ŲƒØ§Ų† ØšŲŠØą ØĩØ­ŲŠØ­ ØĢ؈ ØšŲŠØą Ų…ØĻØąØąØŒ ŲŠŲ…ŲƒŲ†Ųƒ ØŠŲ‚ØŊŲŠŲ… اØģØŠØĶŲ†Ø§Ų. ØĢØąØģŲ„ ØĻØąŲŠØŊŲ‹Ø§ ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠŲ‹Ø§ ØĨŲ„Ų‰ {appeals_email} Ų…Ų† ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų‡Ø°Ø§ ŲˆØ§ØīØąØ­ ØĻ؈ØķŲˆØ­ Ų„Ų…Ø§Ø°Ø§ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ø§Ų„Ų‚ØąØ§Øą ŲƒØ§Ų† ØšŲŠØą ØĩØ­ŲŠØ­. ØģŲ†ØąØ§ØŽØđ اØģØŠØĶŲ†Ø§ŲŲƒ ŲˆŲ†ØąØŊ ØĻŲ‚ØąØ§ØąŲ†Ø§.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nØŠŲ… ØŠØđŲ„ŲŠŲ‚ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų…ØĪŲ‚ØŠŲ‹Ø§ Ų„Ø§Ų†ØŠŲ‡Ø§Ųƒ ØīØąŲˆØ· Ø§Ų„ØŪØŊŲ…ØĐ ØĢ؈ ØĨØąØīاØŊا؊ Ø§Ų„Ų…ØŽØŠŲ…Øđ Ø§Ų„ØŪاØĩØĐ ØĻŲ†Ø§.\n\nØ§Ų„Ų…ØŊØĐ: {durationHours, plural,\n =1 {ØģاØđØĐ ŲˆØ§Ø­ØŊØĐ}\n zero {# ØģاØđØĐ}\n two {ØģاØđØŠØ§Ų†}\n few {# ØģاØđا؊}\n many {# ØģاØđØĐ}\n other {# ØģاØđØĐ}\n}\nŲ…ØđŲ„Ų‚ Ø­ØŠŲ‰: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Ø§Ų„ØģØĻØĻ: {reason}}\n}\n\nØŪŲ„Ø§Ų„ Ų‡Ø°Ų‡ Ø§Ų„ŲØŠØąØĐ، Ų„Ų† ØŠØŠŲ…ŲƒŲ† Ų…Ų† Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻ؃.\n\nŲŠØąØŽŲ‰ Ų…ØąØ§ØŽØđØĐ:\n- ØīØąŲˆØ· Ø§Ų„ØŪØŊŲ…ØĐ: {termsUrl}\n- ØĨØąØīاØŊا؊ Ø§Ų„Ų…ØŽØŠŲ…Øđ: {guidelinesUrl}\n\nØĨذا ŲƒŲ†ØŠ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ų‚ØąØ§Øą Ø§Ų„ØĨŲ†ŲØ§Ø° Ų‡Ø°Ø§ ŲƒØ§Ų† ØšŲŠØą ØĩØ­ŲŠØ­ ØĢ؈ ØšŲŠØą Ų…ØĻØąØąØŒ ŲŠŲ…ŲƒŲ†Ųƒ ØŠŲ‚ØŊŲŠŲ… اØģØŠØĶŲ†Ø§Ų. ØĢØąØģŲ„ ØĻØąŲŠØŊŲ‹Ø§ ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠŲ‹Ø§ ØĨŲ„Ų‰ {appeals_email} Ų…Ų† ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų‡Ø°Ø§ ŲˆØ§ØīØąØ­ ØĻ؈ØķŲˆØ­ ØģØĻØĻ اØđØŠŲ‚Ø§ØŊ؃ ØĢŲ† Ø§Ų„Ų‚ØąØ§Øą ŲƒØ§Ų† ØšŲŠØą ØĩØ­ŲŠØ­. ØģŲ†ØąØ§ØŽØđ اØģØŠØĶŲ†Ø§ŲŲƒ ŲˆŲ†ØąØŊ ØĻŲ‚ØąØ§ØąŲ†Ø§.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
},
"donation_confirmation": {
"subject": "ØīŲƒØąŲ‹Ø§ Ų„Ųƒ ØđŲ„Ų‰ ØŠØĻØąØđ؃ Ų„Ų€ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ØŒ\n\nØīŲƒØąŲ‹Ø§ Ų„Ųƒ ØđŲ„Ų‰ ØŠØĻØąØđ؃ Ų„Ų€ {product_name}! Ų„Ų‚ØŊ ØŠŲ… {interval, select,\n month {ØĨØđØŊاØŊ ØŠØĻØąØđ؃ Ø§Ų„Ų…ØŠŲƒØąØą}\n year {ØĨØđØŊاØŊ ØŠØĻØąØđ؃ Ø§Ų„Ų…ØŠŲƒØąØą}\n other {Ų…ØđØ§Ų„ØŽØĐ ØŠØĻØąØđ؃ Ų„Ų…ØąØĐ ŲˆØ§Ø­ØŊØĐ}\n} ØĻŲ†ØŽØ§Ø­.\n\nØŠŲØ§ØĩŲŠŲ„ Ø§Ų„ØŠØĻØąØđ:\nØ§Ų„Ų…ØĻŲ„Øš: {amount} {currency} {interval, select,\n month {ØīŲ‡ØąŲŠŲ‹Ø§}\n year {ØģŲ†ŲˆŲŠŲ‹Ø§}\n other {}\n}\n\nØģØŠØąØģŲ„ Ų„Ųƒ Stripe ØĨ؊ØĩØ§Ų„Ų‹Ø§ ؅؆؁ØĩŲ„Ø§Ų‹ ØđØĻØą Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų…Øđ ŲØ§ØŠŲˆØąØŠŲƒ ØĻØĩŲŠØšØĐ PDF Ų‚ØąŲŠØĻŲ‹Ø§. ŲŠØŠØķŲ…Ų† Ų‡Ø°Ø§ ØŽŲ…ŲŠØđ ØŠŲØ§ØĩŲŠŲ„ Ø§Ų„ØŊ؁Øđ ŲˆŲŠŲ…ŲƒŲ† اØģØŠØŪØŊØ§Ų…Ų‡ Ų„ØĢØšØąØ§Øķ ØķØąŲŠØĻ؊ØĐ.\n\nŲŠŲ…ŲƒŲ†Ųƒ ØđØąØķ ØģØŽŲ„ ØŠØĻØąØđØ§ØŠŲƒØŒ ŲˆØŠŲ†ØēŲŠŲ„ Ø§Ų„ŲŲˆØ§ØŠŲŠØąØŒ {interval, select,\n month {؈ØĨØŊØ§ØąØĐ ØĢ؈ ØĨŲ„ØšØ§ØĄ اØīØŠØąØ§ŲƒŲƒ}\n year {؈ØĨØŊØ§ØąØĐ ØĢ؈ ØĨŲ„ØšØ§ØĄ اØīØŠØąØ§ŲƒŲƒ}\n other {؈ØĨØŊØ§ØąØĐ Ø§Ų„ØŠØĻØąØđا؊ Ø§Ų„Ų…ØģØŠŲ‚ØĻŲ„ŲŠØĐ}\n} ؁؊ ØĢ؊ ŲˆŲ‚ØŠ ØĻاØģØŠØŪØŊØ§Ų… Ų‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ·:\n\n{manageUrl}\n\nØŊØđŲ…Ųƒ ؊ØģاØđØŊ ؁؊ اØģØŠŲ…ØąØ§Øą {product_name}. ØīŲƒØąŲ‹Ø§ Ų„Ųƒ!\n\n– ŲØąŲŠŲ‚ {product_name}{interval, select,\n month {}\n year {}\n other {}\n}"
"subject": "ØīŲƒØąŲ‹Ø§ Ų„Ųƒ ØđŲ„Ų‰ ØŠØĻØąØđ؃ Ų„Ų€{product_name}",
"body": "Ų…ØąØ­ØĻŲ‹Ø§ØŒ\n\nØīŲƒØąŲ‹Ø§ Ų„Ųƒ ØđŲ„Ų‰ ØŠØĻØąØđ؃ Ų„Ų€{product_name}! Ų„Ų‚ØŊ ØŠŲ… {interval, select,\n month {ØĨØđØŊاØŊ ØŠØĻØąØđ؃ Ø§Ų„Ų…ØŠŲƒØąØą}\n year {ØĨØđØŊاØŊ ØŠØĻØąØđ؃ Ø§Ų„Ų…ØŠŲƒØąØą}\n other {Ų…ØđØ§Ų„ØŽØĐ ØŠØĻØąØđ؃ Ų„Ų…ØąØĐ ŲˆØ§Ø­ØŊØĐ}\n} ØĻŲ†ØŽØ§Ø­.\n\nØŠŲØ§ØĩŲŠŲ„ Ø§Ų„ØŠØĻØąØđ:\nØ§Ų„Ų…ØĻŲ„Øš: {amount} {interval, select,\n month {ØīŲ‡ØąŲŠŲ‹Ø§}\n year {ØģŲ†ŲˆŲŠŲ‹Ø§}\n other {}\n}\n\nØģØŠØąØģŲ„ Ų„Ųƒ Stripe ØĨ؊ØĩØ§Ų„Ų‹Ø§ ؅؆؁ØĩŲ„Ų‹Ø§ ØđØĻØą Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų…Øđ ŲØ§ØŠŲˆØąØŠŲƒ ØĻØĩŲŠØšØĐ PDF Ų‚ØąŲŠØĻŲ‹Ø§. ŲŠØŠØķŲ…Ų† Ų‡Ø°Ø§ ØŽŲ…ŲŠØđ ØŠŲØ§ØĩŲŠŲ„ Ø§Ų„ØŊ؁Øđ ŲˆŲŠŲ…ŲƒŲ† اØģØŠØŪØŊØ§Ų…Ų‡ Ų„ØĢØšØąØ§Øķ ØķØąŲŠØĻ؊ØĐ.\n\nŲŠŲ…ŲƒŲ†Ųƒ ØđØąØķ ØģØŽŲ„ ØŠØĻØąØđØ§ØŠŲƒØŒ ŲˆØŠŲ†ØēŲŠŲ„ Ø§Ų„ŲŲˆØ§ØŠŲŠØąØŒ {interval, select,\n month {؈ØĨØŊØ§ØąØĐ ØĢ؈ ØĨŲ„ØšØ§ØĄ اØīØŠØąØ§ŲƒŲƒ}\n year {؈ØĨØŊØ§ØąØĐ ØĢ؈ ØĨŲ„ØšØ§ØĄ اØīØŠØąØ§ŲƒŲƒ}\n other {؈ØĨØŊØ§ØąØĐ Ø§Ų„ØŠØĻØąØđا؊ Ø§Ų„Ų…ØģØŠŲ‚ØĻŲ„ŲŠØĐ}\n} ؁؊ ØĢ؊ ŲˆŲ‚ØŠ ØĻاØģØŠØŪØŊØ§Ų… Ų‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ·:\n\n{manageUrl}\n\nØŊØđŲ…Ųƒ ؊ØģاØđØŊ ØđŲ„Ų‰ اØģØŠŲ…ØąØ§Øą {product_name}. ØīŲƒØąŲ‹Ø§ Ų„Ųƒ!\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"donation_magic_link": {
"subject": "ØĨØŊØ§ØąØĐ ØŠØĻØąØđا؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ØŒ\n\nØ§Ų†Ų‚Øą ØđŲ„Ų‰ Ø§Ų„ØąØ§ØĻØ· ØĢØŊŲ†Ø§Ų‡ Ų„Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ ØĻŲˆØ§ØĻØĐ Ø§Ų„Ų…ØŠØĻØąØđŲŠŲ† Ø§Ų„ØŪاØĩØĐ ØĻ؃:\n\n{manageUrl}\n\n؁؊ Ø§Ų„ØĻŲˆØ§ØĻØĐ، ŲŠŲ…ŲƒŲ†Ųƒ ØĨØŊØ§ØąØĐ Ø§Ų„Ø§ØīØŠØąØ§ŲƒØ§ØŠØŒ ŲˆØŠŲ†ØēŲŠŲ„ Ø§Ų„ŲŲˆØ§ØŠŲŠØąØŒ ؈ØđØąØķ ØģØŽŲ„ ØŠØĻØąØđØ§ØŠŲƒ.\n\nŲŠŲ†ØŠŲ‡ŲŠ ØĩŲ„Ø§Ø­ŲŠØĐ Ų‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ· ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ Ø§Ų„ØąØ§ØĻط، ŲŠŲ…ŲƒŲ†Ųƒ ØŠØŽØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ ØĻØĢŲ…Ø§Ų†.\n\n– ŲØąŲŠŲ‚ {product_name}"
"subject": "ØĨØŊØ§ØąØĐ ØŠØĻØąØđØ§ØŠŲƒ Ų„Ų€{product_name}",
"body": "Ų…ØąØ­ØĻŲ‹Ø§ØŒ\n\nØ§Ų†Ų‚Øą ØđŲ„Ų‰ Ø§Ų„ØąØ§ØĻØ· ØĢØŊŲ†Ø§Ų‡ Ų„Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ ØĻŲˆØ§ØĻØĐ Ø§Ų„Ų…ØŠØĻØąØđŲŠŲ† Ø§Ų„ØŪاØĩØĐ ØĻ؃:\n\n{manageUrl}\n\n؁؊ Ø§Ų„ØĻŲˆØ§ØĻØĐ، ŲŠŲ…ŲƒŲ†Ųƒ ØĨØŊØ§ØąØĐ Ø§Ų„Ø§ØīØŠØąØ§ŲƒØ§ØŠØŒ ŲˆØŠŲ†ØēŲŠŲ„ Ø§Ų„ŲŲˆØ§ØŠŲŠØąØŒ ؈ØđØąØķ ØģØŽŲ„ ØŠØĻØąØđØ§ØŠŲƒ.\n\nØŠŲ†ØŠŲ‡ŲŠ ØĩŲ„Ø§Ø­ŲŠØĐ Ų‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ· ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ Ø§Ų„ØąØ§ØĻط، ŲŠŲ…ŲƒŲ†Ųƒ ØŠØŽØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ ØĻØĢŲ…Ø§Ų†.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"dsa_report_verification": {
"subject": "ØŠØ­Ų‚Ų‚ Ų…Ų† ØĻØąŲŠØŊ؃ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų„ØŠŲ‚ØŊŲŠŲ… ØŠŲ‚ØąŲŠØą DSA",
"body": "Ų…ØąØ­ØĻØ§Ų‹ØŒ\n\nاØģØŠØŪØŊŲ… ØąŲ…Øē Ø§Ų„ØŠØ­Ų‚Ų‚ ØĢØŊŲ†Ø§Ų‡ Ų„ØŠŲ‚ØŊŲŠŲ… ØŠŲ‚ØąŲŠØą Ų‚Ø§Ų†ŲˆŲ† Ø§Ų„ØŪØŊŲ…Ø§ØŠ Ø§Ų„ØąŲ‚Ų…ŲŠØĐ Ø§Ų„ØŪاØĩ ØĻ؃ ØđŲ„Ų‰ {product_name}:\n\n{code}\n\nŲŠŲ†ØŠŲ‡ŲŠ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ŲŠŲ…ŲƒŲ†Ųƒ ØŠØŽØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
"subject": "ØŠØ­Ų‚Ų‚ Ų…Ų† ØĻØąŲŠØŊ؃ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų„ØŠŲ‚ØŊŲŠŲ… ØĻŲ„Ø§Øš DSA",
"body": "Ų…ØąØ­ØĻŲ‹Ø§ØŒ\n\nاØģØŠØŪØŊŲ… ØąŲ…Øē Ø§Ų„ØŠØ­Ų‚Ų‚ ØĢØŊŲ†Ø§Ų‡ Ų„ØŠŲ‚ØŊŲŠŲ… ØĻŲ„Ø§ØšŲƒ ØĻŲ…ŲˆØŽØĻ Ų‚Ø§Ų†ŲˆŲ† Ø§Ų„ØŪØŊŲ…Ø§ØŠ Ø§Ų„ØąŲ‚Ų…ŲŠØĐ ØđŲ„Ų‰ {product_name}:\n\n{code}\n\nØŠŲ†ØŠŲ‡ŲŠ ØĩŲ„Ø§Ø­ŲŠØĐ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ŲŠŲ…ŲƒŲ†Ųƒ ØŠØŽØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
},
"email_change_new": {
"subject": "ØŠØ­Ų‚Ų‚ Ų…Ų† ØĻØąŲŠØŊ؃ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ø§Ų„ØŽØŊ؊ØŊ ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nØĢØŊØŪŲ„ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ Ø§Ų„ØŠØ·ØĻŲŠŲ‚ Ų„Ų„ØŠØ­Ų‚Ų‚ Ų…Ų† ØĻØąŲŠØŊ؃ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ø§Ų„ØŽØŊ؊ØŊ ؁؊ {product_name}:\n\n{code}\n\nŲŠŲ†ØŠŲ‡ŲŠ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ŲŠŲ…ŲƒŲ†Ųƒ ØŠØŽØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ.\n\n– ŲØąŲŠŲ‚ {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nØĢØŊØŪŲ„ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ Ø§Ų„ØŠØ·ØĻŲŠŲ‚ Ų„Ų„ØŠØ­Ų‚Ų‚ Ų…Ų† ØĻØąŲŠØŊ؃ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ø§Ų„ØŽØŊ؊ØŊ ؁؊ {product_name}:\n\n{code}\n\nØŠŲ†ØŠŲ‡ŲŠ ØĩŲ„Ø§Ø­ŲŠØĐ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ŲŠŲ…ŲƒŲ†Ųƒ ØŠØŽØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"email_change_original": {
"subject": "ØŠØĢ؃؊ØŊ ØŠØšŲŠŲŠØą ØĻØąŲŠØŊ؃ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nŲ„Ų‚ØŊ ØŠŲ„Ų‚ŲŠŲ†Ø§ Ø·Ų„ØĻŲ‹Ø§ Ų„ØŠØšŲŠŲŠØą ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų„Ø­ØģاØĻ؃ ؁؊ {product_name}.\n\nŲ„ØŠØĢ؃؊ØŊ Ų‡Ø°Ø§ Ø§Ų„ØŠØšŲŠŲŠØąØŒ ØĢØŊØŪŲ„ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ Ø§Ų„ØŠØ·ØĻŲŠŲ‚:\n\n{code}\n\nŲŠŲ†ØŠŲ‡ŲŠ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ŲŠØąØŽŲ‰ ØŠØĢŲ…ŲŠŲ† Ø­ØģاØĻ؃ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą.\n\n– ŲØąŲŠŲ‚ {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nŲ„Ų‚ØŊ ØŠŲ„Ų‚ŲŠŲ†Ø§ Ø·Ų„ØĻŲ‹Ø§ Ų„ØŠØšŲŠŲŠØą ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų„Ø­ØģاØĻ؃ ؁؊ {product_name}.\n\nŲ„ØŠØĢ؃؊ØŊ Ų‡Ø°Ø§ Ø§Ų„ØŠØšŲŠŲŠØąØŒ ØĢØŊØŪŲ„ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ Ø§Ų„ØŠØ·ØĻŲŠŲ‚:\n\n{code}\n\nØŠŲ†ØŠŲ‡ŲŠ ØĩŲ„Ø§Ø­ŲŠØĐ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ŲŠØąØŽŲ‰ ØŠØĢŲ…ŲŠŲ† Ø­ØģاØĻ؃ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"email_change_revert": {
"subject": "ØŠŲ… ØŠØšŲŠŲŠØą ØĻØąŲŠØŊ؃ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nØŠŲ… ØŠØšŲŠŲŠØą ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų„Ø­ØģاØĻ؃ ؁؊ {product_name} ØĨŲ„Ų‰ {newEmail}.\n\nØĨذا Ų‚Ų…ØŠ ØĻŲ‡Ø°Ø§ Ø§Ų„ØŠØšŲŠŲŠØąØŒ ŲŲ„Ø§ ØŊاØđ؊ Ų„Ø§ØŠØŪاذ ØĢ؊ ØĨØŽØąØ§ØĄ. ØĨذا Ų„Ų… ØŠŲ‚Ų… ØĻØ°Ų„ŲƒØŒ ŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØŠØąØ§ØŽØđ ØđŲ† Ø§Ų„ØŠØšŲŠŲŠØą ŲˆØŠØĢŲ…ŲŠŲ† Ø­ØģاØĻ؃ ØĻاØģØŠØŪØŊØ§Ų… Ų‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ·:\n\n{revertUrl}\n\nØģ؊ØĪØŊ؊ Ų‡Ø°Ø§ ØĨŲ„Ų‰ اØģØŠØđاØŊØĐ ØĻØąŲŠØŊ؃ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ø§Ų„ØģاØĻŲ‚ØŒ ŲˆØŠØģØŽŲŠŲ„ ØŪØąŲˆØŽŲƒ Ų…Ų† ØŽŲ…ŲŠØđ Ø§Ų„ØĢØŽŲ‡ØēØĐ، ؈ØĨØēØ§Ų„ØĐ ØĢØąŲ‚Ø§Ų… Ø§Ų„Ų‡ŲˆØ§ØŠŲ Ø§Ų„Ų…ØąØŠØĻØ·ØĐ، ŲˆØŠØđØ·ŲŠŲ„ Ø§Ų„Ų…ØĩاØŊŲ‚ØĐ Ų…ØŠØđØŊØŊØĐ Ø§Ų„ØđŲˆØ§Ų…Ų„ØŒ ؈ØģŲŠØ·Ų„ØĻ Ų…Ų†Ųƒ ØŠØđŲŠŲŠŲ† ŲƒŲ„Ų…ØĐ Ų…ØąŲˆØą ØŽØŊ؊ØŊØĐ.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nØŠŲ… ØŠØšŲŠŲŠØą ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų„Ø­ØģاØĻ؃ ؁؊ {product_name} ØĨŲ„Ų‰ {newEmail}.\n\nØĨذا Ų‚Ų…ØŠ ØĻŲ‡Ø°Ø§ Ø§Ų„ØŠØšŲŠŲŠØąØŒ ŲŲ„Ø§ ØŊاØđ؊ Ų„Ø§ØŠØŪاذ ØĢ؊ ØĨØŽØąØ§ØĄ. ØĨذا Ų„Ų… ØŠŲ‚Ų… ØĻØ°Ų„ŲƒØŒ ŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØŠØąØ§ØŽØđ ØđŲ† Ø§Ų„ØŠØšŲŠŲŠØą ŲˆØŠØĢŲ…ŲŠŲ† Ø­ØģاØĻ؃ ØĻاØģØŠØŪØŊØ§Ų… Ų‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ·:\n\n{revertUrl}\n\nØģ؊ØĪØŊ؊ Ų‡Ø°Ø§ ØĨŲ„Ų‰ اØģØŠØđاØŊØĐ ØĻØąŲŠØŊ؃ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ø§Ų„ØģاØĻŲ‚ØŒ ŲˆØŠØģØŽŲŠŲ„ ØŪØąŲˆØŽŲƒ Ų…Ų† ØŽŲ…ŲŠØđ Ø§Ų„ØĢØŽŲ‡ØēØĐ، ؈ØĨØēØ§Ų„ØĐ ØĢØąŲ‚Ø§Ų… Ø§Ų„Ų‡ŲˆØ§ØŠŲ Ø§Ų„Ų…ØąØŠØĻØ·ØĐ، ŲˆØŠØđØ·ŲŠŲ„ Ø§Ų„Ų…ØĩاØŊŲ‚ØĐ Ų…ØŠØđØŊØŊØĐ Ø§Ų„ØđŲˆØ§Ų…Ų„ØŒ ؈ØģŲŠŲØ·Ų„ØĻ Ų…Ų†Ųƒ ØŠØđŲŠŲŠŲ† ŲƒŲ„Ų…ØĐ Ų…ØąŲˆØą ØŽØŊ؊ØŊØĐ.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
},
"email_verification": {
"subject": "ØŠØ­Ų‚Ų‚ Ų…Ų† ØĻØąŲŠØŊ؃ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nŲŠØąØŽŲ‰ Ø§Ų„ØŠØ­Ų‚Ų‚ Ų…Ų† ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų„Ø­ØģاØĻ؃ ؁؊ {product_name} ØĻØ§Ų„Ų†Ų‚Øą ØđŲ„Ų‰ Ø§Ų„ØąØ§ØĻØ· ØĢØŊŲ†Ø§Ų‡:\n\n{verifyUrl}\n\nØĨذا Ų„Ų… ØŠŲ‚Ų… ØĻØĨŲ†ØīØ§ØĄ Ø­ØģاØĻ {product_name}، ŲŠŲ…ŲƒŲ†Ųƒ ØŠØŽØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ ØĻØĢŲ…Ø§Ų†.\n\nŲ‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ· ØĩØ§Ų„Ø­ Ų„Ų…ØŊØĐ 24 ØģاØđØĐ.\n\n– ŲØąŲŠŲ‚ {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nŲŠØąØŽŲ‰ Ø§Ų„ØŠØ­Ų‚Ų‚ Ų…Ų† ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų„Ø­ØģاØĻ؃ ؁؊ {product_name} ØĻØ§Ų„Ų†Ų‚Øą ØđŲ„Ų‰ Ø§Ų„ØąØ§ØĻØ· ØĢØŊŲ†Ø§Ų‡:\n\n{verifyUrl}\n\nØĨذا Ų„Ų… ØŠŲ‚Ų… ØĻØĨŲ†ØīØ§ØĄ Ø­ØģاØĻ {product_name}، ŲŠŲ…ŲƒŲ†Ųƒ ØŠØŽØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ ØĻØĢŲ…Ø§Ų†.\n\nŲ‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ· ØĩØ§Ų„Ø­ Ų„Ų…ØŊØĐ 24 ØģاØđØĐ.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"gift_chargeback_notification": {
"subject": "ØŠŲ…ØŠ ØĨØēØ§Ų„ØĐ Ø§Ų„Ų…ØēØ§ŲŠØ§ Ų…Ų† Ų‡ØŊŲŠØŠŲƒ",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nØąŲ…Øē Ø§Ų„Ų‡ØŊ؊ØĐ Ø§Ų„Ø°ŲŠ اØģØŠØąØŊØŊØŠŲ‡ ØŠŲ… ØŊ؁ØđŲ‡ ؁؊ Ø§Ų„ØĢØĩŲ„ Ų…Ų† Ų‚ØĻŲ„ ØīØŪØĩ ØĒØŪØą. ŲˆŲ‚ØŊ ØŠŲ… Øđ؃Øģ Ų‡Ø°Ø§ Ø§Ų„ØŊ؁Øđ Ų…Ų†Ø° Ø°Ų„Ųƒ Ø§Ų„Ø­ŲŠŲ† (اØģØŠØąØŊاØŊ Ø§Ų„Ų…ØĻŲ„Øš).\n\nØĻØģØĻØĻ Ų‡Ø°Ø§ØŒ Ų‚Ų…Ų†Ø§ ØĻØĨØēØ§Ų„ØĐ Ø§Ų„Ų…ØēØ§ŲŠØ§ Ø§Ų„ØŠŲŠ ØĢØķŲŠŲØŠ ØĨŲ„Ų‰ Ø­ØģاØĻ؃ ØđŲ†ØŊŲ…Ø§ اØģØŠØąØŊØŊØŠ Ø§Ų„Ų‡ØŊ؊ØĐ.\n\nØĨذا ŲƒŲ†ØŠ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ų‡Ø°Ø§ ØŪØ·ØĢ، ŲŠØąØŽŲ‰ Ø§Ų„Ø§ØŠØĩØ§Ų„ ØĻŲØąŲŠŲ‚ Ø§Ų„ØŊØđŲ… Ų„ØŊŲŠŲ†Ø§ ŲˆØŠØķŲ…ŲŠŲ† ØĢ؊ ØŠŲØ§ØĩŲŠŲ„ Ų„ØŊ؊؃ Ø­ŲˆŲ„ ØąŲ…Øē Ø§Ų„Ų‡ØŊ؊ØĐ ŲˆŲ…ØŠŲ‰ اØģØŠØąØŊØŊØŠŲ‡.\n\n– ŲØąŲŠŲ‚ {product_name}"
"subject": "ØŠŲ…ØŠ ØĨØēØ§Ų„ØĐ Ų…ØēØ§ŲŠØ§ Ø§Ų„Ų‡ØŊ؊ØĐ Ø§Ų„ØŠŲŠ اØģØŠØąØŊØŊØŠŲ‡Ø§",
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nØŊ؁Øđ ØīØŪØĩ ØĒØŪØą ؁؊ Ø§Ų„ØĢØĩŲ„ ØŦŲ…Ų† ØąŲ…Øē Ø§Ų„Ų‡ØŊ؊ØĐ Ø§Ų„Ø°ŲŠ اØģØŠØąØŊØŊØŠŲ‡ØŒ ŲˆŲ‚ØŊ ØŠŲ… Ø§Ų„ØŠØąØ§ØŽØđ ØđŲ† ØŠŲ„Ųƒ Ø§Ų„ØŊ؁ØđØĐ Ų„Ø§Ø­Ų‚Ų‹Ø§ (ØąØŊ Ų…ØĻŲ„Øš Ų…ØŊ؁؈Øđ).\n\nŲˆŲ„Ų‡Ø°Ø§ Ø§Ų„ØģØĻØĻ ØĢØēŲ„Ų†Ø§ Ø§Ų„Ų…ØēØ§ŲŠØ§ Ø§Ų„ØŠŲŠ ØĢŲØķŲŠŲØŠ ØĨŲ„Ų‰ Ø­ØģاØĻ؃ ØđŲ†ØŊ اØģØŠØąØŊاØŊ Ø§Ų„Ų‡ØŊ؊ØĐ.\n\nØĨذا ŲƒŲ†ØŠ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ų‡Ø°Ø§ ØŪØ·ØĢ، ŲŠØąØŽŲ‰ Ø§Ų„Ø§ØŠØĩØ§Ų„ ØĻŲØąŲŠŲ‚ Ø§Ų„ØŊØđŲ… Ų„ØŊŲŠŲ†Ø§ Ų…Øđ Ø°ŲƒØą ØĢ؊ ØŠŲØ§ØĩŲŠŲ„ Ų„ØŊ؊؃ ØđŲ† ØąŲ…Øē Ø§Ų„Ų‡ØŊ؊ØĐ ŲˆŲˆŲ‚ØŠ اØģØŠØąØŊاØŊ؃ Ų„Ų‡.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"harvest_completed": {
"subject": "ØŠØĩØŊŲŠØą ØĻŲŠØ§Ų†Ø§ØŠŲƒ Ų…Ų† {product_name} ØŽØ§Ų‡Øē Ų„Ų„ØŠŲ†ØēŲŠŲ„",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nØŠØĩØŊŲŠØą ØĻŲŠØ§Ų†Ø§ØŠŲƒ ØŽØ§Ų‡Øē.\n\nØąØ§ØĻØ· Ø§Ų„ØŠŲ†ØēŲŠŲ„:\n{downloadUrl}\n\nØ§Ų„ØąØģاØĶŲ„ Ø§Ų„Ų…ØŠØķŲ…Ų†ØĐ: {totalMessages, number}\nØ­ØŽŲ… Ø§Ų„Ų…Ų„Ų: {fileSizeMB, number} Ų…ŲŠØŽØ§ØĻØ§ŲŠØŠ\n\nŲŠŲ†ØŠŲ‡ŲŠ Ų‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ· ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ Ø§Ų„ØŠØĩØŊŲŠØąØŒ ŲŠØąØŽŲ‰ ØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą ŲˆØ§Ų„Ø§ØŠØĩØ§Ų„ ØĻŲØąŲŠŲ‚ Ø§Ų„ØŊØđŲ… Ų„ØŊŲŠŲ†Ø§.\n\n– ŲØąŲŠŲ‚ {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nØŠØĩØŊŲŠØą ØĻŲŠØ§Ų†Ø§ØŠŲƒ ØŽØ§Ų‡Øē.\n\nØąØ§ØĻØ· Ø§Ų„ØŠŲ†ØēŲŠŲ„:\n{downloadUrl}\n\nØ§Ų„ØąØģاØĶŲ„ Ø§Ų„Ų…ØŠØķŲ…Ų†ØĐ: {totalMessages, number}\nØ­ØŽŲ… Ø§Ų„Ų…Ų„Ų: {fileSizeMB, number} Ų…ŲŠØŽØ§ØĻØ§ŲŠØŠ\n\nØŠŲ†ØŠŲ‡ŲŠ ØĩŲ„Ø§Ø­ŲŠØĐ Ų‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ· ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ Ø§Ų„ØŠØĩØŊŲŠØąØŒ ŲŠØąØŽŲ‰ ØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą ŲˆØ§Ų„Ø§ØŠØĩØ§Ų„ ØĻŲØąŲŠŲ‚ Ø§Ų„ØŊØđŲ… Ų„ØŊŲŠŲ†Ø§.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"inactivity_warning": {
"subject": "ØģŲŠØŠŲ… Ø­Ø°Ų Ø­ØģاØĻ؃ ؁؊ {product_name} ØĻØģØĻØĻ ØđØŊŲ… Ø§Ų„Ų†Øīاط",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nŲ„Ų… Ų†ØąŲŽ ØĢ؊ Ų†Øīاط ØđŲ„Ų‰ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų…Ų†Ø° {lastActiveDate, date, full}.\n\nØĨذا Ų„Ų… ØŠØģØŽŲ„ Ø§Ų„ØŊØŪŲˆŲ„ ØĻØ­Ų„ŲˆŲ„ {deletionDate, date, full} Ø§Ų„ØģاØđØĐ {deletionDate, time, short}، ؁ØģŲŠØŠŲ… Ø­Ø°Ų Ø­ØģاØĻ؃ Ų†Ų‡Ø§ØĶŲŠŲ‹Ø§ ØĻØģØĻØĻ ØđØŊŲ… Ø§Ų„Ų†Øīاط.\n\nØģØŽŲ„ Ø§Ų„ØŊØŪŲˆŲ„ Ų‡Ų†Ø§:\n{loginUrl}\n\nØĨذا ŲƒŲ†ØŠ Ų‚ØŊ اØģØŠØŪØŊŲ…ØŠ {product_name} Ų…ØĪØŪØąŲ‹Ø§ØŒ ŲŠØąØŽŲ‰ Ø§Ų„Ø§ØŠØĩØ§Ų„ ØĻŲØąŲŠŲ‚ Ø§Ų„ØŊØđŲ… Ų„ØŊŲŠŲ†Ø§ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą.\n\n– ŲØąŲŠŲ‚ {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nŲ„Ų… Ų†ØąŲŽ ØĢ؊ Ų†Øīاط ØđŲ„Ų‰ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų…Ų†Ø° {lastActiveDate, date, full}.\n\nØĨذا Ų„Ų… ØŠØģØŽŲ„ Ø§Ų„ØŊØŪŲˆŲ„ ØĻØ­Ų„ŲˆŲ„ {deletionDate, date, full} Ø§Ų„ØģاØđØĐ {deletionDate, time, short}، ؁ØģŲŠØŠŲ… Ø­Ø°Ų Ø­ØģاØĻ؃ Ų†Ų‡Ø§ØĶŲŠŲ‹Ø§ ØĻØģØĻØĻ ØđØŊŲ… Ø§Ų„Ų†Øīاط.\n\nØģØŽŲ„ Ø§Ų„ØŊØŪŲˆŲ„ Ų‡Ų†Ø§:\n{loginUrl}\n\nØĨذا ŲƒŲ†ØŠ Ų‚ØŊ اØģØŠØŪØŊŲ…ØŠ {product_name} Ų…ØĪØŪØąŲ‹Ø§ØŒ ŲŠØąØŽŲ‰ Ø§Ų„Ø§ØŠØĩØ§Ų„ ØĻŲØąŲŠŲ‚ Ø§Ų„ØŊØđŲ… Ų„ØŊŲŠŲ†Ø§ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"ip_authorization": {
"subject": "Ø§Ų„ØģŲ…Ø§Ø­ ØĻØŠØģØŽŲŠŲ„ Ø§Ų„ØŊØŪŲˆŲ„ Ų…Ų† ØđŲ†ŲˆØ§Ų† IP ØŽØŊ؊ØŊ",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nŲ„Ų‚ØŊ Ø§ŲƒØŠØīŲŲ†Ø§ Ų…Ø­Ø§ŲˆŲ„ØĐ ØŠØģØŽŲŠŲ„ ØŊØŪŲˆŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų…Ų† ØđŲ†ŲˆØ§Ų† IP ØŽØŊ؊ØŊ:\n\nØđŲ†ŲˆØ§Ų† IP: {ipAddress}\nØ§Ų„Ų…ŲˆŲ‚Øđ: {location}\n\nØĨذا ŲƒŲ†ØŠ ØĢŲ†ØŠ Ų…Ų† Ų‚Ø§Ų… ØĻØ°Ų„ŲƒØŒ ŲŠØąØŽŲ‰ ØŠŲŲˆŲŠØķ ØđŲ†ŲˆØ§Ų† IP Ų‡Ø°Ø§ ØĻØ§Ų„Ų†Ų‚Øą ØđŲ„Ų‰ Ø§Ų„ØąØ§ØĻØ· ØĢØŊŲ†Ø§Ų‡:\n\n{authUrl}\n\nØĨذا Ų„Ų… ØŠØ­Ø§ŲˆŲ„ ØŠØģØŽŲŠŲ„ Ø§Ų„ØŊØŪŲˆŲ„ØŒ ŲŠØąØŽŲ‰ ØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą.\n\nŲ‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ· ØĩØ§Ų„Ø­ Ų„Ų€ 30 ØŊŲ‚ŲŠŲ‚ØĐ.\n\n– ŲØąŲŠŲ‚ {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nŲ„Ų‚ØŊ Ø§ŲƒØŠØīŲŲ†Ø§ Ų…Ø­Ø§ŲˆŲ„ØĐ ØŠØģØŽŲŠŲ„ ØŊØŪŲˆŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų…Ų† ØđŲ†ŲˆØ§Ų† IP ØŽØŊ؊ØŊ:\n\nØđŲ†ŲˆØ§Ų† IP: {ipAddress}\nØ§Ų„Ų…ŲˆŲ‚Øđ: {location}\n\nØĨذا ŲƒŲ†ØŠ ØĢŲ†ØŠ Ų…Ų† Ų‚Ø§Ų… ØĻØ°Ų„ŲƒØŒ ŲŠØąØŽŲ‰ Ø§Ų„ØģŲ…Ø§Ø­ ØĻØđŲ†ŲˆØ§Ų† IP Ų‡Ø°Ø§ ØĻØ§Ų„Ų†Ų‚Øą ØđŲ„Ų‰ Ø§Ų„ØąØ§ØĻØ· ØĢØŊŲ†Ø§Ų‡:\n\n{authUrl}\n\nØĨذا Ų„Ų… ØŠØ­Ø§ŲˆŲ„ ØŠØģØŽŲŠŲ„ Ø§Ų„ØŊØŪŲˆŲ„ØŒ ŲŠØąØŽŲ‰ ØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą.\n\nŲ‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ· ØĩØ§Ų„Ø­ Ų„Ų…ØŊØĐ 30 ØŊŲ‚ŲŠŲ‚ØĐ.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"mfa_backup_codes_view": {
"subject": "ØŠØĢ؃؊ØŊ Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ø§Ų„ØąŲ…ŲˆØē Ø§Ų„Ø§Ø­ØŠŲŠØ§Ø·ŲŠØĐ ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nŲ„Ų‚ØŊ ØŠŲ„Ų‚ŲŠŲ†Ø§ Ø·Ų„ØĻŲ‹Ø§ Ų„ØđØąØķ Ø§Ų„ØąŲ…ŲˆØē Ø§Ų„Ø§Ø­ØŠŲŠØ§Ø·ŲŠØĐ Ų„Ø­ØģاØĻ؃ ؁؊ {product_name}.\n\nŲ„ØŠØĢ؃؊ØŊ Ų‡Ø°Ø§ Ø§Ų„Ø·Ų„ØĻ، ØĢØŊØŪŲ„ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ Ø§Ų„ØŠØ·ØĻŲŠŲ‚:\n\n{code}\n\nŲŠŲ†ØŠŲ‡ŲŠ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ؁؂ØŊ ŲŠŲƒŲˆŲ† ØīØŪØĩ Ų…Ø§ Ų‚ØŊ ؈ØĩŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻ؃. Ų‚Ų… ØĻØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą.\n\n– ŲØąŲŠŲ‚ {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nŲ„Ų‚ØŊ ØŠŲ„Ų‚ŲŠŲ†Ø§ Ø·Ų„ØĻŲ‹Ø§ Ų„ØđØąØķ Ø§Ų„ØąŲ…ŲˆØē Ø§Ų„Ø§Ø­ØŠŲŠØ§Ø·ŲŠØĐ Ų„Ø­ØģاØĻ؃ ؁؊ {product_name}.\n\nŲ„ØŠØĢ؃؊ØŊ Ų‡Ø°Ø§ Ø§Ų„Ø·Ų„ØĻ، ØĢØŊØŪŲ„ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ Ø§Ų„ØŠØ·ØĻŲŠŲ‚:\n\n{code}\n\nØŠŲ†ØŠŲ‡ŲŠ ØĩŲ„Ø§Ø­ŲŠØĐ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ {expiresAt, date, full} Ø§Ų„ØģاØđØĐ {expiresAt, time, short}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ؁؂ØŊ ŲŠŲƒŲˆŲ† ØīØŪØĩ Ų…Ø§ Ų‚Ø§ØŊØąŲ‹Ø§ ØđŲ„Ų‰ Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻ؃. Ų‚Ų… ØĻØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"password_change_verification": {
"subject": "ØŠØĢ؃؊ØŊ ØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nŲ„Ų‚ØŊ ØŠŲ„Ų‚ŲŠŲ†Ø§ Ø·Ų„ØĻŲ‹Ø§ Ų„ØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ų„Ø­ØģاØĻ؃ ؁؊ {product_name}.\n\nŲ„ØŠØĢ؃؊ØŊ Ų‡Ø°Ø§ Ø§Ų„ØŠØšŲŠŲŠØąØŒ ØĢØŊØŪŲ„ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ Ø§Ų„ØŠØ·ØĻŲŠŲ‚:\n\n{code}\n\nŲŠŲ†ØŠŲ‡ŲŠ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ {expiresAt}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ؁؂ØŊ ŲŠŲƒŲˆŲ† ØīØŪØĩ Ų…Ø§ Ų‚ØŊ ؈ØĩŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻ؃. Ų‚Ų… ØĻØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą ŲˆŲ‚Ų… ØĻØŠŲ…ŲƒŲŠŲ† Ø§Ų„Ų…ØĩاØŊŲ‚ØĐ Ø§Ų„ØŦŲ†Ø§ØĶ؊ØĐ.\n\n– ŲØąŲŠŲ‚ {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nŲ„Ų‚ØŊ ØŠŲ„Ų‚ŲŠŲ†Ø§ Ø·Ų„ØĻŲ‹Ø§ Ų„ØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ų„Ø­ØģاØĻ؃ ؁؊ {product_name}.\n\nŲ„ØŠØĢ؃؊ØŊ Ų‡Ø°Ø§ Ø§Ų„ØŠØšŲŠŲŠØąØŒ ØĢØŊØŪŲ„ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ Ø§Ų„ØŠØ·ØĻŲŠŲ‚:\n\n{code}\n\nØŠŲ†ØŠŲ‡ŲŠ ØĩŲ„Ø§Ø­ŲŠØĐ Ų‡Ø°Ø§ Ø§Ų„ØąŲ…Øē ؁؊ {expiresAt}.\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ؁؂ØŊ ŲŠŲƒŲˆŲ† ØīØŪØĩ Ų…Ø§ Ų‚Ø§ØŊØąŲ‹Ø§ ØđŲ„Ų‰ Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻ؃. Ų‚Ų… ØĻØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ ØđŲ„Ų‰ Ø§Ų„ŲŲˆØą ŲˆŲ‚Ų… ØĻØŠŲ…ŲƒŲŠŲ† Ø§Ų„Ų…ØĩاØŊŲ‚ØĐ Ø§Ų„ØŦŲ†Ø§ØĶ؊ØĐ.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"password_reset": {
"subject": "ØĨØđاØŊØĐ ØŠØđŲŠŲŠŲ† ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nŲ„Ų‚ØŊ Ø·Ų„ØĻØŠ ØĨØđاØŊØĐ ØŠØđŲŠŲŠŲ† ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ ؁؊ {product_name}. اØģØŠØŪØŊŲ… Ø§Ų„ØąØ§ØĻØ· ØĢØŊŲ†Ø§Ų‡ Ų„ØŠØđŲŠŲŠŲ† ŲƒŲ„Ų…ØĐ Ų…ØąŲˆØą ØŽØŊ؊ØŊØĐ:\n\n{resetUrl}\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ŲŠŲ…ŲƒŲ†Ųƒ ØŠØŽØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ ØĻØĢŲ…Ø§Ų†.\n\nŲ‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ· ØĩØ§Ų„Ø­ Ų„ØģاØđØĐ ŲˆØ§Ø­ØŊØĐ.\n\n– ŲØąŲŠŲ‚ {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nŲ„Ų‚ØŊ Ø·Ų„ØĻØŠ ØĨØđاØŊØĐ ØŠØđŲŠŲŠŲ† ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ ؁؊ {product_name}. اØģØŠØŪØŊŲ… Ø§Ų„ØąØ§ØĻØ· ØĢØŊŲ†Ø§Ų‡ Ų„ØŠØđŲŠŲŠŲ† ŲƒŲ„Ų…ØĐ Ų…ØąŲˆØą ØŽØŊ؊ØŊØĐ:\n\n{resetUrl}\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ŲŠŲ…ŲƒŲ†Ųƒ ØŠØŽØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ ØĻØĢŲ…Ø§Ų†.\n\nŲ‡Ø°Ø§ Ø§Ų„ØąØ§ØĻØ· ØĩØ§Ų„Ø­ Ų„Ų…ØŊØĐ ØģاØđØĐ ŲˆØ§Ø­ØŊØĐ.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"registration_approved": {
"subject": "ØŠŲ…ØŠ Ø§Ų„Ų…ŲˆØ§ŲŲ‚ØĐ ØđŲ„Ų‰ ØŠØģØŽŲŠŲ„Ųƒ ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nØĢØŪØĻØ§Øą ØģØ§ØąØĐ: ØŠŲ…ØŠ Ø§Ų„Ų…ŲˆØ§ŲŲ‚ØĐ ØđŲ„Ų‰ ØŠØģØŽŲŠŲ„Ųƒ ؁؊ {product_name}.\n\nŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØĒŲ† ØŠØģØŽŲŠŲ„ Ø§Ų„ØŊØŪŲˆŲ„ ØĨŲ„Ų‰ ؊طØĻŲŠŲ‚ {product_name} Ų…Ų† Ų‡Ų†Ø§:\n{channelsUrl}\n\nŲ…ØąØ­ØĻØ§Ų‹ ØĻ؃ ؁؊ Ų…ØŽØŠŲ…Øđ {product_name}.\n\n– ŲØąŲŠŲ‚ {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nØĢØŪØĻØ§Øą ØģØ§ØąØĐ: ØŠŲ…ØŠ Ø§Ų„Ų…ŲˆØ§ŲŲ‚ØĐ ØđŲ„Ų‰ ØŠØģØŽŲŠŲ„Ųƒ ؁؊ {product_name}.\n\nŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØĒŲ† ØŠØģØŽŲŠŲ„ Ø§Ų„ØŊØŪŲˆŲ„ ØĨŲ„Ų‰ ؊طØĻŲŠŲ‚ {product_name} Ų…Ų† Ų‡Ų†Ø§:\n{channelsUrl}\n\nŲ…ØąØ­ØĻŲ‹Ø§ ØĻ؃ ؁؊ Ų…ØŽØŠŲ…Øđ {product_name}.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"report_resolved": {
"subject": "ØŠŲ…ØŠ Ų…ØąØ§ØŽØđØĐ ØŠŲ‚ØąŲŠØąŲƒ ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nØŠŲ…ØŠ Ų…ØąØ§ØŽØđØĐ ØŠŲ‚ØąŲŠØąŲƒ (Ø§Ų„Ų…ØđØąŲ: {reportId}) Ų…Ų† Ų‚ØĻŲ„ ŲØąŲŠŲ‚ Ø§Ų„ØĢŲ…Ø§Ų† Ų„ØŊŲŠŲ†Ø§.{hasComment, select, yes {\n\nØąØŊ ŲØąŲŠŲ‚ Ø§Ų„ØĢŲ…Ø§Ų†:\n{publicComment}} other {}}\n\nØīŲƒØąŲ‹Ø§ Ų„Ų…ØģاØđØŊØŠŲƒ ؁؊ Ø§Ų„Ø­ŲØ§Øļ ØđŲ„Ų‰ {product_name} ØĒŲ…Ų†Ų‹Ø§ Ų„Ų„ØŽŲ…ŲŠØđ. Ų†Ø­Ų† Ų†ØĢØŪذ ØŽŲ…ŲŠØđ Ø§Ų„ØŠŲ‚Ø§ØąŲŠØą ØđŲ„Ų‰ Ų…Ø­Ų…Ų„ Ø§Ų„ØŽØŊ ŲˆŲ†Ų‚ØŊØą Ų…ØģØ§Ų‡Ų…ØŠŲƒ ؁؊ Ø§Ų„Ų…ØŽØŠŲ…Øđ.\n\nØĨذا ŲƒØ§Ų† Ų„ØŊ؊؃ ØĢ؊ ØĢØģØĶŲ„ØĐ ØĢ؈ Ų…ØŪØ§ŲˆŲ ØĻØīØĢŲ† Ų‡Ø°Ų‡ Ø§Ų„Ų†ØŠŲŠØŽØĐ، ŲŠØąØŽŲ‰ Ø§Ų„Ø§ØŠØĩØ§Ų„ ØĻŲ€ {safety_email}.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
"subject": "ØŠŲ…ØŠ Ų…ØąØ§ØŽØđØĐ ØĻŲ„Ø§ØšŲƒ ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nØŠŲ…ØŠ Ų…ØąØ§ØŽØđØĐ ØĻŲ„Ø§ØšŲƒ (Ø§Ų„Ų…ØđØąŲ: {reportId}) Ų…Ų† Ų‚ØĻŲ„ ŲØąŲŠŲ‚ Ø§Ų„ØĢŲ…Ø§Ų† Ų„ØŊŲŠŲ†Ø§.{hasComment, select, yes {\n\nØąØŊ ŲØąŲŠŲ‚ Ø§Ų„ØĢŲ…Ø§Ų†:\n{publicComment}} other {}}\n\nØīŲƒØąŲ‹Ø§ Ų„Ų…ØģاØđØŊØŠŲƒ ؁؊ Ø§Ų„Ø­ŲØ§Øļ ØđŲ„Ų‰ {product_name} ØĒŲ…Ų†Ų‹Ø§ Ų„Ų„ØŽŲ…ŲŠØđ. Ų†Ø­Ų† Ų†ØĢØŪذ ØŽŲ…ŲŠØđ Ø§Ų„ØĻŲ„Ø§ØšØ§ØŠ ØđŲ„Ų‰ Ų…Ø­Ų…Ų„ Ø§Ų„ØŽØŊ ŲˆŲ†Ų‚ØŊØą Ų…ØģØ§Ų‡Ų…ØŠŲƒ ؁؊ Ø§Ų„Ų…ØŽØŠŲ…Øđ.\n\nØĨذا ŲƒØ§Ų† Ų„ØŊ؊؃ ØĢ؊ ØĢØģØĶŲ„ØĐ ØĢ؈ Ų…ØŪØ§ŲˆŲ ØĻØīØĢŲ† Ų‡Ø°Ų‡ Ø§Ų„Ų†ØŠŲŠØŽØĐ، ŲŠØąØŽŲ‰ Ø§Ų„Ø§ØŠØĩØ§Ų„ ØĻŲ€{safety_email}.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
},
"scheduled_deletion_notification": {
"subject": "ØģŲŠØŠŲ… Ø­Ø°Ų Ø­ØģاØĻ؃ ؁؊ {product_name} Ų†Ų‡Ø§ØĶŲŠŲ‹Ø§",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nØŠŲ… ØŽØŊŲˆŲ„ØĐ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų„Ų„Ø­Ø°Ų Ø§Ų„ØŊاØĶŲ….\n\nØ§Ų„Ø­Ø°Ų Ø§Ų„Ų…ØŽØŊŲˆŲ„: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Ø§Ų„ØģØĻØĻ: {reason}}\n}\n\nŲ‡Ø°Ø§ ØĨØŽØąØ§ØĄ ØŠŲ†ŲŲŠØ°ŲŠ ؎اØŊ. ØģŲŠØŠŲ… Ø­Ø°Ų ØĻŲŠØ§Ų†Ø§ØŠ Ø­ØģاØĻ؃ Ų†Ų‡Ø§ØĶŲŠŲ‹Ø§ ؁؊ Ø§Ų„ØŠØ§ØąŲŠØŪ Ø§Ų„Ų…Ø­ØŊØŊ.\n\nØĨذا ŲƒŲ†ØŠ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ų‚ØąØ§Øą Ø§Ų„ØŠŲ†ŲŲŠØ° Ų‡Ø°Ø§ ŲƒØ§Ų† ØšŲŠØą ØĩØ­ŲŠØ­ØŒ ŲŠŲ…ŲƒŲ†Ųƒ ØŠŲ‚ØŊŲŠŲ… اØģØŠØĶŲ†Ø§Ų. ØĢØąØģŲ„ ØĻØąŲŠØŊŲ‹Ø§ ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠŲ‹Ø§ ØĨŲ„Ų‰ {appeals_email} Ų…Ų† ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų‡Ø°Ø§.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nØŠŲ…ØŠ ØŽØŊŲˆŲ„ØĐ Ø­ØģاØĻ؃ ؁؊ {product_name} Ų„Ų„Ø­Ø°Ų Ø§Ų„ØŊاØĶŲ….\n\nØ§Ų„Ø­Ø°Ų Ø§Ų„Ų…ØŽØŊŲˆŲ„: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Ø§Ų„ØģØĻØĻ: {reason}}\n}\n\nŲ‡Ø°Ø§ ØĨØŽØąØ§ØĄ ØĨŲ†ŲØ§Ø° ؎اØŊ. ØģŲŠØŠŲ… Ø­Ø°Ų ØĻŲŠØ§Ų†Ø§ØŠ Ø­ØģاØĻ؃ Ų†Ų‡Ø§ØĶŲŠŲ‹Ø§ ؁؊ Ø§Ų„ØŠØ§ØąŲŠØŪ Ø§Ų„Ų…Ø­ØŊØŊ.\n\nØĨذا ŲƒŲ†ØŠ ØŠØđØŠŲ‚ØŊ ØĢŲ† Ų‚ØąØ§Øą Ø§Ų„ØĨŲ†ŲØ§Ø° Ų‡Ø°Ø§ ŲƒØ§Ų† ØšŲŠØą ØĩØ­ŲŠØ­ØŒ ŲŠŲ…ŲƒŲ†Ųƒ ØŠŲ‚ØŊŲŠŲ… اØģØŠØĶŲ†Ø§Ų. ØĢØąØģŲ„ ØĻØąŲŠØŊŲ‹Ø§ ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠŲ‹Ø§ ØĨŲ„Ų‰ {appeals_email} Ų…Ų† ØđŲ†ŲˆØ§Ų† Ø§Ų„ØĻØąŲŠØŊ Ø§Ų„ØĨŲ„ŲƒØŠØąŲˆŲ†ŲŠ Ų‡Ø°Ø§.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
},
"self_deletion_scheduled": {
"subject": "ØŠŲ… ØŽØŊŲˆŲ„ØĐ Ø­Ø°Ų Ø­ØģاØĻ؃ ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nŲ„Ų‚ØŊ Ø·Ų„ØĻØŠ Ø­Ø°Ų Ø­ØģاØĻ؃ ؁؊ {product_name}. ØŠŲ… ØŽØŊŲˆŲ„ØĐ Ø­ØģاØĻ؃ Ų„Ų„Ø­Ø°Ų Ø§Ų„ØŊاØĶŲ… ؁؊:\n\n{deletionDate, date, full} Ø§Ų„ØģاØđØĐ {deletionDate, time, short}\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ØģØŽŲ„ Ø§Ų„ØŊØŪŲˆŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻ؃ Ų„ØĨŲ„ØšØ§ØĄ Ø§Ų„Ø­Ø°Ų. Ų†ŲˆØĩ؊ ØĢ؊ØķŲ‹Ø§ ØĻØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ Ų„ØŠØĢŲ…ŲŠŲ† Ø­ØģاØĻ؃.\n\n– ŲØąŲŠŲ‚ {product_name}"
"subject": "ØŠŲ…ØŠ ØŽØŊŲˆŲ„ØĐ Ø­Ø°Ų Ø­ØģاØĻ؃ ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nŲ„Ų‚ØŊ Ø·Ų„ØĻØŠ Ø­Ø°Ų Ø­ØģاØĻ؃ ؁؊ {product_name}. ØŠŲ…ØŠ ØŽØŊŲˆŲ„ØĐ Ø­ØģاØĻ؃ Ų„Ų„Ø­Ø°Ų Ø§Ų„ØŊاØĶŲ… ؁؊:\n\n{deletionDate, date, full} Ø§Ų„ØģاØđØĐ {deletionDate, time, short}\n\nØĨذا Ų„Ų… ØŠØ·Ų„ØĻ Ų‡Ø°Ø§ØŒ ØģØŽŲ„ Ø§Ų„ØŊØŪŲˆŲ„ ØĨŲ„Ų‰ Ø­ØģاØĻ؃ Ų„ØĨŲ„ØšØ§ØĄ Ø§Ų„Ø­Ø°Ų. Ų†ŲˆØĩ؊ ØĢ؊ØķŲ‹Ø§ ØĻØŠØšŲŠŲŠØą ŲƒŲ„Ų…ØĐ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŪاØĩØĐ ØĻ؃ Ų„ØŠØĢŲ…ŲŠŲ† Ø­ØģاØĻ؃.\n\n– ŲØąŲŠŲ‚ {product_name}"
},
"unban_notification": {
"subject": "ØŠŲ… ØąŲØđ ØŠØđŲ„ŲŠŲ‚ Ø­ØģاØĻ؃ ؁؊ {product_name}",
"body": "Ų…ØąØ­ØĻØ§Ų‹ {username}،\n\nØĢØŪØĻØ§Øą ØģØ§ØąØĐ: ØŠŲ… ØąŲØđ ØŠØđŲ„ŲŠŲ‚ Ø­ØģاØĻ؃ ؁؊ {product_name}.\n\n{reason, select,\n null {}\n other {Ø§Ų„ØģØĻØĻ: {reason}}\n}\n\nŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØĒŲ† ØŠØģØŽŲŠŲ„ Ø§Ų„ØŊØŪŲˆŲ„ Ų…ØąØĐ ØĢØŪØąŲ‰ ŲˆŲ…ŲˆØ§ØĩŲ„ØĐ اØģØŠØŪØŊØ§Ų… {product_name} ŲƒØ§Ų„Ų…Øđ؊اØŊ.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
"body": "Ų…ØąØ­ØĻŲ‹Ø§ {username}،\n\nØĢØŪØĻØ§Øą ØģØ§ØąØĐ: ØŠŲ… ØąŲØđ ØŠØđŲ„ŲŠŲ‚ Ø­ØģاØĻ؃ ؁؊ {product_name}.\n\n{reason, select,\n null {}\n other {Ø§Ų„ØģØĻØĻ: {reason}}\n}\n\nŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØĒŲ† ØŠØģØŽŲŠŲ„ Ø§Ų„ØŊØŪŲˆŲ„ Ų…ØąØĐ ØĢØŪØąŲ‰ ŲˆŲ…ŲˆØ§ØĩŲ„ØĐ اØģØŠØŪØŊØ§Ų… {product_name} ŲƒØ§Ų„Ų…Øđ؊اØŊ.\n\n– ŲØąŲŠŲ‚ ØĢŲ…Ø§Ų† {product_name}"
}
});
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_BG_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -9,23 +9,23 @@ const EMAIL_I18N_BG_MESSAGES = defineEmailI18nLocaleMessages({
},
"account_scheduled_deletion": {
"subject": "ÐÐšÐ°ŅƒÐ―Ņ‚ŅŠŅ‚ Ņ‚Ðļ ÐēҊÐē {product_name} ҉Ðĩ ÐąŅŠÐīÐĩ ÐļÐ·Ņ‚Ņ€ÐļŅ‚ за ÐŋÐūҁ҂ÐūŅÐ―Ð―Ðū",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nÐÐšÐ°ŅƒÐ―Ņ‚ŅŠŅ‚ Ņ‚Ðļ ÐēҊÐē {product_name} Ðĩ Ð―Ð°ŅŅ€Ðū҇ÐĩÐ― за ÐŋÐūҁ҂ÐūŅÐ―Ð―Ðū ÐļÐ·Ņ‚Ņ€ÐļÐēÐ°Ð―Ðĩ ÐŋÐūŅ€Ð°ÐīÐļ Ð―Ð°Ņ€ŅƒŅˆÐĩÐ―ÐļŅ Ð―Ð° Ð―Ð°ŅˆÐļŅ‚Ðĩ ÐĢҁÐŧÐūÐēÐļŅ за ÐŋÐūÐŧзÐēÐ°Ð―Ðĩ ÐļÐŧÐļ ÐÐ°ŅÐūКÐļ Ð―Ð° ÐūÐąŅ‰Ð―ÐūŅŅ‚Ņ‚Ð°.\n\nÐÐ°ŅŅ€Ðū҇ÐĩÐ―Ðū ÐļÐ·Ņ‚Ņ€ÐļÐēÐ°Ð―Ðĩ: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nÐĒÐūÐēа Ðĩ ҁÐĩŅ€ÐļÐūÐ·Ð―Ð° ÐžŅŅ€ÐšÐ°. Ð”Ð°Ð―Ð―ÐļŅ‚Ðĩ Ð―Ð° Ð°ÐšÐ°ŅƒÐ―Ņ‚Ð° Ņ‚Ðļ ҉Ðĩ ÐąŅŠÐīÐ°Ņ‚ ÐļÐ·Ņ‚Ņ€ÐļŅ‚Ðļ за ÐŋÐūҁ҂ÐūŅÐ―Ð―Ðū Ð―Ð° Ð―Ð°ŅŅ€Ðū҇ÐĩÐ―Ð°Ņ‚Ð° ÐīÐ°Ņ‚Ð°.\n\nÐŸŅ€ÐĩÐģÐŧÐĩÐīаÐđ:\n- ÐĢҁÐŧÐūÐēÐļŅ за ÐŋÐūÐŧзÐēÐ°Ð―Ðĩ: {termsUrl}\n- ÐÐ°ŅÐūКÐļ Ð―Ð° ÐūÐąŅ‰Ð―ÐūŅŅ‚Ņ‚Ð°: {guidelinesUrl}\n\nÐŸŅ€Ðū҆Ðĩҁ Ð―Ð° ÐūÐąÐķаÐŧÐēÐ°Ð―Ðĩ:\nАКÐū ŅÐžŅŅ‚Ð°Ņˆ, ҇Ðĩ Ņ‚ÐūÐēа Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ Ðĩ Ð―ÐĩÐŋŅ€Ð°ÐēÐļÐŧÐ―Ðū ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ðū, ÐļÐžÐ°Ņˆ 60 ÐīÐ―Ðļ Ðīа ÐŋÐūÐīаÐīÐĩ҈ ÐūÐąÐķаÐŧÐēÐ°Ð―Ðĩ. ИзÐŋŅ€Ð°Ņ‚Ðļ ÐļОÐĩÐđÐŧ Ð―Ð° {appeals_email} ÐūŅ‚ Ņ‚ÐūзÐļ ÐļОÐĩÐđÐŧ аÐīŅ€Ðĩҁ.\n\nВ ÐūÐąÐķаÐŧÐēÐ°Ð―ÐĩŅ‚Ðū ҁÐļ:\n- ÐžÐąŅŅÐ―Ðļ ŅŅÐ―Ðū Ð·Ð°Ņ‰Ðū ŅÐžŅŅ‚Ð°Ņˆ, ҇Ðĩ Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩŅ‚Ðū Ðĩ Ð―ÐĩÐŋŅ€Ð°ÐēÐļÐŧÐ―Ðū ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ðū\n- ÐŸŅ€ÐĩÐīÐūŅŅ‚Ð°ÐēÐļ ÐēŅŅÐšÐ°ÐšÐēÐļ Ņ€ÐĩÐŧÐĩÐēÐ°Ð―Ņ‚Ð―Ðļ ÐīÐūÐšÐ°Ð·Ð°Ņ‚ÐĩÐŧҁ҂Ðēа ÐļÐŧÐļ КÐūÐ―Ņ‚ÐĩÐšŅŅ‚\n\nЧÐŧÐĩÐ― Ð―Ð° ÐĩКÐļÐŋа за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name} ҉Ðĩ ÐŋŅ€ÐĩÐģÐŧÐĩÐīа ÐūÐąÐķаÐŧÐēÐ°Ð―ÐĩŅ‚Ðū Ņ‚Ðļ Ðļ ОÐūÐķÐĩ Ðīа ҁÐŋŅ€Ðĩ ÐŋŅ€ÐĩÐīҁ҂ÐūŅŅ‰ÐūŅ‚Ðū ÐļÐ·Ņ‚Ņ€ÐļÐēÐ°Ð―Ðĩ, ÐīÐūÐšÐ°Ņ‚Ðū Ð―Ðĩ ÐąŅŠÐīÐĩ ÐēзÐĩŅ‚Ðū ÐūКÐūÐ―Ņ‡Ð°Ņ‚ÐĩÐŧÐ―Ðū Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ.\n\n– ЕКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name}"
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nÐÐšÐ°ŅƒÐ―Ņ‚ŅŠŅ‚ Ņ‚Ðļ ÐēҊÐē {product_name} Ðĩ Ð―Ð°ŅŅ€Ðū҇ÐĩÐ― за ÐŋÐūҁ҂ÐūŅÐ―Ð―Ðū ÐļÐ·Ņ‚Ņ€ÐļÐēÐ°Ð―Ðĩ ÐŋÐūŅ€Ð°ÐīÐļ Ð―Ð°Ņ€ŅƒŅˆÐĩÐ―ÐļŅ Ð―Ð° Ð―Ð°ŅˆÐļŅ‚Ðĩ ÐžÐąŅ‰Ðļ ҃ҁÐŧÐūÐēÐļŅ ÐļÐŧÐļ ÐÐ°ŅÐūКÐļ Ð―Ð° ÐūÐąŅ‰Ð―ÐūŅŅ‚Ņ‚Ð°.\n\nÐÐ°ŅŅ€Ðū҇ÐĩÐ―Ðū ÐļÐ·Ņ‚Ņ€ÐļÐēÐ°Ð―Ðĩ: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nÐĒÐūÐēа Ðĩ ҁÐĩŅ€ÐļÐūÐ·Ð―Ð° ÐžŅŅ€ÐšÐ°. Ð”Ð°Ð―Ð―ÐļŅ‚Ðĩ Ð―Ð° Ð°ÐšÐ°ŅƒÐ―Ņ‚Ð° Ņ‚Ðļ ҉Ðĩ ÐąŅŠÐīÐ°Ņ‚ ÐļÐ·Ņ‚Ņ€ÐļŅ‚Ðļ за ÐŋÐūҁ҂ÐūŅÐ―Ð―Ðū Ð―Ð° Ð―Ð°ŅŅ€Ðū҇ÐĩÐ―Ð°Ņ‚Ð° ÐīÐ°Ņ‚Ð°.\n\nÐŸŅ€ÐĩÐģÐŧÐĩÐīаÐđ:\n- ÐžÐąŅ‰Ðļ ҃ҁÐŧÐūÐēÐļŅ: {termsUrl}\n- ÐÐ°ŅÐūКÐļ Ð―Ð° ÐūÐąŅ‰Ð―ÐūŅŅ‚Ņ‚Ð°: {guidelinesUrl}\n\nÐŸŅ€Ðū҆Ðĩҁ Ð―Ð° ÐūÐąÐķаÐŧÐēÐ°Ð―Ðĩ:\nАКÐū ŅÐžŅŅ‚Ð°Ņˆ, ҇Ðĩ Ņ‚ÐūÐēа Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ Ðĩ Ð―ÐĩÐŋŅ€Ð°ÐēÐļÐŧÐ―Ðū ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ðū, ÐļÐžÐ°Ņˆ 60 ÐīÐ―Ðļ Ðīа ÐŋÐūÐīаÐīÐĩ҈ ÐūÐąÐķаÐŧÐēÐ°Ð―Ðĩ. ИзÐŋŅ€Ð°Ņ‚Ðļ ÐļОÐĩÐđÐŧ Ð―Ð° {appeals_email} ÐūŅ‚ Ņ‚ÐūзÐļ ÐļОÐĩÐđÐŧ аÐīŅ€Ðĩҁ.\n\nВ ÐūÐąÐķаÐŧÐēÐ°Ð―ÐĩŅ‚Ðū ҁÐļ:\n- ÐžÐąŅŅÐ―Ðļ ŅŅÐ―Ðū Ð·Ð°Ņ‰Ðū ŅÐžŅŅ‚Ð°Ņˆ, ҇Ðĩ Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩŅ‚Ðū Ðĩ Ð―ÐĩÐŋŅ€Ð°ÐēÐļÐŧÐ―Ðū ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ðū\n- ÐŸŅ€ÐļÐŧÐūÐķÐļ ÐēҁÐļŅ‡ÐšÐļ Ņ€ÐĩÐŧÐĩÐēÐ°Ð―Ņ‚Ð―Ðļ ÐīÐūÐšÐ°Ð·Ð°Ņ‚ÐĩÐŧҁ҂Ðēа ÐļÐŧÐļ КÐūÐ―Ņ‚ÐĩÐšŅŅ‚\n\nЧÐŧÐĩÐ― Ð―Ð° ÐĩКÐļÐŋа за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name} ҉Ðĩ ÐŋŅ€ÐĩÐģÐŧÐĩÐīа ÐūÐąÐķаÐŧÐēÐ°Ð―ÐĩŅ‚Ðū Ņ‚Ðļ Ðļ ОÐūÐķÐĩ Ðīа ҁÐŋŅ€Ðĩ ÐŋŅ€ÐĩÐīҁ҂ÐūŅŅ‰ÐūŅ‚Ðū ÐļÐ·Ņ‚Ņ€ÐļÐēÐ°Ð―Ðĩ, ÐīÐūÐšÐ°Ņ‚Ðū Ð―Ðĩ ÐąŅŠÐīÐĩ ÐēзÐĩŅ‚Ðū ÐūКÐūÐ―Ņ‡Ð°Ņ‚ÐĩÐŧÐ―Ðū Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ.\n\n– ЕКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name}"
},
"account_temp_banned": {
"subject": "ÐÐšÐ°ŅƒÐ―Ņ‚ŅŠŅ‚ Ņ‚Ðļ ÐēҊÐē {product_name} Ðĩ ÐēŅ€ÐĩОÐĩÐ―Ð―Ðū ҁÐŋŅ€ŅÐ―",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nÐÐšÐ°ŅƒÐ―Ņ‚ŅŠŅ‚ Ņ‚Ðļ ÐēҊÐē {product_name} Ðĩ ÐēŅ€ÐĩОÐĩÐ―Ð―Ðū ҁÐŋŅ€ŅÐ― ÐŋÐūŅ€Ð°ÐīÐļ Ð―Ð°Ņ€ŅƒŅˆÐ°ÐēÐ°Ð―Ðĩ Ð―Ð° Ð―Ð°ŅˆÐļŅ‚Ðĩ ÐĢҁÐŧÐūÐēÐļŅ за ÐŋÐūÐŧзÐēÐ°Ð―Ðĩ ÐļÐŧÐļ ÐÐ°ŅÐūКÐļ Ð―Ð° ÐūÐąŅ‰Ð―ÐūŅŅ‚Ņ‚Ð°.\n\nÐŸŅ€ÐūÐīҊÐŧÐķÐļŅ‚ÐĩÐŧÐ―Ðūҁ҂: {durationHours, plural,\n =1 {1 Ņ‡Ð°Ņ}\n other {# Ņ‡Ð°ŅÐ°}\n}\nÐĄÐŋŅ€ŅÐ― ÐīÐū: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nÐŸŅ€Ðĩз Ņ‚ÐūÐēа ÐēŅ€ÐĩОÐĩ Ð―ŅÐžÐ° Ðīа ÐļÐžÐ°Ņˆ ÐīÐūŅŅ‚ŅŠÐŋ ÐīÐū Ð°ÐšÐ°ŅƒÐ―Ņ‚Ð° ҁÐļ.\n\nÐŸŅ€ÐĩÐģÐŧÐĩÐīаÐđ:\n- ÐĢҁÐŧÐūÐēÐļŅ за ÐŋÐūÐŧзÐēÐ°Ð―Ðĩ: {termsUrl}\n- ÐÐ°ŅÐūКÐļ Ð―Ð° ÐūÐąŅ‰Ð―ÐūŅŅ‚Ņ‚Ð°: {guidelinesUrl}\n\nАКÐū ŅÐžŅŅ‚Ð°Ņˆ, ҇Ðĩ Ņ‚ÐūÐēа Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ Ðĩ Ð―ÐĩÐŋŅ€Ð°ÐēÐļÐŧÐ―Ðū ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ðū, ОÐūÐķÐĩ҈ Ðīа ÐŋÐūÐīаÐīÐĩ҈ ÐūÐąÐķаÐŧÐēÐ°Ð―Ðĩ. ИзÐŋŅ€Ð°Ņ‚Ðļ ÐļОÐĩÐđÐŧ Ð―Ð° {appeals_email} ÐūŅ‚ Ņ‚ÐūзÐļ ÐļОÐĩÐđÐŧ аÐīŅ€Ðĩҁ Ðļ ŅŅÐ―Ðū ÐūÐąŅŅÐ―Ðļ Ð·Ð°Ņ‰Ðū ŅÐžŅŅ‚Ð°Ņˆ, ҇Ðĩ Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩŅ‚Ðū Ðĩ Ð―ÐĩÐŋŅ€Ð°ÐēÐļÐŧÐ―Ðū. НÐļÐĩ ҉Ðĩ ÐŋŅ€ÐĩÐģÐŧÐĩÐīаОÐĩ ÐūÐąÐķаÐŧÐēÐ°Ð―ÐĩŅ‚Ðū Ņ‚Ðļ Ðļ ҉Ðĩ ÐūŅ‚ÐģÐūÐēÐūŅ€ÐļО ҁ Ð―Ð°ŅˆÐĩŅ‚Ðū Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ.\n\n– ЕКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name}"
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nÐÐšÐ°ŅƒÐ―Ņ‚ŅŠŅ‚ Ņ‚Ðļ ÐēҊÐē {product_name} Ðĩ ÐēŅ€ÐĩОÐĩÐ―Ð―Ðū ҁÐŋŅ€ŅÐ― ÐŋÐūŅ€Ð°ÐīÐļ Ð―Ð°Ņ€ŅƒŅˆÐ°ÐēÐ°Ð―Ðĩ Ð―Ð° Ð―Ð°ŅˆÐļŅ‚Ðĩ ÐžÐąŅ‰Ðļ ҃ҁÐŧÐūÐēÐļŅ ÐļÐŧÐļ ÐÐ°ŅÐūКÐļ Ð―Ð° ÐūÐąŅ‰Ð―ÐūŅŅ‚Ņ‚Ð°.\n\nÐŸŅ€ÐūÐīҊÐŧÐķÐļŅ‚ÐĩÐŧÐ―Ðūҁ҂: {durationHours, plural,\n =1 {1 Ņ‡Ð°Ņ}\n other {# Ņ‡Ð°ŅÐ°}\n}\nÐĄÐŋŅ€ŅÐ― ÐīÐū: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nÐŸŅ€Ðĩз Ņ‚ÐūÐēа ÐēŅ€ÐĩОÐĩ Ð―ŅÐžÐ° Ðīа ÐļÐžÐ°Ņˆ ÐīÐūŅŅ‚ŅŠÐŋ ÐīÐū Ð°ÐšÐ°ŅƒÐ―Ņ‚Ð° ҁÐļ.\n\nÐŸŅ€ÐĩÐģÐŧÐĩÐīаÐđ:\n- ÐžÐąŅ‰Ðļ ҃ҁÐŧÐūÐēÐļŅ: {termsUrl}\n- ÐÐ°ŅÐūКÐļ Ð―Ð° ÐūÐąŅ‰Ð―ÐūŅŅ‚Ņ‚Ð°: {guidelinesUrl}\n\nАКÐū ŅÐžŅŅ‚Ð°Ņˆ, ҇Ðĩ Ņ‚ÐūÐēа Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ Ðĩ Ð―ÐĩÐŋŅ€Ð°ÐēÐļÐŧÐ―Ðū ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ðū, ОÐūÐķÐĩ҈ Ðīа ÐŋÐūÐīаÐīÐĩ҈ ÐūÐąÐķаÐŧÐēÐ°Ð―Ðĩ. ИзÐŋŅ€Ð°Ņ‚Ðļ ÐļОÐĩÐđÐŧ Ð―Ð° {appeals_email} ÐūŅ‚ Ņ‚ÐūзÐļ ÐļОÐĩÐđÐŧ аÐīŅ€Ðĩҁ Ðļ ŅŅÐ―Ðū ÐūÐąŅŅÐ―Ðļ Ð·Ð°Ņ‰Ðū ŅÐžŅŅ‚Ð°Ņˆ, ҇Ðĩ Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩŅ‚Ðū Ðĩ Ð―ÐĩÐŋŅ€Ð°ÐēÐļÐŧÐ―Ðū. ÐĐÐĩ ÐŋŅ€ÐĩÐģÐŧÐĩÐīаОÐĩ ÐūÐąÐķаÐŧÐēÐ°Ð―ÐĩŅ‚Ðū Ņ‚Ðļ Ðļ ҉Ðĩ Ņ‚Ðļ ÐūŅ‚ÐģÐūÐēÐūŅ€ÐļО ҁ Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩŅ‚Ðū ҁÐļ.\n\n– ЕКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name}"
},
"donation_confirmation": {
"subject": "БÐŧаÐģÐūÐīÐ°Ņ€ÐļО Ņ‚Ðļ за ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩŅ‚Ðū за {product_name}",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ,\n\nБÐŧаÐģÐūÐīÐ°Ņ€ÐļО Ņ‚Ðļ за ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩŅ‚Ðū за {product_name}! ÐĒÐēÐūÐĩŅ‚Ðū {interval, select,\n month {ÐŋÐĩŅ€ÐļÐūÐīÐļŅ‡Ð―Ðū ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩ}\n year {ÐŋÐĩŅ€ÐļÐūÐīÐļŅ‡Ð―Ðū ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩ}\n other {ÐĩÐīÐ―ÐūÐšŅ€Ð°Ņ‚Ð―Ðū ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩ}\n} ÐąÐĩ҈Ðĩ {interval, select,\n month {Ð―Ð°ŅŅ‚Ņ€ÐūÐĩÐ―Ðū}\n year {Ð―Ð°ŅŅ‚Ņ€ÐūÐĩÐ―Ðū}\n other {ÐūÐąŅ€Ð°ÐąÐūŅ‚ÐĩÐ―Ðū}\n} ҃ҁÐŋÐĩŅˆÐ―Ðū.\n\nПÐūÐīŅ€ÐūÐąÐ―Ðūҁ҂Ðļ за ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩŅ‚Ðū:\nÐĄŅƒÐžÐ°: {amount} {currency} {interval, select,\n month {Ð―Ð° ОÐĩҁÐĩ҆}\n year {Ð―Ð° ÐģÐūÐīÐļÐ―Ð°}\n other {}\n}\n\nStripe ҉Ðĩ Ņ‚Ðļ ÐļзÐŋŅ€Ð°Ņ‚Ðļ ÐūŅ‚ÐīÐĩÐŧÐ―Ð° Ņ€Ð°Ð·ÐŋÐļŅÐšÐ° ҁ PDF Ņ„Ð°ÐšŅ‚ŅƒŅ€Ð°Ņ‚Ð° Ņ‚Ðļ ŅÐšÐūŅ€Ðū. ÐĒŅ ÐēКÐŧŅŽŅ‡Ðēа ÐēҁÐļŅ‡ÐšÐļ ÐīÐ°Ð―Ð―Ðļ за ÐŋÐŧÐ°Ņ‰Ð°Ð―Ðĩ Ðļ ОÐūÐķÐĩ Ðīа ҁÐĩ ÐļзÐŋÐūÐŧзÐēа за ÐīÐ°Ð―ŅŠŅ‡Ð―Ðļ ҆ÐĩÐŧÐļ.\n\nМÐūÐķÐĩ҈ Ðīа ÐŋŅ€ÐĩÐģÐŧÐĩÐīÐ°Ņˆ Ðļҁ҂ÐūŅ€ÐļŅŅ‚Ð° Ð―Ð° ÐīÐ°Ņ€ÐĩÐ―ÐļŅŅ‚Ð° ҁÐļ, Ðīа ÐļÐ·Ņ‚ÐĩÐģÐŧŅŅˆ Ņ„Ð°ÐšŅ‚ŅƒŅ€Ðļ, {interval, select,\n month {Ðļ Ðīа ҃ÐŋŅ€Ð°ÐēÐŧŅÐēÐ°Ņˆ ÐļÐŧÐļ Ð°Ð―ŅƒÐŧÐļŅ€Ð°Ņˆ Ð°ÐąÐūÐ―Ð°ÐžÐĩÐ―Ņ‚Ð° ҁÐļ}\n year {Ðļ Ðīа ҃ÐŋŅ€Ð°ÐēÐŧŅÐēÐ°Ņˆ ÐļÐŧÐļ Ð°Ð―ŅƒÐŧÐļŅ€Ð°Ņˆ Ð°ÐąÐūÐ―Ð°ÐžÐĩÐ―Ņ‚Ð° ҁÐļ}\n other {Ðļ Ðīа ҃ÐŋŅ€Ð°ÐēÐŧŅÐēÐ°Ņˆ ÐąŅŠÐīÐĩ҉Ðļ ÐīÐ°Ņ€ÐĩÐ―ÐļŅ}\n} ÐŋÐū ÐēŅŅÐšÐū ÐēŅ€ÐĩОÐĩ, ÐšÐ°Ņ‚Ðū ÐļзÐŋÐūÐŧзÐēÐ°Ņˆ Ņ‚ÐūзÐļ ÐŧÐļÐ―Ðš:\n\n{manageUrl}\n\nÐĒÐēÐūŅŅ‚Ð° ÐŋÐūÐīÐšŅ€ÐĩÐŋа ÐŋÐūОаÐģа Ð―Ð° {product_name} Ðīа ÐŋŅ€ÐūÐīҊÐŧÐķÐļ Ðīа Ņ€Ð°ÐąÐūŅ‚Ðļ. БÐŧаÐģÐūÐīÐ°Ņ€ÐļО Ņ‚Ðļ!\n\n– ЕКÐļÐŋ Ð―Ð° {product_name}"
"subject": "БÐŧаÐģÐūÐīÐ°Ņ€ÐļО Ņ‚Ðļ за ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩŅ‚Ðū ÐšŅŠÐž {product_name}",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ,\n\nБÐŧаÐģÐūÐīÐ°Ņ€ÐļО Ņ‚Ðļ за ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩŅ‚Ðū ÐšŅŠÐž {product_name}! ÐĒÐēÐūÐĩŅ‚Ðū {interval, select,\n month {ÐŋÐĩŅ€ÐļÐūÐīÐļŅ‡Ð―Ðū ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩ}\n year {ÐŋÐĩŅ€ÐļÐūÐīÐļŅ‡Ð―Ðū ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩ}\n other {ÐĩÐīÐ―ÐūÐšŅ€Ð°Ņ‚Ð―Ðū ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩ}\n} ÐąÐĩ҈Ðĩ {interval, select,\n month {Ð―Ð°ŅŅ‚Ņ€ÐūÐĩÐ―Ðū}\n year {Ð―Ð°ŅŅ‚Ņ€ÐūÐĩÐ―Ðū}\n other {ÐūÐąŅ€Ð°ÐąÐūŅ‚ÐĩÐ―Ðū}\n} ҃ҁÐŋÐĩŅˆÐ―Ðū.\n\nПÐūÐīŅ€ÐūÐąÐ―Ðūҁ҂Ðļ за ÐīÐ°Ņ€ÐĩÐ―ÐļÐĩŅ‚Ðū:\nÐĄŅƒÐžÐ°: {amount} {interval, select,\n month {Ð―Ð° ОÐĩҁÐĩ҆}\n year {Ð―Ð° ÐģÐūÐīÐļÐ―Ð°}\n other {}\n}\n\nÐĄÐšÐūŅ€Ðū Stripe ҉Ðĩ Ņ‚Ðļ ÐļзÐŋŅ€Ð°Ņ‚Ðļ ÐŋÐū ÐļОÐĩÐđÐŧ ÐūŅ‚ÐīÐĩÐŧÐ―Ð° Ņ€Ð°Ð·ÐŋÐļŅÐšÐ° ҁ PDF Ð―Ð° Ņ„Ð°ÐšŅ‚ŅƒŅ€Ð°Ņ‚Ð° Ņ‚Ðļ. ÐĒŅ ÐēКÐŧŅŽŅ‡Ðēа ÐēҁÐļŅ‡ÐšÐļ ÐīÐ°Ð―Ð―Ðļ за ÐŋÐŧÐ°Ņ‰Ð°Ð―Ðĩ Ðļ ОÐūÐķÐĩ Ðīа ҁÐĩ ÐļзÐŋÐūÐŧзÐēа за ÐīÐ°Ð―ŅŠŅ‡Ð―Ðļ ҆ÐĩÐŧÐļ.\n\nМÐūÐķÐĩ҈ Ðīа ÐŋŅ€ÐĩÐģÐŧÐĩÐķÐīÐ°Ņˆ Ðļҁ҂ÐūŅ€ÐļŅŅ‚Ð° Ð―Ð° ÐīÐ°Ņ€ÐĩÐ―ÐļŅŅ‚Ð° ҁÐļ, Ðīа ÐļÐ·Ņ‚ÐĩÐģÐŧŅŅˆ Ņ„Ð°ÐšŅ‚ŅƒŅ€Ðļ {interval, select,\n month {Ðļ Ðīа ҃ÐŋŅ€Ð°ÐēÐŧŅÐēÐ°Ņˆ ÐļÐŧÐļ Ð°Ð―ŅƒÐŧÐļŅ€Ð°Ņˆ Ð°ÐąÐūÐ―Ð°ÐžÐĩÐ―Ņ‚Ð° ҁÐļ}\n year {Ðļ Ðīа ҃ÐŋŅ€Ð°ÐēÐŧŅÐēÐ°Ņˆ ÐļÐŧÐļ Ð°Ð―ŅƒÐŧÐļŅ€Ð°Ņˆ Ð°ÐąÐūÐ―Ð°ÐžÐĩÐ―Ņ‚Ð° ҁÐļ}\n other {Ðļ Ðīа ҃ÐŋŅ€Ð°ÐēÐŧŅÐēÐ°Ņˆ ÐąŅŠÐīÐĩ҉Ðļ ÐīÐ°Ņ€ÐĩÐ―ÐļŅ}\n} ÐŋÐū ÐēŅŅÐšÐū ÐēŅ€ÐĩОÐĩ, ÐšÐ°Ņ‚Ðū ÐļзÐŋÐūÐŧзÐēÐ°Ņˆ Ņ‚ÐūзÐļ ÐŧÐļÐ―Ðš:\n\n{manageUrl}\n\nÐĒÐēÐūŅŅ‚Ð° ÐŋÐūÐīÐšŅ€ÐĩÐŋа ÐŋÐūОаÐģа Ð―Ð° {product_name} Ðīа ÐŋŅ€ÐūÐīҊÐŧÐķÐļ Ðīа Ņ€Ð°ÐąÐūŅ‚Ðļ. БÐŧаÐģÐūÐīÐ°Ņ€ÐļО Ņ‚Ðļ!\n\n– ЕКÐļÐŋ Ð―Ð° {product_name}"
},
"donation_magic_link": {
"subject": "ÐĢÐŋŅ€Ð°ÐēÐŧŅÐēаÐđ ÐīÐ°Ņ€ÐĩÐ―ÐļŅŅ‚Ð° ҁÐļ за {product_name}",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ,\n\nКÐŧÐļÐšÐ―Ðļ ÐēŅŠŅ€Ņ…Ņƒ ÐŧÐļÐ―ÐšÐ° ÐŋÐū-ÐīÐūÐŧ҃, за Ðīа ÐŋÐūÐŧŅƒŅ‡Ðļ҈ ÐīÐūŅŅ‚ŅŠÐŋ ÐīÐū ÐŋÐūŅ€Ņ‚Ð°Ðŧа за ÐīÐ°Ņ€ÐļŅ‚ÐĩÐŧÐļ:\n\n{manageUrl}\n\nВ ÐŋÐūŅ€Ņ‚Ð°Ðŧа ОÐūÐķÐĩ҈ Ðīа ҃ÐŋŅ€Ð°ÐēÐŧŅÐēÐ°Ņˆ ÐŋÐŧÐ°Ð―ÐūÐēÐĩ, Ðīа ÐļÐ·Ņ‚ÐĩÐģÐŧŅŅˆ Ņ„Ð°ÐšŅ‚ŅƒŅ€Ðļ Ðļ Ðīа ÐŋŅ€ÐĩÐģÐŧÐĩÐķÐīÐ°Ņˆ Ðļҁ҂ÐūŅ€ÐļŅŅ‚Ð° Ð―Ð° ÐīÐ°Ņ€ÐĩÐ―ÐļŅŅ‚Ð° ҁÐļ.\n\nÐĒÐūзÐļ ÐŧÐļÐ―Ðš ÐļÐ·Ņ‚ÐļŅ‡Ð° Ð―Ð° {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nАКÐū Ð―Ðĩ ҁÐļ ÐŋÐūÐļŅÐšÐ°Ðŧ Ņ‚ÐūзÐļ ÐŧÐļÐ―Ðš, ОÐūÐķÐĩ҈ ҁÐŋÐūКÐūÐđÐ―Ðū Ðīа ÐļÐģÐ―ÐūŅ€ÐļŅ€Ð°Ņˆ Ņ‚ÐūзÐļ ÐļОÐĩÐđÐŧ.\n\n– ЕКÐļÐŋ Ð―Ð° {product_name}"
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ,\n\nКÐŧÐļÐšÐ―Ðļ ÐēŅŠŅ€Ņ…Ņƒ ÐŧÐļÐ―ÐšÐ° ÐŋÐū-ÐīÐūÐŧ҃, за Ðīа ÐŋÐūÐŧŅƒŅ‡Ðļ҈ ÐīÐūŅŅ‚ŅŠÐŋ ÐīÐū ÐŋÐūŅ€Ņ‚Ð°Ðŧа за ÐīÐ°Ņ€ÐļŅ‚ÐĩÐŧÐļ:\n\n{manageUrl}\n\nВ ÐŋÐūŅ€Ņ‚Ð°Ðŧа ОÐūÐķÐĩ҈ Ðīа ҃ÐŋŅ€Ð°ÐēÐŧŅÐēÐ°Ņˆ Ð°ÐąÐūÐ―Ð°ÐžÐĩÐ―Ņ‚Ðļ, Ðīа ÐļÐ·Ņ‚ÐĩÐģÐŧŅŅˆ Ņ„Ð°ÐšŅ‚ŅƒŅ€Ðļ Ðļ Ðīа ÐŋŅ€ÐĩÐģÐŧÐĩÐķÐīÐ°Ņˆ Ðļҁ҂ÐūŅ€ÐļŅŅ‚Ð° Ð―Ð° ÐīÐ°Ņ€ÐĩÐ―ÐļŅŅ‚Ð° ҁÐļ.\n\nÐĒÐūзÐļ ÐŧÐļÐ―Ðš ÐļÐ·Ņ‚ÐļŅ‡Ð° Ð―Ð° {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nАКÐū Ð―Ðĩ ҁÐļ ÐŋÐūÐļŅÐšÐ°Ðŧ Ņ‚ÐūзÐļ ÐŧÐļÐ―Ðš, ОÐūÐķÐĩ҈ ҁÐŋÐūКÐūÐđÐ―Ðū Ðīа ÐļÐģÐ―ÐūŅ€ÐļŅ€Ð°Ņˆ Ņ‚ÐūзÐļ ÐļОÐĩÐđÐŧ.\n\n– ЕКÐļÐŋ Ð―Ð° {product_name}"
},
"dsa_report_verification": {
"subject": "ПÐūŅ‚ÐēŅŠŅ€ÐīÐļ ÐļОÐĩÐđÐŧа ҁÐļ за DSA ÐīÐūКÐŧаÐī",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ,\n\nИзÐŋÐūÐŧзÐēаÐđ КÐūÐīа за ÐŋÐūŅ‚ÐēŅŠŅ€ÐķÐīÐĩÐ―ÐļÐĩ ÐŋÐū-ÐīÐūÐŧ҃, за Ðīа ÐŋÐūÐīаÐīÐĩ҈ ҁÐēÐūŅ ÐīÐūКÐŧаÐī ÐŋÐū ЗаКÐūÐ―Ð° за ҆Ðļ҄ҀÐūÐēÐļŅ‚Ðĩ ҃ҁÐŧ҃ÐģÐļ ÐēҊÐē {product_name}:\n\n{code}\n\nÐĒÐūзÐļ КÐūÐī ÐļÐ·Ņ‚ÐļŅ‡Ð° Ð―Ð° {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nАКÐū Ð―Ðĩ ҁÐļ ÐģÐū ÐŋÐūÐļŅÐšÐ°Ðŧ, ОÐūÐķÐĩ҈ Ðīа ÐļÐģÐ―ÐūŅ€ÐļŅ€Ð°Ņˆ Ņ‚ÐūзÐļ ÐļОÐĩÐđÐŧ.\n\n– ЕКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name}"
"subject": "ПÐūŅ‚ÐēŅŠŅ€ÐīÐļ ÐļОÐĩÐđÐŧа ҁÐļ за ҁÐļÐģÐ―Ð°Ðŧ ÐŋÐū DSA",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ,\n\nИзÐŋÐūÐŧзÐēаÐđ КÐūÐīа за ÐŋÐūŅ‚ÐēŅŠŅ€ÐķÐīÐĩÐ―ÐļÐĩ ÐŋÐū-ÐīÐūÐŧ҃, за Ðīа ÐŋÐūÐīаÐīÐĩ҈ ҁÐļÐģÐ―Ð°Ðŧа ҁÐļ ÐŋÐū ЗаКÐūÐ―Ð° за ҆Ðļ҄ҀÐūÐēÐļŅ‚Ðĩ ҃ҁÐŧ҃ÐģÐļ ÐēҊÐē {product_name}:\n\n{code}\n\nÐĒÐūзÐļ КÐūÐī ÐļÐ·Ņ‚ÐļŅ‡Ð° Ð―Ð° {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nАКÐū Ð―Ðĩ ҁÐļ ÐģÐū ÐŋÐūÐļŅÐšÐ°Ðŧ, ОÐūÐķÐĩ҈ Ðīа ÐļÐģÐ―ÐūŅ€ÐļŅ€Ð°Ņˆ Ņ‚ÐūзÐļ ÐļОÐĩÐđÐŧ.\n\n– ЕКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name}"
},
"email_change_new": {
"subject": "ПÐūŅ‚ÐēŅŠŅ€ÐīÐļ Ð―ÐūÐēÐļŅ ҁÐļ ÐļОÐĩÐđÐŧ ÐēҊÐē {product_name}",
@@ -37,19 +37,19 @@ const EMAIL_I18N_BG_MESSAGES = defineEmailI18nLocaleMessages({
},
"email_change_revert": {
"subject": "ИОÐĩÐđÐŧŅŠŅ‚ Ņ‚Ðļ ÐēҊÐē {product_name} ÐąÐĩ҈Ðĩ ÐŋŅ€ÐūОÐĩÐ―ÐĩÐ―",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nИОÐĩÐđÐŧ аÐīŅ€ÐĩŅŅŠŅ‚ Ð―Ð° Ð°ÐšÐ°ŅƒÐ―Ņ‚Ð° Ņ‚Ðļ ÐēҊÐē {product_name} ÐąÐĩ҈Ðĩ ÐŋŅ€ÐūОÐĩÐ―ÐĩÐ― Ð―Ð° {newEmail}.\n\nАКÐū Ņ‚Ðļ ҁÐļ Ð―Ð°ÐŋŅ€Ð°ÐēÐļÐŧ Ņ‚Ð°Ð·Ðļ ÐŋŅ€ÐūÐžŅÐ―Ð°, Ð―Ðĩ Ðĩ Ð―ÐĩÐūÐąŅ…ÐūÐīÐļОÐū Ðīа ÐŋŅ€ÐĩÐīÐŋŅ€ÐļÐĩÐžÐ°Ņˆ Ð―ÐļКаКÐēÐļ ÐīÐĩÐđҁ҂ÐēÐļŅ. АКÐū Ð―Ðĩ ҁÐļ, ОÐūÐķÐĩ҈ Ðīа ÐūŅ‚ÐžÐĩÐ―Ðļ҈ ÐŋŅ€ÐūÐžŅÐ―Ð°Ņ‚Ð° Ðļ Ðīа Ð·Ð°Ņ‰ÐļŅ‚Ðļ҈ Ð°ÐšÐ°ŅƒÐ―Ņ‚Ð° ҁÐļ, ÐšÐ°Ņ‚Ðū ÐļзÐŋÐūÐŧзÐēÐ°Ņˆ Ņ‚ÐūзÐļ ÐŧÐļÐ―Ðš:\n\n{revertUrl}\n\nÐĒÐūÐēа ҉Ðĩ ÐēŅŠÐ·ŅŅ‚Ð°Ð―ÐūÐēÐļ ÐŋŅ€ÐĩÐīÐļŅˆÐ―ÐļŅ Ņ‚Ðļ ÐļОÐĩÐđÐŧ, ҉Ðĩ Ņ‚Ðĩ ÐļзÐŧÐĩзÐĩ ÐūŅ‚ ÐēҁÐļŅ‡ÐšÐļ ŅƒŅŅ‚Ņ€ÐūÐđҁ҂Ðēа, ҉Ðĩ ÐŋŅ€ÐĩÐžÐ°Ņ…Ð―Ðĩ ҁÐēŅŠŅ€Ð·Ð°Ð―ÐļŅ‚Ðĩ Ņ‚ÐĩÐŧÐĩŅ„ÐūÐ―Ð―Ðļ Ð―ÐūОÐĩŅ€Ð°, ҉Ðĩ ÐīÐĩÐ°ÐšŅ‚ÐļÐēÐļŅ€Ð° MFA Ðļ ҉Ðĩ ÐļзÐļŅÐšÐēа Ðīа заÐīаÐīÐĩ҈ Ð―ÐūÐēа ÐŋÐ°Ņ€ÐūÐŧа.\n\n– ЕКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name}"
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nИОÐĩÐđÐŧ аÐīŅ€ÐĩŅŅŠŅ‚ Ð―Ð° Ð°ÐšÐ°ŅƒÐ―Ņ‚Ð° Ņ‚Ðļ ÐēҊÐē {product_name} ÐąÐĩ҈Ðĩ ÐŋŅ€ÐūОÐĩÐ―ÐĩÐ― Ð―Ð° {newEmail}.\n\nАКÐū Ņ‚Ðļ ҁÐļ Ð―Ð°ÐŋŅ€Ð°ÐēÐļÐŧ Ņ‚Ð°Ð·Ðļ ÐŋŅ€ÐūÐžŅÐ―Ð°, Ð―Ðĩ Ðĩ Ð―ÐĩÐūÐąŅ…ÐūÐīÐļОÐū Ðīа ÐŋŅ€ÐĩÐīÐŋŅ€ÐļÐĩÐžÐ°Ņˆ Ð―ÐļКаКÐēÐļ ÐīÐĩÐđҁ҂ÐēÐļŅ. АКÐū Ð―Ðĩ ҁÐļ, ОÐūÐķÐĩ҈ Ðīа ÐūŅ‚ÐžÐĩÐ―Ðļ҈ ÐŋŅ€ÐūÐžŅÐ―Ð°Ņ‚Ð° Ðļ Ðīа Ð·Ð°Ņ‰ÐļŅ‚Ðļ҈ Ð°ÐšÐ°ŅƒÐ―Ņ‚Ð° ҁÐļ, ÐšÐ°Ņ‚Ðū ÐļзÐŋÐūÐŧзÐēÐ°Ņˆ Ņ‚ÐūзÐļ ÐŧÐļÐ―Ðš:\n\n{revertUrl}\n\nÐĒÐūÐēа ҉Ðĩ ÐēŅŠÐ·ŅŅ‚Ð°Ð―ÐūÐēÐļ ÐŋŅ€ÐĩÐīÐļŅˆÐ―ÐļŅ Ņ‚Ðļ ÐļОÐĩÐđÐŧ, ҉Ðĩ ÐŋŅ€ÐĩÐšŅ€Ð°Ņ‚Ðļ ÐēҁÐļŅ‡ÐšÐļ Ð°ÐšŅ‚ÐļÐēÐ―Ðļ ҁÐĩҁÐļÐļ, ҉Ðĩ ÐŋŅ€ÐĩÐžÐ°Ņ…Ð―Ðĩ ҁÐēŅŠŅ€Ð·Ð°Ð―ÐļŅ‚Ðĩ Ņ‚ÐĩÐŧÐĩŅ„ÐūÐ―Ð―Ðļ Ð―ÐūОÐĩŅ€Ð°, ҉Ðĩ ÐīÐĩÐ°ÐšŅ‚ÐļÐēÐļŅ€Ð° MFA Ðļ ҉Ðĩ ÐļзÐļŅÐšÐ° Ðīа заÐīаÐīÐĩ҈ Ð―ÐūÐēа ÐŋÐ°Ņ€ÐūÐŧа.\n\n– ЕКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name}"
},
"email_verification": {
"subject": "ПÐūŅ‚ÐēŅŠŅ€ÐīÐļ ÐļОÐĩÐđÐŧ аÐīŅ€ÐĩŅÐ° ҁÐļ ÐēҊÐē {product_name}",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nПÐūŅ‚ÐēŅŠŅ€ÐīÐļ ÐļОÐĩÐđÐŧ аÐīŅ€ÐĩŅÐ° за Ð°ÐšÐ°ŅƒÐ―Ņ‚Ð° ҁÐļ ÐēҊÐē {product_name}, ÐšÐ°Ņ‚Ðū КÐŧÐļÐšÐ―Ðĩ҈ ÐēŅŠŅ€Ņ…Ņƒ ÐŧÐļÐ―ÐšÐ° ÐŋÐū-ÐīÐūÐŧ҃:\n\n{verifyUrl}\n\nАКÐū Ð―Ðĩ ҁÐļ ŅŅŠÐ·ÐīаÐŧ Ð°ÐšÐ°ŅƒÐ―Ņ‚ ÐēҊÐē {product_name}, ОÐūÐķÐĩ҈ ҁÐŋÐūКÐūÐđÐ―Ðū Ðīа ÐļÐģÐ―ÐūŅ€ÐļŅ€Ð°Ņˆ Ņ‚ÐūзÐļ ÐļОÐĩÐđÐŧ.\n\nÐĒÐūзÐļ ÐŧÐļÐ―Ðš Ðĩ ÐēаÐŧÐļÐīÐĩÐ― 24 Ņ‡Ð°ŅÐ°.\n\n– ЕКÐļÐŋ Ð―Ð° {product_name}"
},
"gift_chargeback_notification": {
"subject": "ÐŸŅ€ÐĩÐīÐļÐžŅŅ‚ÐēÐ°Ņ‚Ð° ÐūŅ‚ Ð°ÐšŅ‚ÐļÐēÐļŅ€Ð°Ð―ÐļŅ Ņ‚Ðļ ÐŋÐūÐīÐ°Ņ€ŅŠÐš ŅÐ° ÐŋŅ€ÐĩÐžÐ°Ņ…Ð―Ð°Ņ‚Ðļ",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nКÐūÐī за ÐŋÐūÐīÐ°Ņ€ŅŠÐš, КÐūÐđŅ‚Ðū ҁÐļ Ð°ÐšŅ‚ÐļÐēÐļŅ€Ð°Ðŧ, ÐŋŅŠŅ€ÐēÐūÐ―Ð°Ņ‡Ð°ÐŧÐ―Ðū Ðĩ ÐąÐļÐŧ ÐŋÐŧÐ°Ņ‚ÐĩÐ― ÐūŅ‚ Ð―ŅÐšÐūÐđ ÐīŅ€ŅƒÐģ. ÐĒÐūÐēа ÐŋÐŧÐ°Ņ‰Ð°Ð―Ðĩ Ðū҂҂ÐūÐģаÐēа Ðĩ ÐūŅ‚ÐžÐĩÐ―ÐĩÐ―Ðū (chargeback).\n\nПÐūŅ€Ð°ÐīÐļ Ņ‚ÐūÐēа ÐŋŅ€ÐĩÐžÐ°Ņ…Ð―Ð°Ņ…ÐžÐĩ ÐŋŅ€ÐĩÐīÐļÐžŅŅ‚ÐēÐ°Ņ‚Ð°, КÐūÐļŅ‚Ðū ÐąŅŅ…Ð° ÐīÐūÐąÐ°ÐēÐĩÐ―Ðļ ÐšŅŠÐž Ð°ÐšÐ°ŅƒÐ―Ņ‚Ð° Ņ‚Ðļ, КÐūÐģÐ°Ņ‚Ðū Ð°ÐšŅ‚ÐļÐēÐļŅ€Ð° ÐŋÐūÐīÐ°Ņ€ŅŠÐšÐ°.\n\nАКÐū ŅÐžŅŅ‚Ð°Ņˆ, ҇Ðĩ Ņ‚ÐūÐēа Ðĩ ÐģŅ€ÐĩŅˆÐšÐ°, ҁÐēŅŠŅ€ÐķÐļ ҁÐĩ ҁ Ð―Ð°ŅˆÐļŅ ÐĩКÐļÐŋ за ÐŋÐūÐīÐīŅ€ŅŠÐķКа Ðļ ÐēКÐŧŅŽŅ‡Ðļ ÐēҁÐļŅ‡ÐšÐļ ÐŋÐūÐīŅ€ÐūÐąÐ―Ðūҁ҂Ðļ, КÐūÐļŅ‚Ðū ÐļÐžÐ°Ņˆ ÐūŅ‚Ð―ÐūŅÐ―Ðū КÐūÐīа за ÐŋÐūÐīÐ°Ņ€ŅŠÐš Ðļ КÐūÐģа ҁÐļ ÐģÐū Ð°ÐšŅ‚ÐļÐēÐļŅ€Ð°Ðŧ.\n\n– ЕКÐļÐŋ Ð―Ð° {product_name}"
"subject": "ÐŸŅ€ÐĩÐīÐļÐžŅŅ‚ÐēÐ°Ņ‚Ð° ÐūŅ‚ ÐūҁҀÐĩÐąŅ€ÐĩÐ―ÐļŅ Ņ‚Ðļ ÐŋÐūÐīÐ°Ņ€ŅŠÐš ŅÐ° ÐŋŅ€ÐĩÐžÐ°Ņ…Ð―Ð°Ņ‚Ðļ",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nКÐūÐī за ÐŋÐūÐīÐ°Ņ€ŅŠÐš, КÐūÐđŅ‚Ðū ҁÐļ ÐūҁҀÐĩÐąŅ€ÐļÐŧ, ÐŋŅŠŅ€ÐēÐūÐ―Ð°Ņ‡Ð°ÐŧÐ―Ðū Ðĩ ÐąÐļÐŧ ÐŋÐŧÐ°Ņ‚ÐĩÐ― ÐūŅ‚ Ð―ŅÐšÐūÐđ ÐīŅ€ŅƒÐģ. ÐžŅ‚Ņ‚ÐūÐģаÐēа ÐŋÐŧÐ°Ņ‰Ð°Ð―ÐĩŅ‚Ðū Ðĩ ÐēŅŠŅ€Ð―Ð°Ņ‚Ðū ҇ҀÐĩз ÐūҁÐŋÐūŅ€ÐēÐ°Ð―Ðĩ Ð―Ð° Ņ‚Ņ€Ð°Ð―ŅÐ°ÐšŅ†ÐļŅ.\n\nПÐūŅ€Ð°ÐīÐļ Ņ‚ÐūÐēа ÐŋŅ€ÐĩÐžÐ°Ņ…Ð―Ð°Ņ…ÐžÐĩ ÐŋŅ€ÐĩÐīÐļÐžŅŅ‚ÐēÐ°Ņ‚Ð°, КÐūÐļŅ‚Ðū ÐąŅŅ…Ð° ÐīÐūÐąÐ°ÐēÐĩÐ―Ðļ ÐšŅŠÐž Ð°ÐšÐ°ŅƒÐ―Ņ‚Ð° Ņ‚Ðļ, КÐūÐģÐ°Ņ‚Ðū ÐūҁҀÐĩÐąŅ€Ðļ ÐŋÐūÐīÐ°Ņ€ŅŠÐšÐ°.\n\nАКÐū ŅÐžŅŅ‚Ð°Ņˆ, ҇Ðĩ Ņ‚ÐūÐēа Ðĩ ÐģŅ€ÐĩŅˆÐšÐ°, ҁÐēŅŠŅ€ÐķÐļ ҁÐĩ ҁ Ð―Ð°ŅˆÐļŅ ÐĩКÐļÐŋ за ÐŋÐūÐīÐīŅ€ŅŠÐķКа Ðļ ÐŋÐūҁÐū҇Ðļ ÐēҁÐļŅ‡ÐšÐļ ÐŋÐūÐīŅ€ÐūÐąÐ―Ðūҁ҂Ðļ, КÐūÐļŅ‚Ðū ÐļÐžÐ°Ņˆ за КÐūÐīа за ÐŋÐūÐīÐ°Ņ€ŅŠÐš Ðļ КÐūÐģа ҁÐļ ÐģÐū ÐūҁҀÐĩÐąŅ€ÐļÐŧ.\n\n– ЕКÐļÐŋ Ð―Ð° {product_name}"
},
"harvest_completed": {
"subject": "Ð•ÐšŅÐŋÐūŅ€Ņ‚ŅŠŅ‚ Ð―Ð° ÐīÐ°Ð―Ð―ÐļŅ‚Ðĩ Ņ‚Ðļ ÐūŅ‚ {product_name} Ðĩ ÐģÐūŅ‚ÐūÐē за ÐļÐ·Ņ‚ÐĩÐģÐŧŅÐ―Ðĩ",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nÐ•ÐšŅÐŋÐūŅ€Ņ‚ŅŠŅ‚ Ð―Ð° ÐīÐ°Ð―Ð―ÐļŅ‚Ðĩ Ņ‚Ðļ Ðĩ ÐģÐūŅ‚ÐūÐē.\n\nЛÐļÐ―Ðš за ÐļÐ·Ņ‚ÐĩÐģÐŧŅÐ―Ðĩ:\n{downloadUrl}\n\nВКÐŧŅŽŅ‡ÐĩÐ―Ðļ ҁҊÐūÐąŅ‰ÐĩÐ―ÐļŅ: {totalMessages, number}\nРазОÐĩŅ€ Ð―Ð° Ņ„Ð°ÐđÐŧа: {fileSizeMB, number} MB\n\nÐĒÐūзÐļ ÐŧÐļÐ―Ðš ÐļÐ·Ņ‚ÐļŅ‡Ð° Ð―Ð° {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nАКÐū Ð―Ðĩ ҁÐļ ÐģÐū ÐŋÐūÐļŅÐšÐ°Ðŧ, ŅÐžÐĩÐ―Ðļ ÐŋÐ°Ņ€ÐūÐŧÐ°Ņ‚Ð° ҁÐļ Ð―ÐĩÐ·Ð°ÐąÐ°ÐēÐ―Ðū Ðļ ҁÐĩ ҁÐēŅŠŅ€ÐķÐļ ҁ Ð―Ð°ŅˆÐļŅ ÐĩКÐļÐŋ за ÐŋÐūÐīÐīŅ€ŅŠÐķКа.\n\n– ЕКÐļÐŋ Ð―Ð° {product_name}"
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nÐ•ÐšŅÐŋÐūŅ€Ņ‚ŅŠŅ‚ Ð―Ð° ÐīÐ°Ð―Ð―ÐļŅ‚Ðĩ Ņ‚Ðļ Ðĩ ÐģÐūŅ‚ÐūÐē.\n\nЛÐļÐ―Ðš за ÐļÐ·Ņ‚ÐĩÐģÐŧŅÐ―Ðĩ:\n{downloadUrl}\n\nВКÐŧŅŽŅ‡ÐĩÐ―Ðļ ҁҊÐūÐąŅ‰ÐĩÐ―ÐļŅ: {totalMessages, number}\nРазОÐĩŅ€ Ð―Ð° Ņ„Ð°ÐđÐŧа: {fileSizeMB, number} MB\n\nÐĒÐūзÐļ ÐŧÐļÐ―Ðš ÐļÐ·Ņ‚ÐļŅ‡Ð° Ð―Ð° {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nАКÐū Ð―Ðĩ ҁÐļ ÐŋÐūÐļŅÐšÐ°Ðŧ Ņ‚ÐūзÐļ ÐĩÐšŅÐŋÐūҀ҂, ŅÐžÐĩÐ―Ðļ ÐŋÐ°Ņ€ÐūÐŧÐ°Ņ‚Ð° ҁÐļ Ð―ÐĩÐ·Ð°ÐąÐ°ÐēÐ―Ðū Ðļ ҁÐĩ ҁÐēŅŠŅ€ÐķÐļ ҁ Ð―Ð°ŅˆÐļŅ ÐĩКÐļÐŋ за ÐŋÐūÐīÐīŅ€ŅŠÐķКа.\n\n– ЕКÐļÐŋ Ð―Ð° {product_name}"
},
"inactivity_warning": {
"subject": "ÐÐšÐ°ŅƒÐ―Ņ‚ŅŠŅ‚ Ņ‚Ðļ ÐēҊÐē {product_name} ҉Ðĩ ÐąŅŠÐīÐĩ ÐļÐ·Ņ‚Ņ€ÐļŅ‚ ÐŋÐūŅ€Ð°ÐīÐļ Ð―ÐĩÐ°ÐšŅ‚ÐļÐēÐ―Ðūҁ҂",
@@ -76,8 +76,8 @@ const EMAIL_I18N_BG_MESSAGES = defineEmailI18nLocaleMessages({
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nДÐūÐąŅ€Ð° Ð―ÐūÐēÐļÐ―Ð°: Ņ€ÐĩÐģÐļŅŅ‚Ņ€Ð°Ņ†ÐļŅŅ‚Ð° Ņ‚Ðļ ÐēҊÐē {product_name} Ðĩ ÐūÐīÐūÐąŅ€ÐĩÐ―Ð°.\n\nВÐĩ҇Ðĩ ОÐūÐķÐĩ҈ Ðīа ÐēÐŧÐĩзÐĩ҈ Ðē ÐŋŅ€ÐļÐŧÐūÐķÐĩÐ―ÐļÐĩŅ‚Ðū {product_name} Ņ‚ŅƒÐš:\n{channelsUrl}\n\nДÐūÐąŅ€Ðĩ ÐīÐū҈ҊÐŧ Ðē ÐūÐąŅ‰Ð―ÐūŅŅ‚Ņ‚Ð° Ð―Ð° {product_name}.\n\n– ЕКÐļÐŋ Ð―Ð° {product_name}"
},
"report_resolved": {
"subject": "ДÐūКÐŧаÐīŅŠŅ‚ Ņ‚Ðļ ÐēҊÐē {product_name} Ðĩ ÐŋŅ€ÐĩÐģÐŧÐĩÐīÐ°Ð―",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nДÐūКÐŧаÐīŅŠŅ‚ Ņ‚Ðļ (ID: {reportId}) Ðĩ ÐŋŅ€ÐĩÐģÐŧÐĩÐīÐ°Ð― ÐūŅ‚ Ð―Ð°ŅˆÐļŅ ÐĩКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂.{hasComment, select, yes {\n\nÐžŅ‚ÐģÐūÐēÐūŅ€ ÐūŅ‚ ÐĩКÐļÐŋа за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂:\n{publicComment}} other {}}\n\nБÐŧаÐģÐūÐīÐ°Ņ€ÐļО Ņ‚Ðļ, ҇Ðĩ ÐŋÐūОаÐģÐ°Ņˆ {product_name} Ðīа ÐūŅŅ‚Ð°Ð―Ðĩ ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðū ÐžŅŅŅ‚Ðū за ÐēҁÐļŅ‡ÐšÐļ. НÐļÐĩ ÐŋŅ€ÐļÐĩОаОÐĩ ÐēҁÐļŅ‡ÐšÐļ ÐīÐūКÐŧаÐīÐļ ҁÐĩŅ€ÐļÐūÐ·Ð―Ðū Ðļ ҆ÐĩÐ―ÐļО Ņ‚ÐēÐūŅ ÐŋŅ€ÐļÐ―Ðūҁ ÐšŅŠÐž ÐūÐąŅ‰Ð―ÐūŅŅ‚Ņ‚Ð°.\n\nАКÐū ÐļÐžÐ°Ņˆ ÐēҊÐŋŅ€ÐūҁÐļ ÐļÐŧÐļ ÐŋŅ€ÐļŅ‚ÐĩŅÐ―ÐĩÐ―ÐļŅ ÐūŅ‚Ð―ÐūŅÐ―Ðū Ņ‚ÐūзÐļ Ņ€ÐĩÐ·ŅƒÐŧŅ‚Ð°Ņ‚, ҁÐēŅŠŅ€ÐķÐļ ҁÐĩ ҁ {safety_email}.\n\n– ЕКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name}"
"subject": "ÐĄÐļÐģÐ―Ð°ÐŧŅŠŅ‚ Ņ‚Ðļ ÐēҊÐē {product_name} Ðĩ ÐŋŅ€ÐĩÐģÐŧÐĩÐīÐ°Ð―",
"body": "ЗÐīŅ€Ð°ÐēÐĩÐđ, {username},\n\nÐĄÐļÐģÐ―Ð°ÐŧŅŠŅ‚ Ņ‚Ðļ (ID: {reportId}) Ðĩ ÐŋŅ€ÐĩÐģÐŧÐĩÐīÐ°Ð― ÐūŅ‚ Ð―Ð°ŅˆÐļŅ ÐĩКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂.{hasComment, select, yes {\n\nÐžŅ‚ÐģÐūÐēÐūŅ€ ÐūŅ‚ ÐĩКÐļÐŋа за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂:\n{publicComment}} other {}}\n\nБÐŧаÐģÐūÐīÐ°Ņ€ÐļО Ņ‚Ðļ, ҇Ðĩ ÐŋÐūОаÐģÐ°Ņˆ Ð―Ð° {product_name} Ðīа ÐūŅŅ‚Ð°Ð―Ðĩ ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðū ÐžŅŅŅ‚Ðū за ÐēҁÐļŅ‡ÐšÐļ. ÐŸŅ€ÐļÐĩОаОÐĩ ÐēҁÐļŅ‡ÐšÐļ ҁÐļÐģÐ―Ð°ÐŧÐļ ҁÐĩŅ€ÐļÐūÐ·Ð―Ðū Ðļ ҆ÐĩÐ―ÐļО ÐŋŅ€ÐļÐ―ÐūŅÐ° Ņ‚Ðļ ÐšŅŠÐž ÐūÐąŅ‰Ð―ÐūŅŅ‚Ņ‚Ð°.\n\nАКÐū ÐļÐžÐ°Ņˆ ÐēҊÐŋŅ€ÐūҁÐļ ÐļÐŧÐļ ÐŋŅ€ÐļŅ‚ÐĩŅÐ―ÐĩÐ―ÐļŅ ÐūŅ‚Ð―ÐūŅÐ―Ðū Ņ‚ÐūзÐļ Ņ€ÐĩÐ·ŅƒÐŧŅ‚Ð°Ņ‚, ҁÐēŅŠŅ€ÐķÐļ ҁÐĩ ҁ {safety_email}.\n\n– ЕКÐļÐŋ за ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂ Ð―Ð° {product_name}"
},
"scheduled_deletion_notification": {
"subject": "ÐÐšÐ°ŅƒÐ―Ņ‚ŅŠŅ‚ Ņ‚Ðļ ÐēҊÐē {product_name} ҉Ðĩ ÐąŅŠÐīÐĩ ÐļÐ·Ņ‚Ņ€ÐļŅ‚ за ÐŋÐūҁ҂ÐūŅÐ―Ð―Ðū",
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_CS_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "TvÅŊj Účet {product_name} byl dočasně deaktivovÃĄn",
"body": "Ahoj {username},\n\nDočasně jsme deaktivovali tvÅŊj Účet {product_name}, protoÅūe jsme zaznamenali podezřelou aktivitu.\n\n{reason, select,\n null {}\n other {DÅŊvod: {reason}}\n}\n\nPro opětovnÃ― přístup k Účtu si budeÅĄ muset resetovat heslo:\n\n{forgotUrl}\n\nPo resetovÃĄní hesla se budeÅĄ moci znovu přihlÃĄsit.\n\nPokud se domnívÃĄÅĄ, Åūe se jednÃĄ o chybu, kontaktuj prosím nÃĄÅĄ tÃ―m podpory.\n\n– Bezpečnostní tÃ―m {product_name}"
"subject": "VÃĄÅĄ Účet {product_name} byl dočasně deaktivovÃĄn",
"body": "DobrÃ― den, {username},\n\nDočasně jsme deaktivovali vÃĄÅĄ Účet {product_name}, protoÅūe jsme zaznamenali podezřelou aktivitu.\n\n{reason, select,\n null {}\n other {DÅŊvod: {reason}}\n}\n\nAbyste znovu získali přístup k Účtu, musíte si nastavit novÃĐ heslo:\n\n{forgotUrl}\n\nPo změně hesla se budete moci znovu přihlÃĄsit.\n\nPokud se domnívÃĄte, Åūe jde o chybu, kontaktujte nÃĄÅĄ tÃ―m podpory.\n\n– Bezpečnostní tÃ―m {product_name}"
},
"account_scheduled_deletion": {
"subject": "TvÅŊj Účet {product_name} bude trvale smazÃĄn",
"body": "Ahoj {username},\n\nTvÅŊj Účet {product_name} byl naplÃĄnovÃĄn k trvalÃĐmu smazÃĄní z dÅŊvodu poruÅĄení naÅĄich Podmínek sluÅūby nebo PokynÅŊ komunity.\n\nNaplÃĄnovanÃĐ smazÃĄní: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {DÅŊvod: {reason}}\n}\n\nJednÃĄ se o zÃĄvaÅūnÃĐ opatření. TvÃĄ data Účtu budou trvale smazÃĄna v naplÃĄnovanÃ― den.\n\nZkontroluj prosím:\n- Podmínky sluÅūby: {termsUrl}\n- Pokyny komunity: {guidelinesUrl}\n\nProces odvolÃĄní:\nPokud se domnívÃĄÅĄ, Åūe toto rozhodnutí o vynucení bylo nesprÃĄvnÃĐ nebo neoprÃĄvněnÃĐ, mÃĄÅĄ 60 dní na podÃĄní odvolÃĄní. OdeÅĄli e-mail na {appeals_email} z tÃĐto e-mailovÃĐ adresy.\n\nVe svÃĐm odvolÃĄní:\n- Jasně vysvětli, proč se domnívÃĄÅĄ, Åūe rozhodnutí o vynucení bylo nesprÃĄvnÃĐ nebo neoprÃĄvněnÃĐ\n- Poskytni veÅĄkerÃĐ relevantní dÅŊkazy nebo kontext\n\nČlen bezpečnostního tÃ―mu {product_name} tvÃĐ odvolÃĄní přezkoumÃĄ a mÅŊÅūe pozastavit probíhající smazÃĄní, dokud nebude dosaÅūeno konečnÃĐho rozhodnutí.\n\n– Bezpečnostní tÃ―m {product_name}"
"subject": "VÃĄÅĄ Účet {product_name} bude trvale smazÃĄn",
"body": "DobrÃ― den, {username},\n\nKvÅŊli poruÅĄení naÅĄich podmínek sluÅūby nebo komunitních pravidel bylo naplÃĄnovÃĄno trvalÃĐ smazÃĄní vaÅĄeho Účtu {product_name}.\n\nNaplÃĄnovanÃĐ smazÃĄní: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {DÅŊvod: {reason}}\n}\n\nJednÃĄ se o zÃĄvaÅūnÃĐ opatření. Data vaÅĄeho Účtu budou v naplÃĄnovanÃ― den trvale smazÃĄna.\n\nPřečtěte si:\n- Podmínky sluÅūby: {termsUrl}\n- Komunitní pravidla: {guidelinesUrl}\n\nPostup odvolÃĄní:\nPokud se domnívÃĄte, Åūe toto rozhodnutí bylo nesprÃĄvnÃĐ nebo neopodstatněnÃĐ, mÃĄte 60 dní na podÃĄní odvolÃĄní. PoÅĄlete e-mail na {appeals_email} z tÃĐto e-mailovÃĐ adresy.\n\nV odvolÃĄní:\n- Jasně vysvětlete, proč se domnívÃĄte, Åūe rozhodnutí bylo nesprÃĄvnÃĐ nebo neopodstatněnÃĐ\n- Uveďte vÅĄechny relevantní dÅŊkazy a souvislosti\n\nČlen bezpečnostního tÃ―mu {product_name} vaÅĄe odvolÃĄní přezkoumÃĄ a mÅŊÅūe pozastavit plÃĄnovanÃĐ smazÃĄní, dokud nepadne konečnÃĐ rozhodnutí.\n\n– Bezpečnostní tÃ―m {product_name}"
},
"account_temp_banned": {
"subject": "TvÅŊj Účet {product_name} byl dočasně pozastaven",
"body": "Ahoj {username},\n\nTvÅŊj Účet {product_name} byl dočasně pozastaven za poruÅĄení naÅĄich Podmínek sluÅūby nebo PokynÅŊ komunity.\n\nDoba trvÃĄní: {durationHours, plural,\n one {1 hodina} few {hodiny}\n many {hodiny} other {# hodin}\n}\nPozastaveno do: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {DÅŊvod: {reason}}\n}\n\nBěhem tÃĐto doby nebudeÅĄ mít přístup ke svÃĐmu Účtu.\n\nZkontroluj prosím:\n- Podmínky sluÅūby: {termsUrl}\n- Pokyny komunity: {guidelinesUrl}\n\nPokud se domnívÃĄÅĄ, Åūe toto rozhodnutí o vynucení bylo nesprÃĄvnÃĐ nebo neoprÃĄvněnÃĐ, mÅŊÅūeÅĄ podat odvolÃĄní. OdeÅĄli e-mail na {appeals_email} z tÃĐto e-mailovÃĐ adresy a jasně vysvětli, proč se domnívÃĄÅĄ, Åūe rozhodnutí bylo nesprÃĄvnÃĐ. TvÃĐ odvolÃĄní přezkoumÃĄme a odpovíme ti s naÅĄÃ­m rozhodnutím.\n\n– Bezpečnostní tÃ―m {product_name}"
"subject": "VÃĄÅĄ Účet {product_name} byl dočasně pozastaven",
"body": "DobrÃ― den, {username},\n\nVÃĄÅĄ Účet {product_name} byl dočasně pozastaven kvÅŊli poruÅĄení naÅĄich podmínek sluÅūby nebo komunitních pravidel.\n\nDoba trvÃĄní: {durationHours, plural,\n one {# hodina}\n few {# hodiny}\n many {# hodiny}\n other {# hodin}\n}\nPozastaven do: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {DÅŊvod: {reason}}\n}\n\nBěhem tÃĐto doby nebudete mít přístup ke svÃĐmu Účtu.\n\nPřečtěte si:\n- Podmínky sluÅūby: {termsUrl}\n- Komunitní pravidla: {guidelinesUrl}\n\nPokud se domnívÃĄte, Åūe toto rozhodnutí bylo nesprÃĄvnÃĐ nebo neopodstatněnÃĐ, mÅŊÅūete podat odvolÃĄní. PoÅĄlete e-mail na {appeals_email} z tÃĐto e-mailovÃĐ adresy a jasně vysvětlete, proč povaÅūujete rozhodnutí za nesprÃĄvnÃĐ. VaÅĄe odvolÃĄní přezkoumÃĄme a sdělíme vÃĄm svÃĐ rozhodnutí.\n\n– Bezpečnostní tÃ―m {product_name}"
},
"donation_confirmation": {
"subject": "Děkujeme za tvÅŊj dar na {product_name}",
"body": "Ahoj,\n\nDěkujeme za tvÅŊj dar pro {product_name}! TvÅŊj {interval, select,\n month {opakovanÃ― dar}\n year {opakovanÃ― dar}\n other {jednorÃĄzovÃ― dar}\n} byl {interval, select,\n month {nastaven}\n year {nastaven}\n other {zpracovÃĄn}\n} ÚspÄ›ÅĄně.\n\nPodrobnosti o daru:\nÄŒÃĄstka: {amount} {currency} {interval, select,\n month {měsíčně}\n year {ročně}\n other {}\n}\n\nStripe ti brzy zaÅĄle samostatnou Účtenku s PDF fakturou. Ta obsahuje vÅĄechny platební Údaje a mÅŊÅūe bÃ―t pouÅūita pro daňovÃĐ ÃšÄely.\n\nHistorii svÃ―ch darÅŊ, stahovÃĄní faktur {interval, select,\n month {a sprÃĄvu nebo zruÅĄení předplatnÃĐho}\n year {a sprÃĄvu nebo zruÅĄení předplatnÃĐho}\n other {a sprÃĄvu budoucích darÅŊ}\n} mÅŊÅūeÅĄ kdykoli zobrazit pomocí tohoto odkazu:\n\n{manageUrl}\n\nTvÃĄ podpora pomÃĄhÃĄ udrÅūovat {product_name} v chodu. Děkujeme!\n\n– TÃ―m {product_name}"
"subject": "Děkujeme za vÃĄÅĄ dar pro {product_name}",
"body": "DobrÃ― den,\n\nDěkujeme za vÃĄÅĄ dar pro {product_name}! VÃĄÅĄ {interval, select,\n month {opakovanÃ― dar}\n year {opakovanÃ― dar}\n other {jednorÃĄzovÃ― dar}\n} byl ÚspÄ›ÅĄně {interval, select,\n month {nastaven}\n year {nastaven}\n other {zpracovÃĄn}\n}.\n\nPodrobnosti o daru:\nÄŒÃĄstka: {amount} {interval, select,\n month {měsíčně}\n year {ročně}\n other {}\n}\n\nStripe vÃĄm brzy poÅĄle samostatnÃĐ potvrzení platby s fakturou v PDF. Obsahuje vÅĄechny platební Údaje a lze ho pouÅūít pro daňovÃĐ ÃšÄely.\n\nPomocí tohoto odkazu si mÅŊÅūete kdykoli prohlÃĐdnout historii svÃ―ch darÅŊ, stÃĄhnout faktury {interval, select,\n month {a spravovat nebo zruÅĄit předplatnÃĐ}\n year {a spravovat nebo zruÅĄit předplatnÃĐ}\n other {a spravovat budoucí dary}\n}:\n\n{manageUrl}\n\nVaÅĄe podpora pomÃĄhÃĄ udrÅūovat {product_name} v chodu. Děkujeme!\n\n– TÃ―m {product_name}"
},
"donation_magic_link": {
"subject": "Spravuj svÃĐ dary pro {product_name}",
"body": "Ahoj,\n\nKlikni na odkaz níÅūe pro přístup k portÃĄlu pro dÃĄrce:\n\n{manageUrl}\n\nV portÃĄlu mÅŊÅūeÅĄ spravovat předplatnÃĄ, stahovat faktury a prohlíÅūet si historii svÃ―ch darÅŊ.\n\nTento odkaz vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jsi tento odkaz nepoÅūadoval, mÅŊÅūeÅĄ tento e-mail klidně ignorovat.\n\n– TÃ―m {product_name}"
"subject": "Spravujte svÃĐ dary pro {product_name}",
"body": "DobrÃ― den,\n\nKliknutím na odkaz níÅūe otevřete portÃĄl pro dÃĄrce:\n\n{manageUrl}\n\nNa portÃĄlu mÅŊÅūete spravovat předplatnÃĄ, stahovat faktury a prohlíÅūet si historii svÃ―ch darÅŊ.\n\nPlatnost tohoto odkazu vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jste si tento odkaz nevyÅūÃĄdali, mÅŊÅūete tento e-mail bez obav ignorovat.\n\n– TÃ―m {product_name}"
},
"dsa_report_verification": {
"subject": "Ověř svÅŊj e-mail pro nahlÃĄÅĄení podle DSA",
"body": "Ahoj,\n\nPouÅūij ověřovací kÃģd níÅūe k odeslÃĄní svÃĐho nahlÃĄÅĄení podle zÃĄkona o digitÃĄlních sluÅūbÃĄch na {product_name}:\n\n{code}\n\nTento kÃģd vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jsi o to neÅūÃĄdal, mÅŊÅūeÅĄ tento e-mail ignorovat.\n\n– Bezpečnostní tÃ―m {product_name}"
"subject": "Ověřte svÅŊj e-mail pro nahlÃĄÅĄení podle DSA",
"body": "DobrÃ― den,\n\nPomocí ověřovacího kÃģdu níÅūe odeÅĄlete svÃĐ nahlÃĄÅĄení podle nařízení o digitÃĄlních sluÅūbÃĄch na {product_name}:\n\n{code}\n\nPlatnost tohoto kÃģdu vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jste si tento kÃģd nevyÅūÃĄdali, mÅŊÅūete tento e-mail ignorovat.\n\n– Bezpečnostní tÃ―m {product_name}"
},
"email_change_new": {
"subject": "Ověř svÅŊj novÃ― e-mail pro {product_name}",
"body": "Ahoj {username},\n\nZadej tento kÃģd do aplikace pro ověření tvÃĐho novÃĐho e-mailu pro {product_name}:\n\n{code}\n\nTento kÃģd vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jsi o to neÅūÃĄdal, mÅŊÅūeÅĄ tento e-mail ignorovat.\n\n– TÃ―m {product_name}"
"subject": "Ověřte svou novou e-mailovou adresu pro {product_name}",
"body": "DobrÃ― den, {username},\n\nZadÃĄním tohoto kÃģdu v aplikaci ověříte svou novou e-mailovou adresu pro {product_name}:\n\n{code}\n\nPlatnost tohoto kÃģdu vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jste si tento kÃģd nevyÅūÃĄdali, mÅŊÅūete tento e-mail ignorovat.\n\n– TÃ―m {product_name}"
},
"email_change_original": {
"subject": "Potvrď změnu e-mailu pro {product_name}",
"body": "Ahoj {username},\n\nObdrÅūeli jsme poÅūadavek na změnu e-mailovÃĐ adresy tvÃĐho Účtu {product_name}.\n\nPro potvrzení tÃĐto změny zadej tento kÃģd do aplikace:\n\n{code}\n\nTento kÃģd vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jsi o to neÅūÃĄdal, zabezpeč si svÅŊj Účet ihned.\n\n– TÃ―m {product_name}"
"subject": "Potvrďte změnu e-mailovÃĐ adresy pro {product_name}",
"body": "DobrÃ― den, {username},\n\nObdrÅūeli jsme ÅūÃĄdost o změnu e-mailovÃĐ adresy vaÅĄeho Účtu {product_name}.\n\nZměnu potvrďte zadÃĄním tohoto kÃģdu v aplikaci:\n\n{code}\n\nPlatnost tohoto kÃģdu vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jste o tuto změnu neÅūÃĄdali, ihned svÅŊj Účet zabezpečte.\n\n– TÃ―m {product_name}"
},
"email_change_revert": {
"subject": "TvÅŊj e-mail pro {product_name} byl změněn",
"body": "Ahoj {username},\n\nE-mailovÃĄ adresa tvÃĐho Účtu {product_name} byla změněna na {newEmail}.\n\nPokud jsi tuto změnu provedl ty, není potřeba ÅūÃĄdnÃĄ akce. Pokud ne, mÅŊÅūeÅĄ změnu vrÃĄtit zpět a zabezpečit svÅŊj Účet pomocí tohoto odkazu:\n\n{revertUrl}\n\nTím se obnoví tvÅŊj předchozí e-mail, odhlÃĄsÃ­ÅĄ se vÅĄude, odstraní se propojenÃĄ telefonní čísla, deaktivuje se MFA a budeÅĄ muset nastavit novÃĐ heslo.\n\n– Bezpečnostní tÃ―m {product_name}"
"subject": "VaÅĄe e-mailovÃĄ adresa pro {product_name} byla změněna",
"body": "DobrÃ― den, {username},\n\nE-mailovÃĄ adresa vaÅĄeho Účtu {product_name} byla změněna na {newEmail}.\n\nPokud jste tuto změnu provedli vy, nemusíte nic dělat. Pokud ne, mÅŊÅūete ji vrÃĄtit zpět a zabezpečit svÅŊj Účet pomocí tohoto odkazu:\n\n{revertUrl}\n\nTím se obnoví vaÅĄe předchozí e-mailovÃĄ adresa, budete odhlÃĄÅĄeni ze vÅĄech zařízení, odstraní se propojenÃĄ telefonní čísla, vypne se vícefaktorovÃĐ ověřovÃĄní a budete muset nastavit novÃĐ heslo.\n\n– Bezpečnostní tÃ―m {product_name}"
},
"email_verification": {
"subject": "Ověř svou e-mailovou adresu pro {product_name}",
"body": "Ahoj {username},\n\nOvěř e-mailovou adresu svÃĐho Účtu {product_name} kliknutím na odkaz níÅūe:\n\n{verifyUrl}\n\nPokud jsi si Účet {product_name} nevytvořil, mÅŊÅūeÅĄ tento e-mail klidně ignorovat.\n\nTento odkaz je platnÃ― 24 hodin.\n\n– TÃ―m {product_name}"
"subject": "Ověřte svou e-mailovou adresu pro {product_name}",
"body": "DobrÃ― den, {username},\n\nKliknutím na odkaz níÅūe ověřte e-mailovou adresu svÃĐho Účtu {product_name}:\n\n{verifyUrl}\n\nPokud jste si Účet {product_name} nevytvořili, mÅŊÅūete tento e-mail bez obav ignorovat.\n\nTento odkaz je platnÃ― 24 hodin.\n\n– TÃ―m {product_name}"
},
"gift_chargeback_notification": {
"subject": "VÃ―hody z uplatněnÃĐho dÃĄrku byly odstraněny",
"body": "Ahoj {username},\n\nDÃĄrkovÃ― kÃģd, kterÃ― jsi uplatnil, byl pÅŊvodně zaplacen někÃ―m jinÃ―m. Tato platba byla mezitím zruÅĄena (chargeback).\n\nZ tohoto dÅŊvodu jsme odstranili vÃ―hody, kterÃĐ byly přidÃĄny k tvÃĐmu Účtu, kdyÅū jsi dÃĄrek uplatnil.\n\nPokud si myslÃ­ÅĄ, Åūe se jednÃĄ o chybu, kontaktuj prosím nÃĄÅĄ tÃ―m podpory a uveď veÅĄkerÃĐ podrobnosti, kterÃĐ mÃĄÅĄ o dÃĄrkovÃĐm kÃģdu a o tom, kdy jsi ho uplatnil.\n\n– TÃ―m {product_name}"
"body": "DobrÃ― den, {username},\n\nDÃĄrkovÃ― kÃģd, kterÃ― jste uplatnili, pÅŊvodně zaplatil někdo jinÃ―. Tato platba byla nÃĄsledně vrÃĄcena na zÃĄkladě reklamace (chargeback).\n\nProto jsme odebrali vÃ―hody, kterÃĐ vÃĄÅĄ Účet získal při uplatnění dÃĄrku.\n\nPokud se domnívÃĄte, Åūe jde o chybu, kontaktujte nÃĄÅĄ tÃ―m podpory a uveďte vÅĄechny dostupnÃĐ podrobnosti o dÃĄrkovÃĐm kÃģdu a o tom, kdy jste ho uplatnili.\n\n– TÃ―m {product_name}"
},
"harvest_completed": {
"subject": "Export tvÃ―ch dat z {product_name} je připraven ke staÅūení",
"body": "Ahoj {username},\n\nTvÅŊj export dat je připraven.\n\nOdkaz ke staÅūení:\n{downloadUrl}\n\nZahrnutÃĐ zprÃĄvy: {totalMessages, number}\nVelikost souboru: {fileSizeMB, number} MB\n\nTento odkaz vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jsi o tento export neÅūÃĄdal, okamÅūitě si změň heslo a kontaktuj nÃĄÅĄ tÃ―m podpory.\n\n– TÃ―m {product_name}"
"subject": "Export vaÅĄich dat z {product_name} je připraven ke staÅūení",
"body": "DobrÃ― den, {username},\n\nExport vaÅĄich dat je připraven.\n\nOdkaz ke staÅūení:\n{downloadUrl}\n\nPočet zahrnutÃ―ch zprÃĄv: {totalMessages, number}\nVelikost souboru: {fileSizeMB, number} MB\n\nPlatnost tohoto odkazu vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jste si tento export nevyÅūÃĄdali, okamÅūitě si změňte heslo a kontaktujte nÃĄÅĄ tÃ―m podpory.\n\n– TÃ―m {product_name}"
},
"inactivity_warning": {
"subject": "TvÅŊj Účet {product_name} bude smazÃĄn kvÅŊli neaktivitě",
"body": "Ahoj {username},\n\nNezaznamenali jsme ÅūÃĄdnou aktivitu na tvÃĐm Účtu {product_name} od {lastActiveDate, date, full}.\n\nPokud se nepřihlÃĄsÃ­ÅĄ do {deletionDate, date, full} v {deletionDate, time, short}, tvÅŊj Účet bude trvale smazÃĄn kvÅŊli neaktivitě.\n\nPřihlas se zde:\n{loginUrl}\n\nPokud jsi {product_name} nedÃĄvno pouÅūíval, kontaktuj nÃĄÅĄ tÃ―m podpory ihned.\n\n– TÃ―m {product_name}"
"subject": "VÃĄÅĄ Účet {product_name} bude smazÃĄn kvÅŊli neaktivitě",
"body": "DobrÃ― den, {username},\n\nOd {lastActiveDate, date, full} jsme na vaÅĄem Účtu {product_name} nezaznamenali ÅūÃĄdnou aktivitu.\n\nPokud se nepřihlÃĄsíte do {deletionDate, date, full} v {deletionDate, time, short}, vÃĄÅĄ Účet bude kvÅŊli neaktivitě trvale smazÃĄn.\n\nPřihlaste se zde:\n{loginUrl}\n\nPokud jste {product_name} v poslední době pouÅūívali, ihned kontaktujte nÃĄÅĄ tÃ―m podpory.\n\n– TÃ―m {product_name}"
},
"ip_authorization": {
"subject": "Povolit přihlÃĄÅĄení z novÃĐ IP adresy",
"body": "Ahoj {username},\n\nZaznamenali jsme pokus o přihlÃĄÅĄení k tvÃĐmu Účtu {product_name} z novÃĐ IP adresy:\n\nIP adresa: {ipAddress}\nPoloha: {location}\n\nPokud jsi to byl ty, autorizuj tuto IP adresu kliknutím na odkaz níÅūe:\n\n{authUrl}\n\nPokud jsi se nepřihlaÅĄoval, okamÅūitě si změň heslo.\n\nTento odkaz je platnÃ― 30 minut.\n\n– TÃ―m {product_name}"
"body": "DobrÃ― den, {username},\n\nZaznamenali jsme pokus o přihlÃĄÅĄení k vaÅĄemu Účtu {product_name} z novÃĐ IP adresy:\n\nIP adresa: {ipAddress}\nPoloha: {location}\n\nPokud jste to byli vy, povolte tuto IP adresu kliknutím na odkaz níÅūe:\n\n{authUrl}\n\nPokud jste se nepokouÅĄeli přihlÃĄsit, ihned si změňte heslo.\n\nTento odkaz je platnÃ― 30 minut.\n\n– TÃ―m {product_name}"
},
"mfa_backup_codes_view": {
"subject": "Potvrď přístup k zÃĄloÅūním kÃģdÅŊm pro {product_name}",
"body": "Ahoj {username},\n\nObdrÅūeli jsme poÅūadavek na zobrazení zÃĄloÅūních kÃģdÅŊ tvÃĐho Účtu {product_name}.\n\nPro potvrzení tohoto poÅūadavku zadej tento kÃģd do aplikace:\n\n{code}\n\nTento kÃģd vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jsi o to neÅūÃĄdal, někdo mÅŊÅūe mít přístup k tvÃĐmu Účtu. OkamÅūitě si změň heslo.\n\n– TÃ―m {product_name}"
"subject": "Potvrďte přístup k zÃĄloÅūním kÃģdÅŊm pro {product_name}",
"body": "DobrÃ― den, {username},\n\nObdrÅūeli jsme ÅūÃĄdost o zobrazení zÃĄloÅūních kÃģdÅŊ vaÅĄeho Účtu {product_name}.\n\nÅ―ÃĄdost potvrďte zadÃĄním tohoto kÃģdu v aplikaci:\n\n{code}\n\nPlatnost tohoto kÃģdu vyprÅĄÃ­ dne {expiresAt, date, full} v {expiresAt, time, short}.\n\nPokud jste o to neÅūÃĄdali, někdo mÅŊÅūe mít přístup k vaÅĄemu Účtu. OkamÅūitě si změňte heslo.\n\n– TÃ―m {product_name}"
},
"password_change_verification": {
"subject": "Potvrď změnu hesla k {product_name}",
"body": "Ahoj {username},\n\nObdrÅūeli jsme poÅūadavek na změnu hesla k tvÃĐmu Účtu pro {product_name}.\n\nPro potvrzení tÃĐto změny zadej tento kÃģd do aplikace:\n\n{code}\n\nTento kÃģd vyprÅĄÃ­ v {expiresAt}.\n\nPokud jsi o to neÅūÃĄdal, někdo mÅŊÅūe mít přístup k tvÃĐmu Účtu. OkamÅūitě si změň heslo a povol dvoufaktorovÃĐ ověřovÃĄní.\n\n– TÃ―m {product_name}"
"subject": "Potvrďte změnu hesla k Účtu {product_name}",
"body": "DobrÃ― den, {username},\n\nObdrÅūeli jsme ÅūÃĄdost o změnu hesla k vaÅĄemu Účtu {product_name}.\n\nZměnu potvrďte zadÃĄním tohoto kÃģdu v aplikaci:\n\n{code}\n\nPlatnost tohoto kÃģdu vyprÅĄÃ­ v {expiresAt}.\n\nPokud jste o to neÅūÃĄdali, někdo mÅŊÅūe mít přístup k vaÅĄemu Účtu. OkamÅūitě si změňte heslo a zapněte dvoufaktorovÃĐ ověřovÃĄní.\n\n– TÃ―m {product_name}"
},
"password_reset": {
"subject": "Obnov svÃĐ heslo k {product_name}",
"body": "Ahoj {username},\n\nPoÅūÃĄdal jsi o reset hesla pro {product_name}. PouÅūij odkaz níÅūe pro nastavení novÃĐho hesla:\n\n{resetUrl}\n\nPokud jsi o to neÅūÃĄdal, mÅŊÅūeÅĄ tento e-mail klidně ignorovat.\n\nTento odkaz je platnÃ― 1 hodinu.\n\n– TÃ―m {product_name}"
"subject": "Obnovte svÃĐ heslo k Účtu {product_name}",
"body": "DobrÃ― den, {username},\n\nPoÅūÃĄdali jste o obnovení hesla k Účtu {product_name}. Pomocí odkazu níÅūe si nastavte novÃĐ heslo:\n\n{resetUrl}\n\nPokud jste o to neÅūÃĄdali, mÅŊÅūete tento e-mail bez obav ignorovat.\n\nTento odkaz je platnÃ― 1 hodinu.\n\n– TÃ―m {product_name}"
},
"registration_approved": {
"subject": "TvÃĄ registrace k {product_name} byla schvÃĄlena",
"body": "Ahoj {username},\n\nDobrÃĐ zprÃĄvy: tvÃĄ registrace do {product_name} byla schvÃĄlena.\n\nNyní se mÅŊÅūeÅĄ přihlÃĄsit do aplikace {product_name} zde:\n{channelsUrl}\n\nVítej v komunitě {product_name}.\n\n– TÃ―m {product_name}"
"subject": "VaÅĄe registrace do {product_name} byla schvÃĄlena",
"body": "DobrÃ― den, {username},\n\nDobrÃĄ zprÃĄva: vaÅĄe registrace do {product_name} byla schvÃĄlena.\n\nNyní se mÅŊÅūete přihlÃĄsit do aplikace {product_name} zde:\n{channelsUrl}\n\nVítejte v komunitě {product_name}.\n\n– TÃ―m {product_name}"
},
"report_resolved": {
"subject": "TvÃĐ nahlÃĄÅĄení pro {product_name} bylo zkontrolovÃĄno",
"body": "Ahoj {username},\n\nTvÃĐ nahlÃĄÅĄení (ID: {reportId}) bylo zkontrolovÃĄno naÅĄÃ­m bezpečnostním tÃ―mem.{hasComment, select, yes {\n\nOdpověď od bezpečnostního tÃ―mu:\n{publicComment}} other {}}\n\nDěkujeme, Åūe pomÃĄhÃĄÅĄ udrÅūovat {product_name} bezpečnÃ― pro vÅĄechny. VÅĄechna nahlÃĄÅĄení bereme vÃĄÅūně a oceňujeme tvÅŊj příspěvek komunitě.\n\nPokud mÃĄÅĄ jakÃĐkoli dotazy nebo obavy ohledně tohoto vÃ―sledku, kontaktuj {safety_email}.\n\n– Bezpečnostní tÃ―m {product_name}"
"subject": "VaÅĄe nahlÃĄÅĄení na {product_name} bylo přezkoumÃĄno",
"body": "DobrÃ― den, {username},\n\nNÃĄÅĄ bezpečnostní tÃ―m přezkoumal vaÅĄe nahlÃĄÅĄení (ID: {reportId}).{hasComment, select, yes {\n\nOdpověď bezpečnostního tÃ―mu:\n{publicComment}} other {}}\n\nDěkujeme, Åūe pomÃĄhÃĄte udrÅūovat {product_name} bezpečnÃ― pro vÅĄechny. VÅĄechna nahlÃĄÅĄení bereme vÃĄÅūně a vÃĄÅūíme si vaÅĄeho přínosu komunitě.\n\nPokud mÃĄte k tomuto vÃ―sledku jakÃĐkoli dotazy nebo vÃ―hrady, kontaktujte {safety_email}.\n\n– Bezpečnostní tÃ―m {product_name}"
},
"scheduled_deletion_notification": {
"subject": "TvÅŊj Účet {product_name} bude trvale smazÃĄn",
"body": "Ahoj {username},\n\nTvÅŊj Účet {product_name} byl naplÃĄnovÃĄn k trvalÃĐmu smazÃĄní.\n\nNaplÃĄnovanÃĐ smazÃĄní: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {DÅŊvod: {reason}}\n}\n\nJednÃĄ se o zÃĄvaÅūnÃĐ opatření. TvÃĄ data Účtu budou trvale smazÃĄna v naplÃĄnovanÃ― den.\n\nPokud se domnívÃĄÅĄ, Åūe toto rozhodnutí o vynucení bylo nesprÃĄvnÃĐ, mÅŊÅūeÅĄ podat odvolÃĄní. OdeÅĄli e-mail na {appeals_email} z tÃĐto e-mailovÃĐ adresy.\n\n– Bezpečnostní tÃ―m {product_name}"
"subject": "VÃĄÅĄ Účet {product_name} bude trvale smazÃĄn",
"body": "DobrÃ― den, {username},\n\nBylo naplÃĄnovÃĄno trvalÃĐ smazÃĄní vaÅĄeho Účtu {product_name}.\n\nNaplÃĄnovanÃĐ smazÃĄní: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {DÅŊvod: {reason}}\n}\n\nJednÃĄ se o zÃĄvaÅūnÃĐ opatření. Data vaÅĄeho Účtu budou v naplÃĄnovanÃ― den trvale smazÃĄna.\n\nPokud se domnívÃĄte, Åūe toto rozhodnutí bylo nesprÃĄvnÃĐ, mÅŊÅūete podat odvolÃĄní. PoÅĄlete e-mail na {appeals_email} z tÃĐto e-mailovÃĐ adresy.\n\n– Bezpečnostní tÃ―m {product_name}"
},
"self_deletion_scheduled": {
"subject": "SmazÃĄní tvÃĐho Účtu {product_name} je naplÃĄnovÃĄno",
"body": "Ahoj {username},\n\nPoÅūÃĄdal jsi o smazÃĄní svÃĐho Účtu {product_name}. TvÅŊj Účet je naplÃĄnovÃĄn k trvalÃĐmu smazÃĄní na:\n\n{deletionDate, date, full} v {deletionDate, time, short}\n\nPokud jsi to nepoÅūadoval, přihlas se ke svÃĐmu Účtu a zruÅĄ smazÃĄní. Doporučujeme takÃĐ změnit si heslo pro zabezpečení Účtu.\n\n– TÃ―m {product_name}"
"subject": "SmazÃĄní vaÅĄeho Účtu {product_name} je naplÃĄnovÃĄno",
"body": "DobrÃ― den, {username},\n\nPoÅūÃĄdali jste o smazÃĄní svÃĐho Účtu {product_name}. TrvalÃĐ smazÃĄní je naplÃĄnovÃĄno na:\n\n{deletionDate, date, full} v {deletionDate, time, short}\n\nPokud jste o smazÃĄní neÅūÃĄdali, přihlaste se ke svÃĐmu Účtu a smazÃĄní zruÅĄte. Doporučujeme takÃĐ změnit heslo, abyste svÅŊj Účet zabezpečili.\n\n– TÃ―m {product_name}"
},
"unban_notification": {
"subject": "Pozastavení tvÃĐho Účtu {product_name} bylo zruÅĄeno",
"body": "Ahoj {username},\n\nDobrÃĐ zprÃĄvy: pozastavení tvÃĐho Účtu {product_name} bylo zruÅĄeno.\n\n{reason, select,\n null {}\n other {DÅŊvod: {reason}}\n}\n\nNyní se mÅŊÅūeÅĄ znovu přihlÃĄsit a pokračovat v pouÅūívÃĄní {product_name} jako obvykle.\n\n– Bezpečnostní tÃ―m {product_name}"
"subject": "Pozastavení vaÅĄeho Účtu {product_name} bylo zruÅĄeno",
"body": "DobrÃ― den, {username},\n\nDobrÃĄ zprÃĄva: pozastavení vaÅĄeho Účtu {product_name} bylo zruÅĄeno.\n\n{reason, select,\n null {}\n other {DÅŊvod: {reason}}\n}\n\nNyní se mÅŊÅūete znovu přihlÃĄsit a pouÅūívat {product_name} jako obvykle.\n\n– Bezpečnostní tÃ―m {product_name}"
}
});
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_DA_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Din {product_name}-konto er midlertidigt deaktiveret",
"body": "Hej {username},\n\nVi har midlertidigt deaktiveret din {product_name}-konto, fordi vi har registreret mistÃĶnkelig aktivitet.\n\n{reason, select,\n null {}\n other {Årsag: {reason}}\n}\n\nFor at fÃĨ adgang til din konto igen skal du nulstille din adgangskode:\n\n{forgotUrl}\n\nNÃĨr du har nulstillet din adgangskode, kan du logge ind igen.\n\nHvis du mener, at dette er sket ved en fejl, kan du kontakte vores supportteam.\n\n– {product_name} Safety Team"
"body": "Hej {username},\n\nVi har midlertidigt deaktiveret din {product_name}-konto, fordi vi har registreret mistÃĶnkelig aktivitet.\n\n{reason, select,\n null {}\n other {Årsag: {reason}}\n}\n\nFor at fÃĨ adgang til din konto igen skal du nulstille din adgangskode:\n\n{forgotUrl}\n\nNÃĨr du har nulstillet din adgangskode, kan du logge ind igen.\n\nHvis du mener, at dette er sket ved en fejl, kan du kontakte vores supportteam.\n\n– Sikkerhedsteamet hos {product_name}"
},
"account_scheduled_deletion": {
"subject": "Din {product_name}-konto slettes permanent",
"body": "Hej {username},\n\nDin {product_name}-konto er planlagt til permanent sletning pÃĨ grund af overtrÃĶdelser af vores servicevilkÃĨr eller retningslinjer for community'et.\n\nPlanlagt sletning: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Årsag: {reason}}\n}\n\nDette er en alvorlig hÃĨndhÃĶvelseshandling. Dine kontodata bliver permanent slettet pÃĨ den planlagte dato.\n\nGennemgÃĨ:\n- ServicevilkÃĨr: {termsUrl}\n- Retningslinjer for community'et: {guidelinesUrl}\n\nAnkeproces:\nHvis du mener, at denne hÃĨndhÃĶvelsesbeslutning var forkert eller uberettiget, har du 60 dage til at indsende en anke. Send en e-mail til {appeals_email} fra denne e-mailadresse.\n\nI din anke:\n- Forklar tydeligt, hvorfor du mener, at hÃĨndhÃĶvelsesbeslutningen var forkert eller uberettiget\n- FremlÃĶg relevant bevis eller kontekst\n\nEt medlem af {product_name} Safety Team vil gennemgÃĨ din anke og kan sÃĶtte den afventende sletning pÃĨ pause, indtil en endelig beslutning er truffet.\n\n– {product_name} Safety Team"
"body": "Hej {username},\n\nVi har planlagt at slette din {product_name}-konto permanent pÃĨ grund af overtrÃĶdelser af vores servicevilkÃĨr eller retningslinjer for fÃĶllesskabet.\n\nPlanlagt sletning: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Årsag: {reason}}\n}\n\nDette er en alvorlig sanktion. Dine kontodata bliver permanent slettet pÃĨ den planlagte dato.\n\nGennemgÃĨ:\n- ServicevilkÃĨr: {termsUrl}\n- Retningslinjer for fÃĶllesskabet: {guidelinesUrl}\n\nKlageproces:\nHvis du mener, at denne beslutning om sanktioner var forkert eller uberettiget, har du 60 dage til at indsende en klage. Send en e-mail til {appeals_email} fra denne e-mailadresse.\n\nI din klage:\n- Forklar tydeligt, hvorfor du mener, at beslutning om sanktioneren var forkert eller uberettiget\n- FremlÃĶg relevant dokumentation eller kontekst\n\nEt medlem af sikkerhedsteamet hos {product_name} vil gennemgÃĨ din klage og kan sÃĶtte den afventende sletning pÃĨ pause, indtil en endelig beslutning er truffet.\n\n– Sikkerhedsteamet hos {product_name}"
},
"account_temp_banned": {
"subject": "Din {product_name}-konto er midlertidigt suspenderet",
"body": "Hej {username},\n\nDin {product_name}-konto er midlertidigt suspenderet for at overtrÃĶde vores servicevilkÃĨr eller retningslinjer for community'et.\n\nVarighed: {durationHours, plural,\n =1 {1 time}\n other {# timer}\n}\nSuspenderet indtil: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Årsag: {reason}}\n}\n\nI denne periode vil du ikke kunne fÃĨ adgang til din konto.\n\nGennemgÃĨ:\n- ServicevilkÃĨr: {termsUrl}\n- Retningslinjer for community'et: {guidelinesUrl}\n\nHvis du mener, at denne hÃĨndhÃĶvelsesbeslutning var forkert eller uberettiget, kan du indsende en anke. Send en e-mail til {appeals_email} fra denne e-mailadresse og forklar tydeligt, hvorfor du mener, at beslutningen var forkert. Vi vil gennemgÃĨ din anke og svare med vores beslutning.\n\n– {product_name} Safety Team"
"body": "Hej {username},\n\nDin {product_name}-konto er midlertidigt suspenderet pÃĨ grund af overtrÃĶdelser af vores servicevilkÃĨr eller retningslinjer for fÃĶllesskabet.\n\nVarighed: {durationHours, plural,\n =1 {1 time}\n other {# timer}\n}\nSuspenderet indtil: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Årsag: {reason}}\n}\n\nI denne periode vil du ikke kunne fÃĨ adgang til din konto.\n\nGennemgÃĨ:\n- ServicevilkÃĨr: {termsUrl}\n- Retningslinjer for fÃĶllesskabet: {guidelinesUrl}\n\nHvis du mener, at denne beslutning om sanktioner var forkert eller uberettiget, kan du indsende en klage. Send en e-mail til {appeals_email} fra denne e-mailadresse og forklar tydeligt, hvorfor du mener, at beslutningen var forkert. Vi gennemgÃĨr din klage og giver dig besked om vores afgÃļrelse.\n\n– Sikkerhedsteamet hos {product_name}"
},
"donation_confirmation": {
"subject": "Tak for din {product_name}-donation",
"body": "Hej,\n\nTak for din donation til {product_name}! Din {interval, select,\n month {tilbagevendende donation}\n year {tilbagevendende donation}\n other {engangsdonation}\n} er blevet {interval, select,\n month {opsat}\n year {opsat}\n other {behandlet}\n} med succes.\n\nDonationsdetaljer:\nBelÃļb: {amount} {currency} {interval, select,\n month {pr. mÃĨned}\n year {pr. ÃĨr}\n other {}\n}\n\nStripe sender dig en separat kvittering med din faktura-PDF inden lÃĶnge. Denne inkluderer alle betalingsdetaljer og kan bruges til skatteformÃĨl.\n\nDu kan til enhver tid se din donationshistorik, downloade fakturaer, {interval, select,\n month {og administrere eller annullere dit abonnement}\n year {og administrere eller annullere dit abonnement}\n other {og administrere fremtidige donationer}\n} ved at bruge dette link:\n\n{manageUrl}\n\nDin stÃļtte hjÃĶlper med at holde {product_name} kÃļrende. Tak!\n\n– {product_name} Team"
"body": "Hej,\n\nTak for din donation til {product_name}! Din {interval, select,\n month {lÃļbende donation}\n year {lÃļbende donation}\n other {engangsdonation}\n} er blevet {interval, select,\n month {oprettet}\n year {oprettet}\n other {gennemfÃļrt}\n}.\n\nDonationsdetaljer:\nBelÃļb: {amount} {interval, select,\n month {pr. mÃĨned}\n year {pr. ÃĨr}\n other {}\n}\n\nStripe sender dig en separat kvittering med din faktura som PDF inden lÃĶnge. Kvitteringen indeholder alle betalingsdetaljer og kan bruges til skatteformÃĨl.\n\nDu kan til enhver tid se din donationshistorik, downloade fakturaer {interval, select,\n month {og administrere eller opsige dit abonnement}\n year {og administrere eller opsige dit abonnement}\n other {og administrere fremtidige donationer}\n} ved at bruge dette link:\n\n{manageUrl}\n\nDin stÃļtte hjÃĶlper med at holde {product_name} kÃļrende. Tak!\n\n– Teamet bag {product_name}"
},
"donation_magic_link": {
"subject": "Administrer dine {product_name}-donationer",
"body": "Hej,\n\nKlik pÃĨ linket nedenfor for at fÃĨ adgang til din donorportal:\n\n{manageUrl}\n\nI portalen kan du administrere abonnementer, downloade fakturaer og se din donationshistorik.\n\nDette link udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om dette link, kan du trygt ignorere denne e-mail.\n\n– {product_name} Team"
"body": "Hej,\n\nKlik pÃĨ linket nedenfor for at fÃĨ adgang til din donorportal:\n\n{manageUrl}\n\nI portalen kan du administrere abonnementer, downloade fakturaer og se din donationshistorik.\n\nDette link udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om dette link, kan du trygt ignorere denne e-mail.\n\n– Teamet bag {product_name}"
},
"dsa_report_verification": {
"subject": "BekrÃĶft din e-mail til en DSA-rapport",
"body": "Hej,\n\nBrug bekrÃĶftelseskoden nedenfor til at indsende din Digital Services Act-rapport for {product_name}:\n\n{code}\n\nDenne kode udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om dette, kan du ignorere denne e-mail.\n\n– {product_name} Safety Team"
"subject": "BekrÃĶft din e-mailadresse til en DSA-anmeldelse",
"body": "Hej,\n\nBrug bekrÃĶftelseskoden nedenfor til at indsende din anmeldelse i henhold til Digital Services Act pÃĨ {product_name}:\n\n{code}\n\nDenne kode udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om dette, kan du ignorere denne e-mail.\n\n– Sikkerhedsteamet hos {product_name}"
},
"email_change_new": {
"subject": "BekrÃĶft din nye {product_name}-e-mail",
"body": "Hej {username},\n\nIndtast denne kode i appen for at bekrÃĶfte din nye {product_name}-e-mail:\n\n{code}\n\nDenne kode udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om dette, kan du ignorere denne e-mail.\n\n– {product_name} Team"
"subject": "BekrÃĶft din nye e-mailadresse til {product_name}",
"body": "Hej {username},\n\nIndtast denne kode i appen for at bekrÃĶfte din nye e-mailadresse til {product_name}:\n\n{code}\n\nDenne kode udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om dette, kan du ignorere denne e-mail.\n\n– Teamet bag {product_name}"
},
"email_change_original": {
"subject": "BekrÃĶft din {product_name}-e-mail-ÃĶndring",
"body": "Hej {username},\n\nVi har modtaget en anmodning om at ÃĶndre e-mailadressen pÃĨ din {product_name}-konto.\n\nFor at bekrÃĶfte denne ÃĶndring skal du indtaste denne kode i appen:\n\n{code}\n\nDenne kode udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om dette, skal du sikre din konto med det samme.\n\n– {product_name} Team"
"subject": "BekrÃĶft ÃĶndringen af din e-mailadresse til {product_name}",
"body": "Hej {username},\n\nVi har modtaget en anmodning om at ÃĶndre e-mailadressen pÃĨ din {product_name}-konto.\n\nFor at bekrÃĶfte denne ÃĶndring skal du indtaste denne kode i appen:\n\n{code}\n\nDenne kode udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om dette, skal du sikre din konto med det samme.\n\n– Teamet bag {product_name}"
},
"email_change_revert": {
"subject": "Din {product_name}-e-mail blev ÃĶndret",
"body": "Hej {username},\n\nE-mailadressen pÃĨ din {product_name}-konto blev ÃĶndret til {newEmail}.\n\nHvis du har foretaget denne ÃĶndring, er der ingen handling nÃļdvendig. Hvis du ikke har, kan du fortryde ÃĶndringen og sikre din konto ved at bruge dette link:\n\n{revertUrl}\n\nDette vil gendanne din tidligere e-mail, logge dig ud overalt, fjerne tilknyttede telefonnumre, deaktivere MFA og krÃĶve, at du indstiller en ny adgangskode.\n\n– {product_name} Safety Team"
"subject": "Din e-mailadresse til {product_name} er ÃĶndret",
"body": "Hej {username},\n\nE-mailadressen pÃĨ din {product_name}-konto blev ÃĶndret til {newEmail}.\n\nHvis du selv har foretaget ÃĶndringen, behÃļver du ikke gÃļre noget. Ellers kan du fortryde ÃĶndringen og sikre din konto ved at bruge dette link:\n\n{revertUrl}\n\nDette vil gendanne din tidligere e-mailadresse, logge dig ud overalt, fjerne tilknyttede telefonnumre, slÃĨ multifaktorgodkendelse fra og krÃĶve, at du vÃĶlger en ny adgangskode.\n\n– Sikkerhedsteamet hos {product_name}"
},
"email_verification": {
"subject": "BekrÃĶft din {product_name}-e-mailadresse",
"body": "Hej {username},\n\nBekrÃĶft e-mailadressen for din {product_name}-konto ved at klikke pÃĨ linket nedenfor:\n\n{verifyUrl}\n\nHvis du ikke har oprettet en {product_name}-konto, kan du trygt ignorere denne e-mail.\n\nDette link er gyldigt i 24 timer.\n\n– {product_name} Team"
"body": "Hej {username},\n\nBekrÃĶft e-mailadressen for din {product_name}-konto ved at klikke pÃĨ linket nedenfor:\n\n{verifyUrl}\n\nHvis du ikke har oprettet en {product_name}-konto, kan du trygt ignorere denne e-mail.\n\nDette link er gyldigt i 24 timer.\n\n– Teamet bag {product_name}"
},
"gift_chargeback_notification": {
"subject": "Fordele fra din indlÃļste gave er fjernet",
"body": "Hej {username},\n\nEn gavekode, du indlÃļste, blev oprindeligt betalt af en anden. Den betaling er siden annulleret (en tilbagefÃļrsel).\n\nDerfor har vi fjernet de fordele, der blev tilfÃļjet din konto, da du indlÃļste gaven.\n\nHvis du mener, at dette er en fejl, kan du kontakte vores supportteam og oplyse alle detaljer, du har om gavekoden, og hvornÃĨr du indlÃļste den.\n\n– {product_name} Team"
"body": "Hej {username},\n\nEn gavekode, du indlÃļste, blev oprindeligt betalt af en anden. Den betaling er siden annulleret (en tilbagefÃļrsel).\n\nDerfor har vi fjernet de fordele, der blev tilfÃļjet din konto, da du indlÃļste gaven.\n\nHvis du mener, at dette er en fejl, kan du kontakte vores supportteam og oplyse alle detaljer, du har om gavekoden, og hvornÃĨr du indlÃļste den.\n\n– Teamet bag {product_name}"
},
"harvest_completed": {
"subject": "Din {product_name}-dataeksport er klar til at downloade",
"body": "Hej {username},\n\nDin dataeksport er klar.\n\nDownload-link:\n{downloadUrl}\n\nAntal beskeder: {totalMessages, number}\nFilstÃļrrelse: {fileSizeMB, number} MB\n\nDette link udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om denne eksport, skal du straks ÃĶndre din adgangskode og kontakte vores supportteam.\n\n– {product_name} Team"
"subject": "Din dataeksport fra {product_name} er klar til download",
"body": "Hej {username},\n\nDin dataeksport er klar.\n\nDownload-link:\n{downloadUrl}\n\nAntal beskeder: {totalMessages, number}\nFilstÃļrrelse: {fileSizeMB, number} MB\n\nDette link udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om denne eksport, skal du straks ÃĶndre din adgangskode og kontakte vores supportteam.\n\n– Teamet bag {product_name}"
},
"inactivity_warning": {
"subject": "Din {product_name}-konto slettes pÃĨ grund af inaktivitet",
"body": "Hej {username},\n\nVi har ikke set nogen aktivitet pÃĨ din {product_name}-konto siden {lastActiveDate, date, full}.\n\nHvis du ikke logger ind inden {deletionDate, date, full} kl. {deletionDate, time, short}, slettes din konto permanent pÃĨ grund af inaktivitet.\n\nLog ind her:\n{loginUrl}\n\nHvis du har brugt {product_name} for nylig, skal du kontakte vores supportteam med det samme.\n\n– {product_name} Team"
"body": "Hej {username},\n\nVi har ikke set nogen aktivitet pÃĨ din {product_name}-konto siden {lastActiveDate, date, full}.\n\nHvis du ikke logger ind inden {deletionDate, date, full} kl. {deletionDate, time, short}, slettes din konto permanent pÃĨ grund af inaktivitet.\n\nLog ind her:\n{loginUrl}\n\nHvis du har brugt {product_name} for nylig, skal du kontakte vores supportteam med det samme.\n\n– Teamet bag {product_name}"
},
"ip_authorization": {
"subject": "Godkend login fra en ny IP-adresse",
"body": "Hej {username},\n\nVi har registreret et login-forsÃļg pÃĨ din {product_name}-konto fra en ny IP-adresse:\n\nIP-adresse: {ipAddress}\nSted: {location}\n\nHvis dette var dig, skal du godkende denne IP-adresse ved at klikke pÃĨ linket nedenfor:\n\n{authUrl}\n\nHvis du ikke har forsÃļgt at logge ind, skal du straks ÃĶndre din adgangskode.\n\nDette link er gyldigt i 30 minutter.\n\n– {product_name} Team"
"body": "Hej {username},\n\nVi har registreret et loginforsÃļg pÃĨ din {product_name}-konto fra en ny IP-adresse:\n\nIP-adresse: {ipAddress}\nSted: {location}\n\nHvis det var dig, skal du godkende denne IP-adresse ved at klikke pÃĨ linket nedenfor:\n\n{authUrl}\n\nHvis du ikke har forsÃļgt at logge ind, skal du straks ÃĶndre din adgangskode.\n\nDette link er gyldigt i 30 minutter.\n\n– Teamet bag {product_name}"
},
"mfa_backup_codes_view": {
"subject": "BekrÃĶft adgang til dine {product_name}-backupkoder",
"body": "Hej {username},\n\nVi har modtaget en anmodning om at se backupkoderne pÃĨ din {product_name}-konto.\n\nFor at bekrÃĶfte denne anmodning skal du indtaste denne kode i appen:\n\n{code}\n\nDenne kode udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om dette, har nogen muligvis adgang til din konto. Skift din adgangskode med det samme.\n\n– {product_name} Team"
"body": "Hej {username},\n\nVi har modtaget en anmodning om at se backupkoderne pÃĨ din {product_name}-konto.\n\nFor at bekrÃĶfte denne anmodning skal du indtaste denne kode i appen:\n\n{code}\n\nDenne kode udlÃļber den {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke har anmodet om dette, har nogen muligvis adgang til din konto. Skift din adgangskode med det samme.\n\n– Teamet bag {product_name}"
},
"password_change_verification": {
"subject": "BekrÃĶft din {product_name}-adgangskodeÃĶndring",
"body": "Hej {username},\n\nVi har modtaget en anmodning om at ÃĶndre adgangskoden pÃĨ din {product_name}-konto.\n\nFor at bekrÃĶfte denne ÃĶndring skal du indtaste denne kode i appen:\n\n{code}\n\nDenne kode udlÃļber kl. {expiresAt}.\n\nHvis du ikke har anmodet om dette, har nogen muligvis adgang til din konto. Skift din adgangskode med det samme, og aktiver totrinsgodkendelse.\n\n– {product_name} Team"
"subject": "BekrÃĶft ÃĶndringen af din adgangskode til {product_name}",
"body": "Hej {username},\n\nVi har modtaget en anmodning om at ÃĶndre adgangskoden pÃĨ din {product_name}-konto.\n\nFor at bekrÃĶfte denne ÃĶndring skal du indtaste denne kode i appen:\n\n{code}\n\nDenne kode udlÃļber kl. {expiresAt}.\n\nHvis du ikke har anmodet om dette, har nogen muligvis adgang til din konto. Skift din adgangskode med det samme, og aktiver tofaktorgodkendelse.\n\n– Teamet bag {product_name}"
},
"password_reset": {
"subject": "Nulstil din {product_name}-adgangskode",
"body": "Hej {username},\n\nDu har anmodet om at nulstille din {product_name}-adgangskode. Brug linket nedenfor til at indstille en ny adgangskode:\n\n{resetUrl}\n\nHvis du ikke har anmodet om dette, kan du trygt ignorere denne e-mail.\n\nDette link er gyldigt i 1 time.\n\n– {product_name} Team"
"body": "Hej {username},\n\nDu har anmodet om at nulstille din {product_name}-adgangskode. Brug linket nedenfor til at vÃĶlge en ny adgangskode:\n\n{resetUrl}\n\nHvis du ikke har anmodet om dette, kan du trygt ignorere denne e-mail.\n\nDette link er gyldigt i 1 time.\n\n– Teamet bag {product_name}"
},
"registration_approved": {
"subject": "Din {product_name}-registrering er godkendt",
"body": "Hej {username},\n\nGode nyheder: Din {product_name}-registrering er godkendt.\n\nDu kan nu logge ind pÃĨ {product_name}-appen her:\n{channelsUrl}\n\nVelkommen til {product_name}-community'et.\n\n– {product_name} Team"
"subject": "Din tilmelding til {product_name} er godkendt",
"body": "Hej {username},\n\nGode nyheder: Din tilmelding til {product_name} er godkendt.\n\nDu kan nu logge ind pÃĨ {product_name}-appen her:\n{channelsUrl}\n\nVelkommen til fÃĶllesskabet pÃĨ {product_name}.\n\n– Teamet bag {product_name}"
},
"report_resolved": {
"subject": "Din {product_name}-rapport er gennemgÃĨet",
"body": "Hej {username},\n\nDin rapport (ID: {reportId}) er gennemgÃĨet af vores Safety Team.{hasComment, select, yes {\n\nSvar fra Safety Team:\n{publicComment}} other {}}\n\nTak for din hjÃĶlp til at holde {product_name} sikkert for alle. Vi tager alle rapporter alvorligt og vÃĶrdsÃĶtter dit bidrag til community'et.\n\nHvis du har spÃļrgsmÃĨl eller bekymringer vedrÃļrende dette resultat, kan du kontakte {safety_email}.\n\n– {product_name} Safety Team"
"subject": "Din anmeldelse pÃĨ {product_name} er blevet behandlet",
"body": "Hej {username},\n\nDin anmeldelse (ID: {reportId}) er blevet behandlet af vores sikkerhedsteam.{hasComment, select, yes {\n\nSvar fra sikkerhedsteamet:\n{publicComment}} other {}}\n\nTak for din hjÃĶlp til at holde {product_name} sikkert for alle. Vi tager alle anmeldelser alvorligt og vÃĶrdsÃĶtter dit bidrag til fÃĶllesskabet.\n\nHvis du har spÃļrgsmÃĨl eller bekymringer vedrÃļrende dette resultat, kan du kontakte {safety_email}.\n\n– Sikkerhedsteamet hos {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Din {product_name}-konto slettes permanent",
"body": "Hej {username},\n\nDin {product_name}-konto er planlagt til permanent sletning.\n\nPlanlagt sletning: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Årsag: {reason}}\n}\n\nDette er en alvorlig hÃĨndhÃĶvelseshandling. Dine kontodata bliver permanent slettet pÃĨ den planlagte dato.\n\nHvis du mener, at denne hÃĨndhÃĶvelsesbeslutning var forkert, kan du indsende en anke. Send en e-mail til {appeals_email} fra denne e-mailadresse.\n\n– {product_name} Safety Team"
"body": "Hej {username},\n\nVi har planlagt at slette din {product_name}-konto permanent.\n\nPlanlagt sletning: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Årsag: {reason}}\n}\n\nDette er en alvorlig sanktion. Dine kontodata bliver permanent slettet pÃĨ den planlagte dato.\n\nHvis du mener, at denne beslutning om sanktioner var forkert, kan du indsende en klage. Send en e-mail til {appeals_email} fra denne e-mailadresse.\n\n– Sikkerhedsteamet hos {product_name}"
},
"self_deletion_scheduled": {
"subject": "Din {product_name}-kontosletning er planlagt",
"body": "Hej {username},\n\nDu har anmodet om at slette din {product_name}-konto. Din konto slettes permanent den:\n\n{deletionDate, date, full} kl. {deletionDate, time, short}\n\nHvis du ikke har anmodet om dette, skal du logge ind pÃĨ din konto for at annullere sletningen. Vi anbefaler ogsÃĨ, at du ÃĶndrer din adgangskode for at sikre din konto.\n\n– {product_name} Team"
"subject": "Sletningen af din {product_name}-konto er planlagt",
"body": "Hej {username},\n\nDu har anmodet om at slette din {product_name}-konto. Din konto slettes permanent den:\n\n{deletionDate, date, full} kl. {deletionDate, time, short}\n\nHvis du ikke har anmodet om dette, skal du logge ind pÃĨ din konto for at annullere sletningen. Vi anbefaler ogsÃĨ, at du ÃĶndrer din adgangskode for at sikre din konto.\n\n– Teamet bag {product_name}"
},
"unban_notification": {
"subject": "Din {product_name}-kontosuspension er ophÃĶvet",
"body": "Hej {username},\n\nGode nyheder: Din {product_name}-kontosuspension er ophÃĶvet.\n\n{reason, select,\n null {}\n other {Årsag: {reason}}\n}\n\nDu kan nu logge ind igen og fortsÃĶtte med at bruge {product_name} som normalt.\n\n– {product_name} Safety Team"
"subject": "Suspensionen af din {product_name}-konto er ophÃĶvet",
"body": "Hej {username},\n\nGode nyheder: Suspensionen af din {product_name}-konto er ophÃĶvet.\n\n{reason, select,\n null {}\n other {Årsag: {reason}}\n}\n\nDu kan nu logge ind igen og fortsÃĶtte med at bruge {product_name} som normalt.\n\n– Sikkerhedsteamet hos {product_name}"
}
});
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_DE_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -9,7 +9,7 @@ const EMAIL_I18N_DE_MESSAGES = defineEmailI18nLocaleMessages({
},
"account_scheduled_deletion": {
"subject": "Dein {product_name}-Account wird dauerhaft gelÃķscht",
"body": "Hallo {username},\n\ndein {product_name}-Account wurde aufgrund von VerstÃķßen gegen unsere Nutzungsbedingungen oder Community-Richtlinien zur dauerhaften LÃķschung vorgemerkt.\n\nGeplante LÃķschung: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Grund: {reason}}\n}\n\nDies ist eine ernsthafte Maßnahme. Deine Accountdaten werden am geplanten Datum dauerhaft gelÃķscht.\n\nBitte lies dir Folgendes durch:\n- Nutzungsbedingungen: {termsUrl}\n- Community-Richtlinien: {guidelinesUrl}\n\nEinspruchsverfahren:\nWenn du glaubst, dass diese Entscheidung falsch oder ungerechtfertigt war, hast du 60 Tage Zeit, Einspruch einzulegen. Sende eine E-Mail von dieser E-Mail-Adresse an {appeals_email}.\n\nIn deinem Einspruch:\n- ErklÃĪre klar, warum du glaubst, dass die Entscheidung falsch oder ungerechtfertigt war\n- FÞge alle relevanten Beweise oder Kontextinformationen bei\n\nEin Mitglied des {product_name}-Sicherheitsteams wird deinen Einspruch prÞfen und die ausstehende LÃķschung mÃķglicherweise pausieren, bis eine endgÞltige Entscheidung getroffen wurde.\n\n– {product_name}-Sicherheitsteam"
"body": "Hallo {username},\n\ndein {product_name}-Account wurde aufgrund von VerstÃķßen gegen unsere Nutzungsbedingungen oder Community-Richtlinien zur dauerhaften LÃķschung vorgemerkt.\n\nGeplante LÃķschung: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Grund: {reason}}\n}\n\nDies ist eine ernsthafte Maßnahme. Deine Accountdaten werden am geplanten Datum dauerhaft gelÃķscht.\n\nBitte lies dir Folgendes durch:\n- Nutzungsbedingungen: {termsUrl}\n- Community-Richtlinien: {guidelinesUrl}\n\nEinspruchsverfahren:\nWenn du glaubst, dass diese Entscheidung falsch oder ungerechtfertigt war, hast du 60 Tage Zeit, Einspruch einzulegen. Sende eine E-Mail von dieser E-Mail-Adresse an {appeals_email}.\n\nIn deinem Einspruch:\n- ErklÃĪre klar, warum du glaubst, dass die Entscheidung falsch oder ungerechtfertigt war\n- FÞge alle relevanten Beweise oder Kontextinformationen bei\n\nEin Mitglied des {product_name}-Sicherheitsteams wird deinen Einspruch prÞfen und die geplante LÃķschung mÃķglicherweise aussetzen, bis eine endgÞltige Entscheidung getroffen wurde.\n\n– {product_name}-Sicherheitsteam"
},
"account_temp_banned": {
"subject": "Dein {product_name}-Account wurde vorÞbergehend gesperrt",
@@ -17,67 +17,67 @@ const EMAIL_I18N_DE_MESSAGES = defineEmailI18nLocaleMessages({
},
"donation_confirmation": {
"subject": "Vielen Dank fÞr deine {product_name}-Spende",
"body": "Hallo,\n\nvielen Dank fÞr deine Spende an {product_name}! Deine {interval, select,\n month {wiederkehrende Spende}\n year {wiederkehrende Spende}\n other {einmalige Spende}\n} wurde erfolgreich {interval, select,\n month {eingerichtet}\n year {eingerichtet}\n other {verarbeitet}\n}.\n\nDetails zur Spende:\nBetrag: {amount} {currency} {interval, select,\n month {pro Monat}\n year {pro Jahr}\n other {}\n}\n\nStripe sendet dir in KÞrze eine separate Quittung mit deiner Rechnungs-PDF per E-Mail. Diese enthÃĪlt alle Zahlungsdetails und kann fÞr Steuerzwecke verwendet werden.\n\nDu kannst deine Spendenhistorie einsehen, Rechnungen herunterladen {interval, select,\n month {und dein Abonnement jederzeit Þber diesen Link verwalten oder kÞndigen}\n year {und dein Abonnement jederzeit Þber diesen Link verwalten oder kÞndigen}\n other {und zukÞnftige Spenden verwalten}\n}:\n\n{manageUrl}\n\nDeine UnterstÞtzung hilft, {product_name} am Laufen zu halten. Vielen Dank!\n\n– {product_name} Team"
"body": "Hallo,\n\nvielen Dank fÞr deine Spende an {product_name}! Deine {interval, select,\n month {wiederkehrende Spende}\n year {wiederkehrende Spende}\n other {einmalige Spende}\n} wurde erfolgreich {interval, select,\n month {eingerichtet}\n year {eingerichtet}\n other {verarbeitet}\n}.\n\nDetails zur Spende:\nBetrag: {amount} {interval, select,\n month {pro Monat}\n year {pro Jahr}\n other {}\n}\n\nStripe sendet dir in KÞrze eine separate Quittung mit deiner Rechnungs-PDF per E-Mail. Diese enthÃĪlt alle Zahlungsdetails und kann fÞr Steuerzwecke verwendet werden.\n\nÜber diesen Link kannst du jederzeit deine SpendenÞbersicht aufrufen, Rechnungen herunterladen {interval, select,\n month {und dein Abonnement verwalten oder kÞndigen}\n year {und dein Abonnement verwalten oder kÞndigen}\n other {und zukÞnftige Spenden verwalten}\n}:\n\n{manageUrl}\n\nDeine UnterstÞtzung hilft, {product_name} am Laufen zu halten. Vielen Dank!\n\n– {product_name}-Team"
},
"donation_magic_link": {
"subject": "Verwalte deine {product_name}-Spenden",
"body": "Hallo,\n\nklicke auf den Link unten, um auf dein Spenderportal zuzugreifen:\n\n{manageUrl}\n\nIm Portal kannst du Abonnements verwalten, Rechnungen herunterladen und deine Spendenhistorie einsehen.\n\nDieser Link lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du diesen Link nicht angefordert hast, kannst du diese E-Mail ignorieren.\n\n– {product_name} Team"
"body": "Hallo,\n\nklicke auf den Link unten, um auf dein Spendenportal zuzugreifen:\n\n{manageUrl}\n\nIm Portal kannst du Abonnements verwalten, Rechnungen herunterladen und deine SpendenÞbersicht einsehen.\n\nDieser Link lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du diesen Link nicht angefordert hast, kannst du diese E-Mail ignorieren.\n\n– {product_name}-Team"
},
"dsa_report_verification": {
"subject": "BestÃĪtige deine E-Mail fÞr einen DSA-Bericht",
"body": "Hallo,\n\nverwende den untenstehenden BestÃĪtigungscode, um deinen DSA-Bericht auf {product_name} einzureichen:\n\n{code}\n\nDieser Code lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du dies nicht angefordert hast, kannst du diese E-Mail ignorieren.\n\n– {product_name}-Sicherheitsteam"
"subject": "BestÃĪtige deine E-Mail-Adresse fÞr eine DSA-Meldung",
"body": "Hallo,\n\nverwende den untenstehenden BestÃĪtigungscode, um deine Meldung nach dem Digital Services Act (DSA) auf {product_name} einzureichen:\n\n{code}\n\nDieser Code lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du dies nicht angefordert hast, kannst du diese E-Mail ignorieren.\n\n– {product_name}-Sicherheitsteam"
},
"email_change_new": {
"subject": "BestÃĪtige deine neue {product_name}-E-Mail",
"body": "Hallo {username},\n\ngib diesen Code in der App ein, um deine neue {product_name}-E-Mail zu bestÃĪtigen:\n\n{code}\n\nDieser Code lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du dies nicht angefordert hast, kannst du diese E-Mail ignorieren.\n\n– {product_name} Team"
"subject": "BestÃĪtige deine neue {product_name}-E-Mail-Adresse",
"body": "Hallo {username},\n\ngib diesen Code in der App ein, um deine neue {product_name}-E-Mail-Adresse zu bestÃĪtigen:\n\n{code}\n\nDieser Code lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du dies nicht angefordert hast, kannst du diese E-Mail ignorieren.\n\n– {product_name}-Team"
},
"email_change_original": {
"subject": "BestÃĪtige deine {product_name}-E-Mail-Änderung",
"body": "Hallo {username},\n\nwir haben eine Anfrage zur Änderung der E-Mail-Adresse deines {product_name}-Accounts erhalten.\n\nUm diese Änderung zu bestÃĪtigen, gib diesen Code in der App ein:\n\n{code}\n\nDieser Code lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du diese Änderung nicht angefordert hast, sichere deinen Account bitte sofort ab.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nwir haben eine Anfrage zur Änderung der E-Mail-Adresse deines {product_name}-Accounts erhalten.\n\nUm diese Änderung zu bestÃĪtigen, gib diesen Code in der App ein:\n\n{code}\n\nDieser Code lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du diese Änderung nicht angefordert hast, sichere deinen Account bitte sofort ab.\n\n– {product_name}-Team"
},
"email_change_revert": {
"subject": "Deine {product_name}-E-Mail wurde geÃĪndert",
"body": "Hallo {username},\n\ndie E-Mail-Adresse deines {product_name}-Accounts wurde zu {newEmail} geÃĪndert.\n\nWenn du diese Änderung vorgenommen hast, ist keine weitere Aktion erforderlich. Wenn nicht, kannst du die Änderung rÞckgÃĪngig machen und deinen Account Þber diesen Link absichern:\n\n{revertUrl}\n\nDadurch wird deine vorherige E-Mail wiederhergestellt, du wirst Þberall abgemeldet, verknÞpfte Telefonnummern werden entfernt, MFA wird deaktiviert und du musst ein neues Passwort festlegen.\n\n– {product_name}-Sicherheitsteam"
"subject": "Deine {product_name}-E-Mail-Adresse wurde geÃĪndert",
"body": "Hallo {username},\n\ndie E-Mail-Adresse deines {product_name}-Accounts wurde in {newEmail} geÃĪndert.\n\nWenn du diese Änderung vorgenommen hast, ist keine weitere Aktion erforderlich. Wenn nicht, kannst du die Änderung rÞckgÃĪngig machen und deinen Account Þber diesen Link absichern:\n\n{revertUrl}\n\nDadurch wird deine vorherige E-Mail-Adresse wiederhergestellt, du wirst Þberall abgemeldet, verknÞpfte Telefonnummern werden entfernt, MFA wird deaktiviert und du musst ein neues Passwort festlegen.\n\n– {product_name}-Sicherheitsteam"
},
"email_verification": {
"subject": "BestÃĪtige deine {product_name}-E-Mail-Adresse",
"body": "Hallo {username},\n\nbitte bestÃĪtige die E-Mail-Adresse fÞr deinen {product_name}-Account, indem du auf den untenstehenden Link klickst:\n\n{verifyUrl}\n\nWenn du keinen {product_name}-Account erstellt hast, kannst du diese E-Mail ignorieren.\n\nDieser Link ist 24 Stunden gÞltig.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nbitte bestÃĪtige die E-Mail-Adresse fÞr deinen {product_name}-Account, indem du auf den untenstehenden Link klickst:\n\n{verifyUrl}\n\nWenn du keinen {product_name}-Account erstellt hast, kannst du diese E-Mail ignorieren.\n\nDieser Link ist 24 Stunden gÞltig.\n\n– {product_name}-Team"
},
"gift_chargeback_notification": {
"subject": "Vorteile deines eingelÃķsten Geschenks wurden entfernt",
"body": "Hallo {username},\n\nein von dir eingelÃķster Geschenkcode wurde ursprÞnglich von jemand anderem bezahlt. Diese Zahlung wurde inzwischen rÞckgÃĪngig gemacht (eine RÞckbuchung).\n\nAus diesem Grund haben wir die Vorteile entfernt, die deinem Account hinzugefÞgt wurden, als du das Geschenk eingelÃķst hast.\n\nWenn du glaubst, dass dies ein Fehler ist, kontaktiere bitte unser Support-Team und gib alle Details an, die du Þber den Geschenkcode und den Zeitpunkt der EinlÃķsung hast.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nein von dir eingelÃķster Geschenkcode wurde ursprÞnglich von jemand anderem bezahlt. Diese Zahlung wurde inzwischen rÞckgÃĪngig gemacht (eine RÞckbuchung).\n\nAus diesem Grund haben wir die Vorteile entfernt, die deinem Account hinzugefÞgt wurden, als du das Geschenk eingelÃķst hast.\n\nWenn du glaubst, dass dies ein Fehler ist, kontaktiere bitte unser Support-Team und gib alle Details an, die du Þber den Geschenkcode und den Zeitpunkt der EinlÃķsung hast.\n\n– {product_name}-Team"
},
"harvest_completed": {
"subject": "Dein {product_name}-Datenexport steht zum Herunterladen bereit",
"body": "Hallo {username},\n\ndein Datenexport ist bereit.\n\nDownload-Link:\n{downloadUrl}\n\nEnthaltene Nachrichten: {totalMessages, number}\nDateigrÃķße: {fileSizeMB, number} MB\n\nDieser Link lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du diesen Export nicht angefordert hast, ÃĪndere bitte sofort dein Passwort und kontaktiere unser Support-Team.\n\n– {product_name} Team"
"body": "Hallo {username},\n\ndein Datenexport ist bereit.\n\nDownload-Link:\n{downloadUrl}\n\nEnthaltene Nachrichten: {totalMessages, number}\nDateigrÃķße: {fileSizeMB, number} MB\n\nDieser Link lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du diesen Export nicht angefordert hast, ÃĪndere bitte sofort dein Passwort und kontaktiere unser Support-Team.\n\n– {product_name}-Team"
},
"inactivity_warning": {
"subject": "Dein {product_name}-Account wird wegen InaktivitÃĪt gelÃķscht",
"body": "Hallo {username},\n\nwir haben seit dem {lastActiveDate, date, full} keine AktivitÃĪt auf deinem {product_name}-Account festgestellt.\n\nWenn du dich nicht bis zum {deletionDate, date, full} um {deletionDate, time, short} anmeldest, wird dein Account aufgrund von InaktivitÃĪt dauerhaft gelÃķscht.\n\nMelde dich hier an:\n{loginUrl}\n\nWenn du {product_name} kÞrzlich genutzt hast, kontaktiere bitte sofort unser Support-Team.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nwir haben seit dem {lastActiveDate, date, full} keine AktivitÃĪt auf deinem {product_name}-Account festgestellt.\n\nWenn du dich nicht bis zum {deletionDate, date, full} um {deletionDate, time, short} anmeldest, wird dein Account aufgrund von InaktivitÃĪt dauerhaft gelÃķscht.\n\nMelde dich hier an:\n{loginUrl}\n\nWenn du {product_name} kÞrzlich genutzt hast, kontaktiere bitte sofort unser Support-Team.\n\n– {product_name}-Team"
},
"ip_authorization": {
"subject": "Anmeldung von einer neuen IP-Adresse bestÃĪtigen",
"body": "Hallo {username},\n\nwir haben einen Anmeldeversuch fÞr deinen {product_name}-Account von einer neuen IP-Adresse festgestellt:\n\nIP-Adresse: {ipAddress}\nStandort: {location}\n\nWenn du das warst, bestÃĪtige diese IP-Adresse bitte, indem du auf den untenstehenden Link klickst:\n\n{authUrl}\n\nWenn du dich nicht anmelden wolltest, ÃĪndere bitte sofort dein Passwort.\n\nDieser Link ist 30 Minuten gÞltig.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nwir haben einen Anmeldeversuch fÞr deinen {product_name}-Account von einer neuen IP-Adresse festgestellt:\n\nIP-Adresse: {ipAddress}\nStandort: {location}\n\nWenn du das warst, bestÃĪtige diese IP-Adresse bitte, indem du auf den untenstehenden Link klickst:\n\n{authUrl}\n\nWenn du nicht versucht hast, dich anzumelden, ÃĪndere bitte sofort dein Passwort.\n\nDieser Link ist 30 Minuten gÞltig.\n\n– {product_name}-Team"
},
"mfa_backup_codes_view": {
"subject": "BestÃĪtige den Zugriff auf deine {product_name}-Backup-Codes",
"body": "Hallo {username},\n\nwir haben eine Anfrage erhalten, die Backup-Codes deines {product_name}-Accounts anzusehen.\n\nUm diese Anfrage zu bestÃĪtigen, gib diesen Code in der App ein:\n\n{code}\n\nDieser Code lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du dies nicht angefordert hast, kÃķnnte jemand Zugriff auf deinen Account haben. Ändere dein Passwort sofort.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nwir haben eine Anfrage erhalten, die Backup-Codes deines {product_name}-Accounts anzusehen.\n\nUm diese Anfrage zu bestÃĪtigen, gib diesen Code in der App ein:\n\n{code}\n\nDieser Code lÃĪuft am {expiresAt, date, full} um {expiresAt, time, short} ab.\n\nWenn du dies nicht angefordert hast, kÃķnnte jemand Zugriff auf deinen Account haben. Ändere dein Passwort sofort.\n\n– {product_name}-Team"
},
"password_change_verification": {
"subject": "BestÃĪtige deine {product_name}-PasswortÃĪnderung",
"body": "Hallo {username},\n\nwir haben eine Anfrage zur Änderung des Passworts deines {product_name}-Accounts erhalten.\n\nUm diese Änderung zu bestÃĪtigen, gib diesen Code in der App ein:\n\n{code}\n\nDieser Code lÃĪuft um {expiresAt} ab.\n\nWenn du diese Änderung nicht angefordert hast, kÃķnnte jemand Zugriff auf deinen Account haben. Ändere dein Passwort sofort und aktiviere die Zwei-Faktor-Authentifizierung.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nwir haben eine Anfrage zur Änderung des Passworts deines {product_name}-Accounts erhalten.\n\nUm diese Änderung zu bestÃĪtigen, gib diesen Code in der App ein:\n\n{code}\n\nDieser Code lÃĪuft um {expiresAt} ab.\n\nWenn du diese Änderung nicht angefordert hast, kÃķnnte jemand Zugriff auf deinen Account haben. Ändere dein Passwort sofort und aktiviere die Zwei-Faktor-Authentifizierung.\n\n– {product_name}-Team"
},
"password_reset": {
"subject": "Setze dein {product_name}-Passwort zurÞck",
"body": "Hallo {username},\n\ndu hast eine {product_name}-PasswortzurÞcksetzung angefordert. Verwende den untenstehenden Link, um ein neues Passwort festzulegen:\n\n{resetUrl}\n\nWenn du dies nicht angefordert hast, kannst du diese E-Mail ignorieren.\n\nDieser Link ist 1 Stunde gÞltig.\n\n– {product_name} Team"
"body": "Hallo {username},\n\ndu hast angefordert, dein {product_name}-Passwort zurÞckzusetzen. Verwende den untenstehenden Link, um ein neues Passwort festzulegen:\n\n{resetUrl}\n\nWenn du dies nicht angefordert hast, kannst du diese E-Mail ignorieren.\n\nDieser Link ist 1 Stunde gÞltig.\n\n– {product_name}-Team"
},
"registration_approved": {
"subject": "Deine {product_name}-Registrierung wurde genehmigt",
"body": "Hallo {username},\n\ngute Nachrichten: Deine {product_name}-Registrierung wurde genehmigt.\n\nDu kannst dich jetzt hier in die {product_name}-App einloggen:\n{channelsUrl}\n\nWillkommen in der {product_name}-Community.\n\n– {product_name} Team"
"body": "Hallo {username},\n\ngute Nachrichten: Deine {product_name}-Registrierung wurde genehmigt.\n\nDu kannst dich jetzt hier in die {product_name}-App einloggen:\n{channelsUrl}\n\nWillkommen in der {product_name}-Community.\n\n– {product_name}-Team"
},
"report_resolved": {
"subject": "Dein {product_name}-Bericht wurde geprÞft",
"body": "Hallo {username},\n\ndein Bericht (ID: {reportId}) wurde von unserem Sicherheitsteam geprÞft.{hasComment, select, yes {\n\nAntwort vom Sicherheitsteam:\n{publicComment}} other {}}\n\nDanke, dass du hilfst, {product_name} fÞr alle sicher zu halten. Wir nehmen alle Berichte ernst und schÃĪtzen deinen Beitrag zur Community.\n\nWenn du Fragen oder Bedenken zu diesem Ergebnis hast, kontaktiere bitte {safety_email}.\n\n– {product_name}-Sicherheitsteam"
"subject": "Deine {product_name}-Meldung wurde geprÞft",
"body": "Hallo {username},\n\ndeine Meldung (ID: {reportId}) wurde von unserem Sicherheitsteam geprÞft.{hasComment, select, yes {\n\nAntwort vom Sicherheitsteam:\n{publicComment}} other {}}\n\nDanke, dass du hilfst, {product_name} fÞr alle sicher zu halten. Wir nehmen alle Meldungen ernst und schÃĪtzen deinen Beitrag zur Community.\n\nWenn du Fragen oder Bedenken zu diesem Ergebnis hast, kontaktiere bitte {safety_email}.\n\n– {product_name}-Sicherheitsteam"
},
"scheduled_deletion_notification": {
"subject": "Dein {product_name}-Account wird dauerhaft gelÃķscht",
@@ -85,7 +85,7 @@ const EMAIL_I18N_DE_MESSAGES = defineEmailI18nLocaleMessages({
},
"self_deletion_scheduled": {
"subject": "Die LÃķschung deines {product_name}-Accounts ist geplant",
"body": "Hallo {username},\n\ndu hast die LÃķschung deines {product_name}-Accounts beantragt. Dein Account ist zur dauerhaften LÃķschung vorgesehen am:\n\n{deletionDate, date, full} um {deletionDate, time, short}\n\nWenn du diese LÃķschung nicht beantragt hast, melde dich in deinem Account an, um die LÃķschung abzubrechen. Wir empfehlen außerdem, dein Passwort zu ÃĪndern, um deinen Account abzusichern.\n\n– {product_name} Team"
"body": "Hallo {username},\n\ndu hast die LÃķschung deines {product_name}-Accounts beantragt. Dein Account wird an folgendem Termin dauerhaft gelÃķscht:\n\n{deletionDate, date, full} um {deletionDate, time, short}\n\nWenn du diese LÃķschung nicht beantragt hast, melde dich in deinem Account an, um die LÃķschung abzubrechen. Wir empfehlen außerdem, dein Passwort zu ÃĪndern, um deinen Account abzusichern.\n\n– {product_name}-Team"
},
"unban_notification": {
"subject": "Die Sperrung deines {product_name}-Accounts wurde aufgehoben",
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_EL_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Ο ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ στÎŋ {product_name} έχÎĩÎđ ÎąÏ€ÎĩÎ―ÎĩρÎģÎŋπÎŋÎđηÎļÎĩÎŊ πρÎŋσωρÎđÎ―ÎŽ",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΑπÎĩÎ―ÎĩρÎģÎŋπÎŋÎđÎŪÏƒÎąÎžÎĩ πρÎŋσωρÎđÎ―ÎŽ τÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name} ÎĩπÎĩÎđÎīÎŪ ÎĩÎ―Ï„ÎŋπÎŊÏƒÎąÎžÎĩ ύπÎŋπτη ÎīÏÎąÏƒÏ„Î·ÏÎđÏŒÏ„Î·Ï„Îą.\n\n{reason, select,\n null {}\n other {ΛόÎģÎŋς: {reason}}\n}\n\nΓÎđÎą Î―Îą ÎąÏ€ÎŋΚτÎŪσÎĩÎđς ÎūÎąÎ―ÎŽ πρόσÎēÎąÏƒÎ· στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ, ÎļÎą πρέπÎĩÎđ Î―Îą ÎĩÏ€ÎąÎ―ÎąÏ†Î­ÏÎĩÎđς τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ:\n\n{forgotUrl}\n\nΑφÎŋύ ÎĩÏ€ÎąÎ―ÎąÏ†Î­ÏÎĩÎđς τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ, ÎļÎą ΞπÎŋρÎĩÎŊς Î―Îą ÏƒÏ…Î―ÎīÎĩÎļÎĩÎŊς ÎūÎąÎ―ÎŽ.\n\nÎ•ÎŽÎ― πÎđστÎĩύÎĩÎđς ότÎđ ÎąÏ…Ï„ÏŒ έÎģÎđÎ―Îĩ ÎšÎąÏ„ÎŽ ÎŧÎŽÎļÎŋς, ÎĩπÎđΚÎŋÎđÎ―ÏŽÎ―Î·ÏƒÎĩ ΞÎĩ Ï„Î·Î― ÎŋΞΎÎīÎą υπÎŋστÎŪρÎđÎūÎŪς ÎžÎąÏ‚.\n\n– ΟξήÎīÎą Î‘ÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΑπÎĩÎ―ÎĩρÎģÎŋπÎŋÎđÎŪÏƒÎąÎžÎĩ πρÎŋσωρÎđÎ―ÎŽ τÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name} ÎĩπÎĩÎđÎīÎŪ ÎĩÎ―Ï„ÎŋπÎŊÏƒÎąÎžÎĩ ύπÎŋπτη ÎīÏÎąÏƒÏ„Î·ÏÎđÏŒÏ„Î·Ï„Îą.\n\n{reason, select,\n null {}\n other {ΛόÎģÎŋς: {reason}}\n}\n\nΓÎđÎą Î―Îą ÎąÏ€ÎŋΚτÎŪσÎĩÎđς ÎūÎąÎ―ÎŽ πρόσÎēÎąÏƒÎ· στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ, ÎļÎą πρέπÎĩÎđ Î―Îą ÎĩÏ€ÎąÎ―ÎąÏ†Î­ÏÎĩÎđς τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ:\n\n{forgotUrl}\n\nΑφÎŋύ ÎĩÏ€ÎąÎ―ÎąÏ†Î­ÏÎĩÎđς τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ, ÎļÎą ΞπÎŋρÎĩÎŊς Î―Îą ÏƒÏ…Î―ÎīÎĩÎļÎĩÎŊς ÎūÎąÎ―ÎŽ.\n\nÎ•ÎŽÎ― πÎđστÎĩύÎĩÎđς ότÎđ ÎąÏ…Ï„ÏŒ έÎģÎđÎ―Îĩ ÎšÎąÏ„ÎŽ ÎŧÎŽÎļÎŋς, ÎĩπÎđΚÎŋÎđÎ―ÏŽÎ―Î·ÏƒÎĩ ΞÎĩ Ï„Î·Î― ÎŋΞΎÎīÎą υπÎŋστÎŪρÎđÎūÎŪς ÎžÎąÏ‚.\n\n– Η ÎŋΞΎÎīÎą ÎąÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ τÎŋυ {product_name}"
},
"account_scheduled_deletion": {
"subject": "Ο ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ στÎŋ {product_name} ÎļÎą ÎīÎđÎąÎģÏÎąÏ†ÎĩÎŊ ÎŋρÎđστÎđΚΎ",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΟ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ στÎŋ {product_name} έχÎĩÎđ πρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđστÎĩÎŊ ÎģÎđÎą ÎŋρÎđστÎđΚÎŪ ÎīÎđÎąÎģÏÎąÏ†ÎŪ ÎŧόÎģω Ï€ÎąÏÎąÎēÎđΎσÎĩÏ‰Î― Ï„Ï‰Î― ÎŒÏÏ‰Î― Î ÎąÏÎŋχÎŪς ÎĨπηρÎĩσÎđÏŽÎ― ÎŪ Ï„Ï‰Î― ΟÎīηÎģÎđÏŽÎ― ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„ÎąÏ‚.\n\nΠρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđÏƒÎžÎ­Î―Î· ÎīÎđÎąÎģÏÎąÏ†ÎŪ: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ΛόÎģÎŋς: {reason}}\n}\n\nΠρόΚÎĩÎđÏ„ÎąÎđ ÎģÎđÎą Î­Î―Îą σÎŋÎēÎąÏÏŒ ΞέτρÎŋ. ÎĪÎą ÎīÎĩÎīÎŋÎžÎ­Î―Îą τÎŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ ÎļÎą ÎīÎđÎąÎģÏÎąÏ†ÎŋÏÎ― ÎŋρÎđστÎđΚΎ Ï„Î·Î― πρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđÏƒÎžÎ­Î―Î· ηΞÎĩρÎŋÎžÎ·Î―ÎŊÎą.\n\nΈÎŧÎĩÎģÎūÎĩ:\n- ΌρÎŋÎđ Î ÎąÏÎŋχÎŪς ÎĨπηρÎĩσÎđÏŽÎ―: {termsUrl}\n- ΟÎīηÎģÎŊÎĩς ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„ÎąÏ‚: {guidelinesUrl}\n\nΔÎđÎąÎīÎđÎšÎąÏƒÎŊÎą πρÎŋσφυÎģÎŪς:\nÎ•ÎŽÎ― πÎđστÎĩύÎĩÎđς ότÎđ ÎąÏ…Ï„ÎŪ Î· ÎąÏ€ÏŒÏ†ÎąÏƒÎ· ÎŪÏ„ÎąÎ― ÎŧÎąÎ―ÎļÎąÏƒÎžÎ­Î―Î· ÎŪ ÎąÎīÎđΚιÎđÎŋÎŧόÎģητη, έχÎĩÎđς 60 ηΞέρÎĩς ÎģÎđÎą Î―Îą υπÎŋÎēÎŽÎŧÎĩÎđς πρÎŋσφυÎģÎŪ. ÎĢτÎĩÎŊÎŧÎĩ email στÎŋ {appeals_email} ÎąÏ€ÏŒ ÎąÏ…Ï„ÎŪÎ― τη ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· email.\n\nÎĢÏ„Î·Î― πρÎŋσφυÎģÎŪ ÏƒÎŋυ:\n- ΕÎūÎŪÎģησÎĩ ÏƒÎąÏ†ÏŽÏ‚ ÎģÎđÎąÏ„ÎŊ πÎđστÎĩύÎĩÎđς ότÎđ η ÎąÏ€ÏŒÏ†ÎąÏƒÎ· ÎŪÏ„ÎąÎ― ÎŧÎąÎ―ÎļÎąÏƒÎžÎ­Î―Î· ÎŪ ÎąÎīÎđΚιÎđÎŋÎŧόÎģητη\n- Î ÎąÏÎŽÎļÎĩσÎĩ Ï„Ï…Ï‡ÏŒÎ― σχÎĩτÎđΚΎ ÎąÏ€ÎŋÎīÎĩÎđΚτÎđΚΎ στÎŋÎđχÎĩÎŊÎą ÎŪ Ï€ÎŧÎąÎŊσÎđÎŋ\n\nÎˆÎ―Îą ΞέÎŧÎŋς της ΟξήÎīÎąÏ‚ Î‘ÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ τÎŋυ {product_name} ÎļÎą ÎĩÎūÎĩτΎσÎĩÎđ Ï„Î·Î― πρÎŋσφυÎģÎŪ ÏƒÎŋυ ΚιÎđ ÎĩÎ―ÎīέχÎĩÏ„ÎąÎđ Î―Îą ÎąÎ―ÎąÏƒÏ„ÎĩÎŊÎŧÎĩÎđ Ï„Î·Î― ÎĩΚΚρÎĩΞÎŪ ÎīÎđÎąÎģÏÎąÏ†ÎŪ ÎžÎ­Ï‡ÏÎđ Î―Îą ÎŧηφÎļÎĩÎŊ ΞÎđÎą τÎĩÎŧÎđΚÎŪ ÎąÏ€ÏŒÏ†ÎąÏƒÎ·.\n\n– ΟξήÎīÎą Î‘ÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΟ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ στÎŋ {product_name} έχÎĩÎđ πρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđστÎĩÎŊ ÎģÎđÎą ÎŋρÎđστÎđΚÎŪ ÎīÎđÎąÎģÏÎąÏ†ÎŪ ÎŧόÎģω Ï€ÎąÏÎąÎēÎđΎσÎĩÏ‰Î― Ï„Ï‰Î― ÎŒÏÏ‰Î― Ï€ÎąÏÎŋχÎŪς υπηρÎĩσÎđÏŽÎ― ÎŪ Ï„Ï‰Î― ΟÎīηÎģÎđÏŽÎ― ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„ÎąÏ‚.\n\nΠρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđÏƒÎžÎ­Î―Î· ÎīÎđÎąÎģÏÎąÏ†ÎŪ: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ΛόÎģÎŋς: {reason}}\n}\n\nΠρόΚÎĩÎđÏ„ÎąÎđ ÎģÎđÎą σÎŋÎēÎąÏÏŒ ΞέτρÎŋ. ÎĪÎą ÎīÎĩÎīÎŋÎžÎ­Î―Îą τÎŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ ÎļÎą ÎīÎđÎąÎģÏÎąÏ†ÎŋÏÎ― ÎŋρÎđστÎđΚΎ Ï„Î·Î― πρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđÏƒÎžÎ­Î―Î· ηΞÎĩρÎŋÎžÎ·Î―ÎŊÎą.\n\nΈÎŧÎĩÎģÎūÎĩ:\n- ΌρÎŋÎđ Ï€ÎąÏÎŋχÎŪς υπηρÎĩσÎđÏŽÎ―: {termsUrl}\n- ΟÎīηÎģÎŊÎĩς ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„ÎąÏ‚: {guidelinesUrl}\n\nΔÎđÎąÎīÎđÎšÎąÏƒÎŊÎą πρÎŋσφυÎģÎŪς:\nÎ•ÎŽÎ― πÎđστÎĩύÎĩÎđς ότÎđ ÎąÏ…Ï„ÎŪ Î· ÎąÏ€ÏŒÏ†ÎąÏƒÎ· ÎŪÏ„ÎąÎ― ÎŧÎąÎ―ÎļÎąÏƒÎžÎ­Î―Î· ÎŪ ÎąÎīÎđΚιÎđÎŋÎŧόÎģητη, έχÎĩÎđς 60 ηΞέρÎĩς ÎģÎđÎą Î―Îą υπÎŋÎēÎŽÎŧÎĩÎđς πρÎŋσφυÎģÎŪ. ÎĢτÎĩÎŊÎŧÎĩ email στÎŋ {appeals_email} ÎąÏ€ÏŒ ÎąÏ…Ï„ÎŪÎ― τη ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· email.\n\nÎĢÏ„Î·Î― πρÎŋσφυÎģÎŪ ÏƒÎŋυ:\n- ΕÎūÎŪÎģησÎĩ ÏƒÎąÏ†ÏŽÏ‚ ÎģÎđÎąÏ„ÎŊ πÎđστÎĩύÎĩÎđς ότÎđ η ÎąÏ€ÏŒÏ†ÎąÏƒÎ· ÎŪÏ„ÎąÎ― ÎŧÎąÎ―ÎļÎąÏƒÎžÎ­Î―Î· ÎŪ ÎąÎīÎđΚιÎđÎŋÎŧόÎģητη\n- Î ÎąÏÎŽÎļÎĩσÎĩ Ï„Ï…Ï‡ÏŒÎ― σχÎĩτÎđΚΎ ÎąÏ€ÎŋÎīÎĩÎđΚτÎđΚΎ στÎŋÎđχÎĩÎŊÎą ÎŪ Ï€ÎŧÎąÎŊσÎđÎŋ\n\nÎˆÎ―Îą ΞέÎŧÎŋς της ÎŋΞΎÎīÎąÏ‚ ÎąÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ τÎŋυ {product_name} ÎļÎą ÎĩÎūÎĩτΎσÎĩÎđ Ï„Î·Î― πρÎŋσφυÎģÎŪ ÏƒÎŋυ ΚιÎđ ÎĩÎ―ÎīέχÎĩÏ„ÎąÎđ Î―Îą ÎąÎ―ÎąÏƒÏ„ÎĩÎŊÎŧÎĩÎđ Ï„Î·Î― ÎĩΚΚρÎĩΞÎŪ ÎīÎđÎąÎģÏÎąÏ†ÎŪ ÎžÎ­Ï‡ÏÎđ Î―Îą ÎŧηφÎļÎĩÎŊ τÎĩÎŧÎđΚÎŪ ÎąÏ€ÏŒÏ†ÎąÏƒÎ·.\n\n– Η ÎŋΞΎÎīÎą ÎąÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ τÎŋυ {product_name}"
},
"account_temp_banned": {
"subject": "Ο ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ στÎŋ {product_name} έχÎĩÎđ ÎąÎ―ÎąÏƒÏ„ÎąÎŧÎĩÎŊ πρÎŋσωρÎđÎ―ÎŽ",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΟ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ στÎŋ {product_name} έχÎĩÎđ ÎąÎ―ÎąÏƒÏ„ÎąÎŧÎĩÎŊ πρÎŋσωρÎđÎ―ÎŽ ÎģÎđÎą Ï€ÎąÏÎąÎēÎŊÎąÏƒÎ· Ï„Ï‰Î― ÎŒÏÏ‰Î― Î ÎąÏÎŋχÎŪς ÎĨπηρÎĩσÎđÏŽÎ― ÎŪ Ï„Ï‰Î― ΟÎīηÎģÎđÏŽÎ― ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„ÎąÏ‚.\n\nΔÎđΎρΚÎĩÎđÎą: {durationHours, plural,\n =1 {ΞÎŊÎą ÏŽÏÎą}\n other {# ώρÎĩς}\n}\nÎ‘Î―ÎąÏƒÏ„ÎŋÎŧÎŪ ÎžÎ­Ï‡ÏÎđ: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {ΛόÎģÎŋς: {reason}}\n}\n\nÎšÎąÏ„ÎŽ τη ÎīÎđΎρΚÎĩÎđÎą ÎąÏ…Ï„ÎŪς της πÎĩρÎđόÎīÎŋυ, ÎīÎĩÎ― ÎļÎą ΞπÎŋρÎĩÎŊς Î―Îą έχÎĩÎđς πρόσÎēÎąÏƒÎ· στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ.\n\nΈÎŧÎĩÎģÎūÎĩ:\n- ΌρÎŋÎđ Î ÎąÏÎŋχÎŪς ÎĨπηρÎĩσÎđÏŽÎ―: {termsUrl}\n- ΟÎīηÎģÎŊÎĩς ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„ÎąÏ‚: {guidelinesUrl}\n\nÎ•ÎŽÎ― πÎđστÎĩύÎĩÎđς ότÎđ ÎąÏ…Ï„ÎŪ Î· ÎąÏ€ÏŒÏ†ÎąÏƒÎ· ÎŪÏ„ÎąÎ― ÎŧÎąÎ―ÎļÎąÏƒÎžÎ­Î―Î· ÎŪ ÎąÎīÎđΚιÎđÎŋÎŧόÎģητη, ΞπÎŋρÎĩÎŊς Î―Îą υπÎŋÎēÎŽÎŧÎĩÎđς πρÎŋσφυÎģÎŪ. ÎĢτÎĩÎŊÎŧÎĩ email στÎŋ {appeals_email} ÎąÏ€ÏŒ ÎąÏ…Ï„ÎŪÎ― τη ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· email ΚιÎđ ÎĩÎūÎŪÎģησÎĩ ÏƒÎąÏ†ÏŽÏ‚ ÎģÎđÎąÏ„ÎŊ πÎđστÎĩύÎĩÎđς ότÎđ η ÎąÏ€ÏŒÏ†ÎąÏƒÎ· ÎŪÏ„ÎąÎ― ÎŧÎąÎ―ÎļÎąÏƒÎžÎ­Î―Î·. Θι ÎĩÎūÎĩτΎσÎŋυΞÎĩ Ï„Î·Î― πρÎŋσφυÎģÎŪ ÏƒÎŋυ ΚιÎđ ÎļÎą ÎąÏ€ÎąÎ―Ï„ÎŪσÎŋυΞÎĩ ΞÎĩ Ï„Î·Î― ÎąÏ€ÏŒÏ†ÎąÏƒÎŪ ÎžÎąÏ‚.\n\n– ΟξήÎīÎą Î‘ÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΟ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ στÎŋ {product_name} έχÎĩÎđ ÎąÎ―ÎąÏƒÏ„ÎąÎŧÎĩÎŊ πρÎŋσωρÎđÎ―ÎŽ ÎģÎđÎą Ï€ÎąÏÎąÎēÎŊÎąÏƒÎ· Ï„Ï‰Î― ÎŒÏÏ‰Î― Ï€ÎąÏÎŋχÎŪς υπηρÎĩσÎđÏŽÎ― ÎŪ Ï„Ï‰Î― ΟÎīηÎģÎđÏŽÎ― ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„ÎąÏ‚.\n\nΔÎđΎρΚÎĩÎđÎą: {durationHours, plural,\n =1 {ΞÎŊÎą ÏŽÏÎą}\n other {# ώρÎĩς}\n}\nÎ‘Î―ÎąÏƒÏ„ÎŋÎŧÎŪ ÎžÎ­Ï‡ÏÎđ: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {ΛόÎģÎŋς: {reason}}\n}\n\nÎšÎąÏ„ÎŽ τη ÎīÎđΎρΚÎĩÎđÎą ÎąÏ…Ï„ÎŪς της πÎĩρÎđόÎīÎŋυ, ÎīÎĩÎ― ÎļÎą έχÎĩÎđς πρόσÎēÎąÏƒÎ· στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ.\n\nΈÎŧÎĩÎģÎūÎĩ:\n- ΌρÎŋÎđ Ï€ÎąÏÎŋχÎŪς υπηρÎĩσÎđÏŽÎ―: {termsUrl}\n- ΟÎīηÎģÎŊÎĩς ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„ÎąÏ‚: {guidelinesUrl}\n\nÎ•ÎŽÎ― πÎđστÎĩύÎĩÎđς ότÎđ ÎąÏ…Ï„ÎŪ Î· ÎąÏ€ÏŒÏ†ÎąÏƒÎ· ÎŪÏ„ÎąÎ― ÎŧÎąÎ―ÎļÎąÏƒÎžÎ­Î―Î· ÎŪ ÎąÎīÎđΚιÎđÎŋÎŧόÎģητη, ΞπÎŋρÎĩÎŊς Î―Îą υπÎŋÎēÎŽÎŧÎĩÎđς πρÎŋσφυÎģÎŪ. ÎĢτÎĩÎŊÎŧÎĩ email στÎŋ {appeals_email} ÎąÏ€ÏŒ ÎąÏ…Ï„ÎŪÎ― τη ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· email ΚιÎđ ÎĩÎūÎŪÎģησÎĩ ÏƒÎąÏ†ÏŽÏ‚ ÎģÎđÎąÏ„ÎŊ πÎđστÎĩύÎĩÎđς ότÎđ η ÎąÏ€ÏŒÏ†ÎąÏƒÎ· ÎŪÏ„ÎąÎ― ÎŧÎąÎ―ÎļÎąÏƒÎžÎ­Î―Î·. Θι ÎĩÎūÎĩτΎσÎŋυΞÎĩ Ï„Î·Î― πρÎŋσφυÎģÎŪ ÏƒÎŋυ ΚιÎđ ÎļÎą σÎŋυ ÎąÏ€ÎąÎ―Ï„ÎŪσÎŋυΞÎĩ ΞÎĩ Ï„Î·Î― ÎąÏ€ÏŒÏ†ÎąÏƒÎŪ ÎžÎąÏ‚.\n\n– Η ÎŋΞΎÎīÎą ÎąÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ τÎŋυ {product_name}"
},
"donation_confirmation": {
"subject": "Î•Ï…Ï‡ÎąÏÎđστÎŋύΞÎĩ ÎģÎđÎą τη ÎīωρÎĩÎŽ σÎŋυ στÎŋ {product_name}",
"body": "ΓÎĩÎđÎą σÎŋυ,\n\nÎ•Ï…Ï‡ÎąÏÎđστÎŋύΞÎĩ ÎģÎđÎą τη ÎīωρÎĩÎŽ σÎŋυ στÎŋ {product_name}! Η {interval, select,\n month {ÎĩÏ€ÎąÎ―ÎąÎŧιΞÎēÎąÎ―ÏŒÎžÎĩÎ―Î· ÎīωρÎĩÎŽ}\n year {ÎĩÏ€ÎąÎ―ÎąÎŧιΞÎēÎąÎ―ÏŒÎžÎĩÎ―Î· ÎīωρÎĩÎŽ}\n other {ÎĩÏ†ÎŽÏ€ÎąÎū ÎīωρÎĩÎŽ}\n} σÎŋυ έχÎĩÎđ {interval, select,\n month {ρυÎļΞÎđστÎĩÎŊ}\n year {ρυÎļΞÎđστÎĩÎŊ}\n other {ÎĩπÎĩÎūÎĩρÎģÎąÏƒÏ„ÎĩÎŊ}\n} ÎĩπÎđτυχώς.\n\nΛÎĩπτÎŋΞέρÎĩÎđÎĩς ÎīωρÎĩÎŽÏ‚:\nΠÎŋσό: {amount} {currency} {interval, select,\n month {ÎąÎ―ÎŽ ΞÎŪÎ―Îą}\n year {ÎąÎ―ÎŽ έτÎŋς}\n other {}\n}\n\nΗ Stripe ÎļÎą σÎŋυ στÎĩÎŊÎŧÎĩÎđ ÏƒÏÎ―Ï„ÎŋΞι ΞÎđÎą ÎūÎĩχωρÎđστÎŪ ÎąÏ€ÏŒÎīÎĩÎđÎūη ΞÎĩ τÎŋ PDF τÎŋυ τÎđΞÎŋÎŧÎŋÎģÎŊÎŋυ σÎŋυ. Αυτό πÎĩρÎđÎŧιΞÎēÎŽÎ―ÎĩÎđ όÎŧÎĩς τÎđς ÎŧÎĩπτÎŋΞέρÎĩÎđÎĩς πÎŧηρωΞÎŪς ΚιÎđ ΞπÎŋρÎĩÎŊ Î―Îą χρησÎđΞÎŋπÎŋÎđηÎļÎĩÎŊ ÎģÎđÎą φÎŋρÎŋÎŧÎŋÎģÎđΚÎŋύς σΚÎŋπÎŋύς.\n\nΜπÎŋρÎĩÎŊς Î―Îą ÎīÎĩÎđς τÎŋ ÎđστÎŋρÎđΚό Ï„Ï‰Î― ÎīωρÎĩÏŽÎ― σÎŋυ, Î―Îą ÎšÎąÏ„ÎĩÎēΎσÎĩÎđς τÎđΞÎŋÎŧόÎģÎđÎą, {interval, select,\n month {ΚιÎđ Î―Îą ÎīÎđÎąÏ‡ÎĩÎđρÎđστÎĩÎŊς ÎŪ Î―Îą ÎąÎšÏ…ÏÏŽÏƒÎĩÎđς τη ÏƒÏ…Î―ÎīρÎŋΞÎŪ ÏƒÎŋυ}\n year {ΚιÎđ Î―Îą ÎīÎđÎąÏ‡ÎĩÎđρÎđστÎĩÎŊς ÎŪ Î―Îą ÎąÎšÏ…ÏÏŽÏƒÎĩÎđς τη ÏƒÏ…Î―ÎīρÎŋΞÎŪ ÏƒÎŋυ}\n other {ΚιÎđ Î―Îą ÎīÎđÎąÏ‡ÎĩÎđρÎđστÎĩÎŊς ΞÎĩÎŧÎŧÎŋÎ―Ï„ÎđΚές ÎīωρÎĩές}\n} ÎąÎ―ÎŽ Ï€ÎŽÏƒÎą στÎđÎģΞÎŪ Ï‡ÏÎ·ÏƒÎđΞÎŋπÎŋÎđÏŽÎ―Ï„ÎąÏ‚ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ÏƒÏÎ―ÎīÎĩσΞÎŋ:\n\n{manageUrl}\n\nΗ υπÎŋστÎŪρÎđÎūÎŪ ÏƒÎŋυ ÎēÎŋηÎļÎŽÎĩÎđ τÎŋ {product_name} Î―Îą ÏƒÏ…Î―ÎĩχÎŊσÎĩÎđ Î―Îą ÎŧÎĩÎđτÎŋυρÎģÎĩÎŊ. Î•Ï…Ï‡ÎąÏÎđστÎŋύΞÎĩ!\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ,\n\nÎ•Ï…Ï‡ÎąÏÎđστÎŋύΞÎĩ ÎģÎđÎą τη ÎīωρÎĩÎŽ σÎŋυ στÎŋ {product_name}! Η {interval, select,\n month {ÎĩÏ€ÎąÎ―ÎąÎŧιΞÎēÎąÎ―ÏŒÎžÎĩÎ―Î· ÎīωρÎĩÎŽ}\n year {ÎĩÏ€ÎąÎ―ÎąÎŧιΞÎēÎąÎ―ÏŒÎžÎĩÎ―Î· ÎīωρÎĩÎŽ}\n other {ÎĩÏ†ÎŽÏ€ÎąÎū ÎīωρÎĩÎŽ}\n} σÎŋυ έχÎĩÎđ {interval, select,\n month {ρυÎļΞÎđστÎĩÎŊ}\n year {ρυÎļΞÎđστÎĩÎŊ}\n other {ÎŋÎŧÎŋΚÎŧηρωÎļÎĩÎŊ}\n} ΞÎĩ ÎĩπÎđτυχÎŊÎą.\n\nΛÎĩπτÎŋΞέρÎĩÎđÎĩς ÎīωρÎĩÎŽÏ‚:\nΠÎŋσό: {amount} {interval, select,\n month {ÎąÎ―ÎŽ ΞÎŪÎ―Îą}\n year {ÎąÎ―ÎŽ έτÎŋς}\n other {}\n}\n\nΗ Stripe ÎļÎą σÎŋυ στÎĩÎŊÎŧÎĩÎđ ÏƒÏÎ―Ï„ÎŋΞι ÎūÎĩχωρÎđστÎŪ ÎąÏ€ÏŒÎīÎĩÎđÎūη ΞÎĩ τÎŋ PDF τÎŋυ τÎđΞÎŋÎŧÎŋÎģÎŊÎŋυ σÎŋυ. ΠÎĩρÎđÎŧιΞÎēÎŽÎ―ÎĩÎđ όÎŧÎĩς τÎđς ÎŧÎĩπτÎŋΞέρÎĩÎđÎĩς πÎŧηρωΞÎŪς ΚιÎđ ΞπÎŋρÎĩÎŊ Î―Îą χρησÎđΞÎŋπÎŋÎđηÎļÎĩÎŊ ÎģÎđÎą φÎŋρÎŋÎŧÎŋÎģÎđΚÎŋύς σΚÎŋπÎŋύς.\n\nΜπÎŋρÎĩÎŊς Î―Îą ÎīÎĩÎđς τÎŋ ÎđστÎŋρÎđΚό Ï„Ï‰Î― ÎīωρÎĩÏŽÎ― σÎŋυ, Î―Îą ÎšÎąÏ„ÎĩÎēΎσÎĩÎđς τÎđΞÎŋÎŧόÎģÎđÎą, {interval, select,\n month {ΚιÎđ Î―Îą ÎīÎđÎąÏ‡ÎĩÎđρÎđστÎĩÎŊς ÎŪ Î―Îą ÎąÎšÏ…ÏÏŽÏƒÎĩÎđς τη ÏƒÏ…Î―ÎīρÎŋΞÎŪ ÏƒÎŋυ}\n year {ΚιÎđ Î―Îą ÎīÎđÎąÏ‡ÎĩÎđρÎđστÎĩÎŊς ÎŪ Î―Îą ÎąÎšÏ…ÏÏŽÏƒÎĩÎđς τη ÏƒÏ…Î―ÎīρÎŋΞÎŪ ÏƒÎŋυ}\n other {ΚιÎđ Î―Îą ÎīÎđÎąÏ‡ÎĩÎđρÎđστÎĩÎŊς ΞÎĩÎŧÎŧÎŋÎ―Ï„ÎđΚές ÎīωρÎĩές}\n} ÎąÎ―ÎŽ Ï€ÎŽÏƒÎą στÎđÎģΞÎŪ Ï‡ÏÎ·ÏƒÎđΞÎŋπÎŋÎđÏŽÎ―Ï„ÎąÏ‚ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ÏƒÏÎ―ÎīÎĩσΞÎŋ:\n\n{manageUrl}\n\nΗ υπÎŋστÎŪρÎđÎūÎŪ ÏƒÎŋυ ÎēÎŋηÎļÎŽÎĩÎđ τÎŋ {product_name} Î―Îą ÏƒÏ…Î―ÎĩχÎŊσÎĩÎđ Î―Îą ÎŧÎĩÎđτÎŋυρÎģÎĩÎŊ. Î•Ï…Ï‡ÎąÏÎđστÎŋύΞÎĩ!\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"donation_magic_link": {
"subject": "ΔÎđÎąÏ‡ÎĩÎŊρÎđση Ï„Ï‰Î― ÎīωρÎĩÏŽÎ― σÎŋυ στÎŋ {product_name}",
"body": "ΓÎĩÎđÎą σÎŋυ,\n\nÎšÎŽÎ―Îĩ ΚÎŧÎđΚ στÎŋÎ― Ï€ÎąÏÎąÎšÎŽÏ„Ï‰ ÏƒÏÎ―ÎīÎĩσΞÎŋ ÎģÎđÎą Î―Îą ÎąÏ€ÎŋΚτÎŪσÎĩÎđς πρόσÎēÎąÏƒÎ· ÏƒÏ„Î·Î― πύÎŧη ÎīÏ‰ÏÎ·Ï„ÏŽÎ― σÎŋυ:\n\n{manageUrl}\n\nÎĢÏ„Î·Î― πύÎŧη, ΞπÎŋρÎĩÎŊς Î―Îą ÎīÎđÎąÏ‡ÎĩÎđρÎđστÎĩÎŊς τÎđς ÏƒÏ…Î―ÎīρÎŋΞές, Î―Îą ÎšÎąÏ„ÎĩÎēΎσÎĩÎđς τÎđΞÎŋÎŧόÎģÎđÎą ΚιÎđ Î―Îą ÎīÎĩÎđς τÎŋ ÎđστÎŋρÎđΚό Ï„Ï‰Î― ÎīωρÎĩÏŽÎ― σÎŋυ.\n\nΑυτός Îŋ ÏƒÏÎ―ÎīÎĩσΞÎŋς ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} στÎđς {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― ÎķÎŪτησÎĩς ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ÏƒÏÎ―ÎīÎĩσΞÎŋ, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎģÎ―ÎŋÎŪσÎĩÎđς ΞÎĩ ÎąÏƒÏ†ÎŽÎŧÎĩÎđÎą ÎąÏ…Ï„ÏŒ τÎŋ email.\n\n– ΟξήÎīÎą {product_name}"
"subject": "ΔÎđÎąÏ‡ÎĩÎđρÎŊσÎŋυ τÎđς ÎīωρÎĩές σÎŋυ στÎŋ {product_name}",
"body": "ΓÎĩÎđÎą σÎŋυ,\n\nÎšÎŽÎ―Îĩ ΚÎŧÎđΚ στÎŋÎ― Ï€ÎąÏÎąÎšÎŽÏ„Ï‰ ÏƒÏÎ―ÎīÎĩσΞÎŋ ÎģÎđÎą Î―Îą ÎąÏ€ÎŋΚτÎŪσÎĩÎđς πρόσÎēÎąÏƒÎ· ÏƒÏ„Î·Î― πύÎŧη ÎīÏ‰ÏÎ·Ï„ÏŽÎ― σÎŋυ:\n\n{manageUrl}\n\nÎĢÏ„Î·Î― πύÎŧη ΞπÎŋρÎĩÎŊς Î―Îą ÎīÎđÎąÏ‡ÎĩÎđρÎđστÎĩÎŊς τÎđς ÏƒÏ…Î―ÎīρÎŋΞές, Î―Îą ÎšÎąÏ„ÎĩÎēΎσÎĩÎđς τÎđΞÎŋÎŧόÎģÎđÎą ΚιÎđ Î―Îą ÎīÎĩÎđς τÎŋ ÎđστÎŋρÎđΚό Ï„Ï‰Î― ÎīωρÎĩÏŽÎ― σÎŋυ.\n\nΑυτός Îŋ ÏƒÏÎ―ÎīÎĩσΞÎŋς ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} ΚιÎđ ÏŽÏÎą {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― ÎķÎŪτησÎĩς ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ÏƒÏÎ―ÎīÎĩσΞÎŋ, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎģÎ―ÎŋÎŪσÎĩÎđς ΞÎĩ ÎąÏƒÏ†ÎŽÎŧÎĩÎđÎą ÎąÏ…Ï„ÏŒ τÎŋ email.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"dsa_report_verification": {
"subject": "Î•Ï€ÎąÎŧÎŪÎļÎĩυσÎĩ τÎŋ email σÎŋυ ÎģÎđÎą ΞÎđÎą ÎąÎ―ÎąÏ†ÎŋρΎ DSA",
"body": "ΓÎĩÎđÎą σÎŋυ,\n\nΧρησÎđΞÎŋπÎŋÎŊησÎĩ τÎŋÎ― Ï€ÎąÏÎąÎšÎŽÏ„Ï‰ ΚωÎīÎđΚό ÎĩÏ€ÎąÎŧÎŪÎļÎĩυσης ÎģÎđÎą Î―Îą υπÎŋÎēÎŽÎŧÎĩÎđς Ï„Î·Î― ÎąÎ―ÎąÏ†ÎŋρΎ σÎŋυ ÎģÎđÎą τÎŋÎ― ΝόΞÎŋ πÎĩρÎŊ ÎĻηφÎđÎąÎšÏŽÎ― ÎĨπηρÎĩσÎđÏŽÎ― στÎŋ {product_name}:\n\n{code}\n\nΑυτός Îŋ ΚωÎīÎđΚός ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} στÎđς {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎģÎ―ÎŋÎŪσÎĩÎđς ÎąÏ…Ï„ÏŒ τÎŋ email.\n\n– ΟξήÎīÎą Î‘ÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ {product_name}"
"subject": "Î•Ï€ÎąÎŧÎŪÎļÎĩυσÎĩ τÎŋ email σÎŋυ ÎģÎđÎą ÎąÎ―ÎąÏ†ÎŋρΎ DSA",
"body": "ΓÎĩÎđÎą σÎŋυ,\n\nΧρησÎđΞÎŋπÎŋÎŊησÎĩ τÎŋÎ― Ï€ÎąÏÎąÎšÎŽÏ„Ï‰ ΚωÎīÎđΚό ÎĩÏ€ÎąÎŧÎŪÎļÎĩυσης ÎģÎđÎą Î―Îą υπÎŋÎēÎŽÎŧÎĩÎđς Ï„Î·Î― ÎąÎ―ÎąÏ†ÎŋρΎ σÎŋυ ÎēΎσÎĩÎđ της ΠρΎÎūης ÎģÎđÎą τÎđς ψηφÎđÎąÎšÎ­Ï‚ υπηρÎĩσÎŊÎĩς στÎŋ {product_name}:\n\n{code}\n\nΑυτός Îŋ ΚωÎīÎđΚός ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} ΚιÎđ ÏŽÏÎą {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎģÎ―ÎŋÎŪσÎĩÎđς ÎąÏ…Ï„ÏŒ τÎŋ email.\n\n– Η ÎŋΞΎÎīÎą ÎąÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ τÎŋυ {product_name}"
},
"email_change_new": {
"subject": "Î•Ï€ÎąÎŧÎŪÎļÎĩυσÎĩ τÎŋ Î―Î­Îŋ σÎŋυ email στÎŋ {product_name}",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΕÎđσÎŪÎģÎąÎģÎĩ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ΚωÎīÎđΚό ÏƒÏ„Î·Î― ÎĩÏ†ÎąÏÎžÎŋÎģÎŪ ÎģÎđÎą Î―Îą ÎĩÏ€ÎąÎŧηÎļÎĩύσÎĩÎđς τÎŋ Î―Î­Îŋ σÎŋυ email στÎŋ {product_name}:\n\n{code}\n\nΑυτός Îŋ ΚωÎīÎđΚός ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} στÎđς {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎģÎ―ÎŋÎŪσÎĩÎđς ÎąÏ…Ï„ÏŒ τÎŋ email.\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΠÎŧηΚτρÎŋÎŧόÎģησÎĩ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ΚωÎīÎđΚό ÏƒÏ„Î·Î― ÎĩÏ†ÎąÏÎžÎŋÎģÎŪ ÎģÎđÎą Î―Îą ÎĩÏ€ÎąÎŧηÎļÎĩύσÎĩÎđς τÎŋ Î―Î­Îŋ σÎŋυ email στÎŋ {product_name}:\n\n{code}\n\nΑυτός Îŋ ΚωÎīÎđΚός ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} ΚιÎđ ÏŽÏÎą {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎģÎ―ÎŋÎŪσÎĩÎđς ÎąÏ…Ï„ÏŒ τÎŋ email.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"email_change_original": {
"subject": "ΕπÎđÎēÎĩÎēÎąÎŊωσÎĩ Ï„Î·Î― ÎąÎŧÎŧÎąÎģÎŪ email στÎŋ {product_name}",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΛήÎēιΞÎĩ Î­Î―Îą ÎąÎŊÏ„Î·ÎžÎą ÎģÎđÎą ÎąÎŧÎŧÎąÎģÎŪ Ï„Î·Ï‚ ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ·Ï‚ email στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name}.\n\nΓÎđÎą Î―Îą ÎĩπÎđÎēÎĩÎēÎąÎđώσÎĩÎđς ÎąÏ…Ï„ÎŪÎ― Ï„Î·Î― ÎąÎŧÎŧÎąÎģÎŪ, ÎĩÎđσÎŪÎģÎąÎģÎĩ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ΚωÎīÎđΚό ÏƒÏ„Î·Î― ÎĩÏ†ÎąÏÎžÎŋÎģÎŪ:\n\n{code}\n\nΑυτός Îŋ ΚωÎīÎđΚός ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} στÎđς {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ÎąÏƒÏ†ÎŽÎŧÎđσÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ τÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ.\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΛήÎēιΞÎĩ ÎąÎŊÏ„Î·ÎžÎą ÎģÎđÎą ÎąÎŧÎŧÎąÎģÎŪ Ï„Î·Ï‚ ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ·Ï‚ email στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name}.\n\nΓÎđÎą Î―Îą ÎĩπÎđÎēÎĩÎēÎąÎđώσÎĩÎđς ÎąÏ…Ï„ÎŪÎ― Ï„Î·Î― ÎąÎŧÎŧÎąÎģÎŪ, πÎŧηΚτρÎŋÎŧόÎģησÎĩ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ΚωÎīÎđΚό ÏƒÏ„Î·Î― ÎĩÏ†ÎąÏÎžÎŋÎģÎŪ:\n\n{code}\n\nΑυτός Îŋ ΚωÎīÎđΚός ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} ΚιÎđ ÏŽÏÎą {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ÎąÏƒÏ†ÎŽÎŧÎđσÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ τÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"email_change_revert": {
"subject": "ÎĪÎŋ email στÎŋ {product_name} ÎŽÎŧÎŧÎąÎūÎĩ",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΗ ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· email τÎŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ στÎŋ {product_name} ÎŽÎŧÎŧÎąÎūÎĩ σÎĩ {newEmail}.\n\nÎ•ÎŽÎ― Î­ÎšÎąÎ―Îĩς ÎąÏ…Ï„ÎŪÎ― Ï„Î·Î― ÎąÎŧÎŧÎąÎģÎŪ, ÎīÎĩÎ― ÎąÏ€ÎąÎđτÎĩÎŊÏ„ÎąÎđ ΚιΞÎŊÎą ÎĩÎ―Î­ÏÎģÎĩÎđÎą. Î•ÎŽÎ― όχÎđ, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎ―ÎąÎđρέσÎĩÎđς Ï„Î·Î― ÎąÎŧÎŧÎąÎģÎŪ ÎšÎąÎđ Î―Îą ÎąÏƒÏ†ÎąÎŧÎŊσÎĩÎđς τÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ χρησÎđΞÎŋπÎŋÎđÏŽÎ―Ï„ÎąÏ‚ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ÏƒÏÎ―ÎīÎĩσΞÎŋ:\n\n{revertUrl}\n\nΑυτό ÎļÎą ÎĩÏ€ÎąÎ―ÎąÏ†Î­ÏÎĩÎđ τÎŋ πρÎŋηÎģÎŋύΞÎĩÎ―Îŋ email σÎŋυ, ÎļÎą σÎĩ ÎąÏ€ÎŋÏƒÏ…Î―ÎīέσÎĩÎđ ÎąÏ€ÏŒ Ï€ÎąÎ―Ï„Îŋύ, ÎļÎą ÎąÏ†ÎąÎđρέσÎĩÎđ τÎŋυς ÏƒÏ…Î―ÎīÎĩÎīÎĩÎžÎ­Î―Îŋυς ÎąÏÎđÎļΞÎŋύς τηÎŧÎĩÏ†ÏŽÎ―Îŋυ, ÎļÎą ÎąÏ€ÎĩÎ―ÎĩρÎģÎŋπÎŋÎđÎŪσÎĩÎđ τÎŋ MFA ΚιÎđ ÎļÎą ÎąÏ€ÎąÎđτÎŪσÎĩÎđ Î―Îą ÎŋρÎŊσÎĩÎđς Î­Î―ÎąÎ― Î―Î­Îŋ ΚωÎīÎđΚό πρόσÎēÎąÏƒÎ·Ï‚.\n\n– ΟξήÎīÎą Î‘ÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ {product_name}"
"subject": "ÎĪÎŋ email σÎŋυ στÎŋ {product_name} ÎŽÎŧÎŧÎąÎūÎĩ",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΗ ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· email τÎŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ στÎŋ {product_name} ÎŽÎŧÎŧÎąÎūÎĩ σÎĩ {newEmail}.\n\nÎ•ÎŽÎ― Î­ÎšÎąÎ―Îĩς Îĩσύ ÎąÏ…Ï„ÎŪÎ― Ï„Î·Î― ÎąÎŧÎŧÎąÎģÎŪ, ÎīÎĩÎ― χρÎĩÎđÎŽÎķÎĩÏ„ÎąÎđ Î―Îą ÎšÎŽÎ―ÎĩÎđς τÎŊπÎŋÏ„Îą. Î•ÎŽÎ― όχÎđ, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎ―ÎąÎđρέσÎĩÎđς Ï„Î·Î― ÎąÎŧÎŧÎąÎģÎŪ ÎšÎąÎđ Î―Îą ÎąÏƒÏ†ÎąÎŧÎŊσÎĩÎđς τÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ ΞÎĩ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ÏƒÏÎ―ÎīÎĩσΞÎŋ:\n\n{revertUrl}\n\nΑυτό ÎļÎą ÎĩÏ€ÎąÎ―ÎąÏ†Î­ÏÎĩÎđ τÎŋ πρÎŋηÎģÎŋύΞÎĩÎ―Îŋ email σÎŋυ, ÎļÎą σÎĩ ÎąÏ€ÎŋÏƒÏ…Î―ÎīέσÎĩÎđ ÎąÏ€ÏŒ Ï€ÎąÎ―Ï„Îŋύ, ÎļÎą ÎąÏ†ÎąÎđρέσÎĩÎđ τÎŋυς ÏƒÏ…Î―ÎīÎĩÎīÎĩÎžÎ­Î―Îŋυς ÎąÏÎđÎļΞÎŋύς τηÎŧÎĩÏ†ÏŽÎ―Îŋυ, ÎļÎą ÎąÏ€ÎĩÎ―ÎĩρÎģÎŋπÎŋÎđÎŪσÎĩÎđ τÎŋ MFA ΚιÎđ ÎļÎą σÎŋυ ÎķητÎŪσÎĩÎđ Î―Îą ÎŋρÎŊσÎĩÎđς Î―Î­Îŋ ΚωÎīÎđΚό πρόσÎēÎąÏƒÎ·Ï‚.\n\n– Η ÎŋΞΎÎīÎą ÎąÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ τÎŋυ {product_name}"
},
"email_verification": {
"subject": "Î•Ï€ÎąÎŧÎŪÎļÎĩυσÎĩ τη ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· email σÎŋυ στÎŋ {product_name}",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nÎ•Ï€ÎąÎŧÎŪÎļÎĩυσÎĩ τη ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· email ÎģÎđÎą τÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name} ÎšÎŽÎ―ÎŋÎ―Ï„ÎąÏ‚ ΚÎŧÎđΚ στÎŋÎ― Ï€ÎąÏÎąÎšÎŽÏ„Ï‰ ÏƒÏÎ―ÎīÎĩσΞÎŋ:\n\n{verifyUrl}\n\nÎ•ÎŽÎ― ÎīÎĩÎ― ÎīηΞÎđÎŋύρÎģησÎĩς ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ στÎŋ {product_name}, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎģÎ―ÎŋÎŪσÎĩÎđς ΞÎĩ ÎąÏƒÏ†ÎŽÎŧÎĩÎđÎą ÎąÏ…Ï„ÏŒ τÎŋ email.\n\nΑυτός Îŋ ÏƒÏÎ―ÎīÎĩσΞÎŋς ÎđσχύÎĩÎđ ÎģÎđÎą 24 ώρÎĩς.\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nÎ•Ï€ÎąÎŧÎŪÎļÎĩυσÎĩ τη ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· email ÎģÎđÎą τÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name} ÎšÎŽÎ―ÎŋÎ―Ï„ÎąÏ‚ ΚÎŧÎđΚ στÎŋÎ― Ï€ÎąÏÎąÎšÎŽÏ„Ï‰ ÏƒÏÎ―ÎīÎĩσΞÎŋ:\n\n{verifyUrl}\n\nÎ•ÎŽÎ― ÎīÎĩÎ― ÎīηΞÎđÎŋύρÎģησÎĩς ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ στÎŋ {product_name}, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎģÎ―ÎŋÎŪσÎĩÎđς ΞÎĩ ÎąÏƒÏ†ÎŽÎŧÎĩÎđÎą ÎąÏ…Ï„ÏŒ τÎŋ email.\n\nΑυτός Îŋ ÏƒÏÎ―ÎīÎĩσΞÎŋς ÎđσχύÎĩÎđ ÎģÎđÎą 24 ώρÎĩς.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"gift_chargeback_notification": {
"subject": "ÎĪÎą πρÎŋÎ―ÏŒÎžÎđÎą ÎąÏ€ÏŒ τÎŋ ÎīώρÎŋ πÎŋυ ÎĩÎūÎąÏÎģύρωσÎĩς έχÎŋÏ…Î― ÎąÏ†ÎąÎđρÎĩÎļÎĩÎŊ",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nÎˆÎ―ÎąÏ‚ ΚωÎīÎđΚός ÎīώρÎŋυ πÎŋυ ÎĩÎūÎąÏÎģύρωσÎĩς πÎŧηρώÎļηΚÎĩ ÎąÏÏ‡ÎđΚΎ ÎąÏ€ÏŒ ΚΎπÎŋÎđÎŋÎ― ÎŽÎŧÎŧÎŋ. ΑυτÎŪ Î· πÎŧηρωΞÎŪ Î­Ï‡ÎĩÎđ έΚτÎŋτÎĩ ÎąÎ―Ï„ÎđÏƒÏ„ÏÎąÏ†ÎĩÎŊ (ÎąÎžÏ†ÎđσÎēÎŪτηση χρέωσης).\n\nΛόÎģω ÎąÏ…Ï„Îŋύ, ÎąÏ†ÎąÎđÏÎ­ÏƒÎąÎžÎĩ Ï„Îą πρÎŋÎ―ÏŒÎžÎđÎą πÎŋυ πρÎŋστέÎļÎ·ÎšÎąÎ― στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ ÏŒÏ„ÎąÎ― ÎĩÎūÎąÏÎģύρωσÎĩς τÎŋ ÎīώρÎŋ.\n\nÎ•ÎŽÎ― πÎđστÎĩύÎĩÎđς ότÎđ πρόΚÎĩÎđÏ„ÎąÎđ ÎģÎđÎą ÎŧÎŽÎļÎŋς, ÎĩπÎđΚÎŋÎđÎ―ÏŽÎ―Î·ÏƒÎĩ ΞÎĩ Ï„Î·Î― ÎŋΞΎÎīÎą υπÎŋστÎŪρÎđÎūÎŪς ÎžÎąÏ‚ ΚιÎđ συΞπÎĩρÎŊÎŧÎąÎēÎĩ Ï„Ï…Ï‡ÏŒÎ― ÎŧÎĩπτÎŋΞέρÎĩÎđÎĩς πÎŋυ έχÎĩÎđς σχÎĩτÎđΚΎ ΞÎĩ τÎŋÎ― ΚωÎīÎđΚό ÎīώρÎŋυ ΚιÎđ πότÎĩ τÎŋÎ― ÎĩÎūÎąÏÎģύρωσÎĩς.\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nÎˆÎ―ÎąÏ‚ ΚωÎīÎđΚός ÎīώρÎŋυ πÎŋυ ÎĩÎūÎąÏÎģύρωσÎĩς πÎŧηρώÎļηΚÎĩ ÎąÏÏ‡ÎđΚΎ ÎąÏ€ÏŒ ΚΎπÎŋÎđÎŋÎ― ÎŽÎŧÎŧÎŋ. ΑυτÎŪ Î· πÎŧηρωΞÎŪ Î­Ï‡ÎĩÎđ έΚτÎŋτÎĩ ÎąÎ―Ï„ÎđÏƒÏ„ÏÎąÏ†ÎĩÎŊ (ÎąÎžÏ†ÎđσÎēÎŪτηση χρέωσης).\n\nΓÎđ' ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ÎŧόÎģÎŋ, ÎąÏ†ÎąÎđÏÎ­ÏƒÎąÎžÎĩ Ï„Îą πρÎŋÎ―ÏŒÎžÎđÎą πÎŋυ πρÎŋστέÎļÎ·ÎšÎąÎ― στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ ÏŒÏ„ÎąÎ― ÎĩÎūÎąÏÎģύρωσÎĩς τÎŋ ÎīώρÎŋ.\n\nÎ•ÎŽÎ― πÎđστÎĩύÎĩÎđς ότÎđ πρόΚÎĩÎđÏ„ÎąÎđ ÎģÎđÎą ÎŧÎŽÎļÎŋς, ÎĩπÎđΚÎŋÎđÎ―ÏŽÎ―Î·ÏƒÎĩ ΞÎĩ Ï„Î·Î― ÎŋΞΎÎīÎą υπÎŋστÎŪρÎđÎūÎŪς ÎžÎąÏ‚ ΚιÎđ ÎąÎ―ÎŽÏ†ÎĩρÎĩ όσÎĩς ÎŧÎĩπτÎŋΞέρÎĩÎđÎĩς έχÎĩÎđς σχÎĩτÎđΚΎ ΞÎĩ τÎŋÎ― ΚωÎīÎđΚό ÎīώρÎŋυ ΚιÎđ τÎŋ πότÎĩ τÎŋÎ― ÎĩÎūÎąÏÎģύρωσÎĩς.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"harvest_completed": {
"subject": "Η ÎĩÎūÎąÎģωÎģÎŪ ÎīÎĩÎīÎŋÎžÎ­Î―Ï‰Î― σÎŋυ στÎŋ {product_name} ÎĩÎŊÎ―ÎąÎđ έτÎŋÎđΞη ÎģÎđÎą ÎŧÎŪψη",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΗ ÎĩÎūÎąÎģωÎģÎŪ ÎīÎĩÎīÎŋÎžÎ­Î―Ï‰Î― σÎŋυ ÎĩÎŊÎ―ÎąÎđ έτÎŋÎđΞη.\n\nÎĢÏÎ―ÎīÎĩσΞÎŋς ÎŧÎŪψης:\n{downloadUrl}\n\nÎĢυΞπÎĩρÎđÎŧιΞÎēÎąÎ―ÏŒÎžÎĩÎ―Îą ÎžÎ·Î―ÏÎžÎąÏ„Îą: {totalMessages, number}\nΜέÎģÎĩÎļÎŋς ÎąÏÏ‡ÎĩÎŊÎŋυ: {fileSizeMB, number} MB\n\nΑυτός Îŋ ÏƒÏÎ―ÎīÎĩσΞÎŋς ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} στÎđς {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― ÎķÎŪτησÎĩς ÎąÏ…Ï„ÎŪÎ― Ï„Î·Î― ÎĩÎūÎąÎģωÎģÎŪ, ÎŽÎŧÎŧÎąÎūÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ ΚιÎđ ÎĩπÎđΚÎŋÎđÎ―ÏŽÎ―Î·ÏƒÎĩ ΞÎĩ Ï„Î·Î― ÎŋΞΎÎīÎą υπÎŋστÎŪρÎđÎūÎŪς ÎžÎąÏ‚.\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΗ ÎĩÎūÎąÎģωÎģÎŪ ÎīÎĩÎīÎŋÎžÎ­Î―Ï‰Î― σÎŋυ ÎĩÎŊÎ―ÎąÎđ έτÎŋÎđΞη.\n\nÎĢÏÎ―ÎīÎĩσΞÎŋς ÎŧÎŪψης:\n{downloadUrl}\n\nÎœÎ·Î―ÏÎžÎąÏ„Îą πÎŋυ πÎĩρÎđÎŧιΞÎēÎŽÎ―ÎŋÎ―Ï„ÎąÎđ: {totalMessages, number}\nΜέÎģÎĩÎļÎŋς ÎąÏÏ‡ÎĩÎŊÎŋυ: {fileSizeMB, number} MB\n\nΑυτός Îŋ ÏƒÏÎ―ÎīÎĩσΞÎŋς ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} ΚιÎđ ÏŽÏÎą {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― ÎķÎŪτησÎĩς ÎąÏ…Ï„ÎŪÎ― Ï„Î·Î― ÎĩÎūÎąÎģωÎģÎŪ, ÎŽÎŧÎŧÎąÎūÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ ΚιÎđ ÎĩπÎđΚÎŋÎđÎ―ÏŽÎ―Î·ÏƒÎĩ ΞÎĩ Ï„Î·Î― ÎŋΞΎÎīÎą υπÎŋστÎŪρÎđÎūÎŪς ÎžÎąÏ‚.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"inactivity_warning": {
"subject": "Ο ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ στÎŋ {product_name} ÎļÎą ÎīÎđÎąÎģÏÎąÏ†ÎĩÎŊ ÎŧόÎģω ÎąÎīÏÎŽÎ―ÎĩÎđÎąÏ‚",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΔÎĩÎ― έχÎŋυΞÎĩ ÎīÎĩÎđ ΚιΞÎŊÎą ÎīÏÎąÏƒÏ„Î·ÏÎđÏŒÏ„Î·Ï„Îą στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name} ÎąÏ€ÏŒ τÎđς {lastActiveDate, date, full}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― ÏƒÏ…Î―ÎīÎĩÎļÎĩÎŊς ΞέχρÎđ τÎđς {deletionDate, date, full} στÎđς {deletionDate, time, short}, Îŋ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ ÎļÎą ÎīÎđÎąÎģÏÎąÏ†ÎĩÎŊ ÎŋρÎđστÎđΚΎ ÎŧόÎģω ÎąÎīÏÎŽÎ―ÎĩÎđÎąÏ‚.\n\nÎĢÏ…Î―ÎīέσÎŋυ ÎĩÎīώ:\n{loginUrl}\n\nÎ•ÎŽÎ― χρησÎđΞÎŋπÎŋÎŊησÎĩς τÎŋ {product_name} Ï€ÏÏŒÏƒÏ†ÎąÏ„Îą, ÎĩπÎđΚÎŋÎđÎ―ÏŽÎ―Î·ÏƒÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ ΞÎĩ Ï„Î·Î― ÎŋΞΎÎīÎą υπÎŋστÎŪρÎđÎūÎŪς ÎžÎąÏ‚.\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΔÎĩÎ― έχÎŋυΞÎĩ ÎīÎĩÎđ ΚιΞÎŊÎą ÎīÏÎąÏƒÏ„Î·ÏÎđÏŒÏ„Î·Ï„Îą στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name} ÎąÏ€ÏŒ τÎđς {lastActiveDate, date, full}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― ÏƒÏ…Î―ÎīÎĩÎļÎĩÎŊς ΞέχρÎđ τÎđς {deletionDate, date, full} ΚιÎđ ÏŽÏÎą {deletionDate, time, short}, Îŋ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ ÎļÎą ÎīÎđÎąÎģÏÎąÏ†ÎĩÎŊ ÎŋρÎđστÎđΚΎ ÎŧόÎģω ÎąÎīÏÎŽÎ―ÎĩÎđÎąÏ‚.\n\nÎĢÏ…Î―ÎīέσÎŋυ ÎĩÎīώ:\n{loginUrl}\n\nÎ•ÎŽÎ― χρησÎđΞÎŋπÎŋÎŊησÎĩς τÎŋ {product_name} Ï€ÏÏŒÏƒÏ†ÎąÏ„Îą, ÎĩπÎđΚÎŋÎđÎ―ÏŽÎ―Î·ÏƒÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ ΞÎĩ Ï„Î·Î― ÎŋΞΎÎīÎą υπÎŋστÎŪρÎđÎūÎŪς ÎžÎąÏ‚.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"ip_authorization": {
"subject": "ΕÎūÎŋυσÎđÎŋÎīότησÎĩ τη ÏƒÏÎ―ÎīÎĩση ÎąÏ€ÏŒ ΞÎđÎą Î―Î­Îą ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· IP",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nÎ•Î―Ï„ÎŋπÎŊÏƒÎąÎžÎĩ ΞÎđÎą πρÎŋσπΎÎļÎĩÎđÎą ÏƒÏÎ―ÎīÎĩσης στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name} ÎąÏ€ÏŒ ΞÎđÎą Î―Î­Îą ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· IP:\n\nΔÎđÎĩύÎļÏ…Î―ÏƒÎ· IP: {ipAddress}\nÎĪÎŋπÎŋÎļÎĩσÎŊÎą: {location}\n\nÎ•ÎŽÎ― ÎŪσÎŋÏ…Î― Îĩσύ, ÎĩÎūÎŋυσÎđÎŋÎīότησÎĩ ÎąÏ…Ï„ÎŪÎ― τη ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· IP ÎšÎŽÎ―ÎŋÎ―Ï„ÎąÏ‚ ΚÎŧÎđΚ στÎŋÎ― Ï€ÎąÏÎąÎšÎŽÏ„Ï‰ ÏƒÏÎ―ÎīÎĩσΞÎŋ:\n\n{authUrl}\n\nÎ•ÎŽÎ― ÎīÎĩÎ― πρÎŋσπΎÎļησÎĩς Î―Îą ÏƒÏ…Î―ÎīÎĩÎļÎĩÎŊς, ÎŽÎŧÎŧÎąÎūÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ.\n\nΑυτός Îŋ ÏƒÏÎ―ÎīÎĩσΞÎŋς ÎđσχύÎĩÎđ ÎģÎđÎą 30 ÎŧÎĩπτΎ.\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nÎ•Î―Ï„ÎŋπÎŊÏƒÎąÎžÎĩ ΞÎđÎą πρÎŋσπΎÎļÎĩÎđÎą ÏƒÏÎ―ÎīÎĩσης στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name} ÎąÏ€ÏŒ Î―Î­Îą ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· IP:\n\nΔÎđÎĩύÎļÏ…Î―ÏƒÎ· IP: {ipAddress}\nÎĪÎŋπÎŋÎļÎĩσÎŊÎą: {location}\n\nÎ•ÎŽÎ― ÎŪσÎŋÏ…Î― Îĩσύ, ÎĩÎūÎŋυσÎđÎŋÎīότησÎĩ ÎąÏ…Ï„ÎŪÎ― τη ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· IP ÎšÎŽÎ―ÎŋÎ―Ï„ÎąÏ‚ ΚÎŧÎđΚ στÎŋÎ― Ï€ÎąÏÎąÎšÎŽÏ„Ï‰ ÏƒÏÎ―ÎīÎĩσΞÎŋ:\n\n{authUrl}\n\nÎ•ÎŽÎ― ÎīÎĩÎ― πρÎŋσπΎÎļησÎĩς Î―Îą ÏƒÏ…Î―ÎīÎĩÎļÎĩÎŊς, ÎŽÎŧÎŧÎąÎūÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ.\n\nΑυτός Îŋ ÏƒÏÎ―ÎīÎĩσΞÎŋς ÎđσχύÎĩÎđ ÎģÎđÎą 30 ÎŧÎĩπτΎ.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"mfa_backup_codes_view": {
"subject": "ΕπÎđÎēÎĩÎēÎąÎŊωσÎĩ Ï„Î·Î― πρόσÎēÎąÏƒÎ· στÎŋυς ÎĩφÎĩÎīρÎđΚÎŋύς ΚωÎīÎđΚÎŋύς σÎŋυ στÎŋ {product_name}",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΛήÎēιΞÎĩ Î­Î―Îą ÎąÎŊÏ„Î·ÎžÎą ÎģÎđÎą πρÎŋÎēÎŋÎŧÎŪ Ï„Ï‰Î― ÎĩφÎĩÎīρÎđÎšÏŽÎ― ΚωÎīÎđÎšÏŽÎ― στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name}.\n\nΓÎđÎą Î―Îą ÎĩπÎđÎēÎĩÎēÎąÎđώσÎĩÎđς ÎąÏ…Ï„ÏŒ τÎŋ ÎąÎŊÏ„Î·ÎžÎą, ÎĩÎđσÎŪÎģÎąÎģÎĩ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ΚωÎīÎđΚό ÏƒÏ„Î·Î― ÎĩÏ†ÎąÏÎžÎŋÎģÎŪ:\n\n{code}\n\nΑυτός Îŋ ΚωÎīÎđΚός ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} στÎđς {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ΚΎπÎŋÎđÎŋς ΞπÎŋρÎĩÎŊ Î―Îą έχÎĩÎđ πρόσÎēÎąÏƒÎ· στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ. ΆÎŧÎŧÎąÎūÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ.\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΛήÎēιΞÎĩ ÎąÎŊÏ„Î·ÎžÎą ÎģÎđÎą πρÎŋÎēÎŋÎŧÎŪ Ï„Ï‰Î― ÎĩφÎĩÎīρÎđÎšÏŽÎ― ΚωÎīÎđÎšÏŽÎ― στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name}.\n\nΓÎđÎą Î―Îą ÎĩπÎđÎēÎĩÎēÎąÎđώσÎĩÎđς ÎąÏ…Ï„ÏŒ τÎŋ ÎąÎŊÏ„Î·ÎžÎą, πÎŧηΚτρÎŋÎŧόÎģησÎĩ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ΚωÎīÎđΚό ÏƒÏ„Î·Î― ÎĩÏ†ÎąÏÎžÎŋÎģÎŪ:\n\n{code}\n\nΑυτός Îŋ ΚωÎīÎđΚός ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt, date, full} ΚιÎđ ÏŽÏÎą {expiresAt, time, short}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ΞπÎŋρÎĩÎŊ ΚΎπÎŋÎđÎŋς Î―Îą έχÎĩÎđ πρόσÎēÎąÏƒÎ· στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ. ΆÎŧÎŧÎąÎūÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"password_change_verification": {
"subject": "ΕπÎđÎēÎĩÎēÎąÎŊωσÎĩ Ï„Î·Î― ÎąÎŧÎŧÎąÎģÎŪ ÎšÏ‰ÎīÎđΚÎŋύ πρόσÎēÎąÏƒÎ·Ï‚ στÎŋ {product_name}",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΛήÎēιΞÎĩ Î­Î―Îą ÎąÎŊÏ„Î·ÎžÎą ÎģÎđÎą ÎąÎŧÎŧÎąÎģÎŪ Ï„Îŋυ ΚωÎīÎđΚÎŋύ πρόσÎēÎąÏƒÎ·Ï‚ στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name}.\n\nΓÎđÎą Î―Îą ÎĩπÎđÎēÎĩÎēÎąÎđώσÎĩÎđς ÎąÏ…Ï„ÎŪÎ― Ï„Î·Î― ÎąÎŧÎŧÎąÎģÎŪ, ÎĩÎđσÎŪÎģÎąÎģÎĩ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ΚωÎīÎđΚό ÏƒÏ„Î·Î― ÎĩÏ†ÎąÏÎžÎŋÎģÎŪ:\n\n{code}\n\nΑυτός Îŋ ΚωÎīÎđΚός ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ΚΎπÎŋÎđÎŋς ΞπÎŋρÎĩÎŊ Î―Îą έχÎĩÎđ πρόσÎēÎąÏƒÎ· στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ. ΆÎŧÎŧÎąÎūÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ ΚιÎđ ÎĩÎ―ÎĩρÎģÎŋπÎŋÎŊησÎĩ τÎŋÎ― έÎŧÎĩÎģχÎŋ Ï„ÎąÏ…Ï„ÏŒÏ„Î·Ï„ÎąÏ‚ ÎīύÎŋ Ï€ÎąÏÎąÎģÏŒÎ―Ï„Ï‰Î―.\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΛήÎēιΞÎĩ ÎąÎŊÏ„Î·ÎžÎą ÎģÎđÎą ÎąÎŧÎŧÎąÎģÎŪ Ï„Îŋυ ΚωÎīÎđΚÎŋύ πρόσÎēÎąÏƒÎ·Ï‚ στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ στÎŋ {product_name}.\n\nΓÎđÎą Î―Îą ÎĩπÎđÎēÎĩÎēÎąÎđώσÎĩÎđς ÎąÏ…Ï„ÎŪÎ― Ï„Î·Î― ÎąÎŧÎŧÎąÎģÎŪ, πÎŧηΚτρÎŋÎŧόÎģησÎĩ ÎąÏ…Ï„ÏŒÎ― τÎŋÎ― ΚωÎīÎđΚό ÏƒÏ„Î·Î― ÎĩÏ†ÎąÏÎžÎŋÎģÎŪ:\n\n{code}\n\nΑυτός Îŋ ΚωÎīÎđΚός ÎŧÎŪÎģÎĩÎđ στÎđς {expiresAt}.\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ΞπÎŋρÎĩÎŊ ΚΎπÎŋÎđÎŋς Î―Îą έχÎĩÎđ πρόσÎēÎąÏƒÎ· στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ. ΆÎŧÎŧÎąÎūÎĩ ÎąÎžÎ­ÏƒÏ‰Ï‚ τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ ΚιÎđ ÎĩÎ―ÎĩρÎģÎŋπÎŋÎŊησÎĩ τÎŋÎ― έÎŧÎĩÎģχÎŋ Ï„ÎąÏ…Ï„ÏŒÏ„Î·Ï„ÎąÏ‚ ÎīύÎŋ Ï€ÎąÏÎąÎģÏŒÎ―Ï„Ï‰Î―.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"password_reset": {
"subject": "Î•Ï€ÎąÎ―ÎąÏ†ÎŋρΎ τÎŋυ ΚωÎīÎđΚÎŋύ πρόσÎēÎąÏƒÎŪς σÎŋυ στÎŋ {product_name}",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΖÎŪτησÎĩς ÎĩÏ€ÎąÎ―ÎąÏ†ÎŋρΎ ΚωÎīÎđΚÎŋύ πρόσÎēÎąÏƒÎ·Ï‚ τÎŋυ {product_name}. ΧρησÎđΞÎŋπÎŋÎŊησÎĩ τÎŋÎ― Ï€ÎąÏÎąÎšÎŽÏ„Ï‰ ÏƒÏÎ―ÎīÎĩσΞÎŋ ÎģÎđÎą Î―Îą ÎŋρÎŊσÎĩÎđς Î­Î―ÎąÎ― Î―Î­Îŋ ΚωÎīÎđΚό πρόσÎēÎąÏƒÎ·Ï‚:\n\n{resetUrl}\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎģÎ―ÎŋÎŪσÎĩÎđς ΞÎĩ ÎąÏƒÏ†ÎŽÎŧÎĩÎđÎą ÎąÏ…Ï„ÏŒ τÎŋ email.\n\nΑυτός Îŋ ÏƒÏÎ―ÎīÎĩσΞÎŋς ÎđσχύÎĩÎđ ÎģÎđÎą 1 ÏŽÏÎą.\n\n– ΟξήÎīÎą {product_name}"
"subject": "Î•Ï€ÎąÎ―ÎŽÏ†ÎĩρÎĩ τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ στÎŋ {product_name}",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΖÎŪτησÎĩς ÎĩÏ€ÎąÎ―ÎąÏ†ÎŋρΎ τÎŋυ ΚωÎīÎđΚÎŋύ πρόσÎēÎąÏƒÎŪς σÎŋυ στÎŋ {product_name}. ΧρησÎđΞÎŋπÎŋÎŊησÎĩ τÎŋÎ― Ï€ÎąÏÎąÎšÎŽÏ„Ï‰ ÏƒÏÎ―ÎīÎĩσΞÎŋ ÎģÎđÎą Î―Îą ÎŋρÎŊσÎĩÎđς Î―Î­Îŋ ΚωÎīÎđΚό πρόσÎēÎąÏƒÎ·Ï‚:\n\n{resetUrl}\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ΞπÎŋρÎĩÎŊς Î―Îą ÎąÎģÎ―ÎŋÎŪσÎĩÎđς ΞÎĩ ÎąÏƒÏ†ÎŽÎŧÎĩÎđÎą ÎąÏ…Ï„ÏŒ τÎŋ email.\n\nΑυτός Îŋ ÏƒÏÎ―ÎīÎĩσΞÎŋς ÎđσχύÎĩÎđ ÎģÎđÎą 1 ÏŽÏÎą.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"registration_approved": {
"subject": "Η ÎĩÎģÎģÏÎąÏ†ÎŪ ÏƒÎŋυ στÎŋ {product_name} έχÎĩÎđ ÎĩÎģΚρÎđÎļÎĩÎŊ",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΚαÎŧÎŽ Î―Î­Îą: η ÎĩÎģÎģÏÎąÏ†ÎŪ ÏƒÎŋυ στÎŋ {product_name} έχÎĩÎđ ÎĩÎģΚρÎđÎļÎĩÎŊ.\n\nΜπÎŋρÎĩÎŊς Ï„ÏŽÏÎą Î―Îą ÏƒÏ…Î―ÎīÎĩÎļÎĩÎŊς ÏƒÏ„Î·Î― ÎĩÏ†ÎąÏÎžÎŋÎģÎŪ Ï„Îŋυ {product_name} ÎĩÎīώ:\n{channelsUrl}\n\nΚαÎŧώς ÎŪρÎļÎĩς ÏƒÏ„Î·Î― ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„Îą τÎŋυ {product_name}.\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΚαÎŧÎŽ Î―Î­Îą: η ÎĩÎģÎģÏÎąÏ†ÎŪ ÏƒÎŋυ στÎŋ {product_name} έχÎĩÎđ ÎĩÎģΚρÎđÎļÎĩÎŊ.\n\nΜπÎŋρÎĩÎŊς Ï„ÏŽÏÎą Î―Îą ÏƒÏ…Î―ÎīÎĩÎļÎĩÎŊς ÏƒÏ„Î·Î― ÎĩÏ†ÎąÏÎžÎŋÎģÎŪ Ï„Îŋυ {product_name} ÎĩÎīώ:\n{channelsUrl}\n\nΚαÎŧώς ÎŪρÎļÎĩς ÏƒÏ„Î·Î― ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„Îą τÎŋυ {product_name}.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"report_resolved": {
"subject": "Η ÎąÎ―ÎąÏ†ÎŋρΎ σÎŋυ στÎŋ {product_name} έχÎĩÎđ ÎĩÎūÎĩÏ„ÎąÏƒÏ„ÎĩÎŊ",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΗ ÎąÎ―ÎąÏ†ÎŋρΎ σÎŋυ (ID: {reportId}) έχÎĩÎđ ÎĩÎūÎĩÏ„ÎąÏƒÏ„ÎĩÎŊ ÎąÏ€ÏŒ Ï„Î·Î― ΟξήÎīÎą Î‘ÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ ÎžÎąÏ‚.{hasComment, select, yes {\n\nÎ‘Ï€ÎŽÎ―Ï„Î·ÏƒÎ· ÎąÏ€ÏŒ Ï„Î·Î― ΟξήÎīÎą Î‘ÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚:\n{publicComment}} other {}}\n\nÎ•Ï…Ï‡ÎąÏÎđστÎŋύΞÎĩ πÎŋυ ÎēÎŋηÎļÎŽÏ‚ Î―Îą ÎīÎđÎąÏ„Î·ÏÎŪσÎŋυΞÎĩ τÎŋ {product_name} ÎąÏƒÏ†ÎąÎŧές ÎģÎđÎą όÎŧÎŋυς. ΛαξÎēÎŽÎ―ÎŋυΞÎĩ όÎŧÎĩς τÎđς ÎąÎ―ÎąÏ†Îŋρές σÎŋÎēÎąÏÎŽ υπόψη ΚιÎđ ÎĩΚτÎđΞÎŋύΞÎĩ τη συΞÎēÎŋÎŧÎŪ ÏƒÎŋυ ÏƒÏ„Î·Î― ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„Îą.\n\nÎ•ÎŽÎ― έχÎĩÎđς ÎŋπÎŋÎđÎĩσÎīÎŪπÎŋτÎĩ ÎĩρωτÎŪσÎĩÎđς ÎŪ ÎąÎ―Î·ÏƒÏ…Ï‡ÎŊÎĩς σχÎĩτÎđΚΎ ΞÎĩ ÎąÏ…Ï„ÏŒ τÎŋ ÎąÏ€ÎŋτέÎŧÎĩÏƒÎžÎą, ÎĩπÎđΚÎŋÎđÎ―ÏŽÎ―Î·ÏƒÎĩ ΞÎĩ τÎŋ {safety_email}.\n\n– ΟξήÎīÎą Î‘ÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΗ ÎąÎ―ÎąÏ†ÎŋρΎ σÎŋυ (ID: {reportId}) ÎĩÎūÎĩτΎστηΚÎĩ ÎąÏ€ÏŒ Ï„Î·Î― ÎŋΞΎÎīÎą ÎąÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ ÎžÎąÏ‚.{hasComment, select, yes {\n\nÎ‘Ï€ÎŽÎ―Ï„Î·ÏƒÎ· ÎąÏ€ÏŒ Ï„Î·Î― ÎŋΞΎÎīÎą ÎąÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚:\n{publicComment}} other {}}\n\nÎ•Ï…Ï‡ÎąÏÎđστÎŋύΞÎĩ πÎŋυ ÎēÎŋηÎļÎŽÏ‚ Î―Îą Ï€ÎąÏÎąÎžÎĩÎŊÎ―ÎĩÎđ τÎŋ {product_name} ÎąÏƒÏ†ÎąÎŧές ÎģÎđÎą όÎŧÎŋυς. ΛαξÎēÎŽÎ―ÎŋυΞÎĩ σÎŋÎēÎąÏÎŽ υπόψη ΚΎÎļÎĩ ÎąÎ―ÎąÏ†ÎŋρΎ ΚιÎđ ÎĩΚτÎđΞÎŋύΞÎĩ τη συΞÎēÎŋÎŧÎŪ ÏƒÎŋυ ÏƒÏ„Î·Î― ΚÎŋÎđÎ―ÏŒÏ„Î·Ï„Îą.\n\nÎ•ÎŽÎ― έχÎĩÎđς ÎĩρωτÎŪσÎĩÎđς ÎŪ ÎąÏ€ÎŋρÎŊÎĩς σχÎĩτÎđΚΎ ΞÎĩ ÎąÏ…Ï„ÏŒ τÎŋ ÎąÏ€ÎŋτέÎŧÎĩÏƒÎžÎą, στÎĩÎŊÎŧÎĩ email στÎŋ {safety_email}.\n\n– Η ÎŋΞΎÎīÎą ÎąÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ τÎŋυ {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Ο ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ στÎŋ {product_name} ÎļÎą ÎīÎđÎąÎģÏÎąÏ†ÎĩÎŊ ÎŋρÎđστÎđΚΎ",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΟ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ στÎŋ {product_name} έχÎĩÎđ πρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđστÎĩÎŊ ÎģÎđÎą ÎŋρÎđστÎđΚÎŪ ÎīÎđÎąÎģÏÎąÏ†ÎŪ.\n\nΠρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđÏƒÎžÎ­Î―Î· ÎīÎđÎąÎģÏÎąÏ†ÎŪ: {deletionDate, date, full} στÎđς {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ΛόÎģÎŋς: {reason}}\n}\n\nΠρόΚÎĩÎđÏ„ÎąÎđ ÎģÎđÎą Î­Î―Îą σÎŋÎēÎąÏÏŒ ΞέτρÎŋ. ÎĪÎą ÎīÎĩÎīÎŋÎžÎ­Î―Îą τÎŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ ÎļÎą ÎīÎđÎąÎģÏÎąÏ†ÎŋÏÎ― ÎŋρÎđστÎđΚΎ Ï„Î·Î― πρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđÏƒÎžÎ­Î―Î· ηΞÎĩρÎŋÎžÎ·Î―ÎŊÎą.\n\nÎ•ÎŽÎ― πÎđστÎĩύÎĩÎđς ότÎđ ÎąÏ…Ï„ÎŪ Î· ÎąÏ€ÏŒÏ†ÎąÏƒÎ· ÎŪÏ„ÎąÎ― ÎŧÎąÎ―ÎļÎąÏƒÎžÎ­Î―Î·, ΞπÎŋρÎĩÎŊς Î―Îą υπÎŋÎēÎŽÎŧÎĩÎđς πρÎŋσφυÎģÎŪ. ÎĢτÎĩÎŊÎŧÎĩ email στÎŋ {appeals_email} ÎąÏ€ÏŒ ÎąÏ…Ï„ÎŪÎ― τη ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· email.\n\n– ΟξήÎīÎą Î‘ÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΟ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ στÎŋ {product_name} έχÎĩÎđ πρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđστÎĩÎŊ ÎģÎđÎą ÎŋρÎđστÎđΚÎŪ ÎīÎđÎąÎģÏÎąÏ†ÎŪ.\n\nΠρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđÏƒÎžÎ­Î―Î· ÎīÎđÎąÎģÏÎąÏ†ÎŪ: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ΛόÎģÎŋς: {reason}}\n}\n\nΠρόΚÎĩÎđÏ„ÎąÎđ ÎģÎđÎą σÎŋÎēÎąÏÏŒ ΞέτρÎŋ. ÎĪÎą ÎīÎĩÎīÎŋÎžÎ­Î―Îą τÎŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ ÎļÎą ÎīÎđÎąÎģÏÎąÏ†ÎŋÏÎ― ÎŋρÎđστÎđΚΎ Ï„Î·Î― πρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđÏƒÎžÎ­Î―Î· ηΞÎĩρÎŋÎžÎ·Î―ÎŊÎą.\n\nÎ•ÎŽÎ― πÎđστÎĩύÎĩÎđς ότÎđ ÎąÏ…Ï„ÎŪ Î· ÎąÏ€ÏŒÏ†ÎąÏƒÎ· ÎŪÏ„ÎąÎ― ÎŧÎąÎ―ÎļÎąÏƒÎžÎ­Î―Î·, ΞπÎŋρÎĩÎŊς Î―Îą υπÎŋÎēÎŽÎŧÎĩÎđς πρÎŋσφυÎģÎŪ. ÎĢτÎĩÎŊÎŧÎĩ email στÎŋ {appeals_email} ÎąÏ€ÏŒ ÎąÏ…Ï„ÎŪÎ― τη ÎīÎđÎĩύÎļÏ…Î―ÏƒÎ· email.\n\n– Η ÎŋΞΎÎīÎą ÎąÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ τÎŋυ {product_name}"
},
"self_deletion_scheduled": {
"subject": "Η ÎīÎđÎąÎģÏÎąÏ†ÎŪ Ï„Îŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ στÎŋ {product_name} ÎĩÎŊÎ―ÎąÎđ πρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđÏƒÎžÎ­Î―Î·",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΖÎŪτησÎĩς τη ÎīÎđÎąÎģÏÎąÏ†ÎŪ Ï„Îŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ στÎŋ {product_name}. Ο ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ έχÎĩÎđ πρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđστÎĩÎŊ ÎģÎđÎą ÎŋρÎđστÎđΚÎŪ ÎīÎđÎąÎģÏÎąÏ†ÎŪ ÏƒÏ„Îđς:\n\n{deletionDate, date, full} στÎđς {deletionDate, time, short}\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ÏƒÏ…Î―ÎīέσÎŋυ στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ ÎģÎđÎą Î―Îą ÎąÎšÏ…ÏÏŽÏƒÎĩÎđς τη ÎīÎđÎąÎģÏÎąÏ†ÎŪ. ÎĢÎŋυ ÏƒÏ…Î―ÎđστÎŋύΞÎĩ ÎĩπÎŊσης Î―Îą ÎąÎŧÎŧÎŽÎūÎĩÎđς τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ ΚιÎđ Î―Îą ÎąÏƒÏ†ÎąÎŧÎŊσÎĩÎđς τÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ.\n\n– ΟξήÎīÎą {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΖÎŪτησÎĩς τη ÎīÎđÎąÎģÏÎąÏ†ÎŪ Ï„Îŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ στÎŋ {product_name}. Ο ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒÏ‚ σÎŋυ έχÎĩÎđ πρÎŋÎģÏÎąÎžÎžÎąÏ„ÎđστÎĩÎŊ ÎģÎđÎą ÎŋρÎđστÎđΚÎŪ ÎīÎđÎąÎģÏÎąÏ†ÎŪ:\n\n{deletionDate, date, full} ΚιÎđ ÏŽÏÎą {deletionDate, time, short}\n\nÎ•ÎŽÎ― ÎīÎĩÎ― τÎŋ ÎķÎŪτησÎĩς, ÏƒÏ…Î―ÎīέσÎŋυ στÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ ÎģÎđÎą Î―Îą ÎąÎšÏ…ÏÏŽÏƒÎĩÎđς τη ÎīÎđÎąÎģÏÎąÏ†ÎŪ. ÎĢÎŋυ πρÎŋτÎĩÎŊÎ―ÎŋυΞÎĩ ÎĩπÎŊσης Î―Îą ÎąÎŧÎŧÎŽÎūÎĩÎđς τÎŋÎ― ΚωÎīÎđΚό πρόσÎēÎąÏƒÎŪς σÎŋυ ÎģÎđÎą Î―Îą ÎąÏƒÏ†ÎąÎŧÎŊσÎĩÎđς τÎŋÎ― ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÏŒ σÎŋυ.\n\n– Η ÎŋΞΎÎīÎą τÎŋυ {product_name}"
},
"unban_notification": {
"subject": "Η ÎąÎ―ÎąÏƒÏ„ÎŋÎŧÎŪ Ï„Îŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ στÎŋ {product_name} έχÎĩÎđ ÎąÏÎļÎĩÎŊ",
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΚαÎŧÎŽ Î―Î­Îą: η ÎąÎ―ÎąÏƒÏ„ÎŋÎŧÎŪ Ï„Îŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ στÎŋ {product_name} έχÎĩÎđ ÎąÏÎļÎĩÎŊ.\n\n{reason, select,\n null {}\n other {ΛόÎģÎŋς: {reason}}\n}\n\nΜπÎŋρÎĩÎŊς Ï„ÏŽÏÎą Î―Îą ÏƒÏ…Î―ÎīÎĩÎļÎĩÎŊς ÎūÎąÎ―ÎŽ ΚιÎđ Î―Îą ÏƒÏ…Î―ÎĩχÎŊσÎĩÎđς Î―Îą χρησÎđΞÎŋπÎŋÎđÎĩÎŊς τÎŋ {product_name} ÎšÎąÎ―ÎŋÎ―ÎđΚΎ.\n\n– ΟξήÎīÎą Î‘ÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ {product_name}"
"body": "ΓÎĩÎđÎą σÎŋυ {username},\n\nΚαÎŧÎŽ Î―Î­Îą: η ÎąÎ―ÎąÏƒÏ„ÎŋÎŧÎŪ Ï„Îŋυ ÎŧÎŋÎģÎąÏÎđÎąÏƒÎžÎŋύ σÎŋυ στÎŋ {product_name} έχÎĩÎđ ÎąÏÎļÎĩÎŊ.\n\n{reason, select,\n null {}\n other {ΛόÎģÎŋς: {reason}}\n}\n\nΜπÎŋρÎĩÎŊς Ï„ÏŽÏÎą Î―Îą ÏƒÏ…Î―ÎīÎĩÎļÎĩÎŊς ÎūÎąÎ―ÎŽ ΚιÎđ Î―Îą ÏƒÏ…Î―ÎĩχÎŊσÎĩÎđς Î―Îą χρησÎđΞÎŋπÎŋÎđÎĩÎŊς τÎŋ {product_name} ÎšÎąÎ―ÎŋÎ―ÎđΚΎ.\n\n– Η ÎŋΞΎÎīÎą ÎąÏƒÏ†ÎąÎŧÎĩÎŊÎąÏ‚ τÎŋυ {product_name}"
}
});
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_EN_GB_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -17,7 +17,7 @@ const EMAIL_I18N_EN_GB_MESSAGES = defineEmailI18nLocaleMessages({
},
"donation_confirmation": {
"subject": "Thank you for your {product_name} donation",
"body": "Hello,\n\nThank you for your donation to {product_name}! Your {interval, select,\n month {recurring donation}\n year {recurring donation}\n other {one-time donation}\n} has been {interval, select,\n month {set up}\n year {set up}\n other {processed}\n} successfully.\n\nDonation details:\nAmount: {amount} {currency} {interval, select,\n month {per month}\n year {per year}\n other {}\n}\n\nStripe will email you a separate receipt with your invoice PDF shortly. This includes all payment details and can be used for tax purposes.\n\nYou can view your donation history, download invoices, {interval, select,\n month {and manage or cancel your subscription}\n year {and manage or cancel your subscription}\n other {and manage future donations}\n} at any time using this link:\n\n{manageUrl}\n\nYour support helps keep {product_name} running. Thank you!\n\n– {product_name} Team"
"body": "Hello,\n\nThank you for your donation to {product_name}! Your {interval, select,\n month {recurring donation}\n year {recurring donation}\n other {one-time donation}\n} has been {interval, select,\n month {set up}\n year {set up}\n other {processed}\n} successfully.\n\nDonation details:\nAmount: {amount} {interval, select,\n month {per month}\n year {per year}\n other {}\n}\n\nStripe will email you a separate receipt with your invoice PDF shortly. This includes all payment details and can be used for tax purposes.\n\nYou can view your donation history, download invoices, {interval, select,\n month {and manage or cancel your subscription}\n year {and manage or cancel your subscription}\n other {and manage future donations}\n} at any time using this link:\n\n{manageUrl}\n\nYour support helps keep {product_name} running. Thank you!\n\n– {product_name} Team"
},
"donation_magic_link": {
"subject": "Manage your {product_name} donations",
@@ -56,8 +56,8 @@ const EMAIL_I18N_EN_GB_MESSAGES = defineEmailI18nLocaleMessages({
"body": "Hello {username},\n\nWe haven't seen any activity on your {product_name} account since {lastActiveDate, date, full}.\n\nIf you don't log in by {deletionDate, date, full} at {deletionDate, time, short}, your account will be permanently deleted due to inactivity.\n\nLog in here:\n{loginUrl}\n\nIf you've used {product_name} recently, please contact our support team right away.\n\n– {product_name} Team"
},
"ip_authorization": {
"subject": "Authorize login from a new IP address",
"body": "Hello {username},\n\nWe detected a login attempt to your {product_name} account from a new IP address:\n\nIP address: {ipAddress}\nLocation: {location}\n\nIf this was you, please authorize this IP address by clicking the link below:\n\n{authUrl}\n\nIf you didn't attempt to log in, please change your password right away.\n\nThis link is valid for 30 minutes.\n\n– {product_name} Team"
"subject": "Authorise login from a new IP address",
"body": "Hello {username},\n\nWe detected a login attempt to your {product_name} account from a new IP address:\n\nIP address: {ipAddress}\nLocation: {location}\n\nIf this was you, please authorise this IP address by clicking the link below:\n\n{authUrl}\n\nIf you didn't attempt to log in, please change your password right away.\n\nThis link is valid for 30 minutes.\n\n– {product_name} Team"
},
"mfa_backup_codes_view": {
"subject": "Confirm access to your {product_name} backup codes",
@@ -65,7 +65,7 @@ const EMAIL_I18N_EN_GB_MESSAGES = defineEmailI18nLocaleMessages({
},
"password_change_verification": {
"subject": "Confirm your {product_name} password change",
"body": "Hello {username},\n\nWe received a request to change the password on your {product_name} account.\n\nTo confirm this change, enter this code in the app:\n\n{code}\n\nThis code expires at {expiresAt}.\n\nIf you didn't request this, someone may have access to your account. Change your password immediately and enable two-factor authentication.\n\n– {product_name} Team"
"body": "Hello {username},\n\nWe received a request to change the password on your {product_name} account.\n\nTo confirm this change, enter this code in the app:\n\n{code}\n\nThis code expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you didn't request this, someone may have access to your account. Change your password immediately and enable two-factor authentication.\n\n– {product_name} Team"
},
"password_reset": {
"subject": "Reset your {product_name} password",
@@ -1,46 +1,46 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_ES_419_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Tu cuenta de {product_name} ha sido deshabilitada temporalmente",
"body": "Hola {username}:\n\nDeshabilitamos temporalmente tu cuenta de {product_name} porque detectamos actividad sospechosa.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nPara recuperar el acceso a tu cuenta, deberÃĄs restablecer tu contraseÃąa:\n\n{forgotUrl}\n\nDespuÃĐs de restablecer tu contraseÃąa, podrÃĄs iniciar sesiÃģn de nuevo.\n\nSi crees que esto fue un error, comunícate con nuestro equipo de soporte.\n\n– Equipo de Seguridad de {product_name}"
"body": "Hola {username}:\n\nDeshabilitamos temporalmente tu cuenta de {product_name} porque detectamos actividad sospechosa.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nPara recuperar el acceso a tu cuenta, deberÃĄs restablecer tu contraseÃąa:\n\n{forgotUrl}\n\nDespuÃĐs de restablecer tu contraseÃąa, podrÃĄs iniciar sesiÃģn de nuevo.\n\nSi crees que esto fue un error, comunícate con nuestro equipo de soporte.\n\n– Equipo de seguridad de {product_name}"
},
"account_scheduled_deletion": {
"subject": "Tu cuenta de {product_name} serÃĄ eliminada permanentemente",
"body": "Hola {username}:\n\nTu cuenta de {product_name} ha sido programada para su eliminaciÃģn permanente debido a infracciones de nuestros TÃĐrminos de Servicio o Normas de la Comunidad.\n\nEliminaciÃģn programada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta es una medida grave. Los datos de tu cuenta se eliminarÃĄn permanentemente en la fecha programada.\n\nPor favor, revisa:\n- TÃĐrminos de Servicio: {termsUrl}\n- Normas de la Comunidad: {guidelinesUrl}\n\nProceso de apelaciÃģn:\nSi crees que esta decisiÃģn fue incorrecta o injustificada, tienes 60 días para presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico.\n\nEn tu apelaciÃģn:\n- Explica claramente por quÃĐ crees que la decisiÃģn fue incorrecta o injustificada\n- Proporciona cualquier evidencia o contexto relevante\n\nUn miembro del Equipo de Seguridad de {product_name} revisarÃĄ tu apelaciÃģn y podrÃĄ pausar la eliminaciÃģn pendiente hasta que se haya tomado una decisiÃģn final.\n\n– Equipo de Seguridad de {product_name}"
"body": "Hola {username}:\n\nSe ha programado la eliminaciÃģn permanente de tu cuenta de {product_name} debido a infracciones de nuestros TÃĐrminos del servicio o Normas de la comunidad.\n\nEliminaciÃģn programada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta es una medida grave. Los datos de tu cuenta se eliminarÃĄn permanentemente en la fecha programada.\n\nPor favor, revisa:\n- TÃĐrminos del servicio: {termsUrl}\n- Normas de la comunidad: {guidelinesUrl}\n\nProceso de apelaciÃģn:\nSi crees que esta decisiÃģn fue incorrecta o injustificada, tienes 60 días para presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico.\n\nEn tu apelaciÃģn:\n- Explica claramente por quÃĐ crees que la decisiÃģn fue incorrecta o injustificada\n- Aporta las pruebas o el contexto que consideres relevantes\n\nUn miembro del Equipo de seguridad de {product_name} revisarÃĄ tu apelaciÃģn y podrÃĄ pausar la eliminaciÃģn pendiente hasta que se haya tomado una decisiÃģn final.\n\n– Equipo de seguridad de {product_name}"
},
"account_temp_banned": {
"subject": "Tu cuenta de {product_name} ha sido suspendida temporalmente",
"body": "Hola {username}:\n\nTu cuenta de {product_name} ha sido suspendida temporalmente por violar nuestros TÃĐrminos de Servicio o Normas de la Comunidad.\n\nDuraciÃģn: {durationHours, plural,\n =1 {1 hora}\n other {# horas}\n}\nSuspendida hasta: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nDurante este tiempo, no podrÃĄs acceder a tu cuenta.\n\nPor favor, revisa:\n- TÃĐrminos de Servicio: {termsUrl}\n- Normas de la Comunidad: {guidelinesUrl}\n\nSi crees que esta decisiÃģn fue incorrecta o injustificada, puedes presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico y explica claramente por quÃĐ crees que la decisiÃģn fue incorrecta. Revisaremos tu apelaciÃģn y te responderemos con nuestra decisiÃģn.\n\n– Equipo de Seguridad de {product_name}"
"body": "Hola {username}:\n\nTu cuenta de {product_name} ha sido suspendida temporalmente por infringir nuestros TÃĐrminos del servicio o Normas de la comunidad.\n\nDuraciÃģn: {durationHours, plural,\n =1 {1 hora}\n other {# horas}\n}\nSuspendida hasta: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nDurante este tiempo, no podrÃĄs acceder a tu cuenta.\n\nPor favor, revisa:\n- TÃĐrminos del servicio: {termsUrl}\n- Normas de la comunidad: {guidelinesUrl}\n\nSi crees que esta decisiÃģn fue incorrecta o injustificada, puedes presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico y explica claramente por quÃĐ crees que la decisiÃģn fue incorrecta. Revisaremos tu apelaciÃģn y te responderemos con nuestra decisiÃģn.\n\n– Equipo de seguridad de {product_name}"
},
"donation_confirmation": {
"subject": "Gracias por tu donaciÃģn a {product_name}",
"body": "Hola:\n\nÂĄGracias por tu donaciÃģn a {product_name}! Tu {interval, select,\n month {donaciÃģn recurrente}\n year {donaciÃģn recurrente}\n other {donaciÃģn Única}\n} ha sido {interval, select,\n month {configurada}\n year {configurada}\n other {procesada}\n} con ÃĐxito.\n\nDetalles de la donaciÃģn:\nMonto: {amount} {currency} {interval, select,\n month {por mes}\n year {por aÃąo}\n other {}\n}\n\nStripe te enviarÃĄ un recibo separado con tu factura en PDF en breve. Esto incluye todos los detalles de pago y se puede utilizar para fines fiscales.\n\nPuedes ver tu historial de donaciones, descargar facturas, {interval, select,\n month {y administrar o cancelar tu suscripciÃģn}\n year {y administrar o cancelar tu suscripciÃģn}\n other {y administrar futuras donaciones}\n} en cualquier momento usando este enlace:\n\n{manageUrl}\n\nTu apoyo ayuda a mantener {product_name} en funcionamiento. ÂĄGracias!\n\n– Equipo de {product_name}"
"body": "Hola:\n\nÂĄGracias por tu donaciÃģn a {product_name}! Tu {interval, select,\n month {donaciÃģn recurrente}\n year {donaciÃģn recurrente}\n other {donaciÃģn Única}\n} ha sido {interval, select,\n month {configurada}\n year {configurada}\n other {procesada}\n} con ÃĐxito.\n\nDetalles de la donaciÃģn:\nMonto: {amount} {interval, select,\n month {por mes}\n year {por aÃąo}\n other {}\n}\n\nEn breve, Stripe te enviarÃĄ por separado un correo electrÃģnico con el recibo y la factura en PDF. Este recibo incluye todos los detalles de pago y se puede utilizar para fines fiscales.\n\nPuedes ver tu historial de donaciones, descargar facturas {interval, select,\n month {y administrar o cancelar tu suscripciÃģn}\n year {y administrar o cancelar tu suscripciÃģn}\n other {y administrar futuras donaciones}\n} en cualquier momento usando este enlace:\n\n{manageUrl}\n\nTu apoyo ayuda a mantener {product_name} en funcionamiento. ÂĄGracias!\n\n– Equipo de {product_name}"
},
"donation_magic_link": {
"subject": "Administra tus donaciones a {product_name}",
"body": "Hola:\n\nHaz clic en el siguiente enlace para acceder a tu portal de donantes:\n\n{manageUrl}\n\nEn el portal, puedes administrar suscripciones, descargar facturas y ver tu historial de donaciones.\n\nEste enlace vence el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste este enlace, puedes ignorar este correo electrÃģnico de forma segura.\n\n– Equipo de {product_name}"
},
"dsa_report_verification": {
"subject": "Verifica tu correo electrÃģnico para un informe de la Ley de Servicios Digitales",
"body": "Hola:\n\nUsa el cÃģdigo de verificaciÃģn a continuaciÃģn para enviar tu informe de la Ley de Servicios Digitales en {product_name}:\n\n{code}\n\nEste cÃģdigo vence el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esto, puedes ignorar este correo electrÃģnico.\n\n– Equipo de Seguridad de {product_name}"
"subject": "Verifica tu correo electrÃģnico para enviar un reporte conforme a la Ley de Servicios Digitales",
"body": "Hola:\n\nUsa el cÃģdigo de verificaciÃģn a continuaciÃģn para enviar tu reporte conforme a la Ley de Servicios Digitales en {product_name}:\n\n{code}\n\nEste cÃģdigo vence el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esto, puedes ignorar este correo electrÃģnico.\n\n– Equipo de seguridad de {product_name}"
},
"email_change_new": {
"subject": "Verifica tu nuevo correo electrÃģnico de {product_name}",
"body": "Hola {username}:\n\nIngresa este cÃģdigo en la aplicaciÃģn para verificar tu nuevo correo electrÃģnico de {product_name}:\n\n{code}\n\nEste cÃģdigo vence el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esto, puedes ignorar este correo electrÃģnico.\n\n– Equipo de {product_name}"
"subject": "Verifica tu nuevo correo electrÃģnico en {product_name}",
"body": "Hola {username}:\n\nIngresa este cÃģdigo en la aplicaciÃģn para verificar tu nuevo correo electrÃģnico en {product_name}:\n\n{code}\n\nEste cÃģdigo vence el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esto, puedes ignorar este correo electrÃģnico.\n\n– Equipo de {product_name}"
},
"email_change_original": {
"subject": "Confirma tu cambio de correo electrÃģnico de {product_name}",
"subject": "Confirma tu cambio de correo electrÃģnico en {product_name}",
"body": "Hola {username}:\n\nRecibimos una solicitud para cambiar la direcciÃģn de correo electrÃģnico de tu cuenta de {product_name}.\n\nPara confirmar este cambio, ingresa este cÃģdigo en la aplicaciÃģn:\n\n{code}\n\nEste cÃģdigo vence el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esto, por favor, protege tu cuenta de inmediato.\n\n– Equipo de {product_name}"
},
"email_change_revert": {
"subject": "Tu correo electrÃģnico de {product_name} fue cambiado",
"body": "Hola {username}:\n\nLa direcciÃģn de correo electrÃģnico de tu cuenta de {product_name} se cambiÃģ a {newEmail}.\n\nSi realizaste este cambio, no es necesario que hagas nada. Si no lo hiciste, puedes revertir el cambio y proteger tu cuenta usando este enlace:\n\n{revertUrl}\n\nEsto restaurarÃĄ tu correo electrÃģnico anterior, cerrarÃĄ tu sesiÃģn en todas partes, eliminarÃĄ los nÚmeros de telÃĐfono vinculados, deshabilitarÃĄ la autenticaciÃģn multifactor y te pedirÃĄ que establezcas una nueva contraseÃąa.\n\n– Equipo de Seguridad de {product_name}"
"subject": "Se cambiÃģ tu correo electrÃģnico en {product_name}",
"body": "Hola {username}:\n\nLa direcciÃģn de correo electrÃģnico de tu cuenta de {product_name} se cambiÃģ a {newEmail}.\n\nSi realizaste este cambio, no es necesario que hagas nada. Si no lo hiciste, puedes revertir el cambio y proteger tu cuenta usando este enlace:\n\n{revertUrl}\n\nEsto restaurarÃĄ tu correo electrÃģnico anterior, cerrarÃĄ tu sesiÃģn en todas partes, eliminarÃĄ los nÚmeros de telÃĐfono vinculados, deshabilitarÃĄ la autenticaciÃģn multifactor y te pedirÃĄ que establezcas una nueva contraseÃąa.\n\n– Equipo de seguridad de {product_name}"
},
"email_verification": {
"subject": "Verifica tu direcciÃģn de correo electrÃģnico de {product_name}",
"subject": "Verifica tu direcciÃģn de correo electrÃģnico en {product_name}",
"body": "Hola {username}:\n\nPor favor, verifica la direcciÃģn de correo electrÃģnico de tu cuenta de {product_name} haciendo clic en el siguiente enlace:\n\n{verifyUrl}\n\nSi no creaste una cuenta de {product_name}, puedes ignorar este correo electrÃģnico de forma segura.\n\nEste enlace es vÃĄlido por 24 horas.\n\n– Equipo de {product_name}"
},
"gift_chargeback_notification": {
@@ -76,20 +76,20 @@ const EMAIL_I18N_ES_419_MESSAGES = defineEmailI18nLocaleMessages({
"body": "Hola {username}:\n\nBuenas noticias: tu registro en {product_name} ha sido aprobado.\n\nAhora puedes iniciar sesiÃģn en la aplicaciÃģn de {product_name} aquí:\n{channelsUrl}\n\nBienvenido a la comunidad de {product_name}.\n\n– Equipo de {product_name}"
},
"report_resolved": {
"subject": "Tu informe de {product_name} ha sido revisado",
"body": "Hola {username}:\n\nTu informe (ID: {reportId}) ha sido revisado por nuestro Equipo de Seguridad.{hasComment, select, yes {\n\nRespuesta del Equipo de Seguridad:\n{publicComment}} other {}}\n\nGracias por ayudar a mantener {product_name} seguro para todos. Nos tomamos todos los informes en serio y agradecemos tu contribuciÃģn a la comunidad.\n\nSi tienes alguna pregunta o inquietud sobre este resultado, comunícate con {safety_email}.\n\n– Equipo de Seguridad de {product_name}"
"subject": "Se revisÃģ tu reporte en {product_name}",
"body": "Hola {username}:\n\nNuestro equipo de seguridad revisÃģ tu reporte (ID: {reportId}).{hasComment, select, yes {\n\nRespuesta del equipo de seguridad:\n{publicComment}} other {}}\n\nGracias por ayudar a mantener {product_name} seguro para todos. Nos tomamos todos los reportes en serio y agradecemos tu contribuciÃģn a la comunidad.\n\nSi tienes alguna pregunta o inquietud sobre este resultado, comunícate con {safety_email}.\n\n– Equipo de seguridad de {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Tu cuenta de {product_name} serÃĄ eliminada permanentemente",
"body": "Hola {username}:\n\nTu cuenta de {product_name} ha sido programada para su eliminaciÃģn permanente.\n\nEliminaciÃģn programada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta es una medida grave. Los datos de tu cuenta se eliminarÃĄn permanentemente en la fecha programada.\n\nSi crees que esta decisiÃģn fue incorrecta, puedes presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico.\n\n– Equipo de Seguridad de {product_name}"
"body": "Hola {username}:\n\nSe ha programado la eliminaciÃģn permanente de tu cuenta de {product_name}.\n\nEliminaciÃģn programada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta es una medida grave. Los datos de tu cuenta se eliminarÃĄn permanentemente en la fecha programada.\n\nSi crees que esta decisiÃģn fue incorrecta, puedes presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico.\n\n– Equipo de seguridad de {product_name}"
},
"self_deletion_scheduled": {
"subject": "La eliminaciÃģn de tu cuenta de {product_name} estÃĄ programada",
"body": "Hola {username}:\n\nSolicitaste eliminar tu cuenta de {product_name}. Tu cuenta estÃĄ programada para su eliminaciÃģn permanente el:\n\n{deletionDate, date, full} a las {deletionDate, time, short}\n\nSi no solicitaste esto, inicia sesiÃģn en tu cuenta para cancelar la eliminaciÃģn. TambiÃĐn te recomendamos cambiar tu contraseÃąa para proteger tu cuenta.\n\n– Equipo de {product_name}"
"body": "Hola {username}:\n\nSolicitaste eliminar tu cuenta de {product_name}. La eliminaciÃģn permanente de tu cuenta estÃĄ programada para el:\n\n{deletionDate, date, full} a las {deletionDate, time, short}\n\nSi no solicitaste esto, inicia sesiÃģn en tu cuenta para cancelar la eliminaciÃģn. TambiÃĐn te recomendamos cambiar tu contraseÃąa para proteger tu cuenta.\n\n– Equipo de {product_name}"
},
"unban_notification": {
"subject": "Se levantÃģ la suspensiÃģn de tu cuenta de {product_name}",
"body": "Hola {username}:\n\nBuenas noticias: se levantÃģ la suspensiÃģn de tu cuenta de {product_name}.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nAhora puedes iniciar sesiÃģn de nuevo y seguir usando {product_name} con normalidad.\n\n– Equipo de Seguridad de {product_name}"
"body": "Hola {username}:\n\nBuenas noticias: se levantÃģ la suspensiÃģn de tu cuenta de {product_name}.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nAhora puedes iniciar sesiÃģn de nuevo y seguir usando {product_name} con normalidad.\n\n– Equipo de seguridad de {product_name}"
}
});
@@ -1,46 +1,46 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_ES_ES_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Tu cuenta de {product_name} ha sido deshabilitada temporalmente",
"body": "Hola {username}:\n\nHemos deshabilitado temporalmente tu cuenta de {product_name} porque hemos detectado actividad sospechosa.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nPara recuperar el acceso a tu cuenta, tendrÃĄs que restablecer tu contraseÃąa:\n\n{forgotUrl}\n\nDespuÃĐs de restablecer tu contraseÃąa, podrÃĄs iniciar sesiÃģn de nuevo.\n\nSi crees que esto ha sido un error, ponte en contacto con nuestro equipo de soporte.\n\n– Equipo de Seguridad de {product_name}"
"body": "Hola {username}:\n\nHemos deshabilitado temporalmente tu cuenta de {product_name} porque hemos detectado actividad sospechosa.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nPara recuperar el acceso a tu cuenta, tendrÃĄs que restablecer tu contraseÃąa:\n\n{forgotUrl}\n\nDespuÃĐs de restablecer tu contraseÃąa, podrÃĄs iniciar sesiÃģn de nuevo.\n\nSi crees que esto ha sido un error, ponte en contacto con nuestro equipo de soporte.\n\n– Equipo de seguridad de {product_name}"
},
"account_scheduled_deletion": {
"subject": "Tu cuenta de {product_name} serÃĄ eliminada permanentemente",
"body": "Hola {username}:\n\nTu cuenta de {product_name} ha sido programada para su eliminaciÃģn permanente debido a infracciones de nuestros TÃĐrminos de Servicio o Directrices de la Comunidad.\n\nEliminaciÃģn programada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta es una medida grave. Los datos de tu cuenta se eliminarÃĄn permanentemente en la fecha programada.\n\nPor favor, revisa:\n- TÃĐrminos de Servicio: {termsUrl}\n- Directrices de la Comunidad: {guidelinesUrl}\n\nProceso de apelaciÃģn:\nSi crees que esta decisiÃģn fue incorrecta o injustificada, tienes 60 días para presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico.\n\nEn tu apelaciÃģn:\n- Explica claramente por quÃĐ crees que la decisiÃģn fue incorrecta o injustificada\n- Proporciona cualquier evidencia o contexto relevante\n\nUn miembro del Equipo de Seguridad de {product_name} revisarÃĄ tu apelaciÃģn y podrÃĄ pausar la eliminaciÃģn pendiente hasta que se haya tomado una decisiÃģn final.\n\n– Equipo de Seguridad de {product_name}"
"body": "Hola {username}:\n\nSe ha programado la eliminaciÃģn permanente de tu cuenta de {product_name} debido a infracciones de nuestras Condiciones del servicio o Normas de la comunidad.\n\nEliminaciÃģn programada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta es una medida grave. Los datos de tu cuenta se eliminarÃĄn permanentemente en la fecha programada.\n\nPor favor, revisa:\n- Condiciones del servicio: {termsUrl}\n- Normas de la comunidad: {guidelinesUrl}\n\nProceso de apelaciÃģn:\nSi crees que esta decisiÃģn fue incorrecta o injustificada, tienes 60 días para presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico.\n\nEn tu apelaciÃģn:\n- Explica claramente por quÃĐ crees que la decisiÃģn fue incorrecta o injustificada\n- Aporta las pruebas o el contexto que consideres relevantes\n\nUn miembro del Equipo de seguridad de {product_name} revisarÃĄ tu apelaciÃģn y podrÃĄ pausar la eliminaciÃģn pendiente hasta que se haya tomado una decisiÃģn final.\n\n– Equipo de seguridad de {product_name}"
},
"account_temp_banned": {
"subject": "Tu cuenta de {product_name} ha sido suspendida temporalmente",
"body": "Hola {username}:\n\nTu cuenta de {product_name} ha sido suspendida temporalmente por violar nuestros TÃĐrminos de Servicio o Directrices de la Comunidad.\n\nDuraciÃģn: {durationHours, plural,\n =1 {1 hora}\n other {# horas}\n}\nSuspendida hasta: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nDurante este tiempo, no podrÃĄs acceder a tu cuenta.\n\nPor favor, revisa:\n- TÃĐrminos de Servicio: {termsUrl}\n- Directrices de la Comunidad: {guidelinesUrl}\n\nSi crees que esta decisiÃģn fue incorrecta o injustificada, puedes presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico y explica claramente por quÃĐ crees que la decisiÃģn fue incorrecta. Revisaremos tu apelaciÃģn y te responderemos con nuestra decisiÃģn.\n\n– Equipo de Seguridad de {product_name}"
"body": "Hola {username}:\n\nTu cuenta de {product_name} ha sido suspendida temporalmente por infringir nuestras Condiciones del servicio o Normas de la comunidad.\n\nDuraciÃģn: {durationHours, plural,\n =1 {1 hora}\n other {# horas}\n}\nSuspendida hasta: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nDurante este tiempo, no podrÃĄs acceder a tu cuenta.\n\nPor favor, revisa:\n- Condiciones del servicio: {termsUrl}\n- Normas de la comunidad: {guidelinesUrl}\n\nSi crees que esta decisiÃģn fue incorrecta o injustificada, puedes presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico y explica claramente por quÃĐ crees que la decisiÃģn fue incorrecta. Revisaremos tu apelaciÃģn y te responderemos con nuestra decisiÃģn.\n\n– Equipo de seguridad de {product_name}"
},
"donation_confirmation": {
"subject": "Gracias por tu donaciÃģn a {product_name}",
"body": "Hola:\n\nÂĄGracias por tu donaciÃģn a {product_name}! Tu {interval, select,\n month {donaciÃģn recurrente}\n year {donaciÃģn recurrente}\n other {donaciÃģn Única}\n} se ha {interval, select,\n month {configurado}\n year {configurado}\n other {procesado}\n} correctamente.\n\nDetalles de la donaciÃģn:\nCantidad: {amount} {currency} {interval, select,\n month {al mes}\n year {al aÃąo}\n other {}\n}\n\nStripe te enviarÃĄ un recibo separado con tu factura en PDF en breve. Este recibo incluye todos los detalles de pago y se puede utilizar para fines fiscales.\n\nPuedes ver tu historial de donaciones, descargar facturas {interval, select,\n month {y gestionar o cancelar tu suscripciÃģn}\n year {y gestionar o cancelar tu suscripciÃģn}\n other {y gestionar futuras donaciones}\n} en cualquier momento usando este enlace:\n\n{manageUrl}\n\nTu apoyo ayuda a mantener {product_name} en funcionamiento. ÂĄGracias!\n\n– Equipo de {product_name}"
"body": "Hola:\n\nÂĄGracias por tu donaciÃģn a {product_name}! Tu {interval, select,\n month {donaciÃģn recurrente}\n year {donaciÃģn recurrente}\n other {donaciÃģn Única}\n} se ha {interval, select,\n month {configurado}\n year {configurado}\n other {procesado}\n} correctamente.\n\nDetalles de la donaciÃģn:\nImporte: {amount} {interval, select,\n month {al mes}\n year {al aÃąo}\n other {}\n}\n\nEn breve, Stripe te enviarÃĄ por separado un correo electrÃģnico con el recibo y la factura en PDF. Este recibo incluye todos los detalles de pago y se puede utilizar para fines fiscales.\n\nPuedes ver tu historial de donaciones, descargar facturas {interval, select,\n month {y gestionar o cancelar tu suscripciÃģn}\n year {y gestionar o cancelar tu suscripciÃģn}\n other {y gestionar futuras donaciones}\n} en cualquier momento usando este enlace:\n\n{manageUrl}\n\nTu apoyo ayuda a mantener {product_name} en funcionamiento. ÂĄGracias!\n\n– Equipo de {product_name}"
},
"donation_magic_link": {
"subject": "Gestiona tus donaciones de {product_name}",
"subject": "Gestiona tus donaciones a {product_name}",
"body": "Hola:\n\nHaz clic en el siguiente enlace para acceder a tu portal de donantes:\n\n{manageUrl}\n\nEn el portal, puedes gestionar suscripciones, descargar facturas y ver tu historial de donaciones.\n\nEste enlace caduca el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste este enlace, puedes ignorar este correo electrÃģnico de forma segura.\n\n– Equipo de {product_name}"
},
"dsa_report_verification": {
"subject": "Verifica tu correo electrÃģnico para un informe de la DSA",
"body": "Hola:\n\nUsa el siguiente cÃģdigo de verificaciÃģn para enviar tu informe de la Ley de Servicios Digitales en {product_name}:\n\n{code}\n\nEste cÃģdigo caduca el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esto, puedes ignorar este correo electrÃģnico.\n\n– Equipo de Seguridad de {product_name}"
"subject": "Verifica tu correo electrÃģnico para enviar una denuncia conforme a la Ley de Servicios Digitales",
"body": "Hola:\n\nUsa el siguiente cÃģdigo de verificaciÃģn para enviar tu denuncia conforme a la Ley de Servicios Digitales en {product_name}:\n\n{code}\n\nEste cÃģdigo caduca el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esto, puedes ignorar este correo electrÃģnico.\n\n– Equipo de seguridad de {product_name}"
},
"email_change_new": {
"subject": "Verifica tu nuevo correo electrÃģnico para {product_name}",
"body": "Hola {username}:\n\nIntroduce este cÃģdigo en la aplicaciÃģn para verificar tu nuevo correo electrÃģnico para {product_name}:\n\n{code}\n\nEste cÃģdigo caduca el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esto, puedes ignorar este correo electrÃģnico.\n\n– Equipo de {product_name}"
"subject": "Verifica tu nuevo correo electrÃģnico en {product_name}",
"body": "Hola {username}:\n\nIntroduce este cÃģdigo en la aplicaciÃģn para verificar tu nuevo correo electrÃģnico en {product_name}:\n\n{code}\n\nEste cÃģdigo caduca el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esto, puedes ignorar este correo electrÃģnico.\n\n– Equipo de {product_name}"
},
"email_change_original": {
"subject": "Confirma tu cambio de correo electrÃģnico para {product_name}",
"subject": "Confirma tu cambio de correo electrÃģnico en {product_name}",
"body": "Hola {username}:\n\nHemos recibido una solicitud para cambiar la direcciÃģn de correo electrÃģnico de tu cuenta de {product_name}.\n\nPara confirmar este cambio, introduce este cÃģdigo en la aplicaciÃģn:\n\n{code}\n\nEste cÃģdigo caduca el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esto, protege tu cuenta de inmediato.\n\n– Equipo de {product_name}"
},
"email_change_revert": {
"subject": "Tu correo electrÃģnico para {product_name} ha sido cambiado",
"body": "Hola {username}:\n\nLa direcciÃģn de correo electrÃģnico de tu cuenta de {product_name} ha sido cambiada a {newEmail}.\n\nSi realizaste este cambio, no es necesario que hagas nada. Si no lo hiciste, puedes revertir el cambio y proteger tu cuenta usando este enlace:\n\n{revertUrl}\n\nEsto restaurarÃĄ tu correo electrÃģnico anterior, cerrarÃĄ tu sesiÃģn en todas partes, eliminarÃĄ los nÚmeros de telÃĐfono vinculados, deshabilitarÃĄ la autenticaciÃģn multifactor y te pedirÃĄ que establezcas una nueva contraseÃąa.\n\n– Equipo de Seguridad de {product_name}"
"subject": "Se ha cambiado tu correo electrÃģnico en {product_name}",
"body": "Hola {username}:\n\nLa direcciÃģn de correo electrÃģnico de tu cuenta de {product_name} ha sido cambiada a {newEmail}.\n\nSi realizaste este cambio, no es necesario que hagas nada. Si no lo hiciste, puedes revertir el cambio y proteger tu cuenta usando este enlace:\n\n{revertUrl}\n\nEsto restaurarÃĄ tu correo electrÃģnico anterior, cerrarÃĄ tu sesiÃģn en todas partes, eliminarÃĄ los nÚmeros de telÃĐfono vinculados, deshabilitarÃĄ la autenticaciÃģn multifactor y te pedirÃĄ que establezcas una nueva contraseÃąa.\n\n– Equipo de seguridad de {product_name}"
},
"email_verification": {
"subject": "Verifica tu direcciÃģn de correo electrÃģnico para {product_name}",
"subject": "Verifica tu direcciÃģn de correo electrÃģnico en {product_name}",
"body": "Hola {username}:\n\nVerifica la direcciÃģn de correo electrÃģnico de tu cuenta de {product_name} haciendo clic en el siguiente enlace:\n\n{verifyUrl}\n\nSi no creaste una cuenta de {product_name}, puedes ignorar este correo electrÃģnico.\n\nEste enlace es vÃĄlido durante 24 horas.\n\n– Equipo de {product_name}"
},
"gift_chargeback_notification": {
@@ -56,8 +56,8 @@ const EMAIL_I18N_ES_ES_MESSAGES = defineEmailI18nLocaleMessages({
"body": "Hola {username}:\n\nNo hemos visto ninguna actividad en tu cuenta de {product_name} desde el {lastActiveDate, date, full}.\n\nSi no inicias sesiÃģn antes del {deletionDate, date, full} a las {deletionDate, time, short}, tu cuenta serÃĄ eliminada permanentemente debido a la inactividad.\n\nInicia sesiÃģn aquí:\n{loginUrl}\n\nSi has usado {product_name} recientemente, ponte en contacto con nuestro equipo de soporte de inmediato.\n\n– Equipo de {product_name}"
},
"ip_authorization": {
"subject": "Autorizar inicio de sesiÃģn desde una nueva direcciÃģn IP",
"body": "Hola {username}:\n\nHemos detectado un intento de inicio de sesiÃģn en tu cuenta de {product_name} desde una nueva IP:\n\nDirecciÃģn IP: {ipAddress}\nUbicaciÃģn: {location}\n\nSi fuiste tÚ, autoriza esta direcciÃģn IP haciendo clic en el siguiente enlace:\n\n{authUrl}\n\nSi no intentaste iniciar sesiÃģn, cambia tu contraseÃąa de inmediato.\n\nEste enlace es vÃĄlido durante 30 minutos.\n\n– Equipo de {product_name}"
"subject": "Autoriza el inicio de sesiÃģn desde una nueva direcciÃģn IP",
"body": "Hola {username}:\n\nHemos detectado un intento de inicio de sesiÃģn en tu cuenta de {product_name} desde una nueva direcciÃģn IP:\n\nDirecciÃģn IP: {ipAddress}\nUbicaciÃģn: {location}\n\nSi fuiste tÚ, autoriza esta direcciÃģn IP haciendo clic en el siguiente enlace:\n\n{authUrl}\n\nSi no intentaste iniciar sesiÃģn, cambia tu contraseÃąa de inmediato.\n\nEste enlace es vÃĄlido durante 30 minutos.\n\n– Equipo de {product_name}"
},
"mfa_backup_codes_view": {
"subject": "Confirma el acceso a tus cÃģdigos de respaldo de {product_name}",
@@ -76,20 +76,20 @@ const EMAIL_I18N_ES_ES_MESSAGES = defineEmailI18nLocaleMessages({
"body": "Hola {username}:\n\nBuenas noticias: tu registro en {product_name} ha sido aprobado.\n\nAhora puedes iniciar sesiÃģn en la aplicaciÃģn de {product_name} aquí:\n{channelsUrl}\n\nBienvenido a la comunidad de {product_name}.\n\n– Equipo de {product_name}"
},
"report_resolved": {
"subject": "Tu informe en {product_name} ha sido revisado",
"body": "Hola {username}:\n\nTu informe (ID: {reportId}) ha sido revisado por nuestro Equipo de Seguridad.{hasComment, select, yes {\n\nRespuesta del Equipo de Seguridad:\n{publicComment}} other {}}\n\nGracias por ayudarnos a mantener {product_name} seguro para todos. Nos tomamos todos los informes en serio y agradecemos tu contribuciÃģn a la comunidad.\n\nSi tienes alguna pregunta o inquietud sobre este resultado, ponte en contacto con {safety_email}.\n\n– Equipo de Seguridad de {product_name}"
"subject": "Se ha revisado tu denuncia en {product_name}",
"body": "Hola {username}:\n\nNuestro equipo de seguridad ha revisado tu denuncia (ID: {reportId}).{hasComment, select, yes {\n\nRespuesta del equipo de seguridad:\n{publicComment}} other {}}\n\nGracias por ayudarnos a mantener {product_name} seguro para todos. Nos tomamos todas las denuncias en serio y agradecemos tu contribuciÃģn a la comunidad.\n\nSi tienes alguna pregunta o inquietud sobre este resultado, ponte en contacto con {safety_email}.\n\n– Equipo de seguridad de {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Tu cuenta de {product_name} serÃĄ eliminada permanentemente",
"body": "Hola {username}:\n\nTu cuenta de {product_name} ha sido programada para su eliminaciÃģn permanente.\n\nEliminaciÃģn programada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta es una medida grave. Los datos de tu cuenta se eliminarÃĄn permanentemente en la fecha programada.\n\nSi crees que esta decisiÃģn fue incorrecta, puedes presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico.\n\n– Equipo de Seguridad de {product_name}"
"body": "Hola {username}:\n\nSe ha programado la eliminaciÃģn permanente de tu cuenta de {product_name}.\n\nEliminaciÃģn programada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta es una medida grave. Los datos de tu cuenta se eliminarÃĄn permanentemente en la fecha programada.\n\nSi crees que esta decisiÃģn fue incorrecta, puedes presentar una apelaciÃģn. Envía un correo electrÃģnico a {appeals_email} desde esta direcciÃģn de correo electrÃģnico.\n\n– Equipo de seguridad de {product_name}"
},
"self_deletion_scheduled": {
"subject": "La eliminaciÃģn de tu cuenta de {product_name} estÃĄ programada",
"body": "Hola {username}:\n\nSolicitaste eliminar tu cuenta de {product_name}. Tu cuenta estÃĄ programada para su eliminaciÃģn permanente el:\n\n{deletionDate, date, full} a las {deletionDate, time, short}\n\nSi no solicitaste esto, inicia sesiÃģn en tu cuenta para cancelar la eliminaciÃģn. TambiÃĐn te recomendamos cambiar tu contraseÃąa para proteger tu cuenta.\n\n– Equipo de {product_name}"
"body": "Hola {username}:\n\nSolicitaste eliminar tu cuenta de {product_name}. La eliminaciÃģn permanente de tu cuenta estÃĄ programada para el:\n\n{deletionDate, date, full} a las {deletionDate, time, short}\n\nSi no solicitaste esto, inicia sesiÃģn en tu cuenta para cancelar la eliminaciÃģn. TambiÃĐn te recomendamos cambiar tu contraseÃąa para proteger tu cuenta.\n\n– Equipo de {product_name}"
},
"unban_notification": {
"subject": "Se ha levantado la suspensiÃģn de tu cuenta de {product_name}",
"body": "Hola {username}:\n\nBuenas noticias: se ha levantado la suspensiÃģn de tu cuenta de {product_name}.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nAhora puedes volver a iniciar sesiÃģn y seguir usando {product_name} con normalidad.\n\n– Equipo de Seguridad de {product_name}"
"body": "Hola {username}:\n\nBuenas noticias: se ha levantado la suspensiÃģn de tu cuenta de {product_name}.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nAhora puedes volver a iniciar sesiÃģn y seguir usando {product_name} con normalidad.\n\n– Equipo de seguridad de {product_name}"
}
});
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_FI_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -9,23 +9,23 @@ const EMAIL_I18N_FI_MESSAGES = defineEmailI18nLocaleMessages({
},
"account_scheduled_deletion": {
"subject": "KÃĪyttÃĪjÃĪtilisi {product_name}-palvelussa poistetaan pysyvÃĪsti",
"body": "Hei {username},\n\n{product_name}-kÃĪyttÃĪjÃĪtilisi on ajoitettu poistettavaksi pysyvÃĪsti kÃĪyttÃķehtojemme tai yhteisÃķn sÃĪÃĪntÃķjemme rikkomusten vuoksi.\n\nAjoitettu poisto: {deletionDate, date, full} klo {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Syy: {reason}}\n}\n\nTÃĪmÃĪ on vakava toimenpide. Tilisi tiedot poistetaan pysyvÃĪsti ajoitettuna pÃĪivÃĪnÃĪ.\n\nTarkista:\n- KÃĪyttÃķehdot: {termsUrl}\n- YhteisÃķn sÃĪÃĪnnÃķt: {guidelinesUrl}\n\nValitusprosessi:\nJos uskot, ettÃĪ tÃĪmÃĪ pÃĪÃĪtÃķs oli virheellinen tai perusteeton, sinulla on 60 pÃĪivÃĪÃĪ aikaa tehdÃĪ valitus. LÃĪhetÃĪ sÃĪhkÃķpostia osoitteeseen {appeals_email} tÃĪstÃĪ sÃĪhkÃķpostiosoitteesta.\n\nValituksessasi:\n- SelitÃĪ selkeÃĪsti, miksi uskot pÃĪÃĪtÃķksen olleen virheellinen tai perusteeton\n- Anna kaikki asiaankuuluvat todisteet tai konteksti\n\n{product_name}-turvallisuustiimin jÃĪsen tarkistaa valituksesi ja voi keskeyttÃĪÃĪ vireillÃĪ olevan poiston, kunnes lopullinen pÃĪÃĪtÃķs on tehty.\n\n– {product_name}-turvallisuustiimi"
"body": "Hei {username},\n\n{product_name}-kÃĪyttÃĪjÃĪtilisi on ajoitettu poistettavaksi pysyvÃĪsti kÃĪyttÃķehtojemme tai yhteisÃķsÃĪÃĪntÃķjemme rikkomisen vuoksi.\n\nAjoitettu poisto: {deletionDate, date, full} klo {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Syy: {reason}}\n}\n\nTÃĪmÃĪ on vakava toimenpide. Tilisi tiedot poistetaan pysyvÃĪsti ajoitettuna pÃĪivÃĪnÃĪ.\n\nTutustu:\n- KÃĪyttÃķehdot: {termsUrl}\n- YhteisÃķn sÃĪÃĪnnÃķt: {guidelinesUrl}\n\nValitusprosessi:\nJos uskot, ettÃĪ tÃĪmÃĪ pÃĪÃĪtÃķs oli virheellinen tai perusteeton, sinulla on 60 pÃĪivÃĪÃĪ aikaa tehdÃĪ valitus. LÃĪhetÃĪ sÃĪhkÃķpostia osoitteeseen {appeals_email} tÃĪstÃĪ sÃĪhkÃķpostiosoitteesta.\n\nValituksessasi:\n- SelitÃĪ selkeÃĪsti, miksi uskot pÃĪÃĪtÃķksen olleen virheellinen tai perusteeton\n- LiitÃĪ mukaan asiaankuuluvat todisteet tai taustatiedot\n\n{product_name}-turvallisuustiimin jÃĪsen kÃĪsittelee valituksesi ja voi keskeyttÃĪÃĪ vireillÃĪ olevan poiston, kunnes lopullinen pÃĪÃĪtÃķs on tehty.\n\n– {product_name}-turvallisuustiimi"
},
"account_temp_banned": {
"subject": "KÃĪyttÃĪjÃĪtilisi {product_name}-palvelussa on tilapÃĪisesti jÃĪÃĪdytetty",
"body": "Hei {username},\n\n{product_name}-kÃĪyttÃĪjÃĪtilisi on jÃĪÃĪdytetty tilapÃĪisesti kÃĪyttÃķehtojemme tai yhteisÃķn sÃĪÃĪntÃķjemme rikkomisen vuoksi.\n\nKesto: {durationHours, plural,\n =1 {1 tunti}\n other {# tuntia}\n}\nJÃĪÃĪdytettynÃĪ {bannedUntil, date, full} klo {bannedUntil, time, short} asti\n\n{reason, select,\n null {}\n other {Syy: {reason}}\n}\n\nTÃĪnÃĪ aikana et voi kÃĪyttÃĪÃĪ tiliÃĪsi.\n\nTarkista:\n- KÃĪyttÃķehdot: {termsUrl}\n- YhteisÃķn sÃĪÃĪnnÃķt: {guidelinesUrl}\n\nJos uskot, ettÃĪ tÃĪmÃĪ pÃĪÃĪtÃķs oli virheellinen tai perusteeton, voit tehdÃĪ valituksen. LÃĪhetÃĪ sÃĪhkÃķpostia osoitteeseen {appeals_email} tÃĪstÃĪ sÃĪhkÃķpostiosoitteesta ja selitÃĪ selkeÃĪsti, miksi uskot pÃĪÃĪtÃķksen olleen virheellinen. Tarkistamme valituksesi ja vastaamme pÃĪÃĪtÃķksellÃĪmme.\n\n– {product_name}-turvallisuustiimi"
"body": "Hei {username},\n\n{product_name}-kÃĪyttÃĪjÃĪtilisi on jÃĪÃĪdytetty tilapÃĪisesti kÃĪyttÃķehtojemme tai yhteisÃķsÃĪÃĪntÃķjemme rikkomisen vuoksi.\n\nKesto: {durationHours, plural,\n =1 {1 tunti}\n other {# tuntia}\n}\nJÃĪÃĪdytettynÃĪ {bannedUntil, date, full} klo {bannedUntil, time, short} asti\n\n{reason, select,\n null {}\n other {Syy: {reason}}\n}\n\nTÃĪnÃĪ aikana et voi kÃĪyttÃĪÃĪ tiliÃĪsi.\n\nTutustu:\n- KÃĪyttÃķehdot: {termsUrl}\n- YhteisÃķn sÃĪÃĪnnÃķt: {guidelinesUrl}\n\nJos uskot, ettÃĪ tÃĪmÃĪ pÃĪÃĪtÃķs oli virheellinen tai perusteeton, voit tehdÃĪ valituksen. LÃĪhetÃĪ sÃĪhkÃķpostia osoitteeseen {appeals_email} tÃĪstÃĪ sÃĪhkÃķpostiosoitteesta ja selitÃĪ selkeÃĪsti, miksi uskot pÃĪÃĪtÃķksen olleen virheellinen. KÃĪsittelemme valituksesi ja ilmoitamme sinulle pÃĪÃĪtÃķksemme.\n\n– {product_name}-turvallisuustiimi"
},
"donation_confirmation": {
"subject": "Kiitos {product_name}-lahjoituksestasi",
"body": "Hei,\n\nKiitos {product_name}-lahjoituksestasi! {interval, select,\n month {Toistuva lahjoituksesi}\n year {Toistuva lahjoituksesi}\n other {Kertalahjoituksesi}\n} on {interval, select,\n month {asetettu}\n year {asetettu}\n other {kÃĪsitelty}\n} onnistuneesti.\n\nLahjoituksen tiedot:\nSumma: {amount} {currency} {interval, select,\n month {kuukaudessa}\n year {vuodessa}\n other {}\n}\n\nStripe lÃĪhettÃĪÃĪ sinulle erillisen kuitin PDF-laskun kanssa pian. TÃĪmÃĪ sisÃĪltÃĪÃĪ kaikki maksutiedot ja sitÃĪ voidaan kÃĪyttÃĪÃĪ verotuksessa.\n\nVoit tarkastella lahjoitushistoriaasi, ladata laskuja {interval, select,\n month {ja hallinnoida tai peruuttaa tilaustasi}\n year {ja hallinnoida tai peruuttaa tilaustasi}\n other {ja hallita tulevia lahjoituksia}\n} milloin tahansa kÃĪyttÃĪmÃĪllÃĪ tÃĪtÃĪ linkkiÃĪ:\n\n{manageUrl}\n\nTukesi auttaa pitÃĪmÃĪÃĪn {product_name}-palvelun toiminnassa. Kiitos!\n\n– {product_name}-tiimi"
"body": "Hei,\n\nKiitos {product_name}-lahjoituksestasi! {interval, select,\n month {Toistuva lahjoituksesi}\n year {Toistuva lahjoituksesi}\n other {Kertalahjoituksesi}\n} on {interval, select,\n month {kÃĪynnistetty}\n year {kÃĪynnistetty}\n other {kÃĪsitelty}\n} onnistuneesti.\n\nLahjoituksen tiedot:\nSumma: {amount} {interval, select,\n month {kuukaudessa}\n year {vuodessa}\n other {}\n}\n\nStripe lÃĪhettÃĪÃĪ sinulle pian sÃĪhkÃķpostitse erillisen kuitin sekÃĪ PDF-laskun. NiissÃĪ ovat kaikki maksutiedot, ja niitÃĪ voi kÃĪyttÃĪÃĪ verotuksessa.\n\nVoit tarkastella lahjoitushistoriaasi, ladata laskuja {interval, select,\n month {ja hallinnoida tai peruuttaa tilaustasi}\n year {ja hallinnoida tai peruuttaa tilaustasi}\n other {ja hallita tulevia lahjoituksia}\n} milloin tahansa kÃĪyttÃĪmÃĪllÃĪ tÃĪtÃĪ linkkiÃĪ:\n\n{manageUrl}\n\nTukesi auttaa pitÃĪmÃĪÃĪn {product_name}-palvelun toiminnassa. Kiitos!\n\n– {product_name}-tiimi"
},
"donation_magic_link": {
"subject": "Hallinnoi {product_name}-palvelun lahjoituksiasi",
"subject": "Hallitse {product_name}-lahjoituksiasi",
"body": "Hei,\n\nNapsauta alla olevaa linkkiÃĪ pÃĪÃĪstÃĪksesi lahjoittajaportaaliisi:\n\n{manageUrl}\n\nPortaalissa voit hallinnoida tilauksia, ladata laskuja ja tarkastella lahjoitushistoriaasi.\n\nTÃĪmÃĪ linkki vanhenee {expiresAt, date, full} klo {expiresAt, time, short}.\n\nJos et pyytÃĪnyt tÃĪtÃĪ linkkiÃĪ, voit jÃĪttÃĪÃĪ tÃĪmÃĪn sÃĪhkÃķpostin turvallisesti huomiotta.\n\n– {product_name}-tiimi"
},
"dsa_report_verification": {
"subject": "Vahvista sÃĪhkÃķpostiosoite DSA-raporttia varten",
"body": "Hei,\n\nKÃĪytÃĪ alla olevaa vahvistuskoodia lÃĪhettÃĪÃĪksesi DSA-raporttisi {product_name}-palveluun:\n\n{code}\n\nTÃĪmÃĪ koodi vanhenee {expiresAt, date, full} klo {expiresAt, time, short}.\n\nJos et pyytÃĪnyt tÃĪtÃĪ, voit jÃĪttÃĪÃĪ tÃĪmÃĪn sÃĪhkÃķpostin huomiotta.\n\n– {product_name}-turvallisuustiimi"
"subject": "Vahvista sÃĪhkÃķpostiosoitteesi DSA-ilmoitusta varten",
"body": "Hei,\n\nKÃĪytÃĪ alla olevaa vahvistuskoodia lÃĪhettÃĪÃĪksesi digipalvelusÃĪÃĪdÃķksen mukaisen ilmoituksen {product_name}-palveluun:\n\n{code}\n\nTÃĪmÃĪ koodi vanhenee {expiresAt, date, full} klo {expiresAt, time, short}.\n\nJos et pyytÃĪnyt tÃĪtÃĪ, voit jÃĪttÃĪÃĪ tÃĪmÃĪn sÃĪhkÃķpostin huomiotta.\n\n– {product_name}-turvallisuustiimi"
},
"email_change_new": {
"subject": "Vahvista uusi sÃĪhkÃķpostiosoitteesi {product_name}-tilillÃĪ",
@@ -33,7 +33,7 @@ const EMAIL_I18N_FI_MESSAGES = defineEmailI18nLocaleMessages({
},
"email_change_original": {
"subject": "Vahvista sÃĪhkÃķpostiosoitteen muutos {product_name}-tilillÃĪ",
"body": "Hei {username},\n\nSaimme pyynnÃķn muuttaa sÃĪhkÃķpostiosoitetta {product_name}-tilillÃĪsi.\n\nVahvistaaksesi tÃĪmÃĪn muutoksen, syÃķtÃĪ tÃĪmÃĪ koodi sovellukseen:\n\n{code}\n\nTÃĪmÃĪ koodi vanhenee {expiresAt, date, full} klo {expiresAt, time, short}.\n\nJos et pyytÃĪnyt tÃĪtÃĪ, turvaa tilisi vÃĪlittÃķmÃĪsti.\n\n– {product_name}-tiimi"
"body": "Hei {username},\n\nSaimme pyynnÃķn muuttaa sÃĪhkÃķpostiosoitetta {product_name}-tilillÃĪsi.\n\nSyÃķtÃĪ tÃĪmÃĪ koodi sovellukseen vahvistaaksesi muutoksen:\n\n{code}\n\nTÃĪmÃĪ koodi vanhenee {expiresAt, date, full} klo {expiresAt, time, short}.\n\nJos et pyytÃĪnyt tÃĪtÃĪ, turvaa tilisi vÃĪlittÃķmÃĪsti.\n\n– {product_name}-tiimi"
},
"email_change_revert": {
"subject": "{product_name}-tilisi sÃĪhkÃķpostiosoite on vaihdettu",
@@ -57,15 +57,15 @@ const EMAIL_I18N_FI_MESSAGES = defineEmailI18nLocaleMessages({
},
"ip_authorization": {
"subject": "HyvÃĪksy kirjautuminen uudesta IP-osoitteesta",
"body": "Hei {username},\n\nHavaitsimme kirjautumisyrityksen {product_name}-tilillesi uudesta IP-osoitteesta:\n\nIP-osoite: {ipAddress}\nSijainti: {location}\n\nJos tÃĪmÃĪ olit sinÃĪ, valtuuta tÃĪmÃĪ IP-osoite napsauttamalla alla olevaa linkkiÃĪ:\n\n{authUrl}\n\nJos et yrittÃĪnyt kirjautua sisÃĪÃĪn, vaihda salasanasi vÃĪlittÃķmÃĪsti.\n\nTÃĪmÃĪ linkki on voimassa 30 minuuttia.\n\n– {product_name}-tiimi"
"body": "Hei {username},\n\nHavaitsimme kirjautumisyrityksen {product_name}-tilillesi uudesta IP-osoitteesta:\n\nIP-osoite: {ipAddress}\nSijainti: {location}\n\nJos yritit kirjautua sisÃĪÃĪn, hyvÃĪksy tÃĪmÃĪ IP-osoite napsauttamalla alla olevaa linkkiÃĪ:\n\n{authUrl}\n\nJos et yrittÃĪnyt kirjautua sisÃĪÃĪn, vaihda salasanasi vÃĪlittÃķmÃĪsti.\n\nTÃĪmÃĪ linkki on voimassa 30 minuuttia.\n\n– {product_name}-tiimi"
},
"mfa_backup_codes_view": {
"subject": "Vahvista pÃĪÃĪsy {product_name}-tilisi varmuuskoodeihin",
"body": "Hei {username},\n\nSaimme pyynnÃķn tarkastella varmuuskoodeja {product_name}-tilillÃĪsi.\n\nVahvistaaksesi tÃĪmÃĪn pyynnÃķn, syÃķtÃĪ tÃĪmÃĪ koodi sovellukseen:\n\n{code}\n\nTÃĪmÃĪ koodi vanhenee {expiresAt, date, full} klo {expiresAt, time, short}.\n\nJos et pyytÃĪnyt tÃĪtÃĪ, joku saattaa pÃĪÃĪstÃĪ tilillesi. Vaihda salasanasi vÃĪlittÃķmÃĪsti.\n\n– {product_name}-tiimi"
"subject": "Vahvista pÃĪÃĪsy {product_name}-tilisi varakoodeihin",
"body": "Hei {username},\n\nSaimme pyynnÃķn tarkastella varakoodeja {product_name}-tilillÃĪsi.\n\nSyÃķtÃĪ tÃĪmÃĪ koodi sovellukseen vahvistaaksesi pyynnÃķn:\n\n{code}\n\nTÃĪmÃĪ koodi vanhenee {expiresAt, date, full} klo {expiresAt, time, short}.\n\nJos et pyytÃĪnyt tÃĪtÃĪ, joku saattaa pÃĪÃĪstÃĪ tilillesi. Vaihda salasanasi vÃĪlittÃķmÃĪsti.\n\n– {product_name}-tiimi"
},
"password_change_verification": {
"subject": "Vahvista salasanan muutos {product_name}-tilillÃĪ",
"body": "Hei {username},\n\nSaimme pyynnÃķn muuttaa salasanaa {product_name}-tilillÃĪsi.\n\nVahvistaaksesi tÃĪmÃĪn muutoksen, syÃķtÃĪ tÃĪmÃĪ koodi sovellukseen:\n\n{code}\n\nTÃĪmÃĪ koodi vanhenee {expiresAt}.\n\nJos et pyytÃĪnyt tÃĪtÃĪ, joku saattaa pÃĪÃĪstÃĪ tilillesi. Vaihda salasanasi vÃĪlittÃķmÃĪsti ja ota kÃĪyttÃķÃķn kaksivaiheinen todennus.\n\n– {product_name}-tiimi"
"body": "Hei {username},\n\nSaimme pyynnÃķn muuttaa salasanaa {product_name}-tilillÃĪsi.\n\nSyÃķtÃĪ tÃĪmÃĪ koodi sovellukseen vahvistaaksesi muutoksen:\n\n{code}\n\nTÃĪmÃĪ koodi vanhenee {expiresAt}.\n\nJos et pyytÃĪnyt tÃĪtÃĪ, joku saattaa pÃĪÃĪstÃĪ tilillesi. Vaihda salasanasi vÃĪlittÃķmÃĪsti ja ota kÃĪyttÃķÃķn kaksivaiheinen todennus.\n\n– {product_name}-tiimi"
},
"password_reset": {
"subject": "Nollaa {product_name}-salasanasi",
@@ -76,8 +76,8 @@ const EMAIL_I18N_FI_MESSAGES = defineEmailI18nLocaleMessages({
"body": "Hei {username},\n\nHyviÃĪ uutisia: {product_name}-rekisterÃķitymisesi on hyvÃĪksytty.\n\nVoit nyt kirjautua {product_name}-sovellukseen tÃĪÃĪltÃĪ:\n{channelsUrl}\n\nTervetuloa {product_name}-yhteisÃķÃķn.\n\n– {product_name}-tiimi"
},
"report_resolved": {
"subject": "{product_name}-raporttisi on tarkistettu",
"body": "Hei {username},\n\nTurvallisuustiimimme on tarkistanut raporttisi (ID: {reportId}).{hasComment, select, yes {\n\nTurvallisuustiimin vastaus:\n{publicComment}} other {}}\n\nKiitos, ettÃĪ autat pitÃĪmÃĪÃĪn {product_name}-palvelun turvallisena kaikille. Otamme kaikki raportit vakavasti ja arvostamme panostasi yhteisÃķÃķn.\n\nJos sinulla on kysyttÃĪvÃĪÃĪ tai huolenaiheita tÃĪstÃĪ tuloksesta, ota yhteyttÃĪ osoitteeseen {safety_email}.\n\n– {product_name}-turvallisuustiimi"
"subject": "{product_name}-ilmoituksesi on kÃĪsitelty",
"body": "Hei {username},\n\nTurvallisuustiimimme on kÃĪsitellyt ilmoituksesi (ID: {reportId}).{hasComment, select, yes {\n\nTurvallisuustiimin vastaus:\n{publicComment}} other {}}\n\nKiitos, ettÃĪ autat pitÃĪmÃĪÃĪn {product_name}-palvelun turvallisena kaikille. Otamme kaikki ilmoitukset vakavasti ja arvostamme panostasi yhteisÃķÃķn.\n\nJos sinulla on kysyttÃĪvÃĪÃĪ tai huolenaiheita tÃĪstÃĪ pÃĪÃĪtÃķksestÃĪ, ota yhteyttÃĪ osoitteeseen {safety_email}.\n\n– {product_name}-turvallisuustiimi"
},
"scheduled_deletion_notification": {
"subject": "KÃĪyttÃĪjÃĪtilisi {product_name}-palvelussa poistetaan pysyvÃĪsti",
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_FR_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Ton compte {product_name} a ÃĐtÃĐ temporairement dÃĐsactivÃĐ",
"body": "Bonjour {username},\n\nNous avons temporairement dÃĐsactivÃĐ ton compte {product_name} car nous avons dÃĐtectÃĐ une activitÃĐ suspecte.\n\n{reason, select,\n null {}\n other {Raison : {reason}}\n}\n\nPour retrouver l'accÃĻs à ton compte, tu devras rÃĐinitialiser ton mot de passe :\n\n{forgotUrl}\n\nAprÃĻs avoir rÃĐinitialisÃĐ ton mot de passe, tu pourras te connecter à nouveau.\n\nSi tu penses qu'il s'agit d'une erreur, contacte notre ÃĐquipe d'assistance.\n\n– Équipe de sÃĐcuritÃĐ de {product_name}"
"subject": "Votre compte {product_name} a ÃĐtÃĐ temporairement dÃĐsactivÃĐ",
"body": "Bonjour {username},\n\nNous avons temporairement dÃĐsactivÃĐ votre compte {product_name} aprÃĻs avoir dÃĐtectÃĐ une activitÃĐ suspecte.\n\n{reason, select, null {} other {Motif : {reason}}}\n\nPour retrouver l’accÃĻs à votre compte, rÃĐinitialisez votre mot de passe :\n\n{forgotUrl}\n\nVous pourrez ensuite vous connecter à nouveau.\n\nSi vous pensez qu’il s’agit d’une erreur, contactez notre ÃĐquipe d’assistance.\n\n– L’ÃĐquipe de sÃĐcuritÃĐ de {product_name}"
},
"account_scheduled_deletion": {
"subject": "Ton compte {product_name} sera dÃĐfinitivement supprimÃĐ",
"body": "Bonjour {username},\n\nLa suppression dÃĐfinitive de ton compte {product_name} a ÃĐtÃĐ programmÃĐe en raison de violations de nos Conditions d'utilisation ou de nos RÃĻgles de la communautÃĐ.\n\nSuppression programmÃĐe : {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Raison : {reason}}\n}\n\nIl s'agit d'une mesure sÃĐrieuse. Les donnÃĐes de ton compte seront dÃĐfinitivement supprimÃĐes à la date prÃĐvue.\n\nConsulte :\n- Conditions d'utilisation : {termsUrl}\n- RÃĻgles de la communautÃĐ : {guidelinesUrl}\n\nProcÃĐdure d'appel :\nSi tu penses que cette dÃĐcision ÃĐtait incorrecte ou injustifiÃĐe, tu as 60 jours pour soumettre un appel. Envoie un e-mail à {appeals_email} depuis cette adresse e-mail.\n\nDans ton appel :\n- Explique clairement pourquoi tu penses que la dÃĐcision ÃĐtait incorrecte ou injustifiÃĐe\n- Fournis toute preuve ou contexte pertinent\n\nUn membre de l'ÃĐquipe de sÃĐcuritÃĐ de {product_name} examinera ton appel et pourra suspendre la suppression en attente jusqu'à ce qu'une dÃĐcision finale soit prise.\n\n– Équipe de sÃĐcuritÃĐ de {product_name}"
"subject": "Votre compte {product_name} sera dÃĐfinitivement supprimÃĐ",
"body": "Bonjour {username},\n\nLa suppression dÃĐfinitive de votre compte {product_name} a ÃĐtÃĐ programmÃĐe en raison de violations de nos conditions d’utilisation ou des rÃĻgles de la communautÃĐ.\n\nSuppression prÃĐvue : {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select, null {} other {Motif : {reason}}}\n\nIl s’agit d’une sanction importante. Les donnÃĐes de votre compte seront dÃĐfinitivement supprimÃĐes à la date prÃĐvue.\n\nVeuillez consulter :\n- Conditions d’utilisation : {termsUrl}\n- RÃĻgles de la communautÃĐ : {guidelinesUrl}\n\nProcÃĐdure de recours :\nSi vous estimez que cette dÃĐcision est incorrecte ou injustifiÃĐe, vous disposez de 60 jours pour dÃĐposer un recours. Écrivez à {appeals_email} depuis cette adresse e-mail.\n\nDans votre recours :\n- Expliquez clairement pourquoi vous estimez la dÃĐcision incorrecte ou injustifiÃĐe\n- Fournissez tout ÃĐlÃĐment de preuve ou de contexte pertinent\n\nUn membre de l’ÃĐquipe de sÃĐcuritÃĐ de {product_name} examinera votre recours et pourra suspendre la suppression prÃĐvue jusqu’à la dÃĐcision finale.\n\n– L’ÃĐquipe de sÃĐcuritÃĐ de {product_name}"
},
"account_temp_banned": {
"subject": "Ton compte {product_name} a ÃĐtÃĐ temporairement suspendu",
"body": "Bonjour {username},\n\nTon compte {product_name} a ÃĐtÃĐ temporairement suspendu pour avoir enfreint nos Conditions d'utilisation ou nos RÃĻgles de la communautÃĐ.\n\nDurÃĐe : {durationHours, plural,\n =1 {1 heure}\n other {# heures}\n}\nSuspendu jusqu'au : {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Raison : {reason}}\n}\n\nPendant cette pÃĐriode, tu ne pourras pas accÃĐder à ton compte.\n\nConsulte :\n- Conditions d'utilisation : {termsUrl}\n- RÃĻgles de la communautÃĐ : {guidelinesUrl}\n\nSi tu penses que cette dÃĐcision ÃĐtait incorrecte ou injustifiÃĐe, tu peux faire appel. Envoie un e-mail à {appeals_email} depuis cette adresse e-mail et explique clairement pourquoi tu penses que la dÃĐcision ÃĐtait incorrecte. Nous examinerons ton appel et te rÃĐpondrons avec notre dÃĐcision.\n\n– Équipe de sÃĐcuritÃĐ de {product_name}"
"subject": "Votre compte {product_name} a ÃĐtÃĐ temporairement suspendu",
"body": "Bonjour {username},\n\nVotre compte {product_name} a ÃĐtÃĐ temporairement suspendu pour violation de nos conditions d’utilisation ou des rÃĻgles de la communautÃĐ.\n\nDurÃĐe : {durationHours, plural, =1 {1 heure} other {# heures}}\nSuspension jusqu’au : {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select, null {} other {Motif : {reason}}}\n\nVous ne pourrez pas accÃĐder à votre compte pendant cette pÃĐriode.\n\nVeuillez consulter :\n- Conditions d’utilisation : {termsUrl}\n- RÃĻgles de la communautÃĐ : {guidelinesUrl}\n\nSi vous estimez que cette dÃĐcision est incorrecte ou injustifiÃĐe, vous pouvez dÃĐposer un recours. Écrivez à {appeals_email} depuis cette adresse e-mail et expliquez clairement pourquoi vous contestez cette dÃĐcision. Nous examinerons votre recours et vous communiquerons notre dÃĐcision.\n\n– L’ÃĐquipe de sÃĐcuritÃĐ de {product_name}"
},
"donation_confirmation": {
"subject": "Merci pour ton don à {product_name}",
"body": "Bonjour,\n\nMerci pour ton don à {product_name} ! Ton {interval, select,\n month {don rÃĐcurrent}\n year {don rÃĐcurrent}\n other {don unique}\n} a ÃĐtÃĐ {interval, select,\n month {mis en place}\n year {mis en place}\n other {traitÃĐ}\n} avec succÃĻs.\n\nDÃĐtails du don :\nMontant : {amount} {currency} {interval, select,\n month {par mois}\n year {par an}\n other {}\n}\n\nStripe t'enverra sous peu un reçu sÃĐparÃĐ avec ta facture PDF. Cela inclut tous les dÃĐtails de paiement et peut Être utilisÃĐ Ã  des fins fiscales.\n\nTu peux consulter l'historique de tes dons, tÃĐlÃĐcharger des factures, {interval, select,\n month {et gÃĐrer ou annuler ton abonnement}\n year {et gÃĐrer ou annuler ton abonnement}\n other {et gÃĐrer les futurs dons}\n} à tout moment en utilisant ce lien :\n\n{manageUrl}\n\nTon soutien aide à maintenir {product_name} en fonctionnement. Merci !\n\n– L'ÃĐquipe {product_name}"
"subject": "Merci pour votre don à {product_name}",
"body": "Bonjour,\n\nMerci pour votre don à {product_name} ! {interval, select, month {Votre don rÃĐcurrent a bien ÃĐtÃĐ mis en place.} year {Votre don rÃĐcurrent a bien ÃĐtÃĐ mis en place.} other {Votre don ponctuel a bien ÃĐtÃĐ traitÃĐ.}}\n\nDÃĐtails du don :\nMontant : {amount} {interval, select, month {par mois} year {par an} other {}}\n\nStripe vous enverra bientÃīt un reçu sÃĐparÃĐ accompagnÃĐ de votre facture PDF. Ce document contient tous les dÃĐtails du paiement et peut servir de justificatif fiscal.\n\nVous pouvez consulter l’historique de vos dons, tÃĐlÃĐcharger des factures {interval, select, month {et gÃĐrer ou rÃĐsilier votre abonnement} year {et gÃĐrer ou rÃĐsilier votre abonnement} other {et gÃĐrer vos futurs dons}} à tout moment avec ce lien :\n\n{manageUrl}\n\nVotre soutien contribue au fonctionnement de {product_name}. Merci !\n\n– L’ÃĐquipe {product_name}"
},
"donation_magic_link": {
"subject": "GÃĐrer tes dons {product_name}",
"body": "Bonjour,\n\nClique sur le lien ci-dessous pour accÃĐder à ton portail de donateur :\n\n{manageUrl}\n\nDans le portail, tu peux gÃĐrer tes abonnements, tÃĐlÃĐcharger des factures et consulter l'historique de tes dons.\n\nCe lien expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi tu n'as pas demandÃĐ ce lien, tu peux ignorer cet e-mail en toute sÃĐcuritÃĐ.\n\n– L'ÃĐquipe {product_name}"
"subject": "GÃĐrer vos dons à {product_name}",
"body": "Bonjour,\n\nCliquez sur le lien ci-dessous pour accÃĐder à votre portail de donateur :\n\n{manageUrl}\n\nVous pouvez y gÃĐrer vos abonnements, tÃĐlÃĐcharger des factures et consulter l’historique de vos dons.\n\nCe lien expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi vous n’avez pas demandÃĐ ce lien, vous pouvez ignorer cet e-mail.\n\n– L’ÃĐquipe {product_name}"
},
"dsa_report_verification": {
"subject": "VÃĐrifie ton e-mail pour un signalement DSA",
"body": "Bonjour,\n\nUtilise le code de vÃĐrification ci-dessous pour soumettre ton signalement DSA sur {product_name} :\n\n{code}\n\nCe code expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi tu n'as pas demandÃĐ cela, tu peux ignorer cet e-mail.\n\n– Équipe de sÃĐcuritÃĐ de {product_name}"
"subject": "VÃĐrifiez votre e-mail pour un signalement DSA",
"body": "Bonjour,\n\nUtilisez le code ci-dessous pour envoyer votre signalement au titre du rÃĻglement sur les services numÃĐriques (DSA) sur {product_name} :\n\n{code}\n\nCe code expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi vous n’Êtes pas à l’origine de cette demande, vous pouvez ignorer cet e-mail.\n\n– L’ÃĐquipe de sÃĐcuritÃĐ de {product_name}"
},
"email_change_new": {
"subject": "VÃĐrifie ta nouvelle adresse e-mail {product_name}",
"body": "Bonjour {username},\n\nSaisis ce code dans l'application pour vÃĐrifier ta nouvelle adresse e-mail {product_name} :\n\n{code}\n\nCe code expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi tu n'as pas demandÃĐ cela, tu peux ignorer cet e-mail.\n\n– L'ÃĐquipe {product_name}"
"subject": "VÃĐrifiez votre nouvelle adresse e-mail {product_name}",
"body": "Bonjour {username},\n\nSaisissez ce code dans l’application pour vÃĐrifier votre nouvelle adresse e-mail {product_name} :\n\n{code}\n\nCe code expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi vous n’Êtes pas à l’origine de cette demande, vous pouvez ignorer cet e-mail.\n\n– L’ÃĐquipe {product_name}"
},
"email_change_original": {
"subject": "Confirme ton changement d'e-mail {product_name}",
"body": "Bonjour {username},\n\nNous avons reçu une demande de modification de l'adresse e-mail de ton compte {product_name}.\n\nPour confirmer ce changement, saisis ce code dans l'application :\n\n{code}\n\nCe code expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi tu n'as pas demandÃĐ cela, sÃĐcurise ton compte immÃĐdiatement.\n\n– L'ÃĐquipe {product_name}"
"subject": "Confirmez votre changement d’adresse e-mail {product_name}",
"body": "Bonjour {username},\n\nNous avons reçu une demande de modification de l’adresse e-mail de votre compte {product_name}.\n\nPour confirmer ce changement, saisissez ce code dans l’application :\n\n{code}\n\nCe code expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi vous n’Êtes pas à l’origine de cette demande, sÃĐcurisez votre compte immÃĐdiatement.\n\n– L’ÃĐquipe {product_name}"
},
"email_change_revert": {
"subject": "Ton e-mail {product_name} a ÃĐtÃĐ modifiÃĐ",
"body": "Bonjour {username},\n\nL'adresse e-mail de ton compte {product_name} a ÃĐtÃĐ modifiÃĐe pour {newEmail}.\n\nSi tu as effectuÃĐ ce changement, aucune action n'est nÃĐcessaire. Si ce n'est pas le cas, tu peux annuler le changement et sÃĐcuriser ton compte en utilisant ce lien :\n\n{revertUrl}\n\nCela restaurera ton e-mail prÃĐcÃĐdent, te dÃĐconnectera de toutes les sessions, supprimera les numÃĐros de tÃĐlÃĐphone liÃĐs, dÃĐsactivera l'authentification multifacteur et t'obligera à dÃĐfinir un nouveau mot de passe.\n\n– Équipe de sÃĐcuritÃĐ de {product_name}"
"subject": "Votre adresse e-mail {product_name} a ÃĐtÃĐ modifiÃĐe",
"body": "Bonjour {username},\n\nL’adresse e-mail de votre compte {product_name} a ÃĐtÃĐ remplacÃĐe par {newEmail}.\n\nSi vous avez effectuÃĐ ce changement, vous n’avez rien à faire. Sinon, vous pouvez l’annuler et sÃĐcuriser votre compte avec ce lien :\n\n{revertUrl}\n\nVotre ancienne adresse e-mail sera rÃĐtablie, toutes vos sessions seront fermÃĐes, les numÃĐros de tÃĐlÃĐphone associÃĐs seront supprimÃĐs et l’authentification multifacteur sera dÃĐsactivÃĐe. Vous devrez aussi dÃĐfinir un nouveau mot de passe.\n\n– L’ÃĐquipe de sÃĐcuritÃĐ de {product_name}"
},
"email_verification": {
"subject": "VÃĐrifie ton adresse e-mail {product_name}",
"body": "Bonjour {username},\n\nVÃĐrifie l'adresse e-mail de ton compte {product_name} en cliquant sur le lien ci-dessous :\n\n{verifyUrl}\n\nSi tu n'as pas crÃĐÃĐ de compte {product_name}, tu peux ignorer cet e-mail en toute sÃĐcuritÃĐ.\n\nCe lien est valide pendant 24 heures.\n\n– L'ÃĐquipe {product_name}"
"subject": "VÃĐrifiez votre adresse e-mail {product_name}",
"body": "Bonjour {username},\n\nVÃĐrifiez l’adresse e-mail de votre compte {product_name} en cliquant sur le lien ci-dessous :\n\n{verifyUrl}\n\nSi vous n’avez pas crÃĐÃĐ de compte {product_name}, vous pouvez ignorer cet e-mail.\n\nCe lien est valable pendant 24 heures.\n\n– L’ÃĐquipe {product_name}"
},
"gift_chargeback_notification": {
"subject": "Les avantages de ton cadeau ÃĐchangÃĐ ont ÃĐtÃĐ supprimÃĐs",
"body": "Bonjour {username},\n\nUn code cadeau que tu as ÃĐchangÃĐ a ÃĐtÃĐ initialement payÃĐ par quelqu'un d'autre. Ce paiement a depuis ÃĐtÃĐ annulÃĐ (une rÃĐtrofacturation).\n\nPour cette raison, nous avons supprimÃĐ les avantages qui ont ÃĐtÃĐ ajoutÃĐs à ton compte lorsque tu as ÃĐchangÃĐ le cadeau.\n\nSi tu penses qu'il s'agit d'une erreur, contacte notre ÃĐquipe d'assistance et inclus tous les dÃĐtails que tu as concernant le code cadeau et le moment oÃđ tu l'as ÃĐchangÃĐ.\n\n– L'ÃĐquipe {product_name}"
"subject": "Les avantages de votre cadeau activÃĐ ont ÃĐtÃĐ retirÃĐs",
"body": "Bonjour {username},\n\nUn code cadeau que vous avez utilisÃĐ avait ÃĐtÃĐ payÃĐ par une autre personne. Ce paiement a depuis ÃĐtÃĐ annulÃĐ Ã  la suite d’une contestation bancaire.\n\nNous avons donc retirÃĐ les avantages ajoutÃĐs à votre compte lors de l’activation du cadeau.\n\nSi vous pensez qu’il s’agit d’une erreur, contactez notre ÃĐquipe d’assistance et indiquez les informations dont vous disposez sur le code cadeau et sa date d’utilisation.\n\n– L’ÃĐquipe {product_name}"
},
"harvest_completed": {
"subject": "Ton export de donnÃĐes {product_name} est prÊt à Être tÃĐlÃĐchargÃĐ",
"body": "Bonjour {username},\n\nTon export de donnÃĐes est prÊt.\n\nLien de tÃĐlÃĐchargement :\n{downloadUrl}\n\nMessages inclus : {totalMessages, number}\nTaille du fichier : {fileSizeMB, number} Mo\n\nCe lien expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi tu n'as pas demandÃĐ cet export, change ton mot de passe immÃĐdiatement et contacte notre ÃĐquipe d'assistance.\n\n– L'ÃĐquipe {product_name}"
"subject": "Votre export de donnÃĐes {product_name} est prÊt à Être tÃĐlÃĐchargÃĐ",
"body": "Bonjour {username},\n\nVotre export de donnÃĐes est prÊt.\n\nLien de tÃĐlÃĐchargement :\n{downloadUrl}\n\nMessages inclus : {totalMessages, number}\nTaille du fichier : {fileSizeMB, number} Mo\n\nCe lien expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi vous n’avez pas demandÃĐ cet export, changez immÃĐdiatement votre mot de passe et contactez notre ÃĐquipe d’assistance.\n\n– L’ÃĐquipe {product_name}"
},
"inactivity_warning": {
"subject": "Ton compte {product_name} sera supprimÃĐ en raison d'inactivitÃĐ",
"body": "Bonjour {username},\n\nNous n'avons dÃĐtectÃĐ aucune activitÃĐ sur ton compte {product_name} depuis le {lastActiveDate, date, full}.\n\nSi tu ne te connectes pas avant le {deletionDate, date, full} à {deletionDate, time, short}, ton compte sera dÃĐfinitivement supprimÃĐ en raison d'inactivitÃĐ.\n\nConnecte-toi ici :\n{loginUrl}\n\nSi tu as utilisÃĐ {product_name} rÃĐcemment, contacte notre ÃĐquipe d'assistance immÃĐdiatement.\n\n– L'ÃĐquipe {product_name}"
"subject": "Votre compte {product_name} sera supprimÃĐ pour inactivitÃĐ",
"body": "Bonjour {username},\n\nNous n’avons dÃĐtectÃĐ aucune activitÃĐ sur votre compte {product_name} depuis le {lastActiveDate, date, full}.\n\nSi vous ne vous connectez pas avant le {deletionDate, date, full} à {deletionDate, time, short}, votre compte sera dÃĐfinitivement supprimÃĐ pour inactivitÃĐ.\n\nConnectez-vous ici :\n{loginUrl}\n\nSi vous avez utilisÃĐ {product_name} rÃĐcemment, contactez immÃĐdiatement notre ÃĐquipe d’assistance.\n\n– L’ÃĐquipe {product_name}"
},
"ip_authorization": {
"subject": "Autoriser la connexion depuis une nouvelle adresse IP",
"body": "Bonjour {username},\n\nNous avons dÃĐtectÃĐ une tentative de connexion à ton compte {product_name} depuis une nouvelle adresse IP :\n\nAdresse IP : {ipAddress}\nLocalisation : {location}\n\nSi c'ÃĐtait toi, autorise cette adresse IP en cliquant sur le lien ci-dessous :\n\n{authUrl}\n\nSi tu n'as pas tentÃĐ de te connecter, change ton mot de passe immÃĐdiatement.\n\nCe lien est valide pendant 30 minutes.\n\n– L'ÃĐquipe {product_name}"
"body": "Bonjour {username},\n\nNous avons dÃĐtectÃĐ une tentative de connexion à votre compte {product_name} depuis une nouvelle adresse IP :\n\nAdresse IP : {ipAddress}\nLocalisation : {location}\n\nSi vous Êtes à l’origine de cette tentative, autorisez cette adresse IP en cliquant sur le lien ci-dessous :\n\n{authUrl}\n\nSinon, changez immÃĐdiatement votre mot de passe.\n\nCe lien est valable pendant 30 minutes.\n\n– L’ÃĐquipe {product_name}"
},
"mfa_backup_codes_view": {
"subject": "Confirme l'accÃĻs à tes codes de secours {product_name}",
"body": "Bonjour {username},\n\nNous avons reçu une demande de consultation des codes de secours de ton compte {product_name}.\n\nPour confirmer cette demande, saisis ce code dans l'application :\n\n{code}\n\nCe code expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi tu n'as pas demandÃĐ cela, quelqu'un a peut-Être eu accÃĻs à ton compte. Change ton mot de passe immÃĐdiatement.\n\n– L'ÃĐquipe {product_name}"
"subject": "Confirmez l’accÃĻs à vos codes de secours {product_name}",
"body": "Bonjour {username},\n\nNous avons reçu une demande de consultation des codes de secours de votre compte {product_name}.\n\nPour confirmer cette demande, saisissez ce code dans l’application :\n\n{code}\n\nCe code expire le {expiresAt, date, full} à {expiresAt, time, short}.\n\nSi vous n’Êtes pas à l’origine de cette demande, quelqu’un a peut-Être accÃĻs à votre compte. Changez immÃĐdiatement votre mot de passe.\n\n– L’ÃĐquipe {product_name}"
},
"password_change_verification": {
"subject": "Confirme la modification de ton mot de passe {product_name}",
"body": "Bonjour {username},\n\nNous avons reçu une demande de modification du mot de passe de ton compte {product_name}.\n\nPour confirmer cette modification, saisis ce code dans l'application :\n\n{code}\n\nCe code expire à {expiresAt}.\n\nSi tu n'as pas demandÃĐ cela, quelqu'un a peut-Être eu accÃĻs à ton compte. Change ton mot de passe immÃĐdiatement et active l'authentification à deux facteurs.\n\n– L'ÃĐquipe {product_name}"
"subject": "Confirmez la modification de votre mot de passe {product_name}",
"body": "Bonjour {username},\n\nNous avons reçu une demande de modification du mot de passe de votre compte {product_name}.\n\nPour confirmer ce changement, saisissez ce code dans l’application :\n\n{code}\n\nCe code expire à {expiresAt}.\n\nSi vous n’Êtes pas à l’origine de cette demande, quelqu’un a peut-Être accÃĻs à votre compte. Changez immÃĐdiatement votre mot de passe et activez l’authentification à deux facteurs.\n\n– L’ÃĐquipe {product_name}"
},
"password_reset": {
"subject": "RÃĐinitialiser ton mot de passe {product_name}",
"body": "Bonjour {username},\n\nTu as demandÃĐ une rÃĐinitialisation de ton mot de passe {product_name}. Utilise le lien ci-dessous pour dÃĐfinir un nouveau mot de passe :\n\n{resetUrl}\n\nSi tu n'as pas demandÃĐ cela, tu peux ignorer cet e-mail en toute sÃĐcuritÃĐ.\n\nCe lien est valide pendant 1 heure.\n\n– L'ÃĐquipe {product_name}"
"subject": "RÃĐinitialiser votre mot de passe {product_name}",
"body": "Bonjour {username},\n\nVous avez demandÃĐ la rÃĐinitialisation de votre mot de passe {product_name}. Utilisez le lien ci-dessous pour en dÃĐfinir un nouveau :\n\n{resetUrl}\n\nSi vous n’Êtes pas à l’origine de cette demande, vous pouvez ignorer cet e-mail.\n\nCe lien est valable pendant 1 heure.\n\n– L’ÃĐquipe {product_name}"
},
"registration_approved": {
"subject": "Ton inscription {product_name} a ÃĐtÃĐ approuvÃĐe",
"body": "Bonjour {username},\n\nBonne nouvelle : ton inscription {product_name} a ÃĐtÃĐ approuvÃĐe.\n\nTu peux maintenant te connecter à l'application {product_name} ici :\n{channelsUrl}\n\nBienvenue dans la communautÃĐ {product_name}.\n\n– L'ÃĐquipe {product_name}"
"subject": "Votre inscription à {product_name} a ÃĐtÃĐ approuvÃĐe",
"body": "Bonjour {username},\n\nBonne nouvelle : votre inscription à {product_name} a ÃĐtÃĐ approuvÃĐe.\n\nVous pouvez maintenant vous connecter à l’application {product_name} ici :\n{channelsUrl}\n\nBienvenue dans la communautÃĐ {product_name}.\n\n– L’ÃĐquipe {product_name}"
},
"report_resolved": {
"subject": "Ton signalement {product_name} a ÃĐtÃĐ examinÃĐ",
"body": "Bonjour {username},\n\nTon signalement (ID : {reportId}) a ÃĐtÃĐ examinÃĐ par notre ÃĐquipe de sÃĐcuritÃĐ.{hasComment, select, yes {\n\nRÃĐponse de l'ÃĐquipe de sÃĐcuritÃĐ :\n{publicComment}} other {}}\n\nMerci de nous aider à prÃĐserver la sÃĐcuritÃĐ de {product_name} pour tous. Nous prenons tous les signalements au sÃĐrieux et apprÃĐcions ta contribution à la communautÃĐ.\n\nSi tu as des questions ou des prÃĐoccupations concernant ce rÃĐsultat, contacte {safety_email}.\n\n– Équipe de sÃĐcuritÃĐ de {product_name}"
"subject": "Votre signalement sur {product_name} a ÃĐtÃĐ examinÃĐ",
"body": "Bonjour {username},\n\nVotre signalement (ID : {reportId}) a ÃĐtÃĐ examinÃĐ par notre ÃĐquipe de sÃĐcuritÃĐ.{hasComment, select, yes {\n\nRÃĐponse de l’ÃĐquipe de sÃĐcuritÃĐ :\n{publicComment}} other {}}\n\nMerci de nous aider à prÃĐserver la sÃĐcuritÃĐ de {product_name} pour tous. Nous prenons tous les signalements au sÃĐrieux et apprÃĐcions votre contribution à la communautÃĐ.\n\nPour toute question ou prÃĐoccupation concernant cette dÃĐcision, contactez {safety_email}.\n\n– L’ÃĐquipe de sÃĐcuritÃĐ de {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Ton compte {product_name} sera dÃĐfinitivement supprimÃĐ",
"body": "Bonjour {username},\n\nLa suppression dÃĐfinitive de ton compte {product_name} a ÃĐtÃĐ programmÃĐe.\n\nSuppression programmÃĐe : {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Raison : {reason}}\n}\n\nIl s'agit d'une mesure sÃĐrieuse. Les donnÃĐes de ton compte seront dÃĐfinitivement supprimÃĐes à la date prÃĐvue.\n\nSi tu penses que cette dÃĐcision ÃĐtait incorrecte, tu peux soumettre un appel. Envoie un e-mail à {appeals_email} depuis cette adresse e-mail.\n\n– Équipe de sÃĐcuritÃĐ de {product_name}"
"subject": "Votre compte {product_name} sera dÃĐfinitivement supprimÃĐ",
"body": "Bonjour {username},\n\nLa suppression dÃĐfinitive de votre compte {product_name} a ÃĐtÃĐ programmÃĐe.\n\nSuppression prÃĐvue : {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select, null {} other {Motif : {reason}}}\n\nIl s’agit d’une sanction importante. Les donnÃĐes de votre compte seront dÃĐfinitivement supprimÃĐes à la date prÃĐvue.\n\nSi vous estimez que cette dÃĐcision est incorrecte, vous pouvez dÃĐposer un recours. Écrivez à {appeals_email} depuis cette adresse e-mail.\n\n– L’ÃĐquipe de sÃĐcuritÃĐ de {product_name}"
},
"self_deletion_scheduled": {
"subject": "La suppression de ton compte {product_name} est programmÃĐe",
"body": "Bonjour {username},\n\nTu as demandÃĐ la suppression de ton compte {product_name}. Ton compte est programmÃĐ pour une suppression dÃĐfinitive le :\n\n{deletionDate, date, full} à {deletionDate, time, short}\n\nSi tu n'as pas demandÃĐ cela, connecte-toi à ton compte pour annuler la suppression. Nous te recommandons ÃĐgalement de changer ton mot de passe pour sÃĐcuriser ton compte.\n\n– L'ÃĐquipe {product_name}"
"subject": "La suppression de votre compte {product_name} est programmÃĐe",
"body": "Bonjour {username},\n\nVous avez demandÃĐ la suppression de votre compte {product_name}. Sa suppression dÃĐfinitive est prÃĐvue le :\n\n{deletionDate, date, full} à {deletionDate, time, short}\n\nSi vous n’Êtes pas à l’origine de cette demande, connectez-vous à votre compte pour annuler la suppression. Nous vous recommandons ÃĐgalement de changer votre mot de passe pour sÃĐcuriser votre compte.\n\n– L’ÃĐquipe {product_name}"
},
"unban_notification": {
"subject": "La suspension de ton compte {product_name} a ÃĐtÃĐ levÃĐe",
"body": "Bonjour {username},\n\nBonne nouvelle : la suspension de ton compte {product_name} a ÃĐtÃĐ levÃĐe.\n\n{reason, select,\n null {}\n other {Raison : {reason}}\n}\n\nTu peux maintenant te reconnecter et continuer à utiliser {product_name} normalement.\n\n– Équipe de sÃĐcuritÃĐ de {product_name}"
"subject": "La suspension de votre compte {product_name} a ÃĐtÃĐ levÃĐe",
"body": "Bonjour {username},\n\nBonne nouvelle : la suspension de votre compte {product_name} a ÃĐtÃĐ levÃĐe.\n\n{reason, select, null {} other {Motif : {reason}}}\n\nVous pouvez maintenant vous reconnecter et utiliser {product_name} normalement.\n\n– L’ÃĐquipe de sÃĐcuritÃĐ de {product_name}"
}
});
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_HE_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨš Ũ”Ũ•ŨĐŨ‘ŨŠ Ũ–ŨžŨ Ũ™ŨŠ",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨš Ũ”Ũ•ŨĐŨ‘ŨŠ Ũ–ŨžŨ Ũ™ŨŠ ŨĒŨ§Ũ‘ Ũ–Ũ™Ũ”Ũ•Ũ™ ŨĪŨĒŨ™ŨœŨ•ŨŠ Ũ—ŨĐŨ•Ũ“Ũ”.\n\n{reason, select,\n null {}\n other {ŨĄŨ™Ũ‘Ũ”: {reason}}\n}\n\nŨ›Ũ“Ũ™ ŨœŨ§Ũ‘Ũœ Ũ‘Ũ—Ũ–ŨĻŨ” Ũ’Ũ™ŨĐŨ” ŨœŨ—ŨĐŨ‘Ũ•ŨŸ, Ũ™ŨĐ ŨœŨŨĪŨĄ ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ”:\n\n{forgotUrl}\n\nŨœŨŨ—ŨĻ ŨŨ™ŨĪŨ•ŨĄ Ũ”ŨĄŨ™ŨĄŨžŨ”, Ũ Ũ™ŨŠŨŸ Ũ™Ũ”Ũ™Ũ” ŨœŨ”ŨŠŨ—Ũ‘ŨĻ ŨĐŨ•Ũ‘.\n\nŨŨ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ–Ũ• Ũ˜ŨĒŨ•ŨŠ, ŨĶŨĻŨ• Ũ§ŨĐŨĻ ŨĒŨ ŨĶŨ•Ũ•ŨŠ Ũ”ŨŠŨžŨ™Ũ›Ũ” ŨĐŨœŨ Ũ•.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
"subject": "Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ”Ũ•ŨĐŨ‘ŨŠ Ũ–ŨžŨ Ũ™ŨŠ",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ”ŨĐŨ‘ŨŠŨ Ũ• Ũ–ŨžŨ Ũ™ŨŠ ŨŨŠ Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ ŨžŨ›Ũ™Ũ•Ũ•ŨŸ ŨĐŨ–Ũ™Ũ”Ũ™Ũ Ũ• ŨĪŨĒŨ™ŨœŨ•ŨŠ Ũ—ŨĐŨ•Ũ“Ũ”.\n\n{reason, select,\n null {}\n other {ŨĄŨ™Ũ‘Ũ”: {reason}}\n}\n\nŨ›Ũ“Ũ™ ŨœŨĐŨ—Ũ–ŨĻ ŨŨŠ Ũ”Ũ’Ũ™ŨĐŨ” ŨœŨ—ŨĐŨ‘Ũ•ŨŸ, ŨŠŨĶŨ˜ŨĻŨ›Ũ• ŨœŨŨĪŨĄ ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ”:\n\n{forgotUrl}\n\nŨœŨŨ—ŨĻ ŨĐŨŠŨŨĪŨĄŨ• ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ”, ŨŠŨ•Ũ›ŨœŨ• ŨœŨ”ŨŠŨ—Ũ‘ŨĻ ŨĐŨ•Ũ‘.\n\nŨŨ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ–Ũ• Ũ˜ŨĒŨ•ŨŠ, ŨĶŨĻŨ• Ũ§ŨĐŨĻ ŨĒŨ ŨĶŨ•Ũ•ŨŠ Ũ”ŨŠŨžŨ™Ũ›Ũ” ŨĐŨœŨ Ũ•.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
},
"account_scheduled_deletion": {
"subject": "Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ™Ũ™ŨžŨ—Ũ§ ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨš Ũ Ũ§Ũ‘ŨĒ ŨœŨžŨ—Ũ™Ũ§Ũ” ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ ŨĒŨ§Ũ‘ Ũ”ŨĪŨĻŨ•ŨŠ ŨĐŨœ ŨŠŨ ŨŨ™ Ũ”ŨĐŨ™ŨĻŨ•ŨŠ ŨŨ• Ũ”Ũ Ũ—Ũ™Ũ•ŨŠ Ũ”Ũ§Ũ”Ũ™ŨœŨ” ŨĐŨœŨ Ũ•.\n\nŨžŨ—Ũ™Ũ§Ũ” ŨžŨŠŨ•Ũ–ŨžŨ ŨŠ: {deletionDate, date, full} Ũ‘ŨĐŨĒŨ” {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ŨĄŨ™Ũ‘Ũ”: {reason}}\n}\n\nŨ–Ũ•Ũ”Ũ™ ŨĪŨĒŨ•ŨœŨŠ ŨŨ›Ũ™ŨĪŨ” Ũ—ŨžŨ•ŨĻŨ”. Ũ ŨŠŨ•Ũ Ũ™ Ũ”Ũ—ŨĐŨ‘Ũ•ŨŸ ŨĐŨœŨš Ũ™Ũ™ŨžŨ—Ũ§Ũ• ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ Ũ‘ŨŠŨŨĻŨ™Ũš Ũ”ŨžŨŠŨ•Ũ›Ũ ŨŸ.\n\nŨŨ Ũ ŨĒŨ™Ũ™Ũ Ũ• Ũ‘:\n- ŨŠŨ ŨŨ™ Ũ”ŨĐŨ™ŨĻŨ•ŨŠ: {termsUrl}\n- Ũ”Ũ Ũ—Ũ™Ũ•ŨŠ Ũ”Ũ§Ũ”Ũ™ŨœŨ”: {guidelinesUrl}\n\nŨŠŨ”ŨœŨ™Ũš ŨĒŨĻŨĒŨ•ŨĻ:\nŨŨ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ”Ũ—ŨœŨ˜ŨŠ ŨŨ›Ũ™ŨĪŨ” Ũ–Ũ• ŨĐŨ’Ũ•Ũ™Ũ” ŨŨ• Ũ‘ŨœŨŠŨ™ ŨžŨ•ŨĶŨ“Ũ§ŨŠ, Ũ™ŨĐ ŨœŨ›Ũ 60 Ũ™Ũ•Ũ ŨœŨ”Ũ’Ũ™ŨĐ ŨĒŨĻŨĒŨ•ŨĻ. ŨĐŨœŨ—Ũ• Ũ“Ũ•Ũ\"Ũœ ŨœŨ›ŨŠŨ•Ũ‘ŨŠ {appeals_email} ŨžŨ›ŨŠŨ•Ũ‘ŨŠ Ũ“Ũ•Ũ\"Ũœ Ũ–Ũ•.\n\nŨ‘ŨĒŨĻŨĒŨ•ŨĻ:\n- Ũ”ŨĄŨ‘Ũ™ŨĻŨ• Ũ‘Ũ‘Ũ™ŨĻŨ•ŨĻ ŨžŨ“Ũ•ŨĒ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ”Ũ—ŨœŨ˜ŨŠ Ũ”ŨŨ›Ũ™ŨĪŨ” ŨĐŨ’Ũ•Ũ™Ũ” ŨŨ• Ũ‘ŨœŨŠŨ™ ŨžŨ•ŨĶŨ“Ũ§ŨŠ\n- ŨĄŨĪŨ§Ũ• Ũ›Ũœ ŨĻŨŨ™Ũ” ŨŨ• Ũ”Ũ§ŨĐŨĻ ŨĻŨœŨ•Ũ•Ũ Ũ˜Ũ™Ũ™Ũ\n\nŨ—Ũ‘ŨĻ Ũ‘ŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name} Ũ™Ũ‘Ũ“Ũ•Ũ§ ŨŨŠ ŨĒŨĻŨĒŨ•ŨĻŨ›Ũ Ũ•ŨĒŨĐŨ•Ũ™ ŨœŨ”ŨĐŨ”Ũ•ŨŠ ŨŨŠ Ũ”ŨžŨ—Ũ™Ũ§Ũ” Ũ”ŨžŨžŨŠŨ™Ũ Ũ” ŨĒŨ“ ŨœŨ§Ũ‘ŨœŨŠ Ũ”Ũ—ŨœŨ˜Ũ” ŨĄŨ•ŨĪŨ™ŨŠ.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ Ũ§Ũ‘ŨĒ ŨœŨžŨ—Ũ™Ũ§Ũ” ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ ŨĒŨ§Ũ‘ Ũ”ŨĪŨĻŨ•ŨŠ ŨĐŨœ ŨŠŨ ŨŨ™ Ũ”ŨĐŨ™ŨĻŨ•ŨŠ ŨŨ• Ũ”Ũ Ũ—Ũ™Ũ•ŨŠ Ũ”Ũ§Ũ”Ũ™ŨœŨ” ŨĐŨœŨ Ũ•.\n\nŨžŨ—Ũ™Ũ§Ũ” ŨžŨŠŨ•Ũ–ŨžŨ ŨŠ: {deletionDate, date, full} Ũ‘ŨĐŨĒŨ” {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ŨĄŨ™Ũ‘Ũ”: {reason}}\n}\n\nŨ–Ũ•Ũ”Ũ™ ŨĪŨĒŨ•ŨœŨŠ ŨŨ›Ũ™ŨĪŨ” Ũ—ŨžŨ•ŨĻŨ”. Ũ ŨŠŨ•Ũ Ũ™ Ũ”Ũ—ŨĐŨ‘Ũ•ŨŸ ŨĐŨœŨ›Ũ Ũ™Ũ™ŨžŨ—Ũ§Ũ• ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ Ũ‘ŨŠŨŨĻŨ™Ũš Ũ”ŨžŨŠŨ•Ũ›Ũ ŨŸ.\n\nŨŨ Ũ ŨĒŨ™Ũ™Ũ Ũ• Ũ‘ŨžŨĄŨžŨ›Ũ™Ũ Ũ”Ũ‘ŨŨ™Ũ:\n- ŨŠŨ ŨŨ™ Ũ”ŨĐŨ™ŨĻŨ•ŨŠ: {termsUrl}\n- Ũ”Ũ Ũ—Ũ™Ũ•ŨŠ Ũ”Ũ§Ũ”Ũ™ŨœŨ”: {guidelinesUrl}\n\nŨŠŨ”ŨœŨ™Ũš ŨĒŨĻŨĒŨ•ŨĻ:\nŨŨ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ”Ũ—ŨœŨ˜ŨŠ Ũ”ŨŨ›Ũ™ŨĪŨ” ŨĐŨ’Ũ•Ũ™Ũ” ŨŨ• Ũ‘ŨœŨŠŨ™ ŨžŨ•ŨĶŨ“Ũ§ŨŠ, Ũ™ŨĐ ŨœŨ›Ũ 60 Ũ™Ũ•Ũ ŨœŨ”Ũ’Ũ™ŨĐ ŨĒŨĻŨĒŨ•ŨĻ. ŨĐŨœŨ—Ũ• ŨŨ™ŨžŨ™Ũ™Ũœ ŨœŨ›ŨŠŨ•Ũ‘ŨŠ {appeals_email} ŨžŨ›ŨŠŨ•Ũ‘ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ”Ũ–Ũ•.\n\nŨ‘ŨĒŨĻŨĒŨ•ŨĻ:\n- Ũ”ŨĄŨ‘Ũ™ŨĻŨ• Ũ‘Ũ‘Ũ™ŨĻŨ•ŨĻ ŨžŨ“Ũ•ŨĒ ŨœŨ“ŨĒŨŠŨ›Ũ Ũ”Ũ—ŨœŨ˜ŨŠ Ũ”ŨŨ›Ũ™ŨĪŨ” ŨĐŨ’Ũ•Ũ™Ũ” ŨŨ• Ũ‘ŨœŨŠŨ™ ŨžŨ•ŨĶŨ“Ũ§ŨŠ\n- ŨĶŨĻŨĪŨ• Ũ›Ũœ ŨĻŨŨ™Ũ” ŨŨ• Ũ”Ũ§ŨĐŨĻ ŨĻŨœŨ•Ũ•Ũ Ũ˜Ũ™Ũ™Ũ\n\nŨ—Ũ‘ŨĻ Ũ‘ŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name} Ũ™Ũ‘Ũ“Ũ•Ũ§ ŨŨŠ Ũ”ŨĒŨĻŨĒŨ•ŨĻ ŨĐŨœŨ›Ũ Ũ•ŨĒŨĐŨ•Ũ™ ŨœŨ”ŨĐŨ”Ũ•ŨŠ ŨŨŠ Ũ”ŨžŨ—Ũ™Ũ§Ũ” Ũ”ŨžŨžŨŠŨ™Ũ Ũ” ŨĒŨ“ ŨœŨ§Ũ‘ŨœŨŠ Ũ”Ũ—ŨœŨ˜Ũ” ŨĄŨ•ŨĪŨ™ŨŠ.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
},
"account_temp_banned": {
"subject": "Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨš Ũ”Ũ•ŨĐŨĒŨ” Ũ–ŨžŨ Ũ™ŨŠ",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨš Ũ”Ũ•ŨĐŨĒŨ” Ũ–ŨžŨ Ũ™ŨŠ ŨĒŨ§Ũ‘ Ũ”ŨĪŨĻŨ” ŨĐŨœ ŨŠŨ ŨŨ™ Ũ”ŨĐŨ™ŨĻŨ•ŨŠ ŨŨ• Ũ”Ũ Ũ—Ũ™Ũ•ŨŠ Ũ”Ũ§Ũ”Ũ™ŨœŨ” ŨĐŨœŨ Ũ•.\n\nŨžŨĐŨš Ũ”Ũ”ŨĐŨĒŨ™Ũ”: {durationHours, plural,\n =1 {ŨĐŨĒŨ” ŨŨ—ŨŠ}\n other {# ŨĐŨĒŨ•ŨŠ}\n}\nŨ”Ũ•ŨĐŨĒŨ” ŨĒŨ“: {bannedUntil, date, full} Ũ‘ŨĐŨĒŨ” {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {ŨĄŨ™Ũ‘Ũ”: {reason}}\n}\n\nŨ‘ŨžŨ”ŨœŨš ŨŠŨ§Ũ•ŨĪŨ” Ũ–Ũ•, ŨœŨ ŨŠŨ”Ũ™Ũ” ŨœŨ›Ũ Ũ’Ũ™ŨĐŨ” ŨœŨ—ŨĐŨ‘Ũ•ŨŸ.\n\nŨŨ Ũ ŨĒŨ™Ũ™Ũ Ũ• Ũ‘:\n- ŨŠŨ ŨŨ™ Ũ”ŨĐŨ™ŨĻŨ•ŨŠ: {termsUrl}\n- Ũ”Ũ Ũ—Ũ™Ũ•ŨŠ Ũ”Ũ§Ũ”Ũ™ŨœŨ”: {guidelinesUrl}\n\nŨŨ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ”Ũ—ŨœŨ˜ŨŠ ŨŨ›Ũ™ŨĪŨ” Ũ–Ũ• ŨĐŨ’Ũ•Ũ™Ũ” ŨŨ• Ũ‘ŨœŨŠŨ™ ŨžŨ•ŨĶŨ“Ũ§ŨŠ, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”Ũ’Ũ™ŨĐ ŨĒŨĻŨĒŨ•ŨĻ. ŨĐŨœŨ—Ũ• Ũ“Ũ•Ũ\"Ũœ ŨœŨ›ŨŠŨ•Ũ‘ŨŠ {appeals_email} ŨžŨ›ŨŠŨ•Ũ‘ŨŠ Ũ“Ũ•Ũ\"Ũœ Ũ–Ũ• Ũ•Ũ”ŨĄŨ‘Ũ™ŨĻŨ• Ũ‘Ũ‘Ũ™ŨĻŨ•ŨĻ ŨžŨ“Ũ•ŨĒ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ”Ũ”Ũ—ŨœŨ˜Ũ” ŨĐŨ’Ũ•Ũ™Ũ”. ŨŨ Ũ• Ũ Ũ‘Ũ“Ũ•Ũ§ ŨŨŠ ŨĒŨĻŨĒŨ•ŨĻŨ›Ũ Ũ•Ũ ŨĐŨ™Ũ‘ ŨĒŨ Ũ”Ũ—ŨœŨ˜ŨŠŨ Ũ•.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
"subject": "Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ”Ũ•ŨĐŨĒŨ” Ũ–ŨžŨ Ũ™ŨŠ",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ”Ũ•ŨĐŨĒŨ” Ũ–ŨžŨ Ũ™ŨŠ ŨĒŨ§Ũ‘ Ũ”ŨĪŨĻŨ” ŨĐŨœ ŨŠŨ ŨŨ™ Ũ”ŨĐŨ™ŨĻŨ•ŨŠ ŨŨ• Ũ”Ũ Ũ—Ũ™Ũ•ŨŠ Ũ”Ũ§Ũ”Ũ™ŨœŨ” ŨĐŨœŨ Ũ•.\n\nŨžŨĐŨš Ũ”Ũ”ŨĐŨĒŨ™Ũ”: {durationHours, plural,\n =1 {ŨĐŨĒŨ” ŨŨ—ŨŠ}\n other {# ŨĐŨĒŨ•ŨŠ}\n}\nŨžŨ•ŨĐŨĒŨ” ŨĒŨ“: {bannedUntil, date, full} Ũ‘ŨĐŨĒŨ” {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {ŨĄŨ™Ũ‘Ũ”: {reason}}\n}\n\nŨ‘ŨžŨ”ŨœŨš ŨŠŨ§Ũ•ŨĪŨ” Ũ–Ũ• ŨœŨ ŨŠŨ”Ũ™Ũ” ŨœŨ›Ũ Ũ’Ũ™ŨĐŨ” ŨœŨ—ŨĐŨ‘Ũ•ŨŸ.\n\nŨŨ Ũ ŨĒŨ™Ũ™Ũ Ũ• Ũ‘ŨžŨĄŨžŨ›Ũ™Ũ Ũ”Ũ‘ŨŨ™Ũ:\n- ŨŠŨ ŨŨ™ Ũ”ŨĐŨ™ŨĻŨ•ŨŠ: {termsUrl}\n- Ũ”Ũ Ũ—Ũ™Ũ•ŨŠ Ũ”Ũ§Ũ”Ũ™ŨœŨ”: {guidelinesUrl}\n\nŨŨ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ”Ũ—ŨœŨ˜ŨŠ Ũ”ŨŨ›Ũ™ŨĪŨ” ŨĐŨ’Ũ•Ũ™Ũ” ŨŨ• Ũ‘ŨœŨŠŨ™ ŨžŨ•ŨĶŨ“Ũ§ŨŠ, ŨŠŨ•Ũ›ŨœŨ• ŨœŨ”Ũ’Ũ™ŨĐ ŨĒŨĻŨĒŨ•ŨĻ. ŨĐŨœŨ—Ũ• ŨŨ™ŨžŨ™Ũ™Ũœ ŨœŨ›ŨŠŨ•Ũ‘ŨŠ {appeals_email} ŨžŨ›ŨŠŨ•Ũ‘ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ”Ũ–Ũ• Ũ•Ũ”ŨĄŨ‘Ũ™ŨĻŨ• Ũ‘Ũ‘Ũ™ŨĻŨ•ŨĻ ŨžŨ“Ũ•ŨĒ ŨœŨ“ŨĒŨŠŨ›Ũ Ũ”Ũ”Ũ—ŨœŨ˜Ũ” ŨĐŨ’Ũ•Ũ™Ũ”. Ũ Ũ‘Ũ“Ũ•Ũ§ ŨŨŠ Ũ”ŨĒŨĻŨĒŨ•ŨĻ Ũ•Ũ ŨĒŨ“Ũ›ŨŸ ŨŨŠŨ›Ũ Ũ‘Ũ”Ũ—ŨœŨ˜Ũ” ŨĐŨœŨ Ũ•.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
},
"donation_confirmation": {
"subject": "ŨŠŨ•Ũ“Ũ” ŨĒŨœ ŨŠŨĻŨ•ŨžŨŠŨ›Ũ Ũœ-{product_name}",
"body": "ŨĐŨœŨ•Ũ,\n\nŨŠŨ•Ũ“Ũ” ŨĒŨœ ŨŠŨĻŨ•ŨžŨŠŨ›Ũ Ũœ-{product_name}! Ũ”{interval, select,\n month {ŨŠŨĻŨ•ŨžŨ” Ũ”Ũ—Ũ•Ũ–ŨĻŨŠ}\n year {ŨŠŨĻŨ•ŨžŨ” Ũ”Ũ—Ũ•Ũ–ŨĻŨŠ}\n other {ŨŠŨĻŨ•ŨžŨ” Ũ”Ũ—Ũ“-ŨĪŨĒŨžŨ™ŨŠ}\n} ŨĐŨœŨ›Ũ {interval, select,\n month {Ũ”Ũ•Ũ’Ũ“ŨĻŨ”}\n year {Ũ”Ũ•Ũ’Ũ“ŨĻŨ”}\n other {ŨĒŨ•Ũ‘Ũ“Ũ”}\n} Ũ‘Ũ”ŨĶŨœŨ—Ũ”.\n\nŨĪŨĻŨ˜Ũ™ Ũ”ŨŠŨĻŨ•ŨžŨ”:\nŨĄŨ›Ũ•Ũ: {amount} {currency} {interval, select,\n month {ŨœŨ—Ũ•Ũ“ŨĐ}\n year {ŨœŨĐŨ Ũ”}\n other {}\n}\n\nStripe Ũ™ŨĐŨœŨ— ŨœŨ›Ũ Ũ‘Ũ§ŨĻŨ•Ũ‘ Ũ§Ũ‘ŨœŨ” Ũ ŨĪŨĻŨ“ŨŠ ŨĒŨ Ũ§Ũ•Ũ‘ŨĨ PDF ŨĐŨœ Ũ”Ũ—ŨĐŨ‘Ũ•Ũ Ũ™ŨŠ. Ũ”Ũ§Ũ‘ŨœŨ” ŨŠŨ›ŨœŨ•Ũœ ŨŨŠ Ũ›Ũœ ŨĪŨĻŨ˜Ũ™ Ũ”ŨŠŨĐŨœŨ•Ũ Ũ•Ũ Ũ™ŨŠŨŸ Ũ™Ũ”Ũ™Ũ” ŨœŨ”ŨĐŨŠŨžŨĐ Ũ‘Ũ” ŨœŨžŨ˜ŨĻŨ•ŨŠ ŨžŨĄ.\n\nŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨĶŨĪŨ•ŨŠ Ũ‘Ũ”Ũ™ŨĄŨ˜Ũ•ŨĻŨ™Ũ™ŨŠ Ũ”ŨŠŨĻŨ•ŨžŨ•ŨŠ ŨĐŨœŨ›Ũ, ŨœŨ”Ũ•ŨĻŨ™Ũ“ Ũ—ŨĐŨ‘Ũ•Ũ Ũ™Ũ•ŨŠ, {interval, select,\n month {Ũ•ŨœŨ Ũ”Ũœ ŨŨ• ŨœŨ‘Ũ˜Ũœ ŨŨŠ Ũ”ŨžŨ Ũ•Ũ™}\n year {Ũ•ŨœŨ Ũ”Ũœ ŨŨ• ŨœŨ‘Ũ˜Ũœ ŨŨŠ Ũ”ŨžŨ Ũ•Ũ™}\n other {Ũ•ŨœŨ Ũ”Ũœ ŨŠŨĻŨ•ŨžŨ•ŨŠ ŨĒŨŠŨ™Ũ“Ũ™Ũ•ŨŠ}\n} Ũ‘Ũ›Ũœ ŨĒŨŠ Ũ‘ŨŨžŨĶŨĒŨ•ŨŠ Ũ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ”:\n\n{manageUrl}\n\nŨ”ŨŠŨžŨ™Ũ›Ũ” ŨĐŨœŨ›Ũ ŨĒŨ•Ũ–ŨĻŨŠ ŨœŨĐŨžŨ•ŨĻ ŨĒŨœ ŨĪŨĒŨ™ŨœŨ•ŨŠ {product_name}. ŨŠŨ•Ũ“Ũ”!\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
"body": "ŨĐŨœŨ•Ũ,\n\nŨŠŨ•Ũ“Ũ” ŨĒŨœ ŨŠŨĻŨ•ŨžŨŠŨ›Ũ Ũœ-{product_name}! Ũ”{interval, select,\n month {ŨŠŨĻŨ•ŨžŨ” Ũ”Ũ—Ũ•Ũ–ŨĻŨŠ}\n year {ŨŠŨĻŨ•ŨžŨ” Ũ”Ũ—Ũ•Ũ–ŨĻŨŠ}\n other {ŨŠŨĻŨ•ŨžŨ” Ũ”Ũ—Ũ“-ŨĪŨĒŨžŨ™ŨŠ}\n} ŨĐŨœŨ›Ũ {interval, select,\n month {Ũ”Ũ•Ũ’Ũ“ŨĻŨ”}\n year {Ũ”Ũ•Ũ’Ũ“ŨĻŨ”}\n other {Ũ‘Ũ•ŨĶŨĒŨ”}\n} Ũ‘Ũ”ŨĶŨœŨ—Ũ”.\n\nŨĪŨĻŨ˜Ũ™ Ũ”ŨŠŨĻŨ•ŨžŨ”:\nŨĄŨ›Ũ•Ũ: {amount} {interval, select,\n month {ŨœŨ—Ũ•Ũ“ŨĐ}\n year {ŨœŨĐŨ Ũ”}\n other {}\n}\n\nStripe Ũ™ŨĐŨœŨ— ŨœŨ›Ũ Ũ‘Ũ§ŨĻŨ•Ũ‘ Ũ§Ũ‘ŨœŨ” Ũ ŨĪŨĻŨ“ŨŠ ŨĒŨ Ũ§Ũ•Ũ‘ŨĨ PDF ŨĐŨœ Ũ”Ũ—ŨĐŨ‘Ũ•Ũ Ũ™ŨŠ. Ũ”Ũ§Ũ‘ŨœŨ” ŨŠŨ›ŨœŨ•Ũœ ŨŨŠ Ũ›Ũœ ŨĪŨĻŨ˜Ũ™ Ũ”ŨŠŨĐŨœŨ•Ũ Ũ•Ũ Ũ™ŨŠŨŸ Ũ™Ũ”Ũ™Ũ” ŨœŨ”ŨĐŨŠŨžŨĐ Ũ‘Ũ” ŨœŨžŨ˜ŨĻŨ•ŨŠ ŨžŨĄ.\n\nŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨĶŨĪŨ•ŨŠ Ũ‘Ũ”Ũ™ŨĄŨ˜Ũ•ŨĻŨ™Ũ™ŨŠ Ũ”ŨŠŨĻŨ•ŨžŨ•ŨŠ ŨĐŨœŨ›Ũ, ŨœŨ”Ũ•ŨĻŨ™Ũ“ Ũ—ŨĐŨ‘Ũ•Ũ Ũ™Ũ•ŨŠ, {interval, select,\n month {Ũ•ŨœŨ Ũ”Ũœ ŨŨ• ŨœŨ‘Ũ˜Ũœ ŨŨŠ Ũ”ŨžŨ Ũ•Ũ™}\n year {Ũ•ŨœŨ Ũ”Ũœ ŨŨ• ŨœŨ‘Ũ˜Ũœ ŨŨŠ Ũ”ŨžŨ Ũ•Ũ™}\n other {Ũ•ŨœŨ Ũ”Ũœ ŨŠŨĻŨ•ŨžŨ•ŨŠ ŨĒŨŠŨ™Ũ“Ũ™Ũ•ŨŠ}\n} Ũ‘Ũ›Ũœ ŨĒŨŠ Ũ‘ŨŨžŨĶŨĒŨ•ŨŠ Ũ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ”:\n\n{manageUrl}\n\nŨ”ŨŠŨžŨ™Ũ›Ũ” ŨĐŨœŨ›Ũ ŨĒŨ•Ũ–ŨĻŨŠ ŨœŨĐŨžŨ•ŨĻ ŨĒŨœ ŨĪŨĒŨ™ŨœŨ•ŨŠ {product_name}. ŨŠŨ•Ũ“Ũ”!\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"donation_magic_link": {
"subject": "Ũ Ũ™Ũ”Ũ•Ũœ Ũ”ŨŠŨĻŨ•ŨžŨ•ŨŠ ŨĐŨœŨ›Ũ Ũœ-{product_name}",
"body": "ŨĐŨœŨ•Ũ,\n\nŨœŨ—ŨĶŨ• ŨĒŨœ Ũ”Ũ§Ũ™ŨĐŨ•ŨĻ ŨœŨžŨ˜Ũ” Ũ›Ũ“Ũ™ ŨœŨ’ŨĐŨŠ ŨœŨĪŨ•ŨĻŨ˜Ũœ Ũ”ŨŠŨ•ŨĻŨžŨ™Ũ ŨĐŨœŨ›Ũ:\n\n{manageUrl}\n\nŨ‘ŨĪŨ•ŨĻŨ˜Ũœ, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ Ũ”Ũœ ŨžŨ Ũ•Ũ™Ũ™Ũ, ŨœŨ”Ũ•ŨĻŨ™Ũ“ Ũ—ŨĐŨ‘Ũ•Ũ Ũ™Ũ•ŨŠ Ũ•ŨœŨĶŨĪŨ•ŨŠ Ũ‘Ũ”Ũ™ŨĄŨ˜Ũ•ŨĻŨ™Ũ™ŨŠ Ũ”ŨŠŨĻŨ•ŨžŨ•ŨŠ ŨĐŨœŨ›Ũ.\n\nŨ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘- {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ”, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨĒŨœŨ Ũ‘Ũ‘Ũ˜Ũ—Ũ” ŨžŨ“Ũ•Ũ\"Ũœ Ũ–Ũ”.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
"body": "ŨĐŨœŨ•Ũ,\n\nŨœŨ—ŨĶŨ• ŨĒŨœ Ũ”Ũ§Ũ™ŨĐŨ•ŨĻ ŨœŨžŨ˜Ũ” Ũ›Ũ“Ũ™ ŨœŨ’ŨĐŨŠ ŨœŨĪŨ•ŨĻŨ˜Ũœ Ũ”ŨŠŨ•ŨĻŨžŨ™Ũ ŨĐŨœŨ›Ũ:\n\n{manageUrl}\n\nŨ‘ŨĪŨ•ŨĻŨ˜Ũœ, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ Ũ”Ũœ ŨžŨ Ũ•Ũ™Ũ™Ũ, ŨœŨ”Ũ•ŨĻŨ™Ũ“ Ũ—ŨĐŨ‘Ũ•Ũ Ũ™Ũ•ŨŠ Ũ•ŨœŨĶŨĪŨ•ŨŠ Ũ‘Ũ”Ũ™ŨĄŨ˜Ũ•ŨĻŨ™Ũ™ŨŠ Ũ”ŨŠŨĻŨ•ŨžŨ•ŨŠ ŨĐŨœŨ›Ũ.\n\nŨ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘ŨŠŨŨĻŨ™Ũš {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ”, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨĒŨœŨ Ũ‘Ũ‘Ũ˜Ũ—Ũ” ŨžŨŨ™ŨžŨ™Ũ™Ũœ Ũ–Ũ”.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"dsa_report_verification": {
"subject": "ŨŨ™ŨžŨ•ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ ŨĐŨœŨ›Ũ ŨĒŨ‘Ũ•ŨĻ Ũ“Ũ•Ũ— DSA",
"body": "ŨĐŨœŨ•Ũ,\n\nŨ”ŨĐŨŠŨžŨĐŨ• Ũ‘Ũ§Ũ•Ũ“ Ũ”ŨŨ™ŨžŨ•ŨŠ ŨœŨžŨ˜Ũ” Ũ›Ũ“Ũ™ ŨœŨ”Ũ’Ũ™ŨĐ ŨŨŠ Ũ“Ũ•Ũ— Ũ—Ũ•Ũ§ Ũ”ŨĐŨ™ŨĻŨ•ŨŠŨ™Ũ Ũ”Ũ“Ũ™Ũ’Ũ™Ũ˜ŨœŨ™Ũ™Ũ Ũ‘-{product_name}:\n\n{code}\n\nŨ§Ũ•Ũ“ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘- {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨĒŨœŨ ŨžŨ“Ũ•Ũ\"Ũœ Ũ–Ũ”.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
"subject": "ŨŨ™ŨžŨ•ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ ŨĐŨœŨ›Ũ ŨœŨ“Ũ™Ũ•Ũ•Ũ— DSA",
"body": "ŨĐŨœŨ•Ũ,\n\nŨ”ŨĐŨŠŨžŨĐŨ• Ũ‘Ũ§Ũ•Ũ“ Ũ”ŨŨ™ŨžŨ•ŨŠ ŨœŨžŨ˜Ũ” Ũ›Ũ“Ũ™ ŨœŨ”Ũ’Ũ™ŨĐ ŨŨŠ Ũ”Ũ“Ũ™Ũ•Ũ•Ũ— ŨĐŨœŨ›Ũ ŨœŨĪŨ™ Ũ—Ũ•Ũ§ Ũ”ŨĐŨ™ŨĻŨ•ŨŠŨ™Ũ Ũ”Ũ“Ũ™Ũ’Ũ™Ũ˜ŨœŨ™Ũ™Ũ Ũ‘-{product_name}:\n\n{code}\n\nŨ§Ũ•Ũ“ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘ŨŠŨŨĻŨ™Ũš {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨĒŨœŨ ŨžŨŨ™ŨžŨ™Ũ™Ũœ Ũ–Ũ”.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
},
"email_change_new": {
"subject": "ŨŨ™ŨžŨ•ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ”Ũ—Ũ“ŨĐ ŨĐŨœŨ›Ũ Ũœ-{product_name}",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ”Ũ–Ũ™Ũ Ũ• Ũ§Ũ•Ũ“ Ũ–Ũ” Ũ‘ŨŨĪŨœŨ™Ũ§ŨĶŨ™Ũ” Ũ›Ũ“Ũ™ ŨœŨŨžŨŠ ŨŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ”Ũ—Ũ“ŨĐ ŨĐŨœŨ›Ũ Ũ‘-{product_name}:\n\n{code}\n\nŨ§Ũ•Ũ“ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘- {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨĒŨœŨ ŨžŨ“Ũ•Ũ\"Ũœ Ũ–Ũ”.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
"subject": "ŨŨ™ŨžŨ•ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ”Ũ—Ũ“ŨĐ ŨĐŨœŨ›Ũ Ũ‘-{product_name}",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ”Ũ–Ũ™Ũ Ũ• Ũ§Ũ•Ũ“ Ũ–Ũ” Ũ‘ŨŨĪŨœŨ™Ũ§ŨĶŨ™Ũ” Ũ›Ũ“Ũ™ ŨœŨŨžŨŠ ŨŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ”Ũ—Ũ“ŨĐ ŨĐŨœŨ›Ũ Ũ‘-{product_name}:\n\n{code}\n\nŨ§Ũ•Ũ“ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘ŨŠŨŨĻŨ™Ũš {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨĒŨœŨ ŨžŨŨ™ŨžŨ™Ũ™Ũœ Ũ–Ũ”.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"email_change_original": {
"subject": "ŨŨ™ŨĐŨ•ŨĻ ŨĐŨ™Ũ Ũ•Ũ™ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ ŨĐŨœŨ›Ũ Ũœ-{product_name}",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ§Ũ™Ũ‘ŨœŨ Ũ• Ũ‘Ũ§ŨĐŨ” ŨœŨĐŨ™Ũ Ũ•Ũ™ Ũ›ŨŠŨ•Ũ‘ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ‘Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ.\n\nŨ›Ũ“Ũ™ ŨœŨŨĐŨĻ ŨĐŨ™Ũ Ũ•Ũ™ Ũ–Ũ”, Ũ”Ũ–Ũ™Ũ Ũ• Ũ§Ũ•Ũ“ Ũ–Ũ” Ũ‘ŨŨĪŨœŨ™Ũ§ŨĶŨ™Ũ”:\n\n{code}\n\nŨ§Ũ•Ũ“ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘- {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, ŨŨ Ũ ŨŨ‘Ũ˜Ũ—Ũ• ŨŨŠ Ũ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ ŨžŨ™Ũ“.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
"subject": "ŨŨ™ŨĐŨ•ŨĻ ŨĐŨ™Ũ Ũ•Ũ™ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ ŨĐŨœŨ›Ũ Ũ‘-{product_name}",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ§Ũ™Ũ‘ŨœŨ Ũ• Ũ‘Ũ§ŨĐŨ” ŨœŨĐŨ™Ũ Ũ•Ũ™ Ũ›ŨŠŨ•Ũ‘ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ‘Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ.\n\nŨ›Ũ“Ũ™ ŨœŨŨĐŨĻ ŨĐŨ™Ũ Ũ•Ũ™ Ũ–Ũ”, Ũ”Ũ–Ũ™Ũ Ũ• Ũ§Ũ•Ũ“ Ũ–Ũ” Ũ‘ŨŨĪŨœŨ™Ũ§ŨĶŨ™Ũ”:\n\n{code}\n\nŨ§Ũ•Ũ“ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘ŨŠŨŨĻŨ™Ũš {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, ŨŨ Ũ ŨŨ‘Ũ˜Ũ—Ũ• ŨŨŠ Ũ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ ŨžŨ™Ũ“.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"email_change_revert": {
"subject": "Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ ŨĐŨœŨ›Ũ Ũ‘-{product_name} ŨĐŨ•Ũ Ũ”",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ›ŨŠŨ•Ũ‘ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ‘Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ ŨĐŨ•Ũ ŨŠŨ” Ũœ- {newEmail}.\n\nŨŨ ŨŨŠŨ Ũ‘Ũ™ŨĶŨĒŨŠŨ ŨĐŨ™Ũ Ũ•Ũ™ Ũ–Ũ”, ŨŨ™ŨŸ ŨĶŨ•ŨĻŨš Ũ‘ŨĪŨĒŨ•ŨœŨ”. ŨŨ ŨœŨ, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ‘Ũ˜Ũœ ŨŨŠ Ũ”ŨĐŨ™Ũ Ũ•Ũ™ Ũ•ŨœŨŨ‘Ũ˜Ũ— ŨŨŠ Ũ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ Ũ‘ŨŨžŨĶŨĒŨ•ŨŠ Ũ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ”:\n\n{revertUrl}\n\nŨĪŨĒŨ•ŨœŨ” Ũ–Ũ• ŨŠŨĐŨ—Ũ–ŨĻ ŨŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ”Ũ§Ũ•Ũ“Ũ ŨĐŨœŨ›Ũ, ŨŠŨ ŨŠŨ§ ŨŨŠŨ›Ũ ŨžŨ›Ũœ Ũ”ŨžŨ›ŨĐŨ™ŨĻŨ™Ũ, ŨŠŨĄŨ™ŨĻ ŨžŨĄŨĪŨĻŨ™ Ũ˜ŨœŨĪŨ•ŨŸ ŨžŨ§Ũ•ŨĐŨĻŨ™Ũ, ŨŠŨ‘Ũ˜Ũœ ŨŨ™ŨžŨ•ŨŠ ŨĻŨ‘-ŨĐŨœŨ‘Ũ™ (MFA), Ũ•ŨŠŨ“ŨĻŨ•ŨĐ ŨžŨ›Ũ ŨœŨ”Ũ’Ũ“Ũ™ŨĻ ŨĄŨ™ŨĄŨžŨ” Ũ—Ũ“ŨĐŨ”.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ›ŨŠŨ•Ũ‘ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ‘Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ ŨĐŨ•Ũ ŨŠŨ” Ũœ-{newEmail}.\n\nŨŨ ŨŨŠŨ Ũ‘Ũ™ŨĶŨĒŨŠŨ ŨĐŨ™Ũ Ũ•Ũ™ Ũ–Ũ”, ŨŨ™ŨŸ ŨĶŨ•ŨĻŨš Ũ‘ŨĪŨĒŨ•ŨœŨ”. ŨŨ ŨœŨ, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ‘Ũ˜Ũœ ŨŨŠ Ũ”ŨĐŨ™Ũ Ũ•Ũ™ Ũ•ŨœŨŨ‘Ũ˜Ũ— ŨŨŠ Ũ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ Ũ‘ŨŨžŨĶŨĒŨ•ŨŠ Ũ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ”:\n\n{revertUrl}\n\nŨĪŨĒŨ•ŨœŨ” Ũ–Ũ• ŨŠŨĐŨ—Ũ–ŨĻ ŨŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ”Ũ§Ũ•Ũ“Ũ ŨĐŨœŨ›Ũ, ŨŠŨ ŨŠŨ§ ŨŨŠŨ›Ũ ŨžŨ›Ũœ Ũ”ŨžŨ›ŨĐŨ™ŨĻŨ™Ũ, ŨŠŨĄŨ™ŨĻ ŨžŨĄŨĪŨĻŨ™ Ũ˜ŨœŨĪŨ•ŨŸ ŨžŨ§Ũ•ŨĐŨĻŨ™Ũ, ŨŠŨ‘Ũ˜Ũœ ŨŨŠ Ũ”ŨŨ™ŨžŨ•ŨŠ Ũ”ŨĻŨ‘-ŨĐŨœŨ‘Ũ™ (MFA), Ũ•ŨŠŨ“ŨĻŨ•ŨĐ ŨžŨ›Ũ ŨœŨ”Ũ’Ũ“Ũ™ŨĻ ŨĄŨ™ŨĄŨžŨ” Ũ—Ũ“ŨĐŨ”.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
},
"email_verification": {
"subject": "ŨŨ™ŨžŨ•ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ ŨĐŨœŨ›Ũ Ũ‘-{product_name}",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨŨ Ũ ŨŨžŨŠ/Ũ™ ŨŨŠ Ũ›ŨŠŨ•Ũ‘ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ ŨĒŨ‘Ũ•ŨĻ Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨš ŨĒŨœ Ũ™Ũ“Ũ™ ŨœŨ—Ũ™ŨĶŨ” ŨĒŨœ Ũ”Ũ§Ũ™ŨĐŨ•ŨĻ ŨœŨžŨ˜Ũ”:\n\n{verifyUrl}\n\nŨŨ ŨœŨ Ũ™ŨĶŨĻŨŠŨ Ũ—ŨĐŨ‘Ũ•ŨŸ {product_name}, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨĒŨœŨ Ũ‘Ũ‘Ũ˜Ũ—Ũ” ŨžŨ“Ũ•Ũ\"Ũœ Ũ–Ũ”.\n\nŨ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ” ŨŠŨ§ŨĢ ŨœŨžŨĐŨš 24 ŨĐŨĒŨ•ŨŠ.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨŨ Ũ ŨŨžŨŠŨ• ŨŨŠ Ũ›ŨŠŨ•Ũ‘ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ ŨĐŨœ Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ‘ŨŨžŨĶŨĒŨ•ŨŠ ŨœŨ—Ũ™ŨĶŨ” ŨĒŨœ Ũ”Ũ§Ũ™ŨĐŨ•ŨĻ ŨœŨžŨ˜Ũ”:\n\n{verifyUrl}\n\nŨŨ ŨœŨ Ũ™ŨĶŨĻŨŠŨ Ũ—ŨĐŨ‘Ũ•ŨŸ {product_name}, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨĒŨœŨ Ũ‘Ũ‘Ũ˜Ũ—Ũ” ŨžŨŨ™ŨžŨ™Ũ™Ũœ Ũ–Ũ”.\n\nŨ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ” ŨŠŨ§ŨĢ ŨœŨžŨĐŨš 24 ŨĐŨĒŨ•ŨŠ.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"gift_chargeback_notification": {
"subject": "Ũ”Ũ˜Ũ‘Ũ•ŨŠ ŨžŨ”ŨžŨŠŨ Ũ” ŨĐŨžŨ™ŨžŨĐŨŠŨ Ũ”Ũ•ŨĄŨĻŨ•",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ§Ũ•Ũ“ ŨžŨŠŨ Ũ” ŨĐŨžŨ™ŨžŨĐŨŠŨ ŨĐŨ•ŨœŨ Ũ‘ŨžŨ§Ũ•ŨĻ ŨĒŨœ Ũ™Ũ“Ũ™ ŨžŨ™ŨĐŨ”Ũ• ŨŨ—ŨĻ. ŨŠŨĐŨœŨ•Ũ Ũ–Ũ” Ũ‘Ũ•Ũ˜Ũœ ŨžŨŨ– (Ũ”Ũ—Ũ–ŨĻ Ũ—Ũ™Ũ•Ũ‘).\n\nŨ‘ŨĐŨœ Ũ›Ũš, Ũ”ŨĄŨĻŨ Ũ• ŨŨŠ Ũ”Ũ”Ũ˜Ũ‘Ũ•ŨŠ ŨĐŨ Ũ•ŨĄŨĪŨ• ŨœŨ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ Ũ›ŨŨĐŨĻ ŨžŨ™ŨžŨĐŨŠŨ ŨŨŠ Ũ”ŨžŨŠŨ Ũ”.\n\nŨŨ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ–Ũ• Ũ˜ŨĒŨ•ŨŠ, ŨŨ Ũ ŨĶŨĻŨ• Ũ§ŨĐŨĻ ŨĒŨ ŨĶŨ•Ũ•ŨŠ Ũ”ŨŠŨžŨ™Ũ›Ũ” ŨĐŨœŨ Ũ• Ũ•Ũ›ŨœŨœŨ• Ũ›Ũœ ŨĪŨĻŨ˜ ŨĐŨ™ŨĐ ŨœŨ›Ũ ŨœŨ’Ũ‘Ũ™ Ũ§Ũ•Ũ“ Ũ”ŨžŨŠŨ Ũ” Ũ•ŨžŨŠŨ™ ŨžŨ™ŨžŨĐŨŠŨ ŨŨ•ŨŠŨ•.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
"subject": "Ũ”Ũ”Ũ˜Ũ‘Ũ•ŨŠ ŨžŨ”ŨžŨŠŨ Ũ” ŨĐŨžŨ™ŨžŨĐŨŠŨ Ũ”Ũ•ŨĄŨĻŨ•",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ§Ũ•Ũ“ ŨžŨŠŨ Ũ” ŨĐŨžŨ™ŨžŨĐŨŠŨ ŨĐŨ•ŨœŨ Ũ‘ŨžŨ§Ũ•ŨĻ ŨĒŨœ Ũ™Ũ“Ũ™ ŨžŨ™ŨĐŨ”Ũ• ŨŨ—ŨĻ. Ũ”ŨŠŨĐŨœŨ•Ũ Ũ”Ũ–Ũ” Ũ‘Ũ•Ũ˜Ũœ ŨžŨŨ– (Ũ”Ũ—Ũ–ŨĻ Ũ—Ũ™Ũ•Ũ‘).\n\nŨ‘ŨĐŨœ Ũ›Ũš, Ũ”ŨĄŨĻŨ Ũ• ŨŨŠ Ũ”Ũ”Ũ˜Ũ‘Ũ•ŨŠ ŨĐŨ Ũ•ŨĄŨĪŨ• ŨœŨ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ Ũ›ŨŨĐŨĻ ŨžŨ™ŨžŨĐŨŠŨ ŨŨŠ Ũ”ŨžŨŠŨ Ũ”.\n\nŨŨ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ–Ũ• Ũ˜ŨĒŨ•ŨŠ, ŨŨ Ũ ŨĶŨĻŨ• Ũ§ŨĐŨĻ ŨĒŨ ŨĶŨ•Ũ•ŨŠ Ũ”ŨŠŨžŨ™Ũ›Ũ” ŨĐŨœŨ Ũ• Ũ•ŨĶŨĻŨĪŨ• Ũ›Ũœ ŨĪŨĻŨ˜ ŨĐŨ™Ũ“Ũ•ŨĒ ŨœŨ›Ũ ŨœŨ’Ũ‘Ũ™ Ũ§Ũ•Ũ“ Ũ”ŨžŨŠŨ Ũ” Ũ•ŨžŨŠŨ™ ŨžŨ™ŨžŨĐŨŠŨ ŨŨ•ŨŠŨ•.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"harvest_completed": {
"subject": "Ũ™Ũ™ŨĶŨ•Ũ Ũ”Ũ ŨŠŨ•Ũ Ũ™Ũ ŨĐŨœŨ›Ũ Ũž-{product_name} ŨžŨ•Ũ›ŨŸ ŨœŨ”Ũ•ŨĻŨ“Ũ”",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ™Ũ™ŨĶŨ•Ũ Ũ”Ũ ŨŠŨ•Ũ Ũ™Ũ ŨĐŨœŨ›Ũ ŨžŨ•Ũ›ŨŸ.\n\nŨ§Ũ™ŨĐŨ•ŨĻ ŨœŨ”Ũ•ŨĻŨ“Ũ”:\n{downloadUrl}\n\nŨ”Ũ•Ũ“ŨĒŨ•ŨŠ Ũ›ŨœŨ•ŨœŨ•ŨŠ: {totalMessages, number}\nŨ’Ũ•Ũ“Ũœ Ũ§Ũ•Ũ‘ŨĨ: {fileSizeMB, number} ŨžŨ’Ũ”-Ũ‘Ũ™Ũ™Ũ˜\n\nŨ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘- {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ™Ũ™ŨĶŨ•Ũ Ũ–Ũ”, ŨŨ Ũ ŨĐŨ Ũ• ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ ŨžŨ™Ũ“ Ũ•ŨĶŨĻŨ• Ũ§ŨĐŨĻ ŨĒŨ ŨĶŨ•Ũ•ŨŠ Ũ”ŨŠŨžŨ™Ũ›Ũ” ŨĐŨœŨ Ũ•.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ™Ũ™ŨĶŨ•Ũ Ũ”Ũ ŨŠŨ•Ũ Ũ™Ũ ŨĐŨœŨ›Ũ ŨžŨ•Ũ›ŨŸ.\n\nŨ§Ũ™ŨĐŨ•ŨĻ ŨœŨ”Ũ•ŨĻŨ“Ũ”:\n{downloadUrl}\n\nŨ”Ũ•Ũ“ŨĒŨ•ŨŠ Ũ›ŨœŨ•ŨœŨ•ŨŠ: {totalMessages, number}\nŨ’Ũ•Ũ“Ũœ Ũ”Ũ§Ũ•Ũ‘ŨĨ: {fileSizeMB, number} ŨžŨ’Ũ”-Ũ‘Ũ™Ũ™Ũ˜\n\nŨ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘ŨŠŨŨĻŨ™Ũš {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ™Ũ™ŨĶŨ•Ũ Ũ–Ũ”, ŨŨ Ũ ŨĐŨ Ũ• ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ ŨžŨ™Ũ“ Ũ•ŨĶŨĻŨ• Ũ§ŨĐŨĻ ŨĒŨ ŨĶŨ•Ũ•ŨŠ Ũ”ŨŠŨžŨ™Ũ›Ũ” ŨĐŨœŨ Ũ•.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"inactivity_warning": {
"subject": "Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ™Ũ™ŨžŨ—Ũ§ ŨĒŨ§Ũ‘ Ũ—Ũ•ŨĄŨĻ ŨĪŨĒŨ™ŨœŨ•ŨŠ",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨœŨ ŨĻŨŨ™Ũ Ũ• ŨĪŨĒŨ™ŨœŨ•ŨŠ Ũ‘Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ ŨžŨŨ– {lastActiveDate, date, full}.\n\nŨŨ ŨœŨ ŨŠŨŠŨ—Ũ‘ŨĻŨ• ŨĒŨ“ {deletionDate, date, full} Ũ‘ŨĐŨĒŨ” {deletionDate, time, short}, Ũ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ Ũ™Ũ™ŨžŨ—Ũ§ ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ ŨĒŨ§Ũ‘ Ũ—Ũ•ŨĄŨĻ ŨĪŨĒŨ™ŨœŨ•ŨŠ.\n\nŨ”ŨŠŨ—Ũ‘ŨĻŨ• Ũ›ŨŨŸ:\n{loginUrl}\n\nŨŨ Ũ”ŨĐŨŠŨžŨĐŨŠŨ Ũ‘-{product_name} ŨœŨŨ—ŨĻŨ•Ũ Ũ”, ŨŨ Ũ ŨĶŨĻŨ• Ũ§ŨĐŨĻ ŨĒŨ ŨĶŨ•Ũ•ŨŠ Ũ”ŨŠŨžŨ™Ũ›Ũ” ŨĐŨœŨ Ũ• ŨžŨ™Ũ“.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"ip_authorization": {
"subject": "ŨŨ™ŨĐŨ•ŨĻ Ũ›Ũ Ũ™ŨĄŨ” ŨžŨ›ŨŠŨ•Ũ‘ŨŠ IP Ũ—Ũ“ŨĐŨ”",
"subject": "ŨŨ™ŨĐŨ•ŨĻ Ũ”ŨŠŨ—Ũ‘ŨĻŨ•ŨŠ ŨžŨ›ŨŠŨ•Ũ‘ŨŠ IP Ũ—Ũ“ŨĐŨ”",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ–Ũ™Ũ”Ũ™Ũ Ũ• Ũ Ũ™ŨĄŨ™Ũ•ŨŸ Ũ”ŨŠŨ—Ũ‘ŨĻŨ•ŨŠ ŨœŨ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ ŨžŨ›ŨŠŨ•Ũ‘ŨŠ IP Ũ—Ũ“ŨĐŨ”:\n\nŨ›ŨŠŨ•Ũ‘ŨŠ IP: {ipAddress}\nŨžŨ™Ũ§Ũ•Ũ: {location}\n\nŨŨ Ũ–Ũ” Ũ”Ũ™Ũ™ŨŠŨ ŨŨŠŨ, ŨŨ Ũ ŨŨĐŨĻŨ• Ũ›ŨŠŨ•Ũ‘ŨŠ IP Ũ–Ũ• ŨĒŨœ Ũ™Ũ“Ũ™ ŨœŨ—Ũ™ŨĶŨ” ŨĒŨœ Ũ”Ũ§Ũ™ŨĐŨ•ŨĻ ŨœŨžŨ˜Ũ”:\n\n{authUrl}\n\nŨŨ ŨœŨ Ũ Ũ™ŨĄŨ™ŨŠŨ ŨœŨ”ŨŠŨ—Ũ‘ŨĻ, ŨŨ Ũ ŨĐŨ Ũ• ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ ŨžŨ™Ũ“.\n\nŨ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ” ŨŠŨ§ŨĢ ŨœŨžŨĐŨš 30 Ũ“Ũ§Ũ•ŨŠ.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"mfa_backup_codes_view": {
"subject": "ŨŨ™ŨĐŨ•ŨĻ Ũ’Ũ™ŨĐŨ” ŨœŨ§Ũ•Ũ“Ũ™ Ũ”Ũ’Ũ™Ũ‘Ũ•Ũ™ ŨĐŨœŨ›Ũ Ũ‘-{product_name}",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ§Ũ™Ũ‘ŨœŨ Ũ• Ũ‘Ũ§ŨĐŨ” ŨœŨĶŨĪŨ™Ũ™Ũ” Ũ‘Ũ§Ũ•Ũ“Ũ™ Ũ”Ũ’Ũ™Ũ‘Ũ•Ũ™ Ũ‘Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ.\n\nŨ›Ũ“Ũ™ ŨœŨŨĐŨĻ Ũ‘Ũ§ŨĐŨ” Ũ–Ũ•, Ũ”Ũ–Ũ™Ũ Ũ• Ũ§Ũ•Ũ“ Ũ–Ũ” Ũ‘ŨŨĪŨœŨ™Ũ§ŨĶŨ™Ũ”:\n\n{code}\n\nŨ§Ũ•Ũ“ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘- {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, Ũ™Ũ™ŨŠŨ›ŨŸ ŨĐŨœŨžŨ™ŨĐŨ”Ũ• Ũ™ŨĐ Ũ’Ũ™ŨĐŨ” ŨœŨ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ. ŨĐŨ Ũ• ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ ŨžŨ™Ũ“.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ§Ũ™Ũ‘ŨœŨ Ũ• Ũ‘Ũ§ŨĐŨ” ŨœŨĶŨĪŨ™Ũ™Ũ” Ũ‘Ũ§Ũ•Ũ“Ũ™ Ũ”Ũ’Ũ™Ũ‘Ũ•Ũ™ Ũ‘Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ.\n\nŨ›Ũ“Ũ™ ŨœŨŨĐŨĻ Ũ‘Ũ§ŨĐŨ” Ũ–Ũ•, Ũ”Ũ–Ũ™Ũ Ũ• Ũ§Ũ•Ũ“ Ũ–Ũ” Ũ‘ŨŨĪŨœŨ™Ũ§ŨĶŨ™Ũ”:\n\n{code}\n\nŨ§Ũ•Ũ“ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘ŨŠŨŨĻŨ™Ũš {expiresAt, date, full} Ũ‘ŨĐŨĒŨ” {expiresAt, time, short}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, Ũ™Ũ™ŨŠŨ›ŨŸ ŨĐŨœŨžŨ™ŨĐŨ”Ũ• Ũ™ŨĐ Ũ’Ũ™ŨĐŨ” ŨœŨ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ. ŨĐŨ Ũ• ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ ŨžŨ™Ũ“.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"password_change_verification": {
"subject": "ŨŨ™ŨĐŨ•ŨĻ ŨĐŨ™Ũ Ũ•Ũ™ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ Ũ‘-{product_name}",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ§Ũ™Ũ‘ŨœŨ Ũ• Ũ‘Ũ§ŨĐŨ” ŨœŨĐŨ™Ũ Ũ•Ũ™ Ũ”ŨĄŨ™ŨĄŨžŨ” Ũ‘Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ.\n\nŨ›Ũ“Ũ™ ŨœŨŨĐŨĻ ŨĐŨ™Ũ Ũ•Ũ™ Ũ–Ũ”, Ũ”Ũ–Ũ™Ũ Ũ• Ũ§Ũ•Ũ“ Ũ–Ũ” Ũ‘ŨŨĪŨœŨ™Ũ§ŨĶŨ™Ũ”:\n\n{code}\n\nŨ§Ũ•Ũ“ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘- {expiresAt}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, Ũ™Ũ™ŨŠŨ›ŨŸ ŨĐŨœŨžŨ™ŨĐŨ”Ũ• Ũ™ŨĐ Ũ’Ũ™ŨĐŨ” ŨœŨ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ. ŨĐŨ Ũ• ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ ŨžŨ™Ũ“ Ũ•ŨŨĪŨĐŨĻŨ• ŨŨ™ŨžŨ•ŨŠ Ũ“Ũ•-ŨĐŨœŨ‘Ũ™.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ§Ũ™Ũ‘ŨœŨ Ũ• Ũ‘Ũ§ŨĐŨ” ŨœŨĐŨ™Ũ Ũ•Ũ™ Ũ”ŨĄŨ™ŨĄŨžŨ” Ũ‘Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ.\n\nŨ›Ũ“Ũ™ ŨœŨŨĐŨĻ ŨĐŨ™Ũ Ũ•Ũ™ Ũ–Ũ”, Ũ”Ũ–Ũ™Ũ Ũ• Ũ§Ũ•Ũ“ Ũ–Ũ” Ũ‘ŨŨĪŨœŨ™Ũ§ŨĶŨ™Ũ”:\n\n{code}\n\nŨ§Ũ•Ũ“ Ũ–Ũ” Ũ™ŨĪŨ•Ũ’ Ũ‘-{expiresAt}.\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, Ũ™Ũ™ŨŠŨ›ŨŸ ŨĐŨœŨžŨ™ŨĐŨ”Ũ• Ũ™ŨĐ Ũ’Ũ™ŨĐŨ” ŨœŨ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ. ŨĐŨ Ũ• ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ ŨžŨ™Ũ“ Ũ•Ũ”ŨĪŨĒŨ™ŨœŨ• ŨŨ™ŨžŨ•ŨŠ Ũ“Ũ•-ŨĐŨœŨ‘Ũ™.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"password_reset": {
"subject": "ŨŨ™ŨĪŨ•ŨĄ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ Ũœ-{product_name}",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ‘Ũ™Ũ§ŨĐŨŠŨ ŨŨ™ŨĪŨ•ŨĄ ŨĄŨ™ŨĄŨžŨ” Ũœ-{product_name}. Ũ”ŨĐŨŠŨžŨĐŨ• Ũ‘Ũ§Ũ™ŨĐŨ•ŨĻ ŨœŨžŨ˜Ũ” Ũ›Ũ“Ũ™ ŨœŨ”Ũ’Ũ“Ũ™ŨĻ ŨĄŨ™ŨĄŨžŨ” Ũ—Ũ“ŨĐŨ”:\n\n{resetUrl}\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨĒŨœŨ Ũ‘Ũ‘Ũ˜Ũ—Ũ” ŨžŨ“Ũ•Ũ\"Ũœ Ũ–Ũ”.\n\nŨ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ” ŨŠŨ§ŨĢ ŨœŨžŨĐŨš ŨĐŨĒŨ” ŨŨ—ŨŠ.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
"subject": "ŨŨ™ŨĪŨ•ŨĄ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ Ũ‘-{product_name}",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ‘Ũ™Ũ§ŨĐŨŠŨ ŨŨ™ŨĪŨ•ŨĄ ŨĄŨ™ŨĄŨžŨ” Ũœ-{product_name}. Ũ”ŨĐŨŠŨžŨĐŨ• Ũ‘Ũ§Ũ™ŨĐŨ•ŨĻ ŨœŨžŨ˜Ũ” Ũ›Ũ“Ũ™ ŨœŨ”Ũ’Ũ“Ũ™ŨĻ ŨĄŨ™ŨĄŨžŨ” Ũ—Ũ“ŨĐŨ”:\n\n{resetUrl}\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨĒŨœŨ Ũ‘Ũ‘Ũ˜Ũ—Ũ” ŨžŨŨ™ŨžŨ™Ũ™Ũœ Ũ–Ũ”.\n\nŨ§Ũ™ŨĐŨ•ŨĻ Ũ–Ũ” ŨŠŨ§ŨĢ ŨœŨžŨĐŨš ŨĐŨĒŨ” ŨŨ—ŨŠ.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"registration_approved": {
"subject": "Ũ”Ũ”ŨĻŨĐŨžŨ” ŨĐŨœŨ›Ũ Ũœ-{product_name} ŨŨ•ŨĐŨĻŨ”",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ—Ũ“ŨĐŨ•ŨŠ Ũ˜Ũ•Ũ‘Ũ•ŨŠ: Ũ”Ũ”ŨĻŨĐŨžŨ” ŨĐŨœŨ›Ũ Ũœ-{product_name} ŨŨ•ŨĐŨĻŨ”.\n\nŨ›ŨĒŨŠ ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨ—Ũ‘ŨĻ ŨœŨŨĪŨœŨ™Ũ§ŨĶŨ™Ũ™ŨŠ {product_name} Ũ›ŨŨŸ:\n{channelsUrl}\n\nŨ‘ŨĻŨ•Ũ›Ũ™Ũ Ũ”Ũ‘ŨŨ™Ũ ŨœŨ§Ũ”Ũ™ŨœŨŠ {product_name}.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"report_resolved": {
"subject": "Ũ”Ũ“Ũ•Ũ— ŨĐŨœŨ›Ũ Ũ‘-{product_name} Ũ Ũ‘Ũ“Ũ§",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ”Ũ“Ũ•Ũ— ŨĐŨœŨ›Ũ (ŨžŨ–Ũ”Ũ”: {reportId}) Ũ Ũ‘Ũ“Ũ§ ŨĒŨœ Ũ™Ũ“Ũ™ ŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœŨ Ũ•.{hasComment, select, yes {\n\nŨŠŨ’Ũ•Ũ‘Ũ” ŨžŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ:\n{publicComment}} other {}}\n\nŨŠŨ•Ũ“Ũ” ŨĐŨĒŨ–ŨĻŨŠŨ ŨœŨĐŨžŨ•ŨĻ ŨĒŨœ {product_name} Ũ‘Ũ˜Ũ•Ũ—Ũ” ŨœŨ›Ũ•ŨœŨ. ŨŨ Ũ• ŨžŨŠŨ™Ũ™Ũ—ŨĄŨ™Ũ ŨœŨ›Ũœ Ũ”Ũ“Ũ™Ũ•Ũ•Ũ—Ũ™Ũ Ũ‘ŨĻŨĶŨ™Ũ Ũ•ŨŠ Ũ•ŨžŨĒŨĻŨ™Ũ›Ũ™Ũ ŨŨŠ ŨŠŨĻŨ•ŨžŨŠŨ›Ũ ŨœŨ§Ũ”Ũ™ŨœŨ”.\n\nŨŨ Ũ™ŨĐ ŨœŨ›Ũ ŨĐŨŨœŨ•ŨŠ ŨŨ• Ũ—ŨĐŨĐŨ•ŨŠ ŨœŨ’Ũ‘Ũ™ ŨŠŨ•ŨĶŨŨ” Ũ–Ũ•, ŨŨ Ũ ŨĶŨĻŨ• Ũ§ŨĐŨĻ ŨĒŨ {safety_email}.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
"subject": "Ũ”Ũ“Ũ™Ũ•Ũ•Ũ— ŨĐŨœŨ›Ũ Ũ‘-{product_name} Ũ Ũ‘Ũ“Ũ§",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ”Ũ“Ũ™Ũ•Ũ•Ũ— ŨĐŨœŨ›Ũ (ŨžŨ–Ũ”Ũ”: {reportId}) Ũ Ũ‘Ũ“Ũ§ ŨĒŨœ Ũ™Ũ“Ũ™ ŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœŨ Ũ•.{hasComment, select, yes {\n\nŨŠŨ’Ũ•Ũ‘Ũ” ŨžŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ:\n{publicComment}} other {}}\n\nŨŠŨ•Ũ“Ũ” ŨĐŨĒŨ–ŨĻŨŠŨ ŨœŨĐŨžŨ•ŨĻ ŨĒŨœ {product_name} Ũ›ŨžŨ§Ũ•Ũ Ũ‘Ũ˜Ũ•Ũ— ŨœŨ›Ũ•ŨœŨ. ŨŨ Ũ• ŨžŨŠŨ™Ũ™Ũ—ŨĄŨ™Ũ ŨœŨ›Ũœ Ũ”Ũ“Ũ™Ũ•Ũ•Ũ—Ũ™Ũ Ũ‘ŨĻŨĶŨ™Ũ Ũ•ŨŠ Ũ•ŨžŨĒŨĻŨ™Ũ›Ũ™Ũ ŨŨŠ ŨŠŨĻŨ•ŨžŨŠŨ›Ũ ŨœŨ§Ũ”Ũ™ŨœŨ”.\n\nŨŨ Ũ™ŨĐ ŨœŨ›Ũ ŨĐŨŨœŨ•ŨŠ ŨŨ• Ũ—ŨĐŨĐŨ•ŨŠ ŨœŨ’Ũ‘Ũ™ ŨŠŨ•ŨĶŨŨ” Ũ–Ũ•, ŨŨ Ũ ŨĶŨĻŨ• Ũ§ŨĐŨĻ ŨĒŨ {safety_email}.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ™Ũ™ŨžŨ—Ũ§ ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ Ũ§Ũ‘ŨĒ ŨœŨžŨ—Ũ™Ũ§Ũ” ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ.\n\nŨžŨ—Ũ™Ũ§Ũ” ŨžŨŠŨ•Ũ–ŨžŨ ŨŠ: {deletionDate, date, full} Ũ‘ŨĐŨĒŨ” {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ŨĄŨ™Ũ‘Ũ”: {reason}}\n}\n\nŨ–Ũ•Ũ”Ũ™ ŨĪŨĒŨ•ŨœŨŠ ŨŨ›Ũ™ŨĪŨ” Ũ—ŨžŨ•ŨĻŨ”. Ũ ŨŠŨ•Ũ Ũ™ Ũ”Ũ—ŨĐŨ‘Ũ•ŨŸ ŨĐŨœŨ›Ũ Ũ™Ũ™ŨžŨ—Ũ§Ũ• ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ Ũ‘ŨŠŨŨĻŨ™Ũš Ũ”ŨžŨŠŨ•Ũ›Ũ ŨŸ.\n\nŨŨ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ”Ũ—ŨœŨ˜ŨŠ ŨŨ›Ũ™ŨĪŨ” Ũ–Ũ• ŨĐŨ’Ũ•Ũ™Ũ”, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”Ũ’Ũ™ŨĐ ŨĒŨĻŨĒŨ•ŨĻ. ŨĐŨœŨ—Ũ• Ũ“Ũ•Ũ\"Ũœ ŨœŨ›ŨŠŨ•Ũ‘ŨŠ {appeals_email} ŨžŨ›ŨŠŨ•Ũ‘ŨŠ Ũ“Ũ•Ũ\"Ũœ Ũ–Ũ•.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ Ũ§Ũ‘ŨĒ ŨœŨžŨ—Ũ™Ũ§Ũ” ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ.\n\nŨžŨ—Ũ™Ũ§Ũ” ŨžŨŠŨ•Ũ–ŨžŨ ŨŠ: {deletionDate, date, full} Ũ‘ŨĐŨĒŨ” {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ŨĄŨ™Ũ‘Ũ”: {reason}}\n}\n\nŨ–Ũ•Ũ”Ũ™ ŨĪŨĒŨ•ŨœŨŠ ŨŨ›Ũ™ŨĪŨ” Ũ—ŨžŨ•ŨĻŨ”. Ũ ŨŠŨ•Ũ Ũ™ Ũ”Ũ—ŨĐŨ‘Ũ•ŨŸ ŨĐŨœŨ›Ũ Ũ™Ũ™ŨžŨ—Ũ§Ũ• ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ Ũ‘ŨŠŨŨĻŨ™Ũš Ũ”ŨžŨŠŨ•Ũ›Ũ ŨŸ.\n\nŨŨ ŨŨŠŨ Ũ—Ũ•ŨĐŨ‘Ũ™Ũ ŨĐŨ”Ũ—ŨœŨ˜ŨŠ ŨŨ›Ũ™ŨĪŨ” Ũ–Ũ• ŨĐŨ’Ũ•Ũ™Ũ”, ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”Ũ’Ũ™ŨĐ ŨĒŨĻŨĒŨ•ŨĻ. ŨĐŨœŨ—Ũ• ŨŨ™ŨžŨ™Ũ™Ũœ ŨœŨ›ŨŠŨ•Ũ‘ŨŠ {appeals_email} ŨžŨ›ŨŠŨ•Ũ‘ŨŠ Ũ”ŨŨ™ŨžŨ™Ũ™Ũœ Ũ”Ũ–Ũ•.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
},
"self_deletion_scheduled": {
"subject": "ŨžŨ—Ũ™Ũ§ŨŠ Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ ŨžŨŠŨ•Ũ–ŨžŨ ŨŠ",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ‘Ũ™Ũ§ŨĐŨŠŨ ŨœŨžŨ—Ũ•Ũ§ ŨŨŠ Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ. Ũ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ ŨžŨŠŨ•Ũ–ŨžŨŸ ŨœŨžŨ—Ũ™Ũ§Ũ” ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ Ũ‘:\n\n{deletionDate, date, full} Ũ‘ŨĐŨĒŨ” {deletionDate, time, short}\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, Ũ”ŨŠŨ—Ũ‘ŨĻŨ• ŨœŨ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ Ũ›Ũ“Ũ™ ŨœŨ‘Ũ˜Ũœ ŨŨŠ Ũ”ŨžŨ—Ũ™Ũ§Ũ”. ŨŨ Ũ• ŨžŨžŨœŨ™ŨĶŨ™Ũ Ũ’Ũ ŨœŨĐŨ Ũ•ŨŠ ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ Ũ›Ũ“Ũ™ ŨœŨŨ‘Ũ˜Ũ— ŨŨŠ Ũ”Ũ—ŨĐŨ‘Ũ•ŨŸ.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ‘Ũ™Ũ§ŨĐŨŠŨ ŨœŨžŨ—Ũ•Ũ§ ŨŨŠ Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ. Ũ”Ũ—ŨĐŨ‘Ũ•ŨŸ ŨĐŨœŨ›Ũ ŨžŨŠŨ•Ũ›Ũ ŨŸ ŨœŨ”Ũ™ŨžŨ—Ũ§ ŨœŨĶŨžŨ™ŨŠŨ•ŨŠ Ũ‘ŨŠŨŨĻŨ™Ũš:\n\n{deletionDate, date, full} Ũ‘ŨĐŨĒŨ” {deletionDate, time, short}\n\nŨŨ ŨœŨ Ũ‘Ũ™Ũ§ŨĐŨŠŨ Ũ–ŨŨŠ, Ũ”ŨŠŨ—Ũ‘ŨĻŨ• ŨœŨ—ŨĐŨ‘Ũ•Ũ Ũ›Ũ Ũ›Ũ“Ũ™ ŨœŨ‘Ũ˜Ũœ ŨŨŠ Ũ”ŨžŨ—Ũ™Ũ§Ũ”. ŨŨ Ũ• ŨžŨžŨœŨ™ŨĶŨ™Ũ Ũ’Ũ ŨœŨĐŨ Ũ•ŨŠ ŨŨŠ Ũ”ŨĄŨ™ŨĄŨžŨ” ŨĐŨœŨ›Ũ Ũ›Ũ“Ũ™ ŨœŨŨ‘Ũ˜Ũ— ŨŨŠ Ũ”Ũ—ŨĐŨ‘Ũ•ŨŸ.\n\nŨĶŨ•Ũ•ŨŠ {product_name}"
},
"unban_notification": {
"subject": "Ũ”ŨĐŨĒŨ™Ũ™ŨŠ Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ”Ũ•ŨĄŨĻŨ”",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ—Ũ“ŨĐŨ•ŨŠ Ũ˜Ũ•Ũ‘Ũ•ŨŠ: Ũ”ŨĐŨĒŨ™Ũ™ŨŠ Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ”Ũ•ŨĄŨĻŨ”.\n\n{reason, select,\n null {}\n other {ŨĄŨ™Ũ‘Ũ”: {reason}}\n}\n\nŨ›ŨĒŨŠ ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨ—Ũ‘ŨĻ ŨĐŨ•Ũ‘ Ũ•ŨœŨ”ŨžŨĐŨ™Ũš ŨœŨ”ŨĐŨŠŨžŨĐ Ũ‘-{product_name} Ũ›ŨĻŨ’Ũ™Ũœ.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
"subject": "Ũ”ŨĐŨĒŨ™Ũ™ŨŠ Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ‘Ũ•Ũ˜ŨœŨ”",
"body": "ŨĐŨœŨ•Ũ {username},\n\nŨ—Ũ“ŨĐŨ•ŨŠ Ũ˜Ũ•Ũ‘Ũ•ŨŠ: Ũ”ŨĐŨĒŨ™Ũ™ŨŠ Ũ—ŨĐŨ‘Ũ•ŨŸ Ũ”-{product_name} ŨĐŨœŨ›Ũ Ũ‘Ũ•Ũ˜ŨœŨ”.\n\n{reason, select,\n null {}\n other {ŨĄŨ™Ũ‘Ũ”: {reason}}\n}\n\nŨ›ŨĒŨŠ ŨŨŠŨ Ũ™Ũ›Ũ•ŨœŨ™Ũ ŨœŨ”ŨŠŨ—Ũ‘ŨĻ ŨĐŨ•Ũ‘ Ũ•ŨœŨ”ŨžŨĐŨ™Ũš ŨœŨ”ŨĐŨŠŨžŨĐ Ũ‘-{product_name} Ũ›ŨĻŨ’Ũ™Ũœ.\n\nŨĶŨ•Ũ•ŨŠ Ũ”Ũ‘Ũ˜Ũ™Ũ—Ũ•ŨŠ ŨĐŨœ {product_name}"
}
});
@@ -1,91 +1,91 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_HI_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "āΆāĪŠāĪ•āĪū {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ…āĪļāĨāĪĨāĪūāĪŊāĨ€ āΰāĨ‚āĪŠ āĪļāĨ‡ āĪĄāĪŋāĪļāĨ‡āĪŽāĪē āĪ•āΰ āĪĶāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪđāĪŪāĪĻāĨ‡ āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪ…āĪļāĨāĪĨāĪūāĪŊāĨ€ āΰāĨ‚āĪŠ āĪļāĨ‡ āĪĄāĪŋāĪļāĨ‡āĪŽāĪē āĪ•āΰ āĪĶāĪŋāĪŊāĪū āĪđāĨˆ āĪ•āĨāĪŊāĨ‹āĪ‚āĪ•āĪŋ āĪđāĪŪāĨ‡āĪ‚ āĪļāĪ‚āĪĶāĪŋāĪ—āĨāΧ āĪāĪ•āĨāΟāĪŋāĪĩāĪŋāΟāĨ€ āĪĶāĨ‡āĪ–āĨ€ āĪ—āΈ āĪđāĨˆāĨĪ\n\n{reason, select,\n null {}\n other {āĪĩāΜāĪđ: {reason}}\n}\n\nāĪ…āĪŠāĪĻāĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪāĪ•āĨāĪļāĨ‡āĪļ āĪŦāĪŋāΰ āĪļāĨ‡ āĪŠāĪūāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ, āΆāĪŠāĪ•āĨ‹ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āΰāĨ€āĪļāĨ‡āΟ āĪ•āΰāĪĻāĪū āĪđāĨ‹āĪ—āĪū:\n\n{forgotUrl}\n\nāĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āΰāĨ€āĪļāĨ‡āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪŽāĪūāĪĶ, āΆāĪŠ āĪŦāĪŋāΰ āĪļāĨ‡ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āΰ āĪŠāĪūāĪāĪ‚āĪ—āĨ‡āĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪ—āĪēāĪĪāĨ€ āĪļāĨ‡ āĪđāĨāΆ āĪđāĨˆ, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪđāĪŪāĪūāΰāĨ€ āĪļāĪŠāĨ‹āΰāĨāΟ āΟāĨ€āĪŪ āĪļāĨ‡ āĪļāĪ‚āĪŠāΰāĨāĪ• āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪđāĪŪāĪĻāĨ‡ āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪ…āĪļāĨāĪĨāĪūāĪŊāĨ€ āΰāĨ‚āĪŠ āĪļāĨ‡ āĪĄāĪŋāĪļāĨ‡āĪŽāĪē āĪ•āΰ āĪĶāĪŋāĪŊāĪū āĪđāĨˆ āĪ•āĨāĪŊāĨ‹āĪ‚āĪ•āĪŋ āĪđāĪŪāĪĻāĨ‡ āĪļāĪ‚āĪĶāĪŋāĪ—āĨāΧ āĪāĪ•āĨāΟāĪŋāĪĩāĪŋāΟāĨ€ āĪĶāĨ‡āĪ–āĨ€ āĪđāĨˆāĨĪ\n\n{reason, select,\n null {}\n other {āĪĩāΜāĪđ: {reason}}\n}\n\nāĪ…āĪŠāĪĻāĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪāĪ•āĨāĪļāĨ‡āĪļ āĪŦāĪŋāΰ āĪļāĨ‡ āĪŠāĪūāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ, āΆāĪŠāĪ•āĨ‹ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āΰāĨ€āĪļāĨ‡āΟ āĪ•āΰāĪĻāĪū āĪđāĨ‹āĪ—āĪū:\n\n{forgotUrl}\n\nāĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āΰāĨ€āĪļāĨ‡āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪŽāĪūāĪĶ, āΆāĪŠ āĪŦāĪŋāΰ āĪļāĨ‡ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āΰ āĪŠāĪūāĪā΁āĪ—āĨ‡āĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪ—āĪēāĪĪāĨ€ āĪļāĨ‡ āĪđāĨāΆ āĪđāĨˆ, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪđāĪŪāĪūāΰāĨ€ āĪļāĪŠāĨ‹āΰāĨāΟ āΟāĨ€āĪŪ āĪļāĨ‡ āĪļāĪ‚āĪŠāΰāĨāĪ• āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
},
"account_scheduled_deletion": {
"subject": "āΆāĪŠāĪ•āĪū {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āΜāĪūāĪāĪ—āĪū",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪđāĪŪāĪūāΰāĨ€ āĪļāĨ‡āĪĩāĪū āĪ•āĨ€ āĪķāΰāĨāĪĪāĨ‹āĪ‚ āĪŊāĪū āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪ—āĪūā·āĪĄāĪēāĪūā·āĪ‚āĪļ āĪ•āĨ‡ āΉāĪēāĨāĪēāĪ‚āΘāĪĻ āĪ•āĨ‡ āĪ•āĪūāΰāĪĢ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪķāĨ‡āĪĄāĨāĪŊāĨ‚āĪē āĪ•āĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆāĨĪ\n\nāĪĄāĪŋāĪēāĨ€āĪķāĪĻ āĪķāĨ‡āĪĄāĨāĪŊāĨ‚āĪē: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {āĪĩāΜāĪđ: {reason}}\n}\n\nāĪŊāĪđ āĪāĪ• āĪ—āĪ‚āĪ­āĨ€āΰ āĪ•āĪĶāĪŪ āĪđāĨˆāĨĪ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪĄāĨ‡āΟāĪū āĪĻāĪŋāΰāĨāΧāĪūāΰāĪŋāĪĪ āĪĪāĪūāΰāĨ€āĪ– āĪŠāΰ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ•āĨƒāĪŠāĪŊāĪū āĪĶāĨ‡āĪ–āĨ‡āĪ‚:\n- āĪļāĨ‡āĪĩāĪū āĪ•āĨ€ āĪķāΰāĨāĪĪāĨ‡āĪ‚: {termsUrl}\n- āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪ—āĪūā·āĪĄāĪēāĪūā·āĪ‚āĪļ: {guidelinesUrl}\n\nāĪ…āĪŠāĨ€āĪē āĪŠāĨāΰāĪ•āĨāΰāĪŋāĪŊāĪū:\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪĻāĪŋāΰāĨāĪĢāĪŊ āĪ—āĪēāĪĪ āĪŊāĪū āĪ…āĪĻāĨāΚāĪŋāĪĪ āĪĨāĪū, āĪĪāĨ‹ āΆāĪŠāĪ•āĨ‡ āĪŠāĪūāĪļ āĪ…āĪŠāĨ€āĪē āĪļāĪŽāĪŪāĪŋāΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ 60 āĪĶāĪŋāĪĻ āĪđāĨˆāĪ‚āĨĪ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪāĪĄāĨāΰāĨ‡āĪļ āĪļāĨ‡ {appeals_email} āĪŠāΰ āΈāĪŪāĨ‡āĪē āĪ•āΰāĨ‡āĪ‚āĨĪ\n\nāĪ…āĪŠāĪĻāĨ€ āĪ…āĪŠāĨ€āĪē āĪŪāĨ‡āĪ‚:\n- āĪļāĪūāĪŦ āĪĪāĨŒāΰ āĪŠāΰ āĪŽāĪĪāĪūāĪāĪ‚ āĪ•āĪŋ āΆāĪŠāĪ•āĨ‹ āĪ•āĨāĪŊāĨ‹āĪ‚ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪĻāĪŋāΰāĨāĪĢāĪŊ āĪ—āĪēāĪĪ āĪŊāĪū āĪ…āĪĻāĨāΚāĪŋāĪĪ āĪĨāĪū\n- āĪ•āĨ‹āΈ āĪ­āĨ€ āĪŠāĨāΰāĪūāĪļāĪ‚āĪ—āĪŋāĪ• āĪļāĪŽāĨ‚āĪĪ āĪŊāĪū āĪļāĪ‚āĪĶāΰāĨāĪ­ āĪĶāĨ‡āĪ‚\n\n{product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ āĪ•āĪū āĪāĪ• āĪŪāĨ‡āĪ‚āĪŽāΰ āΆāĪŠāĪ•āĨ€ āĪ…āĪŠāĨ€āĪē āĪ•āĪū āΰāĪŋāĪĩāĨāĪŊāĨ‚ āĪ•āΰāĨ‡āĪ—āĪū āĪ”āΰ āĪ…āĪ‚āĪĪāĪŋāĪŪ āĪŦāĨˆāĪļāĪēāĪū āΆāĪĻāĨ‡ āĪĪāĪ• āĪĄāĪŋāĪēāĨ€āΟ āĪđāĨ‹āĪĻāĨ‡ āĪ•āĨ€ āĪŠāĨāΰāĪ•āĨāΰāĪŋāĪŊāĪū āĪ•āĨ‹ āΰāĨ‹āĪ• āĪļāĪ•āĪĪāĪū āĪđāĨˆāĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪđāĪŪāĪūāΰāĨ€ āĪļāĨ‡āĪĩāĪū āĪ•āĨ€ āĪķāΰāĨāĪĪāĨ‹āĪ‚ āĪŊāĪū āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪ—āĪūā·āĪĄāĪēāĪūā·āĪ‚āĪļ āĪ•āĨ‡ āΉāĪēāĨāĪēāĪ‚āΘāĪĻ āĪ•āĨ‡ āĪ•āĪūāΰāĪĢ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪķāĨ‡āĪĄāĨāĪŊāĨ‚āĪē āĪ•āĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆāĨĪ\n\nāĪĄāĪŋāĪēāĨ€āĪķāĪĻ āĪ•āĨ€ āĪĻāĪŋāΰāĨāΧāĪūāΰāĪŋāĪĪ āĪĪāĪūāΰāĨ€āĪ–: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {āĪĩāΜāĪđ: {reason}}\n}\n\nāĪŊāĪđ āĪāĪ• āĪ—āĪ‚āĪ­āĨ€āΰ āĪ•āĪūāΰāĨāΰāĪĩāĪūāΈ āĪđāĨˆāĨĪ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪĄāĨ‡āΟāĪū āĪĻāĪŋāΰāĨāΧāĪūāΰāĪŋāĪĪ āĪĪāĪūāΰāĨ€āĪ– āĪŠāΰ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ•āĨƒāĪŠāĪŊāĪū āĪĶāĨ‡āĪ–āĨ‡āĪ‚:\n- āĪļāĨ‡āĪĩāĪū āĪ•āĨ€ āĪķāΰāĨāĪĪāĨ‡āĪ‚: {termsUrl}\n- āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪ—āĪūā·āĪĄāĪēāĪūā·āĪ‚āĪļ: {guidelinesUrl}\n\nāĪ…āĪŠāĨ€āĪē āĪŠāĨāΰāĪ•āĨāΰāĪŋāĪŊāĪū:\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪŦāĨˆāĪļāĪēāĪū āĪ—āĪēāĪĪ āĪŊāĪū āĪ…āĪĻāĨāΚāĪŋāĪĪ āĪĨāĪū, āĪĪāĨ‹ āΆāĪŠāĪ•āĨ‡ āĪŠāĪūāĪļ āĪ…āĪŠāĨ€āĪē āĪļāĪŽāĪŪāĪŋāΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ 60 āĪĶāĪŋāĪĻ āĪđāĨˆāĪ‚āĨĪ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪŠāĪĪāĨ‡ āĪļāĨ‡ {appeals_email} āĪŠāΰ āΈāĪŪāĨ‡āĪē āĪ•āΰāĨ‡āĪ‚āĨĪ\n\nāĪ…āĪŠāĪĻāĨ€ āĪ…āĪŠāĨ€āĪē āĪŪāĨ‡āĪ‚:\n- āĪļāĪūāĪŦāĪž āĪĪāĨŒāΰ āĪŠāΰ āĪŽāĪĪāĪūāĪāĪ‚ āĪ•āĪŋ āΆāĪŠāĪ•āĨ‹ āĪ•āĨāĪŊāĨ‹āĪ‚ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪŦāĨˆāĪļāĪēāĪū āĪ—āĪēāĪĪ āĪŊāĪū āĪ…āĪĻāĨāΚāĪŋāĪĪ āĪĨāĪū\n- āĪ•āĨ‹āΈ āĪ­āĨ€ āĪŠāĨāΰāĪūāĪļāĪ‚āĪ—āĪŋāĪ• āĪļāĪŽāĨ‚āĪĪ āĪŊāĪū āΜāĪūāĪĻāĪ•āĪūāΰāĨ€ āĪĶāĨ‡āĪ‚\n\n{product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ āĪ•āĪū āĪāĪ• āĪļāĪĶāĪļāĨāĪŊ āΆāĪŠāĪ•āĨ€ āĪ…āĪŠāĨ€āĪē āĪ•āĪū āΰāĪŋāĪĩāĨāĪŊāĨ‚ āĪ•āΰāĨ‡āĪ—āĪū āĪ”āΰ āĪ…āĪ‚āĪĪāĪŋāĪŪ āĪŦāĨˆāĪļāĪēāĪū āΆāĪĻāĨ‡ āĪĪāĪ• āĪĄāĪŋāĪēāĨ€āΟ āĪđāĨ‹āĪĻāĨ‡ āĪ•āĨ€ āĪŠāĨāΰāĪ•āĨāΰāĪŋāĪŊāĪū āĪ•āĨ‹ āΰāĨ‹āĪ• āĪļāĪ•āĪĪāĪū āĪđāĨˆāĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
},
"account_temp_banned": {
"subject": "āΆāĪŠāĪ•āĪū {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ…āĪļāĨāĪĨāĪūāĪŊāĨ€ āΰāĨ‚āĪŠ āĪļāĨ‡ āĪļāĪļāĨāĪŠāĨ‡āĪ‚āĪĄ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪđāĪŪāĪūāΰāĨ€ āĪļāĨ‡āĪĩāĪū āĪ•āĨ€ āĪķāΰāĨāĪĪāĨ‹āĪ‚ āĪŊāĪū āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪ—āĪūā·āĪĄāĪēāĪūā·āĪ‚āĪļ āĪ•āĪū āΉāĪēāĨāĪēāĪ‚āΘāĪĻ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪ…āĪļāĨāĪĨāĪūāĪŊāĨ€ āΰāĨ‚āĪŠ āĪļāĨ‡ āĪļāĪļāĨāĪŠāĨ‡āĪ‚āĪĄ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆāĨĪ\n\nāĪ…āĪĩāΧāĪŋ: {durationHours, plural,\n =1 {1 āΘāĪ‚āΟāĪū}\n other {# āΘāĪ‚āΟāĨ‡}\n}\nāĪļāĪļāĨāĪŠāĨ‡āĪ‚āĪĄ āĪ•āĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ: {bannedUntil, date, full} {bannedUntil, time, short} āĪĪāĪ•\n\n{reason, select,\n null {}\n other {āĪĩāΜāĪđ: {reason}}\n}\n\nā·āĪļ āĪĶāĨŒāΰāĪūāĪĻ, āΆāĪŠ āĪ…āĪŠāĪĻāĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪāĪ•āĨāĪļāĨ‡āĪļ āĪĻāĪđāĨ€āĪ‚ āĪ•āΰ āĪŠāĪūāĪāĪ‚āĪ—āĨ‡āĨĪ\n\nāĪ•āĨƒāĪŠāĪŊāĪū āĪĶāĨ‡āĪ–āĨ‡āĪ‚:\n- āĪļāĨ‡āĪĩāĪū āĪ•āĨ€ āĪķāΰāĨāĪĪāĨ‡āĪ‚: {termsUrl}\n- āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪ—āĪūā·āĪĄāĪēāĪūā·āĪ‚āĪļ: {guidelinesUrl}\n\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪĻāĪŋāΰāĨāĪĢāĪŊ āĪ—āĪēāĪĪ āĪŊāĪū āĪ…āĪĻāĨāΚāĪŋāĪĪ āĪĨāĪū, āĪĪāĨ‹ āΆāĪŠ āĪ…āĪŠāĨ€āĪē āĪļāĪŽāĪŪāĪŋāΟ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪāĪĄāĨāΰāĨ‡āĪļ āĪļāĨ‡ {appeals_email} āĪŠāΰ āΈāĪŪāĨ‡āĪē āĪ•āΰāĨ‡āĪ‚ āĪ”āΰ āĪļāĪūāĪŦ āĪĪāĨŒāΰ āĪŠāΰ āĪŽāĪĪāĪūāĪāĪ‚ āĪ•āĪŋ āΆāĪŠāĪ•āĨ‹ āĪ•āĨāĪŊāĨ‹āĪ‚ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŦāĨˆāĪļāĪēāĪū āĪ—āĪēāĪĪ āĪĨāĪūāĨĪ āĪđāĪŪ āΆāĪŠāĪ•āĨ€ āĪ…āĪŠāĨ€āĪē āĪ•āĪū āΰāĪŋāĪĩāĨāĪŊāĨ‚ āĪ•āΰāĨ‡āĪ‚āĪ—āĨ‡ āĪ”āΰ āĪ…āĪŠāĪĻāĨ‡ āĪŦāĨˆāĪļāĪēāĨ‡ āĪ•āĨ‡ āĪļāĪūāĪĨ āΜāĪĩāĪūāĪŽ āĪĶāĨ‡āĪ‚āĪ—āĨ‡āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪđāĪŪāĪūāΰāĨ€ āĪļāĨ‡āĪĩāĪū āĪ•āĨ€ āĪķāΰāĨāĪĪāĨ‹āĪ‚ āĪŊāĪū āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪ—āĪūā·āĪĄāĪēāĪūā·āĪ‚āĪļ āĪ•āĪū āΉāĪēāĨāĪēāĪ‚āΘāĪĻ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪ…āĪļāĨāĪĨāĪūāĪŊāĨ€ āΰāĨ‚āĪŠ āĪļāĨ‡ āĪļāĪļāĨāĪŠāĨ‡āĪ‚āĪĄ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆāĨĪ\n\nāĪ…āĪĩāΧāĪŋ: {durationHours, plural,\n =1 {1 āΘāĪ‚āΟāĪū}\n other {# āΘāĪ‚āΟāĨ‡}\n}\nāĪļāĪļāĨāĪŠāĨ‡āĪ‚āĪĄ āΰāĪđāĨ‡āĪ—āĪū: {bannedUntil, date, full} {bannedUntil, time, short} āĪĪāĪ•\n\n{reason, select,\n null {}\n other {āĪĩāΜāĪđ: {reason}}\n}\n\nā·āĪļ āĪĶāĨŒāΰāĪūāĪĻ, āΆāĪŠ āĪ…āĪŠāĪĻāĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪāĪ•āĨāĪļāĨ‡āĪļ āĪĻāĪđāĨ€āĪ‚ āĪ•āΰ āĪŠāĪūāĪā΁āĪ—āĨ‡āĨĪ\n\nāĪ•āĨƒāĪŠāĪŊāĪū āĪĶāĨ‡āĪ–āĨ‡āĪ‚:\n- āĪļāĨ‡āĪĩāĪū āĪ•āĨ€ āĪķāΰāĨāĪĪāĨ‡āĪ‚: {termsUrl}\n- āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪ—āĪūā·āĪĄāĪēāĪūā·āĪ‚āĪļ: {guidelinesUrl}\n\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪŦāĨˆāĪļāĪēāĪū āĪ—āĪēāĪĪ āĪŊāĪū āĪ…āĪĻāĨāΚāĪŋāĪĪ āĪĨāĪū, āĪĪāĨ‹ āΆāĪŠ āĪ…āĪŠāĨ€āĪē āĪļāĪŽāĪŪāĪŋāΟ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪŠāĪĪāĨ‡ āĪļāĨ‡ {appeals_email} āĪŠāΰ āΈāĪŪāĨ‡āĪē āĪ•āΰāĨ‡āĪ‚ āĪ”āΰ āĪļāĪūāĪŦāĪž āĪĪāĨŒāΰ āĪŠāΰ āĪŽāĪĪāĪūāĪāĪ‚ āĪ•āĪŋ āΆāĪŠāĪ•āĨ‹ āĪ•āĨāĪŊāĨ‹āĪ‚ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŦāĨˆāĪļāĪēāĪū āĪ—āĪēāĪĪ āĪĨāĪūāĨĪ āĪđāĪŪ āΆāĪŠāĪ•āĨ€ āĪ…āĪŠāĨ€āĪē āĪ•āĪū āΰāĪŋāĪĩāĨāĪŊāĨ‚ āĪ•āΰāĨ‡āĪ‚āĪ—āĨ‡ āĪ”āΰ āĪ…āĪŠāĪĻāĨ‡ āĪŦāĨˆāĪļāĪēāĨ‡ āĪ•āĨ‡ āĪļāĪūāĪĨ āΜāĪĩāĪūāĪŽ āĪĶāĨ‡āĪ‚āĪ—āĨ‡āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
},
"donation_confirmation": {
"subject": "āΆāĪŠāĪ•āĨ‡ {product_name} āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪ•āĨ‡ āĪēāĪŋāĪ āΧāĪĻāĨāĪŊāĪĩāĪūāĪĶ",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡,\n\n{product_name} āĪ•āĨ‹ āΆāĪŠāĪ•āĨ‡ āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪ•āĨ‡ āĪēāĪŋāĪ āΧāĪĻāĨāĪŊāĪĩāĪūāĪĶ! āΆāĪŠāĪ•āĪū {interval, select,\n month {āΰāĪŋāĪ•āΰāĪŋāĪ‚āĪ— āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ}\n year {āΰāĪŋāĪ•āΰāĪŋāĪ‚āĪ— āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ}\n other {āĪĩāĪĻ-āΟāĪūā·āĪŪ āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ}\n} āĪļāĪŦāĪēāĪĪāĪūāĪŠāĨ‚āΰāĨāĪĩāĪ• {interval, select,\n month {āĪļāĨ‡āΟ āĪ…āĪŠ āĪđāĨ‹ āĪ—āĪŊāĪū āĪđāĨˆ}\n year {āĪļāĨ‡āΟ āĪ…āĪŠ āĪđāĨ‹ āĪ—āĪŊāĪū āĪđāĨˆ}\n other {āĪŠāĨāΰāĨ‹āĪļāĨ‡āĪļ āĪđāĨ‹ āĪ—āĪŊāĪū āĪđāĨˆ}\n}āĨĪ\n\nāĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪĄāĪŋāΟāĨ‡āĪēāĨāĪļ:\nāΰāĪūāĪķāĪŋ: {amount} {currency} {interval, select,\n month {āĪŠāĨāΰāĪĪāĪŋ āĪŪāĪūāĪđ}\n year {āĪŠāĨāΰāĪĪāĪŋ āĪĩāΰāĨāĪ·}\n other {}\n}\n\nStripe āΆāĪŠāĪ•āĨ‹ āΜāĪēāĨāĪĶ āĪđāĨ€ āΆāĪŠāĪ•āĨ‡ ā·āĪĻāĪĩāĨ‰ā·āĪļ PDF āĪ•āĨ‡ āĪļāĪūāĪĨ āĪāĪ• āĪ…āĪēāĪ— āΰāĪļāĨ€āĪĶ āΈāĪŪāĨ‡āĪē āĪ•āΰāĨ‡āĪ—āĪūāĨĪ ā·āĪļāĪŪāĨ‡āĪ‚ āĪļāĪ­āĨ€ āĪŠāĨ‡āĪŪāĨ‡āĪ‚āΟ āĪĄāĪŋāΟāĨ‡āĪēāĨāĪļ āĪķāĪūāĪŪāĪŋāĪē āĪđāĨˆāĪ‚ āĪ”āΰ ā·āĪļāĨ‡ āΟāĨˆāĪ•āĨāĪļ āĪ•āĨ‡ āĪēāĪŋāĪ ā·āĪļāĨāĪĪāĨ‡āĪŪāĪūāĪē āĪ•āĪŋāĪŊāĪū āΜāĪū āĪļāĪ•āĪĪāĪū āĪđāĨˆāĨĪ\n\nāΆāĪŠ ā·āĪļ āĪēāĪŋāĪ‚āĪ• āĪ•āĪū āΉāĪŠāĪŊāĨ‹āĪ— āĪ•āΰāĪ•āĨ‡ āĪ•āĪŋāĪļāĨ€ āĪ­āĨ€ āĪļāĪŪāĪŊ āĪ…āĪŠāĪĻāĨ‡ āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪ•āĪū ā·āĪĪāĪŋāĪđāĪūāĪļ āĪĶāĨ‡āĪ– āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚, ā·āĪĻāĪĩāĨ‰ā·āĪļ āĪĄāĪūāΉāĪĻāĪēāĨ‹āĪĄ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚, {interval, select,\n month {āĪ”āΰ āĪ…āĪŠāĪĻāĨ€ āĪļāĪŽāĨāĪļāĪ•āĨāΰāĪŋāĪŠāĨāĪķāĪĻ āĪŪāĨˆāĪĻāĨ‡āΜ āĪŊāĪū āĪ•āĨˆāĪ‚āĪļāĪē āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚}\n year {āĪ”āΰ āĪ…āĪŠāĪĻāĨ€ āĪļāĪŽāĨāĪļāĪ•āĨāΰāĪŋāĪŠāĨāĪķāĪĻ āĪŪāĨˆāĪĻāĨ‡āΜ āĪŊāĪū āĪ•āĨˆāĪ‚āĪļāĪē āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚}\n other {āĪ”āΰ āĪ­āĪĩāĪŋāĪ·āĨāĪŊ āĪ•āĨ‡ āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪŪāĨˆāĪĻāĨ‡āΜ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚}\n}āĨĪ\n\n{manageUrl}\n\nāΆāĪŠāĪ•āĪū āĪļāĪŠāĨ‹āΰāĨāΟ {product_name} āĪ•āĨ‹ āΚāĪūāĪēāĨ‚ āΰāĪ–āĪĻāĨ‡ āĪŪāĨ‡āĪ‚ āĪŪāĪĶāĪĶ āĪ•āΰāĪĪāĪū āĪđāĨˆāĨĪ āΧāĪĻāĨāĪŊāĪĩāĪūāĪĶ!\n\n– {product_name} āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡,\n\n{product_name} āĪ•āĨ‹ āΆāĪŠāĪ•āĨ‡ āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪ•āĨ‡ āĪēāĪŋāĪ āΧāĪĻāĨāĪŊāĪĩāĪūāĪĶ! āΆāĪŠāĪ•āĪū {interval, select,\n month {āΰāĪŋāĪ•āΰāĪŋāĪ‚āĪ— āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ}\n year {āΰāĪŋāĪ•āΰāĪŋāĪ‚āĪ— āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ}\n other {āĪĩāĪĻ-āΟāĪūā·āĪŪ āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ}\n} āĪļāĪŦāĪēāĪĪāĪūāĪŠāĨ‚āΰāĨāĪĩāĪ• {interval, select,\n month {āĪļāĨ‡āΟ āĪ…āĪŠ āĪđāĨ‹ āĪ—āĪŊāĪū āĪđāĨˆ}\n year {āĪļāĨ‡āΟ āĪ…āĪŠ āĪđāĨ‹ āĪ—āĪŊāĪū āĪđāĨˆ}\n other {āĪŠāĨāΰāĨ‹āĪļāĨ‡āĪļ āĪđāĨ‹ āĪ—āĪŊāĪū āĪđāĨˆ}\n}āĨĪ\n\nāĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪ•āĪū āĪĩāĪŋāĪĩāΰāĪĢ:\nāΰāĪūāĪķāĪŋ: {amount} {interval, select,\n month {āĪŠāĨāΰāĪĪāĪŋ āĪŪāĪūāĪđ}\n year {āĪŠāĨāΰāĪĪāĪŋ āĪĩāΰāĨāĪ·}\n other {}\n}\n\nStripe āΆāĪŠāĪ•āĨ‹ āΜāĪēāĨāĪĶ āĪđāĨ€ āΆāĪŠāĪ•āĨ‡ ā·āĪĻāĪĩāĨ‰ā·āĪļ PDF āĪ•āĨ‡ āĪļāĪūāĪĨ āĪāĪ• āĪ…āĪēāĪ— āΰāĪļāĨ€āĪĶ āΈāĪŪāĨ‡āĪē āĪ•āΰāĨ‡āĪ—āĪūāĨĪ ā·āĪļāĪŪāĨ‡āĪ‚ āĪŠāĨ‡āĪŪāĨ‡āĪ‚āΟ āĪ•āĨ€ āĪļāĪūāΰāĨ€ āΜāĪūāĪĻāĪ•āĪūāΰāĨ€ āĪķāĪūāĪŪāĪŋāĪē āĪđāĨˆ āĪ”āΰ ā·āĪļāĨ‡ āΟāĨˆāĪ•āĨāĪļ āĪ•āĨ‡ āĪēāĪŋāĪ ā·āĪļāĨāĪĪāĨ‡āĪŪāĪūāĪē āĪ•āĪŋāĪŊāĪū āΜāĪū āĪļāĪ•āĪĪāĪū āĪđāĨˆāĨĪ\n\nāΆāĪŠ ā·āĪļ āĪēāĪŋāĪ‚āĪ• āĪļāĨ‡ āĪ•āĪŋāĪļāĨ€ āĪ­āĨ€ āĪļāĪŪāĪŊ āĪ…āĪŠāĪĻāĨ‡ āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪ•āĪū ā·āĪĪāĪŋāĪđāĪūāĪļ āĪĶāĨ‡āĪ– āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚, ā·āĪĻāĪĩāĨ‰ā·āĪļ āĪĄāĪūāΉāĪĻāĪēāĨ‹āĪĄ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚, {interval, select,\n month {āĪ”āΰ āĪ…āĪŠāĪĻāĪū āĪļāĪŽāĨāĪļāĪ•āĨāΰāĪŋāĪŠāĨāĪķāĪĻ āĪŪāĨˆāĪĻāĨ‡āΜ āĪŊāĪū āĪ•āĨˆāĪ‚āĪļāĪē āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚}\n year {āĪ”āΰ āĪ…āĪŠāĪĻāĪū āĪļāĪŽāĨāĪļāĪ•āĨāΰāĪŋāĪŠāĨāĪķāĪĻ āĪŪāĨˆāĪĻāĨ‡āΜ āĪŊāĪū āĪ•āĨˆāĪ‚āĪļāĪē āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚}\n other {āĪ”āΰ āΆāĪ—āĨ‡ āĪ•āĨ‡ āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪŪāĨˆāĪĻāĨ‡āΜ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚}\n}āĨĪ\n\n{manageUrl}\n\nāΆāĪŠāĪ•āĪū āĪļāĪŠāĨ‹āΰāĨāΟ {product_name} āĪ•āĨ‹ āΚāĪūāĪēāĨ‚ āΰāĪ–āĪĻāĨ‡ āĪŪāĨ‡āĪ‚ āĪŪāĪĶāĪĶ āĪ•āΰāĪĪāĪū āĪđāĨˆāĨĪ āΧāĪĻāĨāĪŊāĪĩāĪūāĪĶ!\n\n– {product_name} āΟāĨ€āĪŪ"
},
"donation_magic_link": {
"subject": "āĪ…āĪŠāĪĻāĨ‡ {product_name} āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪŪāĨˆāĪĻāĨ‡āΜ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡,\n\nāĪ…āĪŠāĪĻāĨ‡ āĪĄāĨ‹āĪĻāΰ āĪŠāĨ‹āΰāĨāΟāĪē āĪāĪ•āĨāĪļāĨ‡āĪļ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪĻāĨ€āΚāĨ‡ āĪĶāĪŋāĪ āĪ—āĪ āĪēāĪŋāĪ‚āĪ• āĪŠāΰ āĪ•āĨāĪēāĪŋāĪ• āĪ•āΰāĨ‡āĪ‚:\n\n{manageUrl}\n\nāĪŠāĨ‹āΰāĨāΟāĪē āĪŪāĨ‡āĪ‚, āΆāĪŠ āĪļāĪŽāĨāĪļāĪ•āĨāΰāĪŋāĪŠāĨāĪķāĪĻ āĪŪāĨˆāĪĻāĨ‡āΜ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚, ā·āĪĻāĪĩāĨ‰ā·āĪļ āĪĄāĪūāΉāĪĻāĪēāĨ‹āĪĄ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚ āĪ”āΰ āĪ…āĪŠāĪĻāĨ‡ āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪ•āĪū ā·āĪĪāĪŋāĪđāĪūāĪļ āĪĶāĨ‡āĪ– āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\nāĪŊāĪđ āĪēāĪŋāĪ‚āĪ• {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļ āĪēāĪŋāĪ‚āĪ• āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āĪ…āĪĻāĪĶāĨ‡āĪ–āĪū āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡,\n\nāĪ…āĪŠāĪĻāĪū āĪĄāĨ‹āĪĻāΰ āĪŠāĨ‹āΰāĨāΟāĪē āĪāĪ•āĨāĪļāĨ‡āĪļ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪĻāĨ€āΚāĨ‡ āĪĶāĪŋāĪ āĪ—āĪ āĪēāĪŋāĪ‚āĪ• āĪŠāΰ āĪ•āĨāĪēāĪŋāĪ• āĪ•āΰāĨ‡āĪ‚:\n\n{manageUrl}\n\nāĪŠāĨ‹āΰāĨāΟāĪē āĪŪāĨ‡āĪ‚, āΆāĪŠ āĪļāĪŽāĨāĪļāĪ•āĨāΰāĪŋāĪŠāĨāĪķāĪĻ āĪŪāĨˆāĪĻāĨ‡āΜ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚, ā·āĪĻāĪĩāĨ‰ā·āĪļ āĪĄāĪūāΉāĪĻāĪēāĨ‹āĪĄ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚ āĪ”āΰ āĪ…āĪŠāĪĻāĨ‡ āĪĄāĨ‹āĪĻāĨ‡āĪķāĪĻ āĪ•āĪū ā·āĪĪāĪŋāĪđāĪūāĪļ āĪĶāĨ‡āĪ– āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\nāĪŊāĪđ āĪēāĪŋāĪ‚āĪ• {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļ āĪēāĪŋāĪ‚āĪ• āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āĪŽāĨ‡āĪāĪŋāĪāĪ• āĪ…āĪĻāĪĶāĨ‡āĪ–āĪū āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"dsa_report_verification": {
"subject": "DSA āΰāĪŋāĪŠāĨ‹āΰāĨāΟ āĪ•āĨ‡ āĪēāĪŋāĪ āĪ…āĪŠāĪĻāĪū āΈāĪŪāĨ‡āĪē āĪĩāĨ‡āΰāĪŋāĪŦāĪūāΈ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡,\n\n{product_name} āĪŠāΰ āĪ…āĪŠāĪĻāĨ€ āĪĄāĪŋāΜāĪŋāΟāĪē āĪļāΰāĨāĪĩāĪŋāĪļāĨ‡āΜ āĪāĪ•āĨāΟ āΰāĪŋāĪŠāĨ‹āΰāĨāΟ āĪļāĪŽāĪŪāĪŋāΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪĻāĨ€āΚāĨ‡ āĪĶāĪŋāĪ āĪ—āĪ āĪĩāĨ‡āΰāĪŋāĪŦāĪŋāĪ•āĨ‡āĪķāĪĻ āĪ•āĨ‹āĪĄ āĪ•āĪū ā·āĪļāĨāĪĪāĨ‡āĪŪāĪūāĪē āĪ•āΰāĨ‡āĪ‚:\n\n{code}\n\nāĪŊāĪđ āĪ•āĨ‹āĪĄ {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĨ€ āΰāĪŋāĪ•āĨāĪĩāĨ‡āĪļāĨāΟ āĪĻāĪđāĨ€āĪ‚ āĪ•āĨ€ āĪĨāĨ€, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āĪ…āĪĻāĪĶāĨ‡āĪ–āĪū āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
"subject": "DSA āΰāĪŋāĪŠāĨ‹āΰāĨāΟ āĪ•āĨ‡ āĪēāĪŋāĪ āĪ…āĪŠāĪĻāĪū āΈāĪŪāĨ‡āĪē āĪĩāĨ‡āΰāĪŋāĪŦāĪžāĪūāΈ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡,\n\n{product_name} āĪŠāΰ āĪ…āĪŠāĪĻāĨ€ Digital Services Act āΰāĪŋāĪŠāĨ‹āΰāĨāΟ āĪļāĪŽāĪŪāĪŋāΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪĻāĨ€āΚāĨ‡ āĪĶāĪŋāĪ āĪ—āĪ āĪĩāĨ‡āΰāĪŋāĪŦāĪžāĪŋāĪ•āĨ‡āĪķāĪĻ āĪ•āĨ‹āĪĄ āĪ•āĪū ā·āĪļāĨāĪĪāĨ‡āĪŪāĪūāĪē āĪ•āΰāĨ‡āĪ‚:\n\n{code}\n\nāĪŊāĪđ āĪ•āĨ‹āĪĄ {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āĪ…āĪĻāĪĶāĨ‡āĪ–āĪū āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
},
"email_change_new": {
"subject": "āĪ…āĪŠāĪĻāĪū āĪĻāĪŊāĪū {product_name} āΈāĪŪāĨ‡āĪē āĪĩāĨ‡āΰāĪŋāĪŦāĪūāΈ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪ…āĪŠāĪĻāĪū āĪĻāĪŊāĪū {product_name} āΈāĪŪāĨ‡āĪē āĪĩāĨ‡āΰāĪŋāĪŦāĪūāΈ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āΐāĪŠ āĪŪāĨ‡āĪ‚ āĪŊāĪđ āĪ•āĨ‹āĪĄ āĪāĪ‚āΟāΰ āĪ•āΰāĨ‡āĪ‚:\n\n{code}\n\nāĪŊāĪđ āĪ•āĨ‹āĪĄ {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĨ€ āΰāĪŋāĪ•āĨāĪĩāĨ‡āĪļāĨāΟ āĪĻāĪđāĨ€āĪ‚ āĪ•āĨ€ āĪĨāĨ€, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āĪ…āĪĻāĪĶāĨ‡āĪ–āĪū āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"subject": "āĪ…āĪŠāĪĻāĪū āĪĻāĪŊāĪū {product_name} āΈāĪŪāĨ‡āĪē āĪĩāĨ‡āΰāĪŋāĪŦāĪžāĪūāΈ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪ…āĪŠāĪĻāĪū āĪĻāĪŊāĪū {product_name} āΈāĪŪāĨ‡āĪē āĪĩāĨ‡āΰāĪŋāĪŦāĪžāĪūāΈ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āΐāĪŠ āĪŪāĨ‡āĪ‚ āĪŊāĪđ āĪ•āĨ‹āĪĄ āĪāĪ‚āΟāΰ āĪ•āΰāĨ‡āĪ‚:\n\n{code}\n\nāĪŊāĪđ āĪ•āĨ‹āĪĄ {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āĪ…āĪĻāĪĶāĨ‡āĪ–āĪū āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"email_change_original": {
"subject": "āĪ…āĪŠāĪĻāĨ‡ {product_name} āΈāĪŪāĨ‡āĪē āΚāĨ‡āĪ‚āΜ āĪ•āĨ€ āĪŠāĨāĪ·āĨāΟāĪŋ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪđāĪŪāĨ‡āĪ‚ āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŠāΰ āΈāĪŪāĨ‡āĪē āĪāĪĄāĨāΰāĨ‡āĪļ āĪŽāĪĶāĪēāĪĻāĨ‡ āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪŪāĪŋāĪēāĪū āĪđāĨˆāĨĪ\n\nā·āĪļ āĪŽāĪĶāĪēāĪūāĪĩ āĪ•āĨ€ āĪŠāĨāĪ·āĨāΟāĪŋ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ, āΐāĪŠ āĪŪāĨ‡āĪ‚ āĪŊāĪđ āĪ•āĨ‹āĪĄ āĪāĪ‚āΟāΰ āĪ•āΰāĨ‡āĪ‚:\n\n{code}\n\nāĪŊāĪđ āĪ•āĨ‹āĪĄ {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĨ€ āΰāĪŋāĪ•āĨāĪĩāĨ‡āĪļāĨāΟ āĪĻāĪđāĨ€āĪ‚ āĪ•āĨ€ āĪĨāĨ€, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪĪāĨāΰāĪ‚āĪĪ āĪ…āĪŠāĪĻāĪū āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪļāĨāΰāĪ•āĨāĪ·āĪŋāĪĪ āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"subject": "āĪ…āĪŠāĪĻāĨ‡ {product_name} āΈāĪŪāĨ‡āĪē āĪŪāĨ‡āĪ‚ āĪŽāĪĶāĪēāĪūāĪĩ āĪ•āĨ€ āĪŠāĨāĪ·āĨāΟāĪŋ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪđāĪŪāĨ‡āĪ‚ āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŠāΰ āΈāĪŪāĨ‡āĪē āĪŠāĪĪāĪū āĪŽāĪĶāĪēāĪĻāĨ‡ āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪŪāĪŋāĪēāĪū āĪđāĨˆāĨĪ\n\nā·āĪļ āĪŽāĪĶāĪēāĪūāĪĩ āĪ•āĨ€ āĪŠāĨāĪ·āĨāΟāĪŋ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ, āΐāĪŠ āĪŪāĨ‡āĪ‚ āĪŊāĪđ āĪ•āĨ‹āĪĄ āĪāĪ‚āΟāΰ āĪ•āΰāĨ‡āĪ‚:\n\n{code}\n\nāĪŊāĪđ āĪ•āĨ‹āĪĄ {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪĪāĨāΰāĪ‚āĪĪ āĪ…āĪŠāĪĻāĪū āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪļāĨāΰāĪ•āĨāĪ·āĪŋāĪĪ āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"email_change_revert": {
"subject": "āΆāĪŠāĪ•āĪū {product_name} āΈāĪŪāĨ‡āĪē āĪŽāĪĶāĪē āĪĶāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪĨāĪū",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŠāΰ āΈāĪŪāĨ‡āĪē āĪāĪĄāĨāΰāĨ‡āĪļ āĪŽāĪĶāĪēāĪ•āΰ {newEmail} āĪ•āΰ āĪĶāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ āĪŊāĪđ āĪŽāĪĶāĪēāĪūāĪĩ āĪ•āĪŋāĪŊāĪū āĪđāĨˆ, āĪĪāĨ‹ āĪ•āĪŋāĪļāĨ€ āĪ•āĪūāΰāĨāΰāĪĩāĪūāΈ āĪ•āĨ€ āΜāΰāĨ‚āΰāĪĪ āĪĻāĪđāĨ€āĪ‚ āĪđāĨˆāĨĪ āĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪđāĨˆ, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āĪēāĪŋāĪ‚āĪ• āĪ•āĪū āΉāĪŠāĪŊāĨ‹āĪ— āĪ•āΰāĪ•āĨ‡ āĪŽāĪĶāĪēāĪūāĪĩ āĪ•āĨ‹ āĪĩāĪūāĪŠāĪļ āĪēāĨ‡ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚ āĪ”āΰ āĪ…āĪŠāĪĻāĪū āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪļāĨāΰāĪ•āĨāĪ·āĪŋāĪĪ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚:\n\n{revertUrl}\n\nāĪŊāĪđ āΆāĪŠāĪ•āĨ‡ āĪŠāĪŋāĪ›āĪēāĨ‡ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āΰāĨ€āĪļāĨāΟāĨ‹āΰ āĪ•āΰāĨ‡āĪ—āĪū, āΆāĪŠāĪ•āĨ‹ āĪđāΰ āΜāĪ—āĪđ āĪļāĨ‡ āĪļāĪūā·āĪĻ āΆāΉāΟ āĪ•āΰāĨ‡āĪ—āĪū, āĪēāĪŋāĪ‚āĪ• āĪ•āĪŋāĪ āĪ—āĪ āĪŦāĨ‹āĪĻ āĪĻāĪ‚āĪŽāΰ āĪđāΟāĪūāĪāĪ—āĪū, MFA āĪ•āĨ‹ āĪĄāĪŋāĪļāĨ‡āĪŽāĪē āĪ•āΰāĨ‡āĪ—āĪū, āĪ”āΰ āΆāĪŠāĪ•āĨ‹ āĪāĪ• āĪĻāĪŊāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪļāĨ‡āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ€ āΜāΰāĨ‚āΰāĪĪ āĪđāĨ‹āĪ—āĨ€āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
"subject": "āΆāĪŠāĪ•āĪū {product_name} āΈāĪŪāĨ‡āĪē āĪŽāĪĶāĪē āĪĶāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŠāΰ āΈāĪŪāĨ‡āĪē āĪŠāĪĪāĪū āĪŽāĪĶāĪēāĪ•āΰ {newEmail} āĪ•āΰ āĪĶāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ āĪŊāĪđ āĪŽāĪĶāĪēāĪūāĪĩ āĪ•āĪŋāĪŊāĪū āĪđāĨˆ, āĪĪāĨ‹ āĪ•āĪŋāĪļāĨ€ āĪ•āĪūāΰāĨāΰāĪĩāĪūāΈ āĪ•āĨ€ āΜāĪžāΰāĨ‚āΰāĪĪ āĪĻāĪđāĨ€āĪ‚ āĪđāĨˆāĨĪ āĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪđāĨˆ, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āĪēāĪŋāĪ‚āĪ• āĪ•āĪū āΉāĪŠāĪŊāĨ‹āĪ— āĪ•āΰāĪ•āĨ‡ āĪŽāĪĶāĪēāĪūāĪĩ āĪ•āĨ‹ āĪĩāĪūāĪŠāĪļ āĪēāĨ‡ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚ āĪ”āΰ āĪ…āĪŠāĪĻāĪū āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪļāĨāΰāĪ•āĨāĪ·āĪŋāĪĪ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚:\n\n{revertUrl}\n\nāĪŊāĪđ āΆāĪŠāĪ•āĨ‡ āĪŠāĪŋāĪ›āĪēāĨ‡ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āΰāĨ€āĪļāĨāΟāĨ‹āΰ āĪ•āΰāĨ‡āĪ—āĪū, āΆāĪŠāĪ•āĨ‹ āĪđāΰ āΜāĪ—āĪđ āĪļāĨ‡ āĪļāĪūā·āĪĻ āΆāΉāΟ āĪ•āΰāĨ‡āĪ—āĪū, āĪēāĪŋāĪ‚āĪ• āĪ•āĪŋāĪ āĪ—āĪ āĪŦāĪžāĨ‹āĪĻ āĪĻāĪ‚āĪŽāΰ āĪđāΟāĪūāĪāĪ—āĪū, MFA āĪ•āĨ‹ āĪĄāĪŋāĪļāĨ‡āĪŽāĪē āĪ•āΰāĨ‡āĪ—āĪū, āĪ”āΰ āΆāĪŠāĪ•āĨ‹ āĪāĪ• āĪĻāĪŊāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪļāĨ‡āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ€ āΜāĪžāΰāĨ‚āΰāĪĪ āĪđāĨ‹āĪ—āĨ€āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
},
"email_verification": {
"subject": "āĪ…āĪŠāĪĻāĪū {product_name} āΈāĪŪāĨ‡āĪē āĪāĪĄāĨāΰāĨ‡āĪļ āĪĩāĨ‡āΰāĪŋāĪŦāĪūāΈ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪ•āĨƒāĪŠāĪŊāĪū āĪĻāĨ€āΚāĨ‡ āĪĶāĪŋāĪ āĪ—āĪ āĪēāĪŋāĪ‚āĪ• āĪŠāΰ āĪ•āĨāĪēāĪŋāĪ• āĪ•āΰāĪ•āĨ‡ āĪ…āĪŠāĪĻāĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‡ āĪēāĪŋāĪ āΈāĪŪāĨ‡āĪē āĪāĪĄāĨāΰāĨ‡āĪļ āĪĩāĨ‡āΰāĪŋāĪŦāĪūāΈ āĪ•āΰāĨ‡āĪ‚:\n\n{verifyUrl}\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪĻāĪđāĨ€āĪ‚ āĪŽāĪĻāĪūāĪŊāĪū āĪđāĨˆ, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āĪŽāĨ‡āĪāĪŋāĪāĪ• āĪ…āĪĻāĪĶāĨ‡āĪ–āĪū āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\nāĪŊāĪđ āĪēāĪŋāĪ‚āĪ• 24 āΘāĪ‚āΟāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪĩāĨˆāĪēāĪŋāĪĄ āĪđāĨˆāĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"subject": "āĪ…āĪŠāĪĻāĪū {product_name} āΈāĪŪāĨ‡āĪē āĪŠāĪĪāĪū āĪĩāĨ‡āΰāĪŋāĪŦāĪžāĪūāΈ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪ•āĨƒāĪŠāĪŊāĪū āĪĻāĨ€āΚāĨ‡ āĪĶāĪŋāĪ āĪ—āĪ āĪēāĪŋāĪ‚āĪ• āĪŠāΰ āĪ•āĨāĪēāĪŋāĪ• āĪ•āΰāĪ•āĨ‡ āĪ…āĪŠāĪĻāĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‡ āĪēāĪŋāĪ āΈāĪŪāĨ‡āĪē āĪŠāĪĪāĪū āĪĩāĨ‡āΰāĪŋāĪŦāĪžāĪūāΈ āĪ•āΰāĨ‡āĪ‚:\n\n{verifyUrl}\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪĻāĪđāĨ€āĪ‚ āĪŽāĪĻāĪūāĪŊāĪū āĪđāĨˆ, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āĪŽāĨ‡āĪāĪŋāĪāĪ• āĪ…āĪĻāĪĶāĨ‡āĪ–āĪū āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\nāĪŊāĪđ āĪēāĪŋāĪ‚āĪ• 24 āΘāĪ‚āΟāĨ‡ āĪĪāĪ• āĪŪāĪūāĪĻāĨāĪŊ āĪđāĨˆāĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"gift_chargeback_notification": {
"subject": "āΆāĪŠāĪ•āĨ‡ āΰāĪŋāĪĄāĨ€āĪŪ āĪ•āĪŋāĪ āĪ—āĪ āĪ—āĪŋāĪŦāĨāΟ āĪļāĨ‡ āĪŪāĪŋāĪēāĪĻāĨ‡ āĪĩāĪūāĪēāĨ‡ āĪŠāΰāĨāĪ• āĪđāΟāĪū āĪĶāĪŋāĪ āĪ—āĪ āĪđāĨˆāĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ‡ āĪĶāĨāĪĩāĪūāΰāĪū āΰāĪŋāĪĄāĨ€āĪŪ āĪ•āĪŋāĪ āĪ—āĪ āĪāĪ• āĪ—āĪŋāĪŦāĨāΟ āĪ•āĨ‹āĪĄ āĪ•āĪū āĪŠāĨ‡āĪŪāĨ‡āĪ‚āΟ āĪŪāĨ‚āĪē āΰāĨ‚āĪŠ āĪļāĨ‡ āĪ•āĪŋāĪļāĨ€ āĪ”āΰ āĪĻāĨ‡ āĪ•āĪŋāĪŊāĪū āĪĨāĪūāĨĪ āĪĩāĪđ āĪŠāĨ‡āĪŪāĨ‡āĪ‚āΟ āĪĪāĪŽ āĪļāĨ‡ āĪĩāĪūāĪŠāĪļ āĪēāĨ‡ āĪēāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ (āĪāĪ• āΚāĪūāΰāĨāΜāĪŽāĨˆāĪ•)āĨĪ\n\nā·āĪļ āĪĩāΜāĪđ āĪļāĨ‡, āĪđāĪŪāĪĻāĨ‡ āĪĩāĨ‡ āĪŠāΰāĨāĪ• āĪđāΟāĪū āĪĶāĪŋāĪ āĪđāĨˆāĪ‚ āΜāĨ‹ āĪ—āĪŋāĪŦāĨāΟ āΰāĪŋāĪĄāĨ€āĪŪ āĪ•āΰāĪĪāĨ‡ āĪļāĪŪāĪŊ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŪāĨ‡āĪ‚ āΜāĨ‹āĪĄāĪžāĨ‡ āĪ—āĪ āĪĨāĨ‡āĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪ—āĪēāĪĪāĨ€ āĪđāĨˆ, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪđāĪŪāĪūāΰāĨ€ āĪļāĪŠāĨ‹āΰāĨāΟ āΟāĨ€āĪŪ āĪļāĨ‡ āĪļāĪ‚āĪŠāΰāĨāĪ• āĪ•āΰāĨ‡āĪ‚ āĪ”āΰ āĪ—āĪŋāĪŦāĨāΟ āĪ•āĨ‹āĪĄ āĪ”āΰ āΉāĪļāĨ‡ āΰāĪŋāĪĄāĨ€āĪŪ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ€ āĪĪāĪūāΰāĨ€āĪ– āĪ•āĨ‡ āĪŽāĪūāΰāĨ‡ āĪŪāĨ‡āĪ‚ āΜāĪūāĪĻāĪ•āĪūāΰāĨ€ āĪķāĨ‡āĪŊāΰ āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪĻāĨ‡ āΜāĨ‹ āĪ—āĪŋāĪŦāĨāΟ āĪ•āĨ‹āĪĄ āΰāĪŋāĪĄāĨ€āĪŪ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āΉāĪļāĪ•āĪū āĪŠāĨ‡āĪŪāĨ‡āĪ‚āΟ āĪŪāĨ‚āĪē āΰāĨ‚āĪŠ āĪļāĨ‡ āĪ•āĪŋāĪļāĨ€ āĪ”āΰ āĪĻāĨ‡ āĪ•āĪŋāĪŊāĪū āĪĨāĪūāĨĪ āΉāĪļ āĪŠāĨ‡āĪŪāĨ‡āĪ‚āΟ āĪ•āĨ‹ āĪŽāĪūāĪĶ āĪŪāĨ‡āĪ‚ āĪĩāĪūāĪŠāĪļ āĪēāĨ‡ āĪēāĪŋāĪŊāĪū āĪ—āĪŊāĪū (āΚāĪūāΰāĨāΜāĪŽāĨˆāĪ•)āĨĪ\n\nā·āĪļ āĪĩāΜāĪđ āĪļāĨ‡, āĪđāĪŪāĪĻāĨ‡ āĪĩāĨ‡ āĪŠāΰāĨāĪ• āĪđāΟāĪū āĪĶāĪŋāĪ āĪđāĨˆāĪ‚ āΜāĨ‹ āĪ—āĪŋāĪŦāĨāΟ āΰāĪŋāĪĄāĨ€āĪŪ āĪ•āΰāĪĪāĨ‡ āĪļāĪŪāĪŊ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŪāĨ‡āĪ‚ āΜāĨ‹āĪĄāĪžāĨ‡ āĪ—āĪ āĪĨāĨ‡āĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪ—āĪēāĪĪāĨ€ āĪđāĨˆ, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪđāĪŪāĪūāΰāĨ€ āĪļāĪŠāĨ‹āΰāĨāΟ āΟāĨ€āĪŪ āĪļāĨ‡ āĪļāĪ‚āĪŠāΰāĨāĪ• āĪ•āΰāĨ‡āĪ‚ āĪ”āΰ āĪ—āĪŋāĪŦāĨāΟ āĪ•āĨ‹āĪĄ āĪ”āΰ āΉāĪļāĨ‡ āΰāĪŋāĪĄāĨ€āĪŪ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪļāĪŪāĪŊ āĪ•āĨ‡ āĪŽāĪūāΰāĨ‡ āĪŪāĨ‡āĪ‚ āΆāĪŠāĪ•āĨ‡ āĪŠāĪūāĪļ āΜāĨ‹ āĪ­āĨ€ āΜāĪūāĪĻāĪ•āĪūāΰāĨ€ āĪđāĨˆ, āĪĩāĪđ āĪķāĨ‡āĪŊāΰ āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"harvest_completed": {
"subject": "āΆāĪŠāĪ•āĪū {product_name} āĪĄāĨ‡āΟāĪū āĪāĪ•āĨāĪļāĪŠāĨ‹āΰāĨāΟ āĪĄāĪūāΉāĪĻāĪēāĨ‹āĪĄ āĪ•āĨ‡ āĪēāĪŋāĪ āĪĪāĨˆāĪŊāĪūāΰ āĪđāĨˆ",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĪū āĪĄāĨ‡āΟāĪū āĪāĪ•āĨāĪļāĪŠāĨ‹āΰāĨāΟ āĪĪāĨˆāĪŊāĪūāΰ āĪđāĨˆāĨĪ\n\nāĪĄāĪūāΉāĪĻāĪēāĨ‹āĪĄ āĪēāĪŋāĪ‚āĪ•:\n{downloadUrl}\n\nāĪķāĪūāĪŪāĪŋāĪē āĪŪāĨˆāĪļāĨ‡āΜ: {totalMessages, number}\nāĪŦāĪūā·āĪē āĪļāĪūā·āΜāĪž: {fileSizeMB, number} MB\n\nāĪŊāĪđ āĪēāĪŋāĪ‚āĪ• {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļ āĪāĪ•āĨāĪļāĪŠāĨ‹āΰāĨāΟ āĪ•āĨ€ āΰāĪŋāĪ•āĨāĪĩāĨ‡āĪļāĨāΟ āĪĻāĪđāĨ€āĪ‚ āĪ•āĨ€ āĪĨāĨ€, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪĪāĨāΰāĪ‚āĪĪ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĨ‡āĪ‚ āĪ”āΰ āĪđāĪŪāĪūāΰāĨ€ āĪļāĪŠāĨ‹āΰāĨāΟ āΟāĨ€āĪŪ āĪļāĨ‡ āĪļāĪ‚āĪŠāΰāĨāĪ• āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĪū āĪĄāĨ‡āΟāĪū āĪāĪ•āĨāĪļāĪŠāĨ‹āΰāĨāΟ āĪĪāĨˆāĪŊāĪūāΰ āĪđāĨˆāĨĪ\n\nāĪĄāĪūāΉāĪĻāĪēāĨ‹āĪĄ āĪēāĪŋāĪ‚āĪ•:\n{downloadUrl}\n\nāĪķāĪūāĪŪāĪŋāĪē āĪŪāĨˆāĪļāĨ‡āΜ: {totalMessages, number}\nāĪŦāĪžāĪūā·āĪē āĪļāĪūā·āΜāĪž: {fileSizeMB, number} MB\n\nāĪŊāĪđ āĪēāĪŋāĪ‚āĪ• {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļ āĪāĪ•āĨāĪļāĪŠāĨ‹āΰāĨāΟ āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪĪāĨāΰāĪ‚āĪĪ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĨ‡āĪ‚ āĪ”āΰ āĪđāĪŪāĪūāΰāĨ€ āĪļāĪŠāĨ‹āΰāĨāΟ āΟāĨ€āĪŪ āĪļāĨ‡ āĪļāĪ‚āĪŠāΰāĨāĪ• āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"inactivity_warning": {
"subject": "āΆāĪŠāĪ•āĪū {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ ā·āĪĻāĪāĪ•āĨāΟāĪŋāĪĩāĪŋāΟāĨ€ āĪ•āĨ‡ āĪ•āĪūāΰāĪĢ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āΜāĪūāĪāĪ—āĪū",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŠāΰ {lastActiveDate, date, full} āĪ•āĨ‡ āĪŽāĪūāĪĶ āĪļāĨ‡ āĪ•āĨ‹āΈ āĪāĪ•āĨāΟāĪŋāĪĩāĪŋāΟāĨ€ āĪĻāĪđāĨ€āĪ‚ āĪđāĨāΈ āĪđāĨˆāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠ {deletionDate, date, full} āĪ•āĨ‹ {deletionDate, time, short} āĪĪāĪ• āĪēāĨ‰āĪ—āĪŋāĪĻ āĪĻāĪđāĨ€āĪ‚ āĪ•āΰāĪĪāĨ‡ āĪđāĨˆāĪ‚, āĪĪāĨ‹ āΆāĪŠāĪ•āĪū āĪ…āĪ•āĪūāΉāĪ‚āΟ ā·āĪĻāĪāĪ•āĨāΟāĪŋāĪĩāĪŋāΟāĨ€ āĪ•āĨ‡ āĪ•āĪūāΰāĪĢ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪŊāĪđāĪūāĪ‚ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āΰāĨ‡āĪ‚:\n{loginUrl}\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ āĪđāĪūāĪē āĪđāĨ€ āĪŪāĨ‡āĪ‚ {product_name} āĪ•āĪū ā·āĪļāĨāĪĪāĨ‡āĪŪāĪūāĪē āĪ•āĪŋāĪŊāĪū āĪđāĨˆ, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪĪāĨāΰāĪ‚āĪĪ āĪđāĪŪāĪūāΰāĨ€ āĪļāĪŠāĨ‹āΰāĨāΟ āΟāĨ€āĪŪ āĪļāĨ‡ āĪļāĪ‚āĪŠāΰāĨāĪ• āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŠāΰ {lastActiveDate, date, full} āĪ•āĨ‡ āĪŽāĪūāĪĶ āĪļāĨ‡ āĪ•āĨ‹āΈ āĪāĪ•āĨāΟāĪŋāĪĩāĪŋāΟāĨ€ āĪĻāĪđāĨ€āĪ‚ āĪđāĨāΈ āĪđāĨˆāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠ {deletionDate, date, full} āĪ•āĨ‹ {deletionDate, time, short} āĪĪāĪ• āĪēāĨ‰āĪ—āĪŋāĪĻ āĪĻāĪđāĨ€āĪ‚ āĪ•āΰāĪĪāĨ‡ āĪđāĨˆāĪ‚, āĪĪāĨ‹ āΆāĪŠāĪ•āĪū āĪ…āĪ•āĪūāΉāĪ‚āΟ ā·āĪĻāĪāĪ•āĨāΟāĪŋāĪĩāĪŋāΟāĨ€ āĪ•āĨ‡ āĪ•āĪūāΰāĪĢ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪŊāĪđāĪūā΁ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āΰāĨ‡āĪ‚:\n{loginUrl}\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ āĪđāĪūāĪē āĪđāĨ€ āĪŪāĨ‡āĪ‚ {product_name} āĪ•āĪū ā·āĪļāĨāĪĪāĨ‡āĪŪāĪūāĪē āĪ•āĪŋāĪŊāĪū āĪđāĨˆ, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪĪāĨāΰāĪ‚āĪĪ āĪđāĪŪāĪūāΰāĨ€ āĪļāĪŠāĨ‹āΰāĨāΟ āΟāĨ€āĪŪ āĪļāĨ‡ āĪļāĪ‚āĪŠāΰāĨāĪ• āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"ip_authorization": {
"subject": "āĪāĪ• āĪĻāĪ IP āĪāĪĄāĨāΰāĨ‡āĪļ āĪļāĨ‡ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āĨ‹ āĪ‘āĪĨāΰāĪūā·āΜāĪž āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪđāĪŪāĨ‡āĪ‚ āĪāĪ• āĪĻāĪ IP āĪāĪĄāĨāΰāĨ‡āĪļ āĪļāĨ‡ āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŪāĨ‡āĪ‚ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āΰāĪĻāĨ‡ āĪ•āĪū āĪŠāĨāΰāĪŊāĪūāĪļ āĪ•āĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ:\n\nIP āĪāĪĄāĨāΰāĨ‡āĪļ: {ipAddress}\nāĪēāĨ‹āĪ•āĨ‡āĪķāĪĻ: {location}\n\nāĪ…āĪ—āΰ āĪŊāĪđ āΆāĪŠāĪĻāĨ‡ āĪđāĨ€ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪĻāĨ€āΚāĨ‡ āĪĶāĪŋāĪ āĪ—āĪ āĪēāĪŋāĪ‚āĪ• āĪŠāΰ āĪ•āĨāĪēāĪŋāĪ• āĪ•āΰāĪ•āĨ‡ ā·āĪļ IP āĪāĪĄāĨāΰāĨ‡āĪļ āĪ•āĨ‹ āĪ‘āĪĨāΰāĪūā·āΜāĪž āĪ•āΰāĨ‡āĪ‚:\n\n{authUrl}\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āΰāĪĻāĨ‡ āĪ•āĪū āĪŠāĨāΰāĪŊāĪūāĪļ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪĪāĨāΰāĪ‚āĪĪ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĨ‡āĪ‚āĨĪ\n\nāĪŊāĪđ āĪēāĪŋāĪ‚āĪ• 30 āĪŪāĪŋāĪĻāΟ āĪ•āĨ‡ āĪēāĪŋāĪ āĪĩāĨˆāĪēāĪŋāĪĄ āĪđāĨˆāĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"subject": "āĪĻāĪ IP āĪāĪĄāĨāΰāĨ‡āĪļ āĪļāĨ‡ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āĨ‹ āĪ‘āĪĨāΰāĪūā·āΜāĪž āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪđāĪŪāĪĻāĨ‡ āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŪāĨ‡āĪ‚ āĪāĪ• āĪĻāĪ IP āĪāĪĄāĨāΰāĨ‡āĪļ āĪļāĨ‡ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āĪū āĪŠāĨāΰāĪŊāĪūāĪļ āĪĶāĨ‡āĪ–āĪū āĪđāĨˆ:\n\nIP āĪāĪĄāĨāΰāĨ‡āĪļ: {ipAddress}\nāĪēāĨ‹āĪ•āĨ‡āĪķāĪĻ: {location}\n\nāĪ…āĪ—āΰ āĪŊāĪđ āΆāĪŠāĪĻāĨ‡ āĪđāĨ€ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪĻāĨ€āΚāĨ‡ āĪĶāĪŋāĪ āĪ—āĪ āĪēāĪŋāĪ‚āĪ• āĪŠāΰ āĪ•āĨāĪēāĪŋāĪ• āĪ•āΰāĪ•āĨ‡ ā·āĪļ IP āĪāĪĄāĨāΰāĨ‡āĪļ āĪ•āĨ‹ āĪ‘āĪĨāΰāĪūā·āΜāĪž āĪ•āΰāĨ‡āĪ‚:\n\n{authUrl}\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āΰāĪĻāĨ‡ āĪ•āĪū āĪŠāĨāΰāĪŊāĪūāĪļ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū āĪĪāĨāΰāĪ‚āĪĪ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĨ‡āĪ‚āĨĪ\n\nāĪŊāĪđ āĪēāĪŋāĪ‚āĪ• 30 āĪŪāĪŋāĪĻāΟ āĪĪāĪ• āĪŪāĪūāĪĻāĨāĪŊ āĪđāĨˆāĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"mfa_backup_codes_view": {
"subject": "āĪ…āĪŠāĪĻāĨ‡ {product_name} āĪŽāĨˆāĪ•āĪ…āĪŠ āĪ•āĨ‹āĪĄ āĪ•āĨ‡ āĪāĪ•āĨāĪļāĨ‡āĪļ āĪ•āĨ€ āĪŠāĨāĪ·āĨāΟāĪŋ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪđāĪŪāĨ‡āĪ‚ āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‡ āĪŽāĨˆāĪ•āĪ…āĪŠ āĪ•āĨ‹āĪĄ āĪĶāĨ‡āĪ–āĪĻāĨ‡ āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪŪāĪŋāĪēāĪū āĪđāĨˆāĨĪ\n\nā·āĪļ āĪ…āĪĻāĨāΰāĨ‹āΧ āĪ•āĨ€ āĪŠāĨāĪ·āĨāΟāĪŋ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ, āΐāĪŠ āĪŪāĨ‡āĪ‚ āĪŊāĪđ āĪ•āĨ‹āĪĄ āĪāĪ‚āΟāΰ āĪ•āΰāĨ‡āĪ‚:\n\n{code}\n\nāĪŊāĪđ āĪ•āĨ‹āĪĄ {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĨ€ āΰāĪŋāĪ•āĨāĪĩāĨ‡āĪļāĨāΟ āĪĻāĪđāĨ€āĪ‚ āĪ•āĨ€ āĪĨāĨ€, āĪĪāĨ‹ āĪđāĨ‹ āĪļāĪ•āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪ•āĪŋāĪļāĨ€ āĪ”āΰ āĪ•āĨ‡ āĪŠāĪūāĪļ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪāĪ•āĨāĪļāĨ‡āĪļ āĪđāĨ‹āĨĪ āĪĪāĨāΰāĪ‚āĪĪ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪđāĪŪāĨ‡āĪ‚ āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‡ āĪŽāĨˆāĪ•āĪ…āĪŠ āĪ•āĨ‹āĪĄ āĪĶāĨ‡āĪ–āĪĻāĨ‡ āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪŪāĪŋāĪēāĪū āĪđāĨˆāĨĪ\n\nā·āĪļ āĪ…āĪĻāĨāΰāĨ‹āΧ āĪ•āĨ€ āĪŠāĨāĪ·āĨāΟāĪŋ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ, āΐāĪŠ āĪŪāĨ‡āĪ‚ āĪŊāĪđ āĪ•āĨ‹āĪĄ āĪāĪ‚āΟāΰ āĪ•āΰāĨ‡āĪ‚:\n\n{code}\n\nāĪŊāĪđ āĪ•āĨ‹āĪĄ {expiresAt, date, full} āĪ•āĨ‹ {expiresAt, time, short} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āĪđāĨ‹ āĪļāĪ•āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪ•āĪŋāĪļāĨ€ āĪ”āΰ āĪ•āĨ‡ āĪŠāĪūāĪļ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪāĪ•āĨāĪļāĨ‡āĪļ āĪđāĨ‹āĨĪ āĪĪāĨāΰāĪ‚āĪĪ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"password_change_verification": {
"subject": "āĪ…āĪŠāĪĻāĨ‡ {product_name} āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āΚāĨ‡āĪ‚āΜ āĪ•āĨ€ āĪŠāĨāĪ·āĨāΟāĪŋ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪđāĪŪāĨ‡āĪ‚ āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŠāΰ āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĪĻāĨ‡ āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪŪāĪŋāĪēāĪū āĪđāĨˆāĨĪ\n\nā·āĪļ āĪŽāĪĶāĪēāĪūāĪĩ āĪ•āĨ€ āĪŠāĨāĪ·āĨāΟāĪŋ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ, āΐāĪŠ āĪŪāĨ‡āĪ‚ āĪŊāĪđ āĪ•āĨ‹āĪĄ āĪāĪ‚āΟāΰ āĪ•āΰāĨ‡āĪ‚:\n\n{code}\n\nāĪŊāĪđ āĪ•āĨ‹āĪĄ {expiresAt} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĨ€ āΰāĪŋāĪ•āĨāĪĩāĨ‡āĪļāĨāΟ āĪĻāĪđāĨ€āĪ‚ āĪ•āĨ€ āĪĨāĨ€, āĪĪāĨ‹ āĪđāĨ‹ āĪļāĪ•āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪ•āĪŋāĪļāĨ€ āĪ”āΰ āĪ•āĨ‡ āĪŠāĪūāĪļ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪāĪ•āĨāĪļāĨ‡āĪļ āĪđāĨ‹āĨĪ āĪĪāĨāΰāĪ‚āĪĪ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĨ‡āĪ‚ āĪ”āΰ āΟāĨ‚-āĪŦāĨˆāĪ•āĨāΟāΰ āĪ‘āĪĨāĨ‡āĪ‚āΟāĪŋāĪ•āĨ‡āĪķāĪĻ ā·āĪĻāĨ‡āĪŽāĪē āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"subject": "āĪ…āĪŠāĪĻāĨ‡ {product_name} āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŪāĨ‡āĪ‚ āĪŽāĪĶāĪēāĪūāĪĩ āĪ•āĨ€ āĪŠāĨāĪ·āĨāΟāĪŋ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪđāĪŪāĨ‡āĪ‚ āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŠāΰ āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĪĻāĨ‡ āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪŪāĪŋāĪēāĪū āĪđāĨˆāĨĪ\n\nā·āĪļ āĪŽāĪĶāĪēāĪūāĪĩ āĪ•āĨ€ āĪŠāĨāĪ·āĨāΟāĪŋ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ, āΐāĪŠ āĪŪāĨ‡āĪ‚ āĪŊāĪđ āĪ•āĨ‹āĪĄ āĪāĪ‚āΟāΰ āĪ•āΰāĨ‡āĪ‚:\n\n{code}\n\nāĪŊāĪđ āĪ•āĨ‹āĪĄ {expiresAt} āĪŠāΰ āĪāĪ•āĨāĪļāĪŠāĪūāĪŊāΰ āĪđāĨ‹ āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āĪđāĨ‹ āĪļāĪ•āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪ•āĪŋāĪļāĨ€ āĪ”āΰ āĪ•āĨ‡ āĪŠāĪūāĪļ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪāĪ•āĨāĪļāĨ‡āĪļ āĪđāĨ‹āĨĪ āĪĪāĨāΰāĪ‚āĪĪ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĨ‡āĪ‚ āĪ”āΰ āΟāĨ‚-āĪŦāĪžāĨˆāĪ•āĨāΟāΰ āĪ‘āĪĨāĨ‡āĪ‚āΟāĪŋāĪ•āĨ‡āĪķāĪĻ ā·āĪĻāĨ‡āĪŽāĪē āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"password_reset": {
"subject": "āĪ…āĪŠāĪĻāĪū {product_name} āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āΰāĨ€āĪļāĨ‡āΟ āĪ•āΰāĨ‡āĪ‚",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪĻāĨ‡ {product_name} āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āΰāĨ€āĪļāĨ‡āΟ āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪ•āĪŋāĪŊāĪū āĪđāĨˆāĨĪ āĪĻāĪŊāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪļāĨ‡āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪĻāĨ€āΚāĨ‡ āĪĶāĪŋāĪ āĪ—āĪ āĪēāĪŋāĪ‚āĪ• āĪ•āĪū āΉāĪŠāĪŊāĨ‹āĪ— āĪ•āΰāĨ‡āĪ‚:\n\n{resetUrl}\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĨ€ āΰāĪŋāĪ•āĨāĪĩāĨ‡āĪļāĨāΟ āĪĻāĪđāĨ€āĪ‚ āĪ•āĨ€ āĪĨāĨ€, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āĪŽāĨ‡āĪāĪŋāĪāĪ• āĪ…āĪĻāĪĶāĨ‡āĪ–āĪū āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\nāĪŊāĪđ āĪēāĪŋāĪ‚āĪ• 1 āΘāĪ‚āΟāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪĩāĨˆāĪēāĪŋāĪĄ āĪđāĨˆāĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪĻāĨ‡ {product_name} āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āΰāĨ€āĪļāĨ‡āΟ āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪ•āĪŋāĪŊāĪū āĪđāĨˆāĨĪ āĪĻāĪŊāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪļāĨ‡āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪĻāĨ€āΚāĨ‡ āĪĶāĪŋāĪ āĪ—āĪ āĪēāĪŋāĪ‚āĪ• āĪ•āĪū āΉāĪŠāĪŊāĨ‹āĪ— āĪ•āΰāĨ‡āĪ‚:\n\n{resetUrl}\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āΆāĪŠ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪ•āĨ‹ āĪŽāĨ‡āĪāĪŋāĪāĪ• āĪ…āĪĻāĪĶāĨ‡āĪ–āĪū āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\nāĪŊāĪđ āĪēāĪŋāĪ‚āĪ• 1 āΘāĪ‚āΟāĨ‡ āĪĪāĪ• āĪŪāĪūāĪĻāĨāĪŊ āĪđāĨˆāĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"registration_approved": {
"subject": "āΆāĪŠāĪ•āĪū {product_name} āΰāΜāĪŋāĪļāĨāΟāĨāΰāĨ‡āĪķāĪĻ āĪ…āĪŠāĨāΰāĨ‚āĪĩ āĪđāĨ‹ āĪ—āĪŊāĪū āĪđāĨˆ",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪ…āΚāĨāĪ›āĨ€ āĪ–āĪŽāΰ: āΆāĪŠāĪ•āĪū {product_name} āΰāΜāĪŋāĪļāĨāΟāĨāΰāĨ‡āĪķāĪĻ āĪ…āĪŠāĨāΰāĨ‚āĪĩ āĪđāĨ‹ āĪ—āĪŊāĪū āĪđāĨˆāĨĪ\n\nāĪ…āĪŽ āΆāĪŠ {product_name} āΐāĪŠ āĪŪāĨ‡āĪ‚ āĪŊāĪđāĪūāĪ‚ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚:\n{channelsUrl}\n\n{product_name} āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪŪāĨ‡āĪ‚ āΆāĪŠāĪ•āĪū āĪļāĨāĪĩāĪūāĪ—āĪĪ āĪđāĨˆāĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāĪ…āΚāĨāĪ›āĨ€ āĪ–āĪŽāΰ: āΆāĪŠāĪ•āĪū {product_name} āΰāΜāĪŋāĪļāĨāΟāĨāΰāĨ‡āĪķāĪĻ āĪ…āĪŠāĨāΰāĨ‚āĪĩ āĪđāĨ‹ āĪ—āĪŊāĪū āĪđāĨˆāĨĪ\n\nāĪ…āĪŽ āΆāĪŠ {product_name} āΐāĪŠ āĪŪāĨ‡āĪ‚ āĪŊāĪđāĪūā΁ āĪēāĨ‰āĪ—āĪŋāĪĻ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚:\n{channelsUrl}\n\n{product_name} āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪŪāĨ‡āĪ‚ āΆāĪŠāĪ•āĪū āĪļāĨāĪĩāĪūāĪ—āĪĪ āĪđāĨˆāĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"report_resolved": {
"subject": "āΆāĪŠāĪ•āĨ€ {product_name} āΰāĪŋāĪŠāĨ‹āΰāĨāΟ āĪ•āĪū āΰāĪŋāĪĩāĨāĪŊāĨ‚ āĪ•āΰ āĪēāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ€ āΰāĪŋāĪŠāĨ‹āΰāĨāΟ (ID: {reportId}) āĪ•āĪū āĪđāĪŪāĪūāΰāĨ€ āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ āĪĻāĨ‡ āΰāĪŋāĪĩāĨāĪŊāĨ‚ āĪ•āΰ āĪēāĪŋāĪŊāĪū āĪđāĨˆāĨĪ{hasComment, select, yes {\n\nāĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ āĪ•āĪū āΜāĪĩāĪūāĪŽ:\n{publicComment}} other {}}\n\n{product_name} āĪ•āĨ‹ āĪļāĪ­āĨ€ āĪ•āĨ‡ āĪēāĪŋāĪ āĪļāĨāΰāĪ•āĨāĪ·āĪŋāĪĪ āΰāĪ–āĪĻāĨ‡ āĪŪāĨ‡āĪ‚ āĪŪāĪĶāĪĶ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āΧāĪĻāĨāĪŊāĪĩāĪūāĪĶāĨĪ āĪđāĪŪ āĪļāĪ­āĨ€ āΰāĪŋāĪŠāĨ‹āΰāĨāΟāĨ‹āĪ‚ āĪ•āĨ‹ āĪ—āĪ‚āĪ­āĨ€āΰāĪĪāĪū āĪļāĨ‡ āĪēāĨ‡āĪĪāĨ‡ āĪđāĨˆāĪ‚ āĪ”āΰ āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪŪāĨ‡āĪ‚ āΆāĪŠāĪ•āĨ‡ āĪŊāĨ‹āĪ—āĪĶāĪūāĪĻ āĪ•āĨ‡ āĪēāĪŋāĪ āΆāĪ­āĪūāΰ āĪĩāĨāĪŊāĪ•āĨāĪĪ āĪ•āΰāĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ ā·āĪļ āĪŠāΰāĪŋāĪĢāĪūāĪŪ āĪ•āĨ‡ āĪŽāĪūāΰāĨ‡ āĪŪāĨ‡āĪ‚ āĪ•āĨ‹āΈ āĪŠāĨāΰāĪķāĨāĪĻ āĪŊāĪū āΚāĪŋāĪ‚āĪĪāĪū āĪđāĨˆ, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū {safety_email} āĪŠāΰ āĪļāĪ‚āĪŠāΰāĨāĪ• āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ€ āΰāĪŋāĪŠāĨ‹āΰāĨāΟ (ID: {reportId}) āĪ•āĪū āĪđāĪŪāĪūāΰāĨ€ āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ āĪĻāĨ‡ āΰāĪŋāĪĩāĨāĪŊāĨ‚ āĪ•āΰ āĪēāĪŋāĪŊāĪū āĪđāĨˆāĨĪ{hasComment, select, yes {\n\nāĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ āĪ•āĪū āΜāĪĩāĪūāĪŽ:\n{publicComment}} other {}}\n\n{product_name} āĪ•āĨ‹ āĪļāĪ­āĨ€ āĪ•āĨ‡ āĪēāĪŋāĪ āĪļāĨāΰāĪ•āĨāĪ·āĪŋāĪĪ āΰāĪ–āĪĻāĨ‡ āĪŪāĨ‡āĪ‚ āĪŪāĪĶāĪĶ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āΧāĪĻāĨāĪŊāĪĩāĪūāĪĶāĨĪ āĪđāĪŪ āĪđāΰ āΰāĪŋāĪŠāĨ‹āΰāĨāΟ āĪ•āĨ‹ āĪ—āĪ‚āĪ­āĨ€āΰāĪĪāĪū āĪļāĨ‡ āĪēāĨ‡āĪĪāĨ‡ āĪđāĨˆāĪ‚ āĪ”āΰ āĪ•āĪŪāĨāĪŊāĨāĪĻāĪŋāΟāĨ€ āĪŪāĨ‡āĪ‚ āΆāĪŠāĪ•āĨ‡ āĪŊāĨ‹āĪ—āĪĶāĪūāĪĻ āĪ•āĨ€ āĪļāΰāĪūāĪđāĪĻāĪū āĪ•āΰāĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ ā·āĪļ āĪĻāĪĪāĨ€āΜāĨ‡ āĪ•āĨ‡ āĪŽāĪūāΰāĨ‡ āĪŪāĨ‡āĪ‚ āĪ•āĨ‹āΈ āĪļāĪĩāĪūāĪē āĪŊāĪū āΚāĪŋāĪ‚āĪĪāĪū āĪđāĨˆ, āĪĪāĨ‹ āĪ•āĨƒāĪŠāĪŊāĪū {safety_email} āĪŠāΰ āĪļāĪ‚āĪŠāΰāĨāĪ• āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
},
"scheduled_deletion_notification": {
"subject": "āΆāĪŠāĪ•āĪū {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āΜāĪūāĪāĪ—āĪū",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪķāĨ‡āĪĄāĨāĪŊāĨ‚āĪē āĪ•āĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆāĨĪ\n\nāĪĄāĪŋāĪēāĨ€āĪķāĪĻ āĪķāĨ‡āĪĄāĨāĪŊāĨ‚āĪē: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {āĪĩāΜāĪđ: {reason}}\n}\n\nāĪŊāĪđ āĪāĪ• āĪ—āĪ‚āĪ­āĨ€āΰ āĪ•āĪĶāĪŪ āĪđāĨˆāĨĪ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪĄāĨ‡āΟāĪū āĪĻāĪŋāΰāĨāΧāĪūāΰāĪŋāĪĪ āĪĪāĪūāΰāĨ€āĪ– āĪŠāΰ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪĻāĪŋāΰāĨāĪĢāĪŊ āĪ—āĪēāĪĪ āĪĨāĪū, āĪĪāĨ‹ āΆāĪŠ āĪ…āĪŠāĨ€āĪē āĪļāĪŽāĪŪāĪŋāΟ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪāĪĄāĨāΰāĨ‡āĪļ āĪļāĨ‡ {appeals_email} āĪŠāΰ āΈāĪŪāĨ‡āĪē āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪķāĨ‡āĪĄāĨāĪŊāĨ‚āĪē āĪ•āĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆāĨĪ\n\nāĪĄāĪŋāĪēāĨ€āĪķāĪĻ āĪ•āĨ€ āĪĻāĪŋāΰāĨāΧāĪūāΰāĪŋāĪĪ āĪĪāĪūāΰāĨ€āĪ–: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {āĪĩāΜāĪđ: {reason}}\n}\n\nāĪŊāĪđ āĪāĪ• āĪ—āĪ‚āĪ­āĨ€āΰ āĪ•āĪūāΰāĨāΰāĪĩāĪūāΈ āĪđāĨˆāĨĪ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪĄāĨ‡āΟāĪū āĪĻāĪŋāΰāĨāΧāĪūāΰāĪŋāĪĪ āĪĪāĪūāΰāĨ€āĪ– āĪŠāΰ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰ āĪĶāĪŋāĪŊāĪū āΜāĪūāĪāĪ—āĪūāĨĪ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪ•āĨ‹ āĪēāĪ—āĪĪāĪū āĪđāĨˆ āĪ•āĪŋ āĪŊāĪđ āĪŦāĨˆāĪļāĪēāĪū āĪ—āĪēāĪĪ āĪĨāĪū, āĪĪāĨ‹ āΆāĪŠ āĪ…āĪŠāĨ€āĪē āĪļāĪŽāĪŪāĪŋāΟ āĪ•āΰ āĪļāĪ•āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ ā·āĪļ āΈāĪŪāĨ‡āĪē āĪŠāĪĪāĨ‡ āĪļāĨ‡ {appeals_email} āĪŠāΰ āΈāĪŪāĨ‡āĪē āĪ•āΰāĨ‡āĪ‚āĨĪ\n\n– {product_name} āĪļāĨ‡āĪŦāĨāΟāĨ€ āΟāĨ€āĪŪ"
},
"self_deletion_scheduled": {
"subject": "āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪĄāĪŋāĪēāĨ€āĪķāĪĻ āĪ•āĨ‹ āĪķāĨ‡āĪĄāĨāĪŊāĨ‚āĪē āĪ•āĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪĻāĨ‡ āĪ…āĪŠāĪĻāĪū {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪ•āĪŋāĪŊāĪū āĪđāĨˆāĨĪ āΆāĪŠāĪ•āĪū āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ ā·āĪļ āĪĪāĪūāΰāĨ€āĪ– āĪ•āĨ‹ āĪķāĨ‡āĪĄāĨāĪŊāĨ‚āĪē āĪ•āĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ:\n\n{deletionDate, date, full} āĪ•āĨ‹ {deletionDate, time, short} āĪŠāΰ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĨ€ āΰāĪŋāĪ•āĨāĪĩāĨ‡āĪļāĨāΟ āĪĻāĪđāĨ€āĪ‚ āĪ•āĨ€ āĪĨāĨ€, āĪĪāĨ‹ āĪĄāĪŋāĪēāĨ€āĪķāĪĻ āΰāĪĶāĨāĪĶ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪ…āĪŠāĪĻāĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŪāĨ‡āĪ‚ āĪļāĪūā·āĪĻ ā·āĪĻ āĪ•āΰāĨ‡āĪ‚āĨĪ āĪđāĪŪ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪļāĨāΰāĪ•āĨāĪ·āĪŋāĪĪ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĪĻāĨ‡ āĪ•āĨ€ āĪ­āĨ€ āĪļāĪēāĪūāĪđ āĪĶāĨ‡āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
"subject": "āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪĄāĪŋāĪēāĨ€āĪķāĪĻ āĪķāĨ‡āĪĄāĨāĪŊāĨ‚āĪē āĪ•āΰ āĪĶāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ",
"body": "āĪĻāĪŪāĪļāĨāĪĪāĨ‡ {username},\n\nāΆāĪŠāĪĻāĨ‡ āĪ…āĪŠāĪĻāĪū {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪ•āĪŋāĪŊāĪū āĪđāĨˆāĨĪ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪđāĪŪāĨ‡āĪķāĪū āĪ•āĨ‡ āĪēāĪŋāĪ āĪĄāĪŋāĪēāĨ€āΟ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪķāĨ‡āĪĄāĨāĪŊāĨ‚āĪē āĪ•āΰ āĪĶāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ:\n\n{deletionDate, date, full} āĪ•āĨ‹ {deletionDate, time, short} āĪŠāΰ\n\nāĪ…āĪ—āΰ āΆāĪŠāĪĻāĨ‡ ā·āĪļāĪ•āĪū āĪ…āĪĻāĨāΰāĨ‹āΧ āĪĻāĪđāĨ€āĪ‚ āĪ•āĪŋāĪŊāĪū āĪĨāĪū, āĪĪāĨ‹ āĪĄāĪŋāĪēāĨ€āĪķāĪĻ āΰāĪĶāĨāĪĶ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪ…āĪŠāĪĻāĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪŪāĨ‡āĪ‚ āĪļāĪūā·āĪĻ ā·āĪĻ āĪ•āΰāĨ‡āĪ‚āĨĪ āĪđāĪŪ āΆāĪŠāĪ•āĨ‡ āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĨ‹ āĪļāĨāΰāĪ•āĨāĪ·āĪŋāĪĪ āĪ•āΰāĪĻāĨ‡ āĪ•āĨ‡ āĪēāĪŋāĪ āĪ…āĪŠāĪĻāĪū āĪŠāĪūāĪļāĪĩāΰāĨāĪĄ āĪŽāĪĶāĪēāĪĻāĨ‡ āĪ•āĨ€ āĪ­āĨ€ āĪļāĪēāĪūāĪđ āĪĶāĨ‡āĪĪāĨ‡ āĪđāĨˆāĪ‚āĨĪ\n\n– {product_name} āΟāĨ€āĪŪ"
},
"unban_notification": {
"subject": "āΆāĪŠāĪ•āĨ‡ {product_name} āĪ…āĪ•āĪūāΉāĪ‚āΟ āĪ•āĪū āĪļāĪļāĨāĪŠāĨ‡āĪ‚āĪķāĪĻ āĪđāΟāĪū āĪĶāĪŋāĪŊāĪū āĪ—āĪŊāĪū āĪđāĨˆ",
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_HR_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Tvoj {product_name} račun je privremeno onemogućen",
"body": "Pozdrav {username},\n\nPrivremeno smo onemogućili tvoj {product_name} račun jer smo otkrili sumnjivu aktivnost.\n\n{reason, select,\n null {}\n other {Razlog: {reason}}\n}\n\nDa bi ponovno pristupio svom računu, morat ćeÅĄ poniÅĄtiti lozinku:\n\n{forgotUrl}\n\nNakon ÅĄto poniÅĄtiÅĄ lozinku, moći ćeÅĄ se ponovno prijaviti.\n\nAko misliÅĄ da je ovo pogreÅĄka, kontaktiraj naÅĄ tim za podrÅĄku.\n\n– {product_name} Sigurnosni Tim"
"subject": "Tvoj račun na {product_name}u privremeno je onemogućen",
"body": "Pozdrav {username},\n\nPrivremeno smo onemogućili tvoj račun na {product_name}u jer smo otkrili sumnjivu aktivnost.\n\n{reason, select,\n null {}\n other {Razlog: {reason}}\n}\n\nZa ponovni pristup svom računu morat ćeÅĄ poniÅĄtiti lozinku:\n\n{forgotUrl}\n\nNakon ÅĄto poniÅĄtiÅĄ lozinku, moći ćeÅĄ se ponovno prijaviti.\n\nAko misliÅĄ da je ovo pogreÅĄka, kontaktiraj naÅĄ tim za podrÅĄku.\n\n– Sigurnosni tim {product_name}a"
},
"account_scheduled_deletion": {
"subject": "Tvoj {product_name} račun bit će trajno izbrisan",
"body": "Pozdrav {username},\n\nTvoj {product_name} račun je zakazan za trajno brisanje zbog krÅĄenja naÅĄih Uvjeta koriÅĄtenja ili Smjernica zajednice.\n\nZakazano brisanje: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Razlog: {reason}}\n}\n\nOvo je ozbiljna mjera. Podaci tvog računa bit će trajno izbrisani na zakazani datum.\n\nPregledaj:\n- Uvjeti koriÅĄtenja: {termsUrl}\n- Smjernice zajednice: {guidelinesUrl}\n\nPostupak Åūalbe:\nAko smatraÅĄ da je ova odluka bila netočna ili neopravdana, imaÅĄ 60 dana za podnoÅĄenje Åūalbe. PoÅĄalji e-poÅĄtu na {appeals_email} s ove adrese e-poÅĄte.\n\nU svojoj Åūalbi:\n- Jasno objasni zaÅĄto smatraÅĄ da je odluka bila netočna ili neopravdana\n- PruÅūi sve relevantne dokaze ili kontekst\n\nČlan {product_name} sigurnosnog tima pregledat će tvoju Åūalbu i moÅūe zaustaviti brisanje dok se ne donese konačna odluka.\n\n– {product_name} Sigurnosni Tim"
"subject": "Tvoj račun na {product_name}u bit će trajno izbrisan",
"body": "Pozdrav {username},\n\nTvoj račun na {product_name}u zakazan je za trajno brisanje zbog krÅĄenja naÅĄih Uvjeta pruÅūanja usluge ili Smjernica zajednice.\n\nZakazano brisanje: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Razlog: {reason}}\n}\n\nOvo je ozbiljna mjera. Podaci tvog računa bit će trajno izbrisani na zakazani datum.\n\nPregledaj:\n- Uvjeti pruÅūanja usluge: {termsUrl}\n- Smjernice zajednice: {guidelinesUrl}\n\nPostupak Åūalbe:\nAko smatraÅĄ da je ova odluka bila netočna ili neopravdana, imaÅĄ 60 dana za podnoÅĄenje Åūalbe. PoÅĄalji e-poÅĄtu na {appeals_email} s ove adrese e-poÅĄte.\n\nU svojoj Åūalbi:\n- Jasno objasni zaÅĄto smatraÅĄ da je odluka bila netočna ili neopravdana\n- Navedi sve relevantne dokaze ili kontekst\n\nČlan Sigurnosnog tima {product_name}a pregledat će tvoju Åūalbu i moÅūe privremeno zaustaviti zakazano brisanje dok se ne donese konačna odluka.\n\n– Sigurnosni tim {product_name}a"
},
"account_temp_banned": {
"subject": "Tvoj {product_name} račun je privremeno suspendiran",
"body": "Pozdrav {username},\n\nTvoj {product_name} račun je privremeno suspendiran zbog krÅĄenja naÅĄih Uvjeta koriÅĄtenja ili Smjernica zajednice.\n\nTrajanje: {durationHours, plural,\n =1 {1 sat} few {sata}\n other {# sati}\n}\nSuspendiran do: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Razlog: {reason}}\n}\n\nTijekom tog vremena nećeÅĄ moći pristupiti svom računu.\n\nPregledaj:\n- Uvjeti koriÅĄtenja: {termsUrl}\n- Smjernice zajednice: {guidelinesUrl}\n\nAko smatraÅĄ da je ova odluka bila netočna ili neopravdana, moÅūeÅĄ podnijeti Åūalbu. PoÅĄalji e-poÅĄtu na {appeals_email} s ove adrese e-poÅĄte i jasno objasni zaÅĄto smatraÅĄ da je odluka bila netočna. Pregledat ćemo tvoju Åūalbu i odgovoriti s naÅĄom odlukom.\n\n– {product_name} Sigurnosni Tim"
"subject": "Tvoj račun na {product_name}u privremeno je suspendiran",
"body": "Pozdrav {username},\n\nTvoj račun na {product_name}u privremeno je suspendiran zbog krÅĄenja naÅĄih Uvjeta pruÅūanja usluge ili Smjernica zajednice.\n\nTrajanje: {durationHours, plural,\n =1 {1 sat}\n one {# sat}\n few {# sata}\n other {# sati}\n}\nSuspendiran do: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Razlog: {reason}}\n}\n\nTijekom tog vremena nećeÅĄ moći pristupiti svom računu.\n\nPregledaj:\n- Uvjeti pruÅūanja usluge: {termsUrl}\n- Smjernice zajednice: {guidelinesUrl}\n\nAko smatraÅĄ da je ova odluka bila netočna ili neopravdana, moÅūeÅĄ podnijeti Åūalbu. PoÅĄalji e-poÅĄtu na {appeals_email} s ove adrese e-poÅĄte i jasno objasni zaÅĄto smatraÅĄ da je odluka bila netočna. Pregledat ćemo tvoju Åūalbu i javiti ti naÅĄu odluku.\n\n– Sigurnosni tim {product_name}a"
},
"donation_confirmation": {
"subject": "Hvala ti na donaciji za {product_name}",
"body": "Pozdrav,\n\nHvala ti na donaciji za {product_name}! Tvoja {interval, select,\n month {redovita donacija}\n year {redovita donacija}\n other {jednokratna donacija}\n} je uspjeÅĄno {interval, select,\n month {postavljena}\n year {postavljena}\n other {obrađena}\n}.\n\nDetalji donacije:\nIznos: {amount} {currency} {interval, select,\n month {mjesečno}\n year {godiÅĄnje}\n other {}\n}\n\nStripe će ti uskoro poslati zasebnu potvrdu s PDF-om računa. Ovo uključuje sve detalje plaćanja i moÅūe se koristiti u porezne svrhe.\n\nMoÅūeÅĄ pregledati povijest donacija, preuzeti račune, {interval, select,\n month {i upravljati ili otkazati svoju pretplatu}\n year {i upravljati ili otkazati svoju pretplatu}\n other {i upravljati budućim donacijama}\n} u bilo kojem trenutku koristeći ovu poveznicu:\n\n{manageUrl}\n\nTvoja podrÅĄka pomaÅūe {product_name} da nastavi s radom. Hvala ti!\n\n– {product_name} Tim"
"body": "Pozdrav,\n\nHvala ti na donaciji za {product_name}! Tvoja {interval, select,\n month {redovita donacija}\n year {redovita donacija}\n other {jednokratna donacija}\n} uspjeÅĄno je {interval, select,\n month {postavljena}\n year {postavljena}\n other {obrađena}\n}.\n\nDetalji donacije:\nIznos: {amount} {interval, select,\n month {mjesečno}\n year {godiÅĄnje}\n other {}\n}\n\nStripe će ti uskoro poslati zasebnu potvrdu s PDF-om računa. Ona sadrÅūi sve detalje plaćanja i moÅūeÅĄ je koristiti u porezne svrhe.\n\nMoÅūeÅĄ pregledati povijest donacija, preuzeti račune {interval, select,\n month {i upravljati pretplatom ili je otkazati}\n year {i upravljati pretplatom ili je otkazati}\n other {i upravljati budućim donacijama}\n} u bilo kojem trenutku putem ove poveznice:\n\n{manageUrl}\n\nTvoja podrÅĄka pomaÅūe da {product_name} nastavi raditi. Hvala ti!\n\n– Tim {product_name}a"
},
"donation_magic_link": {
"subject": "Upravljanje donacijama za {product_name}",
"body": "Pozdrav,\n\nKlikni na poveznicu ispod za pristup svom portalu za donatore:\n\n{manageUrl}\n\nNa portalu moÅūeÅĄ upravljati pretplatama, preuzimati račune i pregledavati povijest svojih donacija.\n\nOva poveznica istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko nisi zatraÅūio ovu poveznicu, moÅūeÅĄ sigurno zanemariti ovu e-poÅĄtu.\n\n– {product_name} Tim"
"body": "Pozdrav,\n\nKlikni na poveznicu ispod za pristup svom portalu za donatore:\n\n{manageUrl}\n\nNa portalu moÅūeÅĄ upravljati pretplatama, preuzimati račune i pregledavati povijest svojih donacija.\n\nOva poveznica istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko ovaj zahtjev ne dolazi od tebe, slobodno zanemari ovu e-poÅĄtu.\n\n– Tim {product_name}a"
},
"dsa_report_verification": {
"subject": "Potvrdi svoju e-poÅĄtu za izvjeÅĄÄ‡e o Zakonu o digitalnim uslugama",
"body": "Pozdrav,\n\nKoristi kod za provjeru u nastavku za podnoÅĄenje izvjeÅĄÄ‡a o Zakonu o digitalnim uslugama na {product_name}:\n\n{code}\n\nOvaj kod istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko ovo nisi zatraÅūio, moÅūeÅĄ zanemariti ovu e-poÅĄtu.\n\n– {product_name} Sigurnosni Tim"
"subject": "Potvrdi svoju e-poÅĄtu za prijavu prema Zakonu o digitalnim uslugama",
"body": "Pozdrav,\n\nZa podnoÅĄenje prijave prema Zakonu o digitalnim uslugama na {product_name}u upotrijebi kod za potvrdu u nastavku:\n\n{code}\n\nOvaj kod istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko ovaj zahtjev ne dolazi od tebe, zanemari ovu e-poÅĄtu.\n\n– Sigurnosni tim {product_name}a"
},
"email_change_new": {
"subject": "Potvrdi svoju novu e-poÅĄtu za {product_name}",
"body": "Pozdrav {username},\n\nUnesi ovaj kod u aplikaciju kako bi potvrdio svoju novu {product_name} e-poÅĄtu:\n\n{code}\n\nOvaj kod istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko ovo nisi zatraÅūio, moÅūeÅĄ zanemariti ovu e-poÅĄtu.\n\n– {product_name} Tim"
"body": "Pozdrav {username},\n\nUnesi ovaj kod u aplikaciju da potvrdiÅĄ svoju novu e-poÅĄtu za {product_name}:\n\n{code}\n\nOvaj kod istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko ovaj zahtjev ne dolazi od tebe, zanemari ovu e-poÅĄtu.\n\n– Tim {product_name}a"
},
"email_change_original": {
"subject": "Potvrdi promjenu e-poÅĄte za {product_name}",
"body": "Pozdrav {username},\n\nPrimili smo zahtjev za promjenu adrese e-poÅĄte na tvom {product_name} računu.\n\nDa bi potvrdio ovu promjenu, unesi ovaj kod u aplikaciju:\n\n{code}\n\nOvaj kod istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko ovo nisi zatraÅūio, odmah zaÅĄtiti svoj račun.\n\n– {product_name} Tim"
"body": "Pozdrav {username},\n\nPrimili smo zahtjev za promjenu adrese e-poÅĄte na tvom računu na {product_name}u.\n\nZa potvrdu ove promjene unesi ovaj kod u aplikaciju:\n\n{code}\n\nOvaj kod istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko ovaj zahtjev ne dolazi od tebe, odmah zaÅĄtiti svoj račun.\n\n– Tim {product_name}a"
},
"email_change_revert": {
"subject": "Tvoja e-poÅĄta za {product_name} je promijenjena",
"body": "Pozdrav {username},\n\nAdresa e-poÅĄte na tvom {product_name} računu promijenjena je u {newEmail}.\n\nAko si napravio ovu promjenu, nije potrebna nikakva radnja. Ako nisi, moÅūeÅĄ poniÅĄtiti promjenu i zaÅĄtititi svoj račun koristeći ovu poveznicu:\n\n{revertUrl}\n\nOvo će vratiti tvoju prethodnu e-poÅĄtu, odjaviti te svugdje, ukloniti povezane telefonske brojeve, onemogućiti viÅĄefaktorsku autentifikaciju i zahtijevati postavljanje nove lozinke.\n\n– {product_name} Sigurnosni Tim"
"body": "Pozdrav {username},\n\nAdresa e-poÅĄte na tvom računu na {product_name}u promijenjena je u {newEmail}.\n\nAko ova promjena dolazi od tebe, nije potrebna nikakva radnja. Ako ne dolazi, moÅūeÅĄ je poniÅĄtiti i zaÅĄtititi svoj račun ovom poveznicom:\n\n{revertUrl}\n\nOvo će vratiti tvoju prethodnu e-poÅĄtu, odjaviti te iz svih sesija, ukloniti povezane telefonske brojeve, onemogućiti viÅĄefaktorsku autentifikaciju i zahtijevati postavljanje nove lozinke.\n\n– Sigurnosni tim {product_name}a"
},
"email_verification": {
"subject": "Potvrdi svoju e-poÅĄtu za {product_name}",
"body": "Pozdrav {username},\n\nPotvrdi adresu e-poÅĄte za svoj {product_name} račun klikom na poveznicu ispod:\n\n{verifyUrl}\n\nAko nisi stvorio {product_name} račun, moÅūeÅĄ zanemariti ovu e-poÅĄtu.\n\nOva poveznica vrijedi 24 sata.\n\n– {product_name} Tim"
"body": "Pozdrav {username},\n\nPotvrdi adresu e-poÅĄte za svoj račun na {product_name}u klikom na poveznicu ispod:\n\n{verifyUrl}\n\nAko račun na {product_name}u nije tvoj, moÅūeÅĄ zanemariti ovu e-poÅĄtu.\n\nOva poveznica vrijedi 24 sata.\n\n– Tim {product_name}a"
},
"gift_chargeback_notification": {
"subject": "Pogodnosti tvog iskoriÅĄtenog poklona su uklonjene",
"body": "Pozdrav {username},\n\nPoklon kod koji si iskoristio izvorno je platio netko drugi. To plaćanje je u međuvremenu poniÅĄteno (povrat sredstava).\n\nZbog toga smo uklonili pogodnosti koje su dodane tvom računu kada si iskoristio poklon.\n\nAko misliÅĄ da je ovo pogreÅĄka, kontaktiraj naÅĄ tim za podrÅĄku i uključi sve detalje o poklon kodu i kada si ga iskoristio.\n\n– {product_name} Tim"
"body": "Pozdrav {username},\n\nPoklon kod iskoriÅĄten na tvom računu izvorno je platio netko drugi. To je plaćanje u međuvremenu poniÅĄteno (povrat sredstava putem banke).\n\nZbog toga smo uklonili pogodnosti koje su pri iskoriÅĄtavanju poklona dodane tvom računu.\n\nAko misliÅĄ da je ovo pogreÅĄka, kontaktiraj naÅĄ tim za podrÅĄku i navedi sve podatke koje imaÅĄ o poklon kodu i o vremenu njegova iskoriÅĄtavanja.\n\n– Tim {product_name}a"
},
"harvest_completed": {
"subject": "Tvoj izvoz podataka za {product_name} je spreman za preuzimanje",
"body": "Pozdrav {username},\n\nTvoj izvoz podataka je spreman.\n\nPoveznica za preuzimanje:\n{downloadUrl}\n\nUključene poruke: {totalMessages, number}\nVeličina datoteke: {fileSizeMB, number} MB\n\nOva poveznica istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko nisi zatraÅūio ovaj izvoz, odmah promijeni lozinku i kontaktiraj naÅĄ tim za podrÅĄku.\n\n– {product_name} Tim"
"body": "Pozdrav {username},\n\nTvoj izvoz podataka je spreman.\n\nPoveznica za preuzimanje:\n{downloadUrl}\n\nUključene poruke: {totalMessages, number}\nVeličina datoteke: {fileSizeMB, number} MB\n\nOva poveznica istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko ovaj izvoz ne dolazi od tebe, odmah promijeni lozinku i kontaktiraj naÅĄ tim za podrÅĄku.\n\n– Tim {product_name}a"
},
"inactivity_warning": {
"subject": "Tvoj {product_name} račun bit će izbrisan zbog neaktivnosti",
"body": "Pozdrav {username},\n\nNismo primijetili nikakvu aktivnost na tvom {product_name} računu od {lastActiveDate, date, full}.\n\nAko se ne prijaviÅĄ do {deletionDate, date, full} u {deletionDate, time, short}, tvoj račun bit će trajno izbrisan zbog neaktivnosti.\n\nPrijavi se ovdje:\n{loginUrl}\n\nAko si nedavno koristio {product_name}, odmah kontaktiraj naÅĄ tim za podrÅĄku.\n\n– {product_name} Tim"
"subject": "Tvoj račun na {product_name}u bit će izbrisan zbog neaktivnosti",
"body": "Pozdrav {username},\n\nNismo primijetili nikakvu aktivnost na tvom računu na {product_name}u od {lastActiveDate, date, full}.\n\nAko se ne prijaviÅĄ do {deletionDate, date, full} u {deletionDate, time, short}, tvoj račun bit će trajno izbrisan zbog neaktivnosti.\n\nPrijavi se ovdje:\n{loginUrl}\n\nAko u posljednje vrijeme koristiÅĄ {product_name}, odmah kontaktiraj naÅĄ tim za podrÅĄku.\n\n– Tim {product_name}a"
},
"ip_authorization": {
"subject": "Autoriziraj prijavu s nove IP adrese",
"body": "Pozdrav {username},\n\nOtkrili smo pokuÅĄaj prijave na tvoj {product_name} račun s nove IP adrese:\n\nIP adresa: {ipAddress}\nLokacija: {location}\n\nAko si to bio ti, potvrdi ovu IP adresu klikom na poveznicu ispod:\n\n{authUrl}\n\nAko se nisi ti pokuÅĄao prijaviti, odmah promijeni lozinku.\n\nOva poveznica vrijedi 30 minuta.\n\n– {product_name} Tim"
"subject": "Odobri prijavu s nove IP adrese",
"body": "Pozdrav {username},\n\nOtkrili smo pokuÅĄaj prijave na tvoj račun na {product_name}u s nove IP adrese:\n\nIP adresa: {ipAddress}\nLokacija: {location}\n\nAko je to bio tvoj pokuÅĄaj, odobri ovu IP adresu klikom na poveznicu ispod:\n\n{authUrl}\n\nAko taj pokuÅĄaj ne dolazi od tebe, odmah promijeni lozinku.\n\nOva poveznica vrijedi 30 minuta.\n\n– Tim {product_name}a"
},
"mfa_backup_codes_view": {
"subject": "Potvrdi pristup svojim {product_name} rezervnim kodovima",
"body": "Pozdrav {username},\n\nPrimili smo zahtjev za prikaz rezervnih kodova na tvom {product_name} računu.\n\nDa bi potvrdio ovaj zahtjev, unesi ovaj kod u aplikaciju:\n\n{code}\n\nOvaj kod istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko ovo nisi zatraÅūio, netko je moÅūda dobio pristup tvom računu. Odmah promijeni lozinku.\n\n– {product_name} Tim"
"subject": "Potvrdi pristup svojim rezervnim kodovima na {product_name}u",
"body": "Pozdrav {username},\n\nPrimili smo zahtjev za prikaz rezervnih kodova na tvom računu na {product_name}u.\n\nZa potvrdu ovog zahtjeva unesi ovaj kod u aplikaciju:\n\n{code}\n\nOvaj kod istječe {expiresAt, date, full} u {expiresAt, time, short}.\n\nAko ovaj zahtjev ne dolazi od tebe, netko je moÅūda dobio pristup tvom računu. Odmah promijeni lozinku.\n\n– Tim {product_name}a"
},
"password_change_verification": {
"subject": "Potvrdi promjenu lozinke za {product_name}",
"body": "Pozdrav {username},\n\nPrimili smo zahtjev za promjenu lozinke na tvom {product_name} računu.\n\nDa bi potvrdio ovu promjenu, unesi ovaj kod u aplikaciju:\n\n{code}\n\nOvaj kod vrijedi do {expiresAt}.\n\nAko ovo nisi zatraÅūio, netko je moÅūda dobio pristup tvom računu. Odmah promijeni lozinku i omogući dvofaktorsku autentifikaciju.\n\n– {product_name} Tim"
"body": "Pozdrav {username},\n\nPrimili smo zahtjev za promjenu lozinke na tvom računu na {product_name}u.\n\nZa potvrdu ove promjene unesi ovaj kod u aplikaciju:\n\n{code}\n\nOvaj kod vrijedi do {expiresAt}.\n\nAko ovaj zahtjev ne dolazi od tebe, netko je moÅūda dobio pristup tvom računu. Odmah promijeni lozinku i omogući dvofaktorsku autentifikaciju.\n\n– Tim {product_name}a"
},
"password_reset": {
"subject": "Resetiraj svoju lozinku za {product_name}",
"body": "Pozdrav {username},\n\nZatraÅūio si poniÅĄtavanje {product_name} lozinke. Koristi poveznicu ispod za postavljanje nove lozinke:\n\n{resetUrl}\n\nAko ovo nisi zatraÅūio, moÅūeÅĄ zanemariti ovu e-poÅĄtu.\n\nOva poveznica vrijedi 1 sat.\n\n– {product_name} Tim"
"subject": "PoniÅĄti svoju lozinku za {product_name}",
"body": "Pozdrav {username},\n\nPrimili smo tvoj zahtjev za poniÅĄtavanje lozinke za {product_name}. Upotrijebi poveznicu ispod za postavljanje nove lozinke:\n\n{resetUrl}\n\nAko ovaj zahtjev ne dolazi od tebe, slobodno zanemari ovu e-poÅĄtu.\n\nOva poveznica vrijedi 1 sat.\n\n– Tim {product_name}a"
},
"registration_approved": {
"subject": "Tvoja registracija za {product_name} je odobrena",
"body": "Pozdrav {username},\n\nDobre vijesti: tvoja {product_name} registracija je odobrena.\n\nSada se moÅūeÅĄ prijaviti u {product_name} aplikaciju ovdje:\n{channelsUrl}\n\nDobrodoÅĄao u {product_name} zajednicu.\n\n– {product_name} Tim"
"body": "Pozdrav {username},\n\nDobre vijesti: tvoja registracija za {product_name} je odobrena.\n\nSada se moÅūeÅĄ prijaviti u aplikaciju {product_name} ovdje:\n{channelsUrl}\n\nDobro doÅĄli u zajednicu {product_name}a.\n\n– Tim {product_name}a"
},
"report_resolved": {
"subject": "Tvoja prijava na {product_name} je pregledana",
"body": "Pozdrav {username},\n\nTvoje izvjeÅĄÄ‡e (ID: {reportId}) pregledao je naÅĄ Sigurnosni tim.{hasComment, select, yes {\n\nOdgovor Sigurnosnog tima:\n{publicComment}} other {}}\n\nHvala ti ÅĄto pomaÅūeÅĄ da {product_name} bude siguran za sve. Sve prijave shvaćamo ozbiljno i cijenimo tvoj doprinos zajednici.\n\nAko imaÅĄ bilo kakvih pitanja ili nedoumica u vezi s ovim rezultatom, kontaktiraj {safety_email}.\n\n– {product_name} Sigurnosni Tim"
"subject": "Tvoja prijava na {product_name}u je pregledana",
"body": "Pozdrav {username},\n\nTvoju prijavu (ID: {reportId}) pregledao je naÅĄ sigurnosni tim.{hasComment, select, yes {\n\nOdgovor sigurnosnog tima:\n{publicComment}} other {}}\n\nHvala ti ÅĄto pomaÅūeÅĄ da {product_name} bude siguran za sve. Sve prijave shvaćamo ozbiljno i cijenimo tvoj doprinos zajednici.\n\nAko imaÅĄ bilo kakvih pitanja ili nedoumica u vezi s ovim ishodom, kontaktiraj {safety_email}.\n\n– Sigurnosni tim {product_name}a"
},
"scheduled_deletion_notification": {
"subject": "Tvoj {product_name} račun bit će trajno izbrisan",
"body": "Pozdrav {username},\n\nTvoj {product_name} račun je zakazan za trajno brisanje.\n\nZakazano brisanje: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Razlog: {reason}}\n}\n\nOvo je ozbiljna mjera. Podaci tvog računa bit će trajno izbrisani na zakazani datum.\n\nAko smatraÅĄ da je ova odluka o provedbi bila netočna, moÅūeÅĄ podnijeti Åūalbu. PoÅĄalji e-poÅĄtu na {appeals_email} s ove adrese e-poÅĄte.\n\n– {product_name} Sigurnosni Tim"
"subject": "Tvoj račun na {product_name}u bit će trajno izbrisan",
"body": "Pozdrav {username},\n\nTvoj račun na {product_name}u zakazan je za trajno brisanje.\n\nZakazano brisanje: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Razlog: {reason}}\n}\n\nOvo je ozbiljna mjera. Podaci tvog računa bit će trajno izbrisani na zakazani datum.\n\nAko smatraÅĄ da je ova odluka bila netočna, moÅūeÅĄ podnijeti Åūalbu. PoÅĄalji e-poÅĄtu na {appeals_email} s ove adrese e-poÅĄte.\n\n– Sigurnosni tim {product_name}a"
},
"self_deletion_scheduled": {
"subject": "Brisanje tvog računa za {product_name} je zakazano",
"body": "Pozdrav {username},\n\nZatraÅūio si brisanje svog {product_name} računa. Tvoj račun je zakazan za trajno brisanje:\n\n{deletionDate, date, full} u {deletionDate, time, short}\n\nAko ovo nisi zatraÅūio, prijavi se na svoj račun kako bi otkazao brisanje. Također preporučujemo da promijeniÅĄ lozinku kako bi osigurao svoj račun.\n\n– {product_name} Tim"
"subject": "Brisanje tvog računa na {product_name}u je zakazano",
"body": "Pozdrav {username},\n\nPrimili smo tvoj zahtjev za brisanje računa na {product_name}u. Tvoj račun zakazan je za trajno brisanje:\n\n{deletionDate, date, full} u {deletionDate, time, short}\n\nAko ovaj zahtjev ne dolazi od tebe, prijavi se na svoj račun i otkaÅūi brisanje. Također preporučujemo da promijeniÅĄ lozinku radi zaÅĄtite računa.\n\n– Tim {product_name}a"
},
"unban_notification": {
"subject": "Suspenzija tvog računa za {product_name} je ukinuta",
"body": "Pozdrav {username},\n\nDobre vijesti: suspenzija tvog {product_name} računa je ukinuta.\n\n{reason, select,\n null {}\n other {Razlog: {reason}}\n}\n\nSada se moÅūeÅĄ ponovno prijaviti i nastaviti koristiti {product_name} kao i obično.\n\n– {product_name} Sigurnosni Tim"
"subject": "Suspenzija tvog računa na {product_name}u je ukinuta",
"body": "Pozdrav {username},\n\nDobre vijesti: suspenzija tvog računa na {product_name}u je ukinuta.\n\n{reason, select,\n null {}\n other {Razlog: {reason}}\n}\n\nSada se moÅūeÅĄ ponovno prijaviti i nastaviti koristiti {product_name} kao i obično.\n\n– Sigurnosni tim {product_name}a"
}
});
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_HU_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "A {product_name} fiÃģkodat ideiglenesen letiltottuk",
"body": "Szia {username},\n\nIdeiglenesen letiltottuk a {product_name} fiÃģkodat, mert gyanÚs tevÃĐkenysÃĐget ÃĐszleltÞnk.\n\n{reason, select,\n null {}\n other {Indok: {reason}}\n}\n\nA fiÃģkodhoz valÃģ hozzÃĄfÃĐrÃĐs visszaszerzÃĐsÃĐhez vissza kell ÃĄllítanod a jelszavadat:\n\n{forgotUrl}\n\nA jelszÃģ visszaÃĄllítÃĄsa utÃĄn Újra be tudsz jelentkezni.\n\nHa Úgy gondolod, hogy ez tÃĐvedÃĐsből tÃķrtÃĐnt, vedd fel a kapcsolatot a tÃĄmogatÃĄsi csapatunkkal.\n\n– {product_name} BiztonsÃĄgi Csapat"
"subject": "{product_name}-fiÃģkodat ideiglenesen letiltottuk",
"body": "Szia, {username}!\n\nIdeiglenesen letiltottuk a {product_name}-fiÃģkodat, mert gyanÚs tevÃĐkenysÃĐget ÃĐszleltÞnk.\n\n{reason, select,\n null {}\n other {Indok: {reason}}\n}\n\nA fiÃģkodhoz valÃģ hozzÃĄfÃĐrÃĐs visszaszerzÃĐsÃĐhez vissza kell ÃĄllítanod a jelszavadat:\n\n{forgotUrl}\n\nA jelszÃģ visszaÃĄllítÃĄsa utÃĄn Újra be tudsz jelentkezni.\n\nHa Úgy gondolod, hogy ez tÃĐvedÃĐsből tÃķrtÃĐnt, vedd fel a kapcsolatot az ÞgyfÃĐlszolgÃĄlatunkkal.\n\n– {product_name} biztonsÃĄgi csapata"
},
"account_scheduled_deletion": {
"subject": "{product_name} fiÃģkod vÃĐglegesen tÃķrÃķlve lesz",
"body": "Szia {username},\n\n{product_name} fiÃģkod vÃĐgleges tÃķrlÃĐsre van Þtemezve a SzolgÃĄltatÃĄsi feltÃĐteleink vagy a KÃķzÃķssÃĐgi irÃĄnyelveink megsÃĐrtÃĐse miatt.\n\nTervezett tÃķrlÃĐs: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Indok: {reason}}\n}\n\nEz egy komoly vÃĐgrehajtÃĄsi intÃĐzkedÃĐs. FiÃģkod adatai a tervezett dÃĄtumon vÃĐglegesen tÃķrÃķlve lesznek.\n\nTekintsd ÃĄt:\n- SzolgÃĄltatÃĄsi feltÃĐtelek: {termsUrl}\n- KÃķzÃķssÃĐgi irÃĄnyelvek: {guidelinesUrl}\n\nFellebbezÃĐsi eljÃĄrÃĄs:\nHa Úgy gondolod, hogy ez a vÃĐgrehajtÃĄsi dÃķntÃĐs helytelen vagy indokolatlan volt, 60 napod van fellebbezÃĐst benyÚjtani. KÞldj e-mailt az {appeals_email} címre erről az e-mail címről.\n\nA fellebbezÃĐsedben:\n- EgyÃĐrtelmÅąen magyarÃĄzd el, miÃĐrt gondolod, hogy a vÃĐgrehajtÃĄsi dÃķntÃĐs helytelen vagy indokolatlan volt\n- Adj meg minden relevÃĄns bizonyítÃĐkot vagy kontextust\n\nA {product_name} BiztonsÃĄgi CsapatÃĄnak egy tagja felÞlvizsgÃĄlja a fellebbezÃĐsedet, ÃĐs felfÞggesztheti a fÞggőben lÃĐvő tÃķrlÃĐst, amíg vÃĐgleges dÃķntÃĐs nem szÞletik.\n\n– {product_name} BiztonsÃĄgi Csapat"
"subject": "{product_name}-fiÃģkodat vÃĐglegesen tÃķrÃķlni fogjuk",
"body": "Szia, {username}!\n\n{product_name}-fiÃģkod vÃĐgleges tÃķrlÃĐsÃĐt ÞtemeztÞk a szolgÃĄltatÃĄsi feltÃĐteleink vagy a kÃķzÃķssÃĐgi irÃĄnyelveink megsÃĐrtÃĐse miatt.\n\nA tÃķrlÃĐs tervezett időpontja: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Indok: {reason}}\n}\n\nEz sÚlyos moderÃĄciÃģs intÃĐzkedÃĐs. FiÃģkod adatait a megadott időpontban vÃĐglegesen tÃķrÃķljÞk.\n\nKÃĐrjÞk, olvasd ÃĄt az alÃĄbbiakat:\n- SzolgÃĄltatÃĄsi feltÃĐtelek: {termsUrl}\n- KÃķzÃķssÃĐgi irÃĄnyelvek: {guidelinesUrl}\n\nFellebbezÃĐs:\nHa Úgy gondolod, hogy ez a dÃķntÃĐs hibÃĄs vagy indokolatlan volt, 60 napod van fellebbezni. Erről az e-mail-címről írj a kÃķvetkező címre: {appeals_email}.\n\nA fellebbezÃĐsben:\n- VilÃĄgosan fejtsd ki, miÃĐrt gondolod, hogy a dÃķntÃĐs hibÃĄs vagy indokolatlan volt.\n- Add meg a kapcsolÃģdÃģ bizonyítÃĐkokat ÃĐs a kÃķrÞlmÃĐnyeket.\n\nA {product_name} biztonsÃĄgi csapatÃĄnak egyik tagja elbírÃĄlja a fellebbezÃĐsedet, ÃĐs a vÃĐgleges dÃķntÃĐsig felfÞggesztheti a tervezett tÃķrlÃĐst.\n\n– {product_name} biztonsÃĄgi csapata"
},
"account_temp_banned": {
"subject": "A {product_name} fiÃģkodat ideiglenesen felfÞggesztettÞk",
"body": "Szia {username},\n\n{product_name} fiÃģkodat ideiglenesen felfÞggesztettÞk a SzolgÃĄltatÃĄsi feltÃĐteleink vagy a KÃķzÃķssÃĐgi irÃĄnyelveink megsÃĐrtÃĐse miatt.\n\nIdőtartam: {durationHours, plural,\n =1 {1 Ãģra}\n other {# Ãģra}\n}\nFelfÞggesztve eddig: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Indok: {reason}}\n}\n\nEz idő alatt nem fogsz tudni hozzÃĄfÃĐrni a fiÃģkodhoz.\n\nTekintsd ÃĄt:\n- SzolgÃĄltatÃĄsi feltÃĐtelek: {termsUrl}\n- KÃķzÃķssÃĐgi irÃĄnyelvek: {guidelinesUrl}\n\nHa Úgy gondolod, hogy ez a vÃĐgrehajtÃĄsi dÃķntÃĐs helytelen vagy indokolatlan volt, fellebbezÃĐst nyÚjthatsz be. KÞldj e-mailt az {appeals_email} címre erről az e-mail címről, ÃĐs egyÃĐrtelmÅąen magyarÃĄzd el, miÃĐrt gondolod, hogy a dÃķntÃĐs helytelen volt. FelÞlvizsgÃĄljuk a fellebbezÃĐsedet, ÃĐs vÃĄlaszolunk a dÃķntÃĐsÞnkről.\n\n– {product_name} BiztonsÃĄgi Csapat"
"subject": "{product_name}-fiÃģkodat ideiglenesen felfÞggesztettÞk",
"body": "Szia, {username}!\n\n{product_name}-fiÃģkodat ideiglenesen felfÞggesztettÞk a szolgÃĄltatÃĄsi feltÃĐteleink vagy a kÃķzÃķssÃĐgi irÃĄnyelveink megsÃĐrtÃĐse miatt.\n\nIdőtartam: {durationHours, plural,\n =1 {1 Ãģra}\n other {# Ãģra}\n}\nA felfÞggesztÃĐs vÃĐge: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Indok: {reason}}\n}\n\nEz idő alatt nem fÃĐrsz hozzÃĄ a fiÃģkodhoz.\n\nKÃĐrjÞk, olvasd ÃĄt az alÃĄbbiakat:\n- SzolgÃĄltatÃĄsi feltÃĐtelek: {termsUrl}\n- KÃķzÃķssÃĐgi irÃĄnyelvek: {guidelinesUrl}\n\nHa Úgy gondolod, hogy ez a dÃķntÃĐs hibÃĄs vagy indokolatlan volt, fellebbezhetsz. Erről az e-mail-címről írj a kÃķvetkező címre: {appeals_email}, ÃĐs vilÃĄgosan fejtsd ki, miÃĐrt tartod hibÃĄsnak a dÃķntÃĐst. ElbírÃĄljuk a fellebbezÃĐsedet, ÃĐs ÃĐrtesítÞnk a dÃķntÃĐsÞnkről.\n\n– {product_name} biztonsÃĄgi csapata"
},
"donation_confirmation": {
"subject": "KÃķszÃķnjÞk a {product_name} adomÃĄnyodat",
"body": "Szia,\n\nKÃķszÃķnjÞk a {product_name} adomÃĄnyodat! A {interval, select,\n month {rendszeres adomÃĄnyod}\n year {rendszeres adomÃĄnyod}\n other {egyszeri adomÃĄnyod}\n} sikeresen {interval, select,\n month {beÃĄllítottuk}\n year {beÃĄllítottuk}\n other {feldolgoztuk}\n}.\n\nAdomÃĄny rÃĐszletei:\nÖsszeg: {amount} {currency} {interval, select,\n month {havonta}\n year {ÃĐvente}\n other {}\n}\n\nA Stripe hamarosan kÞlÃķn nyugtÃĄt kÞld neked e-mailben a szÃĄmla PDF-jÃĐvel. Ez tartalmazza az Ãķsszes fizetÃĐsi adatot, ÃĐs adÃģzÃĄsi cÃĐlokra is felhasznÃĄlhatÃģ.\n\nAdomÃĄnytÃķrtÃĐnetedet, szÃĄmlÃĄidat ÃĐs {interval, select,\n month {előfizetÃĐsedet}\n year {előfizetÃĐsedet}\n other {jÃķvőbeli adomÃĄnyaidat}\n} bÃĄrmikor kezelheted vagy lemondhatod ezen a linken:\n\n{manageUrl}\n\nA tÃĄmogatÃĄsod segít a {product_name} mÅąkÃķdÃĐsÃĐben. KÃķszÃķnjÞk!\n\n– {product_name} Csapat"
"subject": "KÃķszÃķnjÞk, hogy adomÃĄnyoddal tÃĄmogatod a {product_name} mÅąkÃķdÃĐsÃĐt",
"body": "Szia!\n\nKÃķszÃķnjÞk, hogy adomÃĄnyoddal tÃĄmogatod a {product_name} mÅąkÃķdÃĐsÃĐt! {interval, select,\n month {Sikeresen beÃĄllítottuk a rendszeres adomÃĄnyodat.}\n year {Sikeresen beÃĄllítottuk a rendszeres adomÃĄnyodat.}\n other {Sikeresen feldolgoztuk az egyszeri adomÃĄnyodat.}\n}\n\nAz adomÃĄny rÃĐszletei:\nÖsszeg: {amount} {interval, select,\n month {havonta}\n year {ÃĐvente}\n other {}\n}\n\nA Stripe hamarosan kÞlÃķn e-mailben kÞld nyugtÃĄt ÃĐs egy PDF-szÃĄmlÃĄt. Ezek tartalmazzÃĄk az Ãķsszes fizetÃĐsi adatot, ÃĐs adÃģzÃĄsi cÃĐlokra is hasznÃĄlhatÃģk.\n\nAz alÃĄbbi linken bÃĄrmikor megtekintheted korÃĄbbi adomÃĄnyaidat, letÃķltheted a szÃĄmlÃĄkat, {interval, select,\n month {valamint kezelheted vagy lemondhatod az előfizetÃĐsedet}\n year {valamint kezelheted vagy lemondhatod az előfizetÃĐsedet}\n other {valamint kezelheted a jÃķvőbeli adomÃĄnyaidat}\n}:\n\n{manageUrl}\n\nTÃĄmogatÃĄsod segít fenntartani a {product_name} mÅąkÃķdÃĐsÃĐt. KÃķszÃķnjÞk!\n\n– {product_name} csapata"
},
"donation_magic_link": {
"subject": "A {product_name} adomÃĄnyaid kezelÃĐse",
"body": "Szia,\n\nKattints az alÃĄbbi linkre az adomÃĄnyozÃģi portÃĄlod elÃĐrÃĐsÃĐhez:\n\n{manageUrl}\n\nA portÃĄlon kezelheted az előfizetÃĐseket, letÃķltheted a szÃĄmlÃĄkat, ÃĐs megtekintheted az adomÃĄnytÃķrtÃĐnetedet.\n\nEz a link {expiresAt, date, full} {expiresAt, time, short} időpontban jÃĄr le.\n\nHa nem kÃĐrted ezt a linket, nyugodtan figyelmen kívÞl hagyhatod ezt az e-mailt.\n\n– {product_name} Csapat"
"subject": "A {product_name} mÅąkÃķdÃĐsÃĐt tÃĄmogatÃģ adomÃĄnyaid kezelÃĐse",
"body": "Szia!\n\nKattints az alÃĄbbi linkre az adomÃĄnyozÃģi portÃĄlod elÃĐrÃĐsÃĐhez:\n\n{manageUrl}\n\nA portÃĄlon kezelheted az előfizetÃĐseket, letÃķltheted a szÃĄmlÃĄkat, ÃĐs megtekintheted az adomÃĄnytÃķrtÃĐnetedet.\n\nEz a link {expiresAt, date, full} {expiresAt, time, short} időpontban jÃĄr le.\n\nHa nem kÃĐrted ezt a linket, nyugodtan figyelmen kívÞl hagyhatod ezt az e-mailt.\n\n– {product_name} csapata"
},
"dsa_report_verification": {
"subject": "Erősítsd meg e-mail címedet a DSA jelentÃĐsedhez",
"body": "Szia,\n\nHasznÃĄld az alÃĄbbi ellenőrző kÃģdot a DSA jelentÃĐsed benyÚjtÃĄsÃĄhoz a {product_name} felÞletÃĐn:\n\n{code}\n\nEz a kÃģd {expiresAt, date, full} {expiresAt, time, short} időpontban jÃĄr le.\n\nHa nem kÃĐrted ezt, figyelmen kívÞl hagyhatod ezt az e-mailt.\n\n– {product_name} BiztonsÃĄgi Csapat"
"subject": "Erősítsd meg e-mail-címedet a DSA-bejelentÃĐshez",
"body": "Szia!\n\nAz alÃĄbbi ellenőrző kÃģddal kÞldheted el a digitÃĄlis szolgÃĄltatÃĄsokrÃģl szÃģlÃģ rendelet (DSA) szerinti bejelentÃĐsedet a {product_name} felÞletÃĐn:\n\n{code}\n\nA kÃģd lejÃĄrati időpontja: {expiresAt, date, full} {expiresAt, time, short}.\n\nHa nem te kÃĐrted ezt a kÃģdot, figyelmen kívÞl hagyhatod ezt az e-mailt.\n\n– {product_name} biztonsÃĄgi csapata"
},
"email_change_new": {
"subject": "Erősítsd meg Új {product_name} e-mail címedet",
"body": "Szia {username},\n\nAdd meg ezt a kÃģdot az alkalmazÃĄsban az Új {product_name} e-mail címed megerősítÃĐsÃĐhez:\n\n{code}\n\nEz a kÃģd {expiresAt, date, full} {expiresAt, time, short} időpontban jÃĄr le.\n\nHa nem kÃĐrted ezt, figyelmen kívÞl hagyhatod ezt az e-mailt.\n\n– {product_name} Csapat"
"subject": "Erősítsd meg {product_name}-fiÃģkod Új e-mail-címÃĐt",
"body": "Szia, {username}!\n\nAdd meg ezt a kÃģdot az alkalmazÃĄsban {product_name}-fiÃģkod Új e-mail-címÃĐnek megerősítÃĐsÃĐhez:\n\n{code}\n\nEz a kÃģd {expiresAt, date, full} {expiresAt, time, short} időpontban jÃĄr le.\n\nHa nem kÃĐrted ezt, figyelmen kívÞl hagyhatod ezt az e-mailt.\n\n– {product_name} csapata"
},
"email_change_original": {
"subject": "Erősítsd meg a {product_name} e-mail címed megvÃĄltoztatÃĄsÃĄt",
"body": "Szia {username},\n\nKÃĐrÃĐst kaptunk a {product_name} fiÃģkod e-mail címÃĐnek megvÃĄltoztatÃĄsÃĄra.\n\nA vÃĄltoztatÃĄs megerősítÃĐsÃĐhez add meg ezt a kÃģdot az alkalmazÃĄsban:\n\n{code}\n\nEz a kÃģd {expiresAt, date, full} {expiresAt, time, short} időpontban jÃĄr le.\n\nHa nem kÃĐrted ezt, azonnal biztosítsd a fiÃģkodat.\n\n– {product_name} Csapat"
"subject": "Erősítsd meg {product_name}-fiÃģkod e-mail-címÃĐnek mÃģdosítÃĄsÃĄt",
"body": "Szia, {username}!\n\nKÃĐrÃĐst kaptunk a {product_name}-fiÃģkod e-mail-címÃĐnek megvÃĄltoztatÃĄsÃĄra.\n\nA vÃĄltoztatÃĄs megerősítÃĐsÃĐhez add meg ezt a kÃģdot az alkalmazÃĄsban:\n\n{code}\n\nEz a kÃģd {expiresAt, date, full} {expiresAt, time, short} időpontban jÃĄr le.\n\nHa nem kÃĐrted ezt, azonnal helyezd biztonsÃĄgba a fiÃģkodat.\n\n– {product_name} csapata"
},
"email_change_revert": {
"subject": "A {product_name} e-mail címed megvÃĄltozott",
"body": "Szia {username},\n\nA {product_name} fiÃģkod e-mail címe a kÃķvetkezőre vÃĄltozott: {newEmail}.\n\nHa te vÃĐgezted ezt a vÃĄltoztatÃĄst, nincs szÞksÃĐg tovÃĄbbi intÃĐzkedÃĐsre. Ha nem te voltÃĄl, visszavonhatod a vÃĄltoztatÃĄst, ÃĐs biztosíthatod a fiÃģkodat ezen a linken:\n\n{revertUrl}\n\nEz visszaÃĄllítja az előző e-mail címedet, kijelentkeztet mindenhol, eltÃĄvolítja a kapcsolt telefonszÃĄmokat, letiltja az MFA-t, ÃĐs Új jelszÃģ beÃĄllítÃĄsÃĄra lesz szÞksÃĐged.\n\n– {product_name} BiztonsÃĄgi Csapat"
"subject": "MegvÃĄltozott {product_name}-fiÃģkod e-mail-címe",
"body": "Szia, {username}!\n\n{product_name}-fiÃģkod e-mail-címe a kÃķvetkezőre vÃĄltozott: {newEmail}.\n\nHa te mÃģdosítottad, nincs tovÃĄbbi teendőd. Ha nem te voltÃĄl, az alÃĄbbi linken visszavonhatod a mÃģdosítÃĄst, ÃĐs biztonsÃĄgba helyezheted a fiÃģkodat:\n\n{revertUrl}\n\nEzzel visszaÃĄllítjuk a korÃĄbbi e-mail-címedet, mindenhol kijelentkeztetÞnk, eltÃĄvolítjuk a kapcsolt telefonszÃĄmokat, kikapcsoljuk a tÃķbbfaktoros azonosítÃĄst, ÃĐs Új jelszÃģt kell beÃĄllítanod.\n\n– {product_name} biztonsÃĄgi csapata"
},
"email_verification": {
"subject": "Erősítsd meg {product_name} e-mail címedet",
"body": "Szia {username},\n\nErősítsd meg a {product_name} fiÃģkod e-mail címÃĐt az alÃĄbbi linkre kattintva:\n\n{verifyUrl}\n\nHa nem hoztÃĄl lÃĐtre {product_name} fiÃģkot, nyugodtan figyelmen kívÞl hagyhatod ezt az e-mailt.\n\nEz a link 24 ÃģrÃĄig ÃĐrvÃĐnyes.\n\n– {product_name} Csapat"
"subject": "Erősítsd meg {product_name}-fiÃģkod e-mail-címÃĐt",
"body": "Szia, {username}!\n\nErősítsd meg a {product_name}-fiÃģkod e-mail-címÃĐt az alÃĄbbi linkre kattintva:\n\n{verifyUrl}\n\nHa nem hoztÃĄl lÃĐtre {product_name}-fiÃģkot, nyugodtan figyelmen kívÞl hagyhatod ezt az e-mailt.\n\nEz a link 24 ÃģrÃĄig ÃĐrvÃĐnyes.\n\n– {product_name} csapata"
},
"gift_chargeback_notification": {
"subject": "EltÃĄvolítottuk a bevÃĄltott ajÃĄndÃĐkod előnyeit",
"body": "Szia {username},\n\nAz ÃĄltalad bevÃĄltott ajÃĄndÃĐkkÃģdot eredetileg valaki mÃĄs fizette. Ez a fizetÃĐs azÃģta visszavonÃĄsra kerÞlt (visszaterhelÃĐs).\n\nEmiatt eltÃĄvolítottuk azokat az előnyÃķket, amelyeket a fiÃģkodhoz adtunk, amikor bevÃĄltottad az ajÃĄndÃĐkot.\n\nHa Úgy gondolod, hogy ez hiba, vedd fel a kapcsolatot a tÃĄmogatÃĄsi csapatunkkal, ÃĐs add meg az ajÃĄndÃĐkkÃģddal ÃĐs a bevÃĄltÃĄs időpontjÃĄval kapcsolatos rÃĐszleteket.\n\n– {product_name} Csapat"
"subject": "MegszÅąntek a bevÃĄltott ajÃĄndÃĐkodhoz tartozÃģ előnyÃķk",
"body": "Szia, {username}!\n\nAz ÃĄltalad bevÃĄltott ajÃĄndÃĐkkÃģdot eredetileg valaki mÃĄs fizette ki. Ezt a fizetÃĐst azÃģta visszaterheltÃĐk (chargeback).\n\nEmiatt megszÞntettÞk azokat az előnyÃķket, amelyeket az ajÃĄndÃĐk bevÃĄltÃĄsakor kapott a fiÃģkod.\n\nHa Úgy gondolod, hogy ez tÃĐvedÃĐs, vedd fel a kapcsolatot ÞgyfÃĐlszolgÃĄlatunkkal, ÃĐs add meg az ajÃĄndÃĐkkÃģddal ÃĐs a bevÃĄltÃĄs időpontjÃĄval kapcsolatos ismert rÃĐszleteket.\n\n– {product_name} csapata"
},
"harvest_completed": {
"subject": "A {product_name} adatexportod letÃķlthető",
"body": "Szia {username},\n\nAdataid exportÃĄlÃĄsa elkÃĐszÞlt.\n\nLetÃķltÃĐsi link:\n{downloadUrl}\n\nÜzenetek szÃĄma: {totalMessages, number}\nFÃĄjlmÃĐret: {fileSizeMB, number} MB\n\nEz a link {expiresAt, date, full} {expiresAt, time, short} időpontban jÃĄr le.\n\nHa nem kÃĐrted ezt az exportÃĄlÃĄst, azonnal vÃĄltoztasd meg a jelszavadat, ÃĐs vedd fel a kapcsolatot a tÃĄmogatÃĄsi csapatunkkal.\n\n– {product_name} Csapat"
"subject": "A {product_name} adatexportja elkÃĐszÞlt, letÃķltheted az adataidat",
"body": "Szia, {username}!\n\nAz adatexportod elkÃĐszÞlt.\n\nLetÃķltÃĐsi link:\n{downloadUrl}\n\nÜzenetek szÃĄma: {totalMessages, number}\nFÃĄjlmÃĐret: {fileSizeMB, number} MB\n\nEz a link {expiresAt, date, full} {expiresAt, time, short} időpontban jÃĄr le.\n\nHa nem kÃĐrted ezt az exportÃĄlÃĄst, azonnal vÃĄltoztasd meg a jelszavadat, ÃĐs vedd fel a kapcsolatot az ÞgyfÃĐlszolgÃĄlatunkkal.\n\n– {product_name} csapata"
},
"inactivity_warning": {
"subject": "A {product_name} fiÃģkodat inaktivitÃĄs miatt tÃķrÃķljÞk",
"body": "Szia {username},\n\nNem ÃĐszleltÞnk semmilyen tevÃĐkenysÃĐget a {product_name} fiÃģkodon {lastActiveDate, date, full} Ãģta.\n\nHa nem jelentkezel be {deletionDate, date, full} {deletionDate, time, short} időpontig, fiÃģkod vÃĐglegesen tÃķrlÃĐsre kerÞl inaktivitÃĄs miatt.\n\nJelentkezz be itt:\n{loginUrl}\n\nHa mostanÃĄban hasznÃĄltad a {product_name} alkalmazÃĄst, azonnal vedd fel a kapcsolatot a tÃĄmogatÃĄsi csapatunkkal.\n\n– {product_name} Csapat"
"subject": "{product_name}-fiÃģkodat inaktivitÃĄs miatt tÃķrÃķlni fogjuk",
"body": "Szia, {username}!\n\nEzen dÃĄtum Ãģta nem ÃĐszleltÞnk tevÃĐkenysÃĐget {product_name}-fiÃģkodban: {lastActiveDate, date, full}.\n\nHa nem jelentkezel be az alÃĄbbi időpontig, inaktivitÃĄs miatt vÃĐglegesen tÃķrÃķljÞk a fiÃģkodat: {deletionDate, date, full} {deletionDate, time, short}.\n\nItt jelentkezhetsz be:\n{loginUrl}\n\nHa mostanÃĄban hasznÃĄltad a {product_name} alkalmazÃĄst, azonnal vedd fel a kapcsolatot ÞgyfÃĐlszolgÃĄlatunkkal.\n\n– {product_name} csapata"
},
"ip_authorization": {
"subject": "Új IP-címről valÃģ bejelentkezÃĐs engedÃĐlyezÃĐse",
"body": "Szia {username},\n\nBejelentkezÃĐsi kísÃĐrletet ÃĐszleltÞnk a {product_name} fiÃģkodba egy Új IP-címről:\n\nIP-cím: {ipAddress}\nHelyszín: {location}\n\nHa te voltÃĄl, engedÃĐlyezd ezt az IP-címet az alÃĄbbi linkre kattintva:\n\n{authUrl}\n\nHa nem te prÃģbÃĄltÃĄl bejelentkezni, azonnal vÃĄltoztasd meg a jelszavadat.\n\nEz a link 30 percig ÃĐrvÃĐnyes.\n\n– {product_name} Csapat"
"body": "Szia, {username}!\n\nBejelentkezÃĐsi kísÃĐrletet ÃĐszleltÞnk a {product_name}-fiÃģkodba egy Új IP-címről:\n\nIP-cím: {ipAddress}\nHelyszín: {location}\n\nHa te voltÃĄl, engedÃĐlyezd ezt az IP-címet az alÃĄbbi linkre kattintva:\n\n{authUrl}\n\nHa nem te prÃģbÃĄltÃĄl bejelentkezni, azonnal vÃĄltoztasd meg a jelszavadat.\n\nEz a link 30 percig ÃĐrvÃĐnyes.\n\n– {product_name} csapata"
},
"mfa_backup_codes_view": {
"subject": "Erősítsd meg a {product_name} biztonsÃĄgi kÃģdjaidhoz valÃģ hozzÃĄfÃĐrÃĐst",
"body": "Szia {username},\n\nKÃĐrÃĐst kaptunk a {product_name} fiÃģkod biztonsÃĄgi kÃģdjainak megtekintÃĐsÃĐre.\n\nA kÃĐrÃĐs megerősítÃĐsÃĐhez add meg ezt a kÃģdot az alkalmazÃĄsban:\n\n{code}\n\nEz a kÃģd {expiresAt, date, full} {expiresAt, time, short} időpontban jÃĄr le.\n\nHa nem kÃĐrted ezt, valaki hozzÃĄfÃĐrhet a fiÃģkodhoz. Azonnal vÃĄltoztasd meg a jelszavadat.\n\n– {product_name} Csapat"
"subject": "Erősítsd meg {product_name}-fiÃģkod biztonsÃĄgi kÃģdjainak megtekintÃĐsÃĐt",
"body": "Szia, {username}!\n\nKÃĐrÃĐst kaptunk a {product_name}-fiÃģkod biztonsÃĄgi kÃģdjainak megtekintÃĐsÃĐre.\n\nA kÃĐrÃĐs megerősítÃĐsÃĐhez add meg ezt a kÃģdot az alkalmazÃĄsban:\n\n{code}\n\nEz a kÃģd {expiresAt, date, full} {expiresAt, time, short} időpontban jÃĄr le.\n\nHa nem kÃĐrted ezt, valaki hozzÃĄfÃĐrhet a fiÃģkodhoz. Azonnal vÃĄltoztasd meg a jelszavadat.\n\n– {product_name} csapata"
},
"password_change_verification": {
"subject": "Erősítsd meg a {product_name} jelszÃģcserÃĐdet",
"body": "Szia {username},\n\nKÃĐrÃĐst kaptunk a {product_name} fiÃģkod jelszavÃĄnak megvÃĄltoztatÃĄsÃĄra.\n\nA vÃĄltoztatÃĄs megerősítÃĐsÃĐhez add meg ezt a kÃģdot az alkalmazÃĄsban:\n\n{code}\n\nEz a kÃģd {expiresAt}-kor jÃĄr le.\n\nHa nem kÃĐrted ezt, valaki hozzÃĄfÃĐrhet a fiÃģkodhoz. Azonnal vÃĄltoztasd meg a jelszavadat, ÃĐs engedÃĐlyezd a kÃĐtfaktoros hitelesítÃĐst.\n\n– {product_name} Csapat"
"subject": "Erősítsd meg {product_name}-fiÃģkod jelszavÃĄnak mÃģdosítÃĄsÃĄt",
"body": "Szia, {username}!\n\nKÃĐrÃĐst kaptunk {product_name}-fiÃģkod jelszavÃĄnak mÃģdosítÃĄsÃĄra.\n\nA mÃģdosítÃĄs megerősítÃĐsÃĐhez add meg ezt a kÃģdot az alkalmazÃĄsban:\n\n{code}\n\nA kÃģd lejÃĄrati időpontja: {expiresAt}.\n\nHa nem te kÃĐrted ezt, lehet, hogy valaki mÃĄs is hozzÃĄfÃĐr a fiÃģkodhoz. Azonnal vÃĄltoztasd meg a jelszavadat, ÃĐs kapcsold be a kÃĐtlÃĐpcsős azonosítÃĄst.\n\n– {product_name} csapata"
},
"password_reset": {
"subject": "A {product_name} jelszÃģ visszaÃĄllítÃĄsa",
"body": "Szia {username},\n\n{product_name} jelszÃģ visszaÃĄllítÃĄsÃĄt kÃĐrted. HasznÃĄld az alÃĄbbi linket Új jelszÃģ beÃĄllítÃĄsÃĄhoz:\n\n{resetUrl}\n\nHa nem kÃĐrted ezt, nyugodtan figyelmen kívÞl hagyhatod ezt az e-mailt.\n\nEz a link 1 ÃģrÃĄig ÃĐrvÃĐnyes.\n\n– {product_name} Csapat"
"subject": "Állítsd vissza {product_name}-fiÃģkod jelszavÃĄt",
"body": "Szia, {username}!\n\n{product_name}-fiÃģkod jelszavÃĄnak visszaÃĄllítÃĄsÃĄt kÃĐrted. HasznÃĄld az alÃĄbbi linket Új jelszÃģ beÃĄllítÃĄsÃĄhoz:\n\n{resetUrl}\n\nHa nem kÃĐrted ezt, nyugodtan figyelmen kívÞl hagyhatod ezt az e-mailt.\n\nEz a link 1 ÃģrÃĄig ÃĐrvÃĐnyes.\n\n– {product_name} csapata"
},
"registration_approved": {
"subject": "A {product_name} regisztrÃĄciÃģdat jÃģvÃĄhagytuk",
"body": "Szia {username},\n\nJÃģ hír: {product_name} regisztrÃĄciÃģd jÃģvÃĄhagyÃĄsra kerÞlt.\n\nMost mÃĄr bejelentkezhetsz a {product_name} alkalmazÃĄsba itt:\n{channelsUrl}\n\nÜdvÃķzlÞnk a {product_name} kÃķzÃķssÃĐgben.\n\n– {product_name} Csapat"
"subject": "JÃģvÃĄhagytuk a regisztrÃĄciÃģdat a {product_name} felÞletÃĐn",
"body": "Szia, {username}!\n\nJÃģ hír: jÃģvÃĄhagytuk a regisztrÃĄciÃģdat a {product_name} felÞletÃĐn.\n\nMost mÃĄr bejelentkezhetsz az alkalmazÃĄsba:\n{channelsUrl}\n\nÜdvÃķzlÞnk a {product_name} kÃķzÃķssÃĐgÃĐben!\n\n– {product_name} csapata"
},
"report_resolved": {
"subject": "A {product_name} jelentÃĐsedet felÞlvizsgÃĄltuk",
"body": "Szia {username},\n\nJelentÃĐsedet (azonosítÃģ: {reportId}) felÞlvizsgÃĄlta BiztonsÃĄgi Csapatunk.{hasComment, select, yes {\n\nVÃĄlasz a BiztonsÃĄgi CsapattÃģl:\n{publicComment}} other {}}\n\nKÃķszÃķnjÞk, hogy segítesz a {product_name} biztonsÃĄgos megőrzÃĐsÃĐben mindenki szÃĄmÃĄra. Minden jelentÃĐst komolyan veszÞnk, ÃĐs nagyra ÃĐrtÃĐkeljÞk a kÃķzÃķssÃĐghez valÃģ hozzÃĄjÃĄrulÃĄsodat.\n\nHa bÃĄrmilyen kÃĐrdÃĐsed vagy aggÃĄlyod van ezzel az eredmÃĐnnyel kapcsolatban, vedd fel a kapcsolatot a {safety_email} címen.\n\n– {product_name} BiztonsÃĄgi Csapat"
"subject": "ElbírÃĄltuk a {product_name} felÞletÃĐn tett bejelentÃĐsedet",
"body": "Szia, {username}!\n\nBiztonsÃĄgi csapatunk elbírÃĄlta a bejelentÃĐsedet (azonosítÃģ: {reportId}).{hasComment, select, yes {\n\nA biztonsÃĄgi csapat vÃĄlasza:\n{publicComment}} other {}}\n\nKÃķszÃķnjÞk, hogy segítesz mindenki szÃĄmÃĄra biztonsÃĄgossÃĄ tenni a {product_name} kÃķzÃķssÃĐgÃĐt. Minden bejelentÃĐst komolyan veszÞnk, ÃĐs nagyra ÃĐrtÃĐkeljÞk, hogy segíted a kÃķzÃķssÃĐget.\n\nHa kÃĐrdÃĐsed vagy aggÃĄlyod van az eredmÃĐnnyel kapcsolatban, írj erre a címre: {safety_email}.\n\n– {product_name} biztonsÃĄgi csapata"
},
"scheduled_deletion_notification": {
"subject": "{product_name} fiÃģkod vÃĐglegesen tÃķrÃķlve lesz",
"body": "Szia {username},\n\nA {product_name} fiÃģkod vÃĐgleges tÃķrlÃĐsre van Þtemezve.\n\nTervezett tÃķrlÃĐs: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Indok: {reason}}\n}\n\nEz egy komoly vÃĐgrehajtÃĄsi intÃĐzkedÃĐs. FiÃģkod adatai a tervezett dÃĄtumon vÃĐglegesen tÃķrÃķlve lesznek.\n\nHa Úgy gondolod, hogy ez a vÃĐgrehajtÃĄsi dÃķntÃĐs helytelen volt, fellebbezÃĐst nyÚjthatsz be. KÞldj e-mailt az {appeals_email} címre erről az e-mail címről.\n\n– {product_name} BiztonsÃĄgi Csapat"
"subject": "{product_name}-fiÃģkodat vÃĐglegesen tÃķrÃķlni fogjuk",
"body": "Szia, {username}!\n\nÜtemeztÞk {product_name}-fiÃģkod vÃĐgleges tÃķrlÃĐsÃĐt.\n\nA tÃķrlÃĐs tervezett időpontja: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Indok: {reason}}\n}\n\nEz sÚlyos moderÃĄciÃģs intÃĐzkedÃĐs. FiÃģkod adatait a megadott időpontban vÃĐglegesen tÃķrÃķljÞk.\n\nHa Úgy gondolod, hogy ez a dÃķntÃĐs hibÃĄs volt, fellebbezhetsz. Erről az e-mail-címről írj a kÃķvetkező címre: {appeals_email}.\n\n– {product_name} biztonsÃĄgi csapata"
},
"self_deletion_scheduled": {
"subject": "A {product_name} fiÃģkod tÃķrlÃĐsÃĐt ÞtemeztÞk",
"body": "Szia {username},\n\nKÃĐrted a {product_name} fiÃģkod tÃķrlÃĐsÃĐt. FiÃģkod vÃĐgleges tÃķrlÃĐse a kÃķvetkező időpontra van Þtemezve:\n\n{deletionDate, date, full} {deletionDate, time, short}\n\nHa nem te kÃĐrted ezt, jelentkezz be a fiÃģkodba a tÃķrlÃĐs visszavonÃĄsÃĄhoz. Javasoljuk tovÃĄbbÃĄ, hogy vÃĄltoztasd meg a jelszavadat a fiÃģkod biztonsÃĄgÃĄnak megőrzÃĐse ÃĐrdekÃĐben.\n\n– {product_name} Csapat"
"subject": "ÜtemeztÞk {product_name}-fiÃģkod tÃķrlÃĐsÃĐt",
"body": "Szia, {username}!\n\nKÃĐrted a {product_name}-fiÃģkod tÃķrlÃĐsÃĐt. FiÃģkod vÃĐgleges tÃķrlÃĐse a kÃķvetkező időpontra van Þtemezve:\n\n{deletionDate, date, full} {deletionDate, time, short}\n\nHa nem te kÃĐrted ezt, jelentkezz be a fiÃģkodba a tÃķrlÃĐs visszavonÃĄsÃĄhoz. Javasoljuk tovÃĄbbÃĄ, hogy vÃĄltoztasd meg a jelszavadat a fiÃģkod biztonsÃĄgÃĄnak megőrzÃĐse ÃĐrdekÃĐben.\n\n– {product_name} csapata"
},
"unban_notification": {
"subject": "A {product_name} fiÃģkod felfÞggesztÃĐsÃĐt feloldottuk",
"body": "Szia {username},\n\nJÃģ hír: {product_name} fiÃģkod felfÞggesztÃĐse feloldÃĄsra kerÞlt.\n\n{reason, select,\n null {}\n other {Indok: {reason}}\n}\n\nMost mÃĄr Újra bejelentkezhetsz, ÃĐs a szokÃĄsos mÃģdon hasznÃĄlhatod a {product_name} alkalmazÃĄst.\n\n– {product_name} BiztonsÃĄgi Csapat"
"subject": "Feloldottuk {product_name}-fiÃģkod felfÞggesztÃĐsÃĐt",
"body": "Szia, {username}!\n\nJÃģ hír: feloldottuk {product_name}-fiÃģkod felfÞggesztÃĐsÃĐt.\n\n{reason, select,\n null {}\n other {Indok: {reason}}\n}\n\nMost mÃĄr Újra bejelentkezhetsz, ÃĐs a megszokott mÃģdon hasznÃĄlhatod a {product_name} alkalmazÃĄst.\n\n– {product_name} biztonsÃĄgi csapata"
}
});
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_ID_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Akun {product_name}mu telah dinonaktifkan sementara",
"body": "Halo {username},\n\nKami menonaktifkan sementara akun {product_name}mu karena kami mendeteksi aktivitas mencurigakan.\n\n{reason, select,\n null {}\n other {Alasan: {reason}}\n}\n\nUntuk mendapatkan kembali akses ke akunmu, kamu perlu mengatur ulang kata sandimu:\n\n{forgotUrl}\n\nSetelah kamu mengatur ulang kata sandimu, kamu akan bisa masuk lagi.\n\nKalau kamu merasa ini salah, hubungi tim dukungan kami.\n\n– Tim Keamanan {product_name}"
"subject": "Akun {product_name} kamu telah dinonaktifkan sementara",
"body": "Halo {username},\n\nKami menonaktifkan sementara akun {product_name} kamu karena kami mendeteksi aktivitas mencurigakan.\n\n{reason, select,\n null {}\n other {Alasan: {reason}}\n}\n\nUntuk mendapatkan kembali akses ke akunmu, kamu perlu mengatur ulang kata sandimu:\n\n{forgotUrl}\n\nSetelah mengatur ulang kata sandi, kamu bisa masuk lagi.\n\nJika kamu merasa ini keliru, silakan hubungi tim dukungan kami.\n\n– Tim Keamanan {product_name}"
},
"account_scheduled_deletion": {
"subject": "Akun {product_name}mu akan dihapus secara permanen",
"body": "Halo {username},\n\nAkun {product_name}mu telah dijadwalkan untuk dihapus permanen karena melanggar Ketentuan Layanan atau Pedoman Komunitas kami.\n\nPenghapusan terjadwal: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Alasan: {reason}}\n}\n\nIni tindakan serius. Data akunmu akan dihapus permanen pada tanggal yang dijadwalkan.\n\nTinjau:\n- Ketentuan Layanan: {termsUrl}\n- Pedoman Komunitas: {guidelinesUrl}\n\nProses banding:\nJika kamu yakin keputusan ini keliru atau tidak beralasan, kamu punya 60 hari untuk mengajukan banding. Kirim email ke {appeals_email} dari alamat email ini.\n\nDalam bandingmu:\n- Jelaskan dengan jelas kenapa kamu yakin keputusan ini keliru atau tidak beralasan\n- Berikan bukti atau konteks yang relevan\n\nAnggota Tim Keamanan {product_name} akan meninjau bandingmu dan bisa menunda penghapusan sampai keputusan akhir tercapai.\n\n– Tim Keamanan {product_name}"
"subject": "Akun {product_name} kamu akan dihapus secara permanen",
"body": "Halo {username},\n\nAkun {product_name} kamu telah dijadwalkan untuk dihapus permanen karena melanggar Ketentuan Layanan atau Pedoman Komunitas kami.\n\nPenghapusan terjadwal: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Alasan: {reason}}\n}\n\nIni adalah tindakan penegakan yang serius. Data akunmu akan dihapus permanen pada tanggal yang dijadwalkan.\n\nSilakan tinjau:\n- Ketentuan Layanan: {termsUrl}\n- Pedoman Komunitas: {guidelinesUrl}\n\nProses banding:\nJika kamu yakin keputusan ini keliru atau tidak beralasan, kamu punya 60 hari untuk mengajukan banding. Kirim email ke {appeals_email} dari alamat email ini.\n\nDalam bandingmu:\n- Uraikan dengan jelas kenapa kamu yakin keputusan ini keliru atau tidak beralasan\n- Berikan bukti atau konteks yang relevan\n\nAnggota Tim Keamanan {product_name} akan meninjau bandingmu dan bisa menunda penghapusan sampai keputusan akhir tercapai.\n\n– Tim Keamanan {product_name}"
},
"account_temp_banned": {
"subject": "Akun {product_name}mu telah ditangguhkan sementara",
"body": "Halo {username},\n\nAkun {product_name}mu telah ditangguhkan sementara karena melanggar Ketentuan Layanan atau Pedoman Komunitas kami.\n\nDurasi: {durationHours, plural,\n =1 {1 jam}\n other {# jam}\n}\nDitangguhkan hingga: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Alasan: {reason}}\n}\n\nSelama waktu ini, kamu tidak akan bisa mengakses akunmu.\n\nTinjau:\n- Ketentuan Layanan: {termsUrl}\n- Pedoman Komunitas: {guidelinesUrl}\n\nJika kamu yakin keputusan ini keliru atau tidak beralasan, kamu bisa mengajukan banding. Kirim email ke {appeals_email} dari alamat email ini dan jelaskan dengan jelas kenapa kamu yakin keputusan ini salah. Kami akan meninjau bandingmu dan menanggapi dengan keputusan kami.\n\n– Tim Keamanan {product_name}"
"subject": "Akun {product_name} kamu telah ditangguhkan sementara",
"body": "Halo {username},\n\nAkun {product_name} kamu telah ditangguhkan sementara karena melanggar Ketentuan Layanan atau Pedoman Komunitas kami.\n\nDurasi: {durationHours, plural,\n =1 {1 jam}\n other {# jam}\n}\nDitangguhkan hingga: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Alasan: {reason}}\n}\n\nSelama waktu ini, kamu tidak akan bisa mengakses akunmu.\n\nSilakan tinjau:\n- Ketentuan Layanan: {termsUrl}\n- Pedoman Komunitas: {guidelinesUrl}\n\nJika kamu yakin keputusan ini keliru atau tidak beralasan, kamu bisa mengajukan banding. Kirim email ke {appeals_email} dari alamat email ini dan uraikan dengan jelas kenapa kamu yakin keputusan ini keliru. Kami akan meninjau bandingmu dan menyampaikan keputusan kami.\n\n– Tim Keamanan {product_name}"
},
"donation_confirmation": {
"subject": "Terima kasih atas donasi {product_name}mu",
"body": "Halo,\n\nTerima kasih atas donasimu ke {product_name}! Donasi {interval, select,\n month {berulang}\n year {berulang}\n other {satu kali}\n}mu telah berhasil {interval, select,\n month {diatur}\n year {diatur}\n other {diproses}\n}.\n\nDetail donasi:\nJumlah: {amount} {currency} {interval, select,\n month {per bulan}\n year {per tahun}\n other {}\n}\n\nStripe akan mengirimkan email tanda terima terpisah dengan PDF fakturmu segera. Ini mencakup semua detail pembayaran dan bisa dipakai untuk keperluan pajak.\n\nKamu bisa lihat riwayat donasimu, unduh faktur, {interval, select,\n month {dan kelola atau batalkan langgananmu}\n year {dan kelola atau batalkan langgananmu}\n other {dan kelola donasi di masa depan}\n} kapan saja menggunakan tautan ini:\n\n{manageUrl}\n\nDonasimu membantu {product_name} tetap jalan. Terima kasih!\n\n– Tim {product_name}"
"subject": "Terima kasih atas donasimu untuk {product_name}",
"body": "Halo,\n\nTerima kasih atas donasimu untuk {product_name}! Donasi {interval, select,\n month {berulang}\n year {berulang}\n other {satu kali}\n} kamu telah berhasil {interval, select,\n month {diatur}\n year {diatur}\n other {diproses}\n}.\n\nDetail donasi:\nJumlah: {amount} {interval, select,\n month {per bulan}\n year {per tahun}\n other {}\n}\n\nStripe akan segera mengirimi kamu email tanda terima terpisah beserta PDF fakturmu. Ini mencakup semua detail pembayaran dan bisa dipakai untuk keperluan pajak.\n\nKamu bisa melihat riwayat donasimu, mengunduh faktur, {interval, select,\n month {dan mengelola atau membatalkan langgananmu}\n year {dan mengelola atau membatalkan langgananmu}\n other {dan mengelola donasi di masa mendatang}\n} kapan saja lewat tautan ini:\n\n{manageUrl}\n\nDukunganmu membantu {product_name} tetap berjalan. Terima kasih!\n\n– Tim {product_name}"
},
"donation_magic_link": {
"subject": "Kelola donasi {product_name}mu",
"body": "Halo,\n\nKlik tautan di bawah untuk mengakses portal donaturmu:\n\n{manageUrl}\n\nDi portal, kamu bisa kelola langganan, unduh faktur, dan lihat riwayat donasimu.\n\nTautan ini kedaluwarsa pada {expiresAt, date, full} pukul {expiresAt, time, short}.\n\nKalau kamu tidak meminta tautan ini, kamu bisa mengabaikan email ini.\n\n– Tim {product_name}"
"subject": "Kelola donasimu untuk {product_name}",
"body": "Halo,\n\nKlik tautan di bawah untuk mengakses portal donaturmu:\n\n{manageUrl}\n\nDi portal itu, kamu bisa mengelola langganan, mengunduh faktur, dan melihat riwayat donasimu.\n\nTautan ini kedaluwarsa pada {expiresAt, date, full} pukul {expiresAt, time, short}.\n\nJika kamu tidak meminta tautan ini, kamu bisa mengabaikan email ini dengan aman.\n\n– Tim {product_name}"
},
"dsa_report_verification": {
"subject": "Verifikasi emailmu untuk laporan DSA",
"body": "Halo,\n\nGunakan kode verifikasi di bawah ini untuk mengirimkan laporan Digital Services Actmu di {product_name}:\n\n{code}\n\nKode ini kedaluwarsa pada {expiresAt, date, full} pukul {expiresAt, time, short}.\n\nKalau kamu tidak meminta ini, kamu bisa abaikan email ini.\n\n– Tim Keamanan {product_name}"
"body": "Halo,\n\nGunakan kode verifikasi di bawah ini untuk mengirimkan laporan Digital Services Act kamu di {product_name}:\n\n{code}\n\nKode ini kedaluwarsa pada {expiresAt, date, full} pukul {expiresAt, time, short}.\n\nJika kamu tidak meminta ini, kamu bisa mengabaikan email ini.\n\n– Tim Keamanan {product_name}"
},
"email_change_new": {
"subject": "Verifikasi email {product_name} barumu",
"body": "Halo {username},\n\nMasukkan kode ini di aplikasi untuk memverifikasi email {product_name} barumu:\n\n{code}\n\nKode ini kedaluwarsa pada {expiresAt, date, full} pukul {expiresAt, time, short}.\n\nKalau kamu tidak meminta ini, kamu bisa abaikan email ini.\n\n– Tim {product_name}"
"body": "Halo {username},\n\nMasukkan kode ini di aplikasi untuk memverifikasi email {product_name} barumu:\n\n{code}\n\nKode ini kedaluwarsa pada {expiresAt, date, full} pukul {expiresAt, time, short}.\n\nJika kamu tidak meminta ini, kamu bisa mengabaikan email ini.\n\n– Tim {product_name}"
},
"email_change_original": {
"subject": "Konfirmasi perubahan email {product_name}mu",
"body": "Halo {username},\n\nKami menerima permintaan untuk mengubah alamat email di akun {product_name}mu.\n\nUntuk mengonfirmasi perubahan ini, masukkan kode ini di aplikasi:\n\n{code}\n\nKode ini kedaluwarsa pada {expiresAt, date, full} pukul {expiresAt, time, short}.\n\nJika kamu tidak meminta ini, segera amankan akunmu.\n\n– Tim {product_name}"
"subject": "Konfirmasi perubahan email {product_name} kamu",
"body": "Halo {username},\n\nKami menerima permintaan untuk mengubah alamat email di akun {product_name} kamu.\n\nUntuk mengonfirmasi perubahan ini, masukkan kode ini di aplikasi:\n\n{code}\n\nKode ini kedaluwarsa pada {expiresAt, date, full} pukul {expiresAt, time, short}.\n\nJika kamu tidak meminta ini, segera amankan akunmu.\n\n– Tim {product_name}"
},
"email_change_revert": {
"subject": "Email {product_name}mu telah diubah",
"body": "Halo {username},\n\nAlamat email di akun {product_name}mu telah diubah menjadi {newEmail}.\n\nKalau kamu yang melakukan perubahan ini, tidak perlu lakukan apa pun. Jika bukan kamu yang melakukan ini, kamu bisa batalkan perubahan dan amankan akunmu menggunakan tautan ini:\n\n{revertUrl}\n\nIni akan mengembalikan emailmu sebelumnya, mengeluarkan kamu dari semua perangkat, hapus nomor telepon yang tertaut, nonaktifkan MFA, dan mewajibkan kamu untuk atur kata sandi baru.\n\n– Tim Keamanan {product_name}"
"subject": "Email {product_name} kamu telah diubah",
"body": "Halo {username},\n\nAlamat email di akun {product_name} kamu telah diubah menjadi {newEmail}.\n\nJika ini memang kamu, tidak ada yang perlu dilakukan. Jika bukan, kamu bisa membatalkan perubahan itu dan mengamankan akunmu lewat tautan ini:\n\n{revertUrl}\n\nTindakan ini akan mengembalikan email lamamu, mengeluarkanmu dari semua perangkat, menghapus nomor telepon yang tertaut, menonaktifkan MFA, dan mengharuskanmu membuat kata sandi baru.\n\n– Tim Keamanan {product_name}"
},
"email_verification": {
"subject": "Verifikasi alamat email {product_name}mu",
"body": "Halo {username},\n\nVerifikasi alamat email untuk akun {product_name}mu dengan mengeklik tautan di bawah ini:\n\n{verifyUrl}\n\nKalau kamu tidak membuat akun {product_name}, kamu bisa abaikan email ini dengan aman.\n\nTautan ini berlaku selama 24 jam.\n\n– Tim {product_name}"
"subject": "Verifikasi alamat email {product_name} kamu",
"body": "Halo {username},\n\nSilakan verifikasi alamat email untuk akun {product_name} kamu dengan mengeklik tautan di bawah ini:\n\n{verifyUrl}\n\nJika kamu tidak membuat akun {product_name}, kamu bisa mengabaikan email ini dengan aman.\n\nTautan ini berlaku selama 24 jam.\n\n– Tim {product_name}"
},
"gift_chargeback_notification": {
"subject": "Manfaat dari hadiah yang kamu tukarkan telah dihapus",
"body": "Halo {username},\n\nKode hadiah yang kamu tukarkan awalnya dibayar oleh orang lain. Pembayaran itu sudah dibatalkan (chargeback).\n\nKarena ini, kami sudah hapus manfaat yang ditambahkan ke akunmu saat kamu menukarkan hadiah itu.\n\nJika kamu merasa ini adalah kesalahan, hubungi tim dukungan kami dan sertakan detail apa pun yang kamu miliki tentang kode hadiah dan kapan kamu menukarkannya.\n\n– Tim {product_name}"
"body": "Halo {username},\n\nKode hadiah yang kamu tukarkan awalnya dibayar oleh orang lain. Pembayaran itu kemudian dibatalkan (chargeback).\n\nKarena itu, kami menghapus manfaat yang ditambahkan ke akunmu saat kamu menukarkan hadiah tersebut.\n\nJika kamu merasa ini keliru, silakan hubungi tim dukungan kami dan sertakan detail apa pun yang kamu punya tentang kode hadiah itu dan kapan kamu menukarkannya.\n\n– Tim {product_name}"
},
"harvest_completed": {
"subject": "Ekspor data {product_name}mu siap diunduh",
"subject": "Ekspor data {product_name} kamu siap diunduh",
"body": "Halo {username},\n\nEkspor datamu sudah siap.\n\nTautan unduh:\n{downloadUrl}\n\nPesan yang disertakan: {totalMessages, number}\nUkuran file: {fileSizeMB, number} MB\n\nTautan ini kedaluwarsa pada {expiresAt, date, full} pukul {expiresAt, time, short}.\n\nJika kamu tidak meminta ekspor ini, segera ubah kata sandimu dan hubungi tim dukungan kami.\n\n– Tim {product_name}"
},
"inactivity_warning": {
"subject": "Akun {product_name}mu akan dihapus karena tidak aktif",
"body": "Halo {username},\n\nKami belum melihat aktivitas apa pun di akun {product_name}mu sejak {lastActiveDate, date, full}.\n\nJika kamu tidak masuk sebelum {deletionDate, date, full} pukul {deletionDate, time, short}, akunmu akan dihapus permanen karena tidak aktif.\n\nMasuk di sini:\n{loginUrl}\n\nJika kamu baru saja menggunakan {product_name}, segera hubungi tim dukungan kami.\n\n– Tim {product_name}"
"subject": "Akun {product_name} kamu akan dihapus karena tidak aktif",
"body": "Halo {username},\n\nKami belum melihat aktivitas apa pun di akun {product_name} kamu sejak {lastActiveDate, date, full}.\n\nJika kamu tidak masuk sebelum {deletionDate, date, full} pukul {deletionDate, time, short}, akunmu akan dihapus permanen karena tidak aktif.\n\nMasuk di sini:\n{loginUrl}\n\nJika kamu baru saja menggunakan {product_name}, segera hubungi tim dukungan kami.\n\n– Tim {product_name}"
},
"ip_authorization": {
"subject": "Otorisasi masuk dari alamat IP barumu",
"body": "Halo {username},\n\nKami mendeteksi upaya masuk ke akun {product_name}mu dari alamat IP baru:\n\nAlamat IP: {ipAddress}\nLokasi: {location}\n\nKalau ini kamu, otorisasi alamat IP ini dengan mengeklik tautan di bawah ini:\n\n{authUrl}\n\nJika kamu tidak mencoba masuk, segera ubah kata sandimu.\n\nTautan ini berlaku selama 30 menit.\n\n– Tim {product_name}"
"subject": "Otorisasi masuk dari alamat IP baru",
"body": "Halo {username},\n\nKami mendeteksi upaya masuk ke akun {product_name} kamu dari alamat IP baru:\n\nAlamat IP: {ipAddress}\nLokasi: {location}\n\nJika ini memang kamu, silakan otorisasi alamat IP ini dengan mengeklik tautan di bawah ini:\n\n{authUrl}\n\nJika kamu tidak mencoba masuk, segera ubah kata sandimu.\n\nTautan ini berlaku selama 30 menit.\n\n– Tim {product_name}"
},
"mfa_backup_codes_view": {
"subject": "Konfirmasi akses ke kode cadangan {product_name}mu",
"body": "Halo {username},\n\nKami menerima permintaan untuk melihat kode cadangan di akun {product_name}mu.\n\nUntuk mengonfirmasi permintaan ini, masukkan kode ini di aplikasi:\n\n{code}\n\nKode ini kedaluwarsa pada {expiresAt, date, full} pukul {expiresAt, time, short}.\n\nJika kamu tidak meminta ini, seseorang mungkin punya akses ke akunmu. Ubah kata sandimu segera.\n\n– Tim {product_name}"
"subject": "Konfirmasi akses ke kode cadangan {product_name} kamu",
"body": "Halo {username},\n\nKami menerima permintaan untuk melihat kode cadangan di akun {product_name} kamu.\n\nUntuk mengonfirmasi permintaan ini, masukkan kode ini di aplikasi:\n\n{code}\n\nKode ini kedaluwarsa pada {expiresAt, date, full} pukul {expiresAt, time, short}.\n\nJika kamu tidak meminta ini, seseorang mungkin punya akses ke akunmu. Ubah kata sandimu segera.\n\n– Tim {product_name}"
},
"password_change_verification": {
"subject": "Konfirmasi perubahan kata sandi {product_name}mu",
"body": "Halo {username},\n\nKami menerima permintaan untuk mengubah kata sandi di akun {product_name}mu.\n\nUntuk mengonfirmasi perubahan ini, masukkan kode ini di aplikasi:\n\n{code}\n\nKode ini kedaluwarsa pada {expiresAt}.\n\nJika kamu tidak meminta ini, seseorang mungkin punya akses ke akunmu. Ubah kata sandimu segera dan aktifkan autentikasi dua faktor.\n\n– Tim {product_name}"
"subject": "Konfirmasi perubahan kata sandi {product_name} kamu",
"body": "Halo {username},\n\nKami menerima permintaan untuk mengubah kata sandi di akun {product_name} kamu.\n\nUntuk mengonfirmasi perubahan ini, masukkan kode ini di aplikasi:\n\n{code}\n\nKode ini kedaluwarsa pada {expiresAt}.\n\nJika kamu tidak meminta ini, seseorang mungkin punya akses ke akunmu. Ubah kata sandimu segera dan aktifkan autentikasi dua faktor.\n\n– Tim {product_name}"
},
"password_reset": {
"subject": "Atur ulang kata sandi {product_name}mu",
"body": "Halo {username},\n\nKamu meminta pengaturan ulang kata sandi {product_name}. Gunakan tautan di bawah ini untuk atur kata sandi baru:\n\n{resetUrl}\n\nJika kamu tidak meminta ini, kamu bisa abaikan email ini dengan aman.\n\nTautan ini berlaku selama 1 jam.\n\n– Tim {product_name}"
"subject": "Atur ulang kata sandi {product_name} kamu",
"body": "Halo {username},\n\nKamu meminta pengaturan ulang kata sandi {product_name}. Gunakan tautan di bawah ini untuk mengatur kata sandi baru:\n\n{resetUrl}\n\nJika kamu tidak meminta ini, kamu bisa mengabaikan email ini dengan aman.\n\nTautan ini berlaku selama 1 jam.\n\n– Tim {product_name}"
},
"registration_approved": {
"subject": "Pendaftaran {product_name}mu telah disetujui",
"body": "Halo {username},\n\nKabar baik: pendaftaran {product_name}mu telah disetujui.\n\nKamu sekarang bisa masuk ke aplikasi {product_name} lewat sini:\n{channelsUrl}\n\nSelamat datang di komunitas {product_name}.\n\n– Tim {product_name}"
"subject": "Pendaftaranmu di {product_name} telah disetujui",
"body": "Halo {username},\n\nKabar baik: pendaftaranmu di {product_name} telah disetujui.\n\nKamu sekarang bisa masuk ke aplikasi {product_name} di sini:\n{channelsUrl}\n\nSelamat datang di komunitas {product_name}.\n\n– Tim {product_name}"
},
"report_resolved": {
"subject": "Laporan {product_name}mu telah ditinjau",
"body": "Halo {username},\n\nLaporanmu (ID: {reportId}) telah ditinjau oleh Tim Keamanan kami.{hasComment, select, yes {\n\nTanggapan dari Tim Keamanan:\n{publicComment}} other {}}\n\nTerima kasih telah membantu menjaga {product_name} tetap aman untuk semua orang. Kami menanggapi semua laporan dengan serius dan menghargai kontribusimu ke komunitas.\n\nKalau kamu punya pertanyaan atau kekhawatiran tentang hasil ini, hubungi {safety_email}.\n\n– Tim Keamanan {product_name}"
"subject": "Laporanmu di {product_name} telah ditinjau",
"body": "Halo {username},\n\nLaporanmu (ID: {reportId}) telah ditinjau oleh Tim Keamanan kami.{hasComment, select, yes {\n\nTanggapan dari Tim Keamanan:\n{publicComment}} other {}}\n\nTerima kasih telah membantu menjaga {product_name} tetap aman untuk semua orang. Kami menanggapi semua laporan dengan serius dan menghargai kontribusimu bagi komunitas.\n\nJika kamu punya pertanyaan atau kekhawatiran tentang hasil ini, silakan hubungi {safety_email}.\n\n– Tim Keamanan {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Akun {product_name}mu akan dihapus secara permanen",
"body": "Halo {username},\n\nAkun {product_name}mu telah dijadwalkan untuk dihapus permanen.\n\nPenghapusan terjadwal: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Alasan: {reason}}\n}\n\nIni tindakan serius. Data akunmu akan dihapus permanen pada tanggal yang dijadwalkan.\n\nJika kamu yakin keputusan ini keliru, kamu bisa ajukan banding. Kirim email ke {appeals_email} dari alamat email ini.\n\n– Tim Keamanan {product_name}"
"subject": "Akun {product_name} kamu akan dihapus secara permanen",
"body": "Halo {username},\n\nAkun {product_name} kamu telah dijadwalkan untuk dihapus permanen.\n\nPenghapusan terjadwal: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Alasan: {reason}}\n}\n\nIni adalah tindakan penegakan yang serius. Data akunmu akan dihapus permanen pada tanggal yang dijadwalkan.\n\nJika kamu yakin keputusan ini keliru, kamu bisa mengajukan banding. Kirim email ke {appeals_email} dari alamat email ini.\n\n– Tim Keamanan {product_name}"
},
"self_deletion_scheduled": {
"subject": "Penghapusan akun {product_name}mu dijadwalkan",
"body": "Halo {username},\n\nKamu meminta penghapusan akun {product_name}mu. Akunmu dijadwalkan untuk dihapus permanen pada:\n\n{deletionDate, date, full} pukul {deletionDate, time, short}\n\nJika kamu tidak meminta ini, masuk ke akunmu untuk membatalkan penghapusan. Kami juga menyarankan untuk mengubah kata sandimu untuk mengamankan akunmu.\n\n– Tim {product_name}"
"subject": "Penghapusan akun {product_name} kamu telah dijadwalkan",
"body": "Halo {username},\n\nKamu meminta agar akun {product_name} kamu dihapus. Akunmu dijadwalkan untuk dihapus permanen pada:\n\n{deletionDate, date, full} pukul {deletionDate, time, short}\n\nJika kamu tidak meminta ini, masuk ke akunmu untuk membatalkan penghapusan. Kami juga menyarankan kamu mengubah kata sandi agar akunmu tetap aman.\n\n– Tim {product_name}"
},
"unban_notification": {
"subject": "Penangguhan akun {product_name}mu telah dicabut",
"body": "Halo {username},\n\nKabar baik: penangguhan akun {product_name}mu telah dicabut.\n\n{reason, select,\n null {}\n other {Alasan: {reason}}\n}\n\nKamu sekarang bisa masuk lagi dan terus menggunakan {product_name} seperti biasa.\n\n– Tim Keamanan {product_name}"
"subject": "Penangguhan akun {product_name} kamu telah dicabut",
"body": "Halo {username},\n\nKabar baik: penangguhan akun {product_name} kamu telah dicabut.\n\n{reason, select,\n null {}\n other {Alasan: {reason}}\n}\n\nKamu sekarang bisa masuk lagi dan terus menggunakan {product_name} seperti biasa.\n\n– Tim Keamanan {product_name}"
}
});
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_IT_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Il tuo account {product_name} ÃĻ stato temporaneamente disabilitato",
"body": "Ciao {username},\n\nAbbiamo temporaneamente disabilitato il tuo account {product_name} perchÃĐ abbiamo rilevato attività sospette.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nPer riottenere l'accesso al tuo account, dovrai reimpostare la password:\n\n{forgotUrl}\n\nDopo aver reimpostato la password, potrai accedere di nuovo.\n\nSe ritieni che ciÃē sia stato fatto per errore, contatta il nostro team di supporto.\n\n– Team di Sicurezza {product_name}"
"body": "Ciao {username},\n\nAbbiamo temporaneamente disabilitato il tuo account {product_name} perchÃĐ abbiamo rilevato attività sospette.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nPer riottenere l'accesso al tuo account, dovrai reimpostare la password:\n\n{forgotUrl}\n\nDopo aver reimpostato la password, potrai accedere di nuovo.\n\nSe ritieni che ciÃē sia stato fatto per errore, contatta il nostro team di assistenza.\n\n– Il team per la sicurezza di {product_name}"
},
"account_scheduled_deletion": {
"subject": "Il tuo account {product_name} verrà eliminato definitivamente",
"body": "Ciao {username},\n\nIl tuo account {product_name} ÃĻ stato programmato per l'eliminazione permanente a causa di violazioni dei nostri Termini di Servizio o delle Linee Guida della Comunità.\n\nEliminazione programmata: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nSi tratta di un provvedimento grave. I dati del tuo account verranno eliminati definitivamente alla data programmata.\n\nConsulta:\n- Termini di Servizio: {termsUrl}\n- Linee Guida della Comunità: {guidelinesUrl}\n\nProcesso di ricorso:\nSe ritieni che questa decisione sia scorretta o ingiustificata, hai 60 giorni per presentare un ricorso. Invia un'e-mail a {appeals_email} da questo indirizzo e-mail.\n\nNel tuo ricorso:\n- Spiega chiaramente perchÃĐ ritieni che la decisione sia scorretta o ingiustificata\n- Fornisci qualsiasi prova o contesto pertinente\n\nUn membro del Team di Sicurezza {product_name} esaminerà il tuo ricorso e potrebbe sospendere l'eliminazione in corso fino a quando non sarà stata raggiunta una decisione finale.\n\n– Team di Sicurezza {product_name}"
"body": "Ciao {username},\n\nÈ stata programmata l’eliminazione definitiva del tuo account {product_name} a causa di violazioni dei nostri Termini di servizio o delle Linee guida della community.\n\nEliminazione programmata: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nSi tratta di un provvedimento grave. I dati del tuo account verranno eliminati definitivamente alla data programmata.\n\nConsulta:\n- Termini di servizio: {termsUrl}\n- Linee guida della community: {guidelinesUrl}\n\nProcedura di ricorso:\nSe ritieni che questa decisione sia scorretta o ingiustificata, hai 60 giorni per presentare un ricorso. Invia un'email a {appeals_email} da questo indirizzo email.\n\nNel tuo ricorso:\n- Spiega chiaramente perchÃĐ ritieni che la decisione sia scorretta o ingiustificata\n- Fornisci qualsiasi prova o contesto pertinente\n\nUn membro del team per la sicurezza {product_name} esaminerà il tuo ricorso e potrebbe sospendere l’eliminazione programmata fino a quando non sarà stata raggiunta una decisione finale.\n\n– Il team per la sicurezza di {product_name}"
},
"account_temp_banned": {
"subject": "Il tuo account {product_name} ÃĻ stato temporaneamente sospeso",
"body": "Ciao {username},\n\nIl tuo account {product_name} ÃĻ stato temporaneamente sospeso per aver violato i nostri Termini di Servizio o le Linee Guida della Comunità.\n\nDurata: {durationHours, plural,\n =1 {1 ora}\n other {# ore}\n}\nSospeso fino a: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nDurante questo periodo, non potrai accedere al tuo account.\n\nConsulta:\n- Termini di Servizio: {termsUrl}\n- Linee Guida della Comunità: {guidelinesUrl}\n\nSe ritieni che questa decisione sia scorretta o ingiustificata, puoi presentare un ricorso. Invia un'e-mail a {appeals_email} da questo indirizzo e-mail e spiega chiaramente perchÃĐ ritieni che la decisione sia scorretta. Esamineremo il tuo ricorso e risponderemo con la nostra decisione.\n\n– Team di Sicurezza {product_name}"
"body": "Ciao {username},\n\nIl tuo account {product_name} ÃĻ stato temporaneamente sospeso per aver violato i nostri Termini di servizio o le Linee guida della community.\n\nDurata: {durationHours, plural,\n =1 {1 ora}\n other {# ore}\n}\nSospeso fino a: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nDurante questo periodo, non potrai accedere al tuo account.\n\nConsulta:\n- Termini di servizio: {termsUrl}\n- Linee guida della community: {guidelinesUrl}\n\nSe ritieni che questa decisione sia scorretta o ingiustificata, puoi presentare un ricorso. Invia un'email a {appeals_email} da questo indirizzo email e spiega chiaramente perchÃĐ ritieni che la decisione sia scorretta. Esamineremo il tuo ricorso e risponderemo con la nostra decisione.\n\n– Il team per la sicurezza di {product_name}"
},
"donation_confirmation": {
"subject": "Grazie per la tua donazione a {product_name}",
"body": "Ciao,\n\nGrazie per la tua donazione a {product_name}! La tua {interval, select,\n month {donazione ricorrente}\n year {donazione ricorrente}\n other {donazione una tantum}\n} ÃĻ stata {interval, select,\n month {impostata}\n year {impostata}\n other {elaborata}\n} con successo.\n\nDettagli della donazione:\nImporto: {amount} {currency} {interval, select,\n month {al mese}\n year {all'anno}\n other {}\n}\n\nStripe ti invierà a breve una ricevuta separata con la tua fattura in PDF. Questa include tutti i dettagli del pagamento e puÃē essere utilizzata a fini fiscali.\n\nPuoi visualizzare la cronologia delle tue donazioni, scaricare le fatture, {interval, select,\n month {e gestire o annullare il tuo abbonamento}\n year {e gestire o annullare il tuo abbonamento}\n other {e gestire le future donazioni}\n} in qualsiasi momento utilizzando questo link:\n\n{manageUrl}\n\nIl tuo supporto aiuta a mantenere {product_name} in funzione. Grazie!\n\n– Team {product_name}"
"body": "Ciao,\n\nGrazie per la tua donazione a {product_name}! La tua {interval, select,\n month {donazione ricorrente}\n year {donazione ricorrente}\n other {donazione una tantum}\n} ÃĻ stata {interval, select,\n month {attivata}\n year {attivata}\n other {elaborata}\n} con successo.\n\nDettagli della donazione:\nImporto: {amount} {interval, select,\n month {al mese}\n year {all'anno}\n other {}\n}\n\nStripe ti invierà a breve una ricevuta separata con la tua fattura in PDF. Questa include tutti i dettagli del pagamento e puÃē essere utilizzata a fini fiscali.\n\nPuoi visualizzare la cronologia delle tue donazioni, scaricare le fatture {interval, select,\n month {e gestire o disdire il tuo abbonamento}\n year {e gestire o disdire il tuo abbonamento}\n other {e gestire le future donazioni}\n} in qualsiasi momento utilizzando questo link:\n\n{manageUrl}\n\nIl tuo supporto aiuta a mantenere {product_name} in funzione. Grazie!\n\n– Il team di {product_name}"
},
"donation_magic_link": {
"subject": "Gestisci le tue donazioni a {product_name}",
"body": "Ciao,\n\nClicca sul link qui sotto per accedere al tuo portale donatori:\n\n{manageUrl}\n\nNel portale, puoi gestire gli abbonamenti, scaricare le fatture e visualizzare la cronologia delle tue donazioni.\n\nQuesto link scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questo link, puoi ignorare tranquillamente questa email.\n\n– Team {product_name}"
"body": "Ciao,\n\nClicca sul link qui sotto per accedere al tuo portale donatori:\n\n{manageUrl}\n\nNel portale, puoi gestire gli abbonamenti, scaricare le fatture e visualizzare la cronologia delle tue donazioni.\n\nQuesto link scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questo link, puoi ignorare tranquillamente questa email.\n\n– Il team di {product_name}"
},
"dsa_report_verification": {
"subject": "Verifica la tua e-mail per una segnalazione DSA",
"body": "Ciao,\n\nUsa il codice di verifica qui sotto per inviare la tua segnalazione DSA su {product_name}:\n\n{code}\n\nQuesto codice scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questa operazione, puoi ignorare questa email.\n\n– Team di Sicurezza {product_name}"
"subject": "Verifica la tua email per una segnalazione DSA",
"body": "Ciao,\n\nUsa il codice di verifica qui sotto per inviare la tua segnalazione ai sensi del Digital Services Act su {product_name}:\n\n{code}\n\nQuesto codice scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questa operazione, puoi ignorare questa email.\n\n– Il team per la sicurezza di {product_name}"
},
"email_change_new": {
"subject": "Verifica la tua nuova e-mail di {product_name}",
"body": "Ciao {username},\n\nInserisci questo codice nell'app per verificare la tua nuova e-mail di {product_name}:\n\n{code}\n\nQuesto codice scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questa operazione, puoi ignorare questa e-mail.\n\n– Team {product_name}"
"subject": "Verifica il tuo nuovo indirizzo email su {product_name}",
"body": "Ciao {username},\n\nInserisci questo codice nell'app per verificare il tuo nuovo indirizzo email su {product_name}:\n\n{code}\n\nQuesto codice scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questa operazione, puoi ignorare questa email.\n\n– Il team di {product_name}"
},
"email_change_original": {
"subject": "Conferma la modifica della tua e-mail di {product_name}",
"body": "Ciao {username},\n\nAbbiamo ricevuto una richiesta di modifica dell'indirizzo e-mail del tuo account {product_name}.\n\nPer confermare questa modifica, inserisci questo codice nell'app:\n\n{code}\n\nQuesto codice scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questa operazione, metti subito in sicurezza il tuo account.\n\n– Team {product_name}"
"subject": "Conferma la modifica della tua email di {product_name}",
"body": "Ciao {username},\n\nAbbiamo ricevuto una richiesta di modifica dell'indirizzo email del tuo account {product_name}.\n\nPer confermare questa modifica, inserisci questo codice nell'app:\n\n{code}\n\nQuesto codice scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questa operazione, metti subito in sicurezza il tuo account.\n\n– Il team di {product_name}"
},
"email_change_revert": {
"subject": "La tua e-mail {product_name} ÃĻ stata modificata",
"body": "Ciao {username},\n\nL'indirizzo e-mail del tuo account {product_name} ÃĻ stato modificato in {newEmail}.\n\nSe hai effettuato questa modifica, non ÃĻ necessaria alcuna azione. In caso contrario, puoi annullare la modifica e mettere in sicurezza il tuo account utilizzando questo link:\n\n{revertUrl}\n\nQuesto ripristinerà la tua e-mail precedente, ti disconnetterà da tutti i dispositivi, rimuoverà i numeri di telefono collegati, disabiliterà l'MFA e ti richiederà di impostare una nuova password.\n\n– Team di Sicurezza {product_name}"
"subject": "Il tuo indirizzo email su {product_name} ÃĻ stato modificato",
"body": "Ciao {username},\n\nL'indirizzo email del tuo account {product_name} ÃĻ stato modificato in {newEmail}.\n\nSe hai effettuato questa modifica, non ÃĻ necessaria alcuna azione. In caso contrario, puoi annullare la modifica e mettere in sicurezza il tuo account utilizzando questo link:\n\n{revertUrl}\n\nQuesto ripristinerà la tua email precedente, ti disconnetterà da tutti i dispositivi, rimuoverà i numeri di telefono collegati, disabiliterà l'MFA e ti richiederà di impostare una nuova password.\n\n– Il team per la sicurezza di {product_name}"
},
"email_verification": {
"subject": "Verifica il tuo indirizzo e-mail di {product_name}",
"body": "Ciao {username},\n\nVerifica l'indirizzo e-mail del tuo account {product_name} cliccando sul link qui sotto:\n\n{verifyUrl}\n\nSe non hai creato un account {product_name}, puoi ignorare tranquillamente questa e-mail.\n\nQuesto link ÃĻ valido per 24 ore.\n\n– Team {product_name}"
"subject": "Verifica il tuo indirizzo email di {product_name}",
"body": "Ciao {username},\n\nVerifica l'indirizzo email del tuo account {product_name} cliccando sul link qui sotto:\n\n{verifyUrl}\n\nSe non hai creato un account {product_name}, puoi ignorare tranquillamente questa email.\n\nQuesto link ÃĻ valido per 24 ore.\n\n– Il team di {product_name}"
},
"gift_chargeback_notification": {
"subject": "I vantaggi del tuo regalo riscattato sono stati rimossi",
"body": "Ciao {username},\n\nUn codice regalo che hai riscattato era stato originariamente pagato da qualcun altro. Tale pagamento ÃĻ stato successivamente annullato (un chargeback).\n\nPer questo motivo, abbiamo rimosso i benefici che erano stati aggiunti al tuo account quando hai riscattato il regalo.\n\nSe ritieni che si tratti di un errore, contatta il nostro team di supporto e includi tutti i dettagli che hai sul codice regalo e su quando lo hai riscattato.\n\n– Team {product_name}"
"body": "Ciao {username},\n\nUn codice regalo che hai riscattato era stato originariamente pagato da qualcun altro. Tale pagamento ÃĻ stato successivamente annullato (un chargeback).\n\nPer questo motivo, abbiamo rimosso i vantaggi che erano stati aggiunti al tuo account quando hai riscattato il regalo.\n\nSe ritieni che si tratti di un errore, contatta il nostro team di assistenza e includi tutti i dettagli che hai sul codice regalo e su quando lo hai riscattato.\n\n– Il team di {product_name}"
},
"harvest_completed": {
"subject": "La tua esportazione dati {product_name} ÃĻ pronta per il download",
"body": "Ciao {username},\n\nLa tua esportazione dei dati ÃĻ pronta.\n\nLink per il download:\n{downloadUrl}\n\nMessaggi inclusi: {totalMessages, number}\nDimensione file: {fileSizeMB, number} MB\n\nQuesto link scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questa esportazione, cambia immediatamente la password e contatta il nostro team di supporto.\n\n– Team {product_name}"
"body": "Ciao {username},\n\nLa tua esportazione dei dati ÃĻ pronta.\n\nLink per il download:\n{downloadUrl}\n\nMessaggi inclusi: {totalMessages, number}\nDimensione file: {fileSizeMB, number} MB\n\nQuesto link scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questa esportazione, cambia immediatamente la password e contatta il nostro team di assistenza.\n\n– Il team di {product_name}"
},
"inactivity_warning": {
"subject": "Il tuo account {product_name} verrà eliminato per inattività",
"body": "Ciao {username},\n\nNon abbiamo rilevato alcuna attività sul tuo account {product_name} dal {lastActiveDate, date, full}.\n\nSe non effettui l'accesso entro il {deletionDate, date, full} alle {deletionDate, time, short}, il tuo account verrà eliminato definitivamente a causa di inattività.\n\nAccedi qui:\n{loginUrl}\n\nSe hai usato {product_name} di recente, contatta subito il nostro team di supporto.\n\n– Team {product_name}"
"body": "Ciao {username},\n\nNon abbiamo rilevato alcuna attività sul tuo account {product_name} dal {lastActiveDate, date, full}.\n\nSe non effettui l'accesso entro il {deletionDate, date, full} alle {deletionDate, time, short}, il tuo account verrà eliminato definitivamente a causa di inattività.\n\nAccedi qui:\n{loginUrl}\n\nSe hai usato {product_name} di recente, contatta subito il nostro team di assistenza.\n\n– Il team di {product_name}"
},
"ip_authorization": {
"subject": "Autorizza l'accesso da un nuovo indirizzo IP",
"body": "Ciao {username},\n\nAbbiamo rilevato un tentativo di accesso al tuo account {product_name} da un nuovo indirizzo IP:\n\nIndirizzo IP: {ipAddress}\nPosizione: {location}\n\nSe sei stato tu, autorizza questo indirizzo IP cliccando sul link qui sotto:\n\n{authUrl}\n\nSe non hai tentato di accedere, cambia subito la password.\n\nQuesto link ÃĻ valido per 30 minuti.\n\n– Team {product_name}"
"body": "Ciao {username},\n\nAbbiamo rilevato un tentativo di accesso al tuo account {product_name} da un nuovo indirizzo IP:\n\nIndirizzo IP: {ipAddress}\nPosizione: {location}\n\nSe sei stato tu, autorizza questo indirizzo IP cliccando sul link qui sotto:\n\n{authUrl}\n\nSe non hai tentato di accedere, cambia subito la password.\n\nQuesto link ÃĻ valido per 30 minuti.\n\n– Il team di {product_name}"
},
"mfa_backup_codes_view": {
"subject": "Conferma l'accesso ai tuoi codici di backup di {product_name}",
"body": "Ciao {username},\n\nAbbiamo ricevuto una richiesta di visualizzazione dei codici di backup del tuo account {product_name}.\n\nPer confermare questa richiesta, inserisci questo codice nell'app:\n\n{code}\n\nQuesto codice scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questa operazione, qualcuno potrebbe avere accesso al tuo account. Cambia immediatamente la password.\n\n– Team {product_name}"
"body": "Ciao {username},\n\nAbbiamo ricevuto una richiesta di visualizzazione dei codici di backup del tuo account {product_name}.\n\nPer confermare questa richiesta, inserisci questo codice nell'app:\n\n{code}\n\nQuesto codice scade il {expiresAt, date, full} alle {expiresAt, time, short}.\n\nSe non hai richiesto questa operazione, qualcuno potrebbe avere accesso al tuo account. Cambia immediatamente la password.\n\n– Il team di {product_name}"
},
"password_change_verification": {
"subject": "Conferma la modifica della password di {product_name}",
"body": "Ciao {username},\n\nAbbiamo ricevuto una richiesta di modifica della password del tuo account {product_name}.\n\nPer confermare questa modifica, inserisci questo codice nell'app:\n\n{code}\n\nQuesto codice scade alle {expiresAt}.\n\nSe non hai richiesto questa modifica, qualcuno potrebbe avere accesso al tuo account. Cambia immediatamente la password e abilita l'autenticazione a due fattori.\n\n– Team {product_name}"
"body": "Ciao {username},\n\nAbbiamo ricevuto una richiesta di modifica della password del tuo account {product_name}.\n\nPer confermare questa modifica, inserisci questo codice nell'app:\n\n{code}\n\nQuesto codice scade alle {expiresAt}.\n\nSe non hai richiesto questa modifica, qualcuno potrebbe avere accesso al tuo account. Cambia immediatamente la password e abilita l'autenticazione a due fattori.\n\n– Il team di {product_name}"
},
"password_reset": {
"subject": "Reimposta la password di {product_name}",
"body": "Ciao {username},\n\nHai richiesto il ripristino della tua password {product_name}. Usa il link qui sotto per impostare una nuova password:\n\n{resetUrl}\n\nSe non hai richiesto questa operazione, puoi ignorare tranquillamente questa email.\n\nQuesto link ÃĻ valido per 1 ora.\n\n– Team {product_name}"
"body": "Ciao {username},\n\nHai richiesto la reimpostazione della tua password di {product_name}. Usa il link qui sotto per impostare una nuova password:\n\n{resetUrl}\n\nSe non hai richiesto questa operazione, puoi ignorare tranquillamente questa email.\n\nQuesto link ÃĻ valido per 1 ora.\n\n– Il team di {product_name}"
},
"registration_approved": {
"subject": "La tua registrazione a {product_name} ÃĻ stata approvata",
"body": "Ciao {username},\n\nBuone notizie: la tua registrazione a {product_name} ÃĻ stata approvata.\n\nOra puoi accedere all'app {product_name} qui:\n{channelsUrl}\n\nBenvenuto nella comunità di {product_name}.\n\n– Team {product_name}"
"body": "Ciao {username},\n\nBuone notizie: la tua registrazione a {product_name} ÃĻ stata approvata.\n\nOra puoi accedere all'app {product_name} qui:\n{channelsUrl}\n\nBenvenuto nella community di {product_name}.\n\n– Il team di {product_name}"
},
"report_resolved": {
"subject": "La tua segnalazione {product_name} ÃĻ stata esaminata",
"body": "Ciao {username},\n\nLa tua segnalazione (ID: {reportId}) ÃĻ stata esaminata dal nostro Team di Sicurezza.{hasComment, select, yes {\n\nRisposta dal Team di Sicurezza:\n{publicComment}} other {}}\n\nGrazie per aver contribuito a mantenere {product_name} sicuro per tutti. Prendiamo sul serio tutte le segnalazioni e apprezziamo il tuo contributo alla comunità.\n\nSe hai domande o preoccupazioni riguardo a questo esito, contatta {safety_email}.\n\n– Team di Sicurezza {product_name}"
"body": "Ciao {username},\n\nLa tua segnalazione (ID: {reportId}) ÃĻ stata esaminata dal nostro team per la sicurezza.{hasComment, select, yes {\n\nRisposta dal team per la sicurezza:\n{publicComment}} other {}}\n\nGrazie per aver contribuito a mantenere {product_name} sicuro per tutti. Prendiamo sul serio tutte le segnalazioni e apprezziamo il tuo contributo alla community.\n\nSe hai domande o preoccupazioni riguardo a questo esito, contatta {safety_email}.\n\n– Il team per la sicurezza di {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Il tuo account {product_name} verrà eliminato definitivamente",
"body": "Ciao {username},\n\nIl tuo account {product_name} ÃĻ stato programmato per l'eliminazione permanente.\n\nEliminazione programmata: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nSi tratta di un provvedimento grave. I dati del tuo account verranno eliminati definitivamente alla data programmata.\n\nSe ritieni che questa decisione sia scorretta, puoi presentare un ricorso. Invia un'e-mail a {appeals_email} da questo indirizzo e-mail.\n\n– Team di Sicurezza {product_name}"
"body": "Ciao {username},\n\nÈ stata programmata l’eliminazione definitiva del tuo account {product_name}.\n\nEliminazione programmata: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nSi tratta di un provvedimento grave. I dati del tuo account verranno eliminati definitivamente alla data programmata.\n\nSe ritieni che questa decisione sia scorretta, puoi presentare un ricorso. Invia un'email a {appeals_email} da questo indirizzo email.\n\n– Il team per la sicurezza di {product_name}"
},
"self_deletion_scheduled": {
"subject": "L'eliminazione del tuo account {product_name} ÃĻ programmata",
"body": "Ciao {username},\n\nHai richiesto di eliminare il tuo account {product_name}. Il tuo account ÃĻ programmato per l'eliminazione permanente il:\n\n{deletionDate, date, full} alle {deletionDate, time, short}\n\nSe non hai richiesto l'eliminazione, accedi al tuo account per annullarla. Ti consigliamo anche di cambiare la password per mettere in sicurezza il tuo account.\n\n– Team {product_name}"
"body": "Ciao {username},\n\nHai richiesto di eliminare il tuo account {product_name}. Il tuo account verrà eliminato definitivamente in questa data:\n\n{deletionDate, date, full} alle {deletionDate, time, short}\n\nSe non hai richiesto l'eliminazione, accedi al tuo account per annullarla. Ti consigliamo anche di cambiare la password per mettere in sicurezza il tuo account.\n\n– Il team di {product_name}"
},
"unban_notification": {
"subject": "La sospensione del tuo account {product_name} ÃĻ stata revocata",
"body": "Ciao {username},\n\nBuone notizie: la sospensione del tuo account {product_name} ÃĻ stata revocata.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nOra puoi accedere di nuovo e continuare a usare {product_name} normalmente.\n\n– Team di Sicurezza {product_name}"
"body": "Ciao {username},\n\nBuone notizie: la sospensione del tuo account {product_name} ÃĻ stata revocata.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nOra puoi accedere di nuovo e continuare a usare {product_name} normalmente.\n\n– Il team per la sicurezza di {product_name}"
}
});
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_JA_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -8,84 +8,84 @@ const EMAIL_I18N_JA_MESSAGES = defineEmailI18nLocaleMessages({
"body": "こんãŦãĄãŊ、{username}さん\n\näļåŊĐおã‚Ēã‚Ŋテã‚Ģビテã‚ĢがæĪœå‡šã•れたため、{product_name}ã‚Ēã‚Ŧã‚Ķãƒģトをä™‚įš„ãŦį„ĄåŠđãŦしãūした。\n\n{reason, select,\n null {}\n other {į†į”ą: {reason}}\n}\n\nã‚Ēã‚Ŧã‚ĶãƒģトãŦ再åšĶã‚Ēã‚Ŋã‚ŧã‚đするãŦãŊ、パã‚đãƒŊマドをナã‚ŧットするåŋ…čĶãŒã‚ã‚Šãūす。\n\n{forgotUrl}\n\nパã‚đãƒŊマドをナã‚ŧットするãĻ、再åšĶログã‚ĪãƒģできるようãŦおりãūす。\n\nこãŪ掊į―ŪがčŠĪりであるãĻ思われるå ī合ãŊ、ã‚ĩポマトチマムãŦお問い合わせください。\n\n– {product_name}åŪ‰å…Ļチマム"
},
"account_scheduled_deletion": {
"subject": "あおたãŪ{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŊåیå…ĻãŦ削é™Īされãūす",
"body": "こんãŦãĄãŊ、{username}さん\n\nあおたãŪ{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŊ、åˆĐį”ĻčĶįī„ãūたãŊã‚ģミãƒĨニテã‚Ģゎã‚ĪドãƒĐã‚ĪãƒģãļãŪ違反ãŪため、æ°ļäđ…削é™Īが䚈åŪšã•ã‚ŒãĶいãūす。\n\n削é™Ī䚈åۚæ—Ĩ: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {į†į”ą: {reason}}\n}\n\nこれãŊ重åĪ§ãŠæŽŠį―Ūです。ã‚Ēã‚Ŧã‚Ķãƒģトデマã‚ŋãŊ、䚈åۚæ—ĨãŦåیå…ĻãŦ削é™Īされãūす。\n\näŧĨäļ‹ã‚’ごįĒščŠãã ã•ã„ã€‚\n- åˆĐį”ĻčĶįī„: {termsUrl}\n- ã‚ģミãƒĨニテã‚Ģゎã‚ĪドãƒĐã‚Īãƒģ: {guidelinesUrl}\n\nį•°č­°į”ģしįŦ‹ãĶ手įķšã:\nこãŪ掊į―Ūがäļæ­ĢįĒšãūたãŊäļå―“であるãĻ思われるå ī合ãŊ、60æ—ĨäŧĨ内ãŦį•°č­°į”ģしįŦ‹ãĶを提凚できãūす。こãŪãƒĄãƒžãƒŦã‚Ēドノã‚đから{appeals_email}ãūã§ãƒĄãƒžãƒŦを送äŋĄã—ãĶください。\n\nį•°č­°į”ģしįŦ‹ãĶãŪ際ãŊ、äŧĨäļ‹ã‚’åŦめãĶください。\n- 掊į―Ūがäļæ­ĢįĒšãūたãŊäļå―“であるãĻč€ƒãˆã‚‹į†į”ąã‚’æ˜ŽįĒšãŦčŠŽæ˜Žã—ãĶください\n- é–Ēé€ĢするčĻžæ‹ ã‚„įŠķæģã‚’提äū›ã—ãĶください\n\n{product_name}åŪ‰å…ĻチマムãŪãƒĄãƒģãƒãƒžãŒį•°č­°į”ģしįŦ‹ãĶをåŊĐæŸŧし、最įĩ‚æąšåŪšãŒäļ‹ã•れるãūで削é™Īをä™‚停æ­Ēするå ī合がありãūす。\n\n– {product_name}åŪ‰å…Ļチマム"
"subject": "{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŊåیå…ĻãŦ削é™Īされãūす",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŊ、åˆĐį”ĻčĶįī„ãūたãŊã‚ģミãƒĨニテã‚Ģゎã‚ĪドãƒĐã‚ĪãƒģãļãŪ違反ãŪため、åیå…Ļお削é™Īが䚈åŪšã•ã‚ŒãĶいãūす。\n\n削é™Ī䚈åۚæ—Ĩ時: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {į†į”ą: {reason}}\n}\n\nこれãŊ重åĪ§ãŠæŽŠį―Ūです。ã‚Ēã‚Ŧã‚Ķãƒģトデマã‚ŋãŊ、䚈åۚæ—ĨãŦåیå…ĻãŦ削é™Īされãūす。\n\näŧĨäļ‹ã‚’ごįĒščŠãã ã•ã„ã€‚\n- åˆĐį”ĻčĶįī„: {termsUrl}\n- ã‚ģミãƒĨニテã‚Ģゎã‚ĪドãƒĐã‚Īãƒģ: {guidelinesUrl}\n\nį•°č­°į”ģしįŦ‹ãĶ手įķšã:\nこãŪ掊į―Ūがäļæ­ĢįĒšãūたãŊäļå―“であるãĻ思われるå ī合ãŊ、60æ—ĨäŧĨ内ãŦį•°č­°į”ģしįŦ‹ãĶを提凚できãūす。こãŪãƒĄãƒžãƒŦã‚Ēドノã‚đから{appeals_email}ãūã§ãƒĄãƒžãƒŦを送äŋĄã—ãĶください。\n\nį•°č­°į”ģしįŦ‹ãĶãŦãŊ、äŧĨäļ‹ã‚’čĻ˜čž‰ã—ãĶください。\n- 掊į―Ūがäļæ­ĢįĒšãūたãŊäļå―“であるãĻč€ƒãˆã‚‹į†į”ąãŪ明įĒšãŠčŠŽæ˜Ž\n- é–Ēé€ĢするčĻžæ‹ ã‚„čƒŒæ™Ŋæƒ…å ą\n\n{product_name}åŪ‰å…ĻチマムãŪãƒĄãƒģãƒãƒžãŒį•°č­°į”ģしįŦ‹ãĶをåŊĐæŸŧし、最įĩ‚æąšåŪšãŒäļ‹ã•れるãūで削é™Īをä™‚停æ­Ēするå ī合がありãūす。\n\n– {product_name}åŪ‰å…Ļチマム"
},
"account_temp_banned": {
"subject": "あおたãŪ{product_name}ã‚Ēã‚Ŧã‚Ķãƒģトがä™‚įš„ãŦ停æ­Ēされãūした",
"body": "こんãŦãĄãŊ、{username}さん\n\nあおたãŪ{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŊ、åˆĐį”ĻčĶįī„ãūたãŊã‚ģミãƒĨニテã‚Ģゎã‚ĪドãƒĐã‚ĪãƒģãļãŪ違反ãŪため、ä™‚įš„ãŦ停æ­Ēされãūした。\n\n期間: {durationHours, plural,\n =1 {1時間}\n other {#時間}\n}\n停æ­Ē期間įĩ‚䚆: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {į†į”ą: {reason}}\n}\n\nこãŪ期間äļ­ã€ã‚Ēã‚Ŧã‚ĶãƒģトãŦã‚Ēã‚Ŋã‚ŧã‚đするこãĻãŊできãūせん。\n\näŧĨäļ‹ã‚’ごįĒščŠãã ã•ã„ã€‚\n- åˆĐį”ĻčĶįī„: {termsUrl}\n- ã‚ģミãƒĨニテã‚Ģゎã‚ĪドãƒĐã‚Īãƒģ: {guidelinesUrl}\n\nこãŪ掊į―Ūがäļæ­ĢįĒšãūたãŊäļå―“であるãĻ思われるå ī合ãŊã€į•°č­°į”ģしįŦ‹ãĶを提凚できãūす。こãŪãƒĄãƒžãƒŦã‚Ēドノã‚đから{appeals_email}ãūã§ãƒĄãƒžãƒŦを送äŋĄã—ã€æąšåŪšãŒäļæ­ĢįĒšã§ã‚ã‚‹ãĻč€ƒãˆã‚‹į†į”ąã‚’æ˜ŽįĒšãŦčŠŽæ˜Žã—ãĶãã ã•ã„ã€‚į•°č­°į”ģしįŦ‹ãĶをåŊĐæŸŧã—ã€æąšåŪšã‚’ã”é€ĢįĩĄã„たしãūす。\n\n– {product_name}åŪ‰å…Ļチマム"
"subject": "{product_name}ã‚Ēã‚Ŧã‚Ķãƒģトがä™‚įš„ãŦ停æ­Ēされãūした",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŊ、åˆĐį”ĻčĶįī„ãūたãŊã‚ģミãƒĨニテã‚Ģゎã‚ĪドãƒĐã‚ĪãƒģãļãŪ違反ãŪため、ä™‚įš„ãŦ停æ­Ēされãūした。\n\n期間: {durationHours, plural,\n =1 {1時間}\n other {#時間}\n}\n停æ­Ēč§Ģé™Īæ—Ĩ時: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {į†į”ą: {reason}}\n}\n\nこãŪ期間äļ­ã€ã‚Ēã‚Ŧã‚ĶãƒģトãŦã‚Ēã‚Ŋã‚ŧã‚đするこãĻãŊできãūせん。\n\näŧĨäļ‹ã‚’ごįĒščŠãã ã•ã„ã€‚\n- åˆĐį”ĻčĶįī„: {termsUrl}\n- ã‚ģミãƒĨニテã‚Ģゎã‚ĪドãƒĐã‚Īãƒģ: {guidelinesUrl}\n\nこãŪ掊į―Ūがäļæ­ĢįĒšãūたãŊäļå―“であるãĻ思われるå ī合ãŊã€į•°č­°į”ģしįŦ‹ãĶを提凚できãūす。こãŪãƒĄãƒžãƒŦã‚Ēドノã‚đから{appeals_email}ãūã§ãƒĄãƒžãƒŦを送äŋĄã—ã€æąšåŪšãŒäļæ­ĢįĒšã§ã‚ã‚‹ãĻč€ƒãˆã‚‹į†į”ąã‚’æ˜ŽįĒšãŦčŠŽæ˜Žã—ãĶãã ã•ã„ã€‚į•°č­°į”ģしįŦ‹ãĶをåŊĐæŸŧã—ã€æąšåŪšã‚’ã”é€ĢįĩĄã„たしãūす。\n\n– {product_name}åŪ‰å…Ļチマム"
},
"donation_confirmation": {
"subject": "{product_name}ãļãŪåŊ„äŧ˜ã‚りがãĻうございãūす",
"body": "こんãŦãĄãŊ、\n\n{product_name}ãļãŪåŊ„äŧ˜ã‚りがãĻうございãūす。{interval, select,\n month {åŪšæœŸįš„ãŠåŊ„äŧ˜}\n year {åŪšæœŸįš„ãŠåŊ„äŧ˜}\n other {äļ€åšĶ限りãŪåŊ„äŧ˜}\n}ãŪ{interval, select,\n month {čĻ­åۚ}\n year {čĻ­åۚ}\n other {å‡Ķᐆ}\n}がåŪŒäš†ã—ãūした。\n\nåŊ„äŧ˜ãŪčĐģįī°:\n金額: {amount} {currency} {interval, select,\n month {/月}\n year {/åđī}\n other {}\n}\n\nStripeから、čŦ‹æą‚æ›ļPDFäŧ˜ããŪ領収æ›ļがåˆĨé€”ãƒĄãƒžãƒŦで送äŋĄã•れãūす。これãŦãŊすãđãĶãŪæ”Ŋ払いčĐģįī°ãŒåŦãūれãĶおり、įĻŽå‹™į›Ūįš„ã§ä―ŋį”Ļできãūす。\n\näŧĨäļ‹ãŪナãƒģã‚Ŋから、いãĪでもåŊ„äŧ˜åąĨæ­īãŪčĄĻįĪšã€čŦ‹æą‚æ›ļãŪダã‚Ķãƒģロマド、{interval, select,\n month {およãģã‚ĩブã‚đã‚ŊナプショãƒģãŪįŪĄį†ãūたãŊキãƒĢãƒģã‚ŧãƒŦ}\n year {およãģã‚ĩブã‚đã‚ŊナプショãƒģãŪįŪĄį†ãūたãŊキãƒĢãƒģã‚ŧãƒŦ}\n other {およãģäŧŠåūŒãŪåŊ„äŧ˜ãŪįŪĄį†}\n}がåŊčƒ―ã§ã™ã€‚\n\n{manageUrl}\n\nįš†æ§˜ãŪごæ”Ŋæīが{product_name}ãŪ運å–ķをæ”ŊえãĶいãūす。ありがãĻうございãūす。\n\n– {product_name}チマム"
"subject": "{product_name}ãļãŪごåŊ„äŧ˜ã‚りがãĻうございãūす",
"body": "こんãŦãĄãŊ。\n\n{product_name}ãļãŪごåŊ„äŧ˜ã‚りがãĻうございãūす。{interval, select,\n month {åŪšæœŸåŊ„äŧ˜}\n year {åŪšæœŸåŊ„äŧ˜}\n other {1回ãŪãŋãŪåŊ„äŧ˜}\n}ãŪ{interval, select,\n month {čĻ­åۚ}\n year {čĻ­åۚ}\n other {å‡Ķᐆ}\n}がåŪŒäš†ã—ãūした。\n\nåŊ„äŧ˜ãŪčĐģįī°:\n金額: {amount}{interval, select,\n month {æŊŽæœˆïž‰}\n year {æŊŽåđī}\n other {}\n}\n\nStripeから、čŦ‹æą‚æ›ļPDFäŧ˜ããŪ領収æ›ļがåˆĨé€”ãƒĄãƒžãƒŦで送äŋĄã•れãūす。これãŦãŊすãđãĶãŪæ”Ŋ払いčĐģįī°ãŒåŦãūれãĶおり、įĻŽå‹™į›Ūįš„ãŦごåˆĐį”Ļいただけãūす。\n\näŧĨäļ‹ãŪナãƒģã‚Ŋから、いãĪでもåŊ„äŧ˜åąĨæ­īãŪčĄĻįĪšã€čŦ‹æą‚æ›ļãŪダã‚Ķãƒģロマド、{interval, select,\n month {およãģã‚ĩブã‚đã‚ŊナプショãƒģãŪįŪĄį†ãūたãŊキãƒĢãƒģã‚ŧãƒŦ}\n year {およãģã‚ĩブã‚đã‚ŊナプショãƒģãŪįŪĄį†ãūたãŊキãƒĢãƒģã‚ŧãƒŦ}\n other {およãģäŧŠåūŒãŪåŊ„äŧ˜ãŪįŪĄį†}\n}がåŊčƒ―ã§ã™ã€‚\n\n{manageUrl}\n\nįš†æ§˜ãŪごæ”Ŋæīが{product_name}ãŪ運å–ķをæ”ŊえãĶいãūす。ありがãĻうございãūす。\n\n– {product_name}チマム"
},
"donation_magic_link": {
"subject": "{product_name}ãŪåŊ„äŧ˜ã‚’įŪĄį†",
"body": "こんãŦãĄãŊ、\n\näŧĨäļ‹ãŪナãƒģã‚Ŋをã‚Ŋナッã‚ŊしãĶ、åŊ„äŧ˜č€…ポマã‚ŋãƒŦãŦã‚Ēã‚Ŋã‚ŧã‚đしãĶください。\n\n{manageUrl}\n\nポマã‚ŋãƒŦでãŊ、ã‚ĩブã‚đã‚ŊナプショãƒģãŪįŪĄį†ã€čŦ‹æą‚æ›ļãŪダã‚Ķãƒģロマド、åŊ„äŧ˜åąĨæ­īãŪčĄĻįĪšãŒã§ããūす。\n\nこãŪナãƒģã‚ŊãŊ{expiresAt, date, full} {expiresAt, time, short}ãŦ期限切れãŦおりãūす。\n\nこãŪナãƒģã‚Ŋをナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、こãŪãƒĄãƒžãƒŦã‚’į„ĄčĶ–ã—ãĶå•éĄŒã‚ã‚Šãūせん。\n\n– {product_name}チマム"
"subject": "{product_name}ãļãŪåŊ„äŧ˜ã‚’įŪĄį†",
"body": "こんãŦãĄãŊ。\n\näŧĨäļ‹ãŪナãƒģã‚Ŋをã‚Ŋナッã‚ŊしãĶ、åŊ„äŧ˜č€…ポマã‚ŋãƒŦãŦã‚Ēã‚Ŋã‚ŧã‚đしãĶください。\n\n{manageUrl}\n\nポマã‚ŋãƒŦでãŊ、ã‚ĩブã‚đã‚ŊナプショãƒģãŪįŪĄį†ã€čŦ‹æą‚æ›ļãŪダã‚Ķãƒģロマド、åŊ„äŧ˜åąĨæ­īãŪčĄĻįĪšãŒã§ããūす。\n\nこãŪナãƒģã‚ŊãŪ有åŠđ期限ãŊ{expiresAt, date, full} {expiresAt, time, short}です。\n\nこãŪナãƒģã‚Ŋをナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、こãŪãƒĄãƒžãƒŦã‚’į„ĄčĶ–ã—ãĶå•éĄŒã‚ã‚Šãūせん。\n\n– {product_name}チマム"
},
"dsa_report_verification": {
"subject": "DSAノポマトãŪãƒĄãƒžãƒŦã‚Ēドノã‚đをįĒščŠ",
"body": "こんãŦãĄãŊ、\n\näŧĨäļ‹ãŪįĒščŠã‚ģマドをä―ŋį”ĻしãĶ、{product_name}でデã‚ļã‚ŋãƒŦã‚ĩマビã‚đæģ•ノポマトを提凚しãĶください。\n\n{code}\n\nこãŪã‚ģマドãŊ{expiresAt, date, full} {expiresAt, time, short}ãŦ期限切れãŦおりãūす。\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、こãŪãƒĄãƒžãƒŦã‚’į„ĄčĶ–ã—ãĶå•éĄŒã‚ã‚Šãūせん。\n\n– {product_name}åŪ‰å…Ļチマム"
"subject": "DSAå ąå‘ŠãŪためãŪãƒĄãƒžãƒŦã‚Ēドノã‚đをįĒščŠ",
"body": "こんãŦãĄãŊ。\n\näŧĨäļ‹ãŪįĒščŠã‚ģマドをä―ŋį”ĻしãĶ、{product_name}でデã‚ļã‚ŋãƒŦã‚ĩマビã‚đæģ•ãŦ埚ãĨãå ąå‘Šã‚’æå‡šã—ãĶください。\n\n{code}\n\nこãŪã‚ģマドãŪ有åŠđ期限ãŊ{expiresAt, date, full} {expiresAt, time, short}です。\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、こãŪãƒĄãƒžãƒŦã‚’į„ĄčĶ–ã—ãĶå•éĄŒã‚ã‚Šãūせん。\n\n– {product_name}åŪ‰å…Ļチマム"
},
"email_change_new": {
"subject": "新しい{product_name}ãƒĄãƒžãƒŦã‚Ēドノã‚đをįĒščŠ",
"body": "こんãŦãĄãŊ、{username}さん\n\n新しい{product_name}ãƒĄãƒžãƒŦã‚Ēドノã‚đをįĒščŠã™ã‚‹ãŦãŊ、ã‚ĒプナでこãŪã‚ģマドをå…Ĩ力しãĶください。\n\n{code}\n\nこãŪã‚ģマドãŊ{expiresAt, date, full} {expiresAt, time, short}ãŦ期限切れãŦおりãūす。\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、こãŪãƒĄãƒžãƒŦã‚’į„ĄčĶ–ã—ãĶå•éĄŒã‚ã‚Šãūせん。\n\n– {product_name}チマム"
"subject": "{product_name}ãŪæ–°ã—ã„ãƒĄãƒžãƒŦã‚Ēドノã‚đをįĒščŠ",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ãŪæ–°ã—ã„ãƒĄãƒžãƒŦã‚Ēドノã‚đをįĒščŠã™ã‚‹ãŦãŊ、ã‚ĒプナでこãŪã‚ģマドをå…Ĩ力しãĶください。\n\n{code}\n\nこãŪã‚ģマドãŪ有åŠđ期限ãŊ{expiresAt, date, full} {expiresAt, time, short}です。\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、こãŪãƒĄãƒžãƒŦã‚’į„ĄčĶ–ã—ãĶå•éĄŒã‚ã‚Šãūせん。\n\n– {product_name}チマム"
},
"email_change_original": {
"subject": "{product_name}ãƒĄãƒžãƒŦã‚Ēドノã‚đãŪåΉæ›īをįĒščŠ",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪãƒĄãƒžãƒŦã‚Ēドノã‚đåΉæ›īナã‚Ŋã‚Ļã‚đトを受けäŧ˜ã‘ãūした。\n\nこãŪåΉæ›īをįĒščŠã™ã‚‹ãŦãŊ、ã‚ĒプナでこãŪã‚ģマドをå…Ĩ力しãĶください。\n\n{code}\n\nこãŪã‚ģマドãŊ{expiresAt, date, full} {expiresAt, time, short}ãŦ期限切れãŦおりãūす。\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、すぐãŦã‚Ēã‚Ŧã‚Ķãƒģトをäŋč­·ã—ãĶください。\n\n– {product_name}チマム"
"subject": "{product_name}ãŪãƒĄãƒžãƒŦã‚Ēドノã‚đåΉæ›īをįĒščŠ",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪãƒĄãƒžãƒŦã‚Ēドノã‚đåΉæ›īナã‚Ŋã‚Ļã‚đトを受けäŧ˜ã‘ãūした。\n\nこãŪåΉæ›īをįĒščŠã™ã‚‹ãŦãŊ、ã‚ĒプナでこãŪã‚ģマドをå…Ĩ力しãĶください。\n\n{code}\n\nこãŪã‚ģマドãŪ有åŠđ期限ãŊ{expiresAt, date, full} {expiresAt, time, short}です。\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、すぐãŦã‚Ēã‚Ŧã‚Ķãƒģトをäŋč­·ã—ãĶください。\n\n– {product_name}チマム"
},
"email_change_revert": {
"subject": "{product_name}ãƒĄãƒžãƒŦã‚Ēドノã‚đがåΉæ›īされãūした",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪãƒĄãƒžãƒŦã‚Ēドノã‚đが{newEmail}ãŦåΉæ›īされãūした。\n\nこãŪåΉæ›īã‚’čĄŒãĢたå ī合ãŊã€ä―•ã‚‚ã™ã‚‹åŋ…č́ãŊありãūせん。åΉæ›īã‚’čĄŒãĢãĶいおいå ī合ãŊ、こãŪナãƒģã‚Ŋをä―ŋį”ĻしãĶåΉæ›īを元ãŦæˆŧし、ã‚Ēã‚Ŧã‚Ķãƒģトをäŋč­·ã§ããūす。\n\n{revertUrl}\n\nこれãŦより、äŧĨ前ãŪãƒĄãƒžãƒŦã‚Ēドノã‚đがåūĐ元され、すãđãĶãŪå ī所からログã‚Ēã‚Ķトされ、ナãƒģã‚Ŋされたé›ŧčĐąį•Šå·ãŒå‰Šé™Īされ、MFAãŒį„ĄåŠđãŦおり、新しいパã‚đãƒŊマドをčĻ­åŪšã™ã‚‹åŋ…čĶãŒã‚ã‚Šãūす。\n\n– {product_name}åŪ‰å…Ļチマム"
"subject": "{product_name}ãŪãƒĄãƒžãƒŦã‚Ēドノã‚đがåΉæ›īされãūした",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪãƒĄãƒžãƒŦã‚Ēドノã‚đが{newEmail}ãŦåΉæ›īされãūした。\n\nこãŪåΉæ›īã‚’čĄŒãĢたå ī合ãŊã€ä―•ã‚‚ã™ã‚‹åŋ…č́ãŊありãūせん。åΉæ›īã‚’čĄŒãĢãĶいおいå ī合ãŊ、こãŪナãƒģã‚Ŋをä―ŋį”ĻしãĶåΉæ›īを元ãŦæˆŧし、ã‚Ēã‚Ŧã‚Ķãƒģトをäŋč­·ã§ããūす。\n\n{revertUrl}\n\nこれãŦより、äŧĨ前ãŪãƒĄãƒžãƒŦã‚Ēドノã‚đがåūĐ元され、すãđãĶãŪデバã‚Īã‚đからログã‚Ēã‚Ķトされ、é€Ģ搚æļˆãŋãŪé›ŧčĐąį•Šå·ãŒå‰Šé™Īされ、MFAãŒį„ĄåŠđãŦおり、新しいパã‚đãƒŊマドãŪčĻ­åŪšãŒåŋ…č́ãŦおりãūす。\n\n– {product_name}åŪ‰å…Ļチマム"
},
"email_verification": {
"subject": "{product_name}ãƒĄãƒžãƒŦã‚Ēドノã‚đをįĒščŠ",
"subject": "{product_name}ãŪãƒĄãƒžãƒŦã‚Ēドノã‚đをįĒščŠ",
"body": "こんãŦãĄãŊ、{username}さん\n\näŧĨäļ‹ãŪナãƒģã‚Ŋをã‚Ŋナッã‚ŊしãĶ、{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪãƒĄãƒžãƒŦã‚Ēドノã‚đをįĒščŠã—ãĶください。\n\n{verifyUrl}\n\n{product_name}ã‚Ēã‚Ŧã‚Ķãƒģãƒˆã‚’ä―œæˆã—ãĶいおいå ī合ãŊ、こãŪãƒĄãƒžãƒŦã‚’į„ĄčĶ–ã—ãĶå•éĄŒã‚ã‚Šãūせん。\n\nこãŪナãƒģã‚ŊãŊ24時間有åŠđです。\n\n– {product_name}チマム"
},
"gift_chargeback_notification": {
"subject": "垕き換えæļˆãŋãŪã‚Ūフトį‰đå…ļが削é™Īされãūした",
"body": "こんãŦãĄãŊ、{username}さん\n\n垕き換えられたã‚Ūフトã‚ģマドãŊ、元々äŧ–ãŪæ–đがæ”Ŋ払ãĢたもãŪです。そãŪæ”Ŋ払いãŊそãŪåūŒå–りæķˆã•れãūしたチãƒĢマã‚ļバッã‚Ŋ。\n\nそãŪため、ã‚Ūフトを垕き換えた際ãŦã‚Ēã‚Ŧã‚ĶãƒģトãŦčŋ―加されたį‰đå…ļを削é™Īしãūした。\n\nこれが間違いであるãĻ思われるå ī合ãŊ、ã‚Ūフトã‚ģマドãĻ垕き換え時期ãŦé–ĒするčĐģįī°ã‚’æ·ŧえãĶ、ã‚ĩポマトチマムãŦお問い合わせください。\n\n– {product_name}チマム"
"subject": "垕き換えたã‚ŪフトãŪį‰đå…ļが削é™Īされãūした",
"body": "こんãŦãĄãŊ、{username}さん\n\n垕き換えたã‚Ūフトã‚ģマドãŊ、元ãŊåˆĨãŪæ–đがæ”Ŋ払ãĢたもãŪです。そãŪæ”Ŋ払いãŊそãŪåūŒå–りæķˆã•れãūしたチãƒĢマã‚ļバッã‚Ŋ。\n\nそãŪため、ã‚Ūフトを垕き換えた際ãŦã‚Ēã‚Ŧã‚ĶãƒģトãŦčŋ―加されたį‰đå…ļを削é™Īしãūした。\n\nこれが間違いであるãĻ思われるå ī合ãŊ、ã‚Ūフトã‚ģマドãĻ垕き換え時期ãŦé–ĒするčĐģįī°ã‚’æ·ŧえãĶ、ã‚ĩポマトチマムãŦお問い合わせください。\n\n– {product_name}チマム"
},
"harvest_completed": {
"subject": "{product_name}デマã‚ŋãŪã‚Ļã‚Ŋã‚đポマト暖備がåŪŒäš†ã—ãūした",
"body": "こんãŦãĄãŊ、{username}さん\n\nデマã‚ŋãŪã‚Ļã‚Ŋã‚đポマト暖備がåŪŒäš†ã—ãūした。\n\nダã‚Ķãƒģロマドナãƒģã‚Ŋ:\n{downloadUrl}\n\nåŦãūã‚Œã‚‹ãƒĄãƒƒã‚ŧマã‚ļ数: {totalMessages, number}äŧķ\nãƒ•ã‚Ąã‚ĪãƒŦã‚ĩã‚Ī゚: {fileSizeMB, number} MB\n\nこãŪナãƒģã‚ŊãŊ{expiresAt, date, full} {expiresAt, time, short}ãŦ期限切れãŦおりãūす。\n\nã”č‡ŠčšŦでこãŪã‚Ļã‚Ŋã‚đポマトをナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、すぐãŦパã‚đãƒŊマドをåΉæ›īし、ã‚ĩポマトチマムãŦお問い合わせください。\n\n– {product_name}チマム"
"body": "こんãŦãĄãŊ、{username}さん\n\nデマã‚ŋãŪã‚Ļã‚Ŋã‚đポマト暖備がåŪŒäš†ã—ãūした。\n\nダã‚Ķãƒģロマドナãƒģã‚Ŋ:\n{downloadUrl}\n\nåŦãūã‚Œã‚‹ãƒĄãƒƒã‚ŧマã‚ļ数: {totalMessages, number}äŧķ\nãƒ•ã‚Ąã‚ĪãƒŦã‚ĩã‚Ī゚: {fileSizeMB, number} MB\n\nこãŪナãƒģã‚ŊãŪ有åŠđ期限ãŊ{expiresAt, date, full} {expiresAt, time, short}です。\n\nã”č‡ŠčšŦでこãŪã‚Ļã‚Ŋã‚đポマトをナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、すぐãŦパã‚đãƒŊマドをåΉæ›īし、ã‚ĩポマトチマムãŦお問い合わせください。\n\n– {product_name}チマム"
},
"inactivity_warning": {
"subject": "{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŊ非ã‚Ēã‚Ŋテã‚ĢブãŪため削é™Īされãūす",
"body": "こんãŦãĄãŊ、{username}さん\n\n{lastActiveDate, date, full}äŧĨ降、{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトでãŪã‚Ēã‚Ŋテã‚Ģビテã‚ĢがįĒščŠã•ã‚ŒãĶいãūせん。\n\n{deletionDate, date, full} {deletionDate, time, short}ãūでãŦログã‚Īãƒģしおいå ī合、ã‚Ēã‚Ŧã‚ĶãƒģトãŊ非ã‚Ēã‚Ŋテã‚ĢブãŪためåیå…ĻãŦ削é™Īされãūす。\n\nã“ãĄã‚‰ã‹ã‚‰ãƒ­ã‚°ã‚ĪãƒģしãĶください:\n{loginUrl}\n\n最čŋ‘{product_name}をåˆĐį”Ļしたå ī合ãŊ、すぐãŦã‚ĩポマトチマムãŦお問い合わせください。\n\n– {product_name}チマム"
"body": "こんãŦãĄãŊ、{username}さん\n\n{lastActiveDate, date, full}äŧĨ降、{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトでãŪã‚Ēã‚Ŋテã‚Ģビテã‚ĢがįĒščŠã•ã‚ŒãĶいãūせん。\n\n{deletionDate, date, full} {deletionDate, time, short}ãūでãŦログã‚Īãƒģしおいå ī合、ã‚Ēã‚Ŧã‚ĶãƒģトãŊ非ã‚Ēã‚Ŋテã‚ĢブãŪためåیå…ĻãŦ削é™Īされãūす。\n\nã“ãĄã‚‰ã‹ã‚‰ãƒ­ã‚°ã‚ĪãƒģしãĶください。\n{loginUrl}\n\n最čŋ‘{product_name}をåˆĐį”Ļしたå ī合ãŊ、すぐãŦã‚ĩポマトチマムãŦお問い合わせください。\n\n– {product_name}チマム"
},
"ip_authorization": {
"subject": "新しいIPã‚Ēドノã‚đからãŪログã‚Īãƒģをæ‰ŋ詍",
"body": "こんãŦãĄãŊ、{username}さん\n\n新しいIPã‚Ēドノã‚đから{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãļãŪログã‚ĪãƒģčĐĶčĄŒã‚’æĪœå‡šã—ãūした。\n\nIPã‚Ēドノã‚đ: {ipAddress}\nå ī所: {location}\n\nã“ã‚ŒãŒã”č‡ŠčšŦãŦよるもãŪであるå ī合ãŊ、äŧĨäļ‹ãŪナãƒģã‚Ŋをã‚Ŋナッã‚ŊしãĶこãŪIPã‚Ēドノã‚đをæ‰ŋčŠã—ãĶください。\n\n{authUrl}\n\nログã‚ĪãƒģをčĐĶčĄŒã—ãĶいおいå ī合ãŊ、すぐãŦパã‚đãƒŊマドをåΉæ›īしãĶください。\n\nこãŪナãƒģã‚ŊãŊ30分間有åŠđです。\n\n– {product_name}チマム"
},
"mfa_backup_codes_view": {
"subject": "{product_name}バッã‚Ŋã‚Ēップã‚ģマドãļãŪã‚Ēã‚Ŋã‚ŧã‚đをįĒščŠ",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪバッã‚Ŋã‚Ēップã‚ģマドをčĄĻįĪšã™ã‚‹ãƒŠã‚Ŋã‚Ļã‚đトを受けäŧ˜ã‘ãūした。\n\nこãŪナã‚Ŋã‚Ļã‚đトをįĒščŠã™ã‚‹ãŦãŊ、ã‚ĒプナでこãŪã‚ģマドをå…Ĩ力しãĶください。\n\n{code}\n\nこãŪã‚ģマドãŊ{expiresAt, date, full} {expiresAt, time, short}ãŦ期限切れãŦおりãūす。\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊã€čŠ°ã‹ãŒã‚ãŠãŸãŪã‚Ēã‚Ŧã‚ĶãƒģトãŦã‚Ēã‚Ŋã‚ŧã‚đしãĶいるåŊčƒ―æ€§ãŒã‚ã‚Šãūす。すぐãŦパã‚đãƒŊマドをåΉæ›īしãĶください。\n\n– {product_name}チマム"
"subject": "{product_name}ãŪバッã‚Ŋã‚Ēップã‚ģマドãļãŪã‚Ēã‚Ŋã‚ŧã‚đをįĒščŠ",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪバッã‚Ŋã‚Ēップã‚ģマドをčĄĻįĪšã™ã‚‹ãƒŠã‚Ŋã‚Ļã‚đトを受けäŧ˜ã‘ãūした。\n\nこãŪナã‚Ŋã‚Ļã‚đトをįĒščŠã™ã‚‹ãŦãŊ、ã‚ĒプナでこãŪã‚ģマドをå…Ĩ力しãĶください。\n\n{code}\n\nこãŪã‚ģマドãŪ有åŠđ期限ãŊ{expiresAt, date, full} {expiresAt, time, short}です。\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊã€čŠ°ã‹ãŒã‚ãŠãŸãŪã‚Ēã‚Ŧã‚ĶãƒģトãŦã‚Ēã‚Ŋã‚ŧã‚đしãĶいるåŊčƒ―æ€§ãŒã‚ã‚Šãūす。すぐãŦパã‚đãƒŊマドをåΉæ›īしãĶください。\n\n– {product_name}チマム"
},
"password_change_verification": {
"subject": "{product_name}パã‚đãƒŊマドãŪåΉæ›īをįĒščŠ",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪパã‚đãƒŊマドåΉæ›īナã‚Ŋã‚Ļã‚đトを受けäŧ˜ã‘ãūした。\n\nこãŪåΉæ›īをįĒščŠã™ã‚‹ãŦãŊ、ã‚ĒプナでこãŪã‚ģマドをå…Ĩ力しãĶください。\n\n{code}\n\nこãŪã‚ģマドãŊ{expiresAt}ãŦ期限切れãŦおりãūす。\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊã€čŠ°ã‹ãŒã‚ãŠãŸãŪã‚Ēã‚Ŧã‚ĶãƒģトãŦã‚Ēã‚Ŋã‚ŧã‚đしãĶいるåŊčƒ―æ€§ãŒã‚ã‚Šãūす。すぐãŦパã‚đãƒŊマドをåΉæ›īし、䚌æŪĩ階詍čĻžã‚’æœ‰åŠđãŦしãĶください。\n\n– {product_name}チマム"
"subject": "{product_name}ãŪパã‚đãƒŊマドåΉæ›īをįĒščŠ",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪパã‚đãƒŊマドåΉæ›īナã‚Ŋã‚Ļã‚đトを受けäŧ˜ã‘ãūした。\n\nこãŪåΉæ›īをįĒščŠã™ã‚‹ãŦãŊ、ã‚ĒプナでこãŪã‚ģマドをå…Ĩ力しãĶください。\n\n{code}\n\nこãŪã‚ģマドãŪ有åŠđ期限ãŊ{expiresAt}です。\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊã€čŠ°ã‹ãŒã‚ãŠãŸãŪã‚Ēã‚Ŧã‚ĶãƒģトãŦã‚Ēã‚Ŋã‚ŧã‚đしãĶいるåŊčƒ―æ€§ãŒã‚ã‚Šãūす。すぐãŦパã‚đãƒŊマドをåΉæ›īし、2æŪĩ階詍čĻžã‚’æœ‰åŠđãŦしãĶください。\n\n– {product_name}チマム"
},
"password_reset": {
"subject": "{product_name}パã‚đãƒŊマドをナã‚ŧット",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}パã‚đãƒŊマドãŪナã‚ŧットをナã‚Ŋã‚Ļã‚đトされãūした。äŧĨäļ‹ãŪナãƒģã‚Ŋをä―ŋį”ĻしãĶ新しいパã‚đãƒŊマドをčĻ­åŪšã—ãĶください。\n\n{resetUrl}\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、こãŪãƒĄãƒžãƒŦã‚’į„ĄčĶ–ã—ãĶå•éĄŒã‚ã‚Šãūせん。\n\nこãŪナãƒģã‚ŊãŊ1時間有åŠđです。\n\n– {product_name}チマム"
"subject": "{product_name}ãŪパã‚đãƒŊマドをナã‚ŧット",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ãŪパã‚đãƒŊマドナã‚ŧットをナã‚Ŋã‚Ļã‚đトされãūした。äŧĨäļ‹ãŪナãƒģã‚Ŋをä―ŋį”ĻしãĶ新しいパã‚đãƒŊマドをčĻ­åŪšã—ãĶください。\n\n{resetUrl}\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、こãŪãƒĄãƒžãƒŦã‚’į„ĄčĶ–ã—ãĶå•éĄŒã‚ã‚Šãūせん。\n\nこãŪナãƒģã‚ŊãŊ1時間有åŠđです。\n\n– {product_name}チマム"
},
"registration_approved": {
"subject": "{product_name}ãŪį™ŧéŒēがæ‰ŋčŠã•ã‚Œãūした",
"body": "こんãŦãĄãŊ、{username}さん\n\nč‰ŊいおįŸĨらせです。{product_name}ãŪį™ŧéŒēがæ‰ŋčŠã•ã‚Œãūした。\n\nã“ãĄã‚‰ã‹ã‚‰{product_name}ã‚ĒプナãŦログã‚Īãƒģできãūす:\n{channelsUrl}\n\n{product_name}ã‚ģミãƒĨニテã‚Ģãļようこそ。\n\n– {product_name}チマム"
"body": "こんãŦãĄãŊ、{username}さん\n\nč‰ŊいおįŸĨらせです。{product_name}ãŪį™ŧéŒēがæ‰ŋčŠã•ã‚Œãūした。\n\nã“ãĄã‚‰ã‹ã‚‰{product_name}ã‚ĒプナãŦログã‚Īãƒģできãūす。\n{channelsUrl}\n\n{product_name}ã‚ģミãƒĨニテã‚Ģãļようこそ。\n\n– {product_name}チマム"
},
"report_resolved": {
"subject": "{product_name}ノポマトがåŊĐæŸŧされãūした",
"body": "こんãŦãĄãŊ、{username}さん\n\nおåŪĒæ§˜ãŪノポマトID: {reportId}をåŪ‰å…ĻチマムがåŊĐæŸŧしãūした。{hasComment, select, yes {\n\nåŪ‰å…ĻチマムからãŪå›žį­”:\n{publicComment}} other {}}\n\n{product_name}をすãđãĶãŪäššãŦãĻãĢãĶåŪ‰å…Ļおå ī所ãŦするご協力ありがãĻうございãūす。すãđãĶãŪãƒŽãƒãƒžãƒˆã‚’įœŸå‰ĢãŦ受けæ­Ēめ、ã‚ģミãƒĨニテã‚ĢãļãŪごčēĒįŒŪãŦæ„ŸčŽã—ãūす。\n\nこãŪįĩæžœãŦãĪいãĶごčģŠå•ã‚„ごäļæ˜ŽãŠį‚đがございãūしたら、{safety_email}ãūでお問い合わせください。\n\n– {product_name}åŪ‰å…Ļチマム"
"subject": "{product_name}ãļãŪå ąå‘ŠãŪåŊĐæŸŧがåŪŒäš†ã—ãūした",
"body": "こんãŦãĄãŊ、{username}さん\n\nã”å ąå‘Šã„ãŸã ã„ãŸå†…åŪđID: {reportId}をåŪ‰å…ĻチマムがåŊĐæŸŧしãūした。{hasComment, select, yes {\n\nåŪ‰å…ĻチマムからãŪå›žį­”:\n{publicComment}} other {}}\n\n{product_name}をすãđãĶãŪäššãŦãĻãĢãĶåŪ‰å…ĻãŦäŋãĪためãŪご協力ありがãĻうございãūす。すãđãĶãŪå ąå‘Šã‚’įœŸå‰ĢãŦ受けæ­Ēめ、ã‚ģミãƒĨニテã‚ĢãļãŪごčēĒįŒŪãŦæ„ŸčŽã—ãūす。\n\nこãŪįĩæžœãŦãĪいãĶごčģŠå•ã‚„ごäļæ˜ŽãŠį‚đがございãūしたら、{safety_email}ãūでお問い合わせください。\n\n– {product_name}åŪ‰å…Ļチマム"
},
"scheduled_deletion_notification": {
"subject": "{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŊåیå…ĻãŦ削é™Īされãūす",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŊ、æ°ļäđ…削é™Īが䚈åŪšã•ã‚ŒãĶいãūす。\n\n削é™Ī䚈åۚæ—Ĩ: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {į†į”ą: {reason}}\n}\n\nこれãŊ重åĪ§ãŠæŽŠį―Ūです。ã‚Ēã‚Ŧã‚Ķãƒģトデマã‚ŋãŊ、䚈åۚæ—ĨãŦåیå…ĻãŦ削é™Īされãūす。\n\nこãŪ掊į―Ūがäļæ­ĢįĒšã§ã‚ã‚‹ãĻ思われるå ī合ãŊã€į•°č­°į”ģしįŦ‹ãĶを提凚しãĶください。こãŪãƒĄãƒžãƒŦã‚Ēドノã‚đから{appeals_email}ãūã§ãƒĄãƒžãƒŦを送äŋĄã—ãĶください。\n\n– {product_name}åŪ‰å…Ļチマム"
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪåیå…Ļお削é™Īが䚈åŪšã•ã‚ŒãĶいãūす。\n\n削é™Ī䚈åۚæ—Ĩ時: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {į†į”ą: {reason}}\n}\n\nこれãŊ重åĪ§ãŠæŽŠį―Ūです。ã‚Ēã‚Ŧã‚Ķãƒģトデマã‚ŋãŊ、䚈åۚæ—ĨãŦåیå…ĻãŦ削é™Īされãūす。\n\nこãŪ掊į―Ūがäļæ­ĢįĒšã§ã‚ã‚‹ãĻ思われるå ī合ãŊã€į•°č­°į”ģしįŦ‹ãĶを提凚できãūす。こãŪãƒĄãƒžãƒŦã‚Ēドノã‚đから{appeals_email}ãūã§ãƒĄãƒžãƒŦを送äŋĄã—ãĶください。\n\n– {product_name}åŪ‰å…Ļチマム"
},
"self_deletion_scheduled": {
"subject": "{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪ削é™Īが䚈åŪšã•ã‚ŒãĶいãūす",
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪ削é™Īをナã‚Ŋã‚Ļã‚đトされãūした。ã‚Ēã‚Ŧã‚ĶãƒģトãŊäŧĨäļ‹ãŪæ—Ĩ時でæ°ļäđ…削é™Īが䚈åŪšã•ã‚ŒãĶいãūす。\n\n{deletionDate, date, full} {deletionDate, time, short}\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、ã‚Ēã‚Ŧã‚ĶãƒģトãŦログã‚ĪãƒģしãĶ削é™ĪをキãƒĢãƒģã‚ŧãƒŦしãĶください。ãūた、ã‚Ēã‚Ŧã‚Ķãƒģトをäŋč­·ã™ã‚‹ãŸã‚ãŦパã‚đãƒŊマドãŪåΉæ›īをお勧めしãūす。\n\n– {product_name}チマム"
"body": "こんãŦãĄãŊ、{username}さん\n\n{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪ削é™Īをナã‚Ŋã‚Ļã‚đトされãūした。ã‚Ēã‚Ŧã‚ĶãƒģトãŊäŧĨäļ‹ãŪæ—Ĩ時ãŦåیå…ĻãŦ削é™Īされる䚈åŪšã§ã™ã€‚\n\n{deletionDate, date, full} {deletionDate, time, short}\n\nã”č‡ŠčšŦでナã‚Ŋã‚Ļã‚đトしãĶいおいå ī合ãŊ、ã‚Ēã‚Ŧã‚ĶãƒģトãŦログã‚ĪãƒģしãĶ削é™ĪをキãƒĢãƒģã‚ŧãƒŦしãĶください。ãūた、ã‚Ēã‚Ŧã‚Ķãƒģトをäŋč­·ã™ã‚‹ãŸã‚ãŦパã‚đãƒŊマドãŪåΉæ›īをお勧めしãūす。\n\n– {product_name}チマム"
},
"unban_notification": {
"subject": "{product_name}ã‚Ēã‚Ŧã‚ĶãƒģトãŪ停æ­Ēがč§Ģé™Īされãūした",
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_KO_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -9,23 +9,23 @@ const EMAIL_I18N_KO_MESSAGES = defineEmailI18nLocaleMessages({
},
"account_scheduled_deletion": {
"subject": "{product_name} ęģ„ė •ėī 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\nė„œëđ„ėŠĪ ė•―ęī€ ë˜ëŠ” ėŧĪëŪĪ니티 가ėī드띾ėļ ėœ„ë°˜ėœžëĄœ ėļí•ī {product_name} ęģ„ė •ėī 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”.\n\nė‚­ė œ ė˜ˆė •ėž: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ė‚Žėœ : {reason}}\n}\n\nėī는 ėĪ‘ëŒ€í•œ ėĄ°ėđ˜ėīëа, ęģ„ė • 데ėī터는 ė˜ˆė •ëœ ë‚ ė§œė— 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”.\n\në‹ĪėŒ ë‚īėšĐė„ 확ėļí•ī ėĢžė„ļėš”:\n- ė„œëđ„ėŠĪ ė•―ęī€: {termsUrl}\n- ėŧĪëŪĪ니티 가ėī드띾ėļ: {guidelinesUrl}\n\nėīė˜ 렜ęļ° ė ˆė°Ļ:\nėī ėĄ°ėđ˜ę°€ ėž˜ëŠŧë˜ė—ˆęą°ë‚˜ ëķ€ë‹đ하ë‹Īęģ  ėƒę°ë˜ëĐī 60ėž ėīë‚ī뗐 ėīė˜ëĨž 렜ęļ°í•  눘 ėžˆė–īėš”. ėī ėīëĐ”ėž ėĢžė†Œė—ė„œ {appeals_email}로 ėīëĐ”ėžė„ ëģīë‚ī ėīė˜ëĨž 렜ęļ°í•ī ėĢžė„ļėš”.\n\nėīė˜ 렜ęļ° ė‹œė—ëŠ”:\n- ėĄ°ėđ˜ę°€ ėž˜ëŠŧë˜ė—ˆęą°ë‚˜ ëķ€ë‹đ하ë‹Īęģ  ėƒę°í•˜ëŠ” ėī뜠ëĨž 멅확하ęēŒ ė„Ī멅í•ī ėĢžė„ļėš”.\n- ęī€ë Ļ ėĶęą° 또는 ë§Ĩë―ė„ 렜ęģĩí•ī ėĢžė„ļėš”.\n\n{product_name} ė•ˆė „íŒ€ ëĐĪëē„ę°€ ėīė˜ 렜ęļ°ëĨž ęē€í† í•˜ęģ  ėĩœėĒ… ęē°ė •ėī ë‚īë Ī마 때ęđŒė§€ ė‚­ė œëĨž ėžė‹œė ėœžëĄœ ëģīëĨ˜í•  눘 ėžˆė–īėš”.\n\n– {product_name} ė•ˆė „íŒ€"
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\nė„œëđ„ėŠĪ ė•―ęī€ ë˜ëŠ” ėŧĪëŪĪ니티 가ėī드띾ėļ ėœ„ë°˜ėœžëĄœ ėļí•ī {product_name} ęģ„ė •ėī 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”.\n\nė‚­ė œ ė˜ˆė •ėž: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ė‚Žėœ : {reason}}\n}\n\nėī는 ėĪ‘ëŒ€í•œ ėĄ°ėđ˜ėīëа, ęģ„ė • 데ėī터는 ė˜ˆė •ëœ ë‚ ė§œė— 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”.\n\në‹ĪėŒ ë‚īėšĐė„ 확ėļí•ī ėĢžė„ļėš”:\n- ė„œëđ„ėŠĪ ė•―ęī€: {termsUrl}\n- ėŧĪëŪĪ니티 가ėī드띾ėļ: {guidelinesUrl}\n\nėīė˜ 렜ęļ° ė ˆė°Ļ:\nėī ėĄ°ėđ˜ę°€ ėž˜ëŠŧë˜ė—ˆęą°ë‚˜ ëķ€ë‹đ하ë‹Īęģ  ėƒę°ë˜ëĐī 60ėž ėīë‚ī뗐 ėīė˜ëĨž 렜ęļ°í•  눘 ėžˆė–īėš”. ėī ėīëĐ”ėž ėĢžė†Œė—ė„œ {appeals_email}ėœžëĄœ ėīëĐ”ėžė„ ëģīë‚ī ėīė˜ëĨž 렜ęļ°í•ī ėĢžė„ļėš”.\n\nėīė˜ 렜ęļ° ė‹œė—ëŠ”:\n- ėĄ°ėđ˜ę°€ ėž˜ëŠŧë˜ė—ˆęą°ë‚˜ ëķ€ë‹đ하ë‹Īęģ  ėƒę°í•˜ëŠ” ėī뜠ëĨž 멅확하ęēŒ ė„Ī멅í•ī ėĢžė„ļėš”.\n- ęī€ë Ļ ėĶęą° 또는 ë§Ĩë―ė„ 렜ęģĩí•ī ėĢžė„ļėš”.\n\n{product_name} ė•ˆė „íŒ€ ë‹īë‹đėžę°€ ėīė˜ 렜ęļ°ëĨž ęē€í† í•˜ęģ  ėĩœėĒ… ęē°ė •ėī ë‚īë Ī마 때ęđŒė§€ ė‚­ė œëĨž ėžė‹œė ėœžëĄœ ëģīëĨ˜í•  눘 ėžˆė–īėš”.\n\n– {product_name} ė•ˆė „íŒ€"
},
"account_temp_banned": {
"subject": "{product_name} ęģ„ė •ėī ėžė‹œė ėœžëĄœ ė •ė§€ë˜ė—ˆė–īėš”",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\nė„œëđ„ėŠĪ ė•―ęī€ ë˜ëŠ” ėŧĪëŪĪ니티 가ėī드띾ėļ ėœ„ë°˜ėœžëĄœ ėļí•ī {product_name} ęģ„ė •ėī ėžė‹œė ėœžëĄœ ė •ė§€ë˜ė—ˆė–īėš”.\n\nęļ°ę°„: {durationHours, plural,\n =1 {1ė‹œę°„}\n other {#ė‹œę°„}\n}\nė •ė§€ í•īė œėž: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {ė‚Žėœ : {reason}}\n}\n\nėī ęļ°ę°„ ë™ė•ˆė—ëŠ” ęģ„렕뗐 ė•Ąė„ļėŠĪ할 눘 ė—†ė–īėš”.\n\në‹ĪėŒ ë‚īėšĐė„ 확ėļí•ī ėĢžė„ļėš”:\n- ė„œëđ„ėŠĪ ė•―ęī€: {termsUrl}\n- ėŧĪëŪĪ니티 가ėī드띾ėļ: {guidelinesUrl}\n\nėī ėĄ°ėđ˜ę°€ ėž˜ëŠŧë˜ė—ˆęą°ë‚˜ ëķ€ë‹đ하ë‹Īęģ  ėƒę°ë˜ëĐī ėīė˜ëĨž 렜ęļ°í•  눘 ėžˆė–īėš”. ėī ėīëĐ”ėž ėĢžė†Œė—ė„œ {appeals_email}로 ėīëĐ”ėžė„ ëģīë‚ī ęē°ė •ėī ėž˜ëŠŧë˜ė—ˆë‹Īęģ  ėƒę°í•˜ëŠ” ėī뜠ëĨž 멅확하ęēŒ ė„Ī멅í•ī ėĢžė„ļėš”. ėīė˜ 렜ęļ°ëĨž ęē€í† í•œ 후 ęē°ęģžëĨž ė•Œë Ī 드ëĶī ė˜ˆė •ėīė—ėš”.\n\n– {product_name} ė•ˆė „íŒ€"
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\nė„œëđ„ėŠĪ ė•―ęī€ ë˜ëŠ” ėŧĪëŪĪ니티 가ėī드띾ėļ ėœ„ë°˜ėœžëĄœ ėļí•ī {product_name} ęģ„ė •ėī ėžė‹œė ėœžëĄœ ė •ė§€ë˜ė—ˆė–īėš”.\n\nęļ°ę°„: {durationHours, plural,\n =1 {1ė‹œę°„}\n other {#ė‹œę°„}\n}\nė •ė§€ í•ī렜 ėžė‹œ: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {ė‚Žėœ : {reason}}\n}\n\nėī ęļ°ę°„ ë™ė•ˆė—ëŠ” ęģ„렕뗐 ė•Ąė„ļėŠĪ할 눘 ė—†ė–īėš”.\n\në‹ĪėŒ ë‚īėšĐė„ 확ėļí•ī ėĢžė„ļėš”:\n- ė„œëđ„ėŠĪ ė•―ęī€: {termsUrl}\n- ėŧĪëŪĪ니티 가ėī드띾ėļ: {guidelinesUrl}\n\nėī ėĄ°ėđ˜ę°€ ėž˜ëŠŧë˜ė—ˆęą°ë‚˜ ëķ€ë‹đ하ë‹Īęģ  ėƒę°ë˜ëĐī ėīė˜ëĨž 렜ęļ°í•  눘 ėžˆė–īėš”. ėī ėīëĐ”ėž ėĢžė†Œė—ė„œ {appeals_email}ėœžëĄœ ėīëĐ”ėžė„ ëģīë‚ī ęē°ė •ėī ėž˜ëŠŧë˜ė—ˆë‹Īęģ  ėƒę°í•˜ëŠ” ėī뜠ëĨž 멅확하ęēŒ ė„Ī멅í•ī ėĢžė„ļėš”. ėīė˜ 렜ęļ°ëĨž ęē€í† í•œ 후 ęē°ęģžëĨž ė•Œë Ī 드ëĶī ė˜ˆė •ėīė—ėš”.\n\n– {product_name} ė•ˆė „íŒ€"
},
"donation_confirmation": {
"subject": "{product_name} í›„ė›ė— ę°ė‚Žë“œëĶ―ë‹ˆë‹Ī",
"body": "ė•ˆë…•í•˜ė„ļėš”,\n\n{product_name}뗐 í›„ė›í•ī ėĢžė…”ė„œ ę°ė‚Ží•īėš”! íšŒė›ë‹˜ė˜ {interval, select,\n month {ė •ęļ° í›„ė›}\n year {ė •ęļ° í›„ė›}\n other {ėžíšŒė„ą í›„ė›}\n}ėī ė„ąęģĩė ėœžëĄœ {interval, select,\n month {ė„Īė •ë˜ė—ˆė–īėš”}\n year {ė„Īė •ë˜ė—ˆė–īėš”}\n other {ėē˜ëĶŽë˜ė—ˆė–īėš”}\n}.\n\ní›„ė› 냁ė„ļ ė •ëģī:\nęļˆė•Ą: {amount} {currency} {interval, select,\n month {ë§Īė›”}\n year {ë§Ī년}\n other {}\n}\n\nStripeė—ė„œ ęģ§ ėļëģīėīėŠĪ PDF가 폎í•Ļ된 ëģ„ë„ė˜ 똁눘ėĶė„ ėīëĐ”ėžëĄœ ëģīë‚ī드ëĶī ė˜ˆė •ėīė—ėš”. ėī 똁눘ėĶė—ëŠ” ëŠĻ든 ęē°ė œ ė„ļëķ€ ė •ëģī가 폎í•Ļ되ė–ī ėžˆėœžëа, ė„ļęļˆ ëŠĐė ėœžëĄœ 활ėšĐ할 눘 ėžˆė–īėš”.\n\në‹ĪėŒ 링큎ëĨž í†ĩí•ī ė–ļė œë“ ė§€ í›„ė› ë‚īė—­ė„ 확ėļ하ęģ , ėļëģīėīėŠĪëĨž ë‹Īėšī로드하ęģ , {interval, select,\n month {ęĩŽë…ė„ ęī€ëĶŽí•˜ęą°ë‚˜ ė·Ļė†Œí•  눘 ėžˆė–īėš”}\n year {ęĩŽë…ė„ ęī€ëĶŽí•˜ęą°ë‚˜ ė·Ļė†Œí•  눘 ėžˆė–īėš”}\n other {í–Ĩ후 í›„ė›ė„ ęī€ëĶŽí•  눘 ėžˆė–īėš”}\n}:\n\n{manageUrl}\n\níšŒė›ë‹˜ė˜ í›„ė›ė€ {product_name}ëĨž ęģ„ė† ėšīė˜í•˜ëŠ” 데 큰 ë„ė›€ėī ëžėš”. ė§„ė‹ŽėœžëĄœ ę°ė‚Ží•īėš”!\n\n– {product_name} 팀"
"subject": "{product_name} í›„ė›ė— ę°ė‚Žë“œë Īėš”",
"body": "ė•ˆë…•í•˜ė„ļėš”,\n\n{product_name}뗐 í›„ė›í•ī ėĢžė…”ė„œ ę°ė‚Ží•īėš”! íšŒė›ë‹˜ė˜ {interval, select,\n month {ė •ęļ° í›„ė›}\n year {ė •ęļ° í›„ė›}\n other {ėžíšŒė„ą í›„ė›}\n}ėī ė„ąęģĩė ėœžëĄœ {interval, select,\n month {ė„Īė •ë˜ė—ˆė–īėš”}\n year {ė„Īė •ë˜ė—ˆė–īėš”}\n other {ėē˜ëĶŽë˜ė—ˆė–īėš”}\n}.\n\ní›„ė› 냁ė„ļ ė •ëģī:\nęļˆė•Ą: {amount} {interval, select,\n month {ë§Īė›”}\n year {ë§Ī년}\n other {}\n}\n\nStripeė—ė„œ ęģ§ ėļëģīėīėŠĪ PDF가 폎í•Ļ된 ëģ„ë„ė˜ 똁눘ėĶė„ ėīëĐ”ėžëĄœ ëģīë‚ī드ëĶī ė˜ˆė •ėīė—ėš”. ėī 똁눘ėĶė—ëŠ” ëŠĻ든 ęē°ė œ ė„ļëķ€ ė •ëģī가 폎í•Ļ되ė–ī ėžˆėœžëа, ė„ļęļˆ ëŠĐė ėœžëĄœ 활ėšĐ할 눘 ėžˆė–īėš”.\n\në‹ĪėŒ 링큎ëĨž í†ĩí•ī ė–ļė œë“ ė§€ í›„ė› ë‚īė—­ė„ 확ėļ하ęģ , ėļëģīėīėŠĪëĨž ë‹Īėšī로드하ęģ , {interval, select,\n month {ęĩŽë…ė„ ęī€ëĶŽí•˜ęą°ë‚˜ ė·Ļė†Œí•  눘 ėžˆė–īėš”}\n year {ęĩŽë…ė„ ęī€ëĶŽí•˜ęą°ë‚˜ ė·Ļė†Œí•  눘 ėžˆė–īėš”}\n other {í–Ĩ후 í›„ė›ė„ ęī€ëĶŽí•  눘 ėžˆė–īėš”}\n}:\n\n{manageUrl}\n\níšŒė›ë‹˜ė˜ í›„ė›ė€ {product_name}ëĨž ęģ„ė† ėšīė˜í•˜ëŠ” 데 큰 ë„ė›€ėī ëžėš”. ė§„ė‹ŽėœžëĄœ ę°ė‚Ží•īėš”!\n\n– {product_name} 팀"
},
"donation_magic_link": {
"subject": "{product_name} í›„ė› ë‚īė—­ ęī€ëĶŽ",
"body": "ė•ˆë…•í•˜ė„ļėš”,\n\nė•„ëž˜ 링큎ëĨž íīëĶ­í•˜ė—Ž í›„ė›ėž 폎í„ļ뗐 ė ‘ė†í•ī ėĢžė„ļėš”:\n\n{manageUrl}\n\n폎í„ļė—ė„œ ęĩŽë…ė„ ęī€ëĶŽí•˜ęģ , ėļëģīėīėŠĪëĨž ë‹Īėšī로드하ęģ , í›„ė› ë‚īė—­ė„ 확ėļ할 눘 ėžˆė–īėš”.\n\nėī 링큮는 {expiresAt, date, full} {expiresAt, time, short}뗐 만ëĢŒëžėš”.\n\nėī 링큎ëĨž ėš”ėē­í•˜ė§€ ė•Šė•˜ë‹ĪëĐī ėī ėīëĐ”ėžė„ ëŽīė‹œí•ī도 ęīœė°Ūė•„ėš”.\n\n– {product_name} 팀"
},
"dsa_report_verification": {
"subject": "DSA ëģīęģ ė„œ 렜ėķœ ėīëĐ”ėž ėļėĶ",
"body": "ė•ˆë…•í•˜ė„ļėš”,\n\nė•„ëž˜ ėļėĶ ė―”ë“œëĨž ė‚ŽėšĐí•˜ė—Ž {product_name}뗐 대한 ë””ė§€í„ļ ė„œëđ„ėŠĪëē• ëģīęģ ė„œëĨž 렜ėķœí•ī ėĢžė„ļėš”:\n\n{code}\n\nėī ė―”ë“œëŠ” {expiresAt, date, full} {expiresAt, time, short}뗐 만ëĢŒëžėš”.\n\nėš”ėē­í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī ėī ėīëĐ”ėžė„ ëŽīė‹œí•ī도 ęīœė°Ūė•„ėš”.\n\n– {product_name} ė•ˆė „íŒ€"
"subject": "DSA ė‹ ęģ ëĨž ėœ„í•œ ėīëĐ”ėž ėļėĶ",
"body": "ė•ˆë…•í•˜ė„ļėš”,\n\n{product_name}ė—ė„œ ë””ė§€í„ļ ė„œëđ„ėŠĪëē• ė‹ ęģ ëĨž 렜ėķœí•˜ë ĪëĐī ė•„ëž˜ ėļėĶ ė―”ë“œëĨž ė‚ŽėšĐí•ī ėĢžė„ļėš”:\n\n{code}\n\nėī ė―”ë“œëŠ” {expiresAt, date, full} {expiresAt, time, short}뗐 만ëĢŒëžėš”.\n\nėš”ėē­í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī ėī ėīëĐ”ėžė„ ëŽīė‹œí•ī도 ęīœė°Ūė•„ėš”.\n\n– {product_name} ė•ˆė „íŒ€"
},
"email_change_new": {
"subject": "냈 {product_name} ėīëĐ”ėž ėļėĶ",
@@ -33,10 +33,10 @@ const EMAIL_I18N_KO_MESSAGES = defineEmailI18nLocaleMessages({
},
"email_change_original": {
"subject": "{product_name} ėīëĐ”ėž ëģ€ęē― í™•ėļ",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n{product_name} ęģ„ė •ė˜ ėīëĐ”ėž ėĢžė†Œ ëģ€ęē― ėš”ėē­ėī ė ‘ėˆ˜ë˜ė—ˆė–īėš”.\n\nėī ëģ€ęē―ė„ 확ėļ하ë ĪëĐī ė•ąė— ėī ė―”ë“œëĨž ėž…ë Ĩí•ī ėĢžė„ļėš”:\n\n{code}\n\nėī ė―”ë“œëŠ” {expiresAt, date, full} {expiresAt, time, short}뗐 만ëĢŒëžėš”.\n\nėš”ėē­í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī ėĶ‰ė‹œ ęģ„ė •ė„ ëģīí˜ļ하ė„ļėš”.\n\n– {product_name} 팀"
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n{product_name} ęģ„ė •ė˜ ėīëĐ”ėž ėĢžė†Œ ëģ€ęē― ėš”ėē­ėī ė ‘ėˆ˜ë˜ė—ˆė–īėš”.\n\nėī ëģ€ęē―ė„ 확ėļ하ë ĪëĐī ė•ąė— ėī ė―”ë“œëĨž ėž…ë Ĩí•ī ėĢžė„ļėš”:\n\n{code}\n\nėī ė―”ë“œëŠ” {expiresAt, date, full} {expiresAt, time, short}뗐 만ëĢŒëžėš”.\n\nėš”ėē­í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī ėĶ‰ė‹œ ęģ„ė •ė„ ëģīí˜ļí•ī ėĢžė„ļėš”.\n\n– {product_name} 팀"
},
"email_change_revert": {
"subject": "{product_name} ėīëĐ”ėž ëģ€ęē― ė™„ë̌",
"subject": "{product_name} ėīëĐ”ėžėī ëģ€ęē―ë˜ė—ˆė–īėš”",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n{product_name} ęģ„ė •ė˜ ėīëĐ”ėž ėĢžė†Œę°€ {newEmail}로 ëģ€ęē―ë˜ė—ˆė–īėš”.\n\n링렑 ëģ€ęē―하ė…Ļë‹ĪëĐī ëģ„ë„ė˜ ėĄ°ėđ˜ëŠ” í•„ėš” ė—†ė–īėš”. 링렑 ëģ€ęē―í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī ë‹ĪėŒ 링큎ëĨž ė‚ŽėšĐí•˜ė—Ž ëģ€ęē― ė‚Ží•­ė„ 되돌ëĶŽęģ  ęģ„ė •ė„ ëģīí˜ļ할 눘 ėžˆė–īėš”:\n\n{revertUrl}\n\nėīė „ ėīëĐ”ėžėī ëģĩė›ë˜ęģ , ëŠĻ든 ęļ°ęļ°ė—ė„œ 로ę·ļė•„ė›ƒë˜ëа, ė—°ęē°ëœ ė „í™”ëēˆí˜ļ가 ė œęą°ë˜ęģ , MFA가 ëđ„í™œė„ąí™”ë˜ëа, 냈 ëđ„ë°€ëēˆí˜ļëĨž ė„Īė •í•īė•ž í•īėš”.\n\n– {product_name} ė•ˆė „íŒ€"
},
"email_verification": {
@@ -48,27 +48,27 @@ const EMAIL_I18N_KO_MESSAGES = defineEmailI18nLocaleMessages({
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\nė‚ŽėšĐí•˜ė‹  ė„ ëŽž ė―”ë“œëŠ” ë‹ĪëĨļ ė‚ŽėšĐėžę°€ ęē°ė œí•œ ęēƒėīė—ˆė–īėš”. í•īë‹đ ęē°ė œę°€ ė·Ļė†Œ(ė°Ļė§€ë°ą)ë˜ė—ˆė–īėš”.\n\nėī로 ėļí•ī ė„ ëŽžė„ ė‚ŽėšĐí–ˆė„ 때 ęģ„렕뗐 ėķ”ę°€ë˜ė—ˆë˜ 혜택ėī ė œęą°ë˜ė—ˆė–īėš”.\n\nė‹Īėˆ˜ëžęģ  ėƒę°ë˜ëĐī ęģ ę°ė§€ė›íŒ€ė— ëŽļė˜í•˜ė—Ž ė„ ëŽž ė―”ë“œ 및 ė‚ŽėšĐ ė‹œęļ°ė— 대한 ėžė„ļ한 ė •ëģīëĨž ė•Œë Ī ėĢžė„ļėš”.\n\n– {product_name} 팀"
},
"harvest_completed": {
"subject": "{product_name} 데ėī터 ë‚īëģīë‚īęļ° ë‹Īėšī로드가 ėĪ€ëđ„ë˜ė—ˆė–īėš”",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n데ėī터 ë‚īëģīë‚īęļ°ę°€ ėĪ€ëđ„ë˜ė—ˆė–īėš”.\n\në‹Īėšī로드 링큎:\n{downloadUrl}\n\n폎í•Ļ된 ëĐ”ė‹œė§€: {totalMessages, number}氜\níŒŒėž 큎ęļ°: {fileSizeMB, number} MB\n\nėī 링큮는 {expiresAt, date, full} {expiresAt, time, short}뗐 만ëĢŒëžėš”.\n\nėī ë‚īëģīë‚īęļ°ëĨž ėš”ėē­í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī ėĶ‰ė‹œ ëđ„ë°€ëēˆí˜ļëĨž ëģ€ęē―하ęģ  ęģ ę°ė§€ė›íŒ€ė— ëŽļė˜í•˜ė„ļėš”.\n\n– {product_name} 팀"
"subject": "{product_name} 데ėī터 ë‚īëģīë‚īęļ°ëĨž ë‹Īėšī로드할 눘 ėžˆė–īėš”",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n데ėī터 ë‚īëģīë‚īęļ°ę°€ ėĪ€ëđ„ë˜ė—ˆė–īėš”.\n\në‹Īėšī로드 링큎:\n{downloadUrl}\n\n폎í•Ļ된 ëĐ”ė‹œė§€: {totalMessages, number}氜\níŒŒėž 큎ęļ°: {fileSizeMB, number} MB\n\nėī 링큮는 {expiresAt, date, full} {expiresAt, time, short}뗐 만ëĢŒëžėš”.\n\nėī ë‚īëģīë‚īęļ°ëĨž ėš”ėē­í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī ėĶ‰ė‹œ ëđ„ë°€ëēˆí˜ļëĨž ëģ€ęē―하ęģ  ęģ ę°ė§€ė›íŒ€ė— ëŽļė˜í•ī ėĢžė„ļėš”.\n\n– {product_name} 팀"
},
"inactivity_warning": {
"subject": "활동 ëķ€ėĄąėœžëĄœ {product_name} ęģ„ė •ėī ė‚­ė œë  ė˜ˆė •ėīė—ėš”",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n{lastActiveDate, date, full} ėī후로 {product_name} ęģ„ė •ė—ė„œ 활동ėī ė—†ė—ˆė–īėš”.\n\n{deletionDate, date, full} {deletionDate, time, short}ęđŒė§€ 로ę·ļėļí•˜ė§€ ė•ŠėœžëĐī ęģ„ė •ėī 활동 ëķ€ėĄąėœžëĄœ 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”.\n\nė—Žęļ°ė—ė„œ 로ę·ļėļí•ī ėĢžė„ļėš”:\n{loginUrl}\n\nėĩœę·žė— {product_name}ëĨž ė‚ŽėšĐ했ë‹ĪëĐī ėĶ‰ė‹œ ęģ ę°ė§€ė›íŒ€ė— ëŽļė˜í•˜ė„ļėš”.\n\n– {product_name} 팀"
"subject": "ėžĨęļ°ę°„ ëŊļė ‘ė†ėœžëĄœ {product_name} ęģ„ė •ėī ė‚­ė œë  ė˜ˆė •ėīė—ėš”",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n{lastActiveDate, date, full} ėī후로 {product_name} ęģ„ė •ė—ė„œ 활동ėī ė—†ė—ˆė–īėš”.\n\n{deletionDate, date, full} {deletionDate, time, short}ęđŒė§€ 로ę·ļėļí•˜ė§€ ė•ŠėœžëĐī ėžĨęļ°ę°„ ëŊļė ‘ė†ėœžëĄœ ęģ„ė •ėī 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”.\n\nė—Žęļ°ė—ė„œ 로ę·ļėļí•ī ėĢžė„ļėš”:\n{loginUrl}\n\nėĩœę·žė— {product_name}ëĨž ė‚ŽėšĐ하ė…Ļë‹ĪëĐī ėĶ‰ė‹œ ęģ ę°ė§€ė›íŒ€ė— ëŽļė˜í•ī ėĢžė„ļėš”.\n\n– {product_name} 팀"
},
"ip_authorization": {
"subject": "냈 IP ėĢžė†Œė—ė„œ 로ę·ļėļė„ ėŠđėļí•ī ėĢžė„ļėš”",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\nėƒˆëĄœėšī IP ėĢžė†Œė—ė„œ {product_name} ęģ„ė •ėœžëĄœ 로ę·ļėļ ė‹œë„ę°€ ę°ė§€ë˜ė—ˆė–īėš”:\n\nIP ėĢžė†Œ: {ipAddress}\nėœ„ėđ˜: {location}\n\nëģļėļėī ė‹œë„í•œ ęē―뚰, ė•„ëž˜ 링큎ëĨž íīëĶ­í•˜ė—Ž ėī IP ėĢžė†ŒëĨž ėŠđėļí•ī ėĢžė„ļėš”:\n\n{authUrl}\n\n로ę·ļėļė„ ė‹œë„í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī ėĶ‰ė‹œ ëđ„ë°€ëēˆí˜ļëĨž ëģ€ęē―하ė„ļėš”.\n\nėī 링큮는 30ëķ„ ë™ė•ˆ 뜠íšĻí•īėš”.\n\n– {product_name} 팀"
"subject": "냈 IP ėĢžė†Œ 로ę·ļėļ ėŠđėļ",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\nėƒˆëĄœėšī IP ėĢžė†Œė—ė„œ {product_name} ęģ„ė •ėœžëĄœ 로ę·ļėļ ė‹œë„ę°€ ę°ė§€ë˜ė—ˆė–īėš”:\n\nIP ėĢžė†Œ: {ipAddress}\nėœ„ėđ˜: {location}\n\nëģļėļėī ė‹œë„í•œ ęē―뚰, ė•„ëž˜ 링큎ëĨž íīëĶ­í•˜ė—Ž ėī IP ėĢžė†ŒëĨž ėŠđėļí•ī ėĢžė„ļėš”:\n\n{authUrl}\n\n로ę·ļėļė„ ė‹œë„í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī ėĶ‰ė‹œ ëđ„ë°€ëēˆí˜ļëĨž ëģ€ęē―í•ī ėĢžė„ļėš”.\n\nėī 링큮는 30ëķ„ ë™ė•ˆ 뜠íšĻí•īėš”.\n\n– {product_name} 팀"
},
"mfa_backup_codes_view": {
"subject": "{product_name} ë°ąė—… ė―”ë“œ ė•Ąė„ļėŠĪëĨž 확ėļí•ī ėĢžė„ļėš”",
"subject": "{product_name} ë°ąė—… ė―”ë“œ ė•Ąė„ļėŠĪ 확ėļ",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n{product_name} ęģ„ė •ė˜ ë°ąė—… ė―”ë“œëĨž ëģīë Ī는 ėš”ėē­ėī ė ‘ėˆ˜ë˜ė—ˆė–īėš”.\n\nėī ėš”ėē­ė„ 확ėļ하ë ĪëĐī ė•ąė— ėī ė―”ë“œëĨž ėž…ë Ĩí•ī ėĢžė„ļėš”:\n\n{code}\n\nėī ė―”ë“œëŠ” {expiresAt, date, full} {expiresAt, time, short}뗐 만ëĢŒëžėš”.\n\nėš”ėē­í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī 누ęĩ°ę°€ ęģ„렕뗐 ė•Ąė„ļėŠĪí–ˆė„ 눘 ėžˆė–īėš”. ėĶ‰ė‹œ ëđ„ë°€ëēˆí˜ļëĨž ëģ€ęē―하ė„ļėš”.\n\n– {product_name} 팀"
},
"password_change_verification": {
"subject": "{product_name} ëđ„ë°€ëēˆí˜ļ ëģ€ęē―ė„ 확ėļí•ī ėĢžė„ļėš”",
"subject": "{product_name} ëđ„ë°€ëēˆí˜ļ ëģ€ęē― í™•ėļ",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n{product_name} ęģ„ė •ė˜ ëđ„ë°€ëēˆí˜ļ ëģ€ęē― ėš”ėē­ėī ė ‘ėˆ˜ë˜ė—ˆė–īėš”.\n\nėī ëģ€ęē―ė„ 확ėļ하ë ĪëĐī ė•ąė— ėī ė―”ë“œëĨž ėž…ë Ĩí•ī ėĢžė„ļėš”:\n\n{code}\n\nėī ė―”ë“œëŠ” {expiresAt}뗐 만ëĢŒëžėš”.\n\nėš”ėē­í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī 누ęĩ°ę°€ ęģ„렕뗐 ė•Ąė„ļėŠĪí–ˆė„ 눘 ėžˆė–īėš”. ėĶ‰ė‹œ ëđ„ë°€ëēˆí˜ļëĨž ëģ€ęē―하ęģ  2ë‹Ļęģ„ ėļėĶė„ í™œė„ąí™”í•˜ė„ļėš”.\n\n– {product_name} 팀"
},
"password_reset": {
"subject": "{product_name} ëđ„ë°€ëēˆí˜ļëĨž ėžŽė„Īė •í•ī ėĢžė„ļėš”",
"subject": "{product_name} ëđ„ë°€ëēˆí˜ļ ėžŽė„Īė •",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n{product_name} ëđ„ë°€ëēˆí˜ļ ėžŽė„Īė •ė„ ėš”ėē­í•˜ė…Ļė–īėš”. ė•„ëž˜ 링큎ëĨž ė‚ŽėšĐí•˜ė—Ž 냈 ëđ„ë°€ëēˆí˜ļëĨž ė„Īė •í•ī ėĢžė„ļėš”:\n\n{resetUrl}\n\nėš”ėē­í•˜ė§€ ė•Šėœžė…Ļë‹ĪëĐī ėī ėīëĐ”ėžė„ ëŽīė‹œí•ī도 ęīœė°Ūė•„ėš”.\n\nėī 링큮는 1ė‹œę°„ ë™ė•ˆ 뜠íšĻí•īėš”.\n\n– {product_name} 팀"
},
"registration_approved": {
@@ -77,11 +77,11 @@ const EMAIL_I18N_KO_MESSAGES = defineEmailI18nLocaleMessages({
},
"report_resolved": {
"subject": "{product_name} ė‹ ęģ  ęē€í† ę°€ 뙄ëĢŒë˜ė—ˆė–īėš”",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\níšŒė›ë‹˜ė˜ ė‹ ęģ (ID: {reportId})ëĨž ė•ˆė „íŒ€ė—ė„œ ęē€í† í–ˆė–īėš”.{hasComment, select, yes {\n\nė•ˆė „íŒ€ė˜ ë‹ĩëģ€:\n{publicComment}} other {}}\n\nëŠĻ두ëĨž ėœ„í•ī {product_name}ëĨž ė•ˆė „í•˜ęēŒ ėœ ė§€í•˜ëŠ” 데 ë„ė›€ė„ ėĢžė…”ė„œ ę°ė‚Ží•īėš”. ëŠĻ든 ė‹ ęģ ëĨž ė§„ė§€í•˜ęēŒ ęē€í† í•˜ęģ  ėžˆėœžëа, ėŧĪëŪĪë‹ˆí‹°ė— ęļ°ė—Ží•ī ėĢžė…”ė„œ ę°ė‚Ží•īėš”.\n\nėī ęē°ęģžė— 대í•ī ęķęļˆí•œ 렐ėī나 뚰ë Ī ė‚Ží•­ėī ėžˆë‹ĪëĐī {safety_email}ėœžëĄœ ëŽļė˜í•ī ėĢžė„ļėš”.\n\n– {product_name} ė•ˆė „íŒ€"
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\nė ‘ėˆ˜í•˜ė‹  ė‹ ęģ (ID: {reportId})ëĨž ė•ˆė „íŒ€ė—ė„œ ęē€í† í–ˆė–īėš”.{hasComment, select, yes {\n\nė•ˆė „íŒ€ė˜ ë‹ĩëģ€:\n{publicComment}} other {}}\n\nëŠĻ두ëĨž ėœ„í•ī {product_name}ëĨž ė•ˆė „í•˜ęēŒ ėœ ė§€í•˜ëŠ” 데 ë„ė›€ė„ ėĢžė…”ė„œ ę°ė‚Ží•īėš”. ëŠĻ든 ė‹ ęģ ëĨž ė§„ė§€í•˜ęēŒ ęē€í† í•˜ęģ  ėžˆėœžëа, ėŧĪëŪĪë‹ˆí‹°ė— ęļ°ė—Ží•ī ėĢžė…”ė„œ ę°ė‚Ží•īėš”.\n\nėī ęē°ęģžė— 대í•ī ęķęļˆí•œ 렐ėī나 뚰ë Ī ė‚Ží•­ėī ėžˆë‹ĪëĐī {safety_email}ėœžëĄœ ëŽļė˜í•ī ėĢžė„ļėš”.\n\n– {product_name} ė•ˆė „íŒ€"
},
"scheduled_deletion_notification": {
"subject": "{product_name} ęģ„ė •ėī 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”",
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n{product_name} ęģ„ė •ėī 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”.\n\nė‚­ė œ ė˜ˆė •ėž: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ė‚Žėœ : {reason}}\n}\n\nėī는 ėĪ‘ëŒ€í•œ ėĄ°ėđ˜ėīëа, ęģ„ė • 데ėī터는 ė˜ˆė •ëœ ë‚ ė§œė— 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”.\n\nėī ėĄ°ėđ˜ę°€ ėž˜ëŠŧë˜ė—ˆë‹Īęģ  ėƒę°ë˜ëĐī ėīė˜ëĨž 렜ęļ°í•  눘 ėžˆė–īėš”. ėī ėīëĐ”ėž ėĢžė†Œė—ė„œ {appeals_email}로 ėīëĐ”ėžė„ ëģīë‚ī ėīė˜ëĨž 렜ęļ°í•ī ėĢžė„ļėš”.\n\n– {product_name} ė•ˆė „íŒ€"
"body": "ė•ˆë…•í•˜ė„ļėš”, {username}님.\n\n{product_name} ęģ„ė •ėī 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”.\n\nė‚­ė œ ė˜ˆė •ėž: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ė‚Žėœ : {reason}}\n}\n\nėī는 ėĪ‘ëŒ€í•œ ėĄ°ėđ˜ėīëа, ęģ„ė • 데ėī터는 ė˜ˆė •ëœ ë‚ ė§œė— 똁ęĩŽė ėœžëĄœ ė‚­ė œë  ė˜ˆė •ėīė—ėš”.\n\nėī ėĄ°ėđ˜ę°€ ėž˜ëŠŧë˜ė—ˆë‹Īęģ  ėƒę°ë˜ëĐī ėīė˜ëĨž 렜ęļ°í•  눘 ėžˆė–īėš”. ėī ėīëĐ”ėž ėĢžė†Œė—ė„œ {appeals_email}ėœžëĄœ ėīëĐ”ėžė„ ëģīë‚ī ėīė˜ëĨž 렜ęļ°í•ī ėĢžė„ļėš”.\n\n– {product_name} ė•ˆė „íŒ€"
},
"self_deletion_scheduled": {
"subject": "{product_name} ęģ„ė • ė‚­ė œę°€ ė˜ˆė •ë˜ė—ˆė–īėš”",
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_LT_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Tavo {product_name} paskyra laikinai iÅĄjungta",
"body": "Sveikas, {username},\n\nLaikinai iÅĄjungėme tavo {product_name} paskyrą, nes aptikome ÄŊtartiną veiklą.\n\n{reason, select,\n null {}\n other {PrieÅūastis: {reason}}\n}\n\nNorėdamas atgauti prieigą prie paskyros, turėsi iÅĄ naujo nustatyti slaptaÅūodÄŊ:\n\n{forgotUrl}\n\nNustatęs slaptaÅūodÄŊ iÅĄ naujo, galėsi vėl prisijungti.\n\nJei manai, kad tai ÄŊvyko per klaidą, susisiek su mÅŦsÅģ palaikymo komanda.\n\n– {product_name} saugos komanda"
"body": "Sveiki, {username},\n\nLaikinai iÅĄjungėme tavo {product_name} paskyrą, nes aptikome ÄŊtartiną veiklą.\n\n{reason, select,\n null {}\n other {PrieÅūastis: {reason}}\n}\n\nKad atgautum prieigą prie paskyros, turėsi iÅĄ naujo nustatyti slaptaÅūodÄŊ:\n\n{forgotUrl}\n\nKai iÅĄ naujo nustatysi slaptaÅūodÄŊ, galėsi vėl prisijungti.\n\nJei manai, kad tai ÄŊvyko per klaidą, susisiek su mÅŦsÅģ palaikymo komanda.\n\n– {product_name} saugos komanda"
},
"account_scheduled_deletion": {
"subject": "Tavo {product_name} paskyra bus visam laikui iÅĄtrinta",
"body": "Sveikas, {username},\n\nTavo {product_name} paskyra numatyta visam laikui iÅĄtrinti dėl mÅŦsÅģ paslaugÅģ teikimo sąlygÅģ arba bendruomenės gairiÅģ paÅūeidimÅģ.\n\nNumatytas iÅĄtrynimas: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {PrieÅūastis: {reason}}\n}\n\nTai yra rimtas vykdymo veiksmas. Tavo paskyros duomenys bus visam laikui iÅĄtrinti numatytą dieną.\n\nPerÅūiÅŦrėk:\n- PaslaugÅģ teikimo sąlygos: {termsUrl}\n- Bendruomenės gairės: {guidelinesUrl}\n\nApeliacijos procesas:\nJei manai, kad ÅĄis vykdymo sprendimas buvo neteisingas arba nepagrÄŊstas, turi 60 dienÅģ pateikti apeliaciją. IÅĄ ÅĄio el. paÅĄto adreso siÅģsk el. laiÅĄką adresu {appeals_email}.\n\nSavo apeliacijoje:\n- AiÅĄkiai paaiÅĄkink, kodėl manai, kad vykdymo sprendimas buvo neteisingas arba nepagrÄŊstas\n- Pateik visus susijusius ÄŊrodymus ar kontekstą\n\n{product_name} saugos komandos narys perÅūiÅŦrės tavo apeliaciją ir gali sustabdyti laukiantÄŊ iÅĄtrynimą, kol bus priimtas galutinis sprendimas.\n\n– {product_name} saugos komanda"
"body": "Sveiki, {username},\n\nTavo {product_name} paskyrą numatyta visam laikui iÅĄtrinti dėl mÅŦsÅģ paslaugÅģ teikimo sąlygÅģ arba bendruomenės gairiÅģ paÅūeidimÅģ.\n\nNumatytas iÅĄtrynimas: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {PrieÅūastis: {reason}}\n}\n\nTai rimta priemonė. Tavo paskyros duomenys numatytą dieną bus visam laikui iÅĄtrinti.\n\nPerÅūiÅŦrėk:\n- PaslaugÅģ teikimo sąlygos: {termsUrl}\n- Bendruomenės gairės: {guidelinesUrl}\n\nApeliacijos procesas:\nJei manai, kad ÅĄis sprendimas neteisingas arba nepagrÄŊstas, apeliaciją gali pateikti per 60 dienÅģ. IÅĄ ÅĄio el. paÅĄto adreso siÅģsk el. laiÅĄką adresu {appeals_email}.\n\nSavo apeliacijoje:\n- AiÅĄkiai paaiÅĄkink, kodėl manai, kad sprendimas neteisingas arba nepagrÄŊstas\n- Pateik visus susijusius ÄŊrodymus ar kontekstą\n\n{product_name} saugos komandos narys perÅūiÅŦrės tavo apeliaciją ir gali sustabdyti numatytą iÅĄtrynimą, kol bus priimtas galutinis sprendimas.\n\n– {product_name} saugos komanda"
},
"account_temp_banned": {
"subject": "Tavo {product_name} paskyra laikinai sustabdyta",
"body": "Sveikas, {username},\n\nTavo {product_name} paskyra laikinai sustabdyta dėl mÅŦsÅģ paslaugÅģ teikimo sąlygÅģ arba bendruomenės gairiÅģ paÅūeidimo.\n\nTrukmė: {durationHours, plural,\n one {valandÄ} few {valandas}\n many {valandas} other {# valandÅģ}\n}\nSustabdyta iki: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {PrieÅūastis: {reason}}\n}\n\nÅ iuo laikotarpiu negalėsi prisijungti prie savo paskyros.\n\nPerÅūiÅŦrėk:\n- PaslaugÅģ teikimo sąlygos: {termsUrl}\n- Bendruomenės gairės: {guidelinesUrl}\n\nJei manai, kad ÅĄis vykdymo sprendimas buvo neteisingas arba nepagrÄŊstas, gali pateikti apeliaciją. IÅĄ ÅĄio el. paÅĄto adreso siÅģsk el. laiÅĄką adresu {appeals_email} ir aiÅĄkiai paaiÅĄkink, kodėl manai, kad sprendimas buvo neteisingas. PerÅūiÅŦrėsime tavo apeliaciją ir atsakysime su savo sprendimu.\n\n– {product_name} saugos komanda saugos komanda"
"body": "Sveiki, {username},\n\nTavo {product_name} paskyra laikinai sustabdyta dėl mÅŦsÅģ paslaugÅģ teikimo sąlygÅģ arba bendruomenės gairiÅģ paÅūeidimo.\n\nTrukmė: {durationHours, plural,\n one {# valanda} few {# valandos}\n many {# valandos} other {# valandÅģ}\n}\nSustabdyta iki: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {PrieÅūastis: {reason}}\n}\n\nÅ iuo laikotarpiu negalėsi pasiekti savo paskyros.\n\nPerÅūiÅŦrėk:\n- PaslaugÅģ teikimo sąlygos: {termsUrl}\n- Bendruomenės gairės: {guidelinesUrl}\n\nJei manai, kad ÅĄis sprendimas neteisingas arba nepagrÄŊstas, gali pateikti apeliaciją. IÅĄ ÅĄio el. paÅĄto adreso siÅģsk el. laiÅĄką adresu {appeals_email} ir aiÅĄkiai paaiÅĄkink, kodėl manai, kad sprendimas neteisingas. PerÅūiÅŦrėsime tavo apeliaciją ir praneÅĄime savo sprendimą.\n\n– {product_name} saugos komanda"
},
"donation_confirmation": {
"subject": "Dėkojame uÅū tavo {product_name} paramą",
"body": "Sveikas,\n\nDėkojame uÅū tavo paramą {product_name}! Tavo {interval, select,\n month {pasikartojanti parama}\n year {pasikartojanti parama}\n other {vienkartinė parama}\n} buvo {interval, select,\n month {nustatyta}\n year {nustatyta}\n other {apdorota}\n} sėkmingai.\n\nParamos detalės:\nSuma: {amount} {currency} {interval, select,\n month {per mėnesÄŊ}\n year {per metus}\n other {}\n}\n\nStripe netrukus atsiÅģs tau atskirą kvitą su sąskaitos faktÅŦros PDF. Tai apima visą mokėjimo informaciją ir gali bÅŦti naudojama mokesčiÅģ tikslais.\n\nGali perÅūiÅŦrėti savo paramos istoriją, atsisiÅģsti sąskaitas faktÅŦras, {interval, select,\n month {ir valdyti arba atÅĄaukti savo prenumeratą}\n year {ir valdyti arba atÅĄaukti savo prenumeratą}\n other {ir valdyti bÅŦsimą paramą}\n} bet kuriuo metu naudodamasis ÅĄia nuoroda:\n\n{manageUrl}\n\nTavo parama padeda {product_name} veikti. AčiÅŦ!\n\n– {product_name} komanda"
"body": "Sveiki,\n\nDėkojame uÅū tavo paramą {product_name}! Tavo {interval, select,\n month {pasikartojanti parama}\n year {pasikartojanti parama}\n other {vienkartinė parama}\n} sėkmingai {interval, select,\n month {nustatyta}\n year {nustatyta}\n other {apdorota}\n}.\n\nParamos informacija:\nSuma: {amount} {interval, select,\n month {per mėnesÄŊ}\n year {per metus}\n other {}\n}\n\nStripe netrukus atsiÅģs tau atskirą kvitą su sąskaitos faktÅŦros PDF. Jame nurodyta visa mokėjimo informacija ir jÄŊ galima naudoti mokesčiÅģ tikslais.\n\nBet kuriuo metu ÅĄia nuoroda gali perÅūiÅŦrėti savo paramos istoriją, atsisiÅģsti sąskaitas faktÅŦras {interval, select,\n month {ir valdyti arba atÅĄaukti savo prenumeratą}\n year {ir valdyti arba atÅĄaukti savo prenumeratą}\n other {ir valdyti bÅŦsimą paramą}\n}:\n\n{manageUrl}\n\nTavo parama padeda {product_name} veikti. AčiÅŦ!\n\n– {product_name} komanda"
},
"donation_magic_link": {
"subject": "Tvarkyk savo {product_name} paramą",
"body": "Sveikas,\n\nSpustelėk Åūemiau esančią nuorodą, kad pasiektum savo paramos portalą:\n\n{manageUrl}\n\nPortale gali valdyti prenumeratas, atsisiÅģsti sąskaitas faktÅŦras ir perÅūiÅŦrėti savo paramos istoriją.\n\nÅ i nuoroda galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei nepraÅĄei ÅĄios nuorodos, gali saugiai ignoruoti ÅĄÄŊ el. laiÅĄką.\n\n– {product_name} komanda"
"body": "Sveiki,\n\nSpustelėk Åūemiau esančią nuorodą, kad pasiektum savo rėmėjo portalą:\n\n{manageUrl}\n\nPortale gali valdyti prenumeratas, atsisiÅģsti sąskaitas faktÅŦras ir perÅūiÅŦrėti savo paramos istoriją.\n\nÅ i nuoroda galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei nepraÅĄei ÅĄios nuorodos, gali saugiai ignoruoti ÅĄÄŊ el. laiÅĄką.\n\n– {product_name} komanda"
},
"dsa_report_verification": {
"subject": "Patvirtink savo el. paÅĄtą dėl DSA ataskaitos",
"body": "Sveikas,\n\nNaudok Åūemiau esantÄŊ patvirtinimo kodą, kad pateiktum savo SkaitmeniniÅģ paslaugÅģ akto ataskaitą {product_name} platformoje:\n\n{code}\n\nÅ is kodas galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei to nepraÅĄei, gali ignoruoti ÅĄÄŊ el. laiÅĄką.\n\n– {product_name} saugos komanda"
"subject": "Patvirtink savo el. paÅĄtą DSA praneÅĄimui pateikti",
"body": "Sveiki,\n\nNaudok Åūemiau esantÄŊ patvirtinimo kodą, kad {product_name} platformoje pateiktum praneÅĄimą pagal SkaitmeniniÅģ paslaugÅģ aktą:\n\n{code}\n\nÅ is kodas galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei to nepraÅĄei, gali ignoruoti ÅĄÄŊ el. laiÅĄką.\n\n– {product_name} saugos komanda"
},
"email_change_new": {
"subject": "Patvirtink savo naują {product_name} el. paÅĄtą",
"body": "Sveikas, {username},\n\nÄŪvesk ÅĄÄŊ kodą programėlėje, kad patvirtintum savo naują {product_name} el. paÅĄtą:\n\n{code}\n\nÅ is kodas galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei to nepraÅĄei, gali ignoruoti ÅĄÄŊ el. laiÅĄką.\n\n– {product_name} komanda"
"body": "Sveiki, {username},\n\nÄŪvesk ÅĄÄŊ kodą programėlėje, kad patvirtintum savo naują {product_name} el. paÅĄtą:\n\n{code}\n\nÅ is kodas galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei to nepraÅĄei, gali ignoruoti ÅĄÄŊ el. laiÅĄką.\n\n– {product_name} komanda"
},
"email_change_original": {
"subject": "Patvirtink savo {product_name} el. paÅĄto keitimą",
"body": "Sveikas, {username},\n\nGavome praÅĄymą pakeisti tavo {product_name} paskyros el. paÅĄto adresą.\n\nNorėdamas patvirtinti ÅĄÄŊ pakeitimą, ÄŊvesk ÅĄÄŊ kodą programėlėje:\n\n{code}\n\nÅ is kodas galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei to nepraÅĄei, nedelsdamas apsaugok savo paskyrą.\n\n– {product_name} komanda"
"body": "Sveiki, {username},\n\nGavome praÅĄymą pakeisti tavo {product_name} paskyros el. paÅĄto adresą.\n\nKad patvirtintum ÅĄÄŊ pakeitimą, ÄŊvesk ÅĄÄŊ kodą programėlėje:\n\n{code}\n\nÅ is kodas galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei to nepraÅĄei, nedelsiant apsaugok savo paskyrą.\n\n– {product_name} komanda"
},
"email_change_revert": {
"subject": "Tavo {product_name} el. paÅĄtas buvo pakeistas",
"body": "Sveikas, {username},\n\nTavo {product_name} paskyros el. paÅĄto adresas buvo pakeistas ÄŊ {newEmail}.\n\nJei atlikai ÅĄÄŊ pakeitimą, jokiÅģ veiksmÅģ nereikia. Jei ne, gali atÅĄaukti pakeitimą ir apsaugoti savo paskyrą naudodamasis ÅĄia nuoroda:\n\n{revertUrl}\n\nTai atkurs tavo ankstesnÄŊ el. paÅĄtą, atsijungsi visur, paÅĄalinsi susietus telefono numerius, iÅĄjungsi MFA ir reikalaus nustatyti naują slaptaÅūodÄŊ.\n\n– {product_name} saugos komanda"
"body": "Sveiki, {username},\n\nTavo {product_name} paskyros el. paÅĄto adresas pakeistas ÄŊ {newEmail}.\n\nJei ÅĄÄŊ pakeitimą atlikai tu, nieko daryti nereikia. Jei ne, ÅĄia nuoroda gali atÅĄaukti pakeitimą ir apsaugoti savo paskyrą:\n\n{revertUrl}\n\nTai atkurs ankstesnÄŊ el. paÅĄto adresą, atjungs tave visuose ÄŊrenginiuose, paÅĄalins susietus telefono numerius, iÅĄjungs MFA ir pareikalaus nustatyti naują slaptaÅūodÄŊ.\n\n– {product_name} saugos komanda"
},
"email_verification": {
"subject": "Patvirtink savo {product_name} el. paÅĄto adresą",
"body": "Sveikas, {username},\n\nPatvirtink savo {product_name} paskyros el. paÅĄto adresą spustelėdamas Åūemiau esančią nuorodą:\n\n{verifyUrl}\n\nJei nesukÅŦrei {product_name} paskyros, gali saugiai ignoruoti ÅĄÄŊ el. laiÅĄką.\n\nÅ i nuoroda galioja 24 valandas.\n\n– {product_name} komanda"
"body": "Sveiki, {username},\n\nSpustelėk Åūemiau esančią nuorodą ir patvirtink savo {product_name} paskyros el. paÅĄto adresą:\n\n{verifyUrl}\n\nJei {product_name} paskyros nekÅŦrei, gali saugiai ignoruoti ÅĄÄŊ el. laiÅĄką.\n\nÅ i nuoroda galioja 24 valandas.\n\n– {product_name} komanda"
},
"gift_chargeback_notification": {
"subject": "Privalumai iÅĄ tavo iÅĄpirktos dovanos buvo paÅĄalinti",
"body": "Sveikas, {username},\n\nDovanos kodas, kurÄŊ iÅĄpirkai, iÅĄ pradÅūiÅģ buvo apmokėtas kito asmens. Tas mokėjimas vėliau buvo atÅĄauktas (grąÅūinimas).\n\nDėl to paÅĄalinome privalumus, kurie buvo pridėti prie tavo paskyros, kai iÅĄpirkai dovaną.\n\nJei manai, kad tai klaida, susisiek su mÅŦsÅģ palaikymo komanda ir pateik visą turimą informaciją apie dovanos kodą ir kada jÄŊ iÅĄpirkai.\n\n– {product_name} komanda"
"subject": "Privilegijos, gautos uÅū iÅĄpirktą dovaną, paÅĄalintos",
"body": "Sveiki, {username},\n\nDovanos kodą, kurÄŊ iÅĄpirkai, iÅĄ pradÅūiÅģ apmokėjo kitas asmuo. Tas mokėjimas vėliau buvo atÅĄauktas (lÄ—ÅĄÅģ grąÅūinimas).\n\nDėl to paÅĄalinome privilegijas, kurios buvo pridėtos prie tavo paskyros, kai iÅĄpirkai dovaną.\n\nJei manai, kad tai klaida, susisiek su mÅŦsÅģ palaikymo komanda ir nurodyk visą turimą informaciją apie dovanos kodą ir apie tai, kada jÄŊ iÅĄpirkai.\n\n– {product_name} komanda"
},
"harvest_completed": {
"subject": "Tavo {product_name} duomenÅģ eksportas paruoÅĄtas atsisiÅģsti",
"body": "Sveikas, {username},\n\nTavo duomenÅģ eksportas paruoÅĄtas.\n\nAtsisiuntimo nuoroda:\n{downloadUrl}\n\nÅ―inutės: {totalMessages, number}\nFailo dydis: {fileSizeMB, number} MB\n\nÅ i nuoroda galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei nepraÅĄei ÅĄio eksporto, nedelsdamas pakeisk slaptaÅūodÄŊ ir susisiek su mÅŦsÅģ palaikymo komanda.\n\n– {product_name} komanda"
"body": "Sveiki, {username},\n\nTavo duomenÅģ eksportas paruoÅĄtas.\n\nAtsisiuntimo nuoroda:\n{downloadUrl}\n\nÄŪtrauktos Åūinutės: {totalMessages, number}\nFailo dydis: {fileSizeMB, number} MB\n\nÅ i nuoroda galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei ÅĄio eksporto nepraÅĄei, nedelsiant pakeisk slaptaÅūodÄŊ ir susisiek su mÅŦsÅģ palaikymo komanda.\n\n– {product_name} komanda"
},
"inactivity_warning": {
"subject": "Tavo {product_name} paskyra bus iÅĄtrinta dėl neveiklumo",
"body": "Sveikas, {username},\n\nNematėme jokios veiklos tavo {product_name} paskyroje nuo {lastActiveDate, date, full}.\n\nJei neprisijungsi iki {deletionDate, date, full} {deletionDate, time, short}, tavo paskyra bus visam laikui iÅĄtrinta dėl neveiklumo.\n\nPrisijunk čia:\n{loginUrl}\n\nJei neseniai naudojai {product_name}, nedelsdamas susisiek su mÅŦsÅģ palaikymo komanda.\n\n– {product_name} komanda"
"subject": "Tavo {product_name} paskyra bus iÅĄtrinta dėl neaktyvumo",
"body": "Sveiki, {username},\n\nNuo {lastActiveDate, date, full} tavo {product_name} paskyroje nematėme jokios veiklos.\n\nJei neprisijungsi iki {deletionDate, date, full} {deletionDate, time, short}, tavo paskyra bus visam laikui iÅĄtrinta dėl neaktyvumo.\n\nPrisijunk čia:\n{loginUrl}\n\nJei neseniai naudojaisi {product_name}, nedelsiant susisiek su mÅŦsÅģ palaikymo komanda.\n\n– {product_name} komanda"
},
"ip_authorization": {
"subject": "Leisti prisijungimą iÅĄ naujo IP adreso",
"body": "Sveikas, {username},\n\nAptikome bandymą prisijungti prie tavo {product_name} paskyros iÅĄ naujo IP adreso:\n\nIP adresas: {ipAddress}\nVieta: {location}\n\nJei tai buvai tu, patvirtink ÅĄÄŊ IP adresą spustelėdamas Åūemiau esančią nuorodą:\n\n{authUrl}\n\nJei nebandei prisijungti, nedelsdamas pakeisk slaptaÅūodÄŊ.\n\nÅ i nuoroda galioja 30 minučiÅģ.\n\n– {product_name} komanda"
"subject": "Patvirtink prisijungimą iÅĄ naujo IP adreso",
"body": "Sveiki, {username},\n\nAptikome bandymą prisijungti prie tavo {product_name} paskyros iÅĄ naujo IP adreso:\n\nIP adresas: {ipAddress}\nVieta: {location}\n\nJei tai buvai tu, spustelėk Åūemiau esančią nuorodą ir patvirtink ÅĄÄŊ IP adresą:\n\n{authUrl}\n\nJei prisijungti nebandei, nedelsiant pakeisk slaptaÅūodÄŊ.\n\nÅ i nuoroda galioja 30 minučiÅģ.\n\n– {product_name} komanda"
},
"mfa_backup_codes_view": {
"subject": "Patvirtink prieigą prie savo {product_name} atsarginiÅģ kodÅģ",
"body": "Sveikas, {username},\n\nGavome praÅĄymą perÅūiÅŦrėti tavo {product_name} paskyros atsarginius kodus.\n\nNorėdamas patvirtinti ÅĄÄŊ praÅĄymą, ÄŊvesk ÅĄÄŊ kodą programėlėje:\n\n{code}\n\nÅ is kodas galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei to nepraÅĄei, kaÅūkas gali turėti prieigą prie tavo paskyros. Nedelsdamas pakeisk slaptaÅūodÄŊ.\n\n– {product_name} komanda"
"body": "Sveiki, {username},\n\nGavome praÅĄymą perÅūiÅŦrėti tavo {product_name} paskyros atsarginius kodus.\n\nKad patvirtintum ÅĄÄŊ praÅĄymą, ÄŊvesk ÅĄÄŊ kodą programėlėje:\n\n{code}\n\nÅ is kodas galioja iki {expiresAt, date, full} {expiresAt, time, short}.\n\nJei to nepraÅĄei, kaÅūkas gali turėti prieigą prie tavo paskyros. Nedelsiant pakeisk slaptaÅūodÄŊ.\n\n– {product_name} komanda"
},
"password_change_verification": {
"subject": "Patvirtink savo {product_name} slaptaÅūodÅūio keitimą",
"body": "Sveikas, {username},\n\nGavome praÅĄymą pakeisti tavo {product_name} paskyros slaptaÅūodÄŊ.\n\nNorėdamas patvirtinti ÅĄÄŊ pakeitimą, ÄŊvesk ÅĄÄŊ kodą programėlėje:\n\n{code}\n\nÅ is kodas galioja iki {expiresAt}.\n\nJei to nepraÅĄei, kaÅūkas gali turėti prieigą prie tavo paskyros. Nedelsdamas pakeisk slaptaÅūodÄŊ ir ÄŊjunk dviejÅģ veiksniÅģ autentifikavimą.\n\n– {product_name} komanda"
"body": "Sveiki, {username},\n\nGavome praÅĄymą pakeisti tavo {product_name} paskyros slaptaÅūodÄŊ.\n\nKad patvirtintum ÅĄÄŊ pakeitimą, ÄŊvesk ÅĄÄŊ kodą programėlėje:\n\n{code}\n\nÅ is kodas galioja iki {expiresAt}.\n\nJei to nepraÅĄei, kaÅūkas gali turėti prieigą prie tavo paskyros. Nedelsiant pakeisk slaptaÅūodÄŊ ir ÄŊjunk dviejÅģ veiksniÅģ autentifikavimą.\n\n– {product_name} komanda"
},
"password_reset": {
"subject": "Nustatyk iÅĄ naujo savo {product_name} slaptaÅūodÄŊ",
"body": "Sveikas, {username},\n\nTu papraÅĄei iÅĄ naujo nustatyti {product_name} slaptaÅūodÄŊ. Naudok Åūemiau esančią nuorodą, kad nustatytum naują slaptaÅūodÄŊ:\n\n{resetUrl}\n\nJei to nepraÅĄei, gali saugiai ignoruoti ÅĄÄŊ el. laiÅĄką.\n\nÅ i nuoroda galioja 1 valandą.\n\n– {product_name} komanda"
"subject": "IÅĄ naujo nustatyk savo {product_name} slaptaÅūodÄŊ",
"body": "Sveiki, {username},\n\nPapraÅĄei iÅĄ naujo nustatyti {product_name} slaptaÅūodÄŊ. Naudok Åūemiau esančią nuorodą, kad nustatytum naują slaptaÅūodÄŊ:\n\n{resetUrl}\n\nJei to nepraÅĄei, gali saugiai ignoruoti ÅĄÄŊ el. laiÅĄką.\n\nÅ i nuoroda galioja 1 valandą.\n\n– {product_name} komanda"
},
"registration_approved": {
"subject": "Tavo {product_name} registracija patvirtinta",
"body": "Sveikas, {username},\n\nGeros naujienos: tavo {product_name} registracija patvirtinta.\n\nDabar gali prisijungti prie {product_name} programėlės čia:\n{channelsUrl}\n\nSveikas atvykęs ÄŊ {product_name} bendruomenę.\n\n– {product_name} komanda"
"body": "Sveiki, {username},\n\nGeros naujienos: tavo {product_name} registracija patvirtinta.\n\nDabar gali prisijungti prie {product_name} programėlės čia:\n{channelsUrl}\n\nSveiki atvykę ÄŊ {product_name} bendruomenę.\n\n– {product_name} komanda"
},
"report_resolved": {
"subject": "Tavo {product_name} ataskaita buvo perÅūiÅŦrėta",
"body": "Sveikas, {username},\n\nTavo ataskaitą (ID: {reportId}) perÅūiÅŦrėjo mÅŦsÅģ saugos komanda.{hasComment, select, yes {\n\nSaugos komandos atsakymas:\n{publicComment}} other {}}\n\nDėkojame, kad padedi uÅūtikrinti {product_name} saugumą visiems. Visas ataskaitas vertiname rimtai ir vertiname tavo indėlÄŊ ÄŊ bendruomenę.\n\nJei turi klausimÅģ ar abejoniÅģ dėl ÅĄio rezultato, susisiek su {safety_email}.\n\n– {product_name} saugos komanda"
"subject": "Tavo {product_name} praneÅĄimas perÅūiÅŦrėtas",
"body": "Sveiki, {username},\n\nTavo praneÅĄimą (ID: {reportId}) perÅūiÅŦrėjo mÅŦsÅģ saugos komanda.{hasComment, select, yes {\n\nSaugos komandos atsakymas:\n{publicComment}} other {}}\n\nDėkojame, kad padedi uÅūtikrinti {product_name} saugumą visiems. Visus praneÅĄimus vertiname rimtai ir esame dėkingi uÅū tavo indėlÄŊ ÄŊ bendruomenę.\n\nJei turi klausimÅģ ar abejoniÅģ dėl ÅĄio sprendimo, raÅĄyk adresu {safety_email}.\n\n– {product_name} saugos komanda"
},
"scheduled_deletion_notification": {
"subject": "Tavo {product_name} paskyra bus visam laikui iÅĄtrinta",
"body": "Sveikas, {username},\n\nTavo {product_name} paskyra numatyta visam laikui iÅĄtrinti.\n\nNumatytas iÅĄtrynimas: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {PrieÅūastis: {reason}}\n}\n\nTai yra rimtas vykdymo veiksmas. Tavo paskyros duomenys bus visam laikui iÅĄtrinti numatytą dieną.\n\nJei manai, kad ÅĄis vykdymo sprendimas buvo neteisingas, gali pateikti apeliaciją. IÅĄ ÅĄio el. paÅĄto adreso siÅģsk el. laiÅĄką adresu {appeals_email}.\n\n– {product_name} saugos komanda"
"body": "Sveiki, {username},\n\nTavo {product_name} paskyrą numatyta visam laikui iÅĄtrinti.\n\nNumatytas iÅĄtrynimas: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {PrieÅūastis: {reason}}\n}\n\nTai rimta priemonė. Tavo paskyros duomenys numatytą dieną bus visam laikui iÅĄtrinti.\n\nJei manai, kad ÅĄis sprendimas neteisingas, gali pateikti apeliaciją. IÅĄ ÅĄio el. paÅĄto adreso siÅģsk el. laiÅĄką adresu {appeals_email}.\n\n– {product_name} saugos komanda"
},
"self_deletion_scheduled": {
"subject": "Tavo {product_name} paskyros iÅĄtrynimas suplanuotas",
"body": "Sveikas, {username},\n\nTu papraÅĄei iÅĄtrinti savo {product_name} paskyrą. Tavo paskyra numatyta visam laikui iÅĄtrinti:\n\n{deletionDate, date, full} {deletionDate, time, short}\n\nJei to nepraÅĄei, prisijunk prie savo paskyros, kad atÅĄauktum iÅĄtrynimą. Taip pat rekomenduojame pakeisti slaptaÅūodÄŊ, kad apsaugotum savo paskyrą.\n\n– {product_name} komanda"
"subject": "Tavo {product_name} paskyros iÅĄtrynimas numatytas",
"body": "Sveiki, {username},\n\nPapraÅĄei iÅĄtrinti savo {product_name} paskyrą. Tavo paskyrą numatyta visam laikui iÅĄtrinti:\n\n{deletionDate, date, full} {deletionDate, time, short}\n\nJei to nepraÅĄei, prisijunk prie savo paskyros ir atÅĄauk iÅĄtrynimą. Taip pat rekomenduojame pakeisti slaptaÅūodÄŊ, kad apsaugotum savo paskyrą.\n\n– {product_name} komanda"
},
"unban_notification": {
"subject": "Tavo {product_name} paskyros sustabdymas panaikintas",
"body": "Sveikas, {username},\n\nGeros naujienos: tavo {product_name} paskyros sustabdymas panaikintas.\n\n{reason, select,\n null {}\n other {PrieÅūastis: {reason}}\n}\n\nDabar gali vėl prisijungti ir toliau naudotis {product_name} kaip ÄŊprasta.\n\n– {product_name} saugos komanda"
"body": "Sveiki, {username},\n\nGeros naujienos: tavo {product_name} paskyros sustabdymas panaikintas.\n\n{reason, select,\n null {}\n other {PrieÅūastis: {reason}}\n}\n\nDabar gali vėl prisijungti ir toliau naudotis {product_name} kaip ÄŊprasta.\n\n– {product_name} saugos komanda"
}
});
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_NL_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Je {product_name}-account is tijdelijk uitgeschakeld",
"body": "Hallo {username},\n\nWe hebben je {product_name}-account tijdelijk uitgeschakeld omdat we verdachte activiteit hebben gedetecteerd.\n\n{reason, select,\n null {}\n other {Reden: {reason}}\n}\n\nOm weer toegang te krijgen tot je account, moet je je wachtwoord opnieuw instellen:\n\n{forgotUrl}\n\nNadat je je wachtwoord opnieuw hebt ingesteld, kun je weer inloggen.\n\nAls je denkt dat dit een fout is, neem dan contact op met ons support-team.\n\n– {product_name} Safety Team"
"body": "Hallo {username},\n\nWe hebben je {product_name}-account tijdelijk uitgeschakeld omdat we verdachte activiteit hebben gedetecteerd.\n\n{reason, select,\n null {}\n other {Reden: {reason}}\n}\n\nOm weer toegang te krijgen tot je account, moet je je wachtwoord opnieuw instellen:\n\n{forgotUrl}\n\nNadat je je wachtwoord opnieuw hebt ingesteld, kun je weer inloggen.\n\nAls je denkt dat dit een fout is, neem dan contact op met ons supportteam.\n\n– Het veiligheidsteam van {product_name}"
},
"account_scheduled_deletion": {
"subject": "Je {product_name}-account wordt permanent verwijderd",
"body": "Hallo {username},\n\nJe {product_name}-account is gepland voor permanente verwijdering vanwege schendingen van onze Servicevoorwaarden of Communityrichtlijnen.\n\nGeplande verwijdering: {deletionDate, date, full} om {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Reden: {reason}}\n}\n\nDit is een serieuze handhavingsactie. Je accountgegevens worden permanent verwijderd op de geplande datum.\n\nBekijk ook:\n- Servicevoorwaarden: {termsUrl}\n- Communityrichtlijnen: {guidelinesUrl}\n\nBeroepsprocedure:\nAls je van mening bent dat deze handhavingsbeslissing onjuist of ongerechtvaardigd was, heb je 60 dagen de tijd om beroep aan te tekenen. Stuur een e-mail naar {appeals_email} vanaf dit e-mailadres.\n\nVermeld in je beroep:\n- Een duidelijke uitleg waarom je van mening bent dat de handhavingsbeslissing onjuist of ongerechtvaardigd was\n- Alle relevante bewijzen of context\n\nEen lid van het {product_name} Safety-Team zal je beroep beoordelen en kan de lopende verwijdering pauzeren totdat een definitieve beslissing is genomen.\n\n– {product_name} Safety Team"
"body": "Hallo {username},\n\nJe {product_name}-account staat gepland voor permanente verwijdering vanwege schendingen van onze Gebruiksvoorwaarden of Communityrichtlijnen.\n\nGeplande verwijdering: {deletionDate, date, full} om {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Reden: {reason}}\n}\n\nDit is een ingrijpende handhavingsmaatregel. Je accountgegevens worden permanent verwijderd op de geplande datum.\n\nBekijk ook:\n- Gebruiksvoorwaarden: {termsUrl}\n- Communityrichtlijnen: {guidelinesUrl}\n\nBezwaarprocedure:\nAls je van mening bent dat deze handhavingsbeslissing onjuist of ongerechtvaardigd was, heb je 60 dagen de tijd om bezwaar te maken. Stuur een e-mail naar {appeals_email} vanaf dit e-mailadres.\n\nVermeld in je bezwaar:\n- Een duidelijke uitleg waarom je van mening bent dat de handhavingsbeslissing onjuist of ongerechtvaardigd was\n- Alle relevante bewijzen of context\n\nEen medewerker van het veiligheidsteam van {product_name} zal je bezwaar beoordelen en kan de geplande verwijdering uitstellen totdat een definitieve beslissing is genomen.\n\n– Het veiligheidsteam van {product_name}"
},
"account_temp_banned": {
"subject": "Je {product_name}-account is tijdelijk opgeschort",
"body": "Hallo {username},\n\nJe {product_name}-account is tijdelijk opgeschort wegens schending van onze Servicevoorwaarden of Communityrichtlijnen.\n\nDuur: {durationHours, plural,\n =1 {1 uur}\n other {# uur}\n}\nOpgeschort tot: {bannedUntil, date, full} om {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Reden: {reason}}\n}\n\nGedurende deze periode heb je geen toegang tot je account.\n\nBekijk ook:\n- Servicevoorwaarden: {termsUrl}\n- Communityrichtlijnen: {guidelinesUrl}\n\nAls je van mening bent dat deze handhavingsbeslissing onjuist of ongerechtvaardigd was, kun je beroep aantekenen. Stuur een e-mail naar {appeals_email} vanaf dit e-mailadres en leg duidelijk uit waarom je van mening bent dat de beslissing onjuist was. We zullen je beroep beoordelen en reageren met onze beslissing.\n\n– {product_name} Safety Team"
"subject": "Je {product_name}-account is tijdelijk geschorst",
"body": "Hallo {username},\n\nJe {product_name}-account is tijdelijk geschorst wegens schending van onze Gebruiksvoorwaarden of Communityrichtlijnen.\n\nDuur: {durationHours, plural,\n =1 {1 uur}\n other {# uur}\n}\nGeschorst tot: {bannedUntil, date, full} om {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Reden: {reason}}\n}\n\nGedurende deze periode heb je geen toegang tot je account.\n\nBekijk ook:\n- Gebruiksvoorwaarden: {termsUrl}\n- Communityrichtlijnen: {guidelinesUrl}\n\nAls je van mening bent dat deze handhavingsbeslissing onjuist of ongerechtvaardigd was, kun je bezwaar maken. Stuur een e-mail naar {appeals_email} vanaf dit e-mailadres en leg duidelijk uit waarom je van mening bent dat de beslissing onjuist was. We zullen je bezwaar beoordelen en reageren met onze beslissing.\n\n– Het veiligheidsteam van {product_name}"
},
"donation_confirmation": {
"subject": "Bedankt voor je {product_name}-donatie",
"body": "Hallo,\n\nBedankt voor je donatie aan {product_name}! Je {interval, select,\n month {terugkerende donatie}\n year {terugkerende donatie}\n other {eenmalige donatie}\n} is succesvol {interval, select,\n month {ingesteld}\n year {ingesteld}\n other {verwerkt}\n}.\n\nDonatiegegevens:\nBedrag: {amount} {currency} {interval, select,\n month {per maand}\n year {per jaar}\n other {}\n}\n\nStripe stuurt je binnenkort een aparte bon met je factuur-pdf. Deze bevat alle betalingsgegevens en kan worden gebruikt voor belastingdoeleinden.\n\nJe kunt je donatiegeschiedenis bekijken, facturen downloaden en {interval, select,\n month {je abonnement beheren of opzeggen}\n year {je abonnement beheren of opzeggen}\n other {toekomstige donaties beheren}\n} via deze link:\n\n{manageUrl}\n\nJe steun helpt {product_name} draaiende te houden. Bedankt!\n\n– {product_name} Team"
"body": "Hallo,\n\nBedankt voor je donatie aan {product_name}! Je {interval, select,\n month {terugkerende donatie}\n year {terugkerende donatie}\n other {eenmalige donatie}\n} is succesvol {interval, select,\n month {ingesteld}\n year {ingesteld}\n other {verwerkt}\n}.\n\nDonatiegegevens:\nBedrag: {amount} {interval, select,\n month {per maand}\n year {per jaar}\n other {}\n}\n\nStripe stuurt je binnenkort per e-mail een apart betalingsbewijs met je factuur als pdf. Dit bevat alle betalingsgegevens en kan worden gebruikt voor belastingdoeleinden.\n\nJe kunt op elk moment je donatiegeschiedenis bekijken, facturen downloaden en {interval, select,\n month {je abonnement beheren of opzeggen}\n year {je abonnement beheren of opzeggen}\n other {toekomstige donaties beheren}\n} via deze link:\n\n{manageUrl}\n\nJe steun helpt {product_name} draaiende te houden. Bedankt!\n\n– Het team van {product_name}"
},
"donation_magic_link": {
"subject": "Beheer je {product_name}-donaties",
"body": "Hallo,\n\nKlik op de onderstaande link om toegang te krijgen tot je donateursportaal:\n\n{manageUrl}\n\nIn het portaal kun je abonnementen beheren, facturen downloaden en je donatiegeschiedenis bekijken.\n\nDeze link verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je deze link niet hebt aangevraagd, kun je deze e-mail veilig negeren.\n\n– {product_name} Team"
"body": "Hallo,\n\nKlik op de onderstaande link om toegang te krijgen tot je donateursportaal:\n\n{manageUrl}\n\nIn het portaal kun je abonnementen beheren, facturen downloaden en je donatiegeschiedenis bekijken.\n\nDeze link verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je deze link niet hebt aangevraagd, kun je deze e-mail veilig negeren.\n\n– Het team van {product_name}"
},
"dsa_report_verification": {
"subject": "Verifieer je e-mail voor een DSA-rapport",
"body": "Hallo,\n\nGebruik de onderstaande verificatiecode om je Digital Services Act-rapport op {product_name} in te dienen:\n\n{code}\n\nDeze code verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je dit niet hebt aangevraagd, kun je deze e-mail negeren.\n\n– {product_name} Safety Team"
"subject": "Verifieer je e-mailadres voor een DSA-melding",
"body": "Hallo,\n\nGebruik de onderstaande verificatiecode om je melding op grond van de Digital Services Act op {product_name} in te dienen:\n\n{code}\n\nDeze code verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je dit niet hebt aangevraagd, kun je deze e-mail negeren.\n\n– Het veiligheidsteam van {product_name}"
},
"email_change_new": {
"subject": "Verifieer je nieuwe {product_name}-e-mail",
"body": "Hallo {username},\n\nVoer deze code in de app in om je nieuwe {product_name}-e-mail te verifiÃŦren:\n\n{code}\n\nDeze code verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je dit niet hebt aangevraagd, kun je deze e-mail negeren.\n\n– {product_name} Team"
"subject": "Verifieer je nieuwe e-mailadres op {product_name}",
"body": "Hallo {username},\n\nVoer deze code in de app in om je nieuwe e-mailadres op {product_name} te verifiÃŦren:\n\n{code}\n\nDeze code verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je dit niet hebt aangevraagd, kun je deze e-mail negeren.\n\n– Het team van {product_name}"
},
"email_change_original": {
"subject": "Bevestig je {product_name}-e-mailwijziging",
"body": "Hallo {username},\n\nWe hebben een verzoek ontvangen om het e-mailadres van je {product_name}-account te wijzigen.\n\nOm deze wijziging te bevestigen, voer je deze code in de app in:\n\n{code}\n\nDeze code verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je dit niet hebt aangevraagd, beveilig je account dan onmiddellijk.\n\n– {product_name} Team"
"subject": "Bevestig de wijziging van je e-mailadres op {product_name}",
"body": "Hallo {username},\n\nWe hebben een verzoek ontvangen om het e-mailadres van je {product_name}-account te wijzigen.\n\nOm deze wijziging te bevestigen, voer je deze code in de app in:\n\n{code}\n\nDeze code verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je dit niet hebt aangevraagd, beveilig je account dan onmiddellijk.\n\n– Het team van {product_name}"
},
"email_change_revert": {
"subject": "Je {product_name}-e-mail is gewijzigd",
"body": "Hallo {username},\n\nHet e-mailadres van je {product_name}-account is gewijzigd naar {newEmail}.\n\nAls je deze wijziging zelf hebt aangebracht, hoef je niets te doen. Als je dit niet hebt gedaan, kun je de wijziging ongedaan maken en je account beveiligen via deze link:\n\n{revertUrl}\n\nDit herstelt je vorige e-mail, meldt je overal af, verwijdert gekoppelde telefoonnummers, schakelt MFA uit en vereist dat je een nieuw wachtwoord instelt.\n\n– {product_name} Safety Team"
"subject": "Je e-mailadres op {product_name} is gewijzigd",
"body": "Hallo {username},\n\nHet e-mailadres van je {product_name}-account is gewijzigd naar {newEmail}.\n\nAls je deze wijziging zelf hebt aangebracht, hoef je niets te doen. Als je dit niet hebt gedaan, kun je de wijziging ongedaan maken en je account beveiligen via deze link:\n\n{revertUrl}\n\nDit herstelt je vorige e-mailadres, meldt je overal af, verwijdert gekoppelde telefoonnummers, schakelt MFA uit en vereist dat je een nieuw wachtwoord instelt.\n\n– Het veiligheidsteam van {product_name}"
},
"email_verification": {
"subject": "Verifieer je {product_name}-e-mailadres",
"body": "Hallo {username},\n\nVerifieer het e-mailadres van je {product_name}-account door op de onderstaande link te klikken:\n\n{verifyUrl}\n\nAls je geen {product_name}-account hebt aangemaakt, kun je deze e-mail veilig negeren.\n\nDeze link is 24 uur geldig.\n\n– {product_name} Team"
"subject": "Verifieer je e-mailadres op {product_name}",
"body": "Hallo {username},\n\nVerifieer het e-mailadres van je {product_name}-account door op de onderstaande link te klikken:\n\n{verifyUrl}\n\nAls je geen {product_name}-account hebt aangemaakt, kun je deze e-mail veilig negeren.\n\nDeze link is 24 uur geldig.\n\n– Het team van {product_name}"
},
"gift_chargeback_notification": {
"subject": "Voordelen van je ingewisselde gift zijn verwijderd",
"body": "Hallo {username},\n\nEen giftcode die je hebt ingewisseld, is oorspronkelijk door iemand anders betaald. Die betaling is sindsdien teruggedraaid (een chargeback).\n\nHierdoor hebben we de voordelen verwijderd die aan je account zijn toegevoegd toen je de gift inwisselde.\n\nAls je denkt dat dit een fout is, neem dan contact op met ons support-team en vermeld alle details die je hebt over de giftcode en wanneer je deze hebt ingewisseld.\n\n– {product_name} Team"
"subject": "De voordelen van je ingewisselde cadeau zijn verwijderd",
"body": "Hallo {username},\n\nEen cadeaucode die je hebt ingewisseld, is oorspronkelijk door iemand anders betaald. Die betaling is sindsdien teruggedraaid (een terugboeking).\n\nHierdoor hebben we de voordelen verwijderd die aan je account zijn toegevoegd toen je het cadeau inwisselde.\n\nAls je denkt dat dit een fout is, neem dan contact op met ons supportteam en vermeld alle details die je hebt over de cadeaucode en wanneer je deze hebt ingewisseld.\n\n– Het team van {product_name}"
},
"harvest_completed": {
"subject": "Je {product_name}-data-export is klaar om te downloaden",
"body": "Hallo {username},\n\nJe data-export is klaar.\n\nDownloadlink:\n{downloadUrl}\n\nInbegrepen berichten: {totalMessages, number}\nBestandsgrootte: {fileSizeMB, number} MB\n\nDeze link verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je deze export niet hebt aangevraagd, wijzig dan onmiddellijk je wachtwoord en neem contact op met ons support-team.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nJe data-export is klaar.\n\nDownloadlink:\n{downloadUrl}\n\nOpgenomen berichten: {totalMessages, number}\nBestandsgrootte: {fileSizeMB, number} MB\n\nDeze link verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je deze export niet hebt aangevraagd, wijzig dan onmiddellijk je wachtwoord en neem contact op met ons supportteam.\n\n– Het team van {product_name}"
},
"inactivity_warning": {
"subject": "Je {product_name}-account wordt verwijderd wegens inactiviteit",
"body": "Hallo {username},\n\nWe hebben geen activiteit op je {product_name}-account gezien sinds {lastActiveDate, date, full}.\n\nAls je niet inlogt vÃģÃģr {deletionDate, date, full} om {deletionDate, time, short}, wordt je account permanent verwijderd wegens inactiviteit.\n\nLog hier in:\n{loginUrl}\n\nAls je {product_name} recentelijk hebt gebruikt, neem dan onmiddellijk contact op met ons support-team.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nWe hebben geen activiteit op je {product_name}-account gezien sinds {lastActiveDate, date, full}.\n\nAls je niet inlogt vÃģÃģr {deletionDate, date, full} om {deletionDate, time, short}, wordt je account permanent verwijderd wegens inactiviteit.\n\nLog hier in:\n{loginUrl}\n\nAls je {product_name} recentelijk hebt gebruikt, neem dan onmiddellijk contact op met ons supportteam.\n\n– Het team van {product_name}"
},
"ip_authorization": {
"subject": "Autoriseer inlog vanaf een nieuw IP-adres",
"body": "Hallo {username},\n\nWe hebben een inlogpoging op je {product_name}-account gedetecteerd vanaf een nieuw IP-adres:\n\nIP-adres: {ipAddress}\nLocatie: {location}\n\nAls jij dit was, autoriseer dan dit IP-adres door op de onderstaande link te klikken:\n\n{authUrl}\n\nAls je niet hebt geprobeerd in te loggen, wijzig dan onmiddellijk je wachtwoord.\n\nDeze link is 30 minuten geldig.\n\n– {product_name} Team"
"subject": "Sta inloggen vanaf een nieuw IP-adres toe",
"body": "Hallo {username},\n\nWe hebben een inlogpoging op je {product_name}-account gedetecteerd vanaf een nieuw IP-adres:\n\nIP-adres: {ipAddress}\nLocatie: {location}\n\nAls jij dit was, sta dan inloggen vanaf dit IP-adres toe door op de onderstaande link te klikken:\n\n{authUrl}\n\nAls je niet hebt geprobeerd in te loggen, wijzig dan onmiddellijk je wachtwoord.\n\nDeze link is 30 minuten geldig.\n\n– Het team van {product_name}"
},
"mfa_backup_codes_view": {
"subject": "Bevestig toegang tot je {product_name}-back-upcodes",
"body": "Hallo {username},\n\nWe hebben een verzoek ontvangen om de back-upcodes van je {product_name}-account te bekijken.\n\nOm dit verzoek te bevestigen, voer je deze code in de app in:\n\n{code}\n\nDeze code verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je dit niet hebt aangevraagd, heeft iemand mogelijk toegang tot je account. Wijzig onmiddellijk je wachtwoord.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nWe hebben een verzoek ontvangen om de back-upcodes van je {product_name}-account te bekijken.\n\nOm dit verzoek te bevestigen, voer je deze code in de app in:\n\n{code}\n\nDeze code verloopt op {expiresAt, date, full} om {expiresAt, time, short}.\n\nAls je dit niet hebt aangevraagd, heeft iemand mogelijk toegang tot je account. Wijzig onmiddellijk je wachtwoord.\n\n– Het team van {product_name}"
},
"password_change_verification": {
"subject": "Bevestig je {product_name}-wachtwoordwijziging",
"body": "Hallo {username},\n\nWe hebben een verzoek ontvangen om het wachtwoord van je {product_name}-account te wijzigen.\n\nOm deze wijziging te bevestigen, voer je deze code in de app in:\n\n{code}\n\nDeze code verloopt om {expiresAt}.\n\nAls je dit niet hebt aangevraagd, heeft iemand mogelijk toegang tot je account. Wijzig onmiddellijk je wachtwoord en schakel tweefactorauthenticatie in.\n\n– {product_name} Team"
"subject": "Bevestig de wijziging van je wachtwoord op {product_name}",
"body": "Hallo {username},\n\nWe hebben een verzoek ontvangen om het wachtwoord van je {product_name}-account te wijzigen.\n\nOm deze wijziging te bevestigen, voer je deze code in de app in:\n\n{code}\n\nDeze code verloopt om {expiresAt}.\n\nAls je dit niet hebt aangevraagd, heeft iemand mogelijk toegang tot je account. Wijzig onmiddellijk je wachtwoord en schakel tweefactorauthenticatie in.\n\n– Het team van {product_name}"
},
"password_reset": {
"subject": "Stel je {product_name}-wachtwoord opnieuw in",
"body": "Hallo {username},\n\nJe hebt een {product_name}-wachtwoordreset aangevraagd. Gebruik de onderstaande link om een nieuw wachtwoord in te stellen:\n\n{resetUrl}\n\nAls je dit niet hebt aangevraagd, kun je deze e-mail veilig negeren.\n\nDeze link is 1 uur geldig.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nJe hebt een {product_name}-wachtwoordreset aangevraagd. Gebruik de onderstaande link om een nieuw wachtwoord in te stellen:\n\n{resetUrl}\n\nAls je dit niet hebt aangevraagd, kun je deze e-mail veilig negeren.\n\nDeze link is 1 uur geldig.\n\n– Het team van {product_name}"
},
"registration_approved": {
"subject": "Je {product_name}-registratie is goedgekeurd",
"body": "Hallo {username},\n\nGoed nieuws: je {product_name}-registratie is goedgekeurd.\n\nJe kunt nu inloggen op de {product_name}-app via:\n{channelsUrl}\n\nWelkom bij de {product_name}-community.\n\n– {product_name} Team"
"body": "Hallo {username},\n\nGoed nieuws: je {product_name}-registratie is goedgekeurd.\n\nJe kunt nu inloggen op de {product_name}-app via:\n{channelsUrl}\n\nWelkom bij de {product_name}-community.\n\n– Het team van {product_name}"
},
"report_resolved": {
"subject": "Je {product_name}-rapport is bekeken",
"body": "Hallo {username},\n\nJe rapport (ID: {reportId}) is bekeken door ons Safety-Team.{hasComment, select, yes {\n\nReactie van het Safety-Team:\n{publicComment}} other {}}\n\nBedankt dat je helpt {product_name} veilig te houden voor iedereen. We nemen alle meldingen serieus en waarderen je bijdrage aan de community.\n\nAls je vragen of opmerkingen hebt over deze uitkomst, neem dan contact op met {safety_email}.\n\n– {product_name} Safety Team"
"subject": "Je melding op {product_name} is beoordeeld",
"body": "Hallo {username},\n\nJe melding (ID: {reportId}) is beoordeeld door ons veiligheidsteam.{hasComment, select, yes {\n\nReactie van het veiligheidsteam:\n{publicComment}} other {}}\n\nBedankt dat je helpt {product_name} veilig te houden voor iedereen. We nemen alle meldingen serieus en waarderen je bijdrage aan de community.\n\nAls je vragen of opmerkingen hebt over deze uitkomst, neem dan contact op met {safety_email}.\n\n– Het veiligheidsteam van {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Je {product_name}-account wordt permanent verwijderd",
"body": "Hallo {username},\n\nJe {product_name}-account is gepland voor permanente verwijdering.\n\nGeplande verwijdering: {deletionDate, date, full} om {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Reden: {reason}}\n}\n\nDit is een serieuze handhavingsactie. Je accountgegevens worden permanent verwijderd op de geplande datum.\n\nAls je van mening bent dat deze handhavingsbeslissing onjuist was, kun je beroep aantekenen. Stuur een e-mail naar {appeals_email} vanaf dit e-mailadres.\n\n– {product_name} Safety-Team"
"body": "Hallo {username},\n\nJe {product_name}-account staat gepland voor permanente verwijdering.\n\nGeplande verwijdering: {deletionDate, date, full} om {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Reden: {reason}}\n}\n\nDit is een ingrijpende handhavingsmaatregel. Je accountgegevens worden permanent verwijderd op de geplande datum.\n\nAls je van mening bent dat deze handhavingsbeslissing onjuist was, kun je bezwaar maken. Stuur een e-mail naar {appeals_email} vanaf dit e-mailadres.\n\n– Het veiligheidsteam van {product_name}"
},
"self_deletion_scheduled": {
"subject": "Verwijdering van je {product_name}-account is gepland",
"body": "Hallo {username},\n\nJe hebt verzocht om je {product_name}-account te verwijderen. Je account is gepland voor permanente verwijdering op:\n\n{deletionDate, date, full} om {deletionDate, time, short}\n\nAls je dit niet hebt aangevraagd, log dan in op je account om de verwijdering te annuleren. We raden ook aan om je wachtwoord te wijzigen om je account te beveiligen.\n\n– {product_name} Team"
"subject": "De verwijdering van je {product_name}-account staat gepland",
"body": "Hallo {username},\n\nJe hebt verzocht om je {product_name}-account te verwijderen. Je account staat gepland voor permanente verwijdering op:\n\n{deletionDate, date, full} om {deletionDate, time, short}\n\nAls je dit niet hebt aangevraagd, log dan in op je account om de verwijdering te annuleren. We raden ook aan om je wachtwoord te wijzigen om je account te beveiligen.\n\n– Het team van {product_name}"
},
"unban_notification": {
"subject": "De opschorting van je {product_name}-account is opgeheven",
"body": "Hallo {username},\n\nGoed nieuws: de opschorting van je {product_name}-account is opgeheven.\n\n{reason, select,\n null {}\n other {Reden: {reason}}\n}\n\nJe kunt nu weer inloggen en {product_name} normaal blijven gebruiken.\n\n– {product_name} Safety-Team"
"subject": "De schorsing van je {product_name}-account is opgeheven",
"body": "Hallo {username},\n\nGoed nieuws: de schorsing van je {product_name}-account is opgeheven.\n\n{reason, select,\n null {}\n other {Reden: {reason}}\n}\n\nJe kunt nu weer inloggen en {product_name} normaal blijven gebruiken.\n\n– Het veiligheidsteam van {product_name}"
}
});
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_NO_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "{product_name}-kontoen din er midlertidig deaktivert",
"body": "Hei {username},\n\nVi deaktiverte {product_name}-kontoen din midlertidig fordi vi oppdaget mistenkelig aktivitet.\n\n{reason, select,\n null {}\n other {Årsak: {reason}}\n}\n\nFor ÃĨ fÃĨ tilgang til kontoen din igjen, mÃĨ du tilbakestille passordet ditt:\n\n{forgotUrl}\n\nEtter at du har tilbakestilt passordet ditt, kan du logge inn igjen.\n\nHvis du mener dette er en feil, kontakt kundestÃļtte.\n\n– {product_name} sikkerhetsteam"
"body": "Hei {username},\n\nVi deaktiverte {product_name}-kontoen din midlertidig fordi vi oppdaget mistenkelig aktivitet.\n\n{reason, select,\n null {}\n other {Årsak: {reason}}\n}\n\nFor ÃĨ fÃĨ tilgang til kontoen din igjen mÃĨ du tilbakestille passordet ditt:\n\n{forgotUrl}\n\nEtter at du har tilbakestilt passordet ditt, kan du logge inn igjen.\n\nHvis du mener dette er en feil, kan du kontakte kundestÃļtten vÃĨr.\n\n– Sikkerhetsteamet hos {product_name}"
},
"account_scheduled_deletion": {
"subject": "{product_name}-kontoen din blir permanent slettet",
"body": "Hei {username},\n\n{product_name}-kontoen din er planlagt for permanent sletting pÃĨ grunn av brudd pÃĨ vÃĨre tjenestevilkÃĨr eller community-retningslinjer.\n\nPlanlagt sletting: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Årsak: {reason}}\n}\n\nDette er et alvorlig tiltak. Kontodataene dine blir permanent slettet pÃĨ den planlagte datoen.\n\nSe over:\n- TjenestevilkÃĨr: {termsUrl}\n- Community-retningslinjer: {guidelinesUrl}\n\nAnkeprosess:\nHvis du mener denne hÃĨndhevelsesbeslutningen var feil eller uberettiget, har du 60 dager pÃĨ deg til ÃĨ sende inn en anke. E-post {appeals_email} fra denne e-postadressen.\n\nI anken din:\n- Forklar tydelig hvorfor du mener hÃĨndhevelsesbeslutningen var feil eller uberettiget\n- Gi relevant bevis eller kontekst\n\nEt medlem av {product_name} sikkerhetsteam vil gjennomgÃĨ anken din og kan sette den ventende slettingen pÃĨ pause til en endelig beslutning er tatt.\n\n– {product_name} sikkerhetsteam"
"body": "Hei {username},\n\nVi har planlagt permanent sletting av {product_name}-kontoen din pÃĨ grunn av brudd pÃĨ vÃĨre vilkÃĨr for bruk eller retningslinjer for fellesskapet.\n\nPlanlagt sletting: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Årsak: {reason}}\n}\n\nDette er et alvorlig tiltak. Kontodataene dine blir permanent slettet pÃĨ den planlagte datoen.\n\nLes gjennom:\n- VilkÃĨr for bruk: {termsUrl}\n- Retningslinjer for fellesskapet: {guidelinesUrl}\n\nKlageprosessen:\nHvis du mener avgjÃļrelsen var feil eller uberettiget, har du 60 dager pÃĨ deg til ÃĨ sende inn en klage. Send en e-post til {appeals_email} fra denne e-postadressen.\n\nI klagen din:\n- Forklar tydelig hvorfor du mener avgjÃļrelsen var feil eller uberettiget\n- Legg ved relevante bevis eller opplysninger\n\nEt medlem av sikkerhetsteamet hos {product_name} vil vurdere klagen din og kan utsette slettingen til en endelig avgjÃļrelse er tatt.\n\n– Sikkerhetsteamet hos {product_name}"
},
"account_temp_banned": {
"subject": "{product_name}-kontoen din er midlertidig suspendert",
"body": "Hei {username},\n\n{product_name}-kontoen din er midlertidig suspendert for brudd pÃĨ vÃĨre tjenestevilkÃĨr eller community-retningslinjer.\n\nVarighet: {durationHours, plural,\n =1 {1 time}\n other {# timer}\n}\nSuspendert til: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Årsak: {reason}}\n}\n\nI lÃļpet av denne tiden vil du ikke kunne fÃĨ tilgang til kontoen din.\n\nSe over:\n- TjenestevilkÃĨr: {termsUrl}\n- Community-retningslinjer: {guidelinesUrl}\n\nHvis du mener denne hÃĨndhevelsesbeslutningen var feil eller uberettiget, kan du sende inn en anke. E-post {appeals_email} fra denne e-postadressen og forklar tydelig hvorfor du mener beslutningen var feil. Vi vil gjennomgÃĨ anken din og svare med vÃĨr beslutning.\n\n– {product_name} sikkerhetsteam"
"body": "Hei {username},\n\n{product_name}-kontoen din er midlertidig suspendert pÃĨ grunn av brudd pÃĨ vÃĨre vilkÃĨr for bruk eller retningslinjer for fellesskapet.\n\nVarighet: {durationHours, plural,\n =1 {1 time}\n other {# timer}\n}\nSuspendert til: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Årsak: {reason}}\n}\n\nDu har ikke tilgang til kontoen din i denne perioden.\n\nLes gjennom:\n- VilkÃĨr for bruk: {termsUrl}\n- Retningslinjer for fellesskapet: {guidelinesUrl}\n\nHvis du mener avgjÃļrelsen var feil eller uberettiget, kan du sende inn en klage. Send en e-post til {appeals_email} fra denne e-postadressen, og forklar tydelig hvorfor du mener avgjÃļrelsen var feil. Vi vil vurdere klagen din og gi deg beskjed om avgjÃļrelsen vÃĨr.\n\n– Sikkerhetsteamet hos {product_name}"
},
"donation_confirmation": {
"subject": "Takk for ditt {product_name}-bidrag",
"body": "Hei,\n\nTakk for ditt bidrag til {product_name}! Ditt {interval, select,\n month {gjentakende bidrag}\n year {gjentakende bidrag}\n other {engangsbidrag}\n} er {interval, select,\n month {satt opp}\n year {satt opp}\n other {behandlet}\n} vellykket.\n\nBidragsdetaljer:\nBelÃļp: {amount} {currency} {interval, select,\n month {per mÃĨned}\n year {per ÃĨr}\n other {}\n}\n\nStripe sender deg en separat kvittering med din faktura-PDF om kort tid. Denne inneholder alle betalingsdetaljer og kan brukes til skatteformÃĨl.\n\nDu kan se bidragshistorikken din, laste ned fakturaer, {interval, select,\n month {og administrere eller kansellere abonnementet ditt}\n year {og administrere eller kansellere abonnementet ditt}\n other {og administrere fremtidige bidrag}\n} nÃĨr som helst ved ÃĨ bruke denne lenken:\n\n{manageUrl}\n\nDin stÃļtte bidrar til ÃĨ holde {product_name} i gang. Takk!\n\n– {product_name} Team"
"subject": "Takk for bidraget ditt til {product_name}",
"body": "Hei,\n\nTakk for bidraget ditt til {product_name}! {interval, select,\n month {Det faste bidraget ditt er opprettet.}\n year {Det faste bidraget ditt er opprettet.}\n other {Engangsbidraget ditt er behandlet.}\n}\n\nDetaljer om bidraget:\nBelÃļp: {amount} {interval, select,\n month {per mÃĨned}\n year {per ÃĨr}\n other {}\n}\n\nStripe sender deg snart en egen kvittering med fakturaen som PDF. Kvitteringen inneholder alle betalingsdetaljer og kan brukes til skatteformÃĨl.\n\nDu kan nÃĨr som helst se bidragshistorikken din, laste ned fakturaer og {interval, select,\n month {administrere eller si opp abonnementet ditt}\n year {administrere eller si opp abonnementet ditt}\n other {administrere framtidige bidrag}\n} via denne lenken:\n\n{manageUrl}\n\nStÃļtten din bidrar til ÃĨ holde {product_name} i gang. Takk!\n\n– {product_name}-teamet"
},
"donation_magic_link": {
"subject": "Administrer {product_name}-bidragene dine",
"body": "Hei,\n\nKlikk pÃĨ lenken nedenfor for ÃĨ fÃĨ tilgang til din giverportal:\n\n{manageUrl}\n\nI portalen kan du administrere abonnementer, laste ned fakturaer og se bidragshistorikken din.\n\nDenne lenken utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om denne lenken, kan du trygt ignorere denne e-posten.\n\n– {product_name} Team"
"body": "Hei,\n\nKlikk pÃĨ lenken nedenfor for ÃĨ fÃĨ tilgang til giverportalen din:\n\n{manageUrl}\n\nI portalen kan du administrere abonnementer, laste ned fakturaer og se bidragshistorikken din.\n\nDenne lenken utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om denne lenken, kan du trygt ignorere denne e-posten.\n\n– {product_name}-teamet"
},
"dsa_report_verification": {
"subject": "Bekreft e-posten din for en DSA-rapport",
"body": "Hei,\n\nBruk bekreftelseskoden nedenfor for ÃĨ sende inn din Digital Services Act-rapport for {product_name}:\n\n{code}\n\nDenne koden utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om dette, ignorer denne e-posten.\n\n– {product_name} Safety Team"
"subject": "Bekreft e-postadressen din for en DSA-rapport",
"body": "Hei,\n\nBruk bekreftelseskoden nedenfor for ÃĨ sende inn rapporten din i henhold til Digital Services Act pÃĨ {product_name}:\n\n{code}\n\nDenne koden utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om dette, kan du se bort fra denne e-posten.\n\n– Sikkerhetsteamet hos {product_name}"
},
"email_change_new": {
"subject": "Bekreft din nye {product_name}-e-postadresse",
"body": "Hei {username},\n\nSkriv inn denne koden i appen for ÃĨ bekrefte din nye {product_name}-e-postadresse:\n\n{code}\n\nDenne koden utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om dette, ignorer denne e-posten.\n\n– {product_name} Team"
"subject": "Bekreft den nye e-postadressen din for {product_name}",
"body": "Hei {username},\n\nSkriv inn denne koden i appen for ÃĨ bekrefte den nye e-postadressen pÃĨ {product_name}-kontoen din:\n\n{code}\n\nDenne koden utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om dette, kan du se bort fra denne e-posten.\n\n– {product_name}-teamet"
},
"email_change_original": {
"subject": "Bekreft endring av {product_name}-e-postadressen din",
"body": "Hei {username},\n\nVi mottok en forespÃļrsel om ÃĨ endre e-postadressen til {product_name}-kontoen din.\n\nFor ÃĨ bekrefte denne endringen, skriv inn denne koden i appen:\n\n{code}\n\nDenne koden utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om dette, sikre kontoen din med en gang.\n\n– {product_name} Team"
"subject": "Bekreft endringen av e-postadressen pÃĨ {product_name}-kontoen din",
"body": "Hei {username},\n\nVi mottok en forespÃļrsel om ÃĨ endre e-postadressen til {product_name}-kontoen din.\n\nSkriv inn denne koden i appen for ÃĨ bekrefte endringen:\n\n{code}\n\nDenne koden utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om dette, mÃĨ du sikre kontoen din med en gang.\n\n– {product_name}-teamet"
},
"email_change_revert": {
"subject": "{product_name}-e-postadressen din ble endret",
"body": "Hei {username},\n\nE-postadressen til {product_name}-kontoen din ble endret til {newEmail}.\n\nHvis du gjorde denne endringen, er ingen handling nÃļdvendig. Hvis du ikke gjorde det, angre endringen og sikre kontoen din med denne lenken:\n\n{revertUrl}\n\nDette vil gjenopprette din tidligere e-post, logge deg ut overalt, fjerne tilknyttede telefonnumre, deaktivere MFA og kreve at du mÃĨ angi et nytt passord.\n\n– {product_name} Safety Team"
"subject": "E-postadressen pÃĨ {product_name}-kontoen din er endret",
"body": "Hei {username},\n\nE-postadressen pÃĨ {product_name}-kontoen din ble endret til {newEmail}.\n\nHvis du gjorde denne endringen, trenger du ikke ÃĨ gjÃļre noe. Hvis det ikke var deg, kan du angre endringen og sikre kontoen din via denne lenken:\n\n{revertUrl}\n\nDette gjenoppretter den forrige e-postadressen din, logger deg ut overalt, fjerner tilknyttede telefonnumre, deaktiverer flerfaktorautentisering (MFA) og krever at du angir et nytt passord.\n\n– Sikkerhetsteamet hos {product_name}"
},
"email_verification": {
"subject": "Bekreft {product_name}-e-postadressen din",
"body": "Hei {username},\n\nBekreft e-postadressen til {product_name}-kontoen din ved ÃĨ klikke pÃĨ lenken nedenfor:\n\n{verifyUrl}\n\nHvis du ikke opprettet en {product_name}-konto, ignorer denne e-posten.\n\nDenne lenken er gyldig i 24 timer.\n\n– {product_name} Team"
"subject": "Bekreft e-postadressen din for {product_name}",
"body": "Hei {username},\n\nBekreft e-postadressen til {product_name}-kontoen din ved ÃĨ klikke pÃĨ lenken nedenfor:\n\n{verifyUrl}\n\nHvis du ikke opprettet en {product_name}-konto, kan du trygt se bort fra denne e-posten.\n\nDenne lenken er gyldig i 24 timer.\n\n– {product_name}-teamet"
},
"gift_chargeback_notification": {
"subject": "Fordelene fra gaven du lÃļste inn er fjernet",
"body": "Hei {username},\n\nEn gavekode du lÃļste inn ble opprinnelig betalt av noen andre. Den betalingen er siden blitt tilbakefÃļrt (en tilbakefÃļring).\n\nPÃĨ grunn av dette har vi fjernet fordelene som ble lagt til kontoen din da du lÃļste inn gaven.\n\nHvis du tror dette er en feil, kontakt kundestÃļtte og inkluder alle detaljer du har om gavekoden og nÃĨr du lÃļste den inn.\n\n– {product_name} Team"
"subject": "Fordelene fra gaven du lÃļste inn, er fjernet",
"body": "Hei {username},\n\nDu lÃļste inn en gavekode som opprinnelig var betalt av noen andre. Betalingen har senere blitt tilbakefÃļrt.\n\nDerfor har vi fjernet fordelene som ble lagt til kontoen din da du lÃļste inn gaven.\n\nHvis du mener dette er en feil, kan du kontakte kundestÃļtten vÃĨr. Ta med opplysningene du har om gavekoden og nÃĨr du lÃļste den inn.\n\n– {product_name}-teamet"
},
"harvest_completed": {
"subject": "{product_name}-dataeksporten din er klar til nedlasting",
"body": "Hei {username},\n\nDataeksporten din er klar.\n\nNedlastingslenke:\n{downloadUrl}\n\nAntall meldinger: {totalMessages, number}\nFilstÃļrrelse: {fileSizeMB, number} MB\n\nDenne lenken utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om denne eksporten, endre passordet ditt umiddelbart og kontakt kundestÃļtte.\n\n– {product_name} Team"
"body": "Hei {username},\n\nDataeksporten din er klar.\n\nNedlastingslenke:\n{downloadUrl}\n\nAntall meldinger: {totalMessages, number}\nFilstÃļrrelse: {fileSizeMB, number} MB\n\nDenne lenken utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om denne eksporten, mÃĨ du endre passordet ditt umiddelbart og kontakte kundestÃļtten vÃĨr.\n\n– {product_name}-teamet"
},
"inactivity_warning": {
"subject": "{product_name}-kontoen din vil bli slettet pÃĨ grunn av inaktivitet",
"body": "Hei {username},\n\nVi har ikke sett noen aktivitet pÃĨ {product_name}-kontoen din siden {lastActiveDate, date, full}.\n\nHvis du ikke logger inn innen {deletionDate, date, full} kl. {deletionDate, time, short}, blir kontoen din permanent slettet pÃĨ grunn av inaktivitet.\n\nLogg inn her:\n{loginUrl}\n\nHvis du har brukt {product_name} nylig, kontakt kundestÃļtte med en gang.\n\n– {product_name} Team"
"body": "Hei {username},\n\nVi har ikke sett noen aktivitet pÃĨ {product_name}-kontoen din siden {lastActiveDate, date, full}.\n\nHvis du ikke logger inn innen {deletionDate, date, full} kl. {deletionDate, time, short}, blir kontoen din permanent slettet pÃĨ grunn av inaktivitet.\n\nLogg inn her:\n{loginUrl}\n\nHvis du har brukt {product_name} nylig, mÃĨ du kontakte kundestÃļtten vÃĨr med en gang.\n\n– {product_name}-teamet"
},
"ip_authorization": {
"subject": "Godkjenn pÃĨlogging fra en ny IP-adresse",
"body": "Hei {username},\n\nVi oppdaget et pÃĨloggingsforsÃļk til {product_name}-kontoen din fra en ny IP-adresse:\n\nIP-adresse: {ipAddress}\nSted: {location}\n\nHvis dette var deg, godkjenn denne IP-adressen ved ÃĨ klikke pÃĨ lenken nedenfor:\n\n{authUrl}\n\nHvis du ikke forsÃļkte ÃĨ logge inn, endre passordet ditt med en gang.\n\nDenne lenken er gyldig i 30 minutter.\n\n– {product_name} Team"
"body": "Hei {username},\n\nVi oppdaget et forsÃļk pÃĨ ÃĨ logge inn pÃĨ {product_name}-kontoen din fra en ny IP-adresse:\n\nIP-adresse: {ipAddress}\nSted: {location}\n\nHvis det var deg, kan du godkjenne IP-adressen ved ÃĨ klikke pÃĨ lenken nedenfor:\n\n{authUrl}\n\nHvis du ikke forsÃļkte ÃĨ logge inn, mÃĨ du endre passordet ditt med en gang.\n\nDenne lenken er gyldig i 30 minutter.\n\n– {product_name}-teamet"
},
"mfa_backup_codes_view": {
"subject": "Bekreft tilgang til {product_name}-reservekodene dine",
"body": "Hei {username},\n\nVi mottok en forespÃļrsel om ÃĨ se reservekodene pÃĨ {product_name}-kontoen din.\n\nFor ÃĨ bekrefte denne forespÃļrselen, skriv inn denne koden i appen:\n\n{code}\n\nDenne koden utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om dette, kan noen ha tilgang til kontoen din. Endre passordet ditt med en gang.\n\n– {product_name} Team"
"body": "Hei {username},\n\nVi mottok en forespÃļrsel om ÃĨ se reservekodene pÃĨ {product_name}-kontoen din.\n\nSkriv inn denne koden i appen for ÃĨ bekrefte forespÃļrselen:\n\n{code}\n\nDenne koden utlÃļper {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nHvis du ikke ba om dette, kan noen ha tilgang til kontoen din. Endre passordet ditt med en gang.\n\n– {product_name}-teamet"
},
"password_change_verification": {
"subject": "Bekreft din {product_name}-passordendring",
"body": "Hei {username},\n\nVi mottok en forespÃļrsel om ÃĨ endre passordet pÃĨ {product_name}-kontoen din.\n\nFor ÃĨ bekrefte denne endringen, skriv inn denne koden i appen:\n\n{code}\n\nDenne koden utlÃļper {expiresAt}.\n\nHvis du ikke ba om dette, kan noen ha tilgang til kontoen din. Endre passordet ditt med en gang og aktiver tofaktorautentisering.\n\n– {product_name} Team"
"subject": "Bekreft passordendringen for {product_name}",
"body": "Hei {username},\n\nVi mottok en forespÃļrsel om ÃĨ endre passordet pÃĨ {product_name}-kontoen din.\n\nSkriv inn denne koden i appen for ÃĨ bekrefte endringen:\n\n{code}\n\nDenne koden utlÃļper {expiresAt}.\n\nHvis du ikke ba om dette, kan noen ha tilgang til kontoen din. Endre passordet ditt med en gang og aktiver tofaktorautentisering.\n\n– {product_name}-teamet"
},
"password_reset": {
"subject": "Tilbakestill ditt {product_name}-passord",
"body": "Hei {username},\n\nDu ba om ÃĨ tilbakestille {product_name}-passordet ditt. Bruk lenken nedenfor for ÃĨ angi et nytt passord:\n\n{resetUrl}\n\nHvis du ikke ba om dette, ignorer denne e-posten.\n\nDenne lenken er gyldig i 1 time.\n\n– {product_name} Team"
"subject": "Tilbakestill {product_name}-passordet ditt",
"body": "Hei {username},\n\nDu ba om ÃĨ tilbakestille {product_name}-passordet ditt. Bruk lenken nedenfor for ÃĨ angi et nytt passord:\n\n{resetUrl}\n\nHvis du ikke ba om dette, kan du trygt se bort fra denne e-posten.\n\nDenne lenken er gyldig i 1 time.\n\n– {product_name}-teamet"
},
"registration_approved": {
"subject": "{product_name}-registreringen din er godkjent",
"body": "Hei {username},\n\nGode nyheter: din {product_name}-registrering er godkjent.\n\nDu kan nÃĨ logge inn pÃĨ {product_name}-appen her:\n{channelsUrl}\n\nVelkommen til {product_name}-communityet.\n\n– {product_name} Team"
"body": "Hei {username},\n\nGode nyheter! Registreringen din hos {product_name} er godkjent.\n\nDu kan nÃĨ logge inn pÃĨ {product_name}-appen her:\n{channelsUrl}\n\nVelkommen til {product_name}-fellesskapet.\n\n– {product_name}-teamet"
},
"report_resolved": {
"subject": "{product_name}-rapporten din er gjennomgÃĨtt",
"body": "Hei {username},\n\nRapporten din (ID: {reportId}) er gjennomgÃĨtt av vÃĨrt Safety Team.{hasComment, select, yes {\n\nSvar fra Safety Team:\n{publicComment}} other {}}\n\nTakk for at du bidrar til ÃĨ holde {product_name} trygt for alle. Vi tar alle rapporter pÃĨ alvor og setter pris pÃĨ ditt bidrag til communityet.\n\nHvis du har spÃļrsmÃĨl eller bekymringer angÃĨende dette utfallet, kontakt {safety_email}.\n\n– {product_name} Safety Team"
"body": "Hei {username},\n\nRapporten din (ID: {reportId}) er gjennomgÃĨtt av sikkerhetsteamet vÃĨrt.{hasComment, select, yes {\n\nSvar fra sikkerhetsteamet:\n{publicComment}} other {}}\n\nTakk for at du bidrar til ÃĨ holde {product_name} trygt for alle. Vi tar alle rapporter pÃĨ alvor og setter pris pÃĨ bidraget ditt til fellesskapet.\n\nHvis du har spÃļrsmÃĨl eller er bekymret for utfallet, kan du kontakte {safety_email}.\n\n– Sikkerhetsteamet hos {product_name}"
},
"scheduled_deletion_notification": {
"subject": "{product_name}-kontoen din blir permanent slettet",
"body": "Hei {username},\n\n{product_name}-kontoen din er planlagt for permanent sletting.\n\nPlanlagt sletting: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Årsak: {reason}}\n}\n\nDette er et alvorlig tiltak. Kontodataene dine blir permanent slettet pÃĨ den planlagte datoen.\n\nHvis du mener denne hÃĨndhevelsesbeslutningen var feil, kan du sende inn en anke. E-post {appeals_email} fra denne e-postadressen.\n\n– {product_name} Safety Team"
"body": "Hei {username},\n\n{product_name}-kontoen din er planlagt for permanent sletting.\n\nPlanlagt sletting: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Årsak: {reason}}\n}\n\nDette er et alvorlig tiltak. Kontodataene dine blir permanent slettet pÃĨ den planlagte datoen.\n\nHvis du mener avgjÃļrelsen var feil, kan du sende inn en klage. Send en e-post til {appeals_email} fra denne e-postadressen.\n\n– Sikkerhetsteamet hos {product_name}"
},
"self_deletion_scheduled": {
"subject": "Slettingen av {product_name}-kontoen din er planlagt",
"body": "Hei {username},\n\nDu ba om ÃĨ slette {product_name}-kontoen din. Kontoen din er planlagt for permanent sletting:\n\n{deletionDate, date, full} kl. {deletionDate, time, short}\n\nHvis du ikke ba om dette, logg inn pÃĨ kontoen din for ÃĨ avbryte slettingen. Vi anbefaler ogsÃĨ ÃĨ endre passordet ditt for ÃĨ sikre kontoen din.\n\n– {product_name} Team"
"body": "Hei {username},\n\nDu ba om ÃĨ slette {product_name}-kontoen din. Kontoen din er planlagt for permanent sletting:\n\n{deletionDate, date, full} kl. {deletionDate, time, short}\n\nHvis du ikke ba om dette, kan du logge inn pÃĨ kontoen din for ÃĨ avbryte slettingen. Vi anbefaler ogsÃĨ ÃĨ endre passordet ditt for ÃĨ sikre kontoen din.\n\n– {product_name}-teamet"
},
"unban_notification": {
"subject": "Suspensjonen av {product_name}-kontoen din er opphevet",
"body": "Hei {username},\n\nGode nyheter: suspensjonen av {product_name}-kontoen din er opphevet.\n\n{reason, select,\n null {}\n other {Årsak: {reason}}\n}\n\nDu kan nÃĨ logge inn igjen og fortsette ÃĨ bruke {product_name} som normalt.\n\n– {product_name} Safety Team"
"body": "Hei {username},\n\nGode nyheter! Suspensjonen av {product_name}-kontoen din er opphevet.\n\n{reason, select,\n null {}\n other {Årsak: {reason}}\n}\n\nDu kan nÃĨ logge inn igjen og fortsette ÃĨ bruke {product_name} som normalt.\n\n– Sikkerhetsteamet hos {product_name}"
}
});
@@ -1,31 +1,31 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_PL_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Twoje konto {product_name} zostało tymczasowo wyłączone",
"body": "Witaj {username},\n\nTymczasowo wyłączyliśmy Twoje konto {product_name}, poniewaÅž wykryliśmy podejrzaną aktywność.\n\n{reason, select,\n null {}\n other {PowÃģd: {reason}}\n}\n\nAby odzyskać dostęp do konta, musisz zresetować hasło:\n\n{forgotUrl}\n\nPo zresetowaniu hasła będziesz mÃģgł ponownie się zalogować.\n\nJeśli uwaÅžasz, Åže to błąd, skontaktuj się z naszym zespołem wsparcia.\n\n– ZespÃģł Bezpieczeństwa {product_name}"
"body": "Witaj {username},\n\nTymczasowo wyłączyliśmy Twoje konto {product_name}, poniewaÅž wykryliśmy podejrzaną aktywność.\n\n{reason, select,\n null {}\n other {PowÃģd: {reason}}\n}\n\nAby odzyskać dostęp do konta, musisz zresetować hasło:\n\n{forgotUrl}\n\nPo zresetowaniu hasła moÅžesz ponownie się zalogować.\n\nJeśli uwaÅžasz, Åže to błąd, skontaktuj się z naszym zespołem wsparcia.\n\n– ZespÃģł ds. bezpieczeństwa {product_name}"
},
"account_scheduled_deletion": {
"subject": "Twoje konto {product_name} zostanie usunięte na zawsze",
"body": "Witaj {username},\n\nTwoje konto {product_name} zostało zaplanowane do trwałego usunięcia z powodu naruszenia naszych warunkÃģw usługi lub wytycznych społeczności.\n\nZaplanowane usunięcie: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {PowÃģd: {reason}}\n}\n\nJest to powaÅžna decyzja. Dane Twojego konta zostaną usunięte na stałe w zaplanowanym terminie.\n\nSprawdÅš:\n- Warunki usługi: {termsUrl}\n- Wytyczne społeczności: {guidelinesUrl}\n\nProces odwoławczy:\nJeśli uwaÅžasz, Åže ta decyzja była błędna lub nieuzasadniona, masz 60 dni na złoÅženie odwołania. Wyślij e-mail na adres {appeals_email} z tego adresu e-mail.\n\nW swoim odwołaniu:\n- Wyjaśnij jasno, dlaczego uwaÅžasz, Åže decyzja była błędna lub nieuzasadniona\n- Przedstaw wszelkie istotne dowody lub kontekst\n\nCzłonek Zespołu Bezpieczeństwa {product_name} rozpatrzy Twoje odwołanie i moÅže wstrzymać usunięcie do czasu podjęcia ostatecznej decyzji.\n\n– ZespÃģł Bezpieczeństwa {product_name}"
"subject": "Twoje konto {product_name} zostanie trwale usunięte",
"body": "Witaj {username},\n\nZaplanowaliśmy trwałe usunięcie Twojego konta {product_name} z powodu naruszenia naszych warunkÃģw korzystania z usługi lub zasad społeczności.\n\nZaplanowane usunięcie: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {PowÃģd: {reason}}\n}\n\nJest to powaÅžna sankcja. Dane Twojego konta zostaną usunięte na stałe w zaplanowanym terminie.\n\nSprawdÅš:\n- Warunki korzystania z usługi: {termsUrl}\n- Zasady społeczności: {guidelinesUrl}\n\nProces odwoławczy:\nJeśli uwaÅžasz, Åže ta decyzja była błędna lub nieuzasadniona, masz 60 dni na złoÅženie odwołania. Wyślij e-mail na adres {appeals_email} z tego adresu e-mail.\n\nW swoim odwołaniu:\n- Wyjaśnij jasno, dlaczego uwaÅžasz, Åže decyzja była błędna lub nieuzasadniona\n- Przedstaw wszelkie istotne dowody lub kontekst\n\nCzłonek zespołu ds. bezpieczeństwa {product_name} rozpatrzy Twoje odwołanie i moÅže wstrzymać usunięcie do czasu podjęcia ostatecznej decyzji.\n\n– ZespÃģł ds. bezpieczeństwa {product_name}"
},
"account_temp_banned": {
"subject": "Twoje konto {product_name} zostało tymczasowo zawieszone",
"body": "Witaj {username},\n\nTwoje konto {product_name} zostało tymczasowo zawieszone za naruszenie naszych warunkÃģw usługi lub wytycznych społeczności.\n\nCzas trwania: {durationHours, plural,\n one {1 godzina} few {# godziny}\n many {# godzin} other {# godzin}\n}\nZawieszone do: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {PowÃģd: {reason}}\n}\n\nW tym czasie nie będziesz mieć dostępu do swojego konta.\n\nSprawdÅš:\n- Warunki usługi: {termsUrl}\n- Wytyczne społeczności: {guidelinesUrl}\n\nJeśli uwaÅžasz, Åže ta decyzja była błędna lub nieuzasadniona, moÅžesz złoÅžyć odwołanie. Wyślij e-mail na adres {appeals_email} z tego adresu e-mail i jasno wyjaśnij, dlaczego uwaÅžasz, Åže decyzja była błędna. Rozpatrzymy Twoje odwołanie i odpowiemy z naszą decyzją.\n\n– ZespÃģł Bezpieczeństwa {product_name}"
"body": "Witaj {username},\n\nTwoje konto {product_name} zostało tymczasowo zawieszone za naruszenie naszych warunkÃģw korzystania z usługi lub zasad społeczności.\n\nCzas trwania: {durationHours, plural,\n one {1 godzina} few {# godziny}\n many {# godzin} other {# godziny}\n}\nZawieszone do: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {PowÃģd: {reason}}\n}\n\nW tym czasie nie będziesz mieć dostępu do swojego konta.\n\nSprawdÅš:\n- Warunki korzystania z usługi: {termsUrl}\n- Zasady społeczności: {guidelinesUrl}\n\nJeśli uwaÅžasz, Åže ta decyzja była błędna lub nieuzasadniona, moÅžesz złoÅžyć odwołanie. Wyślij e-mail na adres {appeals_email} z tego adresu e-mail i jasno wyjaśnij, dlaczego uwaÅžasz, Åže decyzja była błędna. Rozpatrzymy Twoje odwołanie i poinformujemy Cię o naszej decyzji.\n\n– ZespÃģł ds. bezpieczeństwa {product_name}"
},
"donation_confirmation": {
"subject": "Dziękujemy za darowiznę dla {product_name}",
"body": "Witaj,\n\nDziękujemy za darowiznę dla {product_name}! Twoja {interval, select,\n month {cykliczna darowizna}\n year {cykliczna darowizna}\n other {jednorazowa darowizna}\n} została {interval, select,\n month {ustawiona}\n year {ustawiona}\n other {przetworzona}\n} pomyślnie.\n\nSzczegÃģły darowizny:\nKwota: {amount} {currency} {interval, select,\n month {miesięcznie}\n year {rocznie}\n other {}\n}\n\nStripe wkrÃģtce wyśle Ci osobną wiadomość e-mail z potwierdzeniem i fakturą w formacie PDF. Zawiera wszystkie szczegÃģły płatności i moÅže słuÅžyć do celÃģw podatkowych.\n\nMoÅžesz przeglądać historię swoich darowizn, pobierać faktury {interval, select,\n month {oraz zarządzać lub anulować subskrypcję}\n year {oraz zarządzać lub anulować subskrypcję}\n other {oraz zarządzać przyszłymi darowiznami}\n} w dowolnym momencie, korzystając z tego linku:\n\n{manageUrl}\n\nTwoje wsparcie pomaga utrzymać {product_name}. Dziękujemy!\n\n– ZespÃģł {product_name}"
"body": "Witaj,\n\nDziękujemy za darowiznę dla {product_name}! Twoja {interval, select,\n month {cykliczna darowizna}\n year {cykliczna darowizna}\n other {jednorazowa darowizna}\n} została {interval, select,\n month {uruchomiona}\n year {uruchomiona}\n other {przetworzona}\n} pomyślnie.\n\nSzczegÃģły darowizny:\nKwota: {amount} {interval, select,\n month {miesięcznie}\n year {rocznie}\n other {}\n}\n\nStripe wkrÃģtce wyśle Ci osobną wiadomość e-mail z potwierdzeniem i fakturą w formacie PDF. Potwierdzenie zawiera wszystkie szczegÃģły płatności i moÅže słuÅžyć do celÃģw podatkowych.\n\nMoÅžesz przeglądać historię swoich darowizn, pobierać faktury {interval, select,\n month {oraz zarządzać subskrypcją lub ją anulować}\n year {oraz zarządzać subskrypcją lub ją anulować}\n other {oraz zarządzać przyszłymi darowiznami}\n} w dowolnym momencie, korzystając z tego linku:\n\n{manageUrl}\n\nTwoje wsparcie pomaga utrzymać {product_name}. Dziękujemy!\n\n– ZespÃģł {product_name}"
},
"donation_magic_link": {
"subject": "Zarządzaj darowiznami dla {product_name}",
"body": "Witaj,\n\nKliknij poniÅžszy link, aby przejść do portalu darczyńcy:\n\n{manageUrl}\n\nW portalu moÅžesz zarządzać subskrypcjami, pobierać faktury i przeglądać historię swoich darowizn.\n\nTen link wygasa {expiresAt, date, full} o {expiresAt, time, short}.\n\nJeśli nie prosiłeś o ten link, moÅžesz bezpiecznie zignorować tę wiadomość e-mail.\n\n– ZespÃģł {product_name}"
},
"dsa_report_verification": {
"subject": "Zweryfikuj swÃģj e-mail dla raportu DSA",
"body": "Witaj,\n\nUÅžyj poniÅžszego kodu weryfikacyjnego, aby przesłać swÃģj raport DSA dotyczący {product_name}:\n\n{code}\n\nTen kod wygasa {expiresAt, date, full} o {expiresAt, time, short}.\n\nJeśli nie prosiłeś o ten kod, moÅžesz zignorować tę wiadomość e-mail.\n\n– ZespÃģł Bezpieczeństwa {product_name}"
"subject": "Zweryfikuj adres e-mail na potrzeby zgłoszenia DSA",
"body": "Witaj,\n\nUÅžyj poniÅžszego kodu weryfikacyjnego, aby przesłać zgłoszenie w ramach aktu o usługach cyfrowych (DSA) w {product_name}:\n\n{code}\n\nTen kod wygasa {expiresAt, date, full} o {expiresAt, time, short}.\n\nJeśli nie prosiłeś o ten kod, moÅžesz zignorować tę wiadomość e-mail.\n\n– ZespÃģł ds. bezpieczeństwa {product_name}"
},
"email_change_new": {
"subject": "Zweryfikuj nowy adres e-mail dla {product_name}",
@@ -37,7 +37,7 @@ const EMAIL_I18N_PL_MESSAGES = defineEmailI18nLocaleMessages({
},
"email_change_revert": {
"subject": "TwÃģj adres e-mail w {product_name} został zmieniony",
"body": "Witaj {username},\n\nTwÃģj adres e-mail konta {product_name} został zmieniony na {newEmail}.\n\nJeśli to Ty dokonałeś tej zmiany, nie musisz nic robić. Jeśli nie, moÅžesz cofnąć zmianę i zabezpieczyć swoje konto, korzystając z tego linku:\n\n{revertUrl}\n\nSpowoduje to przywrÃģcenie poprzedniego adresu e-mail, wylogowanie ze wszystkich urządzeń, usunięcie powiązanych numerÃģw telefonÃģw, wyłączenie MFA i konieczność ustawienia nowego hasła.\n\n– ZespÃģł Bezpieczeństwa {product_name}"
"body": "Witaj {username},\n\nAdres e-mail przypisany do Twojego konta {product_name} został zmieniony na {newEmail}.\n\nJeśli ta zmiana została dokonana przez Ciebie, nie musisz nic robić. Jeśli nie, moÅžesz cofnąć zmianę i zabezpieczyć swoje konto, korzystając z tego linku:\n\n{revertUrl}\n\nSpowoduje to przywrÃģcenie poprzedniego adresu e-mail, wylogowanie ze wszystkich urządzeń, usunięcie powiązanych numerÃģw telefonÃģw, wyłączenie MFA i konieczność ustawienia nowego hasła.\n\n– ZespÃģł ds. bezpieczeństwa {product_name}"
},
"email_verification": {
"subject": "Zweryfikuj adres e-mail w {product_name}",
@@ -45,11 +45,11 @@ const EMAIL_I18N_PL_MESSAGES = defineEmailI18nLocaleMessages({
},
"gift_chargeback_notification": {
"subject": "Usunięto bonusy z wykorzystanego prezentu",
"body": "Witaj {username},\n\nKod prezentowy, ktÃģry został wykorzystany, został pierwotnie opłacony przez inną osobę. Płatność ta została następnie cofnięta (chargeback).\n\nZ tego powodu usunęliśmy bonusy, ktÃģre zostały dodane do Twojego konta po wykorzystaniu prezentu.\n\nJeśli uwaÅžasz, Åže to pomyłka, skontaktuj się z naszym zespołem wsparcia i podaj wszelkie szczegÃģły dotyczące kodu prezentowego oraz daty jego wykorzystania.\n\n– ZespÃģł {product_name}"
"body": "Witaj {username},\n\nKod podarunkowy wykorzystany na Twoim koncie został pierwotnie opłacony przez inną osobę. Płatność ta została następnie cofnięta (chargeback).\n\nZ tego powodu usunęliśmy bonusy, ktÃģre zostały dodane do Twojego konta po wykorzystaniu prezentu.\n\nJeśli uwaÅžasz, Åže to pomyłka, skontaktuj się z naszym zespołem wsparcia i podaj wszelkie szczegÃģły dotyczące kodu podarunkowego oraz daty jego wykorzystania.\n\n– ZespÃģł {product_name}"
},
"harvest_completed": {
"subject": "TwÃģj eksport danych z {product_name} jest gotowy do pobrania",
"body": "Witaj {username},\n\nTwÃģj eksport danych jest gotowy.\n\nLink do pobrania:\n{downloadUrl}\n\nWiadomości uwzględnione: {totalMessages, number}\nRozmiar pliku: {fileSizeMB, number} MB\n\nTen link wygasa {expiresAt, date, full} o {expiresAt, time, short}.\n\nJeśli nie prosiłeś o ten eksport, natychmiast zmień hasło i skontaktuj się z naszym zespołem wsparcia.\n\n– ZespÃģł {product_name}"
"body": "Witaj {username},\n\nTwÃģj eksport danych jest gotowy.\n\nLink do pobrania:\n{downloadUrl}\n\nLiczba uwzględnionych wiadomości: {totalMessages, number}\nRozmiar pliku: {fileSizeMB, number} MB\n\nTen link wygasa {expiresAt, date, full} o {expiresAt, time, short}.\n\nJeśli nie prosiłeś o ten eksport, natychmiast zmień hasło i skontaktuj się z naszym zespołem wsparcia.\n\n– ZespÃģł {product_name}"
},
"inactivity_warning": {
"subject": "Twoje konto {product_name} zostanie usunięte z powodu braku aktywności",
@@ -65,7 +65,7 @@ const EMAIL_I18N_PL_MESSAGES = defineEmailI18nLocaleMessages({
},
"password_change_verification": {
"subject": "PotwierdÅš zmianę hasła w {product_name}",
"body": "Witaj {username},\n\nOtrzymaliśmy prośbę o zmianę hasła do Twojego konta {product_name}.\n\nAby potwierdzić tę zmianę, wprowadÅš ten kod w aplikacji:\n\n{code}\n\nTen kod wygasa o godzinie {expiresAt}.\n\nJeśli nie prosiłeś o to, ktoś moÅže mieć dostęp do Twojego konta. Natychmiast zmień hasło i włącz uwierzytelnianie dwuskładnikowe.\n\n– ZespÃģł {product_name}"
"body": "Witaj {username},\n\nOtrzymaliśmy prośbę o zmianę hasła do Twojego konta {product_name}.\n\nAby potwierdzić tę zmianę, wprowadÅš ten kod w aplikacji:\n\n{code}\n\nTen kod wygasa: {expiresAt}.\n\nJeśli nie prosiłeś o to, ktoś moÅže mieć dostęp do Twojego konta. Natychmiast zmień hasło i włącz uwierzytelnianie dwuskładnikowe.\n\n– ZespÃģł {product_name}"
},
"password_reset": {
"subject": "Zresetuj hasło w {product_name}",
@@ -76,20 +76,20 @@ const EMAIL_I18N_PL_MESSAGES = defineEmailI18nLocaleMessages({
"body": "Witaj {username},\n\nDobre wieści: Twoja rejestracja w {product_name} została zatwierdzona.\n\nMoÅžesz teraz zalogować się do aplikacji {product_name} tutaj:\n{channelsUrl}\n\nWitaj w społeczności {product_name}.\n\n– ZespÃģł {product_name}"
},
"report_resolved": {
"subject": "Twoje zgłoszenie dotyczące {product_name} zostało rozpatrzone",
"body": "Witaj {username},\n\nTwoje zgłoszenie (ID: {reportId}) zostało rozpatrzone przez nasz ZespÃģł Bezpieczeństwa.{hasComment, select, yes {\n\nOdpowiedÅš od Zespołu Bezpieczeństwa:\n{publicComment}} other {}}\n\nDziękujemy za pomoc w utrzymaniu bezpieczeństwa {product_name} dla wszystkich. Traktujemy wszystkie zgłoszenia powaÅžnie i doceniamy TwÃģj wkład w społeczność.\n\nJeśli masz pytania lub wątpliwości dotyczące tego wyniku, skontaktuj się z {safety_email}.\n\n– ZespÃģł Bezpieczeństwa {product_name}"
"subject": "Twoje zgłoszenie w {product_name} zostało rozpatrzone",
"body": "Witaj {username},\n\nTwoje zgłoszenie (ID: {reportId}) zostało rozpatrzone przez nasz zespÃģł ds. bezpieczeństwa.{hasComment, select, yes {\n\nOdpowiedÅš od zespołu ds. bezpieczeństwa:\n{publicComment}} other {}}\n\nDziękujemy za pomoc w utrzymaniu bezpieczeństwa {product_name} dla wszystkich. Traktujemy wszystkie zgłoszenia powaÅžnie i doceniamy TwÃģj wkład w społeczność.\n\nJeśli masz pytania lub wątpliwości dotyczące tej decyzji, skontaktuj się z {safety_email}.\n\n– ZespÃģł ds. bezpieczeństwa {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Twoje konto {product_name} zostanie usunięte na zawsze",
"body": "Witaj {username},\n\nTwoje konto {product_name} zostało zaplanowane do trwałego usunięcia.\n\nZaplanowane usunięcie: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {PowÃģd: {reason}}\n}\n\nJest to powaÅžna decyzja. Dane Twojego konta zostaną usunięte na stałe w zaplanowanym terminie.\n\nJeśli uwaÅžasz, Åže ta decyzja była błędna, moÅžesz złoÅžyć odwołanie. Wyślij e-mail na adres {appeals_email} z tego adresu e-mail.\n\n– ZespÃģł Bezpieczeństwa {product_name}"
"subject": "Twoje konto {product_name} zostanie trwale usunięte",
"body": "Witaj {username},\n\nZaplanowaliśmy trwałe usunięcie Twojego konta {product_name}.\n\nZaplanowane usunięcie: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {PowÃģd: {reason}}\n}\n\nJest to powaÅžna sankcja. Dane Twojego konta zostaną usunięte na stałe w zaplanowanym terminie.\n\nJeśli uwaÅžasz, Åže ta decyzja była błędna, moÅžesz złoÅžyć odwołanie. Wyślij e-mail na adres {appeals_email} z tego adresu e-mail.\n\n– ZespÃģł ds. bezpieczeństwa {product_name}"
},
"self_deletion_scheduled": {
"subject": "Usunięcie Twojego konta {product_name} zostało zaplanowane",
"body": "Witaj {username},\n\nPoprosiłeś o usunięcie konta {product_name}. Twoje konto jest zaplanowane do usunięcia na stałe na:\n\n{deletionDate, date, full} o {deletionDate, time, short}\n\nJeśli nie prosiłeś o to, zaloguj się na swoje konto, aby anulować usunięcie. Zalecamy rÃģwnieÅž zmianę hasła w celu zabezpieczenia konta.\n\n– ZespÃģł {product_name}"
"body": "Witaj {username},\n\nOtrzymaliśmy Twoją prośbę o usunięcie konta {product_name}. Termin trwałego usunięcia konta:\n\n{deletionDate, date, full} o {deletionDate, time, short}\n\nJeśli nie prosiłeś o to, zaloguj się na swoje konto, aby anulować usunięcie. Zalecamy rÃģwnieÅž zmianę hasła w celu zabezpieczenia konta.\n\n– ZespÃģł {product_name}"
},
"unban_notification": {
"subject": "Zawieszenie Twojego konta {product_name} zostało zniesione",
"body": "Witaj {username},\n\nDobre wieści: zawieszenie Twojego konta {product_name} zostało zniesione.\n\n{reason, select,\n null {}\n other {PowÃģd: {reason}}\n}\n\nMoÅžesz teraz ponownie się zalogować i kontynuować korzystanie z {product_name} jak zwykle.\n\n– ZespÃģł Bezpieczeństwa {product_name}"
"body": "Witaj {username},\n\nDobre wieści: zawieszenie Twojego konta {product_name} zostało zniesione.\n\n{reason, select,\n null {}\n other {PowÃģd: {reason}}\n}\n\nMoÅžesz teraz ponownie się zalogować i kontynuować korzystanie z {product_name} jak zwykle.\n\n– ZespÃģł ds. bezpieczeństwa {product_name}"
}
});
@@ -1,31 +1,31 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_PT_BR_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Sua conta do {product_name} foi desativada temporariamente",
"body": "OlÃĄ, {username},\n\nDesativamos temporariamente sua conta do {product_name} porque detectamos atividades suspeitas.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nPara acessar sua conta novamente, vocÊ precisarÃĄ redefinir sua senha:\n\n{forgotUrl}\n\nDepois de redefinir sua senha, vocÊ poderÃĄ entrar novamente.\n\nSe vocÊ acredita que isso foi um erro, entre em contato com nossa equipe de suporte.\n\n– Equipe de Segurança do {product_name}"
"body": "OlÃĄ, {username},\n\nDesativamos temporariamente sua conta do {product_name} porque detectamos atividades suspeitas.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nPara acessar sua conta novamente, vocÊ precisarÃĄ redefinir sua senha:\n\n{forgotUrl}\n\nDepois de redefinir sua senha, vocÊ poderÃĄ entrar novamente.\n\nSe vocÊ acredita que isso foi um erro, entre em contato com nossa equipe de suporte.\n\n– equipe de segurança do {product_name}"
},
"account_scheduled_deletion": {
"subject": "Sua conta do {product_name} serÃĄ excluída permanentemente",
"body": "OlÃĄ, {username},\n\nSua conta do {product_name} foi agendada para exclusÃĢo permanente devido a violaçÃĩes de nossos Termos de Serviço ou Diretrizes da Comunidade.\n\nExclusÃĢo agendada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta ÃĐ uma medida sÃĐria. Os dados da sua conta serÃĢo excluídos permanentemente na data agendada.\n\nPor favor, revise:\n- Termos de Serviço: {termsUrl}\n- Diretrizes da Comunidade: {guidelinesUrl}\n\nProcesso de recurso:\nSe vocÊ acredita que esta decisÃĢo foi incorreta ou injustificada, vocÊ tem 60 dias para enviar um recurso. Envie um e-mail para {appeals_email} a partir deste endereço de e-mail.\n\nEm seu recurso:\n- Explique claramente por que vocÊ acredita que a decisÃĢo foi incorreta ou injustificada\n- Forneça quaisquer evidÊncias ou contexto relevantes\n\nUm membro da Equipe de Segurança do {product_name} revisarÃĄ seu recurso e poderÃĄ pausar a exclusÃĢo pendente atÃĐ que uma decisÃĢo final seja alcançada.\n\n– Equipe de Segurança do {product_name}"
"body": "OlÃĄ, {username},\n\nA exclusÃĢo permanente da sua conta do {product_name} foi agendada devido a violaçÃĩes de nossos Termos de serviço ou Diretrizes da comunidade.\n\nExclusÃĢo agendada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta ÃĐ uma medida sÃĐria. Os dados da sua conta serÃĢo excluídos permanentemente na data agendada.\n\nPor favor, revise:\n- Termos de serviço: {termsUrl}\n- Diretrizes da comunidade: {guidelinesUrl}\n\nProcesso de recurso:\nSe vocÊ acredita que esta decisÃĢo foi incorreta ou injustificada, vocÊ tem 60 dias para enviar um recurso. Envie um e-mail para {appeals_email} a partir deste endereço de e-mail.\n\nEm seu recurso:\n- Explique claramente por que vocÊ acredita que a decisÃĢo foi incorreta ou injustificada\n- Forneça quaisquer evidÊncias ou contexto relevantes\n\nUm membro da equipe de segurança do {product_name} revisarÃĄ seu recurso e poderÃĄ pausar a exclusÃĢo pendente atÃĐ que uma decisÃĢo final seja tomada.\n\n– equipe de segurança do {product_name}"
},
"account_temp_banned": {
"subject": "Sua conta do {product_name} foi suspensa temporariamente",
"body": "OlÃĄ, {username},\n\nSua conta do {product_name} foi suspensa temporariamente por violar nossos Termos de Serviço ou Diretrizes da Comunidade.\n\nDuraçÃĢo: {durationHours, plural,\n =1 {1 hora}\n other {# horas}\n}\nSuspensa atÃĐ: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nDurante este período, vocÊ nÃĢo poderÃĄ acessar sua conta.\n\nPor favor, revise:\n- Termos de Serviço: {termsUrl}\n- Diretrizes da Comunidade: {guidelinesUrl}\n\nSe vocÊ acredita que esta decisÃĢo foi incorreta ou injustificada, vocÊ pode enviar um recurso. Envie um e-mail para {appeals_email} a partir deste endereço de e-mail e explique claramente por que vocÊ acredita que a decisÃĢo foi incorreta. Revisaremos seu recurso e responderemos com nossa decisÃĢo.\n\n– Equipe de Segurança do {product_name}"
"body": "OlÃĄ, {username},\n\nSua conta do {product_name} foi suspensa temporariamente por violar nossos Termos de serviço ou Diretrizes da comunidade.\n\nDuraçÃĢo: {durationHours, plural,\n =1 {1 hora} other {# horas}}\nSuspensa atÃĐ: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {} other {Motivo: {reason}}}\n\nDurante este período, vocÊ nÃĢo poderÃĄ acessar sua conta.\n\nPor favor, revise:\n- Termos de serviço: {termsUrl}\n- Diretrizes da comunidade: {guidelinesUrl}\n\nSe vocÊ acredita que esta decisÃĢo foi incorreta ou injustificada, vocÊ pode enviar um recurso. Envie um e-mail para {appeals_email} a partir deste endereço de e-mail e explique claramente por que vocÊ acredita que a decisÃĢo foi incorreta. Revisaremos seu recurso e responderemos com nossa decisÃĢo.\n\n– equipe de segurança do {product_name}"
},
"donation_confirmation": {
"subject": "Agradecemos pela sua doaçÃĢo ao {product_name}",
"body": "OlÃĄ,\n\nAgradecemos pela sua doaçÃĢo ao {product_name}! Sua {interval, select,\n month {doaçÃĢo recorrente}\n year {doaçÃĢo recorrente}\n other {doaçÃĢo Única}\n} foi {interval, select,\n month {configurada}\n year {configurada}\n other {processada}\n} com sucesso.\n\nDetalhes da doaçÃĢo:\nValor: {amount} {currency} {interval, select,\n month {por mÊs}\n year {por ano}\n other {}\n}\n\nA Stripe enviarÃĄ um recibo separado com sua fatura em PDF em breve. Isso inclui todos os detalhes de pagamento e pode ser usado para fins fiscais.\n\nVocÊ pode visualizar seu histÃģrico de doaçÃĩes, baixar faturas, {interval, select,\n month {e gerenciar ou cancelar sua assinatura}\n year {e gerenciar ou cancelar sua assinatura}\n other {e gerenciar futuras doaçÃĩes}\n} a qualquer momento usando este link:\n\n{manageUrl}\n\nSeu apoio ajuda a manter o {product_name} funcionando. Agradecemos!\n\n– Equipe do {product_name}"
"body": "OlÃĄ,\n\nAgradecemos pela sua doaçÃĢo ao {product_name}! Sua {interval, select,\n month {doaçÃĢo recorrente}\n year {doaçÃĢo recorrente}\n other {doaçÃĢo Única}\n} foi {interval, select,\n month {configurada}\n year {configurada}\n other {processada}\n} com sucesso.\n\nDetalhes da doaçÃĢo:\nValor: {amount} {interval, select,\n month {por mÊs}\n year {por ano}\n other {}\n}\n\nA Stripe enviarÃĄ um recibo separado com sua fatura em PDF em breve. Isso inclui todos os detalhes de pagamento e pode ser usado para fins fiscais.\n\nVocÊ pode visualizar seu histÃģrico de doaçÃĩes, baixar faturas {interval, select,\n month {e gerenciar ou cancelar sua assinatura}\n year {e gerenciar ou cancelar sua assinatura}\n other {e gerenciar futuras doaçÃĩes}\n} a qualquer momento usando este link:\n\n{manageUrl}\n\nSeu apoio ajuda a manter o {product_name} funcionando. Agradecemos!\n\n– Equipe do {product_name}"
},
"donation_magic_link": {
"subject": "Gerenciar suas doaçÃĩes do {product_name}",
"subject": "Gerencie suas doaçÃĩes ao {product_name}",
"body": "OlÃĄ,\n\nClique no link abaixo para acessar seu portal de doadores:\n\n{manageUrl}\n\nNo portal, vocÊ pode gerenciar assinaturas, baixar faturas e visualizar seu histÃģrico de doaçÃĩes.\n\nEste link expira em {expiresAt, date, full} às {expiresAt, time, short}.\n\nSe vocÊ nÃĢo solicitou este link, pode ignorar este e-mail com segurança.\n\n– Equipe do {product_name}"
},
"dsa_report_verification": {
"subject": "Verifique seu e-mail para um relatÃģrio do DSA",
"body": "OlÃĄ,\n\nUse o cÃģdigo de verificaçÃĢo abaixo para enviar seu relatÃģrio do Digital Services Act para o {product_name}:\n\n{code}\n\nEste cÃģdigo expira em {expiresAt, date, full} às {expiresAt, time, short}.\n\nSe vocÊ nÃĢo solicitou isso, pode ignorar este e-mail.\n\n– Equipe de Segurança do {product_name}"
"subject": "Verifique seu e-mail para enviar uma denÚncia nos termos do DSA",
"body": "OlÃĄ,\n\nUse o cÃģdigo de verificaçÃĢo abaixo para enviar sua denÚncia ao {product_name} nos termos da Lei dos Serviços Digitais (DSA):\n\n{code}\n\nEste cÃģdigo expira em {expiresAt, date, full} às {expiresAt, time, short}.\n\nSe vocÊ nÃĢo solicitou isso, pode ignorar este e-mail.\n\n– equipe de segurança do {product_name}"
},
"email_change_new": {
"subject": "Verifique seu novo e-mail do {product_name}",
@@ -37,14 +37,14 @@ const EMAIL_I18N_PT_BR_MESSAGES = defineEmailI18nLocaleMessages({
},
"email_change_revert": {
"subject": "O e-mail da sua conta do {product_name} foi alterado",
"body": "OlÃĄ, {username},\n\nO endereço de e-mail da sua conta do {product_name} foi alterado para {newEmail}.\n\nSe vocÊ fez essa alteraçÃĢo, nenhuma açÃĢo ÃĐ necessÃĄria. Se vocÊ nÃĢo fez, pode reverter a alteraçÃĢo e proteger sua conta usando este link:\n\n{revertUrl}\n\nIsso restaurarÃĄ seu e-mail anterior, desconectarÃĄ vocÊ de todos os lugares, removerÃĄ nÚmeros de telefone vinculados, desativarÃĄ a MFA e exigirÃĄ que vocÊ defina uma nova senha.\n\n– Equipe de Segurança do {product_name}"
"body": "OlÃĄ, {username},\n\nO endereço de e-mail da sua conta do {product_name} foi alterado para {newEmail}.\n\nSe vocÊ fez essa alteraçÃĢo, nenhuma açÃĢo ÃĐ necessÃĄria. Se vocÊ nÃĢo fez, pode reverter a alteraçÃĢo e proteger sua conta usando este link:\n\n{revertUrl}\n\nIsso restaurarÃĄ seu e-mail anterior, encerrarÃĄ todas as suas sessÃĩes, removerÃĄ nÚmeros de telefone vinculados, desativarÃĄ a autenticaçÃĢo multifator (MFA) e exigirÃĄ que vocÊ defina uma nova senha.\n\n– equipe de segurança do {product_name}"
},
"email_verification": {
"subject": "Verifique o endereço de e-mail da sua conta do {product_name}",
"body": "OlÃĄ, {username},\n\nPor favor, verifique o endereço de e-mail da sua conta do {product_name} clicando no link abaixo:\n\n{verifyUrl}\n\nSe vocÊ nÃĢo criou uma conta do {product_name}, pode ignorar este e-mail com segurança.\n\nEste link ÃĐ vÃĄlido por 24 horas.\n\n– Equipe do {product_name}"
},
"gift_chargeback_notification": {
"subject": "Vantagens do seu presente resgatado foram removidas",
"subject": "Os benefícios do presente que vocÊ resgatou foram removidos",
"body": "OlÃĄ, {username},\n\nUm cÃģdigo de presente que vocÊ resgatou foi originalmente pago por outra pessoa. Esse pagamento foi revertido (um estorno).\n\nPor causa disso, removemos os benefícios que foram adicionados à sua conta quando vocÊ resgatou o presente.\n\nSe vocÊ acha que isso ÃĐ um erro, entre em contato com nossa equipe de suporte e inclua quaisquer detalhes que vocÊ tenha sobre o cÃģdigo do presente e quando vocÊ o resgatou.\n\n– Equipe do {product_name}"
},
"harvest_completed": {
@@ -60,8 +60,8 @@ const EMAIL_I18N_PT_BR_MESSAGES = defineEmailI18nLocaleMessages({
"body": "OlÃĄ, {username},\n\nDetectamos uma tentativa de login em sua conta do {product_name} de um novo endereço IP:\n\nEndereço IP: {ipAddress}\nLocalizaçÃĢo: {location}\n\nSe foi vocÊ, por favor, autorize este endereço IP clicando no link abaixo:\n\n{authUrl}\n\nSe vocÊ nÃĢo tentou entrar, por favor, altere sua senha imediatamente.\n\nEste link ÃĐ vÃĄlido por 30 minutos.\n\n– Equipe do {product_name}"
},
"mfa_backup_codes_view": {
"subject": "Confirme o acesso aos cÃģdigos de backup da sua conta do {product_name}",
"body": "OlÃĄ, {username},\n\nRecebemos uma solicitaçÃĢo para visualizar os cÃģdigos de backup da sua conta do {product_name}.\n\nPara confirmar esta solicitaçÃĢo, insira este cÃģdigo no aplicativo:\n\n{code}\n\nEste cÃģdigo expira em {expiresAt, date, full} às {expiresAt, time, short}.\n\nSe vocÊ nÃĢo solicitou isso, alguÃĐm pode ter acesso à sua conta. Altere sua senha imediatamente.\n\n– Equipe do {product_name}"
"subject": "Confirme o acesso aos cÃģdigos de recuperaçÃĢo da sua conta do {product_name}",
"body": "OlÃĄ, {username},\n\nRecebemos uma solicitaçÃĢo para visualizar os cÃģdigos de recuperaçÃĢo da sua conta do {product_name}.\n\nPara confirmar esta solicitaçÃĢo, insira este cÃģdigo no aplicativo:\n\n{code}\n\nEste cÃģdigo expira em {expiresAt, date, full} às {expiresAt, time, short}.\n\nSe vocÊ nÃĢo solicitou isso, alguÃĐm pode ter acesso à sua conta. Altere sua senha imediatamente.\n\n– Equipe do {product_name}"
},
"password_change_verification": {
"subject": "Confirme a alteraçÃĢo da senha da sua conta do {product_name}",
@@ -72,16 +72,16 @@ const EMAIL_I18N_PT_BR_MESSAGES = defineEmailI18nLocaleMessages({
"body": "OlÃĄ, {username},\n\nVocÊ solicitou uma redefiniçÃĢo de senha da sua conta do {product_name}. Use o link abaixo para definir uma nova senha:\n\n{resetUrl}\n\nSe vocÊ nÃĢo solicitou isso, pode ignorar este e-mail com segurança.\n\nEste link ÃĐ vÃĄlido por 1 hora.\n\n– Equipe do {product_name}"
},
"registration_approved": {
"subject": "O seu registro do {product_name} foi aprovado",
"body": "OlÃĄ, {username},\n\nBoas notícias: seu registro do {product_name} foi aprovado.\n\nAgora vocÊ pode entrar no aplicativo do {product_name} aqui:\n{channelsUrl}\n\nBem-vindo à comunidade do {product_name}.\n\n– Equipe do {product_name}"
"subject": "Seu cadastro no {product_name} foi aprovado",
"body": "OlÃĄ, {username},\n\nBoas notícias: seu cadastro no {product_name} foi aprovado.\n\nAgora vocÊ pode entrar no aplicativo do {product_name} aqui:\n{channelsUrl}\n\nBem-vindo à comunidade do {product_name}.\n\n– Equipe do {product_name}"
},
"report_resolved": {
"subject": "Sua denÚncia no {product_name} foi analisada",
"body": "OlÃĄ, {username},\n\nSua denÚncia (ID: {reportId}) foi analisada por nossa Equipe de Segurança.{hasComment, select, yes {\n\nResposta da Equipe de Segurança:\n{publicComment}} other {}}\n\nAgradecemos por ajudar a manter o {product_name} seguro para todos. Levamos todas as denÚncias a sÃĐrio e agradecemos sua contribuiçÃĢo para a comunidade.\n\nSe vocÊ tiver alguma dÚvida ou preocupaçÃĢo sobre este resultado, entre em contato com {safety_email}.\n\n– Equipe de Segurança do {product_name}"
"body": "OlÃĄ, {username},\n\nSua denÚncia (ID: {reportId}) foi analisada por nossa equipe de segurança.{hasComment, select, yes {\n\nResposta da equipe de segurança:\n{publicComment}} other {}}\n\nAgradecemos por ajudar a manter o {product_name} seguro para todos. Levamos todas as denÚncias a sÃĐrio e agradecemos sua contribuiçÃĢo para a comunidade.\n\nSe vocÊ tiver alguma dÚvida ou preocupaçÃĢo sobre este resultado, entre em contato com {safety_email}.\n\n– equipe de segurança do {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Sua conta do {product_name} serÃĄ excluída permanentemente",
"body": "OlÃĄ, {username},\n\nSua conta do {product_name} foi agendada para exclusÃĢo permanente.\n\nExclusÃĢo agendada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta ÃĐ uma medida sÃĐria. Os dados da sua conta serÃĢo excluídos permanentemente na data agendada.\n\nSe vocÊ acredita que esta decisÃĢo foi incorreta, vocÊ pode enviar um recurso. Envie um e-mail para {appeals_email} a partir deste endereço de e-mail.\n\n– Equipe de Segurança do {product_name}"
"body": "OlÃĄ, {username},\n\nA exclusÃĢo permanente da sua conta do {product_name} foi agendada.\n\nExclusÃĢo agendada: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nEsta ÃĐ uma medida sÃĐria. Os dados da sua conta serÃĢo excluídos permanentemente na data agendada.\n\nSe vocÊ acredita que esta decisÃĢo foi incorreta, vocÊ pode enviar um recurso. Envie um e-mail para {appeals_email} a partir deste endereço de e-mail.\n\n– equipe de segurança do {product_name}"
},
"self_deletion_scheduled": {
"subject": "A exclusÃĢo da sua conta do {product_name} estÃĄ agendada",
@@ -89,7 +89,7 @@ const EMAIL_I18N_PT_BR_MESSAGES = defineEmailI18nLocaleMessages({
},
"unban_notification": {
"subject": "A suspensÃĢo da sua conta do {product_name} foi encerrada",
"body": "OlÃĄ, {username},\n\nBoas notícias: a suspensÃĢo da sua conta do {product_name} foi encerrada.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nAgora vocÊ pode entrar novamente e continuar usando o {product_name} normalmente.\n\n– Equipe de Segurança do {product_name}"
"body": "OlÃĄ, {username},\n\nBoas notícias: a suspensÃĢo da sua conta do {product_name} foi encerrada.\n\n{reason, select,\n null {}\n other {Motivo: {reason}}\n}\n\nAgora vocÊ pode entrar novamente e continuar usando o {product_name} normalmente.\n\n– equipe de segurança do {product_name}"
}
});
@@ -1,35 +1,35 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_RO_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Contul tău {product_name} a fost dezactivat temporar",
"body": "Salut {username},\n\nAm dezactivat temporar contul tău {product_name} deoarece am detectat activitate suspectă.\n\n{reason, select,\n null {}\n other {Motiv: {reason}}\n}\n\nPentru a recăpăta accesul la contul tău, va trebui să-ți resetezi parola:\n\n{forgotUrl}\n\nDupă ce ÃŪți resetezi parola, te vei putea conecta din nou.\n\nDacă crezi că aceasta a fost o eroare, te rugăm să contactezi echipa noastră de suport.\n\n– {product_name} Safety Team"
"body": "Salut {username},\n\nAm dezactivat temporar contul tău {product_name} deoarece am detectat activitate suspectă.\n\n{reason, select,\n null {}\n other {Motiv: {reason}}\n}\n\nPentru a recăpăta accesul la cont, va trebui să ÃŪți resetezi parola:\n\n{forgotUrl}\n\nDupă ce ÃŪți resetezi parola, te vei putea conecta din nou.\n\nDacă crezi că este o greșeală, te rugăm să contactezi asistența.\n\n– Echipa de siguranță {product_name}"
},
"account_scheduled_deletion": {
"subject": "Contul tău de {product_name} va fi șters permanent",
"body": "Salut {username},\n\nContul tău {product_name} a fost programat pentru ștergere permanentă din cauza ÃŪncălcării Termenilor și Condițiilor sau a Ghidului Comunității noastre.\n\nȘtergere programată: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motiv: {reason}}\n}\n\nAceasta este o măsură disciplinară serioasă. Datele contului tău vor fi șterse permanent la data programată.\n\nTe rugăm să revizuiești:\n- Termeni și Condiții: {termsUrl}\n- Ghidul Comunității: {guidelinesUrl}\n\nProcesul de apel:\nDacă crezi că această decizie de aplicare a fost incorectă sau nejustificată, ai la dispoziție 60 de zile pentru a depune un apel. Trimite un e-mail la {appeals_email} de la această adresă de e-mail.\n\nÎn apelul tău:\n- Explică clar de ce crezi că decizia de aplicare a fost incorectă sau nejustificată\n- Furnizează orice dovezi sau context relevante\n\nUn membru al Echipei de Siguranță {product_name} va examina apelul tău și poate ÃŪntrerupe ștergerea ÃŪn așteptare pÃĒnă la luarea unei decizii finale.\n\n– {product_name} Safety Team"
"subject": "Contul tău {product_name} va fi șters permanent",
"body": "Salut {username},\n\nContul tău {product_name} a fost programat pentru ștergere permanentă din cauza ÃŪncălcării Termenilor și condițiilor sau a regulilor comunității.\n\nȘtergere programată: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motiv: {reason}}\n}\n\nAceasta este o măsură disciplinară serioasă. Datele contului tău vor fi șterse permanent la data programată.\n\nTe rugăm să consulți:\n- Termeni și condiții: {termsUrl}\n- Regulile comunității: {guidelinesUrl}\n\nProcesul de contestare:\nDacă crezi că această decizie a fost incorectă sau nejustificată, ai la dispoziție 60 de zile pentru a depune o contestație. Trimite un e-mail la {appeals_email} de la această adresă.\n\nÎn contestația ta:\n- Explică clar de ce crezi că decizia a fost incorectă sau nejustificată\n- Adaugă orice dovadă sau context relevant\n\nUn membru al echipei de siguranță {product_name} va analiza contestația ta și poate suspenda ștergerea programată pÃĒnă la luarea unei decizii finale.\n\n– Echipa de siguranță {product_name}"
},
"account_temp_banned": {
"subject": "Contul tău {product_name} a fost suspendat temporar",
"body": "Salut {username},\n\nContul tău {product_name} a fost suspendat temporar pentru ÃŪncălcarea Termenilor și Condițiilor sau a Ghidului Comunității noastre.\n\nDurată: {durationHours, plural,\n one {1 oră} few {ore}\n other {# de ore}\n}\nSuspendat pÃĒnă la: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Motiv: {reason}}\n}\n\nÎn acest timp, nu vei putea accesa contul tău.\n\nTe rugăm să revizuiești:\n- Termeni și Condiții: {termsUrl}\n- Ghidul Comunității: {guidelinesUrl}\n\nDacă crezi că această decizie a fost incorectă sau nejustificată, poți depune un apel. Trimite un e-mail la {appeals_email} de la această adresă de e-mail și explică clar de ce crezi că decizia a fost incorectă. Vom examina apelul tău și vom răspunde cu decizia noastră.\n\n– {product_name} Safety Team Safety Team"
"body": "Salut {username},\n\nContul tău {product_name} a fost suspendat temporar pentru ÃŪncălcarea Termenilor și condițiilor sau a regulilor comunității.\n\nDurată: {durationHours, plural,\n one {1 oră}\n few {# ore}\n other {# de ore}\n}\nSuspendat pÃĒnă la: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Motiv: {reason}}\n}\n\nÎn acest timp, nu vei putea accesa contul.\n\nTe rugăm să consulți:\n- Termeni și condiții: {termsUrl}\n- Regulile comunității: {guidelinesUrl}\n\nDacă crezi că această decizie a fost incorectă sau nejustificată, poți depune o contestație. Trimite un e-mail la {appeals_email} de la această adresă și explică clar de ce crezi că decizia a fost incorectă. Vom analiza contestația ta și ÃŪți vom comunica decizia noastră.\n\n– Echipa de siguranță {product_name}"
},
"donation_confirmation": {
"subject": "ÃŽČ›i mulțumim pentru donația ta pentru {product_name}",
"body": "Salut,\n\nÃŽČ›i mulțumim pentru donația ta către {product_name}! {interval, select,\n month {Donația ta recurentă}\n year {Donația ta recurentă}\n other {Donația ta unică}\n} a fost {interval, select,\n month {configurată}\n year {configurată}\n other {procesată}\n} cu succes.\n\nDetalii donație:\nSumă: {amount} {currency} {interval, select,\n month {pe lună}\n year {pe an}\n other {}\n}\n\nStripe ÃŪți va trimite ÃŪn scurt timp un e-mail separat cu chitanța ta ÃŪn format PDF. Aceasta include toate detaliile plății și poate fi utilizată ÃŪn scopuri fiscale.\n\nPoți vizualiza istoricul donațiilor tale, descărca facturi, {interval, select,\n month {și gestiona sau anula abonamentul tău}\n year {și gestiona sau anula abonamentul tău}\n other {și gestiona donațiile viitoare}\n} ÃŪn orice moment folosind acest link:\n\n{manageUrl}\n\nSuportul tău ajută la menținerea {product_name} ÃŪn funcțiune. Mulțumim!\n\n– Echipa {product_name}"
"subject": "ÃŽČ›i mulțumim pentru donația către {product_name}",
"body": "Salut,\n\nÃŽČ›i mulțumim pentru donația ta către {product_name}! {interval, select,\n month {Donația ta recurentă}\n year {Donația ta recurentă}\n other {Donația ta unică}\n} a fost {interval, select,\n month {configurată}\n year {configurată}\n other {procesată}\n} cu succes.\n\nDetalii donație:\nSumă: {amount} {interval, select,\n month {pe lună}\n year {pe an}\n other {}\n}\n\nStripe ÃŪți va trimite ÃŪn scurt timp un e-mail separat cu chitanța și factura ta ÃŪn format PDF. Acestea includ toate detaliile plății și pot fi folosite ÃŪn scopuri fiscale.\n\nPoți vizualiza istoricul donațiilor, descărca facturi {interval, select,\n month {și gestiona sau anula abonamentul}\n year {și gestiona sau anula abonamentul}\n other {și gestiona donațiile viitoare}\n} ÃŪn orice moment folosind acest link:\n\n{manageUrl}\n\nSprijinul tău ne ajută să menținem {product_name} ÃŪn funcțiune. Mulțumim!\n\n– Echipa {product_name}"
},
"donation_magic_link": {
"subject": "Gestionează-ți donațiile pentru {product_name}",
"subject": "Gestionează-ți donațiile către {product_name}",
"body": "Salut,\n\nApasă pe linkul de mai jos pentru a accesa portalul tău de donator:\n\n{manageUrl}\n\nÎn portal, poți gestiona abonamentele, descărca facturi și vizualiza istoricul donațiilor tale.\n\nAcest link expiră la data de {expiresAt, date, full} la ora {expiresAt, time, short}.\n\nDacă nu ai solicitat acest link, poți ignora ÃŪn siguranță acest e-mail.\n\n– Echipa {product_name}"
},
"dsa_report_verification": {
"subject": "Verifică-ți e-mailul pentru un raport DSA",
"body": "Salut,\n\nFolosește codul de verificare de mai jos pentru a trimite raportul tău privind Legea Serviciilor Digitale pe {product_name}:\n\n{code}\n\nAcest cod expiră la data de {expiresAt, date, full} la ora {expiresAt, time, short}.\n\nDacă nu ai solicitat acest lucru, poți ignora acest e-mail.\n\n– Echipa de Siguranță a {product_name}"
"body": "Salut,\n\nFolosește codul de verificare de mai jos pentru a trimite raportul tău conform Digital Services Act pe {product_name}:\n\n{code}\n\nAcest cod expiră la data de {expiresAt, date, full} la ora {expiresAt, time, short}.\n\nDacă nu ai solicitat acest lucru, poți ignora acest e-mail.\n\n– Echipa de siguranță {product_name}"
},
"email_change_new": {
"subject": "Verifică-ți noul e-mail pentru {product_name}",
"body": "Salut {username},\n\nIntrodu acest cod ÃŪn aplicație pentru a-ți verifica noul e-mail pentru {product_name}:\n\n{code}\n\nAcest cod expiră la data de {expiresAt, date, full} la ora {expiresAt, time, short}.\n\nDacă nu ai solicitat acest lucru, poți ignora acest e-mail.\n\n– Echipa {product_name}"
"body": "Salut {username},\n\nIntrodu acest cod ÃŪn aplicație pentru a-ți verifica noua adresă de e-mail {product_name}:\n\n{code}\n\nAcest cod expiră la data de {expiresAt, date, full} la ora {expiresAt, time, short}.\n\nDacă nu ai solicitat acest lucru, poți ignora acest e-mail.\n\n– Echipa {product_name}"
},
"email_change_original": {
"subject": "Confirmă schimbarea adresei de e-mail pentru {product_name}",
@@ -37,23 +37,23 @@ const EMAIL_I18N_RO_MESSAGES = defineEmailI18nLocaleMessages({
},
"email_change_revert": {
"subject": "Adresa de e-mail pentru {product_name} a fost schimbată",
"body": "Salut {username},\n\nAdresa de e-mail a contului tău {product_name} a fost schimbată ÃŪn {newEmail}.\n\nDacă tu ai făcut această modificare, nu este necesară nicio acțiune. Dacă nu tu ai făcut-o, poți anula modificarea și securiza contul tău folosind acest link:\n\n{revertUrl}\n\nAceasta va restabili e-mailul tău anterior, te va deconecta de peste tot, va elimina numerele de telefon conectate, va dezactiva MFA și ÃŪți va cere să setezi o nouă parolă.\n\n– Echipa de Siguranță a {product_name}"
"body": "Salut {username},\n\nAdresa de e-mail a contului tău {product_name} a fost schimbată ÃŪn {newEmail}.\n\nDacă tu ai făcut această modificare, nu trebuie să faci nimic. Dacă nu ai făcut-o tu, poți anula modificarea și ÃŪți poți securiza contul folosind acest link:\n\n{revertUrl}\n\nAceasta va restabili adresa ta de e-mail anterioară, te va deconecta de pe toate dispozitivele, va elimina numerele de telefon asociate, va dezactiva MFA și ÃŪți va cere să setezi o parolă nouă.\n\n– Echipa de siguranță {product_name}"
},
"email_verification": {
"subject": "Verifică-ți adresa de e-mail pentru {product_name}",
"body": "Salut {username},\n\nTe rugăm să verifici adresa de e-mail a contului tău {product_name} apăsÃĒnd pe linkul de mai jos:\n\n{verifyUrl}\n\nDacă nu ai creat un cont {product_name}, poți ignora ÃŪn siguranță acest e-mail.\n\nAcest link este valabil 24 de ore.\n\n– Echipa {product_name}"
},
"gift_chargeback_notification": {
"subject": "Beneficiile obținute prin cadoul tău răscumpărat au fost eliminate",
"body": "Salut {username},\n\nUn cod cadou pe care l-ai răscumpărat a fost plătit inițial de altcineva. Acea plată a fost ulterior anulată (o rambursare).\n\nDin această cauză, am eliminat beneficiile care au fost adăugate contului tău atunci cÃĒnd ai răscumpărat cadoul.\n\nDacă crezi că aceasta este o greșeală, te rugăm să contactezi echipa noastră de suport și să incluzi orice detalii ai despre codul cadou și cÃĒnd l-ai răscumpărat.\n\n– Echipa {product_name}"
"subject": "Beneficiile din cadoul pe care l-ai valorificat au fost eliminate",
"body": "Salut {username},\n\nUn cod cadou pe care l-ai valorificat a fost plătit inițial de altcineva. De atunci, plata respectivă a fost retrasă (o anulare a plății).\n\nDin această cauză, am eliminat beneficiile care au fost adăugate contului tău atunci cÃĒnd ai valorificat cadoul.\n\nDacă crezi că este o greșeală, te rugăm să contactezi asistența și să incluzi orice detalii ai despre codul cadou și despre momentul ÃŪn care l-ai valorificat.\n\n– Echipa {product_name}"
},
"harvest_completed": {
"subject": "Exportul datelor din {product_name} este gata pentru descărcare",
"body": "Salut {username},\n\nExportul datelor tale este gata.\n\nLink de descărcare:\n{downloadUrl}\n\nMesaje incluse: {totalMessages, number}\nDimensiune fișier: {fileSizeMB, number} MB\n\nAcest link expiră la data de {expiresAt, date, full} la ora {expiresAt, time, short}.\n\nDacă nu ai solicitat acest export, te rugăm să-ți schimbi parola imediat și să contactezi echipa noastră de suport.\n\n– Echipa {product_name}"
"body": "Salut {username},\n\nExportul datelor tale este gata.\n\nLink de descărcare:\n{downloadUrl}\n\nMesaje incluse: {totalMessages, number}\nDimensiune fișier: {fileSizeMB, number} MB\n\nAcest link expiră la data de {expiresAt, date, full} la ora {expiresAt, time, short}.\n\nDacă nu ai solicitat acest export, te rugăm să-ți schimbi parola imediat și să contactezi asistența.\n\n– Echipa {product_name}"
},
"inactivity_warning": {
"subject": "Contul tău {product_name} va fi șters din cauza inactivității",
"body": "Salut {username},\n\nNu am ÃŪnregistrat nicio activitate pe contul tău {product_name} de la data de {lastActiveDate, date, full}.\n\nDacă nu te conectezi pÃĒnă la data de {deletionDate, date, full} la ora {deletionDate, time, short}, contul tău va fi șters permanent din cauza inactivității.\n\nConectează-te aici:\n{loginUrl}\n\nDacă ai folosit {product_name} recent, te rugăm să contactezi imediat echipa noastră de suport.\n\n– Echipa {product_name}"
"body": "Salut {username},\n\nNu am ÃŪnregistrat nicio activitate pe contul tău {product_name} de la data de {lastActiveDate, date, full}.\n\nDacă nu te conectezi pÃĒnă la data de {deletionDate, date, full} la ora {deletionDate, time, short}, contul tău va fi șters permanent din cauza inactivității.\n\nConectează-te aici:\n{loginUrl}\n\nDacă ai folosit {product_name} recent, te rugăm să contactezi imediat asistența.\n\n– Echipa {product_name}"
},
"ip_authorization": {
"subject": "Autorizează conectarea de la o nouă adresă IP",
@@ -65,23 +65,23 @@ const EMAIL_I18N_RO_MESSAGES = defineEmailI18nLocaleMessages({
},
"password_change_verification": {
"subject": "Confirmă schimbarea parolei pentru {product_name}",
"body": "Salut {username},\n\nAm primit o solicitare de schimbare a parolei contului tău {product_name}.\n\nPentru a confirma această modificare, introdu acest cod ÃŪn aplicație:\n\n{code}\n\nAcest cod expiră la {expiresAt}.\n\nDacă nu ai solicitat acest lucru, cineva ar putea avea acces la contul tău. Schimbă-ți parola imediat și activează autentificarea cu doi factori.\n\n– Echipa {product_name}"
"body": "Salut {username},\n\nAm primit o solicitare de schimbare a parolei contului tău {product_name}.\n\nPentru a confirma această modificare, introdu acest cod ÃŪn aplicație:\n\n{code}\n\nAcest cod expiră la {expiresAt}.\n\nDacă nu ai solicitat acest lucru, cineva ar putea avea acces la contul tău. Schimbă-ți parola imediat și activează autentificarea ÃŪn doi pași.\n\n– Echipa {product_name}"
},
"password_reset": {
"subject": "Resetează-ți parola pentru {product_name}",
"body": "Salut {username},\n\nAi solicitat o resetare a parolei pentru {product_name}. Folosește linkul de mai jos pentru a seta o nouă parolă:\n\n{resetUrl}\n\nDacă nu ai solicitat acest lucru, poți ignora ÃŪn siguranță acest e-mail.\n\nAcest link este valabil 1 oră.\n\n– Echipa {product_name}"
"body": "Salut {username},\n\nAi solicitat o resetare a parolei pentru {product_name}. Folosește linkul de mai jos pentru a seta o nouă parolă:\n\n{resetUrl}\n\nDacă nu ai solicitat acest lucru, poți ignora ÃŪn siguranță acest e-mail.\n\nAcest link este valabil o oră.\n\n– Echipa {product_name}"
},
"registration_approved": {
"subject": "Înregistrarea ta pentru {product_name} a fost aprobată",
"body": "Salut {username},\n\nVești bune: ÃŪnregistrarea ta pentru {product_name} a fost aprobată.\n\nAcum te poți conecta la aplicația {product_name} aici:\n{channelsUrl}\n\nBun venit ÃŪn comunitatea {product_name}.\n\n– Echipa {product_name}"
},
"report_resolved": {
"subject": "Raportul tău privind {product_name} a fost revizuit",
"body": "Salut {username},\n\nRaportul tău (ID: {reportId}) a fost revizuit de Echipa noastră de Siguranță.{hasComment, select, yes {\n\nRăspuns de la Echipa de Siguranță:\n{publicComment}} other {}}\n\nMulțumim că ajuți la menținerea siguranței {product_name} pentru toată lumea. Luăm ÃŪn serios toate rapoartele și apreciem contribuția ta la comunitate.\n\nDacă ai ÃŪntrebări sau nelămuriri cu privire la acest rezultat, te rugăm să contactezi {safety_email}.\n\n– Echipa de Siguranță a {product_name}"
"subject": "Raportul tău de pe {product_name} a fost analizat",
"body": "Salut {username},\n\nRaportul tău (ID: {reportId}) a fost analizat de echipa noastră de siguranță.{hasComment, select, yes {\n\nRăspuns de la echipa de siguranță:\n{publicComment}} other {}}\n\nÃŽČ›i mulțumim că ne ajuți să păstrăm {product_name} ÃŪn siguranță pentru toată lumea. Luăm ÃŪn serios toate rapoartele și apreciem contribuția ta la comunitate.\n\nDacă ai ÃŪntrebări sau nelămuriri cu privire la acest rezultat, te rugăm să scrii la {safety_email}.\n\n– Echipa de siguranță {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Contul tău de {product_name} va fi șters permanent",
"body": "Salut {username},\n\nContul tău {product_name} a fost programat pentru ștergere permanentă.\n\nȘtergere programată: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motiv: {reason}}\n}\n\nAceasta este o măsură disciplinară serioasă. Datele contului tău vor fi șterse permanent la data programată.\n\nDacă crezi că această decizie de aplicare a fost incorectă, poți depune un apel. Trimite un e-mail la {appeals_email} de la această adresă de e-mail.\n\n– {product_name} Safety Team"
"subject": "Contul tău {product_name} va fi șters permanent",
"body": "Salut {username},\n\nContul tău {product_name} a fost programat pentru ștergere permanentă.\n\nȘtergere programată: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Motiv: {reason}}\n}\n\nAceasta este o măsură disciplinară serioasă. Datele contului tău vor fi șterse permanent la data programată.\n\nDacă crezi că această decizie a fost incorectă, poți depune o contestație. Trimite un e-mail la {appeals_email} de la această adresă.\n\n– Echipa de siguranță {product_name}"
},
"self_deletion_scheduled": {
"subject": "Ștergerea contului {product_name} a fost programată",
@@ -89,7 +89,7 @@ const EMAIL_I18N_RO_MESSAGES = defineEmailI18nLocaleMessages({
},
"unban_notification": {
"subject": "Suspendarea contului {product_name} a fost ridicată",
"body": "Salut {username},\n\nVești bune: suspendarea contului tău {product_name} a fost ridicată.\n\n{reason, select,\n null {}\n other {Motiv: {reason}}\n}\n\nAcum te poți conecta din nou și poți continua să folosești {product_name} ÃŪn mod normal.\n\n– {product_name} Safety Team"
"body": "Salut {username},\n\nVești bune: suspendarea contului tău {product_name} a fost ridicată.\n\n{reason, select,\n null {}\n other {Motiv: {reason}}\n}\n\nAcum te poți conecta din nou și poți continua să folosești {product_name} ÃŪn mod normal.\n\n– Echipa de siguranță {product_name}"
}
});
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_RU_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -9,51 +9,51 @@ const EMAIL_I18N_RU_MESSAGES = defineEmailI18nLocaleMessages({
},
"account_scheduled_deletion": {
"subject": "ÐĒÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ {product_name} ÐąŅƒÐīÐĩŅ‚ ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―Ðū ҃ÐīаÐŧŅ‘Ð―",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĒÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ {product_name} заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð― К ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―ÐūÐžŅƒ ҃ÐīаÐŧÐĩÐ―ÐļŅŽ Ðļз-за Ð―Ð°Ņ€ŅƒŅˆÐĩÐ―ÐļŅ Ð―Ð°ŅˆÐļŅ… ÐĢҁÐŧÐūÐēÐļÐđ ÐļҁÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ð―ÐļŅ ÐļÐŧÐļ ÐŸŅ€Ð°ÐēÐļÐŧ ҁÐūÐūÐąŅ‰Ðĩҁ҂Ðēа.\n\nЗаÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ð―ÐūÐĩ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ: {deletionDate, date, full} Ðē {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nÐ­Ņ‚Ðū ҁÐĩŅ€ŅŒŅ‘Ð·Ð―Ð°Ņ ОÐĩŅ€Ð°. Ð”Ð°Ð―Ð―Ņ‹Ðĩ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° ÐąŅƒÐīŅƒŅ‚ ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―Ðū ҃ÐīаÐŧÐĩÐ―Ņ‹ Ðē заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ð―ŅƒŅŽ ÐīÐ°Ņ‚Ņƒ.\n\nПÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, ÐūÐ·Ð―Ð°ÐšÐūÐžŅŒŅŅ:\n- ÐĢҁÐŧÐūÐēÐļŅ ÐļҁÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ð―ÐļŅ: {termsUrl}\n- ÐŸŅ€Ð°ÐēÐļÐŧа ҁÐūÐūÐąŅ‰Ðĩҁ҂Ðēа: {guidelinesUrl}\n\nÐŸŅ€Ðū҆Ðĩҁҁ аÐŋÐĩÐŧÐŧŅŅ†ÐļÐļ:\nÐ•ŅÐŧÐļ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ, ҇҂Ðū ŅŅ‚Ðū Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ ÐąŅ‹ÐŧÐū Ð―ÐĩÐēÐĩŅ€Ð―Ņ‹Ðž ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ð―Ņ‹Ðž, ҃ Ņ‚ÐĩÐąŅ ÐĩŅŅ‚ŅŒ 60 ÐīÐ―ÐĩÐđ, ҇҂ÐūÐąŅ‹ ÐŋÐūÐīÐ°Ņ‚ŅŒ аÐŋÐĩÐŧÐŧŅŅ†ÐļŅŽ. ÐžŅ‚ÐŋŅ€Ð°ÐēҌ ÐŋÐļŅŅŒÐžÐū Ð―Ð° {appeals_email} ҁ ŅŅ‚ÐūÐģÐū аÐīŅ€ÐĩŅÐ° ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ.\n\nВ ҁÐēÐūÐĩÐđ аÐŋÐĩÐŧÐŧŅŅ†ÐļÐļ:\n- Ð§Ņ‘Ņ‚ÐšÐū ÐūÐąŅŠŅŅÐ―Ðļ, ÐŋÐū҇ÐĩÐžŅƒ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ, ҇҂Ðū Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ ÐąŅ‹ÐŧÐū Ð―ÐĩÐēÐĩŅ€Ð―Ņ‹Ðž ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ð―Ņ‹Ðž\n- ÐŸŅ€ÐĩÐīÐūŅŅ‚Ð°ÐēҌ ÐŧŅŽÐąŅ‹Ðĩ ҁÐūÐūŅ‚ÐēÐĩ҂ҁ҂ÐēŅƒŅŽŅ‰ÐļÐĩ ÐīÐūÐšÐ°Ð·Ð°Ņ‚ÐĩÐŧŅŒŅŅ‚Ðēа ÐļÐŧÐļ КÐūÐ―Ņ‚ÐĩÐšŅŅ‚\n\nÐĄÐūŅ‚Ņ€ŅƒÐīÐ―ÐļК КÐūÐžÐ°Ð―ÐīŅ‹ ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name} Ņ€Ð°ŅŅÐžÐū҂ҀÐļŅ‚ Ņ‚ÐēÐūŅŽ аÐŋÐĩÐŧÐŧŅŅ†ÐļŅŽ Ðļ ОÐūÐķÐĩŅ‚ ÐŋŅ€ÐļÐūŅŅ‚Ð°Ð―ÐūÐēÐļŅ‚ŅŒ заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ð―ÐūÐĩ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ ÐīÐū ÐŋŅ€ÐļÐ―ŅŅ‚ÐļŅ ÐūКÐūÐ―Ņ‡Ð°Ņ‚ÐĩÐŧŅŒÐ―ÐūÐģÐū Ņ€Ðĩ҈ÐĩÐ―ÐļŅ.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐœŅ‹ заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēаÐŧÐļ ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―ÐūÐĩ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name} Ðļз-за Ð―Ð°Ņ€ŅƒŅˆÐĩÐ―ÐļŅ Ð―Ð°ŅˆÐļŅ… ÐĢҁÐŧÐūÐēÐļÐđ ÐļҁÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ð―ÐļŅ ÐļÐŧÐļ ÐŸŅ€Ð°ÐēÐļÐŧ ҁÐūÐūÐąŅ‰Ðĩҁ҂Ðēа.\n\nЗаÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ð―ÐūÐĩ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ: {deletionDate, date, full} Ðē {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nÐ­Ņ‚Ðū ҁÐĩŅ€ŅŒŅ‘Ð·Ð―Ð°Ņ ОÐĩŅ€Ð°. Ð”Ð°Ð―Ð―Ņ‹Ðĩ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° ÐąŅƒÐīŅƒŅ‚ ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―Ðū ҃ÐīаÐŧÐĩÐ―Ņ‹ Ðē заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ð―ŅƒŅŽ ÐīÐ°Ņ‚Ņƒ.\n\nПÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, ÐūÐ·Ð―Ð°ÐšÐūÐžŅŒŅŅ:\n- ÐĢҁÐŧÐūÐēÐļŅ ÐļҁÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ð―ÐļŅ: {termsUrl}\n- ÐŸŅ€Ð°ÐēÐļÐŧа ҁÐūÐūÐąŅ‰Ðĩҁ҂Ðēа: {guidelinesUrl}\n\nÐŸŅ€Ðū҆Ðĩҁҁ аÐŋÐĩÐŧÐŧŅŅ†ÐļÐļ:\nÐ•ŅÐŧÐļ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ, ҇҂Ðū ŅŅ‚Ðū Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ ÐąŅ‹ÐŧÐū Ð―ÐĩÐēÐĩŅ€Ð―Ņ‹Ðž ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ð―Ņ‹Ðž, ҃ Ņ‚ÐĩÐąŅ ÐĩŅŅ‚ŅŒ 60 ÐīÐ―ÐĩÐđ, ҇҂ÐūÐąŅ‹ ÐŋÐūÐīÐ°Ņ‚ŅŒ аÐŋÐĩÐŧÐŧŅŅ†ÐļŅŽ. ÐžŅ‚ÐŋŅ€Ð°ÐēҌ ÐŋÐļŅŅŒÐžÐū Ð―Ð° {appeals_email} ҁ ŅŅ‚ÐūÐģÐū аÐīŅ€ÐĩŅÐ° ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ.\n\nВ ҁÐēÐūÐĩÐđ аÐŋÐĩÐŧÐŧŅŅ†ÐļÐļ:\n- Ð§Ņ‘Ņ‚ÐšÐū ÐūÐąŅŠŅŅÐ―Ðļ, ÐŋÐū҇ÐĩÐžŅƒ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ, ҇҂Ðū Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ ÐąŅ‹ÐŧÐū Ð―ÐĩÐēÐĩŅ€Ð―Ņ‹Ðž ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ð―Ņ‹Ðž\n- ÐŸŅ€ÐĩÐīÐūŅŅ‚Ð°ÐēҌ ÐŧŅŽÐąŅ‹Ðĩ ҁÐūÐūŅ‚ÐēÐĩ҂ҁ҂ÐēŅƒŅŽŅ‰ÐļÐĩ ÐīÐūÐšÐ°Ð·Ð°Ņ‚ÐĩÐŧŅŒŅŅ‚Ðēа ÐļÐŧÐļ КÐūÐ―Ņ‚ÐĩÐšŅŅ‚\n\nÐĄÐūŅ‚Ņ€ŅƒÐīÐ―ÐļК КÐūÐžÐ°Ð―ÐīŅ‹ ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name} Ņ€Ð°ŅŅÐžÐū҂ҀÐļŅ‚ Ņ‚ÐēÐūŅŽ аÐŋÐĩÐŧÐŧŅŅ†ÐļŅŽ Ðļ ОÐūÐķÐĩŅ‚ ÐŋŅ€ÐļÐūŅŅ‚Ð°Ð―ÐūÐēÐļŅ‚ŅŒ заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ð―ÐūÐĩ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ ÐīÐū ÐŋŅ€ÐļÐ―ŅŅ‚ÐļŅ ÐūКÐūÐ―Ņ‡Ð°Ņ‚ÐĩÐŧŅŒÐ―ÐūÐģÐū Ņ€Ðĩ҈ÐĩÐ―ÐļŅ.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
},
"account_temp_banned": {
"subject": "ÐĒÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ {product_name} ÐēŅ€ÐĩОÐĩÐ―Ð―Ðū Ð·Ð°ÐąÐŧÐūКÐļŅ€ÐūÐēÐ°Ð―",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĒÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ {product_name} ÐēŅ€ÐĩОÐĩÐ―Ð―Ðū Ð·Ð°ÐąÐŧÐūКÐļŅ€ÐūÐēÐ°Ð― за Ð―Ð°Ņ€ŅƒŅˆÐĩÐ―ÐļÐĩ Ð―Ð°ŅˆÐļŅ… ÐĢҁÐŧÐūÐēÐļÐđ ÐļҁÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ð―ÐļŅ ÐļÐŧÐļ ÐŸŅ€Ð°ÐēÐļÐŧ ҁÐūÐūÐąŅ‰Ðĩҁ҂Ðēа.\n\nДÐŧÐļŅ‚ÐĩÐŧŅŒÐ―ÐūŅŅ‚ŅŒ: {durationHours, plural,\n one {1 Ņ‡Ð°Ņ} few {# Ņ‡Ð°ŅÐ°}\n many {# Ņ‡Ð°ŅÐūÐē} other {# Ņ‡Ð°ŅÐ°}\n}\nÐ—Ð°ÐąÐŧÐūКÐļŅ€ÐūÐēÐ°Ð― ÐīÐū: {bannedUntil, date, full} Ðē {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nВ Ņ‚Ðĩ҇ÐĩÐ―ÐļÐĩ ŅŅ‚ÐūÐģÐū ÐēŅ€ÐĩОÐĩÐ―Ðļ ҂ҋ Ð―Ðĩ ŅÐžÐūÐķÐĩ҈Ҍ ÐŋÐūÐŧŅƒŅ‡ÐļŅ‚ŅŒ ÐīÐūŅŅ‚ŅƒÐŋ К ҁÐēÐūÐĩÐžŅƒ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ņƒ.\n\nПÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, ÐūÐ·Ð―Ð°ÐšÐūÐžŅŒŅŅ:\n- ÐĢҁÐŧÐūÐēÐļŅ ÐļҁÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ð―ÐļŅ: {termsUrl}\n- ÐŸŅ€Ð°ÐēÐļÐŧа ҁÐūÐūÐąŅ‰Ðĩҁ҂Ðēа: {guidelinesUrl}\n\nÐ•ŅÐŧÐļ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ, ҇҂Ðū ŅŅ‚Ðū Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ ÐąŅ‹ÐŧÐū Ð―ÐĩÐēÐĩŅ€Ð―Ņ‹Ðž ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ð―Ņ‹Ðž, ҂ҋ ОÐūÐķÐĩ҈Ҍ ÐŋÐūÐīÐ°Ņ‚ŅŒ аÐŋÐĩÐŧÐŧŅŅ†ÐļŅŽ. ÐžŅ‚ÐŋŅ€Ð°ÐēҌ ÐŋÐļŅŅŒÐžÐū Ð―Ð° {appeals_email} ҁ ŅŅ‚ÐūÐģÐū аÐīŅ€ÐĩŅÐ° ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ Ðļ Ņ‡Ņ‘Ņ‚ÐšÐū ÐūÐąŅŠŅŅÐ―Ðļ, ÐŋÐū҇ÐĩÐžŅƒ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ Ð―ÐĩÐēÐĩŅ€Ð―Ņ‹Ðž. ÐœŅ‹ Ņ€Ð°ŅŅÐžÐū҂ҀÐļО Ņ‚ÐēÐūŅŽ аÐŋÐĩÐŧÐŧŅŅ†ÐļŅŽ Ðļ ҁÐūÐūÐąŅ‰ÐļО Ðū Ð―Ð°ŅˆÐĩО Ņ€Ðĩ҈ÐĩÐ―ÐļÐļ.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĒÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ {product_name} ÐēŅ€ÐĩОÐĩÐ―Ð―Ðū Ð·Ð°ÐąÐŧÐūКÐļŅ€ÐūÐēÐ°Ð― за Ð―Ð°Ņ€ŅƒŅˆÐĩÐ―ÐļÐĩ Ð―Ð°ŅˆÐļŅ… ÐĢҁÐŧÐūÐēÐļÐđ ÐļҁÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ð―ÐļŅ ÐļÐŧÐļ ÐŸŅ€Ð°ÐēÐļÐŧ ҁÐūÐūÐąŅ‰Ðĩҁ҂Ðēа.\n\nДÐŧÐļŅ‚ÐĩÐŧŅŒÐ―ÐūŅŅ‚ŅŒ: {durationHours, plural,\n one {# Ņ‡Ð°Ņ}\n few {# Ņ‡Ð°ŅÐ°}\n many {# Ņ‡Ð°ŅÐūÐē}\n other {# Ņ‡Ð°ŅÐ°}\n}\nÐ—Ð°ÐąÐŧÐūКÐļŅ€ÐūÐēÐ°Ð― ÐīÐū: {bannedUntil, date, full} Ðē {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nВ Ņ‚Ðĩ҇ÐĩÐ―ÐļÐĩ ŅŅ‚ÐūÐģÐū ÐēŅ€ÐĩОÐĩÐ―Ðļ ҂ҋ Ð―Ðĩ ŅÐžÐūÐķÐĩ҈Ҍ ÐŋÐūÐŧŅƒŅ‡ÐļŅ‚ŅŒ ÐīÐūŅŅ‚ŅƒÐŋ К ҁÐēÐūÐĩÐžŅƒ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ņƒ.\n\nПÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, ÐūÐ·Ð―Ð°ÐšÐūÐžŅŒŅŅ:\n- ÐĢҁÐŧÐūÐēÐļŅ ÐļҁÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ð―ÐļŅ: {termsUrl}\n- ÐŸŅ€Ð°ÐēÐļÐŧа ҁÐūÐūÐąŅ‰Ðĩҁ҂Ðēа: {guidelinesUrl}\n\nÐ•ŅÐŧÐļ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ, ҇҂Ðū ŅŅ‚Ðū Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ ÐąŅ‹ÐŧÐū Ð―ÐĩÐēÐĩŅ€Ð―Ņ‹Ðž ÐļÐŧÐļ Ð―ÐĩÐūÐąÐūŅÐ―ÐūÐēÐ°Ð―Ð―Ņ‹Ðž, ҂ҋ ОÐūÐķÐĩ҈Ҍ ÐŋÐūÐīÐ°Ņ‚ŅŒ аÐŋÐĩÐŧÐŧŅŅ†ÐļŅŽ. ÐžŅ‚ÐŋŅ€Ð°ÐēҌ ÐŋÐļŅŅŒÐžÐū Ð―Ð° {appeals_email} ҁ ŅŅ‚ÐūÐģÐū аÐīŅ€ÐĩŅÐ° ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ Ðļ Ņ‡Ņ‘Ņ‚ÐšÐū ÐūÐąŅŠŅŅÐ―Ðļ, ÐŋÐū҇ÐĩÐžŅƒ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ Ð―ÐĩÐēÐĩŅ€Ð―Ņ‹Ðž. ÐœŅ‹ Ņ€Ð°ŅŅÐžÐū҂ҀÐļО Ņ‚ÐēÐūŅŽ аÐŋÐĩÐŧÐŧŅŅ†ÐļŅŽ Ðļ ҁÐūÐūÐąŅ‰ÐļО Ðū Ð―Ð°ŅˆÐĩО Ņ€Ðĩ҈ÐĩÐ―ÐļÐļ.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
},
"donation_confirmation": {
"subject": "ÐĄÐŋÐ°ŅÐļÐąÐū за Ņ‚ÐēÐūŅ‘ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐĩ ÐīÐŧŅ {product_name}",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚,\n\nÐĄÐŋÐ°ŅÐļÐąÐū за Ņ‚ÐēÐūŅ‘ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐĩ ÐīÐŧŅ {product_name}! ÐĒÐēÐūŅ‘ {interval, select,\n month {Ņ€ÐĩÐģ҃ÐŧŅŅ€Ð―ÐūÐĩ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐĩ}\n year {Ņ€ÐĩÐģ҃ÐŧŅŅ€Ð―ÐūÐĩ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐĩ}\n other {ÐĩÐīÐļÐ―ÐūŅ€Ð°Ð·ÐūÐēÐūÐĩ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐĩ}\n} ÐąŅ‹ÐŧÐū {interval, select,\n month {Ð―Ð°ŅŅ‚Ņ€ÐūÐĩÐ―Ðū}\n year {Ð―Ð°ŅŅ‚Ņ€ÐūÐĩÐ―Ðū}\n other {ÐūÐąŅ€Ð°ÐąÐūŅ‚Ð°Ð―Ðū}\n} ҃ҁÐŋÐĩŅˆÐ―Ðū.\n\nДÐĩŅ‚Ð°ÐŧÐļ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļŅ:\nÐĄŅƒÐžÐžÐ°: {amount} {currency} {interval, select,\n month {Ðē ОÐĩŅŅŅ†}\n year {Ðē ÐģÐūÐī}\n other {}\n}\n\nStripe ÐēŅÐšÐūŅ€Ðĩ ÐūŅ‚ÐŋŅ€Ð°ÐēÐļŅ‚ Ņ‚ÐĩÐąÐĩ ÐūŅ‚ÐīÐĩÐŧŅŒÐ―ŅƒŅŽ КÐēÐļŅ‚Ð°Ð―Ņ†ÐļŅŽ Ðē Ņ„ÐūŅ€ÐžÐ°Ņ‚Ðĩ PDF ҁÐū ÐēҁÐĩОÐļ ÐŋÐŧÐ°Ņ‚ÐĩÐķÐ―Ņ‹ÐžÐļ ÐīÐ°Ð―Ð―Ņ‹ÐžÐļ, КÐūŅ‚ÐūŅ€ŅƒŅŽ ОÐūÐķÐ―Ðū ÐļҁÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ņ‚ŅŒ ÐīÐŧŅ Ð―Ð°ÐŧÐūÐģÐūÐēҋ҅ ҆ÐĩÐŧÐĩÐđ.\n\nÐĒŅ‹ ОÐūÐķÐĩ҈Ҍ ÐŋŅ€ÐūŅÐžÐū҂ҀÐĩŅ‚ŅŒ Ðļҁ҂ÐūŅ€ÐļŅŽ ҁÐēÐūÐļŅ… ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐđ, ŅÐšÐ°Ņ‡Ð°Ņ‚ŅŒ КÐēÐļŅ‚Ð°Ð―Ņ†ÐļÐļ, {interval, select,\n month {а Ņ‚Ð°ÐšÐķÐĩ ҃ÐŋŅ€Ð°ÐēÐŧŅŅ‚ŅŒ ÐŋÐūÐīÐŋÐļŅÐšÐūÐđ ÐļÐŧÐļ ÐūŅ‚ÐžÐĩÐ―ÐļŅ‚ŅŒ ÐĩŅ‘}\n year {а Ņ‚Ð°ÐšÐķÐĩ ҃ÐŋŅ€Ð°ÐēÐŧŅŅ‚ŅŒ ÐŋÐūÐīÐŋÐļŅÐšÐūÐđ ÐļÐŧÐļ ÐūŅ‚ÐžÐĩÐ―ÐļŅ‚ŅŒ ÐĩŅ‘}\n other {Ðļ ҃ÐŋŅ€Ð°ÐēÐŧŅŅ‚ŅŒ ÐąŅƒÐīŅƒŅ‰ÐļОÐļ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļŅÐžÐļ}\n} Ðē ÐŧŅŽÐąÐūÐĩ ÐēŅ€ÐĩÐžŅ ÐŋÐū ŅŅ‚ÐūÐđ ҁҁҋÐŧКÐĩ:\n\n{manageUrl}\n\nÐĒÐēÐūŅ ÐŋÐūÐīÐīÐĩŅ€ÐķКа ÐŋÐūОÐūÐģаÐĩŅ‚ {product_name} Ņ€Ð°ÐąÐūŅ‚Ð°Ņ‚ŅŒ. ÐĄÐŋÐ°ŅÐļÐąÐū!\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚,\n\nÐĄÐŋÐ°ŅÐļÐąÐū за Ņ‚ÐēÐūŅ‘ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐĩ ÐīÐŧŅ {product_name}! ÐĒÐēÐūŅ‘ {interval, select,\n month {Ņ€ÐĩÐģ҃ÐŧŅŅ€Ð―ÐūÐĩ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐĩ}\n year {Ņ€ÐĩÐģ҃ÐŧŅŅ€Ð―ÐūÐĩ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐĩ}\n other {Ņ€Ð°Ð·ÐūÐēÐūÐĩ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐĩ}\n} ҃ҁÐŋÐĩŅˆÐ―Ðū {interval, select,\n month {Ð―Ð°ŅŅ‚Ņ€ÐūÐĩÐ―Ðū}\n year {Ð―Ð°ŅŅ‚Ņ€ÐūÐĩÐ―Ðū}\n other {ÐūÐąŅ€Ð°ÐąÐūŅ‚Ð°Ð―Ðū}\n}.\n\nДÐĩŅ‚Ð°ÐŧÐļ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļŅ:\nÐĄŅƒÐžÐžÐ°: {amount} {interval, select,\n month {Ðē ОÐĩŅŅŅ†}\n year {Ðē ÐģÐūÐī}\n other {}\n}\n\nStripe ÐēŅÐšÐūŅ€Ðĩ ÐūŅ‚ÐŋŅ€Ð°ÐēÐļŅ‚ Ņ‚ÐĩÐąÐĩ ÐūŅ‚ÐīÐĩÐŧŅŒÐ―ŅƒŅŽ КÐēÐļŅ‚Ð°Ð―Ņ†ÐļŅŽ ҁÐū ҁ҇ґ҂ÐūО Ðē Ņ„ÐūŅ€ÐžÐ°Ņ‚Ðĩ PDF. В Ð―ÐĩÐđ ÐĩŅŅ‚ŅŒ ÐēҁÐĩ ÐŋÐŧÐ°Ņ‚Ņ‘ÐķÐ―Ņ‹Ðĩ ÐīÐ°Ð―Ð―Ņ‹Ðĩ, Ðļ ÐĩŅ‘ ОÐūÐķÐ―Ðū ÐļҁÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ņ‚ŅŒ ÐīÐŧŅ Ð―Ð°ÐŧÐūÐģÐūÐēҋ҅ ҆ÐĩÐŧÐĩÐđ.\n\nÐĒŅ‹ ОÐūÐķÐĩ҈Ҍ ÐŋŅ€ÐūŅÐžÐ°Ņ‚Ņ€ÐļÐēÐ°Ņ‚ŅŒ Ðļҁ҂ÐūŅ€ÐļŅŽ ҁÐēÐūÐļŅ… ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐđ, ŅÐšÐ°Ņ‡ÐļÐēÐ°Ņ‚ŅŒ ҁ҇ÐĩŅ‚Ð°, {interval, select,\n month {а Ņ‚Ð°ÐšÐķÐĩ ҃ÐŋŅ€Ð°ÐēÐŧŅŅ‚ŅŒ ÐŋÐūÐīÐŋÐļŅÐšÐūÐđ ÐļÐŧÐļ ÐūŅ‚ÐžÐĩÐ―ÐļŅ‚ŅŒ ÐĩŅ‘}\n year {а Ņ‚Ð°ÐšÐķÐĩ ҃ÐŋŅ€Ð°ÐēÐŧŅŅ‚ŅŒ ÐŋÐūÐīÐŋÐļŅÐšÐūÐđ ÐļÐŧÐļ ÐūŅ‚ÐžÐĩÐ―ÐļŅ‚ŅŒ ÐĩŅ‘}\n other {Ðļ ҃ÐŋŅ€Ð°ÐēÐŧŅŅ‚ŅŒ ÐąŅƒÐīŅƒŅ‰ÐļОÐļ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļŅÐžÐļ}\n} Ðē ÐŧŅŽÐąÐūÐĩ ÐēŅ€ÐĩÐžŅ ÐŋÐū ŅŅ‚ÐūÐđ ҁҁҋÐŧКÐĩ:\n\n{manageUrl}\n\nÐĒÐēÐūŅ ÐŋÐūÐīÐīÐĩŅ€ÐķКа ÐŋÐūОÐūÐģаÐĩŅ‚ {product_name} Ņ€Ð°ÐąÐūŅ‚Ð°Ņ‚ŅŒ. ÐĄÐŋÐ°ŅÐļÐąÐū!\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"donation_magic_link": {
"subject": "ÐĢÐŋŅ€Ð°ÐēÐŧŅÐđ ҁÐēÐūÐļОÐļ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļŅÐžÐļ ÐīÐŧŅ {product_name}",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚,\n\nПÐĩŅ€ÐĩÐđÐīÐļ ÐŋÐū ҁҁҋÐŧКÐĩ Ð―ÐļÐķÐĩ, ҇҂ÐūÐąŅ‹ ÐŋÐūÐŧŅƒŅ‡ÐļŅ‚ŅŒ ÐīÐūŅŅ‚ŅƒÐŋ К ÐŋÐūŅ€Ņ‚Ð°Ðŧ҃ ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐđ:\n\n{manageUrl}\n\nНа ÐŋÐūŅ€Ņ‚Ð°ÐŧÐĩ ҂ҋ ОÐūÐķÐĩ҈Ҍ ҃ÐŋŅ€Ð°ÐēÐŧŅŅ‚ŅŒ ÐŋÐūÐīÐŋÐļŅÐšÐ°ÐžÐļ, ŅÐšÐ°Ņ‡ÐļÐēÐ°Ņ‚ŅŒ КÐēÐļŅ‚Ð°Ð―Ņ†ÐļÐļ Ðļ ÐŋŅ€ÐūŅÐžÐ°Ņ‚Ņ€ÐļÐēÐ°Ņ‚ŅŒ Ðļҁ҂ÐūŅ€ÐļŅŽ ҁÐēÐūÐļŅ… ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐđ.\n\nÐ­Ņ‚Ð° ҁҁҋÐŧКа Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ņƒ ҁҁҋÐŧÐšŅƒ, ОÐūÐķÐĩ҈Ҍ ŅÐžÐĩÐŧÐū ÐŋŅ€ÐūÐļÐģÐ―ÐūŅ€ÐļŅ€ÐūÐēÐ°Ņ‚ŅŒ ŅŅ‚Ðū ÐŋÐļŅŅŒÐžÐū.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚,\n\nПÐĩŅ€ÐĩÐđÐīÐļ ÐŋÐū ҁҁҋÐŧКÐĩ Ð―ÐļÐķÐĩ, ҇҂ÐūÐąŅ‹ ÐūŅ‚ÐšŅ€Ņ‹Ņ‚ŅŒ ÐŧÐļŅ‡Ð―Ņ‹Ðđ ÐšÐ°ÐąÐļÐ―ÐĩŅ‚ ÐķÐĩҀ҂ÐēÐūÐēÐ°Ņ‚ÐĩÐŧŅ:\n\n{manageUrl}\n\nВ ÐŧÐļŅ‡Ð―ÐūО ÐšÐ°ÐąÐļÐ―ÐĩŅ‚Ðĩ ҂ҋ ОÐūÐķÐĩ҈Ҍ ҃ÐŋŅ€Ð°ÐēÐŧŅŅ‚ŅŒ ÐŋÐūÐīÐŋÐļŅÐšÐ°ÐžÐļ, ŅÐšÐ°Ņ‡ÐļÐēÐ°Ņ‚ŅŒ ҁ҇ÐĩŅ‚Ð° Ðļ ÐŋŅ€ÐūŅÐžÐ°Ņ‚Ņ€ÐļÐēÐ°Ņ‚ŅŒ Ðļҁ҂ÐūŅ€ÐļŅŽ ҁÐēÐūÐļŅ… ÐŋÐūÐķÐĩҀ҂ÐēÐūÐēÐ°Ð―ÐļÐđ.\n\nÐĄŅ€ÐūК ÐīÐĩÐđҁ҂ÐēÐļŅ ҁҁҋÐŧКÐļ Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ņƒ ҁҁҋÐŧÐšŅƒ, ОÐūÐķÐĩ҈Ҍ ŅÐžÐĩÐŧÐū ÐŋŅ€ÐūÐļÐģÐ―ÐūŅ€ÐļŅ€ÐūÐēÐ°Ņ‚ŅŒ ŅŅ‚Ðū ÐŋÐļŅŅŒÐžÐū.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"dsa_report_verification": {
"subject": "ПÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļ ҁÐēÐūÐđ аÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ ÐīÐŧŅ ÐūŅ‚Ņ‡Ņ‘Ņ‚Ð° DSA",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚,\n\nÐ˜ŅÐŋÐūÐŧŅŒÐ·ŅƒÐđ КÐūÐī ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐķÐīÐĩÐ―ÐļŅ Ð―ÐļÐķÐĩ, ҇҂ÐūÐąŅ‹ ÐūŅ‚ÐŋŅ€Ð°ÐēÐļŅ‚ŅŒ ҁÐēÐūÐđ Ðū҂҇ґ҂ DSA ÐŋÐū {product_name}:\n\n{code}\n\nÐ­Ņ‚ÐūŅ‚ КÐūÐī Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ОÐūÐķÐĩ҈Ҍ ŅÐžÐĩÐŧÐū ÐŋŅ€ÐūÐļÐģÐ―ÐūŅ€ÐļŅ€ÐūÐēÐ°Ņ‚ŅŒ ŅŅ‚Ðū ÐŋÐļŅŅŒÐžÐū.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
"subject": "ПÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļ ҁÐēÐūÐđ аÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ ÐīÐŧŅ ÐķаÐŧÐūÐąŅ‹ ÐŋÐū DSA",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚,\n\nÐ˜ŅÐŋÐūÐŧŅŒÐ·ŅƒÐđ КÐūÐī ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐķÐīÐĩÐ―ÐļŅ Ð―ÐļÐķÐĩ, ҇҂ÐūÐąŅ‹ ÐūŅ‚ÐŋŅ€Ð°ÐēÐļŅ‚ŅŒ Ðē {product_name} ÐķаÐŧÐūÐąŅƒ ÐŋÐū ЗаКÐūÐ―Ņƒ Ðū ҆Ðļ҄ҀÐūÐēҋ҅ ҃ҁÐŧ҃ÐģÐ°Ņ… (DSA):\n\n{code}\n\nÐĄŅ€ÐūК ÐīÐĩÐđҁ҂ÐēÐļŅ КÐūÐīа Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ОÐūÐķÐĩ҈Ҍ ŅÐžÐĩÐŧÐū ÐŋŅ€ÐūÐļÐģÐ―ÐūŅ€ÐļŅ€ÐūÐēÐ°Ņ‚ŅŒ ŅŅ‚Ðū ÐŋÐļŅŅŒÐžÐū.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
},
"email_change_new": {
"subject": "ПÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļ Ð―ÐūÐēŅ‹Ðđ аÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ ÐīÐŧŅ {product_name}",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nВÐēÐĩÐīÐļ ŅŅ‚ÐūŅ‚ КÐūÐī Ðē ÐŋŅ€ÐļÐŧÐūÐķÐĩÐ―ÐļÐļ, ҇҂ÐūÐąŅ‹ ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļŅ‚ŅŒ ҁÐēÐūÐđ Ð―ÐūÐēŅ‹Ðđ аÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ Ðē {product_name}:\n\n{code}\n\nÐ­Ņ‚ÐūŅ‚ КÐūÐī Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ОÐūÐķÐĩ҈Ҍ ŅÐžÐĩÐŧÐū ÐŋŅ€ÐūÐļÐģÐ―ÐūŅ€ÐļŅ€ÐūÐēÐ°Ņ‚ŅŒ ŅŅ‚Ðū ÐŋÐļŅŅŒÐžÐū.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nВÐēÐĩÐīÐļ ŅŅ‚ÐūŅ‚ КÐūÐī Ðē ÐŋŅ€ÐļÐŧÐūÐķÐĩÐ―ÐļÐļ, ҇҂ÐūÐąŅ‹ ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļŅ‚ŅŒ ҁÐēÐūÐđ Ð―ÐūÐēŅ‹Ðđ аÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ Ðē {product_name}:\n\n{code}\n\nÐĄŅ€ÐūК ÐīÐĩÐđҁ҂ÐēÐļŅ КÐūÐīа Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ОÐūÐķÐĩ҈Ҍ ŅÐžÐĩÐŧÐū ÐŋŅ€ÐūÐļÐģÐ―ÐūŅ€ÐļŅ€ÐūÐēÐ°Ņ‚ŅŒ ŅŅ‚Ðū ÐŋÐļŅŅŒÐžÐū.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"email_change_original": {
"subject": "ПÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļ ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ аÐīŅ€ÐĩŅÐ° ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ ÐīÐŧŅ {product_name}",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐœŅ‹ ÐŋÐūÐŧŅƒŅ‡ÐļÐŧÐļ заÐŋŅ€Ðūҁ Ð―Ð° ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ аÐīŅ€ÐĩŅÐ° ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}.\n\nÐ§Ņ‚ÐūÐąŅ‹ ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļŅ‚ŅŒ ŅŅ‚Ðū ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ, ÐēÐēÐĩÐīÐļ ŅŅ‚ÐūŅ‚ КÐūÐī Ðē ÐŋŅ€ÐļÐŧÐūÐķÐĩÐ―ÐļÐļ:\n\n{code}\n\nÐ­Ņ‚ÐūŅ‚ КÐūÐī Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ÐŋÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, ҁҀÐūŅ‡Ð―Ðū Ð·Ð°Ņ‰ÐļŅ‚Ðļ ҁÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐœŅ‹ ÐŋÐūÐŧŅƒŅ‡ÐļÐŧÐļ заÐŋŅ€Ðūҁ Ð―Ð° ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ аÐīŅ€ÐĩŅÐ° ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}.\n\nÐ§Ņ‚ÐūÐąŅ‹ ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļŅ‚ŅŒ ŅŅ‚Ðū ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ, ÐēÐēÐĩÐīÐļ ŅŅ‚ÐūŅ‚ КÐūÐī Ðē ÐŋŅ€ÐļÐŧÐūÐķÐĩÐ―ÐļÐļ:\n\n{code}\n\nÐĄŅ€ÐūК ÐīÐĩÐđҁ҂ÐēÐļŅ КÐūÐīа Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ÐŋÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, ҁҀÐūŅ‡Ð―Ðū Ð·Ð°Ņ‰ÐļŅ‚Ðļ ҁÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"email_change_revert": {
"subject": "АÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name} ÐąŅ‹Ðŧ ÐļзОÐĩÐ―Ņ‘Ð―",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nАÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name} ÐąŅ‹Ðŧ ÐļзОÐĩÐ―Ņ‘Ð― Ð―Ð° {newEmail}.\n\nÐ•ŅÐŧÐļ ҂ҋ ҁÐīÐĩÐŧаÐŧ ŅŅ‚Ðū ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ, Ð―ÐļКаКÐļŅ… ÐīÐĩÐđҁ҂ÐēÐļÐđ Ð―Ðĩ ҂ҀÐĩÐąŅƒÐĩŅ‚ŅŅ. Ð•ŅÐŧÐļ Ð―ÐĩŅ‚, ҂ҋ ОÐūÐķÐĩ҈Ҍ ÐūŅ‚ÐžÐĩÐ―ÐļŅ‚ŅŒ ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ Ðļ Ð·Ð°Ņ‰ÐļŅ‚ÐļŅ‚ŅŒ ҁÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ ÐŋÐū ŅŅ‚ÐūÐđ ҁҁҋÐŧКÐĩ:\n\n{revertUrl}\n\nÐ­Ņ‚Ðū ÐēÐūŅŅŅ‚Ð°Ð―ÐūÐēÐļŅ‚ Ņ‚ÐēÐūÐđ ÐŋŅ€ÐĩÐīŅ‹ÐīŅƒŅ‰ÐļÐđ аÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ, ÐēŅ‹ÐđÐīÐĩŅ‚ Ðļз ÐēҁÐĩŅ… Ņ‚ÐēÐūÐļŅ… ҁÐĩҁҁÐļÐđ, ҃ÐīаÐŧÐļŅ‚ ÐŋŅ€ÐļÐēŅÐ·Ð°Ð―Ð―Ņ‹Ðĩ Ð―ÐūОÐĩŅ€Ð° Ņ‚ÐĩÐŧÐĩŅ„ÐūÐ―ÐūÐē, ÐūŅ‚ÐšÐŧŅŽŅ‡ÐļŅ‚ MFA Ðļ ÐŋÐū҂ҀÐĩÐąŅƒÐĩŅ‚ ŅƒŅŅ‚Ð°Ð―ÐūÐēКÐļ Ð―ÐūÐēÐūÐģÐū ÐŋÐ°Ņ€ÐūÐŧŅ.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nАÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name} ÐąŅ‹Ðŧ ÐļзОÐĩÐ―Ņ‘Ð― Ð―Ð° {newEmail}.\n\nÐ•ŅÐŧÐļ ŅŅ‚Ðū ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ ҁÐīÐĩÐŧаÐŧ ҂ҋ, Ð―Ðļ҇ÐĩÐģÐū ÐīÐĩÐŧÐ°Ņ‚ŅŒ Ð―Ðĩ Ð―ŅƒÐķÐ―Ðū. Ð•ŅÐŧÐļ Ð―ÐĩŅ‚, ҂ҋ ОÐūÐķÐĩ҈Ҍ ÐūŅ‚ÐžÐĩÐ―ÐļŅ‚ŅŒ ÐĩÐģÐū Ðļ Ð·Ð°Ņ‰ÐļŅ‚ÐļŅ‚ŅŒ ҁÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ ÐŋÐū ŅŅ‚ÐūÐđ ҁҁҋÐŧКÐĩ:\n\n{revertUrl}\n\nÐ­Ņ‚Ðū ÐēÐūŅŅŅ‚Ð°Ð―ÐūÐēÐļŅ‚ Ņ‚ÐēÐūÐđ ÐŋŅ€ÐĩÐīŅ‹ÐīŅƒŅ‰ÐļÐđ аÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ, заÐēÐĩŅ€ŅˆÐļŅ‚ ÐēҁÐĩ Ð°ÐšŅ‚ÐļÐēÐ―Ņ‹Ðĩ ҁÐĩҁҁÐļÐļ, ҃ÐīаÐŧÐļŅ‚ ÐŋŅ€ÐļÐēŅÐ·Ð°Ð―Ð―Ņ‹Ðĩ Ð―ÐūОÐĩŅ€Ð° Ņ‚ÐĩÐŧÐĩŅ„ÐūÐ―ÐūÐē, ÐūŅ‚ÐšÐŧŅŽŅ‡ÐļŅ‚ MFA Ðļ ÐŋÐū҂ҀÐĩÐąŅƒÐĩŅ‚ заÐīÐ°Ņ‚ŅŒ Ð―ÐūÐēŅ‹Ðđ ÐŋÐ°Ņ€ÐūÐŧҌ.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
},
"email_verification": {
"subject": "ПÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļ аÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ ÐīÐŧŅ {product_name}",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nПÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļ аÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ ҁÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}, Ð―Ð°ÐķаÐē Ð―Ð° ҁҁҋÐŧÐšŅƒ Ð―ÐļÐķÐĩ:\n\n{verifyUrl}\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ ҁÐūзÐīаÐēаÐŧ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ {product_name}, ОÐūÐķÐĩ҈Ҍ ÐŋŅ€ÐūÐļÐģÐ―ÐūŅ€ÐļŅ€ÐūÐēÐ°Ņ‚ŅŒ ŅŅ‚Ðū ÐŋÐļŅŅŒÐžÐū.\n\nÐ­Ņ‚Ð° ҁҁҋÐŧКа ÐīÐĩÐđҁ҂ÐēÐļŅ‚ÐĩÐŧŅŒÐ―Ð° Ðē Ņ‚Ðĩ҇ÐĩÐ―ÐļÐĩ 24 Ņ‡Ð°ŅÐūÐē.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nПÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļ аÐīŅ€Ðĩҁ ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ ҁÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}, Ð―Ð°ÐķаÐē Ð―Ð° ҁҁҋÐŧÐšŅƒ Ð―ÐļÐķÐĩ:\n\n{verifyUrl}\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ ҁÐūзÐīаÐēаÐŧ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ {product_name}, ОÐūÐķÐĩ҈Ҍ ŅÐžÐĩÐŧÐū ÐŋŅ€ÐūÐļÐģÐ―ÐūŅ€ÐļŅ€ÐūÐēÐ°Ņ‚ŅŒ ŅŅ‚Ðū ÐŋÐļŅŅŒÐžÐū.\n\nÐ­Ņ‚Ð° ҁҁҋÐŧКа ÐīÐĩÐđҁ҂ÐēÐļŅ‚ÐĩÐŧŅŒÐ―Ð° Ðē Ņ‚Ðĩ҇ÐĩÐ―ÐļÐĩ 24 Ņ‡Ð°ŅÐūÐē.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"gift_chargeback_notification": {
"subject": "ÐŸŅ€ÐļÐēÐļÐŧÐĩÐģÐļÐļ за Ð°ÐšŅ‚ÐļÐēÐļŅ€ÐūÐēÐ°Ð―Ð―Ņ‹Ðđ ÐŋÐūÐīÐ°Ņ€ÐūК ÐąŅ‹ÐŧÐļ ҃ÐīаÐŧÐĩÐ―Ņ‹",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nПÐūÐīÐ°Ņ€ÐūŅ‡Ð―Ņ‹Ðđ КÐūÐī, КÐūŅ‚ÐūҀҋÐđ ҂ҋ Ð°ÐšŅ‚ÐļÐēÐļŅ€ÐūÐēаÐŧ, ÐļÐ·Ð―Ð°Ņ‡Ð°ÐŧŅŒÐ―Ðū ÐąŅ‹Ðŧ ÐūÐŋÐŧÐ°Ņ‡ÐĩÐ― ÐīŅ€ŅƒÐģÐļО ҇ÐĩÐŧÐūÐēÐĩКÐūО. Ð­Ņ‚ÐūŅ‚ ÐŋÐŧÐ°Ņ‚Ņ‘Ðķ ÐąŅ‹Ðŧ ÐūŅ‚ÐžÐĩÐ―Ņ‘Ð― (ÐēÐūзÐēŅ€Ð°Ņ‚Ð―Ņ‹Ðđ ÐŋÐŧÐ°Ņ‚Ņ‘Ðķ).\n\nИз-за ŅŅ‚ÐūÐģÐū ÐžŅ‹ ҃ÐīаÐŧÐļÐŧÐļ ÐąÐūÐ―ŅƒŅŅ‹, КÐūŅ‚ÐūҀҋÐĩ ÐąŅ‹ÐŧÐļ ÐīÐūÐąÐ°ÐēÐŧÐĩÐ―Ņ‹ Ðē Ņ‚ÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ ÐŋŅ€Ðļ Ð°ÐšŅ‚ÐļÐēÐ°Ņ†ÐļÐļ ÐŋÐūÐīÐ°Ņ€ÐšÐ°.\n\nÐ•ŅÐŧÐļ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ, ҇҂Ðū ŅŅ‚Ðū Ðū҈ÐļÐąÐšÐ°, ÐŋÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, ҁÐēŅÐķÐļҁҌ ҁ Ð―Ð°ŅˆÐĩÐđ ҁÐŧ҃ÐķÐąÐūÐđ ÐŋÐūÐīÐīÐĩŅ€ÐķКÐļ Ðļ ŅƒÐšÐ°ÐķÐļ ÐēҁÐĩ ÐļОÐĩŅŽŅ‰ÐļÐĩŅŅ ÐīÐĩŅ‚Ð°ÐŧÐļ Ðū ÐŋÐūÐīÐ°Ņ€ÐūŅ‡Ð―ÐūО КÐūÐīÐĩ Ðļ ÐīÐ°Ņ‚Ðĩ ÐĩÐģÐū Ð°ÐšŅ‚ÐļÐēÐ°Ņ†ÐļÐļ.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nПÐūÐīÐ°Ņ€ÐūŅ‡Ð―Ņ‹Ðđ КÐūÐī, КÐūŅ‚ÐūҀҋÐđ ҂ҋ Ð°ÐšŅ‚ÐļÐēÐļŅ€ÐūÐēаÐŧ, ÐļÐ·Ð―Ð°Ņ‡Ð°ÐŧŅŒÐ―Ðū ÐąŅ‹Ðŧ ÐūÐŋÐŧÐ°Ņ‡ÐĩÐ― ÐīŅ€ŅƒÐģÐļО ҇ÐĩÐŧÐūÐēÐĩКÐūО. Ð­Ņ‚ÐūŅ‚ ÐŋÐŧÐ°Ņ‚Ņ‘Ðķ ÐąŅ‹Ðŧ ÐēÐŋÐūҁÐŧÐĩÐīҁ҂ÐēÐļÐļ ÐūŅ‚ÐžÐĩÐ―Ņ‘Ð― (ÐēÐūзÐēŅ€Ð°Ņ‚Ð―Ņ‹Ðđ ÐŋÐŧÐ°Ņ‚Ņ‘Ðķ).\n\nИз-за ŅŅ‚ÐūÐģÐū ÐžŅ‹ ҃ÐīаÐŧÐļÐŧÐļ ÐŋŅ€ÐļÐēÐļÐŧÐĩÐģÐļÐļ, КÐūŅ‚ÐūҀҋÐĩ ÐąŅ‹ÐŧÐļ ÐīÐūÐąÐ°ÐēÐŧÐĩÐ―Ņ‹ Ðē Ņ‚ÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ ÐŋŅ€Ðļ Ð°ÐšŅ‚ÐļÐēÐ°Ņ†ÐļÐļ ÐŋÐūÐīÐ°Ņ€ÐšÐ°.\n\nÐ•ŅÐŧÐļ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ, ҇҂Ðū ŅŅ‚Ðū Ðū҈ÐļÐąÐšÐ°, ÐŋÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, ҁÐēŅÐķÐļҁҌ ҁ Ð―Ð°ŅˆÐĩÐđ ҁÐŧ҃ÐķÐąÐūÐđ ÐŋÐūÐīÐīÐĩŅ€ÐķКÐļ Ðļ ŅƒÐšÐ°ÐķÐļ ÐēҁÐĩ ÐļОÐĩŅŽŅ‰ÐļÐĩŅŅ ÐīÐĩŅ‚Ð°ÐŧÐļ Ðū ÐŋÐūÐīÐ°Ņ€ÐūŅ‡Ð―ÐūО КÐūÐīÐĩ Ðļ ÐīÐ°Ņ‚Ðĩ ÐĩÐģÐū Ð°ÐšŅ‚ÐļÐēÐ°Ņ†ÐļÐļ.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"harvest_completed": {
"subject": "ÐĒÐēÐūÐđ ŅÐšŅÐŋÐūҀ҂ ÐīÐ°Ð―Ð―Ņ‹Ņ… Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name} ÐģÐūŅ‚ÐūÐē К ŅÐšÐ°Ņ‡ÐļÐēÐ°Ð―ÐļŅŽ",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĒÐēÐūÐđ ŅÐšŅÐŋÐūҀ҂ ÐīÐ°Ð―Ð―Ņ‹Ņ… ÐģÐūŅ‚ÐūÐē.\n\nÐĄŅŅ‹ÐŧКа ÐīÐŧŅ ŅÐšÐ°Ņ‡ÐļÐēÐ°Ð―ÐļŅ:\n{downloadUrl}\n\nÐĄÐūÐūÐąŅ‰ÐĩÐ―ÐļÐđ ÐēКÐŧŅŽŅ‡ÐĩÐ―Ðū: {totalMessages, number}\nРазОÐĩŅ€ Ņ„Ð°ÐđÐŧа: {fileSizeMB, number} МБ\n\nÐ­Ņ‚Ð° ҁҁҋÐŧКа Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚ÐūŅ‚ ŅÐšŅÐŋÐūҀ҂, ÐŋÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, Ð―ÐĩОÐĩÐīÐŧÐĩÐ―Ð―Ðū ŅÐžÐĩÐ―Ðļ ÐŋÐ°Ņ€ÐūÐŧҌ Ðļ ҁÐēŅÐķÐļҁҌ ҁ Ð―Ð°ŅˆÐĩÐđ ҁÐŧ҃ÐķÐąÐūÐđ ÐŋÐūÐīÐīÐĩŅ€ÐķКÐļ.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
"subject": "ÐĒÐēÐūÐđ ŅÐšŅÐŋÐūҀ҂ ÐīÐ°Ð―Ð―Ņ‹Ņ… {product_name} ÐģÐūŅ‚ÐūÐē К ŅÐšÐ°Ņ‡ÐļÐēÐ°Ð―ÐļŅŽ",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĒÐēÐūÐđ ŅÐšŅÐŋÐūҀ҂ ÐīÐ°Ð―Ð―Ņ‹Ņ… ÐģÐūŅ‚ÐūÐē.\n\nÐĄŅŅ‹ÐŧКа ÐīÐŧŅ ŅÐšÐ°Ņ‡ÐļÐēÐ°Ð―ÐļŅ:\n{downloadUrl}\n\nВКÐŧŅŽŅ‡ÐĩÐ―Ðū ҁÐūÐūÐąŅ‰ÐĩÐ―ÐļÐđ: {totalMessages, number}\nРазОÐĩŅ€ Ņ„Ð°ÐđÐŧа: {fileSizeMB, number} МБ\n\nÐĄŅ€ÐūК ÐīÐĩÐđҁ҂ÐēÐļŅ ҁҁҋÐŧКÐļ Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚ÐūŅ‚ ŅÐšŅÐŋÐūҀ҂, ÐŋÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, Ð―ÐĩОÐĩÐīÐŧÐĩÐ―Ð―Ðū ŅÐžÐĩÐ―Ðļ ÐŋÐ°Ņ€ÐūÐŧҌ Ðļ ҁÐēŅÐķÐļҁҌ ҁ Ð―Ð°ŅˆÐĩÐđ ҁÐŧ҃ÐķÐąÐūÐđ ÐŋÐūÐīÐīÐĩŅ€ÐķКÐļ.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"inactivity_warning": {
"subject": "ÐĒÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ {product_name} ÐąŅƒÐīÐĩŅ‚ ҃ÐīаÐŧŅ‘Ð― Ðļз-за Ð―ÐĩÐ°ÐšŅ‚ÐļÐēÐ―Ðūҁ҂Ðļ",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐœŅ‹ Ð―Ðĩ ÐēÐļÐīÐĩÐŧÐļ Ð―ÐļКаКÐūÐđ Ð°ÐšŅ‚ÐļÐēÐ―Ðūҁ҂Ðļ Ðē Ņ‚ÐēÐūŅ‘Ðž Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ðĩ {product_name} ÐŋÐūҁÐŧÐĩ {lastActiveDate, date, full}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ ÐēÐūÐđÐīŅ‘ŅˆŅŒ Ðē ҁÐļҁ҂ÐĩÐžŅƒ ÐīÐū {deletionDate, date, full} Ðē {deletionDate, time, short}, Ņ‚ÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ ÐąŅƒÐīÐĩŅ‚ ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―Ðū ҃ÐīаÐŧŅ‘Ð― Ðļз-за Ð―ÐĩÐ°ÐšŅ‚ÐļÐēÐ―Ðūҁ҂Ðļ.\n\nВÐūÐđÐīÐļ зÐīÐĩҁҌ:\n{loginUrl}\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―ÐĩÐīаÐēÐ―Ðū ÐŋÐūÐŧŅŒÐ·ÐūÐēаÐŧŅŅ {product_name}, ÐŋÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, Ð―ÐĩОÐĩÐīÐŧÐĩÐ―Ð―Ðū ҁÐēŅÐķÐļҁҌ ҁ Ð―Ð°ŅˆÐĩÐđ ҁÐŧ҃ÐķÐąÐūÐđ ÐŋÐūÐīÐīÐĩŅ€ÐķКÐļ.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐœŅ‹ Ð―Ðĩ заОÐĩŅ‡Ð°ÐŧÐļ Ð°ÐšŅ‚ÐļÐēÐ―Ðūҁ҂Ðļ Ðē Ņ‚ÐēÐūŅ‘Ðž Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ðĩ {product_name} ҁ {lastActiveDate, date, full}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ ÐēÐūÐđÐīŅ‘ŅˆŅŒ Ðē Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ ÐīÐū {deletionDate, date, full} Ðē {deletionDate, time, short}, Ņ‚ÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ ÐąŅƒÐīÐĩŅ‚ ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―Ðū ҃ÐīаÐŧŅ‘Ð― Ðļз-за Ð―ÐĩÐ°ÐšŅ‚ÐļÐēÐ―Ðūҁ҂Ðļ.\n\nВÐūÐđŅ‚Ðļ ОÐūÐķÐ―Ðū зÐīÐĩҁҌ:\n{loginUrl}\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―ÐĩÐīаÐēÐ―Ðū ÐŋÐūÐŧŅŒÐ·ÐūÐēаÐŧŅŅ {product_name}, ÐŋÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, Ð―ÐĩОÐĩÐīÐŧÐĩÐ―Ð―Ðū ҁÐēŅÐķÐļҁҌ ҁ Ð―Ð°ŅˆÐĩÐđ ҁÐŧ҃ÐķÐąÐūÐđ ÐŋÐūÐīÐīÐĩŅ€ÐķКÐļ.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"ip_authorization": {
"subject": "ПÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļ ÐēŅ…ÐūÐī ҁ Ð―ÐūÐēÐūÐģÐū IP-аÐīŅ€ÐĩŅÐ°",
@@ -61,35 +61,35 @@ const EMAIL_I18N_RU_MESSAGES = defineEmailI18nLocaleMessages({
},
"mfa_backup_codes_view": {
"subject": "ПÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļ ÐīÐūŅŅ‚ŅƒÐŋ К Ņ€ÐĩзÐĩŅ€ÐēÐ―Ņ‹Ðž КÐūÐīаО {product_name}",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐœŅ‹ ÐŋÐūÐŧŅƒŅ‡ÐļÐŧÐļ заÐŋŅ€Ðūҁ Ð―Ð° ÐŋŅ€ÐūŅÐžÐū҂Ҁ Ņ€ÐĩзÐĩŅ€ÐēÐ―Ņ‹Ņ… КÐūÐīÐūÐē Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}.\n\nÐ§Ņ‚ÐūÐąŅ‹ ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļŅ‚ŅŒ ŅŅ‚ÐūŅ‚ заÐŋŅ€Ðūҁ, ÐēÐēÐĩÐīÐļ ŅŅ‚ÐūŅ‚ КÐūÐī Ðē ÐŋŅ€ÐļÐŧÐūÐķÐĩÐ―ÐļÐļ:\n\n{code}\n\nÐ­Ņ‚ÐūŅ‚ КÐūÐī Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ÐēÐūзОÐūÐķÐ―Ðū, ÐšŅ‚Ðū-Ņ‚Ðū ÐŋÐūÐŧŅƒŅ‡ÐļÐŧ ÐīÐūŅŅ‚ŅƒÐŋ К Ņ‚ÐēÐūÐĩÐžŅƒ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ņƒ. НÐĩОÐĩÐīÐŧÐĩÐ―Ð―Ðū ŅÐžÐĩÐ―Ðļ ÐŋÐ°Ņ€ÐūÐŧҌ.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐœŅ‹ ÐŋÐūÐŧŅƒŅ‡ÐļÐŧÐļ заÐŋŅ€Ðūҁ Ð―Ð° ÐŋŅ€ÐūŅÐžÐū҂Ҁ Ņ€ÐĩзÐĩŅ€ÐēÐ―Ņ‹Ņ… КÐūÐīÐūÐē Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}.\n\nÐ§Ņ‚ÐūÐąŅ‹ ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļŅ‚ŅŒ ŅŅ‚ÐūŅ‚ заÐŋŅ€Ðūҁ, ÐēÐēÐĩÐīÐļ ŅŅ‚ÐūŅ‚ КÐūÐī Ðē ÐŋŅ€ÐļÐŧÐūÐķÐĩÐ―ÐļÐļ:\n\n{code}\n\nÐĄŅ€ÐūК ÐīÐĩÐđҁ҂ÐēÐļŅ КÐūÐīа Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt, date, full} Ðē {expiresAt, time, short}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ÐēÐūзОÐūÐķÐ―Ðū, ÐšŅ‚Ðū-Ņ‚Ðū ÐŋÐūÐŧŅƒŅ‡ÐļÐŧ ÐīÐūŅŅ‚ŅƒÐŋ К Ņ‚ÐēÐūÐĩÐžŅƒ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ņƒ. НÐĩОÐĩÐīÐŧÐĩÐ―Ð―Ðū ŅÐžÐĩÐ―Ðļ ÐŋÐ°Ņ€ÐūÐŧҌ.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"password_change_verification": {
"subject": "ПÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļ ŅÐžÐĩÐ―Ņƒ ÐŋÐ°Ņ€ÐūÐŧŅ ÐīÐŧŅ {product_name}",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐœŅ‹ ÐŋÐūÐŧŅƒŅ‡ÐļÐŧÐļ заÐŋŅ€Ðūҁ Ð―Ð° ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ ÐŋÐ°Ņ€ÐūÐŧŅ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}.\n\nÐ§Ņ‚ÐūÐąŅ‹ ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļŅ‚ŅŒ ŅŅ‚Ðū ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ, ÐēÐēÐĩÐīÐļ ŅŅ‚ÐūŅ‚ КÐūÐī Ðē ÐŋŅ€ÐļÐŧÐūÐķÐĩÐ―ÐļÐļ:\n\n{code}\n\nÐ­Ņ‚ÐūŅ‚ КÐūÐī Ðļҁ҂ÐĩКаÐĩŅ‚ Ðē {expiresAt}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ÐēÐūзОÐūÐķÐ―Ðū, ÐšŅ‚Ðū-Ņ‚Ðū ÐŋÐūÐŧŅƒŅ‡ÐļÐŧ ÐīÐūŅŅ‚ŅƒÐŋ К Ņ‚ÐēÐūÐĩÐžŅƒ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ņƒ. НÐĩОÐĩÐīÐŧÐĩÐ―Ð―Ðū ŅÐžÐĩÐ―Ðļ ÐŋÐ°Ņ€ÐūÐŧҌ Ðļ ÐēКÐŧŅŽŅ‡Ðļ ÐīÐēŅƒŅ…Ņ„Ð°ÐšŅ‚ÐūŅ€Ð―ŅƒŅŽ Ð°ŅƒŅ‚ÐĩÐ―Ņ‚ÐļŅ„ÐļÐšÐ°Ņ†ÐļŅŽ.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐœŅ‹ ÐŋÐūÐŧŅƒŅ‡ÐļÐŧÐļ заÐŋŅ€Ðūҁ Ð―Ð° ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ ÐŋÐ°Ņ€ÐūÐŧŅ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}.\n\nÐ§Ņ‚ÐūÐąŅ‹ ÐŋÐūÐīŅ‚ÐēÐĩŅ€ÐīÐļŅ‚ŅŒ ŅŅ‚Ðū ÐļзОÐĩÐ―ÐĩÐ―ÐļÐĩ, ÐēÐēÐĩÐīÐļ ŅŅ‚ÐūŅ‚ КÐūÐī Ðē ÐŋŅ€ÐļÐŧÐūÐķÐĩÐ―ÐļÐļ:\n\n{code}\n\nÐĄŅ€ÐūК ÐīÐĩÐđҁ҂ÐēÐļŅ КÐūÐīа Ðļҁ҂ÐĩКаÐĩŅ‚ {expiresAt}.\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ÐēÐūзОÐūÐķÐ―Ðū, ÐšŅ‚Ðū-Ņ‚Ðū ÐŋÐūÐŧŅƒŅ‡ÐļÐŧ ÐīÐūŅŅ‚ŅƒÐŋ К Ņ‚ÐēÐūÐĩÐžŅƒ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ņƒ. НÐĩОÐĩÐīÐŧÐĩÐ―Ð―Ðū ŅÐžÐĩÐ―Ðļ ÐŋÐ°Ņ€ÐūÐŧҌ Ðļ ÐēКÐŧŅŽŅ‡Ðļ ÐīÐēŅƒŅ…Ņ„Ð°ÐšŅ‚ÐūŅ€Ð―ŅƒŅŽ Ð°ŅƒŅ‚ÐĩÐ―Ņ‚ÐļŅ„ÐļÐšÐ°Ņ†ÐļŅŽ.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"password_reset": {
"subject": "ÐĄÐąŅ€ÐūҁҌ ҁÐēÐūÐđ ÐŋÐ°Ņ€ÐūÐŧҌ ÐīÐŧŅ {product_name}",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĒŅ‹ заÐŋŅ€ÐūҁÐļÐŧ ŅÐąŅ€Ðūҁ ÐŋÐ°Ņ€ÐūÐŧŅ Ðē {product_name}. Ð˜ŅÐŋÐūÐŧŅŒÐ·ŅƒÐđ ҁҁҋÐŧÐšŅƒ Ð―ÐļÐķÐĩ, ҇҂ÐūÐąŅ‹ ŅƒŅŅ‚Ð°Ð―ÐūÐēÐļŅ‚ŅŒ Ð―ÐūÐēŅ‹Ðđ ÐŋÐ°Ņ€ÐūÐŧҌ:\n\n{resetUrl}\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ОÐūÐķÐĩ҈Ҍ ŅÐžÐĩÐŧÐū ÐŋŅ€ÐūÐļÐģÐ―ÐūŅ€ÐļŅ€ÐūÐēÐ°Ņ‚ŅŒ ŅŅ‚Ðū ÐŋÐļŅŅŒÐžÐū.\n\nÐ­Ņ‚Ð° ҁҁҋÐŧКа ÐīÐĩÐđҁ҂ÐēÐļŅ‚ÐĩÐŧŅŒÐ―Ð° Ðē Ņ‚Ðĩ҇ÐĩÐ―ÐļÐĩ 1 Ņ‡Ð°ŅÐ°.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"registration_approved": {
"subject": "ÐĒÐēÐūŅ Ņ€ÐĩÐģÐļŅŅ‚Ņ€Ð°Ņ†ÐļŅ Ð―Ð° {product_name} ÐūÐīÐūÐąŅ€ÐĩÐ―Ð°",
"subject": "ÐĒÐēÐūŅ Ņ€ÐĩÐģÐļŅŅ‚Ņ€Ð°Ņ†ÐļŅ Ðē {product_name} ÐūÐīÐūÐąŅ€ÐĩÐ―Ð°",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĨÐūŅ€Ðū҈ÐļÐĩ Ð―ÐūÐēÐūҁ҂Ðļ: Ņ‚ÐēÐūŅ Ņ€ÐĩÐģÐļŅŅ‚Ņ€Ð°Ņ†ÐļŅ Ðē {product_name} ÐūÐīÐūÐąŅ€ÐĩÐ―Ð°.\n\nÐĒÐĩÐŋÐĩŅ€ŅŒ ҂ҋ ОÐūÐķÐĩ҈Ҍ ÐēÐūÐđŅ‚Ðļ Ðē ÐŋŅ€ÐļÐŧÐūÐķÐĩÐ―ÐļÐĩ {product_name} зÐīÐĩҁҌ:\n{channelsUrl}\n\nДÐūÐąŅ€Ðū ÐŋÐūÐķаÐŧÐūÐēÐ°Ņ‚ŅŒ Ðē ҁÐūÐūÐąŅ‰Ðĩҁ҂ÐēÐū {product_name}.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"report_resolved": {
"subject": "ÐĒÐēÐūŅ ÐķаÐŧÐūÐąÐ° ÐŋÐū {product_name} Ņ€Ð°ŅŅÐžÐū҂ҀÐĩÐ―Ð°",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĒÐēÐūŅ ÐķаÐŧÐūÐąÐ° (ID: {reportId}) ÐąŅ‹Ðŧа Ņ€Ð°ŅŅÐžÐū҂ҀÐĩÐ―Ð° Ð―Ð°ŅˆÐĩÐđ КÐūÐžÐ°Ð―ÐīÐūÐđ ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ.{hasComment, select, yes {\n\nÐžŅ‚ÐēÐĩŅ‚ ÐūŅ‚ КÐūÐžÐ°Ð―ÐīŅ‹ ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ:\n{publicComment}} other {}}\n\nÐĄÐŋÐ°ŅÐļÐąÐū за ÐŋÐūОÐūŅ‰ŅŒ Ðē ÐūÐąÐĩҁÐŋÐĩ҇ÐĩÐ―ÐļÐļ ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name} ÐīÐŧŅ ÐēҁÐĩŅ…. ÐœŅ‹ ҁÐĩŅ€ŅŒŅ‘Ð·Ð―Ðū ÐŋÐūÐīŅ…ÐūÐīÐļО К Ņ€Ð°ŅŅÐžÐū҂ҀÐĩÐ―ÐļŅŽ ÐēҁÐĩŅ… ÐķаÐŧÐūÐą Ðļ ҆ÐĩÐ―ÐļО Ņ‚ÐēÐūÐđ ÐēКÐŧаÐī Ðē ҁÐūÐūÐąŅ‰Ðĩҁ҂ÐēÐū.\n\nÐ•ŅÐŧÐļ ҃ Ņ‚ÐĩÐąŅ ÐĩŅŅ‚ŅŒ ÐēÐūÐŋŅ€Ðūҁҋ ÐļÐŧÐļ ÐūÐŋÐ°ŅÐĩÐ―ÐļŅ ÐŋÐū ÐŋÐūÐēÐūÐī҃ ŅŅ‚ÐūÐģÐū Ņ€ÐĩÐ·ŅƒÐŧŅŒŅ‚Ð°Ņ‚Ð°, ÐŋÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, ҁÐēŅÐķÐļҁҌ ҁ {safety_email}.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
"subject": "ÐĒÐēÐūŅ ÐķаÐŧÐūÐąÐ° Ðē {product_name} Ņ€Ð°ŅŅÐžÐū҂ҀÐĩÐ―Ð°",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĒÐēÐūŅ ÐķаÐŧÐūÐąÐ° (ID: {reportId}) ÐąŅ‹Ðŧа Ņ€Ð°ŅŅÐžÐū҂ҀÐĩÐ―Ð° Ð―Ð°ŅˆÐĩÐđ КÐūÐžÐ°Ð―ÐīÐūÐđ ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ.{hasComment, select, yes {\n\nÐžŅ‚ÐēÐĩŅ‚ КÐūÐžÐ°Ð―ÐīŅ‹ ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ:\n{publicComment}} other {}}\n\nÐĄÐŋÐ°ŅÐļÐąÐū за ÐŋÐūОÐūŅ‰ŅŒ Ðē ÐūÐąÐĩҁÐŋÐĩ҇ÐĩÐ―ÐļÐļ ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name} ÐīÐŧŅ ÐēҁÐĩŅ…. ÐœŅ‹ ҁÐĩŅ€ŅŒŅ‘Ð·Ð―Ðū ÐūŅ‚Ð―ÐūҁÐļÐžŅŅ КÐū ÐēҁÐĩО ÐķаÐŧÐūÐąÐ°Ðž Ðļ ҆ÐĩÐ―ÐļО Ņ‚ÐēÐūÐđ ÐēКÐŧаÐī Ðē ҁÐūÐūÐąŅ‰Ðĩҁ҂ÐēÐū.\n\nÐ•ŅÐŧÐļ ҃ Ņ‚ÐĩÐąŅ ÐĩŅŅ‚ŅŒ ÐēÐūÐŋŅ€Ðūҁҋ ÐļÐŧÐļ ҁÐūÐžÐ―ÐĩÐ―ÐļŅ ÐŋÐū ÐŋÐūÐēÐūÐī҃ ŅŅ‚ÐūÐģÐū Ņ€ÐĩÐ·ŅƒÐŧŅŒŅ‚Ð°Ņ‚Ð°, ÐŋÐūÐķаÐŧ҃ÐđŅŅ‚Ð°, Ð―Ð°ÐŋÐļ҈Ðļ Ð―Ð° {safety_email}.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
},
"scheduled_deletion_notification": {
"subject": "ÐĒÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ {product_name} ÐąŅƒÐīÐĩŅ‚ ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―Ðū ҃ÐīаÐŧŅ‘Ð―",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĒÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ {product_name} заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð― К ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―ÐūÐžŅƒ ҃ÐīаÐŧÐĩÐ―ÐļŅŽ.\n\nЗаÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ð―ÐūÐĩ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ: {deletionDate, date, full} Ðē {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nÐ­Ņ‚Ðū ҁÐĩŅ€ŅŒŅ‘Ð·Ð―Ð°Ņ ОÐĩŅ€Ð°. Ð”Ð°Ð―Ð―Ņ‹Ðĩ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° ÐąŅƒÐīŅƒŅ‚ ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―Ðū ҃ÐīаÐŧÐĩÐ―Ņ‹ Ðē заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ð―ŅƒŅŽ ÐīÐ°Ņ‚Ņƒ.\n\nÐ•ŅÐŧÐļ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ, ҇҂Ðū ŅŅ‚Ðū Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ ÐąŅ‹ÐŧÐū Ð―ÐĩÐēÐĩŅ€Ð―Ņ‹Ðž, ҂ҋ ОÐūÐķÐĩ҈Ҍ ÐŋÐūÐīÐ°Ņ‚ŅŒ аÐŋÐĩÐŧÐŧŅŅ†ÐļŅŽ. ÐžŅ‚ÐŋŅ€Ð°ÐēҌ ÐŋÐļŅŅŒÐžÐū Ð―Ð° {appeals_email} ҁ ŅŅ‚ÐūÐģÐū аÐīŅ€ÐĩŅÐ° ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐœŅ‹ заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēаÐŧÐļ ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―ÐūÐĩ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}.\n\nЗаÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ð―ÐūÐĩ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ: {deletionDate, date, full} Ðē {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nÐ­Ņ‚Ðū ҁÐĩŅ€ŅŒŅ‘Ð·Ð―Ð°Ņ ОÐĩŅ€Ð°. Ð”Ð°Ð―Ð―Ņ‹Ðĩ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° ÐąŅƒÐīŅƒŅ‚ ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―Ðū ҃ÐīаÐŧÐĩÐ―Ņ‹ Ðē заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ð―ŅƒŅŽ ÐīÐ°Ņ‚Ņƒ.\n\nÐ•ŅÐŧÐļ ҂ҋ ҁ҇ÐļŅ‚Ð°Ðĩ҈Ҍ, ҇҂Ðū ŅŅ‚Ðū Ņ€Ðĩ҈ÐĩÐ―ÐļÐĩ ÐąŅ‹ÐŧÐū Ð―ÐĩÐēÐĩŅ€Ð―Ņ‹Ðž, ҂ҋ ОÐūÐķÐĩ҈Ҍ ÐŋÐūÐīÐ°Ņ‚ŅŒ аÐŋÐĩÐŧÐŧŅŅ†ÐļŅŽ. ÐžŅ‚ÐŋŅ€Ð°ÐēҌ ÐŋÐļŅŅŒÐžÐū Ð―Ð° {appeals_email} ҁ ŅŅ‚ÐūÐģÐū аÐīŅ€ÐĩŅÐ° ŅÐŧÐĩÐšŅ‚Ņ€ÐūÐ―Ð―ÐūÐđ ÐŋÐū҇҂ҋ.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
},
"self_deletion_scheduled": {
"subject": "ЗаÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ðū ҃ÐīаÐŧÐĩÐ―ÐļÐĩ Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĒŅ‹ заÐŋŅ€ÐūҁÐļÐŧ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ ҁÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}. ÐĒÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð― К ÐąÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―ÐūÐžŅƒ ҃ÐīаÐŧÐĩÐ―ÐļŅŽ:\n\n{deletionDate, date, full} Ðē {deletionDate, time, short}\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ÐēÐūÐđÐīÐļ Ðē ҁÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚, ҇҂ÐūÐąŅ‹ ÐūŅ‚ÐžÐĩÐ―ÐļŅ‚ŅŒ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ. ÐĒаКÐķÐĩ Ņ€ÐĩКÐūОÐĩÐ―Ðī҃ÐĩО ŅÐžÐĩÐ―ÐļŅ‚ŅŒ ÐŋÐ°Ņ€ÐūÐŧҌ, ҇҂ÐūÐąŅ‹ Ð·Ð°Ņ‰ÐļŅ‚ÐļŅ‚ŅŒ ҁÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĒŅ‹ заÐŋŅ€ÐūҁÐļÐŧ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ ҁÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name}. БÐĩзÐēÐūзÐēŅ€Ð°Ņ‚Ð―ÐūÐĩ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ заÐŋÐŧÐ°Ð―ÐļŅ€ÐūÐēÐ°Ð―Ðū Ð―Ð°:\n\n{deletionDate, date, full} Ðē {deletionDate, time, short}\n\nÐ•ŅÐŧÐļ ҂ҋ Ð―Ðĩ заÐŋŅ€Ð°ŅˆÐļÐēаÐŧ ŅŅ‚Ðū, ÐēÐūÐđÐīÐļ Ðē ҁÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚, ҇҂ÐūÐąŅ‹ ÐūŅ‚ÐžÐĩÐ―ÐļŅ‚ŅŒ ҃ÐīаÐŧÐĩÐ―ÐļÐĩ. ÐĒаКÐķÐĩ Ņ€ÐĩКÐūОÐĩÐ―Ðī҃ÐĩО ŅÐžÐĩÐ―ÐļŅ‚ŅŒ ÐŋÐ°Ņ€ÐūÐŧҌ, ҇҂ÐūÐąŅ‹ Ð·Ð°Ņ‰ÐļŅ‚ÐļŅ‚ŅŒ ҁÐēÐūÐđ Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚.\n\n– КÐūÐžÐ°Ð―Ðīа {product_name}"
},
"unban_notification": {
"subject": "БÐŧÐūКÐļŅ€ÐūÐēКа Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name} ŅÐ―ŅŅ‚Ð°",
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĨÐūŅ€Ðū҈ÐļÐĩ Ð―ÐūÐēÐūҁ҂Ðļ: ÐąÐŧÐūКÐļŅ€ÐūÐēКа Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name} ŅÐ―ŅŅ‚Ð°.\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nÐĒÐĩÐŋÐĩŅ€ŅŒ ҂ҋ ОÐūÐķÐĩ҈Ҍ ŅÐ―ÐūÐēа ÐēÐūÐđŅ‚Ðļ Ðē ҁÐļҁ҂ÐĩÐžŅƒ Ðļ ÐŋŅ€ÐūÐīÐūÐŧÐķÐļŅ‚ŅŒ ÐļҁÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ņ‚ŅŒ {product_name} КаК ÐūÐąŅ‹Ņ‡Ð―Ðū.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
"body": "ÐŸŅ€ÐļÐēÐĩŅ‚, {username},\n\nÐĨÐūŅ€Ðū҈ÐļÐĩ Ð―ÐūÐēÐūҁ҂Ðļ: ÐąÐŧÐūКÐļŅ€ÐūÐēКа Ņ‚ÐēÐūÐĩÐģÐū Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚Ð° {product_name} ŅÐ―ŅŅ‚Ð°.\n\n{reason, select,\n null {}\n other {ÐŸŅ€Ðļ҇ÐļÐ―Ð°: {reason}}\n}\n\nÐĒÐĩÐŋÐĩŅ€ŅŒ ҂ҋ ОÐūÐķÐĩ҈Ҍ ŅÐ―ÐūÐēа ÐēÐūÐđŅ‚Ðļ Ðē Ð°ÐšÐšÐ°ŅƒÐ―Ņ‚ Ðļ ÐŋŅ€ÐūÐīÐūÐŧÐķÐļŅ‚ŅŒ ÐŋÐūÐŧŅŒÐ·ÐūÐēÐ°Ņ‚ŅŒŅŅ {product_name} КаК ÐūÐąŅ‹Ņ‡Ð―Ðū.\n\n– КÐūÐžÐ°Ð―Ðīа ÐąÐĩзÐūÐŋÐ°ŅÐ―Ðūҁ҂Ðļ {product_name}"
}
});
@@ -1,95 +1,95 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_SV_SE_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Ditt {product_name}-konto har tillfÃĪlligt inaktiverats",
"body": "Hej {username},\n\nVi har tillfÃĪlligt inaktiverat ditt {product_name}-konto eftersom vi upptÃĪckte misstÃĪnkt aktivitet.\n\n{reason, select,\n null {}\n other {Anledning: {reason}}\n}\n\nFÃķr att ÃĨterfÃĨ ÃĨtkomst till ditt konto mÃĨste du ÃĨterstÃĪlla ditt lÃķsenord:\n\n{forgotUrl}\n\nEfter att du har ÃĨterstÃĪllt ditt lÃķsenord kan du logga in igen.\n\nOm du anser att detta har skett av misstag, kontakta vÃĨrt supportteam.\n\n– {product_name} Safety Team"
"body": "Hej {username},\n\nVi har tillfÃĪlligt inaktiverat ditt {product_name}-konto eftersom vi upptÃĪckte misstÃĪnkt aktivitet.\n\n{reason, select,\n null {}\n other {Anledning: {reason}}\n}\n\nFÃķr att ÃĨterfÃĨ ÃĨtkomst till ditt konto mÃĨste du ÃĨterstÃĪlla ditt lÃķsenord:\n\n{forgotUrl}\n\nEfter att du har ÃĨterstÃĪllt ditt lÃķsenord kan du logga in igen.\n\nOm du anser att detta har skett av misstag, kontakta vÃĨrt supportteam.\n\n– SÃĪkerhetsteamet pÃĨ {product_name}"
},
"account_scheduled_deletion": {
"subject": "Ditt {product_name}-konto kommer att raderas permanent",
"body": "Hej {username},\n\nDitt {product_name}-konto har schemalagts fÃķr permanent radering pÃĨ grund av brott mot vÃĨra anvÃĪndarvillkor eller community-riktlinjer.\n\nSchemalagd radering: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Anledning: {reason}}\n}\n\nDetta ÃĪr en allvarlig ÃĨtgÃĪrd. Dina kontouppgifter kommer att raderas permanent pÃĨ det schemalagda datumet.\n\nGranska:\n- AnvÃĪndarvillkor: {termsUrl}\n- Community-riktlinjer: {guidelinesUrl}\n\nÖverklagandeprocess:\nOm du anser att detta beslut var felaktigt eller orÃĪttfÃĪrdigt har du 60 dagar pÃĨ dig att Ãķverklaga. Mejla {appeals_email} frÃĨn denna e-postadress.\n\nI din Ãķverklagan:\n- FÃķrklara tydligt varfÃķr du anser att beslutet var felaktigt eller orÃĪttfÃĪrdigt\n- Bifoga relevanta bevis eller sammanhang\n\nEn medlem av {product_name} Safety Team kommer att granska din Ãķverklagan och kan pausa den pÃĨgÃĨende raderingen tills ett slutgiltigt beslut har fattats.\n\n– {product_name} Safety Team"
"body": "Hej {username},\n\nDitt {product_name}-konto har schemalagts fÃķr permanent radering pÃĨ grund av brott mot vÃĨra anvÃĪndarvillkor eller communityriktlinjer.\n\nSchemalagd radering: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Anledning: {reason}}\n}\n\nDetta ÃĪr en allvarlig ÃĨtgÃĪrd. Dina kontodata kommer att raderas permanent pÃĨ det schemalagda datumet.\n\nGranska:\n- AnvÃĪndarvillkor: {termsUrl}\n- Communityriktlinjer: {guidelinesUrl}\n\nÖverklagandeprocess:\nOm du anser att detta beslut var felaktigt eller obefogat har du 60 dagar pÃĨ dig att Ãķverklaga. Mejla {appeals_email} frÃĨn den hÃĪr e-postadressen.\n\nI ditt Ãķverklagande:\n- FÃķrklara tydligt varfÃķr du anser att beslutet var felaktigt eller obefogat\n- Bifoga relevanta bevis eller bakgrundsinformation\n\nEn medarbetare i sÃĪkerhetsteamet pÃĨ {product_name} kommer att granska ditt Ãķverklagande och kan pausa den planerade raderingen tills ett slutgiltigt beslut har fattats.\n\n– SÃĪkerhetsteamet pÃĨ {product_name}"
},
"account_temp_banned": {
"subject": "Ditt {product_name}-konto har tillfÃĪlligt stÃĪngts av",
"body": "Hej {username},\n\nDitt {product_name}-konto har tillfÃĪlligt stÃĪngts av pÃĨ grund av brott mot vÃĨra anvÃĪndarvillkor eller community-riktlinjer.\n\nVaraktighet: {durationHours, plural,\n =1 {1 timme}\n other {# timmar}\n}\nAvstÃĪngd till: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Anledning: {reason}}\n}\n\nUnder denna tid kommer du inte att kunna komma ÃĨt ditt konto.\n\nGranska:\n- AnvÃĪndarvillkor: {termsUrl}\n- Community-riktlinjer: {guidelinesUrl}\n\nOm du anser att detta beslut var felaktigt eller orÃĪttfÃĪrdigt kan du Ãķverklaga. Kontakta vÃĨrt supportteam pÃĨ {appeals_email} frÃĨn denna e-postadress och fÃķrklara tydligt varfÃķr du anser att beslutet var felaktigt. Vi kommer att granska din Ãķverklagan och svara med vÃĨrt beslut.\n\n– {product_name} Safety Team"
"body": "Hej {username},\n\nDitt {product_name}-konto har tillfÃĪlligt stÃĪngts av pÃĨ grund av brott mot vÃĨra anvÃĪndarvillkor eller communityriktlinjer.\n\nVaraktighet: {durationHours, plural,\n =1 {1 timme}\n other {# timmar}\n}\nAvstÃĪngningen upphÃķr: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Anledning: {reason}}\n}\n\nUnder denna tid kommer du inte att kunna komma ÃĨt ditt konto.\n\nGranska:\n- AnvÃĪndarvillkor: {termsUrl}\n- Communityriktlinjer: {guidelinesUrl}\n\nOm du anser att detta beslut var felaktigt eller obefogat kan du Ãķverklaga. Kontakta vÃĨrt supportteam pÃĨ {appeals_email} frÃĨn den hÃĪr e-postadressen och fÃķrklara tydligt varfÃķr du anser att beslutet var felaktigt. Vi kommer att granska ditt Ãķverklagande och svara med vÃĨrt beslut.\n\n– SÃĪkerhetsteamet pÃĨ {product_name}"
},
"donation_confirmation": {
"subject": "Tack fÃķr din donation till {product_name}",
"body": "Hej,\n\nTack fÃķr din donation till {product_name}! Din {interval, select,\n month {ÃĨterkommande donation}\n year {ÃĨterkommande donation}\n other {engÃĨngsdonation}\n} har {interval, select,\n month {stÃĪllts in}\n year {stÃĪllts in}\n other {behandlats}\n} framgÃĨngsrikt.\n\nDonationsuppgifter:\nBelopp: {amount} {currency} {interval, select,\n month {per mÃĨnad}\n year {per ÃĨr}\n other {}\n}\n\nStripe kommer att skicka ett separat kvitto med din faktura i PDF-format via e-post inom kort. Detta inkluderar alla betalningsuppgifter och kan anvÃĪndas fÃķr skatteÃĪndamÃĨl.\n\nDu kan se din donationshistorik, ladda ner fakturor, {interval, select,\n month {och hantera eller avbryta ditt abonnemang}\n year {och hantera eller avbryta ditt abonnemang}\n other {och hantera framtida donationer}\n} nÃĪr som helst via denna lÃĪnk:\n\n{manageUrl}\n\nDitt stÃķd hjÃĪlper till att hÃĨlla {product_name} igÃĨng. Tack!\n\n– {product_name} Team"
"body": "Hej,\n\nTack fÃķr din donation till {product_name}! {interval, select,\n month {Din ÃĨterkommande donation har registrerats.}\n year {Din ÃĨterkommande donation har registrerats.}\n other {Din engÃĨngsdonation har genomfÃķrts.}\n}\n\nDonationsuppgifter:\nBelopp: {amount} {interval, select,\n month {per mÃĨnad}\n year {per ÃĨr}\n other {}\n}\n\nStripe skickar snart ett separat kvitto med din faktura i PDF-format via e-post. DÃĪr finns alla betalningsuppgifter, och underlaget kan anvÃĪndas fÃķr skatteÃĪndamÃĨl.\n\nDu kan se din donationshistorik, ladda ner fakturor {interval, select,\n month {och hantera eller avsluta din ÃĨterkommande donation}\n year {och hantera eller avsluta din ÃĨterkommande donation}\n other {och hantera framtida donationer}\n} nÃĪr som helst via den hÃĪr lÃĪnken:\n\n{manageUrl}\n\nDitt stÃķd hjÃĪlper till att hÃĨlla {product_name} igÃĨng. Tack!\n\n– {product_name}-teamet"
},
"donation_magic_link": {
"subject": "Hantera dina donationer till {product_name}",
"body": "Hej,\n\nKlicka pÃĨ lÃĪnken nedan fÃķr att komma ÃĨt din donatorportal:\n\n{manageUrl}\n\nI portalen kan du hantera abonnemang, ladda ner fakturor och se din donationshistorik.\n\nDenna lÃĪnk upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde denna lÃĪnk kan du tryggt ignorera detta mejl.\n\n– {product_name} Team"
"body": "Hej,\n\nKlicka pÃĨ lÃĪnken nedan fÃķr att komma ÃĨt din donationsportal:\n\n{manageUrl}\n\nI portalen kan du hantera prenumerationer, ladda ner fakturor och se din donationshistorik.\n\nDen hÃĪr lÃĪnken upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde denna lÃĪnk kan du tryggt ignorera det hÃĪr mejlet.\n\n– {product_name}-teamet"
},
"dsa_report_verification": {
"subject": "Verifiera din e-postadress infÃķr en DSA-rapport",
"body": "Hej,\n\nAnvÃĪnd verifieringskoden nedan fÃķr att skicka in din DSA-rapport pÃĨ {product_name}:\n\n{code}\n\nDenna kod upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde detta kan du ignorera detta mejl.\n\n– {product_name} Safety Team"
"subject": "Verifiera din e-postadress fÃķr en DSA-anmÃĪlan",
"body": "Hej,\n\nAnvÃĪnd verifieringskoden nedan fÃķr att skicka in din anmÃĪlan enligt fÃķrordningen om digitala tjÃĪnster pÃĨ {product_name}:\n\n{code}\n\nDen hÃĪr koden upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde detta kan du ignorera det hÃĪr mejlet.\n\n– SÃĪkerhetsteamet pÃĨ {product_name}"
},
"email_change_new": {
"subject": "Verifiera din nya {product_name}-e-postadress",
"body": "Hej {username},\n\nAnge denna kod i appen fÃķr att verifiera din nya {product_name}-e-postadress:\n\n{code}\n\nDenna kod upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde detta kan du ignorera detta mejl.\n\n– {product_name} Team"
"subject": "Verifiera din nya e-postadress pÃĨ {product_name}",
"body": "Hej {username},\n\nAnge den hÃĪr koden i appen fÃķr att verifiera din nya e-postadress pÃĨ {product_name}:\n\n{code}\n\nDen hÃĪr koden upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde detta kan du ignorera det hÃĪr mejlet.\n\n– {product_name}-teamet"
},
"email_change_original": {
"subject": "BekrÃĪfta din {product_name}-e-postadressÃĪndring",
"body": "Hej {username},\n\nVi har mottagit en begÃĪran om att ÃĪndra e-postadressen fÃķr ditt {product_name}-konto.\n\nFÃķr att bekrÃĪfta denna ÃĪndring, ange denna kod i appen:\n\n{code}\n\nDenna kod upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde detta, sÃĪkra ditt konto omedelbart.\n\n– {product_name} Team"
"subject": "BekrÃĪfta ÃĪndringen av din e-postadress pÃĨ {product_name}",
"body": "Hej {username},\n\nVi har fÃĨtt en begÃĪran om att ÃĪndra e-postadressen fÃķr ditt {product_name}-konto.\n\nBekrÃĪfta ÃĪndringen genom att ange den hÃĪr koden i appen:\n\n{code}\n\nDen hÃĪr koden upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde detta, sÃĪkra ditt konto omedelbart.\n\n– {product_name}-teamet"
},
"email_change_revert": {
"subject": "Din {product_name}-e-postadress ÃĪndrades",
"body": "Hej {username},\n\nE-postadressen fÃķr ditt {product_name}-konto har ÃĪndrats till {newEmail}.\n\nOm du gjorde denna ÃĪndring behÃķvs ingen ÃĨtgÃĪrd. Om du inte gjorde det kan du ÃĨngra ÃĪndringen och sÃĪkra ditt konto med denna lÃĪnk:\n\n{revertUrl}\n\nDetta kommer att ÃĨterstÃĪlla din tidigare e-post, logga ut dig Ãķverallt, ta bort lÃĪnkade telefonnummer, inaktivera MFA och krÃĪva att du stÃĪller in ett nytt lÃķsenord.\n\n– {product_name} Safety Team"
"subject": "Din e-postadress pÃĨ {product_name} har ÃĪndrats",
"body": "Hej {username},\n\nE-postadressen fÃķr ditt {product_name}-konto har ÃĪndrats till {newEmail}.\n\nOm du gjorde denna ÃĪndring behÃķvs ingen ÃĨtgÃĪrd. Om du inte gjorde det kan du ÃĨngra ÃĪndringen och sÃĪkra ditt konto med denna lÃĪnk:\n\n{revertUrl}\n\nDetta ÃĨterstÃĪller din tidigare e-postadress, loggar ut dig Ãķverallt, tar bort kopplade telefonnummer, inaktiverar flerfaktorsautentisering (MFA) och krÃĪver att du vÃĪljer ett nytt lÃķsenord.\n\n– SÃĪkerhetsteamet pÃĨ {product_name}"
},
"email_verification": {
"subject": "Verifiera din {product_name}-e-postadress",
"body": "Hej {username},\n\nVerifiera e-postadressen fÃķr ditt {product_name}-konto genom att klicka pÃĨ lÃĪnken nedan:\n\n{verifyUrl}\n\nOm du inte skapade ett {product_name}-konto kan du tryggt ignorera detta mejl.\n\nDenna lÃĪnk ÃĪr giltig i 24 timmar.\n\n– {product_name} Team"
"subject": "Verifiera din e-postadress pÃĨ {product_name}",
"body": "Hej {username},\n\nVerifiera e-postadressen fÃķr ditt {product_name}-konto genom att klicka pÃĨ lÃĪnken nedan:\n\n{verifyUrl}\n\nOm du inte skapade ett {product_name}-konto kan du tryggt ignorera det hÃĪr mejlet.\n\nDen hÃĪr lÃĪnken ÃĪr giltig i 24 timmar.\n\n– {product_name}-teamet"
},
"gift_chargeback_notification": {
"subject": "FÃķrmÃĨnerna fÃķr din inlÃķsta gÃĨva har tagits bort",
"body": "Hej {username},\n\nEn presentkod du lÃķste in betalades ursprungligen av nÃĨgon annan. Den betalningen har sedan dess ÃĨterkallats (en chargeback).\n\nPÃĨ grund av detta har vi tagit bort de fÃķrmÃĨner som lades till ditt konto nÃĪr du lÃķste in presenten.\n\nOm du tror att detta ÃĪr ett misstag, kontakta vÃĨr support och inkludera alla detaljer du har om presentkoden och nÃĪr du lÃķste in den.\n\n– {product_name} Team"
"subject": "FÃķrmÃĨnerna frÃĨn din inlÃķsta present har tagits bort",
"body": "Hej {username},\n\nEn presentkod du lÃķste in betalades ursprungligen av nÃĨgon annan. Den betalningen har sedan dess ÃĨterfÃķrts genom en kortreklamation (chargeback).\n\nPÃĨ grund av detta har vi tagit bort de fÃķrmÃĨner som lades till ditt konto nÃĪr du lÃķste in presenten.\n\nOm du tror att detta ÃĪr ett misstag, kontakta vÃĨrt supportteam och ta med den information du har om presentkoden och nÃĪr du lÃķste in den.\n\n– {product_name}-teamet"
},
"harvest_completed": {
"subject": "Din {product_name}-dataexport ÃĪr redo att laddas ner",
"body": "Hej {username},\n\nDin dataexport ÃĪr redo.\n\nNedladdningslÃĪnk:\n{downloadUrl}\n\nMeddelanden inkluderade: {totalMessages, number}\nFilstorlek: {fileSizeMB, number} MB\n\nDenna lÃĪnk upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde denna export, ÃĪndra ditt lÃķsenord omedelbart och kontakta vÃĨrt supportteam.\n\n– {product_name} Team"
"subject": "Din dataexport frÃĨn {product_name} ÃĪr klar att ladda ner",
"body": "Hej {username},\n\nDin dataexport ÃĪr klar.\n\nNedladdningslÃĪnk:\n{downloadUrl}\n\nAntal meddelanden: {totalMessages, number}\nFilstorlek: {fileSizeMB, number} MB\n\nDen hÃĪr lÃĪnken upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde denna export, ÃĪndra ditt lÃķsenord omedelbart och kontakta vÃĨrt supportteam.\n\n– {product_name}-teamet"
},
"inactivity_warning": {
"subject": "Ditt {product_name}-konto kommer att raderas pÃĨ grund av inaktivitet",
"body": "Hej {username},\n\nVi har inte sett nÃĨgon aktivitet pÃĨ ditt {product_name}-konto sedan {lastActiveDate, date, full}.\n\nOm du inte loggar in senast {deletionDate, date, full} kl. {deletionDate, time, short}, kommer ditt konto att raderas permanent pÃĨ grund av inaktivitet.\n\nLogga in hÃĪr:\n{loginUrl}\n\nOm du har anvÃĪnt {product_name} nyligen, kontakta vÃĨrt supportteam omedelbart.\n\n– {product_name} Team"
"body": "Hej {username},\n\nVi har inte sett nÃĨgon aktivitet pÃĨ ditt {product_name}-konto sedan {lastActiveDate, date, full}.\n\nOm du inte loggar in senast {deletionDate, date, full} kl. {deletionDate, time, short} kommer ditt konto att raderas permanent pÃĨ grund av inaktivitet.\n\nLogga in hÃĪr:\n{loginUrl}\n\nKontakta vÃĨrt supportteam omedelbart om du har anvÃĪnt {product_name} nyligen.\n\n– {product_name}-teamet"
},
"ip_authorization": {
"subject": "Auktorisera inloggning frÃĨn en ny IP-adress",
"body": "Hej {username},\n\nVi upptÃĪckte ett inloggningsfÃķrsÃķk till ditt {product_name}-konto frÃĨn en ny IP-adress:\n\nIP-adress: {ipAddress}\nPlats: {location}\n\nOm detta var du, godkÃĪnn denna IP-adress genom att klicka pÃĨ lÃĪnken nedan:\n\n{authUrl}\n\nOm du inte fÃķrsÃķkte logga in, ÃĪndra ditt lÃķsenord omedelbart.\n\nDenna lÃĪnk ÃĪr giltig i 30 minuter.\n\n– {product_name} Team"
"subject": "GodkÃĪnn inloggning frÃĨn en ny IP-adress",
"body": "Hej {username},\n\nVi upptÃĪckte ett inloggningsfÃķrsÃķk till ditt {product_name}-konto frÃĨn en ny IP-adress:\n\nIP-adress: {ipAddress}\nPlats: {location}\n\nOm det var du kan du godkÃĪnna IP-adressen genom att klicka pÃĨ lÃĪnken nedan:\n\n{authUrl}\n\nOm du inte fÃķrsÃķkte logga in, ÃĪndra ditt lÃķsenord omedelbart.\n\nDen hÃĪr lÃĪnken ÃĪr giltig i 30 minuter.\n\n– {product_name}-teamet"
},
"mfa_backup_codes_view": {
"subject": "BekrÃĪfta ÃĨtkomst till dina {product_name}-reservkoder",
"body": "Hej {username},\n\nVi har mottagit en begÃĪran om att visa reservkoderna fÃķr ditt {product_name}-konto.\n\nFÃķr att bekrÃĪfta denna begÃĪran, ange denna kod i appen:\n\n{code}\n\nDenna kod upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde detta kan nÃĨgon ha ÃĨtkomst till ditt konto. Ändra ditt lÃķsenord omedelbart.\n\n– {product_name} Team"
"subject": "BekrÃĪfta ÃĨtkomst till dina reservkoder pÃĨ {product_name}",
"body": "Hej {username},\n\nVi har fÃĨtt en begÃĪran om att visa reservkoderna fÃķr ditt {product_name}-konto.\n\nBekrÃĪfta begÃĪran genom att ange den hÃĪr koden i appen:\n\n{code}\n\nDen hÃĪr koden upphÃķr att gÃĪlla {expiresAt, date, full} kl. {expiresAt, time, short}.\n\nOm du inte begÃĪrde detta kan nÃĨgon ha ÃĨtkomst till ditt konto. Ändra ditt lÃķsenord omedelbart.\n\n– {product_name}-teamet"
},
"password_change_verification": {
"subject": "BekrÃĪfta din {product_name}-lÃķsenordsÃĪndring",
"body": "Hej {username},\n\nVi har mottagit en begÃĪran om att ÃĪndra lÃķsenordet fÃķr ditt {product_name}-konto.\n\nFÃķr att bekrÃĪfta denna ÃĪndring, ange denna kod i appen:\n\n{code}\n\nDenna kod upphÃķr att gÃĪlla {expiresAt}.\n\nOm du inte begÃĪrde detta kan nÃĨgon ha ÃĨtkomst till ditt konto. Ändra ditt lÃķsenord omedelbart och aktivera tvÃĨfaktorsautentisering.\n\n– {product_name} Team"
"subject": "BekrÃĪfta ÃĪndringen av ditt lÃķsenord pÃĨ {product_name}",
"body": "Hej {username},\n\nVi har fÃĨtt en begÃĪran om att ÃĪndra lÃķsenordet fÃķr ditt {product_name}-konto.\n\nBekrÃĪfta ÃĪndringen genom att ange den hÃĪr koden i appen:\n\n{code}\n\nDen hÃĪr koden upphÃķr att gÃĪlla {expiresAt}.\n\nOm du inte begÃĪrde detta kan nÃĨgon ha ÃĨtkomst till ditt konto. Ändra ditt lÃķsenord omedelbart och aktivera tvÃĨfaktorsautentisering.\n\n– {product_name}-teamet"
},
"password_reset": {
"subject": "ÅterstÃĪll ditt {product_name}-lÃķsenord",
"body": "Hej {username},\n\nDu begÃĪrde en ÃĨterstÃĪllning av ditt {product_name}-lÃķsenord. AnvÃĪnd lÃĪnken nedan fÃķr att stÃĪlla in ett nytt lÃķsenord:\n\n{resetUrl}\n\nOm du inte begÃĪrde detta kan du tryggt ignorera detta mejl.\n\nDenna lÃĪnk ÃĪr giltig i 1 timme.\n\n– {product_name} Team"
"subject": "ÅterstÃĪll ditt lÃķsenord pÃĨ {product_name}",
"body": "Hej {username},\n\nDu har begÃĪrt att ÃĨterstÃĪlla ditt lÃķsenord pÃĨ {product_name}. AnvÃĪnd lÃĪnken nedan fÃķr att vÃĪlja ett nytt lÃķsenord:\n\n{resetUrl}\n\nOm du inte begÃĪrde detta kan du tryggt ignorera det hÃĪr mejlet.\n\nDen hÃĪr lÃĪnken ÃĪr giltig i 1 timme.\n\n– {product_name}-teamet"
},
"registration_approved": {
"subject": "Din {product_name}-registrering har godkÃĪnts",
"body": "Hej {username},\n\nGoda nyheter: din {product_name}-registrering har godkÃĪnts.\n\nDu kan nu logga in pÃĨ {product_name}-appen hÃĪr:\n{channelsUrl}\n\nVÃĪlkommen till {product_name}-communityn.\n\n– {product_name} Team"
"subject": "Din registrering pÃĨ {product_name} har godkÃĪnts",
"body": "Hej {username},\n\nGoda nyheter: din registrering pÃĨ {product_name} har godkÃĪnts.\n\nDu kan nu logga in i {product_name}-appen hÃĪr:\n{channelsUrl}\n\nVÃĪlkommen till {product_name}-communityn.\n\n– {product_name}-teamet"
},
"report_resolved": {
"subject": "Din {product_name}-rapport har granskats",
"body": "Hej {username},\n\nDin rapport (ID: {reportId}) har granskats av vÃĨrt sÃĪkerhetsteam.{hasComment, select, yes {\n\nSvar frÃĨn sÃĪkerhetsteamet:\n{publicComment}} other {}}\n\nTack fÃķr att du hjÃĪlper till att hÃĨlla {product_name} sÃĪkert fÃķr alla. Vi tar alla rapporter pÃĨ allvar och uppskattar ditt bidrag till communityn.\n\nOm du har nÃĨgra frÃĨgor eller funderingar kring detta resultat, kontakta oss pÃĨ {safety_email}.\n\n– {product_name} Safety Team"
"subject": "Din anmÃĪlan pÃĨ {product_name} har granskats",
"body": "Hej {username},\n\nDin anmÃĪlan (ID: {reportId}) har granskats av vÃĨrt sÃĪkerhetsteam.{hasComment, select, yes {\n\nSvar frÃĨn sÃĪkerhetsteamet:\n{publicComment}} other {}}\n\nTack fÃķr att du hjÃĪlper till att gÃķra {product_name} tryggt fÃķr alla. Vi tar alla anmÃĪlningar pÃĨ allvar och uppskattar ditt bidrag till communityn.\n\nOm du har nÃĨgra frÃĨgor eller funderingar kring detta resultat, kontakta oss pÃĨ {safety_email}.\n\n– SÃĪkerhetsteamet pÃĨ {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Ditt {product_name}-konto kommer att raderas permanent",
"body": "Hej {username},\n\nDitt {product_name}-konto har schemalagts fÃķr permanent radering.\n\nSchemalagd radering: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Anledning: {reason}}\n}\n\nDetta ÃĪr en allvarlig ÃĨtgÃĪrd. Dina kontouppgifter kommer att raderas permanent pÃĨ det schemalagda datumet.\n\nOm du anser att detta beslut var felaktigt kan du Ãķverklaga. Mejla {appeals_email} frÃĨn denna e-postadress.\n\n– {product_name} Safety Team"
"body": "Hej {username},\n\nDitt {product_name}-konto har schemalagts fÃķr permanent radering.\n\nSchemalagd radering: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Anledning: {reason}}\n}\n\nDetta ÃĪr en allvarlig ÃĨtgÃĪrd. Dina kontodata kommer att raderas permanent pÃĨ det schemalagda datumet.\n\nOm du anser att detta beslut var felaktigt kan du Ãķverklaga. Mejla {appeals_email} frÃĨn den hÃĪr e-postadressen.\n\n– SÃĪkerhetsteamet pÃĨ {product_name}"
},
"self_deletion_scheduled": {
"subject": "Raderingen av ditt {product_name}-konto ÃĪr schemalagd",
"body": "Hej {username},\n\nDu begÃĪrde att radera ditt {product_name}-konto. Ditt konto ÃĪr schemalagt fÃķr permanent radering den:\n\n{deletionDate, date, full} kl. {deletionDate, time, short}\n\nOm du inte begÃĪrde detta, logga in pÃĨ ditt konto fÃķr att avbryta raderingen. Vi rekommenderar ocksÃĨ att du ÃĪndrar ditt lÃķsenord fÃķr att sÃĪkra ditt konto.\n\n– {product_name} Team"
"body": "Hej {username},\n\nDu har begÃĪrt att ditt {product_name}-konto ska raderas. Permanent radering av kontot ÃĪr planerad till fÃķljande tidpunkt:\n\n{deletionDate, date, full} kl. {deletionDate, time, short}\n\nOm du inte begÃĪrde detta, logga in pÃĨ ditt konto fÃķr att avbryta raderingen. Vi rekommenderar ocksÃĨ att du ÃĪndrar ditt lÃķsenord fÃķr att sÃĪkra ditt konto.\n\n– {product_name}-teamet"
},
"unban_notification": {
"subject": "AvstÃĪngningen av ditt {product_name}-konto har hÃĪvts",
"body": "Hej {username},\n\nGoda nyheter: avstÃĪngningen av ditt {product_name}-konto har hÃĪvts.\n\n{reason, select,\n null {}\n other {Anledning: {reason}}\n}\n\nDu kan nu logga in igen och fortsÃĪtta anvÃĪnda {product_name} som vanligt.\n\n– {product_name} Safety Team"
"body": "Hej {username},\n\nGoda nyheter: avstÃĪngningen av ditt {product_name}-konto har hÃĪvts.\n\n{reason, select,\n null {}\n other {Anledning: {reason}}\n}\n\nDu kan nu logga in igen och fortsÃĪtta anvÃĪnda {product_name} som vanligt.\n\n– SÃĪkerhetsteamet pÃĨ {product_name}"
}
});
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_TH_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -9,18 +9,18 @@ const EMAIL_I18N_TH_MESSAGES = defineEmailI18nLocaleMessages({
},
"account_scheduled_deletion": {
"subject": "āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļ°āļ–āļđāļāļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢ",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļ°āļ–āļđāļāļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĨāļ°āđ€āļĄāļīāļ”āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āđƒāļ™āļāļēāļĢāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļŦāļĢāļ·āļ­āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ‚āļ­āļ‡āļ„āļ­āļĄāļĄāļđāļ™āļīāļ•āļĩāđ‰āļ‚āļ­āļ‡āđ€āļĢāļē\n\nāļāļģāļŦāļ™āļ”āļāļēāļĢāļĨāļš: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {āđ€āļŦāļ•āļļāļœāļĨ: {reason}}\n}\n\nāļ™āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļšāļąāļ‡āļ„āļąāļšāđƒāļŠāđ‰āļ—āļĩāđˆāļĢāđ‰āļēāļĒāđāļĢāļ‡ āļ‚āđ‰āļ­āļĄāļđāļĨāļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļ°āļ–āļđāļāļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢāļ•āļēāļĄāļ§āļąāļ™āļ—āļĩāđˆāļāļģāļŦāļ™āļ”\n\nāđ‚āļ›āļĢāļ”āļ•āļĢāļ§āļˆāļŠāļ­āļš:\n- āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āđƒāļ™āļāļēāļĢāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢ: {termsUrl}\n- āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ‚āļ­āļ‡āļ„āļ­āļĄāļĄāļđāļ™āļīāļ•āļĩāđ‰: {guidelinesUrl}\n\nāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ­āļļāļ—āļ˜āļĢāļ“āđŒ:\nāļŦāļēāļāļ„āļļāļ“āđ€āļŠāļ·āđˆāļ­āļ§āđˆāļēāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ™āļĩāđ‰āđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡āļŦāļĢāļ·āļ­āđ„āļĄāđˆāļĒāļļāļ•āļīāļ˜āļĢāļĢāļĄ āļ„āļļāļ“āļĄāļĩāđ€āļ§āļĨāļē 60 āļ§āļąāļ™āđƒāļ™āļāļēāļĢāļĒāļ·āđˆāļ™āļ­āļļāļ—āļ˜āļĢāļ“āđŒ āļŠāđˆāļ‡āļ­āļĩāđ€āļĄāļĨāđ„āļ›āļ—āļĩāđˆ {appeals_email} āļˆāļēāļāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ­āļĩāđ€āļĄāļĨāļ™āļĩāđ‰\n\nāđƒāļ™āļāļēāļĢāļ­āļļāļ—āļ˜āļĢāļ“āđŒāļ‚āļ­āļ‡āļ„āļļāļ“:\n- āļ­āļ˜āļīāļšāļēāļĒāđƒāļŦāđ‰āļŠāļąāļ”āđ€āļˆāļ™āļ§āđˆāļēāļ—āļģāđ„āļĄāļ„āļļāļ“āļ–āļķāļ‡āđ€āļŠāļ·āđˆāļ­āļ§āđˆāļēāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡āļŦāļĢāļ·āļ­āđ„āļĄāđˆāļĒāļļāļ•āļīāļ˜āļĢāļĢāļĄ\n- āđƒāļŦāđ‰āļŦāļĨāļąāļāļāļēāļ™āļŦāļĢāļ·āļ­āļšāļĢāļīāļšāļ—āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡\n\nāļŠāļĄāļēāļŠāļīāļāļ‚āļ­āļ‡āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name} āļˆāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļģāļ­āļļāļ—āļ˜āļĢāļ“āđŒāļ‚āļ­āļ‡āļ„āļļāļ“āđāļĨāļ°āļ­āļēāļˆāļĢāļ°āļ‡āļąāļšāļāļēāļĢāļĨāļšāļ—āļĩāđˆāļĢāļ­āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ„āļ§āđ‰āļˆāļ™āļāļ§āđˆāļēāļˆāļ°āļĄāļĩāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ‚āļąāđ‰āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒ\n\n– āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name}"
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļ–āļđāļāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĨāļ°āđ€āļĄāļīāļ”āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āđƒāļ™āļāļēāļĢāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļŦāļĢāļ·āļ­āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ‚āļ­āļ‡āļ„āļ­āļĄāļĄāļđāļ™āļīāļ•āļĩāđ‰āļ‚āļ­āļ‡āđ€āļĢāļē\n\nāļāļģāļŦāļ™āļ”āļāļēāļĢāļĨāļš: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {āđ€āļŦāļ•āļļāļœāļĨ: {reason}}\n}\n\nāļ™āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļšāļąāļ‡āļ„āļąāļšāđƒāļŠāđ‰āļ—āļĩāđˆāļĢāđ‰āļēāļĒāđāļĢāļ‡ āļ‚āđ‰āļ­āļĄāļđāļĨāļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļ°āļ–āļđāļāļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢāļ•āļēāļĄāļ§āļąāļ™āļ—āļĩāđˆāļāļģāļŦāļ™āļ”\n\nāđ‚āļ›āļĢāļ”āļ•āļĢāļ§āļˆāļŠāļ­āļš:\n- āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āđƒāļ™āļāļēāļĢāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢ: {termsUrl}\n- āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ‚āļ­āļ‡āļ„āļ­āļĄāļĄāļđāļ™āļīāļ•āļĩāđ‰: {guidelinesUrl}\n\nāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ­āļļāļ—āļ˜āļĢāļ“āđŒ:\nāļŦāļēāļāļ„āļļāļ“āđ€āļŠāļ·āđˆāļ­āļ§āđˆāļēāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ™āļĩāđ‰āđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡āļŦāļĢāļ·āļ­āđ„āļĄāđˆāļĒāļļāļ•āļīāļ˜āļĢāļĢāļĄ āļ„āļļāļ“āļĄāļĩāđ€āļ§āļĨāļē 60 āļ§āļąāļ™āđƒāļ™āļāļēāļĢāļĒāļ·āđˆāļ™āļ­āļļāļ—āļ˜āļĢāļ“āđŒ āļŠāđˆāļ‡āļ­āļĩāđ€āļĄāļĨāđ„āļ›āļ—āļĩāđˆ {appeals_email} āļˆāļēāļāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ­āļĩāđ€āļĄāļĨāļ™āļĩāđ‰\n\nāđƒāļ™āļāļēāļĢāļ­āļļāļ—āļ˜āļĢāļ“āđŒāļ‚āļ­āļ‡āļ„āļļāļ“:\n- āļ­āļ˜āļīāļšāļēāļĒāđƒāļŦāđ‰āļŠāļąāļ”āđ€āļˆāļ™āļ§āđˆāļēāļ—āļģāđ„āļĄāļ„āļļāļ“āļ–āļķāļ‡āđ€āļŠāļ·āđˆāļ­āļ§āđˆāļēāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡āļŦāļĢāļ·āļ­āđ„āļĄāđˆāļĒāļļāļ•āļīāļ˜āļĢāļĢāļĄ\n- āđāļ™āļšāļŦāļĨāļąāļāļāļēāļ™āļŦāļĢāļ·āļ­āļšāļĢāļīāļšāļ—āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡\n\nāļŠāļĄāļēāļŠāļīāļāļ‚āļ­āļ‡āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name} āļˆāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļģāļ­āļļāļ—āļ˜āļĢāļ“āđŒāļ‚āļ­āļ‡āļ„āļļāļ“āđāļĨāļ°āļ­āļēāļˆāļĢāļ°āļ‡āļąāļšāļāļēāļĢāļĨāļšāļ—āļĩāđˆāļĢāļ­āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ„āļ§āđ‰āļˆāļ™āļāļ§āđˆāļēāļˆāļ°āļĄāļĩāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ‚āļąāđ‰āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒ\n\n– āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name}"
},
"account_temp_banned": {
"subject": "āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļ–āļđāļāļĢāļ°āļ‡āļąāļšāļŠāļąāđˆāļ§āļ„āļĢāļēāļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļ–āļđāļāļĢāļ°āļ‡āļąāļšāļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĨāļ°āđ€āļĄāļīāļ”āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āđƒāļ™āļāļēāļĢāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļŦāļĢāļ·āļ­āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ‚āļ­āļ‡āļ„āļ­āļĄāļĄāļđāļ™āļīāļ•āļĩāđ‰āļ‚āļ­āļ‡āđ€āļĢāļē\n\nāļĢāļ°āļĒāļ°āđ€āļ§āļĨāļē: {durationHours, plural,\n =1 {1 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡}\n other {# āļŠāļąāđˆāļ§āđ‚āļĄāļ‡}\n}\nāļĢāļ°āļ‡āļąāļšāļˆāļ™āļ–āļķāļ‡: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {āđ€āļŦāļ•āļļāļœāļĨ: {reason}}\n}\n\nāđƒāļ™āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ™āļĩāđ‰ āļ„āļļāļ“āļˆāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āđ„āļ”āđ‰\n\nāđ‚āļ›āļĢāļ”āļ•āļĢāļ§āļˆāļŠāļ­āļš:\n- āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āđƒāļ™āļāļēāļĢāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢ: {termsUrl}\n- āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ‚āļ­āļ‡āļ„āļ­āļĄāļĄāļđāļ™āļīāļ•āļĩāđ‰: {guidelinesUrl}\n\nāļŦāļēāļāļ„āļļāļ“āđ€āļŠāļ·āđˆāļ­āļ§āđˆāļēāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ™āļĩāđ‰āđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡āļŦāļĢāļ·āļ­āđ„āļĄāđˆāļĒāļļāļ•āļīāļ˜āļĢāļĢāļĄ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļĒāļ·āđˆāļ™āļ­āļļāļ—āļ˜āļĢāļ“āđŒāđ„āļ”āđ‰ āļŠāđˆāļ‡āļ­āļĩāđ€āļĄāļĨāđ„āļ›āļ—āļĩāđˆ {appeals_email} āļˆāļēāļāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ­āļĩāđ€āļĄāļĨāļ™āļĩāđ‰āđāļĨāļ°āļ­āļ˜āļīāļšāļēāļĒāđƒāļŦāđ‰āļŠāļąāļ”āđ€āļˆāļ™āļ§āđˆāļēāļ—āļģāđ„āļĄāļ„āļļāļ“āļ–āļķāļ‡āđ€āļŠāļ·āđˆāļ­āļ§āđˆāļēāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡ āđ€āļĢāļēāļˆāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļģāļ­āļļāļ—āļ˜āļĢāļ“āđŒāļ‚āļ­āļ‡āļ„āļļāļ“āđāļĨāļ°āļ•āļ­āļšāļāļĨāļąāļšāļ”āđ‰āļ§āļĒāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ‚āļ­āļ‡āđ€āļĢāļē\n\n– āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name}"
},
"donation_confirmation": {
"subject": "āļ‚āļ­āļšāļ„āļļāļ“āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļĢāļīāļˆāļēāļ„ {product_name}",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ,\n\nāļ‚āļ­āļšāļ„āļļāļ“āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļĢāļīāļˆāļēāļ„ {product_name}! {interval, select,\n month {āļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āđāļšāļšāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡}\n year {āļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āđāļšāļšāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡}\n other {āļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§}\n} {interval, select,\n month {āļ•āļąāđ‰āļ‡āļ„āđˆāļē}\n year {āļ•āļąāđ‰āļ‡āļ„āđˆāļē}\n other {āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ}\n}āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§\n\nāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļšāļĢāļīāļˆāļēāļ„:\nāļˆāļģāļ™āļ§āļ™: {amount} {currency} {interval, select,\n month {āļ•āđˆāļ­āđ€āļ”āļ·āļ­āļ™}\n year {āļ•āđˆāļ­āļ›āļĩ}\n other {}\n}\n\nStripe āļˆāļ°āļŠāđˆāļ‡āļ­āļĩāđ€āļĄāļĨāđƒāļšāđ€āļŠāļĢāđ‡āļˆāđāļĒāļāļ•āđˆāļēāļ‡āļŦāļēāļāļžāļĢāđ‰āļ­āļĄāđ„āļŸāļĨāđŒ PDF āđƒāļšāđāļˆāđ‰āļ‡āļŦāļ™āļĩāđ‰āđƒāļŦāđ‰āļ„āļļāļ“āđƒāļ™āđ„āļĄāđˆāļŠāđ‰āļē āļ‹āļķāđˆāļ‡āļĢāļ§āļĄāļ–āļķāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļŠāļģāļĢāļ°āđ€āļ‡āļīāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ—āļēāļ‡āļ āļēāļĐāļĩāđ„āļ”āđ‰\n\nāļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļ›āļĢāļ°āļ§āļąāļ•āļīāļāļēāļĢāļšāļĢāļīāļˆāļēāļ„ āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđƒāļšāđāļˆāđ‰āļ‡āļŦāļ™āļĩāđ‰ {interval, select,\n month {āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļŦāļĢāļ·āļ­āļĒāļāđ€āļĨāļīāļāļāļēāļĢāļŠāļĄāļąāļ„āļĢāļŠāļĄāļēāļŠāļīāļāļ‚āļ­āļ‡āļ„āļļāļ“}\n year {āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļŦāļĢāļ·āļ­āļĒāļāđ€āļĨāļīāļāļāļēāļĢāļŠāļĄāļąāļ„āļĢāļŠāļĄāļēāļŠāļīāļāļ‚āļ­āļ‡āļ„āļļāļ“}\n other {āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āđƒāļ™āļ­āļ™āļēāļ„āļ•}\n} āđ„āļ”āđ‰āļ•āļĨāļ­āļ”āđ€āļ§āļĨāļēāđ‚āļ”āļĒāđƒāļŠāđ‰āļĨāļīāļ‡āļāđŒāļ™āļĩāđ‰:\n\n{manageUrl}\n\nāļāļēāļĢāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ‚āļ­āļ‡āļ„āļļāļ“āļŠāđˆāļ§āļĒāđƒāļŦāđ‰ {product_name} āļ”āļģāđ€āļ™āļīāļ™āļ•āđˆāļ­āđ„āļ›āđ„āļ”āđ‰ āļ‚āļ­āļšāļ„āļļāļ“!\n\n– āļ—āļĩāļĄ {product_name}"
"subject": "āļ‚āļ­āļšāļ„āļļāļ“āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āđƒāļŦāđ‰ {product_name}",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ,\n\nāļ‚āļ­āļšāļ„āļļāļ“āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āđƒāļŦāđ‰ {product_name}! {interval, select,\n month {āļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āđāļšāļšāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡}\n year {āļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āđāļšāļšāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡}\n other {āļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§}\n}āļ‚āļ­āļ‡āļ„āļļāļ“āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢ{interval, select,\n month {āļ•āļąāđ‰āļ‡āļ„āđˆāļē}\n year {āļ•āļąāđ‰āļ‡āļ„āđˆāļē}\n other {āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ}\n}āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§\n\nāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļšāļĢāļīāļˆāļēāļ„:\nāļˆāļģāļ™āļ§āļ™āđ€āļ‡āļīāļ™: {amount} {interval, select,\n month {āļ•āđˆāļ­āđ€āļ”āļ·āļ­āļ™}\n year {āļ•āđˆāļ­āļ›āļĩ}\n other {}\n}\n\nStripe āļˆāļ°āļŠāđˆāļ‡āļ­āļĩāđ€āļĄāļĨāđƒāļšāđ€āļŠāļĢāđ‡āļˆāđāļĒāļāļ•āđˆāļēāļ‡āļŦāļēāļāļžāļĢāđ‰āļ­āļĄāđ„āļŸāļĨāđŒ PDF āđƒāļšāđāļˆāđ‰āļ‡āļŦāļ™āļĩāđ‰āđƒāļŦāđ‰āļ„āļļāļ“āđƒāļ™āđ„āļĄāđˆāļŠāđ‰āļē āđƒāļšāđ€āļŠāļĢāđ‡āļˆāļ™āļĩāđ‰āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļŠāļģāļĢāļ°āđ€āļ‡āļīāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđāļĨāļ°āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ—āļēāļ‡āļ āļēāļĐāļĩāđ„āļ”āđ‰\n\nāļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļ›āļĢāļ°āļ§āļąāļ•āļīāļāļēāļĢāļšāļĢāļīāļˆāļēāļ„ āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđƒāļšāđāļˆāđ‰āļ‡āļŦāļ™āļĩāđ‰ {interval, select,\n month {āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļŦāļĢāļ·āļ­āļĒāļāđ€āļĨāļīāļāļāļēāļĢāļŠāļĄāļąāļ„āļĢāļŠāļĄāļēāļŠāļīāļāļ‚āļ­āļ‡āļ„āļļāļ“}\n year {āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļŦāļĢāļ·āļ­āļĒāļāđ€āļĨāļīāļāļāļēāļĢāļŠāļĄāļąāļ„āļĢāļŠāļĄāļēāļŠāļīāļāļ‚āļ­āļ‡āļ„āļļāļ“}\n other {āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āđƒāļ™āļ­āļ™āļēāļ„āļ•}\n} āđ„āļ”āđ‰āļ•āļĨāļ­āļ”āđ€āļ§āļĨāļēāđ‚āļ”āļĒāđƒāļŠāđ‰āļĨāļīāļ‡āļāđŒāļ™āļĩāđ‰:\n\n{manageUrl}\n\nāļāļēāļĢāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ‚āļ­āļ‡āļ„āļļāļ“āļŠāđˆāļ§āļĒāđƒāļŦāđ‰ {product_name} āļ”āļģāđ€āļ™āļīāļ™āļ•āđˆāļ­āđ„āļ›āđ„āļ”āđ‰ āļ‚āļ­āļšāļ„āļļāļ“!\n\n– āļ—āļĩāļĄ {product_name}"
},
"donation_magic_link": {
"subject": "āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļšāļĢāļīāļˆāļēāļ„ {product_name}",
"subject": "āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āđƒāļŦāđ‰ {product_name}",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ,\n\nāļ„āļĨāļīāļāļĨāļīāļ‡āļāđŒāļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļžāļ­āļĢāđŒāļ—āļąāļĨāļœāļđāđ‰āļšāļĢāļīāļˆāļēāļ„:\n\n{manageUrl}\n\nāđƒāļ™āļžāļ­āļĢāđŒāļ—āļąāļĨ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļŠāļĄāļąāļ„āļĢāļŠāļĄāļēāļŠāļīāļ āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđƒāļšāđāļˆāđ‰āļ‡āļŦāļ™āļĩāđ‰ āđāļĨāļ°āļ”āļđāļ›āļĢāļ°āļ§āļąāļ•āļīāļāļēāļĢāļšāļĢāļīāļˆāļēāļ„āļ‚āļ­āļ‡āļ„āļļāļ“āđ„āļ”āđ‰\n\nāļĨāļīāļ‡āļāđŒāļ™āļĩāđ‰āļˆāļ°āļŦāļĄāļ”āļ­āļēāļĒāļļāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆ {expiresAt, date, full} āđ€āļ§āļĨāļē {expiresAt, time, short}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­āļĨāļīāļ‡āļāđŒāļ™āļĩāđ‰ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāļāđ€āļ‰āļĒāļ•āđˆāļ­āļ­āļĩāđ€āļĄāļĨāļ™āļĩāđ‰āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒ\n\n– āļ—āļĩāļĄ {product_name}"
},
"dsa_report_verification": {
@@ -33,11 +33,11 @@ const EMAIL_I18N_TH_MESSAGES = defineEmailI18nLocaleMessages({
},
"email_change_original": {
"subject": "āļĒāļ·āļ™āļĒāļąāļ™āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ­āļĩāđ€āļĄāļĨāļŠāļģāļŦāļĢāļąāļš {product_name}",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāđ€āļĢāļēāđ„āļ”āđ‰āļĢāļąāļšāļ„āļģāļ‚āļ­āđƒāļŦāđ‰āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ­āļĩāđ€āļĄāļĨāđƒāļ™āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“\n\nāļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ™āļĩāđ‰ āđƒāļŦāđ‰āļ›āđ‰āļ­āļ™āļĢāļŦāļąāļŠāļ™āļĩāđ‰āđƒāļ™āđāļ­āļ›:\n\n{code}\n\nāļĢāļŦāļąāļŠāļ™āļĩāđ‰āļˆāļ°āļŦāļĄāļ”āļ­āļēāļĒāļļāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆ {expiresAt, date, full} āđ€āļ§āļĨāļē {expiresAt, time, short}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­ āđƒāļŦāđ‰āļĢāļĩāļšāļĢāļąāļāļĐāļēāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“\n\n– āļ—āļĩāļĄ {product_name}"
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāđ€āļĢāļēāđ„āļ”āđ‰āļĢāļąāļšāļ„āļģāļ‚āļ­āđƒāļŦāđ‰āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ­āļĩāđ€āļĄāļĨāđƒāļ™āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“\n\nāļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ™āļĩāđ‰ āđƒāļŦāđ‰āļ›āđ‰āļ­āļ™āļĢāļŦāļąāļŠāļ™āļĩāđ‰āđƒāļ™āđāļ­āļ›:\n\n{code}\n\nāļĢāļŦāļąāļŠāļ™āļĩāđ‰āļˆāļ°āļŦāļĄāļ”āļ­āļēāļĒāļļāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆ {expiresAt, date, full} āđ€āļ§āļĨāļē {expiresAt, time, short}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­ āđ‚āļ›āļĢāļ”āļĢāļąāļāļĐāļēāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļ—āļąāļ™āļ—āļĩ\n\n– āļ—āļĩāļĄ {product_name}"
},
"email_change_revert": {
"subject": "āļ­āļĩāđ€āļĄāļĨāļšāļąāļāļŠāļĩ {product_name} āļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļĨāđ‰āļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ­āļĩāđ€āļĄāļĨāđƒāļ™āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļ›āđ‡āļ™ {newEmail}\n\nāļŦāļēāļāļ„āļļāļ“āļ—āļģāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ™āļĩāđ‰ āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđƒāļ”āđ† āļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļ›āļĨāļĩāđˆāļĒāļ™ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļĒāđ‰āļ­āļ™āļāļĨāļąāļšāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđāļĨāļ°āļĢāļąāļāļĐāļēāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āđ‚āļ”āļĒāđƒāļŠāđ‰āļĨāļīāļ‡āļāđŒāļ™āļĩāđ‰:\n\n{revertUrl}\n\nāļ‹āļķāđˆāļ‡āļˆāļ°āļāļđāđ‰āļ„āļ·āļ™āļ­āļĩāđ€āļĄāļĨāļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ‚āļ­āļ‡āļ„āļļāļ“ āļ­āļ­āļāļˆāļēāļāļĢāļ°āļšāļšāļ—āļļāļāļ—āļĩāđˆ āļĨāļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡ āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™ MFA āđāļĨāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļ•āļąāđ‰āļ‡āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āđƒāļŦāļĄāđˆ\n\n– āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name}"
"subject": "āļ­āļĩāđ€āļĄāļĨāļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļĨāđ‰āļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ­āļĩāđ€āļĄāļĨāđƒāļ™āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļ›āđ‡āļ™ {newEmail}\n\nāļŦāļēāļāļ„āļļāļ“āļ—āļģāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ™āļĩāđ‰ āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđƒāļ” āđ† āļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļ›āļĨāļĩāđˆāļĒāļ™ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļĒāđ‰āļ­āļ™āļāļĨāļąāļšāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđāļĨāļ°āļĢāļąāļāļĐāļēāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āđ‚āļ”āļĒāđƒāļŠāđ‰āļĨāļīāļ‡āļāđŒāļ™āļĩāđ‰:\n\n{revertUrl}\n\nāļ‹āļķāđˆāļ‡āļˆāļ°āļāļđāđ‰āļ„āļ·āļ™āļ­āļĩāđ€āļĄāļĨāļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ‚āļ­āļ‡āļ„āļļāļ“ āļ™āļģāļ„āļļāļ“āļ­āļ­āļāļˆāļēāļāļĢāļ°āļšāļšāđƒāļ™āļ—āļļāļāļ­āļļāļ›āļāļĢāļ“āđŒ āļĨāļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡ āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™ MFA āđāļĨāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļ•āļąāđ‰āļ‡āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āđƒāļŦāļĄāđˆ\n\n– āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name}"
},
"email_verification": {
"subject": "āļĒāļ·āļ™āļĒāļąāļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ­āļĩāđ€āļĄāļĨāļŠāļģāļŦāļĢāļąāļš {product_name}",
@@ -45,27 +45,27 @@ const EMAIL_I18N_TH_MESSAGES = defineEmailI18nLocaleMessages({
},
"gift_chargeback_notification": {
"subject": "āļŠāļīāļ—āļ˜āļīāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļˆāļēāļāļ‚āļ­āļ‡āļ‚āļ§āļąāļāļ—āļĩāđˆāļ„āļļāļ“āđāļĨāļāļĢāļąāļšāļ–āļđāļāļ™āļģāļ­āļ­āļāđāļĨāđ‰āļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļĢāļŦāļąāļŠāļ‚āļ­āļ‡āļ‚āļ§āļąāļāļ—āļĩāđˆāļ„āļļāļ“āđāļĨāļāļĢāļąāļšāļ™āļąāđ‰āļ™āđ€āļ”āļīāļĄāļ—āļĩāļŠāļģāļĢāļ°āđ‚āļ”āļĒāļœāļđāđ‰āļ­āļ·āđˆāļ™ āļāļēāļĢāļŠāļģāļĢāļ°āđ€āļ‡āļīāļ™āļ”āļąāļ‡āļāļĨāđˆāļēāļ§āļ–āļđāļāļĒāļāđ€āļĨāļīāļāđƒāļ™āļ āļēāļĒāļŦāļĨāļąāļ‡ (āļāļēāļĢāđ€āļĢāļĩāļĒāļāđ€āļāđ‡āļšāđ€āļ‡āļīāļ™āļ„āļ·āļ™)\n\nāļ”āđ‰āļ§āļĒāđ€āļŦāļ•āļļāļ™āļĩāđ‰ āđ€āļĢāļēāļˆāļķāļ‡āļĨāļšāļŠāļīāļ—āļ˜āļīāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ—āļĩāđˆāđ€āļžāļīāđˆāļĄāđƒāļ™āļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļ•āļ­āļ™āļ—āļĩāđˆāļ„āļļāļ“āđāļĨāļāļĢāļąāļšāļ‚āļ­āļ‡āļ‚āļ§āļąāļ\n\nāļŦāļēāļāļ„āļļāļ“āļ„āļīāļ”āļ§āđˆāļēāļ™āļĩāđˆāđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” āđ‚āļ›āļĢāļ”āļ•āļīāļ”āļ•āđˆāļ­āļ—āļĩāļĄāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ‚āļ­āļ‡āđ€āļĢāļēāđāļĨāļ°āļĢāļ°āļšāļļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ”āđ† āļ—āļĩāđˆāļ„āļļāļ“āļĄāļĩāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļĢāļŦāļąāļŠāļ‚āļ­āļ‡āļ‚āļ§āļąāļāđāļĨāļ°āđ€āļ§āļĨāļēāļ—āļĩāđˆāļ„āļļāļ“āđāļĨāļāļĢāļąāļš\n\n– āļ—āļĩāļĄ {product_name}"
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļĢāļŦāļąāļŠāļ‚āļ­āļ‡āļ‚āļ§āļąāļāļ—āļĩāđˆāļ„āļļāļ“āđāļĨāļāļĢāļąāļšāļ™āļąāđ‰āļ™āđ€āļ”āļīāļĄāļ—āļĩāļŠāļģāļĢāļ°āđ‚āļ”āļĒāļœāļđāđ‰āļ­āļ·āđˆāļ™ āļāļēāļĢāļŠāļģāļĢāļ°āđ€āļ‡āļīāļ™āļ”āļąāļ‡āļāļĨāđˆāļēāļ§āļ–āļđāļāļĒāļāđ€āļĨāļīāļāđƒāļ™āļ āļēāļĒāļŦāļĨāļąāļ‡ (āļāļēāļĢāđ€āļĢāļĩāļĒāļāđ€āļāđ‡āļšāđ€āļ‡āļīāļ™āļ„āļ·āļ™)\n\nāļ”āđ‰āļ§āļĒāđ€āļŦāļ•āļļāļ™āļĩāđ‰ āđ€āļĢāļēāļˆāļķāļ‡āļĨāļšāļŠāļīāļ—āļ˜āļīāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ—āļĩāđˆāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļ•āļ­āļ™āļ—āļĩāđˆāļ„āļļāļ“āđāļĨāļāļĢāļąāļšāļ‚āļ­āļ‡āļ‚āļ§āļąāļ\n\nāļŦāļēāļāļ„āļļāļ“āļ„āļīāļ”āļ§āđˆāļēāļ™āļĩāđˆāđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” āđ‚āļ›āļĢāļ”āļ•āļīāļ”āļ•āđˆāļ­āļ—āļĩāļĄāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ‚āļ­āļ‡āđ€āļĢāļēāđāļĨāļ°āļĢāļ°āļšāļļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ” āđ† āļ—āļĩāđˆāļ„āļļāļ“āļĄāļĩāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļĢāļŦāļąāļŠāļ‚āļ­āļ‡āļ‚āļ§āļąāļāđāļĨāļ°āđ€āļ§āļĨāļēāļ—āļĩāđˆāļ„āļļāļ“āđāļĨāļāļĢāļąāļš\n\n– āļ—āļĩāļĄ {product_name}"
},
"harvest_completed": {
"subject": "āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļ {product_name} āļžāļĢāđ‰āļ­āļĄāđƒāļŦāđ‰āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđāļĨāđ‰āļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļ„āļļāļ“āļžāļĢāđ‰āļ­āļĄāđƒāļŦāđ‰āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđāļĨāđ‰āļ§\n\nāļĨāļīāļ‡āļāđŒāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”:\n{downloadUrl}\n\nāļˆāļģāļ™āļ§āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: {totalMessages, number}\nāļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒ: {fileSizeMB, number} MB\n\nāļĨāļīāļ‡āļāđŒāļ™āļĩāđ‰āļˆāļ°āļŦāļĄāļ”āļ­āļēāļĒāļļāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆ {expiresAt, date, full} āđ€āļ§āļĨāļē {expiresAt, time, short}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­āļāļēāļĢāļŠāđˆāļ‡āļ­āļ­āļāļ™āļĩāđ‰ āđ‚āļ›āļĢāļ”āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļ—āļąāļ™āļ—āļĩāđāļĨāļ°āļ•āļīāļ”āļ•āđˆāļ­āļ—āļĩāļĄāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ‚āļ­āļ‡āđ€āļĢāļē\n\n– āļ—āļĩāļĄ {product_name}"
"subject": "āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļŠāđˆāļ‡āļ­āļ­āļāļˆāļēāļ {product_name} āļžāļĢāđ‰āļ­āļĄāđƒāļŦāđ‰āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđāļĨāđ‰āļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļŠāđˆāļ‡āļ­āļ­āļāļ‚āļ­āļ‡āļ„āļļāļ“āļžāļĢāđ‰āļ­āļĄāđāļĨāđ‰āļ§\n\nāļĨāļīāļ‡āļāđŒāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”:\n{downloadUrl}\n\nāļˆāļģāļ™āļ§āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: {totalMessages, number}\nāļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒ: {fileSizeMB, number} MB\n\nāļĨāļīāļ‡āļāđŒāļ™āļĩāđ‰āļˆāļ°āļŦāļĄāļ”āļ­āļēāļĒāļļāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆ {expiresAt, date, full} āđ€āļ§āļĨāļē {expiresAt, time, short}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­āļāļēāļĢāļŠāđˆāļ‡āļ­āļ­āļāļ™āļĩāđ‰ āđ‚āļ›āļĢāļ”āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļ—āļąāļ™āļ—āļĩāđāļĨāļ°āļ•āļīāļ”āļ•āđˆāļ­āļ—āļĩāļĄāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ‚āļ­āļ‡āđ€āļĢāļē\n\n– āļ—āļĩāļĄ {product_name}"
},
"inactivity_warning": {
"subject": "āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļ°āļ–āļđāļāļĨāļšāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāđ€āļĢāļēāđ„āļĄāđˆāļžāļšāļāļīāļˆāļāļĢāļĢāļĄāđƒāļ™āļšāļąāļāļŠāļĩ {product_name} āļ•āļąāđ‰āļ‡āđāļ•āđˆ {lastActiveDate, date, full}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ āļēāļĒāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆ {deletionDate, date, full} āđ€āļ§āļĨāļē {deletionDate, time, short} āļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļ°āļ–āļđāļāļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™\n\nāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ—āļĩāđˆāļ™āļĩāđˆ:\n{loginUrl}\n\nāļŦāļēāļāļ„āļļāļ“āđƒāļŠāđ‰ {product_name} āđ€āļĄāļ·āđˆāļ­āđ€āļĢāđ‡āļ§āđ† āļ™āļĩāđ‰ āđ‚āļ›āļĢāļ”āļ•āļīāļ”āļ•āđˆāļ­āļ—āļĩāļĄāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ‚āļ­āļ‡āđ€āļĢāļēāļ—āļąāļ™āļ—āļĩ\n\n– āļ—āļĩāļĄ {product_name}"
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāđ€āļĢāļēāđ„āļĄāđˆāļžāļšāļāļīāļˆāļāļĢāļĢāļĄāđƒāļ™āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļ•āļąāđ‰āļ‡āđāļ•āđˆ {lastActiveDate, date, full}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ āļēāļĒāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆ {deletionDate, date, full} āđ€āļ§āļĨāļē {deletionDate, time, short} āļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļ°āļ–āļđāļāļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™\n\nāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ—āļĩāđˆāļ™āļĩāđˆ:\n{loginUrl}\n\nāļŦāļēāļāļ„āļļāļ“āđƒāļŠāđ‰ {product_name} āđ€āļĄāļ·āđˆāļ­āđ€āļĢāđ‡āļ§ āđ† āļ™āļĩāđ‰ āđ‚āļ›āļĢāļ”āļ•āļīāļ”āļ•āđˆāļ­āļ—āļĩāļĄāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ‚āļ­āļ‡āđ€āļĢāļēāļ—āļąāļ™āļ—āļĩ\n\n– āļ—āļĩāļĄ {product_name}"
},
"ip_authorization": {
"subject": "āļ­āļ™āļļāļĄāļąāļ•āļīāļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļˆāļēāļ IP āđƒāļŦāļĄāđˆ",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāđ€āļĢāļēāļ•āļĢāļ§āļˆāļžāļšāļ„āļ§āļēāļĄāļžāļĒāļēāļĒāļēāļĄāđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļēāļāļ—āļĩāđˆāļ­āļĒāļđāđˆ IP āđƒāļŦāļĄāđˆ:\n\nāļ—āļĩāđˆāļ­āļĒāļđāđˆ IP: {ipAddress}\nāļ•āļģāđāļŦāļ™āđˆāļ‡: {location}\n\nāļŦāļēāļāđ€āļ›āđ‡āļ™āļ„āļļāļ“ āđ‚āļ›āļĢāļ”āļ­āļ™āļļāļāļēāļ•āļ—āļĩāđˆāļ­āļĒāļđāđˆ IP āļ™āļĩāđ‰āđ‚āļ”āļĒāļ„āļĨāļīāļāļ—āļĩāđˆāļĨāļīāļ‡āļāđŒāļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡:\n\n{authUrl}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļžāļĒāļēāļĒāļēāļĄāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļ—āļąāļ™āļ—āļĩ\n\nāļĨāļīāļ‡āļāđŒāļ™āļĩāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āđ€āļ§āļĨāļē 30 āļ™āļēāļ—āļĩ\n\n– āļ—āļĩāļĄ {product_name}"
"subject": "āļ­āļ™āļļāļāļēāļ•āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļˆāļēāļāļ—āļĩāđˆāļ­āļĒāļđāđˆ IP āđƒāļŦāļĄāđˆ",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāđ€āļĢāļēāļ•āļĢāļ§āļˆāļžāļšāļ„āļ§āļēāļĄāļžāļĒāļēāļĒāļēāļĄāđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļēāļāļ—āļĩāđˆāļ­āļĒāļđāđˆ IP āđƒāļŦāļĄāđˆ:\n\nāļ—āļĩāđˆāļ­āļĒāļđāđˆ IP: {ipAddress}\nāļ•āļģāđāļŦāļ™āđˆāļ‡āļ—āļĩāđˆāļ•āļąāđ‰āļ‡: {location}\n\nāļŦāļēāļāđ€āļ›āđ‡āļ™āļ„āļļāļ“ āđ‚āļ›āļĢāļ”āļ­āļ™āļļāļāļēāļ•āļ—āļĩāđˆāļ­āļĒāļđāđˆ IP āļ™āļĩāđ‰āđ‚āļ”āļĒāļ„āļĨāļīāļāļ—āļĩāđˆāļĨāļīāļ‡āļāđŒāļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡:\n\n{authUrl}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļžāļĒāļēāļĒāļēāļĄāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš āđ‚āļ›āļĢāļ”āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļ—āļąāļ™āļ—āļĩ\n\nāļĨāļīāļ‡āļāđŒāļ™āļĩāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āđ€āļ§āļĨāļē 30 āļ™āļēāļ—āļĩ\n\n– āļ—āļĩāļĄ {product_name}"
},
"mfa_backup_codes_view": {
"subject": "āļĒāļ·āļ™āļĒāļąāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļŦāļąāļŠāļŠāļģāļĢāļ­āļ‡āļŠāļģāļŦāļĢāļąāļš {product_name}",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāđ€āļĢāļēāđ„āļ”āđ‰āļĢāļąāļšāļ„āļģāļ‚āļ­āđƒāļŦāđ‰āļ”āļđāļĢāļŦāļąāļŠāļŠāļģāļĢāļ­āļ‡āđƒāļ™āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“\n\nāļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ„āļģāļ‚āļ­āļ™āļĩāđ‰ āđƒāļŦāđ‰āļ›āđ‰āļ­āļ™āļĢāļŦāļąāļŠāļ™āļĩāđ‰āđƒāļ™āđāļ­āļ›:\n\n{code}\n\nāļĢāļŦāļąāļŠāļ™āļĩāđ‰āļˆāļ°āļŦāļĄāļ”āļ­āļēāļĒāļļāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆ {expiresAt, date, full} āđ€āļ§āļĨāļē {expiresAt, time, short}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­ āļ­āļēāļˆāļĄāļĩāļ„āļ™āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āđ„āļ”āđ‰ āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļ—āļąāļ™āļ—āļĩ\n\n– āļ—āļĩāļĄ {product_name}"
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāđ€āļĢāļēāđ„āļ”āđ‰āļĢāļąāļšāļ„āļģāļ‚āļ­āđƒāļŦāđ‰āļ”āļđāļĢāļŦāļąāļŠāļŠāļģāļĢāļ­āļ‡āđƒāļ™āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“\n\nāļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ„āļģāļ‚āļ­āļ™āļĩāđ‰ āđƒāļŦāđ‰āļ›āđ‰āļ­āļ™āļĢāļŦāļąāļŠāļ™āļĩāđ‰āđƒāļ™āđāļ­āļ›:\n\n{code}\n\nāļĢāļŦāļąāļŠāļ™āļĩāđ‰āļˆāļ°āļŦāļĄāļ”āļ­āļēāļĒāļļāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆ {expiresAt, date, full} āđ€āļ§āļĨāļē {expiresAt, time, short}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­ āļ­āļēāļˆāļĄāļĩāļœāļđāđ‰āļ­āļ·āđˆāļ™āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļ­āļĒāļđāđˆ āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļ—āļąāļ™āļ—āļĩ\n\n– āļ—āļĩāļĄ {product_name}"
},
"password_change_verification": {
"subject": "āļĒāļ·āļ™āļĒāļąāļ™āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļŠāļģāļŦāļĢāļąāļš {product_name}",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāđ€āļĢāļēāđ„āļ”āđ‰āļĢāļąāļšāļ„āļģāļ‚āļ­āđƒāļŦāđ‰āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āđƒāļ™āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“\n\nāļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ™āļĩāđ‰ āđƒāļŦāđ‰āļ›āđ‰āļ­āļ™āļĢāļŦāļąāļŠāļ™āļĩāđ‰āđƒāļ™āđāļ­āļ›:\n\n{code}\n\nāļĢāļŦāļąāļŠāļ™āļĩāđ‰āļˆāļ°āļŦāļĄāļ”āļ­āļēāļĒāļļāđƒāļ™āđ€āļ§āļĨāļē {expiresAt}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­ āļ­āļēāļˆāļĄāļĩāļ„āļ™āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āđ„āļ”āđ‰ āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļ—āļąāļ™āļ—āļĩāđāļĨāļ°āđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™āļŠāļ­āļ‡āļŠāļąāđ‰āļ™\n\n– āļ—āļĩāļĄ {product_name}"
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāđ€āļĢāļēāđ„āļ”āđ‰āļĢāļąāļšāļ„āļģāļ‚āļ­āđƒāļŦāđ‰āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āđƒāļ™āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“\n\nāļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ™āļĩāđ‰ āđƒāļŦāđ‰āļ›āđ‰āļ­āļ™āļĢāļŦāļąāļŠāļ™āļĩāđ‰āđƒāļ™āđāļ­āļ›:\n\n{code}\n\nāļĢāļŦāļąāļŠāļ™āļĩāđ‰āļˆāļ°āļŦāļĄāļ”āļ­āļēāļĒāļļāđƒāļ™āđ€āļ§āļĨāļē {expiresAt}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­ āļ­āļēāļˆāļĄāļĩāļœāļđāđ‰āļ­āļ·āđˆāļ™āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļ­āļĒāļđāđˆ āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļ—āļąāļ™āļ—āļĩāđāļĨāļ°āđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™āđāļšāļšāļŠāļ­āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™\n\n– āļ—āļĩāļĄ {product_name}"
},
"password_reset": {
"subject": "āļĢāļĩāđ€āļ‹āđ‡āļ•āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļŠāļģāļŦāļĢāļąāļš {product_name}",
@@ -73,23 +73,23 @@ const EMAIL_I18N_TH_MESSAGES = defineEmailI18nLocaleMessages({
},
"registration_approved": {
"subject": "āļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āļŠāļģāļŦāļĢāļąāļš {product_name} āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļīāđāļĨāđ‰āļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ‚āđˆāļēāļ§āļ”āļĩ: āļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™ {product_name} āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļīāđāļĨāđ‰āļ§\n\nāļ•āļ­āļ™āļ™āļĩāđ‰āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāđāļ­āļ› {product_name} āđ„āļ”āđ‰āļ—āļĩāđˆāļ™āļĩāđˆ:\n{channelsUrl}\n\nāļĒāļīāļ™āļ”āļĩāļ•āđ‰āļ­āļ™āļĢāļąāļšāļŠāļđāđˆāļ„āļ­āļĄāļĄāļđāļ™āļīāļ•āļĩāđ‰ {product_name}\n\n– āļ—āļĩāļĄ {product_name}"
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ‚āđˆāļēāļ§āļ”āļĩ: āļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļīāđāļĨāđ‰āļ§\n\nāļ•āļ­āļ™āļ™āļĩāđ‰āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāđāļ­āļ› {product_name} āđ„āļ”āđ‰āļ—āļĩāđˆāļ™āļĩāđˆ:\n{channelsUrl}\n\nāļĒāļīāļ™āļ”āļĩāļ•āđ‰āļ­āļ™āļĢāļąāļšāļŠāļđāđˆāļ„āļ­āļĄāļĄāļđāļ™āļīāļ•āļĩāđ‰ {product_name}\n\n– āļ—āļĩāļĄ {product_name}"
},
"report_resolved": {
"subject": "āļĢāļēāļĒāļ‡āļēāļ™āđ€āļāļĩāđˆāļĒāļ§āļāļąāļš {product_name} āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāđ‰āļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ‚āļ­āļ‡āđ€āļĢāļēāđ„āļ”āđ‰āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļēāļĒāļ‡āļēāļ™āļ‚āļ­āļ‡āļ„āļļāļ“ (ID: {reportId}) āđāļĨāđ‰āļ§{hasComment, select, yes {\n\nāļāļēāļĢāļ•āļ­āļšāļāļĨāļąāļšāļˆāļēāļāļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ:\n{publicComment}} other {}}\n\nāļ‚āļ­āļšāļ„āļļāļ“āļ—āļĩāđˆāļŠāđˆāļ§āļĒāđƒāļŦāđ‰ {product_name} āļ›āļĨāļ­āļ”āļ āļąāļĒāļŠāļģāļŦāļĢāļąāļšāļ—āļļāļāļ„āļ™ āđ€āļĢāļēāđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļāļąāļšāļĢāļēāļĒāļ‡āļēāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđāļĨāļ°āļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĄāļĩāļŠāđˆāļ§āļ™āļĢāđˆāļ§āļĄāļ‚āļ­āļ‡āļ„āļļāļ“āđƒāļ™āļ„āļ­āļĄāļĄāļđāļ™āļīāļ•āļĩāđ‰\n\nāļŦāļēāļāļ„āļļāļ“āļĄāļĩāļ„āļģāļ–āļēāļĄāļŦāļĢāļ·āļ­āļ‚āđ‰āļ­āļāļąāļ‡āļ§āļĨāđƒāļ”āđ† āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļœāļĨāļĨāļąāļžāļ˜āđŒāļ™āļĩāđ‰ āđ‚āļ›āļĢāļ”āļ•āļīāļ”āļ•āđˆāļ­ {safety_email}\n\n– āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name}"
"subject": "āļĢāļēāļĒāļ‡āļēāļ™āļ‚āļ­āļ‡āļ„āļļāļ“āđƒāļ™ {product_name} āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāđ‰āļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ‚āļ­āļ‡āđ€āļĢāļēāđ„āļ”āđ‰āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļēāļĒāļ‡āļēāļ™āļ‚āļ­āļ‡āļ„āļļāļ“ (ID: {reportId}) āđāļĨāđ‰āļ§{hasComment, select, yes {\n\nāļāļēāļĢāļ•āļ­āļšāļāļĨāļąāļšāļˆāļēāļāļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ:\n{publicComment}} other {}}\n\nāļ‚āļ­āļšāļ„āļļāļ“āļ—āļĩāđˆāļŠāđˆāļ§āļĒāđƒāļŦāđ‰ {product_name} āļ›āļĨāļ­āļ”āļ āļąāļĒāļŠāļģāļŦāļĢāļąāļšāļ—āļļāļāļ„āļ™ āđ€āļĢāļēāđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļāļąāļšāļĢāļēāļĒāļ‡āļēāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđāļĨāļ°āļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĄāļĩāļŠāđˆāļ§āļ™āļĢāđˆāļ§āļĄāļ‚āļ­āļ‡āļ„āļļāļ“āđƒāļ™āļ„āļ­āļĄāļĄāļđāļ™āļīāļ•āļĩāđ‰\n\nāļŦāļēāļāļ„āļļāļ“āļĄāļĩāļ„āļģāļ–āļēāļĄāļŦāļĢāļ·āļ­āļ‚āđ‰āļ­āļāļąāļ‡āļ§āļĨāđƒāļ” āđ† āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļœāļĨāļĨāļąāļžāļ˜āđŒāļ™āļĩāđ‰ āđ‚āļ›āļĢāļ”āļ•āļīāļ”āļ•āđˆāļ­ {safety_email}\n\n– āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name}"
},
"scheduled_deletion_notification": {
"subject": "āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļ°āļ–āļđāļāļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢ",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļšāļąāļāļŠāļĩ {product_name} āļˆāļ°āļ–āļđāļāļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢ\n\nāļāļģāļŦāļ™āļ”āļāļēāļĢāļĨāļš: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {āđ€āļŦāļ•āļļāļœāļĨ: {reason}}\n}\n\nāļ™āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļšāļąāļ‡āļ„āļąāļšāđƒāļŠāđ‰āļ—āļĩāđˆāļĢāđ‰āļēāļĒāđāļĢāļ‡ āļ‚āđ‰āļ­āļĄāļđāļĨāļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļ°āļ–āļđāļāļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢāļ•āļēāļĄāļ§āļąāļ™āļ—āļĩāđˆāļāļģāļŦāļ™āļ”\n\nāļŦāļēāļāļ„āļļāļ“āđ€āļŠāļ·āđˆāļ­āļ§āđˆāļēāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ™āļĩāđ‰āđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļĒāļ·āđˆāļ™āļ­āļļāļ—āļ˜āļĢāļ“āđŒāđ„āļ”āđ‰ āļŠāđˆāļ‡āļ­āļĩāđ€āļĄāļĨāđ„āļ›āļ—āļĩāđˆ {appeals_email} āļˆāļēāļāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ­āļĩāđ€āļĄāļĨāļ™āļĩāđ‰\n\n– āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name}"
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļ–āļđāļāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢ\n\nāļāļģāļŦāļ™āļ”āļāļēāļĢāļĨāļš: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {āđ€āļŦāļ•āļļāļœāļĨ: {reason}}\n}\n\nāļ™āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļšāļąāļ‡āļ„āļąāļšāđƒāļŠāđ‰āļ—āļĩāđˆāļĢāđ‰āļēāļĒāđāļĢāļ‡ āļ‚āđ‰āļ­āļĄāļđāļĨāļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļ°āļ–āļđāļāļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢāļ•āļēāļĄāļ§āļąāļ™āļ—āļĩāđˆāļāļģāļŦāļ™āļ”\n\nāļŦāļēāļāļ„āļļāļ“āđ€āļŠāļ·āđˆāļ­āļ§āđˆāļēāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ™āļĩāđ‰āđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļĒāļ·āđˆāļ™āļ­āļļāļ—āļ˜āļĢāļ“āđŒāđ„āļ”āđ‰ āļŠāđˆāļ‡āļ­āļĩāđ€āļĄāļĨāđ„āļ›āļ—āļĩāđˆ {appeals_email} āļˆāļēāļāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ­āļĩāđ€āļĄāļĨāļ™āļĩāđ‰\n\n– āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name}"
},
"self_deletion_scheduled": {
"subject": "āļāļģāļŦāļ™āļ”āļāļēāļĢāļĨāļšāļšāļąāļāļŠāļĩāļŠāļģāļŦāļĢāļąāļš {product_name}",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ„āļļāļ“āļĢāđ‰āļ­āļ‡āļ‚āļ­āđƒāļŦāđ‰āļĨāļšāļšāļąāļāļŠāļĩ {product_name} āļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āļ–āļđāļāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆ:\n\n{deletionDate, date, full} āđ€āļ§āļĨāļē {deletionDate, time, short}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­ āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āđ€āļžāļ·āđˆāļ­āļĒāļāđ€āļĨāļīāļāļāļēāļĢāļĨāļš āđ€āļĢāļēāļĒāļąāļ‡āđāļ™āļ°āļ™āļģāđƒāļŦāđ‰āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āđ€āļžāļ·āđˆāļ­āļĢāļąāļāļĐāļēāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļšāļąāļāļŠāļĩ\n\n– āļ—āļĩāļĄ {product_name}"
"subject": "āļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļ–āļđāļāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļĨāļšāđāļĨāđ‰āļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ„āļļāļ“āđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­āđƒāļŦāđ‰āļĨāļšāļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“ āļšāļąāļāļŠāļĩāļ™āļĩāđ‰āļ–āļđāļāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļĨāļšāļ­āļĒāđˆāļēāļ‡āļ–āļēāļ§āļĢāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆ:\n\n{deletionDate, date, full} āđ€āļ§āļĨāļē {deletionDate, time, short}\n\nāļŦāļēāļāļ„āļļāļ“āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāđ‰āļ­āļ‡āļ‚āļ­ āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļšāļąāļāļŠāļĩāļ‚āļ­āļ‡āļ„āļļāļ“āđ€āļžāļ·āđˆāļ­āļĒāļāđ€āļĨāļīāļāļāļēāļĢāļĨāļš āđ€āļĢāļēāļ‚āļ­āđāļ™āļ°āļ™āļģāđƒāļŦāđ‰āļ„āļļāļ“āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āļ”āđ‰āļ§āļĒāđ€āļžāļ·āđˆāļ­āļĢāļąāļāļĐāļēāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļšāļąāļāļŠāļĩ\n\n– āļ—āļĩāļĄ {product_name}"
},
"unban_notification": {
"subject": "āļāļēāļĢāļĢāļ°āļ‡āļąāļšāļšāļąāļāļŠāļĩāļŠāļģāļŦāļĢāļąāļš {product_name} āļ–āļđāļāļĒāļāđ€āļĨāļīāļāđāļĨāđ‰āļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ‚āđˆāļēāļ§āļ”āļĩ: āļāļēāļĢāļĢāļ°āļ‡āļąāļšāļšāļąāļāļŠāļĩ {product_name} āļ–āļđāļāļĒāļāđ€āļĨāļīāļāđāļĨāđ‰āļ§\n\n{reason, select,\n null {}\n other {āđ€āļŦāļ•āļļāļœāļĨ: {reason}}\n}\n\nāļ•āļ­āļ™āļ™āļĩāđ‰āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™ {product_name} āđ„āļ”āđ‰āļ•āļēāļĄāļ›āļāļ•āļī\n\n– āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name}"
"subject": "āļāļēāļĢāļĢāļ°āļ‡āļąāļšāļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļ–āļđāļāļĒāļāđ€āļĨāļīāļāđāļĨāđ‰āļ§",
"body": "āļŠāļ§āļąāļŠāļ”āļĩ {username},\n\nāļ‚āđˆāļēāļ§āļ”āļĩ: āļāļēāļĢāļĢāļ°āļ‡āļąāļšāļšāļąāļāļŠāļĩ {product_name} āļ‚āļ­āļ‡āļ„āļļāļ“āļ–āļđāļāļĒāļāđ€āļĨāļīāļāđāļĨāđ‰āļ§\n\n{reason, select,\n null {}\n other {āđ€āļŦāļ•āļļāļœāļĨ: {reason}}\n}\n\nāļ•āļ­āļ™āļ™āļĩāđ‰āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™ {product_name} āđ„āļ”āđ‰āļ•āļēāļĄāļ›āļāļ•āļī\n\n– āļ—āļĩāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ {product_name}"
}
});

Some files were not shown because too many files have changed in this diff Show More