mirror of
https://github.com/jakejarvis/sofa.git
synced 2026-10-16 07:25:44 -04:00
chore(i18n): add Claude-powered translation script and fill missing PO translations
- Add `packages/i18n/scripts/claude.ts` — a Bun script that translates empty PO entries via the Claude Code CLI, supporting batch mode, dry-run, optional AI context from `crowdin-context.jsonl`, and structured JSON output validation - Add `i18n:claude` root script (`bun packages/i18n/scripts/claude.ts`) as a convenience alias - Fill all previously empty msgstr entries across de, es, fr, it, pt PO catalogs and recompile `.ts` catalogs - Polish README with badges (license, CI status, release, language, Crowdin localization) and minor formatting fixes
This commit is contained in:
23 files changed
+7775
-7110
No files matched your search
@@ -0,0 +1,519 @@
|
||||
#!/usr/bin/env bun
|
||||
/**
|
||||
* Translates empty PO file entries using Claude Code CLI.
|
||||
*
|
||||
* Usage:
|
||||
* bun scripts/translate.ts <locale|all> [--model <model>] [--batch-size <n>] [--dry-run]
|
||||
*
|
||||
* Examples:
|
||||
* bun scripts/translate.ts fr
|
||||
* bun scripts/translate.ts all --model sonnet
|
||||
* bun scripts/translate.ts de --dry-run
|
||||
*/
|
||||
|
||||
import { resolve } from "node:path";
|
||||
|
||||
import type { CatalogType } from "@lingui/conf";
|
||||
import { formatter } from "@lingui/format-po";
|
||||
|
||||
import linguiConfig from "../../../lingui.config";
|
||||
|
||||
const poFormat = formatter();
|
||||
|
||||
// ─── Config ──────────────────────────────────────────────
|
||||
|
||||
const SOURCE_LOCALE = linguiConfig.sourceLocale ?? "en";
|
||||
const LOCALES = (linguiConfig.locales as string[]).filter((l) => l !== SOURCE_LOCALE);
|
||||
|
||||
const DEFAULT_MODEL = "sonnet";
|
||||
const DEFAULT_BATCH_SIZE = 100;
|
||||
const MAX_RETRIES = 3;
|
||||
|
||||
const PO_DIR = resolve(import.meta.dir, "../src/po");
|
||||
const CONTEXT_FILE = resolve(import.meta.dir, "../../../crowdin-context.jsonl");
|
||||
|
||||
/** Resolve a locale code to its English display name via Intl */
|
||||
function localeName(code: string): string {
|
||||
return new Intl.DisplayNames(["en"], { type: "language" }).of(code) ?? code;
|
||||
}
|
||||
|
||||
function usage(): never {
|
||||
console.log(
|
||||
"Usage: bun scripts/translate.ts <locale|all> [--model <model>] [--batch-size <n>] [--dry-run]",
|
||||
);
|
||||
console.log(` Locales: ${LOCALES.join(", ")}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
function fail(message: string): never {
|
||||
console.error(message);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// ─── AI Context ──────────────────────────────────────────
|
||||
|
||||
interface ContextEntry {
|
||||
text: string;
|
||||
ai_context: string;
|
||||
}
|
||||
|
||||
async function loadContext(): Promise<Map<string, string>> {
|
||||
const contextMap = new Map<string, string>();
|
||||
const file = Bun.file(CONTEXT_FILE);
|
||||
|
||||
if (!(await file.exists())) {
|
||||
console.log(" (no crowdin-context.jsonl found, translating without AI context)\n");
|
||||
return contextMap;
|
||||
}
|
||||
|
||||
const text = await file.text();
|
||||
const lines = text.split("\n");
|
||||
|
||||
for (const [index, line] of lines.entries()) {
|
||||
if (!line.trim()) continue;
|
||||
|
||||
try {
|
||||
const entry: ContextEntry = JSON.parse(line);
|
||||
|
||||
if (typeof entry.text !== "string" || typeof entry.ai_context !== "string") {
|
||||
throw new Error("expected { text: string, ai_context: string }");
|
||||
}
|
||||
|
||||
contextMap.set(entry.text, entry.ai_context);
|
||||
} catch (error) {
|
||||
// oxlint-disable-next-line preserve-caught-error
|
||||
throw new Error(
|
||||
`Invalid JSONL entry in ${CONTEXT_FILE} at line ${index + 1}: ${
|
||||
error instanceof Error ? error.message : String(error)
|
||||
}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(` Loaded ${contextMap.size} AI context entries from crowdin-context.jsonl\n`);
|
||||
return contextMap;
|
||||
}
|
||||
|
||||
// ─── CLI Args ────────────────────────────────────────────
|
||||
|
||||
function parseArgs() {
|
||||
const args = process.argv.slice(2);
|
||||
let locale: string | undefined;
|
||||
let model = DEFAULT_MODEL;
|
||||
let batchSize = DEFAULT_BATCH_SIZE;
|
||||
let dryRun = false;
|
||||
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
const arg = args[i];
|
||||
|
||||
if (arg === "--model") {
|
||||
const value = args[++i];
|
||||
if (!value || value.startsWith("--")) {
|
||||
fail("Missing value for --model");
|
||||
}
|
||||
model = value;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg === "--batch-size") {
|
||||
const value = args[++i];
|
||||
if (!value || value.startsWith("--")) {
|
||||
fail("Missing value for --batch-size");
|
||||
}
|
||||
|
||||
const parsed = Number.parseInt(value, 10);
|
||||
if (!Number.isFinite(parsed) || parsed <= 0) {
|
||||
fail(`Invalid --batch-size: ${value}`);
|
||||
}
|
||||
|
||||
batchSize = parsed;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg === "--dry-run") {
|
||||
dryRun = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.startsWith("--")) {
|
||||
fail(`Unknown flag: ${arg}`);
|
||||
}
|
||||
|
||||
if (locale) {
|
||||
fail(`Unexpected extra positional argument: ${arg}`);
|
||||
}
|
||||
|
||||
locale = arg;
|
||||
}
|
||||
|
||||
if (!locale) {
|
||||
usage();
|
||||
}
|
||||
|
||||
if (locale !== "all" && !LOCALES.includes(locale)) {
|
||||
fail(`Unknown locale: ${locale}. Valid: ${LOCALES.join(", ")}, all`);
|
||||
}
|
||||
|
||||
const locales: string[] = locale === "all" ? [...LOCALES] : [locale];
|
||||
return { locales, model, batchSize, dryRun };
|
||||
}
|
||||
|
||||
// ─── PO Helpers ──────────────────────────────────────────
|
||||
|
||||
interface UntranslatedEntry {
|
||||
/** Lingui catalog key (may be a hashed ID like "nJw77c") */
|
||||
key: string;
|
||||
/** The actual English source text to translate */
|
||||
message: string;
|
||||
}
|
||||
|
||||
function getUntranslatedEntries(catalog: CatalogType): UntranslatedEntry[] {
|
||||
return Object.entries(catalog)
|
||||
.filter(([, entry]) => entry && !entry.translation)
|
||||
.map(([key, entry]) => ({
|
||||
key,
|
||||
// entry.message is the source text; fall back to key for explicit-id catalogs
|
||||
message: entry.message || key,
|
||||
}));
|
||||
}
|
||||
|
||||
// ─── Basic Structural Validation ─────────────────────────
|
||||
// Catches common placeholder/tag damage. NOT a full ICU MessageFormat validator —
|
||||
// does not detect argument type changes, malformed plural/select, or nested corruption.
|
||||
|
||||
function extractSimplePlaceholders(text: string): string[] {
|
||||
// Intentionally conservative. This catches the common placeholder cases:
|
||||
// {0}, {name}, {count}
|
||||
return [...text.matchAll(/\{[a-zA-Z0-9_]+\}/g)].map((m) => m[0]).sort();
|
||||
}
|
||||
|
||||
function extractNumberedTags(text: string): string[] {
|
||||
// Matches <0>, </0>, <0/>, <12>, </12>, <12/>
|
||||
return [...text.matchAll(/<\/?\d+\/?>/g)].map((m) => m[0]).sort();
|
||||
}
|
||||
|
||||
function leadingWhitespace(text: string): string {
|
||||
return text.match(/^\s*/)?.[0] ?? "";
|
||||
}
|
||||
|
||||
function trailingWhitespace(text: string): string {
|
||||
return text.match(/\s*$/)?.[0] ?? "";
|
||||
}
|
||||
|
||||
function validateTranslation(source: string, translated: string): string[] {
|
||||
const issues: string[] = [];
|
||||
|
||||
if (translated.length === 0 && source.length > 0) {
|
||||
issues.push("empty translation");
|
||||
}
|
||||
|
||||
const srcPlaceholders = extractSimplePlaceholders(source);
|
||||
const dstPlaceholders = extractSimplePlaceholders(translated);
|
||||
if (JSON.stringify(srcPlaceholders) !== JSON.stringify(dstPlaceholders)) {
|
||||
issues.push("placeholder mismatch");
|
||||
}
|
||||
|
||||
const srcTags = extractNumberedTags(source);
|
||||
const dstTags = extractNumberedTags(translated);
|
||||
if (JSON.stringify(srcTags) !== JSON.stringify(dstTags)) {
|
||||
issues.push("tag mismatch");
|
||||
}
|
||||
|
||||
// Only enforce whitespace when the source has meaningful edge whitespace
|
||||
if (/^\s|\s$/.test(source)) {
|
||||
if (leadingWhitespace(source) !== leadingWhitespace(translated)) {
|
||||
issues.push("leading whitespace mismatch");
|
||||
}
|
||||
|
||||
if (trailingWhitespace(source) !== trailingWhitespace(translated)) {
|
||||
issues.push("trailing whitespace mismatch");
|
||||
}
|
||||
}
|
||||
|
||||
return issues;
|
||||
}
|
||||
|
||||
// ─── Consistency Hints ───────────────────────────────────
|
||||
|
||||
function buildConsistencyHints(accepted: Map<string, string>, limit = 50): string | undefined {
|
||||
if (accepted.size === 0) return undefined;
|
||||
|
||||
const pairs = [...accepted.entries()]
|
||||
.slice(-limit)
|
||||
.map(([source, translated]) => `- ${JSON.stringify(source)} => ${JSON.stringify(translated)}`)
|
||||
.join("\n");
|
||||
|
||||
return [
|
||||
"Previously used translations for consistency:",
|
||||
pairs,
|
||||
"Reuse these choices where appropriate.",
|
||||
].join("\n");
|
||||
}
|
||||
|
||||
// ─── Translation via Claude CLI ──────────────────────────
|
||||
|
||||
async function translateBatchRaw(
|
||||
strings: string[],
|
||||
locale: string,
|
||||
model: string,
|
||||
contextMap: Map<string, string>,
|
||||
consistencyHints?: string,
|
||||
): Promise<string[]> {
|
||||
const language = localeName(locale);
|
||||
|
||||
const input = strings.map((s, i) => {
|
||||
const ctx = contextMap.get(s);
|
||||
return ctx ? { index: i, text: s, context: ctx } : { index: i, text: s };
|
||||
});
|
||||
|
||||
const systemPrompt = [
|
||||
"You are a professional translator for a self-hosted movie & TV tracking app called Sofa.",
|
||||
`Translate UI strings from English to ${language}.`,
|
||||
"",
|
||||
"Rules:",
|
||||
"- Return translations in the SAME ORDER as the input array, one per input string.",
|
||||
"- Return ONLY the structured output required by the schema.",
|
||||
"- Preserve leading and trailing whitespace exactly.",
|
||||
"- Preserve line breaks exactly unless the source meaning requires otherwise.",
|
||||
"- Placeholder rules (critical):",
|
||||
" - Every placeholder in the source ({0}, {name}, {count}, etc.) MUST appear in the translation. Do NOT add, remove, or rename placeholders.",
|
||||
" - Do NOT change placeholder types: a simple placeholder like {0} CANNOT become a complex argument like {0, plural, ...}. Keep the same structural skeleton.",
|
||||
' - You MAY reorder placeholders to fit target language grammar (e.g. "{0} {1}" → "{1} {0}").',
|
||||
' - For ICU plural/select blocks that ALREADY EXIST in the source: you MUST adapt plural categories to the target language\'s CLDR rules. E.g. English "one/other" may need "one/few/many/other" in some languages. Add or remove categories as needed.',
|
||||
" - Do NOT translate ICU keywords (one, other, few, many, zero, two) or the # symbol inside plurals.",
|
||||
"- Preserve JSX-like component tags EXACTLY: <0/>, <0>text</0>, <1>…</1> — translate text between tags, keep the tags. You may reorder tags.",
|
||||
"- When adjectives/participles need to agree in number with a dynamic count, move them INSIDE the plural block so each category can have correct agreement.",
|
||||
"- Keep translations concise — these are UI labels, buttons, toasts, and short messages.",
|
||||
"- Do NOT translate brand/product names: Sofa, TMDB, Plex, Jellyfin, Emby, Trakt, Simkl, Overseerr, Jellyseerr.",
|
||||
"- Use natural, idiomatic phrasing for the target language.",
|
||||
"- Consistency: translate the same English term the same way every time.",
|
||||
'- Each input has a "text" field to translate. Some also have a "context" field explaining where/how the string is used — use this to produce more accurate translations.',
|
||||
"- If a string is already a brand name, code token, identifier, or path, keep it unchanged.",
|
||||
...(consistencyHints ? ["", consistencyHints] : []),
|
||||
].join("\n");
|
||||
|
||||
const prompt = JSON.stringify(input);
|
||||
|
||||
const schema = JSON.stringify({
|
||||
type: "object",
|
||||
additionalProperties: false,
|
||||
properties: {
|
||||
translations: {
|
||||
type: "array",
|
||||
items: { type: "string" },
|
||||
minItems: strings.length,
|
||||
maxItems: strings.length,
|
||||
},
|
||||
},
|
||||
required: ["translations"],
|
||||
});
|
||||
|
||||
const proc = Bun.spawn(
|
||||
[
|
||||
"claude",
|
||||
"-p",
|
||||
"--output-format",
|
||||
"json",
|
||||
"--json-schema",
|
||||
schema,
|
||||
"--model",
|
||||
model,
|
||||
"--no-session-persistence",
|
||||
"--system-prompt",
|
||||
systemPrompt,
|
||||
"--tools",
|
||||
"",
|
||||
],
|
||||
{ stdout: "pipe", stderr: "pipe", stdin: new Response(prompt) },
|
||||
);
|
||||
|
||||
const [stdout, stderr] = await Promise.all([
|
||||
new Response(proc.stdout).text(),
|
||||
new Response(proc.stderr).text(),
|
||||
]);
|
||||
const exitCode = await proc.exited;
|
||||
|
||||
if (exitCode !== 0) {
|
||||
throw new Error(`Claude CLI failed (exit ${exitCode}): ${stderr || stdout}`);
|
||||
}
|
||||
|
||||
let result: { translations: string[] };
|
||||
try {
|
||||
const parsed = JSON.parse(stdout);
|
||||
const structured = parsed.structured_output ?? parsed.result ?? parsed;
|
||||
result = typeof structured === "string" ? JSON.parse(structured) : structured;
|
||||
} catch {
|
||||
throw new Error(`Failed to parse Claude response. Raw output:\n${stdout.slice(0, 1000)}`);
|
||||
}
|
||||
|
||||
if (!Array.isArray(result.translations) || result.translations.length !== strings.length) {
|
||||
throw new Error(
|
||||
`Expected ${strings.length} translations, got ${result.translations?.length ?? 0}.\nRaw: ${stdout.slice(0, 1000)}`,
|
||||
);
|
||||
}
|
||||
|
||||
return result.translations;
|
||||
}
|
||||
|
||||
async function translateBatch(
|
||||
strings: string[],
|
||||
locale: string,
|
||||
model: string,
|
||||
contextMap: Map<string, string>,
|
||||
consistencyHints?: string,
|
||||
): Promise<string[]> {
|
||||
let lastError: unknown;
|
||||
|
||||
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
||||
try {
|
||||
const translations = await translateBatchRaw(
|
||||
strings,
|
||||
locale,
|
||||
model,
|
||||
contextMap,
|
||||
consistencyHints,
|
||||
);
|
||||
|
||||
const validationErrors: string[] = [];
|
||||
for (let i = 0; i < strings.length; i++) {
|
||||
const issues = validateTranslation(strings[i], translations[i]);
|
||||
if (issues.length > 0) {
|
||||
validationErrors.push(
|
||||
`index ${i}: ${issues.join(", ")}\nsource: ${JSON.stringify(strings[i])}\ntranslation: ${JSON.stringify(translations[i])}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (validationErrors.length > 0) {
|
||||
throw new Error(
|
||||
`Translation validation failed:\n${validationErrors.slice(0, 10).join("\n\n")}${
|
||||
validationErrors.length > 10
|
||||
? `\n\n...and ${validationErrors.length - 10} more validation errors`
|
||||
: ""
|
||||
}`,
|
||||
);
|
||||
}
|
||||
|
||||
return translations;
|
||||
} catch (error) {
|
||||
lastError = error;
|
||||
|
||||
if (attempt < MAX_RETRIES) {
|
||||
const delayMs = 500 * attempt;
|
||||
console.warn(
|
||||
` attempt ${attempt}/${MAX_RETRIES} failed; retrying in ${delayMs}ms\n ${
|
||||
error instanceof Error ? error.message : String(error)
|
||||
}`,
|
||||
);
|
||||
await Bun.sleep(delayMs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw lastError instanceof Error ? lastError : new Error(String(lastError));
|
||||
}
|
||||
|
||||
// ─── Main ────────────────────────────────────────────────
|
||||
|
||||
async function translateLocale(
|
||||
locale: string,
|
||||
model: string,
|
||||
batchSize: number,
|
||||
dryRun: boolean,
|
||||
contextMap: Map<string, string>,
|
||||
) {
|
||||
const filePath = resolve(PO_DIR, `${locale}.po`);
|
||||
const file = Bun.file(filePath);
|
||||
|
||||
if (!(await file.exists())) {
|
||||
throw new Error(`PO file not found for locale "${locale}": ${filePath}`);
|
||||
}
|
||||
|
||||
const content = await file.text();
|
||||
const ctx = { locale, sourceLocale: SOURCE_LOCALE, filename: filePath };
|
||||
const catalog = await poFormat.parse(content, ctx);
|
||||
|
||||
const untranslated = getUntranslatedEntries(catalog);
|
||||
|
||||
if (untranslated.length === 0) {
|
||||
console.log(` ${locale}: all strings already translated`);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(` ${locale}: ${untranslated.length} strings to translate`);
|
||||
|
||||
if (dryRun) {
|
||||
console.log(` ${locale}: dry run — skipping`);
|
||||
return;
|
||||
}
|
||||
|
||||
// Map of catalog key → translated string
|
||||
const translations = new Map<string, string>();
|
||||
// Map of source message → translated string (for consistency hints + validation)
|
||||
const messageTranslations = new Map<string, string>();
|
||||
const totalBatches = Math.ceil(untranslated.length / batchSize);
|
||||
|
||||
for (let i = 0; i < totalBatches; i++) {
|
||||
const batch = untranslated.slice(i * batchSize, (i + 1) * batchSize);
|
||||
const messages = batch.map((e) => e.message);
|
||||
|
||||
console.log(` batch ${i + 1}/${totalBatches} (${batch.length} strings)...`);
|
||||
|
||||
const hints = buildConsistencyHints(messageTranslations);
|
||||
const translated = await translateBatch(messages, locale, model, contextMap, hints);
|
||||
|
||||
for (let j = 0; j < batch.length; j++) {
|
||||
translations.set(batch[j].key, translated[j]);
|
||||
messageTranslations.set(batch[j].message, translated[j]);
|
||||
}
|
||||
}
|
||||
|
||||
// Write translations back to catalog using keys
|
||||
for (const [key, msgstr] of translations) {
|
||||
if (catalog[key]) {
|
||||
catalog[key].translation = msgstr;
|
||||
}
|
||||
}
|
||||
const serialized = await poFormat.serialize(catalog, { ...ctx, existing: content });
|
||||
await Bun.write(filePath, serialized);
|
||||
console.log(` ${locale}: wrote ${translations.size} translations`);
|
||||
}
|
||||
|
||||
const { locales, model, batchSize, dryRun } = parseArgs();
|
||||
|
||||
console.log(
|
||||
`Translating PO files via Claude (model: ${model}, batch size: ${batchSize})${dryRun ? " [DRY RUN]" : ""}\n`,
|
||||
);
|
||||
|
||||
const contextMap = await loadContext();
|
||||
|
||||
// Process locales sequentially to reduce CLI/rate-limit pressure and keep logs readable.
|
||||
for (const locale of locales) {
|
||||
await translateLocale(locale, model, batchSize, dryRun, contextMap);
|
||||
}
|
||||
|
||||
if (!dryRun) {
|
||||
// Re-extract to restore #. placeholder comments that @lingui/format-po's
|
||||
// serialize() strips during the round-trip.
|
||||
console.log("Re-extracting to restore comments...");
|
||||
const extract = Bun.spawn(["bun", "run", "i18n:extract"], {
|
||||
stdout: "inherit",
|
||||
stderr: "inherit",
|
||||
});
|
||||
if ((await extract.exited) !== 0) {
|
||||
console.error("Extraction failed");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log("Compiling catalogs...");
|
||||
const compile = Bun.spawn(["bun", "run", "i18n:compile"], {
|
||||
stdout: "inherit",
|
||||
stderr: "inherit",
|
||||
});
|
||||
if ((await compile.exited) !== 0) {
|
||||
console.error("Catalog compilation failed");
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
console.log("Done!");
|
||||
+1252
-1252
File diff suppressed because it is too large.
Load diff
@@ -1 +1 @@
|
||||
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+5kO8P\":[\"Saturday\"],\"+6i0lS\":[\"Retrieving your watch history, watchlist, and ratings...\"],\"+Cv+V9\":[\"Remove from library\"],\"+JkEpu\":[\"This page was left on the cutting room floor. It may have been moved, removed, or never made it past the screenplay.\"],\"+K0AvT\":[\"Disconnect\"],\"+N0l5/\":[\"Connected to <0>\",[\"serverHost\"],\"</0>. Tap to change.\"],\"+gLHYi\":[\"Failed to load title\"],\"+j1ex/\":[\"Failed to remove from library\"],\"+nF1ZO\":[\"Remove Photo\"],\"/+6dvC\":[\"Errors (\",[\"0\"],\")\"],\"/BBXeA\":[\"Connecting to server...\"],\"/DwR+n\":[\"Creating…\"],\"/XtbPO\":[[\"0\"],\" titles\"],\"/cg+QV\":[\"Watch all\"],\"/gQXGv\":[\"Failed to update status\"],\"/nT6AE\":[\"New password\"],\"/sHc1/\":[\"Update check\"],\"0+dyau\":[\"Failed to update retention setting\"],\"0BFJKK\":[\"Authorization was denied. Please try again.\"],\"0GHb20\":[\"Purge metadata cache?\"],\"0IBW21\":[\"Failed to purge caches\"],\"0gH/sc\":[\"Remove profile picture\"],\"1+P9RR\":[\"Switch to \",[\"0\"]],\"12cc1j\":[\"Watching\"],\"12lVOl\":[\"Self-hosted movie & TV tracker\"],\"1B4z0M\":[\"Filmography\"],\"1J4Ek0\":[\"Automatically back up your database on a schedule\"],\"1JhxXW\":[\"Episode \",[\"0\"],\", \",[\"episodeLabel\"]],\"1N6wNP\":[\"Import options\"],\"1Qz4uG\":[\"Enable the \\\"Playback\\\" event category\"],\"1hMWR6\":[\"Create account\"],\"1jHIjh\":[\"Watched all of \",[\"seasonName\"]],\"1vSYsG\":[\"Download backup\"],\"1wL1tj\":[\"TV show\"],\"2FletP\":[\"Purged \",[\"0\",\"plural\",{\"one\":[\"#\",\" title\"],\"other\":[\"#\",\" titles\"]}],\", \",[\"1\",\"plural\",{\"one\":[\"#\",\" person\"],\"other\":[\"#\",\" persons\"]}],\", \",[\"2\",\"plural\",{\"one\":[\"#\",\" file\"],\"other\":[\"#\",\" files\"]}],\" (\",[\"freed\"],\" freed)\"],\"2Fsd9r\":[\"This Month\"],\"2MPcep\":[\"Import complete\"],\"2Mu33Z\":[\"Cache management\"],\"2POOFK\":[\"Free\"],\"2Pt2NY\":[\"This will remove all items from your history.\"],\"2fCpt5\":[\"Return home\"],\"2pPBp6\":[\"Trending today\"],\"39y5bn\":[\"Friday\"],\"3Blefz\":[\"Ratings\"],\"3JTlG8\":[\"Recent Searches\"],\"3Jy8bM\":[\"Movies \",[\"select\"]],\"3L9OuQ\":[\"Episode \",[\"0\"]],\"3T8ziB\":[\"Create an account\"],\"3hELxX\":[\"Enter your Sofa server URL to get started\"],\"4fxLkp\":[\"Open Sonarr, go to <0>Settings > Import Lists</0>\"],\"4kpBqM\":[\"Last event \",[\"0\"]],\"4uUjVO\":[\"Producer\"],\"4x+A56\":[\"Anonymous usage reporting\"],\"5IShvp\":[\"Import \",[\"totalItems\"],\" items\"],\"5IYJSv\":[\"Explore titles\"],\"5Y4mym\":[\"Import from \",[\"0\"]],\"5ZzgbQ\":[\"Connect \",[\"0\"]],\"5fEnbK\":[\"Failed to update scheduled backup setting\"],\"5lWFkC\":[\"Sign in\"],\"5v9C16\":[\"Connected to \",[\"source\"]],\"623bR4\":[\"Failed to trigger job\"],\"6HN0yh\":[\"Open Plex, go to Settings > Webhooks\"],\"6TNjOJ\":[\"Failed to update rating\"],\"6TfUy6\":[\"last \",[\"value\"]],\"6V3Ea3\":[\"Copied\"],\"6YtxFj\":[\"Name\"],\"6exX+8\":[\"Regenerate\"],\"6gRgw8\":[\"Retry\"],\"6lGV3K\":[\"Show less\"],\"76++pR\":[\"Warnings\"],\"77DIAu\":[\"Go to Dashboard > Plugins > Webhook\"],\"7Bj3x9\":[\"Failed\"],\"7D50KC\":[[\"label\"],\" disconnected\"],\"7GfM5w\":[\"Recently Viewed\"],\"7L01XJ\":[\"Actions\"],\"7eMo+U\":[\"Go Home\"],\"7p5kLi\":[\"Dashboard\"],\"85eoJ1\":[\"Schedule updated\"],\"8B9E2D\":[\"Day:\"],\"8YwF1J\":[\"Go to <0>Dashboard > Plugins > Webhook</0>\"],\"8ZsakT\":[\"Password\"],\"8tjQCz\":[\"Explore\"],\"8vNtLy\":[\"Paste the Radarr URL above into the List URL field\"],\"8wYDMp\":[\"Already have an account?\"],\"9AE3vb\":[\"Open Plex, go to <0>Settings > Webhooks<1/></0>\"],\"9GW0ZB\":[\"Import is still running in the background. Check back later.\"],\"9NyAH9\":[\"Skipped\"],\"9Xhrps\":[\"Failed to connect\"],\"9ZLGbA\":[\"backups.\"],\"9eF5oV\":[\"Welcome back\"],\"9rG25a\":[\"Server URL\"],\"A+0rLe\":[\"Marked as completed\"],\"AOHgZp\":[\"Episodes\"],\"AOddWK\":[\"Connect \",[\"label\"]],\"ATfxL/\":[\"Trailer\"],\"AVlZoM\":[\"Environment\"],\"Acf6vF\":[\"Save name\"],\"AdoUfN\":[\"Failed to add to watchlist\"],\"AeXO77\":[\"Account\"],\"AjtYj0\":[\"On Watchlist\"],\"Avee+B\":[\"Failed to update name\"],\"B2R3xD\":[\"Toggle scheduled backups\"],\"BEVzjL\":[\"Import failed\"],\"BQnS5I\":[\"Open \",[\"source\"],\" to enter code\"],\"BUnoSB\":[[\"0\"],\" \",[\"1\",\"plural\",{\"one\":[\"backup\"],\"other\":[\"backups\"]}],\" stored\"],\"BpttUI\":[\"Trending Today\"],\"BrrIs8\":[\"Storage\"],\"BskWMl\":[\"Unreachable\"],\"BzEFor\":[\"or\"],\"CGDHFb\":[\"Add a <0>Generic Destination</0> and paste the URL above\"],\"CGExDN\":[\"Failed to purge image cache\"],\"CHeXFE\":[\"Status updated\"],\"CKyk7Q\":[\"Go back\"],\"CaB/+I\":[\"Welcome back, \",[\"name\"]],\"CodnUh\":[\"Removed from library\"],\"CpzGJY\":[\"This may take a few minutes for large libraries. Please don't close this tab.\"],\"CuPxpd\":[\"Requires an active <0>PlexLine truncated
|
||||
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+5kO8P\":[\"Samstag\"],\"+6i0lS\":[\"Verlauf, Merkliste und Bewertungen werden abgerufen...\"],\"+Cv+V9\":[\"Aus Bibliothek entfernen\"],\"+JkEpu\":[\"Diese Seite ist auf dem Schneidetisch gelandet. Sie wurde möglicherweise verschoben, entfernt oder hat es nie über das Drehbuch hinaus geschafft.\"],\"+K0AvT\":[\"Trennen\"],\"+N0l5/\":[\"Verbunden mit <0>\",[\"serverHost\"],\"</0>. Tippe zum Ändern.\"],\"+gLHYi\":[\"Titel konnte nicht geladen werden\"],\"+j1ex/\":[\"Konnte nicht aus der Bibliothek entfernt werden\"],\"+nF1ZO\":[\"Foto entfernen\"],\"/+6dvC\":[\"Fehler (\",[\"0\"],\")\"],\"/BBXeA\":[\"Verbinde mit Server...\"],\"/DwR+n\":[\"Erstelle...\"],\"/XtbPO\":[[\"0\"],\" titles\"],\"/cg+QV\":[\"Alle als gesehen markieren\"],\"/gQXGv\":[\"Status konnte nicht aktualisiert werden\"],\"/nT6AE\":[\"Neues Passwort\"],\"/sHc1/\":[\"Update-Prüfung\"],\"0+dyau\":[\"Aufbewahrungseinstellung konnte nicht aktualisiert werden\"],\"0BFJKK\":[\"Autorisierung wurde verweigert. Bitte versuche es erneut.\"],\"0GHb20\":[\"Metadaten-Cache leeren?\"],\"0IBW21\":[\"Cache konnte nicht geleert werden\"],\"0gH/sc\":[\"Profilbild entfernen\"],\"1+P9RR\":[\"Zu \",[\"0\"],\" wechseln\"],\"12cc1j\":[\"Am Schauen\"],\"12lVOl\":[\"Selbstgehosteter Film- & Serien-Tracker\"],\"1B4z0M\":[\"Filmografie\"],\"1J4Ek0\":[\"Datenbank automatisch nach Zeitplan sichern\"],\"1JhxXW\":[\"Episode \",[\"0\"],\", \",[\"episodeLabel\"]],\"1N6wNP\":[\"Importoptionen\"],\"1Qz4uG\":[\"Ereigniskategorie \\\"Playback\\\" aktivieren\"],\"1hMWR6\":[\"Konto erstellen\"],\"1jHIjh\":[\"Alle Episoden von \",[\"seasonName\"],\" als gesehen markiert\"],\"1vSYsG\":[\"Backup herunterladen\"],\"1wL1tj\":[\"Serie\"],\"2FletP\":[[\"0\",\"plural\",{\"one\":[\"#\",\" Titel\"],\"other\":[\"#\",\" Titel\"]}],\", \",[\"1\",\"plural\",{\"one\":[\"#\",\" Person\"],\"other\":[\"#\",\" Personen\"]}],\", \",[\"2\",\"plural\",{\"one\":[\"#\",\" Datei\"],\"other\":[\"#\",\" Dateien\"]}],\" bereinigt (\",[\"freed\"],\" freigegeben)\"],\"2Fsd9r\":[\"Diesen Monat\"],\"2MPcep\":[\"Import abgeschlossen\"],\"2Mu33Z\":[\"Cache-Verwaltung\"],\"2POOFK\":[\"Kostenlos\"],\"2Pt2NY\":[\"Dadurch werden alle Einträge aus deinem Verlauf entfernt.\"],\"2fCpt5\":[\"Zur Startseite\"],\"2pPBp6\":[\"Heute im Trend\"],\"39y5bn\":[\"Freitag\"],\"3Blefz\":[\"Bewertungen\"],\"3JTlG8\":[\"Letzte Suchen\"],\"3Jy8bM\":[\"Filme \",[\"select\"]],\"3L9OuQ\":[\"Episode \",[\"0\"]],\"3T8ziB\":[\"Konto erstellen\"],\"3hELxX\":[\"Gib deine Sofa-Server-URL ein, um loszulegen\"],\"4fxLkp\":[\"Öffne Sonarr, gehe zu <0>Settings > Import Lists</0>\"],\"4kpBqM\":[\"Letztes Ereignis \",[\"0\"]],\"4uUjVO\":[\"Produzent\"],\"4x+A56\":[\"Anonyme Nutzungsberichte\"],\"5IShvp\":[[\"totalItems\"],\" Einträge importieren\"],\"5IYJSv\":[\"Titel entdecken\"],\"5Y4mym\":[\"Von \",[\"0\"],\" importieren\"],\"5ZzgbQ\":[[\"0\"],\" verbinden\"],\"5fEnbK\":[\"Einstellung für geplante Backups konnte nicht aktualisiert werden\"],\"5lWFkC\":[\"Anmelden\"],\"5v9C16\":[\"Verbunden mit \",[\"source\"]],\"623bR4\":[\"Aufgabe konnte nicht ausgelöst werden\"],\"6HN0yh\":[\"Öffne Plex, gehe zu Settings > Webhooks\"],\"6TNjOJ\":[\"Bewertung konnte nicht aktualisiert werden\"],\"6TfUy6\":[\"letzte \",[\"value\"]],\"6V3Ea3\":[\"Kopiert\"],\"6YtxFj\":[\"Name\"],\"6exX+8\":[\"Neu generieren\"],\"6gRgw8\":[\"Erneut versuchen\"],\"6lGV3K\":[\"Weniger anzeigen\"],\"76++pR\":[\"Warnungen\"],\"77DIAu\":[\"Gehe zu Dashboard > Plugins > Webhook\"],\"7Bj3x9\":[\"Fehlgeschlagen\"],\"7D50KC\":[[\"label\"],\" getrennt\"],\"7GfM5w\":[\"Zuletzt angesehen\"],\"7L01XJ\":[\"Aktionen\"],\"7eMo+U\":[\"Zur Startseite\"],\"7p5kLi\":[\"Dashboard\"],\"85eoJ1\":[\"Zeitplan aktualisiert\"],\"8B9E2D\":[\"Tag:\"],\"8YwF1J\":[\"Gehe zu <0>Dashboard > Plugins > Webhook</0>\"],\"8ZsakT\":[\"Passwort\"],\"8tjQCz\":[\"Entdecken\"],\"8vNtLy\":[\"Füge die obige Radarr-URL in das Feld \\\"List URL\\\" ein\"],\"8wYDMp\":[\"Bereits ein Konto?\"],\"9AE3vb\":[\"Öffne Plex, gehe zu <0>Settings > Webhooks<1/></0>\"],\"9GW0ZB\":[\"Import läuft noch im Hintergrund. Komm später wieder.\"],\"9NyAH9\":[\"Übersprungen\"],\"9Xhrps\":[\"Verbindung fehlgeschlagen\"],\"9ZLGbA\":[\"backups.\"],\"9eF5oV\":[\"Willkommen zurück\"],\"9rG25a\":[\"Server-URL\"],\"A+0rLe\":[\"Als abgeschlossen markiert\"],\"AOHgZp\":[\"Episoden\"],\"AOddWK\":[[\"label\"],\" verbinden\"],\"ATfxL/\":[\"Trailer\"],\"AVlZoM\":[\"Umgebung\"],\"Acf6vF\":[\"Namen speichern\"],\"AdoUfN\":[\"Konnte nicht zur Merkliste hinzugefügt werden\"],\"AeXO77\":[\"Konto\"],\"AjtYj0\":[\"Auf der Merkliste\"],\"Avee+B\":[\"Name konnte nicht aktualisiert werden\"],\"B2R3xD\":[\"Geplante Backups umschalten\"],\"BEVzjL\":[\"Import fehlgeschlagen\"],\"BQnS5I\":[[\"source\"],\" öffnen, um Code einzugeben\"],\"BUnoSB\":[[\"0\"],\" \",[\"1\",\"plural\",{\"one\":[\"Backup\"],\"other\":[\"Backups\"]}],\" gespeichert\"],\"BpttUI\":[\"Heute imLine truncated
|
||||
+737
-738
File diff suppressed because it is too large.
Load diff
+1257
-1257
File diff suppressed because it is too large.
Load diff
@@ -1 +1 @@
|
||||
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+5kO8P\":[\"Saturday\"],\"+6i0lS\":[\"Retrieving your watch history, watchlist, and ratings...\"],\"+Cv+V9\":[\"Remove from library\"],\"+JkEpu\":[\"This page was left on the cutting room floor. It may have been moved, removed, or never made it past the screenplay.\"],\"+K0AvT\":[\"Disconnect\"],\"+N0l5/\":[\"Connected to <0>\",[\"serverHost\"],\"</0>. Tap to change.\"],\"+gLHYi\":[\"Failed to load title\"],\"+j1ex/\":[\"Failed to remove from library\"],\"+nF1ZO\":[\"Remove Photo\"],\"/+6dvC\":[\"Errors (\",[\"0\"],\")\"],\"/BBXeA\":[\"Connecting to server...\"],\"/DwR+n\":[\"Creating…\"],\"/XtbPO\":[[\"0\"],\" titles\"],\"/cg+QV\":[\"Watch all\"],\"/gQXGv\":[\"Failed to update status\"],\"/nT6AE\":[\"New password\"],\"/sHc1/\":[\"Update check\"],\"0+dyau\":[\"Failed to update retention setting\"],\"0BFJKK\":[\"Authorization was denied. Please try again.\"],\"0GHb20\":[\"Purge metadata cache?\"],\"0IBW21\":[\"Failed to purge caches\"],\"0gH/sc\":[\"Remove profile picture\"],\"1+P9RR\":[\"Switch to \",[\"0\"]],\"12cc1j\":[\"Watching\"],\"12lVOl\":[\"Self-hosted movie & TV tracker\"],\"1B4z0M\":[\"Filmography\"],\"1J4Ek0\":[\"Automatically back up your database on a schedule\"],\"1JhxXW\":[\"Episode \",[\"0\"],\", \",[\"episodeLabel\"]],\"1N6wNP\":[\"Import options\"],\"1Qz4uG\":[\"Enable the \\\"Playback\\\" event category\"],\"1hMWR6\":[\"Create account\"],\"1jHIjh\":[\"Watched all of \",[\"seasonName\"]],\"1vSYsG\":[\"Download backup\"],\"1wL1tj\":[\"TV show\"],\"2FletP\":[\"Purged \",[\"0\",\"plural\",{\"one\":[\"#\",\" title\"],\"other\":[\"#\",\" titles\"]}],\", \",[\"1\",\"plural\",{\"one\":[\"#\",\" person\"],\"other\":[\"#\",\" persons\"]}],\", \",[\"2\",\"plural\",{\"one\":[\"#\",\" file\"],\"other\":[\"#\",\" files\"]}],\" (\",[\"freed\"],\" freed)\"],\"2Fsd9r\":[\"This Month\"],\"2MPcep\":[\"Import complete\"],\"2Mu33Z\":[\"Cache management\"],\"2POOFK\":[\"Free\"],\"2Pt2NY\":[\"This will remove all items from your history.\"],\"2fCpt5\":[\"Return home\"],\"2pPBp6\":[\"Trending today\"],\"39y5bn\":[\"Friday\"],\"3Blefz\":[\"Ratings\"],\"3JTlG8\":[\"Recent Searches\"],\"3Jy8bM\":[\"Movies \",[\"select\"]],\"3L9OuQ\":[\"Episode \",[\"0\"]],\"3T8ziB\":[\"Create an account\"],\"3hELxX\":[\"Enter your Sofa server URL to get started\"],\"4fxLkp\":[\"Open Sonarr, go to <0>Settings > Import Lists</0>\"],\"4kpBqM\":[\"Last event \",[\"0\"]],\"4uUjVO\":[\"Producer\"],\"4x+A56\":[\"Anonymous usage reporting\"],\"5IShvp\":[\"Import \",[\"totalItems\"],\" items\"],\"5IYJSv\":[\"Explore titles\"],\"5Y4mym\":[\"Import from \",[\"0\"]],\"5ZzgbQ\":[\"Connect \",[\"0\"]],\"5fEnbK\":[\"Failed to update scheduled backup setting\"],\"5lWFkC\":[\"Sign in\"],\"5v9C16\":[\"Connected to \",[\"source\"]],\"623bR4\":[\"Failed to trigger job\"],\"6HN0yh\":[\"Open Plex, go to Settings > Webhooks\"],\"6TNjOJ\":[\"Failed to update rating\"],\"6TfUy6\":[\"last \",[\"value\"]],\"6V3Ea3\":[\"Copied\"],\"6YtxFj\":[\"Name\"],\"6exX+8\":[\"Regenerate\"],\"6gRgw8\":[\"Retry\"],\"6lGV3K\":[\"Show less\"],\"76++pR\":[\"Warnings\"],\"77DIAu\":[\"Go to Dashboard > Plugins > Webhook\"],\"7Bj3x9\":[\"Failed\"],\"7D50KC\":[[\"label\"],\" disconnected\"],\"7GfM5w\":[\"Recently Viewed\"],\"7L01XJ\":[\"Actions\"],\"7eMo+U\":[\"Go Home\"],\"7p5kLi\":[\"Dashboard\"],\"85eoJ1\":[\"Schedule updated\"],\"8B9E2D\":[\"Day:\"],\"8YwF1J\":[\"Go to <0>Dashboard > Plugins > Webhook</0>\"],\"8ZsakT\":[\"Password\"],\"8tjQCz\":[\"Explore\"],\"8vNtLy\":[\"Paste the Radarr URL above into the List URL field\"],\"8wYDMp\":[\"Already have an account?\"],\"9AE3vb\":[\"Open Plex, go to <0>Settings > Webhooks<1/></0>\"],\"9GW0ZB\":[\"Import is still running in the background. Check back later.\"],\"9NyAH9\":[\"Skipped\"],\"9Xhrps\":[\"Failed to connect\"],\"9ZLGbA\":[\"backups.\"],\"9eF5oV\":[\"Welcome back\"],\"9rG25a\":[\"Server URL\"],\"A+0rLe\":[\"Marked as completed\"],\"AOHgZp\":[\"Episodes\"],\"AOddWK\":[\"Connect \",[\"label\"]],\"ATfxL/\":[\"Trailer\"],\"AVlZoM\":[\"Environment\"],\"Acf6vF\":[\"Save name\"],\"AdoUfN\":[\"Failed to add to watchlist\"],\"AeXO77\":[\"Account\"],\"AjtYj0\":[\"On Watchlist\"],\"Avee+B\":[\"Failed to update name\"],\"B2R3xD\":[\"Toggle scheduled backups\"],\"BEVzjL\":[\"Import failed\"],\"BQnS5I\":[\"Open \",[\"source\"],\" to enter code\"],\"BUnoSB\":[[\"0\"],\" \",[\"1\",\"plural\",{\"one\":[\"backup\"],\"other\":[\"backups\"]}],\" stored\"],\"BpttUI\":[\"Trending Today\"],\"BrrIs8\":[\"Storage\"],\"BskWMl\":[\"Unreachable\"],\"BzEFor\":[\"or\"],\"CGDHFb\":[\"Add a <0>Generic Destination</0> and paste the URL above\"],\"CGExDN\":[\"Failed to purge image cache\"],\"CHeXFE\":[\"Status updated\"],\"CKyk7Q\":[\"Go back\"],\"CaB/+I\":[\"Welcome back, \",[\"name\"]],\"CodnUh\":[\"Removed from library\"],\"CpzGJY\":[\"This may take a few minutes for large libraries. Please don't close this tab.\"],\"CuPxpd\":[\"Requires an active <0>PlexLine truncated
|
||||
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+5kO8P\":[\"Sábado\"],\"+6i0lS\":[\"Obteniendo tu historial de visionado, lista y valoraciones...\"],\"+Cv+V9\":[\"Eliminar de la biblioteca\"],\"+JkEpu\":[\"Esta página quedó en la sala de montaje. Puede que haya sido movida, eliminada o que nunca pasara del guion.\"],\"+K0AvT\":[\"Desconectar\"],\"+N0l5/\":[\"Conectado a <0>\",[\"serverHost\"],\"</0>. Toca para cambiar.\"],\"+gLHYi\":[\"Error al cargar el título\"],\"+j1ex/\":[\"Error al eliminar de la biblioteca\"],\"+nF1ZO\":[\"Eliminar foto\"],\"/+6dvC\":[\"Errores (\",[\"0\"],\")\"],\"/BBXeA\":[\"Conectando al servidor...\"],\"/DwR+n\":[\"Creando…\"],\"/XtbPO\":[[\"0\"],\" titles\"],\"/cg+QV\":[\"Marcar todo como visto\"],\"/gQXGv\":[\"Error al actualizar el estado\"],\"/nT6AE\":[\"Nueva contraseña\"],\"/sHc1/\":[\"Comprobación de actualizaciones\"],\"0+dyau\":[\"Error al actualizar el ajuste de retención\"],\"0BFJKK\":[\"La autorización fue denegada. Por favor, inténtalo de nuevo.\"],\"0GHb20\":[\"¿Purgar la caché de metadatos?\"],\"0IBW21\":[\"Error al purgar las cachés\"],\"0gH/sc\":[\"Eliminar foto de perfil\"],\"1+P9RR\":[\"Cambiar a \",[\"0\"]],\"12cc1j\":[\"Viendo\"],\"12lVOl\":[\"Seguimiento de películas y series autoalojado\"],\"1B4z0M\":[\"Filmografía\"],\"1J4Ek0\":[\"Realiza copias de seguridad automáticas de tu base de datos de forma programada\"],\"1JhxXW\":[\"Episodio \",[\"0\"],\", \",[\"episodeLabel\"]],\"1N6wNP\":[\"Opciones de importación\"],\"1Qz4uG\":[\"Activa la categoría de evento \\\"Playback\\\"\"],\"1hMWR6\":[\"Crear cuenta\"],\"1jHIjh\":[\"Visto todo de \",[\"seasonName\"]],\"1vSYsG\":[\"Descargar copia de seguridad\"],\"1wL1tj\":[\"Serie\"],\"2FletP\":[\"Purgados \",[\"0\",\"plural\",{\"one\":[\"#\",\" título\"],\"other\":[\"#\",\" títulos\"]}],\", \",[\"1\",\"plural\",{\"one\":[\"#\",\" persona\"],\"other\":[\"#\",\" personas\"]}],\", \",[\"2\",\"plural\",{\"one\":[\"#\",\" archivo\"],\"other\":[\"#\",\" archivos\"]}],\" (\",[\"freed\"],\" liberado)\"],\"2Fsd9r\":[\"Este mes\"],\"2MPcep\":[\"Importación completada\"],\"2Mu33Z\":[\"Gestión de caché\"],\"2POOFK\":[\"Gratis\"],\"2Pt2NY\":[\"Esto eliminará todos los elementos de tu historial.\"],\"2fCpt5\":[\"Volver al inicio\"],\"2pPBp6\":[\"Tendencia hoy\"],\"39y5bn\":[\"Viernes\"],\"3Blefz\":[\"Valoraciones\"],\"3JTlG8\":[\"Búsquedas recientes\"],\"3Jy8bM\":[\"Películas \",[\"select\"]],\"3L9OuQ\":[\"Episodio \",[\"0\"]],\"3T8ziB\":[\"Crear una cuenta\"],\"3hELxX\":[\"Introduce la URL de tu servidor Sofa para comenzar\"],\"4fxLkp\":[\"Abre Sonarr, ve a <0>Settings > Import Lists</0>\"],\"4kpBqM\":[\"Último evento \",[\"0\"]],\"4uUjVO\":[\"Productor\"],\"4x+A56\":[\"Informe de uso anónimo\"],\"5IShvp\":[\"Importar \",[\"totalItems\"],\" elementos\"],\"5IYJSv\":[\"Explorar títulos\"],\"5Y4mym\":[\"Importar desde \",[\"0\"]],\"5ZzgbQ\":[\"Conectar \",[\"0\"]],\"5fEnbK\":[\"Error al actualizar el ajuste de copia de seguridad programada\"],\"5lWFkC\":[\"Iniciar sesión\"],\"5v9C16\":[\"Conectado a \",[\"source\"]],\"623bR4\":[\"Error al iniciar la tarea\"],\"6HN0yh\":[\"Abre Plex, ve a Settings > Webhooks\"],\"6TNjOJ\":[\"Error al actualizar la valoración\"],\"6TfUy6\":[\"últimos \",[\"value\"]],\"6V3Ea3\":[\"Copiado\"],\"6YtxFj\":[\"Nombre\"],\"6exX+8\":[\"Regenerar\"],\"6gRgw8\":[\"Reintentar\"],\"6lGV3K\":[\"Mostrar menos\"],\"76++pR\":[\"Advertencias\"],\"77DIAu\":[\"Ve a Dashboard > Plugins > Webhook\"],\"7Bj3x9\":[\"Fallido\"],\"7D50KC\":[[\"label\"],\" desconectado\"],\"7GfM5w\":[\"Vistos recientemente\"],\"7L01XJ\":[\"Acciones\"],\"7eMo+U\":[\"Ir al inicio\"],\"7p5kLi\":[\"Panel\"],\"85eoJ1\":[\"Programación actualizada\"],\"8B9E2D\":[\"Día:\"],\"8YwF1J\":[\"Ve a <0>Dashboard > Plugins > Webhook</0>\"],\"8ZsakT\":[\"Contraseña\"],\"8tjQCz\":[\"Explorar\"],\"8vNtLy\":[\"Pega la URL de Radarr anterior en el campo URL de lista\"],\"8wYDMp\":[\"¿Ya tienes una cuenta?\"],\"9AE3vb\":[\"Abre Plex, ve a <0>Settings > Webhooks<1/></0>\"],\"9GW0ZB\":[\"La importación sigue en curso en segundo plano. Vuelve más tarde.\"],\"9NyAH9\":[\"Omitido\"],\"9Xhrps\":[\"Error al conectar\"],\"9ZLGbA\":[\"backups.\"],\"9eF5oV\":[\"Bienvenido de nuevo\"],\"9rG25a\":[\"URL del servidor\"],\"A+0rLe\":[\"Marcado como completado\"],\"AOHgZp\":[\"Episodios\"],\"AOddWK\":[\"Conectar \",[\"label\"]],\"ATfxL/\":[\"Tráiler\"],\"AVlZoM\":[\"Entorno\"],\"Acf6vF\":[\"Guardar nombre\"],\"AdoUfN\":[\"Error al añadir a la lista\"],\"AeXO77\":[\"Cuenta\"],\"AjtYj0\":[\"En la lista\"],\"Avee+B\":[\"Error al actualizar el nombre\"],\"B2R3xD\":[\"Activar/desactivar copias de seguridad programadas\"],\"BEVzjL\":[\"Error en la importación\"],\"BQnS5I\":[\"Abre \",[\"source\"],\" para introducir el código\"],\"BUnoSB\":[[\"0\"],\" \",[\"1\",\"plural\",{\"one\":[\"backup almacenado\"],\"other\":[\"backups almacenados\"]}]],\"BpttUI\":[\"Tendencias hoy\"],\"BrrIs8\":[\"AlmacenamientoLine truncated
|
||||
+1259
-1259
File diff suppressed because it is too large.
Load diff
@@ -1 +1 @@
|
||||
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+5kO8P\":[\"Saturday\"],\"+6i0lS\":[\"Retrieving your watch history, watchlist, and ratings...\"],\"+Cv+V9\":[\"Remove from library\"],\"+JkEpu\":[\"This page was left on the cutting room floor. It may have been moved, removed, or never made it past the screenplay.\"],\"+K0AvT\":[\"Disconnect\"],\"+N0l5/\":[\"Connected to <0>\",[\"serverHost\"],\"</0>. Tap to change.\"],\"+gLHYi\":[\"Failed to load title\"],\"+j1ex/\":[\"Failed to remove from library\"],\"+nF1ZO\":[\"Remove Photo\"],\"/+6dvC\":[\"Errors (\",[\"0\"],\")\"],\"/BBXeA\":[\"Connecting to server...\"],\"/DwR+n\":[\"Creating…\"],\"/XtbPO\":[[\"0\"],\" titles\"],\"/cg+QV\":[\"Watch all\"],\"/gQXGv\":[\"Failed to update status\"],\"/nT6AE\":[\"New password\"],\"/sHc1/\":[\"Update check\"],\"0+dyau\":[\"Failed to update retention setting\"],\"0BFJKK\":[\"Authorization was denied. Please try again.\"],\"0GHb20\":[\"Purge metadata cache?\"],\"0IBW21\":[\"Failed to purge caches\"],\"0gH/sc\":[\"Remove profile picture\"],\"1+P9RR\":[\"Switch to \",[\"0\"]],\"12cc1j\":[\"Watching\"],\"12lVOl\":[\"Self-hosted movie & TV tracker\"],\"1B4z0M\":[\"Filmography\"],\"1J4Ek0\":[\"Automatically back up your database on a schedule\"],\"1JhxXW\":[\"Episode \",[\"0\"],\", \",[\"episodeLabel\"]],\"1N6wNP\":[\"Import options\"],\"1Qz4uG\":[\"Enable the \\\"Playback\\\" event category\"],\"1hMWR6\":[\"Create account\"],\"1jHIjh\":[\"Watched all of \",[\"seasonName\"]],\"1vSYsG\":[\"Download backup\"],\"1wL1tj\":[\"TV show\"],\"2FletP\":[\"Purged \",[\"0\",\"plural\",{\"one\":[\"#\",\" title\"],\"other\":[\"#\",\" titles\"]}],\", \",[\"1\",\"plural\",{\"one\":[\"#\",\" person\"],\"other\":[\"#\",\" persons\"]}],\", \",[\"2\",\"plural\",{\"one\":[\"#\",\" file\"],\"other\":[\"#\",\" files\"]}],\" (\",[\"freed\"],\" freed)\"],\"2Fsd9r\":[\"This Month\"],\"2MPcep\":[\"Import complete\"],\"2Mu33Z\":[\"Cache management\"],\"2POOFK\":[\"Free\"],\"2Pt2NY\":[\"This will remove all items from your history.\"],\"2fCpt5\":[\"Return home\"],\"2pPBp6\":[\"Trending today\"],\"39y5bn\":[\"Friday\"],\"3Blefz\":[\"Ratings\"],\"3JTlG8\":[\"Recent Searches\"],\"3Jy8bM\":[\"Movies \",[\"select\"]],\"3L9OuQ\":[\"Episode \",[\"0\"]],\"3T8ziB\":[\"Create an account\"],\"3hELxX\":[\"Enter your Sofa server URL to get started\"],\"4fxLkp\":[\"Open Sonarr, go to <0>Settings > Import Lists</0>\"],\"4kpBqM\":[\"Last event \",[\"0\"]],\"4uUjVO\":[\"Producer\"],\"4x+A56\":[\"Anonymous usage reporting\"],\"5IShvp\":[\"Import \",[\"totalItems\"],\" items\"],\"5IYJSv\":[\"Explore titles\"],\"5Y4mym\":[\"Import from \",[\"0\"]],\"5ZzgbQ\":[\"Connect \",[\"0\"]],\"5fEnbK\":[\"Failed to update scheduled backup setting\"],\"5lWFkC\":[\"Sign in\"],\"5v9C16\":[\"Connected to \",[\"source\"]],\"623bR4\":[\"Failed to trigger job\"],\"6HN0yh\":[\"Open Plex, go to Settings > Webhooks\"],\"6TNjOJ\":[\"Failed to update rating\"],\"6TfUy6\":[\"last \",[\"value\"]],\"6V3Ea3\":[\"Copied\"],\"6YtxFj\":[\"Name\"],\"6exX+8\":[\"Regenerate\"],\"6gRgw8\":[\"Retry\"],\"6lGV3K\":[\"Show less\"],\"76++pR\":[\"Warnings\"],\"77DIAu\":[\"Go to Dashboard > Plugins > Webhook\"],\"7Bj3x9\":[\"Failed\"],\"7D50KC\":[[\"label\"],\" disconnected\"],\"7GfM5w\":[\"Recently Viewed\"],\"7L01XJ\":[\"Actions\"],\"7eMo+U\":[\"Go Home\"],\"7p5kLi\":[\"Dashboard\"],\"85eoJ1\":[\"Schedule updated\"],\"8B9E2D\":[\"Day:\"],\"8YwF1J\":[\"Go to <0>Dashboard > Plugins > Webhook</0>\"],\"8ZsakT\":[\"Password\"],\"8tjQCz\":[\"Explore\"],\"8vNtLy\":[\"Paste the Radarr URL above into the List URL field\"],\"8wYDMp\":[\"Already have an account?\"],\"9AE3vb\":[\"Open Plex, go to <0>Settings > Webhooks<1/></0>\"],\"9GW0ZB\":[\"Import is still running in the background. Check back later.\"],\"9NyAH9\":[\"Skipped\"],\"9Xhrps\":[\"Failed to connect\"],\"9ZLGbA\":[\"backups.\"],\"9eF5oV\":[\"Welcome back\"],\"9rG25a\":[\"Server URL\"],\"A+0rLe\":[\"Marked as completed\"],\"AOHgZp\":[\"Episodes\"],\"AOddWK\":[\"Connect \",[\"label\"]],\"ATfxL/\":[\"Trailer\"],\"AVlZoM\":[\"Environment\"],\"Acf6vF\":[\"Save name\"],\"AdoUfN\":[\"Failed to add to watchlist\"],\"AeXO77\":[\"Account\"],\"AjtYj0\":[\"On Watchlist\"],\"Avee+B\":[\"Failed to update name\"],\"B2R3xD\":[\"Toggle scheduled backups\"],\"BEVzjL\":[\"Import failed\"],\"BQnS5I\":[\"Open \",[\"source\"],\" to enter code\"],\"BUnoSB\":[[\"0\"],\" \",[\"1\",\"plural\",{\"one\":[\"backup\"],\"other\":[\"backups\"]}],\" stored\"],\"BpttUI\":[\"Trending Today\"],\"BrrIs8\":[\"Storage\"],\"BskWMl\":[\"Unreachable\"],\"BzEFor\":[\"or\"],\"CGDHFb\":[\"Add a <0>Generic Destination</0> and paste the URL above\"],\"CGExDN\":[\"Failed to purge image cache\"],\"CHeXFE\":[\"Status updated\"],\"CKyk7Q\":[\"Go back\"],\"CaB/+I\":[\"Welcome back, \",[\"name\"]],\"CodnUh\":[\"Removed from library\"],\"CpzGJY\":[\"This may take a few minutes for large libraries. Please don't close this tab.\"],\"CuPxpd\":[\"Requires an active <0>PlexLine truncated
|
||||
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+5kO8P\":[\"Samedi\"],\"+6i0lS\":[\"Récupération de votre historique, liste de suivi et notes...\"],\"+Cv+V9\":[\"Supprimer de la bibliothèque\"],\"+JkEpu\":[\"Cette page est restée sur le plancher de la salle de montage. Elle a peut-être été déplacée, supprimée, ou n'a jamais dépassé le stade du scénario.\"],\"+K0AvT\":[\"Déconnecter\"],\"+N0l5/\":[\"Connecté à <0>\",[\"serverHost\"],\"</0>. Appuyez pour modifier.\"],\"+gLHYi\":[\"Échec du chargement du titre\"],\"+j1ex/\":[\"Échec de la suppression de la bibliothèque\"],\"+nF1ZO\":[\"Supprimer la photo\"],\"/+6dvC\":[\"Erreurs (\",[\"0\"],\")\"],\"/BBXeA\":[\"Connexion au serveur...\"],\"/DwR+n\":[\"Création…\"],\"/XtbPO\":[[\"0\"],\" titles\"],\"/cg+QV\":[\"Tout marquer comme visionné\"],\"/gQXGv\":[\"Échec de la mise à jour du statut\"],\"/nT6AE\":[\"Nouveau mot de passe\"],\"/sHc1/\":[\"Vérification des mises à jour\"],\"0+dyau\":[\"Échec de la mise à jour du paramètre de rétention\"],\"0BFJKK\":[\"L'autorisation a été refusée. Veuillez réessayer.\"],\"0GHb20\":[\"Purger le cache de métadonnées ?\"],\"0IBW21\":[\"Échec de la purge des caches\"],\"0gH/sc\":[\"Supprimer la photo de profil\"],\"1+P9RR\":[\"Passer à \",[\"0\"]],\"12cc1j\":[\"En cours\"],\"12lVOl\":[\"Suivi de films et séries auto-hébergé\"],\"1B4z0M\":[\"Filmographie\"],\"1J4Ek0\":[\"Sauvegardez automatiquement votre base de données selon un planning\"],\"1JhxXW\":[\"Épisode \",[\"0\"],\", \",[\"episodeLabel\"]],\"1N6wNP\":[\"Options d'importation\"],\"1Qz4uG\":[\"Activez la catégorie d'événement « Playback »\"],\"1hMWR6\":[\"Créer un compte\"],\"1jHIjh\":[\"Tout visionné de \",[\"seasonName\"]],\"1vSYsG\":[\"Télécharger la sauvegarde\"],\"1wL1tj\":[\"Série TV\"],\"2FletP\":[[\"0\",\"plural\",{\"one\":[\"#\",\" titre\"],\"other\":[\"#\",\" titres\"]}],\", \",[\"1\",\"plural\",{\"one\":[\"#\",\" personne\"],\"other\":[\"#\",\" personnes\"]}],\", \",[\"2\",\"plural\",{\"one\":[\"#\",\" fichier\"],\"other\":[\"#\",\" fichiers\"]}],\" purgés (\",[\"freed\"],\" libéré)\"],\"2Fsd9r\":[\"Ce mois-ci\"],\"2MPcep\":[\"Importation terminée\"],\"2Mu33Z\":[\"Gestion du cache\"],\"2POOFK\":[\"Gratuit\"],\"2Pt2NY\":[\"Cela supprimera tous les éléments de votre historique.\"],\"2fCpt5\":[\"Retour à l'accueil\"],\"2pPBp6\":[\"Tendance aujourd'hui\"],\"39y5bn\":[\"Vendredi\"],\"3Blefz\":[\"Notes\"],\"3JTlG8\":[\"Recherches récentes\"],\"3Jy8bM\":[\"Films \",[\"select\"]],\"3L9OuQ\":[\"Épisode \",[\"0\"]],\"3T8ziB\":[\"Créer un compte\"],\"3hELxX\":[\"Entrez l'URL de votre serveur Sofa pour commencer\"],\"4fxLkp\":[\"Ouvrez Sonarr, allez dans <0>Settings > Import Lists</0>\"],\"4kpBqM\":[\"Dernier événement \",[\"0\"]],\"4uUjVO\":[\"Producteur\"],\"4x+A56\":[\"Rapports d'utilisation anonymes\"],\"5IShvp\":[\"Importer \",[\"totalItems\"],\" éléments\"],\"5IYJSv\":[\"Explorer les titres\"],\"5Y4mym\":[\"Importer depuis \",[\"0\"]],\"5ZzgbQ\":[\"Connecter \",[\"0\"]],\"5fEnbK\":[\"Échec de la mise à jour du paramètre de sauvegarde planifiée\"],\"5lWFkC\":[\"Se connecter\"],\"5v9C16\":[\"Connecté à \",[\"source\"]],\"623bR4\":[\"Échec du déclenchement de la tâche\"],\"6HN0yh\":[\"Ouvrez Plex, allez dans Settings > Webhooks\"],\"6TNjOJ\":[\"Échec de la mise à jour de la note\"],\"6TfUy6\":[[\"value\"],\" dernières\"],\"6V3Ea3\":[\"Copié\"],\"6YtxFj\":[\"Nom\"],\"6exX+8\":[\"Régénérer\"],\"6gRgw8\":[\"Réessayer\"],\"6lGV3K\":[\"Afficher moins\"],\"76++pR\":[\"Avertissements\"],\"77DIAu\":[\"Aller dans Dashboard > Plugins > Webhook\"],\"7Bj3x9\":[\"Échoué\"],\"7D50KC\":[[\"label\"],\" déconnecté\"],\"7GfM5w\":[\"Récemment consultés\"],\"7L01XJ\":[\"Actions\"],\"7eMo+U\":[\"Accueil\"],\"7p5kLi\":[\"Tableau de bord\"],\"85eoJ1\":[\"Planning mis à jour\"],\"8B9E2D\":[\"Jour :\"],\"8YwF1J\":[\"Aller dans <0>Dashboard > Plugins > Webhook</0>\"],\"8ZsakT\":[\"Mot de passe\"],\"8tjQCz\":[\"Explorer\"],\"8vNtLy\":[\"Collez l'URL Radarr ci-dessus dans le champ List URL\"],\"8wYDMp\":[\"Vous avez déjà un compte ?\"],\"9AE3vb\":[\"Ouvrez Plex, allez dans <0>Settings > Webhooks<1/></0>\"],\"9GW0ZB\":[\"L'importation est toujours en cours en arrière-plan. Revenez plus tard.\"],\"9NyAH9\":[\"Ignoré\"],\"9Xhrps\":[\"Échec de la connexion\"],\"9ZLGbA\":[\"backups.\"],\"9eF5oV\":[\"Bon retour\"],\"9rG25a\":[\"URL du serveur\"],\"A+0rLe\":[\"Marqué comme terminé\"],\"AOHgZp\":[\"Épisodes\"],\"AOddWK\":[\"Connecter \",[\"label\"]],\"ATfxL/\":[\"Bande-annonce\"],\"AVlZoM\":[\"Environnement\"],\"Acf6vF\":[\"Enregistrer le nom\"],\"AdoUfN\":[\"Échec de l'ajout à la liste de suivi\"],\"AeXO77\":[\"Compte\"],\"AjtYj0\":[\"Dans la liste de suivi\"],\"Avee+B\":[\"Échec de la mise à jour du nom\"],\"B2R3xD\":[\"Activer/désactiver les sauvegardes planifiées\"],\"BEVzjL\":[\"Importation échouée\"],\"BQnS5I\":[\"Ouvrir \",[\"source\"],\" pour sLine truncated
|
||||
+1247
-1247
File diff suppressed because it is too large.
Load diff
@@ -1 +1 @@
|
||||
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+5kO8P\":[\"Saturday\"],\"+6i0lS\":[\"Retrieving your watch history, watchlist, and ratings...\"],\"+Cv+V9\":[\"Remove from library\"],\"+JkEpu\":[\"This page was left on the cutting room floor. It may have been moved, removed, or never made it past the screenplay.\"],\"+K0AvT\":[\"Disconnect\"],\"+N0l5/\":[\"Connected to <0>\",[\"serverHost\"],\"</0>. Tap to change.\"],\"+gLHYi\":[\"Failed to load title\"],\"+j1ex/\":[\"Failed to remove from library\"],\"+nF1ZO\":[\"Remove Photo\"],\"/+6dvC\":[\"Errors (\",[\"0\"],\")\"],\"/BBXeA\":[\"Connecting to server...\"],\"/DwR+n\":[\"Creating…\"],\"/XtbPO\":[[\"0\"],\" titles\"],\"/cg+QV\":[\"Watch all\"],\"/gQXGv\":[\"Failed to update status\"],\"/nT6AE\":[\"New password\"],\"/sHc1/\":[\"Update check\"],\"0+dyau\":[\"Failed to update retention setting\"],\"0BFJKK\":[\"Authorization was denied. Please try again.\"],\"0GHb20\":[\"Purge metadata cache?\"],\"0IBW21\":[\"Failed to purge caches\"],\"0gH/sc\":[\"Remove profile picture\"],\"1+P9RR\":[\"Switch to \",[\"0\"]],\"12cc1j\":[\"Watching\"],\"12lVOl\":[\"Self-hosted movie & TV tracker\"],\"1B4z0M\":[\"Filmography\"],\"1J4Ek0\":[\"Automatically back up your database on a schedule\"],\"1JhxXW\":[\"Episode \",[\"0\"],\", \",[\"episodeLabel\"]],\"1N6wNP\":[\"Import options\"],\"1Qz4uG\":[\"Enable the \\\"Playback\\\" event category\"],\"1hMWR6\":[\"Create account\"],\"1jHIjh\":[\"Watched all of \",[\"seasonName\"]],\"1vSYsG\":[\"Download backup\"],\"1wL1tj\":[\"TV show\"],\"2FletP\":[\"Purged \",[\"0\",\"plural\",{\"one\":[\"#\",\" title\"],\"other\":[\"#\",\" titles\"]}],\", \",[\"1\",\"plural\",{\"one\":[\"#\",\" person\"],\"other\":[\"#\",\" persons\"]}],\", \",[\"2\",\"plural\",{\"one\":[\"#\",\" file\"],\"other\":[\"#\",\" files\"]}],\" (\",[\"freed\"],\" freed)\"],\"2Fsd9r\":[\"This Month\"],\"2MPcep\":[\"Import complete\"],\"2Mu33Z\":[\"Cache management\"],\"2POOFK\":[\"Free\"],\"2Pt2NY\":[\"This will remove all items from your history.\"],\"2fCpt5\":[\"Return home\"],\"2pPBp6\":[\"Trending today\"],\"39y5bn\":[\"Friday\"],\"3Blefz\":[\"Ratings\"],\"3JTlG8\":[\"Recent Searches\"],\"3Jy8bM\":[\"Movies \",[\"select\"]],\"3L9OuQ\":[\"Episode \",[\"0\"]],\"3T8ziB\":[\"Create an account\"],\"3hELxX\":[\"Enter your Sofa server URL to get started\"],\"4fxLkp\":[\"Open Sonarr, go to <0>Settings > Import Lists</0>\"],\"4kpBqM\":[\"Last event \",[\"0\"]],\"4uUjVO\":[\"Producer\"],\"4x+A56\":[\"Anonymous usage reporting\"],\"5IShvp\":[\"Import \",[\"totalItems\"],\" items\"],\"5IYJSv\":[\"Explore titles\"],\"5Y4mym\":[\"Import from \",[\"0\"]],\"5ZzgbQ\":[\"Connect \",[\"0\"]],\"5fEnbK\":[\"Failed to update scheduled backup setting\"],\"5lWFkC\":[\"Sign in\"],\"5v9C16\":[\"Connected to \",[\"source\"]],\"623bR4\":[\"Failed to trigger job\"],\"6HN0yh\":[\"Open Plex, go to Settings > Webhooks\"],\"6TNjOJ\":[\"Failed to update rating\"],\"6TfUy6\":[\"last \",[\"value\"]],\"6V3Ea3\":[\"Copied\"],\"6YtxFj\":[\"Name\"],\"6exX+8\":[\"Regenerate\"],\"6gRgw8\":[\"Retry\"],\"6lGV3K\":[\"Show less\"],\"76++pR\":[\"Warnings\"],\"77DIAu\":[\"Go to Dashboard > Plugins > Webhook\"],\"7Bj3x9\":[\"Failed\"],\"7D50KC\":[[\"label\"],\" disconnected\"],\"7GfM5w\":[\"Recently Viewed\"],\"7L01XJ\":[\"Actions\"],\"7eMo+U\":[\"Go Home\"],\"7p5kLi\":[\"Dashboard\"],\"85eoJ1\":[\"Schedule updated\"],\"8B9E2D\":[\"Day:\"],\"8YwF1J\":[\"Go to <0>Dashboard > Plugins > Webhook</0>\"],\"8ZsakT\":[\"Password\"],\"8tjQCz\":[\"Explore\"],\"8vNtLy\":[\"Paste the Radarr URL above into the List URL field\"],\"8wYDMp\":[\"Already have an account?\"],\"9AE3vb\":[\"Open Plex, go to <0>Settings > Webhooks<1/></0>\"],\"9GW0ZB\":[\"Import is still running in the background. Check back later.\"],\"9NyAH9\":[\"Skipped\"],\"9Xhrps\":[\"Failed to connect\"],\"9ZLGbA\":[\"backups.\"],\"9eF5oV\":[\"Welcome back\"],\"9rG25a\":[\"Server URL\"],\"A+0rLe\":[\"Marked as completed\"],\"AOHgZp\":[\"Episodes\"],\"AOddWK\":[\"Connect \",[\"label\"]],\"ATfxL/\":[\"Trailer\"],\"AVlZoM\":[\"Environment\"],\"Acf6vF\":[\"Save name\"],\"AdoUfN\":[\"Failed to add to watchlist\"],\"AeXO77\":[\"Account\"],\"AjtYj0\":[\"On Watchlist\"],\"Avee+B\":[\"Failed to update name\"],\"B2R3xD\":[\"Toggle scheduled backups\"],\"BEVzjL\":[\"Import failed\"],\"BQnS5I\":[\"Open \",[\"source\"],\" to enter code\"],\"BUnoSB\":[[\"0\"],\" \",[\"1\",\"plural\",{\"one\":[\"backup\"],\"other\":[\"backups\"]}],\" stored\"],\"BpttUI\":[\"Trending Today\"],\"BrrIs8\":[\"Storage\"],\"BskWMl\":[\"Unreachable\"],\"BzEFor\":[\"or\"],\"CGDHFb\":[\"Add a <0>Generic Destination</0> and paste the URL above\"],\"CGExDN\":[\"Failed to purge image cache\"],\"CHeXFE\":[\"Status updated\"],\"CKyk7Q\":[\"Go back\"],\"CaB/+I\":[\"Welcome back, \",[\"name\"]],\"CodnUh\":[\"Removed from library\"],\"CpzGJY\":[\"This may take a few minutes for large libraries. Please don't close this tab.\"],\"CuPxpd\":[\"Requires an active <0>PlexLine truncated
|
||||
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+5kO8P\":[\"Sabato\"],\"+6i0lS\":[\"Recupero della cronologia, watchlist e valutazioni...\"],\"+Cv+V9\":[\"Rimuovi dalla libreria\"],\"+JkEpu\":[\"Questa pagina è rimasta sul pavimento della sala di montaggio. Potrebbe essere stata spostata, rimossa, o non essere mai arrivata alla sceneggiatura.\"],\"+K0AvT\":[\"Disconnetti\"],\"+N0l5/\":[\"Connesso a <0>\",[\"serverHost\"],\"</0>. Tocca per cambiare.\"],\"+gLHYi\":[\"Impossibile caricare il titolo\"],\"+j1ex/\":[\"Impossibile rimuovere dalla libreria\"],\"+nF1ZO\":[\"Rimuovi foto\"],\"/+6dvC\":[\"Errori (\",[\"0\"],\")\"],\"/BBXeA\":[\"Connessione al server in corso...\"],\"/DwR+n\":[\"Creazione in corso…\"],\"/XtbPO\":[[\"0\"],\" titles\"],\"/cg+QV\":[\"Segna tutta la stagione come vista\"],\"/gQXGv\":[\"Impossibile aggiornare lo stato\"],\"/nT6AE\":[\"Nuova password\"],\"/sHc1/\":[\"Controllo aggiornamenti\"],\"0+dyau\":[\"Impossibile aggiornare l'impostazione di conservazione\"],\"0BFJKK\":[\"Autorizzazione negata. Riprova.\"],\"0GHb20\":[\"Svuotare la cache metadati?\"],\"0IBW21\":[\"Impossibile svuotare le cache\"],\"0gH/sc\":[\"Rimuovi immagine del profilo\"],\"1+P9RR\":[\"Passa a \",[\"0\"]],\"12cc1j\":[\"In visione\"],\"12lVOl\":[\"Tracker film & TV self-hosted\"],\"1B4z0M\":[\"Filmografia\"],\"1J4Ek0\":[\"Esegui il backup automatico del database secondo una pianificazione\"],\"1JhxXW\":[\"Episodio \",[\"0\"],\", \",[\"episodeLabel\"]],\"1N6wNP\":[\"Opzioni di importazione\"],\"1Qz4uG\":[\"Abilita la categoria evento \\\"Playback\\\"\"],\"1hMWR6\":[\"Crea account\"],\"1jHIjh\":[\"Segnata come vista tutta la \",[\"seasonName\"]],\"1vSYsG\":[\"Scarica backup\"],\"1wL1tj\":[\"Serie TV\"],\"2FletP\":[[\"0\",\"plural\",{\"one\":[\"#\",\" titolo\"],\"other\":[\"#\",\" titoli\"]}],\", \",[\"1\",\"plural\",{\"one\":[\"#\",\" persona\"],\"other\":[\"#\",\" persone\"]}],\", \",[\"2\",\"plural\",{\"one\":[\"#\",\" file\"],\"other\":[\"#\",\" file\"]}],\" eliminati (\",[\"freed\"],\" liberati)\"],\"2Fsd9r\":[\"Questo mese\"],\"2MPcep\":[\"Importazione completata\"],\"2Mu33Z\":[\"Gestione cache\"],\"2POOFK\":[\"Gratis\"],\"2Pt2NY\":[\"Questo rimuoverà tutti gli elementi dalla tua cronologia.\"],\"2fCpt5\":[\"Torna alla home\"],\"2pPBp6\":[\"In tendenza oggi\"],\"39y5bn\":[\"Venerdì\"],\"3Blefz\":[\"Valutazioni\"],\"3JTlG8\":[\"Ricerche recenti\"],\"3Jy8bM\":[\"Film \",[\"select\"]],\"3L9OuQ\":[\"Episodio \",[\"0\"]],\"3T8ziB\":[\"Crea un account\"],\"3hELxX\":[\"Inserisci l'URL del tuo server Sofa per iniziare\"],\"4fxLkp\":[\"Apri Sonarr, vai su <0>Impostazioni > Liste di importazione</0>\"],\"4kpBqM\":[\"Ultimo evento \",[\"0\"]],\"4uUjVO\":[\"Produttore\"],\"4x+A56\":[\"Segnalazione anonima dell'utilizzo\"],\"5IShvp\":[\"Importa \",[\"totalItems\"],\" elementi\"],\"5IYJSv\":[\"Esplora titoli\"],\"5Y4mym\":[\"Importa da \",[\"0\"]],\"5ZzgbQ\":[\"Connetti \",[\"0\"]],\"5fEnbK\":[\"Impossibile aggiornare l'impostazione di backup pianificato\"],\"5lWFkC\":[\"Accedi\"],\"5v9C16\":[\"Connesso a \",[\"source\"]],\"623bR4\":[\"Impossibile avviare il job\"],\"6HN0yh\":[\"Apri Plex, vai su Impostazioni > Webhook\"],\"6TNjOJ\":[\"Impossibile aggiornare la valutazione\"],\"6TfUy6\":[\"ultimi \",[\"value\"]],\"6V3Ea3\":[\"Copiato\"],\"6YtxFj\":[\"Nome\"],\"6exX+8\":[\"Rigenera\"],\"6gRgw8\":[\"Riprova\"],\"6lGV3K\":[\"Mostra meno\"],\"76++pR\":[\"Avvisi\"],\"77DIAu\":[\"Vai su Dashboard > Plugin > Webhook\"],\"7Bj3x9\":[\"Non riuscito\"],\"7D50KC\":[\"Disconnesso: \",[\"label\"]],\"7GfM5w\":[\"Visualizzati di recente\"],\"7L01XJ\":[\"Azioni\"],\"7eMo+U\":[\"Vai alla home\"],\"7p5kLi\":[\"Dashboard\"],\"85eoJ1\":[\"Pianificazione aggiornata\"],\"8B9E2D\":[\"Giorno:\"],\"8YwF1J\":[\"Vai su <0>Dashboard > Plugin > Webhook</0>\"],\"8ZsakT\":[\"Password\"],\"8tjQCz\":[\"Esplora\"],\"8vNtLy\":[\"Incolla l'URL di Radarr nel campo URL della lista\"],\"8wYDMp\":[\"Hai già un account?\"],\"9AE3vb\":[\"Apri Plex, vai su <0>Impostazioni > Webhook<1/></0>\"],\"9GW0ZB\":[\"L'importazione è ancora in corso in background. Ricontrolla più tardi.\"],\"9NyAH9\":[\"Ignorati\"],\"9Xhrps\":[\"Impossibile connettersi\"],\"9ZLGbA\":[\"backups.\"],\"9eF5oV\":[\"Bentornato\"],\"9rG25a\":[\"URL server\"],\"A+0rLe\":[\"Segnato come completato\"],\"AOHgZp\":[\"Episodi\"],\"AOddWK\":[\"Connetti \",[\"label\"]],\"ATfxL/\":[\"Trailer\"],\"AVlZoM\":[\"Ambiente\"],\"Acf6vF\":[\"Salva nome\"],\"AdoUfN\":[\"Impossibile aggiungere alla watchlist\"],\"AeXO77\":[\"Account\"],\"AjtYj0\":[\"In watchlist\"],\"Avee+B\":[\"Impossibile aggiornare il nome\"],\"B2R3xD\":[\"Attiva/disattiva backup pianificati\"],\"BEVzjL\":[\"Importazione fallita\"],\"BQnS5I\":[\"Apri \",[\"source\"],\" per inserire il codice\"],\"BUnoSB\":[[\"0\"],\" \",[\"1\",\"plural\",{\"one\":[\"backup\"],\"other\":[\"backup\"]}],\" archiviati\"],\"BpttUI\":[\"In tendenza oggi\"],\"BrrIs8\":[\"Archiviazione\"],\"BskWMl\":[\"Non raggiungibile\"]Line truncated
|
||||
+1258
-1258
File diff suppressed because it is too large.
Load diff
@@ -1 +1 @@
|
||||
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+5kO8P\":[\"Saturday\"],\"+6i0lS\":[\"Retrieving your watch history, watchlist, and ratings...\"],\"+Cv+V9\":[\"Remove from library\"],\"+JkEpu\":[\"This page was left on the cutting room floor. It may have been moved, removed, or never made it past the screenplay.\"],\"+K0AvT\":[\"Disconnect\"],\"+N0l5/\":[\"Connected to <0>\",[\"serverHost\"],\"</0>. Tap to change.\"],\"+gLHYi\":[\"Failed to load title\"],\"+j1ex/\":[\"Failed to remove from library\"],\"+nF1ZO\":[\"Remove Photo\"],\"/+6dvC\":[\"Errors (\",[\"0\"],\")\"],\"/BBXeA\":[\"Connecting to server...\"],\"/DwR+n\":[\"Creating…\"],\"/XtbPO\":[[\"0\"],\" titles\"],\"/cg+QV\":[\"Watch all\"],\"/gQXGv\":[\"Failed to update status\"],\"/nT6AE\":[\"New password\"],\"/sHc1/\":[\"Update check\"],\"0+dyau\":[\"Failed to update retention setting\"],\"0BFJKK\":[\"Authorization was denied. Please try again.\"],\"0GHb20\":[\"Purge metadata cache?\"],\"0IBW21\":[\"Failed to purge caches\"],\"0gH/sc\":[\"Remove profile picture\"],\"1+P9RR\":[\"Switch to \",[\"0\"]],\"12cc1j\":[\"Watching\"],\"12lVOl\":[\"Self-hosted movie & TV tracker\"],\"1B4z0M\":[\"Filmography\"],\"1J4Ek0\":[\"Automatically back up your database on a schedule\"],\"1JhxXW\":[\"Episode \",[\"0\"],\", \",[\"episodeLabel\"]],\"1N6wNP\":[\"Import options\"],\"1Qz4uG\":[\"Enable the \\\"Playback\\\" event category\"],\"1hMWR6\":[\"Create account\"],\"1jHIjh\":[\"Watched all of \",[\"seasonName\"]],\"1vSYsG\":[\"Download backup\"],\"1wL1tj\":[\"TV show\"],\"2FletP\":[\"Purged \",[\"0\",\"plural\",{\"one\":[\"#\",\" title\"],\"other\":[\"#\",\" titles\"]}],\", \",[\"1\",\"plural\",{\"one\":[\"#\",\" person\"],\"other\":[\"#\",\" persons\"]}],\", \",[\"2\",\"plural\",{\"one\":[\"#\",\" file\"],\"other\":[\"#\",\" files\"]}],\" (\",[\"freed\"],\" freed)\"],\"2Fsd9r\":[\"This Month\"],\"2MPcep\":[\"Import complete\"],\"2Mu33Z\":[\"Cache management\"],\"2POOFK\":[\"Free\"],\"2Pt2NY\":[\"This will remove all items from your history.\"],\"2fCpt5\":[\"Return home\"],\"2pPBp6\":[\"Trending today\"],\"39y5bn\":[\"Friday\"],\"3Blefz\":[\"Ratings\"],\"3JTlG8\":[\"Recent Searches\"],\"3Jy8bM\":[\"Movies \",[\"select\"]],\"3L9OuQ\":[\"Episode \",[\"0\"]],\"3T8ziB\":[\"Create an account\"],\"3hELxX\":[\"Enter your Sofa server URL to get started\"],\"4fxLkp\":[\"Open Sonarr, go to <0>Settings > Import Lists</0>\"],\"4kpBqM\":[\"Last event \",[\"0\"]],\"4uUjVO\":[\"Producer\"],\"4x+A56\":[\"Anonymous usage reporting\"],\"5IShvp\":[\"Import \",[\"totalItems\"],\" items\"],\"5IYJSv\":[\"Explore titles\"],\"5Y4mym\":[\"Import from \",[\"0\"]],\"5ZzgbQ\":[\"Connect \",[\"0\"]],\"5fEnbK\":[\"Failed to update scheduled backup setting\"],\"5lWFkC\":[\"Sign in\"],\"5v9C16\":[\"Connected to \",[\"source\"]],\"623bR4\":[\"Failed to trigger job\"],\"6HN0yh\":[\"Open Plex, go to Settings > Webhooks\"],\"6TNjOJ\":[\"Failed to update rating\"],\"6TfUy6\":[\"last \",[\"value\"]],\"6V3Ea3\":[\"Copied\"],\"6YtxFj\":[\"Name\"],\"6exX+8\":[\"Regenerate\"],\"6gRgw8\":[\"Retry\"],\"6lGV3K\":[\"Show less\"],\"76++pR\":[\"Warnings\"],\"77DIAu\":[\"Go to Dashboard > Plugins > Webhook\"],\"7Bj3x9\":[\"Failed\"],\"7D50KC\":[[\"label\"],\" disconnected\"],\"7GfM5w\":[\"Recently Viewed\"],\"7L01XJ\":[\"Actions\"],\"7eMo+U\":[\"Go Home\"],\"7p5kLi\":[\"Dashboard\"],\"85eoJ1\":[\"Schedule updated\"],\"8B9E2D\":[\"Day:\"],\"8YwF1J\":[\"Go to <0>Dashboard > Plugins > Webhook</0>\"],\"8ZsakT\":[\"Password\"],\"8tjQCz\":[\"Explore\"],\"8vNtLy\":[\"Paste the Radarr URL above into the List URL field\"],\"8wYDMp\":[\"Already have an account?\"],\"9AE3vb\":[\"Open Plex, go to <0>Settings > Webhooks<1/></0>\"],\"9GW0ZB\":[\"Import is still running in the background. Check back later.\"],\"9NyAH9\":[\"Skipped\"],\"9Xhrps\":[\"Failed to connect\"],\"9ZLGbA\":[\"backups.\"],\"9eF5oV\":[\"Welcome back\"],\"9rG25a\":[\"Server URL\"],\"A+0rLe\":[\"Marked as completed\"],\"AOHgZp\":[\"Episodes\"],\"AOddWK\":[\"Connect \",[\"label\"]],\"ATfxL/\":[\"Trailer\"],\"AVlZoM\":[\"Environment\"],\"Acf6vF\":[\"Save name\"],\"AdoUfN\":[\"Failed to add to watchlist\"],\"AeXO77\":[\"Account\"],\"AjtYj0\":[\"On Watchlist\"],\"Avee+B\":[\"Failed to update name\"],\"B2R3xD\":[\"Toggle scheduled backups\"],\"BEVzjL\":[\"Import failed\"],\"BQnS5I\":[\"Open \",[\"source\"],\" to enter code\"],\"BUnoSB\":[[\"0\"],\" \",[\"1\",\"plural\",{\"one\":[\"backup\"],\"other\":[\"backups\"]}],\" stored\"],\"BpttUI\":[\"Trending Today\"],\"BrrIs8\":[\"Storage\"],\"BskWMl\":[\"Unreachable\"],\"BzEFor\":[\"or\"],\"CGDHFb\":[\"Add a <0>Generic Destination</0> and paste the URL above\"],\"CGExDN\":[\"Failed to purge image cache\"],\"CHeXFE\":[\"Status updated\"],\"CKyk7Q\":[\"Go back\"],\"CaB/+I\":[\"Welcome back, \",[\"name\"]],\"CodnUh\":[\"Removed from library\"],\"CpzGJY\":[\"This may take a few minutes for large libraries. Please don't close this tab.\"],\"CuPxpd\":[\"Requires an active <0>PlexLine truncated
|
||||
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+5kO8P\":[\"Sábado\"],\"+6i0lS\":[\"Buscando seu histórico de exibição, lista de desejos e avaliações...\"],\"+Cv+V9\":[\"Remover da biblioteca\"],\"+JkEpu\":[\"Esta página ficou no chão da sala de montagem. Pode ter sido movida, removida ou nunca ter passado do roteiro.\"],\"+K0AvT\":[\"Desconectar\"],\"+N0l5/\":[\"Conectado a <0>\",[\"serverHost\"],\"</0>. Toque para alterar.\"],\"+gLHYi\":[\"Falha ao carregar título\"],\"+j1ex/\":[\"Falha ao remover da biblioteca\"],\"+nF1ZO\":[\"Remover Foto\"],\"/+6dvC\":[\"Erros (\",[\"0\"],\")\"],\"/BBXeA\":[\"Conectando ao servidor...\"],\"/DwR+n\":[\"Criando…\"],\"/XtbPO\":[[\"0\"],\" titles\"],\"/cg+QV\":[\"Marcar todos\"],\"/gQXGv\":[\"Falha ao atualizar status\"],\"/nT6AE\":[\"Nova senha\"],\"/sHc1/\":[\"Verificação de atualização\"],\"0+dyau\":[\"Falha ao atualizar configuração de retenção\"],\"0BFJKK\":[\"Autorização negada. Tente novamente.\"],\"0GHb20\":[\"Limpar cache de metadados?\"],\"0IBW21\":[\"Falha ao limpar caches\"],\"0gH/sc\":[\"Remover foto de perfil\"],\"1+P9RR\":[\"Mudar para \",[\"0\"]],\"12cc1j\":[\"Assistindo\"],\"12lVOl\":[\"Rastreador de filmes e séries auto-hospedado\"],\"1B4z0M\":[\"Filmografia\"],\"1J4Ek0\":[\"Faça backup automático do banco de dados com agendamento\"],\"1JhxXW\":[\"Episódio \",[\"0\"],\", \",[\"episodeLabel\"]],\"1N6wNP\":[\"Opções de importação\"],\"1Qz4uG\":[\"Ative a categoria de evento \\\"Playback\\\"\"],\"1hMWR6\":[\"Criar conta\"],\"1jHIjh\":[\"Todos os episódios de \",[\"seasonName\"],\" assistidos\"],\"1vSYsG\":[\"Baixar backup\"],\"1wL1tj\":[\"Série\"],\"2FletP\":[[\"0\",\"plural\",{\"one\":[\"#\",\" título removido\"],\"other\":[\"#\",\" títulos removidos\"]}],\", \",[\"1\",\"plural\",{\"one\":[\"#\",\" pessoa\"],\"other\":[\"#\",\" pessoas\"]}],\", \",[\"2\",\"plural\",{\"one\":[\"#\",\" arquivo\"],\"other\":[\"#\",\" arquivos\"]}],\" (\",[\"freed\"],\" liberado)\"],\"2Fsd9r\":[\"Este Mês\"],\"2MPcep\":[\"Importação concluída\"],\"2Mu33Z\":[\"Gerenciamento de cache\"],\"2POOFK\":[\"Grátis\"],\"2Pt2NY\":[\"Isso removerá todos os itens do seu histórico.\"],\"2fCpt5\":[\"Voltar ao início\"],\"2pPBp6\":[\"Em alta hoje\"],\"39y5bn\":[\"Sexta-feira\"],\"3Blefz\":[\"Avaliações\"],\"3JTlG8\":[\"Pesquisas Recentes\"],\"3Jy8bM\":[\"Filmes \",[\"select\"]],\"3L9OuQ\":[\"Episódio \",[\"0\"]],\"3T8ziB\":[\"Criar uma conta\"],\"3hELxX\":[\"Insira a URL do seu servidor Sofa para começar\"],\"4fxLkp\":[\"Abra o Sonarr, vá para <0>Settings > Import Lists</0>\"],\"4kpBqM\":[\"Último evento \",[\"0\"]],\"4uUjVO\":[\"Produtor\"],\"4x+A56\":[\"Relatório de uso anônimo\"],\"5IShvp\":[\"Importar \",[\"totalItems\"],\" itens\"],\"5IYJSv\":[\"Explorar títulos\"],\"5Y4mym\":[\"Importar de \",[\"0\"]],\"5ZzgbQ\":[\"Conectar \",[\"0\"]],\"5fEnbK\":[\"Falha ao atualizar configuração de backup agendado\"],\"5lWFkC\":[\"Entrar\"],\"5v9C16\":[\"Conectado a \",[\"source\"]],\"623bR4\":[\"Falha ao acionar tarefa\"],\"6HN0yh\":[\"Abra o Plex, vá para Settings > Webhooks\"],\"6TNjOJ\":[\"Falha ao atualizar avaliação\"],\"6TfUy6\":[\"últimos \",[\"value\"]],\"6V3Ea3\":[\"Copiado\"],\"6YtxFj\":[\"Nome\"],\"6exX+8\":[\"Regenerar\"],\"6gRgw8\":[\"Tentar novamente\"],\"6lGV3K\":[\"Mostrar menos\"],\"76++pR\":[\"Avisos\"],\"77DIAu\":[\"Acesse Dashboard > Plugins > Webhook\"],\"7Bj3x9\":[\"Falhou\"],\"7D50KC\":[[\"label\"],\" desconectado\"],\"7GfM5w\":[\"Vistos Recentemente\"],\"7L01XJ\":[\"Ações\"],\"7eMo+U\":[\"Ir para Início\"],\"7p5kLi\":[\"Painel\"],\"85eoJ1\":[\"Agendamento atualizado\"],\"8B9E2D\":[\"Dia:\"],\"8YwF1J\":[\"Acesse <0>Dashboard > Plugins > Webhook</0>\"],\"8ZsakT\":[\"Senha\"],\"8tjQCz\":[\"Explorar\"],\"8vNtLy\":[\"Cole a URL do Radarr acima no campo URL da Lista\"],\"8wYDMp\":[\"Já tem uma conta?\"],\"9AE3vb\":[\"Abra o Plex, vá para <0>Settings > Webhooks<1/></0>\"],\"9GW0ZB\":[\"A importação ainda está em andamento em segundo plano. Verifique mais tarde.\"],\"9NyAH9\":[\"Ignorado\"],\"9Xhrps\":[\"Falha ao conectar\"],\"9ZLGbA\":[\"backups.\"],\"9eF5oV\":[\"Bem-vindo de volta\"],\"9rG25a\":[\"URL do Servidor\"],\"A+0rLe\":[\"Marcado como concluído\"],\"AOHgZp\":[\"Episódios\"],\"AOddWK\":[\"Conectar \",[\"label\"]],\"ATfxL/\":[\"Trailer\"],\"AVlZoM\":[\"Ambiente\"],\"Acf6vF\":[\"Salvar nome\"],\"AdoUfN\":[\"Falha ao adicionar à lista de desejos\"],\"AeXO77\":[\"Conta\"],\"AjtYj0\":[\"Na Lista de Desejos\"],\"Avee+B\":[\"Falha ao atualizar nome\"],\"B2R3xD\":[\"Ativar/desativar backups agendados\"],\"BEVzjL\":[\"Importação falhou\"],\"BQnS5I\":[\"Abrir \",[\"source\"],\" para inserir o código\"],\"BUnoSB\":[[\"0\"],\" \",[\"1\",\"plural\",{\"one\":[\"backup armazenado\"],\"other\":[\"backups armazenados\"]}]],\"BpttUI\":[\"Em Alta Hoje\"],\"BrrIs8\":[\"Armazenamento\"],\"BskWMl\":[\"Inacessível\"],\"BzEFor\":[\"ou\"],\"CGDHFb\":[\"Adicione um <0>Generic DestinatiLine truncated
|
||||
Reference in new issue
Block a user