workspace: reconcile latest Fluxer into the open source release and continue development there

This commit is contained in:
Hampus Kraft
2026-06-16 06:41:37 +02:00
parent ee1f27fe1a
commit fa3e852575
19032 changed files with 10716201 additions and 1865276 deletions
+23
View File
@@ -0,0 +1,23 @@
{
"name": "@pkgs/cache",
"version": "0.0.0",
"private": true,
"type": "module",
"exports": {
"./*": "./*"
},
"scripts": {
"test": "vitest run",
"test:watch": "vitest",
"typecheck": "tsgo --noEmit"
},
"dependencies": {
"@pkgs/kv_client": "workspace:*"
},
"devDependencies": {
"@types/node": "catalog:",
"@typescript/native-preview": "catalog:",
"vite-tsconfig-paths": "catalog:",
"vitest": "catalog:"
}
}
+12
View File
@@ -0,0 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
export function classifyKeyType(key: string): string {
if (key.startsWith('lock:')) return 'lock';
if (key.startsWith('bluesky:')) return 'bluesky';
if (key.includes(':session:')) return 'session';
if (key.includes(':user:')) return 'user';
if (key.includes(':guild:')) return 'guild';
if (key.includes(':channel:')) return 'channel';
if (key.includes(':ratelimit:')) return 'ratelimit';
return 'other';
}
+26
View File
@@ -0,0 +1,26 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {randomBytes} from 'node:crypto';
const LOCK_KEY_PATTERN = /^[a-zA-Z0-9:_-]+$/;
const LOCK_TOKEN_PATTERN = /^[a-z0-9]+$/;
export function validateLockKey(key: string): void {
if (!LOCK_KEY_PATTERN.test(key)) {
throw new Error('Invalid lock key format');
}
}
export function validateLockToken(token: string): void {
if (!LOCK_TOKEN_PATTERN.test(token)) {
throw new Error('Invalid lock token format');
}
}
export function generateLockToken(): string {
return randomBytes(16).toString('hex');
}
export function formatLockKey(key: string): string {
return `lock:${key}`;
}
+10
View File
@@ -0,0 +1,10 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
export interface CacheLogger {
error(obj: unknown, message: string): void;
}
export interface CacheTelemetry {
recordCounter(metric: {name: string; dimensions?: Record<string, string>}): void;
recordHistogram(metric: {name: string; valueMs: number; dimensions?: Record<string, string>}): void;
}
+20
View File
@@ -0,0 +1,20 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {CacheLogger} from '@pkgs/cache/src/CacheProviderTypes';
export function safeJsonParse<T>(value: string, logger?: CacheLogger): T | null {
try {
return JSON.parse(value);
} catch (error) {
if (logger) {
const truncatedValue = value.length > 200 ? `${value.substring(0, 200)}...` : value;
const errorMessage = error instanceof Error ? error.message : String(error);
logger.error({errorMessage, value: truncatedValue}, '[CacheProvider] JSON parse error');
}
return null;
}
}
export function serializeValue<T>(value: T): string {
return JSON.stringify(value);
}
+57
View File
@@ -0,0 +1,57 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
interface CacheMSetEntry<T> {
key: string;
value: T;
ttlSeconds?: number;
}
export abstract class ICacheService {
abstract get<T>(key: string): Promise<T | null>;
abstract set<T>(key: string, value: T, ttlSeconds?: number): Promise<void>;
abstract delete(key: string): Promise<void>;
abstract getAndDelete<T>(key: string): Promise<T | null>;
abstract exists(key: string): Promise<boolean>;
abstract expire(key: string, ttlSeconds: number): Promise<void>;
abstract ttl(key: string): Promise<number>;
abstract mget<T>(keys: Array<string>): Promise<Array<T | null>>;
abstract mset<T>(entries: Array<CacheMSetEntry<T>>): Promise<void>;
abstract deletePattern(pattern: string): Promise<number>;
abstract acquireLock(key: string, ttlSeconds: number): Promise<string | null>;
abstract releaseLock(key: string, token: string): Promise<boolean>;
abstract extendLock(key: string, token: string, ttlSeconds: number): Promise<boolean>;
abstract getAndRenewTtl<T>(key: string, newTtlSeconds: number): Promise<T | null>;
abstract publish(channel: string, message: string): Promise<void>;
abstract sadd(key: string, member: string, ttlSeconds?: number): Promise<void>;
abstract srem(key: string, member: string): Promise<void>;
abstract smembers(key: string): Promise<Set<string>>;
abstract sismember(key: string, member: string): Promise<boolean>;
async getOrSet<T>(key: string, valueFactory: () => Promise<T>, ttlSeconds?: number): Promise<T> {
const existingValue = await this.get<T>(key);
if (existingValue !== null) {
return existingValue;
}
const newValue = await valueFactory();
await this.set(key, newValue, ttlSeconds);
return newValue;
}
}
+265
View File
@@ -0,0 +1,265 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {
formatLockKey,
generateLockToken,
validateLockKey,
validateLockToken,
} from '@pkgs/cache/src/CacheLockValidation';
import {ICacheService} from '@pkgs/cache/src/ICacheService';
interface CacheEntry<T> {
value: T;
expiresAt?: number;
}
interface InMemoryProviderConfig {
maxSize?: number;
cleanupIntervalMs?: number;
}
export class InMemoryProvider extends ICacheService {
private cache = new Map<string, CacheEntry<unknown>>();
private sets = new Map<string, Set<string>>();
private locks = new Map<
string,
{
token: string;
expiresAt: number;
}
>();
private maxSize: number;
private cleanupInterval?: NodeJS.Timeout;
constructor(config: InMemoryProviderConfig = {}) {
super();
this.maxSize = config.maxSize ?? 10000;
if (config.cleanupIntervalMs) {
this.cleanupInterval = setInterval(() => this.cleanup(), config.cleanupIntervalMs);
}
}
private cleanup(): void {
const now = Date.now();
for (const [key, entry] of this.cache.entries()) {
if (entry.expiresAt && entry.expiresAt <= now) {
this.cache.delete(key);
}
}
for (const [key, lock] of this.locks.entries()) {
if (lock.expiresAt <= now) {
this.locks.delete(key);
}
}
}
private isExpired(entry: CacheEntry<unknown>): boolean {
if (!entry.expiresAt) return false;
return Date.now() >= entry.expiresAt;
}
private evictIfNeeded(): void {
if (this.cache.size >= this.maxSize) {
const firstKey = this.cache.keys().next().value;
if (firstKey !== undefined) {
this.cache.delete(firstKey);
}
}
}
async get<T>(key: string): Promise<T | null> {
const entry = this.cache.get(key) as CacheEntry<T> | undefined;
if (!entry) return null;
if (this.isExpired(entry)) {
this.cache.delete(key);
return null;
}
return entry.value;
}
async set<T>(key: string, value: T, ttlSeconds?: number): Promise<void> {
this.evictIfNeeded();
const entry: CacheEntry<T> = {
value,
expiresAt: ttlSeconds ? Date.now() + ttlSeconds * 1000 : undefined,
};
this.cache.set(key, entry);
}
async delete(key: string): Promise<void> {
this.cache.delete(key);
}
async getAndDelete<T>(key: string): Promise<T | null> {
const value = await this.get<T>(key);
if (value !== null) {
this.cache.delete(key);
}
return value;
}
async exists(key: string): Promise<boolean> {
const entry = this.cache.get(key);
if (!entry) return false;
if (this.isExpired(entry)) {
this.cache.delete(key);
return false;
}
return true;
}
async expire(key: string, ttlSeconds: number): Promise<void> {
const entry = this.cache.get(key);
if (entry && !this.isExpired(entry)) {
entry.expiresAt = Date.now() + ttlSeconds * 1000;
}
}
async ttl(key: string): Promise<number> {
const entry = this.cache.get(key);
if (!entry || this.isExpired(entry)) {
return -2;
}
if (!entry.expiresAt) {
return -1;
}
const ttlMs = entry.expiresAt - Date.now();
return Math.max(0, Math.floor(ttlMs / 1000));
}
async mget<T>(keys: Array<string>): Promise<Array<T | null>> {
const results: Array<T | null> = [];
for (const key of keys) {
results.push(await this.get<T>(key));
}
return results;
}
async mset<T>(
entries: Array<{
key: string;
value: T;
ttlSeconds?: number;
}>,
): Promise<void> {
for (const entry of entries) {
await this.set(entry.key, entry.value, entry.ttlSeconds);
}
}
async deletePattern(pattern: string): Promise<number> {
const regex = new RegExp(pattern.replace(/\*/g, '.*'));
let deletedCount = 0;
for (const key of this.cache.keys()) {
if (regex.test(key)) {
this.cache.delete(key);
deletedCount++;
}
}
return deletedCount;
}
async acquireLock(key: string, ttlSeconds: number): Promise<string | null> {
validateLockKey(key);
const lockKey = formatLockKey(key);
const existingLock = this.locks.get(lockKey);
if (existingLock && existingLock.expiresAt > Date.now()) {
return null;
}
const token = generateLockToken();
this.locks.set(lockKey, {
token,
expiresAt: Date.now() + ttlSeconds * 1000,
});
return token;
}
async releaseLock(key: string, token: string): Promise<boolean> {
validateLockKey(key);
validateLockToken(token);
const lockKey = formatLockKey(key);
const lock = this.locks.get(lockKey);
if (!lock || lock.token !== token) {
return false;
}
this.locks.delete(lockKey);
return true;
}
async extendLock(key: string, token: string, ttlSeconds: number): Promise<boolean> {
validateLockKey(key);
validateLockToken(token);
const lockKey = formatLockKey(key);
const lock = this.locks.get(lockKey);
if (!lock || lock.token !== token || lock.expiresAt <= Date.now()) {
return false;
}
this.locks.set(lockKey, {
token,
expiresAt: Date.now() + ttlSeconds * 1000,
});
return true;
}
async getAndRenewTtl<T>(key: string, newTtlSeconds: number): Promise<T | null> {
const value = await this.get<T>(key);
if (value !== null) {
await this.expire(key, newTtlSeconds);
}
return value;
}
async publish(_channel: string, _message: string): Promise<void> {
return;
}
async sadd(key: string, member: string, ttlSeconds?: number): Promise<void> {
let set = this.sets.get(key);
if (!set) {
set = new Set<string>();
this.sets.set(key, set);
}
set.add(member);
if (ttlSeconds) {
await this.set(`${key}:expiry`, {}, ttlSeconds);
}
}
async srem(key: string, member: string): Promise<void> {
const set = this.sets.get(key);
if (set) {
set.delete(member);
if (set.size === 0) {
this.sets.delete(key);
}
}
}
async smembers(key: string): Promise<Set<string>> {
const expiryExists = await this.exists(`${key}:expiry`);
if (!expiryExists && this.sets.has(key)) {
return new Set();
}
return this.sets.get(key) ?? new Set<string>();
}
async sismember(key: string, member: string): Promise<boolean> {
const set = this.sets.get(key);
if (!set) return false;
const expiryExists = await this.exists(`${key}:expiry`);
if (!expiryExists) {
return false;
}
return set.has(member);
}
destroy(): void {
if (this.cleanupInterval) {
clearInterval(this.cleanupInterval);
this.cleanupInterval = undefined;
}
this.cache.clear();
this.sets.clear();
this.locks.clear();
}
}
+232
View File
@@ -0,0 +1,232 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {classifyKeyType} from '@pkgs/cache/src/CacheKeyClassification';
import {
formatLockKey,
generateLockToken,
validateLockKey,
validateLockToken,
} from '@pkgs/cache/src/CacheLockValidation';
import type {CacheLogger, CacheTelemetry} from '@pkgs/cache/src/CacheProviderTypes';
import {safeJsonParse, serializeValue} from '@pkgs/cache/src/CacheSerialization';
import {ICacheService} from '@pkgs/cache/src/ICacheService';
import type {IKVProvider} from '@pkgs/kv_client/src/IKVProvider';
interface KVCacheProviderConfig {
client: IKVProvider;
cacheName?: string;
logger?: CacheLogger;
telemetry?: CacheTelemetry;
}
export class KVCacheProvider extends ICacheService {
private client: IKVProvider;
private cacheName: string;
private logger?: CacheLogger;
private telemetry?: CacheTelemetry;
constructor(config: KVCacheProviderConfig) {
super();
this.client = config.client;
this.cacheName = config.cacheName ?? 'kv';
this.logger = config.logger;
this.telemetry = config.telemetry;
}
private async instrumented<T>(
operation: string,
key: string,
fn: () => Promise<T>,
statusResolver?: (result: T) => string,
): Promise<T> {
const start = Date.now();
try {
const result = await fn();
const duration = Date.now() - start;
const status = statusResolver ? statusResolver(result) : 'success';
this.telemetry?.recordCounter({
name: 'cache.operation',
dimensions: {operation, cache_name: this.cacheName, status, key_type: classifyKeyType(key)},
});
this.telemetry?.recordHistogram({
name: 'cache.operation_latency',
valueMs: duration,
dimensions: {operation, cache_name: this.cacheName},
});
return result;
} catch (error) {
const duration = Date.now() - start;
this.telemetry?.recordCounter({
name: 'cache.operation',
dimensions: {operation, cache_name: this.cacheName, status: 'error', key_type: classifyKeyType(key)},
});
this.telemetry?.recordHistogram({
name: 'cache.operation_latency',
valueMs: duration,
dimensions: {operation, cache_name: this.cacheName},
});
throw error;
}
}
async get<T>(key: string): Promise<T | null> {
return this.instrumented(
'get',
key,
async () => {
const value = await this.client.get(key);
if (value == null) return null;
return safeJsonParse<T>(value, this.logger);
},
(result) => (result == null ? 'miss' : 'hit'),
);
}
async set<T>(key: string, value: T, ttlSeconds?: number): Promise<void> {
return this.instrumented('set', key, async () => {
const serialized = serializeValue(value);
if (ttlSeconds) {
await this.client.setex(key, ttlSeconds, serialized);
} else {
await this.client.set(key, serialized);
}
});
}
async delete(key: string): Promise<void> {
return this.instrumented('delete', key, async () => {
await this.client.del(key);
});
}
async getAndDelete<T>(key: string): Promise<T | null> {
const value = await this.client.getdel(key);
if (value == null) {
return null;
}
return safeJsonParse<T>(value, this.logger);
}
async exists(key: string): Promise<boolean> {
const result = await this.client.exists(key);
return result === 1;
}
async expire(key: string, ttlSeconds: number): Promise<void> {
await this.client.expire(key, ttlSeconds);
}
async ttl(key: string): Promise<number> {
return await this.client.ttl(key);
}
async mget<T>(keys: Array<string>): Promise<Array<T | null>> {
if (keys.length === 0) return [];
const values = await this.client.mget(...keys);
return values.map((value: string | null) => {
if (value == null) return null;
return safeJsonParse<T>(value, this.logger);
});
}
async mset<T>(
entries: Array<{
key: string;
value: T;
ttlSeconds?: number;
}>,
): Promise<void> {
if (entries.length === 0) return;
const withoutTtl: Array<{
key: string;
value: T;
}> = [];
const withTtl: Array<{
key: string;
value: T;
ttlSeconds: number;
}> = [];
for (const entry of entries) {
if (entry.ttlSeconds) {
withTtl.push({
key: entry.key,
value: entry.value,
ttlSeconds: entry.ttlSeconds,
});
} else {
withoutTtl.push({
key: entry.key,
value: entry.value,
});
}
}
const pipeline = this.client.pipeline();
for (const entry of withoutTtl) {
pipeline.set(entry.key, serializeValue(entry.value));
}
for (const entry of withTtl) {
pipeline.setex(entry.key, entry.ttlSeconds, serializeValue(entry.value));
}
await pipeline.exec();
}
async deletePattern(pattern: string): Promise<number> {
const keys = await this.client.scan(pattern, 1000);
if (keys.length === 0) return 0;
return await this.client.del(...keys);
}
async acquireLock(key: string, ttlSeconds: number): Promise<string | null> {
validateLockKey(key);
const token = generateLockToken();
const lockKey = formatLockKey(key);
return (await this.client.acquireLock(lockKey, token, ttlSeconds)) ? token : null;
}
async releaseLock(key: string, token: string): Promise<boolean> {
validateLockKey(key);
validateLockToken(token);
const lockKey = formatLockKey(key);
return await this.client.releaseLock(lockKey, token);
}
async extendLock(key: string, token: string, ttlSeconds: number): Promise<boolean> {
validateLockKey(key);
validateLockToken(token);
const lockKey = formatLockKey(key);
return await this.client.extendLock(lockKey, token, ttlSeconds);
}
async getAndRenewTtl<T>(key: string, newTtlSeconds: number): Promise<T | null> {
const value = await this.client.getex(key, newTtlSeconds);
if (value == null) return null;
return safeJsonParse<T>(value, this.logger);
}
async publish(channel: string, message: string): Promise<void> {
await this.client.publish(channel, message);
}
async sadd(key: string, member: string, ttlSeconds?: number): Promise<void> {
const pipeline = this.client.pipeline();
pipeline.sadd(key, member);
if (ttlSeconds) {
pipeline.expire(key, ttlSeconds);
}
await pipeline.exec();
}
async srem(key: string, member: string): Promise<void> {
await this.client.srem(key, member);
}
async smembers(key: string): Promise<Set<string>> {
const members = await this.client.smembers(key);
return new Set(members);
}
async sismember(key: string, member: string): Promise<boolean> {
const result = await this.client.sismember(key, member);
return result === 1;
}
}
+10
View File
@@ -0,0 +1,10 @@
{
"extends": "../../../tsconfigs/package.json",
"compilerOptions": {
"paths": {
"@fluxer/*": ["../../../packages/*", "../../../packages/*/src/index.ts"],
"@pkgs/*": ["../*"]
}
},
"include": ["src/**/*"]
}
+27
View File
@@ -0,0 +1,27 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import path from 'node:path';
import {fileURLToPath} from 'node:url';
import tsconfigPaths from 'vite-tsconfig-paths';
import {defineConfig} from 'vitest/config';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
export default defineConfig({
plugins: [
tsconfigPaths({
root: path.resolve(__dirname, '../..'),
}),
],
test: {
globals: true,
environment: 'node',
include: ['**/*.{test,spec}.{ts,tsx}'],
exclude: ['node_modules', 'dist'],
coverage: {
provider: 'v8',
reporter: ['text', 'json', 'html'],
exclude: ['**/*.test.tsx', '**/*.spec.tsx', 'node_modules/'],
},
},
});
+20
View File
@@ -0,0 +1,20 @@
{
"name": "@pkgs/captcha",
"version": "0.0.0",
"private": true,
"type": "module",
"exports": {
"./*": "./*"
},
"scripts": {
"typecheck": "tsgo --noEmit"
},
"dependencies": {
"@fluxer/logger": "workspace:*",
"itty-time": "catalog:"
},
"devDependencies": {
"@types/node": "catalog:",
"@typescript/native-preview": "catalog:"
}
}
@@ -0,0 +1,87 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {LoggerInterface} from '@fluxer/logger/src/LoggerInterface';
import type {ICaptchaProvider} from '@pkgs/captcha/src/ICaptchaProvider';
import {HcaptchaProvider} from '@pkgs/captcha/src/providers/HcaptchaProvider';
import type {HttpCaptchaProviderOptions} from '@pkgs/captcha/src/providers/HttpCaptchaProvider';
import type {RecaptchaProviderOptions} from '@pkgs/captcha/src/providers/RecaptchaProvider';
import {RecaptchaProvider} from '@pkgs/captcha/src/providers/RecaptchaProvider';
import {TestCaptchaProvider} from '@pkgs/captcha/src/providers/TestProvider';
import {TurnstileProvider} from '@pkgs/captcha/src/providers/TurnstileProvider';
import {UnavailableCaptchaProvider} from '@pkgs/captcha/src/providers/UnavailableCaptchaProvider';
interface BaseCaptchaProviderFactoryParams {
logger?: LoggerInterface;
}
interface CreateUnavailableCaptchaProviderParams extends BaseCaptchaProviderFactoryParams {
mode: 'unavailable';
}
interface CreateTestCaptchaProviderParams extends BaseCaptchaProviderFactoryParams {
mode: 'test';
}
interface CreateHcaptchaProviderParams extends BaseCaptchaProviderFactoryParams {
mode: 'hcaptcha';
secretKey: string;
timeoutMs?: number;
userAgent?: string;
fetchFn?: typeof fetch;
}
interface CreateTurnstileProviderParams extends BaseCaptchaProviderFactoryParams {
mode: 'turnstile';
secretKey: string;
timeoutMs?: number;
userAgent?: string;
fetchFn?: typeof fetch;
}
interface CreateRecaptchaProviderParams extends BaseCaptchaProviderFactoryParams {
mode: 'recaptcha';
secretKey: string;
minimumScore?: number;
timeoutMs?: number;
userAgent?: string;
fetchFn?: typeof fetch;
}
type CreateCaptchaProviderParams =
| CreateUnavailableCaptchaProviderParams
| CreateTestCaptchaProviderParams
| CreateHcaptchaProviderParams
| CreateTurnstileProviderParams
| CreateRecaptchaProviderParams;
function buildHttpOptions(
params: CreateHcaptchaProviderParams | CreateTurnstileProviderParams | CreateRecaptchaProviderParams,
): HttpCaptchaProviderOptions {
return {
secretKey: params.secretKey,
logger: params.logger,
timeoutMs: params.timeoutMs,
userAgent: params.userAgent,
fetchFn: params.fetchFn,
};
}
export function createCaptchaProvider(params: CreateCaptchaProviderParams): ICaptchaProvider {
if (params.mode === 'test') {
return new TestCaptchaProvider();
}
if (params.mode === 'hcaptcha') {
return new HcaptchaProvider(buildHttpOptions(params));
}
if (params.mode === 'turnstile') {
return new TurnstileProvider(buildHttpOptions(params));
}
if (params.mode === 'recaptcha') {
const options: RecaptchaProviderOptions = {
...buildHttpOptions(params),
minimumScore: params.minimumScore,
};
return new RecaptchaProvider(options);
}
return new UnavailableCaptchaProvider();
}
@@ -0,0 +1,13 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
export interface VerifyCaptchaParams {
token: string;
remoteIp?: string;
}
export type CaptchaProviderType = 'hcaptcha' | 'recaptcha' | 'turnstile' | 'test' | 'unavailable';
export interface ICaptchaProvider {
readonly type: CaptchaProviderType;
verify(params: VerifyCaptchaParams): Promise<boolean>;
}
@@ -0,0 +1,10 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {CaptchaProviderType} from '@pkgs/captcha/src/ICaptchaProvider';
import {HttpCaptchaProvider} from '@pkgs/captcha/src/providers/HttpCaptchaProvider';
export class HcaptchaProvider extends HttpCaptchaProvider {
readonly type: CaptchaProviderType = 'hcaptcha';
protected readonly verifyUrl = 'https://api.hcaptcha.com/siteverify';
protected readonly providerName = 'hCaptcha';
}
@@ -0,0 +1,83 @@
// 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 {ms} from 'itty-time';
const DEFAULT_USER_AGENT = 'Mozilla/5.0 (compatible; Fluxerbot/1.0; +https://fluxer.app)';
const DEFAULT_TIMEOUT = ms('10 seconds');
export interface HttpCaptchaProviderOptions {
secretKey: string;
logger?: LoggerInterface;
timeoutMs?: number;
userAgent?: string;
fetchFn?: typeof fetch;
}
interface CaptchaVerifyResponse {
success: boolean;
'error-codes'?: Array<string>;
hostname?: string;
challenge_ts?: string;
}
export abstract class HttpCaptchaProvider implements ICaptchaProvider {
abstract readonly type: CaptchaProviderType;
protected readonly secretKey: string;
protected readonly logger: LoggerInterface | undefined;
protected readonly timeoutMs: number;
protected readonly userAgent: string;
protected readonly fetchFn: typeof fetch;
protected abstract readonly verifyUrl: string;
protected abstract readonly providerName: string;
constructor(options: HttpCaptchaProviderOptions) {
this.secretKey = options.secretKey;
this.logger = options.logger;
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT;
this.userAgent = options.userAgent ?? DEFAULT_USER_AGENT;
this.fetchFn = options.fetchFn ?? fetch;
}
async verify({token, remoteIp}: VerifyCaptchaParams): Promise<boolean> {
try {
const body = new URLSearchParams();
body.append('secret', this.secretKey);
body.append('response', token);
if (remoteIp) {
body.append('remoteip', remoteIp);
}
const response = await this.fetchFn(this.verifyUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': this.userAgent,
},
body: body.toString(),
signal: AbortSignal.timeout(this.timeoutMs),
});
if (!response.ok) {
this.logger?.error({status: response.status}, `${this.providerName} verify request failed`);
return false;
}
const data = (await response.json()) as CaptchaVerifyResponse;
if (!data.success) {
this.logger?.warn({errorCodes: data['error-codes']}, `${this.providerName} verification failed`);
return false;
}
return this.validateResponse(data);
} catch (error) {
if (error instanceof Error && error.name === 'TimeoutError') {
this.logger?.error({}, `${this.providerName} verification timed out after ${this.timeoutMs}ms`);
} else {
this.logger?.error({error}, `Error verifying ${this.providerName} token`);
}
return false;
}
}
protected validateResponse(_data: CaptchaVerifyResponse): boolean {
return true;
}
}
@@ -0,0 +1,40 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {CaptchaProviderType} from '@pkgs/captcha/src/ICaptchaProvider';
import type {HttpCaptchaProviderOptions} from '@pkgs/captcha/src/providers/HttpCaptchaProvider';
import {HttpCaptchaProvider} from '@pkgs/captcha/src/providers/HttpCaptchaProvider';
const DEFAULT_MINIMUM_SCORE = 0.5;
interface RecaptchaVerifyResponse {
success: boolean;
'error-codes'?: Array<string>;
score?: number;
}
export interface RecaptchaProviderOptions extends HttpCaptchaProviderOptions {
minimumScore?: number;
}
export class RecaptchaProvider extends HttpCaptchaProvider {
readonly type: CaptchaProviderType = 'recaptcha';
protected readonly verifyUrl = 'https://www.google.com/recaptcha/api/siteverify';
protected readonly providerName = 'reCAPTCHA';
private readonly minimumScore: number;
constructor(options: RecaptchaProviderOptions) {
super(options);
this.minimumScore = options.minimumScore ?? DEFAULT_MINIMUM_SCORE;
}
protected override validateResponse(data: RecaptchaVerifyResponse): boolean {
if (data.score !== undefined && data.score < this.minimumScore) {
this.logger?.warn(
{score: data.score, minimumScore: this.minimumScore},
'reCAPTCHA score below minimum threshold',
);
return false;
}
return true;
}
}
@@ -0,0 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {CaptchaProviderType, ICaptchaProvider, VerifyCaptchaParams} from '@pkgs/captcha/src/ICaptchaProvider';
export class TestCaptchaProvider implements ICaptchaProvider {
readonly type: CaptchaProviderType = 'test';
async verify(_params: VerifyCaptchaParams): Promise<boolean> {
return true;
}
}
@@ -0,0 +1,10 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {CaptchaProviderType} from '@pkgs/captcha/src/ICaptchaProvider';
import {HttpCaptchaProvider} from '@pkgs/captcha/src/providers/HttpCaptchaProvider';
export class TurnstileProvider extends HttpCaptchaProvider {
readonly type: CaptchaProviderType = 'turnstile';
protected readonly verifyUrl = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
protected readonly providerName = 'Turnstile';
}
@@ -0,0 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {CaptchaProviderType, ICaptchaProvider, VerifyCaptchaParams} from '@pkgs/captcha/src/ICaptchaProvider';
export class UnavailableCaptchaProvider implements ICaptchaProvider {
readonly type: CaptchaProviderType = 'unavailable';
async verify(_params: VerifyCaptchaParams): Promise<boolean> {
return true;
}
}
+10
View File
@@ -0,0 +1,10 @@
{
"extends": "../../../tsconfigs/package.json",
"compilerOptions": {
"paths": {
"@fluxer/*": ["../../../packages/*", "../../../packages/*/src/index.ts"],
"@pkgs/*": ["../*"]
}
},
"include": ["src/**/*"]
}
+19
View File
@@ -0,0 +1,19 @@
{
"name": "@pkgs/cassandra",
"version": "0.0.0",
"private": true,
"type": "module",
"exports": {
"./*": "./*"
},
"scripts": {
"typecheck": "tsgo --noEmit"
},
"dependencies": {
"cassandra-driver": "catalog:"
},
"devDependencies": {
"@types/node": "catalog:",
"@typescript/native-preview": "catalog:"
}
}
@@ -0,0 +1,23 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {types} from 'cassandra-driver';
export type CassandraValue =
| string
| number
| bigint
| boolean
| Buffer
| Date
| types.LocalDate
| Set<unknown>
| Map<unknown, unknown>
| Array<unknown>
| Record<string, unknown>
| null;
export type CassandraParams = Record<string, CassandraValue>;
export interface PreparedQuery<P extends CassandraParams = CassandraParams> {
cql: string;
params: P;
}
+183
View File
@@ -0,0 +1,183 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {CassandraParams, PreparedQuery} from '@pkgs/cassandra/src/CassandraTypes';
import {type Logger, NoopLogger} from '@pkgs/cassandra/src/Logger';
import cassandra from 'cassandra-driver';
const distance = cassandra.types.distance;
interface CassandraConfig {
hosts: Array<string>;
port?: number | undefined;
keyspace: string;
localDc: string;
username?: string | undefined;
password?: string | undefined;
}
interface CassandraClientOptions {
logger?: Logger | undefined;
}
export interface CassandraExecuteOptions {
prepare?: boolean | undefined;
}
export interface CassandraBatchOptions {
prepare?: boolean | undefined;
}
export interface ICassandraClient {
connect(): Promise<void>;
shutdown(): Promise<void>;
isConnected(): boolean;
execute<P extends CassandraParams>(
query: PreparedQuery<P>,
options?: CassandraExecuteOptions,
): Promise<cassandra.types.ResultSet>;
batch(queries: Array<PreparedQuery>, options?: CassandraBatchOptions): Promise<void>;
getNativeClient(): cassandra.Client;
setLogger(logger: Logger): void;
}
interface DefaultClientState {
client: CassandraClient | null;
logger: Logger;
}
const defaultClientState: DefaultClientState = {
client: null,
logger: NoopLogger,
};
class CassandraClient implements ICassandraClient {
private readonly config: CassandraConfig;
private logger: Logger;
private client: cassandra.Client | null;
public constructor(config: CassandraConfig, options: CassandraClientOptions = {}) {
this.config = {
hosts: [...config.hosts],
port: config.port,
keyspace: config.keyspace,
localDc: config.localDc,
username: config.username,
password: config.password,
};
this.logger = options.logger ?? NoopLogger;
this.client = null;
}
public async connect(): Promise<void> {
if (this.client !== null) {
return;
}
const authProvider = this.config.username
? new cassandra.auth.PlainTextAuthProvider(this.config.username, this.config.password ?? '')
: undefined;
const client = new cassandra.Client({
contactPoints: this.config.hosts,
keyspace: this.config.keyspace,
localDataCenter: this.config.localDc,
protocolOptions: {
port: this.config.port ?? 9042,
},
pooling: {
maxRequestsPerConnection: 32768,
coreConnectionsPerHost: {
[distance.local]: 4,
[distance.remote]: 2,
},
},
encoding: {
map: Map,
set: Set,
useBigIntAsLong: true,
useBigIntAsVarint: true,
},
...(authProvider ? {authProvider} : {}),
});
await client.connect();
this.client = client;
this.logger.info(
{
hosts: this.config.hosts,
keyspace: this.config.keyspace,
local_dc: this.config.localDc,
},
'Connected to Cassandra',
);
}
public async shutdown(): Promise<void> {
if (this.client === null) {
return;
}
const activeClient = this.client;
this.client = null;
await activeClient.shutdown();
this.logger.info({}, 'Cassandra connection closed');
}
public isConnected(): boolean {
return this.client !== null;
}
public async execute<P extends CassandraParams>(
query: PreparedQuery<P>,
options: CassandraExecuteOptions = {},
): Promise<cassandra.types.ResultSet> {
return this.getNativeClient().execute(query.cql, query.params, {
prepare: options.prepare ?? true,
});
}
public async batch(queries: Array<PreparedQuery>, options: CassandraBatchOptions = {}): Promise<void> {
if (queries.length === 0) {
return;
}
const batch = queries.map((query) => ({query: query.cql, params: query.params}));
await this.getNativeClient().batch(batch, {
prepare: options.prepare ?? true,
});
}
public getNativeClient(): cassandra.Client {
if (this.client === null) {
throw new Error('Cassandra client is not connected. Call connect() first.');
}
return this.client;
}
public setLogger(logger: Logger): void {
this.logger = logger;
}
}
export async function initCassandra(config: CassandraConfig): Promise<void> {
if (defaultClientState.client !== null) {
await defaultClientState.client.shutdown();
}
const client = new CassandraClient(config, {logger: defaultClientState.logger});
await client.connect();
defaultClientState.client = client;
}
export async function shutdownCassandra(): Promise<void> {
if (defaultClientState.client === null) {
return;
}
await defaultClientState.client.shutdown();
defaultClientState.client = null;
}
export function getDefaultCassandraClient(): ICassandraClient {
if (defaultClientState.client === null) {
throw new Error('Cassandra client is not initialized. Call initCassandra() first.');
}
return defaultClientState.client;
}
export function getClient(): cassandra.Client {
return getDefaultCassandraClient().getNativeClient();
}
+13
View File
@@ -0,0 +1,13 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
export interface Logger {
info(context: Record<string, unknown>, message: string): void;
debug(context: Record<string, unknown>, message: string): void;
error(context: Record<string, unknown>, message: string): void;
}
export const NoopLogger: Logger = {
info(): void {},
debug(): void {},
error(): void {},
};
+10
View File
@@ -0,0 +1,10 @@
{
"extends": "../../../tsconfigs/package.json",
"compilerOptions": {
"paths": {
"@fluxer/*": ["../../../packages/*", "../../../packages/*/src/index.ts"],
"@pkgs/*": ["../*"]
}
},
"include": ["src/**/*"]
}
@@ -0,0 +1,20 @@
{
"name": "@pkgs/elasticsearch_search",
"version": "0.0.0",
"private": true,
"type": "module",
"exports": {
"./*": "./*"
},
"scripts": {
"typecheck": "tsgo --noEmit"
},
"dependencies": {
"@elastic/elasticsearch": "catalog:",
"@fluxer/schema": "workspace:*"
},
"devDependencies": {
"@types/node": "catalog:",
"@typescript/native-preview": "catalog:"
}
}
@@ -0,0 +1,27 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {Client} from '@elastic/elasticsearch';
export interface ElasticsearchClientConfig {
node: string;
auth?: {
apiKey?: string;
username?: string;
password?: string;
};
requestTimeoutMs: number;
tlsRejectUnauthorized?: boolean;
}
export function createElasticsearchClient(config: ElasticsearchClientConfig): Client {
return new Client({
node: config.node,
auth: config.auth?.apiKey
? {apiKey: config.auth.apiKey}
: config.auth?.username
? {username: config.auth.username, password: config.auth.password ?? ''}
: undefined,
requestTimeout: config.requestTimeoutMs,
tls: config.tlsRejectUnauthorized === false ? {rejectUnauthorized: false} : undefined,
});
}
@@ -0,0 +1,46 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
export type ElasticsearchFilter = Record<string, unknown>;
interface ElasticsearchRangeOptions {
gte?: number;
lte?: number;
gt?: number;
lt?: number;
}
export function esTermFilter(field: string, value: string | number | boolean): ElasticsearchFilter {
return {term: {[field]: value}};
}
export function esTermsFilter(field: string, values: Array<string | number | boolean>): ElasticsearchFilter {
return {terms: {[field]: values}};
}
export function esRangeFilter(field: string, opts: ElasticsearchRangeOptions): ElasticsearchFilter {
return {range: {[field]: opts}};
}
export function esExistsFilter(field: string): ElasticsearchFilter {
return {exists: {field}};
}
export function esNotExistsFilter(field: string): ElasticsearchFilter {
return {bool: {must_not: [{exists: {field}}]}};
}
function esMustNotTerm(field: string, value: string | number | boolean): ElasticsearchFilter {
return {bool: {must_not: [{term: {[field]: value}}]}};
}
export function esAndTerms(field: string, values: Array<string | number | boolean>): Array<ElasticsearchFilter> {
return values.map((v) => esTermFilter(field, v));
}
export function esExcludeAny(field: string, values: Array<string | number | boolean>): Array<ElasticsearchFilter> {
return values.map((v) => esMustNotTerm(field, v));
}
export function compactFilters(filters: Array<ElasticsearchFilter | undefined>): Array<ElasticsearchFilter> {
return filters.filter((f): f is ElasticsearchFilter => f !== undefined);
}
@@ -0,0 +1,215 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
type ElasticsearchFieldType = 'text' | 'keyword' | 'boolean' | 'long' | 'integer' | 'date' | 'float';
export type FluxerSearchIndexName = 'messages' | 'guilds' | 'users' | 'reports' | 'audit_logs' | 'guild_members';
export interface ElasticsearchFieldMapping {
type: ElasticsearchFieldType;
index?: boolean;
analyzer?: string;
search_analyzer?: string;
fields?: Record<string, ElasticsearchFieldMapping>;
}
export interface ElasticsearchIndexSettings {
number_of_shards?: number;
number_of_replicas?: number;
analysis?: Record<string, unknown>;
}
export interface ElasticsearchIndexDefinition {
indexName: FluxerSearchIndexName;
mappings: {
properties: Record<string, ElasticsearchFieldMapping>;
};
settings?: ElasticsearchIndexSettings;
}
const GUILD_DISCOVERY_ANALYSIS: Record<string, unknown> = {
analyzer: {
discovery_folding: {
type: 'custom',
tokenizer: 'standard',
filter: ['lowercase', 'asciifolding'],
},
},
};
function discoveryText(): ElasticsearchFieldMapping {
return {
type: 'text',
analyzer: 'discovery_folding',
search_analyzer: 'discovery_folding',
fields: {keyword: {type: 'keyword'}},
};
}
function textWithKeyword(): ElasticsearchFieldMapping {
return {type: 'text', fields: {keyword: {type: 'keyword'}}};
}
function keyword(): ElasticsearchFieldMapping {
return {type: 'keyword'};
}
function bool(): ElasticsearchFieldMapping {
return {type: 'boolean'};
}
function long(): ElasticsearchFieldMapping {
return {type: 'long'};
}
function integer(): ElasticsearchFieldMapping {
return {type: 'integer'};
}
export const ELASTICSEARCH_INDEX_DEFINITIONS: Record<FluxerSearchIndexName, ElasticsearchIndexDefinition> = {
messages: {
indexName: 'messages',
mappings: {
properties: {
id: keyword(),
channelId: keyword(),
guildId: keyword(),
authorId: keyword(),
authorType: keyword(),
content: textWithKeyword(),
createdAt: long(),
editedAt: long(),
isPinned: bool(),
mentionedUserIds: keyword(),
mentionEveryone: bool(),
hasLink: bool(),
hasEmbed: bool(),
hasPoll: bool(),
hasFile: bool(),
hasVideo: bool(),
hasImage: bool(),
hasSound: bool(),
hasSticker: bool(),
hasForward: bool(),
embedTypes: keyword(),
embedProviders: keyword(),
embedContent: {type: 'text'},
linkHostnames: keyword(),
attachmentFilenames: keyword(),
attachmentExtensions: keyword(),
},
},
},
guilds: {
indexName: 'guilds',
settings: {analysis: GUILD_DISCOVERY_ANALYSIS},
mappings: {
properties: {
id: keyword(),
ownerId: keyword(),
name: discoveryText(),
vanityUrlCode: discoveryText(),
discoveryDescription: discoveryText(),
discoveryTags: discoveryText(),
discoveryPrimaryLanguage: keyword(),
iconHash: keyword(),
bannerHash: keyword(),
splashHash: keyword(),
features: keyword(),
verificationLevel: integer(),
mfaLevel: integer(),
nsfwLevel: integer(),
createdAt: long(),
memberCount: integer(),
discoveryCategory: integer(),
isDiscoverable: bool(),
},
},
},
users: {
indexName: 'users',
mappings: {
properties: {
id: keyword(),
username: textWithKeyword(),
email: textWithKeyword(),
phone: textWithKeyword(),
discriminator: integer(),
isBot: bool(),
isSystem: bool(),
flags: keyword(),
premiumType: integer(),
emailVerified: bool(),
emailBounced: bool(),
suspiciousActivityFlags: integer(),
acls: keyword(),
createdAt: long(),
lastActiveAt: long(),
tempBannedUntil: long(),
pendingDeletionAt: long(),
stripeSubscriptionId: keyword(),
stripeCustomerId: keyword(),
},
},
},
reports: {
indexName: 'reports',
mappings: {
properties: {
id: keyword(),
reporterId: keyword(),
reportedAt: long(),
status: integer(),
reportType: integer(),
category: textWithKeyword(),
additionalInfo: textWithKeyword(),
reportedUserId: keyword(),
reportedGuildId: keyword(),
reportedGuildName: textWithKeyword(),
reportedMessageId: keyword(),
reportedChannelId: keyword(),
reportedChannelName: textWithKeyword(),
guildContextId: keyword(),
resolvedAt: long(),
resolvedByAdminId: keyword(),
publicComment: keyword(),
createdAt: long(),
},
},
},
audit_logs: {
indexName: 'audit_logs',
mappings: {
properties: {
id: keyword(),
logId: keyword(),
adminUserId: keyword(),
targetType: textWithKeyword(),
targetId: textWithKeyword(),
action: textWithKeyword(),
auditLogReason: textWithKeyword(),
createdAt: long(),
},
},
},
guild_members: {
indexName: 'guild_members',
mappings: {
properties: {
id: keyword(),
guildId: keyword(),
userId: textWithKeyword(),
username: textWithKeyword(),
usernameSearch: textWithKeyword(),
discriminator: textWithKeyword(),
globalName: textWithKeyword(),
nickname: textWithKeyword(),
roleIds: keyword(),
joinedAt: long(),
joinSourceType: integer(),
sourceInviteCode: keyword(),
inviterId: keyword(),
userCreatedAt: long(),
isBot: bool(),
},
},
},
};
@@ -0,0 +1,44 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
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';
function buildAuditLogFilters(filters: AuditLogSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
if (filters.adminUserId) clauses.push(esTermFilter('adminUserId', filters.adminUserId));
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));
return compactFilters(clauses);
}
function buildAuditLogSort(filters: AuditLogSearchFilters): Array<SortCombinations> | undefined {
const sortBy = filters.sortBy ?? 'createdAt';
if (sortBy === 'relevance') return undefined;
const sortOrder = filters.sortOrder ?? 'desc';
return [{createdAt: {order: sortOrder}}];
}
export interface ElasticsearchAuditLogAdapterOptions {
client: Client;
lock?: ElasticsearchDistributedLock;
}
export class ElasticsearchAuditLogAdapter extends ElasticsearchIndexAdapter<AuditLogSearchFilters, SearchableAuditLog> {
constructor(options: ElasticsearchAuditLogAdapterOptions) {
super({
client: options.client,
index: ELASTICSEARCH_INDEX_DEFINITIONS.audit_logs,
searchableFields: ['action', 'targetType', 'targetId', 'auditLogReason'],
buildFilters: buildAuditLogFilters,
buildSort: buildAuditLogSort,
lock: options.lock,
});
}
}
@@ -0,0 +1,56 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
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';
function buildGuildFilters(filters: GuildSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
if (filters.ownerId) clauses.push(esTermFilter('ownerId', filters.ownerId));
if (filters.verificationLevel !== undefined)
clauses.push(esTermFilter('verificationLevel', filters.verificationLevel));
if (filters.mfaLevel !== undefined) clauses.push(esTermFilter('mfaLevel', filters.mfaLevel));
if (filters.nsfwLevel !== undefined) clauses.push(esTermFilter('nsfwLevel', filters.nsfwLevel));
if (filters.hasFeature && filters.hasFeature.length > 0) {
clauses.push(...esAndTerms('features', filters.hasFeature));
}
if (filters.isDiscoverable !== undefined) clauses.push(esTermFilter('isDiscoverable', filters.isDiscoverable));
if (filters.discoveryCategory !== undefined)
clauses.push(esTermFilter('discoveryCategory', filters.discoveryCategory));
if (filters.discoveryPrimaryLanguage !== undefined)
clauses.push(esTermFilter('discoveryPrimaryLanguage', filters.discoveryPrimaryLanguage));
if (filters.discoveryTag !== undefined && filters.discoveryTag.length > 0)
clauses.push(esTermFilter('discoveryTags.keyword', filters.discoveryTag.toLowerCase()));
return compactFilters(clauses);
}
function buildGuildSort(filters: GuildSearchFilters): Array<SortCombinations> | undefined {
const sortBy = filters.sortBy ?? 'createdAt';
if (sortBy === 'relevance') return undefined;
const sortOrder = filters.sortOrder ?? 'desc';
return [{[sortBy]: {order: sortOrder}}];
}
export interface ElasticsearchGuildAdapterOptions {
client: Client;
lock?: ElasticsearchDistributedLock;
}
export class ElasticsearchGuildAdapter extends ElasticsearchIndexAdapter<GuildSearchFilters, SearchableGuild> {
constructor(options: ElasticsearchGuildAdapterOptions) {
super({
client: options.client,
index: ELASTICSEARCH_INDEX_DEFINITIONS.guilds,
searchableFields: ['name^10', 'discoveryTags^5', 'vanityUrlCode^3', 'discoveryDescription'],
searchType: 'bool_prefix',
buildFilters: buildGuildFilters,
buildSort: buildGuildSort,
lock: options.lock,
});
}
}
@@ -0,0 +1,64 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {Client} from '@elastic/elasticsearch';
import type {SortCombinations} from '@elastic/elasticsearch/lib/api/types';
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';
function buildGuildMemberFilters(filters: GuildMemberSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
clauses.push(esTermFilter('guildId', filters.guildId));
if (filters.roleIds && filters.roleIds.length > 0) {
clauses.push(...esAndTerms('roleIds', filters.roleIds));
}
if (filters.joinedAtGte !== undefined) clauses.push(esRangeFilter('joinedAt', {gte: filters.joinedAtGte}));
if (filters.joinedAtLte !== undefined) clauses.push(esRangeFilter('joinedAt', {lte: filters.joinedAtLte}));
if (filters.joinSourceType && filters.joinSourceType.length > 0) {
clauses.push(esTermsFilter('joinSourceType', filters.joinSourceType));
}
if (filters.sourceInviteCode && filters.sourceInviteCode.length > 0) {
clauses.push(esTermsFilter('sourceInviteCode', filters.sourceInviteCode));
}
if (filters.userCreatedAtGte !== undefined)
clauses.push(esRangeFilter('userCreatedAt', {gte: filters.userCreatedAtGte}));
if (filters.userCreatedAtLte !== undefined)
clauses.push(esRangeFilter('userCreatedAt', {lte: filters.userCreatedAtLte}));
if (filters.isBot !== undefined) clauses.push(esTermFilter('isBot', filters.isBot));
return compactFilters(clauses);
}
function buildGuildMemberSort(filters: GuildMemberSearchFilters): Array<SortCombinations> | undefined {
const sortBy = filters.sortBy ?? 'joinedAt';
if (sortBy === 'relevance') return undefined;
const sortOrder = filters.sortOrder ?? 'desc';
return [{[sortBy]: {order: sortOrder}}];
}
export interface ElasticsearchGuildMemberAdapterOptions {
client: Client;
lock?: ElasticsearchDistributedLock;
}
export class ElasticsearchGuildMemberAdapter extends ElasticsearchIndexAdapter<
GuildMemberSearchFilters,
SearchableGuildMember
> {
constructor(options: ElasticsearchGuildMemberAdapterOptions) {
super({
client: options.client,
index: ELASTICSEARCH_INDEX_DEFINITIONS.guild_members,
searchableFields: ['username', 'usernameSearch', 'discriminator', 'globalName', 'nickname', 'userId'],
searchType: 'bool_prefix',
buildFilters: buildGuildMemberFilters,
buildSort: buildGuildMemberSort,
lock: options.lock,
});
}
}
@@ -0,0 +1,453 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {Client} from '@elastic/elasticsearch';
import type {SearchRequest, SortCombinations, 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';
const ELASTICSEARCH_MAX_RESULT_WINDOW = 10000;
const DEEP_PAGINATION_BATCH_SIZE = 1000;
const MAX_SEARCH_LIMIT = 1000;
interface ElasticsearchSearchHit<TResult> {
_source?: TResult;
_id?: string;
sort?: SortResults;
}
interface ElasticsearchSearchResponse<TResult> {
hits: {
total?:
| number
| {
value?: number;
};
hits: Array<ElasticsearchSearchHit<TResult>>;
};
}
type ElasticsearchBaseSearchRequest = Omit<SearchRequest, 'from' | 'search_after' | 'size' | 'track_total_hits'>;
export interface ElasticsearchDistributedLock {
acquireLock(key: string, ttlSeconds: number): Promise<string | null>;
releaseLock(key: string, token: string): Promise<boolean>;
}
interface ElasticsearchIndexAdapterOptions<TFilters> {
client: Client;
index: ElasticsearchIndexDefinition;
searchableFields: Array<string>;
searchType?: 'best_fields' | 'bool_prefix';
fuzziness?: string;
minimumShouldMatch?: string;
buildFilters: (filters: TFilters) => Array<ElasticsearchFilter | undefined>;
buildSort?: (filters: TFilters) => Array<SortCombinations> | undefined;
lock?: ElasticsearchDistributedLock;
}
export class ElasticsearchIndexAdapter<
TFilters,
TResult extends {
id: string;
},
> implements ISearchAdapter<TFilters, TResult>
{
protected readonly client: Client;
protected readonly indexDefinition: ElasticsearchIndexDefinition;
protected readonly searchableFields: Array<string>;
protected readonly searchType: 'best_fields' | 'bool_prefix';
protected readonly fuzziness: string | undefined;
protected readonly minimumShouldMatch: string | undefined;
protected readonly buildFilters: (filters: TFilters) => Array<ElasticsearchFilter | undefined>;
protected readonly buildSort: ((filters: TFilters) => Array<SortCombinations> | undefined) | undefined;
private readonly lock: ElasticsearchDistributedLock | undefined;
private initialized = false;
constructor(options: ElasticsearchIndexAdapterOptions<TFilters>) {
this.client = options.client;
this.indexDefinition = options.index;
this.searchableFields = options.searchableFields;
this.searchType = options.searchType ?? 'best_fields';
this.fuzziness = options.fuzziness;
this.minimumShouldMatch = options.minimumShouldMatch;
this.buildFilters = options.buildFilters;
this.buildSort = options.buildSort;
this.lock = options.lock;
}
async initialize(): Promise<void> {
const indexName = this.indexDefinition.indexName;
const exists = await this.client.indices.exists({index: indexName});
if (!exists) {
try {
await this.client.indices.create({
index: indexName,
settings: this.indexDefinition.settings ?? {},
mappings: this.indexDefinition.mappings,
});
} catch (error) {
if (!isResourceAlreadyExistsError(error)) {
throw error;
}
}
}
try {
await this.client.indices.putMapping({
index: indexName,
...this.indexDefinition.mappings,
});
} catch (error) {
if (isAnalysisSettingsMissingError(error) && this.indexDefinition.settings?.analysis) {
await this.applyMissingAnalysisSettings(indexName);
try {
await this.client.indices.putMapping({
index: indexName,
...this.indexDefinition.mappings,
});
} catch (retryError) {
if (!isMappingConflictError(retryError)) {
throw retryError;
}
await this.recreateIndex(indexName);
}
} else if (isMappingConflictError(error)) {
await this.recreateIndex(indexName);
} else {
throw error;
}
}
this.initialized = true;
}
private async applyMissingAnalysisSettings(indexName: string): Promise<void> {
const analysis = this.indexDefinition.settings?.analysis;
if (!analysis) return;
await this.client.indices.close({index: indexName});
try {
await this.client.indices.putSettings({
index: indexName,
settings: {analysis},
});
} finally {
await this.client.indices.open({index: indexName});
}
}
private async recreateIndex(indexName: string): Promise<void> {
const lockKey = `es_index_reinit:${indexName}`;
const lockTtlSeconds = 120;
if (this.lock) {
const token = await this.lock.acquireLock(lockKey, lockTtlSeconds);
if (token) {
try {
await this.deleteAndRecreateIndex(indexName);
} finally {
await this.lock.releaseLock(lockKey, token);
}
return;
}
await new Promise((resolve) => setTimeout(resolve, 10000));
await this.client.indices.putMapping({
index: indexName,
...this.indexDefinition.mappings,
});
} else {
await this.deleteAndRecreateIndex(indexName);
}
}
private async deleteAndRecreateIndex(indexName: string): Promise<void> {
await this.client.indices.delete({index: indexName});
await this.client.indices.create({
index: indexName,
settings: this.indexDefinition.settings ?? {},
mappings: this.indexDefinition.mappings,
});
}
async shutdown(): Promise<void> {
this.initialized = false;
}
isAvailable(): boolean {
return this.initialized;
}
async indexDocument(doc: TResult): Promise<void> {
await this.indexDocuments([doc]);
}
async indexDocuments(docs: Array<TResult>): Promise<void> {
if (docs.length === 0) {
return;
}
this.assertInitialised();
const operations = docs.flatMap((doc) => [{index: {_index: this.indexDefinition.indexName, _id: doc.id}}, doc]);
await this.client.bulk({operations, refresh: false});
}
async updateDocument(doc: TResult): Promise<void> {
this.assertInitialised();
await this.client.index({
index: this.indexDefinition.indexName,
id: doc.id,
document: doc,
refresh: false,
});
}
async bulkIndexDocuments(docs: Array<TResult>): Promise<void> {
if (docs.length === 0) {
return;
}
this.assertInitialised();
const operations = docs.flatMap((doc) => [{index: {_index: this.indexDefinition.indexName, _id: doc.id}}, doc]);
await this.client.bulk({operations, refresh: false});
}
async refreshIndex(): Promise<void> {
this.assertInitialised();
await this.client.indices.refresh({index: this.indexDefinition.indexName});
}
async deleteDocument(id: string): Promise<void> {
await this.deleteDocuments([id]);
}
async deleteDocuments(ids: Array<string>): Promise<void> {
if (ids.length === 0) {
return;
}
this.assertInitialised();
const operations = ids.map((id) => ({delete: {_index: this.indexDefinition.indexName, _id: id}}));
await this.client.bulk({operations, refresh: false});
}
async deleteByQuery(query: Record<string, unknown>): Promise<void> {
this.assertInitialised();
await this.client.deleteByQuery({
index: this.indexDefinition.indexName,
query,
refresh: false,
});
}
async deleteAllDocuments(): Promise<void> {
this.assertInitialised();
await this.client.deleteByQuery({
index: this.indexDefinition.indexName,
query: {match_all: {}},
refresh: true,
});
}
async search(query: string, filters: TFilters, options?: SearchOptions): Promise<SearchResult<TResult>> {
this.assertInitialised();
const requestedLimit = options?.limit ?? options?.hitsPerPage ?? 25;
const limit = Math.min(Math.max(requestedLimit, 0), MAX_SEARCH_LIMIT);
const usesCursor = options?.cursor != null && options.cursor.length > 0;
const offset = options?.offset ?? (options?.page ? (options.page - 1) * (options.hitsPerPage ?? 25) : 0);
const filterClauses = compactFilters(this.buildFilters(filters));
const sort = this.buildSort?.(filters);
const must: Array<Record<string, unknown>> = query
? [
{
multi_match: {
query,
fields: this.searchableFields,
type: this.searchType,
operator: 'or',
...(this.fuzziness != null ? {fuzziness: this.fuzziness} : {}),
...(this.minimumShouldMatch != null ? {minimum_should_match: this.minimumShouldMatch} : {}),
},
},
]
: [{match_all: {}}];
const searchParams: ElasticsearchBaseSearchRequest = {
index: this.indexDefinition.indexName,
query: {
bool: {
must,
filter: filterClauses.length > 0 ? filterClauses : undefined,
},
},
};
const defaultSort: SortCombinations = {id: {order: 'desc'}};
const effectiveSort: NonNullable<SearchRequest['sort']> =
sort && sort.length > 0 ? [...sort, defaultSort] : [defaultSort];
searchParams.sort = effectiveSort;
if (usesCursor) {
const result = await this.executeSearchRequest(searchParams, {size: limit, searchAfter: options!.cursor});
return this.toSearchResult(result);
}
if (offset + limit > ELASTICSEARCH_MAX_RESULT_WINDOW) {
return this.executeDeepPaginationSearch(searchParams, offset, limit);
}
const result = await this.executeSearchRequest(searchParams, {size: limit, from: offset});
return this.toSearchResult(result);
}
private assertInitialised(): void {
if (!this.initialized) {
throw new Error('Elasticsearch adapter not initialised');
}
}
private async executeDeepPaginationSearch(
searchParams: ElasticsearchBaseSearchRequest,
offset: number,
limit: number,
): Promise<SearchResult<TResult>> {
let remainingOffset = offset;
let remainingLimit = limit;
let total: number | undefined;
let searchAfter: SortResults | undefined;
const hits: Array<TResult> = [];
while (remainingOffset > 0 || remainingLimit > 0) {
const batchSize = Math.min(DEEP_PAGINATION_BATCH_SIZE, remainingOffset > 0 ? remainingOffset : remainingLimit);
const result = await this.executeSearchRequest(searchParams, {
size: batchSize,
searchAfter,
trackTotalHits: total == null,
});
if (total == null) {
total = this.getTotalHits(result);
if (offset >= total) {
return {hits: [], total, cursor: undefined};
}
}
const batchHits = result.hits.hits;
if (batchHits.length === 0) {
break;
}
searchAfter = batchHits.at(-1)?.sort;
if (remainingOffset > 0) {
remainingOffset -= batchHits.length;
continue;
}
hits.push(...this.mapHits(batchHits));
remainingLimit -= batchHits.length;
}
return {
hits,
total: total ?? 0,
cursor: searchAfter?.map((value) => String(value)),
};
}
private async executeSearchRequest(
searchParams: ElasticsearchBaseSearchRequest,
options: {
size: number;
from?: number;
searchAfter?: SortResults;
trackTotalHits?: boolean;
},
): Promise<ElasticsearchSearchResponse<TResult>> {
const request: SearchRequest = {
...searchParams,
size: options.size,
track_total_hits: options.trackTotalHits ?? true,
...(options.from != null ? {from: options.from} : {}),
...(options.searchAfter != null ? {search_after: options.searchAfter} : {}),
};
return (await this.client.search<TResult>(request)) as ElasticsearchSearchResponse<TResult>;
}
private toSearchResult(result: ElasticsearchSearchResponse<TResult>): SearchResult<TResult> {
return {
hits: this.mapHits(result.hits.hits),
total: this.getTotalHits(result),
cursor: result.hits.hits.at(-1)?.sort?.map((value) => String(value)),
};
}
private mapHits(hits: Array<ElasticsearchSearchHit<TResult>>): Array<TResult> {
return hits.map((hit) => ({...hit._source!, id: hit._id!}));
}
private getTotalHits(result: ElasticsearchSearchResponse<TResult>): number {
const totalValue = result.hits.total;
return typeof totalValue === 'number' ? totalValue : (totalValue?.value ?? 0);
}
}
function isResourceAlreadyExistsError(error: unknown): boolean {
if (error == null || typeof error !== 'object') {
return false;
}
const meta = (
error as {
meta?: {
body?: {
error?: {
type?: string;
};
};
};
}
).meta;
if (meta?.body?.error?.type === 'resource_already_exists_exception') {
return true;
}
const message =
(
error as {
message?: string;
}
).message ?? '';
return message.includes('resource_already_exists_exception');
}
function isMappingConflictError(error: unknown): boolean {
if (error == null || typeof error !== 'object') {
return false;
}
const message =
(
error as {
message?: string;
}
).message ?? '';
if (message.includes('mapper') && message.includes('cannot be changed from type')) {
return true;
}
if (
message.includes('Cannot update parameter') &&
(message.includes('[analyzer]') || message.includes('[search_analyzer]'))
) {
return true;
}
return false;
}
function isAnalysisSettingsMissingError(error: unknown): boolean {
if (error == null || typeof error !== 'object') {
return false;
}
const meta = (
error as {
meta?: {
body?: {
error?: {
type?: string;
};
};
};
}
).meta;
const type = meta?.body?.error?.type;
const message =
(
error as {
message?: string;
}
).message ?? '';
const looksLikeMapperParsing = type === 'mapper_parsing_exception' || message.includes('mapper_parsing_exception');
const referencesMissingAnalysisComponent =
message.includes('has not been configured in mappings') ||
(message.includes('Custom') && message.includes("doesn't exist for field"));
return looksLikeMapperParsing && referencesMissingAnalysisComponent;
}
@@ -0,0 +1,273 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
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';
const HAS_FIELD_MAP: Record<string, string> = {
image: 'hasImage',
sound: 'hasSound',
video: 'hasVideo',
file: 'hasFile',
sticker: 'hasSticker',
embed: 'hasEmbed',
link: 'hasLink',
poll: 'hasPoll',
snapshot: 'hasForward',
};
function buildMessageFilters(filters: MessageSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
if (filters.guildId) {
clauses.push(esTermFilter('guildId', filters.guildId));
}
if (filters.channelId) {
clauses.push(esTermFilter('channelId', filters.channelId));
}
if (filters.channelIds && filters.channelIds.length > 0) {
clauses.push(esTermsFilter('channelId', filters.channelIds));
}
if (filters.excludeChannelIds && filters.excludeChannelIds.length > 0) {
clauses.push(...esExcludeAny('channelId', filters.excludeChannelIds));
}
if (filters.authorId && filters.authorId.length > 0) {
clauses.push(esTermsFilter('authorId', filters.authorId));
}
if (filters.excludeAuthorIds && filters.excludeAuthorIds.length > 0) {
clauses.push(...esExcludeAny('authorId', filters.excludeAuthorIds));
}
if (filters.authorType && filters.authorType.length > 0) {
clauses.push(esTermsFilter('authorType', filters.authorType));
}
if (filters.excludeAuthorType && filters.excludeAuthorType.length > 0) {
clauses.push(...esExcludeAny('authorType', filters.excludeAuthorType));
}
if (filters.mentions && filters.mentions.length > 0) {
clauses.push(...esAndTerms('mentionedUserIds', filters.mentions));
}
if (filters.excludeMentions && filters.excludeMentions.length > 0) {
clauses.push(...esExcludeAny('mentionedUserIds', filters.excludeMentions));
}
if (filters.mentionEveryone !== undefined) {
clauses.push(esTermFilter('mentionEveryone', filters.mentionEveryone));
}
if (filters.pinned !== undefined) {
clauses.push(esTermFilter('isPinned', filters.pinned));
}
if (filters.has && filters.has.length > 0) {
for (const hasType of filters.has) {
const field = HAS_FIELD_MAP[hasType];
if (field) {
clauses.push(esTermFilter(field, true));
}
}
}
if (filters.excludeHas && filters.excludeHas.length > 0) {
for (const hasType of filters.excludeHas) {
const field = HAS_FIELD_MAP[hasType];
if (field) {
clauses.push(esTermFilter(field, false));
}
}
}
if (filters.embedType && filters.embedType.length > 0) {
clauses.push(...esAndTerms('embedTypes', filters.embedType));
}
if (filters.excludeEmbedTypes && filters.excludeEmbedTypes.length > 0) {
clauses.push(...esExcludeAny('embedTypes', filters.excludeEmbedTypes));
}
if (filters.embedProvider && filters.embedProvider.length > 0) {
clauses.push(...esAndTerms('embedProviders', filters.embedProvider));
}
if (filters.excludeEmbedProviders && filters.excludeEmbedProviders.length > 0) {
clauses.push(...esExcludeAny('embedProviders', filters.excludeEmbedProviders));
}
if (filters.linkHostname && filters.linkHostname.length > 0) {
clauses.push(...esAndTerms('linkHostnames', filters.linkHostname));
}
if (filters.excludeLinkHostnames && filters.excludeLinkHostnames.length > 0) {
clauses.push(...esExcludeAny('linkHostnames', filters.excludeLinkHostnames));
}
if (filters.attachmentFilename && filters.attachmentFilename.length > 0) {
clauses.push(...esAndTerms('attachmentFilenames', filters.attachmentFilename));
}
if (filters.excludeAttachmentFilenames && filters.excludeAttachmentFilenames.length > 0) {
clauses.push(...esExcludeAny('attachmentFilenames', filters.excludeAttachmentFilenames));
}
if (filters.attachmentExtension && filters.attachmentExtension.length > 0) {
clauses.push(...esAndTerms('attachmentExtensions', filters.attachmentExtension));
}
if (filters.excludeAttachmentExtensions && filters.excludeAttachmentExtensions.length > 0) {
clauses.push(...esExcludeAny('attachmentExtensions', filters.excludeAttachmentExtensions));
}
if (filters.maxId != null) {
clauses.push({range: {id: {lt: filters.maxId}}});
}
if (filters.minId != null) {
clauses.push({range: {id: {gt: filters.minId}}});
}
return compactFilters(clauses);
}
function buildMessageSort(filters: MessageSearchFilters): Array<SortCombinations> | undefined {
const sortBy = filters.sortBy ?? 'timestamp';
if (sortBy === 'relevance') {
return undefined;
}
const sortOrder = filters.sortOrder ?? 'desc';
return [{createdAt: {order: sortOrder}}];
}
export interface ElasticsearchMessageAdapterOptions {
client: Client;
lock?: ElasticsearchDistributedLock;
}
export class ElasticsearchMessageAdapter extends ElasticsearchIndexAdapter<MessageSearchFilters, SearchableMessage> {
constructor(options: ElasticsearchMessageAdapterOptions) {
super({
client: options.client,
index: ELASTICSEARCH_INDEX_DEFINITIONS.messages,
searchableFields: ['content', 'embedContent'],
buildFilters: buildMessageFilters,
buildSort: buildMessageSort,
lock: options.lock,
});
}
override async search(
query: string,
filters: MessageSearchFilters,
options?: SearchOptions,
): Promise<SearchResult<SearchableMessage>> {
const exactPhrases = filters.exactPhrases ?? [];
const contents = filters.contents ?? [];
const cleanFilters: MessageSearchFilters = {
...filters,
contents: undefined,
exactPhrases: undefined,
maxId: undefined,
minId: undefined,
};
if (contents.length > 0) {
return this.searchMultipleContents(contents, exactPhrases, cleanFilters, filters, options);
}
if (exactPhrases.length > 0) {
return this.searchWithPhrases(query, exactPhrases, cleanFilters, filters, options);
}
return super.search(query, filters, options);
}
private async searchMultipleContents(
contents: Array<string>,
exactPhrases: Array<string>,
_cleanFilters: MessageSearchFilters,
originalFilters: MessageSearchFilters,
options?: SearchOptions,
): Promise<SearchResult<SearchableMessage>> {
const filterClauses = compactFilters(
buildMessageFilters({...originalFilters, contents: undefined, exactPhrases: undefined}),
);
const sort = buildMessageSort(originalFilters);
const should: Array<Record<string, unknown>> = contents.map((term) => ({
multi_match: {query: term, fields: ['content', 'embedContent'], type: 'best_fields'},
}));
const must: Array<Record<string, unknown>> = [{bool: {should, minimum_should_match: 1}}];
for (const phrase of exactPhrases) {
must.push({
bool: {
should: [{match_phrase: {content: phrase}}, {match_phrase: {embedContent: phrase}}],
minimum_should_match: 1,
},
});
}
const limit = options?.limit ?? options?.hitsPerPage ?? 25;
const usesCursor = options?.cursor != null && options.cursor.length > 0;
const searchParams: Record<string, unknown> = {
index: this.indexDefinition.indexName,
query: {
bool: {
must,
filter: filterClauses.length > 0 ? filterClauses : undefined,
},
},
size: limit,
track_total_hits: true,
};
if (usesCursor) {
searchParams.search_after = options!.cursor;
} else {
const offset = options?.offset ?? (options?.page ? (options.page - 1) * (options.hitsPerPage ?? 25) : 0);
searchParams.from = offset;
}
const effectiveSort = sort && sort.length > 0 ? [...sort, {id: {order: 'desc'}}] : [{id: {order: 'desc'}}];
searchParams.sort = effectiveSort;
const result = await this.client.search<SearchableMessage>(searchParams);
const totalValue = result.hits.total;
const total = typeof totalValue === 'number' ? totalValue : (totalValue?.value ?? 0);
const hits = result.hits.hits.map((hit) => ({...hit._source!, id: hit._id!}));
const lastHit = result.hits.hits.at(-1);
const cursor = lastHit?.sort?.map((v) => String(v));
return {hits, total, cursor};
}
private async searchWithPhrases(
query: string,
exactPhrases: Array<string>,
_cleanFilters: MessageSearchFilters,
originalFilters: MessageSearchFilters,
options?: SearchOptions,
): Promise<SearchResult<SearchableMessage>> {
const filterClauses = compactFilters(buildMessageFilters({...originalFilters, exactPhrases: undefined}));
const sort = buildMessageSort(originalFilters);
const must: Array<Record<string, unknown>> = [];
if (query) {
must.push({multi_match: {query, fields: ['content'], type: 'best_fields'}});
}
for (const phrase of exactPhrases) {
must.push({
bool: {
should: [{match_phrase: {content: phrase}}, {match_phrase: {embedContent: phrase}}],
minimum_should_match: 1,
},
});
}
if (must.length === 0) {
must.push({match_all: {}});
}
const limit = options?.limit ?? options?.hitsPerPage ?? 25;
const usesCursor = options?.cursor != null && options.cursor.length > 0;
const searchParams: Record<string, unknown> = {
index: 'messages',
query: {
bool: {
must,
filter: filterClauses.length > 0 ? filterClauses : undefined,
},
},
size: limit,
track_total_hits: true,
};
if (usesCursor) {
searchParams.search_after = options!.cursor;
} else {
const offset = options?.offset ?? (options?.page ? (options.page - 1) * (options.hitsPerPage ?? 25) : 0);
searchParams.from = offset;
}
const effectiveSort = sort && sort.length > 0 ? [...sort, {id: {order: 'desc'}}] : [{id: {order: 'desc'}}];
searchParams.sort = effectiveSort;
const result = await this.client.search<SearchableMessage>(searchParams);
const totalValue = result.hits.total;
const total = typeof totalValue === 'number' ? totalValue : (totalValue?.value ?? 0);
const hits = result.hits.hits.map((hit) => ({...hit._source!, id: hit._id!}));
const lastHit = result.hits.hits.at(-1);
const cursor = lastHit?.sort?.map((v) => String(v));
return {hits, total, cursor};
}
}
@@ -0,0 +1,52 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
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';
function buildReportFilters(filters: ReportSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
if (filters.reporterId) clauses.push(esTermFilter('reporterId', filters.reporterId));
if (filters.status !== undefined) clauses.push(esTermFilter('status', filters.status));
if (filters.reportType !== undefined) clauses.push(esTermFilter('reportType', filters.reportType));
if (filters.category) clauses.push(esTermFilter('category', filters.category));
if (filters.reportedUserId) clauses.push(esTermFilter('reportedUserId', filters.reportedUserId));
if (filters.reportedGuildId) clauses.push(esTermFilter('reportedGuildId', filters.reportedGuildId));
if (filters.reportedMessageId) clauses.push(esTermFilter('reportedMessageId', filters.reportedMessageId));
if (filters.guildContextId) clauses.push(esTermFilter('guildContextId', filters.guildContextId));
if (filters.resolvedByAdminId) clauses.push(esTermFilter('resolvedByAdminId', filters.resolvedByAdminId));
if (filters.isResolved !== undefined) {
clauses.push(filters.isResolved ? esExistsFilter('resolvedAt') : esNotExistsFilter('resolvedAt'));
}
return compactFilters(clauses);
}
function buildReportSort(filters: ReportSearchFilters): Array<SortCombinations> | undefined {
const sortBy = filters.sortBy ?? 'reportedAt';
if (sortBy === 'relevance') return undefined;
const sortOrder = filters.sortOrder ?? 'desc';
return [{[sortBy]: {order: sortOrder}}];
}
export interface ElasticsearchReportAdapterOptions {
client: Client;
lock?: ElasticsearchDistributedLock;
}
export class ElasticsearchReportAdapter extends ElasticsearchIndexAdapter<ReportSearchFilters, SearchableReport> {
constructor(options: ElasticsearchReportAdapterOptions) {
super({
client: options.client,
index: ELASTICSEARCH_INDEX_DEFINITIONS.reports,
searchableFields: ['category', 'additionalInfo', 'reportedGuildName', 'reportedChannelName'],
buildFilters: buildReportFilters,
buildSort: buildReportSort,
lock: options.lock,
});
}
}
@@ -0,0 +1,74 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
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 {
compactFilters,
esAndTerms,
esExistsFilter,
esNotExistsFilter,
esRangeFilter,
esTermFilter,
} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
function buildUserFilters(filters: UserSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
if (filters.isBot !== undefined) clauses.push(esTermFilter('isBot', filters.isBot));
if (filters.isSystem !== undefined) clauses.push(esTermFilter('isSystem', filters.isSystem));
if (filters.emailVerified !== undefined) clauses.push(esTermFilter('emailVerified', filters.emailVerified));
if (filters.emailBounced !== undefined) clauses.push(esTermFilter('emailBounced', filters.emailBounced));
if (filters.hasPremium !== undefined) {
clauses.push(filters.hasPremium ? esExistsFilter('premiumType') : esNotExistsFilter('premiumType'));
}
if (filters.isTempBanned !== undefined) {
clauses.push(filters.isTempBanned ? esExistsFilter('tempBannedUntil') : esNotExistsFilter('tempBannedUntil'));
}
if (filters.isPendingDeletion !== undefined) {
clauses.push(
filters.isPendingDeletion ? esExistsFilter('pendingDeletionAt') : esNotExistsFilter('pendingDeletionAt'),
);
}
if (filters.hasAcl && filters.hasAcl.length > 0) {
clauses.push(...esAndTerms('acls', filters.hasAcl));
}
if (filters.minSuspiciousActivityFlags !== undefined) {
clauses.push(esRangeFilter('suspiciousActivityFlags', {gte: filters.minSuspiciousActivityFlags}));
}
if (filters.createdAtGreaterThanOrEqual !== undefined) {
clauses.push(esRangeFilter('createdAt', {gte: filters.createdAtGreaterThanOrEqual}));
}
if (filters.createdAtLessThanOrEqual !== undefined) {
clauses.push(esRangeFilter('createdAt', {lte: filters.createdAtLessThanOrEqual}));
}
return compactFilters(clauses);
}
function buildUserSort(filters: UserSearchFilters): Array<SortCombinations> | undefined {
const sortBy = filters.sortBy ?? 'createdAt';
if (sortBy === 'relevance') return undefined;
const sortOrder = filters.sortOrder ?? 'desc';
return [{[sortBy]: {order: sortOrder}}];
}
export interface ElasticsearchUserAdapterOptions {
client: Client;
lock?: ElasticsearchDistributedLock;
}
export class ElasticsearchUserAdapter extends ElasticsearchIndexAdapter<UserSearchFilters, SearchableUser> {
constructor(options: ElasticsearchUserAdapterOptions) {
super({
client: options.client,
index: ELASTICSEARCH_INDEX_DEFINITIONS.users,
searchableFields: ['username', 'email', 'phone', 'id'],
buildFilters: buildUserFilters,
buildSort: buildUserSort,
lock: options.lock,
});
}
}
@@ -0,0 +1,10 @@
{
"extends": "../../../tsconfigs/package.json",
"compilerOptions": {
"paths": {
"@fluxer/*": ["../../../packages/*", "../../../packages/*/src/index.ts"],
"@pkgs/*": ["../*"]
}
},
"include": ["src/**/*"]
}
+27
View File
@@ -0,0 +1,27 @@
{
"name": "@pkgs/email",
"version": "0.0.0",
"private": true,
"type": "module",
"exports": {
"./*": "./*"
},
"scripts": {
"test": "vitest run",
"test:watch": "vitest",
"typecheck": "tsgo --noEmit"
},
"dependencies": {
"@fluxer/i18n": "workspace:*",
"@fluxer/logger": "workspace:*",
"itty-time": "catalog:",
"nodemailer": "catalog:"
},
"devDependencies": {
"@types/node": "catalog:",
"@types/nodemailer": "catalog:",
"@typescript/native-preview": "catalog:",
"vite-tsconfig-paths": "catalog:",
"vitest": "catalog:"
}
}
@@ -0,0 +1,24 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {I18nResult} from '@fluxer/i18n/src/runtime/I18nTypes';
import {getEmailTemplate} from '@pkgs/email/src/email_i18n/EmailI18n';
import type {EmailTemplateVariables} from '@pkgs/email/src/email_i18n/EmailI18nTypes';
import type {EmailTemplate, EmailTemplateKey} from '@pkgs/email/src/email_i18n/EmailI18nTypes.generated';
export interface IEmailI18nService {
getTemplate<T extends EmailTemplateKey>(
templateKey: T,
locale: string | null,
variables: EmailTemplateVariables[T],
): I18nResult<EmailTemplateKey, EmailTemplate>;
}
export class EmailI18nService implements IEmailI18nService {
getTemplate<T extends EmailTemplateKey>(
templateKey: T,
locale: string | null,
variables: EmailTemplateVariables[T],
): I18nResult<EmailTemplateKey, EmailTemplate> {
return getEmailTemplate(templateKey, locale, variables);
}
}
@@ -0,0 +1,27 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
export interface EmailConfig {
enabled: boolean;
fromEmail: string;
fromName: string;
appBaseUrl: string;
marketingBaseUrl: string;
}
export interface EmailMessage {
to: string;
from: {
email: string;
name: string;
};
subject: string;
text: string;
}
export interface IEmailProvider {
sendEmail(message: EmailMessage): Promise<boolean>;
}
export interface UserBouncedEmailChecker {
isEmailBounced(email: string): Promise<boolean>;
}
+331
View File
@@ -0,0 +1,331 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createLogger} from '@fluxer/logger/src/Logger';
import type {IEmailI18nService} from '@pkgs/email/src/EmailI18nService';
import type {EmailConfig, IEmailProvider, UserBouncedEmailChecker} from '@pkgs/email/src/EmailProviderTypes';
import type {EmailTemplateVariables} from '@pkgs/email/src/email_i18n/EmailI18nTypes';
import type {EmailTemplateKey} from '@pkgs/email/src/email_i18n/EmailI18nTypes.generated';
import type {IEmailService} from '@pkgs/email/src/IEmailService';
import {ms} from 'itty-time';
const logger = createLogger('email-service');
export class EmailService implements IEmailService {
private readonly config: EmailConfig;
private readonly emailI18n: IEmailI18nService;
private readonly provider: IEmailProvider | null;
private readonly bouncedEmailChecker: UserBouncedEmailChecker | null;
constructor(
config: EmailConfig,
emailI18n: IEmailI18nService,
provider: IEmailProvider | null = null,
bouncedEmailChecker: UserBouncedEmailChecker | null = null,
) {
this.config = config;
this.emailI18n = emailI18n;
this.provider = provider;
this.bouncedEmailChecker = bouncedEmailChecker;
}
async sendPasswordResetEmail(
email: string,
username: string,
resetToken: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'password_reset', locale, {
username,
resetUrl: `${this.config.appBaseUrl}/reset#token=${resetToken}`,
});
}
async sendEmailVerification(
email: string,
username: string,
verificationToken: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'email_verification', locale, {
username,
verifyUrl: `${this.config.appBaseUrl}/verify#token=${verificationToken}`,
});
}
async sendIpAuthorizationEmail(
email: string,
username: string,
authorizationToken: string,
ipAddress: string,
location: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'ip_authorization', locale, {
username,
authUrl: `${this.config.appBaseUrl}/authorize-ip#token=${authorizationToken}`,
ipAddress,
location,
});
}
async sendAccountDisabledForSuspiciousActivityEmail(
email: string,
username: string,
reason: string | null,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'account_disabled_suspicious', locale, {
username,
reason,
forgotUrl: `${this.config.appBaseUrl}/forgot`,
});
}
async sendAccountTempBannedEmail(
email: string,
username: string,
reason: string | null,
durationHours: number,
bannedUntil: Date,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'account_temp_banned', locale, {
username,
reason,
durationHours,
bannedUntil,
termsUrl: `${this.config.marketingBaseUrl}/terms`,
guidelinesUrl: `${this.config.marketingBaseUrl}/guidelines`,
});
}
async sendAccountScheduledForDeletionEmail(
email: string,
username: string,
reason: string | null,
deletionDate: Date,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'account_scheduled_deletion', locale, {
username,
reason,
deletionDate,
termsUrl: `${this.config.marketingBaseUrl}/terms`,
guidelinesUrl: `${this.config.marketingBaseUrl}/guidelines`,
});
}
async sendSelfDeletionScheduledEmail(
email: string,
username: string,
deletionDate: Date,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'self_deletion_scheduled', locale, {username, deletionDate});
}
async sendUnbanNotification(
email: string,
username: string,
reason: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'unban_notification', locale, {username, reason});
}
async sendScheduledDeletionNotification(
email: string,
username: string,
deletionDate: Date,
reason: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'scheduled_deletion_notification', locale, {username, deletionDate, reason});
}
async sendInactivityWarningEmail(
email: string,
username: string,
deletionDate: Date,
lastActiveDate: Date,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'inactivity_warning', locale, {
username,
deletionDate,
lastActiveDate,
loginUrl: `${this.config.appBaseUrl}/login`,
});
}
async sendHarvestCompletedEmail(
email: string,
username: string,
downloadUrl: string,
totalMessages: number,
fileSize: number,
expiresAt: Date,
locale: string | null = null,
): Promise<boolean> {
const fileSizeMB = Number.parseFloat((fileSize / 1024 / 1024).toFixed(2));
return this.sendTemplatedEmail(email, 'harvest_completed', locale, {
username,
downloadUrl,
totalMessages,
fileSizeMB,
expiresAt,
});
}
async sendGiftChargebackNotification(
email: string,
username: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'gift_chargeback_notification', locale, {username});
}
async sendReportResolvedEmail(
email: string,
username: string,
reportId: string,
publicComment: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'report_resolved', locale, {
username,
reportId,
publicComment,
hasComment: publicComment ? 'yes' : 'no',
});
}
async sendDsaReportVerificationCode(
email: string,
code: string,
expiresAt: Date,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'dsa_report_verification', locale, {code, expiresAt});
}
async sendRegistrationApprovedEmail(email: string, username: string, locale: string | null = null): Promise<boolean> {
return this.sendTemplatedEmail(email, 'registration_approved', locale, {
username,
channelsUrl: `${this.config.appBaseUrl}/channels/@me`,
});
}
async sendPasswordChangeVerification(
email: string,
username: string,
code: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'password_change_verification', locale, {
username,
code,
expiresAt: new Date(Date.now() + ms('10 minutes')),
});
}
async sendEmailChangeOriginal(
email: string,
username: string,
code: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'email_change_original', locale, {
username,
code,
expiresAt: new Date(Date.now() + ms('10 minutes')),
});
}
async sendEmailChangeNew(
email: string,
username: string,
code: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'email_change_new', locale, {
username,
code,
expiresAt: new Date(Date.now() + ms('10 minutes')),
});
}
async sendEmailChangeRevert(
email: string,
username: string,
newEmail: string,
token: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'email_change_revert', locale, {
username,
revertUrl: `${this.config.appBaseUrl}/wasntme#token=${token}`,
newEmail,
});
}
async sendDonationMagicLink(
email: string,
_token: string,
manageUrl: string,
expiresAt: Date,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'donation_magic_link', locale, {manageUrl, expiresAt});
}
async sendDonationConfirmation(
email: string,
amountCents: number,
currency: string,
interval: string,
manageUrl: string,
locale: string | null = null,
): Promise<boolean> {
return this.sendTemplatedEmail(email, 'donation_confirmation', locale, {
amount: (amountCents / 100).toFixed(2),
currency: currency.toUpperCase(),
interval,
manageUrl,
});
}
private async sendTemplatedEmail<T extends EmailTemplateKey>(
email: string,
templateKey: T,
locale: string | null,
variables: EmailTemplateVariables[T],
): Promise<boolean> {
const result = this.emailI18n.getTemplate(templateKey, locale, variables);
if (!result.ok) {
logger.error({key: templateKey, locale: result.locale, error: result.error}, 'Failed to resolve email template');
return false;
}
const {subject, body} = result.value;
if (!this.config.enabled || !this.provider) {
logger.info(
{templateKey},
`Email service disabled. Would have sent:\nTo: ${email}\nSubject: ${subject}\n\n${body}`,
);
return true;
}
if (this.bouncedEmailChecker) {
const bounced = await this.bouncedEmailChecker.isEmailBounced(email);
if (bounced) {
logger.warn({email}, 'Refusing to send email to bounced address - email marked as hard bounced');
return false;
}
}
return this.provider.sendEmail({
to: email,
from: {email: this.config.fromEmail, name: this.config.fromName},
subject,
text: body,
});
}
}
+110
View File
@@ -0,0 +1,110 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
export interface IEmailService {
sendPasswordResetEmail(email: string, username: string, resetToken: string, locale?: string | null): Promise<boolean>;
sendEmailVerification(
email: string,
username: string,
verificationToken: string,
locale?: string | null,
): Promise<boolean>;
sendIpAuthorizationEmail(
email: string,
username: string,
authorizationToken: string,
ipAddress: string,
location: string,
locale?: string | null,
): Promise<boolean>;
sendAccountDisabledForSuspiciousActivityEmail(
email: string,
username: string,
reason: string | null,
locale?: string | null,
): Promise<boolean>;
sendAccountTempBannedEmail(
email: string,
username: string,
reason: string | null,
durationHours: number,
bannedUntil: Date,
locale?: string | null,
): Promise<boolean>;
sendAccountScheduledForDeletionEmail(
email: string,
username: string,
reason: string | null,
deletionDate: Date,
locale?: string | null,
): Promise<boolean>;
sendSelfDeletionScheduledEmail(
email: string,
username: string,
deletionDate: Date,
locale?: string | null,
): Promise<boolean>;
sendUnbanNotification(email: string, username: string, reason: string, locale?: string | null): Promise<boolean>;
sendScheduledDeletionNotification(
email: string,
username: string,
deletionDate: Date,
reason: string,
locale?: string | null,
): Promise<boolean>;
sendInactivityWarningEmail(
email: string,
username: string,
deletionDate: Date,
lastActiveDate: Date,
locale?: string | null,
): Promise<boolean>;
sendHarvestCompletedEmail(
email: string,
username: string,
downloadUrl: string,
totalMessages: number,
fileSize: number,
expiresAt: Date,
locale?: string | null,
): Promise<boolean>;
sendGiftChargebackNotification(email: string, username: string, locale?: string | null): Promise<boolean>;
sendReportResolvedEmail(
email: string,
username: string,
reportId: string,
publicComment: string,
locale?: string | null,
): Promise<boolean>;
sendDsaReportVerificationCode(email: string, code: string, expiresAt: Date, locale?: string | null): Promise<boolean>;
sendRegistrationApprovedEmail(email: string, username: string, locale?: string | null): Promise<boolean>;
sendEmailChangeOriginal(email: string, username: string, code: string, locale?: string | null): Promise<boolean>;
sendEmailChangeNew(email: string, username: string, code: string, locale?: string | null): Promise<boolean>;
sendEmailChangeRevert(
email: string,
username: string,
newEmail: string,
token: string,
locale?: string | null,
): Promise<boolean>;
sendPasswordChangeVerification(
email: string,
username: string,
code: string,
locale?: string | null,
): Promise<boolean>;
sendDonationMagicLink(
email: string,
token: string,
manageUrl: string,
expiresAt: Date,
locale?: string | null,
): Promise<boolean>;
sendDonationConfirmation(
email: string,
amountCents: number,
currency: string,
interval: string,
manageUrl: string,
locale?: string | null,
): Promise<boolean>;
}
@@ -0,0 +1,15 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {IEmailService} from '@pkgs/email/src/IEmailService';
export interface SentEmailRecord {
to: string;
type: string;
timestamp: Date;
metadata: Record<string, string>;
}
export interface ITestEmailService extends IEmailService {
listSentEmails(): Array<SentEmailRecord>;
clearSentEmails(): void;
}
@@ -0,0 +1,58 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createLogger} from '@fluxer/logger/src/Logger';
import type {EmailMessage, IEmailProvider} from '@pkgs/email/src/EmailProviderTypes';
import nodemailer from 'nodemailer';
const logger = createLogger('@pkgs/email/src/SmtpEmailProvider');
interface SmtpEmailConfig {
host: string;
port: number;
username: string;
password: string;
secure?: boolean;
connectionTimeoutMs?: number;
greetingTimeoutMs?: number;
socketTimeoutMs?: number;
}
export class SmtpEmailProvider implements IEmailProvider {
private readonly transporter: nodemailer.Transporter;
constructor(config: SmtpEmailConfig) {
this.transporter = nodemailer.createTransport({
host: config.host,
port: config.port,
secure: config.secure ?? true,
auth: {
user: config.username,
pass: config.password,
},
connectionTimeout: config.connectionTimeoutMs,
greetingTimeout: config.greetingTimeoutMs,
socketTimeout: config.socketTimeoutMs,
});
}
async verify(): Promise<boolean> {
await this.transporter.verify();
return true;
}
async sendEmail(message: EmailMessage): Promise<boolean> {
try {
await this.transporter.sendMail({
to: message.to,
from: `${message.from.name} <${message.from.email}>`,
subject: message.subject,
text: message.text,
});
logger.debug({to: message.to}, 'Email sent via SMTP');
return true;
} catch (error) {
logger.error({error}, 'SMTP send failed');
return false;
}
}
}
@@ -0,0 +1,292 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ITestEmailService, SentEmailRecord} from '@pkgs/email/src/ITestEmailService';
function maskToken(token: string): string {
if (token.length <= 8) {
return '*'.repeat(token.length);
}
return `${token.slice(0, 4)}...${token.slice(-4)}`;
}
const noopLogger = {info: (_message: string) => {}};
export class TestEmailService implements ITestEmailService {
private readonly sentEmails: Array<SentEmailRecord> = [];
private readonly logger: {
info: (message: string) => void;
};
constructor(options?: {
logger?: {
info: (message: string) => void;
};
}) {
this.logger = options?.logger ?? noopLogger;
}
listSentEmails(): Array<SentEmailRecord> {
return [...this.sentEmails];
}
clearSentEmails(): void {
this.sentEmails.length = 0;
}
async sendPasswordResetEmail(
email: string,
username: string,
resetToken: string,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(`Password reset email sent to ${email} for user ${username}, token: ${maskToken(resetToken)}`);
return this.record(email, 'password_reset', {token: resetToken});
}
async sendEmailVerification(
email: string,
username: string,
verificationToken: string,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(
`Email verification sent to ${email} for user ${username}, token: ${maskToken(verificationToken)}`,
);
return this.record(email, 'email_verification', {token: verificationToken});
}
async sendIpAuthorizationEmail(
email: string,
username: string,
authorizationToken: string,
ipAddress: string,
location: string,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(
`IP authorization email sent to ${email} for user ${username}, IP: ${ipAddress}, location: ${location}`,
);
return this.record(email, 'ip_authorization', {token: authorizationToken, ip: ipAddress, location});
}
async sendAccountDisabledForSuspiciousActivityEmail(
email: string,
username: string,
reason: string | null,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(`Account disabled email sent to ${email} for user ${username}, reason: ${reason ?? 'none'}`);
return this.record(email, 'account_disabled_suspicious', {reason: reason ?? ''});
}
async sendAccountTempBannedEmail(
email: string,
username: string,
reason: string | null,
durationHours: number,
bannedUntil: Date,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(
`Temp ban email sent to ${email} for user ${username}, ${durationHours}h until ${bannedUntil.toISOString()}`,
);
return this.record(email, 'account_temp_banned', {
reason: reason ?? '',
duration_hours: durationHours.toString(10),
banned_until: bannedUntil.toISOString(),
});
}
async sendAccountScheduledForDeletionEmail(
email: string,
username: string,
reason: string | null,
deletionDate: Date,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(
`Scheduled deletion email sent to ${email} for user ${username}, date: ${deletionDate.toISOString()}`,
);
return this.record(email, 'account_scheduled_deletion', {
reason: reason ?? '',
deletion_date: deletionDate.toISOString(),
});
}
async sendSelfDeletionScheduledEmail(
email: string,
username: string,
deletionDate: Date,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(`Self deletion email sent to ${email} for user ${username}, date: ${deletionDate.toISOString()}`);
return this.record(email, 'self_deletion_scheduled', {deletion_date: deletionDate.toISOString()});
}
async sendUnbanNotification(
email: string,
username: string,
reason: string,
_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});
}
async sendScheduledDeletionNotification(
email: string,
username: string,
deletionDate: Date,
reason: string,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(
`Scheduled deletion notification sent to ${email} for user ${username}, date: ${deletionDate.toISOString()}`,
);
return this.record(email, 'scheduled_deletion_notification', {deletion_date: deletionDate.toISOString(), reason});
}
async sendInactivityWarningEmail(
email: string,
username: string,
deletionDate: Date,
lastActiveDate: Date,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(
`Inactivity warning sent to ${email} for user ${username}, deletion: ${deletionDate.toISOString()}`,
);
return this.record(email, 'inactivity_warning', {
deletion_date: deletionDate.toISOString(),
last_active_date: lastActiveDate.toISOString(),
});
}
async sendHarvestCompletedEmail(
email: string,
username: string,
downloadUrl: string,
totalMessages: number,
fileSize: number,
expiresAt: Date,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(
`Harvest completed email sent to ${email} for user ${username}, ${totalMessages} messages, ${fileSize} bytes`,
);
return this.record(email, 'harvest_completed', {
download_url: downloadUrl,
total_messages: totalMessages.toString(10),
file_size: fileSize.toString(10),
expires_at: expiresAt.toISOString(),
});
}
async sendGiftChargebackNotification(email: string, username: string, _locale?: string | null): Promise<boolean> {
this.logger.info(`Gift chargeback notification sent to ${email} for user ${username}`);
return this.record(email, 'gift_chargeback_notification');
}
async sendReportResolvedEmail(
email: string,
username: string,
reportId: string,
publicComment: string,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(`Report resolved email sent to ${email} for user ${username}, report: ${reportId}`);
return this.record(email, 'report_resolved', {report_id: reportId, public_comment: publicComment});
}
async sendDsaReportVerificationCode(
email: string,
code: string,
expiresAt: Date,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(`DSA report verification code sent to ${email}, code: ${maskToken(code)}`);
return this.record(email, 'dsa_report_verification', {code, expires_at: expiresAt.toISOString()});
}
async sendRegistrationApprovedEmail(email: string, username: string, _locale?: string | null): Promise<boolean> {
this.logger.info(`Registration approved email sent to ${email} for user ${username}`);
return this.record(email, 'registration_approved');
}
async sendPasswordChangeVerification(
email: string,
username: string,
code: string,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(`Password change verification sent to ${email} for user ${username}`);
return this.record(email, 'password_change_verification', {code});
}
async sendEmailChangeOriginal(
email: string,
username: string,
code: string,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(`Email change original verification sent to ${email} for user ${username}`);
return this.record(email, 'email_change_original', {code});
}
async sendEmailChangeNew(email: string, username: string, code: string, _locale?: string | null): Promise<boolean> {
this.logger.info(`Email change new verification sent to ${email} for user ${username}`);
return this.record(email, 'email_change_new', {code});
}
async sendEmailChangeRevert(
email: string,
username: string,
newEmail: string,
token: string,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(`Email change revert notice sent to ${email} for user ${username}`);
return this.record(email, 'email_change_revert', {token, new_email: newEmail});
}
async sendDonationMagicLink(
email: string,
token: string,
manageUrl: string,
expiresAt: Date,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(
`Donation magic link sent to ${email}, token: ${maskToken(token)}, expires: ${expiresAt.toISOString()}`,
);
return this.record(email, 'donation_magic_link', {
token,
manage_url: manageUrl,
expires_at: expiresAt.toISOString(),
});
}
async sendDonationConfirmation(
email: string,
amountCents: number,
currency: string,
interval: string,
manageUrl: string,
_locale?: string | null,
): Promise<boolean> {
this.logger.info(
`Donation confirmation sent to ${email}, amount: ${amountCents / 100} ${currency.toUpperCase()}/${interval}`,
);
return this.record(email, 'donation_confirmation', {
amount: (amountCents / 100).toString(),
currency: currency.toUpperCase(),
interval,
manage_url: manageUrl,
});
}
private record(to: string, type: string, metadata: Record<string, string> = {}): boolean {
this.sentEmails.push({to, type, timestamp: new Date(), metadata});
return true;
}
}
@@ -0,0 +1,57 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {identityLocale} from '@fluxer/i18n/src/normalization/IdentityLocale';
import {createStaticI18n} from '@fluxer/i18n/src/runtime/CreateStaticI18n';
import type {I18nResult} from '@fluxer/i18n/src/runtime/I18nTypes';
import {validateMessageTemplateVariables} from '@fluxer/i18n/src/runtime/MessageCatalogTypes';
import {EMAIL_I18N_LOCALE_MESSAGES} from '@pkgs/email/src/email_i18n/EmailI18nLocales';
import {EMAIL_I18N_MESSAGES} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
import type {EmailTemplate, EmailTemplateKey} from '@pkgs/email/src/email_i18n/EmailI18nTypes.generated';
const DEFAULT_LOCALE = 'en-US';
const DEFAULT_EMAIL_TEMPLATE_VARIABLES = {
product_name: 'Fluxer',
appeals_email: 'appeals@fluxer.app',
safety_email: 'safety@fluxer.app',
} satisfies Record<string, string>;
const emailI18n = createStaticI18n<EmailTemplateKey, EmailTemplate, Record<string, unknown>>(
{
defaultLocale: DEFAULT_LOCALE,
defaultMessages: EMAIL_I18N_MESSAGES,
localeMessages: EMAIL_I18N_LOCALE_MESSAGES,
normalizeLocale: (locale) => identityLocale(locale),
onWarning: (message) => {
if (message.startsWith('Unsupported locale, falling back to en-US:')) {
console.warn(
`Unsupported locale for email translations, falling back to en-US: ${message.split(': ').slice(1).join(': ')}`,
);
} else {
console.warn(message);
}
},
validateVariables: (_key, template, variables) =>
validateMessageTemplateVariables(template.subject, variables) ??
validateMessageTemplateVariables(template.body, variables),
},
(template, variables, mf) => {
const compiledSubject = String(mf.compile(template.subject)(variables));
const compiledBody = String(mf.compile(template.body)(variables));
return {subject: compiledSubject, body: compiledBody};
},
);
export function getEmailTemplate(
templateKey: EmailTemplateKey,
locale: string | null,
variables: Record<string, unknown>,
): I18nResult<EmailTemplateKey, EmailTemplate> {
return emailI18n.getTemplate(templateKey, locale, {...DEFAULT_EMAIL_TEMPLATE_VARIABLES, ...variables});
}
export function hasEmailLocale(locale: string): boolean {
return emailI18n.hasLocale(locale);
}
export function resetEmailI18n(): void {
emailI18n.reset();
}
@@ -0,0 +1,26 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {getEmailTemplate, resetEmailI18n} from '@pkgs/email/src/email_i18n/EmailI18n';
import {EMAIL_I18N_LOCALE_MESSAGES} from '@pkgs/email/src/email_i18n/EmailI18nLocales';
import {EMAIL_I18N_MESSAGES} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
import {afterEach, describe, expect, it} from 'vitest';
const LOCALES = Object.keys(EMAIL_I18N_LOCALE_MESSAGES) as Array<keyof typeof EMAIL_I18N_LOCALE_MESSAGES>;
describe('EmailI18n locale files', () => {
afterEach(() => {
resetEmailI18n();
});
it.each(LOCALES)('%s loads without module errors', (locale) => {
const template = getEmailTemplate('email_verification', locale, {
username: 'testuser',
verifyUrl: 'https://example.com/verify',
});
expect(template.ok).toBe(true);
});
it.each(LOCALES)('%s has the same translation keys as the source catalog', (locale) => {
const messagesKeys = Object.keys(EMAIL_I18N_MESSAGES).sort();
const localeKeys = Object.keys(EMAIL_I18N_LOCALE_MESSAGES[locale]).sort();
expect(localeKeys).toEqual(messagesKeys);
});
});
@@ -0,0 +1,72 @@
// 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';
export const EMAIL_I18N_LOCALE_MESSAGES = {
ar: EMAIL_I18N_AR_MESSAGES,
bg: EMAIL_I18N_BG_MESSAGES,
cs: EMAIL_I18N_CS_MESSAGES,
da: EMAIL_I18N_DA_MESSAGES,
de: EMAIL_I18N_DE_MESSAGES,
el: EMAIL_I18N_EL_MESSAGES,
'en-GB': EMAIL_I18N_EN_GB_MESSAGES,
'es-419': EMAIL_I18N_ES_419_MESSAGES,
'es-ES': EMAIL_I18N_ES_ES_MESSAGES,
fi: EMAIL_I18N_FI_MESSAGES,
fr: EMAIL_I18N_FR_MESSAGES,
he: EMAIL_I18N_HE_MESSAGES,
hi: EMAIL_I18N_HI_MESSAGES,
hr: EMAIL_I18N_HR_MESSAGES,
hu: EMAIL_I18N_HU_MESSAGES,
id: EMAIL_I18N_ID_MESSAGES,
it: EMAIL_I18N_IT_MESSAGES,
ja: EMAIL_I18N_JA_MESSAGES,
ko: EMAIL_I18N_KO_MESSAGES,
lt: EMAIL_I18N_LT_MESSAGES,
nl: EMAIL_I18N_NL_MESSAGES,
no: EMAIL_I18N_NO_MESSAGES,
pl: EMAIL_I18N_PL_MESSAGES,
'pt-BR': EMAIL_I18N_PT_BR_MESSAGES,
ro: EMAIL_I18N_RO_MESSAGES,
ru: EMAIL_I18N_RU_MESSAGES,
'sv-SE': EMAIL_I18N_SV_SE_MESSAGES,
th: EMAIL_I18N_TH_MESSAGES,
tr: EMAIL_I18N_TR_MESSAGES,
uk: EMAIL_I18N_UK_MESSAGES,
vi: EMAIL_I18N_VI_MESSAGES,
'zh-CN': EMAIL_I18N_ZH_CN_MESSAGES,
'zh-TW': EMAIL_I18N_ZH_TW_MESSAGES,
} as const satisfies Record<string, Partial<Record<EmailTemplateKey, EmailTemplate>>>;
@@ -0,0 +1,96 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {EmailTemplate, EmailTemplateKey} from '@pkgs/email/src/email_i18n/EmailI18nTypes.generated';
export const EMAIL_I18N_MESSAGES = {
account_disabled_suspicious: {
subject: 'Your {product_name} account has been temporarily disabled',
body: "Hello {username},\n\nWe temporarily disabled your {product_name} account because we detected suspicious activity.\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nTo regain access to your account, you'll need to reset your password:\n\n{forgotUrl}\n\nAfter you reset your password, you'll be able to log in again.\n\nIf you believe this was done in error, please contact our support team.\n\n {product_name} Safety Team",
},
account_scheduled_deletion: {
subject: 'Your {product_name} account will be permanently deleted',
body: 'Hello {username},\n\nYour {product_name} account has been scheduled for permanent deletion due to violations of our Terms of Service or Community Guidelines.\n\nScheduled deletion: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nThis is a serious enforcement action. Your account data will be permanently deleted on the scheduled date.\n\nPlease review:\n- Terms of Service: {termsUrl}\n- Community Guidelines: {guidelinesUrl}\n\nAppeals process:\nIf you believe this enforcement decision was incorrect or unjustified, you have 60 days to submit an appeal. Email {appeals_email} from this email address.\n\nIn your appeal:\n- Clearly explain why you believe the enforcement decision was incorrect or unjustified\n- Provide any relevant evidence or context\n\nA member of the {product_name} Safety Team will review your appeal and may pause the pending deletion until a final decision has been reached.\n\n {product_name} Safety Team',
},
account_temp_banned: {
subject: 'Your {product_name} account has been temporarily suspended',
body: "Hello {username},\n\nYour {product_name} account has been temporarily suspended for violating our Terms of Service or Community Guidelines.\n\nDuration: {durationHours, plural,\n =1 {1 hour}\n other {# hours}\n}\nSuspended until: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nDuring this time, you won't be able to access your account.\n\nPlease review:\n- Terms of Service: {termsUrl}\n- Community Guidelines: {guidelinesUrl}\n\nIf you believe this enforcement decision was incorrect or unjustified, you can submit an appeal. Email {appeals_email} from this email address and clearly explain why you believe the decision was incorrect. We'll review your appeal and respond with our decision.\n\n {product_name} Safety Team",
},
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',
},
donation_magic_link: {
subject: 'Manage your {product_name} donations',
body: 'Hello,\n\nClick the link below to access your donor portal:\n\n{manageUrl}\n\nIn the portal, you can manage subscriptions, download invoices, and view your donation history.\n\nThis link expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you did not request this link, you can safely ignore this email.\n\n {product_name} Team',
},
dsa_report_verification: {
subject: 'Verify your email for a DSA report',
body: "Hello,\n\nUse the verification code below to submit your Digital Services Act report on {product_name}:\n\n{code}\n\nThis code expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you didn't request this, you can ignore this email.\n\n {product_name} Safety Team",
},
email_change_new: {
subject: 'Verify your new {product_name} email',
body: "Hello {username},\n\nEnter this code in the app to verify your new {product_name} email:\n\n{code}\n\nThis code expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you didn't request this, you can ignore this email.\n\n {product_name} Team",
},
email_change_original: {
subject: 'Confirm your {product_name} email change',
body: "Hello {username},\n\nWe received a request to change the email address 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, please secure your account right away.\n\n {product_name} Team",
},
email_change_revert: {
subject: 'Your {product_name} email was changed',
body: "Hello {username},\n\nThe email address on your {product_name} account was changed to {newEmail}.\n\nIf you made this change, no action is needed. If you didn't, you can revert the change and secure your account using this link:\n\n{revertUrl}\n\nThis will restore your previous email, sign you out everywhere, remove linked phone numbers, disable MFA, and require you to set a new password.\n\n {product_name} Safety Team",
},
email_verification: {
subject: 'Verify your {product_name} email address',
body: "Hello {username},\n\nPlease verify the email address for your {product_name} account by clicking the link below:\n\n{verifyUrl}\n\nIf you didn't create a {product_name} account, you can safely ignore this email.\n\nThis link is valid for 24 hours.\n\n {product_name} Team",
},
gift_chargeback_notification: {
subject: 'Perks from your redeemed gift have been removed',
body: "Hello {username},\n\nA gift code you redeemed was originally paid for by someone else. That payment has since been reversed (a chargeback).\n\nBecause of this, we've removed the perks that were added to your account when you redeemed the gift.\n\nIf you think this is a mistake, please contact our support team and include any details you have about the gift code and when you redeemed it.\n\n {product_name} Team",
},
harvest_completed: {
subject: 'Your {product_name} data export is ready to download',
body: "Hello {username},\n\nYour data export is ready.\n\nDownload link:\n{downloadUrl}\n\nMessages included: {totalMessages, number}\nFile size: {fileSizeMB, number} MB\n\nThis link expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you didn't request this export, please change your password immediately and contact our support team.\n\n {product_name} Team",
},
inactivity_warning: {
subject: 'Your {product_name} account will be deleted due to inactivity',
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",
},
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",
},
password_reset: {
subject: 'Reset your {product_name} password',
body: "Hello {username},\n\nYou requested a {product_name} password reset. Use the link below to set a new password:\n\n{resetUrl}\n\nIf you didn't request this, you can safely ignore this email.\n\nThis link is valid for 1 hour.\n\n {product_name} Team",
},
registration_approved: {
subject: 'Your {product_name} registration has been approved',
body: 'Hello {username},\n\nGood news: your {product_name} registration has been approved.\n\nYou can now log in to the {product_name} app here:\n{channelsUrl}\n\nWelcome to the {product_name} community.\n\n {product_name} Team',
},
report_resolved: {
subject: 'Your {product_name} report has been reviewed',
body: 'Hello {username},\n\nYour report (ID: {reportId}) has been reviewed by our Safety Team.{hasComment, select, yes {\n\nResponse from the Safety Team:\n{publicComment}} other {}}\n\nThanks for helping keep {product_name} safe for everyone. We take all reports seriously and appreciate your contribution to the community.\n\nIf you have any questions or concerns about this outcome, please contact {safety_email}.\n\n {product_name} Safety Team',
},
scheduled_deletion_notification: {
subject: 'Your {product_name} account will be permanently deleted',
body: 'Hello {username},\n\nYour {product_name} account has been scheduled for permanent deletion.\n\nScheduled deletion: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nThis is a serious enforcement action. Your account data will be permanently deleted on the scheduled date.\n\nIf you believe this enforcement decision was incorrect, you can submit an appeal. Email {appeals_email} from this email address.\n\n {product_name} Safety Team',
},
self_deletion_scheduled: {
subject: 'Your {product_name} account deletion is scheduled',
body: "Hello {username},\n\nYou requested to delete your {product_name} account. Your account is scheduled for permanent deletion on:\n\n{deletionDate, date, full} at {deletionDate, time, short}\n\nIf you didn't request this, sign in to your account to cancel the deletion. We also recommend changing your password to secure your account.\n\n {product_name} Team",
},
unban_notification: {
subject: 'Your {product_name} account suspension has been lifted',
body: 'Hello {username},\n\nGood news: your {product_name} account suspension has been lifted.\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nYou can now log back in and continue using {product_name} as normal.\n\n {product_name} Safety Team',
},
} as const;
export function defineEmailI18nLocaleMessages<const TMessages extends Partial<Record<EmailTemplateKey, EmailTemplate>>>(
messages: TMessages,
): TMessages {
return messages;
}
@@ -0,0 +1,29 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
export type EmailTemplateKey =
| 'account_disabled_suspicious'
| 'account_scheduled_deletion'
| 'account_temp_banned'
| 'donation_confirmation'
| 'donation_magic_link'
| 'dsa_report_verification'
| 'email_change_new'
| 'email_change_original'
| 'email_change_revert'
| 'email_verification'
| 'gift_chargeback_notification'
| 'harvest_completed'
| 'inactivity_warning'
| 'ip_authorization'
| 'password_change_verification'
| 'password_reset'
| 'registration_approved'
| 'report_resolved'
| 'scheduled_deletion_notification'
| 'self_deletion_scheduled'
| 'unban_notification';
export interface EmailTemplate {
subject: string;
body: string;
}
@@ -0,0 +1,111 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
export interface EmailTemplateVariables {
account_disabled_suspicious: {
username: string;
reason: string | null;
forgotUrl: string;
};
account_scheduled_deletion: {
username: string;
reason: string | null;
deletionDate: Date;
termsUrl: string;
guidelinesUrl: string;
};
account_temp_banned: {
username: string;
reason: string | null;
durationHours: number;
bannedUntil: Date;
termsUrl: string;
guidelinesUrl: string;
};
donation_confirmation: {
amount: string;
currency: string;
interval: string;
manageUrl: string;
};
donation_magic_link: {
manageUrl: string;
expiresAt: Date;
};
dsa_report_verification: {
code: string;
expiresAt: Date;
};
email_change_new: {
username: string;
code: string;
expiresAt: Date;
};
email_change_original: {
username: string;
code: string;
expiresAt: Date;
};
email_change_revert: {
username: string;
newEmail: string;
revertUrl: string;
};
email_verification: {
username: string;
verifyUrl: string;
};
gift_chargeback_notification: {
username: string;
};
harvest_completed: {
username: string;
downloadUrl: string;
totalMessages: number;
fileSizeMB: number;
expiresAt: Date;
};
inactivity_warning: {
username: string;
deletionDate: Date;
lastActiveDate: Date;
loginUrl: string;
};
ip_authorization: {
username: string;
authUrl: string;
ipAddress: string;
location: string;
};
password_change_verification: {
username: string;
code: string;
expiresAt: Date;
};
password_reset: {
username: string;
resetUrl: string;
};
registration_approved: {
username: string;
channelsUrl: string;
};
report_resolved: {
username: string;
reportId: string;
publicComment: string;
hasComment: 'yes' | 'no';
};
scheduled_deletion_notification: {
username: string;
deletionDate: Date;
reason: string;
};
self_deletion_scheduled: {
username: string;
deletionDate: Date;
};
unban_notification: {
username: string;
reason: string;
};
}
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"email_change_revert": {
"subject": "تم تغيير بريدك الإلكتروني في {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}"
},
"gift_chargeback_notification": {
"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}"
},
"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 جديد",
"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}"
},
"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}"
},
"password_reset": {
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_AR_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_BG_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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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 адрес",
"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}"
},
"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}"
},
"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} е одобрена",
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_BG_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_CS_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
}
});
export default EMAIL_I18N_DA_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_DE_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Dein {product_name}-Konto wurde vorübergehend deaktiviert",
"body": "Hallo {username},\n\nwir haben dein {product_name}-Konto vorübergehend deaktiviert, da wir verdächtige Aktivitäten festgestellt haben.\n\n{reason, select,\n null {}\n other {Grund: {reason}}\n}\n\nUm wieder Zugriff auf dein Konto zu erhalten, musst du dein Passwort zurücksetzen:\n\n{forgotUrl}\n\nNachdem du dein Passwort zurückgesetzt hast, kannst du dich wieder anmelden.\n\nWenn du glaubst, dass dies ein Fehler war, kontaktiere bitte unser Support-Team.\n\n {product_name}-Sicherheitsteam"
},
"account_scheduled_deletion": {
"subject": "Dein {product_name}-Konto wird dauerhaft gelöscht",
"body": "Hallo {username},\n\ndein {product_name}-Konto 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 Kontodaten 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"
},
"account_temp_banned": {
"subject": "Dein {product_name}-Konto wurde vorübergehend gesperrt",
"body": "Hallo {username},\n\ndein {product_name}-Konto wurde vorübergehend gesperrt, weil du gegen unsere Nutzungsbedingungen oder Community-Richtlinien verstoßen hast.\n\nDauer: {durationHours, plural,\n one {1 Stunde}\n other {# Stunden}\n}\nGesperrt bis: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Grund: {reason}}\n}\n\nWährend dieser Zeit kannst du nicht auf dein Konto zugreifen.\n\nBitte lies dir Folgendes durch:\n- Nutzungsbedingungen: {termsUrl}\n- Community-Richtlinien: {guidelinesUrl}\n\nWenn du glaubst, dass diese Entscheidung falsch oder ungerechtfertigt war, kannst du Einspruch einlegen. Sende eine E-Mail von dieser E-Mail-Adresse an {appeals_email} und erkläre klar, warum du die Entscheidung für falsch hältst. Wir werden deinen Einspruch prüfen und dir unsere Entscheidung mitteilen.\n\n {product_name}-Sicherheitsteam"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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}-Kontos 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 dies nicht angefordert hast, sichere dein Konto bitte sofort.\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}-Kontos 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 dein Konto über diesen Link sichern:\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"
},
"email_verification": {
"subject": "Bestätige deine {product_name}-E-Mail-Adresse",
"body": "Hallo {username},\n\nbitte bestätige die E-Mail-Adresse für dein {product_name}-Konto, indem du auf den untenstehenden Link klickst:\n\n{verifyUrl}\n\nWenn du kein {product_name}-Konto 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 Konto 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"
},
"inactivity_warning": {
"subject": "Dein {product_name}-Konto wird wegen Inaktivität gelöscht",
"body": "Hallo {username},\n\nwir haben seit dem {lastActiveDate, date, full} keine Aktivität auf deinem {product_name}-Konto festgestellt.\n\nWenn du dich nicht bis zum {deletionDate, date, full} um {deletionDate, time, short} anmeldest, wird dein Konto 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 dein {product_name}-Konto 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"
},
"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}-Kontos 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 dies nicht angefordert hast, könnte jemand Zugriff auf dein Konto 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"
},
"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"
},
"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"
},
"scheduled_deletion_notification": {
"subject": "Dein {product_name}-Konto wird dauerhaft gelöscht",
"body": "Hallo {username},\n\ndein {product_name}-Konto wurde 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 Kontodaten werden am geplanten Datum dauerhaft gelöscht.\n\nWenn du glaubst, dass diese Entscheidung falsch war, kannst du Einspruch einlegen. Sende eine E-Mail von dieser E-Mail-Adresse an {appeals_email}.\n\n {product_name}-Sicherheitsteam"
},
"self_deletion_scheduled": {
"subject": "Die Löschung deines {product_name}-Kontos ist geplant",
"body": "Hallo {username},\n\ndu hast die Löschung deines {product_name}-Kontos beantragt. Dein Konto ist zur dauerhaften Löschung vorgesehen am:\n\n{deletionDate, date, full} um {deletionDate, time, short}\n\nWenn du dies nicht beantragt hast, melde dich in deinem Konto an, um die Löschung abzubrechen. Wir empfehlen außerdem, dein Passwort zu ändern, um dein Konto zu sichern.\n\n {product_name} Team"
},
"unban_notification": {
"subject": "Die Sperrung deines {product_name}-Kontos wurde aufgehoben",
"body": "Hallo {username},\n\ngute Nachrichten: Die Sperrung deines {product_name}-Kontos wurde aufgehoben.\n\n{reason, select,\n null {}\n other {Grund: {reason}}\n}\n\nDu kannst dich jetzt wieder anmelden und {product_name} wie gewohnt nutzen.\n\n {product_name}-Sicherheitsteam"
}
});
export default EMAIL_I18N_DE_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"gift_chargeback_notification": {
"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}"
},
"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",
"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}"
},
"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}"
},
"password_reset": {
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_EL_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_EN_GB_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Your {product_name} account has been temporarily disabled",
"body": "Hello {username},\n\nWe temporarily disabled your {product_name} account because we detected suspicious activity.\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nTo regain access to your account, you'll need to reset your password:\n\n{forgotUrl}\n\nAfter you reset your password, you'll be able to log in again.\n\nIf you believe this was done in error, please contact our support team.\n\n {product_name} Safety Team"
},
"account_scheduled_deletion": {
"subject": "Your {product_name} account will be permanently deleted",
"body": "Hello {username},\n\nYour {product_name} account has been scheduled for permanent deletion due to violations of our Terms of Service or Community Guidelines.\n\nScheduled deletion: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nThis is a serious enforcement action. Your account data will be permanently deleted on the scheduled date.\n\nPlease review:\n- Terms of Service: {termsUrl}\n- Community Guidelines: {guidelinesUrl}\n\nAppeals process:\nIf you believe this enforcement decision was incorrect or unjustified, you have 60 days to submit an appeal. Email {appeals_email} from this email address.\n\nIn your appeal:\n- Clearly explain why you believe the enforcement decision was incorrect or unjustified\n- Provide any relevant evidence or context\n\nA member of the {product_name} Safety Team will review your appeal and may pause the pending deletion until a final decision has been reached.\n\n {product_name} Safety Team"
},
"account_temp_banned": {
"subject": "Your {product_name} account has been temporarily suspended",
"body": "Hello {username},\n\nYour {product_name} account has been temporarily suspended for violating our Terms of Service or Community Guidelines.\n\nDuration: {durationHours, plural,\n =1 {1 hour}\n other {# hours}\n}\nSuspended until: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nDuring this time, you won't be able to access your account.\n\nPlease review:\n- Terms of Service: {termsUrl}\n- Community Guidelines: {guidelinesUrl}\n\nIf you believe this enforcement decision was incorrect or unjustified, you can submit an appeal. Email {appeals_email} from this email address and clearly explain why you believe the decision was incorrect. We'll review your appeal and respond with our decision.\n\n {product_name} Safety Team"
},
"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"
},
"donation_magic_link": {
"subject": "Manage your {product_name} donations",
"body": "Hello,\n\nClick the link below to access your donor portal:\n\n{manageUrl}\n\nIn the portal, you can manage subscriptions, download invoices, and view your donation history.\n\nThis link expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you did not request this link, you can safely ignore this email.\n\n {product_name} Team"
},
"dsa_report_verification": {
"subject": "Verify your email for a DSA report",
"body": "Hello,\n\nUse the verification code below to submit your Digital Services Act report on {product_name}:\n\n{code}\n\nThis code expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you didn't request this, you can ignore this email.\n\n {product_name} Safety Team"
},
"email_change_new": {
"subject": "Verify your new {product_name} email",
"body": "Hello {username},\n\nEnter this code in the app to verify your new {product_name} email:\n\n{code}\n\nThis code expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you didn't request this, you can ignore this email.\n\n {product_name} Team"
},
"email_change_original": {
"subject": "Confirm your {product_name} email change",
"body": "Hello {username},\n\nWe received a request to change the email address 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, please secure your account right away.\n\n {product_name} Team"
},
"email_change_revert": {
"subject": "Your {product_name} email was changed",
"body": "Hello {username},\n\nThe email address on your {product_name} account was changed to {newEmail}.\n\nIf you made this change, no action is needed. If you didn't, you can revert the change and secure your account using this link:\n\n{revertUrl}\n\nThis will restore your previous email, sign you out everywhere, remove linked phone numbers, disable MFA, and require you to set a new password.\n\n {product_name} Safety Team"
},
"email_verification": {
"subject": "Verify your {product_name} email address",
"body": "Hello {username},\n\nPlease verify the email address for your {product_name} account by clicking the link below:\n\n{verifyUrl}\n\nIf you didn't create a {product_name} account, you can safely ignore this email.\n\nThis link is valid for 24 hours.\n\n {product_name} Team"
},
"gift_chargeback_notification": {
"subject": "Perks from your redeemed gift have been removed",
"body": "Hello {username},\n\nA gift code you redeemed was originally paid for by someone else. That payment has since been reversed (a chargeback).\n\nBecause of this, we've removed the perks that were added to your account when you redeemed the gift.\n\nIf you think this is a mistake, please contact our support team and include any details you have about the gift code and when you redeemed it.\n\n {product_name} Team"
},
"harvest_completed": {
"subject": "Your {product_name} data export is ready to download",
"body": "Hello {username},\n\nYour data export is ready.\n\nDownload link:\n{downloadUrl}\n\nMessages included: {totalMessages, number}\nFile size: {fileSizeMB, number} MB\n\nThis link expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you didn't request this export, please change your password immediately and contact our support team.\n\n {product_name} Team"
},
"inactivity_warning": {
"subject": "Your {product_name} account will be deleted due to inactivity",
"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"
},
"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"
},
"password_reset": {
"subject": "Reset your {product_name} password",
"body": "Hello {username},\n\nYou requested a {product_name} password reset. Use the link below to set a new password:\n\n{resetUrl}\n\nIf you didn't request this, you can safely ignore this email.\n\nThis link is valid for 1 hour.\n\n {product_name} Team"
},
"registration_approved": {
"subject": "Your {product_name} registration has been approved",
"body": "Hello {username},\n\nGood news: your {product_name} registration has been approved.\n\nYou can now log in to the {product_name} app here:\n{channelsUrl}\n\nWelcome to the {product_name} community.\n\n {product_name} Team"
},
"report_resolved": {
"subject": "Your {product_name} report has been reviewed",
"body": "Hello {username},\n\nYour report (ID: {reportId}) has been reviewed by our Safety Team.{hasComment, select, yes {\n\nResponse from the Safety Team:\n{publicComment}} other {}}\n\nThanks for helping keep {product_name} safe for everyone. We take all reports seriously and appreciate your contribution to the community.\n\nIf you have any questions or concerns about this outcome, please contact {safety_email}.\n\n {product_name} Safety Team"
},
"scheduled_deletion_notification": {
"subject": "Your {product_name} account will be permanently deleted",
"body": "Hello {username},\n\nYour {product_name} account has been scheduled for permanent deletion.\n\nScheduled deletion: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nThis is a serious enforcement action. Your account data will be permanently deleted on the scheduled date.\n\nIf you believe this enforcement decision was incorrect, you can submit an appeal. Email {appeals_email} from this email address.\n\n {product_name} Safety Team"
},
"self_deletion_scheduled": {
"subject": "Your {product_name} account deletion is scheduled",
"body": "Hello {username},\n\nYou requested to delete your {product_name} account. Your account is scheduled for permanent deletion on:\n\n{deletionDate, date, full} at {deletionDate, time, short}\n\nIf you didn't request this, sign in to your account to cancel the deletion. We also recommend changing your password to secure your account.\n\n {product_name} Team"
},
"unban_notification": {
"subject": "Your {product_name} account suspension has been lifted",
"body": "Hello {username},\n\nGood news: your {product_name} account suspension has been lifted.\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nYou can now log back in and continue using {product_name} as normal.\n\n {product_name} Safety Team"
}
});
export default EMAIL_I18N_EN_GB_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"email_change_original": {
"subject": "Confirma tu cambio de correo electrónico de {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}"
},
"email_verification": {
"subject": "Verifica tu dirección de correo electrónico de {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": {
"subject": "Los beneficios de tu regalo canjeado han sido eliminados",
"body": "Hola {username}:\n\nUn código de regalo que canjeaste fue pagado originalmente por otra persona. Ese pago ha sido revertido (un contracargo).\n\nDebido a esto, hemos eliminado los beneficios que se agregaron a tu cuenta cuando canjeaste el regalo.\n\nSi crees que esto es un error, comunícate con nuestro equipo de soporte e incluye cualquier detalle que tengas sobre el código de regalo y cuándo lo canjeaste.\n\n Equipo de {product_name}"
},
"harvest_completed": {
"subject": "Tu exportación de datos de {product_name} está lista para descargar",
"body": "Hola {username}:\n\nTu exportación de datos está lista.\n\nEnlace de descarga:\n{downloadUrl}\n\nMensajes incluidos: {totalMessages, number}\nTamaño del archivo: {fileSizeMB, number} MB\n\nEste enlace vence el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esta exportación, por favor, cambia tu contraseña inmediatamente y comunícate con nuestro equipo de soporte.\n\n Equipo de {product_name}"
},
"inactivity_warning": {
"subject": "Tu cuenta de {product_name} será eliminada debido a inactividad",
"body": "Hola {username}:\n\nNo hemos visto 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 inactividad.\n\nInicia sesión aquí:\n{loginUrl}\n\nSi has usado {product_name} recientemente, por favor, comunícate con nuestro equipo de soporte de inmediato.\n\n Equipo de {product_name}"
},
"ip_authorization": {
"subject": "Autoriza el inicio de sesión desde una nueva dirección IP",
"body": "Hola {username}:\n\nDetectamos 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ú, por favor, autoriza esta dirección IP haciendo clic en el siguiente enlace:\n\n{authUrl}\n\nSi no intentaste iniciar sesión, por favor, cambia tu contraseña de inmediato.\n\nEste enlace es válido por 30 minutos.\n\n Equipo de {product_name}"
},
"password_change_verification": {
"subject": "Confirma tu cambio de contraseña de {product_name}",
"body": "Hola {username}:\n\nRecibimos una solicitud para cambiar la contraseña 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 a las {expiresAt}.\n\nSi no solicitaste esto, alguien podría tener acceso a tu cuenta. Cambia tu contraseña inmediatamente y habilita la autenticación de dos factores.\n\n Equipo de {product_name}"
},
"password_reset": {
"subject": "Restablece tu contraseña de {product_name}",
"body": "Hola {username}:\n\nSolicitaste un restablecimiento de contraseña de {product_name}. Usa el siguiente enlace para establecer una nueva contraseña:\n\n{resetUrl}\n\nSi no solicitaste esto, puedes ignorar este correo electrónico de forma segura.\n\nEste enlace es válido por 1 hora.\n\n Equipo de {product_name}"
},
"registration_approved": {
"subject": "Tu registro en {product_name} ha sido aprobado",
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_ES_419_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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}"
},
"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}"
},
"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}"
},
"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}"
},
"donation_magic_link": {
"subject": "Gestiona tus donaciones de {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}"
},
"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}"
},
"email_change_original": {
"subject": "Confirma tu cambio de correo electrónico para {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}"
},
"email_verification": {
"subject": "Verifica tu dirección de correo electrónico para {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": {
"subject": "Se han eliminado las ventajas obtenidas con tu regalo canjeado",
"body": "Hola {username}:\n\nUn código de regalo que canjeaste fue pagado originalmente por otra persona. Ese pago ha sido revertido (una devolución de cargo).\n\nDebido a esto, hemos eliminado las ventajas que se añadieron a tu cuenta cuando canjeaste el regalo.\n\nSi crees que esto es un error, ponte en contacto con nuestro equipo de soporte e incluye cualquier detalle que tengas sobre el código de regalo y cuándo lo canjeaste.\n\n Equipo de {product_name}"
},
"harvest_completed": {
"subject": "Tu exportación de datos de {product_name} está lista para descargar",
"body": "Hola {username}:\n\nTu exportación de datos está lista.\n\nEnlace de descarga:\n{downloadUrl}\n\nMensajes incluidos: {totalMessages, number}\nTamaño del archivo: {fileSizeMB, number} MB\n\nEste enlace caduca el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esta exportación, cambia tu contraseña inmediatamente y ponte en contacto con nuestro equipo de soporte.\n\n Equipo de {product_name}"
},
"inactivity_warning": {
"subject": "Tu cuenta de {product_name} será eliminada debido a la inactividad",
"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}"
},
"password_change_verification": {
"subject": "Confirma tu cambio de contraseña en {product_name}",
"body": "Hola {username}:\n\nHemos recibido una solicitud para cambiar la contraseña 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}.\n\nSi no solicitaste esto, alguien podría tener acceso a tu cuenta. Cambia tu contraseña inmediatamente y activa la autenticación de dos factores.\n\n Equipo de {product_name}"
},
"password_reset": {
"subject": "Restablece tu contraseña en {product_name}",
"body": "Hola {username}:\n\nSolicitaste un restablecimiento de contraseña de {product_name}. Usa el siguiente enlace para establecer una nueva contraseña:\n\n{resetUrl}\n\nSi no solicitaste esto, puedes ignorar este correo electrónico.\n\nEste enlace es válido durante 1 hora.\n\n Equipo de {product_name}"
},
"registration_approved": {
"subject": "Tu registro en {product_name} ha sido aprobado",
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_ES_ES_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_FI_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Käyttäjätilisi {product_name}-palvelussa on tilapäisesti poistettu käytöstä",
"body": "Hei {username},\n\nOlemme poistaneet {product_name}-tilisi tilapäisesti käytöstä, koska havaitsimme epäilyttävää toimintaa.\n\n{reason, select,\n null {}\n other {Syy: {reason}}\n}\n\nPäästäksesi takaisin tilillesi sinun on nollattava salasanasi:\n\n{forgotUrl}\n\nKun olet nollannut salasanasi, voit kirjautua sisään uudelleen.\n\nJos uskot, että tämä oli virhe, ota yhteyttä tukitiimiimme.\n\n {product_name}-turvallisuustiimi"
},
"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"
},
"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"
},
"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"
},
"donation_magic_link": {
"subject": "Hallinnoi {product_name}-palvelun 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"
},
"email_change_new": {
"subject": "Vahvista uusi sähköpostiosoitteesi {product_name}-tilillä",
"body": "Hei {username},\n\nSyötä tämä koodi sovellukseen vahvistaaksesi uuden sähköpostiosoitteesi {product_name}-tilillä:\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}-tiimi"
},
"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"
},
"email_change_revert": {
"subject": "{product_name}-tilisi sähköpostiosoite on vaihdettu",
"body": "Hei {username},\n\nSähköpostiosoitteesi {product_name}-tilillä on vaihdettu osoitteeseen {newEmail}.\n\nJos teit tämän muutoksen, toimenpiteitä ei tarvita. Jos et tehnyt, voit kumota muutoksen ja turvata tilisi käyttämällä tätä linkkiä:\n\n{revertUrl}\n\nTämä palauttaa edellisen sähköpostiosoitteesi, kirjaa sinut ulos kaikkialta, poistaa linkitetyt puhelinnumerot, poistaa MFA:n käytöstä ja edellyttää uuden salasanan asettamista.\n\n {product_name}-turvallisuustiimi"
},
"email_verification": {
"subject": "Vahvista sähköpostiosoitteesi {product_name}-tilillä",
"body": "Hei {username},\n\nVahvista {product_name}-tilisi sähköpostiosoite napsauttamalla alla olevaa linkkiä:\n\n{verifyUrl}\n\nJos et luonut {product_name}-tiliä, voit jättää tämän sähköpostin turvallisesti huomiotta.\n\nTämä linkki on voimassa 24 tuntia.\n\n {product_name}-tiimi"
},
"gift_chargeback_notification": {
"subject": "Lunastamasi lahjan edut on poistettu",
"body": "Hei {username},\n\nLunastamasi lahjakoodin oli alun perin maksanut joku muu. Kyseinen maksu on sittemmin peruutettu (takaisinperintä).\n\nTämän vuoksi olemme poistaneet edut, jotka lisättiin tilillesi, kun lunastit lahjan.\n\nJos uskot tämän olevan virhe, ota yhteyttä tukitiimiimme ja liitä mukaan kaikki tiedot lahjakoodista ja sen lunastusajankohdasta.\n\n {product_name}-tiimi"
},
"harvest_completed": {
"subject": "{product_name}-tietojesi vienti on ladattavissa",
"body": "Hei {username},\n\nTietojesi vienti on valmis.\n\nLatauslinkki:\n{downloadUrl}\n\nMukana olevat viestit: {totalMessages, number}\nTiedoston koko: {fileSizeMB, number} MB\n\nTämä linkki vanhenee {expiresAt, date, full} klo {expiresAt, time, short}.\n\nJos et pyytänyt tätä vientiä, vaihda salasanasi välittömästi ja ota yhteyttä tukitiimiimme.\n\n {product_name}-tiimi"
},
"inactivity_warning": {
"subject": "{product_name}-tilisi poistetaan käyttämättömyyden vuoksi",
"body": "Hei {username},\n\nEmme ole havainneet toimintaa {product_name}-tililläsi {lastActiveDate, date, full} jälkeen.\n\nJos et kirjaudu sisään {deletionDate, date, full} klo {deletionDate, time, short} mennessä, tilisi poistetaan pysyvästi passiivisuuden vuoksi.\n\nKirjaudu sisään täältä:\n{loginUrl}\n\nJos olet käyttänyt {product_name}-palvelua äskettäin, ota yhteyttä tukitiimiimme välittömästi.\n\n {product_name}-tiimi"
},
"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"
},
"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"
},
"password_reset": {
"subject": "Nollaa {product_name}-salasanasi",
"body": "Hei {username},\n\nPyysit {product_name}-salasanan nollausta. Käytä alla olevaa linkkiä asettaaksesi uuden salasanan:\n\n{resetUrl}\n\nJos et pyytänyt tätä, voit jättää tämän sähköpostin turvallisesti huomiotta.\n\nTämä linkki on voimassa 1 tunnin.\n\n {product_name}-tiimi"
},
"registration_approved": {
"subject": "{product_name}-rekisteröitymisesi on hyväksytty",
"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"
},
"scheduled_deletion_notification": {
"subject": "Käyttäjätilisi {product_name}-palvelussa poistetaan pysyvästi",
"body": "Hei {username},\n\n{product_name}-tilisi on ajoitettu poistettavaksi pysyvästi.\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\nJos uskot, että tämä päätös oli virheellinen, voit tehdä valituksen. Lähetä sähköpostia osoitteeseen {appeals_email} tästä sähköpostiosoitteesta.\n\n {product_name}-turvallisuustiimi"
},
"self_deletion_scheduled": {
"subject": "{product_name}-tilisi poistaminen on ajoitettu",
"body": "Hei {username},\n\nPyysit {product_name}-tilisi poistamista. Tilisi on ajoitettu poistettavaksi pysyvästi:\n\n{deletionDate, date, full} klo {deletionDate, time, short}\n\nJos et pyytänyt tätä, kirjaudu tilillesi peruuttaaksesi poiston. Suosittelemme myös vaihtamaan salasanasi tilisi turvaamiseksi.\n\n {product_name}-tiimi"
},
"unban_notification": {
"subject": "{product_name}-tilisi jäädytys on poistettu",
"body": "Hei {username},\n\nHyviä uutisia: {product_name}-tilisi jäädytys on poistettu.\n\n{reason, select,\n null {}\n other {Syy: {reason}}\n}\n\nVoit nyt kirjautua takaisin sisään ja jatkaa {product_name}-palvelun käyttöä normaalisti.\n\n {product_name}-turvallisuustiimi"
}
});
export default EMAIL_I18N_FI_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_FR_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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קוד מתנה שמימשתם שולם במקור על ידי מישהו אחר. תשלום זה בוטל מאז (החזר חיוב).\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}"
},
"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 חדשה",
"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}"
},
"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}"
},
"password_reset": {
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_HE_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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} सेफ्टी टीम"
},
"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} सेफ्टी टीम"
},
"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} टीम"
},
"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} सेफ्टी टीम"
},
"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} टीम"
},
"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} टीम"
},
"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} सेफ्टी टीम"
},
"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आपके द्वारा रिडीम किए गए एक गिफ्ट कोड का पेमेंट मूल रूप से किसी और ने किया था। वह पेमेंट तब से वापस ले लिया गया है (एक चार्जबैक)।\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} टीम"
},
"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 एड्रेस से लॉगिन को ऑथराइज़ करें",
"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} टीम"
},
"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} टीम"
},
"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} रजिस्ट्रेशन अप्रूव हो गया है",
"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} सेफ्टी टीम"
},
"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} सेफ्टी टीम"
},
"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} टीम"
},
"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} सेफ्टी टीम"
}
});
export default EMAIL_I18N_HI_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
}
});
export default EMAIL_I18N_HR_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
}
});
export default EMAIL_I18N_HU_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"harvest_completed": {
"subject": "Ekspor data {product_name}mu 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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_ID_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_IT_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_JA_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}安全チーム"
},
"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}安全チーム"
},
"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}チーム"
},
"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}安全チーム"
},
"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}チーム"
},
"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}チーム"
},
"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}安全チーム"
},
"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引き換えられたギフトコードは、元々他の方が支払ったものです。その支払いはその後取り消されました(チャージバック)。\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}チーム"
},
"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}チーム"
},
"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}チーム"
},
"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}チーム"
},
"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}の登録が承認されました",
"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}安全チーム"
},
"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}安全チーム"
},
"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}チーム"
},
"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}安全チーム"
}
});
export default EMAIL_I18N_JA_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_KO_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} 안전팀"
},
"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} 안전팀"
},
"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} 팀"
},
"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} 안전팀"
},
"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} 팀"
},
"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} 팀"
},
"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} 안전팀"
},
"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사용하신 선물 코드는 다른 사용자가 결제한 것이었어요. 해당 결제가 취소(차지백)되었어요.\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} 팀"
},
"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} 팀"
},
"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} 팀"
},
"password_change_verification": {
"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} 팀"
},
"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회원님의 신고(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} 안전팀"
},
"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} 팀"
},
"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} 안전팀"
}
});
export default EMAIL_I18N_KO_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
}
});
export default EMAIL_I18N_LT_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
}
});
export default EMAIL_I18N_NL_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
}
});
export default EMAIL_I18N_NO_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"email_change_new": {
"subject": "Zweryfikuj nowy adres e-mail dla {product_name}",
"body": "Witaj {username},\n\nWprowadź ten kod w aplikacji, aby zweryfikować swój nowy adres e-mail dla {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ół {product_name}"
},
"email_change_original": {
"subject": "Potwierdź zmianę adresu e-mail w {product_name}",
"body": "Witaj {username},\n\nOtrzymaliśmy prośbę o zmianę adresu e-mail Twojego konta {product_name}.\n\nAby potwierdzić tę zmianę, wprowadź ten kod w aplikacji:\n\n{code}\n\nTen kod wygasa {expiresAt, date, full} o {expiresAt, time, short}.\n\nJeśli nie prosiłeś o to, natychmiast zabezpiecz swoje konto.\n\n Zespół {product_name}"
},
"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}"
},
"email_verification": {
"subject": "Zweryfikuj adres e-mail w {product_name}",
"body": "Witaj {username},\n\nZweryfikuj adres e-mail swojego konta {product_name}, klikając poniższy link:\n\n{verifyUrl}\n\nJeśli nie utworzyłeś konta {product_name}, możesz bezpiecznie zignorować tę wiadomość e-mail.\n\nTen link jest ważny przez 24 godziny.\n\n Zespół {product_name}"
},
"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}"
},
"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}"
},
"inactivity_warning": {
"subject": "Twoje konto {product_name} zostanie usunięte z powodu braku aktywności",
"body": "Witaj {username},\n\nNie odnotowaliśmy żadnej aktywności na Twoim koncie {product_name} od {lastActiveDate, date, full}.\n\nJeśli nie zalogujesz się do {deletionDate, date, full} o {deletionDate, time, short}, Twoje konto zostanie usunięte na stałe z powodu nieaktywności.\n\nZaloguj się tutaj:\n{loginUrl}\n\nJeśli ostatnio korzystałeś z {product_name}, natychmiast skontaktuj się z naszym zespołem wsparcia.\n\n Zespół {product_name}"
},
"ip_authorization": {
"subject": "Autoryzuj logowanie z nowego adresu IP",
"body": "Witaj {username},\n\nWykryliśmy próbę logowania do Twojego konta {product_name} z nowego adresu IP:\n\nAdres IP: {ipAddress}\nLokalizacja: {location}\n\nJeśli to Ty, autoryzuj ten adres IP, klikając poniższy link:\n\n{authUrl}\n\nJeśli nie próbowałeś się zalogować, natychmiast zmień hasło.\n\nTen link jest ważny przez 30 minut.\n\n Zespół {product_name}"
},
"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}"
},
"password_reset": {
"subject": "Zresetuj hasło w {product_name}",
"body": "Witaj {username},\n\nPoprosiłeś o zresetowanie hasła w {product_name}. Użyj poniższego linku, aby ustawić nowe hasło:\n\n{resetUrl}\n\nJeśli nie prosiłeś o to, możesz bezpiecznie zignorować tę wiadomość e-mail.\n\nTen link jest ważny przez 1 godzinę.\n\n Zespół {product_name}"
},
"registration_approved": {
"subject": "Twoja rejestracja w {product_name} została zatwierdzona",
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_PL_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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}"
},
"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}"
},
"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}"
},
"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}"
},
"donation_magic_link": {
"subject": "Gerenciar suas doações do {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}"
},
"email_change_new": {
"subject": "Verifique seu novo e-mail do {product_name}",
"body": "Olá, {username},\n\nInsira este código no aplicativo para verificar seu novo e-mail do {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 do {product_name}"
},
"email_change_original": {
"subject": "Confirme a alteração do e-mail da sua conta do {product_name}",
"body": "Olá, {username},\n\nRecebemos uma solicitação para alterar o endereço de e-mail da sua conta do {product_name}.\n\nPara confirmar esta alteraçã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, por favor, proteja sua conta imediatamente.\n\n Equipe do {product_name}"
},
"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}"
},
"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",
"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": {
"subject": "Sua exportação de dados do {product_name} está pronta para download",
"body": "Olá, {username},\n\nSua exportação de dados está pronta.\n\nLink para download:\n{downloadUrl}\n\nMensagens incluídas: {totalMessages, number}\nTamanho do arquivo: {fileSizeMB, number} MB\n\nEste link expira em {expiresAt, date, full} às {expiresAt, time, short}.\n\nSe você não solicitou esta exportação, por favor, altere sua senha imediatamente e entre em contato com nossa equipe de suporte.\n\n Equipe do {product_name}"
},
"inactivity_warning": {
"subject": "A sua conta do {product_name} será excluída devido à inatividade",
"body": "Olá, {username},\n\nNão vimos nenhuma atividade em sua conta do {product_name} desde {lastActiveDate, date, full}.\n\nSe você não entrar até {deletionDate, date, full} às {deletionDate, time, short}, sua conta será excluída permanentemente devido à inatividade.\n\nEntre aqui:\n{loginUrl}\n\nSe você usou o {product_name} recentemente, entre em contato com nossa equipe de suporte imediatamente.\n\n Equipe do {product_name}"
},
"ip_authorization": {
"subject": "Autorizar login de um novo endereço IP",
"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}"
},
"password_change_verification": {
"subject": "Confirme a alteração da senha da sua conta do {product_name}",
"body": "Olá, {username},\n\nRecebemos uma solicitação para alterar a senha da sua conta do {product_name}.\n\nPara confirmar esta alteração, insira este código no aplicativo:\n\n{code}\n\nEste código expira em {expiresAt}.\n\nSe você não solicitou isso, alguém pode ter acesso à sua conta. Altere sua senha imediatamente e ative a autenticação de dois fatores.\n\n Equipe do {product_name}"
},
"password_reset": {
"subject": "Redefina a senha da sua conta do {product_name}",
"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}"
},
"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}"
},
"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}"
},
"self_deletion_scheduled": {
"subject": "A exclusão da sua conta do {product_name} está agendada",
"body": "Olá, {username},\n\nVocê solicitou a exclusão da sua conta do {product_name}. Sua conta está agendada para exclusão permanente em:\n\n{deletionDate, date, full} às {deletionDate, time, short}\n\nSe você não solicitou isso, entre em sua conta para cancelar a exclusão. Também recomendamos alterar sua senha para proteger sua conta.\n\n Equipe do {product_name}"
},
"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}"
}
});
export default EMAIL_I18N_PT_BR_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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"
},
"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"
},
"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"
},
"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}"
},
"donation_magic_link": {
"subject": "Gestionează-ți donațiile pentru {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}"
},
"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}"
},
"email_change_original": {
"subject": "Confirmă schimbarea adresei de e-mail pentru {product_name}",
"body": "Salut {username},\n\nAm primit o solicitare de schimbare a adresei de e-mail a 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 data de {expiresAt, date, full} la ora {expiresAt, time, short}.\n\nDacă nu ai solicitat acest lucru, te rugăm să-ți securizezi contul imediat.\n\n Echipa {product_name}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"ip_authorization": {
"subject": "Autorizează conectarea de la o nouă adresă IP",
"body": "Salut {username},\n\nAm detectat o tentativă de conectare la contul tău {product_name} de la o nouă adresă IP:\n\nAdresă IP: {ipAddress}\nLocație: {location}\n\nDacă ai fost tu, te rugăm să autorizezi această adresă IP apăsând pe linkul de mai jos:\n\n{authUrl}\n\nDacă nu ai încercat să te conectezi, te rugăm să-ți schimbi parola imediat.\n\nAcest link este valabil 30 de minute.\n\n Echipa {product_name}"
},
"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}"
},
"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}"
},
"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}"
},
"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"
},
"self_deletion_scheduled": {
"subject": "Ștergerea contului {product_name} a fost programată",
"body": "Salut {username},\n\nAi solicitat ștergerea contului tău {product_name}. Contul tău este programat pentru ștergere permanentă la:\n\n{deletionDate, date, full} la ora {deletionDate, time, short}\n\nDacă nu ai solicitat acest lucru, conectează-te la contul tău pentru a anula ștergerea. De asemenea, îți recomandăm să-ți schimbi parola pentru a-ți securiza contul.\n\n Echipa {product_name}"
},
"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"
}
});
export default EMAIL_I18N_RO_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_RU_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}"
},
"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}"
},
"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}"
},
"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}"
},
"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Используй код подтверждения ниже, чтобы отправить свой отчёт DSA по {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}"
},
"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}"
},
"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}"
},
"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Подарочный код, который ты активировал, изначально был оплачен другим человеком. Этот платёж был отменён (возвратный платёж).\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}"
},
"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-адреса",
"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}"
},
"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}"
},
"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} одобрена",
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_RU_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export 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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
}
});
export default EMAIL_I18N_SV_SE_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_TH_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}"
},
"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}"
},
"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}"
},
"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ใช้รหัสยืนยันด้านล่างเพื่อส่งรายงาน Digital Services Act ของคุณบน {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}"
},
"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}"
},
"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}"
},
"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รหัสของขวัญที่คุณแลกรับนั้นเดิมทีชำระโดยผู้อื่น การชำระเงินดังกล่าวถูกยกเลิกในภายหลัง (การเรียกเก็บเงินคืน)\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}"
},
"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 ใหม่",
"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}"
},
"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}"
},
"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} ได้รับการอนุมัติแล้ว",
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_TH_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_TR_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "{product_name} hesabın geçici olarak devre dışı bırakıldı",
"body": "Merhaba {username},\n\nŞüpheli etkinlik tespit ettiğimiz için {product_name} hesabını geçici olarak devre dışı bıraktık.\n\n{reason, select,\n null {}\n other {Sebep: {reason}}\n}\n\nHesabına tekrar erişmek için şifreni sıfırlaman gerekiyor:\n\n{forgotUrl}\n\nŞifreni sıfırladıktan sonra tekrar giriş yapabilirsin.\n\nBunun bir hata olduğunu düşünüyorsan, lütfen destek ekibimizle iletişime geç.\n\n {product_name} Güvenlik Ekibi"
},
"account_scheduled_deletion": {
"subject": "{product_name} hesabın kalıcı olarak silinecek",
"body": "Merhaba {username},\n\nHizmet Şartlarımızı veya Topluluk Kurallarımızı ihlal ettiğin için {product_name} hesabın kalıcı olarak silinmek üzere planlandı.\n\nPlanlanan silme tarihi: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Sebep: {reason}}\n}\n\nBu ciddi bir yaptırım eylemidir. Hesap verilerin planlanan tarihte kalıcı olarak silinecektir.\n\nLütfen incele:\n- Hizmet Şartları: {termsUrl}\n- Topluluk Kuralları: {guidelinesUrl}\n\nİtiraz süreci:\nBu yaptırım kararının yanlış veya haksız olduğuna inanıyorsan, itiraz göndermek için 60 günün var. Bu e-posta adresinden {appeals_email} adresine e-posta gönder.\n\nİtirazında:\n- Yaptırım kararının neden yanlış veya haksız olduğuna inandığını açıkça açıkla\n- İlgili kanıt veya bağlam sağla\n\n{product_name} Güvenlik Ekibi'nden bir üye itirazını inceleyecek ve nihai bir karar verilene kadar bekleyen silme işlemini duraklatabilir.\n\n {product_name} Güvenlik Ekibi"
},
"account_temp_banned": {
"subject": "{product_name} hesabın geçici olarak askıya alındı",
"body": "Merhaba {username},\n\nHizmet Şartlarımızı veya Topluluk Kurallarımızı ihlal ettiğin için {product_name} hesabını geçici olarak askıya aldık.\n\nSüre: {durationHours, plural,\n =1 {1 saat}\n other {# saat}\n}\nAskıya alınma bitiş tarihi: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Sebep: {reason}}\n}\n\nBu süre boyunca hesabına erişemeyeceksin.\n\nLütfen incele:\n- Hizmet Şartları: {termsUrl}\n- Topluluk Kuralları: {guidelinesUrl}\n\nBu yaptırım kararının yanlış veya haksız olduğuna inanıyorsan, itiraz gönderebilirsin. Bu e-posta adresinden {appeals_email} adresine e-posta gönder ve kararın neden yanlış olduğuna inandığını açıkça açıkla. İtirazını inceleyip kararımızı sana bildireceğiz.\n\n {product_name} Güvenlik Ekibi"
},
"donation_confirmation": {
"subject": "{product_name}'a yaptığın bağış için teşekkürler",
"body": "Merhaba,\n\n{product_name}'a yaptığın bağış için teşekkürler! {interval, select,\n month {tekrarlayan bağışın}\n year {tekrarlayan bağışın}\n other {tek seferlik bağışın}\n} başarıyla {interval, select,\n month {ayarlandı}\n year {ayarlandı}\n other {işlendi}\n}.\n\nBağış detayları:\nMiktar: {amount} {currency} {interval, select,\n month {aylık}\n year {yıllık}\n other {}\n}\n\nStripe, kısa süre içinde fatura PDF'ini içeren ayrı bir makbuzu sana e-posta ile gönderecektir. Bu, tüm ödeme detaylarını içerir ve vergi amaçlı kullanılabilir.\n\nBu bağlantıyı kullanarak istediğin zaman bağış geçmişini görüntüleyebilir, faturaları indirebilir, {interval, select,\n month {ve aboneliğini yönetebilir veya iptal edebilirsin}\n year {ve aboneliğini yönetebilir veya iptal edebilirsin}\n other {ve gelecekteki bağışlarını yönetebilirsin}\n}:\n\n{manageUrl}\n\nDesteğin {product_name}'ın çalışmaya devam etmesine yardımcı oluyor. Teşekkürler!\n\n {product_name} Ekibi"
},
"donation_magic_link": {
"subject": "{product_name}'ın bağışlarını yönet",
"body": "Merhaba,\n\nBağışçı portalına erişmek için aşağıdaki bağlantıya tıkla:\n\n{manageUrl}\n\nPortalda aboneliklerini yönetebilir, faturaları indirebilir ve bağış geçmişini görüntüleyebilirsin.\n\nBu bağlantı {expiresAt, date, full} {expiresAt, time, short} tarihinde sona erecektir.\n\nBu bağlantıyı sen talep etmediysen, bu e-postayı güvenle yok sayabilirsin.\n\n {product_name} Ekibi"
},
"dsa_report_verification": {
"subject": "DSA raporu için e-postanı doğrula",
"body": "Merhaba,\n\n{product_name}'daki Dijital Hizmetler Yasası raporunu göndermek için aşağıdaki doğrulama kodunu kullan:\n\n{code}\n\nBu kod {expiresAt, date, full} {expiresAt, time, short} tarihinde sona erecektir.\n\nBunu sen talep etmediysen, bu e-postayı güvenle yok sayabilirsin.\n\n {product_name} Güvenlik Ekibi"
},
"email_change_new": {
"subject": "{product_name}'ın yeni e-postasını doğrula",
"body": "Merhaba {username},\n\nYeni {product_name} e-postanı doğrulamak için bu kodu uygulamaya gir:\n\n{code}\n\nBu kod {expiresAt, date, full} {expiresAt, time, short} tarihinde sona erecektir.\n\nBunu sen talep etmediysen, bu e-postayı güvenle yok sayabilirsin.\n\n {product_name} Ekibi"
},
"email_change_original": {
"subject": "{product_name} e-posta değişikliğini onayla",
"body": "Merhaba {username},\n\n{product_name} hesabındaki e-posta adresini değiştirme isteği aldık.\n\nBu değişikliği onaylamak için bu kodu uygulamaya gir:\n\n{code}\n\nBu kod {expiresAt, date, full} {expiresAt, time, short} tarihinde sona erecektir.\n\nBunu sen talep etmediysen, lütfen hemen hesabını güvence altına al.\n\n {product_name} Ekibi"
},
"email_change_revert": {
"subject": "{product_name} e-posta adresin değiştirildi",
"body": "Merhaba {username},\n\n{product_name} hesabındaki e-posta adresi {newEmail} olarak değiştirildi.\n\nBu değişikliği sen yaptıysan, herhangi bir işlem yapmana gerek yok. Yapmadıysan, bu bağlantıyı kullanarak değişikliği geri alabilir ve hesabını güvence altına alabilirsin:\n\n{revertUrl}\n\nBu işlem, önceki e-postanı geri yükleyecek, seni her yerden çıkış yapacak, bağlantılı telefon numaralarını kaldıracak, MFA'yı devre dışı bırakacak ve yeni bir şifre belirlemeni gerektirecektir.\n\n {product_name} Güvenlik Ekibi"
},
"email_verification": {
"subject": "{product_name} e-posta adresini doğrula",
"body": "Merhaba {username},\n\n{product_name} hesabının e-posta adresini aşağıdaki bağlantıya tıklayarak doğrula:\n\n{verifyUrl}\n\nBir {product_name} hesabı oluşturmadıysan, bu e-postayı güvenle yok sayabilirsin.\n\nBu bağlantı 24 saat geçerlidir.\n\n {product_name} Ekibi"
},
"gift_chargeback_notification": {
"subject": "Kullandığın hediye avantajları kaldırıldı",
"body": "Merhaba {username},\n\nKullandığın bir hediye kodunun ödemesi başlangıçta başka biri tarafından yapılmıştı. Bu ödeme daha sonra geri alındı (ters ibraz).\n\nBu nedenle, hediyeyi kullandığında hesabına eklenen avantajlar kaldırıldı.\n\nBunun bir hata olduğunu düşünüyorsan, lütfen destek ekibimizle iletişime geç ve hediye koduyla ilgili sahip olduğun tüm detayları ve ne zaman kullandığını belirt.\n\n {product_name} Ekibi"
},
"harvest_completed": {
"subject": "{product_name} veri dışa aktarımın indirilmeye hazır",
"body": "Merhaba {username},\n\nVeri dışa aktarımın hazır.\n\nİndirme bağlantısı:\n{downloadUrl}\n\nDahil edilen mesajlar: {totalMessages, number}\nDosya boyutu: {fileSizeMB, number} MB\n\nBu bağlantı {expiresAt, date, full} {expiresAt, time, short} tarihinde sona erecektir.\n\nBu dışa aktarımı sen talep etmediysen, lütfen hemen şifreni değiştir ve destek ekibimizle iletişime geç.\n\n {product_name} Ekibi"
},
"inactivity_warning": {
"subject": "{product_name} hesabın hareketsizlik nedeniyle silinecek",
"body": "Merhaba {username},\n\n{lastActiveDate, date, full} tarihinden beri {product_name} hesabında herhangi bir etkinlik görmedik.\n\n{deletionDate, date, full} {deletionDate, time, short} tarihine kadar giriş yapmazsan, hesabın hareketsizlik nedeniyle kalıcı olarak silinecektir.\n\nBuradan giriş yap:\n{loginUrl}\n\n{product_name}'ı yakın zamanda kullandıysan, lütfen hemen destek ekibimizle iletişime geç.\n\n {product_name} Ekibi"
},
"ip_authorization": {
"subject": "Yeni bir IP adresinden girişi yetkilendir",
"body": "Merhaba {username},\n\n{product_name} hesabına yeni bir IP adresinden giriş denemesi tespit ettik:\n\nIP adresi: {ipAddress}\nKonum: {location}\n\nBu sen isen, lütfen aşağıdaki bağlantıya tıklayarak bu IP adresini yetkilendir:\n\n{authUrl}\n\nGiriş yapmaya sen çalışmadıysan, lütfen hemen şifreni değiştir.\n\nBu bağlantı 30 dakika boyunca geçerlidir.\n\n {product_name} Ekibi"
},
"password_change_verification": {
"subject": "{product_name} şifre değişikliğini onayla",
"body": "Merhaba {username},\n\n{product_name} hesabının şifresini değiştirme isteği aldık.\n\nBu değişikliği onaylamak için bu kodu uygulamaya gir:\n\n{code}\n\nBu kod {expiresAt} tarihinde sona erecektir.\n\nBunu sen talep etmediysen, birisi hesabına erişmiş olabilir. Şifreni hemen değiştir ve iki faktörlü kimlik doğrulamayı etkinleştir.\n\n {product_name} Ekibi"
},
"password_reset": {
"subject": "{product_name} şifreni sıfırla",
"body": "Merhaba {username},\n\n{product_name} şifre sıfırlama talebinde bulundun. Yeni bir şifre belirlemek için aşağıdaki bağlantıyı kullan:\n\n{resetUrl}\n\nBunu sen talep etmediysen, bu e-postayı güvenle yok sayabilirsin.\n\nBu bağlantı 1 saat geçerlidir.\n\n {product_name} Ekibi"
},
"registration_approved": {
"subject": "{product_name} kaydın onaylandı",
"body": "Merhaba {username},\n\nİyi haber: {product_name} kaydın onaylandı.\n\nArtık {product_name} uygulamasına buradan giriş yapabilirsin:\n{channelsUrl}\n\n{product_name} topluluğuna hoş geldin.\n\n {product_name} Ekibi"
},
"report_resolved": {
"subject": "{product_name} raporun incelendi",
"body": "Merhaba {username},\n\nRaporun (Kimlik: {reportId}) Güvenlik Ekibimiz tarafından incelendi.{hasComment, select, yes {\n\nGüvenlik Ekibinden yanıt:\n{publicComment}} other {}}\n\n{product_name}'ı herkes için güvenli tutmaya yardımcı olduğun için teşekkür ederiz. Tüm raporları ciddiye alıyoruz ve topluluğa katkını takdir ediyoruz.\n\nBu sonuç hakkında herhangi bir sorunun veya endişen varsa, lütfen {safety_email} adresine ulaşabilirsin.\n\n {product_name} Güvenlik Ekibi"
},
"scheduled_deletion_notification": {
"subject": "{product_name} hesabın kalıcı olarak silinecek",
"body": "Merhaba {username},\n\n{product_name} hesabın kalıcı olarak silinmek üzere planlandı.\n\nPlanlanan silme tarihi: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Sebep: {reason}}\n}\n\nBu ciddi bir yaptırım eylemidir. Hesap verilerin planlanan tarihte kalıcı olarak silinecektir.\n\nBu yaptırım kararının yanlış olduğuna inanıyorsan, itiraz gönderebilirsin. Bu e-posta adresinden {appeals_email} adresine e-posta gönder.\n\n {product_name} Güvenlik Ekibi"
},
"self_deletion_scheduled": {
"subject": "{product_name} hesabının silinmesi planlandı",
"body": "Merhaba {username},\n\n{product_name} hesabını silme talebinde bulundun. Hesabın kalıcı olarak silinmek üzere planlandı:\n\n{deletionDate, date, full} {deletionDate, time, short} tarihinde\n\nBunu sen talep etmediysen, silme işlemini iptal etmek için hesabına giriş yap. Ayrıca hesabını güvence altına almak için şifreni değiştirmeni öneririz.\n\n {product_name} Ekibi"
},
"unban_notification": {
"subject": "{product_name} hesabının askıya alınması kaldırıldı",
"body": "Merhaba {username},\n\nİyi haber: {product_name} hesabının askıya alınması kaldırıldı.\n\n{reason, select,\n null {}\n other {Sebep: {reason}}\n}\n\nArtık tekrar giriş yapabilir ve {product_name}'ı normal şekilde kullanmaya devam edebilirsin.\n\n {product_name} Güvenlik Ekibi"
}
});
export default EMAIL_I18N_TR_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_UK_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}"
},
"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}"
},
"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}"
},
"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}"
},
"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Використай код підтвердження нижче, щоб подати звіт DSA для {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}"
},
"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}"
},
"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}"
},
"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Подарунковий код, який ти активував, спочатку був оплачений кимось іншим. Цей платіж згодом скасовано (повернення коштів).\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}"
},
"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-адреси",
"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}"
},
"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}"
},
"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} схвалено",
"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}"
},
"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}"
},
"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}"
},
"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}"
}
});
export default EMAIL_I18N_UK_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_VI_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
"subject": "Tài khoản {product_name} của bạn đã bị vô hiệu hóa tạm thời",
"body": "Xin chào {username},\n\nChúng tôi đã tạm thời vô hiệu hóa tài khoản {product_name} của bạn vì phát hiện hoạt động đáng ngờ.\n\n{reason, select,\n null {}\n other {Lý do: {reason}}\n}\n\nĐể truy cập lại tài khoản, bạn cần đặt lại mật khẩu:\n\n{forgotUrl}\n\nSau khi đặt lại mật khẩu, bạn sẽ có thể đăng nhập lại.\n\nNếu bạn cho rằng đây là lỗi, vui lòng liên hệ đội ngũ hỗ trợ của chúng tôi.\n\n Đội ngũ An toàn {product_name}"
},
"account_scheduled_deletion": {
"subject": "Tài khoản {product_name} của bạn sẽ bị xóa vĩnh viễn",
"body": "Xin chào {username},\n\nTài khoản {product_name} của bạn đã được lên lịch xóa vĩnh viễn do vi phạm Điều khoản dịch vụ hoặc Nguyên tắc cộng đồng của chúng tôi.\n\nLịch xóa: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Lý do: {reason}}\n}\n\nĐây là một hành động thực thi nghiêm trọng. Dữ liệu tài khoản của bạn sẽ bị xóa vĩnh viễn vào ngày đã lên lịch.\n\nVui lòng xem lại:\n- Điều khoản dịch vụ: {termsUrl}\n- Nguyên tắc cộng đồng: {guidelinesUrl}\n\nQuy trình kháng nghị:\nNếu bạn cho rằng quyết định này không chính xác hoặc không hợp lý, bạn có 60 ngày để gửi kháng nghị. Gửi email đến {appeals_email} từ địa chỉ email này.\n\nTrong kháng nghị của bạn:\n- Giải thích rõ ràng lý do bạn cho rằng quyết định này không chính xác hoặc không hợp lý\n- Cung cấp bất kỳ bằng chứng hoặc ngữ cảnh liên quan nào\n\nMột thành viên của Đội ngũ An toàn {product_name} sẽ xem xét kháng nghị của bạn và có thể tạm dừng việc xóa đang chờ xử lý cho đến khi có quyết định cuối cùng.\n\n Đội ngũ An toàn {product_name}"
},
"account_temp_banned": {
"subject": "Tài khoản {product_name} của bạn đã bị tạm ngưng",
"body": "Xin chào {username},\n\nTài khoản {product_name} của bạn đã bị tạm ngưng do vi phạm Điều khoản dịch vụ hoặc Nguyên tắc cộng đồng của chúng tôi.\n\nThời gian: {durationHours, plural,\n =1 {1 giờ}\n other {# giờ}\n}\nBị tạm ngưng cho đến: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Lý do: {reason}}\n}\n\nTrong thời gian này, bạn sẽ không thể truy cập tài khoản của mình.\n\nVui lòng xem lại:\n- Điều khoản dịch vụ: {termsUrl}\n- Nguyên tắc cộng đồng: {guidelinesUrl}\n\nNếu bạn cho rằng quyết định này không chính xác hoặc không hợp lý, bạn có thể gửi kháng nghị. Gửi email đến {appeals_email} từ địa chỉ email này và giải thích rõ ràng lý do bạn cho rằng quyết định đó không chính xác. Chúng tôi sẽ xem xét kháng nghị của bạn và phản hồi bằng quyết định của chúng tôi.\n\n Đội ngũ An toàn {product_name}"
},
"donation_confirmation": {
"subject": "Cảm ơn bạn đã ủng hộ {product_name}",
"body": "Xin chào,\n\nCảm ơn bạn đã ủng hộ {product_name}! {interval, select,\n month {Đóng góp định kỳ}\n year {Đóng góp định kỳ}\n other {Khoản đóng góp một lần}\n} của bạn đã được {interval, select,\n month {thiết lập}\n year {thiết lập}\n other {xử lý}\n} thành công.\n\nChi tiết ủng hộ:\nSố tiền: {amount} {currency} {interval, select,\n month {mỗi tháng}\n year {mỗi năm}\n other {}\n}\n\nStripe sẽ gửi email cho bạn một biên lai riêng kèm theo hóa đơn PDF của bạn trong thời gian ngắn. Biên lai này bao gồm tất cả các chi tiết thanh toán và có thể được sử dụng cho mục đích thuế.\n\nBạn có thể xem lịch sử ủng hộ, tải xuống hóa đơn, {interval, select,\n month {và quản lý hoặc hủy đăng ký}\n year {và quản lý hoặc hủy đăng ký}\n other {và quản lý các khoản ủng hộ trong tương lai}\n} bất cứ lúc nào bằng cách sử dụng liên kết này:\n\n{manageUrl}\n\nSự hỗ trợ của bạn giúp {product_name} tiếp tục hoạt động. Cảm ơn bạn!\n\n Đội ngũ {product_name}"
},
"donation_magic_link": {
"subject": "Quản lý các khoản ủng hộ {product_name} của bạn",
"body": "Xin chào,\n\nNhấp vào liên kết bên dưới để truy cập cổng thông tin người ủng hộ của bạn:\n\n{manageUrl}\n\nTrong cổng thông tin, bạn có thể quản lý đăng ký, tải xuống hóa đơn và xem lịch sử ủng hộ của mình.\n\nLiên kết này hết hạn vào {expiresAt, date, full} lúc {expiresAt, time, short}.\n\nNếu bạn không yêu cầu liên kết này, bạn có thể bỏ qua email này.\n\n Đội ngũ {product_name}"
},
"dsa_report_verification": {
"subject": "Xác minh email của bạn cho báo cáo DSA",
"body": "Xin chào,\n\nSử dụng mã xác minh bên dưới để gửi báo cáo Đạo luật Dịch vụ Kỹ thuật số của bạn trên {product_name}:\n\n{code}\n\nMã này hết hạn vào {expiresAt, date, full} lúc {expiresAt, time, short}.\n\nNếu bạn không yêu cầu mã này, bạn có thể bỏ qua email này.\n\n Đội ngũ An toàn {product_name}"
},
"email_change_new": {
"subject": "Xác minh email {product_name} mới của bạn",
"body": "Xin chào {username},\n\nNhập mã này vào ứng dụng để xác minh email {product_name} mới của bạn:\n\n{code}\n\nMã này hết hạn vào {expiresAt, date, full} lúc {expiresAt, time, short}.\n\nNếu bạn không yêu cầu mã này, bạn có thể bỏ qua email này.\n\n Đội ngũ {product_name}"
},
"email_change_original": {
"subject": "Xác nhận thay đổi email của bạn trên {product_name}",
"body": "Xin chào {username},\n\nChúng tôi đã nhận được yêu cầu thay đổi địa chỉ email trên tài khoản {product_name} của bạn.\n\nĐể xác nhận thay đổi này, hãy nhập mã này vào ứng dụng:\n\n{code}\n\nMã này hết hạn vào {expiresAt, date, full} lúc {expiresAt, time, short}.\n\nNếu bạn không yêu cầu thay đổi này, vui lòng bảo mật tài khoản của bạn ngay lập tức.\n\n Đội ngũ {product_name}"
},
"email_change_revert": {
"subject": "Email của bạn trên {product_name} đã được thay đổi",
"body": "Xin chào {username},\n\nĐịa chỉ email trên tài khoản {product_name} của bạn đã được thay đổi thành {newEmail}.\n\nNếu bạn đã thực hiện thay đổi này, bạn không cần thực hiện hành động nào. Nếu không, bạn có thể hoàn tác thay đổi và bảo mật tài khoản của mình bằng cách sử dụng liên kết này:\n\n{revertUrl}\n\nThao tác này sẽ khôi phục email trước đó của bạn, đăng xuất bạn khỏi mọi nơi, xóa số điện thoại đã liên kết, tắt MFA và yêu cầu bạn đặt mật khẩu mới.\n\n Đội ngũ An toàn {product_name}"
},
"email_verification": {
"subject": "Xác minh địa chỉ email của bạn trên {product_name}",
"body": "Xin chào {username},\n\nVui lòng xác minh địa chỉ email cho tài khoản {product_name} của bạn bằng cách nhấp vào liên kết bên dưới:\n\n{verifyUrl}\n\nNếu bạn không tạo tài khoản {product_name}, bạn có thể bỏ qua email này.\n\nLiên kết này có hiệu lực trong 24 giờ.\n\n Đội ngũ {product_name}"
},
"gift_chargeback_notification": {
"subject": "Các đặc quyền từ quà tặng bạn đã đổi đã bị xóa",
"body": "Xin chào {username},\n\nMã quà tặng bạn đã đổi ban đầu được thanh toán bởi người khác. Khoản thanh toán đó sau đó đã bị đảo ngược (chargeback).\n\nVì lý do này, chúng tôi đã xóa các đặc quyền được thêm vào tài khoản của bạn khi bạn đổi quà tặng.\n\nNếu bạn cho rằng đây là lỗi, vui lòng liên hệ đội ngũ hỗ trợ của chúng tôi và cung cấp bất kỳ chi tiết nào bạn có về mã quà tặng và thời điểm bạn đổi mã đó.\n\n Đội ngũ {product_name}"
},
"harvest_completed": {
"subject": "Xuất dữ liệu {product_name} của bạn đã sẵn sàng để tải xuống",
"body": "Xin chào {username},\n\nBản xuất dữ liệu của bạn đã sẵn sàng.\n\nLiên kết tải xuống:\n{downloadUrl}\n\nTin nhắn bao gồm: {totalMessages, number}\nKích thước tệp: {fileSizeMB, number} MB\n\nLiên kết này hết hạn vào {expiresAt, date, full} lúc {expiresAt, time, short}.\n\nNếu bạn không yêu cầu xuất dữ liệu này, vui lòng thay đổi mật khẩu ngay lập tức và liên hệ đội ngũ hỗ trợ của chúng tôi.\n\n Đội ngũ {product_name}"
},
"inactivity_warning": {
"subject": "Tài khoản {product_name} của bạn sẽ bị xóa do không hoạt động",
"body": "Xin chào {username},\n\nChúng tôi chưa thấy bất kỳ hoạt động nào trên tài khoản {product_name} của bạn kể từ {lastActiveDate, date, full}.\n\nNếu bạn không đăng nhập trước {deletionDate, date, full} lúc {deletionDate, time, short}, tài khoản của bạn sẽ bị xóa vĩnh viễn do không hoạt động.\n\nĐăng nhập tại đây:\n{loginUrl}\n\nNếu bạn đã sử dụng {product_name} gần đây, vui lòng liên hệ đội ngũ hỗ trợ của chúng tôi ngay lập tức.\n\n Đội ngũ {product_name}"
},
"ip_authorization": {
"subject": "Cho phép đăng nhập từ địa chỉ IP mới",
"body": "Xin chào {username},\n\nChúng tôi đã phát hiện một nỗ lực đăng nhập vào tài khoản {product_name} của bạn từ một địa chỉ IP mới:\n\nĐịa chỉ IP: {ipAddress}\nVị trí: {location}\n\nNếu đây là bạn, vui lòng cho phép địa chỉ IP này bằng cách nhấp vào liên kết bên dưới:\n\n{authUrl}\n\nNếu bạn không thực hiện nỗ lực đăng nhập, vui lòng thay đổi mật khẩu ngay lập tức.\n\nLiên kết này có hiệu lực trong 30 phút.\n\n Đội ngũ {product_name}"
},
"password_change_verification": {
"subject": "Xác nhận thay đổi mật khẩu của bạn trên {product_name}",
"body": "Xin chào {username},\n\nChúng tôi đã nhận được yêu cầu thay đổi mật khẩu trên tài khoản {product_name} của bạn.\n\nĐể xác nhận thay đổi này, hãy nhập mã này vào ứng dụng:\n\n{code}\n\nMã này hết hạn lúc {expiresAt}.\n\nNếu bạn không yêu cầu thay đổi này, ai đó có thể đã truy cập vào tài khoản của bạn. Thay đổi mật khẩu ngay lập tức và bật xác thực hai yếu tố.\n\n Đội ngũ {product_name}"
},
"password_reset": {
"subject": "Đặt lại mật khẩu của bạn trên {product_name}",
"body": "Xin chào {username},\n\nBạn đã yêu cầu đặt lại mật khẩu {product_name}. Sử dụng liên kết bên dưới để đặt mật khẩu mới:\n\n{resetUrl}\n\nNếu bạn không yêu cầu điều này, bạn có thể bỏ qua email này.\n\nLiên kết này có hiệu lực trong 1 giờ.\n\n Đội ngũ {product_name}"
},
"registration_approved": {
"subject": "Đăng ký {product_name} của bạn đã được chấp thuận",
"body": "Xin chào {username},\n\nTin tốt: đăng ký {product_name} của bạn đã được chấp thuận.\n\nBây giờ bạn có thể đăng nhập vào ứng dụng {product_name} tại đây:\n{channelsUrl}\n\nChào mừng bạn đến với cộng đồng {product_name}.\n\n Đội ngũ {product_name}"
},
"report_resolved": {
"subject": "Báo cáo {product_name} của bạn đã được xem xét",
"body": "Xin chào {username},\n\nBáo cáo của bạn (ID: {reportId}) đã được Đội ngũ An toàn của chúng tôi xem xét.{hasComment, select, yes {\n\nPhản hồi từ Đội ngũ An toàn:\n{publicComment}} other {}}\n\nCảm ơn bạn đã giúp giữ cho {product_name} an toàn cho mọi người. Chúng tôi xem xét tất cả các báo cáo một cách nghiêm túc và đánh giá cao sự đóng góp của bạn cho cộng đồng.\n\nNếu bạn có bất kỳ câu hỏi hoặc lo ngại nào về kết quả này, vui lòng liên hệ {safety_email}.\n\n Đội ngũ An toàn {product_name}"
},
"scheduled_deletion_notification": {
"subject": "Tài khoản {product_name} của bạn sẽ bị xóa vĩnh viễn",
"body": "Xin chào {username},\n\nTài khoản {product_name} của bạn đã được lên lịch xóa vĩnh viễn.\n\nLịch xóa: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Lý do: {reason}}\n}\n\nĐây là một hành động thực thi nghiêm trọng. Dữ liệu tài khoản của bạn sẽ bị xóa vĩnh viễn vào ngày đã lên lịch.\n\nNếu bạn cho rằng quyết định này không chính xác, bạn có thể gửi kháng nghị. Gửi email đến {appeals_email} từ địa chỉ email này.\n\n Đội ngũ An toàn {product_name}"
},
"self_deletion_scheduled": {
"subject": "Xóa tài khoản {product_name} của bạn đã được lên lịch",
"body": "Xin chào {username},\n\nBạn đã yêu cầu xóa tài khoản {product_name} của mình. Tài khoản của bạn được lên lịch xóa vĩnh viễn vào:\n\n{deletionDate, date, full} lúc {deletionDate, time, short}\n\nNếu bạn không yêu cầu điều này, hãy đăng nhập vào tài khoản của bạn để hủy xóa. Chúng tôi cũng khuyên bạn nên thay đổi mật khẩu để bảo mật tài khoản của mình.\n\n Đội ngũ {product_name}"
},
"unban_notification": {
"subject": "Tài khoản {product_name} của bạn đã được bỏ tạm ngưng",
"body": "Xin chào {username},\n\nTin tốt: tài khoản {product_name} của bạn đã được bỏ tạm ngưng.\n\n{reason, select,\n null {}\n other {Lý do: {reason}}\n}\n\nBây giờ bạn có thể đăng nhập lại và tiếp tục sử dụng {product_name} như bình thường.\n\n Đội ngũ An toàn {product_name}"
}
});
export default EMAIL_I18N_VI_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_ZH_CN_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} 安全团队"
},
"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} 安全团队"
},
"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} 团队"
},
"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} 安全团队"
},
"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} 团队"
},
"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} 团队"
},
"email_change_revert": {
"subject": "你的 {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} 团队"
},
"gift_chargeback_notification": {
"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} 团队"
},
"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} 团队"
},
"ip_authorization": {
"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} 团队"
},
"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} 团队"
},
"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} 注册已通过",
"body": "你好 {username}\n\n好消息:你的 {product_name} 注册已通过。\n\n你现在可以登录 {product_name} 应用:\n{channelsUrl}\n\n欢迎加入 {product_name} 社区。\n\n {product_name} Team"
},
"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} 安全团队"
},
"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} 安全团队"
},
"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} 团队"
},
"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} 安全团队"
}
});
export default EMAIL_I18N_ZH_CN_MESSAGES;
@@ -0,0 +1,92 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
export const EMAIL_I18N_ZH_TW_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} 安全團隊"
},
"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} 安全團隊"
},
"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} 團隊"
},
"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} 安全團隊"
},
"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} 團隊"
},
"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} 團隊"
},
"email_change_revert": {
"subject": "您的 {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} 團隊"
},
"gift_chargeback_notification": {
"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} 團隊"
},
"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} 團隊"
},
"ip_authorization": {
"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} 團隊"
},
"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} 團隊"
},
"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} 註冊已獲批准",
"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} 安全團隊"
},
"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} 安全團隊"
},
"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} 團隊"
},
"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} 安全團隊"
}
});
export default EMAIL_I18N_ZH_TW_MESSAGES;
@@ -0,0 +1,86 @@
{
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"email_change_revert": {
"subject": "تم تغيير بريدك الإلكتروني في {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}"
},
"gift_chargeback_notification": {
"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}"
},
"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 جديد",
"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}"
},
"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}"
},
"password_reset": {
"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}"
},
"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}"
},
"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}"
},
"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}"
}
}
@@ -0,0 +1,86 @@
{
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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 адрес",
"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}"
},
"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}"
},
"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} е одобрена",
"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}"
},
"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}"
},
"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}"
},
"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}"
}
}
@@ -0,0 +1,86 @@
{
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
}
}
@@ -0,0 +1,86 @@
{
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
}
}
@@ -0,0 +1,86 @@
{
"account_disabled_suspicious": {
"subject": "Dein {product_name}-Konto wurde vorübergehend deaktiviert",
"body": "Hallo {username},\n\nwir haben dein {product_name}-Konto vorübergehend deaktiviert, da wir verdächtige Aktivitäten festgestellt haben.\n\n{reason, select,\n null {}\n other {Grund: {reason}}\n}\n\nUm wieder Zugriff auf dein Konto zu erhalten, musst du dein Passwort zurücksetzen:\n\n{forgotUrl}\n\nNachdem du dein Passwort zurückgesetzt hast, kannst du dich wieder anmelden.\n\nWenn du glaubst, dass dies ein Fehler war, kontaktiere bitte unser Support-Team.\n\n {product_name}-Sicherheitsteam"
},
"account_scheduled_deletion": {
"subject": "Dein {product_name}-Konto wird dauerhaft gelöscht",
"body": "Hallo {username},\n\ndein {product_name}-Konto 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 Kontodaten 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"
},
"account_temp_banned": {
"subject": "Dein {product_name}-Konto wurde vorübergehend gesperrt",
"body": "Hallo {username},\n\ndein {product_name}-Konto wurde vorübergehend gesperrt, weil du gegen unsere Nutzungsbedingungen oder Community-Richtlinien verstoßen hast.\n\nDauer: {durationHours, plural,\n one {1 Stunde}\n other {# Stunden}\n}\nGesperrt bis: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Grund: {reason}}\n}\n\nWährend dieser Zeit kannst du nicht auf dein Konto zugreifen.\n\nBitte lies dir Folgendes durch:\n- Nutzungsbedingungen: {termsUrl}\n- Community-Richtlinien: {guidelinesUrl}\n\nWenn du glaubst, dass diese Entscheidung falsch oder ungerechtfertigt war, kannst du Einspruch einlegen. Sende eine E-Mail von dieser E-Mail-Adresse an {appeals_email} und erkläre klar, warum du die Entscheidung für falsch hältst. Wir werden deinen Einspruch prüfen und dir unsere Entscheidung mitteilen.\n\n {product_name}-Sicherheitsteam"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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}-Kontos 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 dies nicht angefordert hast, sichere dein Konto bitte sofort.\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}-Kontos 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 dein Konto über diesen Link sichern:\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"
},
"email_verification": {
"subject": "Bestätige deine {product_name}-E-Mail-Adresse",
"body": "Hallo {username},\n\nbitte bestätige die E-Mail-Adresse für dein {product_name}-Konto, indem du auf den untenstehenden Link klickst:\n\n{verifyUrl}\n\nWenn du kein {product_name}-Konto 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 Konto 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"
},
"inactivity_warning": {
"subject": "Dein {product_name}-Konto wird wegen Inaktivität gelöscht",
"body": "Hallo {username},\n\nwir haben seit dem {lastActiveDate, date, full} keine Aktivität auf deinem {product_name}-Konto festgestellt.\n\nWenn du dich nicht bis zum {deletionDate, date, full} um {deletionDate, time, short} anmeldest, wird dein Konto 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 dein {product_name}-Konto 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"
},
"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}-Kontos 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 dies nicht angefordert hast, könnte jemand Zugriff auf dein Konto 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"
},
"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"
},
"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"
},
"scheduled_deletion_notification": {
"subject": "Dein {product_name}-Konto wird dauerhaft gelöscht",
"body": "Hallo {username},\n\ndein {product_name}-Konto wurde 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 Kontodaten werden am geplanten Datum dauerhaft gelöscht.\n\nWenn du glaubst, dass diese Entscheidung falsch war, kannst du Einspruch einlegen. Sende eine E-Mail von dieser E-Mail-Adresse an {appeals_email}.\n\n {product_name}-Sicherheitsteam"
},
"self_deletion_scheduled": {
"subject": "Die Löschung deines {product_name}-Kontos ist geplant",
"body": "Hallo {username},\n\ndu hast die Löschung deines {product_name}-Kontos beantragt. Dein Konto ist zur dauerhaften Löschung vorgesehen am:\n\n{deletionDate, date, full} um {deletionDate, time, short}\n\nWenn du dies nicht beantragt hast, melde dich in deinem Konto an, um die Löschung abzubrechen. Wir empfehlen außerdem, dein Passwort zu ändern, um dein Konto zu sichern.\n\n {product_name} Team"
},
"unban_notification": {
"subject": "Die Sperrung deines {product_name}-Kontos wurde aufgehoben",
"body": "Hallo {username},\n\ngute Nachrichten: Die Sperrung deines {product_name}-Kontos wurde aufgehoben.\n\n{reason, select,\n null {}\n other {Grund: {reason}}\n}\n\nDu kannst dich jetzt wieder anmelden und {product_name} wie gewohnt nutzen.\n\n {product_name}-Sicherheitsteam"
}
}
@@ -0,0 +1,86 @@
{
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"gift_chargeback_notification": {
"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}"
},
"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",
"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}"
},
"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}"
},
"password_reset": {
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
}
}
@@ -0,0 +1,86 @@
{
"account_disabled_suspicious": {
"subject": "Your {product_name} account has been temporarily disabled",
"body": "Hello {username},\n\nWe temporarily disabled your {product_name} account because we detected suspicious activity.\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nTo regain access to your account, you'll need to reset your password:\n\n{forgotUrl}\n\nAfter you reset your password, you'll be able to log in again.\n\nIf you believe this was done in error, please contact our support team.\n\n {product_name} Safety Team"
},
"account_scheduled_deletion": {
"subject": "Your {product_name} account will be permanently deleted",
"body": "Hello {username},\n\nYour {product_name} account has been scheduled for permanent deletion due to violations of our Terms of Service or Community Guidelines.\n\nScheduled deletion: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nThis is a serious enforcement action. Your account data will be permanently deleted on the scheduled date.\n\nPlease review:\n- Terms of Service: {termsUrl}\n- Community Guidelines: {guidelinesUrl}\n\nAppeals process:\nIf you believe this enforcement decision was incorrect or unjustified, you have 60 days to submit an appeal. Email {appeals_email} from this email address.\n\nIn your appeal:\n- Clearly explain why you believe the enforcement decision was incorrect or unjustified\n- Provide any relevant evidence or context\n\nA member of the {product_name} Safety Team will review your appeal and may pause the pending deletion until a final decision has been reached.\n\n {product_name} Safety Team"
},
"account_temp_banned": {
"subject": "Your {product_name} account has been temporarily suspended",
"body": "Hello {username},\n\nYour {product_name} account has been temporarily suspended for violating our Terms of Service or Community Guidelines.\n\nDuration: {durationHours, plural,\n =1 {1 hour}\n other {# hours}\n}\nSuspended until: {bannedUntil, date, full} {bannedUntil, time, short}\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nDuring this time, you won't be able to access your account.\n\nPlease review:\n- Terms of Service: {termsUrl}\n- Community Guidelines: {guidelinesUrl}\n\nIf you believe this enforcement decision was incorrect or unjustified, you can submit an appeal. Email {appeals_email} from this email address and clearly explain why you believe the decision was incorrect. We'll review your appeal and respond with our decision.\n\n {product_name} Safety Team"
},
"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"
},
"donation_magic_link": {
"subject": "Manage your {product_name} donations",
"body": "Hello,\n\nClick the link below to access your donor portal:\n\n{manageUrl}\n\nIn the portal, you can manage subscriptions, download invoices, and view your donation history.\n\nThis link expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you did not request this link, you can safely ignore this email.\n\n {product_name} Team"
},
"dsa_report_verification": {
"subject": "Verify your email for a DSA report",
"body": "Hello,\n\nUse the verification code below to submit your Digital Services Act report on {product_name}:\n\n{code}\n\nThis code expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you didn't request this, you can ignore this email.\n\n {product_name} Safety Team"
},
"email_change_new": {
"subject": "Verify your new {product_name} email",
"body": "Hello {username},\n\nEnter this code in the app to verify your new {product_name} email:\n\n{code}\n\nThis code expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you didn't request this, you can ignore this email.\n\n {product_name} Team"
},
"email_change_original": {
"subject": "Confirm your {product_name} email change",
"body": "Hello {username},\n\nWe received a request to change the email address 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, please secure your account right away.\n\n {product_name} Team"
},
"email_change_revert": {
"subject": "Your {product_name} email was changed",
"body": "Hello {username},\n\nThe email address on your {product_name} account was changed to {newEmail}.\n\nIf you made this change, no action is needed. If you didn't, you can revert the change and secure your account using this link:\n\n{revertUrl}\n\nThis will restore your previous email, sign you out everywhere, remove linked phone numbers, disable MFA, and require you to set a new password.\n\n {product_name} Safety Team"
},
"email_verification": {
"subject": "Verify your {product_name} email address",
"body": "Hello {username},\n\nPlease verify the email address for your {product_name} account by clicking the link below:\n\n{verifyUrl}\n\nIf you didn't create a {product_name} account, you can safely ignore this email.\n\nThis link is valid for 24 hours.\n\n {product_name} Team"
},
"gift_chargeback_notification": {
"subject": "Perks from your redeemed gift have been removed",
"body": "Hello {username},\n\nA gift code you redeemed was originally paid for by someone else. That payment has since been reversed (a chargeback).\n\nBecause of this, we've removed the perks that were added to your account when you redeemed the gift.\n\nIf you think this is a mistake, please contact our support team and include any details you have about the gift code and when you redeemed it.\n\n {product_name} Team"
},
"harvest_completed": {
"subject": "Your {product_name} data export is ready to download",
"body": "Hello {username},\n\nYour data export is ready.\n\nDownload link:\n{downloadUrl}\n\nMessages included: {totalMessages, number}\nFile size: {fileSizeMB, number} MB\n\nThis link expires on {expiresAt, date, full} at {expiresAt, time, short}.\n\nIf you didn't request this export, please change your password immediately and contact our support team.\n\n {product_name} Team"
},
"inactivity_warning": {
"subject": "Your {product_name} account will be deleted due to inactivity",
"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"
},
"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"
},
"password_reset": {
"subject": "Reset your {product_name} password",
"body": "Hello {username},\n\nYou requested a {product_name} password reset. Use the link below to set a new password:\n\n{resetUrl}\n\nIf you didn't request this, you can safely ignore this email.\n\nThis link is valid for 1 hour.\n\n {product_name} Team"
},
"registration_approved": {
"subject": "Your {product_name} registration has been approved",
"body": "Hello {username},\n\nGood news: your {product_name} registration has been approved.\n\nYou can now log in to the {product_name} app here:\n{channelsUrl}\n\nWelcome to the {product_name} community.\n\n {product_name} Team"
},
"report_resolved": {
"subject": "Your {product_name} report has been reviewed",
"body": "Hello {username},\n\nYour report (ID: {reportId}) has been reviewed by our Safety Team.{hasComment, select, yes {\n\nResponse from the Safety Team:\n{publicComment}} other {}}\n\nThanks for helping keep {product_name} safe for everyone. We take all reports seriously and appreciate your contribution to the community.\n\nIf you have any questions or concerns about this outcome, please contact {safety_email}.\n\n {product_name} Safety Team"
},
"scheduled_deletion_notification": {
"subject": "Your {product_name} account will be permanently deleted",
"body": "Hello {username},\n\nYour {product_name} account has been scheduled for permanent deletion.\n\nScheduled deletion: {deletionDate, date, full} {deletionDate, time, short}\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nThis is a serious enforcement action. Your account data will be permanently deleted on the scheduled date.\n\nIf you believe this enforcement decision was incorrect, you can submit an appeal. Email {appeals_email} from this email address.\n\n {product_name} Safety Team"
},
"self_deletion_scheduled": {
"subject": "Your {product_name} account deletion is scheduled",
"body": "Hello {username},\n\nYou requested to delete your {product_name} account. Your account is scheduled for permanent deletion on:\n\n{deletionDate, date, full} at {deletionDate, time, short}\n\nIf you didn't request this, sign in to your account to cancel the deletion. We also recommend changing your password to secure your account.\n\n {product_name} Team"
},
"unban_notification": {
"subject": "Your {product_name} account suspension has been lifted",
"body": "Hello {username},\n\nGood news: your {product_name} account suspension has been lifted.\n\n{reason, select,\n null {}\n other {Reason: {reason}}\n}\n\nYou can now log back in and continue using {product_name} as normal.\n\n {product_name} Safety Team"
}
}
@@ -0,0 +1,86 @@
{
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"email_change_original": {
"subject": "Confirma tu cambio de correo electrónico de {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}"
},
"email_verification": {
"subject": "Verifica tu dirección de correo electrónico de {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": {
"subject": "Los beneficios de tu regalo canjeado han sido eliminados",
"body": "Hola {username}:\n\nUn código de regalo que canjeaste fue pagado originalmente por otra persona. Ese pago ha sido revertido (un contracargo).\n\nDebido a esto, hemos eliminado los beneficios que se agregaron a tu cuenta cuando canjeaste el regalo.\n\nSi crees que esto es un error, comunícate con nuestro equipo de soporte e incluye cualquier detalle que tengas sobre el código de regalo y cuándo lo canjeaste.\n\n Equipo de {product_name}"
},
"harvest_completed": {
"subject": "Tu exportación de datos de {product_name} está lista para descargar",
"body": "Hola {username}:\n\nTu exportación de datos está lista.\n\nEnlace de descarga:\n{downloadUrl}\n\nMensajes incluidos: {totalMessages, number}\nTamaño del archivo: {fileSizeMB, number} MB\n\nEste enlace vence el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esta exportación, por favor, cambia tu contraseña inmediatamente y comunícate con nuestro equipo de soporte.\n\n Equipo de {product_name}"
},
"inactivity_warning": {
"subject": "Tu cuenta de {product_name} será eliminada debido a inactividad",
"body": "Hola {username}:\n\nNo hemos visto 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 inactividad.\n\nInicia sesión aquí:\n{loginUrl}\n\nSi has usado {product_name} recientemente, por favor, comunícate con nuestro equipo de soporte de inmediato.\n\n Equipo de {product_name}"
},
"ip_authorization": {
"subject": "Autoriza el inicio de sesión desde una nueva dirección IP",
"body": "Hola {username}:\n\nDetectamos 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ú, por favor, autoriza esta dirección IP haciendo clic en el siguiente enlace:\n\n{authUrl}\n\nSi no intentaste iniciar sesión, por favor, cambia tu contraseña de inmediato.\n\nEste enlace es válido por 30 minutos.\n\n Equipo de {product_name}"
},
"password_change_verification": {
"subject": "Confirma tu cambio de contraseña de {product_name}",
"body": "Hola {username}:\n\nRecibimos una solicitud para cambiar la contraseña 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 a las {expiresAt}.\n\nSi no solicitaste esto, alguien podría tener acceso a tu cuenta. Cambia tu contraseña inmediatamente y habilita la autenticación de dos factores.\n\n Equipo de {product_name}"
},
"password_reset": {
"subject": "Restablece tu contraseña de {product_name}",
"body": "Hola {username}:\n\nSolicitaste un restablecimiento de contraseña de {product_name}. Usa el siguiente enlace para establecer una nueva contraseña:\n\n{resetUrl}\n\nSi no solicitaste esto, puedes ignorar este correo electrónico de forma segura.\n\nEste enlace es válido por 1 hora.\n\n Equipo de {product_name}"
},
"registration_approved": {
"subject": "Tu registro en {product_name} ha sido aprobado",
"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}"
},
"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}"
},
"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}"
},
"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}"
}
}
@@ -0,0 +1,86 @@
{
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"donation_magic_link": {
"subject": "Gestiona tus donaciones de {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}"
},
"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}"
},
"email_change_original": {
"subject": "Confirma tu cambio de correo electrónico para {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}"
},
"email_verification": {
"subject": "Verifica tu dirección de correo electrónico para {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": {
"subject": "Se han eliminado las ventajas obtenidas con tu regalo canjeado",
"body": "Hola {username}:\n\nUn código de regalo que canjeaste fue pagado originalmente por otra persona. Ese pago ha sido revertido (una devolución de cargo).\n\nDebido a esto, hemos eliminado las ventajas que se añadieron a tu cuenta cuando canjeaste el regalo.\n\nSi crees que esto es un error, ponte en contacto con nuestro equipo de soporte e incluye cualquier detalle que tengas sobre el código de regalo y cuándo lo canjeaste.\n\n Equipo de {product_name}"
},
"harvest_completed": {
"subject": "Tu exportación de datos de {product_name} está lista para descargar",
"body": "Hola {username}:\n\nTu exportación de datos está lista.\n\nEnlace de descarga:\n{downloadUrl}\n\nMensajes incluidos: {totalMessages, number}\nTamaño del archivo: {fileSizeMB, number} MB\n\nEste enlace caduca el {expiresAt, date, full} a las {expiresAt, time, short}.\n\nSi no solicitaste esta exportación, cambia tu contraseña inmediatamente y ponte en contacto con nuestro equipo de soporte.\n\n Equipo de {product_name}"
},
"inactivity_warning": {
"subject": "Tu cuenta de {product_name} será eliminada debido a la inactividad",
"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}"
},
"password_change_verification": {
"subject": "Confirma tu cambio de contraseña en {product_name}",
"body": "Hola {username}:\n\nHemos recibido una solicitud para cambiar la contraseña 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}.\n\nSi no solicitaste esto, alguien podría tener acceso a tu cuenta. Cambia tu contraseña inmediatamente y activa la autenticación de dos factores.\n\n Equipo de {product_name}"
},
"password_reset": {
"subject": "Restablece tu contraseña en {product_name}",
"body": "Hola {username}:\n\nSolicitaste un restablecimiento de contraseña de {product_name}. Usa el siguiente enlace para establecer una nueva contraseña:\n\n{resetUrl}\n\nSi no solicitaste esto, puedes ignorar este correo electrónico.\n\nEste enlace es válido durante 1 hora.\n\n Equipo de {product_name}"
},
"registration_approved": {
"subject": "Tu registro en {product_name} ha sido aprobado",
"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}"
},
"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}"
},
"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}"
},
"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}"
}
}
@@ -0,0 +1,86 @@
{
"account_disabled_suspicious": {
"subject": "Käyttäjätilisi {product_name}-palvelussa on tilapäisesti poistettu käytöstä",
"body": "Hei {username},\n\nOlemme poistaneet {product_name}-tilisi tilapäisesti käytöstä, koska havaitsimme epäilyttävää toimintaa.\n\n{reason, select,\n null {}\n other {Syy: {reason}}\n}\n\nPäästäksesi takaisin tilillesi sinun on nollattava salasanasi:\n\n{forgotUrl}\n\nKun olet nollannut salasanasi, voit kirjautua sisään uudelleen.\n\nJos uskot, että tämä oli virhe, ota yhteyttä tukitiimiimme.\n\n {product_name}-turvallisuustiimi"
},
"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"
},
"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"
},
"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"
},
"donation_magic_link": {
"subject": "Hallinnoi {product_name}-palvelun 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"
},
"email_change_new": {
"subject": "Vahvista uusi sähköpostiosoitteesi {product_name}-tilillä",
"body": "Hei {username},\n\nSyötä tämä koodi sovellukseen vahvistaaksesi uuden sähköpostiosoitteesi {product_name}-tilillä:\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}-tiimi"
},
"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"
},
"email_change_revert": {
"subject": "{product_name}-tilisi sähköpostiosoite on vaihdettu",
"body": "Hei {username},\n\nSähköpostiosoitteesi {product_name}-tilillä on vaihdettu osoitteeseen {newEmail}.\n\nJos teit tämän muutoksen, toimenpiteitä ei tarvita. Jos et tehnyt, voit kumota muutoksen ja turvata tilisi käyttämällä tätä linkkiä:\n\n{revertUrl}\n\nTämä palauttaa edellisen sähköpostiosoitteesi, kirjaa sinut ulos kaikkialta, poistaa linkitetyt puhelinnumerot, poistaa MFA:n käytöstä ja edellyttää uuden salasanan asettamista.\n\n {product_name}-turvallisuustiimi"
},
"email_verification": {
"subject": "Vahvista sähköpostiosoitteesi {product_name}-tilillä",
"body": "Hei {username},\n\nVahvista {product_name}-tilisi sähköpostiosoite napsauttamalla alla olevaa linkkiä:\n\n{verifyUrl}\n\nJos et luonut {product_name}-tiliä, voit jättää tämän sähköpostin turvallisesti huomiotta.\n\nTämä linkki on voimassa 24 tuntia.\n\n {product_name}-tiimi"
},
"gift_chargeback_notification": {
"subject": "Lunastamasi lahjan edut on poistettu",
"body": "Hei {username},\n\nLunastamasi lahjakoodin oli alun perin maksanut joku muu. Kyseinen maksu on sittemmin peruutettu (takaisinperintä).\n\nTämän vuoksi olemme poistaneet edut, jotka lisättiin tilillesi, kun lunastit lahjan.\n\nJos uskot tämän olevan virhe, ota yhteyttä tukitiimiimme ja liitä mukaan kaikki tiedot lahjakoodista ja sen lunastusajankohdasta.\n\n {product_name}-tiimi"
},
"harvest_completed": {
"subject": "{product_name}-tietojesi vienti on ladattavissa",
"body": "Hei {username},\n\nTietojesi vienti on valmis.\n\nLatauslinkki:\n{downloadUrl}\n\nMukana olevat viestit: {totalMessages, number}\nTiedoston koko: {fileSizeMB, number} MB\n\nTämä linkki vanhenee {expiresAt, date, full} klo {expiresAt, time, short}.\n\nJos et pyytänyt tätä vientiä, vaihda salasanasi välittömästi ja ota yhteyttä tukitiimiimme.\n\n {product_name}-tiimi"
},
"inactivity_warning": {
"subject": "{product_name}-tilisi poistetaan käyttämättömyyden vuoksi",
"body": "Hei {username},\n\nEmme ole havainneet toimintaa {product_name}-tililläsi {lastActiveDate, date, full} jälkeen.\n\nJos et kirjaudu sisään {deletionDate, date, full} klo {deletionDate, time, short} mennessä, tilisi poistetaan pysyvästi passiivisuuden vuoksi.\n\nKirjaudu sisään täältä:\n{loginUrl}\n\nJos olet käyttänyt {product_name}-palvelua äskettäin, ota yhteyttä tukitiimiimme välittömästi.\n\n {product_name}-tiimi"
},
"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"
},
"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"
},
"password_reset": {
"subject": "Nollaa {product_name}-salasanasi",
"body": "Hei {username},\n\nPyysit {product_name}-salasanan nollausta. Käytä alla olevaa linkkiä asettaaksesi uuden salasanan:\n\n{resetUrl}\n\nJos et pyytänyt tätä, voit jättää tämän sähköpostin turvallisesti huomiotta.\n\nTämä linkki on voimassa 1 tunnin.\n\n {product_name}-tiimi"
},
"registration_approved": {
"subject": "{product_name}-rekisteröitymisesi on hyväksytty",
"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"
},
"scheduled_deletion_notification": {
"subject": "Käyttäjätilisi {product_name}-palvelussa poistetaan pysyvästi",
"body": "Hei {username},\n\n{product_name}-tilisi on ajoitettu poistettavaksi pysyvästi.\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\nJos uskot, että tämä päätös oli virheellinen, voit tehdä valituksen. Lähetä sähköpostia osoitteeseen {appeals_email} tästä sähköpostiosoitteesta.\n\n {product_name}-turvallisuustiimi"
},
"self_deletion_scheduled": {
"subject": "{product_name}-tilisi poistaminen on ajoitettu",
"body": "Hei {username},\n\nPyysit {product_name}-tilisi poistamista. Tilisi on ajoitettu poistettavaksi pysyvästi:\n\n{deletionDate, date, full} klo {deletionDate, time, short}\n\nJos et pyytänyt tätä, kirjaudu tilillesi peruuttaaksesi poiston. Suosittelemme myös vaihtamaan salasanasi tilisi turvaamiseksi.\n\n {product_name}-tiimi"
},
"unban_notification": {
"subject": "{product_name}-tilisi jäädytys on poistettu",
"body": "Hei {username},\n\nHyviä uutisia: {product_name}-tilisi jäädytys on poistettu.\n\n{reason, select,\n null {}\n other {Syy: {reason}}\n}\n\nVoit nyt kirjautua takaisin sisään ja jatkaa {product_name}-palvelun käyttöä normaalisti.\n\n {product_name}-turvallisuustiimi"
}
}
@@ -0,0 +1,86 @@
{
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
}
}
@@ -0,0 +1,86 @@
{
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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קוד מתנה שמימשתם שולם במקור על ידי מישהו אחר. תשלום זה בוטל מאז (החזר חיוב).\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}"
},
"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 חדשה",
"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}"
},
"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}"
},
"password_reset": {
"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}"
},
"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}"
},
"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}"
},
"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}"
}
}
@@ -0,0 +1,86 @@
{
"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} सेफ्टी टीम"
},
"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} सेफ्टी टीम"
},
"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} टीम"
},
"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} सेफ्टी टीम"
},
"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} टीम"
},
"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} टीम"
},
"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} सेफ्टी टीम"
},
"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आपके द्वारा रिडीम किए गए एक गिफ्ट कोड का पेमेंट मूल रूप से किसी और ने किया था। वह पेमेंट तब से वापस ले लिया गया है (एक चार्जबैक)।\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} टीम"
},
"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 एड्रेस से लॉगिन को ऑथराइज़ करें",
"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} टीम"
},
"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} टीम"
},
"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} रजिस्ट्रेशन अप्रूव हो गया है",
"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} सेफ्टी टीम"
},
"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} सेफ्टी टीम"
},
"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} टीम"
},
"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} सेफ्टी टीम"
}
}
@@ -0,0 +1,86 @@
{
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
}
}
@@ -0,0 +1,86 @@
{
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
}
}
@@ -0,0 +1,86 @@
{
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"harvest_completed": {
"subject": "Ekspor data {product_name}mu 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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
},
"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}"
}
}

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