fix(ui,i18n): E30 review round 1 — audit rows in the reader's language, one HU name per thing

- audit log: a job run named from its result data (nested phases too), a skipped run says so, a
  secret's reset reads as a reset, choices named as Configuration names them, interval / batch /
  counts localized; the inbox shares the same jobRunText
- HU: remux is "Közvetlen közvetítés" (it shared "Közvetlen lejátszás" with direct play); backfill is
  behúzás, enrich is dúsítás, collection is kollekció, the allow-list is fehérlista; the last
  "jobnak" / "transzkódolás"; a test holds the options of one choice to distinct names
- contract: every skipped / reason word a job returns is named in both languages
- person page: the bio wait is timed from the open and a failing ask stops the polling; ClampedText
  (ui) shared with the collection page, whose short summary lost its dead More
- a playlist names season 0 the Specials; the channel re-slot compares in the reader's alphabet; an
  invite's date is in the admin's language; the language-ordered lists are asked again once a
  language switch is saved (saveLanguage)
- poster grids' column minimum in rem; lint refuses minmax(Npx,…)
This commit is contained in:
2026-09-30 03:26:58 +02:00
parent ab963c81d2
commit fa55e01ef0
46 changed files with 624 additions and 187 deletions
@@ -100,6 +100,29 @@ const routeFiles = (dir = "routes"): string[] =>
: [],
);
const routeSources = (): string[] => routeFiles().map(backend);
// The words a job's result gives for not doing its work → `scheduler.skip.<vocabKey(word)>` (the Scheduler
// page, the run notice and the audit row name them; lib/jobResult). Read as the `"skipped": "…"` /
// `"reason": "…"` literals of the non-HTTP backend: under routes/ (and main.py) a `reason` is a refusal
// code, which `errors.*` names. A word from an exception's text is not a literal and is not covered.
const appFiles = (dir: string): string[] =>
readdirSync(new URL(`../../../backend/app/${dir}`, import.meta.url), {
withFileTypes: true,
}).flatMap((e) =>
e.isDirectory()
? e.name === "routes" || e.name === "__pycache__"
? []
: appFiles(`${dir}${e.name}/`)
: e.name.endsWith(".py") && `${dir}${e.name}` !== "main.py"
? [`${dir}${e.name}`]
: [],
);
const skipWords = [
...new Set(
appFiles("").flatMap((f) =>
[...backend(f).matchAll(/"(?:skipped|reason)": "([^"]+)"/g)].map((m) => m[1]!),
),
),
];
// A target the scan cannot read — `what=SOME_CONSTANT` — is a 404 no locale is checked for (one hid
// `debug_session`). Only the helpers' own pass-through in `_common.py` may name it by variable.
const opaqueWhats = routeFiles()
@@ -217,6 +240,14 @@ describe("backend ids have their names in both languages", () => {
expect.arrayContaining(["English", "Gaming", "Health & Fitness", "Hobbies", "Sports"]),
);
expect(builtinProfiles).toEqual(expect.arrayContaining(["720p (MP4)", "Video only (MP4)"]));
expect(skipWords).toEqual(
expect.arrayContaining([
"disabled",
"sync paused",
"tmdb_api_key not set",
"no service user",
]),
);
expect(refusedReasons).toEqual(
expect.arrayContaining(["weak_password", "setting_too_low", "plex_write_failed"]),
);
@@ -256,6 +287,10 @@ describe("backend ids have their names in both languages", () => {
expect([...idsUnder(keys, prefix)].filter((j) => !jobs.includes(j))).toEqual([]);
});
it(`${lang}: every word a job's result gives for skipping its work`, () => {
expect(missing(skipWords.map((w) => `scheduler.skip.${vocabKey(w)}`))).toEqual([]);
});
it(`${lang}: every audit and quota action`, () => {
expect(auditActions.filter((a) => !idsUnder(keys, "auditActions").has(a))).toEqual([]);
expect(quotaActions.filter((a) => !idsUnder(keys, "quotaActions").has(a))).toEqual([]);
+29
View File
@@ -43,3 +43,32 @@ describe("the copy rule", () => {
expect(offenders((v) => /(\d|\}\})\s?(m|h|d|s)(?![\p{L}\d/])/u.test(v))).toEqual([]);
});
});
describe("one name per thing", () => {
// The options of one choice are told apart by their names alone: two playback classes once shared
// "Közvetlen lejátszás" in the HU filter (E30 review). A set = a `…Opt` object, or one choice key's
// options under config.choices.
const sets = (): [string, Record<string, unknown>][] => {
const out: [string, Record<string, unknown>][] = [];
const walk = (o: unknown, path: string, parent: string) => {
if (!o || typeof o !== "object") return;
if (/Opt$/.test(path.split(".").pop() ?? "") || parent.endsWith("/config:.choices"))
out.push([path, o as Record<string, unknown>]);
for (const [k, v] of Object.entries(o)) walk(v, `${path}.${k}`, path);
};
for (const [file, json] of Object.entries(files))
walk(json, file.replace("./locales/", "").replace(".json", ":"), "");
return out;
};
it("names the options of one choice differently", () => {
const found = sets();
expect(found.some(([p]) => p.endsWith("playableOpt"))).toBe(true);
expect(found.some(([p]) => p.endsWith("choices.log_level"))).toBe(true);
const clashes = found.flatMap(([path, opts]) => {
const names = Object.values(opts).filter((v): v is string => typeof v === "string");
return names.length === new Set(names).size ? [] : [path];
});
expect(clashes).toEqual([]);
});
});
+1
View File
@@ -13,6 +13,7 @@
"off": "Off",
"default": "default",
"secretUpdated": "secret updated (the value is never logged)",
"secretReset": "secret reset to its default (the value is never logged)",
"cols": {
"when": "When",
"actor": "Who",
+1
View File
@@ -28,6 +28,7 @@
},
"jobDone": {
"titleOk": "{{job}} finished",
"titleSkipped": "{{job}} skipped",
"titleError": "Couldn't run {{job}}"
},
"emailUndelivered": {
-1
View File
@@ -320,7 +320,6 @@
"removeShow": "Remove whole show",
"removeSeason": "Remove whole season",
"episodes": "{{count}} episodes",
"season": "Season {{n}}",
"seasonUnknown": "Episodes",
"addShow": "Add whole show to a playlist",
"addSeason": "Add season to a playlist",
+4 -1
View File
@@ -182,6 +182,9 @@
"tmdbapikeynotset": "TMDB API key not set",
"nodemoaccount": "no demo account",
"noserviceuser": "no service user",
"syncpaused": "sync paused"
"syncpaused": "sync paused",
"lowquota": "low quota",
"noreadscope": "no YouTube read access",
"busy": "another sync is running"
}
}
+1 -1
View File
@@ -24,7 +24,7 @@
"pivotJob": "feladat {{id}}",
"clearPivot": "Szűrő törlése",
"showRequest": "Csak ennek a kérésnek a sorai",
"showJob": "Csak ennek a jobnak a sorai",
"showJob": "Csak ennek a feladatnak a sorai",
"empty": "Nincs a szűrésnek megfelelő sor.",
"stale": "Nem sikerült frissíteni — amit látsz, elavult lehet",
"olderFailed": "Nem sikerült betölteni a régebbi sorokat",
+1
View File
@@ -13,6 +13,7 @@
"off": "Ki",
"default": "alapérték",
"secretUpdated": "titok frissítve (az értéke sosem kerül a naplóba)",
"secretReset": "titok visszaállítva az alapértékre (az értéke sosem kerül a naplóba)",
"cols": {
"when": "Mikor",
"actor": "Ki",
@@ -23,7 +23,7 @@
"audit_clear": "Napló ürítve",
"download_credential_set": "Letöltési cookie-k beállítva",
"download_credential_delete": "Letöltési cookie-k törölve",
"invite_delete": "Whitelista-bejegyzés törölve",
"invite_delete": "Fehérlista-bejegyzés törölve",
"invite_send": "Meghívó elküldve",
"issue_create": "Hibajegy elküldve"
}
+5 -5
View File
@@ -32,9 +32,9 @@
"keywords": "Kulcsszavak",
"showInFeed": "Mutasd a Feedemben",
"fullHistory": "Teljes előzmény",
"fullHistoryLoading": "Előzmény letöltése…",
"fullHistoryProgress": "Előzmény letöltése… {{stored}} / {{total}}",
"fullHistoryLoadingHint": "A teljes előzmény letöltése folyamatban — a videók feltűnnek, ahogy előkerülnek; egy nagyon nagy csatorna maradékát a háttérben fejezi be.",
"fullHistoryQueued": "A csatorna teljes előzményének letöltése elindult — az új videók feltűnnek, ahogy előkerülnek.",
"fullHistoryFailed": "Nem sikerült elindítani a teljes előzmény letöltését"
"fullHistoryLoading": "Előzmény behúzása…",
"fullHistoryProgress": "Előzmény behúzása… {{stored}} / {{total}}",
"fullHistoryLoadingHint": "A teljes előzmény behúzása folyamatban — a videók feltűnnek, ahogy előkerülnek; egy nagyon nagy csatorna maradékát a háttérben fejezi be.",
"fullHistoryQueued": "A csatorna teljes előzményének behúzása elindult — az új videók feltűnnek, ahogy előkerülnek.",
"fullHistoryFailed": "Nem sikerült elindítani a teljes előzmény behúzását"
}
+12 -12
View File
@@ -2,8 +2,8 @@
"actionsLabel": "Katalógus-műveletek",
"syncSubscriptions": "Feliratkozások szinkronizálása a YouTube-ról",
"syncSubscriptionsHint": "Újraimportálja a feliratkozási listádat a YouTube-ról — hozzáadja az újonnan követett csatornákat, és eltávolítja azokat, amelyekről leiratkoztál. Maguk a videók a háttérben automatikusan tovább szinkronizálódnak; ez nem tölti le őket újra.",
"backfillEverything": "Minden letöltése",
"backfillEverythingHint": "Teljes archívum letöltését kéri minden csatornához, amelyre feliratkoztál. A régebbi videók és a keresés a megosztott napi kvóta függvényében válik teljessé — ez eltarthat egy ideig.",
"backfillEverything": "Minden videó behúzása",
"backfillEverythingHint": "A teljes archívum behúzását kéri minden csatornához, amelyre feliratkoztál. A régebbi videók és a keresés a megosztott napi kvóta függvényében válik teljessé — ez eltarthat egy ideig.",
"tabs": {
"subscribed": "Feliratkozások",
"discovery": "Felfedezés a lejátszási listákból",
@@ -94,7 +94,7 @@
"fullHistory": "Teljes előzmény",
"fullHistoryHint": "Csatornák, amelyek teljes archívuma le van töltve, azok közül, amelyekhez teljes előzményt kértél.",
"left": "hátra",
"leftHint": "Hozzávetőleges becslés {{count}} függőben lévő csatorna teljes előzményének letöltésére, a megosztott napi kvóta alapján.",
"leftHint": "Hozzávetőleges becslés {{count}} függőben lévő csatorna teljes előzményének behúzására, a megosztott napi kvóta alapján.",
"myVideos": "Videóim",
"myVideosHint": "A csatornáidon elérhető videók teljes száma.",
"quotaLeft": "Maradék kvóta",
@@ -105,15 +105,15 @@
"editTags": "Címkék szerkesztése…",
"filterFeedByTag": "Feed szűrése: „{{name}}”",
"priorityHint": "A te rangsorod ehhez a csatornához. Rendezd a Feedet „Csatorna prioritás” szerint, hogy a magasabb prioritású csatornák felülre kerüljenek.",
"fullHint": "Teljes előzmény letöltve.",
"fullHint": "Teljes előzmény behúzva.",
"fullySynced": "teljesen szinkronban",
"fullySyncedHint": "A legutóbbi feltöltések és a teljes archívum is megvan.",
"backfillThis": "Csatorna teljes letöltése",
"backfillThisHint": "A csatorna teljes archívumának letöltése (régebbi videók + teljes keresés).",
"resetBackfill": "Csatorna alaphelyzetbe állítása és újraletöltése",
"cancelBackfill": "A teljes letöltés kérésének visszavonása",
"resetHint": "Admin: a csatorna teljes újraletöltése a nulláról (legutóbbi + teljes archívum), a jelenlegi szinkron-állapottól függetlenül.",
"queuedRequestedHint": "Teljes előzmény kérve — a csatorna teljes archívuma letöltődik, ahogy a megosztott kvóta engedi.",
"backfillThis": "A csatorna teljes behúzása",
"backfillThisHint": "A csatorna teljes archívumának behúzása (régebbi videók + teljes keresés).",
"resetBackfill": "Csatorna alaphelyzetbe állítása és újbóli behúzása",
"cancelBackfill": "A teljes behúzás kérésének visszavonása",
"resetHint": "Admin: a csatorna teljes újbóli behúzása a nulláról (legutóbbi + teljes archívum), a jelenlegi szinkron-állapottól függetlenül.",
"queuedRequestedHint": "Teljes előzmény kérve — a csatorna teljes archívuma bekerül, ahogy a megosztott kvóta engedi.",
"queuedByOtherHint": "Egy másik feliratkozó már kérte ennek a csatornának a teljes előzményét, így a teljes archívuma már úton van mindenkihez — itt nincs teendőd.",
"hideHint": "A csatorna videóinak elrejtése a Feededből. Feliratkozva marad; ez nem iratkoztat le a YouTube-on.",
"hideFromFeed": "Elrejtés a Feedből",
@@ -134,12 +134,12 @@
"needYouTube": "Ehhez csatlakoztasd a YouTube-fiókod",
"connect": "Csatlakoztatás",
"filteredByTag": "Feed szűrve címkére: {{name}}",
"resetDone": "{{name}} alaphelyzetbe állítva — újraletöltés folyamatban",
"resetDone": "{{name}} alaphelyzetbe állítva — újbóli behúzás folyamatban",
"resetFailed": "Nem sikerült alaphelyzetbe állítani a csatornát",
"hidden": "„{{name}}” elrejtve a Feedből"
},
"confirmUnsubscribe": "Leiratkozol a(z) „{{name}}” csatornáról a YouTube-on? Ez megváltoztatja a valódi YouTube-fiókodat. Ha csak a Feededből szeretnéd eltávolítani, inkább rejtsd el.",
"confirmReset": "Újraletöltöd a(z) „{{name}}” csatornát a nulláról? Ez újrafuttatja a videók behúzását (legutóbbi + teljes előzmény), és némi API-kvótát fogyaszt.",
"confirmReset": "Újra behúzod a(z) „{{name}}” csatorna videóit a nulláról? Ez újrafuttatja a videók behúzását (legutóbbi + teljes előzmény), és némi API-kvótát fogyaszt.",
"searchPlaceholder": "Csatornák keresése…",
"blocked": {
"title": "Tiltott csatornák",
+6 -6
View File
@@ -46,7 +46,7 @@
},
"backfill_quota_reserve": {
"label": "Letöltési kvótatartalék",
"hint": "Tartalékban tartott egységek, hogy az ütemezett letöltés ne éheztesse ki az interaktív szinkront / gazdagítást."
"hint": "Tartalékban tartott egységek, hogy az ütemezett behúzás ne éheztesse ki az interaktív szinkront / dúsítást."
},
"search_daily_limit_per_user": {
"label": "Élő keresés — napi limit / felhasználó",
@@ -57,11 +57,11 @@
"hint": "Honnan jönnek az élő YouTube-keresés találatai. A „Weboldal” a YouTube saját keresővégpontját olvassa, és nem fogyaszt API-kvótát (ajánlott). A „Hivatalos API” a search.list-et használja (100 egység/oldal) — válts rá, ha a weboldalas forrás elromlik vagy letiltják."
},
"backfill_recent_max_videos": {
"label": "Friss letöltés — max videó",
"hint": "Csatornánként az első körben letöltött legújabb videók száma."
"label": "Friss behúzás — max videó",
"hint": "Csatornánként az első körben behúzott legújabb videók száma."
},
"backfill_recent_max_days": {
"label": "Friss letöltés — max kor (nap)",
"label": "Friss behúzás — max kor (nap)",
"hint": "Az első kör csatornánként meddig nyúl vissza."
},
"rss_fallback_hours": {
@@ -77,7 +77,7 @@
"hint": "Futásonként ennyi videót osztályozunk."
},
"enrich_batch_size": {
"label": "Gazdagítási kötegméret",
"label": "Dúsítási kötegméret",
"hint": "videos.list azonosítók hívásonként (a YouTube 50-ben maximálja)."
},
"autotag_title_sample": {
@@ -90,7 +90,7 @@
},
"youtube_api_key": {
"label": "YouTube API-kulcs",
"hint": "Opcionális. Publikus olvasásokhoz (csatornák/videók), hogy a megosztott letöltés ne függjön egy felhasználó OAuth-jától. Titkosítva tárolva; csak írható."
"hint": "Opcionális. Publikus olvasásokhoz (csatornák/videók), hogy a megosztott behúzás ne függjön egy felhasználó OAuth-jától. Titkosítva tárolva; csak írható."
},
"youtube_api_proxy": {
"label": "YouTube API kimenő proxy",
+4 -4
View File
@@ -26,7 +26,7 @@
"link": "Ez a megosztási link már nem létezik",
"notification": "Ez az értesítés már nem létezik",
"account": "Ez a fiók már nem létezik",
"collection": "Ez a gyűjtemény már nem létezik",
"collection": "Ez a kollekció már nem létezik",
"config_key": "Nincs ilyen beállítás",
"file": "A fájl már nem érhető el",
"filmstrip": "Ehhez nincs képsor",
@@ -128,9 +128,9 @@
"already_subscribed": "Erre a csatornára már feliratkoztál",
"channel_blocked": "Ezt a csatornát letiltottad",
"collection_fields_required": "A címet és egy elemet is meg kell adni",
"collection_pending_sync": "A gyűjtemény a Plexben megváltozott, de a helyi másolat frissítése nem sikerült — a következő szinkron pótolja",
"collection_read_only": "Ez a gyűjtemény csak olvasható",
"collection_smart": "Az okos és az automatikus listás gyűjtemények nem tehetők szerkeszthetővé",
"collection_pending_sync": "A kollekció a Plexben megváltozott, de a helyi másolat frissítése nem sikerült — a következő szinkron pótolja",
"collection_read_only": "Ez a kollekció csak olvasható",
"collection_smart": "Az okos és az automatikus listás kollekciók nem tehetők szerkeszthetővé",
"demo_activate": "A demó fiók nem aktiválható",
"demo_delete": "A demó fiók nem törölhető",
"demo_role": "A demó fiók szerepköre nem módosítható",
+1 -1
View File
@@ -41,7 +41,7 @@
"countTooltip": "A feliratkozásaid a teljes megosztott katalógushoz képest.",
"paused": "szüneteltetve",
"syncing": "{{count}} szinkronizálás alatt",
"backfillingHistory": "előzmény letöltése",
"backfillingHistory": "előzmény behúzása",
"working": "szinkronizálás…",
"recentQueued": "{{count}} sorban",
"allSynced": "minden szinkronban",
+1
View File
@@ -28,6 +28,7 @@
},
"jobDone": {
"titleOk": "{{job}} kész",
"titleSkipped": "{{job}} kihagyva",
"titleError": "Nem sikerült lefuttatni: {{job}}"
},
"emailUndelivered": {
+5 -6
View File
@@ -30,7 +30,7 @@
"nameTaken": "Már létezik ilyen nevű kollekció",
"newHint": "Válaszd ki az első címet — egy kollekcióhoz legalább egy elem kell.",
"createWith": "Létrehozás",
"deleteFailed": "Nem sikerült törölni a gyűjteményt"
"deleteFailed": "Nem sikerült törölni a kollekciót"
},
"searchPlaceholder": "Keresés a Plexben…",
"searchField": {
@@ -60,7 +60,7 @@
"movie": "Filmek",
"show": "Sorozatok",
"playlists": "Listák",
"collections": "Gyűjtemények"
"collections": "Kollekciók"
},
"show": "Megjelenítés",
"showOpt": {
@@ -103,7 +103,7 @@
"playable": "Lejátszás",
"playableOpt": {
"direct": "Közvetlen lejátszás",
"remux": "Közvetlen lejátszás",
"remux": "Közvetlen közvetítés",
"transcode_hw": "Átkódolás · HW",
"transcode_sw": "Átkódolás · SW"
}
@@ -184,7 +184,7 @@
"subtitles": "Felirat",
"subOff": "Ki",
"errNotFound": "Ez a fájl nem játszható le — a média nem érhető el a szerveren (hiányzik a Plex media-mount, vagy hibás az útvonal-leképezés). Kérd meg az adminisztrátort, hogy ellenőrizze a Plex beállításait.",
"errTranscode": "Ennek a fájlnak a formátuma transzkódolást igényel, ami még nem támogatott.",
"errTranscode": "Ennek a fájlnak a formátuma átkódolást igényel, ami még nem támogatott.",
"errGeneric": "Nem sikerült elindítani a lejátszást. Próbáld újra.",
"help": "Billentyűparancsok",
"infoBtn": "Média infó",
@@ -288,7 +288,7 @@
},
"playable": {
"direct": "Közvetlenül játszható a böngészőben",
"remux": "Közvetlen lejátszás — könnyű remux (nincs videó-újrakódolás)",
"remux": "Közvetlen közvetítés — könnyű remux (nincs videó-újrakódolás)",
"transcode_hw": "Hardveres kódolóval átkódolva",
"transcode_sw": "Szoftveresen átkódolva (legnehezebb)"
},
@@ -320,7 +320,6 @@
"removeShow": "Egész sorozat eltávolítása",
"removeSeason": "Egész évad eltávolítása",
"episodes": "{{count}} epizód",
"season": "{{n}}. évad",
"seasonUnknown": "Epizódok",
"addShow": "Egész sorozat listához adása",
"addSeason": "Évad listához adása",
+7 -4
View File
@@ -151,10 +151,10 @@
"shows": "sorozat",
"seasons": "évad",
"episodes": "epizód",
"collections": "gyűjtemény",
"collections": "kollekció",
"overlaid": "magyar átfedés",
"pruned": "eltávolítva",
"people_enriched": "kiegészített személy",
"people_enriched": "dúsított személy",
"media_probed": "vizsgált média",
"people_pruned": "eltávolított személy",
"error": "hiba",
@@ -166,7 +166,7 @@
"applied": "alkalmazva",
"cleared": "törölve",
"scanned": "átvizsgálva",
"enriched": "kiegészítve",
"enriched": "dúsítva",
"countries_coded": "országkód pótolva",
"sessions_closed": "lezárt munkamenet",
"sessions_reaped": "eltakarított munkamenet",
@@ -182,6 +182,9 @@
"tmdbapikeynotset": "nincs TMDB API-kulcs",
"nodemoaccount": "nincs demófiók",
"noserviceuser": "nincs szolgáltatásfiók",
"syncpaused": "a szinkron szünetel"
"syncpaused": "a szinkron szünetel",
"lowquota": "kevés a kvóta",
"noreadscope": "nincs YouTube-olvasási jogosultság",
"busy": "egy másik szinkron fut"
}
}
+2 -2
View File
@@ -185,10 +185,10 @@
"delete": "Törlés",
"deleteLabel": "{{email}} törlése a fehérlistáról",
"deleteHint": "A cím elfelejtése. Egy későbbi kérelme új kérelemként jelenik meg.",
"deleteTitle": "Törlöd a whitelista-bejegyzést?",
"deleteTitle": "Törlöd a fehérlista-bejegyzést?",
"deleteConfirm": "Elfelejted {{email}} címet? A Siftlode eldobja a bejegyzést, így az adott címről újra kérelmezni kell.",
"deleteHasAccount": "Erre a címre már regisztrált valaki — a Felhasználók és szerepek fülön kezelhető, ahol a fiók törlése ezt a bejegyzést is eltávolítja.",
"deleted": "Whitelista-bejegyzés törölve",
"deleted": "Fehérlista-bejegyzés törölve",
"deleteFailed": "Nem sikerült törölni a bejegyzést",
"emailOff": "Az e-mail-küldés nincs beállítva, így senki nem kap megerősítő linket, és e-mailben egy kérelem sem jut el hozzád. Ezt a listát és az Értesítéseket figyeld helyette, a javítás pedig a Konfiguráció → E-mail / SMTP fülön van.",
"deletedStillAllowed": "A bejegyzés törölve, de ezt a címet a szerver konfigurációja továbbra is engedélyezi, tehát megmarad a hozzáférése. Vedd ki az ALLOWED_EMAILS / ADMIN_EMAILS listából, ha ezen változtatnál.",
+6 -6
View File
@@ -8,7 +8,7 @@
"rangeLabel": "Időtartomány",
"introBefore": "A YouTube Data API-egységek aszerint, hogy ki váltotta ki a felhasználást. A ",
"introSystem": "Rendszer",
"introAfter": " a megosztott háttérmunka (ütemezett letöltés, gazdagítás, újraszinkronizálás), amely nem köthető egy személyhez.",
"introAfter": " a megosztott háttérmunka (ütemezett behúzás, dúsítás, újraszinkronizálás), amely nem köthető egy személyhez.",
"loading": "Betöltés…",
"noData": "Nincs adat.",
"dailyTotal": "Napi összesen ({{d}} · {{units}} egység)",
@@ -22,13 +22,13 @@
"recentSynced": "Friss szinkronizálva",
"recentSyncedHint": "Azok a csatornák, amelyek legutóbbi feltöltései (~az elmúlt év) már a helyi adatbázisban vannak, így megjelennek a Feededben.",
"fullHistory": "Teljes előzmény",
"fullHistoryHint": "Azok a csatornák, amelyek teljes archívuma letöltődött, azokból, amelyekhez teljes előzményt kértél (csatornánként választható a Csatornák oldalon).",
"fullHistoryHint": "Azok a csatornák, amelyek teljes archívuma be van húzva, azokból, amelyekhez teljes előzményt kértél (csatornánként választható a Csatornák oldalon).",
"fullHistoryEta": "Teljes előzmény becsült ideje",
"fullHistoryEtaHint": "Hozzávetőleges becslés {{count}} függőben lévő csatorna teljes előzményének letöltéséhez, a megosztott napi kvóta alapján.",
"fullHistoryEtaHint": "Hozzávetőleges becslés {{count}} függőben lévő csatorna teljes előzményének behúzásához, a megosztott napi kvóta alapján.",
"myVideos": "Saját videók",
"myVideosHint": "A számodra elérhető videók összesen a feliratkozott csatornáidon.",
"quotaLeft": "Ma maradt kvóta",
"quotaLeftHint": "A ma fennmaradó megosztott YouTube API-keret (éjfélkor nullázódik, USA csendes-óceáni idő szerint). A letöltés ennek alárendelődik.",
"quotaLeftHint": "A ma fennmaradó megosztott YouTube API-keret (éjfélkor nullázódik, USA csendes-óceáni idő szerint). A behúzás ennek alárendelődik.",
"loading": "Betöltés…",
"apiUsage": "Saját API-használat",
"today": "Ma",
@@ -41,8 +41,8 @@
"actions": "Műveletek",
"syncSubscriptions": "Feliratkozások szinkronizálása a YouTube-ról",
"syncSubscriptionsHint": "Újraimportálja a YouTube-feliratkozásaidat és behúzza az újonnan követett csatornákat.",
"backfillEverything": "Minden letöltése",
"backfillEverythingHint": "Teljes archívum letöltésének kérése minden csatornához, amelyre fel vagy iratkozva. A régebbi videók és a teljes keresés annyira töltődnek fel, amennyit a megosztott napi kvóta enged.",
"backfillEverything": "Minden videó behúzása",
"backfillEverythingHint": "A teljes archívum behúzásának kérése minden csatornához, amelyre fel vagy iratkozva. A régebbi videók és a teljes keresés annyira töltődnek fel, amennyit a megosztott napi kvóta enged.",
"synced": "{{count}} feliratkozás szinkronizálva",
"syncFailed": "Nem sikerült szinkronizálni a feliratkozásokat",
"fullHistoryRequested": "Teljes előzmény kérve {{count}} csatornához",
+1 -1
View File
@@ -87,7 +87,7 @@
"lastLogin": "Utolsó belépés",
"lastLoginNone": "még nincs rögzítve",
"lastLoginDemo": "a demó fióknál nem rögzítjük",
"inviteMissing": "ez a cím nincs az engedélyezési listán",
"inviteMissing": "ez a cím nincs a fehérlistán",
"linkNote": "24 óráig érvényes, egyszer használható. Aki megnyitja, beállíthat egy jelszót, és ezzel kilép mindenki, aki eddig használta a fiókot. A címet nem erősíti meg.",
"mailOff": "nincs beállítva levelezés",
"open": "Fiókpanel megnyitása",