mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-09 20:22:11 +09:00
Compare commits
182
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd8ed6f205 | ||
|
|
ed8c412415 | ||
|
|
12417a6942 | ||
|
|
d05f6c9aaa | ||
|
|
0ca035c547 | ||
|
|
dfd46ccc2c | ||
|
|
f6df3169ca | ||
|
|
5b280898c5 | ||
|
|
2a9e25c788 | ||
|
|
463c03fb6d | ||
|
|
153dad11e1 | ||
|
|
e2d05a44a8 | ||
|
|
30ba55bd4d | ||
|
|
9def9fbef6 | ||
|
|
fa3fd0027c | ||
|
|
7e1b934637 | ||
|
|
33a118d12a | ||
|
|
01f53a168d | ||
|
|
336b8b7dcd | ||
|
|
48d0034239 | ||
|
|
677ef8491e | ||
|
|
6a6119ed1e | ||
|
|
931327d1dc | ||
|
|
858a2d9e2b | ||
|
|
841fb7af41 | ||
|
|
08e65d41c0 | ||
|
|
f76c4dc041 | ||
|
|
f1f8ba2031 | ||
|
|
5ab8d745c0 | ||
|
|
ff62bc89a4 | ||
|
|
838bbdb5ec | ||
|
|
1c36a59b2c | ||
|
|
6730a242db | ||
|
|
e62ae77643 | ||
|
|
f4f39e6a89 | ||
|
|
00bf74cef5 | ||
|
|
c1c45d835f | ||
|
|
bbfe809bef | ||
|
|
e0843ac4f5 | ||
|
|
43741cdad8 | ||
|
|
b8e3807262 | ||
|
|
3304f01a84 | ||
|
|
2ba463235b | ||
|
|
15136fed59 | ||
|
|
6013581dd9 | ||
|
|
7a91f128e9 | ||
|
|
963ffc5550 | ||
|
|
a90991612c | ||
|
|
50ad23b760 | ||
|
|
425dab983b | ||
|
|
a0825e77c4 | ||
|
|
88038a1d5b | ||
|
|
c2c0fdb445 | ||
|
|
dcd5f09d6a | ||
|
|
590b1f36fd | ||
|
|
168ac727f1 | ||
|
|
deb86dd92e | ||
|
|
7ccec4d3b8 | ||
|
|
2f38bcdf26 | ||
|
|
f2785941aa | ||
|
|
ea9f83a443 | ||
|
|
bd6ca7290e | ||
|
|
b85e975fb5 | ||
|
|
b6e504f68c | ||
|
|
5fde6eb484 | ||
|
|
b16989d567 | ||
|
|
c9754ac11a | ||
|
|
f34e4a5115 | ||
|
|
44b3615298 | ||
|
|
211e98307d | ||
|
|
18c303abf6 | ||
|
|
7021a58090 | ||
|
|
320725a587 | ||
|
|
8450edc072 | ||
|
|
a1e2bf2c8d | ||
|
|
82b2f4ec5e | ||
|
|
c92e5d03a7 | ||
|
|
91340c5c84 | ||
|
|
045dd5d027 | ||
|
|
a21b9c4659 | ||
|
|
4b1b869802 | ||
|
|
1ab7e7dfcc | ||
|
|
31c53d2dff | ||
|
|
412a1ae79d | ||
|
|
0b2306ec3d | ||
|
|
242ed3a934 | ||
|
|
70e1ce682a | ||
|
|
7601bf98ee | ||
|
|
c7ec2a0f58 | ||
|
|
6a5e0056a8 | ||
|
|
78d105b46e | ||
|
|
c68d62b8a0 | ||
|
|
df58020f4c | ||
|
|
f052ce05aa | ||
|
|
eedfd9275f | ||
|
|
416af4bec4 | ||
|
|
108d282ddd | ||
|
|
a6103244b0 | ||
|
|
38935c83c5 | ||
|
|
c157ab5752 | ||
|
|
574a93257c | ||
|
|
ba7d8781cf | ||
|
|
3256af8d92 | ||
|
|
86043212f2 | ||
|
|
5d85e88532 | ||
|
|
e2abfd476a | ||
|
|
487febac8e | ||
|
|
a3454e8245 | ||
|
|
bf7567b768 | ||
|
|
ac3450ab32 | ||
|
|
5d034becb8 | ||
|
|
f9397d0db9 | ||
|
|
9005139dc8 | ||
|
|
d93604afa2 | ||
|
|
c4f0b2ece0 | ||
|
|
98a42f612b | ||
|
|
cc75e1318d | ||
|
|
9027cbdf3e | ||
|
|
2119e10ed5 | ||
|
|
87f3eb3c81 | ||
|
|
f9bb8bd585 | ||
|
|
bc47a724af | ||
|
|
f32356801d | ||
|
|
efd677f32b | ||
|
|
3cec27ba57 | ||
|
|
1f810ba04d | ||
|
|
522cf08e61 | ||
|
|
025c01ab13 | ||
|
|
dc41b53d60 | ||
|
|
3b552e00ef | ||
|
|
56e04e7b53 | ||
|
|
deac653a9e | ||
|
|
ed9528834d | ||
|
|
4cecbf1f43 | ||
|
|
b019f4a91f | ||
|
|
34b6ecfbd2 | ||
|
|
4ef9c4c65b | ||
|
|
3276039e41 | ||
|
|
03d1354562 | ||
|
|
964845d7a7 | ||
|
|
3bc5dd8e0f | ||
|
|
17292fd6a5 | ||
|
|
f753659899 | ||
|
|
7412ec3395 | ||
|
|
570c8776c4 | ||
|
|
910db6734b | ||
|
|
9e614026d7 | ||
|
|
b38e7c6433 | ||
|
|
83c8e91955 | ||
|
|
0532dd0440 | ||
|
|
a08615e306 | ||
|
|
f4c5fee17e | ||
|
|
c5aaf65a10 | ||
|
|
951e39da3d | ||
|
|
b693d84d2b | ||
|
|
9bbf6c513b | ||
|
|
50cec92738 | ||
|
|
c212d315f4 | ||
|
|
1861432a53 | ||
|
|
d0c6146429 | ||
|
|
550e6b05a1 | ||
|
|
5b6949170f | ||
|
|
f32bc37794 | ||
|
|
8ee2279b4b | ||
|
|
6339c3b8ad | ||
|
|
7c9274847f | ||
|
|
5d1dddc093 | ||
|
|
04481d7235 | ||
|
|
a3d6cf37cb | ||
|
|
ed10f9d323 | ||
|
|
4b278a0da8 | ||
|
|
1281045648 | ||
|
|
69c42cff90 | ||
|
|
7d56481aba | ||
|
|
91a2604e9e | ||
|
|
a9dc74a520 | ||
|
|
a9cc04d277 | ||
|
|
8cb097f954 | ||
|
|
78f783f0c4 | ||
|
|
d14998ff69 | ||
|
|
ca7ddd9272 | ||
|
|
84dcf6b8a8 |
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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/**/*
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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'] }}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
+1
-2
@@ -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",
|
||||
|
||||
@@ -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
@@ -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",
|
||||
|
||||
Vendored
+1
-6
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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"
|
||||
|
||||
@@ -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
@@ -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, ®istry);
|
||||
}
|
||||
for response in components.responses.values_mut() {
|
||||
if let openapiv3::ReferenceOr::Item(response) = response {
|
||||
relax_response(response, ®istry);
|
||||
}
|
||||
}
|
||||
for parameter in components.parameters.values_mut() {
|
||||
if let openapiv3::ReferenceOr::Item(parameter) = parameter {
|
||||
relax_parameter(parameter, ®istry);
|
||||
}
|
||||
}
|
||||
for request_body in components.request_bodies.values_mut() {
|
||||
if let openapiv3::ReferenceOr::Item(request_body) = request_body {
|
||||
relax_content(&mut request_body.content, ®istry);
|
||||
}
|
||||
}
|
||||
for header in components.headers.values_mut() {
|
||||
if let openapiv3::ReferenceOr::Item(header) = header {
|
||||
relax_parameter_format(&mut header.format, ®istry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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, ®istry);
|
||||
}
|
||||
}
|
||||
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, ®istry);
|
||||
}
|
||||
}
|
||||
if let Some(openapiv3::ReferenceOr::Item(request_body)) =
|
||||
operation.request_body.as_mut()
|
||||
{
|
||||
relax_content(&mut request_body.content, ®istry);
|
||||
}
|
||||
for response in operation
|
||||
.responses
|
||||
.responses
|
||||
.values_mut()
|
||||
.chain(operation.responses.default.iter_mut())
|
||||
{
|
||||
if let openapiv3::ReferenceOr::Item(response) = response {
|
||||
relax_response(response, ®istry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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!({})
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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! {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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", ¶ms).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", ¶ms).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, ¶ms),
|
||||
"/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)
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
Vendored
+2
-2
@@ -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:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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> = [];
|
||||
|
||||
+11
-5
@@ -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> = [];
|
||||
|
||||
@@ -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,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,
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user