diff --git a/client/CLAUDE.md b/client/CLAUDE.md index 6e67e1af9..23e0a4313 100644 --- a/client/CLAUDE.md +++ b/client/CLAUDE.md @@ -64,7 +64,7 @@ The offline core is flagship work surrounded by a periphery that ignores it. New ## Big-picture pieces - **Maps** (`src/components/Map/`): two interchangeable renderers — Leaflet and Mapbox/MapLibre GL — chosen at runtime by `MapViewAuto.tsx`. Keep both in sync when changing map features, and keep `mapbox-gl` and `maplibre-gl` in separate chunks (`check:gl-split`). The raster prefetcher fetches tiles `no-cors` so custom tile providers without CORS headers keep working; the vector prefetcher deliberately uses `cors` because it has to read the responses — don't "align" one with the other. -- **i18n** (`src/i18n/TranslationContext.tsx`): `en` is bundled; every other locale is a dynamic `import('@trek/shared/i18n/')` so Vite emits one chunk per locale. Strings live in `shared/`, never here. `t()` returns an unknown key unchanged, so `lint:i18n-keys` (`scripts/i18n-keys.mjs`) resolves every literal key in `t()`, `tHtml()`, `tr()`, ``, `translateApiError` and `*Key` props against `shared/src/i18n/en`; a template key passes when its fixed parts match an en key, or through `DYNAMIC_ALLOWED` with a reason. +- **i18n** (`src/i18n/TranslationContext.tsx`): `en` is bundled; every other locale is a dynamic `import('@trek/shared/i18n/')` so Vite emits one chunk per locale. Strings live in `shared/`, never here. `t()` returns an unknown key unchanged, so `lint:i18n-keys` (`scripts/i18n-keys.mjs`) resolves every literal key in `t()`, `tHtml()`, `tr()`, ``, `translateApiError` and `*Key` props against `shared/src/i18n/en`; a template key passes when its fixed parts match an en key, or through `DYNAMIC_ALLOWED` with a reason. Pass counts as numbers, and let a plural group pick the wording instead of switching keys on the count. - **Mobile shell** (`src/mobile/`): below the phone breakpoint (`useIsPhone`) `App.tsx` wraps routes in `MobileShell` and the `M*` screens under `mobile/screens/` take over. A UI change to a domain with an `M*` twin usually needs both — and the shared-hook rule below. - **Plugins UI** (`src/components/Plugins/`): third-party surfaces render only inside the sandboxed `PluginFrame` iframe (postMessage bridge, live theme-token sync). Host-rendered contribution points (widgets, schedule rows, map layers, planner columns/actions) render server-normalized primitives only — plugin markup never runs inline. Authoring is covered by the `trek-plugin-dev` skill. - **Managed installs** (`src/managed/index.tsx`): the attachment point for screens that only exist on a centrally administered install. Empty here by design — an operator replaces it at build time. Don't put features there. diff --git a/client/src/components/Admin/AdminPluginsPanel.test.tsx b/client/src/components/Admin/AdminPluginsPanel.test.tsx index 7eab30992..3c645ba97 100644 --- a/client/src/components/Admin/AdminPluginsPanel.test.tsx +++ b/client/src/components/Admin/AdminPluginsPanel.test.tsx @@ -924,7 +924,7 @@ describe('AdminPluginsPanel — enabling a plugin', () => { fireEvent.click(rowToggle('Gotify')) expect(await screen.findByText('Plugin activated')).toBeInTheDocument() - expect(await screen.findByText(/enabled required plugin\(s\) first: core/i)).toBeInTheDocument() + expect(await screen.findByText(/enabled the required plugin first: core/i)).toBeInTheDocument() }) it('FE-COMP-PLUGINS-PANEL-023: a disabled required addon is reported as a toast, not a dialog', async () => { @@ -936,7 +936,7 @@ describe('AdminPluginsPanel — enabling a plugin', () => { fireEvent.click(rowToggle('Gotify')) - expect(await screen.findByText(/enable the required addon\(s\) first: journey/i)).toBeInTheDocument() + expect(await screen.findByText(/enable the required addon first: journey/i)).toBeInTheDocument() }) it('FE-COMP-PLUGINS-PANEL-024: any other activation failure surfaces the server message', async () => { @@ -984,7 +984,7 @@ describe('AdminPluginsPanel — enabling a plugin', () => { expect(await screen.findByText('Downloaded trek-core')).toBeInTheDocument() expect(installed).toEqual({ id: 'trek-core', constraint: '^1.0.0', withDependencies: true }) - expect(await screen.findByText(/enable the required addon\(s\) first: journey/i)).toBeInTheDocument() + expect(await screen.findByText(/enable the required addon first: journey/i)).toBeInTheDocument() await waitFor(() => expect(screen.queryByText('Missing dependencies')).not.toBeInTheDocument()) }) diff --git a/client/src/components/Admin/AdminPluginsPanel.tsx b/client/src/components/Admin/AdminPluginsPanel.tsx index b802e7378..24611b0a8 100644 --- a/client/src/components/Admin/AdminPluginsPanel.tsx +++ b/client/src/components/Admin/AdminPluginsPanel.tsx @@ -647,7 +647,7 @@ export default function AdminPluginsPanel() { if (e?.response?.status === 409 && d?.code === 'CONSENT_REQUIRED') { setConsentQueue(qq => [...qq, { plugin: p, version: latest[p.id] ?? p.version ?? '', newPermissions: d.newPermissions ?? [], newEgress: d.newEgress ?? [] }]) } else if (e?.response?.status === 409 && d?.code === 'ADDON_DISABLED') { - toast.error(t('admin.plugins.dep.addonDisabledToast', { addons: (d.addons ?? []).join(', ') })) + toast.error(t('admin.plugins.dep.addonDisabledToast', { count: (d.addons ?? []).length, addons: (d.addons ?? []).join(', ') })) } else if (e?.response?.status === 409 && d?.code === 'DEPENDENCY_MISSING') { setDepResolve({ plugin: p, missing: d.missing ?? [], versionMismatch: d.versionMismatch ?? [] }) } else { @@ -661,7 +661,7 @@ export default function AdminPluginsPanel() { return adminApi.pluginActivate(p.id) .then(() => { toast.success(t('admin.plugins.activated')) - if (cascaded.length) toast.success(t('admin.plugins.dep.autoEnabled', { plugins: cascaded.join(', ') })) + if (cascaded.length) toast.success(t('admin.plugins.dep.autoEnabled', { count: cascaded.length, plugins: cascaded.join(', ') })) setDepResolve(null) }) .catch((e: ActivateErr) => onActivateError(p, e)) @@ -686,7 +686,7 @@ export default function AdminPluginsPanel() { adminApi.pluginInstall(depId, { constraint, withDependencies: true }) .then((r: { installed?: string[]; requiredAddons?: string[]; trekRangeBypassed?: TrekRangeBypass | null }) => { toast.success(t('admin.plugins.dep.downloaded', { id: depId })) - if (r?.requiredAddons?.length) toast.error(t('admin.plugins.dep.addonDisabledToast', { addons: r.requiredAddons.join(', ') })) + if (r?.requiredAddons?.length) toast.error(t('admin.plugins.dep.addonDisabledToast', { count: r.requiredAddons.length, addons: r.requiredAddons.join(', ') })) bypass.notice(depId, r?.trekRangeBypassed) return attemptActivate(parent) }) diff --git a/client/src/components/Collections/CopyToTripModal.tsx b/client/src/components/Collections/CopyToTripModal.tsx index 47eeccaca..b5973748b 100644 --- a/client/src/components/Collections/CopyToTripModal.tsx +++ b/client/src/components/Collections/CopyToTripModal.tsx @@ -104,7 +104,7 @@ export default function CopyToTripModal({ isOpen, onClose, placeIds, onCopy, t } tint={NEUTRAL_TINT} labelId={labelId} onClose={onClose} - title={placeIds.length > 1 ? t('collections.copyN', { count: placeIds.length }) : t('collections.copyToTripTitle')} + title={t('collections.copyN', { count: placeIds.length })} /> )} footer={( diff --git a/client/src/components/Journey/JourneyDetailPageSettingsDialog.tsx b/client/src/components/Journey/JourneyDetailPageSettingsDialog.tsx index 82bfdd783..022372f9d 100644 --- a/client/src/components/Journey/JourneyDetailPageSettingsDialog.tsx +++ b/client/src/components/Journey/JourneyDetailPageSettingsDialog.tsx @@ -366,7 +366,7 @@ export function JourneySettingsDialog({ journey, onClose, onSaved, onOpenInvite, {t('journey.suggestions.restore')} - {t('journey.suggestions.restoreCount', { count: String(journey.dismissed_count) })} + {t('journey.suggestions.restoreCount', { count: journey.dismissed_count ?? 0 })} diff --git a/client/src/components/Vacay/VacayStats.tsx b/client/src/components/Vacay/VacayStats.tsx index 4bf04fccd..7ceb75621 100644 --- a/client/src/components/Vacay/VacayStats.tsx +++ b/client/src/components/Vacay/VacayStats.tsx @@ -203,7 +203,7 @@ function StatCard({ stat: s, isMe, canEdit, selectedYear, isShiftedYear, onSave, {compUsed > 0 && (
- {t('vacay.compUsedCount', { count: fmtDays(compUsed) })} + {t('vacay.compUsedCount', { count: Number(fmtDays(compUsed)) })}
)} diff --git a/client/src/mobile/screens/admin/MAdminPluginsPanel.tsx b/client/src/mobile/screens/admin/MAdminPluginsPanel.tsx index 027918ddb..4a3c3c304 100644 --- a/client/src/mobile/screens/admin/MAdminPluginsPanel.tsx +++ b/client/src/mobile/screens/admin/MAdminPluginsPanel.tsx @@ -628,7 +628,7 @@ export default function MAdminPluginsPanel() { if (e?.response?.status === 409 && d?.code === 'CONSENT_REQUIRED') { setConsentQueue(qq => [...qq, { plugin: p, version: latest[p.id] ?? p.version ?? '', newPermissions: d.newPermissions ?? [], newEgress: d.newEgress ?? [] }]) } else if (e?.response?.status === 409 && d?.code === 'ADDON_DISABLED') { - toast.error(t('admin.plugins.dep.addonDisabledToast', { addons: (d.addons ?? []).join(', ') })) + toast.error(t('admin.plugins.dep.addonDisabledToast', { count: (d.addons ?? []).length, addons: (d.addons ?? []).join(', ') })) } else if (e?.response?.status === 409 && d?.code === 'DEPENDENCY_MISSING') { setDepResolve({ plugin: p, missing: d.missing ?? [], versionMismatch: d.versionMismatch ?? [] }) } else { @@ -642,7 +642,7 @@ export default function MAdminPluginsPanel() { return adminApi.pluginActivate(p.id) .then(() => { toast.success(t('admin.plugins.activated')) - if (cascaded.length) toast.success(t('admin.plugins.dep.autoEnabled', { plugins: cascaded.join(', ') })) + if (cascaded.length) toast.success(t('admin.plugins.dep.autoEnabled', { count: cascaded.length, plugins: cascaded.join(', ') })) setDepResolve(null) }) .catch((e: ActivateErr) => onActivateError(p, e)) @@ -667,7 +667,7 @@ export default function MAdminPluginsPanel() { adminApi.pluginInstall(depId, { constraint, withDependencies: true }) .then((r: { installed?: string[]; requiredAddons?: string[]; trekRangeBypassed?: TrekRangeBypass | null }) => { toast.success(t('admin.plugins.dep.downloaded', { id: depId })) - if (r?.requiredAddons?.length) toast.error(t('admin.plugins.dep.addonDisabledToast', { addons: r.requiredAddons.join(', ') })) + if (r?.requiredAddons?.length) toast.error(t('admin.plugins.dep.addonDisabledToast', { count: r.requiredAddons.length, addons: r.requiredAddons.join(', ') })) bypass.notice(depId, r?.trekRangeBypassed) return attemptActivate(parent) }) diff --git a/client/src/mobile/screens/collections/MCollTripPickerSheet.tsx b/client/src/mobile/screens/collections/MCollTripPickerSheet.tsx index 855378fd1..dddce24d7 100644 --- a/client/src/mobile/screens/collections/MCollTripPickerSheet.tsx +++ b/client/src/mobile/screens/collections/MCollTripPickerSheet.tsx @@ -78,7 +78,7 @@ export default function MCollTripPickerSheet({ open, count, onCopy, onClose, t } } } - const title = count > 1 ? t('collections.copyN', { count }) : t('collections.copyToTripTitle') + const title = t('collections.copyN', { count }) return ( diff --git a/client/src/mobile/screens/journey/MJourneySettingsSheet.tsx b/client/src/mobile/screens/journey/MJourneySettingsSheet.tsx index 89b1b3490..d6d2b4cf5 100644 --- a/client/src/mobile/screens/journey/MJourneySettingsSheet.tsx +++ b/client/src/mobile/screens/journey/MJourneySettingsSheet.tsx @@ -321,7 +321,7 @@ export default function MJourneySettingsSheet({
{t('journey.suggestions.restore')}
- {t('journey.suggestions.restoreCount', { count: String(journey.dismissed_count) })} + {t('journey.suggestions.restoreCount', { count: journey.dismissed_count ?? 0 })}
diff --git a/client/tests/unit/mobile/admin/MAdminPluginsPanel.test.tsx b/client/tests/unit/mobile/admin/MAdminPluginsPanel.test.tsx index 57d006c57..4d2e4b651 100644 --- a/client/tests/unit/mobile/admin/MAdminPluginsPanel.test.tsx +++ b/client/tests/unit/mobile/admin/MAdminPluginsPanel.test.tsx @@ -1170,7 +1170,7 @@ describe('MAdminPluginsPanel — enabling a plugin', () => { await screen.findByText('Gotify'); fireEvent.click(screen.getAllByRole('switch', { name: 'Enable plugin' })[0]); - await waitFor(() => expect(toastMessages()).toContain('Enabled required plugin(s) first: Zzz Base')); + await waitFor(() => expect(toastMessages()).toContain('Enabled the required plugin first: Zzz Base')); expect(toastMessages()).toContain('Plugin activated'); }); @@ -1193,7 +1193,7 @@ describe('MAdminPluginsPanel — enabling a plugin', () => { render(); fireEvent.click(await screen.findByRole('switch', { name: 'Enable plugin' })); - await waitFor(() => expect(toastMessages()).toContain('Enable the required addon(s) first: budget, vacay')); + await waitFor(() => expect(toastMessages()).toContain('Enable the required addons first: budget, vacay')); }); it('FE-MOB-PLUGP-066: any other activation failure surfaces the server message', async () => { @@ -1239,7 +1239,7 @@ describe('MAdminPluginsPanel — enabling a plugin', () => { await waitFor(() => expect(installBody).toEqual({ id: 'trek-base', constraint: '^1.0.0', withDependencies: true })); await waitFor(() => expect(toastMessages()).toContain('Downloaded trek-base')); // The dependency install revealed a disabled addon on top. - expect(toastMessages()).toContain('Enable the required addon(s) first: budget'); + expect(toastMessages()).toContain('Enable the required addon first: budget'); await waitFor(() => expect(activateCalls).toBe(2)); }); diff --git a/shared/CLAUDE.md b/shared/CLAUDE.md index df8ad7dd7..05e60df91 100644 --- a/shared/CLAUDE.md +++ b/shared/CLAUDE.md @@ -48,8 +48,9 @@ The parity rule governs **existing** routes; it is not a license to mint new deb - **`/`** — one folder per language, one file per UI domain plus an `index.ts` barrel; each file exports a flat map of dot-namespaced keys typed as `TranslationStrings`. The runtime `t(key)` only resolves these top-level keys. - **`en/` is canonical.** Every other locale must have the identical file set and top-level keys — `i18n:parity:strict` enforces it in CI. When you add or rename a key, update every locale. - **Every locale gets a real translation — an English placeholder is not acceptable.** Parity only checks that the key exists, so copying the `en` string passes CI while shipping English to those users. Write native phrasing with the locale's own punctuation and the same `{placeholders}` as `en`; if you genuinely cannot translate one, say so instead of filling it with English. -- **Count-bearing strings use plural forms, never `count === 1` in the caller.** The key holds the general form (the CLDR "other" category) and `key.zero|one|two|few|many` hold the forms the language's `Intl.PluralRules` selects for whole numbers (`plural.ts`); `t(key, { count })` (or `{ n }`) picks one. Pass the count as a number. Russian needs `.one`, `.few` and `.many`, Arabic all five, Japanese none. `i18n:parity` checks that every locale has exactly the forms its language reaches with whole numbers and none it never selects. A form may spell the number out (Arabic "ملف واحد") only where its category is that one number; French `one` also covers 0 and Russian `one` covers 21, so they keep `{count}`. -- **Further i18n specs run in `npm test`** and fail changes that parity lets through: placeholder parity (every `{placeholder}` in an `en` string must appear in each translation), no `en` string may call TREK "self-hosted" (the same build runs on managed installs; exemptions live in the spec), and a wording regression test for plugin permission descriptions (currently one string — add a case there when a permission's real behavior changes). None of these are part of `i18n:parity`, which checks key sets and plural forms only. +- **Count-bearing strings use plural forms, never `count === 1` in the caller.** The key holds the general form (the CLDR "other" category) and `key.zero|one|two|few|many` hold the forms the language's `Intl.PluralRules` selects for whole numbers (`plural.ts`); `t(key, { count })` (or `{ n }`) picks one. Pass the count as a number. Russian needs `.one`, `.few` and `.many`, Arabic all five, Japanese none. `i18n:parity` checks that every locale has exactly the forms its language reaches with whole numbers and none it never selects. A form may spell the number out (Arabic "ملف واحد") only where its category is that one number; French `one` also covers 0 and Russian `one` covers 21, so they keep `{count}`. A string whose wording changes with the number (the old "Copy to trip" for one place, "Copy {count} to trip" for more) is a plural group whose `one` drops the number where the language allows it, not two keys switched in the caller. +- **An `en` string carrying `{count}` or `{n}` must be a plural group**, even when the forms read the same (a label such as "Notes: {count}"), so every language can inflect. `i18n:parity` refuses one that is not, unless `NOT_PLURAL` in `scripts/i18n-parity.mjs` lists it with a reason: only for a number that is never a quantity (a day number, a step, a multiplier). An entry that stops matching fails too. +- **Further i18n specs run in `npm test`** and fail changes that parity lets through: placeholder parity (every `{placeholder}` in an `en` string must appear in each translation), no `en` string may call TREK "self-hosted" (the same build runs on managed installs; exemptions live in the spec), and a wording regression test for plugin permission descriptions (currently one string; add a case there when a permission's real behavior changes). None of these are part of `i18n:parity`, which checks key sets, plural forms and count strings. - **en holds every key the client names.** `npm run lint:i18n-keys` in `client/` resolves the keys `src/` passes to `t()` and its helpers against `en/`, read through `scripts/i18n-catalog.mjs`. That reader takes the tables as text: a value must be one string literal on the key's line or the next, and anything else (a concatenation, a template literal) is an error rather than a skipped key. Its spec uses the fixtures in `scripts/fixtures/`. ## Sanitization (`src/sanitize/sanitize.ts`) diff --git a/shared/scripts/i18n-parity.mjs b/shared/scripts/i18n-parity.mjs index 174952da2..5c5d70a08 100644 --- a/shared/scripts/i18n-parity.mjs +++ b/shared/scripts/i18n-parity.mjs @@ -19,20 +19,21 @@ // out each category whole counts reach in its language, and may not // carry one its language never selects. The rules come from // `Intl.PluralRules`, through the same helpers the client resolves with. +// 4. Count strings: an en string carrying {count} or {n} (the two params +// `t()` picks a plural form by) must be a plural group, so every +// language gets the forms it needs. The exceptions are NOT_PLURAL: a +// number that is never a quantity ("Day {n}", a step, a multiplier). // // Limitations: we only parse *top-level* string keys (those declared as the // first column of the file, matching the regex below). Nested objects, function // bodies, and inline comments are ignored. This matches how `t(key)` calls // resolve at runtime in TranslationContext. -import { readdirSync, readFileSync, statSync } from 'node:fs'; -import { dirname, join } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; import { getIntlLanguage } from '../src/i18n/languages.ts'; import { allPluralCategories, integerPluralCategories, pluralFormOf, pluralGroups } from '../src/i18n/plural.ts'; - -const here = dirname(fileURLToPath(import.meta.url)); -const i18nRoot = join(here, '..', 'src', 'i18n'); +import { I18N_ROOT, listDomainFiles, listLocales, readCatalog } from './i18n-catalog.mjs'; // Match a top-level translation key declaration: leading whitespace, then a // quoted key (must start with a lowercase letter), then a colon. This is the @@ -41,21 +42,8 @@ const i18nRoot = join(here, '..', 'src', 'i18n'); // never compared, and two locales lacked dozens of them unnoticed. const TOP_LEVEL_KEY_RE = /^\s*'([a-z][a-zA-Z0-9.\-_:]*)'\s*:/gm; -function listLocales() { - return readdirSync(i18nRoot) - .filter((name) => statSync(join(i18nRoot, name)).isDirectory()) - // externalNotifications is a barrel module, not a locale. - .filter((name) => name !== 'externalNotifications'); -} - -function listDomainFiles(locale) { - return readdirSync(join(i18nRoot, locale)) - .filter((f) => f.endsWith('.ts') && f !== 'index.ts') - .sort(); -} - function extractKeys(locale, file) { - const content = readFileSync(join(i18nRoot, locale, file), 'utf8'); + const content = readFileSync(join(I18N_ROOT, locale, file), 'utf8'); const keys = new Set(); for (const match of content.matchAll(TOP_LEVEL_KEY_RE)) { keys.add(match[1]); @@ -84,6 +72,49 @@ function checkPluralForms(locale, keys, groups) { return { missing, invalid }; } +/** + * en strings that carry {count} or {n} without being a quantity of + * something, so no word in any language agrees with the number. Everything + * else with a count is a plural group. An entry that stops matching an + * ungrouped count string fails the check, so the list cannot go stale. + */ +export const NOT_PLURAL = [ + { key: 'collab.polls.optionPlaceholder', because: 'the position of a poll option ("Option 3")' }, + { key: 'collections.importOnDay', because: 'the number of the day a place is planned on' }, + { key: 'dashboard.atlas.aroundEquator', because: 'a decimal multiplier ("≈ 1.37×"), not a count of things' }, + { key: 'dayplan.dayN', because: 'the number of a day in the trip' }, + { key: 'planner.dayN', because: 'the number of a day in the trip' }, + { key: 'help.center.step', because: 'the position of a step in a guide' }, + { key: 'help.center.stepOf', because: 'the position of a step in a guide' }, + { key: 'help.center.imageAlt', because: 'the position of a step in a guide' }, + { key: 'system_notice.pager.goto', because: 'the position of a notice in the pager' }, + { key: 'tours.addedToDay', because: 'the number of the day a tour was added to' }, + { key: 'tours.planner.waypointLabel', because: 'the position of a waypoint on the tour' }, +]; + +const COUNT_PARAM_RE = /\{(?:count|n)\}/; + +/** + * en strings carrying a count param outside any plural group, and NOT_PLURAL + * entries that no longer name such a string. + */ +function checkCountStrings(enFiles, notPlural = NOT_PLURAL, root = I18N_ROOT) { + const allowed = new Set(notPlural.map((e) => e.key)); + const ungrouped = []; + const seen = new Set(); + for (const file of enFiles) { + const entries = readCatalog('en', file, root); + const groups = pluralGroups(entries.map((e) => e.key)); + for (const { key, value } of entries) { + if (!COUNT_PARAM_RE.test(value) || groups.has(key) || pluralFormOf(key, groups)) continue; + if (key.endsWith('.other') && groups.has(key.slice(0, -'.other'.length))) continue; + if (allowed.has(key)) seen.add(key); + else ungrouped.push({ file, key }); + } + } + return { ungrouped, stale: [...allowed].filter((key) => !seen.has(key)) }; +} + function diffSets(reference, candidate) { const missing = []; const extra = []; @@ -141,6 +172,7 @@ function checkParity() { } } + report.countDrift = checkCountStrings(enFiles); return report; } @@ -181,24 +213,39 @@ function formatReport(report) { } } + if (report.countDrift) { + const { ungrouped, stale } = report.countDrift; + if (ungrouped.length === 0 && stale.length === 0) { + lines.push('Count strings: OK'); + } else { + lines.push('Count strings: en strings with {count} or {n} that are no plural group'); + for (const { file, key } of ungrouped) { + lines.push(` en/${file}: ${key} (add ${key}.one and the other forms, see shared/CLAUDE.md)`); + } + for (const key of stale) lines.push(` NOT_PLURAL lists ${key}, which is no ungrouped count string: remove it`); + } + } + return lines.join('\n'); } // Export a structured API for vitest. The CLI entry point only runs when // executed directly (`node scripts/i18n-parity.mjs`), so importing this file // from a spec does not produce side effects. -export { checkParity, formatReport }; +export { checkCountStrings, checkParity, formatReport }; const isCli = process.argv[1] && process.argv[1].endsWith('i18n-parity.mjs'); if (isCli) { const strict = process.argv.includes('--strict'); const filesOnly = process.argv.includes('--files-only'); const report = checkParity(); - process.stdout.write(formatReport(filesOnly ? { ...report, keyDrift: [], pluralDrift: [] } : report) + '\n'); + const shown = filesOnly ? { ...report, keyDrift: [], pluralDrift: [], countDrift: null } : report; + process.stdout.write(formatReport(shown) + '\n'); if (strict) { const hasFileDrift = report.fileDrift.length > 0; const hasKeyDrift = filesOnly ? false : report.keyDrift.length > 0 || report.pluralDrift.length > 0; - if (hasFileDrift || hasKeyDrift) process.exit(1); + const hasCountDrift = !filesOnly && (report.countDrift.ungrouped.length > 0 || report.countDrift.stale.length > 0); + if (hasFileDrift || hasKeyDrift || hasCountDrift) process.exit(1); } } diff --git a/shared/src/i18n/ar/admin.ts b/shared/src/i18n/ar/admin.ts index 8d5fdfd21..fe1392086 100644 --- a/shared/src/i18n/ar/admin.ts +++ b/shared/src/i18n/ar/admin.ts @@ -615,7 +615,17 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'يتطلب {addon}', 'admin.plugins.cap.dependsOn': 'يحتاج إلى {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'فعّل الإضافات المطلوبة أولاً: {addons}', + 'admin.plugins.dep.addonDisabledToast.zero': 'فعّل الإضافات المطلوبة أولاً: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'فعّل الإضافة المطلوبة أولاً: {addons}', + 'admin.plugins.dep.addonDisabledToast.two': 'فعّل الإضافتين المطلوبتين أولاً: {addons}', + 'admin.plugins.dep.addonDisabledToast.few': 'فعّل الإضافات المطلوبة أولاً: {addons}', + 'admin.plugins.dep.addonDisabledToast.many': 'فعّل الإضافات المطلوبة أولاً: {addons}', 'admin.plugins.dep.autoEnabled': 'تم تفعيل الإضافات المطلوبة أولاً: {plugins}', + 'admin.plugins.dep.autoEnabled.zero': 'تم تفعيل الإضافات المطلوبة أولاً: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'تم تفعيل الإضافة المطلوبة أولاً: {plugins}', + 'admin.plugins.dep.autoEnabled.two': 'تم تفعيل الإضافتين المطلوبتين أولاً: {plugins}', + 'admin.plugins.dep.autoEnabled.few': 'تم تفعيل الإضافات المطلوبة أولاً: {plugins}', + 'admin.plugins.dep.autoEnabled.many': 'تم تفعيل الإضافات المطلوبة أولاً: {plugins}', 'admin.plugins.dep.downloaded': 'تم تنزيل {id}', 'admin.plugins.dep.resolveTitle': 'تبعيات مفقودة', 'admin.plugins.dep.resolveBody': 'يحتاج “{name}” إلى تثبيت هذه الإضافات قبل تفعيله.', @@ -738,7 +748,12 @@ const admin: TranslationStrings = { 'admin.audit.empty': 'لا توجد سجلات تدقيق بعد.', 'admin.audit.refresh': 'تحديث', 'admin.audit.loadMore': 'تحميل المزيد', - 'admin.audit.showing': 'تم تحميل {count} · الإجمالي {total}', + 'admin.audit.showing': 'تم تحميل {count} سجل · الإجمالي {total}', + 'admin.audit.showing.zero': 'لم يُحمَّل أي سجل · الإجمالي {total}', + 'admin.audit.showing.one': 'تم تحميل سجل واحد · الإجمالي {total}', + 'admin.audit.showing.two': 'تم تحميل سجلين · الإجمالي {total}', + 'admin.audit.showing.few': 'تم تحميل {count} سجلات · الإجمالي {total}', + 'admin.audit.showing.many': 'تم تحميل {count} سجلًا · الإجمالي {total}', 'admin.audit.col.time': 'الوقت', 'admin.audit.col.user': 'المستخدم', 'admin.audit.col.action': 'الإجراء', diff --git a/shared/src/i18n/ar/collab.ts b/shared/src/i18n/ar/collab.ts index 5f8048a5b..74958147d 100644 --- a/shared/src/i18n/ar/collab.ts +++ b/shared/src/i18n/ar/collab.ts @@ -44,8 +44,18 @@ const collab: TranslationStrings = { 'collab.chat.reply': 'رد', 'collab.chat.loadMore': 'تحميل الرسائل الأقدم', 'collab.chat.justNow': 'الآن', - 'collab.chat.minutesAgo': 'منذ {n} د', - 'collab.chat.hoursAgo': 'منذ {n} س', + 'collab.chat.minutesAgo': 'منذ {n} دقيقة', + 'collab.chat.minutesAgo.zero': 'منذ {n} دقيقة', + 'collab.chat.minutesAgo.one': 'منذ دقيقة واحدة', + 'collab.chat.minutesAgo.two': 'منذ دقيقتين', + 'collab.chat.minutesAgo.few': 'منذ {n} دقائق', + 'collab.chat.minutesAgo.many': 'منذ {n} دقيقة', + 'collab.chat.hoursAgo': 'منذ {n} ساعة', + 'collab.chat.hoursAgo.zero': 'منذ {n} ساعة', + 'collab.chat.hoursAgo.one': 'منذ ساعة واحدة', + 'collab.chat.hoursAgo.two': 'منذ ساعتين', + 'collab.chat.hoursAgo.few': 'منذ {n} ساعات', + 'collab.chat.hoursAgo.many': 'منذ {n} ساعة', 'collab.notes.title': 'الملاحظات', 'collab.notes.new': 'ملاحظة جديدة', 'collab.notes.empty': 'لا توجد ملاحظات بعد', @@ -69,6 +79,11 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'تثبيت', 'collab.notes.unpin': 'إلغاء التثبيت', 'collab.notes.daysAgo': 'منذ {n} يوم', + 'collab.notes.daysAgo.zero': 'منذ {n} يوم', + 'collab.notes.daysAgo.one': 'منذ يوم واحد', + 'collab.notes.daysAgo.two': 'منذ يومين', + 'collab.notes.daysAgo.few': 'منذ {n} أيام', + 'collab.notes.daysAgo.many': 'منذ {n} يومًا', 'collab.notes.categorySettings': 'إدارة الفئات', 'collab.notes.create': 'إنشاء', 'collab.notes.website': 'الموقع الإلكتروني', diff --git a/shared/src/i18n/ar/collection.ts b/shared/src/i18n/ar/collection.ts index daef18fad..97c882af5 100644 --- a/shared/src/i18n/ar/collection.ts +++ b/shared/src/i18n/ar/collection.ts @@ -1,8 +1,18 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { - 'collections.saveNToList': 'حفظ {count} في قائمة', - 'collections.addedNToList': 'تم حفظ {count} في {name}', + 'collections.saveNToList': 'حفظ {count} مكان في قائمة', + 'collections.saveNToList.zero': 'حفظ {count} مكان في قائمة', + 'collections.saveNToList.one': 'حفظ مكان واحد في قائمة', + 'collections.saveNToList.two': 'حفظ مكانين في قائمة', + 'collections.saveNToList.few': 'حفظ {count} أماكن في قائمة', + 'collections.saveNToList.many': 'حفظ {count} مكانًا في قائمة', + 'collections.addedNToList': 'تم حفظ {count} مكان في {name}', + 'collections.addedNToList.zero': 'لم يُحفظ أي مكان في {name}', + 'collections.addedNToList.one': 'تم حفظ مكان واحد في {name}', + 'collections.addedNToList.two': 'تم حفظ مكانين في {name}', + 'collections.addedNToList.few': 'تم حفظ {count} أماكن في {name}', + 'collections.addedNToList.many': 'تم حفظ {count} مكانًا في {name}', 'collections.noOwnLists': 'ليس لديك قوائم بعد', 'collections.saveToListHint': 'يتم تخطي التكرارات تلقائيًا', 'collections.role.label': 'الدور', @@ -15,8 +25,18 @@ const collection: TranslationStrings = { 'collections.deselectAll': 'إلغاء التحديد', 'collections.moveToList': 'نقل إلى قائمة', 'collections.duplicateToList': 'تكرار إلى قائمة', - 'collections.moveToListTitle': 'نقل {count} إلى قائمة أخرى', - 'collections.duplicateToListTitle': 'تكرار {count} إلى قائمة أخرى', + 'collections.moveToListTitle': 'نقل {count} مكان إلى قائمة أخرى', + 'collections.moveToListTitle.zero': 'نقل {count} مكان إلى قائمة أخرى', + 'collections.moveToListTitle.one': 'نقل مكان واحد إلى قائمة أخرى', + 'collections.moveToListTitle.two': 'نقل مكانين إلى قائمة أخرى', + 'collections.moveToListTitle.few': 'نقل {count} أماكن إلى قائمة أخرى', + 'collections.moveToListTitle.many': 'نقل {count} مكانًا إلى قائمة أخرى', + 'collections.duplicateToListTitle': 'تكرار {count} مكان إلى قائمة أخرى', + 'collections.duplicateToListTitle.zero': 'تكرار {count} مكان إلى قائمة أخرى', + 'collections.duplicateToListTitle.one': 'تكرار مكان واحد إلى قائمة أخرى', + 'collections.duplicateToListTitle.two': 'تكرار مكانين إلى قائمة أخرى', + 'collections.duplicateToListTitle.few': 'تكرار {count} أماكن إلى قائمة أخرى', + 'collections.duplicateToListTitle.many': 'تكرار {count} مكانًا إلى قائمة أخرى', 'collections.noOtherLists': 'لا توجد قوائم أخرى بعد', 'collections.movedCount': 'تم نقل {count} مكان', 'collections.movedCount.zero': 'لم يتم نقل أي مكان', @@ -75,7 +95,12 @@ const collection: TranslationStrings = { 'collections.importSelectedCount.two': 'تم تحديد {count}', 'collections.importSelectedCount.few': 'تم تحديد {count}', 'collections.importSelectedCount.many': 'تم تحديد {count}', - 'collections.importAction': 'استيراد {count}', + 'collections.importAction': 'استيراد {count} مكان', + 'collections.importAction.zero': 'استيراد {count} مكان', + 'collections.importAction.one': 'استيراد مكان واحد', + 'collections.importAction.two': 'استيراد مكانين', + 'collections.importAction.few': 'استيراد {count} أماكن', + 'collections.importAction.many': 'استيراد {count} مكانًا', 'collections.importEmptyTrip': 'لا تحتوي هذه الرحلة على أماكن بعد', 'collections.importNothingNew': 'كل شيء من هذه الرحلة موجود بالفعل في القائمة', 'collections.importDone': 'تمت إضافة {count} مكان', @@ -146,7 +171,12 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'نسخ إلى رحلة', 'collections.copyToTripTitle': 'نسخ إلى رحلة', - 'collections.copyN': 'نسخ {count} إلى رحلة', + 'collections.copyN': 'نسخ {count} مكان إلى رحلة', + 'collections.copyN.zero': 'نسخ {count} مكان إلى رحلة', + 'collections.copyN.one': 'نسخ إلى رحلة', + 'collections.copyN.two': 'نسخ مكانين إلى رحلة', + 'collections.copyN.few': 'نسخ {count} أماكن إلى رحلة', + 'collections.copyN.many': 'نسخ {count} مكانًا إلى رحلة', 'collections.copyToTripSearch': 'البحث عن الرحلات', 'collections.searchLists': 'بحث في القوائم', 'collections.copyToTripConfirm': 'نسخ', @@ -193,7 +223,12 @@ const collection: TranslationStrings = { 'collections.noListsYet': 'أنشئ قائمة أولًا لحفظ الأماكن.', 'collections.removedFromAll': 'تمت الإزالة من المجموعة', 'collections.picker.title': 'الأماكن المحفوظة', - 'collections.picker.showMore': 'عرض {count} إضافية', + 'collections.picker.showMore': 'عرض {count} عنصر آخر', + 'collections.picker.showMore.zero': 'عرض {count} عنصر آخر', + 'collections.picker.showMore.one': 'عرض عنصر واحد آخر', + 'collections.picker.showMore.two': 'عرض عنصرين آخرين', + 'collections.picker.showMore.few': 'عرض {count} عناصر أخرى', + 'collections.picker.showMore.many': 'عرض {count} عنصرًا آخر', 'collections.picker.search': 'ابحث في أماكنك المحفوظة', 'collections.picker.empty': 'لا توجد أماكن محفوظة لإضافتها', 'collections.picker.hint': 'اختر مكانًا من مجموعاتك', @@ -220,6 +255,11 @@ const collection: TranslationStrings = { 'collections.file.doneInto.few': 'تمت إضافة {count} أماكن إلى {name}', 'collections.file.doneInto.many': 'تمت إضافة {count} مكانًا إلى {name}', 'collections.file.doneIntoDuplicates': 'تمت إضافة {count} إلى {name}، و{duplicates} كانت موجودة بالفعل', + 'collections.file.doneIntoDuplicates.zero': 'لم يُضف أي مكان إلى {name}، و{duplicates} كانت موجودة بالفعل', + 'collections.file.doneIntoDuplicates.one': 'تمت إضافة مكان واحد إلى {name}، و{duplicates} كانت موجودة بالفعل', + 'collections.file.doneIntoDuplicates.two': 'تمت إضافة مكانين إلى {name}، و{duplicates} كانت موجودة بالفعل', + 'collections.file.doneIntoDuplicates.few': 'تمت إضافة {count} أماكن إلى {name}، و{duplicates} كانت موجودة بالفعل', + 'collections.file.doneIntoDuplicates.many': 'تمت إضافة {count} مكانًا إلى {name}، و{duplicates} كانت موجودة بالفعل', 'collections.file.doneIntoNothing': 'كل الأماكن في الملف موجودة بالفعل في {name}', 'collections.file.change': 'تغيير', 'collections.file.labelCount': '{count} تسمية', @@ -274,6 +314,16 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'هذا ليس ملف GPX.', 'collections.file.errorTooManyPlaces': 'يحتوي هذا الملف على أكثر من {count} مكان. قسّمه واستورد الأجزاء واحدًا تلو الآخر.', + 'collections.file.errorTooManyPlaces.zero': + 'يحتوي هذا الملف على أكثر من {count} مكان. قسّمه واستورد الأجزاء واحدًا تلو الآخر.', + 'collections.file.errorTooManyPlaces.one': + 'يحتوي هذا الملف على أكثر من مكان واحد. قسّمه واستورد الأجزاء واحدًا تلو الآخر.', + 'collections.file.errorTooManyPlaces.two': + 'يحتوي هذا الملف على أكثر من مكانين. قسّمه واستورد الأجزاء واحدًا تلو الآخر.', + 'collections.file.errorTooManyPlaces.few': + 'يحتوي هذا الملف على أكثر من {count} أماكن. قسّمه واستورد الأجزاء واحدًا تلو الآخر.', + 'collections.file.errorTooManyPlaces.many': + 'يحتوي هذا الملف على أكثر من {count} مكانًا. قسّمه واستورد الأجزاء واحدًا تلو الآخر.', 'collections.share.title': 'مشاركة القائمة', 'collections.share.titleNamed': 'مشاركة «{name}»', diff --git a/shared/src/i18n/ar/common.ts b/shared/src/i18n/ar/common.ts index 0f57ab6d3..c269a0d89 100644 --- a/shared/src/i18n/ar/common.ts +++ b/shared/src/i18n/ar/common.ts @@ -54,8 +54,18 @@ const common: TranslationStrings = { 'common.copy': 'نسخ', 'common.copied': 'تم النسخ', 'common.justNow': 'just now', // en-fallback - 'common.hoursAgo': '{count}h ago', // en-fallback - 'common.daysAgo': '{count}d ago', // en-fallback + 'common.hoursAgo': 'منذ {count} ساعة', + 'common.hoursAgo.zero': 'منذ {count} ساعة', + 'common.hoursAgo.one': 'منذ ساعة واحدة', + 'common.hoursAgo.two': 'منذ ساعتين', + 'common.hoursAgo.few': 'منذ {count} ساعات', + 'common.hoursAgo.many': 'منذ {count} ساعة', + 'common.daysAgo': 'منذ {count} يوم', + 'common.daysAgo.zero': 'منذ {count} يوم', + 'common.daysAgo.one': 'منذ يوم واحد', + 'common.daysAgo.two': 'منذ يومين', + 'common.daysAgo.few': 'منذ {count} أيام', + 'common.daysAgo.many': 'منذ {count} يومًا', 'common.datepicker.prevMonth': 'Previous month', // en-fallback 'common.datepicker.nextMonth': 'Next month', // en-fallback 'common.datepicker.prevYear': 'Previous year', // en-fallback diff --git a/shared/src/i18n/ar/dashboard.ts b/shared/src/i18n/ar/dashboard.ts index 9f62c8b04..d7eedef6f 100644 --- a/shared/src/i18n/ar/dashboard.ts +++ b/shared/src/i18n/ar/dashboard.ts @@ -10,8 +10,12 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips.few': '{count} رحلات ({archived} مؤرشفة)', 'dashboard.subtitle.trips.many': '{count} رحلة ({archived} مؤرشفة)', 'dashboard.subtitle.empty': 'ابدأ رحلتك الأولى', - 'dashboard.subtitle.activeOne': '{count} رحلة نشطة', - 'dashboard.subtitle.activeMany': '{count} رحلات نشطة', + 'dashboard.subtitle.active': '{count} رحلة نشطة', + 'dashboard.subtitle.active.zero': 'لا توجد رحلات نشطة', + 'dashboard.subtitle.active.one': 'رحلة نشطة واحدة', + 'dashboard.subtitle.active.two': 'رحلتان نشطتان', + 'dashboard.subtitle.active.few': '{count} رحلات نشطة', + 'dashboard.subtitle.active.many': '{count} رحلة نشطة', 'dashboard.subtitle.archivedSuffix': ' · {count} رحلة مؤرشفة', 'dashboard.subtitle.archivedSuffix.zero': ' · لا توجد رحلات مؤرشفة', 'dashboard.subtitle.archivedSuffix.one': ' · رحلة مؤرشفة واحدة', @@ -136,6 +140,11 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'إزالة أيام؟', 'dashboard.shrinkIntro': 'عند حفظ التواريخ الجديدة تُزال هذه الأيام:', 'dashboard.shrinkMoreDays': '+{count} أخرى', + 'dashboard.shrinkMoreDays.zero': '+{count} أخرى', + 'dashboard.shrinkMoreDays.one': '+{count} أخرى', + 'dashboard.shrinkMoreDays.two': '+{count} أخرى', + 'dashboard.shrinkMoreDays.few': '+{count} أخرى', + 'dashboard.shrinkMoreDays.many': '+{count} أخرى', 'dashboard.shrinkLastDays': 'تُزال الأيام الأخيرة، لا الأولى', 'dashboard.shrinkLastDaysHint': 'تنتقل خطط الأيام مع التواريخ الجديدة، لذا تُزال دائمًا الأيام الأخيرة من خطتك، حتى عندما تغيّر تاريخ البداية.', diff --git a/shared/src/i18n/ar/dawarich.ts b/shared/src/i18n/ar/dawarich.ts index dcfb81f29..7324b8c50 100644 --- a/shared/src/i18n/ar/dawarich.ts +++ b/shared/src/i18n/ar/dawarich.ts @@ -105,6 +105,11 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'تم التجاهل', 'dawarich.suggestions.restore': 'إعادته', 'dawarich.suggestions.showHandled': 'إظهار {count} تمت معالجتها', + 'dawarich.suggestions.showHandled.zero': 'إظهار {count} اقتراح تمت معالجته', + 'dawarich.suggestions.showHandled.one': 'إظهار اقتراح واحد تمت معالجته', + 'dawarich.suggestions.showHandled.two': 'إظهار اقتراحين تمت معالجتهما', + 'dawarich.suggestions.showHandled.few': 'إظهار {count} اقتراحات تمت معالجتها', + 'dawarich.suggestions.showHandled.many': 'إظهار {count} اقتراحًا تمت معالجته', 'dawarich.suggestions.hideHandled': 'إخفاء ما تمت معالجته', 'dawarich.suggestions.matchesWish': 'في قائمة أمنياتك: {name}', 'dawarich.suggestions.acceptedAs.place': 'تمت الإضافة كمكان', @@ -155,7 +160,12 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.scanning': 'جارٍ الفحص…', 'dawarich.bucket.noMatches': 'لم يظهر أي شيء من قائمة أمنياتك في تسجيلاتك.', 'dawarich.bucket.alreadyVisited': 'مشطوبة مسبقاً', - 'dawarich.bucket.confirm': 'اشطب {count}', + 'dawarich.bucket.confirm': 'اشطب {count} أمنية', + 'dawarich.bucket.confirm.zero': 'اشطب {count} أمنية', + 'dawarich.bucket.confirm.one': 'اشطب أمنية واحدة', + 'dawarich.bucket.confirm.two': 'اشطب أمنيتين', + 'dawarich.bucket.confirm.few': 'اشطب {count} أمنيات', + 'dawarich.bucket.confirm.many': 'اشطب {count} أمنية', 'dawarich.bucket.confirmed': 'تم شطب {count} أمنية', 'dawarich.bucket.confirmed.zero': 'لم يتم شطب أي أمنية', 'dawarich.bucket.confirmed.one': 'تم شطب أمنية واحدة', diff --git a/shared/src/i18n/ar/dayplan.ts b/shared/src/i18n/ar/dayplan.ts index e95a8203d..32618cdc7 100644 --- a/shared/src/i18n/ar/dayplan.ts +++ b/shared/src/i18n/ar/dayplan.ts @@ -102,11 +102,31 @@ const dayplan: TranslationStrings = { 'dayplan.clearDayBody': 'ستُزال كل الأماكن من هذا اليوم. تبقى الأماكن في الرحلة، ويحتفظ اليوم بملاحظاته وحجوزاته.', 'dayplan.deleteDayEmpty': 'لا يوجد شيء مخطط لهذا اليوم.', 'dayplan.impactPlaces': 'الأماكن المخططة: {count}', + 'dayplan.impactPlaces.zero': 'الأماكن المخططة: {count}', + 'dayplan.impactPlaces.one': 'الأماكن المخططة: {count}', + 'dayplan.impactPlaces.two': 'الأماكن المخططة: {count}', + 'dayplan.impactPlaces.few': 'الأماكن المخططة: {count}', + 'dayplan.impactPlaces.many': 'الأماكن المخططة: {count}', 'dayplan.impactPlacesHint': 'تبقى في قائمة الأماكن.', 'dayplan.impactNotes': 'الملاحظات: {count}', + 'dayplan.impactNotes.zero': 'الملاحظات: {count}', + 'dayplan.impactNotes.one': 'الملاحظات: {count}', + 'dayplan.impactNotes.two': 'الملاحظات: {count}', + 'dayplan.impactNotes.few': 'الملاحظات: {count}', + 'dayplan.impactNotes.many': 'الملاحظات: {count}', 'dayplan.impactTexts': 'عناوين الأيام وأوصافها: {count}', + 'dayplan.impactTexts.zero': 'عناوين الأيام وأوصافها: {count}', + 'dayplan.impactTexts.one': 'عناوين الأيام وأوصافها: {count}', + 'dayplan.impactTexts.two': 'عناوين الأيام وأوصافها: {count}', + 'dayplan.impactTexts.few': 'عناوين الأيام وأوصافها: {count}', + 'dayplan.impactTexts.many': 'عناوين الأيام وأوصافها: {count}', 'dayplan.impactDeletedHint': 'تُحذف أيضًا.', 'dayplan.impactBookings': 'الحجوزات: {count}', + 'dayplan.impactBookings.zero': 'الحجوزات: {count}', + 'dayplan.impactBookings.one': 'الحجوزات: {count}', + 'dayplan.impactBookings.two': 'الحجوزات: {count}', + 'dayplan.impactBookings.few': 'الحجوزات: {count}', + 'dayplan.impactBookings.many': 'الحجوزات: {count}', 'dayplan.impactStay': 'الإقامة في {name}', 'dayplan.deleteDayBookingsHint': 'تبقى ضمن الحجوزات، دون يوم.', 'dayplan.deleteDayStayHint': 'يقع تسجيل الوصول أو المغادرة في هذا اليوم، لذا تُلغى الإقامة.', @@ -117,8 +137,18 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'يقع تسجيل الوصول أو المغادرة في هذا اليوم، لذا تُلغى الإقامة مع الحجز "{booking}" ومصروفه البالغ {amount}.', 'dayplan.deleteDayShift': 'الأيام اللاحقة: {count}', + 'dayplan.deleteDayShift.zero': 'الأيام اللاحقة: {count}', + 'dayplan.deleteDayShift.one': 'الأيام اللاحقة: {count}', + 'dayplan.deleteDayShift.two': 'الأيام اللاحقة: {count}', + 'dayplan.deleteDayShift.few': 'الأيام اللاحقة: {count}', + 'dayplan.deleteDayShift.many': 'الأيام اللاحقة: {count}', 'dayplan.deleteDayShiftHint': 'ينتقل كل منها إلى التاريخ السابق.', 'dayplan.deleteDayShiftBookingsHint': 'ينتقل كل منها إلى التاريخ السابق. الحجوزات التي تنتقل معها: {count}', + 'dayplan.deleteDayShiftBookingsHint.zero': 'ينتقل كل منها إلى التاريخ السابق. الحجوزات التي تنتقل معها: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': 'ينتقل كل منها إلى التاريخ السابق. الحجوزات التي تنتقل معها: {count}', + 'dayplan.deleteDayShiftBookingsHint.two': 'ينتقل كل منها إلى التاريخ السابق. الحجوزات التي تنتقل معها: {count}', + 'dayplan.deleteDayShiftBookingsHint.few': 'ينتقل كل منها إلى التاريخ السابق. الحجوزات التي تنتقل معها: {count}', + 'dayplan.deleteDayShiftBookingsHint.many': 'ينتقل كل منها إلى التاريخ السابق. الحجوزات التي تنتقل معها: {count}', 'dayplan.deleteDayShrink': 'تنتهي الرحلة الآن في {date}', 'dayplan.deleteDayShrinkHint': 'لا يوجد يوم بلا تاريخ ليأخذ التاريخ الأخير.', 'dayplan.impactStayShorter': 'الإقامة في {name}: ليلة أقل', diff --git a/shared/src/i18n/ar/docsync.ts b/shared/src/i18n/ar/docsync.ts index f42b6b436..1da305c0c 100644 --- a/shared/src/i18n/ar/docsync.ts +++ b/shared/src/i18n/ar/docsync.ts @@ -68,7 +68,12 @@ const docsync: TranslationStrings = { 'docsync.state.local_deleted': 'محذوف في TREK', 'docsync.state.scope_drift': 'نُقل خارج المجلد', - 'docsync.conflict.resolve': 'حلّ {count}', + 'docsync.conflict.resolve': 'حلّ {count} تعارض', + 'docsync.conflict.resolve.zero': 'حلّ {count} تعارض', + 'docsync.conflict.resolve.one': 'حلّ تعارض واحد', + 'docsync.conflict.resolve.two': 'حلّ تعارضين', + 'docsync.conflict.resolve.few': 'حلّ {count} تعارضات', + 'docsync.conflict.resolve.many': 'حلّ {count} تعارضًا', 'docsync.conflict.title': 'تغيّرت النسختان', 'docsync.conflict.keepTrek': 'الإبقاء على نسخة TREK', diff --git a/shared/src/i18n/ar/journey.ts b/shared/src/i18n/ar/journey.ts index b49f0428a..104bbdfbb 100644 --- a/shared/src/i18n/ar/journey.ts +++ b/shared/src/i18n/ar/journey.ts @@ -707,6 +707,11 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'تم تجاهل الاقتراح', 'journey.suggestions.restore': 'استعادة الاقتراحات المتجاهَلة', 'journey.suggestions.restoreCount': 'الاقتراحات المتجاهَلة ({count})', + 'journey.suggestions.restoreCount.zero': 'الاقتراحات المتجاهَلة ({count})', + 'journey.suggestions.restoreCount.one': 'الاقتراحات المتجاهَلة ({count})', + 'journey.suggestions.restoreCount.two': 'الاقتراحات المتجاهَلة ({count})', + 'journey.suggestions.restoreCount.few': 'الاقتراحات المتجاهَلة ({count})', + 'journey.suggestions.restoreCount.many': 'الاقتراحات المتجاهَلة ({count})', 'journey.suggestions.restored': 'تمت استعادة {count} اقتراح', 'journey.suggestions.restored.zero': 'لم تتم استعادة أي اقتراح', 'journey.suggestions.restored.one': 'تمت استعادة اقتراح واحد', diff --git a/shared/src/i18n/ar/memories.ts b/shared/src/i18n/ar/memories.ts index 2bd766dfb..13eeddcd1 100644 --- a/shared/src/i18n/ar/memories.ts +++ b/shared/src/i18n/ar/memories.ts @@ -66,7 +66,14 @@ const memories: TranslationStrings = { 'memories.tripDates': 'تواريخ الرحلة', 'memories.allPhotos': 'جميع الصور', 'memories.confirmShareTitle': 'مشاركة مع أعضاء الرحلة؟', - 'memories.confirmShareHint': '{count} صور ستكون مرئية لجميع أعضاء هذه الرحلة. يمكنك جعل الصور الفردية خاصة لاحقًا.', + 'memories.confirmShareHint': 'ستكون {count} صورة مرئية لجميع أعضاء هذه الرحلة. يمكنك جعل الصور الفردية خاصة لاحقًا.', + 'memories.confirmShareHint.zero': 'لن تكون أي صورة مرئية لأعضاء هذه الرحلة.', + 'memories.confirmShareHint.one': 'ستكون صورة واحدة مرئية لجميع أعضاء هذه الرحلة. يمكنك جعلها خاصة لاحقًا.', + 'memories.confirmShareHint.two': 'ستكون صورتان مرئيتين لجميع أعضاء هذه الرحلة. يمكنك جعل الصور الفردية خاصة لاحقًا.', + 'memories.confirmShareHint.few': + 'ستكون {count} صور مرئية لجميع أعضاء هذه الرحلة. يمكنك جعل الصور الفردية خاصة لاحقًا.', + 'memories.confirmShareHint.many': + 'ستكون {count} صورة مرئية لجميع أعضاء هذه الرحلة. يمكنك جعل الصور الفردية خاصة لاحقًا.', 'memories.confirmShareButton': 'مشاركة الصور', 'memories.error.loadAlbums': 'فشل تحميل الألبومات', 'memories.error.linkAlbum': 'فشل ربط الألبوم', diff --git a/shared/src/i18n/ar/packing.ts b/shared/src/i18n/ar/packing.ts index 5f53488c5..42c04009f 100644 --- a/shared/src/i18n/ar/packing.ts +++ b/shared/src/i18n/ar/packing.ts @@ -30,7 +30,12 @@ const packing: TranslationStrings = { 'packing.printPacked': 'جُهّز', 'packing.importHintMarkdown': 'يمكن أيضًا استخدام قائمة Markdown: العنوان يحدد الفئة، و"- [ ]" و"- [x]" تصبح عناصر، و"3x" قبل الاسم تحدد الكمية.', - 'packing.importAction': 'استيراد {count}', + 'packing.importAction': 'استيراد {count} عنصر', + 'packing.importAction.zero': 'استيراد {count} عنصر', + 'packing.importAction.one': 'استيراد عنصر واحد', + 'packing.importAction.two': 'استيراد عنصرين', + 'packing.importAction.few': 'استيراد {count} عناصر', + 'packing.importAction.many': 'استيراد {count} عنصرًا', 'packing.importSuccess': 'تم استيراد {count} عنصر', 'packing.importSuccess.zero': 'لم يتم استيراد أي عنصر', 'packing.importSuccess.one': 'تم استيراد عنصر واحد', @@ -40,8 +45,18 @@ const packing: TranslationStrings = { 'packing.importError': 'فشل الاستيراد', 'packing.importEmpty': 'لا توجد عناصر للاستيراد', 'packing.progress': '{packed} من {total} جُهّز ({percent}%)', - 'packing.clearChecked': 'إزالة {count} محدد', - 'packing.clearCheckedShort': 'إزالة {count}', + 'packing.clearChecked': 'إزالة {count} عنصر محدد', + 'packing.clearChecked.zero': 'إزالة {count} عنصر محدد', + 'packing.clearChecked.one': 'إزالة عنصر محدد واحد', + 'packing.clearChecked.two': 'إزالة عنصرين محددين', + 'packing.clearChecked.few': 'إزالة {count} عناصر محددة', + 'packing.clearChecked.many': 'إزالة {count} عنصرًا محددًا', + 'packing.clearCheckedShort': 'إزالة {count} عنصر', + 'packing.clearCheckedShort.zero': 'إزالة {count} عنصر', + 'packing.clearCheckedShort.one': 'إزالة عنصر واحد', + 'packing.clearCheckedShort.two': 'إزالة عنصرين', + 'packing.clearCheckedShort.few': 'إزالة {count} عناصر', + 'packing.clearCheckedShort.many': 'إزالة {count} عنصرًا', 'packing.allPacked': 'تم تجهيز الكل!', 'packing.addPlaceholder': 'إضافة عنصر جديد...', 'packing.categoryPlaceholder': 'قائمة...', @@ -112,7 +127,12 @@ const packing: TranslationStrings = { 'packing.tierShared': 'مشاركة مع…', 'packing.noOneToShare': 'لا أحد آخر في هذه الرحلة بعد', 'packing.takenCareOf': 'بواسطة {name}', - 'packing.sharedWithCount': 'مشترك مع {count}', + 'packing.sharedWithCount': 'مشترك مع {count} شخص', + 'packing.sharedWithCount.zero': 'غير مشترك مع أحد', + 'packing.sharedWithCount.one': 'مشترك مع شخص واحد', + 'packing.sharedWithCount.two': 'مشترك مع شخصين', + 'packing.sharedWithCount.few': 'مشترك مع {count} أشخاص', + 'packing.sharedWithCount.many': 'مشترك مع {count} شخصًا', 'packing.broughtBy': 'يحضره {name}', 'packing.alsoBring': 'يمكنني إحضاره أيضًا', 'packing.alsoBringingStop': 'لن أحضره', diff --git a/shared/src/i18n/ar/photos.ts b/shared/src/i18n/ar/photos.ts index 3e1aa8c0d..1f614de4d 100644 --- a/shared/src/i18n/ar/photos.ts +++ b/shared/src/i18n/ar/photos.ts @@ -20,6 +20,11 @@ const photos: TranslationStrings = { 'photos.linkPlace': 'ربط بمكان', 'photos.noPlace': 'بلا مكان', 'photos.uploadN': 'رفع {n} صورة', + 'photos.uploadN.zero': 'رفع {n} صورة', + 'photos.uploadN.one': 'رفع صورة واحدة', + 'photos.uploadN.two': 'رفع صورتين', + 'photos.uploadN.few': 'رفع {n} صور', + 'photos.uploadN.many': 'رفع {n} صورة', 'photos.linkDay': 'ربط اليوم', 'photos.noDay': 'لا يوم', 'photos.dayLabel': 'اليوم {number}', diff --git a/shared/src/i18n/ar/reservations.ts b/shared/src/i18n/ar/reservations.ts index 710d93dd4..5df51f0ba 100644 --- a/shared/src/i18n/ar/reservations.ts +++ b/shared/src/i18n/ar/reservations.ts @@ -197,7 +197,12 @@ const reservations: TranslationStrings = { 'reservations.airtrail.duringTrip': 'خلال هذه الرحلة', 'reservations.airtrail.otherFlights': 'رحلات أخرى', 'reservations.airtrail.empty': 'لم يتم العثور على أي رحلات في حساب AirTrail الخاص بك.', - 'reservations.airtrail.importCta': 'استيراد {count}', + 'reservations.airtrail.importCta': 'استيراد {count} رحلة جوية', + 'reservations.airtrail.importCta.zero': 'استيراد {count} رحلة جوية', + 'reservations.airtrail.importCta.one': 'استيراد رحلة جوية واحدة', + 'reservations.airtrail.importCta.two': 'استيراد رحلتين جويتين', + 'reservations.airtrail.importCta.few': 'استيراد {count} رحلات جوية', + 'reservations.airtrail.importCta.many': 'استيراد {count} رحلة جوية', 'reservations.airtrail.joinConnection': 'الاستيراد كرحلة واحدة مع توقف في {stops}', 'reservations.costsLabel': 'التكاليف', 'reservations.createExpense': 'إنشاء مصروف', diff --git a/shared/src/i18n/ar/roadtrip.ts b/shared/src/i18n/ar/roadtrip.ts index fce670ecf..01da48bd8 100644 --- a/shared/src/i18n/ar/roadtrip.ts +++ b/shared/src/i18n/ar/roadtrip.ts @@ -216,6 +216,11 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'لا يوجد على الطريق ما يطابق «{name}».', 'roadtrip.poi.noneMatchFilters': 'لا يوجد شيء على الطريق يطابق عوامل التصفية هذه.', 'roadtrip.poi.foundFiltered': '{count} من {total} على الطريق', + 'roadtrip.poi.foundFiltered.zero': '{count} من {total} على الطريق', + 'roadtrip.poi.foundFiltered.one': '{count} من {total} على الطريق', + 'roadtrip.poi.foundFiltered.two': '{count} من {total} على الطريق', + 'roadtrip.poi.foundFiltered.few': '{count} من {total} على الطريق', + 'roadtrip.poi.foundFiltered.many': '{count} من {total} على الطريق', 'roadtrip.poi.truncated': 'في {count} مقطع كانت النتائج أكثر مما تتسع له استجابة واحدة. قلّص الممر لرؤية البقية.', 'roadtrip.poi.truncated.zero': 'لم تتجاوز النتائج في أي مقطع ما تتسع له استجابة واحدة.', 'roadtrip.poi.truncated.one': 'في مقطع واحد كانت النتائج أكثر مما تتسع له استجابة واحدة. قلّص الممر لرؤية البقية.', diff --git a/shared/src/i18n/ar/settings.ts b/shared/src/i18n/ar/settings.ts index 66fc01dc7..614d19387 100644 --- a/shared/src/i18n/ar/settings.ts +++ b/shared/src/i18n/ar/settings.ts @@ -566,9 +566,29 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'دون اتصال', 'settings.offline.banner.forced': 'وضع عدم الاتصال', 'settings.offline.banner.queued': 'دون اتصال · {count} في قائمة الانتظار', + 'settings.offline.banner.queued.zero': 'دون اتصال · {count} في قائمة الانتظار', + 'settings.offline.banner.queued.one': 'دون اتصال · {count} في قائمة الانتظار', + 'settings.offline.banner.queued.two': 'دون اتصال · {count} في قائمة الانتظار', + 'settings.offline.banner.queued.few': 'دون اتصال · {count} في قائمة الانتظار', + 'settings.offline.banner.queued.many': 'دون اتصال · {count} في قائمة الانتظار', 'settings.offline.banner.syncing': 'جارٍ مزامنة {count}…', + 'settings.offline.banner.syncing.zero': 'جارٍ مزامنة {count}…', + 'settings.offline.banner.syncing.one': 'جارٍ مزامنة {count}…', + 'settings.offline.banner.syncing.two': 'جارٍ مزامنة {count}…', + 'settings.offline.banner.syncing.few': 'جارٍ مزامنة {count}…', + 'settings.offline.banner.syncing.many': 'جارٍ مزامنة {count}…', 'settings.offline.banner.failed': 'فشلت المزامنة: {count}', + 'settings.offline.banner.failed.zero': 'فشلت المزامنة: {count}', + 'settings.offline.banner.failed.one': 'فشلت المزامنة: {count}', + 'settings.offline.banner.failed.two': 'فشلت المزامنة: {count}', + 'settings.offline.banner.failed.few': 'فشلت المزامنة: {count}', + 'settings.offline.banner.failed.many': 'فشلت المزامنة: {count}', 'settings.offline.banner.conflicts': 'تعارضات: {count}', + 'settings.offline.banner.conflicts.zero': 'تعارضات: {count}', + 'settings.offline.banner.conflicts.one': 'تعارضات: {count}', + 'settings.offline.banner.conflicts.two': 'تعارضات: {count}', + 'settings.offline.banner.conflicts.few': 'تعارضات: {count}', + 'settings.offline.banner.conflicts.many': 'تعارضات: {count}', 'settings.pluginActivity.title': 'نشاط الإضافات', 'settings.pluginActivity.description': 'كل إجراء نفّذته إضافة نيابةً عنك، الأحدث أولاً.', 'settings.pluginActivity.empty': 'لا يوجد نشاط للإضافات بعد.', @@ -590,6 +610,11 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'كل شيء', 'settings.apiScopes.noneSelected': 'اختر مجالًا واحدًا على الأقل، وإلا فلن يستطيع المفتاح قراءة أي شيء.', 'settings.apiScopes.limited': '{count} من {total}', + 'settings.apiScopes.limited.zero': '{count} من {total}', + 'settings.apiScopes.limited.one': '{count} من {total}', + 'settings.apiScopes.limited.two': '{count} من {total}', + 'settings.apiScopes.limited.few': '{count} من {total}', + 'settings.apiScopes.limited.many': '{count} من {total}', 'settings.apiScopes.trips': 'الرحلات', 'settings.apiScopes.days': 'الأيام', 'settings.apiScopes.places': 'الأماكن', diff --git a/shared/src/i18n/ar/tours.ts b/shared/src/i18n/ar/tours.ts index a05635b5e..f923c5d19 100644 --- a/shared/src/i18n/ar/tours.ts +++ b/shared/src/i18n/ar/tours.ts @@ -70,6 +70,11 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'نقاط المرور', 'tours.planner.waypointLabel': 'نقطة المرور {n}', 'tours.durationMinutes': '{count} د', + 'tours.durationMinutes.zero': '{count} د', + 'tours.durationMinutes.one': '{count} د', + 'tours.durationMinutes.two': '{count} د', + 'tours.durationMinutes.few': '{count} د', + 'tours.durationMinutes.many': '{count} د', 'tours.planner.empty': 'أضف نقطتين على الأقل لحساب مسار للمشي.', 'tours.planner.start': 'البداية', 'tours.planner.via': 'المرور عبر', diff --git a/shared/src/i18n/ar/trip.ts b/shared/src/i18n/ar/trip.ts index f57b0413b..d282ff38a 100644 --- a/shared/src/i18n/ar/trip.ts +++ b/shared/src/i18n/ar/trip.ts @@ -85,6 +85,11 @@ const trip: TranslationStrings = { 'transit.transfers.few': '{count} تحويلات', 'transit.transfers.many': '{count} تحويلة', 'transit.min': '{count} دقيقة', + 'transit.min.zero': '{count} دقيقة', + 'transit.min.one': 'دقيقة واحدة', + 'transit.min.two': 'دقيقتان', + 'transit.min.few': '{count} دقائق', + 'transit.min.many': '{count} دقيقة', 'transit.stops': '{count} محطة', 'transit.stops.zero': 'دون توقف', 'transit.stops.one': 'محطة واحدة', diff --git a/shared/src/i18n/ar/vacay.ts b/shared/src/i18n/ar/vacay.ts index 45e02fc3a..06899e68d 100644 --- a/shared/src/i18n/ar/vacay.ts +++ b/shared/src/i18n/ar/vacay.ts @@ -86,7 +86,12 @@ const vacay: TranslationStrings = { 'vacay.carryOver': 'الترحيل', 'vacay.carryOverHint': 'ترحيل أيام الإجازة المتبقية تلقائيًا إلى السنة التالية', 'vacay.carriedOverPrevPeriod': 'من الفترة السابقة', - 'vacay.compUsedCount': '{count} تعويض', + 'vacay.compUsedCount': 'أيام التعويض: {count}', + 'vacay.compUsedCount.zero': 'أيام التعويض: {count}', + 'vacay.compUsedCount.one': 'أيام التعويض: {count}', + 'vacay.compUsedCount.two': 'أيام التعويض: {count}', + 'vacay.compUsedCount.few': 'أيام التعويض: {count}', + 'vacay.compUsedCount.many': 'أيام التعويض: {count}', 'vacay.yearType': 'سنة الإجازة', 'vacay.yearTypeHint': 'متى تبدأ سنة إجازتك — يتبعها الاستحقاق والاستخدام والترحيل', 'vacay.yearTypeCalendar': 'تقويمية', diff --git a/shared/src/i18n/az/admin.ts b/shared/src/i18n/az/admin.ts index 451bcd69d..abd699d76 100644 --- a/shared/src/i18n/az/admin.ts +++ b/shared/src/i18n/az/admin.ts @@ -672,7 +672,9 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': '{addon} əlavəsini tələb edir', 'admin.plugins.cap.dependsOn': '{id} {version} tələb edir', 'admin.plugins.dep.addonDisabledToast': 'Əvvəlcə tələb olunan əlavələri aktivləşdirin: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Əvvəlcə tələb olunan əlavəni aktivləşdirin: {addons}', 'admin.plugins.dep.autoEnabled': 'Əvvəlcə tələb olunan plaginlər aktivləşdirildi: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Əvvəlcə tələb olunan plagin aktivləşdirildi: {plugins}', 'admin.plugins.dep.downloaded': '{id} endirildi', 'admin.plugins.dep.resolveTitle': 'Çatışmayan asılılıqlar', 'admin.plugins.dep.resolveBody': @@ -821,6 +823,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Yenilə', 'admin.audit.loadMore': 'Daha çox yüklə', 'admin.audit.showing': '{count} yüklənib · cəmi {total}', + 'admin.audit.showing.one': '{count} yüklənib · cəmi {total}', 'admin.audit.col.time': 'Vaxt', 'admin.audit.col.user': 'İstifadəçi', 'admin.audit.col.action': 'Əməliyyat', diff --git a/shared/src/i18n/az/collab.ts b/shared/src/i18n/az/collab.ts index 99b7c3262..37c55147c 100644 --- a/shared/src/i18n/az/collab.ts +++ b/shared/src/i18n/az/collab.ts @@ -54,7 +54,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Əvvəlki mesajları yüklə', 'collab.chat.justNow': 'indicə', 'collab.chat.minutesAgo': '{n} dəq. əvvəl', + 'collab.chat.minutesAgo.one': '{n} dəq. əvvəl', 'collab.chat.hoursAgo': '{n} saat əvvəl', + 'collab.chat.hoursAgo.one': '{n} saat əvvəl', 'collab.notes.title': 'Qeydlər', 'collab.notes.new': 'Yeni qeyd', @@ -79,6 +81,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Bərkit', 'collab.notes.unpin': 'Bərkidilməni ləğv et', 'collab.notes.daysAgo': '{n} gün əvvəl', + 'collab.notes.daysAgo.one': '{n} gün əvvəl', 'collab.notes.categorySettings': 'Kateqoriyaları idarə et', 'collab.notes.create': 'Yarat', 'collab.notes.website': 'Veb-sayt', diff --git a/shared/src/i18n/az/collection.ts b/shared/src/i18n/az/collection.ts index b978b6253..feef022ba 100644 --- a/shared/src/i18n/az/collection.ts +++ b/shared/src/i18n/az/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': '{count} məkanı siyahıya əlavə et', + 'collections.saveNToList.one': '{count} məkanı siyahıya əlavə et', 'collections.addedNToList': '{count} məkan {name} siyahısında saxlanıldı', + 'collections.addedNToList.one': '{count} məkan {name} siyahısında saxlanıldı', 'collections.noOwnLists': 'Hələ siyahınız yoxdur', 'collections.saveToListHint': 'Dublikatlar avtomatik buraxılır', 'collections.role.label': 'Rol', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Siyahıya köçür', 'collections.duplicateToList': 'Siyahıya kopyala', 'collections.moveToListTitle': '{count} məkanı başqa siyahıya köçür', + 'collections.moveToListTitle.one': '{count} məkanı başqa siyahıya köçür', 'collections.duplicateToListTitle': '{count} məkanı başqa siyahıya kopyala', + 'collections.duplicateToListTitle.one': '{count} məkanı başqa siyahıya kopyala', 'collections.noOtherLists': 'Başqa siyahı yoxdur', 'collections.movedCount': '{count} məkan köçürüldü', 'collections.movedCount.one': '{count} məkan köçürüldü', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} seçilib', 'collections.importSelectedCount.one': '{count} seçilib', 'collections.importAction': '{count} məkanı idxal et', + 'collections.importAction.one': '{count} məkanı idxal et', 'collections.importEmptyTrip': 'Bu səyahətdə hələ məkan yoxdur', 'collections.importNothingNew': 'Bu səyahətdəki bütün məkanlar artıq siyahıdadır', 'collections.importDone': '{count} məkan əlavə edildi', @@ -115,6 +120,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Səyahətə kopyala', 'collections.copyToTripTitle': 'Səyahətə kopyala', 'collections.copyN': '{count} məkanı səyahətə kopyala', + 'collections.copyN.one': 'Səyahətə kopyala', 'collections.copyToTripSearch': 'Səyahətləri axtar', 'collections.searchLists': 'Siyahıları axtar', 'collections.copyToTripConfirm': 'Kopyala', @@ -150,6 +156,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Kolleksiyadan silindi', 'collections.picker.title': 'Saxlanılan məkanlar', 'collections.picker.showMore': 'Daha {count} məkan göstər', + 'collections.picker.showMore.one': 'Daha {count} məkan göstər', 'collections.picker.search': 'Saxlanılan məkanlarınızda axtar', 'collections.picker.empty': 'Əlavə ediləcək saxlanılan məkan yoxdur', 'collections.picker.hint': 'Kolleksiyalarınızdan məkan seçin', @@ -171,7 +178,10 @@ const collection: TranslationStrings = { 'collections.file.confirmInto': 'Siyahıya əlavə et', 'collections.file.doneInto': '{count} məkan {name} siyahısına əlavə edildi', 'collections.file.doneInto.one': '{count} məkan {name} siyahısına əlavə edildi', - 'collections.file.doneIntoDuplicates': '{count} məkan {name} siyahısına əlavə edildi, {duplicates} məkan artıq orada idi', + 'collections.file.doneIntoDuplicates': + '{count} məkan {name} siyahısına əlavə edildi, {duplicates} məkan artıq orada idi', + 'collections.file.doneIntoDuplicates.one': + '{count} məkan {name} siyahısına əlavə edildi, {duplicates} məkan artıq orada idi', 'collections.file.doneIntoNothing': 'Fayldakı bütün məkanlar artıq {name} siyahısındadır', 'collections.file.change': 'Dəyiş', 'collections.file.labelCount': '{count} etiket', @@ -201,6 +211,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Bu, GPX faylı deyil.', 'collections.file.errorTooManyPlaces': 'Bu faylda {count} ədəddən çox məkan var. Faylı hissələrə bölün və hər hissəni ayrıca idxal edin.', + 'collections.file.errorTooManyPlaces.one': + 'Bu faylda {count} ədəddən çox məkan var. Faylı hissələrə bölün və hər hissəni ayrıca idxal edin.', 'collections.share.title': 'Siyahını paylaş', 'collections.share.titleNamed': '“{name}” siyahısını paylaş', diff --git a/shared/src/i18n/az/common.ts b/shared/src/i18n/az/common.ts index ba3dcdf44..bc21bf835 100644 --- a/shared/src/i18n/az/common.ts +++ b/shared/src/i18n/az/common.ts @@ -45,7 +45,9 @@ const common: TranslationStrings = { 'common.saving': 'Saxlanılır...', 'common.justNow': 'indicə', 'common.hoursAgo': '{count}saat əvvəl', + 'common.hoursAgo.one': '{count}saat əvvəl', 'common.daysAgo': '{count}gün əvvəl', + 'common.daysAgo.one': '{count}gün əvvəl', 'common.saved': 'Yadda saxlandı', 'common.update': 'Yenilə', 'common.change': 'Dəyiş', diff --git a/shared/src/i18n/az/dashboard.ts b/shared/src/i18n/az/dashboard.ts index 0110c8317..4d676f3b2 100644 --- a/shared/src/i18n/az/dashboard.ts +++ b/shared/src/i18n/az/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} səyahət ({archived} arxivləşdirilib)', 'dashboard.subtitle.trips.one': '{count} səyahət ({archived} arxivləşdirilib)', 'dashboard.subtitle.empty': 'İlk səyahətinizə başlayın', - 'dashboard.subtitle.activeOne': '{count} aktiv səyahət', - 'dashboard.subtitle.activeMany': '{count} aktiv səyahət', + 'dashboard.subtitle.active': '{count} aktiv səyahət', + 'dashboard.subtitle.active.one': '{count} aktiv səyahət', 'dashboard.subtitle.archivedSuffix': ' · {count} arxivləşdirilib', 'dashboard.subtitle.archivedSuffix.one': ' · {count} arxivləşdirilib', 'dashboard.newTrip': 'Yeni səyahət', @@ -127,6 +127,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Günlər silinsin?', 'dashboard.shrinkIntro': 'Yeni tarixləri yadda saxlamaq bu günləri siləcək:', 'dashboard.shrinkMoreDays': '+{count} daha', + 'dashboard.shrinkMoreDays.one': '+{count} daha', 'dashboard.shrinkLastDays': 'İlk deyil, son günlər silinir', 'dashboard.shrinkLastDaysHint': 'Gün planları yeni tarixlərlə birlikdə hərəkət etdiyi üçün başlanğıc tarixi dəyişdirilsə belə, həmişə planın son günləri silinir.', diff --git a/shared/src/i18n/az/dawarich.ts b/shared/src/i18n/az/dawarich.ts index 52a97e67e..2574ce164 100644 --- a/shared/src/i18n/az/dawarich.ts +++ b/shared/src/i18n/az/dawarich.ts @@ -93,6 +93,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Rədd edilib', 'dawarich.suggestions.restore': 'Geri qaytar', 'dawarich.suggestions.showHandled': 'Nəzərdən keçirilmiş {count} təklifi göstər', + 'dawarich.suggestions.showHandled.one': 'Nəzərdən keçirilmiş {count} təklifi göstər', 'dawarich.suggestions.hideHandled': 'Nəzərdən keçirilmiş təklifləri gizlət', 'dawarich.suggestions.matchesWish': 'Arzular siyahınızdadır: {name}', 'dawarich.suggestions.acceptedAs.place': 'Məkan kimi əlavə edilib', @@ -144,6 +145,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Arzular siyahınızdakı məkanlardan heç biri qeydlərinizdə tapılmadı.', 'dawarich.bucket.alreadyVisited': 'Artıq tamamlandı kimi işarələnib', 'dawarich.bucket.confirm': '{count} arzunu tamamlandı kimi işarələ', + 'dawarich.bucket.confirm.one': '{count} arzunu tamamlandı kimi işarələ', 'dawarich.bucket.confirmed': '{count} arzu tamamlandı kimi işarələndi', 'dawarich.bucket.confirmed.one': '{count} arzu tamamlandı kimi işarələndi', 'dawarich.bucket.skipped': '{count} qeydin koordinatları olmadığından onları yoxlamaq mümkün olmadı.', diff --git a/shared/src/i18n/az/dayplan.ts b/shared/src/i18n/az/dayplan.ts index d37870d1c..86c4fd1aa 100644 --- a/shared/src/i18n/az/dayplan.ts +++ b/shared/src/i18n/az/dayplan.ts @@ -129,11 +129,15 @@ const dayplan: TranslationStrings = { 'Bütün məkanlar bu gündən çıxarılır. Məkanlar səyahətdə qalır, gün isə öz qeydlərini və rezervasiyalarını saxlayır.', 'dayplan.deleteDayEmpty': 'Bu gün üçün heç nə planlaşdırılmayıb.', 'dayplan.impactPlaces': 'Planlaşdırılmış məkanlar: {count}', + 'dayplan.impactPlaces.one': 'Planlaşdırılmış məkanlar: {count}', 'dayplan.impactPlacesHint': 'Onlar məkanlar siyahısında qalır.', 'dayplan.impactNotes': 'Qeydlər: {count}', + 'dayplan.impactNotes.one': 'Qeydlər: {count}', 'dayplan.impactTexts': 'Gün başlıqları və təsvirləri: {count}', + 'dayplan.impactTexts.one': 'Gün başlıqları və təsvirləri: {count}', 'dayplan.impactDeletedHint': 'Onlar da silinəcək.', 'dayplan.impactBookings': 'Rezervasiyalar: {count}', + 'dayplan.impactBookings.one': 'Rezervasiyalar: {count}', 'dayplan.impactStay': '{name} məkanında qalma', 'dayplan.deleteDayBookingsHint': 'Onlar gün təyin edilmədən Rezervasiyalar bölməsində qalır.', 'dayplan.deleteDayStayHint': 'Giriş və ya çıxış bu günə düşdüyü üçün qalma qeydi ləğv edilir.', @@ -144,9 +148,12 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Giriş və ya çıxış bu günə düşdüyü üçün qalma qeydi, “{booking}” rezervasiyası və onun {amount} məbləğində xərci birlikdə ləğv edilir.', 'dayplan.deleteDayShift': 'Sonrakı günlər: {count}', + 'dayplan.deleteDayShift.one': 'Sonrakı günlər: {count}', 'dayplan.deleteDayShiftHint': 'Hər biri bir tarix əvvələ keçiriləcək.', 'dayplan.deleteDayShiftBookingsHint': 'Hər biri bir tarix əvvələ keçiriləcək. Birlikdə köçürülən rezervasiyalar: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Hər biri bir tarix əvvələ keçiriləcək. Birlikdə köçürülən rezervasiyalar: {count}', 'dayplan.deleteDayShrink': 'Səyahət artıq {date} tarixində bitir', 'dayplan.deleteDayShrinkHint': 'Son tarixi qəbul edəcək tarixsiz gün yoxdur.', 'dayplan.impactStayShorter': '{name} məkanında qalma: bir gecə az', diff --git a/shared/src/i18n/az/docsync.ts b/shared/src/i18n/az/docsync.ts index a01cce7a4..72dcfbbe9 100644 --- a/shared/src/i18n/az/docsync.ts +++ b/shared/src/i18n/az/docsync.ts @@ -77,6 +77,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Qovluqdan kənara köçürülüb', 'docsync.conflict.resolve': '{count} ziddiyyəti həll et', + 'docsync.conflict.resolve.one': '{count} ziddiyyəti həll et', 'docsync.conflict.title': 'Hər iki nüsxə dəyişdirilib', 'docsync.conflict.keepTrek': 'TREK versiyasını saxla', diff --git a/shared/src/i18n/az/journey.ts b/shared/src/i18n/az/journey.ts index 9e530eefb..c2ef634f4 100644 --- a/shared/src/i18n/az/journey.ts +++ b/shared/src/i18n/az/journey.ts @@ -800,6 +800,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Təklif bağlandı', 'journey.suggestions.restore': 'Bağlanmış təklifləri geri qaytar', 'journey.suggestions.restoreCount': 'Bağlanmış təkliflər ({count})', + 'journey.suggestions.restoreCount.one': 'Bağlanmış təkliflər ({count})', 'journey.suggestions.restored': '{count} təklif geri qaytarıldı', 'journey.suggestions.restored.one': '{count} təklif geri qaytarıldı', diff --git a/shared/src/i18n/az/memories.ts b/shared/src/i18n/az/memories.ts index acf68744f..81a9f717e 100644 --- a/shared/src/i18n/az/memories.ts +++ b/shared/src/i18n/az/memories.ts @@ -80,6 +80,8 @@ const memories: TranslationStrings = { 'Səyahət üzvləri ilə paylaşılsın?', 'memories.confirmShareHint': '{count} foto bu səyahətin bütün üzvlərinə görünəcək. Daha sonra ayrı-ayrı fotoları şəxsi edə bilərsiniz.', + 'memories.confirmShareHint.one': + '{count} foto bu səyahətin bütün üzvlərinə görünəcək. Daha sonra onu şəxsi edə bilərsiniz.', 'memories.confirmShareButton': 'Fotoları paylaş', 'memories.error.loadAlbums': diff --git a/shared/src/i18n/az/packing.ts b/shared/src/i18n/az/packing.ts index f28b3198f..17e7dbb07 100644 --- a/shared/src/i18n/az/packing.ts +++ b/shared/src/i18n/az/packing.ts @@ -33,6 +33,7 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Markdown siyahısı da işləyir: başlıq kateqoriyanı adlandırır, "- [ ]" və "- [x]" elementə çevrilir, adın önündəki "3x" isə miqdarı təyin edir.', 'packing.importAction': '{count} elementi idxal et', + 'packing.importAction.one': '{count} elementi idxal et', 'packing.importSuccess': '{count} element idxal edildi', 'packing.importSuccess.one': '{count} element idxal edildi', 'packing.importError': 'İdxal uğursuz oldu', @@ -41,7 +42,9 @@ const packing: TranslationStrings = { 'packing.progress': '{total} elementdən {packed} yığılıb ({percent}%)', 'packing.clearChecked': 'İşarələnmiş {count} elementi sil', + 'packing.clearChecked.one': 'İşarələnmiş {count} elementi sil', 'packing.clearCheckedShort': '{count} elementi sil', + 'packing.clearCheckedShort.one': '{count} elementi sil', 'packing.allPacked': 'Hər şey yığılıb!', @@ -107,6 +110,7 @@ const packing: TranslationStrings = { 'packing.takenCareOf': '{name} cavabdehdir', 'packing.sharedWithCount': '{count} nəfərlə paylaşılıb', + 'packing.sharedWithCount.one': '{count} nəfərlə paylaşılıb', 'packing.broughtBy': '{name} gətirir', 'packing.alsoBring': 'Mən də bunu gətirə bilərəm', 'packing.alsoBringingStop': 'Mən bunu gətirməyəcəyəm', diff --git a/shared/src/i18n/az/photos.ts b/shared/src/i18n/az/photos.ts index cfcfba6fd..41dbaabce 100644 --- a/shared/src/i18n/az/photos.ts +++ b/shared/src/i18n/az/photos.ts @@ -16,6 +16,7 @@ const photos: TranslationStrings = { 'photos.linkPlace': 'Məkanla əlaqələndir', 'photos.noPlace': 'Məkan seçilməyib', 'photos.uploadN': '{n} foto yüklə', + 'photos.uploadN.one': '{n} foto yüklə', 'photos.linkDay': 'Günlə əlaqələndir', 'photos.noDay': 'Gün seçilməyib', 'photos.dayLabel': '{number}-ci gün', diff --git a/shared/src/i18n/az/reservations.ts b/shared/src/i18n/az/reservations.ts index 8101f76c1..26778cc8e 100644 --- a/shared/src/i18n/az/reservations.ts +++ b/shared/src/i18n/az/reservations.ts @@ -212,6 +212,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Digər uçuşlar', 'reservations.airtrail.empty': 'AirTrail hesabınızda heç bir uçuş tapılmadı.', 'reservations.airtrail.importCta': '{count} uçuşu idxal et', + 'reservations.airtrail.importCta.one': '{count} uçuşu idxal et', 'reservations.airtrail.joinConnection': '{stops} dayanacağında tranzit gözləmə ilə bir uçuş kimi idxal et', 'reservations.costsLabel': 'Xərclər', diff --git a/shared/src/i18n/az/roadtrip.ts b/shared/src/i18n/az/roadtrip.ts index f65d3890c..0236c55ff 100644 --- a/shared/src/i18n/az/roadtrip.ts +++ b/shared/src/i18n/az/roadtrip.ts @@ -192,6 +192,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Yolboyu “{name}” ilə uyğun heç nə yoxdur.', 'roadtrip.poi.noneMatchFilters': 'Yolboyu bu filtrlərə uyğun heç nə yoxdur.', 'roadtrip.poi.foundFiltered': 'Yolboyu {total} nəticədən {count}', + 'roadtrip.poi.foundFiltered.one': 'Yolboyu {total} nəticədən {count}', 'roadtrip.poi.truncated': '{count} marşrut hissəsində bir cavaba sığmayacaq qədər nəticə var. Qalanlarını görmək üçün axtarış dəhlizini daraldın.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/az/settings.ts b/shared/src/i18n/az/settings.ts index d4b473a30..0e3757260 100644 --- a/shared/src/i18n/az/settings.ts +++ b/shared/src/i18n/az/settings.ts @@ -706,10 +706,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Oflayn', 'settings.offline.banner.forced': 'Oflayn rejim', 'settings.offline.banner.queued': 'Oflayn · növbədə {count}', + 'settings.offline.banner.queued.one': 'Oflayn · növbədə {count}', 'settings.offline.banner.syncing': '{count} sinxronlaşdırılır…', - 'settings.offline.banner.failed': - 'Sinxronlaşdırmaq mümkün olmadı: {count}', + 'settings.offline.banner.syncing.one': '{count} sinxronlaşdırılır…', + 'settings.offline.banner.failed': 'Sinxronlaşdırmaq mümkün olmadı: {count}', + 'settings.offline.banner.failed.one': 'Sinxronlaşdırmaq mümkün olmadı: {count}', 'settings.offline.banner.conflicts': 'Ziddiyyətlər: {count}', + 'settings.offline.banner.conflicts.one': 'Ziddiyyətlər: {count}', 'settings.alwaysShowRoutes': 'Rezervasiya marşrutlarını həmişə göstər', @@ -725,6 +728,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.noneSelected': 'Ən azı bir sahə seçin, əks halda açar heç bir məlumatı oxuya bilməyəcək.', 'settings.apiScopes.limited': '{total} sahədən {count}', + 'settings.apiScopes.limited.one': '{total} sahədən {count}', 'settings.apiScopes.trips': 'Səyahətlər', 'settings.apiScopes.days': 'Günlər', 'settings.apiScopes.places': 'Məkanlar', diff --git a/shared/src/i18n/az/tours.ts b/shared/src/i18n/az/tours.ts index 55c30eb8d..041ae0f96 100644 --- a/shared/src/i18n/az/tours.ts +++ b/shared/src/i18n/az/tours.ts @@ -68,6 +68,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Yol nöqtələri', 'tours.planner.waypointLabel': 'Yol nöqtəsi {n}', 'tours.durationMinutes': '{count} dəq.', + 'tours.durationMinutes.one': '{count} dəq.', 'tours.planner.empty': 'Piyada marşrutunu hesablamaq üçün ən azı iki nöqtə əlavə edin.', 'tours.planner.start': 'Başlanğıc', 'tours.planner.via': 'Aralıq nöqtə', diff --git a/shared/src/i18n/az/trip.ts b/shared/src/i18n/az/trip.ts index 3b9796345..cbdcb6b6d 100644 --- a/shared/src/i18n/az/trip.ts +++ b/shared/src/i18n/az/trip.ts @@ -81,6 +81,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} dəyişmə', 'transit.transfers.one': '{count} dəyişmə', 'transit.min': '{count} dəq.', + 'transit.min.one': '{count} dəq.', 'transit.stops': '{count} dayanacaq', 'transit.stops.one': '{count} dayanacaq', 'transit.walkTo': '{name} istiqamətinə piyada gedin', diff --git a/shared/src/i18n/az/vacay.ts b/shared/src/i18n/az/vacay.ts index 07e39ecae..77f86285d 100644 --- a/shared/src/i18n/az/vacay.ts +++ b/shared/src/i18n/az/vacay.ts @@ -89,6 +89,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Qalan məzuniyyət günlərini avtomatik olaraq növbəti ilə keçirin', 'vacay.carriedOverPrevPeriod': 'əvvəlki dövrdən', 'vacay.compUsedCount': '{count} kompensasiya / çevik gün', + 'vacay.compUsedCount.one': '{count} kompensasiya / çevik gün', 'vacay.yearType': 'Məzuniyyət ili', 'vacay.yearTypeHint': 'Məzuniyyət ilinin nə vaxt başladığını seçin — limit, istifadə və növbəti dövrə keçirmə buna əsaslanır', 'vacay.yearTypeCalendar': 'Təqvim ili', diff --git a/shared/src/i18n/br/admin.ts b/shared/src/i18n/br/admin.ts index c15e01ef9..a7a96f4e0 100644 --- a/shared/src/i18n/br/admin.ts +++ b/shared/src/i18n/br/admin.ts @@ -566,7 +566,9 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Requer {addon}', 'admin.plugins.cap.dependsOn': 'Requer {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Ative primeiro os complementos necessários: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Ative primeiro o complemento necessário: {addons}', 'admin.plugins.dep.autoEnabled': 'Plugins necessários ativados primeiro: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Plugin necessário ativado primeiro: {plugins}', 'admin.plugins.dep.downloaded': '{id} baixado', 'admin.plugins.dep.resolveTitle': 'Dependências ausentes', 'admin.plugins.dep.resolveBody': '“{name}” precisa que estes plugins estejam instalados antes de ser ativado.', @@ -668,6 +670,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Atualizar', 'admin.audit.loadMore': 'Carregar mais', 'admin.audit.showing': '{count} carregados · {total} no total', + 'admin.audit.showing.one': '{count} carregado · {total} no total', 'admin.audit.col.time': 'Hora', 'admin.audit.col.user': 'Usuário', 'admin.audit.col.action': 'Ação', diff --git a/shared/src/i18n/br/collab.ts b/shared/src/i18n/br/collab.ts index 63ed99cd0..9b09325cf 100644 --- a/shared/src/i18n/br/collab.ts +++ b/shared/src/i18n/br/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Carregar mensagens antigas', 'collab.chat.justNow': 'agora mesmo', 'collab.chat.minutesAgo': 'há {n} min', + 'collab.chat.minutesAgo.one': 'há {n} min', 'collab.chat.hoursAgo': 'há {n} h', + 'collab.chat.hoursAgo.one': 'há {n} h', 'collab.notes.title': 'Notas', 'collab.notes.new': 'Nova nota', 'collab.notes.empty': 'Nenhuma nota ainda', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Fixar', 'collab.notes.unpin': 'Desafixar', 'collab.notes.daysAgo': 'há {n} d', + 'collab.notes.daysAgo.one': 'há {n} d', 'collab.notes.categorySettings': 'Gerenciar categorias', 'collab.notes.create': 'Criar', 'collab.notes.website': 'Site', diff --git a/shared/src/i18n/br/collection.ts b/shared/src/i18n/br/collection.ts index 541f51029..264f3d668 100644 --- a/shared/src/i18n/br/collection.ts +++ b/shared/src/i18n/br/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Salvar {count} em uma lista', + 'collections.saveNToList.one': 'Salvar {count} em uma lista', 'collections.addedNToList': '{count} salvos em {name}', + 'collections.addedNToList.one': '{count} salvo em {name}', 'collections.noOwnLists': 'Você ainda não tem listas', 'collections.saveToListHint': 'Duplicados são ignorados automaticamente', 'collections.role.label': 'Função', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Mover para lista', 'collections.duplicateToList': 'Duplicar em lista', 'collections.moveToListTitle': 'Mover {count} para outra lista', + 'collections.moveToListTitle.one': 'Mover {count} para outra lista', 'collections.duplicateToListTitle': 'Duplicar {count} em outra lista', + 'collections.duplicateToListTitle.one': 'Duplicar {count} em outra lista', 'collections.noOtherLists': 'Nenhuma outra lista ainda', 'collections.movedCount': '{count} lugares movidos', 'collections.movedCount.one': '{count} lugar movido', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} selecionados', 'collections.importSelectedCount.one': '{count} selecionado', 'collections.importAction': 'Importar {count}', + 'collections.importAction.one': 'Importar {count}', 'collections.importEmptyTrip': 'Esta viagem ainda não tem lugares', 'collections.importNothingNew': 'Tudo desta viagem já está nesta lista', 'collections.importDone': '{count} lugares adicionados', @@ -115,6 +120,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Copiar para viagem', 'collections.copyToTripTitle': 'Copiar para viagem', 'collections.copyN': 'Copiar {count} para viagem', + 'collections.copyN.one': 'Copiar {count} para viagem', 'collections.copyToTripSearch': 'Buscar viagens', 'collections.searchLists': 'Buscar listas', 'collections.copyToTripConfirm': 'Copiar', @@ -150,6 +156,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Removido da coleção', 'collections.picker.title': 'Lugares salvos', 'collections.picker.showMore': 'Mostrar mais {count}', + 'collections.picker.showMore.one': 'Mostrar mais {count}', 'collections.picker.search': 'Buscar nos seus lugares salvos', 'collections.picker.empty': 'Nenhum lugar salvo para adicionar', 'collections.picker.hint': 'Escolha um lugar das suas coleções', @@ -172,6 +179,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{count} lugares adicionados a {name}', 'collections.file.doneInto.one': '{count} lugar adicionado a {name}', 'collections.file.doneIntoDuplicates': '{count} adicionados a {name}, {duplicates} já estavam lá', + 'collections.file.doneIntoDuplicates.one': '{count} adicionado a {name}, {duplicates} já estavam lá', 'collections.file.doneIntoNothing': 'Todos os lugares do arquivo já estão em {name}', 'collections.file.change': 'Trocar', 'collections.file.labelCount': '{count} etiquetas', @@ -203,6 +211,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Esse não é um arquivo GPX.', 'collections.file.errorTooManyPlaces': 'Esse arquivo tem mais de {count} lugares. Divida-o e importe as partes uma de cada vez.', + 'collections.file.errorTooManyPlaces.one': + 'Esse arquivo tem mais de {count} lugar. Divida-o e importe as partes uma de cada vez.', 'collections.share.title': 'Compartilhar lista', 'collections.share.titleNamed': 'Compartilhar “{name}”', diff --git a/shared/src/i18n/br/common.ts b/shared/src/i18n/br/common.ts index d8e3eb391..7a9106d34 100644 --- a/shared/src/i18n/br/common.ts +++ b/shared/src/i18n/br/common.ts @@ -55,7 +55,9 @@ const common: TranslationStrings = { 'common.copied': 'Copiado', 'common.justNow': 'agora mesmo', 'common.hoursAgo': 'há {count}h', + 'common.hoursAgo.one': 'há {count}h', 'common.daysAgo': 'há {count}d', + 'common.daysAgo.one': 'há {count}d', 'common.datepicker.prevMonth': 'Previous month', // en-fallback 'common.datepicker.nextMonth': 'Next month', // en-fallback 'common.datepicker.prevYear': 'Previous year', // en-fallback diff --git a/shared/src/i18n/br/dashboard.ts b/shared/src/i18n/br/dashboard.ts index 16a532f02..ec063bc02 100644 --- a/shared/src/i18n/br/dashboard.ts +++ b/shared/src/i18n/br/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} viagens (arquivadas: {archived})', 'dashboard.subtitle.trips.one': '{count} viagem (arquivadas: {archived})', 'dashboard.subtitle.empty': 'Comece sua primeira viagem', - 'dashboard.subtitle.activeOne': '{count} viagem ativa', - 'dashboard.subtitle.activeMany': '{count} viagens ativas', + 'dashboard.subtitle.active': '{count} viagens ativas', + 'dashboard.subtitle.active.one': '{count} viagem ativa', 'dashboard.subtitle.archivedSuffix': ' · {count} arquivadas', 'dashboard.subtitle.archivedSuffix.one': ' · {count} arquivada', 'dashboard.newTrip': 'Nova viagem', @@ -112,6 +112,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Remover dias?', 'dashboard.shrinkIntro': 'Ao salvar as novas datas, estes dias serão removidos:', 'dashboard.shrinkMoreDays': '+{count} outros', + 'dashboard.shrinkMoreDays.one': '+{count} outro', 'dashboard.shrinkLastDays': 'Saem os últimos dias, não os primeiros', 'dashboard.shrinkLastDaysHint': 'Os planos de cada dia acompanham as novas datas, por isso são sempre os últimos dias do plano que saem, mesmo quando o início mudou.', diff --git a/shared/src/i18n/br/dawarich.ts b/shared/src/i18n/br/dawarich.ts index f835a1101..f5fdfff59 100644 --- a/shared/src/i18n/br/dawarich.ts +++ b/shared/src/i18n/br/dawarich.ts @@ -95,6 +95,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Dispensado', 'dawarich.suggestions.restore': 'Colocar de volta', 'dawarich.suggestions.showHandled': 'Mostrar {count} já resolvidas', + 'dawarich.suggestions.showHandled.one': 'Mostrar {count} já resolvida', 'dawarich.suggestions.hideHandled': 'Ocultar as que já foram resolvidas', 'dawarich.suggestions.matchesWish': 'Na sua lista de desejos: {name}', 'dawarich.suggestions.acceptedAs.place': 'Adicionado como lugar', @@ -146,6 +147,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Nada da sua lista de desejos apareceu nas suas gravações.', 'dawarich.bucket.alreadyVisited': 'Já riscado', 'dawarich.bucket.confirm': 'Riscar {count}', + 'dawarich.bucket.confirm.one': 'Riscar {count}', 'dawarich.bucket.confirmed': '{count} desejos riscados', 'dawarich.bucket.confirmed.one': '{count} desejo riscado', 'dawarich.bucket.skipped': '{count} entradas não têm coordenadas e não puderam ser conferidas.', diff --git a/shared/src/i18n/br/dayplan.ts b/shared/src/i18n/br/dayplan.ts index f0f687afd..2786a2c80 100644 --- a/shared/src/i18n/br/dayplan.ts +++ b/shared/src/i18n/br/dayplan.ts @@ -104,11 +104,15 @@ const dayplan: TranslationStrings = { 'Todos os lugares saem deste dia. Os lugares continuam na viagem, e o dia mantém suas notas e reservas.', 'dayplan.deleteDayEmpty': 'Nada está planejado para este dia.', 'dayplan.impactPlaces': 'Lugares planejados: {count}', + 'dayplan.impactPlaces.one': 'Lugares planejados: {count}', 'dayplan.impactPlacesHint': 'Eles continuam na lista de lugares.', 'dayplan.impactNotes': 'Notas: {count}', + 'dayplan.impactNotes.one': 'Notas: {count}', 'dayplan.impactTexts': 'Títulos e descrições do dia: {count}', + 'dayplan.impactTexts.one': 'Títulos e descrições do dia: {count}', 'dayplan.impactDeletedHint': 'Também são excluídos.', 'dayplan.impactBookings': 'Reservas: {count}', + 'dayplan.impactBookings.one': 'Reservas: {count}', 'dayplan.impactStay': 'Hospedagem em {name}', 'dayplan.deleteDayBookingsHint': 'Elas continuam em Reservas, sem dia.', 'dayplan.deleteDayStayHint': 'O check-in ou o check-out é neste dia, então a hospedagem é cancelada.', @@ -119,8 +123,10 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'O check-in ou o check-out é neste dia, então a hospedagem é cancelada, junto com a reserva “{booking}” e a despesa dela de {amount}.', 'dayplan.deleteDayShift': 'Dias seguintes: {count}', + 'dayplan.deleteDayShift.one': 'Dias seguintes: {count}', 'dayplan.deleteDayShiftHint': 'Cada um passa para a data anterior.', 'dayplan.deleteDayShiftBookingsHint': 'Cada um passa para a data anterior. Reservas que vão junto: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': 'Cada um passa para a data anterior. Reservas que vão junto: {count}', 'dayplan.deleteDayShrink': 'A viagem agora termina em {date}', 'dayplan.deleteDayShrinkHint': 'Não há nenhum dia sem data para assumir a última data.', 'dayplan.impactStayShorter': 'Hospedagem em {name}: uma noite a menos', diff --git a/shared/src/i18n/br/docsync.ts b/shared/src/i18n/br/docsync.ts index 7ce4463aa..cc7e4760d 100644 --- a/shared/src/i18n/br/docsync.ts +++ b/shared/src/i18n/br/docsync.ts @@ -71,6 +71,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Saiu da pasta', 'docsync.conflict.resolve': 'Resolver {count}', + 'docsync.conflict.resolve.one': 'Resolver {count}', 'docsync.conflict.title': 'As duas cópias mudaram', 'docsync.conflict.keepTrek': 'Manter a versão do TREK', diff --git a/shared/src/i18n/br/journey.ts b/shared/src/i18n/br/journey.ts index 2607e88ec..31f443445 100644 --- a/shared/src/i18n/br/journey.ts +++ b/shared/src/i18n/br/journey.ts @@ -674,6 +674,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Sugestão descartada', 'journey.suggestions.restore': 'Trazer de volta as sugestões descartadas', 'journey.suggestions.restoreCount': 'Sugestões descartadas ({count})', + 'journey.suggestions.restoreCount.one': 'Sugestões descartadas ({count})', 'journey.suggestions.restored': '{count} sugestões voltaram', 'journey.suggestions.restored.one': '{count} sugestão voltou', 'journey.detail.addOnThisDay': 'Adicionar um registro neste dia', diff --git a/shared/src/i18n/br/memories.ts b/shared/src/i18n/br/memories.ts index ea0d56bf3..328e959bd 100644 --- a/shared/src/i18n/br/memories.ts +++ b/shared/src/i18n/br/memories.ts @@ -62,6 +62,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Compartilhar com membros da viagem?', 'memories.confirmShareHint': '{count} fotos serão visíveis para todos os membros desta viagem. Você pode tornar fotos individuais privadas depois.', + 'memories.confirmShareHint.one': + '{count} foto será visível para todos os membros desta viagem. Você pode torná-la privada depois.', 'memories.confirmShareButton': 'Compartilhar fotos', 'memories.error.loadAlbums': 'Falha ao carregar álbuns', 'memories.error.linkAlbum': 'Falha ao vincular álbum', diff --git a/shared/src/i18n/br/packing.ts b/shared/src/i18n/br/packing.ts index 154e748be..d773cb681 100644 --- a/shared/src/i18n/br/packing.ts +++ b/shared/src/i18n/br/packing.ts @@ -30,13 +30,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Uma lista em Markdown também funciona: um título define a categoria, "- [ ]" e "- [x]" viram itens e "3x" antes do nome define a quantidade.', 'packing.importAction': 'Importar {count}', + 'packing.importAction.one': 'Importar {count}', 'packing.importSuccess': '{count} itens importados', 'packing.importSuccess.one': '{count} item importado', 'packing.importError': 'Falha na importação', 'packing.importEmpty': 'Nenhum item para importar', 'packing.progress': '{packed} de {total} na mala ({percent}%)', - 'packing.clearChecked': 'Remover {count} marcado(s)', + 'packing.clearChecked': 'Remover {count} marcados', + 'packing.clearChecked.one': 'Remover {count} marcado', 'packing.clearCheckedShort': 'Remover {count}', + 'packing.clearCheckedShort.one': 'Remover {count}', 'packing.allPacked': 'Tudo na mala!', 'packing.addPlaceholder': 'Adicionar item...', 'packing.categoryPlaceholder': 'Lista...', @@ -96,6 +99,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'Ninguém mais nesta viagem ainda', 'packing.takenCareOf': 'por {name}', 'packing.sharedWithCount': 'compartilhado com {count}', + 'packing.sharedWithCount.one': 'compartilhado com {count}', 'packing.broughtBy': 'trazido por {name}', 'packing.alsoBring': 'Eu também posso levar', 'packing.alsoBringingStop': 'Não vou levar', diff --git a/shared/src/i18n/br/photos.ts b/shared/src/i18n/br/photos.ts index 777cdb71a..6ae8086b1 100644 --- a/shared/src/i18n/br/photos.ts +++ b/shared/src/i18n/br/photos.ts @@ -15,7 +15,8 @@ const photos: TranslationStrings = { 'photos.clickToSelect': 'ou clique para selecionar', 'photos.linkPlace': 'Vincular lugar', 'photos.noPlace': 'Sem lugar', - 'photos.uploadN': 'Enviar {n} foto(s)', + 'photos.uploadN': 'Enviar {n} fotos', + 'photos.uploadN.one': 'Enviar {n} foto', 'photos.linkDay': 'Vincular dia', 'photos.noDay': 'Nenhum dia', 'photos.dayLabel': 'Dia {number}', diff --git a/shared/src/i18n/br/reservations.ts b/shared/src/i18n/br/reservations.ts index 5d1b0914d..6a133bea3 100644 --- a/shared/src/i18n/br/reservations.ts +++ b/shared/src/i18n/br/reservations.ts @@ -178,6 +178,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Outros voos', 'reservations.airtrail.empty': 'Nenhum voo encontrado na sua conta do AirTrail.', 'reservations.airtrail.importCta': 'Importar {count}', + 'reservations.airtrail.importCta.one': 'Importar {count}', 'reservations.airtrail.joinConnection': 'Importar como um único voo com escala em {stops}', 'reservations.costsLabel': 'Custos', 'reservations.createExpense': 'Criar despesa', diff --git a/shared/src/i18n/br/roadtrip.ts b/shared/src/i18n/br/roadtrip.ts index c47858e18..e5cdd5baf 100644 --- a/shared/src/i18n/br/roadtrip.ts +++ b/shared/src/i18n/br/roadtrip.ts @@ -197,6 +197,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Nada no trajeto corresponde a “{name}”.', 'roadtrip.poi.noneMatchFilters': 'Nada no caminho corresponde a esses filtros.', 'roadtrip.poi.foundFiltered': '{count} de {total} no trajeto', + 'roadtrip.poi.foundFiltered.one': '{count} de {total} no trajeto', 'roadtrip.poi.truncated': '{count} trechos tinham mais do que cabe em uma resposta. Estreite o corredor para ver o restante.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/br/settings.ts b/shared/src/i18n/br/settings.ts index ec8416e8d..e834f77ce 100644 --- a/shared/src/i18n/br/settings.ts +++ b/shared/src/i18n/br/settings.ts @@ -579,9 +579,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Offline', 'settings.offline.banner.forced': 'Modo offline', 'settings.offline.banner.queued': 'Offline · {count} na fila', + 'settings.offline.banner.queued.one': 'Offline · {count} na fila', 'settings.offline.banner.syncing': 'Sincronizando {count}…', + 'settings.offline.banner.syncing.one': 'Sincronizando {count}…', 'settings.offline.banner.failed': 'Falha ao sincronizar: {count}', + 'settings.offline.banner.failed.one': 'Falha ao sincronizar: {count}', 'settings.offline.banner.conflicts': 'Conflitos: {count}', + 'settings.offline.banner.conflicts.one': 'Conflitos: {count}', 'settings.pluginActivity.title': 'Atividade dos plugins', 'settings.pluginActivity.description': 'Cada ação que um plugin realizou em seu nome, das mais recentes primeiro.', 'settings.pluginActivity.empty': 'Ainda não há atividade de plugins.', @@ -603,6 +607,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Tudo', 'settings.apiScopes.noneSelected': 'Escolha pelo menos uma área, senão a chave não poderia ler nada.', 'settings.apiScopes.limited': '{count} de {total}', + 'settings.apiScopes.limited.one': '{count} de {total}', 'settings.apiScopes.trips': 'Viagens', 'settings.apiScopes.days': 'Dias', 'settings.apiScopes.places': 'Lugares', diff --git a/shared/src/i18n/br/tours.ts b/shared/src/i18n/br/tours.ts index 0ee6908b6..cd8d058a4 100644 --- a/shared/src/i18n/br/tours.ts +++ b/shared/src/i18n/br/tours.ts @@ -69,6 +69,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Pontos de passagem', 'tours.planner.waypointLabel': 'Ponto de passagem {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', 'tours.planner.empty': 'Adicione pelo menos dois pontos para calcular uma rota a pé.', 'tours.planner.start': 'Partida', 'tours.planner.via': 'Passagem por', diff --git a/shared/src/i18n/br/trip.ts b/shared/src/i18n/br/trip.ts index cebcf0e2b..07bee4af7 100644 --- a/shared/src/i18n/br/trip.ts +++ b/shared/src/i18n/br/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} baldeações', 'transit.transfers.one': '{count} baldeação', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', 'transit.stops': '{count} paradas', 'transit.stops.one': '{count} parada', 'transit.walkTo': 'Caminhar até {name}', diff --git a/shared/src/i18n/br/vacay.ts b/shared/src/i18n/br/vacay.ts index e2a1cd8af..39dc3efc6 100644 --- a/shared/src/i18n/br/vacay.ts +++ b/shared/src/i18n/br/vacay.ts @@ -89,6 +89,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Levar automaticamente os dias de férias restantes para o ano seguinte', 'vacay.carriedOverPrevPeriod': 'do período anterior', 'vacay.compUsedCount': '{count} banco de horas', + 'vacay.compUsedCount.one': '{count} banco de horas', 'vacay.yearType': 'Ano de férias', 'vacay.yearTypeHint': 'Quando começa seu ano de férias — direito, uso e acúmulo seguem essa data', 'vacay.yearTypeCalendar': 'Calendário', diff --git a/shared/src/i18n/ca/admin.ts b/shared/src/i18n/ca/admin.ts index 811ebd2ac..c0544a818 100644 --- a/shared/src/i18n/ca/admin.ts +++ b/shared/src/i18n/ca/admin.ts @@ -312,6 +312,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Actualitzar', 'admin.audit.loadMore': 'Carregar més', 'admin.audit.showing': '{count} carregats · {total} en total', + 'admin.audit.showing.one': '{count} carregat · {total} en total', 'admin.audit.col.time': 'Data i hora', 'admin.audit.col.user': 'Usuari', 'admin.audit.col.action': 'Acció', @@ -818,7 +819,9 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Requereix {addon}', 'admin.plugins.cap.dependsOn': 'Necessita {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Activa primer els complements necessaris: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Activa primer el complement necessari: {addons}', 'admin.plugins.dep.autoEnabled': "S'han activat primer els connectors necessaris: {plugins}", + 'admin.plugins.dep.autoEnabled.one': "S'ha activat primer el connector necessari: {plugins}", 'admin.plugins.dep.downloaded': "S'ha baixat {id}", 'admin.plugins.dep.resolveTitle': 'Dependències que falten', 'admin.plugins.dep.resolveBody': diff --git a/shared/src/i18n/ca/collab.ts b/shared/src/i18n/ca/collab.ts index 6180887d2..b00d6e105 100644 --- a/shared/src/i18n/ca/collab.ts +++ b/shared/src/i18n/ca/collab.ts @@ -37,7 +37,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Carrega missatges anteriors', 'collab.chat.justNow': 'ara mateix', 'collab.chat.minutesAgo': 'fa {n} min', + 'collab.chat.minutesAgo.one': 'fa {n} min', 'collab.chat.hoursAgo': 'fa {n} h', + 'collab.chat.hoursAgo.one': 'fa {n} h', 'collab.notes.title': 'Notes', 'collab.notes.new': 'Nota nova', 'collab.notes.empty': 'Encara no hi ha notes', @@ -61,6 +63,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Fixa', 'collab.notes.unpin': 'Desfixa', 'collab.notes.daysAgo': 'fa {n} d', + 'collab.notes.daysAgo.one': 'fa {n} d', 'collab.notes.categorySettings': 'Gestiona les categories', 'collab.notes.create': 'Crea', 'collab.notes.website': 'Lloc web', diff --git a/shared/src/i18n/ca/collection.ts b/shared/src/i18n/ca/collection.ts index ee74512c2..f9bdad63e 100644 --- a/shared/src/i18n/ca/collection.ts +++ b/shared/src/i18n/ca/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Desa {count} a una llista', + 'collections.saveNToList.one': 'Desa {count} a una llista', 'collections.addedNToList': 'Desat {count} a {name}', + 'collections.addedNToList.one': 'Desat {count} a {name}', 'collections.noOwnLists': 'Encara no tens cap llista', 'collections.saveToListHint': "Els duplicats s'ometen automàticament", 'collections.role.label': 'Rol', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Moure a la llista', 'collections.duplicateToList': 'Duplicar a la llista', 'collections.moveToListTitle': 'Mou {count} a una altra llista', + 'collections.moveToListTitle.one': 'Mou {count} a una altra llista', 'collections.duplicateToListTitle': 'Duplica {count} a una altra llista', + 'collections.duplicateToListTitle.one': 'Duplica {count} a una altra llista', 'collections.noOtherLists': 'Encara no hi ha cap altra llista', 'collections.movedCount': "S'han mogut {count} llocs", 'collections.movedCount.one': "S'ha mogut {count} lloc", @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} seleccionats', 'collections.importSelectedCount.one': '{count} seleccionat', 'collections.importAction': 'Importa {count}', + 'collections.importAction.one': 'Importa {count}', 'collections.importEmptyTrip': 'Aquest viatge encara no té llocs', 'collections.importNothingNew': 'Tot aquest viatge ja és en aquesta llista', 'collections.importDone': 'S’han afegit {count} llocs', @@ -110,6 +115,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Copiar al viatge', 'collections.copyToTripTitle': 'Copiar al viatge', 'collections.copyN': 'Copia {count} al viatge', + 'collections.copyN.one': 'Copia al viatge', 'collections.copyToTripSearch': 'Cercar viatges', 'collections.searchLists': 'Cerca llistes', 'collections.copyToTripConfirm': 'Copiar', @@ -142,6 +148,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Eliminat de la col·lecció', 'collections.picker.title': 'Llocs desats', 'collections.picker.showMore': "Mostra'n {count} més", + 'collections.picker.showMore.one': "Mostra'n {count} més", 'collections.picker.search': 'Cerca entre els teus llocs desats', 'collections.picker.empty': 'No hi ha llocs desats per afegir', 'collections.picker.hint': 'Tria un lloc de les teves col·leccions', @@ -164,6 +171,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{count} llocs afegits a {name}', 'collections.file.doneInto.one': '{count} lloc afegit a {name}', 'collections.file.doneIntoDuplicates': '{count} afegits a {name}, {duplicates} ja hi eren', + 'collections.file.doneIntoDuplicates.one': '{count} afegit a {name}, {duplicates} ja hi eren', 'collections.file.doneIntoNothing': 'Tots els llocs del fitxer ja són a {name}', 'collections.file.change': 'Canvia', 'collections.file.labelCount': '{count} etiquetes', @@ -195,6 +203,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Això no és un fitxer GPX.', 'collections.file.errorTooManyPlaces': 'Aquest fitxer té més de {count} llocs. Divideix-lo i importa’n les parts d’una en una.', + 'collections.file.errorTooManyPlaces.one': + 'Aquest fitxer té més de {count} lloc. Divideix-lo i importa’n les parts d’una en una.', 'collections.share.title': 'Compartir llista', 'collections.share.titleNamed': 'Compartir «{name}»', diff --git a/shared/src/i18n/ca/common.ts b/shared/src/i18n/ca/common.ts index acfcf430c..1ec351602 100644 --- a/shared/src/i18n/ca/common.ts +++ b/shared/src/i18n/ca/common.ts @@ -55,7 +55,9 @@ const common: TranslationStrings = { 'common.copied': 'Copiat', 'common.justNow': 'ara mateix', 'common.hoursAgo': 'fa {count} h', + 'common.hoursAgo.one': 'fa {count} h', 'common.daysAgo': 'fa {count} d', + 'common.daysAgo.one': 'fa {count} d', 'common.datepicker.prevMonth': 'Mes anterior', 'common.datepicker.nextMonth': 'Mes següent', diff --git a/shared/src/i18n/ca/dashboard.ts b/shared/src/i18n/ca/dashboard.ts index 38c591caf..947d72555 100644 --- a/shared/src/i18n/ca/dashboard.ts +++ b/shared/src/i18n/ca/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} viatges (arxivats: {archived})', 'dashboard.subtitle.trips.one': '{count} viatge (arxivats: {archived})', 'dashboard.subtitle.empty': 'Comença el teu primer viatge', - 'dashboard.subtitle.activeOne': '{count} viatge actiu', - 'dashboard.subtitle.activeMany': '{count} viatges actius', + 'dashboard.subtitle.active': '{count} viatges actius', + 'dashboard.subtitle.active.one': '{count} viatge actiu', 'dashboard.subtitle.archivedSuffix': ' · {count} arxivats', 'dashboard.subtitle.archivedSuffix.one': ' · {count} arxivat', 'dashboard.newTrip': 'Viatge nou', @@ -200,6 +200,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Vols treure dies?', 'dashboard.shrinkIntro': 'En desar les noves dates es treuen aquests dies:', 'dashboard.shrinkMoreDays': '+{count} més', + 'dashboard.shrinkMoreDays.one': '+{count} més', 'dashboard.shrinkLastDays': 'Es treuen els últims dies, no els primers', 'dashboard.shrinkLastDaysHint': "Els plans de cada dia es mouen amb les noves dates, així que sempre es treuen els últims dies del pla, també quan ha canviat l'inici.", diff --git a/shared/src/i18n/ca/dawarich.ts b/shared/src/i18n/ca/dawarich.ts index ca825b2a1..4803f56dc 100644 --- a/shared/src/i18n/ca/dawarich.ts +++ b/shared/src/i18n/ca/dawarich.ts @@ -94,6 +94,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Descartat', 'dawarich.suggestions.restore': 'Torna-ho a posar', 'dawarich.suggestions.showHandled': 'Mostra’n {count} de ja resolts', + 'dawarich.suggestions.showHandled.one': 'Mostra’n {count} de ja resolt', 'dawarich.suggestions.hideHandled': 'Amaga els que ja estan resolts', 'dawarich.suggestions.matchesWish': 'A la teva llista de desitjos: {name}', 'dawarich.suggestions.acceptedAs.place': 'Afegit com a lloc', @@ -145,6 +146,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'No ha aparegut res de la teva llista de desitjos als teus enregistraments.', 'dawarich.bucket.alreadyVisited': 'Ja marcat', 'dawarich.bucket.confirm': 'Marca’n {count}', + 'dawarich.bucket.confirm.one': 'Marca’n {count}', 'dawarich.bucket.confirmed': '{count} desitjos marcats', 'dawarich.bucket.confirmed.one': '{count} desig marcat', 'dawarich.bucket.skipped': '{count} entrades no tenen coordenades i no s’han pogut comprovar.', diff --git a/shared/src/i18n/ca/dayplan.ts b/shared/src/i18n/ca/dayplan.ts index 2cf5db9f9..2c37ddbbd 100644 --- a/shared/src/i18n/ca/dayplan.ts +++ b/shared/src/i18n/ca/dayplan.ts @@ -104,11 +104,15 @@ const dayplan: TranslationStrings = { 'Tots els llocs surten d’aquest dia. Els llocs es queden al viatge, i el dia conserva les notes i les reserves.', 'dayplan.deleteDayEmpty': 'No hi ha res planificat aquest dia.', 'dayplan.impactPlaces': 'Llocs planificats: {count}', + 'dayplan.impactPlaces.one': 'Llocs planificats: {count}', 'dayplan.impactPlacesHint': 'Es queden a la llista de llocs.', 'dayplan.impactNotes': 'Notes: {count}', + 'dayplan.impactNotes.one': 'Notes: {count}', 'dayplan.impactTexts': 'Títols i descripcions del dia: {count}', + 'dayplan.impactTexts.one': 'Títols i descripcions del dia: {count}', 'dayplan.impactDeletedHint': "També s'eliminen.", 'dayplan.impactBookings': 'Reserves: {count}', + 'dayplan.impactBookings.one': 'Reserves: {count}', 'dayplan.impactStay': 'Estada a {name}', 'dayplan.deleteDayBookingsHint': 'Es queden a Reserves, sense dia.', 'dayplan.deleteDayStayHint': "L'entrada o la sortida és aquest dia, així que l'estada es cancel·la.", @@ -119,8 +123,11 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': "L'entrada o la sortida és aquest dia, així que l'estada es cancel·la, juntament amb la reserva «{booking}» i la seva despesa de {amount}.", 'dayplan.deleteDayShift': 'Dies posteriors: {count}', + 'dayplan.deleteDayShift.one': 'Dies posteriors: {count}', 'dayplan.deleteDayShiftHint': 'Cadascun passa a la data anterior.', 'dayplan.deleteDayShiftBookingsHint': 'Cadascun passa a la data anterior. Reserves que es mouen amb ells: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Cadascun passa a la data anterior. Reserves que es mouen amb ells: {count}', 'dayplan.deleteDayShrink': 'Ara el viatge acaba el {date}', 'dayplan.deleteDayShrinkHint': "No queda cap dia sense data que pugui agafar l'última data.", 'dayplan.impactStayShorter': 'Estada a {name}: una nit menys', diff --git a/shared/src/i18n/ca/docsync.ts b/shared/src/i18n/ca/docsync.ts index 0f0de5646..115d337de 100644 --- a/shared/src/i18n/ca/docsync.ts +++ b/shared/src/i18n/ca/docsync.ts @@ -72,6 +72,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Ha sortit de la carpeta', 'docsync.conflict.resolve': 'Resol {count}', + 'docsync.conflict.resolve.one': 'Resol {count}', 'docsync.conflict.title': 'Han canviat totes dues còpies', 'docsync.conflict.keepTrek': 'Conserva la versió de TREK', diff --git a/shared/src/i18n/ca/journey.ts b/shared/src/i18n/ca/journey.ts index d6d74f394..7ee47b9a2 100644 --- a/shared/src/i18n/ca/journey.ts +++ b/shared/src/i18n/ca/journey.ts @@ -677,6 +677,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Suggeriment descartat', 'journey.suggestions.restore': 'Recupera els suggeriments descartats', 'journey.suggestions.restoreCount': 'Suggeriments descartats ({count})', + 'journey.suggestions.restoreCount.one': 'Suggeriments descartats ({count})', 'journey.suggestions.restored': 'S’han recuperat {count} suggeriments', 'journey.suggestions.restored.one': 'S’ha recuperat {count} suggeriment', 'journey.detail.addOnThisDay': 'Afegeix una entrada en aquest dia', diff --git a/shared/src/i18n/ca/memories.ts b/shared/src/i18n/ca/memories.ts index 510fa1a6d..bb0216e8a 100644 --- a/shared/src/i18n/ca/memories.ts +++ b/shared/src/i18n/ca/memories.ts @@ -65,6 +65,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Vols compartir amb els membres del viatge?', 'memories.confirmShareHint': "{count} fotos seran visibles per a tots els membres d'aquest viatge. Pots fer fotos individuals privades més tard.", + 'memories.confirmShareHint.one': + "{count} foto serà visible per a tots els membres d'aquest viatge. La pots fer privada més tard.", 'memories.confirmShareButton': 'Comparteix les fotos', 'memories.error.loadAlbums': 'Error en carregar els àlbums', 'memories.error.linkAlbum': "Error en vincular l'àlbum", diff --git a/shared/src/i18n/ca/packing.ts b/shared/src/i18n/ca/packing.ts index 32818e4e0..a907e5231 100644 --- a/shared/src/i18n/ca/packing.ts +++ b/shared/src/i18n/ca/packing.ts @@ -19,13 +19,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'També funciona una llista en Markdown: un títol indica la categoria, "- [ ]" i "- [x]" es converteixen en elements, i "3x" davant d’un nom en fixa la quantitat.', 'packing.importAction': 'Importa {count}', + 'packing.importAction.one': 'Importa {count}', 'packing.importSuccess': '{count} elements importats', 'packing.importSuccess.one': '{count} element importat', 'packing.importError': 'Error en importar', 'packing.importEmpty': 'Sense elements per importar', 'packing.progress': '{packed} de {total} preparats ({percent}%)', 'packing.clearChecked': 'Elimina {count} marcats', + 'packing.clearChecked.one': 'Elimina {count} marcat', 'packing.clearCheckedShort': 'Elimina {count}', + 'packing.clearCheckedShort.one': 'Elimina {count}', 'packing.allPacked': 'Tot preparat!', 'packing.addPlaceholder': 'Afegeix un element nou...', 'packing.categoryPlaceholder': 'Categoria...', @@ -85,6 +88,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'Encara no hi ha ningú més en aquest viatge', 'packing.takenCareOf': 'per {name}', 'packing.sharedWithCount': 'compartit amb {count}', + 'packing.sharedWithCount.one': 'compartit amb {count}', 'packing.broughtBy': 'portat per {name}', 'packing.alsoBring': 'Jo també puc portar això', 'packing.alsoBringingStop': 'Ja no ho porto', diff --git a/shared/src/i18n/ca/photos.ts b/shared/src/i18n/ca/photos.ts index 0638ec209..c012a638c 100644 --- a/shared/src/i18n/ca/photos.ts +++ b/shared/src/i18n/ca/photos.ts @@ -15,7 +15,8 @@ const photos: TranslationStrings = { 'photos.clickToSelect': 'o fes clic per seleccionar', 'photos.linkPlace': 'Vincula un lloc', 'photos.noPlace': 'Sense lloc', - 'photos.uploadN': 'Pujada de {n} foto(es)', + 'photos.uploadN': 'Pujada de {n} fotos', + 'photos.uploadN.one': 'Pujada de {n} foto', 'photos.linkDay': 'Vincula un dia', 'photos.noDay': 'Cap dia', 'photos.dayLabel': 'Dia {number}', diff --git a/shared/src/i18n/ca/reservations.ts b/shared/src/i18n/ca/reservations.ts index 9b4d10cfb..7d557dd71 100644 --- a/shared/src/i18n/ca/reservations.ts +++ b/shared/src/i18n/ca/reservations.ts @@ -183,6 +183,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Altres vols', 'reservations.airtrail.empty': "No s'han trobat vols al teu compte d'AirTrail.", 'reservations.airtrail.importCta': 'Importar {count}', + 'reservations.airtrail.importCta.one': 'Importar {count}', 'reservations.costsLabel': 'Despeses', 'reservations.createExpense': 'Crear despesa', 'reservations.createExpenseHint': "Desa la reserva i obre l'editor de Despeses.", diff --git a/shared/src/i18n/ca/roadtrip.ts b/shared/src/i18n/ca/roadtrip.ts index 88fad704d..1707df9ad 100644 --- a/shared/src/i18n/ca/roadtrip.ts +++ b/shared/src/i18n/ca/roadtrip.ts @@ -200,6 +200,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Res del trajecte no coincideix amb «{name}».', 'roadtrip.poi.noneMatchFilters': 'Res del camí no coincideix amb aquests filtres.', 'roadtrip.poi.foundFiltered': '{count} de {total} al trajecte', + 'roadtrip.poi.foundFiltered.one': '{count} de {total} al trajecte', 'roadtrip.poi.truncated': 'En {count} trams hi havia més del que cap en una resposta: estreny el corredor per veure la resta.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/ca/settings.ts b/shared/src/i18n/ca/settings.ts index 78f06a396..1f520c088 100644 --- a/shared/src/i18n/ca/settings.ts +++ b/shared/src/i18n/ca/settings.ts @@ -554,9 +554,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Fora de línia', 'settings.offline.banner.forced': 'Mode fora de línia', 'settings.offline.banner.queued': 'Fora de línia · {count} a la cua', + 'settings.offline.banner.queued.one': 'Fora de línia · {count} a la cua', 'settings.offline.banner.syncing': 'Sincronitzant {count}…', + 'settings.offline.banner.syncing.one': 'Sincronitzant {count}…', 'settings.offline.banner.failed': 'Error en sincronitzar: {count}', + 'settings.offline.banner.failed.one': 'Error en sincronitzar: {count}', 'settings.offline.banner.conflicts': 'Conflictes: {count}', + 'settings.offline.banner.conflicts.one': 'Conflictes: {count}', 'settings.plugins.oauth.connected': 'Connectat', 'settings.plugins.oauth.notConnected': 'No connectat', 'settings.plugins.oauth.connect': 'Connecta', @@ -605,6 +609,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Tot', 'settings.apiScopes.noneSelected': 'Tria almenys un àmbit; si no, la clau no podria llegir res.', 'settings.apiScopes.limited': '{count} de {total}', + 'settings.apiScopes.limited.one': '{count} de {total}', 'settings.apiScopes.trips': 'Viatges', 'settings.apiScopes.days': 'Dies', 'settings.apiScopes.places': 'Llocs', diff --git a/shared/src/i18n/ca/tours.ts b/shared/src/i18n/ca/tours.ts index be07e2f40..b7e0ef9b2 100644 --- a/shared/src/i18n/ca/tours.ts +++ b/shared/src/i18n/ca/tours.ts @@ -68,6 +68,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Punts de pas', 'tours.planner.waypointLabel': 'Punt de pas {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', 'tours.planner.empty': 'Afegeix almenys dos punts per calcular una ruta a peu.', 'tours.planner.start': 'Inici', 'tours.planner.via': 'Pas per', diff --git a/shared/src/i18n/ca/trip.ts b/shared/src/i18n/ca/trip.ts index 437927b56..6db92782c 100644 --- a/shared/src/i18n/ca/trip.ts +++ b/shared/src/i18n/ca/trip.ts @@ -69,6 +69,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} transbords', 'transit.transfers.one': '{count} transbord', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', 'transit.stops': '{count} parades', 'transit.stops.one': '{count} parada', 'transit.walkTo': 'Camina fins a {name}', diff --git a/shared/src/i18n/ca/vacay.ts b/shared/src/i18n/ca/vacay.ts index d6fc8566b..dece42fba 100644 --- a/shared/src/i18n/ca/vacay.ts +++ b/shared/src/i18n/ca/vacay.ts @@ -84,6 +84,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': "Trasllada automàticament els dies restants a l'any següent", 'vacay.carriedOverPrevPeriod': 'del període anterior', 'vacay.compUsedCount': '{count} comp.', + 'vacay.compUsedCount.one': '{count} comp.', 'vacay.yearType': 'Any de vacances', 'vacay.yearTypeHint': 'Quan comença el teu any de vacances — dret, ús i saldo arrossegat hi van lligats', 'vacay.yearTypeCalendar': 'Natural', diff --git a/shared/src/i18n/cs/admin.ts b/shared/src/i18n/cs/admin.ts index e635e5e28..fc1788a17 100644 --- a/shared/src/i18n/cs/admin.ts +++ b/shared/src/i18n/cs/admin.ts @@ -572,7 +572,11 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Vyžaduje {addon}', 'admin.plugins.cap.dependsOn': 'Vyžaduje {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Nejprve povolte potřebné doplňky: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Nejprve povolte potřebný doplněk: {addons}', + 'admin.plugins.dep.addonDisabledToast.few': 'Nejprve povolte potřebné doplňky: {addons}', 'admin.plugins.dep.autoEnabled': 'Nejprve povoleny potřebné pluginy: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Nejprve povolen potřebný plugin: {plugins}', + 'admin.plugins.dep.autoEnabled.few': 'Nejprve povoleny potřebné pluginy: {plugins}', 'admin.plugins.dep.downloaded': 'Staženo {id}', 'admin.plugins.dep.resolveTitle': 'Chybějící závislosti', 'admin.plugins.dep.resolveBody': '„{name}“ před povolením potřebuje nainstalovat tyto pluginy.', @@ -659,7 +663,9 @@ const admin: TranslationStrings = { 'admin.audit.empty': 'Zatím žádné záznamy auditu.', 'admin.audit.refresh': 'Obnovit', 'admin.audit.loadMore': 'Načíst další', - 'admin.audit.showing': '{count} načteno · {total} celkem', + 'admin.audit.showing': 'Načteno {count} záznamů · celkem {total}', + 'admin.audit.showing.one': 'Načten {count} záznam · celkem {total}', + 'admin.audit.showing.few': 'Načteny {count} záznamy · celkem {total}', 'admin.audit.col.time': 'Čas', 'admin.audit.col.user': 'Uživatel', 'admin.audit.col.action': 'Akce', diff --git a/shared/src/i18n/cs/collab.ts b/shared/src/i18n/cs/collab.ts index d1b06bda6..65f98ae71 100644 --- a/shared/src/i18n/cs/collab.ts +++ b/shared/src/i18n/cs/collab.ts @@ -45,7 +45,11 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Načíst starší zprávy', 'collab.chat.justNow': 'právě teď', 'collab.chat.minutesAgo': 'před {n} min', + 'collab.chat.minutesAgo.one': 'před {n} min', + 'collab.chat.minutesAgo.few': 'před {n} min', 'collab.chat.hoursAgo': 'před {n} h', + 'collab.chat.hoursAgo.one': 'před {n} h', + 'collab.chat.hoursAgo.few': 'před {n} h', 'collab.notes.title': 'Poznámky', 'collab.notes.new': 'Nová poznámka', 'collab.notes.empty': 'Zatím žádné poznámky', @@ -63,6 +67,8 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Připnout', 'collab.notes.unpin': 'Odepnout', 'collab.notes.daysAgo': 'před {n} dny', + 'collab.notes.daysAgo.one': 'před {n} dnem', + 'collab.notes.daysAgo.few': 'před {n} dny', 'collab.notes.categorySettings': 'Spravovat kategorie', 'collab.notes.create': 'Vytvořit', 'collab.notes.website': 'Webové stránky', diff --git a/shared/src/i18n/cs/collection.ts b/shared/src/i18n/cs/collection.ts index 0ec10d345..3dec2b5b4 100644 --- a/shared/src/i18n/cs/collection.ts +++ b/shared/src/i18n/cs/collection.ts @@ -2,7 +2,11 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Uložit {count} do seznamu', + 'collections.saveNToList.one': 'Uložit {count} do seznamu', + 'collections.saveNToList.few': 'Uložit {count} do seznamu', 'collections.addedNToList': 'Uloženo {count} do {name}', + 'collections.addedNToList.one': 'Uloženo {count} do {name}', + 'collections.addedNToList.few': 'Uloženo {count} do {name}', 'collections.noOwnLists': 'Zatím nemáte žádné seznamy', 'collections.saveToListHint': 'Duplikáty se automaticky přeskočí', 'collections.role.label': 'Role', @@ -16,7 +20,11 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Přesunout do seznamu', 'collections.duplicateToList': 'Duplikovat do seznamu', 'collections.moveToListTitle': 'Přesunout {count} do jiného seznamu', + 'collections.moveToListTitle.one': 'Přesunout {count} do jiného seznamu', + 'collections.moveToListTitle.few': 'Přesunout {count} do jiného seznamu', 'collections.duplicateToListTitle': 'Duplikovat {count} do jiného seznamu', + 'collections.duplicateToListTitle.one': 'Duplikovat {count} do jiného seznamu', + 'collections.duplicateToListTitle.few': 'Duplikovat {count} do jiného seznamu', 'collections.noOtherLists': 'Zatím žádné další seznamy', 'collections.movedCount': 'Přesunuto {count} míst', 'collections.movedCount.one': 'Přesunuto {count} místo', @@ -61,6 +69,8 @@ const collection: TranslationStrings = { 'collections.importSelectedCount.one': 'Vybráno: {count}', 'collections.importSelectedCount.few': 'Vybráno: {count}', 'collections.importAction': 'Importovat {count}', + 'collections.importAction.one': 'Importovat {count}', + 'collections.importAction.few': 'Importovat {count}', 'collections.importEmptyTrip': 'Tato cesta zatím nemá žádná místa', 'collections.importNothingNew': 'Vše z této cesty už na seznamu je', 'collections.importDone': 'Přidáno {count} míst', @@ -122,6 +132,8 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Kopírovat do výletu', 'collections.copyToTripTitle': 'Kopírovat do výletu', 'collections.copyN': 'Kopírovat {count} do výletu', + 'collections.copyN.one': 'Kopírovat do výletu', + 'collections.copyN.few': 'Kopírovat {count} do výletu', 'collections.copyToTripSearch': 'Hledat výlety', 'collections.searchLists': 'Hledat seznamy', 'collections.copyToTripConfirm': 'Kopírovat', @@ -160,6 +172,8 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Odebráno ze sbírky', 'collections.picker.title': 'Uložená místa', 'collections.picker.showMore': 'Zobrazit dalších {count}', + 'collections.picker.showMore.one': 'Zobrazit ještě {count}', + 'collections.picker.showMore.few': 'Zobrazit další {count}', 'collections.picker.search': 'Prohledat uložená místa', 'collections.picker.empty': 'Žádná uložená místa k přidání', 'collections.picker.hint': 'Vyberte místo ze svých sbírek', @@ -183,6 +197,8 @@ const collection: TranslationStrings = { 'collections.file.doneInto.one': '{count} místo přidáno do {name}', 'collections.file.doneInto.few': '{count} místa přidána do {name}', 'collections.file.doneIntoDuplicates': '{count} přidáno do {name}, {duplicates} už tam bylo', + 'collections.file.doneIntoDuplicates.one': '{count} přidáno do {name}, {duplicates} už tam bylo', + 'collections.file.doneIntoDuplicates.few': '{count} přidáno do {name}, {duplicates} už tam bylo', 'collections.file.doneIntoNothing': 'Všechna místa ze souboru už v {name} jsou', 'collections.file.change': 'Změnit', 'collections.file.labelCount': '{count} štítků', @@ -217,6 +233,10 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Toto není soubor GPX.', 'collections.file.errorTooManyPlaces': 'Tento soubor obsahuje více než {count} míst. Rozdělte ho a importujte části postupně.', + 'collections.file.errorTooManyPlaces.one': + 'Tento soubor obsahuje více než {count} místo. Rozdělte ho a importujte části postupně.', + 'collections.file.errorTooManyPlaces.few': + 'Tento soubor obsahuje více než {count} místa. Rozdělte ho a importujte části postupně.', 'collections.share.title': 'Sdílet seznam', 'collections.share.titleNamed': 'Sdílet „{name}“', diff --git a/shared/src/i18n/cs/common.ts b/shared/src/i18n/cs/common.ts index 07d4fe8bf..3dc241e83 100644 --- a/shared/src/i18n/cs/common.ts +++ b/shared/src/i18n/cs/common.ts @@ -55,7 +55,11 @@ const common: TranslationStrings = { 'common.copied': 'Zkopírováno', 'common.justNow': 'právě teď', 'common.hoursAgo': 'před {count} h', + 'common.hoursAgo.one': 'před {count} h', + 'common.hoursAgo.few': 'před {count} h', 'common.daysAgo': 'před {count} d', + 'common.daysAgo.one': 'před {count} d', + 'common.daysAgo.few': 'před {count} d', 'common.datepicker.prevMonth': 'Previous month', // en-fallback 'common.datepicker.nextMonth': 'Next month', // en-fallback 'common.datepicker.prevYear': 'Previous year', // en-fallback diff --git a/shared/src/i18n/cs/dashboard.ts b/shared/src/i18n/cs/dashboard.ts index 1dff61c0e..8b217341a 100644 --- a/shared/src/i18n/cs/dashboard.ts +++ b/shared/src/i18n/cs/dashboard.ts @@ -7,8 +7,9 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips.one': '{count} cesta ({archived} v archivu)', 'dashboard.subtitle.trips.few': '{count} cesty ({archived} v archivu)', 'dashboard.subtitle.empty': 'Začněte svou první cestu', - 'dashboard.subtitle.activeOne': '{count} aktivní cesta', - 'dashboard.subtitle.activeMany': '{count} aktivních cest', + 'dashboard.subtitle.active': '{count} aktivních cest', + 'dashboard.subtitle.active.one': '{count} aktivní cesta', + 'dashboard.subtitle.active.few': '{count} aktivní cesty', 'dashboard.subtitle.archivedSuffix': ' · {count} archivovaných', 'dashboard.subtitle.archivedSuffix.one': ' · {count} archivovaná', 'dashboard.subtitle.archivedSuffix.few': ' · {count} archivované', @@ -117,7 +118,9 @@ const dashboard: TranslationStrings = { 'Tip: pokud chcete posunout jen část itineráře, otevřete v plánovači „Změnit pořadí dnů“, přidejte den po konci cesty tlačítkem s jeho datem a přesuňte ho tam, kde má vzniknout mezera.', 'dashboard.shrinkTitle': 'Odebrat dny?', 'dashboard.shrinkIntro': 'Uložením nových dat se odeberou tyto dny:', - 'dashboard.shrinkMoreDays': '+{count} další', + 'dashboard.shrinkMoreDays': '+{count} dalších', + 'dashboard.shrinkMoreDays.one': '+{count} další', + 'dashboard.shrinkMoreDays.few': '+{count} další', 'dashboard.shrinkLastDays': 'Odeberou se poslední dny, ne první', 'dashboard.shrinkLastDaysHint': 'Plány dnů se posouvají s novými daty, takže se vždy odeberou poslední dny plánu, i když se posunul začátek.', diff --git a/shared/src/i18n/cs/dawarich.ts b/shared/src/i18n/cs/dawarich.ts index 80e69f660..f27a05a75 100644 --- a/shared/src/i18n/cs/dawarich.ts +++ b/shared/src/i18n/cs/dawarich.ts @@ -97,6 +97,8 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Zamítnuto', 'dawarich.suggestions.restore': 'Vrátit zpět', 'dawarich.suggestions.showHandled': 'Zobrazit {count} již vyřízených', + 'dawarich.suggestions.showHandled.one': 'Zobrazit {count} již vyřízený', + 'dawarich.suggestions.showHandled.few': 'Zobrazit {count} již vyřízené', 'dawarich.suggestions.hideHandled': 'Skrýt už vyřízené', 'dawarich.suggestions.matchesWish': 'Na vašem seznamu přání: {name}', 'dawarich.suggestions.acceptedAs.place': 'Přidáno jako místo', @@ -148,6 +150,8 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Ve vašich záznamech se neobjevilo nic z vašeho seznamu přání.', 'dawarich.bucket.alreadyVisited': 'Již odškrtnuto', 'dawarich.bucket.confirm': 'Odškrtnout {count}', + 'dawarich.bucket.confirm.one': 'Odškrtnout {count}', + 'dawarich.bucket.confirm.few': 'Odškrtnout {count}', 'dawarich.bucket.confirmed': 'Odškrtnuto {count} přání', 'dawarich.bucket.confirmed.one': 'Odškrtnuto {count} přání', 'dawarich.bucket.confirmed.few': 'Odškrtnuta {count} přání', diff --git a/shared/src/i18n/cs/dayplan.ts b/shared/src/i18n/cs/dayplan.ts index 1c3267348..1bddcb755 100644 --- a/shared/src/i18n/cs/dayplan.ts +++ b/shared/src/i18n/cs/dayplan.ts @@ -104,11 +104,19 @@ const dayplan: TranslationStrings = { 'Všechna místa se z tohoto dne odeberou. Místa zůstanou v cestě a den si ponechá své poznámky i rezervace.', 'dayplan.deleteDayEmpty': 'Na tento den není nic naplánováno.', 'dayplan.impactPlaces': 'Naplánovaná místa: {count}', + 'dayplan.impactPlaces.one': 'Naplánovaná místa: {count}', + 'dayplan.impactPlaces.few': 'Naplánovaná místa: {count}', 'dayplan.impactPlacesHint': 'Zůstanou v seznamu míst.', 'dayplan.impactNotes': 'Poznámky: {count}', + 'dayplan.impactNotes.one': 'Poznámky: {count}', + 'dayplan.impactNotes.few': 'Poznámky: {count}', 'dayplan.impactTexts': 'Názvy a popisy dne: {count}', + 'dayplan.impactTexts.one': 'Názvy a popisy dne: {count}', + 'dayplan.impactTexts.few': 'Názvy a popisy dne: {count}', 'dayplan.impactDeletedHint': 'Budou také smazány.', 'dayplan.impactBookings': 'Rezervace: {count}', + 'dayplan.impactBookings.one': 'Rezervace: {count}', + 'dayplan.impactBookings.few': 'Rezervace: {count}', 'dayplan.impactStay': 'Ubytování v {name}', 'dayplan.deleteDayBookingsHint': 'Zůstanou v Rezervacích, bez dne.', 'dayplan.deleteDayStayHint': 'Příjezd nebo odjezd připadá na tento den, proto se ubytování zruší.', @@ -119,9 +127,15 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Příjezd nebo odjezd připadá na tento den, proto se ubytování zruší spolu s rezervací „{booking}“ a jejím výdajem {amount}.', 'dayplan.deleteDayShift': 'Pozdější dny: {count}', + 'dayplan.deleteDayShift.one': 'Pozdější dny: {count}', + 'dayplan.deleteDayShift.few': 'Pozdější dny: {count}', 'dayplan.deleteDayShiftHint': 'Každý se posune o jedno datum dříve.', 'dayplan.deleteDayShiftBookingsHint': 'Každý se posune o jedno datum dříve. Rezervace, které se posunou s nimi: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Každý se posune o jedno datum dříve. Rezervace, které se posunou s nimi: {count}', + 'dayplan.deleteDayShiftBookingsHint.few': + 'Každý se posune o jedno datum dříve. Rezervace, které se posunou s nimi: {count}', 'dayplan.deleteDayShrink': 'Cesta nyní končí {date}', 'dayplan.deleteDayShrinkHint': 'Nezbývá žádný den bez data, který by převzal poslední datum.', 'dayplan.impactStayShorter': 'Ubytování v {name}: o noc kratší', diff --git a/shared/src/i18n/cs/docsync.ts b/shared/src/i18n/cs/docsync.ts index 290e9c10b..38bfd04e0 100644 --- a/shared/src/i18n/cs/docsync.ts +++ b/shared/src/i18n/cs/docsync.ts @@ -70,6 +70,8 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Přesunuto mimo složku', 'docsync.conflict.resolve': 'Vyřešit {count}', + 'docsync.conflict.resolve.one': 'Vyřešit {count}', + 'docsync.conflict.resolve.few': 'Vyřešit {count}', 'docsync.conflict.title': 'Změnily se obě kopie', 'docsync.conflict.keepTrek': 'Ponechat verzi z TREKu', diff --git a/shared/src/i18n/cs/journey.ts b/shared/src/i18n/cs/journey.ts index 8ec6f02e6..c005f1bcd 100644 --- a/shared/src/i18n/cs/journey.ts +++ b/shared/src/i18n/cs/journey.ts @@ -679,6 +679,8 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Návrh zahozen', 'journey.suggestions.restore': 'Vrátit zahozené návrhy', 'journey.suggestions.restoreCount': 'Zahozené návrhy ({count})', + 'journey.suggestions.restoreCount.one': 'Zahozené návrhy ({count})', + 'journey.suggestions.restoreCount.few': 'Zahozené návrhy ({count})', 'journey.suggestions.restored': 'Vrátilo se {count} návrhů', 'journey.suggestions.restored.one': 'Vrátil se {count} návrh', 'journey.suggestions.restored.few': 'Vrátily se {count} návrhy', diff --git a/shared/src/i18n/cs/memories.ts b/shared/src/i18n/cs/memories.ts index 9f0b75a64..c766e0c88 100644 --- a/shared/src/i18n/cs/memories.ts +++ b/shared/src/i18n/cs/memories.ts @@ -63,6 +63,10 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Sdílet se členy cesty?', 'memories.confirmShareHint': '{count} fotek bude viditelných pro všechny členy této cesty. Jednotlivé fotky můžete později nastavit jako soukromé.', + 'memories.confirmShareHint.one': + '{count} fotka bude viditelná pro všechny členy této cesty. Později ji můžete nastavit jako soukromou.', + 'memories.confirmShareHint.few': + '{count} fotky budou viditelné pro všechny členy této cesty. Jednotlivé fotky můžete později nastavit jako soukromé.', 'memories.confirmShareButton': 'Sdílet fotky', 'memories.error.loadAlbums': 'Načtení alb se nezdařilo', 'memories.error.linkAlbum': 'Propojení alba se nezdařilo', diff --git a/shared/src/i18n/cs/packing.ts b/shared/src/i18n/cs/packing.ts index c7faf8bd2..10af5f1f5 100644 --- a/shared/src/i18n/cs/packing.ts +++ b/shared/src/i18n/cs/packing.ts @@ -31,14 +31,20 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Funguje i seznam v Markdownu: nadpis určuje kategorii, z "- [ ]" a "- [x]" se stanou položky a "3x" před názvem nastaví množství.', 'packing.importAction': 'Importovat {count}', + 'packing.importAction.one': 'Importovat {count}', + 'packing.importAction.few': 'Importovat {count}', 'packing.importSuccess': '{count} položek importováno', 'packing.importSuccess.one': '{count} položka importována', 'packing.importSuccess.few': '{count} položky importovány', 'packing.importError': 'Import se nezdařil', 'packing.importEmpty': 'Žádné položky k importu', 'packing.progress': '{packed} z {total} zabaleno ({percent} %)', - 'packing.clearChecked': 'Odstranit {count} hotových', + 'packing.clearChecked': 'Odstranit {count} hotových položek', + 'packing.clearChecked.one': 'Odstranit {count} hotovou položku', + 'packing.clearChecked.few': 'Odstranit {count} hotové položky', 'packing.clearCheckedShort': 'Odstranit {count}', + 'packing.clearCheckedShort.one': 'Odstranit {count}', + 'packing.clearCheckedShort.few': 'Odstranit {count}', 'packing.allPacked': 'Vše je zabaleno!', 'packing.addPlaceholder': 'Přidat novou položku...', 'packing.categoryPlaceholder': 'Seznam...', @@ -100,7 +106,9 @@ const packing: TranslationStrings = { 'packing.tierShared': 'Sdílet s…', 'packing.noOneToShare': 'Zatím nikdo další na této cestě', 'packing.takenCareOf': 'od {name}', - 'packing.sharedWithCount': 'sdíleno s {count}', + 'packing.sharedWithCount': 'sdíleno s {count} osobami', + 'packing.sharedWithCount.one': 'sdíleno s {count} osobou', + 'packing.sharedWithCount.few': 'sdíleno s {count} osobami', 'packing.broughtBy': 'přináší {name}', 'packing.alsoBring': 'Můžu to vzít taky', 'packing.alsoBringingStop': 'Neberu to', diff --git a/shared/src/i18n/cs/photos.ts b/shared/src/i18n/cs/photos.ts index bf03ae31e..b449de515 100644 --- a/shared/src/i18n/cs/photos.ts +++ b/shared/src/i18n/cs/photos.ts @@ -17,6 +17,8 @@ const photos: TranslationStrings = { 'photos.linkPlace': 'Propojit s místem', 'photos.noPlace': 'Žádné místo', 'photos.uploadN': 'Nahrát {n} fotek', + 'photos.uploadN.one': 'Nahrát {n} fotku', + 'photos.uploadN.few': 'Nahrát {n} fotky', 'photos.linkDay': 'Propojit den', 'photos.noDay': 'Žádný den', 'photos.dayLabel': 'Den {number}', diff --git a/shared/src/i18n/cs/reservations.ts b/shared/src/i18n/cs/reservations.ts index 5cea075c2..8f1662e70 100644 --- a/shared/src/i18n/cs/reservations.ts +++ b/shared/src/i18n/cs/reservations.ts @@ -183,6 +183,8 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Ostatní lety', 'reservations.airtrail.empty': 'Ve vašem účtu AirTrail nebyly nalezeny žádné lety.', 'reservations.airtrail.importCta': 'Importovat {count}', + 'reservations.airtrail.importCta.one': 'Importovat {count}', + 'reservations.airtrail.importCta.few': 'Importovat {count}', 'reservations.airtrail.joinConnection': 'Importovat jako jeden let s přestupem v {stops}', 'reservations.costsLabel': 'Náklady', 'reservations.createExpense': 'Vytvořit výdaj', diff --git a/shared/src/i18n/cs/roadtrip.ts b/shared/src/i18n/cs/roadtrip.ts index 04163ff26..44f78b610 100644 --- a/shared/src/i18n/cs/roadtrip.ts +++ b/shared/src/i18n/cs/roadtrip.ts @@ -200,6 +200,8 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Na trase nic neodpovídá „{name}“.', 'roadtrip.poi.noneMatchFilters': 'Nic na trase neodpovídá těmto filtrům.', 'roadtrip.poi.foundFiltered': '{count} z {total} na trase', + 'roadtrip.poi.foundFiltered.one': '{count} z {total} na trase', + 'roadtrip.poi.foundFiltered.few': '{count} z {total} na trase', 'roadtrip.poi.truncated': 'Na {count} úsecích bylo více výsledků, než se vejde do jedné odpovědi. Zužte koridor, abyste viděli zbytek.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/cs/settings.ts b/shared/src/i18n/cs/settings.ts index 925a1d979..21c88c341 100644 --- a/shared/src/i18n/cs/settings.ts +++ b/shared/src/i18n/cs/settings.ts @@ -569,9 +569,17 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Offline', 'settings.offline.banner.forced': 'Offline režim', 'settings.offline.banner.queued': 'Offline · {count} ve frontě', + 'settings.offline.banner.queued.one': 'Offline · {count} ve frontě', + 'settings.offline.banner.queued.few': 'Offline · {count} ve frontě', 'settings.offline.banner.syncing': 'Synchronizace {count}…', + 'settings.offline.banner.syncing.one': 'Synchronizace {count}…', + 'settings.offline.banner.syncing.few': 'Synchronizace {count}…', 'settings.offline.banner.failed': 'Synchronizace selhala: {count}', + 'settings.offline.banner.failed.one': 'Synchronizace selhala: {count}', + 'settings.offline.banner.failed.few': 'Synchronizace selhala: {count}', 'settings.offline.banner.conflicts': 'Konflikty: {count}', + 'settings.offline.banner.conflicts.one': 'Konflikty: {count}', + 'settings.offline.banner.conflicts.few': 'Konflikty: {count}', 'settings.pluginActivity.title': 'Aktivita pluginů', 'settings.pluginActivity.description': 'Každá akce, kterou plugin provedl vaším jménem, od nejnovějších.', 'settings.pluginActivity.empty': 'Zatím žádná aktivita pluginů.', @@ -593,6 +601,8 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Vše', 'settings.apiScopes.noneSelected': 'Vyber aspoň jednu oblast, jinak by klíč nemohl číst nic.', 'settings.apiScopes.limited': '{count} z {total}', + 'settings.apiScopes.limited.one': '{count} z {total}', + 'settings.apiScopes.limited.few': '{count} z {total}', 'settings.apiScopes.trips': 'Cesty', 'settings.apiScopes.days': 'Dny', 'settings.apiScopes.places': 'Místa', diff --git a/shared/src/i18n/cs/tours.ts b/shared/src/i18n/cs/tours.ts index 930d2b46e..9225c95b5 100644 --- a/shared/src/i18n/cs/tours.ts +++ b/shared/src/i18n/cs/tours.ts @@ -67,6 +67,8 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Průjezdní body', 'tours.planner.waypointLabel': 'Bod {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', + 'tours.durationMinutes.few': '{count} min', 'tours.planner.empty': 'Pro výpočet pěší trasy přidejte alespoň dva body.', 'tours.planner.start': 'Start', 'tours.planner.via': 'Přes', diff --git a/shared/src/i18n/cs/trip.ts b/shared/src/i18n/cs/trip.ts index 4ddb5b1f5..2d32095de 100644 --- a/shared/src/i18n/cs/trip.ts +++ b/shared/src/i18n/cs/trip.ts @@ -76,6 +76,8 @@ const trip: TranslationStrings = { 'transit.transfers.one': '{count} přestup', 'transit.transfers.few': '{count} přestupy', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', + 'transit.min.few': '{count} min', 'transit.stops': '{count} zastávek', 'transit.stops.one': '{count} zastávka', 'transit.stops.few': '{count} zastávky', diff --git a/shared/src/i18n/cs/vacay.ts b/shared/src/i18n/cs/vacay.ts index d0c1c7a08..3786eb1de 100644 --- a/shared/src/i18n/cs/vacay.ts +++ b/shared/src/i18n/cs/vacay.ts @@ -87,6 +87,8 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Automaticky převádět zbývající dny do dalšího roku', 'vacay.carriedOverPrevPeriod': 'z předchozího období', 'vacay.compUsedCount': '{count}× náhradní volno', + 'vacay.compUsedCount.one': '{count}× náhradní volno', + 'vacay.compUsedCount.few': '{count}× náhradní volno', 'vacay.yearType': 'Dovolenkový rok', 'vacay.yearTypeHint': 'Kdy začíná váš dovolenkový rok — podle toho se řídí nárok, čerpání i převod', 'vacay.yearTypeCalendar': 'Kalendářní', diff --git a/shared/src/i18n/de/admin.ts b/shared/src/i18n/de/admin.ts index 1107d5382..520817603 100644 --- a/shared/src/i18n/de/admin.ts +++ b/shared/src/i18n/de/admin.ts @@ -573,7 +573,9 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Benötigt {addon}', 'admin.plugins.cap.dependsOn': 'Benötigt {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Aktiviere zuerst die benötigten Addons: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Aktiviere zuerst das benötigte Addon: {addons}', 'admin.plugins.dep.autoEnabled': 'Benötigte Plugins zuerst aktiviert: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Benötigtes Plugin zuerst aktiviert: {plugins}', 'admin.plugins.dep.downloaded': '{id} heruntergeladen', 'admin.plugins.dep.resolveTitle': 'Fehlende Abhängigkeiten', 'admin.plugins.dep.resolveBody': '„{name}“ benötigt diese Plugins, bevor es aktiviert werden kann.', @@ -702,6 +704,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Aktualisieren', 'admin.audit.loadMore': 'Mehr laden', 'admin.audit.showing': '{count} geladen · {total} gesamt', + 'admin.audit.showing.one': '{count} geladen · {total} gesamt', 'admin.audit.col.time': 'Zeit', 'admin.audit.col.user': 'Benutzer', 'admin.audit.col.action': 'Aktion', diff --git a/shared/src/i18n/de/collab.ts b/shared/src/i18n/de/collab.ts index bbd88b47b..1e6d68f91 100644 --- a/shared/src/i18n/de/collab.ts +++ b/shared/src/i18n/de/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Ältere Nachrichten laden', 'collab.chat.justNow': 'gerade eben', 'collab.chat.minutesAgo': 'vor {n} Min.', + 'collab.chat.minutesAgo.one': 'vor {n} Min.', 'collab.chat.hoursAgo': 'vor {n} Std.', + 'collab.chat.hoursAgo.one': 'vor {n} Std.', 'collab.notes.title': 'Notizen', 'collab.notes.new': 'Neue Notiz', 'collab.notes.empty': 'Noch keine Notizen', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Anheften', 'collab.notes.unpin': 'Loslösen', 'collab.notes.daysAgo': 'vor {n} T.', + 'collab.notes.daysAgo.one': 'vor {n} T.', 'collab.notes.categorySettings': 'Kategorien verwalten', 'collab.notes.create': 'Erstellen', 'collab.notes.website': 'Website', diff --git a/shared/src/i18n/de/collection.ts b/shared/src/i18n/de/collection.ts index c2dcd5a47..cfc497e55 100644 --- a/shared/src/i18n/de/collection.ts +++ b/shared/src/i18n/de/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': '{count} in eine Liste speichern', + 'collections.saveNToList.one': '{count} in eine Liste speichern', 'collections.addedNToList': '{count} in {name} gespeichert', + 'collections.addedNToList.one': '{count} in {name} gespeichert', 'collections.noOwnLists': 'Du hast noch keine Listen', 'collections.saveToListHint': 'Duplikate werden automatisch übersprungen', 'collections.role.label': 'Rolle', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'In Liste verschieben', 'collections.duplicateToList': 'In Liste duplizieren', 'collections.moveToListTitle': '{count} in andere Liste verschieben', + 'collections.moveToListTitle.one': '{count} in andere Liste verschieben', 'collections.duplicateToListTitle': '{count} in andere Liste duplizieren', + 'collections.duplicateToListTitle.one': '{count} in andere Liste duplizieren', 'collections.noOtherLists': 'Noch keine anderen Listen', 'collections.movedCount': '{count} Orte verschoben', 'collections.movedCount.one': '{count} Ort verschoben', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} ausgewählt', 'collections.importSelectedCount.one': '{count} ausgewählt', 'collections.importAction': '{count} übernehmen', + 'collections.importAction.one': '{count} übernehmen', 'collections.importEmptyTrip': 'Diese Reise hat noch keine Orte', 'collections.importNothingNew': 'Alles aus dieser Reise steht schon auf der Liste', 'collections.importDone': '{count} Orte hinzugefügt', @@ -116,6 +121,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'In Reise kopieren', 'collections.copyToTripTitle': 'In Reise kopieren', 'collections.copyN': '{count} in Reise kopieren', + 'collections.copyN.one': 'In Reise kopieren', 'collections.copyToTripSearch': 'Reisen suchen', 'collections.searchLists': 'Listen suchen', 'collections.copyToTripConfirm': 'Kopieren', @@ -151,6 +157,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Aus Sammlung entfernt', 'collections.picker.title': 'Gespeicherte Orte', 'collections.picker.showMore': '{count} weitere anzeigen', + 'collections.picker.showMore.one': 'Noch {count} anzeigen', 'collections.picker.search': 'Gespeicherte Orte durchsuchen', 'collections.picker.empty': 'Keine gespeicherten Orte zum Hinzufügen', 'collections.picker.hint': 'Wähle einen Ort aus deinen Sammlungen', @@ -173,6 +180,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{count} Orte zu {name} hinzugefügt', 'collections.file.doneInto.one': '{count} Ort zu {name} hinzugefügt', 'collections.file.doneIntoDuplicates': '{count} zu {name} hinzugefügt, {duplicates} waren schon drin', + 'collections.file.doneIntoDuplicates.one': '{count} zu {name} hinzugefügt, {duplicates} waren schon drin', 'collections.file.doneIntoNothing': 'Alle Orte der Datei sind schon in {name}', 'collections.file.change': 'Ändern', 'collections.file.labelCount': '{count} Labels', @@ -203,6 +211,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Das ist keine GPX-Datei.', 'collections.file.errorTooManyPlaces': 'Diese Datei enthält mehr als {count} Orte. Teile sie auf und importiere die Teile nacheinander.', + 'collections.file.errorTooManyPlaces.one': + 'Diese Datei enthält mehr als {count} Ort. Teile sie auf und importiere die Teile nacheinander.', 'collections.share.title': 'Liste teilen', 'collections.share.titleNamed': '„{name}“ teilen', diff --git a/shared/src/i18n/de/common.ts b/shared/src/i18n/de/common.ts index 1db340ba2..e42353191 100644 --- a/shared/src/i18n/de/common.ts +++ b/shared/src/i18n/de/common.ts @@ -47,7 +47,9 @@ const common: TranslationStrings = { 'common.collapse': 'Einklappen', 'common.justNow': 'gerade eben', 'common.hoursAgo': 'vor {count}h', + 'common.hoursAgo.one': 'vor {count}h', 'common.daysAgo': 'vor {count}T', + 'common.daysAgo.one': 'vor {count}T', 'common.saved': 'Gespeichert', 'common.update': 'Aktualisieren', 'common.change': 'Ändern', diff --git a/shared/src/i18n/de/dashboard.ts b/shared/src/i18n/de/dashboard.ts index 22b5c40c1..60b650b86 100644 --- a/shared/src/i18n/de/dashboard.ts +++ b/shared/src/i18n/de/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} Reisen ({archived} archiviert)', 'dashboard.subtitle.trips.one': '{count} Reise ({archived} archiviert)', 'dashboard.subtitle.empty': 'Starte deine erste Reise', - 'dashboard.subtitle.activeOne': '{count} aktive Reise', - 'dashboard.subtitle.activeMany': '{count} aktive Reisen', + 'dashboard.subtitle.active': '{count} aktive Reisen', + 'dashboard.subtitle.active.one': '{count} aktive Reise', 'dashboard.subtitle.archivedSuffix': ' · {count} archiviert', 'dashboard.subtitle.archivedSuffix.one': ' · {count} archiviert', 'dashboard.newTrip': 'Neue Reise', @@ -115,6 +115,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Tage entfernen?', 'dashboard.shrinkIntro': 'Mit den neuen Daten entfallen beim Speichern diese Tage:', 'dashboard.shrinkMoreDays': '+{count} weitere', + 'dashboard.shrinkMoreDays.one': '+{count} weitere', 'dashboard.shrinkLastDays': 'Es fallen die letzten Tage weg, nicht die ersten', 'dashboard.shrinkLastDaysHint': 'Die Tagespläne wandern mit den neuen Daten, deshalb entfallen immer die letzten Tage deines Plans, auch wenn sich der Start verschoben hat.', diff --git a/shared/src/i18n/de/dawarich.ts b/shared/src/i18n/de/dawarich.ts index 64486e86d..ab569805e 100644 --- a/shared/src/i18n/de/dawarich.ts +++ b/shared/src/i18n/de/dawarich.ts @@ -97,6 +97,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Verworfen', 'dawarich.suggestions.restore': 'Zurückholen', 'dawarich.suggestions.showHandled': '{count} bereits erledigte anzeigen', + 'dawarich.suggestions.showHandled.one': '{count} bereits erledigte anzeigen', 'dawarich.suggestions.hideHandled': 'Bereits erledigte ausblenden', 'dawarich.suggestions.matchesWish': 'Auf deiner Wunschliste: {name}', 'dawarich.suggestions.acceptedAs.place': 'Als Ort hinzugefügt', @@ -148,6 +149,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Nichts von deiner Wunschliste taucht in deinen Aufzeichnungen auf.', 'dawarich.bucket.alreadyVisited': 'Bereits abgehakt', 'dawarich.bucket.confirm': '{count} abhaken', + 'dawarich.bucket.confirm.one': '{count} abhaken', 'dawarich.bucket.confirmed': '{count} Wünsche abgehakt', 'dawarich.bucket.confirmed.one': '{count} Wunsch abgehakt', 'dawarich.bucket.skipped': '{count} Einträge haben keine Koordinaten und konnten nicht geprüft werden.', diff --git a/shared/src/i18n/de/dayplan.ts b/shared/src/i18n/de/dayplan.ts index 2d364ee58..da268ae93 100644 --- a/shared/src/i18n/de/dayplan.ts +++ b/shared/src/i18n/de/dayplan.ts @@ -104,11 +104,15 @@ const dayplan: TranslationStrings = { 'Alle Orte werden von diesem Tag entfernt. Die Orte bleiben in der Reise, und der Tag behält seine Notizen und Buchungen.', 'dayplan.deleteDayEmpty': 'An diesem Tag ist nichts geplant.', 'dayplan.impactPlaces': 'Geplante Orte: {count}', + 'dayplan.impactPlaces.one': 'Geplante Orte: {count}', 'dayplan.impactPlacesHint': 'Sie bleiben in der Ortsliste.', 'dayplan.impactNotes': 'Notizen: {count}', + 'dayplan.impactNotes.one': 'Notizen: {count}', 'dayplan.impactTexts': 'Tagestitel und Beschreibungen: {count}', + 'dayplan.impactTexts.one': 'Tagestitel und Beschreibungen: {count}', 'dayplan.impactDeletedHint': 'Werden mitgelöscht.', 'dayplan.impactBookings': 'Buchungen: {count}', + 'dayplan.impactBookings.one': 'Buchungen: {count}', 'dayplan.impactStay': 'Übernachtung in {name}', 'dayplan.deleteDayBookingsHint': 'Sie bleiben unter Buchungen, ohne Tag.', 'dayplan.deleteDayStayHint': 'Check-in oder Check-out an diesem Tag, sie wird storniert.', @@ -119,9 +123,12 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Check-in oder Check-out an diesem Tag, sie wird storniert, zusammen mit der Buchung „{booking}“ und ihrer Ausgabe über {amount}.', 'dayplan.deleteDayShift': 'Spätere Tage: {count}', + 'dayplan.deleteDayShift.one': 'Spätere Tage: {count}', 'dayplan.deleteDayShiftHint': 'Jeder rückt um einen Kalendertag nach vorn.', 'dayplan.deleteDayShiftBookingsHint': 'Jeder rückt um einen Kalendertag nach vorn. Buchungen, die mitwandern: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Jeder rückt um einen Kalendertag nach vorn. Buchungen, die mitwandern: {count}', 'dayplan.deleteDayShrink': 'Die Reise endet jetzt am {date}', 'dayplan.deleteDayShrinkHint': 'Es gibt keinen Tag ohne Datum, der das letzte Datum übernehmen könnte.', 'dayplan.impactStayShorter': 'Übernachtung in {name}: eine Nacht weniger', diff --git a/shared/src/i18n/de/docsync.ts b/shared/src/i18n/de/docsync.ts index 3bf24898d..c41c98b66 100644 --- a/shared/src/i18n/de/docsync.ts +++ b/shared/src/i18n/de/docsync.ts @@ -72,6 +72,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Aus dem Ordner verschoben', 'docsync.conflict.resolve': '{count} klären', + 'docsync.conflict.resolve.one': '{count} klären', 'docsync.conflict.title': 'Beide Kopien wurden geändert', 'docsync.conflict.keepTrek': 'Die TREK-Version behalten', diff --git a/shared/src/i18n/de/journey.ts b/shared/src/i18n/de/journey.ts index 936fea137..c6dd7f912 100644 --- a/shared/src/i18n/de/journey.ts +++ b/shared/src/i18n/de/journey.ts @@ -676,6 +676,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Vorschlag verworfen', 'journey.suggestions.restore': 'Verworfene Vorschläge zurückholen', 'journey.suggestions.restoreCount': 'Verworfene Vorschläge ({count})', + 'journey.suggestions.restoreCount.one': 'Verworfene Vorschläge ({count})', 'journey.suggestions.restored': '{count} Vorschläge sind zurück', 'journey.suggestions.restored.one': '{count} Vorschlag ist zurück', 'journey.detail.addOnThisDay': 'Eintrag an diesem Tag hinzufügen', diff --git a/shared/src/i18n/de/memories.ts b/shared/src/i18n/de/memories.ts index ef2580709..33f73d3b8 100644 --- a/shared/src/i18n/de/memories.ts +++ b/shared/src/i18n/de/memories.ts @@ -65,6 +65,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Mit Reisebegleitern teilen?', 'memories.confirmShareHint': '{count} Fotos werden für alle Mitglieder dieses Trips sichtbar. Du kannst einzelne Fotos nachträglich auf privat setzen.', + 'memories.confirmShareHint.one': + '{count} Foto wird für alle Mitglieder dieses Trips sichtbar. Du kannst es nachträglich auf privat setzen.', 'memories.confirmShareButton': 'Fotos teilen', 'memories.error.loadAlbums': 'Alben konnten nicht geladen werden', 'memories.error.linkAlbum': 'Album konnte nicht verknüpft werden', diff --git a/shared/src/i18n/de/packing.ts b/shared/src/i18n/de/packing.ts index f10e8e257..4688626b9 100644 --- a/shared/src/i18n/de/packing.ts +++ b/shared/src/i18n/de/packing.ts @@ -32,13 +32,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Auch eine Markdown-Liste geht: Eine Überschrift benennt die Kategorie, "- [ ]" und "- [x]" werden zu Einträgen, und "3x" vor einem Namen setzt die Menge.', 'packing.importAction': '{count} importieren', + 'packing.importAction.one': '{count} importieren', 'packing.importSuccess': '{count} Einträge importiert', 'packing.importSuccess.one': '{count} Eintrag importiert', 'packing.importError': 'Import fehlgeschlagen', 'packing.importEmpty': 'Keine Einträge zum Importieren', 'packing.progress': '{packed} von {total} gepackt ({percent}%)', 'packing.clearChecked': '{count} abgehakte entfernen', + 'packing.clearChecked.one': '{count} abgehakte entfernen', 'packing.clearCheckedShort': '{count} entfernen', + 'packing.clearCheckedShort.one': '{count} entfernen', 'packing.allPacked': 'Alles gepackt!', 'packing.addPlaceholder': 'Neuen Gegenstand hinzufügen...', 'packing.categoryPlaceholder': 'Liste...', @@ -89,6 +92,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'Noch niemand sonst auf dieser Reise', 'packing.takenCareOf': 'von {name}', 'packing.sharedWithCount': 'geteilt mit {count}', + 'packing.sharedWithCount.one': 'geteilt mit {count}', 'packing.broughtBy': 'bringt {name}', 'packing.alsoBring': 'Bring ich auch mit', 'packing.alsoBringingStop': 'Bring ich doch nicht mit', diff --git a/shared/src/i18n/de/photos.ts b/shared/src/i18n/de/photos.ts index 847b2fd68..82ef0c6c2 100644 --- a/shared/src/i18n/de/photos.ts +++ b/shared/src/i18n/de/photos.ts @@ -15,7 +15,8 @@ const photos: TranslationStrings = { 'photos.clickToSelect': 'oder klicken zum Auswählen', 'photos.linkPlace': 'Ort verknüpfen', 'photos.noPlace': 'Kein Ort', - 'photos.uploadN': '{n} Foto(s) hochladen', + 'photos.uploadN': '{n} Fotos hochladen', + 'photos.uploadN.one': '{n} Foto hochladen', 'photos.linkDay': 'Tag verknüpfen', 'photos.noDay': 'Kein Tag', 'photos.dayLabel': 'Tag {number}', diff --git a/shared/src/i18n/de/reservations.ts b/shared/src/i18n/de/reservations.ts index 86b3bdf3d..51ba428a1 100644 --- a/shared/src/i18n/de/reservations.ts +++ b/shared/src/i18n/de/reservations.ts @@ -183,6 +183,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Weitere Flüge', 'reservations.airtrail.empty': 'Keine Flüge in Ihrem AirTrail-Konto gefunden.', 'reservations.airtrail.importCta': '{count} importieren', + 'reservations.airtrail.importCta.one': '{count} importieren', 'reservations.airtrail.joinConnection': 'Als einen Flug mit Zwischenstopp in {stops} importieren', 'reservations.costsLabel': 'Kosten', 'reservations.createExpense': 'Ausgabe erstellen', diff --git a/shared/src/i18n/de/roadtrip.ts b/shared/src/i18n/de/roadtrip.ts index ab3896c05..e64996c9f 100644 --- a/shared/src/i18n/de/roadtrip.ts +++ b/shared/src/i18n/de/roadtrip.ts @@ -194,6 +194,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Unterwegs passt nichts zu „{name}“.', 'roadtrip.poi.noneMatchFilters': 'Nichts auf dem Weg passt zu diesen Filtern.', 'roadtrip.poi.foundFiltered': '{count} von {total} unterwegs', + 'roadtrip.poi.foundFiltered.one': '{count} von {total} unterwegs', 'roadtrip.poi.truncated': 'Auf {count} Abschnitten gab es mehr, als in eine Antwort passt. Mach den Korridor schmaler, um den Rest zu sehen.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/de/settings.ts b/shared/src/i18n/de/settings.ts index 7047a8235..638e6e246 100644 --- a/shared/src/i18n/de/settings.ts +++ b/shared/src/i18n/de/settings.ts @@ -582,9 +582,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Offline', 'settings.offline.banner.forced': 'Offline-Modus', 'settings.offline.banner.queued': 'Offline · {count} in Warteschlange', + 'settings.offline.banner.queued.one': 'Offline · {count} in Warteschlange', 'settings.offline.banner.syncing': 'Synchronisiert {count}…', + 'settings.offline.banner.syncing.one': 'Synchronisiert {count}…', 'settings.offline.banner.failed': 'Synchronisierung fehlgeschlagen: {count}', + 'settings.offline.banner.failed.one': 'Synchronisierung fehlgeschlagen: {count}', 'settings.offline.banner.conflicts': 'Konflikte: {count}', + 'settings.offline.banner.conflicts.one': 'Konflikte: {count}', 'settings.pluginActivity.title': 'Plugin-Aktivität', 'settings.pluginActivity.description': 'Jede Aktion, die ein Plugin in deinem Namen ausgeführt hat – neueste zuerst.', 'settings.pluginActivity.empty': 'Noch keine Plugin-Aktivität.', @@ -606,6 +610,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Alles', 'settings.apiScopes.noneSelected': 'Wähle mindestens einen Bereich, sonst dürfte der Schlüssel gar nichts lesen.', 'settings.apiScopes.limited': '{count} von {total}', + 'settings.apiScopes.limited.one': '{count} von {total}', 'settings.apiScopes.trips': 'Reisen', 'settings.apiScopes.days': 'Tage', 'settings.apiScopes.places': 'Orte', diff --git a/shared/src/i18n/de/tours.ts b/shared/src/i18n/de/tours.ts index 93be51b2f..5e60998b2 100644 --- a/shared/src/i18n/de/tours.ts +++ b/shared/src/i18n/de/tours.ts @@ -68,6 +68,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Wegpunkte', 'tours.planner.waypointLabel': 'Wegpunkt {n}', 'tours.durationMinutes': '{count} Min.', + 'tours.durationMinutes.one': '{count} Min.', 'tours.planner.empty': 'Setze mindestens zwei Punkte, um eine Wanderroute zu berechnen.', 'tours.planner.start': 'Start', 'tours.planner.via': 'Zwischenstopp', diff --git a/shared/src/i18n/de/trip.ts b/shared/src/i18n/de/trip.ts index 502322658..0f5b343e2 100644 --- a/shared/src/i18n/de/trip.ts +++ b/shared/src/i18n/de/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} Umstiege', 'transit.transfers.one': '{count} Umstieg', 'transit.min': '{count} Min.', + 'transit.min.one': '{count} Min.', 'transit.stops': '{count} Halte', 'transit.stops.one': '{count} Halt', 'transit.walkTo': 'Fußweg zu {name}', diff --git a/shared/src/i18n/de/vacay.ts b/shared/src/i18n/de/vacay.ts index 7f9713df4..17767bea6 100644 --- a/shared/src/i18n/de/vacay.ts +++ b/shared/src/i18n/de/vacay.ts @@ -90,6 +90,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Resturlaub automatisch ins Folgejahr übertragen', 'vacay.carriedOverPrevPeriod': 'aus der Vorperiode', 'vacay.compUsedCount': '{count} Ausgleich', + 'vacay.compUsedCount.one': '{count} Ausgleich', 'vacay.yearType': 'Urlaubsjahr', 'vacay.yearTypeHint': 'Wann dein Urlaubsjahr beginnt — Anspruch, Verbrauch und Übertrag richten sich danach', 'vacay.yearTypeCalendar': 'Kalenderjahr', diff --git a/shared/src/i18n/en/admin.ts b/shared/src/i18n/en/admin.ts index 418e71192..6b20ba549 100644 --- a/shared/src/i18n/en/admin.ts +++ b/shared/src/i18n/en/admin.ts @@ -621,8 +621,10 @@ const admin: TranslationStrings = { 'admin.plugins.cap.events': 'Reacts to activity', 'admin.plugins.cap.requiresAddon': 'Requires {addon}', 'admin.plugins.cap.dependsOn': 'Needs {id} {version}', - 'admin.plugins.dep.addonDisabledToast': 'Enable the required addon(s) first: {addons}', - 'admin.plugins.dep.autoEnabled': 'Enabled required plugin(s) first: {plugins}', + 'admin.plugins.dep.addonDisabledToast': 'Enable the required addons first: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Enable the required addon first: {addons}', + 'admin.plugins.dep.autoEnabled': 'Enabled the required plugins first: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Enabled the required plugin first: {plugins}', 'admin.plugins.dep.downloaded': 'Downloaded {id}', 'admin.plugins.dep.resolveTitle': 'Missing dependencies', 'admin.plugins.dep.resolveBody': '“{name}” needs these plugins installed before it can be enabled.', @@ -750,6 +752,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Refresh', 'admin.audit.loadMore': 'Load more', 'admin.audit.showing': '{count} loaded · {total} total', + 'admin.audit.showing.one': '{count} loaded · {total} total', 'admin.audit.col.time': 'Time', 'admin.audit.col.user': 'User', 'admin.audit.col.action': 'Action', diff --git a/shared/src/i18n/en/collab.ts b/shared/src/i18n/en/collab.ts index 6deb92299..fb6baacab 100644 --- a/shared/src/i18n/en/collab.ts +++ b/shared/src/i18n/en/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Load older messages', 'collab.chat.justNow': 'just now', 'collab.chat.minutesAgo': '{n}m ago', + 'collab.chat.minutesAgo.one': '{n}m ago', 'collab.chat.hoursAgo': '{n}h ago', + 'collab.chat.hoursAgo.one': '{n}h ago', 'collab.notes.title': 'Notes', 'collab.notes.new': 'New Note', 'collab.notes.empty': 'No notes yet', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Pin', 'collab.notes.unpin': 'Unpin', 'collab.notes.daysAgo': '{n}d ago', + 'collab.notes.daysAgo.one': '{n}d ago', 'collab.notes.categorySettings': 'Manage Categories', 'collab.notes.create': 'Create', 'collab.notes.website': 'Website', diff --git a/shared/src/i18n/en/collection.ts b/shared/src/i18n/en/collection.ts index ba67b1c79..d45050e08 100644 --- a/shared/src/i18n/en/collection.ts +++ b/shared/src/i18n/en/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Save {count} to a list', + 'collections.saveNToList.one': 'Save {count} to a list', 'collections.addedNToList': 'Saved {count} to {name}', + 'collections.addedNToList.one': 'Saved {count} to {name}', 'collections.noOwnLists': 'You have no lists yet', 'collections.saveToListHint': 'Duplicates are skipped automatically', 'collections.role.label': 'Role', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Move to list', 'collections.duplicateToList': 'Duplicate to list', 'collections.moveToListTitle': 'Move {count} to another list', + 'collections.moveToListTitle.one': 'Move {count} to another list', 'collections.duplicateToListTitle': 'Duplicate {count} to another list', + 'collections.duplicateToListTitle.one': 'Duplicate {count} to another list', 'collections.noOtherLists': 'No other lists yet', 'collections.movedCount': 'Moved {count} places', 'collections.movedCount.one': 'Moved {count} place', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} selected', 'collections.importSelectedCount.one': '{count} selected', 'collections.importAction': 'Import {count}', + 'collections.importAction.one': 'Import {count}', 'collections.importEmptyTrip': 'This trip has no places yet', 'collections.importNothingNew': 'Everything from this trip is already on this list', 'collections.importDone': '{count} places added', @@ -115,6 +120,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Copy to trip', 'collections.copyToTripTitle': 'Copy to trip', 'collections.copyN': 'Copy {count} to trip', + 'collections.copyN.one': 'Copy to trip', 'collections.copyToTripSearch': 'Search trips', 'collections.searchLists': 'Search lists', 'collections.copyToTripConfirm': 'Copy', @@ -150,6 +156,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Removed from collection', 'collections.picker.title': 'Saved places', 'collections.picker.showMore': 'Show {count} more', + 'collections.picker.showMore.one': 'Show {count} more', 'collections.picker.search': 'Search your saved places', 'collections.picker.empty': 'No saved places to add', 'collections.picker.hint': 'Pick a place from your collections', @@ -172,6 +179,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{count} places added to {name}', 'collections.file.doneInto.one': '{count} place added to {name}', 'collections.file.doneIntoDuplicates': '{count} added to {name}, {duplicates} were already there', + 'collections.file.doneIntoDuplicates.one': '{count} added to {name}, {duplicates} were already there', 'collections.file.doneIntoNothing': 'Every place in the file is already in {name}', 'collections.file.change': 'Change', 'collections.file.labelCount': '{count} labels', @@ -200,6 +208,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'That is not a GPX file.', 'collections.file.errorTooManyPlaces': 'That file has more than {count} places. Split it and import the parts one at a time.', + 'collections.file.errorTooManyPlaces.one': + 'That file has more than {count} place. Split it and import the parts one at a time.', 'collections.share.title': 'Share list', 'collections.share.titleNamed': 'Share “{name}”', diff --git a/shared/src/i18n/en/common.ts b/shared/src/i18n/en/common.ts index 004fa17ff..00b0e8f8d 100644 --- a/shared/src/i18n/en/common.ts +++ b/shared/src/i18n/en/common.ts @@ -45,7 +45,9 @@ const common: TranslationStrings = { 'common.saving': 'Saving...', 'common.justNow': 'just now', 'common.hoursAgo': '{count}h ago', + 'common.hoursAgo.one': '{count}h ago', 'common.daysAgo': '{count}d ago', + 'common.daysAgo.one': '{count}d ago', 'common.saved': 'Saved', 'common.update': 'Update', 'common.change': 'Change', diff --git a/shared/src/i18n/en/dashboard.ts b/shared/src/i18n/en/dashboard.ts index 60f6eb918..0e44e6242 100644 --- a/shared/src/i18n/en/dashboard.ts +++ b/shared/src/i18n/en/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} trips ({archived} archived)', 'dashboard.subtitle.trips.one': '{count} trip ({archived} archived)', 'dashboard.subtitle.empty': 'Start your first trip', - 'dashboard.subtitle.activeOne': '{count} active trip', - 'dashboard.subtitle.activeMany': '{count} active trips', + 'dashboard.subtitle.active': '{count} active trips', + 'dashboard.subtitle.active.one': '{count} active trip', 'dashboard.subtitle.archivedSuffix': ' · {count} archived', 'dashboard.subtitle.archivedSuffix.one': ' · {count} archived', 'dashboard.newTrip': 'New Trip', @@ -127,6 +127,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Remove days?', 'dashboard.shrinkIntro': 'Saving the new dates removes these days:', 'dashboard.shrinkMoreDays': '+{count} more', + 'dashboard.shrinkMoreDays.one': '+{count} more', 'dashboard.shrinkLastDays': 'The last days go, not the first', 'dashboard.shrinkLastDaysHint': 'Day plans move with the new dates, so it is always the last days of your plan that go, also when the start moved.', diff --git a/shared/src/i18n/en/dawarich.ts b/shared/src/i18n/en/dawarich.ts index e78a28548..1e0411fdc 100644 --- a/shared/src/i18n/en/dawarich.ts +++ b/shared/src/i18n/en/dawarich.ts @@ -93,6 +93,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Dismissed', 'dawarich.suggestions.restore': 'Put back', 'dawarich.suggestions.showHandled': 'Show {count} already dealt with', + 'dawarich.suggestions.showHandled.one': 'Show {count} already dealt with', 'dawarich.suggestions.hideHandled': 'Hide the ones already dealt with', 'dawarich.suggestions.matchesWish': 'On your wishlist: {name}', 'dawarich.suggestions.acceptedAs.place': 'Added as a place', @@ -144,6 +145,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Nothing on your wishlist turned up in your recordings.', 'dawarich.bucket.alreadyVisited': 'Already ticked off', 'dawarich.bucket.confirm': 'Tick off {count}', + 'dawarich.bucket.confirm.one': 'Tick off {count}', 'dawarich.bucket.confirmed': '{count} wishes ticked off', 'dawarich.bucket.confirmed.one': '{count} wish ticked off', 'dawarich.bucket.skipped': '{count} entries have no coordinates and could not be checked.', diff --git a/shared/src/i18n/en/dayplan.ts b/shared/src/i18n/en/dayplan.ts index 2e4b91570..c9385e1bd 100644 --- a/shared/src/i18n/en/dayplan.ts +++ b/shared/src/i18n/en/dayplan.ts @@ -104,11 +104,15 @@ const dayplan: TranslationStrings = { 'Every place comes off this day. The places stay in the trip, and the day keeps its notes and bookings.', 'dayplan.deleteDayEmpty': 'Nothing is planned on this day.', 'dayplan.impactPlaces': 'Planned places: {count}', + 'dayplan.impactPlaces.one': 'Planned places: {count}', 'dayplan.impactPlacesHint': 'They stay in the place list.', 'dayplan.impactNotes': 'Notes: {count}', + 'dayplan.impactNotes.one': 'Notes: {count}', 'dayplan.impactTexts': 'Day titles and descriptions: {count}', + 'dayplan.impactTexts.one': 'Day titles and descriptions: {count}', 'dayplan.impactDeletedHint': 'Deleted as well.', 'dayplan.impactBookings': 'Bookings: {count}', + 'dayplan.impactBookings.one': 'Bookings: {count}', 'dayplan.impactStay': 'Stay at {name}', 'dayplan.deleteDayBookingsHint': 'They stay under Bookings, without a day.', 'dayplan.deleteDayStayHint': 'Checks in or out on this day and is cancelled.', @@ -119,8 +123,10 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Checks in or out on this day and is cancelled, together with the booking “{booking}” and its expense of {amount}.', 'dayplan.deleteDayShift': 'Later days: {count}', + 'dayplan.deleteDayShift.one': 'Later days: {count}', 'dayplan.deleteDayShiftHint': 'Each moves one date earlier.', 'dayplan.deleteDayShiftBookingsHint': 'Each moves one date earlier. Bookings moving along: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': 'Each moves one date earlier. Bookings moving along: {count}', 'dayplan.deleteDayShrink': 'Trip now ends on {date}', 'dayplan.deleteDayShrinkHint': 'There is no day without a date to take over the last date.', 'dayplan.impactStayShorter': 'Stay at {name}: one night less', diff --git a/shared/src/i18n/en/docsync.ts b/shared/src/i18n/en/docsync.ts index 70fd39044..9d97c26c2 100644 --- a/shared/src/i18n/en/docsync.ts +++ b/shared/src/i18n/en/docsync.ts @@ -70,6 +70,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Moved out of the folder', 'docsync.conflict.resolve': 'Resolve {count}', + 'docsync.conflict.resolve.one': 'Resolve {count}', 'docsync.conflict.title': 'Both copies changed', 'docsync.conflict.keepTrek': 'Keep the TREK version', diff --git a/shared/src/i18n/en/journey.ts b/shared/src/i18n/en/journey.ts index 38694d71e..9bd394517 100644 --- a/shared/src/i18n/en/journey.ts +++ b/shared/src/i18n/en/journey.ts @@ -672,6 +672,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Suggestion dismissed', 'journey.suggestions.restore': 'Bring back dismissed suggestions', 'journey.suggestions.restoreCount': 'Dismissed suggestions ({count})', + 'journey.suggestions.restoreCount.one': 'Dismissed suggestions ({count})', 'journey.suggestions.restored': '{count} suggestions are back', 'journey.suggestions.restored.one': '{count} suggestion is back', 'journey.detail.addOnThisDay': 'Add an entry on this day', diff --git a/shared/src/i18n/en/memories.ts b/shared/src/i18n/en/memories.ts index 2b9c69f5a..829443da3 100644 --- a/shared/src/i18n/en/memories.ts +++ b/shared/src/i18n/en/memories.ts @@ -61,6 +61,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Share with trip members?', 'memories.confirmShareHint': '{count} photos will be visible to all members of this trip. You can make individual photos private later.', + 'memories.confirmShareHint.one': + '{count} photo will be visible to all members of this trip. You can make it private later.', 'memories.confirmShareButton': 'Share photos', 'memories.error.loadAlbums': 'Failed to load albums', 'memories.error.linkAlbum': 'Failed to link album', diff --git a/shared/src/i18n/en/packing.ts b/shared/src/i18n/en/packing.ts index 9aa1303c9..b61470682 100644 --- a/shared/src/i18n/en/packing.ts +++ b/shared/src/i18n/en/packing.ts @@ -31,13 +31,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'A Markdown list works too: a heading names the category, "- [ ]" and "- [x]" become items, and "3x" in front of a name sets the quantity.', 'packing.importAction': 'Import {count}', + 'packing.importAction.one': 'Import {count}', 'packing.importSuccess': '{count} items imported', 'packing.importSuccess.one': '{count} item imported', 'packing.importError': 'Import failed', 'packing.importEmpty': 'No items to import', 'packing.progress': '{packed} of {total} packed ({percent}%)', 'packing.clearChecked': 'Remove {count} checked', + 'packing.clearChecked.one': 'Remove {count} checked', 'packing.clearCheckedShort': 'Remove {count}', + 'packing.clearCheckedShort.one': 'Remove {count}', 'packing.allPacked': 'All packed!', 'packing.addPlaceholder': 'Add new item...', 'packing.categoryPlaceholder': 'List...', @@ -88,6 +91,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'No one else on this trip yet', 'packing.takenCareOf': 'by {name}', 'packing.sharedWithCount': 'shared with {count}', + 'packing.sharedWithCount.one': 'shared with {count}', 'packing.broughtBy': 'brought by {name}', 'packing.alsoBring': 'I can bring that too', 'packing.alsoBringingStop': "I'm not bringing it", diff --git a/shared/src/i18n/en/photos.ts b/shared/src/i18n/en/photos.ts index f35a907ae..ccba6f9d5 100644 --- a/shared/src/i18n/en/photos.ts +++ b/shared/src/i18n/en/photos.ts @@ -15,7 +15,8 @@ const photos: TranslationStrings = { 'photos.clickToSelect': 'or click to select', 'photos.linkPlace': 'Link Place', 'photos.noPlace': 'No Place', - 'photos.uploadN': '{n} photo(s) upload', + 'photos.uploadN': 'Upload {n} photos', + 'photos.uploadN.one': 'Upload {n} photo', 'photos.linkDay': 'Link Day', 'photos.noDay': 'No Day', 'photos.dayLabel': 'Day {number}', diff --git a/shared/src/i18n/en/reservations.ts b/shared/src/i18n/en/reservations.ts index f129ee3c0..e600be319 100644 --- a/shared/src/i18n/en/reservations.ts +++ b/shared/src/i18n/en/reservations.ts @@ -182,6 +182,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Other flights', 'reservations.airtrail.empty': 'No flights found in your AirTrail account.', 'reservations.airtrail.importCta': 'Import {count}', + 'reservations.airtrail.importCta.one': 'Import {count}', 'reservations.airtrail.joinConnection': 'Import as one flight with a layover in {stops}', 'reservations.costsLabel': 'Costs', 'reservations.createExpense': 'Create expense', diff --git a/shared/src/i18n/en/roadtrip.ts b/shared/src/i18n/en/roadtrip.ts index a714f3469..58c3a831a 100644 --- a/shared/src/i18n/en/roadtrip.ts +++ b/shared/src/i18n/en/roadtrip.ts @@ -192,6 +192,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Nothing on the way matches “{name}”.', 'roadtrip.poi.noneMatchFilters': 'Nothing on the way matches these filters.', 'roadtrip.poi.foundFiltered': '{count} of {total} on the way', + 'roadtrip.poi.foundFiltered.one': '{count} of {total} on the way', 'roadtrip.poi.truncated': '{count} stretches had more than fits in one answer. Narrow the corridor to see the rest.', 'roadtrip.poi.truncated.one': '{count} stretch had more than fits in one answer. Narrow the corridor to see the rest.', 'roadtrip.poi.search': 'Search', diff --git a/shared/src/i18n/en/settings.ts b/shared/src/i18n/en/settings.ts index 48009a2c9..1ee65e059 100644 --- a/shared/src/i18n/en/settings.ts +++ b/shared/src/i18n/en/settings.ts @@ -577,9 +577,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Offline', 'settings.offline.banner.forced': 'Offline mode', 'settings.offline.banner.queued': 'Offline · {count} queued', + 'settings.offline.banner.queued.one': 'Offline · {count} queued', 'settings.offline.banner.syncing': 'Syncing {count}…', + 'settings.offline.banner.syncing.one': 'Syncing {count}…', 'settings.offline.banner.failed': 'Failed to sync: {count}', + 'settings.offline.banner.failed.one': 'Failed to sync: {count}', 'settings.offline.banner.conflicts': 'Conflicts: {count}', + 'settings.offline.banner.conflicts.one': 'Conflicts: {count}', 'settings.alwaysShowRoutes': 'Always show booking routes', 'settings.alwaysShowRoutesHint': 'Automatically draw the route for every flight, train and other booking on the map — no need to switch it on per item.', @@ -592,6 +596,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Everything', 'settings.apiScopes.noneSelected': 'Pick at least one area, or the key could not read anything.', 'settings.apiScopes.limited': '{count} of {total}', + 'settings.apiScopes.limited.one': '{count} of {total}', 'settings.apiScopes.trips': 'Trips', 'settings.apiScopes.days': 'Days', 'settings.apiScopes.places': 'Places', diff --git a/shared/src/i18n/en/tours.ts b/shared/src/i18n/en/tours.ts index dd47b362a..095c7f0f1 100644 --- a/shared/src/i18n/en/tours.ts +++ b/shared/src/i18n/en/tours.ts @@ -67,6 +67,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Waypoints', 'tours.planner.waypointLabel': 'Waypoint {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', 'tours.planner.empty': 'Add at least two points to calculate a walking route.', 'tours.planner.start': 'Start', 'tours.planner.via': 'Via', diff --git a/shared/src/i18n/en/trip.ts b/shared/src/i18n/en/trip.ts index bff824069..7ac7ec698 100644 --- a/shared/src/i18n/en/trip.ts +++ b/shared/src/i18n/en/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} transfers', 'transit.transfers.one': '{count} transfer', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', 'transit.stops': '{count} stops', 'transit.stops.one': '{count} stop', 'transit.walkTo': 'Walk to {name}', diff --git a/shared/src/i18n/en/vacay.ts b/shared/src/i18n/en/vacay.ts index 7684b2b79..8cd13c3bf 100644 --- a/shared/src/i18n/en/vacay.ts +++ b/shared/src/i18n/en/vacay.ts @@ -89,6 +89,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Automatically carry remaining vacation days into the next year', 'vacay.carriedOverPrevPeriod': 'from previous period', 'vacay.compUsedCount': '{count} comp / flex', + 'vacay.compUsedCount.one': '{count} comp / flex', 'vacay.yearType': 'Vacation year', 'vacay.yearTypeHint': 'When your leave year starts — entitlement, usage and carry-over follow it', 'vacay.yearTypeCalendar': 'Calendar', diff --git a/shared/src/i18n/es/admin.ts b/shared/src/i18n/es/admin.ts index e2cfcba05..7bab698af 100644 --- a/shared/src/i18n/es/admin.ts +++ b/shared/src/i18n/es/admin.ts @@ -575,7 +575,9 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Requiere {addon}', 'admin.plugins.cap.dependsOn': 'Necesita {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Activa primero los complementos necesarios: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Activa primero el complemento necesario: {addons}', 'admin.plugins.dep.autoEnabled': 'Se activaron primero los plugins necesarios: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Se activó primero el plugin necesario: {plugins}', 'admin.plugins.dep.downloaded': '{id} descargado', 'admin.plugins.dep.resolveTitle': 'Dependencias faltantes', 'admin.plugins.dep.resolveBody': '«{name}» necesita que estos plugins estén instalados antes de poder activarse.', @@ -688,6 +690,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Actualizar', 'admin.audit.loadMore': 'Cargar más', 'admin.audit.showing': '{count} cargados · {total} en total', + 'admin.audit.showing.one': '{count} cargado · {total} en total', 'admin.audit.col.time': 'Fecha y hora', 'admin.audit.col.user': 'Usuario', 'admin.audit.col.action': 'Acción', diff --git a/shared/src/i18n/es/collab.ts b/shared/src/i18n/es/collab.ts index c83f97c59..704dc3269 100644 --- a/shared/src/i18n/es/collab.ts +++ b/shared/src/i18n/es/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Cargar mensajes anteriores', 'collab.chat.justNow': 'justo ahora', 'collab.chat.minutesAgo': 'hace {n} min', + 'collab.chat.minutesAgo.one': 'hace {n} min', 'collab.chat.hoursAgo': 'hace {n} h', + 'collab.chat.hoursAgo.one': 'hace {n} h', 'collab.notes.title': 'Notas', 'collab.notes.new': 'Nueva nota', 'collab.notes.empty': 'Aún no hay notas', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Fijar', 'collab.notes.unpin': 'Desfijar', 'collab.notes.daysAgo': 'hace {n} d', + 'collab.notes.daysAgo.one': 'hace {n} d', 'collab.notes.categorySettings': 'Gestionar categorías', 'collab.notes.create': 'Crear', 'collab.notes.website': 'Sitio web', diff --git a/shared/src/i18n/es/collection.ts b/shared/src/i18n/es/collection.ts index 283d32724..dae52bca2 100644 --- a/shared/src/i18n/es/collection.ts +++ b/shared/src/i18n/es/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Guardar {count} en una lista', + 'collections.saveNToList.one': 'Guardar {count} en una lista', 'collections.addedNToList': '{count} guardados en {name}', + 'collections.addedNToList.one': '{count} guardado en {name}', 'collections.noOwnLists': 'Aún no tienes listas', 'collections.saveToListHint': 'Los duplicados se omiten automáticamente', 'collections.role.label': 'Rol', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Mover a lista', 'collections.duplicateToList': 'Duplicar en lista', 'collections.moveToListTitle': 'Mover {count} a otra lista', + 'collections.moveToListTitle.one': 'Mover {count} a otra lista', 'collections.duplicateToListTitle': 'Duplicar {count} en otra lista', + 'collections.duplicateToListTitle.one': 'Duplicar {count} en otra lista', 'collections.noOtherLists': 'Aún no hay otras listas', 'collections.movedCount': '{count} lugares movidos', 'collections.movedCount.one': '{count} lugar movido', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} seleccionados', 'collections.importSelectedCount.one': '{count} seleccionado', 'collections.importAction': 'Importar {count}', + 'collections.importAction.one': 'Importar {count}', 'collections.importEmptyTrip': 'Este viaje aún no tiene lugares', 'collections.importNothingNew': 'Todo este viaje ya está en la lista', 'collections.importDone': 'Se añadieron {count} lugares', @@ -115,6 +120,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Copiar al viaje', 'collections.copyToTripTitle': 'Copiar al viaje', 'collections.copyN': 'Copiar {count} al viaje', + 'collections.copyN.one': 'Copiar al viaje', 'collections.copyToTripSearch': 'Buscar viajes', 'collections.searchLists': 'Buscar listas', 'collections.copyToTripConfirm': 'Copiar', @@ -150,6 +156,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Quitado de la colección', 'collections.picker.title': 'Lugares guardados', 'collections.picker.showMore': 'Mostrar {count} más', + 'collections.picker.showMore.one': 'Mostrar {count} más', 'collections.picker.search': 'Busca en tus lugares guardados', 'collections.picker.empty': 'No hay lugares guardados para añadir', 'collections.picker.hint': 'Elige un lugar de tus colecciones', @@ -172,6 +179,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{count} lugares añadidos a {name}', 'collections.file.doneInto.one': '{count} lugar añadido a {name}', 'collections.file.doneIntoDuplicates': '{count} añadidos a {name}, {duplicates} ya estaban', + 'collections.file.doneIntoDuplicates.one': '{count} añadido a {name}, {duplicates} ya estaban', 'collections.file.doneIntoNothing': 'Todos los lugares del archivo ya están en {name}', 'collections.file.change': 'Cambiar', 'collections.file.labelCount': '{count} etiquetas', @@ -203,6 +211,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Ese no es un archivo GPX.', 'collections.file.errorTooManyPlaces': 'Ese archivo tiene más de {count} lugares. Divídelo e importa las partes de una en una.', + 'collections.file.errorTooManyPlaces.one': + 'Ese archivo tiene más de {count} lugar. Divídelo e importa las partes de una en una.', 'collections.share.title': 'Compartir lista', 'collections.share.titleNamed': 'Compartir «{name}»', diff --git a/shared/src/i18n/es/common.ts b/shared/src/i18n/es/common.ts index f79e6b99b..92a1dbba7 100644 --- a/shared/src/i18n/es/common.ts +++ b/shared/src/i18n/es/common.ts @@ -55,7 +55,9 @@ const common: TranslationStrings = { 'common.copied': 'Copiado', 'common.justNow': 'justo ahora', 'common.hoursAgo': 'hace {count}h', + 'common.hoursAgo.one': 'hace {count}h', 'common.daysAgo': 'hace {count}d', + 'common.daysAgo.one': 'hace {count}d', 'common.datepicker.prevMonth': 'Previous month', // en-fallback 'common.datepicker.nextMonth': 'Next month', // en-fallback 'common.datepicker.prevYear': 'Previous year', // en-fallback diff --git a/shared/src/i18n/es/dashboard.ts b/shared/src/i18n/es/dashboard.ts index 042e86cfe..b5365009a 100644 --- a/shared/src/i18n/es/dashboard.ts +++ b/shared/src/i18n/es/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} viajes (archivados: {archived})', 'dashboard.subtitle.trips.one': '{count} viaje (archivados: {archived})', 'dashboard.subtitle.empty': 'Empieza tu primer viaje', - 'dashboard.subtitle.activeOne': '{count} viaje activo', - 'dashboard.subtitle.activeMany': '{count} viajes activos', + 'dashboard.subtitle.active': '{count} viajes activos', + 'dashboard.subtitle.active.one': '{count} viaje activo', 'dashboard.subtitle.archivedSuffix': ' · {count} archivados', 'dashboard.subtitle.archivedSuffix.one': ' · {count} archivado', 'dashboard.newTrip': 'Nuevo viaje', @@ -114,6 +114,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': '¿Quitar días?', 'dashboard.shrinkIntro': 'Al guardar las nuevas fechas se quitan estos días:', 'dashboard.shrinkMoreDays': '+{count} más', + 'dashboard.shrinkMoreDays.one': '+{count} más', 'dashboard.shrinkLastDays': 'Se quitan los últimos días, no los primeros', 'dashboard.shrinkLastDaysHint': 'Los planes de cada día se mueven con las nuevas fechas, así que siempre se quitan los últimos días del plan, también cuando cambia el inicio.', diff --git a/shared/src/i18n/es/dawarich.ts b/shared/src/i18n/es/dawarich.ts index 91570124a..e0081434d 100644 --- a/shared/src/i18n/es/dawarich.ts +++ b/shared/src/i18n/es/dawarich.ts @@ -95,6 +95,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Descartado', 'dawarich.suggestions.restore': 'Devolver', 'dawarich.suggestions.showHandled': 'Mostrar {count} ya resueltas', + 'dawarich.suggestions.showHandled.one': 'Mostrar {count} ya resuelta', 'dawarich.suggestions.hideHandled': 'Ocultar las ya resueltas', 'dawarich.suggestions.matchesWish': 'En tu lista de deseos: {name}', 'dawarich.suggestions.acceptedAs.place': 'Añadido como lugar', @@ -146,6 +147,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'No apareció nada de tu lista de deseos en tus grabaciones.', 'dawarich.bucket.alreadyVisited': 'Ya tachado', 'dawarich.bucket.confirm': 'Tachar {count}', + 'dawarich.bucket.confirm.one': 'Tachar {count}', 'dawarich.bucket.confirmed': '{count} deseos tachados', 'dawarich.bucket.confirmed.one': '{count} deseo tachado', 'dawarich.bucket.skipped': '{count} entradas no tienen coordenadas y no se pudieron comprobar.', diff --git a/shared/src/i18n/es/dayplan.ts b/shared/src/i18n/es/dayplan.ts index 1d98206f4..7eba3eef5 100644 --- a/shared/src/i18n/es/dayplan.ts +++ b/shared/src/i18n/es/dayplan.ts @@ -104,11 +104,15 @@ const dayplan: TranslationStrings = { 'Todos los lugares salen de este día. Los lugares siguen en el viaje, y el día conserva sus notas y reservas.', 'dayplan.deleteDayEmpty': 'No hay nada planificado este día.', 'dayplan.impactPlaces': 'Lugares planificados: {count}', + 'dayplan.impactPlaces.one': 'Lugares planificados: {count}', 'dayplan.impactPlacesHint': 'Se quedan en la lista de lugares.', 'dayplan.impactNotes': 'Notas: {count}', + 'dayplan.impactNotes.one': 'Notas: {count}', 'dayplan.impactTexts': 'Títulos y descripciones del día: {count}', + 'dayplan.impactTexts.one': 'Títulos y descripciones del día: {count}', 'dayplan.impactDeletedHint': 'También se eliminan.', 'dayplan.impactBookings': 'Reservas: {count}', + 'dayplan.impactBookings.one': 'Reservas: {count}', 'dayplan.impactStay': 'Estancia en {name}', 'dayplan.deleteDayBookingsHint': 'Se quedan en Reservas, sin día.', 'dayplan.deleteDayStayHint': 'La entrada o la salida es este día, así que la estancia se cancela.', @@ -119,8 +123,11 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'La entrada o la salida es este día, así que la estancia se cancela, junto con la reserva «{booking}» y su gasto de {amount}.', 'dayplan.deleteDayShift': 'Días posteriores: {count}', + 'dayplan.deleteDayShift.one': 'Días posteriores: {count}', 'dayplan.deleteDayShiftHint': 'Cada uno pasa a la fecha anterior.', 'dayplan.deleteDayShiftBookingsHint': 'Cada uno pasa a la fecha anterior. Reservas que se mueven con ellos: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Cada uno pasa a la fecha anterior. Reservas que se mueven con ellos: {count}', 'dayplan.deleteDayShrink': 'El viaje termina ahora el {date}', 'dayplan.deleteDayShrinkHint': 'No queda ningún día sin fecha que tome la última fecha.', 'dayplan.impactStayShorter': 'Estancia en {name}: una noche menos', diff --git a/shared/src/i18n/es/docsync.ts b/shared/src/i18n/es/docsync.ts index 8ec90ceb7..112989cf1 100644 --- a/shared/src/i18n/es/docsync.ts +++ b/shared/src/i18n/es/docsync.ts @@ -71,6 +71,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Fuera de la carpeta', 'docsync.conflict.resolve': 'Resolver {count}', + 'docsync.conflict.resolve.one': 'Resolver {count}', 'docsync.conflict.title': 'Las dos copias han cambiado', 'docsync.conflict.keepTrek': 'Conservar la versión de TREK', diff --git a/shared/src/i18n/es/journey.ts b/shared/src/i18n/es/journey.ts index 135344d5a..6691d66ae 100644 --- a/shared/src/i18n/es/journey.ts +++ b/shared/src/i18n/es/journey.ts @@ -675,6 +675,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Sugerencia descartada', 'journey.suggestions.restore': 'Recuperar las sugerencias descartadas', 'journey.suggestions.restoreCount': 'Sugerencias descartadas ({count})', + 'journey.suggestions.restoreCount.one': 'Sugerencias descartadas ({count})', 'journey.suggestions.restored': '{count} sugerencias han vuelto', 'journey.suggestions.restored.one': '{count} sugerencia ha vuelto', 'journey.detail.addOnThisDay': 'Añadir una entrada en este día', diff --git a/shared/src/i18n/es/memories.ts b/shared/src/i18n/es/memories.ts index bf1387763..8c1f182f4 100644 --- a/shared/src/i18n/es/memories.ts +++ b/shared/src/i18n/es/memories.ts @@ -64,6 +64,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': '¿Compartir con los miembros del viaje?', 'memories.confirmShareHint': '{count} fotos serán visibles para todos los miembros de este viaje. Puedes hacer fotos individuales privadas más tarde.', + 'memories.confirmShareHint.one': + '{count} foto será visible para todos los miembros de este viaje. Puedes hacerla privada más tarde.', 'memories.confirmShareButton': 'Compartir fotos', 'memories.error.loadAlbums': 'Error al cargar los álbumes', 'memories.error.linkAlbum': 'Error al vincular el álbum', diff --git a/shared/src/i18n/es/packing.ts b/shared/src/i18n/es/packing.ts index 510004e64..a75ebca7b 100644 --- a/shared/src/i18n/es/packing.ts +++ b/shared/src/i18n/es/packing.ts @@ -31,13 +31,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'También sirve una lista en Markdown: un encabezado indica la categoría, "- [ ]" y "- [x]" se convierten en artículos y "3x" delante de un nombre fija la cantidad.', 'packing.importAction': 'Importar {count}', + 'packing.importAction.one': 'Importar {count}', 'packing.importSuccess': '{count} elementos importados', 'packing.importSuccess.one': '{count} elemento importado', 'packing.importError': 'Error al importar', 'packing.importEmpty': 'Sin elementos para importar', 'packing.progress': '{packed} de {total} preparados ({percent}%)', 'packing.clearChecked': 'Eliminar {count} marcados', + 'packing.clearChecked.one': 'Eliminar {count} marcado', 'packing.clearCheckedShort': 'Eliminar {count}', + 'packing.clearCheckedShort.one': 'Eliminar {count}', 'packing.allPacked': '¡Todo preparado!', 'packing.addPlaceholder': 'Añadir nuevo elemento...', 'packing.categoryPlaceholder': 'Lista...', @@ -97,6 +100,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'Nadie más en este viaje todavía', 'packing.takenCareOf': 'por {name}', 'packing.sharedWithCount': 'compartido con {count}', + 'packing.sharedWithCount.one': 'compartido con {count}', 'packing.broughtBy': 'lo trae {name}', 'packing.alsoBring': 'Yo también puedo llevarlo', 'packing.alsoBringingStop': 'No lo llevo', diff --git a/shared/src/i18n/es/photos.ts b/shared/src/i18n/es/photos.ts index bb356b379..ffa60eac3 100644 --- a/shared/src/i18n/es/photos.ts +++ b/shared/src/i18n/es/photos.ts @@ -15,7 +15,8 @@ const photos: TranslationStrings = { 'photos.clickToSelect': 'o haz clic para seleccionar', 'photos.linkPlace': 'Vincular lugar', 'photos.noPlace': 'Sin lugar', - 'photos.uploadN': 'Subida de {n} foto(s)', + 'photos.uploadN': 'Subida de {n} fotos', + 'photos.uploadN.one': 'Subida de {n} foto', 'photos.linkDay': 'Vincular día', 'photos.noDay': 'Ningún día', 'photos.dayLabel': 'Día {number}', diff --git a/shared/src/i18n/es/reservations.ts b/shared/src/i18n/es/reservations.ts index 168777f2f..d37586211 100644 --- a/shared/src/i18n/es/reservations.ts +++ b/shared/src/i18n/es/reservations.ts @@ -181,6 +181,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Otros vuelos', 'reservations.airtrail.empty': 'No se encontraron vuelos en tu cuenta de AirTrail.', 'reservations.airtrail.importCta': 'Importar {count}', + 'reservations.airtrail.importCta.one': 'Importar {count}', 'reservations.airtrail.joinConnection': 'Importar como un solo vuelo con escala en {stops}', 'reservations.costsLabel': 'Costes', 'reservations.createExpense': 'Crear gasto', diff --git a/shared/src/i18n/es/roadtrip.ts b/shared/src/i18n/es/roadtrip.ts index 844d949c1..90cbb693e 100644 --- a/shared/src/i18n/es/roadtrip.ts +++ b/shared/src/i18n/es/roadtrip.ts @@ -199,6 +199,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Nada en la ruta coincide con «{name}».', 'roadtrip.poi.noneMatchFilters': 'Nada en el camino coincide con estos filtros.', 'roadtrip.poi.foundFiltered': '{count} de {total} en la ruta', + 'roadtrip.poi.foundFiltered.one': '{count} de {total} en la ruta', 'roadtrip.poi.truncated': 'En {count} tramos había más de lo que cabe en una respuesta: reduce el corredor para ver el resto.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/es/settings.ts b/shared/src/i18n/es/settings.ts index 56c7d18a2..3bcbbe06a 100644 --- a/shared/src/i18n/es/settings.ts +++ b/shared/src/i18n/es/settings.ts @@ -579,9 +579,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Offline', 'settings.offline.banner.forced': 'Modo offline', 'settings.offline.banner.queued': 'Offline · {count} en cola', + 'settings.offline.banner.queued.one': 'Offline · {count} en cola', 'settings.offline.banner.syncing': 'Sincronizando {count}…', + 'settings.offline.banner.syncing.one': 'Sincronizando {count}…', 'settings.offline.banner.failed': 'Error al sincronizar: {count}', + 'settings.offline.banner.failed.one': 'Error al sincronizar: {count}', 'settings.offline.banner.conflicts': 'Conflictos: {count}', + 'settings.offline.banner.conflicts.one': 'Conflictos: {count}', 'settings.pluginActivity.title': 'Actividad de plugins', 'settings.pluginActivity.description': 'Cada acción que un plugin realizó en tu nombre, las más recientes primero.', 'settings.pluginActivity.empty': 'Todavía no hay actividad de plugins.', @@ -603,6 +607,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Todo', 'settings.apiScopes.noneSelected': 'Elige al menos un área; si no, la clave no podría leer nada.', 'settings.apiScopes.limited': '{count} de {total}', + 'settings.apiScopes.limited.one': '{count} de {total}', 'settings.apiScopes.trips': 'Viajes', 'settings.apiScopes.days': 'Días', 'settings.apiScopes.places': 'Lugares', diff --git a/shared/src/i18n/es/tours.ts b/shared/src/i18n/es/tours.ts index d2c19b83f..adf8c33dc 100644 --- a/shared/src/i18n/es/tours.ts +++ b/shared/src/i18n/es/tours.ts @@ -68,6 +68,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Puntos de paso', 'tours.planner.waypointLabel': 'Punto de paso {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', 'tours.planner.empty': 'Añade al menos dos puntos para calcular una ruta a pie.', 'tours.planner.start': 'Inicio', 'tours.planner.via': 'Paso por', diff --git a/shared/src/i18n/es/trip.ts b/shared/src/i18n/es/trip.ts index 2cce38710..f9b760e87 100644 --- a/shared/src/i18n/es/trip.ts +++ b/shared/src/i18n/es/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} transbordos', 'transit.transfers.one': '{count} transbordo', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', 'transit.stops': '{count} paradas', 'transit.stops.one': '{count} parada', 'transit.walkTo': 'Camina hasta {name}', diff --git a/shared/src/i18n/es/vacay.ts b/shared/src/i18n/es/vacay.ts index d4824973c..acf0b84c8 100644 --- a/shared/src/i18n/es/vacay.ts +++ b/shared/src/i18n/es/vacay.ts @@ -84,6 +84,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Trasladar automáticamente los días restantes al año siguiente', 'vacay.carriedOverPrevPeriod': 'del periodo anterior', 'vacay.compUsedCount': '{count} compensación', + 'vacay.compUsedCount.one': '{count} compensación', 'vacay.yearType': 'Año de vacaciones', 'vacay.yearTypeHint': 'Cuándo empieza tu año de vacaciones — el derecho, los días usados y el arrastre se rigen por esa fecha', diff --git a/shared/src/i18n/et/admin.ts b/shared/src/i18n/et/admin.ts index 8814726d8..5a4256b7b 100644 --- a/shared/src/i18n/et/admin.ts +++ b/shared/src/i18n/et/admin.ts @@ -635,7 +635,9 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Vajab lisamoodulit {addon}', 'admin.plugins.cap.dependsOn': 'Vajab pluginat {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Luba esmalt vajalikud lisamoodulid: {addons}', - 'admin.plugins.dep.autoEnabled': 'Luba esmalt vajalikud pluginad: {plugins}', + 'admin.plugins.dep.addonDisabledToast.one': 'Luba esmalt vajalik lisamoodul: {addons}', + 'admin.plugins.dep.autoEnabled': 'Esmalt lubati vajalikud pluginad: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Esmalt lubati vajalik plugin: {plugins}', 'admin.plugins.dep.downloaded': '{id} alla laaditud', 'admin.plugins.dep.resolveTitle': 'Puuduvad sõltuvused', 'admin.plugins.dep.resolveBody': 'Enne plugina „{name}” lubamist tuleb paigaldada need pluginad.', @@ -765,6 +767,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Värskenda', 'admin.audit.loadMore': 'Laadi veel', 'admin.audit.showing': '{count} laaditud · kokku {total}', + 'admin.audit.showing.one': '{count} laaditud · kokku {total}', 'admin.audit.col.time': 'Aeg', 'admin.audit.col.user': 'Kasutaja', 'admin.audit.col.action': 'Toiming', diff --git a/shared/src/i18n/et/collab.ts b/shared/src/i18n/et/collab.ts index 0b52acbaf..df6eae0ff 100644 --- a/shared/src/i18n/et/collab.ts +++ b/shared/src/i18n/et/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Laadi vanemad sõnumid', 'collab.chat.justNow': 'äsja', 'collab.chat.minutesAgo': '{n} min tagasi', + 'collab.chat.minutesAgo.one': '{n} min tagasi', 'collab.chat.hoursAgo': '{n} tundi tagasi', + 'collab.chat.hoursAgo.one': '{n} tund tagasi', 'collab.notes.title': 'Märkmed', 'collab.notes.new': 'Uus märge', 'collab.notes.empty': 'Märkmeid veel pole', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Kinnita', 'collab.notes.unpin': 'Vabasta', 'collab.notes.daysAgo': '{n} päeva tagasi', + 'collab.notes.daysAgo.one': '{n} päev tagasi', 'collab.notes.categorySettings': 'Halda kategooriaid', 'collab.notes.create': 'Loo', 'collab.notes.website': 'Veebisait', diff --git a/shared/src/i18n/et/collection.ts b/shared/src/i18n/et/collection.ts index 849802f61..cfa309052 100644 --- a/shared/src/i18n/et/collection.ts +++ b/shared/src/i18n/et/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Salvesta {count} nimekirja', + 'collections.saveNToList.one': 'Salvesta {count} nimekirja', 'collections.addedNToList': '{count} salvestatud nimekirja {name}', + 'collections.addedNToList.one': '{count} salvestatud nimekirja {name}', 'collections.noOwnLists': 'Sul pole veel nimekirju', 'collections.saveToListHint': 'Duplikaadid jäetakse automaatselt vahele', 'collections.role.label': 'Roll', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Teisalda nimekirja', 'collections.duplicateToList': 'Kopeeri nimekirja', 'collections.moveToListTitle': 'Teisalda {count} teise nimekirja', + 'collections.moveToListTitle.one': 'Teisalda {count} teise nimekirja', 'collections.duplicateToListTitle': 'Kopeeri {count} teise nimekirja', + 'collections.duplicateToListTitle.one': 'Kopeeri {count} teise nimekirja', 'collections.noOtherLists': 'Teisi nimekirju veel pole', 'collections.movedCount': '{count} kohta teisaldatud', 'collections.movedCount.one': '{count} koht teisaldatud', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} valitud', 'collections.importSelectedCount.one': '{count} valitud', 'collections.importAction': 'Impordi {count}', + 'collections.importAction.one': 'Impordi {count}', 'collections.importEmptyTrip': 'Sellel reisil pole veel kohti', 'collections.importNothingNew': 'Kõik selle reisi kohad on juba selles nimekirjas', 'collections.importDone': '{count} kohta lisatud', @@ -115,6 +120,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Kopeeri reisile', 'collections.copyToTripTitle': 'Kopeeri reisile', 'collections.copyN': 'Kopeeri {count} reisile', + 'collections.copyN.one': 'Kopeeri reisile', 'collections.copyToTripSearch': 'Otsi reise', 'collections.searchLists': 'Otsi nimekirju', 'collections.copyToTripConfirm': 'Kopeeri', @@ -150,6 +156,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Kogumikust eemaldatud', 'collections.picker.title': 'Salvestatud kohad', 'collections.picker.showMore': 'Näita veel {count}', + 'collections.picker.showMore.one': 'Näita veel {count}', 'collections.picker.search': 'Otsi oma salvestatud kohti', 'collections.picker.empty': 'Lisatavaid salvestatud kohti pole', 'collections.picker.hint': 'Vali oma kogumikest koht', @@ -173,6 +180,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': 'Nimekirja {name} lisati {count} kohta', 'collections.file.doneInto.one': 'Nimekirja {name} lisati {count} koht', 'collections.file.doneIntoDuplicates': 'Nimekirja {name} lisati {count}, juba olemas oli {duplicates}', + 'collections.file.doneIntoDuplicates.one': 'Nimekirja {name} lisati {count}, juba olemas oli {duplicates}', 'collections.file.doneIntoNothing': 'Kõik failis olevad kohad on juba nimekirjas {name}', 'collections.file.change': 'Muuda', 'collections.file.labelCount': '{count} silti', @@ -200,6 +208,7 @@ const collection: TranslationStrings = { 'collections.file.gpxEmpty': 'Selles GPX-failis pole teekonnapunkte, seega pole midagi importida.', 'collections.file.errorNotGpx': 'See ei ole GPX-fail.', 'collections.file.errorTooManyPlaces': 'Failis on üle {count} koha. Jaga fail osadeks ja impordi osad ükshaaval.', + 'collections.file.errorTooManyPlaces.one': 'Failis on üle {count} koha. Jaga fail osadeks ja impordi osad ükshaaval.', 'collections.share.title': 'Jaga nimekirja', 'collections.share.titleNamed': 'Jaga nimekirja „{name}“', diff --git a/shared/src/i18n/et/common.ts b/shared/src/i18n/et/common.ts index 62708e0d8..11dd70051 100644 --- a/shared/src/i18n/et/common.ts +++ b/shared/src/i18n/et/common.ts @@ -45,7 +45,9 @@ const common: TranslationStrings = { 'common.saving': 'Salvestamine...', 'common.justNow': 'äsja', 'common.hoursAgo': '{count} tundi tagasi', + 'common.hoursAgo.one': '{count} tund tagasi', 'common.daysAgo': '{count} päeva tagasi', + 'common.daysAgo.one': '{count} päev tagasi', 'common.saved': 'Salvestatud', 'common.update': 'Uuenda', 'common.change': 'Muuda', diff --git a/shared/src/i18n/et/dashboard.ts b/shared/src/i18n/et/dashboard.ts index b5f255738..bc406da92 100644 --- a/shared/src/i18n/et/dashboard.ts +++ b/shared/src/i18n/et/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} reisi ({archived} arhiveeritud)', 'dashboard.subtitle.trips.one': '{count} reis ({archived} arhiveeritud)', 'dashboard.subtitle.empty': 'Alusta oma esimest reisi', - 'dashboard.subtitle.activeOne': '{count} aktiivne reis', - 'dashboard.subtitle.activeMany': '{count} aktiivset reisi', + 'dashboard.subtitle.active': '{count} aktiivset reisi', + 'dashboard.subtitle.active.one': '{count} aktiivne reis', 'dashboard.subtitle.archivedSuffix': ' · {count} arhiveeritud', 'dashboard.subtitle.archivedSuffix.one': ' · {count} arhiveeritud', 'dashboard.newTrip': 'Uus reis', @@ -125,6 +125,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Kas eemaldada päevad?', 'dashboard.shrinkIntro': 'Uute kuupäevade salvestamine eemaldab need päevad:', 'dashboard.shrinkMoreDays': '+{count} veel', + 'dashboard.shrinkMoreDays.one': '+{count} veel', 'dashboard.shrinkLastDays': 'Eemaldatakse viimased päevad, mitte esimesed', 'dashboard.shrinkLastDaysHint': 'Päevaplaanid liiguvad koos uute kuupäevadega, seega eemaldatakse alati plaani viimased päevad, ka siis, kui algus nihkus.', diff --git a/shared/src/i18n/et/dawarich.ts b/shared/src/i18n/et/dawarich.ts index e7c5cde0b..da5ce5e2a 100644 --- a/shared/src/i18n/et/dawarich.ts +++ b/shared/src/i18n/et/dawarich.ts @@ -96,6 +96,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Kõrvale jäetud', 'dawarich.suggestions.restore': 'Taasta', 'dawarich.suggestions.showHandled': 'Näita {count} juba käsitletut', + 'dawarich.suggestions.showHandled.one': 'Näita {count} juba käsitletut', 'dawarich.suggestions.hideHandled': 'Peida juba käsitletud', 'dawarich.suggestions.matchesWish': 'Sinu soovinimekirjas: {name}', 'dawarich.suggestions.acceptedAs.place': 'Kohana lisatud', @@ -147,6 +148,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Sinu soovinimekirja kohti salvestustest ei leitud.', 'dawarich.bucket.alreadyVisited': 'Juba täidetuks märgitud', 'dawarich.bucket.confirm': 'Märgi {count} täidetuks', + 'dawarich.bucket.confirm.one': 'Märgi {count} täidetuks', 'dawarich.bucket.confirmed': '{count} soovi täidetuks märgitud', 'dawarich.bucket.confirmed.one': '{count} soov täidetuks märgitud', 'dawarich.bucket.skipped': '{count} kirjel pole koordinaate ja neid ei saanud kontrollida.', diff --git a/shared/src/i18n/et/dayplan.ts b/shared/src/i18n/et/dayplan.ts index 6dd0ea487..0a5779d6b 100644 --- a/shared/src/i18n/et/dayplan.ts +++ b/shared/src/i18n/et/dayplan.ts @@ -104,11 +104,15 @@ const dayplan: TranslationStrings = { 'Kõik kohad eemaldatakse sellest päevast. Kohad jäävad reisi alles ning päev säilitab oma märkmed ja broneeringud.', 'dayplan.deleteDayEmpty': 'Sellele päevale pole midagi plaanitud.', 'dayplan.impactPlaces': 'Plaanitud kohad: {count}', + 'dayplan.impactPlaces.one': 'Plaanitud kohad: {count}', 'dayplan.impactPlacesHint': 'Need jäävad kohtade nimekirja.', 'dayplan.impactNotes': 'Märkmed: {count}', + 'dayplan.impactNotes.one': 'Märkmed: {count}', 'dayplan.impactTexts': 'Päevade pealkirjad ja kirjeldused: {count}', + 'dayplan.impactTexts.one': 'Päevade pealkirjad ja kirjeldused: {count}', 'dayplan.impactDeletedHint': 'Kustutatakse samuti.', 'dayplan.impactBookings': 'Broneeringud: {count}', + 'dayplan.impactBookings.one': 'Broneeringud: {count}', 'dayplan.impactStay': 'Peatumine kohas {name}', 'dayplan.deleteDayBookingsHint': 'Need jäävad Broneeringute alla, ilma päevata.', 'dayplan.deleteDayStayHint': 'Sisse- või väljaregistreerimine on sellel päeval, seega see tühistatakse.', @@ -119,9 +123,12 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Sisse- või väljaregistreerimine on sellel päeval, seega see tühistatakse koos broneeringuga „{booking}“ ja selle kuluga summas {amount}.', 'dayplan.deleteDayShift': 'Hilisemad päevad: {count}', + 'dayplan.deleteDayShift.one': 'Hilisemad päevad: {count}', 'dayplan.deleteDayShiftHint': 'Igaüks nihkub ühe kuupäeva võrra varasemaks.', 'dayplan.deleteDayShiftBookingsHint': 'Igaüks nihkub ühe kuupäeva võrra varasemaks. Kaasa liikuvad broneeringud: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Igaüks nihkub ühe kuupäeva võrra varasemaks. Kaasa liikuvad broneeringud: {count}', 'dayplan.deleteDayShrink': 'Reis lõpeb nüüd kuupäeval {date}', 'dayplan.deleteDayShrinkHint': 'Pole kuupäevata päeva, mis viimase kuupäeva üle võtaks.', 'dayplan.impactStayShorter': 'Peatumine kohas {name}: üks öö vähem', diff --git a/shared/src/i18n/et/docsync.ts b/shared/src/i18n/et/docsync.ts index 8f624dcd4..ca8fe233a 100644 --- a/shared/src/i18n/et/docsync.ts +++ b/shared/src/i18n/et/docsync.ts @@ -71,6 +71,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Kaustast välja teisaldatud', 'docsync.conflict.resolve': 'Lahenda {count}', + 'docsync.conflict.resolve.one': 'Lahenda {count}', 'docsync.conflict.title': 'Mõlemad koopiad on muutunud', 'docsync.conflict.keepTrek': 'Säilita TREKi versioon', diff --git a/shared/src/i18n/et/journey.ts b/shared/src/i18n/et/journey.ts index fe1ef8f89..60714e670 100644 --- a/shared/src/i18n/et/journey.ts +++ b/shared/src/i18n/et/journey.ts @@ -679,6 +679,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Soovitus kõrvale jäetud', 'journey.suggestions.restore': 'Taasta kõrvale jäetud soovitused', 'journey.suggestions.restoreCount': 'Kõrvale jäetud soovitused ({count})', + 'journey.suggestions.restoreCount.one': 'Kõrvale jäetud soovitused ({count})', 'journey.suggestions.restored': '{count} soovitust taastatud', 'journey.suggestions.restored.one': '{count} soovitus taastatud', 'journey.detail.addOnThisDay': 'Lisa sellele päevale sissekanne', diff --git a/shared/src/i18n/et/memories.ts b/shared/src/i18n/et/memories.ts index a1760673e..5e473f1e1 100644 --- a/shared/src/i18n/et/memories.ts +++ b/shared/src/i18n/et/memories.ts @@ -61,6 +61,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Kas jagada reisi liikmetega?', 'memories.confirmShareHint': '{count} fotot on nähtavad kõigile selle reisi liikmetele. Hiljem saad üksikuid fotosid privaatseks muuta.', + 'memories.confirmShareHint.one': + '{count} foto on nähtav kõigile selle reisi liikmetele. Hiljem saad selle privaatseks muuta.', 'memories.confirmShareButton': 'Jaga fotosid', 'memories.error.loadAlbums': 'Albumite laadimine ebaõnnestus', 'memories.error.linkAlbum': 'Albumi sidumine ebaõnnestus', diff --git a/shared/src/i18n/et/packing.ts b/shared/src/i18n/et/packing.ts index 8fb0257df..53a28cfca 100644 --- a/shared/src/i18n/et/packing.ts +++ b/shared/src/i18n/et/packing.ts @@ -31,13 +31,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Sobib ka Markdowni loend: pealkiri määrab kategooria, "- [ ]" ja "- [x]" muutuvad esemeteks ning "3x" nime ees määrab koguse.', 'packing.importAction': 'Impordi {count}', + 'packing.importAction.one': 'Impordi {count}', 'packing.importSuccess': '{count} eset imporditud', 'packing.importSuccess.one': '{count} ese imporditud', 'packing.importError': 'Import ebaõnnestus', 'packing.importEmpty': 'Imporditavaid esemeid pole', 'packing.progress': 'Pakitud {packed} / {total} ({percent}%)', 'packing.clearChecked': 'Eemalda {count} märgitud eset', + 'packing.clearChecked.one': 'Eemalda {count} märgitud ese', 'packing.clearCheckedShort': 'Eemalda {count}', + 'packing.clearCheckedShort.one': 'Eemalda {count}', 'packing.allPacked': 'Kõik on pakitud!', 'packing.addPlaceholder': 'Lisa uus ese...', 'packing.categoryPlaceholder': 'Nimekiri...', @@ -88,6 +91,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'Sellel reisil pole veel teisi', 'packing.takenCareOf': 'vastutaja: {name}', 'packing.sharedWithCount': 'jagatud {count} inimesega', + 'packing.sharedWithCount.one': 'jagatud {count} inimesega', 'packing.broughtBy': 'toob {name}', 'packing.alsoBring': 'Võin selle ka kaasa võtta', 'packing.alsoBringingStop': 'Ma ei võta seda kaasa', diff --git a/shared/src/i18n/et/photos.ts b/shared/src/i18n/et/photos.ts index 18df9f6de..f45c8b39d 100644 --- a/shared/src/i18n/et/photos.ts +++ b/shared/src/i18n/et/photos.ts @@ -16,6 +16,7 @@ const photos: TranslationStrings = { 'photos.linkPlace': 'Seo kohaga', 'photos.noPlace': 'Kohata', 'photos.uploadN': 'Laadi üles {n} fotot', + 'photos.uploadN.one': 'Laadi üles {n} foto', 'photos.linkDay': 'Seo päevaga', 'photos.noDay': 'Päevata', 'photos.dayLabel': 'Päev {number}', diff --git a/shared/src/i18n/et/reservations.ts b/shared/src/i18n/et/reservations.ts index af974488b..dec52dd7c 100644 --- a/shared/src/i18n/et/reservations.ts +++ b/shared/src/i18n/et/reservations.ts @@ -182,6 +182,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Teised lennud', 'reservations.airtrail.empty': 'Sinu AirTraili kontolt lende ei leitud.', 'reservations.airtrail.importCta': 'Impordi {count}', + 'reservations.airtrail.importCta.one': 'Impordi {count}', 'reservations.airtrail.joinConnection': 'Impordi ühe lennuna vahepeatusega: {stops}', 'reservations.costsLabel': 'Kulud', 'reservations.createExpense': 'Loo kulu', diff --git a/shared/src/i18n/et/roadtrip.ts b/shared/src/i18n/et/roadtrip.ts index 559ab8e4e..f5949a71e 100644 --- a/shared/src/i18n/et/roadtrip.ts +++ b/shared/src/i18n/et/roadtrip.ts @@ -190,6 +190,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Tee ääres pole vasteid nimele „{name}“.', 'roadtrip.poi.noneMatchFilters': 'Tee ääres pole nendele filtritele vastavaid kohti.', 'roadtrip.poi.foundFiltered': '{count} / {total} tee ääres', + 'roadtrip.poi.foundFiltered.one': '{count} / {total} tee ääres', 'roadtrip.poi.truncated': '{count} lõigul oli rohkem tulemusi, kui vastusesse mahub. Ülejäänute nägemiseks kitsenda otsinguala.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/et/settings.ts b/shared/src/i18n/et/settings.ts index fe1ad468c..81a92ee66 100644 --- a/shared/src/i18n/et/settings.ts +++ b/shared/src/i18n/et/settings.ts @@ -585,9 +585,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Võrguühenduseta', 'settings.offline.banner.forced': 'Võrguühenduseta režiim', 'settings.offline.banner.queued': 'Võrguühenduseta · {count} järjekorras', + 'settings.offline.banner.queued.one': 'Võrguühenduseta · {count} järjekorras', 'settings.offline.banner.syncing': 'Sünkroonimine: {count}…', + 'settings.offline.banner.syncing.one': 'Sünkroonimine: {count}…', 'settings.offline.banner.failed': 'Sünkroonimine ebaõnnestus: {count}', + 'settings.offline.banner.failed.one': 'Sünkroonimine ebaõnnestus: {count}', 'settings.offline.banner.conflicts': 'Konflikte: {count}', + 'settings.offline.banner.conflicts.one': 'Konflikte: {count}', 'settings.alwaysShowRoutes': 'Näita alati broneeringute marsruute', 'settings.alwaysShowRoutesHint': 'Kuva kaardil automaatselt iga lennu, rongi ja muu broneeringu marsruut — iga kirje juures eraldi lubama ei pea.', @@ -600,6 +604,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Kõik', 'settings.apiScopes.noneSelected': 'Vali vähemalt üks valdkond, muidu ei saaks võti midagi lugeda.', 'settings.apiScopes.limited': '{count} / {total}', + 'settings.apiScopes.limited.one': '{count} / {total}', 'settings.apiScopes.trips': 'Reisid', 'settings.apiScopes.days': 'Päevad', 'settings.apiScopes.places': 'Kohad', diff --git a/shared/src/i18n/et/tours.ts b/shared/src/i18n/et/tours.ts index 9ac79639e..dff6d73e3 100644 --- a/shared/src/i18n/et/tours.ts +++ b/shared/src/i18n/et/tours.ts @@ -67,6 +67,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Teekonnapunktid', 'tours.planner.waypointLabel': 'Teekonnapunkt {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', 'tours.planner.empty': 'Lisa jalgsimarsruudi arvutamiseks vähemalt kaks punkti.', 'tours.planner.start': 'Algus', 'tours.planner.via': 'Vahepunkt', diff --git a/shared/src/i18n/et/trip.ts b/shared/src/i18n/et/trip.ts index 8e041f0e9..14dc8ec43 100644 --- a/shared/src/i18n/et/trip.ts +++ b/shared/src/i18n/et/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} ümberistumist', 'transit.transfers.one': '{count} ümberistumine', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', 'transit.stops': '{count} peatust', 'transit.stops.one': '{count} peatus', 'transit.walkTo': 'Kõnni peatusesse {name}', diff --git a/shared/src/i18n/et/vacay.ts b/shared/src/i18n/et/vacay.ts index 1887866ff..b94352315 100644 --- a/shared/src/i18n/et/vacay.ts +++ b/shared/src/i18n/et/vacay.ts @@ -90,6 +90,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Kanna allesjäänud puhkusepäevad automaatselt järgmisse aastasse', 'vacay.carriedOverPrevPeriod': 'eelmisest perioodist', 'vacay.compUsedCount': '{count} vaba / tasaarvestuspäeva', + 'vacay.compUsedCount.one': '{count} vaba / tasaarvestuspäev', 'vacay.yearType': 'Puhkuseaasta', 'vacay.yearTypeHint': 'Puhkuseaasta algus — selle järgi arvestatakse puhkuseõigust, kasutatud päevi ja ülekandmist', 'vacay.yearTypeCalendar': 'Kalendriaasta', diff --git a/shared/src/i18n/fr/admin.ts b/shared/src/i18n/fr/admin.ts index 290d20afc..8c3a29d7c 100644 --- a/shared/src/i18n/fr/admin.ts +++ b/shared/src/i18n/fr/admin.ts @@ -580,8 +580,10 @@ const admin: TranslationStrings = { 'admin.plugins.cap.events': 'Réagit à l’activité', 'admin.plugins.cap.requiresAddon': 'Nécessite {addon}', 'admin.plugins.cap.dependsOn': 'Requiert {id} {version}', - 'admin.plugins.dep.addonDisabledToast': 'Activez d’abord le ou les modules requis : {addons}', - 'admin.plugins.dep.autoEnabled': 'Plugin(s) requis activé(s) au préalable : {plugins}', + 'admin.plugins.dep.addonDisabledToast': 'Activez d’abord les modules requis : {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Activez d’abord le module requis : {addons}', + 'admin.plugins.dep.autoEnabled': 'Plugins requis activés au préalable : {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Plugin requis activé au préalable : {plugins}', 'admin.plugins.dep.downloaded': '{id} téléchargé', 'admin.plugins.dep.resolveTitle': 'Dépendances manquantes', 'admin.plugins.dep.resolveBody': '« {name} » nécessite l’installation de ces plugins avant de pouvoir être activé.', @@ -684,6 +686,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Actualiser', 'admin.audit.loadMore': 'Charger plus', 'admin.audit.showing': '{count} chargées · {total} au total', + 'admin.audit.showing.one': '{count} chargée · {total} au total', 'admin.audit.col.time': 'Heure', 'admin.audit.col.user': 'Utilisateur', 'admin.audit.col.action': 'Action', diff --git a/shared/src/i18n/fr/collab.ts b/shared/src/i18n/fr/collab.ts index 0dd8853e8..a69476aef 100644 --- a/shared/src/i18n/fr/collab.ts +++ b/shared/src/i18n/fr/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Charger les messages précédents', 'collab.chat.justNow': "à l'instant", 'collab.chat.minutesAgo': 'il y a {n} min', + 'collab.chat.minutesAgo.one': 'il y a {n} min', 'collab.chat.hoursAgo': 'il y a {n} h', + 'collab.chat.hoursAgo.one': 'il y a {n} h', 'collab.notes.title': 'Notes', 'collab.notes.new': 'Nouvelle note', 'collab.notes.empty': 'Aucune note', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Épingler', 'collab.notes.unpin': 'Désépingler', 'collab.notes.daysAgo': 'il y a {n} j', + 'collab.notes.daysAgo.one': 'il y a {n} j', 'collab.notes.categorySettings': 'Gérer les catégories', 'collab.notes.create': 'Créer', 'collab.notes.website': 'Site web', diff --git a/shared/src/i18n/fr/collection.ts b/shared/src/i18n/fr/collection.ts index c13b855f7..a6fc10c37 100644 --- a/shared/src/i18n/fr/collection.ts +++ b/shared/src/i18n/fr/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Enregistrer {count} dans une liste', + 'collections.saveNToList.one': 'Enregistrer {count} dans une liste', 'collections.addedNToList': '{count} enregistrés dans {name}', + 'collections.addedNToList.one': '{count} enregistré dans {name}', 'collections.noOwnLists': "Vous n'avez pas encore de listes", 'collections.saveToListHint': 'Les doublons sont ignorés automatiquement', 'collections.role.label': 'Rôle', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Déplacer vers une liste', 'collections.duplicateToList': 'Dupliquer dans une liste', 'collections.moveToListTitle': 'Déplacer {count} vers une autre liste', + 'collections.moveToListTitle.one': 'Déplacer {count} vers une autre liste', 'collections.duplicateToListTitle': 'Dupliquer {count} dans une autre liste', + 'collections.duplicateToListTitle.one': 'Dupliquer {count} dans une autre liste', 'collections.noOtherLists': 'Aucune autre liste', 'collections.movedCount': '{count} lieux déplacés', 'collections.movedCount.one': '{count} lieu déplacé', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} sélectionnés', 'collections.importSelectedCount.one': '{count} sélectionné', 'collections.importAction': 'Importer {count}', + 'collections.importAction.one': 'Importer {count}', 'collections.importEmptyTrip': 'Ce voyage n’a pas encore de lieux', 'collections.importNothingNew': 'Tout ce voyage figure déjà dans cette liste', 'collections.importDone': '{count} lieux ajoutés', @@ -115,6 +120,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Copier vers un voyage', 'collections.copyToTripTitle': 'Copier vers un voyage', 'collections.copyN': 'Copier {count} vers un voyage', + 'collections.copyN.one': 'Copier {count} vers un voyage', 'collections.copyToTripSearch': 'Rechercher des voyages', 'collections.searchLists': 'Rechercher des listes', 'collections.copyToTripConfirm': 'Copier', @@ -150,6 +156,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Retiré de la collection', 'collections.picker.title': 'Lieux enregistrés', 'collections.picker.showMore': 'Afficher {count} de plus', + 'collections.picker.showMore.one': 'Afficher {count} de plus', 'collections.picker.search': 'Rechercher dans vos lieux enregistrés', 'collections.picker.empty': 'Aucun lieu enregistré à ajouter', 'collections.picker.hint': 'Choisissez un lieu dans vos collections', @@ -172,6 +179,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{count} lieux ajoutés à {name}', 'collections.file.doneInto.one': '{count} lieu ajouté à {name}', 'collections.file.doneIntoDuplicates': '{count} ajoutés à {name}, {duplicates} y étaient déjà', + 'collections.file.doneIntoDuplicates.one': '{count} ajouté à {name}, {duplicates} y étaient déjà', 'collections.file.doneIntoNothing': 'Tous les lieux du fichier sont déjà dans {name}', 'collections.file.change': 'Changer', 'collections.file.labelCount': '{count} étiquettes', @@ -204,6 +212,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Ce n’est pas un fichier GPX.', 'collections.file.errorTooManyPlaces': 'Ce fichier contient plus de {count} lieux. Découpez-le et importez les parties une par une.', + 'collections.file.errorTooManyPlaces.one': + 'Ce fichier contient plus de {count} lieu. Découpez-le et importez les parties une par une.', 'collections.share.title': 'Partager la liste', 'collections.share.titleNamed': 'Partager « {name} »', diff --git a/shared/src/i18n/fr/common.ts b/shared/src/i18n/fr/common.ts index 6e14e015f..0182aaba5 100644 --- a/shared/src/i18n/fr/common.ts +++ b/shared/src/i18n/fr/common.ts @@ -55,7 +55,9 @@ const common: TranslationStrings = { 'common.copied': 'Copié', 'common.justNow': "à l'instant", 'common.hoursAgo': 'il y a {count}h', + 'common.hoursAgo.one': 'il y a {count}h', 'common.daysAgo': 'il y a {count}j', + 'common.daysAgo.one': 'il y a {count}j', 'common.datepicker.prevMonth': 'Previous month', // en-fallback 'common.datepicker.nextMonth': 'Next month', // en-fallback 'common.datepicker.prevYear': 'Previous year', // en-fallback diff --git a/shared/src/i18n/fr/dashboard.ts b/shared/src/i18n/fr/dashboard.ts index 0d2737cd8..0e969d96e 100644 --- a/shared/src/i18n/fr/dashboard.ts +++ b/shared/src/i18n/fr/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} voyages (archivés : {archived})', 'dashboard.subtitle.trips.one': '{count} voyage (archivés : {archived})', 'dashboard.subtitle.empty': 'Commencez votre premier voyage', - 'dashboard.subtitle.activeOne': '{count} voyage actif', - 'dashboard.subtitle.activeMany': '{count} voyages actifs', + 'dashboard.subtitle.active': '{count} voyages actifs', + 'dashboard.subtitle.active.one': '{count} voyage actif', 'dashboard.subtitle.archivedSuffix': ' · {count} archivés', 'dashboard.subtitle.archivedSuffix.one': ' · {count} archivé', 'dashboard.newTrip': 'Nouveau voyage', @@ -116,6 +116,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Retirer des jours ?', 'dashboard.shrinkIntro': 'En enregistrant les nouvelles dates, ces jours sont retirés :', 'dashboard.shrinkMoreDays': '+{count} de plus', + 'dashboard.shrinkMoreDays.one': '+{count} de plus', 'dashboard.shrinkLastDays': 'Ce sont les derniers jours qui partent, pas les premiers', 'dashboard.shrinkLastDaysHint': 'Les programmes des jours suivent les nouvelles dates : ce sont donc toujours les derniers jours de votre plan qui sont retirés, même quand le début a changé.', diff --git a/shared/src/i18n/fr/dawarich.ts b/shared/src/i18n/fr/dawarich.ts index eabadf8b7..4c1045a98 100644 --- a/shared/src/i18n/fr/dawarich.ts +++ b/shared/src/i18n/fr/dawarich.ts @@ -96,6 +96,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Ignoré', 'dawarich.suggestions.restore': 'Rétablir', 'dawarich.suggestions.showHandled': 'Afficher les {count} déjà traités', + 'dawarich.suggestions.showHandled.one': 'Afficher {count} déjà traité', 'dawarich.suggestions.hideHandled': 'Masquer ceux déjà traités', 'dawarich.suggestions.matchesWish': 'Dans votre liste de souhaits : {name}', 'dawarich.suggestions.acceptedAs.place': 'Ajouté comme lieu', @@ -147,6 +148,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Rien de votre liste de souhaits n’apparaît dans vos enregistrements.', 'dawarich.bucket.alreadyVisited': 'Déjà coché', 'dawarich.bucket.confirm': 'Cocher {count}', + 'dawarich.bucket.confirm.one': 'Cocher {count}', 'dawarich.bucket.confirmed': '{count} souhaits cochés', 'dawarich.bucket.confirmed.one': '{count} souhait coché', 'dawarich.bucket.skipped': '{count} entrées n’ont pas de coordonnées et n’ont pas pu être vérifiées.', diff --git a/shared/src/i18n/fr/dayplan.ts b/shared/src/i18n/fr/dayplan.ts index b78c02290..58835ecd5 100644 --- a/shared/src/i18n/fr/dayplan.ts +++ b/shared/src/i18n/fr/dayplan.ts @@ -104,11 +104,15 @@ const dayplan: TranslationStrings = { 'Tous les lieux sont retirés de ce jour. Ils restent dans le voyage, et le jour conserve ses notes et réservations.', 'dayplan.deleteDayEmpty': "Rien n'est prévu ce jour-là.", 'dayplan.impactPlaces': 'Lieux prévus : {count}', + 'dayplan.impactPlaces.one': 'Lieux prévus : {count}', 'dayplan.impactPlacesHint': 'Ils restent dans la liste des lieux.', 'dayplan.impactNotes': 'Notes : {count}', + 'dayplan.impactNotes.one': 'Notes : {count}', 'dayplan.impactTexts': 'Titres et descriptions du jour : {count}', + 'dayplan.impactTexts.one': 'Titres et descriptions du jour : {count}', 'dayplan.impactDeletedHint': 'Supprimés également.', 'dayplan.impactBookings': 'Réservations : {count}', + 'dayplan.impactBookings.one': 'Réservations : {count}', 'dayplan.impactStay': 'Séjour à {name}', 'dayplan.deleteDayBookingsHint': 'Elles restent dans Réservations, sans jour.', 'dayplan.deleteDayStayHint': "L'arrivée ou le départ a lieu ce jour-là, le séjour est donc annulé.", @@ -119,8 +123,11 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': "L'arrivée ou le départ a lieu ce jour-là, le séjour est donc annulé, ainsi que la réservation « {booking} » et sa dépense de {amount}.", 'dayplan.deleteDayShift': 'Jours suivants : {count}', + 'dayplan.deleteDayShift.one': 'Jours suivants : {count}', 'dayplan.deleteDayShiftHint': 'Chacun passe à la date précédente.', 'dayplan.deleteDayShiftBookingsHint': 'Chacun passe à la date précédente. Réservations déplacées avec eux : {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Chacun passe à la date précédente. Réservations déplacées avec eux : {count}', 'dayplan.deleteDayShrink': 'Le voyage se termine désormais le {date}', 'dayplan.deleteDayShrinkHint': 'Aucun jour sans date ne peut reprendre la dernière date.', 'dayplan.impactStayShorter': 'Séjour à {name} : une nuit de moins', diff --git a/shared/src/i18n/fr/docsync.ts b/shared/src/i18n/fr/docsync.ts index 50599c89f..9560d43c4 100644 --- a/shared/src/i18n/fr/docsync.ts +++ b/shared/src/i18n/fr/docsync.ts @@ -72,6 +72,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Sorti du dossier', 'docsync.conflict.resolve': 'Régler {count}', + 'docsync.conflict.resolve.one': 'Régler {count}', 'docsync.conflict.title': 'Les deux copies ont changé', 'docsync.conflict.keepTrek': 'Garder la version TREK', diff --git a/shared/src/i18n/fr/journey.ts b/shared/src/i18n/fr/journey.ts index cd4ad3fce..04248d565 100644 --- a/shared/src/i18n/fr/journey.ts +++ b/shared/src/i18n/fr/journey.ts @@ -675,6 +675,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Suggestion écartée', 'journey.suggestions.restore': 'Récupérer les suggestions écartées', 'journey.suggestions.restoreCount': 'Suggestions écartées ({count})', + 'journey.suggestions.restoreCount.one': 'Suggestions écartées ({count})', 'journey.suggestions.restored': '{count} suggestions sont de retour', 'journey.suggestions.restored.one': '{count} suggestion est de retour', 'journey.detail.addOnThisDay': 'Ajouter une entrée ce jour-là', diff --git a/shared/src/i18n/fr/memories.ts b/shared/src/i18n/fr/memories.ts index e012da96f..c2c40deb3 100644 --- a/shared/src/i18n/fr/memories.ts +++ b/shared/src/i18n/fr/memories.ts @@ -66,6 +66,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Partager avec les membres du voyage ?', 'memories.confirmShareHint': '{count} photos seront visibles par tous les membres de ce voyage. Vous pourrez rendre des photos individuelles privées plus tard.', + 'memories.confirmShareHint.one': + '{count} photo sera visible par tous les membres de ce voyage. Vous pourrez la rendre privée plus tard.', 'memories.confirmShareButton': 'Partager les photos', 'memories.error.loadAlbums': 'Impossible de charger les albums', 'memories.error.linkAlbum': "Impossible de lier l'album", diff --git a/shared/src/i18n/fr/packing.ts b/shared/src/i18n/fr/packing.ts index 8068108c8..cbee1132f 100644 --- a/shared/src/i18n/fr/packing.ts +++ b/shared/src/i18n/fr/packing.ts @@ -31,13 +31,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Une liste Markdown fonctionne aussi : un titre indique la catégorie, "- [ ]" et "- [x]" deviennent des articles, et "3x" devant un nom fixe la quantité.', 'packing.importAction': 'Importer {count}', + 'packing.importAction.one': 'Importer {count}', 'packing.importSuccess': '{count} éléments importés', 'packing.importSuccess.one': '{count} élément importé', 'packing.importError': "Échec de l'import", 'packing.importEmpty': 'Aucun élément à importer', 'packing.progress': '{packed} sur {total} emballés ({percent} %)', 'packing.clearChecked': 'Supprimer {count} cochés', + 'packing.clearChecked.one': 'Supprimer {count} coché', 'packing.clearCheckedShort': 'Supprimer {count}', + 'packing.clearCheckedShort.one': 'Supprimer {count}', 'packing.allPacked': 'Tout est emballé !', 'packing.addPlaceholder': 'Ajouter un nouvel article…', 'packing.categoryPlaceholder': 'Liste...', @@ -97,6 +100,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': "Personne d'autre sur ce voyage pour l'instant", 'packing.takenCareOf': 'par {name}', 'packing.sharedWithCount': 'partagé avec {count}', + 'packing.sharedWithCount.one': 'partagé avec {count}', 'packing.broughtBy': 'apporté par {name}', 'packing.alsoBring': "Je peux l'apporter aussi", 'packing.alsoBringingStop': "Je ne l'apporte pas", diff --git a/shared/src/i18n/fr/photos.ts b/shared/src/i18n/fr/photos.ts index 9de26ccac..a956fc9ca 100644 --- a/shared/src/i18n/fr/photos.ts +++ b/shared/src/i18n/fr/photos.ts @@ -15,7 +15,8 @@ const photos: TranslationStrings = { 'photos.clickToSelect': 'ou cliquez pour sélectionner', 'photos.linkPlace': 'Lier au lieu', 'photos.noPlace': 'Aucun lieu', - 'photos.uploadN': '{n} photo(s) importée(s)', + 'photos.uploadN': '{n} photos importées', + 'photos.uploadN.one': '{n} photo importée', 'photos.linkDay': 'Lier le jour', 'photos.noDay': 'Aucun jour', 'photos.dayLabel': 'Jour {number}', diff --git a/shared/src/i18n/fr/reservations.ts b/shared/src/i18n/fr/reservations.ts index 7a3925313..72222443b 100644 --- a/shared/src/i18n/fr/reservations.ts +++ b/shared/src/i18n/fr/reservations.ts @@ -184,6 +184,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Autres vols', 'reservations.airtrail.empty': 'Aucun vol trouvé dans votre compte AirTrail.', 'reservations.airtrail.importCta': 'Importer {count}', + 'reservations.airtrail.importCta.one': 'Importer {count}', 'reservations.airtrail.joinConnection': 'Importer comme un seul vol avec escale à {stops}', 'reservations.costsLabel': 'Coûts', 'reservations.createExpense': 'Créer une dépense', diff --git a/shared/src/i18n/fr/roadtrip.ts b/shared/src/i18n/fr/roadtrip.ts index 1ba203a12..0079c8cdc 100644 --- a/shared/src/i18n/fr/roadtrip.ts +++ b/shared/src/i18n/fr/roadtrip.ts @@ -198,6 +198,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Rien sur le trajet ne correspond à « {name} ».', 'roadtrip.poi.noneMatchFilters': 'Rien sur le trajet ne correspond à ces filtres.', 'roadtrip.poi.foundFiltered': '{count} sur {total} sur le trajet', + 'roadtrip.poi.foundFiltered.one': '{count} sur {total} sur le trajet', 'roadtrip.poi.truncated': 'Sur {count} tronçons, il y en avait plus que ce qu’une réponse peut contenir : réduisez le corridor pour voir le reste.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/fr/settings.ts b/shared/src/i18n/fr/settings.ts index c6d64a37c..53061a0b9 100644 --- a/shared/src/i18n/fr/settings.ts +++ b/shared/src/i18n/fr/settings.ts @@ -587,9 +587,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Hors ligne', 'settings.offline.banner.forced': 'Mode hors ligne', 'settings.offline.banner.queued': 'Hors ligne · {count} en attente', + 'settings.offline.banner.queued.one': 'Hors ligne · {count} en attente', 'settings.offline.banner.syncing': 'Synchronisation de {count}…', + 'settings.offline.banner.syncing.one': 'Synchronisation de {count}…', 'settings.offline.banner.failed': 'Échec de la synchronisation : {count}', + 'settings.offline.banner.failed.one': 'Échec de la synchronisation : {count}', 'settings.offline.banner.conflicts': 'Conflits : {count}', + 'settings.offline.banner.conflicts.one': 'Conflits : {count}', 'settings.pluginActivity.title': 'Activité des plugins', 'settings.pluginActivity.description': "Chaque action qu'un plugin a effectuée en votre nom, la plus récente en premier.", @@ -612,6 +616,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Tout', 'settings.apiScopes.noneSelected': 'Choisissez au moins un domaine, sinon la clé ne pourrait rien lire.', 'settings.apiScopes.limited': '{count} sur {total}', + 'settings.apiScopes.limited.one': '{count} sur {total}', 'settings.apiScopes.trips': 'Voyages', 'settings.apiScopes.days': 'Jours', 'settings.apiScopes.places': 'Lieux', diff --git a/shared/src/i18n/fr/tours.ts b/shared/src/i18n/fr/tours.ts index acef794b0..a6cb8cb67 100644 --- a/shared/src/i18n/fr/tours.ts +++ b/shared/src/i18n/fr/tours.ts @@ -70,6 +70,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Points de passage', 'tours.planner.waypointLabel': 'Point de passage {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', 'tours.planner.empty': 'Ajoutez au moins deux points pour calculer un itinéraire à pied.', 'tours.planner.start': 'Départ', 'tours.planner.via': 'Passage par', diff --git a/shared/src/i18n/fr/trip.ts b/shared/src/i18n/fr/trip.ts index 658459593..1a45030c5 100644 --- a/shared/src/i18n/fr/trip.ts +++ b/shared/src/i18n/fr/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} correspondances', 'transit.transfers.one': '{count} correspondance', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', 'transit.stops': '{count} arrêts', 'transit.stops.one': '{count} arrêt', 'transit.walkTo': "Marcher jusqu'à {name}", diff --git a/shared/src/i18n/fr/vacay.ts b/shared/src/i18n/fr/vacay.ts index 9ee51b121..1705ae884 100644 --- a/shared/src/i18n/fr/vacay.ts +++ b/shared/src/i18n/fr/vacay.ts @@ -86,6 +86,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': "Reporter automatiquement les jours de vacances restants à l'année suivante", 'vacay.carriedOverPrevPeriod': 'de la période précédente', 'vacay.compUsedCount': '{count} récup', + 'vacay.compUsedCount.one': '{count} récup', 'vacay.yearType': 'Année de congés', 'vacay.yearTypeHint': "Quand commence votre année de congés — les droits, l'utilisation et le report en dépendent", 'vacay.yearTypeCalendar': 'Année civile', diff --git a/shared/src/i18n/gr/admin.ts b/shared/src/i18n/gr/admin.ts index cab63e2ae..b35a7e418 100644 --- a/shared/src/i18n/gr/admin.ts +++ b/shared/src/i18n/gr/admin.ts @@ -636,7 +636,9 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Απαιτεί {addon}', 'admin.plugins.cap.dependsOn': 'Χρειάζεται {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Ενεργοποιήστε πρώτα τα απαιτούμενα πρόσθετα: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Ενεργοποιήστε πρώτα το απαιτούμενο πρόσθετο: {addons}', 'admin.plugins.dep.autoEnabled': 'Ενεργοποιήθηκαν πρώτα τα απαιτούμενα πρόσθετα: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Ενεργοποιήθηκε πρώτα το απαιτούμενο πρόσθετο: {plugins}', 'admin.plugins.dep.downloaded': 'Λήφθηκε το {id}', 'admin.plugins.dep.resolveTitle': 'Λείπουν εξαρτήσεις', 'admin.plugins.dep.resolveBody': 'Το «{name}» χρειάζεται να εγκατασταθούν αυτά τα πρόσθετα πριν ενεργοποιηθεί.', @@ -769,6 +771,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Ανανέωση', 'admin.audit.loadMore': 'Φόρτωση περισσότερων', 'admin.audit.showing': '{count} φορτώθηκαν · {total} σύνολο', + 'admin.audit.showing.one': '{count} φορτώθηκε · {total} σύνολο', 'admin.audit.col.time': 'Ώρα', 'admin.audit.col.user': 'Χρήστης', 'admin.audit.col.action': 'Ενέργεια', diff --git a/shared/src/i18n/gr/collab.ts b/shared/src/i18n/gr/collab.ts index 776127e2d..8884f46ca 100644 --- a/shared/src/i18n/gr/collab.ts +++ b/shared/src/i18n/gr/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Φόρτωση παλαιότερων μηνυμάτων', 'collab.chat.justNow': 'μόλις τώρα', 'collab.chat.minutesAgo': '{n}λ πριν', + 'collab.chat.minutesAgo.one': '{n}λ πριν', 'collab.chat.hoursAgo': '{n}ω πριν', + 'collab.chat.hoursAgo.one': '{n}ω πριν', 'collab.notes.title': 'Σημειώσεις', 'collab.notes.new': 'Νέα Σημείωση', 'collab.notes.empty': 'Δεν υπάρχουν σημειώσεις ακόμη', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Καρφίτσωμα', 'collab.notes.unpin': 'Ξεκαρφίτσωμα', 'collab.notes.daysAgo': '{n}η πριν', + 'collab.notes.daysAgo.one': '{n}η πριν', 'collab.notes.categorySettings': 'Διαχείριση Κατηγοριών', 'collab.notes.create': 'Δημιουργία', 'collab.notes.website': 'Ιστότοπος', diff --git a/shared/src/i18n/gr/collection.ts b/shared/src/i18n/gr/collection.ts index 4bd8af651..b455f835e 100644 --- a/shared/src/i18n/gr/collection.ts +++ b/shared/src/i18n/gr/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Αποθήκευση {count} σε λίστα', + 'collections.saveNToList.one': 'Αποθήκευση {count} σε λίστα', 'collections.addedNToList': 'Αποθηκεύτηκαν {count} στο {name}', + 'collections.addedNToList.one': 'Αποθηκεύτηκε {count} στο {name}', 'collections.noOwnLists': 'Δεν έχετε λίστες ακόμη', 'collections.saveToListHint': 'Τα διπλότυπα παραλείπονται αυτόματα', 'collections.role.label': 'Ρόλος', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Μετακίνηση σε λίστα', 'collections.duplicateToList': 'Αντιγραφή σε λίστα', 'collections.moveToListTitle': 'Μετακίνηση {count} σε άλλη λίστα', + 'collections.moveToListTitle.one': 'Μετακίνηση {count} σε άλλη λίστα', 'collections.duplicateToListTitle': 'Αντιγραφή {count} σε άλλη λίστα', + 'collections.duplicateToListTitle.one': 'Αντιγραφή {count} σε άλλη λίστα', 'collections.noOtherLists': 'Δεν υπάρχουν άλλες λίστες', 'collections.movedCount': 'Μετακινήθηκαν {count} τοποθεσίες', 'collections.movedCount.one': 'Μετακινήθηκε {count} τοποθεσία', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': 'Επιλέχθηκαν {count}', 'collections.importSelectedCount.one': 'Επιλέχθηκε {count}', 'collections.importAction': 'Εισαγωγή {count}', + 'collections.importAction.one': 'Εισαγωγή {count}', 'collections.importEmptyTrip': 'Αυτό το ταξίδι δεν έχει ακόμη μέρη', 'collections.importNothingNew': 'Όλα από αυτό το ταξίδι είναι ήδη στη λίστα', 'collections.importDone': 'Προστέθηκαν {count} μέρη', @@ -115,6 +120,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Αντιγραφή σε ταξίδι', 'collections.copyToTripTitle': 'Αντιγραφή σε ταξίδι', 'collections.copyN': 'Αντιγραφή {count} σε ταξίδι', + 'collections.copyN.one': 'Αντιγραφή σε ταξίδι', 'collections.copyToTripSearch': 'Αναζήτηση ταξιδιών', 'collections.searchLists': 'Αναζήτηση λιστών', 'collections.copyToTripConfirm': 'Αντιγραφή', @@ -150,6 +156,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Αφαιρέθηκε από τη συλλογή', 'collections.picker.title': 'Αποθηκευμένα μέρη', 'collections.picker.showMore': 'Εμφάνιση {count} ακόμη', + 'collections.picker.showMore.one': 'Εμφάνιση {count} ακόμη', 'collections.picker.search': 'Αναζήτηση στα αποθηκευμένα μέρη σου', 'collections.picker.empty': 'Δεν υπάρχουν αποθηκευμένα μέρη για προσθήκη', 'collections.picker.hint': 'Διάλεξε ένα μέρος από τις συλλογές σου', @@ -172,6 +179,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{count} μέρη προστέθηκαν στη λίστα {name}', 'collections.file.doneInto.one': '{count} μέρος προστέθηκε στη λίστα {name}', 'collections.file.doneIntoDuplicates': '{count} προστέθηκαν στη λίστα {name}, {duplicates} υπήρχαν ήδη', + 'collections.file.doneIntoDuplicates.one': '{count} προστέθηκε στη λίστα {name}, {duplicates} υπήρχαν ήδη', 'collections.file.doneIntoNothing': 'Όλα τα μέρη του αρχείου είναι ήδη στη λίστα {name}', 'collections.file.change': 'Αλλαγή', 'collections.file.labelCount': '{count} ετικέτες', @@ -203,6 +211,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Αυτό δεν είναι αρχείο GPX.', 'collections.file.errorTooManyPlaces': 'Αυτό το αρχείο έχει περισσότερα από {count} μέρη. Χωρίστε το και εισαγάγετε τα κομμάτια ένα ένα.', + 'collections.file.errorTooManyPlaces.one': + 'Αυτό το αρχείο έχει περισσότερα από {count} μέρος. Χωρίστε το και εισαγάγετε τα κομμάτια ένα ένα.', 'collections.share.title': 'Κοινή χρήση λίστας', 'collections.share.titleNamed': 'Κοινή χρήση «{name}»', diff --git a/shared/src/i18n/gr/common.ts b/shared/src/i18n/gr/common.ts index d9c1f353e..506195ee3 100644 --- a/shared/src/i18n/gr/common.ts +++ b/shared/src/i18n/gr/common.ts @@ -44,8 +44,10 @@ const common: TranslationStrings = { 'common.password': 'Κωδικός', 'common.saving': 'Αποθήκευση...', 'common.justNow': 'Μόλις τώρα', - 'common.hoursAgo': '{count} ώρες πρίν', - 'common.daysAgo': '{count} μέρες πρίν', + 'common.hoursAgo': 'πριν από {count} ώρες', + 'common.hoursAgo.one': 'πριν από {count} ώρα', + 'common.daysAgo': 'πριν από {count} μέρες', + 'common.daysAgo.one': 'πριν από {count} μέρα', 'common.saved': 'Αποθηκεύτηκε', 'common.update': 'Ενημέρωση', 'common.change': 'Αλλαγή', diff --git a/shared/src/i18n/gr/dashboard.ts b/shared/src/i18n/gr/dashboard.ts index dc14580c4..74cc3ef82 100644 --- a/shared/src/i18n/gr/dashboard.ts +++ b/shared/src/i18n/gr/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} ταξίδια (αρχειοθετημένα: {archived})', 'dashboard.subtitle.trips.one': '{count} ταξίδι (αρχειοθετημένα: {archived})', 'dashboard.subtitle.empty': 'Ξεκινήστε το πρώτο σας ταξίδι', - 'dashboard.subtitle.activeOne': '{count} ενεργό ταξίδι', - 'dashboard.subtitle.activeMany': '{count} ενεργά ταξίδια', + 'dashboard.subtitle.active': '{count} ενεργά ταξίδια', + 'dashboard.subtitle.active.one': '{count} ενεργό ταξίδι', 'dashboard.subtitle.archivedSuffix': ' · {count} αρχειοθετημένα', 'dashboard.subtitle.archivedSuffix.one': ' · {count} αρχειοθετημένο', 'dashboard.newTrip': 'Νέο Ταξίδι', @@ -126,6 +126,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Αφαίρεση ημερών;', 'dashboard.shrinkIntro': 'Με την αποθήκευση των νέων ημερομηνιών αφαιρούνται αυτές οι ημέρες:', 'dashboard.shrinkMoreDays': '+{count} ακόμη', + 'dashboard.shrinkMoreDays.one': '+{count} ακόμη', 'dashboard.shrinkLastDays': 'Αφαιρούνται οι τελευταίες ημέρες, όχι οι πρώτες', 'dashboard.shrinkLastDaysHint': 'Τα πλάνα των ημερών μετακινούνται μαζί με τις νέες ημερομηνίες, οπότε αφαιρούνται πάντα οι τελευταίες ημέρες του πλάνου σας, ακόμη κι όταν άλλαξε η αρχή.', diff --git a/shared/src/i18n/gr/dawarich.ts b/shared/src/i18n/gr/dawarich.ts index c16eb36bc..c040cf882 100644 --- a/shared/src/i18n/gr/dawarich.ts +++ b/shared/src/i18n/gr/dawarich.ts @@ -97,6 +97,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Απορρίφθηκε', 'dawarich.suggestions.restore': 'Επαναφορά', 'dawarich.suggestions.showHandled': 'Εμφάνιση {count} που έχουν ήδη διεκπεραιωθεί', + 'dawarich.suggestions.showHandled.one': 'Εμφάνιση {count} που έχουν ήδη διεκπεραιωθεί', 'dawarich.suggestions.hideHandled': 'Απόκρυψη όσων έχουν ήδη διεκπεραιωθεί', 'dawarich.suggestions.matchesWish': 'Στη λίστα επιθυμιών σας: {name}', 'dawarich.suggestions.acceptedAs.place': 'Προστέθηκε ως τοποθεσία', @@ -148,6 +149,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Τίποτα από τη λίστα επιθυμιών σας δεν εντοπίστηκε στις καταγραφές σας.', 'dawarich.bucket.alreadyVisited': 'Ήδη σημειωμένο ως εκπληρωμένο', 'dawarich.bucket.confirm': 'Σημείωση {count} ως εκπληρωμένων', + 'dawarich.bucket.confirm.one': 'Σημείωση {count} ως εκπληρωμένου', 'dawarich.bucket.confirmed': '{count} επιθυμίες σημειώθηκαν ως εκπληρωμένες', 'dawarich.bucket.confirmed.one': '{count} επιθυμία σημειώθηκε ως εκπληρωμένη', 'dawarich.bucket.skipped': '{count} καταχωρήσεις δεν έχουν συντεταγμένες και δεν ήταν δυνατό να ελεγχθούν.', diff --git a/shared/src/i18n/gr/dayplan.ts b/shared/src/i18n/gr/dayplan.ts index 8b95eadc5..f89e07b0d 100644 --- a/shared/src/i18n/gr/dayplan.ts +++ b/shared/src/i18n/gr/dayplan.ts @@ -104,11 +104,15 @@ const dayplan: TranslationStrings = { 'Όλα τα μέρη αφαιρούνται από αυτή την ημέρα. Τα μέρη παραμένουν στο ταξίδι και η ημέρα κρατά τις σημειώσεις και τις κρατήσεις της.', 'dayplan.deleteDayEmpty': 'Δεν υπάρχει τίποτα προγραμματισμένο αυτή την ημέρα.', 'dayplan.impactPlaces': 'Προγραμματισμένα μέρη: {count}', + 'dayplan.impactPlaces.one': 'Προγραμματισμένα μέρη: {count}', 'dayplan.impactPlacesHint': 'Παραμένουν στη λίστα μερών.', 'dayplan.impactNotes': 'Σημειώσεις: {count}', + 'dayplan.impactNotes.one': 'Σημειώσεις: {count}', 'dayplan.impactTexts': 'Τίτλοι και περιγραφές ημέρας: {count}', + 'dayplan.impactTexts.one': 'Τίτλοι και περιγραφές ημέρας: {count}', 'dayplan.impactDeletedHint': 'Διαγράφονται επίσης.', 'dayplan.impactBookings': 'Κρατήσεις: {count}', + 'dayplan.impactBookings.one': 'Κρατήσεις: {count}', 'dayplan.impactStay': 'Διαμονή στο {name}', 'dayplan.deleteDayBookingsHint': 'Παραμένουν στις Κρατήσεις, χωρίς ημέρα.', 'dayplan.deleteDayStayHint': 'Η άφιξη ή η αναχώρηση είναι αυτή την ημέρα, οπότε η διαμονή ακυρώνεται.', @@ -119,9 +123,12 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Η άφιξη ή η αναχώρηση είναι αυτή την ημέρα, οπότε η διαμονή ακυρώνεται μαζί με την κράτηση «{booking}» και το έξοδό της, ύψους {amount}.', 'dayplan.deleteDayShift': 'Επόμενες ημέρες: {count}', + 'dayplan.deleteDayShift.one': 'Επόμενες ημέρες: {count}', 'dayplan.deleteDayShiftHint': 'Καθεμία μετακινείται μία ημερομηνία νωρίτερα.', 'dayplan.deleteDayShiftBookingsHint': 'Καθεμία μετακινείται μία ημερομηνία νωρίτερα. Κρατήσεις που μετακινούνται μαζί: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Καθεμία μετακινείται μία ημερομηνία νωρίτερα. Κρατήσεις που μετακινούνται μαζί: {count}', 'dayplan.deleteDayShrink': 'Το ταξίδι τελειώνει τώρα στις {date}', 'dayplan.deleteDayShrinkHint': 'Δεν υπάρχει ημέρα χωρίς ημερομηνία για να πάρει την τελευταία ημερομηνία.', 'dayplan.impactStayShorter': 'Διαμονή στο {name}: μία νύχτα λιγότερη', diff --git a/shared/src/i18n/gr/docsync.ts b/shared/src/i18n/gr/docsync.ts index c62665168..a89124a77 100644 --- a/shared/src/i18n/gr/docsync.ts +++ b/shared/src/i18n/gr/docsync.ts @@ -74,6 +74,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Μετακινήθηκε εκτός του φακέλου', 'docsync.conflict.resolve': 'Επίλυση {count}', + 'docsync.conflict.resolve.one': 'Επίλυση {count}', 'docsync.conflict.title': 'Άλλαξαν και τα δύο αντίγραφα', 'docsync.conflict.keepTrek': 'Διατήρηση της έκδοσης του TREK', diff --git a/shared/src/i18n/gr/journey.ts b/shared/src/i18n/gr/journey.ts index 15a1ff1ca..3c41a8fdb 100644 --- a/shared/src/i18n/gr/journey.ts +++ b/shared/src/i18n/gr/journey.ts @@ -675,6 +675,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Η πρόταση απορρίφθηκε', 'journey.suggestions.restore': 'Επαναφορά των απορριμμένων προτάσεων', 'journey.suggestions.restoreCount': 'Απορριμμένες προτάσεις ({count})', + 'journey.suggestions.restoreCount.one': 'Απορριμμένες προτάσεις ({count})', 'journey.suggestions.restored': 'Επέστρεψαν {count} προτάσεις', 'journey.suggestions.restored.one': 'Επέστρεψε {count} πρόταση', 'journey.detail.addOnThisDay': 'Προσθήκη καταχώρισης σε αυτήν την ημέρα', diff --git a/shared/src/i18n/gr/memories.ts b/shared/src/i18n/gr/memories.ts index c66f13ab6..28abed268 100644 --- a/shared/src/i18n/gr/memories.ts +++ b/shared/src/i18n/gr/memories.ts @@ -63,6 +63,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Κοινή χρήση με τα μέλη του ταξιδιού;', 'memories.confirmShareHint': '{count} φωτογραφίες θα είναι ορατές σε όλα τα μέλη αυτού του ταξιδιού. Μπορείτε να κάνετε μεμονωμένες φωτογραφίες ιδιωτικές αργότερα.', + 'memories.confirmShareHint.one': + '{count} φωτογραφία θα είναι ορατή σε όλα τα μέλη αυτού του ταξιδιού. Μπορείτε να την κάνετε ιδιωτική αργότερα.', 'memories.confirmShareButton': 'Κοινή χρήση φωτογραφιών', 'memories.error.loadAlbums': 'Αποτυχία φόρτωσης άλμπουμ', 'memories.error.linkAlbum': 'Αποτυχία σύνδεσης άλμπουμ', diff --git a/shared/src/i18n/gr/packing.ts b/shared/src/i18n/gr/packing.ts index 4154ada67..9fa1aba9c 100644 --- a/shared/src/i18n/gr/packing.ts +++ b/shared/src/i18n/gr/packing.ts @@ -32,13 +32,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Λειτουργεί και μια λίστα Markdown: μια επικεφαλίδα ορίζει την κατηγορία, τα "- [ ]" και "- [x]" γίνονται αντικείμενα και το "3x" μπροστά από ένα όνομα ορίζει την ποσότητα.', 'packing.importAction': 'Εισαγωγή {count}', + 'packing.importAction.one': 'Εισαγωγή {count}', 'packing.importSuccess': '{count} αντικείμενα εισήχθησαν', 'packing.importSuccess.one': '{count} αντικείμενο εισήχθη', 'packing.importError': 'Η εισαγωγή απέτυχε', 'packing.importEmpty': 'Δεν υπάρχουν αντικείμενα προς εισαγωγή', 'packing.progress': '{packed} από {total} συσκευασμένα ({percent}%)', 'packing.clearChecked': 'Αφαίρεση {count} επιλεγμένων', + 'packing.clearChecked.one': 'Αφαίρεση {count} επιλεγμένου', 'packing.clearCheckedShort': 'Αφαίρεση {count}', + 'packing.clearCheckedShort.one': 'Αφαίρεση {count}', 'packing.allPacked': 'Όλα έτοιμα!', 'packing.addPlaceholder': 'Προσθήκη νέου αντικειμένου...', 'packing.categoryPlaceholder': 'Λίστα...', @@ -97,7 +100,8 @@ const packing: TranslationStrings = { 'packing.tierShared': 'Κοινή χρήση με…', 'packing.noOneToShare': 'Κανείς άλλος σε αυτό το ταξίδι ακόμη', 'packing.takenCareOf': 'από {name}', - 'packing.sharedWithCount': 'κοινό με {count}', + 'packing.sharedWithCount': 'κοινό με {count} άτομα', + 'packing.sharedWithCount.one': 'κοινό με {count} άτομο', 'packing.broughtBy': 'φέρνει ο/η {name}', 'packing.alsoBring': 'Μπορώ να το φέρω κι εγώ', 'packing.alsoBringingStop': 'Δεν το φέρνω', diff --git a/shared/src/i18n/gr/photos.ts b/shared/src/i18n/gr/photos.ts index 68f3596e4..db69f3ed8 100644 --- a/shared/src/i18n/gr/photos.ts +++ b/shared/src/i18n/gr/photos.ts @@ -16,6 +16,7 @@ const photos: TranslationStrings = { 'photos.linkPlace': 'Σύνδεση Τοποθεσίας', 'photos.noPlace': 'Καμία Τοποθεσία', 'photos.uploadN': 'Μεταφόρτωση {n} φωτογραφιών', + 'photos.uploadN.one': 'Μεταφόρτωση {n} φωτογραφίας', 'photos.linkDay': 'Σύνδεση Ημέρας', 'photos.noDay': 'Καμία Ημέρα', 'photos.dayLabel': 'Ημέρα {number}', diff --git a/shared/src/i18n/gr/reservations.ts b/shared/src/i18n/gr/reservations.ts index 17407e65a..33177f34f 100644 --- a/shared/src/i18n/gr/reservations.ts +++ b/shared/src/i18n/gr/reservations.ts @@ -182,6 +182,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Άλλες πτήσεις', 'reservations.airtrail.empty': 'Δεν βρέθηκαν πτήσεις στον λογαριασμό σας στο AirTrail.', 'reservations.airtrail.importCta': 'Εισαγωγή {count}', + 'reservations.airtrail.importCta.one': 'Εισαγωγή {count}', 'reservations.airtrail.joinConnection': 'Εισαγωγή ως μία πτήση με ενδιάμεση στάση σε {stops}', 'reservations.costsLabel': 'Κόστη', 'reservations.createExpense': 'Δημιουργία εξόδου', diff --git a/shared/src/i18n/gr/roadtrip.ts b/shared/src/i18n/gr/roadtrip.ts index 23ee6f403..c9e7ecb1d 100644 --- a/shared/src/i18n/gr/roadtrip.ts +++ b/shared/src/i18n/gr/roadtrip.ts @@ -200,6 +200,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Τίποτα στη διαδρομή δεν ταιριάζει με «{name}».', 'roadtrip.poi.noneMatchFilters': 'Τίποτα στη διαδρομή δεν ταιριάζει με αυτά τα φίλτρα.', 'roadtrip.poi.foundFiltered': '{count} από {total} στη διαδρομή', + 'roadtrip.poi.foundFiltered.one': '{count} από {total} στη διαδρομή', 'roadtrip.poi.truncated': 'Σε {count} τμήματα υπήρχαν περισσότερα από όσα χωρούν σε μία απάντηση. Στενέψτε τον διάδρομο για να δείτε τα υπόλοιπα.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/gr/settings.ts b/shared/src/i18n/gr/settings.ts index 995dd6eb2..75d6746df 100644 --- a/shared/src/i18n/gr/settings.ts +++ b/shared/src/i18n/gr/settings.ts @@ -587,9 +587,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Εκτός σύνδεσης', 'settings.offline.banner.forced': 'Λειτουργία εκτός σύνδεσης', 'settings.offline.banner.queued': 'Εκτός σύνδεσης · {count} σε ουρά', + 'settings.offline.banner.queued.one': 'Εκτός σύνδεσης · {count} σε ουρά', 'settings.offline.banner.syncing': 'Συγχρονισμός {count}…', + 'settings.offline.banner.syncing.one': 'Συγχρονισμός {count}…', 'settings.offline.banner.failed': 'Αποτυχία συγχρονισμού: {count}', + 'settings.offline.banner.failed.one': 'Αποτυχία συγχρονισμού: {count}', 'settings.offline.banner.conflicts': 'Διενέξεις: {count}', + 'settings.offline.banner.conflicts.one': 'Διενέξεις: {count}', 'settings.pluginActivity.title': 'Δραστηριότητα προσθέτων', 'settings.pluginActivity.description': 'Κάθε ενέργεια που εκτέλεσε ένα πρόσθετο εκ μέρους σας, με τις πιο πρόσφατες πρώτες.', @@ -612,6 +616,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Τα πάντα', 'settings.apiScopes.noneSelected': 'Διάλεξε τουλάχιστον έναν τομέα, αλλιώς το κλειδί δεν θα μπορούσε να διαβάσει τίποτα.', 'settings.apiScopes.limited': '{count} από {total}', + 'settings.apiScopes.limited.one': '{count} από {total}', 'settings.apiScopes.trips': 'Ταξίδια', 'settings.apiScopes.days': 'Ημέρες', 'settings.apiScopes.places': 'Τοποθεσίες', diff --git a/shared/src/i18n/gr/tours.ts b/shared/src/i18n/gr/tours.ts index 0ec29f643..813e8595b 100644 --- a/shared/src/i18n/gr/tours.ts +++ b/shared/src/i18n/gr/tours.ts @@ -70,6 +70,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Σημεία διέλευσης', 'tours.planner.waypointLabel': 'Σημείο διέλευσης {n}', 'tours.durationMinutes': '{count} λεπτά', + 'tours.durationMinutes.one': '{count} λεπτό', 'tours.planner.empty': 'Προσθέστε τουλάχιστον δύο σημεία για να υπολογιστεί μια διαδρομή πεζοπορίας.', 'tours.planner.start': 'Αφετηρία', 'tours.planner.via': 'Μέσω', diff --git a/shared/src/i18n/gr/trip.ts b/shared/src/i18n/gr/trip.ts index 4e12e2643..5dd4c844c 100644 --- a/shared/src/i18n/gr/trip.ts +++ b/shared/src/i18n/gr/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} μετεπιβιβάσεις', 'transit.transfers.one': '{count} μετεπιβίβαση', 'transit.min': '{count} λεπτά', + 'transit.min.one': '{count} λεπτό', 'transit.stops': '{count} στάσεις', 'transit.stops.one': '{count} στάση', 'transit.walkTo': 'Περπάτημα προς {name}', diff --git a/shared/src/i18n/gr/vacay.ts b/shared/src/i18n/gr/vacay.ts index 8505df59a..efd017ceb 100644 --- a/shared/src/i18n/gr/vacay.ts +++ b/shared/src/i18n/gr/vacay.ts @@ -88,6 +88,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Αυτόματη μεταφορά των υπολοίπων ημερών διακοπών στο επόμενο έτος', 'vacay.carriedOverPrevPeriod': 'από την προηγούμενη περίοδο', 'vacay.compUsedCount': '{count} ρεπό', + 'vacay.compUsedCount.one': '{count} ρεπό', 'vacay.yearType': 'Έτος διακοπών', 'vacay.yearTypeHint': 'Πότε ξεκινά το έτος διακοπών σας — βάσει αυτού υπολογίζονται το δικαίωμα, η χρήση και η μεταφορά', diff --git a/shared/src/i18n/hu/admin.ts b/shared/src/i18n/hu/admin.ts index f8887ecd3..e088b5495 100644 --- a/shared/src/i18n/hu/admin.ts +++ b/shared/src/i18n/hu/admin.ts @@ -578,8 +578,10 @@ const admin: TranslationStrings = { 'admin.plugins.cap.events': 'Reagál a tevékenységre', 'admin.plugins.cap.requiresAddon': '{addon} szükséges', 'admin.plugins.cap.dependsOn': '{id} {version} szükséges', - 'admin.plugins.dep.addonDisabledToast': 'Előbb engedélyezze a szükséges bővítmény(eke)t: {addons}', - 'admin.plugins.dep.autoEnabled': 'Előbb engedélyezett szükséges pluginek: {plugins}', + 'admin.plugins.dep.addonDisabledToast': 'Előbb engedélyezze a szükséges bővítményeket: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Előbb engedélyezze a szükséges bővítményt: {addons}', + 'admin.plugins.dep.autoEnabled': 'A szükséges pluginek előbb engedélyezve: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'A szükséges plugin előbb engedélyezve: {plugins}', 'admin.plugins.dep.downloaded': '{id} letöltve', 'admin.plugins.dep.resolveTitle': 'Hiányzó függőségek', 'admin.plugins.dep.resolveBody': 'A(z) „{name}” engedélyezéséhez előbb telepíteni kell ezeket a plugineket.', @@ -680,6 +682,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Frissítés', 'admin.audit.loadMore': 'Továbbiak betöltése', 'admin.audit.showing': '{count} betöltve · {total} összesen', + 'admin.audit.showing.one': '{count} betöltve · {total} összesen', 'admin.audit.col.time': 'Időpont', 'admin.audit.col.user': 'Felhasználó', 'admin.audit.col.action': 'Művelet', diff --git a/shared/src/i18n/hu/collab.ts b/shared/src/i18n/hu/collab.ts index cc756237e..7271d8ae1 100644 --- a/shared/src/i18n/hu/collab.ts +++ b/shared/src/i18n/hu/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Korábbi üzenetek betöltése', 'collab.chat.justNow': 'éppen most', 'collab.chat.minutesAgo': '{n} perce', + 'collab.chat.minutesAgo.one': '{n} perce', 'collab.chat.hoursAgo': '{n} órája', + 'collab.chat.hoursAgo.one': '{n} órája', 'collab.notes.title': 'Jegyzetek', 'collab.notes.new': 'Új jegyzet', 'collab.notes.empty': 'Még nincsenek jegyzetek', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Kitűzés', 'collab.notes.unpin': 'Kitűzés eltávolítása', 'collab.notes.daysAgo': '{n} napja', + 'collab.notes.daysAgo.one': '{n} napja', 'collab.notes.categorySettings': 'Kategóriák kezelése', 'collab.notes.create': 'Létrehozás', 'collab.notes.website': 'Weboldal', diff --git a/shared/src/i18n/hu/collection.ts b/shared/src/i18n/hu/collection.ts index 17e33e764..add773c53 100644 --- a/shared/src/i18n/hu/collection.ts +++ b/shared/src/i18n/hu/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': '{count} mentése listába', + 'collections.saveNToList.one': '{count} mentése listába', 'collections.addedNToList': '{count} mentve ide: {name}', + 'collections.addedNToList.one': '{count} mentve ide: {name}', 'collections.noOwnLists': 'Még nincsenek listáid', 'collections.saveToListHint': 'A duplikátumok automatikusan kimaradnak', 'collections.role.label': 'Szerep', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Áthelyezés listába', 'collections.duplicateToList': 'Másolás listába', 'collections.moveToListTitle': '{count} áthelyezése másik listába', + 'collections.moveToListTitle.one': '{count} áthelyezése másik listába', 'collections.duplicateToListTitle': '{count} másolása másik listába', + 'collections.duplicateToListTitle.one': '{count} másolása másik listába', 'collections.noOtherLists': 'Nincs még másik lista', 'collections.movedCount': '{count} hely áthelyezve', 'collections.movedCount.one': '{count} hely áthelyezve', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} kijelölve', 'collections.importSelectedCount.one': '{count} kijelölve', 'collections.importAction': '{count} importálása', + 'collections.importAction.one': '{count} importálása', 'collections.importEmptyTrip': 'Ennek az utazásnak még nincsenek helyei', 'collections.importNothingNew': 'Ebből az utazásból már minden rajta van a listán', 'collections.importDone': '{count} hely hozzáadva', @@ -116,6 +121,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Másolás utazásba', 'collections.copyToTripTitle': 'Másolás utazásba', 'collections.copyN': '{count} másolása utazásba', + 'collections.copyN.one': 'Másolás utazásba', 'collections.copyToTripSearch': 'Utazások keresése', 'collections.searchLists': 'Listák keresése', 'collections.copyToTripConfirm': 'Másolás', @@ -151,6 +157,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Eltávolítva a gyűjteményből', 'collections.picker.title': 'Mentett helyek', 'collections.picker.showMore': 'További {count} megjelenítése', + 'collections.picker.showMore.one': 'További {count} megjelenítése', 'collections.picker.search': 'Mentett helyek keresése', 'collections.picker.empty': 'Nincs hozzáadható mentett hely', 'collections.picker.hint': 'Válassz egy helyet a gyűjteményeidből', @@ -173,6 +180,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{count} hely hozzáadva ehhez: {name}', 'collections.file.doneInto.one': '{count} hely hozzáadva ehhez: {name}', 'collections.file.doneIntoDuplicates': '{count} hozzáadva ehhez: {name}, {duplicates} már benne volt', + 'collections.file.doneIntoDuplicates.one': '{count} hozzáadva ehhez: {name}, {duplicates} már benne volt', 'collections.file.doneIntoNothing': 'A fájl minden helye már benne van ebben: {name}', 'collections.file.change': 'Csere', 'collections.file.labelCount': '{count} címke', @@ -203,6 +211,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Ez nem GPX-fájl.', 'collections.file.errorTooManyPlaces': 'Ebben a fájlban több mint {count} hely van. Oszd fel, és importáld a részeket egyenként.', + 'collections.file.errorTooManyPlaces.one': + 'Ebben a fájlban több mint {count} hely van. Oszd fel, és importáld a részeket egyenként.', 'collections.share.title': 'Lista megosztása', 'collections.share.titleNamed': '„{name}” megosztása', diff --git a/shared/src/i18n/hu/common.ts b/shared/src/i18n/hu/common.ts index 877030f6c..46fb36b69 100644 --- a/shared/src/i18n/hu/common.ts +++ b/shared/src/i18n/hu/common.ts @@ -55,7 +55,9 @@ const common: TranslationStrings = { 'common.copied': 'Másolva', 'common.justNow': 'az imént', 'common.hoursAgo': '{count} órája', + 'common.hoursAgo.one': '{count} órája', 'common.daysAgo': '{count} napja', + 'common.daysAgo.one': '{count} napja', 'common.datepicker.prevMonth': 'Previous month', // en-fallback 'common.datepicker.nextMonth': 'Next month', // en-fallback 'common.datepicker.prevYear': 'Previous year', // en-fallback diff --git a/shared/src/i18n/hu/dashboard.ts b/shared/src/i18n/hu/dashboard.ts index 73c14dfcb..0f6ae2495 100644 --- a/shared/src/i18n/hu/dashboard.ts +++ b/shared/src/i18n/hu/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} utazás ({archived} archivált)', 'dashboard.subtitle.trips.one': '{count} utazás ({archived} archivált)', 'dashboard.subtitle.empty': 'Indítsd el az első utazásodat', - 'dashboard.subtitle.activeOne': '{count} aktív utazás', - 'dashboard.subtitle.activeMany': '{count} aktív utazás', + 'dashboard.subtitle.active': '{count} aktív utazás', + 'dashboard.subtitle.active.one': '{count} aktív utazás', 'dashboard.subtitle.archivedSuffix': ' · {count} archivált', 'dashboard.subtitle.archivedSuffix.one': ' · {count} archivált', 'dashboard.newTrip': 'Új utazás', @@ -115,6 +115,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Eltávolítod a napokat?', 'dashboard.shrinkIntro': 'Az új dátumok mentésekor ezek a napok eltávolításra kerülnek:', 'dashboard.shrinkMoreDays': '+{count} további', + 'dashboard.shrinkMoreDays.one': '+{count} további', 'dashboard.shrinkLastDays': 'Az utolsó napok kerülnek ki, nem az elsők', 'dashboard.shrinkLastDaysHint': 'A napi tervek az új dátumokkal együtt mozognak, ezért mindig a terv utolsó napjai kerülnek ki, akkor is, ha a kezdés változott.', diff --git a/shared/src/i18n/hu/dawarich.ts b/shared/src/i18n/hu/dawarich.ts index 4f704f7dd..8a8ecd018 100644 --- a/shared/src/i18n/hu/dawarich.ts +++ b/shared/src/i18n/hu/dawarich.ts @@ -96,6 +96,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Elvetve', 'dawarich.suggestions.restore': 'Visszatétel', 'dawarich.suggestions.showHandled': '{count} elintézett megjelenítése', + 'dawarich.suggestions.showHandled.one': '{count} elintézett megjelenítése', 'dawarich.suggestions.hideHandled': 'A már elintézettek elrejtése', 'dawarich.suggestions.matchesWish': 'A kívánságlistádon: {name}', 'dawarich.suggestions.acceptedAs.place': 'Hozzáadva helyszínként', @@ -147,6 +148,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'A kívánságlistádról semmi nem bukkant fel a rögzítéseidben.', 'dawarich.bucket.alreadyVisited': 'Már kipipálva', 'dawarich.bucket.confirm': '{count} kipipálása', + 'dawarich.bucket.confirm.one': '{count} kipipálása', 'dawarich.bucket.confirmed': '{count} kívánság kipipálva', 'dawarich.bucket.confirmed.one': '{count} kívánság kipipálva', 'dawarich.bucket.skipped': '{count} bejegyzésnek nincs koordinátája, ezért nem volt ellenőrizhető.', diff --git a/shared/src/i18n/hu/dayplan.ts b/shared/src/i18n/hu/dayplan.ts index d34d93c5c..43ee18768 100644 --- a/shared/src/i18n/hu/dayplan.ts +++ b/shared/src/i18n/hu/dayplan.ts @@ -104,11 +104,15 @@ const dayplan: TranslationStrings = { 'Minden hely lekerül erről a napról. A helyek az utazásban maradnak, a nap pedig megtartja a jegyzeteit és foglalásait.', 'dayplan.deleteDayEmpty': 'Erre a napra nincs semmi tervezve.', 'dayplan.impactPlaces': 'Tervezett helyek: {count}', + 'dayplan.impactPlaces.one': 'Tervezett helyek: {count}', 'dayplan.impactPlacesHint': 'A helyek listájában maradnak.', 'dayplan.impactNotes': 'Jegyzetek: {count}', + 'dayplan.impactNotes.one': 'Jegyzetek: {count}', 'dayplan.impactTexts': 'Napcímek és leírások: {count}', + 'dayplan.impactTexts.one': 'Napcímek és leírások: {count}', 'dayplan.impactDeletedHint': 'Ezek is törlődnek.', 'dayplan.impactBookings': 'Foglalások: {count}', + 'dayplan.impactBookings.one': 'Foglalások: {count}', 'dayplan.impactStay': 'Szállás: {name}', 'dayplan.deleteDayBookingsHint': 'A Foglalások között maradnak, nap nélkül.', 'dayplan.deleteDayStayHint': @@ -120,8 +124,11 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'A bejelentkezés vagy a kijelentkezés erre a napra esik, ezért a szállás lemondásra kerül a(z) „{booking}” foglalással és annak {amount} összegű kiadásával együtt.', 'dayplan.deleteDayShift': 'Későbbi napok: {count}', + 'dayplan.deleteDayShift.one': 'Későbbi napok: {count}', 'dayplan.deleteDayShiftHint': 'Mindegyik egy dátummal előrébb kerül.', 'dayplan.deleteDayShiftBookingsHint': 'Mindegyik egy dátummal előrébb kerül. Velük együtt mozgó foglalások: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Mindegyik egy dátummal előrébb kerül. Velük együtt mozgó foglalások: {count}', 'dayplan.deleteDayShrink': 'Az utazás mostantól ekkor ér véget: {date}', 'dayplan.deleteDayShrinkHint': 'Nincs dátum nélküli nap, amely átvehetné az utolsó dátumot.', 'dayplan.impactStayShorter': 'Szállás: {name}, eggyel kevesebb éjszaka', diff --git a/shared/src/i18n/hu/docsync.ts b/shared/src/i18n/hu/docsync.ts index add49b476..61bf5cbff 100644 --- a/shared/src/i18n/hu/docsync.ts +++ b/shared/src/i18n/hu/docsync.ts @@ -73,6 +73,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Kikerült a mappából', 'docsync.conflict.resolve': '{count} megoldása', + 'docsync.conflict.resolve.one': '{count} megoldása', 'docsync.conflict.title': 'Mindkét példány megváltozott', 'docsync.conflict.keepTrek': 'A TREK-verzió megtartása', diff --git a/shared/src/i18n/hu/journey.ts b/shared/src/i18n/hu/journey.ts index d927f66f0..47936f569 100644 --- a/shared/src/i18n/hu/journey.ts +++ b/shared/src/i18n/hu/journey.ts @@ -669,6 +669,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Javaslat elvetve', 'journey.suggestions.restore': 'Elvetett javaslatok visszahozása', 'journey.suggestions.restoreCount': 'Elvetett javaslatok ({count})', + 'journey.suggestions.restoreCount.one': 'Elvetett javaslatok ({count})', 'journey.suggestions.restored': '{count} javaslat visszahozva', 'journey.suggestions.restored.one': '{count} javaslat visszahozva', 'journey.detail.addOnThisDay': 'Bejegyzés hozzáadása ehhez a naphoz', diff --git a/shared/src/i18n/hu/memories.ts b/shared/src/i18n/hu/memories.ts index b710e0c4b..655886fe9 100644 --- a/shared/src/i18n/hu/memories.ts +++ b/shared/src/i18n/hu/memories.ts @@ -63,6 +63,7 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Megosztás az utazótársakkal?', 'memories.confirmShareHint': '{count} fotó lesz látható az utazás összes tagja számára. Később egyenként is priváttá teheted őket.', + 'memories.confirmShareHint.one': '{count} fotó lesz látható az utazás összes tagja számára. Később priváttá teheted.', 'memories.confirmShareButton': 'Fotók megosztása', 'memories.error.loadAlbums': 'Az albumok betöltése sikertelen', 'memories.error.linkAlbum': 'Az album csatolása sikertelen', diff --git a/shared/src/i18n/hu/packing.ts b/shared/src/i18n/hu/packing.ts index 9cd544aed..465d019eb 100644 --- a/shared/src/i18n/hu/packing.ts +++ b/shared/src/i18n/hu/packing.ts @@ -32,13 +32,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Markdown-lista is használható: a címsor adja a kategóriát, a "- [ ]" és "- [x]" sorokból tételek lesznek, a név előtti "3x" pedig a mennyiséget adja meg.', 'packing.importAction': '{count} importálása', + 'packing.importAction.one': '{count} importálása', 'packing.importSuccess': '{count} tétel importálva', 'packing.importSuccess.one': '{count} tétel importálva', 'packing.importError': 'Importálás sikertelen', 'packing.importEmpty': 'Nincsenek importálható tételek', 'packing.progress': '{packed} / {total} becsomagolva ({percent}%)', 'packing.clearChecked': '{count} kipipált eltávolítása', + 'packing.clearChecked.one': '{count} kipipált eltávolítása', 'packing.clearCheckedShort': '{count} eltávolítása', + 'packing.clearCheckedShort.one': '{count} eltávolítása', 'packing.allPacked': 'Minden be van csomagolva!', 'packing.addPlaceholder': 'Új tárgy hozzáadása...', 'packing.categoryPlaceholder': 'Lista...', @@ -99,6 +102,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'Még senki más ezen az úton', 'packing.takenCareOf': '{name} hozza', 'packing.sharedWithCount': 'megosztva {count} fővel', + 'packing.sharedWithCount.one': 'megosztva {count} fővel', 'packing.broughtBy': 'hozza: {name}', 'packing.alsoBring': 'Én is tudom hozni', 'packing.alsoBringingStop': 'Mégsem hozom', diff --git a/shared/src/i18n/hu/photos.ts b/shared/src/i18n/hu/photos.ts index 818b72187..400123580 100644 --- a/shared/src/i18n/hu/photos.ts +++ b/shared/src/i18n/hu/photos.ts @@ -16,6 +16,7 @@ const photos: TranslationStrings = { 'photos.linkPlace': 'Hely társítása', 'photos.noPlace': 'Nincs hely', 'photos.uploadN': '{n} fotó feltöltése', + 'photos.uploadN.one': '{n} fotó feltöltése', 'photos.linkDay': 'Nap csatolása', 'photos.noDay': 'Nincs nap', 'photos.dayLabel': '{number}. nap', diff --git a/shared/src/i18n/hu/reservations.ts b/shared/src/i18n/hu/reservations.ts index fc614213e..5edc50e33 100644 --- a/shared/src/i18n/hu/reservations.ts +++ b/shared/src/i18n/hu/reservations.ts @@ -182,6 +182,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Egyéb járatok', 'reservations.airtrail.empty': 'Nem található járat az AirTrail-fiókodban.', 'reservations.airtrail.importCta': '{count} importálása', + 'reservations.airtrail.importCta.one': '{count} importálása', 'reservations.airtrail.joinConnection': 'Importálás egyetlen járatként, átszállással itt: {stops}', 'reservations.costsLabel': 'Költségek', 'reservations.createExpense': 'Költség létrehozása', diff --git a/shared/src/i18n/hu/roadtrip.ts b/shared/src/i18n/hu/roadtrip.ts index cabede540..9e4c09fbb 100644 --- a/shared/src/i18n/hu/roadtrip.ts +++ b/shared/src/i18n/hu/roadtrip.ts @@ -197,6 +197,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Az útvonalon semmi sem egyezik ezzel: „{name}”.', 'roadtrip.poi.noneMatchFilters': 'Az útvonalon semmi sem felel meg ezeknek a szűrőknek.', 'roadtrip.poi.foundFiltered': '{count} / {total} az útvonalon', + 'roadtrip.poi.foundFiltered.one': '{count} / {total} az útvonalon', 'roadtrip.poi.truncated': '{count} szakaszon több találat volt, mint amennyi egy válaszba belefér. Szűkítsd a keresési sávot, hogy lásd a többit.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/hu/settings.ts b/shared/src/i18n/hu/settings.ts index ae6c870a7..7fe142a07 100644 --- a/shared/src/i18n/hu/settings.ts +++ b/shared/src/i18n/hu/settings.ts @@ -576,9 +576,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Offline', 'settings.offline.banner.forced': 'Offline mód', 'settings.offline.banner.queued': 'Offline · {count} sorban', + 'settings.offline.banner.queued.one': 'Offline · {count} sorban', 'settings.offline.banner.syncing': '{count} szinkronizálása…', + 'settings.offline.banner.syncing.one': '{count} szinkronizálása…', 'settings.offline.banner.failed': 'Sikertelen szinkronizálás: {count}', + 'settings.offline.banner.failed.one': 'Sikertelen szinkronizálás: {count}', 'settings.offline.banner.conflicts': 'Ütközések: {count}', + 'settings.offline.banner.conflicts.one': 'Ütközések: {count}', 'settings.pluginActivity.title': 'Bővítmény-tevékenység', 'settings.pluginActivity.description': 'Minden művelet, amelyet egy bővítmény a nevedben végzett, a legújabbtól kezdve.', @@ -601,6 +605,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Minden', 'settings.apiScopes.noneSelected': 'Válassz legalább egy területet, különben a kulcs semmit sem olvashatna.', 'settings.apiScopes.limited': '{count} / {total}', + 'settings.apiScopes.limited.one': '{count} / {total}', 'settings.apiScopes.trips': 'Utazások', 'settings.apiScopes.days': 'Napok', 'settings.apiScopes.places': 'Helyszínek', diff --git a/shared/src/i18n/hu/tours.ts b/shared/src/i18n/hu/tours.ts index 18c65bb2e..93c0dab97 100644 --- a/shared/src/i18n/hu/tours.ts +++ b/shared/src/i18n/hu/tours.ts @@ -67,6 +67,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Útvonalpontok', 'tours.planner.waypointLabel': '{n}. útvonalpont', 'tours.durationMinutes': '{count} perc', + 'tours.durationMinutes.one': '{count} perc', 'tours.planner.empty': 'Adj hozzá legalább két pontot egy gyalogos útvonal kiszámításához.', 'tours.planner.start': 'Kezdőpont', 'tours.planner.via': 'Köztes pont', diff --git a/shared/src/i18n/hu/trip.ts b/shared/src/i18n/hu/trip.ts index 71add4055..e7b259cbf 100644 --- a/shared/src/i18n/hu/trip.ts +++ b/shared/src/i18n/hu/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} átszállás', 'transit.transfers.one': '{count} átszállás', 'transit.min': '{count} perc', + 'transit.min.one': '{count} perc', 'transit.stops': '{count} megálló', 'transit.stops.one': '{count} megálló', 'transit.walkTo': 'Gyaloglás ide: {name}', diff --git a/shared/src/i18n/hu/vacay.ts b/shared/src/i18n/hu/vacay.ts index 25decd0fe..a04619cc4 100644 --- a/shared/src/i18n/hu/vacay.ts +++ b/shared/src/i18n/hu/vacay.ts @@ -87,6 +87,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Megmaradt szabadságnapok automatikus átvitele a következő évre', 'vacay.carriedOverPrevPeriod': 'az előző időszakból', 'vacay.compUsedCount': '{count} csúsztatás', + 'vacay.compUsedCount.one': '{count} csúsztatás', 'vacay.yearType': 'Szabadságév', 'vacay.yearTypeHint': 'Mikor kezdődik a szabadságéved — a keret, a felhasználás és az átvitel ehhez igazodik', 'vacay.yearTypeCalendar': 'Naptári év', diff --git a/shared/src/i18n/i18n-parity.spec.ts b/shared/src/i18n/i18n-parity.spec.ts index 070fa82ec..8c3b71631 100644 --- a/shared/src/i18n/i18n-parity.spec.ts +++ b/shared/src/i18n/i18n-parity.spec.ts @@ -1,5 +1,5 @@ // @ts-expect-error — plain .mjs script with no .d.ts; import as JS module. -import { checkParity } from '../../scripts/i18n-parity.mjs'; +import { checkCountStrings, checkParity, NOT_PLURAL } from '../../scripts/i18n-parity.mjs'; import { describe, it, expect } from 'vitest'; @@ -31,3 +31,36 @@ describe('i18n parity', () => { } }); }); + +describe('i18n count strings', () => { + const ROOT = new URL('../../scripts/fixtures/i18n/', import.meta.url); + + it('refuses an en string with {count} or {n} outside a plural group', () => { + const { ungrouped, stale } = checkCountStrings(['a.ts'], [], ROOT); + expect(ungrouped).toEqual([ + { file: 'a.ts', key: 'a.lone' }, + { file: 'a.ts', key: 'a.day' }, + ]); + expect(stale).toEqual([]); + }); + + it('lets a number that is no quantity through NOT_PLURAL, and refuses a stale entry', () => { + const allowed = [ + { key: 'a.day', because: 'a day number' }, + { key: 'a.count', because: 'a group now' }, + ]; + expect(checkCountStrings(['a.ts'], allowed, ROOT)).toEqual({ + ungrouped: [{ file: 'a.ts', key: 'a.lone' }], + stale: ['a.count'], + }); + }); + + it('every NOT_PLURAL entry says why', () => { + for (const { because } of NOT_PLURAL) expect(because.length).toBeGreaterThan(10); + }); + + it('every count-bearing en string is a plural group or on NOT_PLURAL', () => { + const report = checkParity(); + expect(report.countDrift).toEqual({ ungrouped: [], stale: [] }); + }); +}); diff --git a/shared/src/i18n/id/dashboard.ts b/shared/src/i18n/id/dashboard.ts index 8d5d7ac26..55b0205a9 100644 --- a/shared/src/i18n/id/dashboard.ts +++ b/shared/src/i18n/id/dashboard.ts @@ -5,8 +5,7 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.loading': 'Memuat perjalanan...', 'dashboard.subtitle.trips': '{count} perjalanan ({archived} diarsipkan)', 'dashboard.subtitle.empty': 'Mulai perjalanan pertamamu', - 'dashboard.subtitle.activeOne': '{count} perjalanan aktif', - 'dashboard.subtitle.activeMany': '{count} perjalanan aktif', + 'dashboard.subtitle.active': '{count} perjalanan aktif', 'dashboard.subtitle.archivedSuffix': ' · {count} diarsipkan', 'dashboard.newTrip': 'Perjalanan Baru', 'dashboard.newTripSub': 'Rencanakan perjalanan baru dari awal', diff --git a/shared/src/i18n/it/admin.ts b/shared/src/i18n/it/admin.ts index 4c3c4228e..5f3d24bd6 100644 --- a/shared/src/i18n/it/admin.ts +++ b/shared/src/i18n/it/admin.ts @@ -576,7 +576,9 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Richiede {addon}', 'admin.plugins.cap.dependsOn': 'Richiede {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Abilita prima gli addon richiesti: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': "Abilita prima l'addon richiesto: {addons}", 'admin.plugins.dep.autoEnabled': 'Abilitati prima i plugin richiesti: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Abilitato prima il plugin richiesto: {plugins}', 'admin.plugins.dep.downloaded': 'Scaricato {id}', 'admin.plugins.dep.resolveTitle': 'Dipendenze mancanti', 'admin.plugins.dep.resolveBody': '“{name}” richiede questi plugin installati prima di poter essere abilitato.', @@ -678,6 +680,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Aggiorna', 'admin.audit.loadMore': 'Carica altro', 'admin.audit.showing': '{count} caricati · {total} totali', + 'admin.audit.showing.one': '{count} caricato · {total} totali', 'admin.audit.col.time': 'Ora', 'admin.audit.col.user': 'Utente', 'admin.audit.col.action': 'Azione', diff --git a/shared/src/i18n/it/collab.ts b/shared/src/i18n/it/collab.ts index e7152ac45..33c96d3fe 100644 --- a/shared/src/i18n/it/collab.ts +++ b/shared/src/i18n/it/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Carica messaggi precedenti', 'collab.chat.justNow': 'ora', 'collab.chat.minutesAgo': '{n}m fa', + 'collab.chat.minutesAgo.one': '{n}m fa', 'collab.chat.hoursAgo': '{n}h fa', + 'collab.chat.hoursAgo.one': '{n}h fa', 'collab.notes.title': 'Note', 'collab.notes.new': 'Nuova nota', 'collab.notes.empty': 'Ancora nessuna nota', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Fissa', 'collab.notes.unpin': 'Rimuovi', 'collab.notes.daysAgo': '{n}g fa', + 'collab.notes.daysAgo.one': '{n}g fa', 'collab.notes.categorySettings': 'Gestisci categorie', 'collab.notes.create': 'Crea', 'collab.notes.website': 'Sito web', diff --git a/shared/src/i18n/it/collection.ts b/shared/src/i18n/it/collection.ts index 5008ccb5a..e14c13479 100644 --- a/shared/src/i18n/it/collection.ts +++ b/shared/src/i18n/it/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Salva {count} in una lista', + 'collections.saveNToList.one': 'Salva {count} in una lista', 'collections.addedNToList': '{count} salvati in {name}', + 'collections.addedNToList.one': '{count} salvato in {name}', 'collections.noOwnLists': 'Non hai ancora liste', 'collections.saveToListHint': 'I duplicati vengono ignorati automaticamente', 'collections.role.label': 'Ruolo', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Sposta in lista', 'collections.duplicateToList': 'Duplica in lista', 'collections.moveToListTitle': "Sposta {count} in un'altra lista", + 'collections.moveToListTitle.one': "Sposta {count} in un'altra lista", 'collections.duplicateToListTitle': "Duplica {count} in un'altra lista", + 'collections.duplicateToListTitle.one': "Duplica {count} in un'altra lista", 'collections.noOtherLists': "Nessun'altra lista", 'collections.movedCount': 'Spostati {count} luoghi', 'collections.movedCount.one': 'Spostato {count} luogo', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} selezionati', 'collections.importSelectedCount.one': '{count} selezionato', 'collections.importAction': 'Importa {count}', + 'collections.importAction.one': 'Importa {count}', 'collections.importEmptyTrip': 'Questo viaggio non ha ancora luoghi', 'collections.importNothingNew': 'Tutto questo viaggio è già in questa lista', 'collections.importDone': 'Aggiunti {count} luoghi', @@ -115,6 +120,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Copia nel viaggio', 'collections.copyToTripTitle': 'Copia nel viaggio', 'collections.copyN': 'Copia {count} nel viaggio', + 'collections.copyN.one': 'Copia nel viaggio', 'collections.copyToTripSearch': 'Cerca viaggi', 'collections.searchLists': 'Cerca elenchi', 'collections.copyToTripConfirm': 'Copia', @@ -150,6 +156,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Rimosso dalla raccolta', 'collections.picker.title': 'Luoghi salvati', 'collections.picker.showMore': 'Mostra altri {count}', + 'collections.picker.showMore.one': 'Mostra ancora {count}', 'collections.picker.search': 'Cerca tra i tuoi luoghi salvati', 'collections.picker.empty': 'Nessun luogo salvato da aggiungere', 'collections.picker.hint': 'Scegli un luogo dalle tue raccolte', @@ -172,6 +179,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{count} luoghi aggiunti a {name}', 'collections.file.doneInto.one': '{count} luogo aggiunto a {name}', 'collections.file.doneIntoDuplicates': '{count} aggiunti a {name}, {duplicates} erano già presenti', + 'collections.file.doneIntoDuplicates.one': '{count} aggiunto a {name}, {duplicates} erano già presenti', 'collections.file.doneIntoNothing': 'Tutti i luoghi del file sono già in {name}', 'collections.file.change': 'Cambia', 'collections.file.labelCount': '{count} etichette', @@ -203,6 +211,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Questo non è un file GPX.', 'collections.file.errorTooManyPlaces': 'Questo file contiene più di {count} luoghi. Dividilo e importa le parti una alla volta.', + 'collections.file.errorTooManyPlaces.one': + 'Questo file contiene più di {count} luogo. Dividilo e importa le parti una alla volta.', 'collections.share.title': 'Condividi lista', 'collections.share.titleNamed': 'Condividi «{name}»', diff --git a/shared/src/i18n/it/common.ts b/shared/src/i18n/it/common.ts index 4fd14f38a..1b2cde7d1 100644 --- a/shared/src/i18n/it/common.ts +++ b/shared/src/i18n/it/common.ts @@ -55,7 +55,9 @@ const common: TranslationStrings = { 'common.copied': 'Copiato', 'common.justNow': 'proprio ora', 'common.hoursAgo': '{count}h fa', + 'common.hoursAgo.one': '{count}h fa', 'common.daysAgo': '{count}g fa', + 'common.daysAgo.one': '{count}g fa', 'common.datepicker.prevMonth': 'Mese precedente', 'common.datepicker.nextMonth': 'Mese prossimo', 'common.datepicker.prevYear': 'Anno precedente', diff --git a/shared/src/i18n/it/dashboard.ts b/shared/src/i18n/it/dashboard.ts index 356d13957..3d2f7c7d7 100644 --- a/shared/src/i18n/it/dashboard.ts +++ b/shared/src/i18n/it/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} viaggi ({archived} in archivio)', 'dashboard.subtitle.trips.one': '{count} viaggio ({archived} in archivio)', 'dashboard.subtitle.empty': 'Inizia il tuo primo viaggio', - 'dashboard.subtitle.activeOne': '{count} viaggio attivo', - 'dashboard.subtitle.activeMany': '{count} viaggi attivi', + 'dashboard.subtitle.active': '{count} viaggi attivi', + 'dashboard.subtitle.active.one': '{count} viaggio attivo', 'dashboard.subtitle.archivedSuffix': ' · {count} archiviati', 'dashboard.subtitle.archivedSuffix.one': ' · {count} archiviato', 'dashboard.newTrip': 'Nuovo Viaggio', @@ -115,6 +115,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Rimuovere dei giorni?', 'dashboard.shrinkIntro': 'Salvando le nuove date vengono rimossi questi giorni:', 'dashboard.shrinkMoreDays': '+{count} altri', + 'dashboard.shrinkMoreDays.one': '+{count} altro', 'dashboard.shrinkLastDays': 'Vengono rimossi gli ultimi giorni, non i primi', 'dashboard.shrinkLastDaysHint': "I programmi dei giorni seguono le nuove date, quindi vengono sempre rimossi gli ultimi giorni del piano, anche quando è cambiato l'inizio.", diff --git a/shared/src/i18n/it/dawarich.ts b/shared/src/i18n/it/dawarich.ts index 0c157505e..a7808afc0 100644 --- a/shared/src/i18n/it/dawarich.ts +++ b/shared/src/i18n/it/dawarich.ts @@ -96,6 +96,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Ignorato', 'dawarich.suggestions.restore': 'Ripristina', 'dawarich.suggestions.showHandled': 'Mostra {count} già gestiti', + 'dawarich.suggestions.showHandled.one': 'Mostra {count} già gestito', 'dawarich.suggestions.hideHandled': 'Nascondi quelli già gestiti', 'dawarich.suggestions.matchesWish': 'Nella tua lista dei desideri: {name}', 'dawarich.suggestions.acceptedAs.place': 'Aggiunto come luogo', @@ -147,6 +148,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Nelle tue registrazioni non è emerso nulla della tua lista dei desideri.', 'dawarich.bucket.alreadyVisited': 'Già spuntato', 'dawarich.bucket.confirm': 'Spunta {count}', + 'dawarich.bucket.confirm.one': 'Spunta {count}', 'dawarich.bucket.confirmed': '{count} desideri spuntati', 'dawarich.bucket.confirmed.one': '{count} desiderio spuntato', 'dawarich.bucket.skipped': '{count} voci non hanno coordinate e non sono state controllate.', diff --git a/shared/src/i18n/it/dayplan.ts b/shared/src/i18n/it/dayplan.ts index a5cbead34..1032a58d3 100644 --- a/shared/src/i18n/it/dayplan.ts +++ b/shared/src/i18n/it/dayplan.ts @@ -105,11 +105,15 @@ const dayplan: TranslationStrings = { 'Tutti i luoghi vengono tolti da questo giorno. I luoghi restano nel viaggio e il giorno conserva note e prenotazioni.', 'dayplan.deleteDayEmpty': "Non c'è nulla di pianificato in questo giorno.", 'dayplan.impactPlaces': 'Luoghi pianificati: {count}', + 'dayplan.impactPlaces.one': 'Luoghi pianificati: {count}', 'dayplan.impactPlacesHint': "Restano nell'elenco dei luoghi.", 'dayplan.impactNotes': 'Note: {count}', + 'dayplan.impactNotes.one': 'Note: {count}', 'dayplan.impactTexts': 'Titoli e descrizioni del giorno: {count}', + 'dayplan.impactTexts.one': 'Titoli e descrizioni del giorno: {count}', 'dayplan.impactDeletedHint': 'Vengono eliminati anche questi.', 'dayplan.impactBookings': 'Prenotazioni: {count}', + 'dayplan.impactBookings.one': 'Prenotazioni: {count}', 'dayplan.impactStay': 'Soggiorno presso {name}', 'dayplan.deleteDayBookingsHint': 'Restano in Prenotazioni, senza giorno.', 'dayplan.deleteDayStayHint': 'Il check-in o il check-out cade in questo giorno, quindi il soggiorno viene annullato.', @@ -120,9 +124,12 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Il check-in o il check-out cade in questo giorno, quindi il soggiorno viene annullato insieme alla prenotazione «{booking}» e alla sua spesa di {amount}.', 'dayplan.deleteDayShift': 'Giorni successivi: {count}', + 'dayplan.deleteDayShift.one': 'Giorni successivi: {count}', 'dayplan.deleteDayShiftHint': 'Ognuno passa alla data precedente.', 'dayplan.deleteDayShiftBookingsHint': 'Ognuno passa alla data precedente. Prenotazioni che si spostano con loro: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Ognuno passa alla data precedente. Prenotazioni che si spostano con loro: {count}', 'dayplan.deleteDayShrink': 'Il viaggio ora termina il {date}', 'dayplan.deleteDayShrinkHint': "Non c'è alcun giorno senza data che possa prendere l'ultima data.", 'dayplan.impactStayShorter': 'Soggiorno presso {name}: una notte in meno', diff --git a/shared/src/i18n/it/docsync.ts b/shared/src/i18n/it/docsync.ts index aacfc34f9..8c2d57491 100644 --- a/shared/src/i18n/it/docsync.ts +++ b/shared/src/i18n/it/docsync.ts @@ -71,6 +71,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Spostato fuori dalla cartella', 'docsync.conflict.resolve': 'Risolvi {count}', + 'docsync.conflict.resolve.one': 'Risolvi {count}', 'docsync.conflict.title': 'Entrambe le copie sono cambiate', 'docsync.conflict.keepTrek': 'Mantieni la versione di TREK', diff --git a/shared/src/i18n/it/journey.ts b/shared/src/i18n/it/journey.ts index abd6da292..e066dc955 100644 --- a/shared/src/i18n/it/journey.ts +++ b/shared/src/i18n/it/journey.ts @@ -675,6 +675,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Suggerimento scartato', 'journey.suggestions.restore': 'Recupera i suggerimenti scartati', 'journey.suggestions.restoreCount': 'Suggerimenti scartati ({count})', + 'journey.suggestions.restoreCount.one': 'Suggerimenti scartati ({count})', 'journey.suggestions.restored': '{count} suggerimenti recuperati', 'journey.suggestions.restored.one': '{count} suggerimento recuperato', 'journey.detail.addOnThisDay': 'Aggiungi una voce in questo giorno', diff --git a/shared/src/i18n/it/memories.ts b/shared/src/i18n/it/memories.ts index b7301ca08..35bd9b00e 100644 --- a/shared/src/i18n/it/memories.ts +++ b/shared/src/i18n/it/memories.ts @@ -65,6 +65,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Condividere con i membri del viaggio?', 'memories.confirmShareHint': '{count} foto saranno visibili a tutti i membri di questo viaggio. Potrai rendere private le singole foto in seguito.', + 'memories.confirmShareHint.one': + '{count} foto sarà visibile a tutti i membri di questo viaggio. Potrai renderla privata in seguito.', 'memories.confirmShareButton': 'Condividi foto', 'memories.error.loadAlbums': 'Caricamento album non riuscito', 'memories.error.linkAlbum': 'Collegamento album non riuscito', diff --git a/shared/src/i18n/it/packing.ts b/shared/src/i18n/it/packing.ts index 7605f0c1a..809d9f35e 100644 --- a/shared/src/i18n/it/packing.ts +++ b/shared/src/i18n/it/packing.ts @@ -31,13 +31,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Funziona anche un elenco in Markdown: un titolo indica la categoria, "- [ ]" e "- [x]" diventano articoli e "3x" davanti a un nome imposta la quantità.', 'packing.importAction': 'Importa {count}', + 'packing.importAction.one': 'Importa {count}', 'packing.importSuccess': '{count} elementi importati', 'packing.importSuccess.one': '{count} elemento importato', 'packing.importError': 'Importazione non riuscita', 'packing.importEmpty': 'Nessun elemento da importare', 'packing.progress': '{packed} di {total} in valigia ({percent}%)', 'packing.clearChecked': 'Rimuovi {count} spuntati', + 'packing.clearChecked.one': 'Rimuovi {count} spuntato', 'packing.clearCheckedShort': 'Rimuovi {count}', + 'packing.clearCheckedShort.one': 'Rimuovi {count}', 'packing.allPacked': 'Tutto in valigia!', 'packing.addPlaceholder': 'Aggiungi nuovo elemento...', 'packing.categoryPlaceholder': 'Lista...', @@ -97,6 +100,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'Ancora nessun altro in questo viaggio', 'packing.takenCareOf': 'da {name}', 'packing.sharedWithCount': 'condiviso con {count}', + 'packing.sharedWithCount.one': 'condiviso con {count}', 'packing.broughtBy': 'lo porta {name}', 'packing.alsoBring': "Posso portarlo anch'io", 'packing.alsoBringingStop': 'Non lo porto', diff --git a/shared/src/i18n/it/photos.ts b/shared/src/i18n/it/photos.ts index 6acde8125..b57854947 100644 --- a/shared/src/i18n/it/photos.ts +++ b/shared/src/i18n/it/photos.ts @@ -16,6 +16,7 @@ const photos: TranslationStrings = { 'photos.linkPlace': 'Collega luogo', 'photos.noPlace': 'Nessun luogo', 'photos.uploadN': 'Caricamento di {n} foto', + 'photos.uploadN.one': 'Caricamento di {n} foto', 'photos.linkDay': 'Collega giorno', 'photos.noDay': 'Nessun giorno', 'photos.dayLabel': 'Giorno {number}', diff --git a/shared/src/i18n/it/reservations.ts b/shared/src/i18n/it/reservations.ts index 20129200c..23b654526 100644 --- a/shared/src/i18n/it/reservations.ts +++ b/shared/src/i18n/it/reservations.ts @@ -179,6 +179,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Altri voli', 'reservations.airtrail.empty': 'Nessun volo trovato nel tuo account AirTrail.', 'reservations.airtrail.importCta': 'Importa {count}', + 'reservations.airtrail.importCta.one': 'Importa {count}', 'reservations.airtrail.joinConnection': 'Importa come un unico volo con scalo a {stops}', 'reservations.costsLabel': 'Costi', 'reservations.createExpense': 'Crea spesa', diff --git a/shared/src/i18n/it/roadtrip.ts b/shared/src/i18n/it/roadtrip.ts index 97fa7fb1c..0beaae137 100644 --- a/shared/src/i18n/it/roadtrip.ts +++ b/shared/src/i18n/it/roadtrip.ts @@ -198,6 +198,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Lungo il percorso non c’è nulla che corrisponda a “{name}”.', 'roadtrip.poi.noneMatchFilters': 'Niente lungo il percorso corrisponde a questi filtri.', 'roadtrip.poi.foundFiltered': '{count} di {total} lungo il percorso', + 'roadtrip.poi.foundFiltered.one': '{count} di {total} lungo il percorso', 'roadtrip.poi.truncated': 'Su {count} tratti ce n’erano più di quanti ne stiano in una risposta: restringi il corridoio per vedere il resto.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/it/settings.ts b/shared/src/i18n/it/settings.ts index 1ea96a1cb..12fc435d3 100644 --- a/shared/src/i18n/it/settings.ts +++ b/shared/src/i18n/it/settings.ts @@ -580,9 +580,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Offline', 'settings.offline.banner.forced': 'Modalità offline', 'settings.offline.banner.queued': 'Offline · {count} in coda', + 'settings.offline.banner.queued.one': 'Offline · {count} in coda', 'settings.offline.banner.syncing': 'Sincronizzazione di {count}…', + 'settings.offline.banner.syncing.one': 'Sincronizzazione di {count}…', 'settings.offline.banner.failed': 'Sincronizzazione non riuscita: {count}', + 'settings.offline.banner.failed.one': 'Sincronizzazione non riuscita: {count}', 'settings.offline.banner.conflicts': 'Conflitti: {count}', + 'settings.offline.banner.conflicts.one': 'Conflitti: {count}', 'settings.pluginActivity.title': 'Attività dei plugin', 'settings.pluginActivity.description': 'Ogni azione eseguita da un plugin per tuo conto, dalla più recente.', 'settings.pluginActivity.empty': 'Nessuna attività dei plugin.', @@ -604,6 +608,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Tutto', 'settings.apiScopes.noneSelected': "Scegli almeno un'area, altrimenti la chiave non potrebbe leggere nulla.", 'settings.apiScopes.limited': '{count} di {total}', + 'settings.apiScopes.limited.one': '{count} di {total}', 'settings.apiScopes.trips': 'Viaggi', 'settings.apiScopes.days': 'Giorni', 'settings.apiScopes.places': 'Luoghi', diff --git a/shared/src/i18n/it/tours.ts b/shared/src/i18n/it/tours.ts index 77ef7b276..cd6b7c99c 100644 --- a/shared/src/i18n/it/tours.ts +++ b/shared/src/i18n/it/tours.ts @@ -69,6 +69,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Punti di passaggio', 'tours.planner.waypointLabel': 'Punto di passaggio {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', 'tours.planner.empty': 'Aggiungi almeno due punti per calcolare un percorso a piedi.', 'tours.planner.start': 'Partenza', 'tours.planner.via': 'Passaggio per', diff --git a/shared/src/i18n/it/trip.ts b/shared/src/i18n/it/trip.ts index 1235a5972..0df22a267 100644 --- a/shared/src/i18n/it/trip.ts +++ b/shared/src/i18n/it/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} cambi', 'transit.transfers.one': '{count} cambio', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', 'transit.stops': '{count} fermate', 'transit.stops.one': '{count} fermata', 'transit.walkTo': 'A piedi fino a {name}', diff --git a/shared/src/i18n/it/vacay.ts b/shared/src/i18n/it/vacay.ts index 8bfdc07d4..a907a3db8 100644 --- a/shared/src/i18n/it/vacay.ts +++ b/shared/src/i18n/it/vacay.ts @@ -89,6 +89,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': "Riporta automaticamente i giorni di ferie rimanenti all'anno successivo", 'vacay.carriedOverPrevPeriod': 'dal periodo precedente', 'vacay.compUsedCount': '{count} recupero', + 'vacay.compUsedCount.one': '{count} recupero', 'vacay.yearType': 'Anno delle ferie', 'vacay.yearTypeHint': 'Quando inizia il tuo anno delle ferie — disponibilità, giorni usati e riporto seguono questa data', diff --git a/shared/src/i18n/ja/collection.ts b/shared/src/i18n/ja/collection.ts index 6811382b4..8940a7e31 100644 --- a/shared/src/i18n/ja/collection.ts +++ b/shared/src/i18n/ja/collection.ts @@ -180,8 +180,7 @@ const collection: TranslationStrings = { 'このファイルにはトラックポイントも {count} 件あります。トラックはインポートされず、ウェイポイントのみが対象です。', 'collections.file.gpxEmpty': 'この GPX ファイルにはウェイポイントがないため、インポートするものがありません。', 'collections.file.errorNotGpx': 'これは GPX ファイルではありません。', - 'collections.file.errorTooManyPlaces': - 'このファイルには {count} 件を超える場所があります。分割して、1 つずつインポートしてください。', + 'collections.file.errorTooManyPlaces': 'このファイルには {count} 件を超える場所があります。分割して、1 つずつインポートしてください。', 'collections.share.title': 'リストを共有', 'collections.share.titleNamed': '「{name}」を共有', diff --git a/shared/src/i18n/ja/dashboard.ts b/shared/src/i18n/ja/dashboard.ts index cb2a73a0d..122dd933d 100644 --- a/shared/src/i18n/ja/dashboard.ts +++ b/shared/src/i18n/ja/dashboard.ts @@ -5,8 +5,7 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.loading': '旅行を読み込み中...', 'dashboard.subtitle.trips': '{count}件の旅行({archived}件アーカイブ)', 'dashboard.subtitle.empty': '最初の旅行を始めましょう', - 'dashboard.subtitle.activeOne': '進行中の旅行 {count}件', - 'dashboard.subtitle.activeMany': '進行中の旅行 {count}件', + 'dashboard.subtitle.active': '進行中の旅行 {count}件', 'dashboard.subtitle.archivedSuffix': ' · アーカイブ {count}件', 'dashboard.newTrip': '新しい旅行', 'dashboard.newTripSub': '新しい旅行をゼロから計画', diff --git a/shared/src/i18n/ko/dashboard.ts b/shared/src/i18n/ko/dashboard.ts index 42c1968ab..92da95cc8 100644 --- a/shared/src/i18n/ko/dashboard.ts +++ b/shared/src/i18n/ko/dashboard.ts @@ -5,8 +5,7 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.loading': '여행 불러오는 중...', 'dashboard.subtitle.trips': '{count}개 여행 ({archived}개 보관됨)', 'dashboard.subtitle.empty': '첫 번째 여행을 시작하세요', - 'dashboard.subtitle.activeOne': '활성 여행 {count}개', - 'dashboard.subtitle.activeMany': '활성 여행 {count}개', + 'dashboard.subtitle.active': '활성 여행 {count}개', 'dashboard.subtitle.archivedSuffix': ' · {count}개 보관됨', 'dashboard.newTrip': '새 여행', 'dashboard.newTripSub': '새 여행을 처음부터 계획하기', diff --git a/shared/src/i18n/ko/memories.ts b/shared/src/i18n/ko/memories.ts index 543dfb166..6ab6bf7eb 100644 --- a/shared/src/i18n/ko/memories.ts +++ b/shared/src/i18n/ko/memories.ts @@ -56,8 +56,7 @@ const memories: TranslationStrings = { 'memories.tripDates': '여행 날짜', 'memories.allPhotos': '모든 사진', 'memories.confirmShareTitle': '여행 멤버와 공유할까요?', - 'memories.confirmShareHint': - '{count}장의 사진이 이 여행의 모든 멤버에게 표시됩니다. 나중에 개별 사진을 비공개로 만들 수 있습니다.', + 'memories.confirmShareHint': '{count}장의 사진이 이 여행의 모든 멤버에게 표시됩니다. 나중에 개별 사진을 비공개로 만들 수 있습니다.', 'memories.confirmShareButton': '사진 공유', 'memories.error.loadAlbums': '앨범 불러오기 실패', 'memories.error.linkAlbum': '앨범 연결 실패', diff --git a/shared/src/i18n/nl/admin.ts b/shared/src/i18n/nl/admin.ts index 5c2c17bd6..f8cee9ca8 100644 --- a/shared/src/i18n/nl/admin.ts +++ b/shared/src/i18n/nl/admin.ts @@ -571,8 +571,10 @@ const admin: TranslationStrings = { 'admin.plugins.cap.events': 'Reageert op activiteit', 'admin.plugins.cap.requiresAddon': 'Vereist {addon}', 'admin.plugins.cap.dependsOn': 'Vereist {id} {version}', - 'admin.plugins.dep.addonDisabledToast': 'Schakel eerst de vereiste add-on(s) in: {addons}', - 'admin.plugins.dep.autoEnabled': 'Eerst vereiste plug-in(s) ingeschakeld: {plugins}', + 'admin.plugins.dep.addonDisabledToast': 'Schakel eerst de vereiste add-ons in: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Schakel eerst de vereiste add-on in: {addons}', + 'admin.plugins.dep.autoEnabled': 'Eerst vereiste plug-ins ingeschakeld: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Eerst vereiste plug-in ingeschakeld: {plugins}', 'admin.plugins.dep.downloaded': '{id} gedownload', 'admin.plugins.dep.resolveTitle': 'Ontbrekende afhankelijkheden', 'admin.plugins.dep.resolveBody': '“{name}” heeft deze plug-ins nodig voordat het kan worden ingeschakeld.', @@ -701,6 +703,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Vernieuwen', 'admin.audit.loadMore': 'Meer laden', 'admin.audit.showing': '{count} geladen · {total} totaal', + 'admin.audit.showing.one': '{count} geladen · {total} totaal', 'admin.audit.col.time': 'Tijd', 'admin.audit.col.user': 'Gebruiker', 'admin.audit.col.action': 'Actie', diff --git a/shared/src/i18n/nl/collab.ts b/shared/src/i18n/nl/collab.ts index 41ca7528b..72b3db932 100644 --- a/shared/src/i18n/nl/collab.ts +++ b/shared/src/i18n/nl/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Oudere berichten laden', 'collab.chat.justNow': 'zojuist', 'collab.chat.minutesAgo': '{n} min. geleden', + 'collab.chat.minutesAgo.one': '{n} min. geleden', 'collab.chat.hoursAgo': '{n} uur geleden', + 'collab.chat.hoursAgo.one': '{n} uur geleden', 'collab.notes.title': 'Notities', 'collab.notes.new': 'Nieuwe notitie', 'collab.notes.empty': 'Nog geen notities', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Vastpinnen', 'collab.notes.unpin': 'Losmaken', 'collab.notes.daysAgo': '{n}d geleden', + 'collab.notes.daysAgo.one': '{n}d geleden', 'collab.notes.categorySettings': 'Categorieën beheren', 'collab.notes.create': 'Aanmaken', 'collab.notes.website': 'Website', diff --git a/shared/src/i18n/nl/collection.ts b/shared/src/i18n/nl/collection.ts index 54ae2c0ec..4631f7399 100644 --- a/shared/src/i18n/nl/collection.ts +++ b/shared/src/i18n/nl/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': '{count} in een lijst opslaan', + 'collections.saveNToList.one': '{count} in een lijst opslaan', 'collections.addedNToList': '{count} opgeslagen in {name}', + 'collections.addedNToList.one': '{count} opgeslagen in {name}', 'collections.noOwnLists': 'Je hebt nog geen lijsten', 'collections.saveToListHint': 'Duplicaten worden automatisch overgeslagen', 'collections.role.label': 'Rol', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Naar lijst verplaatsen', 'collections.duplicateToList': 'Naar lijst dupliceren', 'collections.moveToListTitle': '{count} naar andere lijst verplaatsen', + 'collections.moveToListTitle.one': '{count} naar andere lijst verplaatsen', 'collections.duplicateToListTitle': '{count} naar andere lijst dupliceren', + 'collections.duplicateToListTitle.one': '{count} naar andere lijst dupliceren', 'collections.noOtherLists': 'Nog geen andere lijsten', 'collections.movedCount': '{count} plaatsen verplaatst', 'collections.movedCount.one': '{count} plaats verplaatst', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} geselecteerd', 'collections.importSelectedCount.one': '{count} geselecteerd', 'collections.importAction': '{count} importeren', + 'collections.importAction.one': '{count} importeren', 'collections.importEmptyTrip': 'Deze reis heeft nog geen plekken', 'collections.importNothingNew': 'Alles uit deze reis staat al op deze lijst', 'collections.importDone': '{count} plekken toegevoegd', @@ -115,6 +120,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Naar reis kopiëren', 'collections.copyToTripTitle': 'Naar reis kopiëren', 'collections.copyN': '{count} naar reis kopiëren', + 'collections.copyN.one': 'Naar reis kopiëren', 'collections.copyToTripSearch': 'Reizen zoeken', 'collections.searchLists': 'Lijsten zoeken', 'collections.copyToTripConfirm': 'Kopiëren', @@ -150,6 +156,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Uit collectie verwijderd', 'collections.picker.title': 'Opgeslagen plekken', 'collections.picker.showMore': 'Nog {count} tonen', + 'collections.picker.showMore.one': 'Nog {count} tonen', 'collections.picker.search': 'Zoek in je opgeslagen plekken', 'collections.picker.empty': 'Geen opgeslagen plekken om toe te voegen', 'collections.picker.hint': 'Kies een plek uit je collecties', @@ -172,6 +179,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{count} plekken toegevoegd aan {name}', 'collections.file.doneInto.one': '{count} plek toegevoegd aan {name}', 'collections.file.doneIntoDuplicates': '{count} toegevoegd aan {name}, {duplicates} stonden er al in', + 'collections.file.doneIntoDuplicates.one': '{count} toegevoegd aan {name}, {duplicates} stonden er al in', 'collections.file.doneIntoNothing': 'Alle plekken uit het bestand staan al in {name}', 'collections.file.change': 'Wijzigen', 'collections.file.labelCount': '{count} labels', @@ -203,6 +211,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Dit is geen GPX-bestand.', 'collections.file.errorTooManyPlaces': 'Dit bestand bevat meer dan {count} plekken. Splits het op en importeer de delen een voor een.', + 'collections.file.errorTooManyPlaces.one': + 'Dit bestand bevat meer dan {count} plek. Splits het op en importeer de delen een voor een.', 'collections.share.title': 'Lijst delen', 'collections.share.titleNamed': '“{name}” delen', diff --git a/shared/src/i18n/nl/common.ts b/shared/src/i18n/nl/common.ts index 172cd8912..b186e69ee 100644 --- a/shared/src/i18n/nl/common.ts +++ b/shared/src/i18n/nl/common.ts @@ -55,7 +55,9 @@ const common: TranslationStrings = { 'common.copied': 'Gekopieerd', 'common.justNow': 'zojuist', 'common.hoursAgo': '{count}u geleden', + 'common.hoursAgo.one': '{count}u geleden', 'common.daysAgo': '{count}d geleden', + 'common.daysAgo.one': '{count}d geleden', 'common.datepicker.prevMonth': 'Previous month', // en-fallback 'common.datepicker.nextMonth': 'Next month', // en-fallback 'common.datepicker.prevYear': 'Previous year', // en-fallback diff --git a/shared/src/i18n/nl/dashboard.ts b/shared/src/i18n/nl/dashboard.ts index a78e3ecc7..e26827969 100644 --- a/shared/src/i18n/nl/dashboard.ts +++ b/shared/src/i18n/nl/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} reizen ({archived} gearchiveerd)', 'dashboard.subtitle.trips.one': '{count} reis ({archived} gearchiveerd)', 'dashboard.subtitle.empty': 'Begin je eerste reis', - 'dashboard.subtitle.activeOne': '{count} actieve reis', - 'dashboard.subtitle.activeMany': '{count} actieve reizen', + 'dashboard.subtitle.active': '{count} actieve reizen', + 'dashboard.subtitle.active.one': '{count} actieve reis', 'dashboard.subtitle.archivedSuffix': ' · {count} gearchiveerd', 'dashboard.subtitle.archivedSuffix.one': ' · {count} gearchiveerd', 'dashboard.newTrip': 'Nieuwe reis', @@ -114,6 +114,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Dagen verwijderen?', 'dashboard.shrinkIntro': 'Bij het opslaan van de nieuwe datums worden deze dagen verwijderd:', 'dashboard.shrinkMoreDays': '+{count} meer', + 'dashboard.shrinkMoreDays.one': '+{count} meer', 'dashboard.shrinkLastDays': 'De laatste dagen vallen weg, niet de eerste', 'dashboard.shrinkLastDaysHint': 'Dagplanningen schuiven mee met de nieuwe datums, dus het zijn altijd de laatste dagen van je planning die wegvallen, ook als het begin is verschoven.', diff --git a/shared/src/i18n/nl/dawarich.ts b/shared/src/i18n/nl/dawarich.ts index 7edefdb36..37936ee87 100644 --- a/shared/src/i18n/nl/dawarich.ts +++ b/shared/src/i18n/nl/dawarich.ts @@ -95,6 +95,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Weggelegd', 'dawarich.suggestions.restore': 'Terugzetten', 'dawarich.suggestions.showHandled': '{count} al afgehandelde tonen', + 'dawarich.suggestions.showHandled.one': '{count} al afgehandelde tonen', 'dawarich.suggestions.hideHandled': 'De al afgehandelde verbergen', 'dawarich.suggestions.matchesWish': 'Op je wensenlijst: {name}', 'dawarich.suggestions.acceptedAs.place': 'Toegevoegd als plaats', @@ -146,6 +147,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Niets van je wensenlijst kwam in je opnames voor.', 'dawarich.bucket.alreadyVisited': 'Al afgevinkt', 'dawarich.bucket.confirm': '{count} afvinken', + 'dawarich.bucket.confirm.one': '{count} afvinken', 'dawarich.bucket.confirmed': '{count} wensen afgevinkt', 'dawarich.bucket.confirmed.one': '{count} wens afgevinkt', 'dawarich.bucket.skipped': '{count} vermeldingen hebben geen coördinaten en konden niet worden gecontroleerd.', diff --git a/shared/src/i18n/nl/dayplan.ts b/shared/src/i18n/nl/dayplan.ts index 563a330d7..c0b0d9898 100644 --- a/shared/src/i18n/nl/dayplan.ts +++ b/shared/src/i18n/nl/dayplan.ts @@ -104,11 +104,15 @@ const dayplan: TranslationStrings = { 'Alle plaatsen gaan van deze dag af. De plaatsen blijven in de reis, en de dag houdt zijn notities en boekingen.', 'dayplan.deleteDayEmpty': 'Er staat niets gepland op deze dag.', 'dayplan.impactPlaces': 'Geplande plekken: {count}', + 'dayplan.impactPlaces.one': 'Geplande plekken: {count}', 'dayplan.impactPlacesHint': 'Ze blijven in de lijst met plekken.', 'dayplan.impactNotes': 'Notities: {count}', + 'dayplan.impactNotes.one': 'Notities: {count}', 'dayplan.impactTexts': 'Dagtitels en beschrijvingen: {count}', + 'dayplan.impactTexts.one': 'Dagtitels en beschrijvingen: {count}', 'dayplan.impactDeletedHint': 'Worden ook verwijderd.', 'dayplan.impactBookings': 'Boekingen: {count}', + 'dayplan.impactBookings.one': 'Boekingen: {count}', 'dayplan.impactStay': 'Verblijf in {name}', 'dayplan.deleteDayBookingsHint': 'Ze blijven onder Boekingen, zonder dag.', 'dayplan.deleteDayStayHint': 'Inchecken of uitchecken valt op deze dag, dus het verblijf wordt geannuleerd.', @@ -119,8 +123,10 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Inchecken of uitchecken valt op deze dag, dus het verblijf wordt geannuleerd, samen met de boeking ‘{booking}’ en de bijbehorende uitgave van {amount}.', 'dayplan.deleteDayShift': 'Latere dagen: {count}', + 'dayplan.deleteDayShift.one': 'Latere dagen: {count}', 'dayplan.deleteDayShiftHint': 'Elke dag schuift één datum naar voren.', 'dayplan.deleteDayShiftBookingsHint': 'Elke dag schuift één datum naar voren. Boekingen die meeschuiven: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': 'Elke dag schuift één datum naar voren. Boekingen die meeschuiven: {count}', 'dayplan.deleteDayShrink': 'De reis eindigt nu op {date}', 'dayplan.deleteDayShrinkHint': 'Er is geen dag zonder datum die de laatste datum kan overnemen.', 'dayplan.impactStayShorter': 'Verblijf in {name}: een nacht minder', diff --git a/shared/src/i18n/nl/docsync.ts b/shared/src/i18n/nl/docsync.ts index 346c317eb..ee3bcf19e 100644 --- a/shared/src/i18n/nl/docsync.ts +++ b/shared/src/i18n/nl/docsync.ts @@ -72,6 +72,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Buiten de map verplaatst', 'docsync.conflict.resolve': '{count} oplossen', + 'docsync.conflict.resolve.one': '{count} oplossen', 'docsync.conflict.title': 'Beide kopieën zijn gewijzigd', 'docsync.conflict.keepTrek': 'De TREK-versie behouden', diff --git a/shared/src/i18n/nl/journey.ts b/shared/src/i18n/nl/journey.ts index ad4914c94..9a30c86c6 100644 --- a/shared/src/i18n/nl/journey.ts +++ b/shared/src/i18n/nl/journey.ts @@ -677,6 +677,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Suggestie verworpen', 'journey.suggestions.restore': 'Verworpen suggesties terughalen', 'journey.suggestions.restoreCount': 'Verworpen suggesties ({count})', + 'journey.suggestions.restoreCount.one': 'Verworpen suggesties ({count})', 'journey.suggestions.restored': '{count} suggesties zijn terug', 'journey.suggestions.restored.one': '{count} suggestie is terug', 'journey.detail.addOnThisDay': 'Een item op deze dag toevoegen', diff --git a/shared/src/i18n/nl/memories.ts b/shared/src/i18n/nl/memories.ts index da6d4e295..c8ed70edf 100644 --- a/shared/src/i18n/nl/memories.ts +++ b/shared/src/i18n/nl/memories.ts @@ -64,6 +64,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Delen met reisgenoten?', 'memories.confirmShareHint': "{count} foto's worden zichtbaar voor alle leden van deze reis. Je kunt individuele foto's later privé maken.", + 'memories.confirmShareHint.one': + '{count} foto wordt zichtbaar voor alle leden van deze reis. Je kunt hem later privé maken.', 'memories.confirmShareButton': "Foto's delen", 'memories.error.loadAlbums': 'Albums laden mislukt', 'memories.error.linkAlbum': 'Album koppelen mislukt', diff --git a/shared/src/i18n/nl/packing.ts b/shared/src/i18n/nl/packing.ts index 9148e306a..b7595b6c1 100644 --- a/shared/src/i18n/nl/packing.ts +++ b/shared/src/i18n/nl/packing.ts @@ -31,13 +31,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Een Markdown-lijst werkt ook: een kop geeft de categorie aan, "- [ ]" en "- [x]" worden items en "3x" voor een naam stelt het aantal in.', 'packing.importAction': '{count} importeren', + 'packing.importAction.one': '{count} importeren', 'packing.importSuccess': '{count} items geïmporteerd', 'packing.importSuccess.one': '{count} item geïmporteerd', 'packing.importError': 'Import mislukt', 'packing.importEmpty': 'Geen items om te importeren', 'packing.progress': '{packed} van {total} ingepakt ({percent}%)', 'packing.clearChecked': '{count} aangevinkte verwijderen', + 'packing.clearChecked.one': '{count} aangevinkte verwijderen', 'packing.clearCheckedShort': '{count} verwijderen', + 'packing.clearCheckedShort.one': '{count} verwijderen', 'packing.allPacked': 'Alles ingepakt!', 'packing.addPlaceholder': 'Nieuw item toevoegen...', 'packing.categoryPlaceholder': 'Lijst...', @@ -97,6 +100,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'Nog niemand anders op deze reis', 'packing.takenCareOf': 'door {name}', 'packing.sharedWithCount': 'gedeeld met {count}', + 'packing.sharedWithCount.one': 'gedeeld met {count}', 'packing.broughtBy': 'meegenomen door {name}', 'packing.alsoBring': 'Ik kan het ook meenemen', 'packing.alsoBringingStop': 'Ik neem het niet mee', diff --git a/shared/src/i18n/nl/photos.ts b/shared/src/i18n/nl/photos.ts index 8cc5d2e66..2e197d93c 100644 --- a/shared/src/i18n/nl/photos.ts +++ b/shared/src/i18n/nl/photos.ts @@ -15,7 +15,8 @@ const photos: TranslationStrings = { 'photos.clickToSelect': 'of klik om te selecteren', 'photos.linkPlace': 'Koppel plaats', 'photos.noPlace': 'Geen plaats', - 'photos.uploadN': "{n} foto('s) uploaden", + 'photos.uploadN': "{n} foto's uploaden", + 'photos.uploadN.one': '{n} foto uploaden', 'photos.linkDay': 'Dag koppelen', 'photos.noDay': 'Geen dag', 'photos.dayLabel': 'Dag {number}', diff --git a/shared/src/i18n/nl/reservations.ts b/shared/src/i18n/nl/reservations.ts index 64cf89766..dc408d220 100644 --- a/shared/src/i18n/nl/reservations.ts +++ b/shared/src/i18n/nl/reservations.ts @@ -180,6 +180,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Andere vluchten', 'reservations.airtrail.empty': 'Geen vluchten gevonden in je AirTrail-account.', 'reservations.airtrail.importCta': '{count} importeren', + 'reservations.airtrail.importCta.one': '{count} importeren', 'reservations.airtrail.joinConnection': 'Importeren als één vlucht met een tussenstop in {stops}', 'reservations.costsLabel': 'Kosten', 'reservations.createExpense': 'Kostenpost aanmaken', diff --git a/shared/src/i18n/nl/roadtrip.ts b/shared/src/i18n/nl/roadtrip.ts index 3d002c8a1..ee9fc5000 100644 --- a/shared/src/i18n/nl/roadtrip.ts +++ b/shared/src/i18n/nl/roadtrip.ts @@ -198,6 +198,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Niets onderweg komt overeen met “{name}”.', 'roadtrip.poi.noneMatchFilters': 'Niets onderweg voldoet aan deze filters.', 'roadtrip.poi.foundFiltered': '{count} van {total} onderweg', + 'roadtrip.poi.foundFiltered.one': '{count} van {total} onderweg', 'roadtrip.poi.truncated': '{count} stukken hadden meer dan in één antwoord past. Maak de corridor smaller om de rest te zien.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/nl/settings.ts b/shared/src/i18n/nl/settings.ts index a2adf6ae3..8751d90a1 100644 --- a/shared/src/i18n/nl/settings.ts +++ b/shared/src/i18n/nl/settings.ts @@ -579,9 +579,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Offline', 'settings.offline.banner.forced': 'Offlinemodus', 'settings.offline.banner.queued': 'Offline · {count} in wachtrij', + 'settings.offline.banner.queued.one': 'Offline · {count} in wachtrij', 'settings.offline.banner.syncing': 'Synchroniseren {count}…', + 'settings.offline.banner.syncing.one': 'Synchroniseren {count}…', 'settings.offline.banner.failed': 'Synchroniseren mislukt: {count}', + 'settings.offline.banner.failed.one': 'Synchroniseren mislukt: {count}', 'settings.offline.banner.conflicts': 'Conflicten: {count}', + 'settings.offline.banner.conflicts.one': 'Conflicten: {count}', 'settings.pluginActivity.title': 'Plugin-activiteit', 'settings.pluginActivity.description': 'Elke actie die een plugin namens jou heeft uitgevoerd, nieuwste eerst.', 'settings.pluginActivity.empty': 'Nog geen plugin-activiteit.', @@ -603,6 +607,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Alles', 'settings.apiScopes.noneSelected': 'Kies minstens één onderdeel, anders kan de sleutel niets lezen.', 'settings.apiScopes.limited': '{count} van {total}', + 'settings.apiScopes.limited.one': '{count} van {total}', 'settings.apiScopes.trips': 'Reizen', 'settings.apiScopes.days': 'Dagen', 'settings.apiScopes.places': 'Plaatsen', diff --git a/shared/src/i18n/nl/tours.ts b/shared/src/i18n/nl/tours.ts index 496480565..033f67962 100644 --- a/shared/src/i18n/nl/tours.ts +++ b/shared/src/i18n/nl/tours.ts @@ -68,6 +68,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Routepunten', 'tours.planner.waypointLabel': 'Routepunt {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', 'tours.planner.empty': 'Voeg minstens twee punten toe om een wandelroute te berekenen.', 'tours.planner.start': 'Vertrek', 'tours.planner.via': 'Via', diff --git a/shared/src/i18n/nl/trip.ts b/shared/src/i18n/nl/trip.ts index 78099f10f..81f41d38c 100644 --- a/shared/src/i18n/nl/trip.ts +++ b/shared/src/i18n/nl/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} overstappen', 'transit.transfers.one': '{count} overstap', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', 'transit.stops': '{count} haltes', 'transit.stops.one': '{count} halte', 'transit.walkTo': 'Loop naar {name}', diff --git a/shared/src/i18n/nl/vacay.ts b/shared/src/i18n/nl/vacay.ts index 142821e05..2feb793b5 100644 --- a/shared/src/i18n/nl/vacay.ts +++ b/shared/src/i18n/nl/vacay.ts @@ -85,6 +85,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Draag resterende vakantiedagen automatisch over naar het volgende jaar', 'vacay.carriedOverPrevPeriod': 'van de vorige periode', 'vacay.compUsedCount': '{count} compensatie', + 'vacay.compUsedCount.one': '{count} compensatie', 'vacay.yearType': 'Vakantiejaar', 'vacay.yearTypeHint': 'Wanneer je vakantiejaar begint — recht, gebruik en overdracht richten zich daarnaar', 'vacay.yearTypeCalendar': 'Kalenderjaar', diff --git a/shared/src/i18n/pl/admin.ts b/shared/src/i18n/pl/admin.ts index 71836757f..d62678a3f 100644 --- a/shared/src/i18n/pl/admin.ts +++ b/shared/src/i18n/pl/admin.ts @@ -586,7 +586,13 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Wymaga {addon}', 'admin.plugins.cap.dependsOn': 'Wymaga {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Najpierw włącz wymagane dodatki: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Najpierw włącz wymagany dodatek: {addons}', + 'admin.plugins.dep.addonDisabledToast.few': 'Najpierw włącz wymagane dodatki: {addons}', + 'admin.plugins.dep.addonDisabledToast.many': 'Najpierw włącz wymagane dodatki: {addons}', 'admin.plugins.dep.autoEnabled': 'Najpierw włączono wymagane wtyczki: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Najpierw włączono wymaganą wtyczkę: {plugins}', + 'admin.plugins.dep.autoEnabled.few': 'Najpierw włączono wymagane wtyczki: {plugins}', + 'admin.plugins.dep.autoEnabled.many': 'Najpierw włączono wymagane wtyczki: {plugins}', 'admin.plugins.dep.downloaded': 'Pobrano {id}', 'admin.plugins.dep.resolveTitle': 'Brakujące zależności', 'admin.plugins.dep.resolveBody': '„{name}” wymaga zainstalowania tych wtyczek, zanim będzie można ją włączyć.', @@ -714,7 +720,10 @@ const admin: TranslationStrings = { 'admin.audit.empty': 'Brak zapisów w historii aktywności.', 'admin.audit.refresh': 'Odśwież', 'admin.audit.loadMore': 'Załaduj więcej', - 'admin.audit.showing': '{count} załadowanych · {total} łącznie', + 'admin.audit.showing': 'Załadowano {count} wpisu · łącznie {total}', + 'admin.audit.showing.one': 'Załadowano {count} wpis · łącznie {total}', + 'admin.audit.showing.few': 'Załadowano {count} wpisy · łącznie {total}', + 'admin.audit.showing.many': 'Załadowano {count} wpisów · łącznie {total}', 'admin.audit.col.time': 'Czas', 'admin.audit.col.user': 'Użytkownik', 'admin.audit.col.action': 'Akcja', diff --git a/shared/src/i18n/pl/collab.ts b/shared/src/i18n/pl/collab.ts index b9843a3c0..d20301cf7 100644 --- a/shared/src/i18n/pl/collab.ts +++ b/shared/src/i18n/pl/collab.ts @@ -43,8 +43,14 @@ const collab: TranslationStrings = { 'collab.chat.deletedMessage': 'usunięto wiadomość', 'collab.chat.loadMore': 'Załaduj starsze wiadomości', 'collab.chat.justNow': 'teraz', - 'collab.chat.minutesAgo': '{n}m temu', - 'collab.chat.hoursAgo': '{n}h temu', + 'collab.chat.minutesAgo': '{n} min temu', + 'collab.chat.minutesAgo.one': '{n} min temu', + 'collab.chat.minutesAgo.few': '{n} min temu', + 'collab.chat.minutesAgo.many': '{n} min temu', + 'collab.chat.hoursAgo': '{n} godz. temu', + 'collab.chat.hoursAgo.one': '{n} godz. temu', + 'collab.chat.hoursAgo.few': '{n} godz. temu', + 'collab.chat.hoursAgo.many': '{n} godz. temu', 'collab.notes.title': 'Notatki', 'collab.notes.new': 'Nowa notatka', 'collab.notes.empty': 'Brak notatek', @@ -67,7 +73,10 @@ const collab: TranslationStrings = { 'collab.notes.confirmDeleteBody': 'Ta notatka zostanie trwale usunięta.', 'collab.notes.pin': 'Przypnij', 'collab.notes.unpin': 'Odepnij', - 'collab.notes.daysAgo': '{n}d temu', + 'collab.notes.daysAgo': '{n} dnia temu', + 'collab.notes.daysAgo.one': '{n} dzień temu', + 'collab.notes.daysAgo.few': '{n} dni temu', + 'collab.notes.daysAgo.many': '{n} dni temu', 'collab.notes.categorySettings': 'Zarządzaj kategoriami', 'collab.notes.create': 'Utwórz', 'collab.notes.website': 'Strona internetowa', diff --git a/shared/src/i18n/pl/collection.ts b/shared/src/i18n/pl/collection.ts index e970f9034..a0f0cbd83 100644 --- a/shared/src/i18n/pl/collection.ts +++ b/shared/src/i18n/pl/collection.ts @@ -2,7 +2,13 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Zapisz {count} na liście', + 'collections.saveNToList.one': 'Zapisz {count} na liście', + 'collections.saveNToList.few': 'Zapisz {count} na liście', + 'collections.saveNToList.many': 'Zapisz {count} na liście', 'collections.addedNToList': 'Zapisano {count} w {name}', + 'collections.addedNToList.one': 'Zapisano {count} w {name}', + 'collections.addedNToList.few': 'Zapisano {count} w {name}', + 'collections.addedNToList.many': 'Zapisano {count} w {name}', 'collections.noOwnLists': 'Nie masz jeszcze list', 'collections.saveToListHint': 'Duplikaty są pomijane automatycznie', 'collections.role.label': 'Rola', @@ -16,7 +22,13 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Przenieś do listy', 'collections.duplicateToList': 'Duplikuj do listy', 'collections.moveToListTitle': 'Przenieś {count} do innej listy', + 'collections.moveToListTitle.one': 'Przenieś {count} do innej listy', + 'collections.moveToListTitle.few': 'Przenieś {count} do innej listy', + 'collections.moveToListTitle.many': 'Przenieś {count} do innej listy', 'collections.duplicateToListTitle': 'Duplikuj {count} do innej listy', + 'collections.duplicateToListTitle.one': 'Duplikuj {count} do innej listy', + 'collections.duplicateToListTitle.few': 'Duplikuj {count} do innej listy', + 'collections.duplicateToListTitle.many': 'Duplikuj {count} do innej listy', 'collections.noOtherLists': 'Brak innych list', 'collections.movedCount': 'Przeniesiono {count} miejsca', 'collections.movedCount.one': 'Przeniesiono {count} miejsce', @@ -66,6 +78,9 @@ const collection: TranslationStrings = { 'collections.importSelectedCount.few': 'Zaznaczono: {count}', 'collections.importSelectedCount.many': 'Zaznaczono: {count}', 'collections.importAction': 'Importuj {count}', + 'collections.importAction.one': 'Importuj {count}', + 'collections.importAction.few': 'Importuj {count}', + 'collections.importAction.many': 'Importuj {count}', 'collections.importEmptyTrip': 'Ta podróż nie ma jeszcze miejsc', 'collections.importNothingNew': 'Wszystko z tej podróży jest już na liście', 'collections.importDone': 'Dodano {count} miejsca', @@ -131,6 +146,9 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Kopiuj do podróży', 'collections.copyToTripTitle': 'Kopiuj do podróży', 'collections.copyN': 'Kopiuj {count} do podróży', + 'collections.copyN.one': 'Kopiuj do podróży', + 'collections.copyN.few': 'Kopiuj {count} do podróży', + 'collections.copyN.many': 'Kopiuj {count} do podróży', 'collections.copyToTripSearch': 'Szukaj podróży', 'collections.searchLists': 'Szukaj list', 'collections.copyToTripConfirm': 'Kopiuj', @@ -172,6 +190,9 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Usunięto z kolekcji', 'collections.picker.title': 'Zapisane miejsca', 'collections.picker.showMore': 'Pokaż jeszcze {count}', + 'collections.picker.showMore.one': 'Pokaż jeszcze {count}', + 'collections.picker.showMore.few': 'Pokaż jeszcze {count}', + 'collections.picker.showMore.many': 'Pokaż jeszcze {count}', 'collections.picker.search': 'Przeszukaj zapisane miejsca', 'collections.picker.empty': 'Brak zapisanych miejsc do dodania', 'collections.picker.hint': 'Wybierz miejsce ze swoich kolekcji', @@ -196,6 +217,9 @@ const collection: TranslationStrings = { 'collections.file.doneInto.few': 'Dodano {count} miejsca do {name}', 'collections.file.doneInto.many': 'Dodano {count} miejsc do {name}', 'collections.file.doneIntoDuplicates': 'Dodano {count} do {name}, {duplicates} już tam było', + 'collections.file.doneIntoDuplicates.one': 'Dodano {count} do {name}, {duplicates} już tam było', + 'collections.file.doneIntoDuplicates.few': 'Dodano {count} do {name}, {duplicates} już tam było', + 'collections.file.doneIntoDuplicates.many': 'Dodano {count} do {name}, {duplicates} już tam było', 'collections.file.doneIntoNothing': 'Wszystkie miejsca z pliku są już w {name}', 'collections.file.change': 'Zmień', 'collections.file.labelCount': '{count} etykiety', @@ -238,6 +262,12 @@ const collection: TranslationStrings = { 'collections.file.gpxEmpty': 'Ten plik GPX nie zawiera punktów trasy, więc nie ma czego importować.', 'collections.file.errorNotGpx': 'To nie jest plik GPX.', 'collections.file.errorTooManyPlaces': + 'Ten plik zawiera więcej niż {count} miejsca. Podziel go i importuj części po kolei.', + 'collections.file.errorTooManyPlaces.one': + 'Ten plik zawiera więcej niż {count} miejsce. Podziel go i importuj części po kolei.', + 'collections.file.errorTooManyPlaces.few': + 'Ten plik zawiera więcej niż {count} miejsca. Podziel go i importuj części po kolei.', + 'collections.file.errorTooManyPlaces.many': 'Ten plik zawiera więcej niż {count} miejsc. Podziel go i importuj części po kolei.', 'collections.share.title': 'Udostępnij listę', diff --git a/shared/src/i18n/pl/common.ts b/shared/src/i18n/pl/common.ts index 87f6dae65..3ece7b160 100644 --- a/shared/src/i18n/pl/common.ts +++ b/shared/src/i18n/pl/common.ts @@ -55,7 +55,13 @@ const common: TranslationStrings = { 'common.saved': 'Zapisano', 'common.justNow': 'przed chwilą', 'common.hoursAgo': '{count} godz. temu', - 'common.daysAgo': '{count} dn. temu', + 'common.hoursAgo.one': '{count} godz. temu', + 'common.hoursAgo.few': '{count} godz. temu', + 'common.hoursAgo.many': '{count} godz. temu', + 'common.daysAgo': '{count} dnia temu', + 'common.daysAgo.one': '{count} dzień temu', + 'common.daysAgo.few': '{count} dni temu', + 'common.daysAgo.many': '{count} dni temu', 'common.datepicker.prevMonth': 'Previous month', // en-fallback 'common.datepicker.nextMonth': 'Next month', // en-fallback 'common.datepicker.prevYear': 'Previous year', // en-fallback diff --git a/shared/src/i18n/pl/dashboard.ts b/shared/src/i18n/pl/dashboard.ts index 43036ae8c..2250f3924 100644 --- a/shared/src/i18n/pl/dashboard.ts +++ b/shared/src/i18n/pl/dashboard.ts @@ -8,8 +8,10 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips.few': '{count} podróże (zarchiwizowane: {archived})', 'dashboard.subtitle.trips.many': '{count} podróży (zarchiwizowane: {archived})', 'dashboard.subtitle.empty': 'Rozpocznij swoją pierwszą podróż', - 'dashboard.subtitle.activeOne': '{count} aktywna podróż', - 'dashboard.subtitle.activeMany': '{count} aktywnych podróży', + 'dashboard.subtitle.active': '{count} aktywnej podróży', + 'dashboard.subtitle.active.one': '{count} aktywna podróż', + 'dashboard.subtitle.active.few': '{count} aktywne podróże', + 'dashboard.subtitle.active.many': '{count} aktywnych podróży', 'dashboard.subtitle.archivedSuffix': ' · {count} zarchiwizowanej', 'dashboard.subtitle.archivedSuffix.one': ' · {count} zarchiwizowana', 'dashboard.subtitle.archivedSuffix.few': ' · {count} zarchiwizowane', @@ -117,6 +119,9 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Usunąć dni?', 'dashboard.shrinkIntro': 'Zapisanie nowych dat usunie te dni:', 'dashboard.shrinkMoreDays': '+{count} więcej', + 'dashboard.shrinkMoreDays.one': '+{count} więcej', + 'dashboard.shrinkMoreDays.few': '+{count} więcej', + 'dashboard.shrinkMoreDays.many': '+{count} więcej', 'dashboard.shrinkLastDays': 'Usuwane są ostatnie dni, nie pierwsze', 'dashboard.shrinkLastDaysHint': 'Plany dni przesuwają się razem z nowymi datami, więc zawsze usuwane są ostatnie dni planu, także gdy zmienił się początek.', diff --git a/shared/src/i18n/pl/dawarich.ts b/shared/src/i18n/pl/dawarich.ts index 517ffcfe2..ec62e5c1e 100644 --- a/shared/src/i18n/pl/dawarich.ts +++ b/shared/src/i18n/pl/dawarich.ts @@ -99,6 +99,9 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Odrzucono', 'dawarich.suggestions.restore': 'Przywróć', 'dawarich.suggestions.showHandled': 'Pokaż {count} już obsłużonych', + 'dawarich.suggestions.showHandled.one': 'Pokaż {count} już obsłużony', + 'dawarich.suggestions.showHandled.few': 'Pokaż {count} już obsłużone', + 'dawarich.suggestions.showHandled.many': 'Pokaż {count} już obsłużonych', 'dawarich.suggestions.hideHandled': 'Ukryj już obsłużone', 'dawarich.suggestions.matchesWish': 'Na Twojej liście marzeń: {name}', 'dawarich.suggestions.acceptedAs.place': 'Dodano jako miejsce', @@ -150,6 +153,9 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Nic z Twojej listy marzeń nie pojawiło się w Twoich zapisach.', 'dawarich.bucket.alreadyVisited': 'Już odhaczone', 'dawarich.bucket.confirm': 'Odhacz {count}', + 'dawarich.bucket.confirm.one': 'Odhacz {count}', + 'dawarich.bucket.confirm.few': 'Odhacz {count}', + 'dawarich.bucket.confirm.many': 'Odhacz {count}', 'dawarich.bucket.confirmed': 'Odhaczono {count} marzenia', 'dawarich.bucket.confirmed.one': 'Odhaczono {count} marzenie', 'dawarich.bucket.confirmed.few': 'Odhaczono {count} marzenia', diff --git a/shared/src/i18n/pl/dayplan.ts b/shared/src/i18n/pl/dayplan.ts index a3b85c427..af60ec9d8 100644 --- a/shared/src/i18n/pl/dayplan.ts +++ b/shared/src/i18n/pl/dayplan.ts @@ -105,11 +105,23 @@ const dayplan: TranslationStrings = { 'Wszystkie miejsca zostaną usunięte z tego dnia. Miejsca pozostaną w podróży, a dzień zachowa swoje notatki i rezerwacje.', 'dayplan.deleteDayEmpty': 'Na ten dzień nic nie zaplanowano.', 'dayplan.impactPlaces': 'Zaplanowane miejsca: {count}', + 'dayplan.impactPlaces.one': 'Zaplanowane miejsca: {count}', + 'dayplan.impactPlaces.few': 'Zaplanowane miejsca: {count}', + 'dayplan.impactPlaces.many': 'Zaplanowane miejsca: {count}', 'dayplan.impactPlacesHint': 'Pozostają na liście miejsc.', 'dayplan.impactNotes': 'Notatki: {count}', + 'dayplan.impactNotes.one': 'Notatki: {count}', + 'dayplan.impactNotes.few': 'Notatki: {count}', + 'dayplan.impactNotes.many': 'Notatki: {count}', 'dayplan.impactTexts': 'Tytuły i opisy dnia: {count}', + 'dayplan.impactTexts.one': 'Tytuły i opisy dnia: {count}', + 'dayplan.impactTexts.few': 'Tytuły i opisy dnia: {count}', + 'dayplan.impactTexts.many': 'Tytuły i opisy dnia: {count}', 'dayplan.impactDeletedHint': 'Również zostaną usunięte.', 'dayplan.impactBookings': 'Rezerwacje: {count}', + 'dayplan.impactBookings.one': 'Rezerwacje: {count}', + 'dayplan.impactBookings.few': 'Rezerwacje: {count}', + 'dayplan.impactBookings.many': 'Rezerwacje: {count}', 'dayplan.impactStay': 'Nocleg w {name}', 'dayplan.deleteDayBookingsHint': 'Pozostają w Rezerwacjach, bez dnia.', 'dayplan.deleteDayStayHint': 'Zameldowanie lub wymeldowanie przypada na ten dzień, więc nocleg zostanie anulowany.', @@ -120,9 +132,18 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Zameldowanie lub wymeldowanie przypada na ten dzień, więc nocleg zostanie anulowany razem z rezerwacją „{booking}” i jej wydatkiem w kwocie {amount}.', 'dayplan.deleteDayShift': 'Późniejsze dni: {count}', + 'dayplan.deleteDayShift.one': 'Późniejsze dni: {count}', + 'dayplan.deleteDayShift.few': 'Późniejsze dni: {count}', + 'dayplan.deleteDayShift.many': 'Późniejsze dni: {count}', 'dayplan.deleteDayShiftHint': 'Każdy przesuwa się o jedną datę wcześniej.', 'dayplan.deleteDayShiftBookingsHint': 'Każdy przesuwa się o jedną datę wcześniej. Rezerwacje przesuwane razem z nimi: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Każdy przesuwa się o jedną datę wcześniej. Rezerwacje przesuwane razem z nimi: {count}', + 'dayplan.deleteDayShiftBookingsHint.few': + 'Każdy przesuwa się o jedną datę wcześniej. Rezerwacje przesuwane razem z nimi: {count}', + 'dayplan.deleteDayShiftBookingsHint.many': + 'Każdy przesuwa się o jedną datę wcześniej. Rezerwacje przesuwane razem z nimi: {count}', 'dayplan.deleteDayShrink': 'Podróż kończy się teraz {date}', 'dayplan.deleteDayShrinkHint': 'Nie ma dnia bez daty, który mógłby przejąć ostatnią datę.', 'dayplan.impactStayShorter': 'Nocleg w {name}: o jedną noc krócej', diff --git a/shared/src/i18n/pl/docsync.ts b/shared/src/i18n/pl/docsync.ts index b663731ae..1a35f7d09 100644 --- a/shared/src/i18n/pl/docsync.ts +++ b/shared/src/i18n/pl/docsync.ts @@ -71,6 +71,9 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Przeniesiony poza folder', 'docsync.conflict.resolve': 'Rozwiąż {count}', + 'docsync.conflict.resolve.one': 'Rozwiąż {count}', + 'docsync.conflict.resolve.few': 'Rozwiąż {count}', + 'docsync.conflict.resolve.many': 'Rozwiąż {count}', 'docsync.conflict.title': 'Obie kopie zostały zmienione', 'docsync.conflict.keepTrek': 'Zachowaj wersję z TREK', diff --git a/shared/src/i18n/pl/journey.ts b/shared/src/i18n/pl/journey.ts index afbb9d168..7c1030620 100644 --- a/shared/src/i18n/pl/journey.ts +++ b/shared/src/i18n/pl/journey.ts @@ -691,6 +691,9 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Propozycja odrzucona', 'journey.suggestions.restore': 'Przywróć odrzucone propozycje', 'journey.suggestions.restoreCount': 'Odrzucone propozycje ({count})', + 'journey.suggestions.restoreCount.one': 'Odrzucone propozycje ({count})', + 'journey.suggestions.restoreCount.few': 'Odrzucone propozycje ({count})', + 'journey.suggestions.restoreCount.many': 'Odrzucone propozycje ({count})', 'journey.suggestions.restored': 'Wróciło {count} propozycji', 'journey.suggestions.restored.one': 'Wróciła {count} propozycja', 'journey.suggestions.restored.few': 'Wróciły {count} propozycje', diff --git a/shared/src/i18n/pl/memories.ts b/shared/src/i18n/pl/memories.ts index 31c0eabeb..dc210f682 100644 --- a/shared/src/i18n/pl/memories.ts +++ b/shared/src/i18n/pl/memories.ts @@ -58,6 +58,12 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Udostępnić członkom podróży?', 'memories.confirmShareHint': '{count} zdjęć będzie widocznych dla wszystkich członków tej podróży. Możesz później ustawić poszczególne zdjęcia jako prywatne.', + 'memories.confirmShareHint.one': + '{count} zdjęcie będzie widoczne dla wszystkich członków tej podróży. Możesz później ustawić je jako prywatne.', + 'memories.confirmShareHint.few': + '{count} zdjęcia będą widoczne dla wszystkich członków tej podróży. Możesz później ustawić poszczególne zdjęcia jako prywatne.', + 'memories.confirmShareHint.many': + '{count} zdjęć będzie widocznych dla wszystkich członków tej podróży. Możesz później ustawić poszczególne zdjęcia jako prywatne.', 'memories.confirmShareButton': 'Udostępnij zdjęcia', 'memories.testFirst': 'Najpierw przetestuj połączenie', 'memories.linkAlbum': 'Połącz album', diff --git a/shared/src/i18n/pl/packing.ts b/shared/src/i18n/pl/packing.ts index 939ad5c18..d4ded8cd5 100644 --- a/shared/src/i18n/pl/packing.ts +++ b/shared/src/i18n/pl/packing.ts @@ -31,6 +31,9 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Działa też lista w Markdown: nagłówek określa kategorię, "- [ ]" i "- [x]" stają się pozycjami, a "3x" przed nazwą ustawia ilość.', 'packing.importAction': 'Importuj {count}', + 'packing.importAction.one': 'Importuj {count}', + 'packing.importAction.few': 'Importuj {count}', + 'packing.importAction.many': 'Importuj {count}', 'packing.importSuccess': 'Zaimportowano {count} pozycji', 'packing.importSuccess.one': 'Zaimportowano {count} pozycję', 'packing.importSuccess.few': 'Zaimportowano {count} pozycje', @@ -38,8 +41,14 @@ const packing: TranslationStrings = { 'packing.importError': 'Import nie powiódł się', 'packing.importEmpty': 'Brak pozycji do zaimportowania', 'packing.progress': '{packed} z {total} spakowanych ({percent}%)', - 'packing.clearChecked': 'Usuń {count} spakowanych', + 'packing.clearChecked': 'Usuń {count} spakowanego przedmiotu', + 'packing.clearChecked.one': 'Usuń {count} spakowany przedmiot', + 'packing.clearChecked.few': 'Usuń {count} spakowane przedmioty', + 'packing.clearChecked.many': 'Usuń {count} spakowanych przedmiotów', 'packing.clearCheckedShort': 'Usuń {count}', + 'packing.clearCheckedShort.one': 'Usuń {count}', + 'packing.clearCheckedShort.few': 'Usuń {count}', + 'packing.clearCheckedShort.many': 'Usuń {count}', 'packing.allPacked': 'Wszystko spakowane!', 'packing.addPlaceholder': 'Dodaj nowy przedmiot...', 'packing.categoryPlaceholder': 'Lista...', @@ -105,6 +114,9 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'Nikogo innego na tej podróży', 'packing.takenCareOf': 'od {name}', 'packing.sharedWithCount': 'udostępniono {count} osobom', + 'packing.sharedWithCount.one': 'udostępniono {count} osobie', + 'packing.sharedWithCount.few': 'udostępniono {count} osobom', + 'packing.sharedWithCount.many': 'udostępniono {count} osobom', 'packing.broughtBy': 'przynosi {name}', 'packing.alsoBring': 'Ja też mogę to wziąć', 'packing.alsoBringingStop': 'Jednak nie biorę', diff --git a/shared/src/i18n/pl/photos.ts b/shared/src/i18n/pl/photos.ts index 2d91851fc..9c4b55835 100644 --- a/shared/src/i18n/pl/photos.ts +++ b/shared/src/i18n/pl/photos.ts @@ -17,7 +17,10 @@ const photos: TranslationStrings = { 'photos.clickToSelect': 'lub kliknij, aby wybrać', 'photos.linkPlace': 'Połącz z miejscem', 'photos.noPlace': 'Brak miejsca', - 'photos.uploadN': 'Prześlij {n} zdjęć', + 'photos.uploadN': 'Prześlij {n} zdjęcia', + 'photos.uploadN.one': 'Prześlij {n} zdjęcie', + 'photos.uploadN.few': 'Prześlij {n} zdjęcia', + 'photos.uploadN.many': 'Prześlij {n} zdjęć', 'photos.linkDay': 'Połącz dzień', 'photos.noDay': 'Brak dnia', 'photos.dayLabel': 'Dzień {number}', diff --git a/shared/src/i18n/pl/reservations.ts b/shared/src/i18n/pl/reservations.ts index a2b3cda74..615092f29 100644 --- a/shared/src/i18n/pl/reservations.ts +++ b/shared/src/i18n/pl/reservations.ts @@ -189,6 +189,9 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Inne loty', 'reservations.airtrail.empty': 'Nie znaleziono lotów na Twoim koncie AirTrail.', 'reservations.airtrail.importCta': 'Importuj {count}', + 'reservations.airtrail.importCta.one': 'Importuj {count}', + 'reservations.airtrail.importCta.few': 'Importuj {count}', + 'reservations.airtrail.importCta.many': 'Importuj {count}', 'reservations.airtrail.joinConnection': 'Importuj jako jeden lot z przesiadką w {stops}', 'reservations.costsLabel': 'Koszty', 'reservations.createExpense': 'Utwórz wydatek', diff --git a/shared/src/i18n/pl/roadtrip.ts b/shared/src/i18n/pl/roadtrip.ts index 3afb1a7af..38b88f584 100644 --- a/shared/src/i18n/pl/roadtrip.ts +++ b/shared/src/i18n/pl/roadtrip.ts @@ -209,6 +209,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Nic po drodze nie pasuje do „{name}”.', 'roadtrip.poi.noneMatchFilters': 'Nic po drodze nie pasuje do tych filtrów.', 'roadtrip.poi.foundFiltered': '{count} z {total} po drodze', + 'roadtrip.poi.foundFiltered.one': '{count} z {total} po drodze', + 'roadtrip.poi.foundFiltered.few': '{count} z {total} po drodze', + 'roadtrip.poi.foundFiltered.many': '{count} z {total} po drodze', 'roadtrip.poi.truncated': 'Na {count} odcinka było więcej, niż mieści się w jednej odpowiedzi. Zawęź korytarz, aby zobaczyć resztę.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/pl/settings.ts b/shared/src/i18n/pl/settings.ts index 79c81cc03..2e192f10c 100644 --- a/shared/src/i18n/pl/settings.ts +++ b/shared/src/i18n/pl/settings.ts @@ -579,9 +579,21 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Offline', 'settings.offline.banner.forced': 'Tryb offline', 'settings.offline.banner.queued': 'Offline · {count} w kolejce', + 'settings.offline.banner.queued.one': 'Offline · {count} w kolejce', + 'settings.offline.banner.queued.few': 'Offline · {count} w kolejce', + 'settings.offline.banner.queued.many': 'Offline · {count} w kolejce', 'settings.offline.banner.syncing': 'Synchronizowanie {count}…', + 'settings.offline.banner.syncing.one': 'Synchronizowanie {count}…', + 'settings.offline.banner.syncing.few': 'Synchronizowanie {count}…', + 'settings.offline.banner.syncing.many': 'Synchronizowanie {count}…', 'settings.offline.banner.failed': 'Nie udało się zsynchronizować: {count}', + 'settings.offline.banner.failed.one': 'Nie udało się zsynchronizować: {count}', + 'settings.offline.banner.failed.few': 'Nie udało się zsynchronizować: {count}', + 'settings.offline.banner.failed.many': 'Nie udało się zsynchronizować: {count}', 'settings.offline.banner.conflicts': 'Konflikty: {count}', + 'settings.offline.banner.conflicts.one': 'Konflikty: {count}', + 'settings.offline.banner.conflicts.few': 'Konflikty: {count}', + 'settings.offline.banner.conflicts.many': 'Konflikty: {count}', 'settings.pluginActivity.title': 'Aktywność wtyczek', 'settings.pluginActivity.description': 'Każde działanie wykonane przez wtyczkę w Twoim imieniu, od najnowszych.', 'settings.pluginActivity.empty': 'Brak aktywności wtyczek.', @@ -603,6 +615,9 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Wszystko', 'settings.apiScopes.noneSelected': 'Wybierz co najmniej jeden obszar, inaczej klucz nie mógłby niczego odczytać.', 'settings.apiScopes.limited': '{count} z {total}', + 'settings.apiScopes.limited.one': '{count} z {total}', + 'settings.apiScopes.limited.few': '{count} z {total}', + 'settings.apiScopes.limited.many': '{count} z {total}', 'settings.apiScopes.trips': 'Podróże', 'settings.apiScopes.days': 'Dni', 'settings.apiScopes.places': 'Miejsca', diff --git a/shared/src/i18n/pl/tours.ts b/shared/src/i18n/pl/tours.ts index e0cf88425..d13943e28 100644 --- a/shared/src/i18n/pl/tours.ts +++ b/shared/src/i18n/pl/tours.ts @@ -70,6 +70,9 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Punkty trasy', 'tours.planner.waypointLabel': 'Punkt trasy {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', + 'tours.durationMinutes.few': '{count} min', + 'tours.durationMinutes.many': '{count} min', 'tours.planner.empty': 'Dodaj co najmniej dwa punkty, aby obliczyć trasę pieszą.', 'tours.planner.start': 'Początek', 'tours.planner.via': 'Przez', diff --git a/shared/src/i18n/pl/trip.ts b/shared/src/i18n/pl/trip.ts index c3dfaa053..33f20cd0b 100644 --- a/shared/src/i18n/pl/trip.ts +++ b/shared/src/i18n/pl/trip.ts @@ -79,6 +79,9 @@ const trip: TranslationStrings = { 'transit.transfers.few': '{count} przesiadki', 'transit.transfers.many': '{count} przesiadek', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', + 'transit.min.few': '{count} min', + 'transit.min.many': '{count} min', 'transit.stops': '{count} przystanku', 'transit.stops.one': '{count} przystanek', 'transit.stops.few': '{count} przystanki', diff --git a/shared/src/i18n/pl/vacay.ts b/shared/src/i18n/pl/vacay.ts index 1548a0c89..790170e96 100644 --- a/shared/src/i18n/pl/vacay.ts +++ b/shared/src/i18n/pl/vacay.ts @@ -88,6 +88,9 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Automatycznie przenosi pozostałe dni urlopowe na kolejny rok', 'vacay.carriedOverPrevPeriod': 'z poprzedniego okresu', 'vacay.compUsedCount': '{count}× odbiór', + 'vacay.compUsedCount.one': '{count}× odbiór', + 'vacay.compUsedCount.few': '{count}× odbiór', + 'vacay.compUsedCount.many': '{count}× odbiór', 'vacay.yearType': 'Rok urlopowy', 'vacay.yearTypeHint': 'Kiedy zaczyna się Twój rok urlopowy — od tego zależy wymiar, wykorzystanie i przeniesienie', 'vacay.yearTypeCalendar': 'Kalendarzowy', diff --git a/shared/src/i18n/ru/admin.ts b/shared/src/i18n/ru/admin.ts index ff8ed72b1..9cf571e6e 100644 --- a/shared/src/i18n/ru/admin.ts +++ b/shared/src/i18n/ru/admin.ts @@ -591,7 +591,13 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Требуется {addon}', 'admin.plugins.cap.dependsOn': 'Нужен {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Сначала включите необходимые дополнения: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Сначала включите необходимое дополнение: {addons}', + 'admin.plugins.dep.addonDisabledToast.few': 'Сначала включите необходимые дополнения: {addons}', + 'admin.plugins.dep.addonDisabledToast.many': 'Сначала включите необходимые дополнения: {addons}', 'admin.plugins.dep.autoEnabled': 'Сначала включены необходимые плагины: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Сначала включён необходимый плагин: {plugins}', + 'admin.plugins.dep.autoEnabled.few': 'Сначала включены необходимые плагины: {plugins}', + 'admin.plugins.dep.autoEnabled.many': 'Сначала включены необходимые плагины: {plugins}', 'admin.plugins.dep.downloaded': '{id} загружен', 'admin.plugins.dep.resolveTitle': 'Отсутствуют зависимости', 'admin.plugins.dep.resolveBody': '«{name}» требует установки этих плагинов перед включением.', @@ -719,7 +725,10 @@ const admin: TranslationStrings = { 'admin.audit.empty': 'Записей аудита пока нет.', 'admin.audit.refresh': 'Обновить', 'admin.audit.loadMore': 'Загрузить ещё', - 'admin.audit.showing': 'Загружено: {count} · всего {total}', + 'admin.audit.showing': 'Загружено {count} записи · всего {total}', + 'admin.audit.showing.one': 'Загружена {count} запись · всего {total}', + 'admin.audit.showing.few': 'Загружено {count} записи · всего {total}', + 'admin.audit.showing.many': 'Загружено {count} записей · всего {total}', 'admin.audit.col.time': 'Время', 'admin.audit.col.user': 'Пользователь', 'admin.audit.col.action': 'Действие', diff --git a/shared/src/i18n/ru/collab.ts b/shared/src/i18n/ru/collab.ts index bcadede26..247487a66 100644 --- a/shared/src/i18n/ru/collab.ts +++ b/shared/src/i18n/ru/collab.ts @@ -45,7 +45,13 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Загрузить старые сообщения', 'collab.chat.justNow': 'только что', 'collab.chat.minutesAgo': '{n} мин. назад', + 'collab.chat.minutesAgo.one': '{n} мин. назад', + 'collab.chat.minutesAgo.few': '{n} мин. назад', + 'collab.chat.minutesAgo.many': '{n} мин. назад', 'collab.chat.hoursAgo': '{n} ч. назад', + 'collab.chat.hoursAgo.one': '{n} ч. назад', + 'collab.chat.hoursAgo.few': '{n} ч. назад', + 'collab.chat.hoursAgo.many': '{n} ч. назад', 'collab.notes.title': 'Заметки', 'collab.notes.new': 'Новая заметка', 'collab.notes.empty': 'Заметок пока нет', @@ -69,6 +75,9 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Закрепить', 'collab.notes.unpin': 'Открепить', 'collab.notes.daysAgo': '{n} дн. назад', + 'collab.notes.daysAgo.one': '{n} дн. назад', + 'collab.notes.daysAgo.few': '{n} дн. назад', + 'collab.notes.daysAgo.many': '{n} дн. назад', 'collab.notes.categorySettings': 'Управление категориями', 'collab.notes.create': 'Создать', 'collab.notes.website': 'Сайт', diff --git a/shared/src/i18n/ru/collection.ts b/shared/src/i18n/ru/collection.ts index 659858854..655e6757a 100644 --- a/shared/src/i18n/ru/collection.ts +++ b/shared/src/i18n/ru/collection.ts @@ -2,7 +2,13 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Сохранить {count} в список', + 'collections.saveNToList.one': 'Сохранить {count} в список', + 'collections.saveNToList.few': 'Сохранить {count} в список', + 'collections.saveNToList.many': 'Сохранить {count} в список', 'collections.addedNToList': 'Сохранено {count} в {name}', + 'collections.addedNToList.one': 'Сохранено {count} в {name}', + 'collections.addedNToList.few': 'Сохранено {count} в {name}', + 'collections.addedNToList.many': 'Сохранено {count} в {name}', 'collections.noOwnLists': 'У вас пока нет списков', 'collections.saveToListHint': 'Дубликаты пропускаются автоматически', 'collections.role.label': 'Роль', @@ -16,7 +22,13 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Переместить в список', 'collections.duplicateToList': 'Дублировать в список', 'collections.moveToListTitle': 'Переместить {count} в другой список', + 'collections.moveToListTitle.one': 'Переместить {count} в другой список', + 'collections.moveToListTitle.few': 'Переместить {count} в другой список', + 'collections.moveToListTitle.many': 'Переместить {count} в другой список', 'collections.duplicateToListTitle': 'Дублировать {count} в другой список', + 'collections.duplicateToListTitle.one': 'Дублировать {count} в другой список', + 'collections.duplicateToListTitle.few': 'Дублировать {count} в другой список', + 'collections.duplicateToListTitle.many': 'Дублировать {count} в другой список', 'collections.noOtherLists': 'Других списков пока нет', 'collections.movedCount': 'Перемещено {count} места', 'collections.movedCount.one': 'Перемещено {count} место', @@ -66,6 +78,9 @@ const collection: TranslationStrings = { 'collections.importSelectedCount.few': 'Выбрано: {count}', 'collections.importSelectedCount.many': 'Выбрано: {count}', 'collections.importAction': 'Импортировать {count}', + 'collections.importAction.one': 'Импортировать {count}', + 'collections.importAction.few': 'Импортировать {count}', + 'collections.importAction.many': 'Импортировать {count}', 'collections.importEmptyTrip': 'В этой поездке пока нет мест', 'collections.importNothingNew': 'Всё из этой поездки уже есть в списке', 'collections.importDone': 'Добавлено {count} места', @@ -130,6 +145,9 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Скопировать в поездку', 'collections.copyToTripTitle': 'Скопировать в поездку', 'collections.copyN': 'Скопировать {count} в поездку', + 'collections.copyN.one': 'Скопировать {count} в поездку', + 'collections.copyN.few': 'Скопировать {count} в поездку', + 'collections.copyN.many': 'Скопировать {count} в поездку', 'collections.copyToTripSearch': 'Поиск поездок', 'collections.searchLists': 'Поиск списков', 'collections.copyToTripConfirm': 'Скопировать', @@ -171,6 +189,9 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Удалено из коллекции', 'collections.picker.title': 'Сохранённые места', 'collections.picker.showMore': 'Показать ещё {count}', + 'collections.picker.showMore.one': 'Показать ещё {count}', + 'collections.picker.showMore.few': 'Показать ещё {count}', + 'collections.picker.showMore.many': 'Показать ещё {count}', 'collections.picker.search': 'Поиск по сохранённым местам', 'collections.picker.empty': 'Нет сохранённых мест для добавления', 'collections.picker.hint': 'Выберите место из своих коллекций', @@ -195,6 +216,9 @@ const collection: TranslationStrings = { 'collections.file.doneInto.few': '{count} места добавлены в {name}', 'collections.file.doneInto.many': '{count} мест добавлено в {name}', 'collections.file.doneIntoDuplicates': '{count} добавлено в {name}, {duplicates} уже были там', + 'collections.file.doneIntoDuplicates.one': '{count} добавлено в {name}, {duplicates} уже были там', + 'collections.file.doneIntoDuplicates.few': '{count} добавлено в {name}, {duplicates} уже были там', + 'collections.file.doneIntoDuplicates.many': '{count} добавлено в {name}, {duplicates} уже были там', 'collections.file.doneIntoNothing': 'Все места из файла уже есть в {name}', 'collections.file.change': 'Изменить', 'collections.file.labelCount': '{count} метки', @@ -238,6 +262,12 @@ const collection: TranslationStrings = { 'collections.file.gpxEmpty': 'В этом файле GPX нет путевых точек, поэтому импортировать нечего.', 'collections.file.errorNotGpx': 'Это не файл GPX.', 'collections.file.errorTooManyPlaces': + 'В этом файле больше {count} места. Разделите его и импортируйте части по очереди.', + 'collections.file.errorTooManyPlaces.one': + 'В этом файле больше {count} места. Разделите его и импортируйте части по очереди.', + 'collections.file.errorTooManyPlaces.few': + 'В этом файле больше {count} мест. Разделите его и импортируйте части по очереди.', + 'collections.file.errorTooManyPlaces.many': 'В этом файле больше {count} мест. Разделите его и импортируйте части по очереди.', 'collections.share.title': 'Поделиться списком', diff --git a/shared/src/i18n/ru/common.ts b/shared/src/i18n/ru/common.ts index 7db600594..117dc40cb 100644 --- a/shared/src/i18n/ru/common.ts +++ b/shared/src/i18n/ru/common.ts @@ -55,7 +55,13 @@ const common: TranslationStrings = { 'common.copied': 'Скопировано', 'common.justNow': 'только что', 'common.hoursAgo': '{count} ч назад', - 'common.daysAgo': '{count} д назад', + 'common.hoursAgo.one': '{count} ч назад', + 'common.hoursAgo.few': '{count} ч назад', + 'common.hoursAgo.many': '{count} ч назад', + 'common.daysAgo': '{count} дн. назад', + 'common.daysAgo.one': '{count} дн. назад', + 'common.daysAgo.few': '{count} дн. назад', + 'common.daysAgo.many': '{count} дн. назад', 'common.datepicker.prevMonth': 'Previous month', // en-fallback 'common.datepicker.nextMonth': 'Next month', // en-fallback 'common.datepicker.prevYear': 'Previous year', // en-fallback diff --git a/shared/src/i18n/ru/dashboard.ts b/shared/src/i18n/ru/dashboard.ts index e620a448d..e06ce70b2 100644 --- a/shared/src/i18n/ru/dashboard.ts +++ b/shared/src/i18n/ru/dashboard.ts @@ -8,8 +8,10 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips.few': '{count} поездки ({archived} в архиве)', 'dashboard.subtitle.trips.many': '{count} поездок ({archived} в архиве)', 'dashboard.subtitle.empty': 'Начните свою первую поездку', - 'dashboard.subtitle.activeOne': '{count} активная поездка', - 'dashboard.subtitle.activeMany': '{count} активных поездок', + 'dashboard.subtitle.active': '{count} активной поездки', + 'dashboard.subtitle.active.one': '{count} активная поездка', + 'dashboard.subtitle.active.few': '{count} активные поездки', + 'dashboard.subtitle.active.many': '{count} активных поездок', 'dashboard.subtitle.archivedSuffix': ' · {count} в архиве', 'dashboard.subtitle.archivedSuffix.one': ' · {count} в архиве', 'dashboard.subtitle.archivedSuffix.few': ' · {count} в архиве', @@ -124,6 +126,9 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Удалить дни?', 'dashboard.shrinkIntro': 'При сохранении новых дат будут удалены эти дни:', 'dashboard.shrinkMoreDays': 'ещё +{count}', + 'dashboard.shrinkMoreDays.one': 'ещё +{count}', + 'dashboard.shrinkMoreDays.few': 'ещё +{count}', + 'dashboard.shrinkMoreDays.many': 'ещё +{count}', 'dashboard.shrinkLastDays': 'Удаляются последние дни, а не первые', 'dashboard.shrinkLastDaysHint': 'Планы дней переносятся вместе с новыми датами, поэтому удаляются всегда последние дни плана, даже если сдвинулось начало.', diff --git a/shared/src/i18n/ru/dawarich.ts b/shared/src/i18n/ru/dawarich.ts index c4b1154ea..3bfba7739 100644 --- a/shared/src/i18n/ru/dawarich.ts +++ b/shared/src/i18n/ru/dawarich.ts @@ -99,6 +99,9 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Отклонено', 'dawarich.suggestions.restore': 'Вернуть', 'dawarich.suggestions.showHandled': 'Показать уже обработанные: {count}', + 'dawarich.suggestions.showHandled.one': 'Показать уже обработанные: {count}', + 'dawarich.suggestions.showHandled.few': 'Показать уже обработанные: {count}', + 'dawarich.suggestions.showHandled.many': 'Показать уже обработанные: {count}', 'dawarich.suggestions.hideHandled': 'Скрыть уже обработанные', 'dawarich.suggestions.matchesWish': 'В вашем списке желаний: {name}', 'dawarich.suggestions.acceptedAs.place': 'Добавлено как место', @@ -150,6 +153,9 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Ничего из вашего списка желаний в записях не нашлось.', 'dawarich.bucket.alreadyVisited': 'Уже отмечено', 'dawarich.bucket.confirm': 'Отметить: {count}', + 'dawarich.bucket.confirm.one': 'Отметить: {count}', + 'dawarich.bucket.confirm.few': 'Отметить: {count}', + 'dawarich.bucket.confirm.many': 'Отметить: {count}', 'dawarich.bucket.confirmed': 'Отмечено {count} желания', 'dawarich.bucket.confirmed.one': 'Отмечено {count} желание', 'dawarich.bucket.confirmed.few': 'Отмечено {count} желания', diff --git a/shared/src/i18n/ru/dayplan.ts b/shared/src/i18n/ru/dayplan.ts index e4f07a25a..300f6bda9 100644 --- a/shared/src/i18n/ru/dayplan.ts +++ b/shared/src/i18n/ru/dayplan.ts @@ -104,11 +104,23 @@ const dayplan: TranslationStrings = { 'Все места будут убраны из этого дня. Сами места останутся в поездке, а заметки и бронирования дня сохранятся.', 'dayplan.deleteDayEmpty': 'На этот день ничего не запланировано.', 'dayplan.impactPlaces': 'Запланированные места: {count}', + 'dayplan.impactPlaces.one': 'Запланированные места: {count}', + 'dayplan.impactPlaces.few': 'Запланированные места: {count}', + 'dayplan.impactPlaces.many': 'Запланированные места: {count}', 'dayplan.impactPlacesHint': 'Они останутся в списке мест.', 'dayplan.impactNotes': 'Заметки: {count}', + 'dayplan.impactNotes.one': 'Заметки: {count}', + 'dayplan.impactNotes.few': 'Заметки: {count}', + 'dayplan.impactNotes.many': 'Заметки: {count}', 'dayplan.impactTexts': 'Названия и описания дня: {count}', + 'dayplan.impactTexts.one': 'Названия и описания дня: {count}', + 'dayplan.impactTexts.few': 'Названия и описания дня: {count}', + 'dayplan.impactTexts.many': 'Названия и описания дня: {count}', 'dayplan.impactDeletedHint': 'Тоже будут удалены.', 'dayplan.impactBookings': 'Бронирования: {count}', + 'dayplan.impactBookings.one': 'Бронирования: {count}', + 'dayplan.impactBookings.few': 'Бронирования: {count}', + 'dayplan.impactBookings.many': 'Бронирования: {count}', 'dayplan.impactStay': 'Проживание в {name}', 'dayplan.deleteDayBookingsHint': 'Они останутся в Бронированиях, без дня.', 'dayplan.deleteDayStayHint': 'Заезд или выезд приходится на этот день, поэтому проживание отменяется.', @@ -119,9 +131,18 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Заезд или выезд приходится на этот день, поэтому проживание отменяется вместе с бронированием «{booking}» и его расходом на {amount}.', 'dayplan.deleteDayShift': 'Последующие дни: {count}', + 'dayplan.deleteDayShift.one': 'Последующие дни: {count}', + 'dayplan.deleteDayShift.few': 'Последующие дни: {count}', + 'dayplan.deleteDayShift.many': 'Последующие дни: {count}', 'dayplan.deleteDayShiftHint': 'Каждый сдвигается на одну дату раньше.', 'dayplan.deleteDayShiftBookingsHint': 'Каждый сдвигается на одну дату раньше. Бронирования, которые сдвигаются вместе с ними: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Каждый сдвигается на одну дату раньше. Бронирования, которые сдвигаются вместе с ними: {count}', + 'dayplan.deleteDayShiftBookingsHint.few': + 'Каждый сдвигается на одну дату раньше. Бронирования, которые сдвигаются вместе с ними: {count}', + 'dayplan.deleteDayShiftBookingsHint.many': + 'Каждый сдвигается на одну дату раньше. Бронирования, которые сдвигаются вместе с ними: {count}', 'dayplan.deleteDayShrink': 'Теперь поездка заканчивается {date}', 'dayplan.deleteDayShrinkHint': 'Нет дня без даты, который мог бы занять последнюю дату.', 'dayplan.impactStayShorter': 'Проживание в {name}: на одну ночь меньше', diff --git a/shared/src/i18n/ru/docsync.ts b/shared/src/i18n/ru/docsync.ts index 2aecee1ba..42dcf9b67 100644 --- a/shared/src/i18n/ru/docsync.ts +++ b/shared/src/i18n/ru/docsync.ts @@ -73,6 +73,9 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Перемещено за пределы папки', 'docsync.conflict.resolve': 'Решить: {count}', + 'docsync.conflict.resolve.one': 'Решить: {count}', + 'docsync.conflict.resolve.few': 'Решить: {count}', + 'docsync.conflict.resolve.many': 'Решить: {count}', 'docsync.conflict.title': 'Изменились обе копии', 'docsync.conflict.keepTrek': 'Оставить версию TREK', diff --git a/shared/src/i18n/ru/journey.ts b/shared/src/i18n/ru/journey.ts index 9ea8a0f03..7b553fa10 100644 --- a/shared/src/i18n/ru/journey.ts +++ b/shared/src/i18n/ru/journey.ts @@ -693,6 +693,9 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Предложение отклонено', 'journey.suggestions.restore': 'Вернуть отклонённые предложения', 'journey.suggestions.restoreCount': 'Отклонённые предложения ({count})', + 'journey.suggestions.restoreCount.one': 'Отклонённые предложения ({count})', + 'journey.suggestions.restoreCount.few': 'Отклонённые предложения ({count})', + 'journey.suggestions.restoreCount.many': 'Отклонённые предложения ({count})', 'journey.suggestions.restored': 'Возвращено {count} предложения', 'journey.suggestions.restored.one': 'Возвращено {count} предложение', 'journey.suggestions.restored.few': 'Возвращено {count} предложения', diff --git a/shared/src/i18n/ru/memories.ts b/shared/src/i18n/ru/memories.ts index 17fb0a47c..1ed046005 100644 --- a/shared/src/i18n/ru/memories.ts +++ b/shared/src/i18n/ru/memories.ts @@ -65,6 +65,12 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Поделиться с участниками поездки?', 'memories.confirmShareHint': '{count} фото станут видны всем участникам этой поездки. Вы сможете сделать отдельные фото приватными позже.', + 'memories.confirmShareHint.one': + '{count} фото станет видно всем участникам этой поездки. Вы сможете сделать его приватным позже.', + 'memories.confirmShareHint.few': + '{count} фото станут видны всем участникам этой поездки. Вы сможете сделать отдельные фото приватными позже.', + 'memories.confirmShareHint.many': + '{count} фото станут видны всем участникам этой поездки. Вы сможете сделать отдельные фото приватными позже.', 'memories.confirmShareButton': 'Поделиться фото', 'memories.error.loadAlbums': 'Не удалось загрузить альбомы', 'memories.error.linkAlbum': 'Не удалось привязать альбом', diff --git a/shared/src/i18n/ru/packing.ts b/shared/src/i18n/ru/packing.ts index 9f5190b18..d39521cd9 100644 --- a/shared/src/i18n/ru/packing.ts +++ b/shared/src/i18n/ru/packing.ts @@ -31,6 +31,9 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Подойдёт и список в Markdown: заголовок задаёт категорию, "- [ ]" и "- [x]" становятся пунктами, а "3x" перед названием задаёт количество.', 'packing.importAction': 'Импортировать {count}', + 'packing.importAction.one': 'Импортировать {count}', + 'packing.importAction.few': 'Импортировать {count}', + 'packing.importAction.many': 'Импортировать {count}', 'packing.importSuccess': '{count} предмета импортировано', 'packing.importSuccess.one': '{count} предмет импортирован', 'packing.importSuccess.few': '{count} предмета импортированы', @@ -38,8 +41,14 @@ const packing: TranslationStrings = { 'packing.importError': 'Ошибка импорта', 'packing.importEmpty': 'Нет предметов для импорта', 'packing.progress': '{packed} из {total} собрано ({percent}%)', - 'packing.clearChecked': 'Удалить {count} отмеченных', + 'packing.clearChecked': 'Удалить {count} отмеченного предмета', + 'packing.clearChecked.one': 'Удалить {count} отмеченный предмет', + 'packing.clearChecked.few': 'Удалить {count} отмеченных предмета', + 'packing.clearChecked.many': 'Удалить {count} отмеченных предметов', 'packing.clearCheckedShort': 'Удалить {count}', + 'packing.clearCheckedShort.one': 'Удалить {count}', + 'packing.clearCheckedShort.few': 'Удалить {count}', + 'packing.clearCheckedShort.many': 'Удалить {count}', 'packing.allPacked': 'Всё собрано!', 'packing.addPlaceholder': 'Добавить вещь...', 'packing.categoryPlaceholder': 'Список...', @@ -104,7 +113,10 @@ const packing: TranslationStrings = { 'packing.tierShared': 'Поделиться с…', 'packing.noOneToShare': 'Пока больше никого в этой поездке', 'packing.takenCareOf': 'от {name}', - 'packing.sharedWithCount': 'доступно {count}', + 'packing.sharedWithCount': 'доступно {count} участникам', + 'packing.sharedWithCount.one': 'доступно {count} участнику', + 'packing.sharedWithCount.few': 'доступно {count} участникам', + 'packing.sharedWithCount.many': 'доступно {count} участникам', 'packing.broughtBy': 'приносит {name}', 'packing.alsoBring': 'Я тоже могу принести', 'packing.alsoBringingStop': 'Я не принесу', diff --git a/shared/src/i18n/ru/photos.ts b/shared/src/i18n/ru/photos.ts index 9b44a9b3a..2a2a403a9 100644 --- a/shared/src/i18n/ru/photos.ts +++ b/shared/src/i18n/ru/photos.ts @@ -18,6 +18,9 @@ const photos: TranslationStrings = { 'photos.linkPlace': 'Привязать место', 'photos.noPlace': 'Без места', 'photos.uploadN': '{n} фото загружено', + 'photos.uploadN.one': '{n} фото загружено', + 'photos.uploadN.few': '{n} фото загружено', + 'photos.uploadN.many': '{n} фото загружено', 'photos.linkDay': 'Связать день', 'photos.noDay': 'Нет дня', 'photos.dayLabel': 'День {number}', diff --git a/shared/src/i18n/ru/reservations.ts b/shared/src/i18n/ru/reservations.ts index 0e38c2e55..74425a744 100644 --- a/shared/src/i18n/ru/reservations.ts +++ b/shared/src/i18n/ru/reservations.ts @@ -188,6 +188,9 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Другие рейсы', 'reservations.airtrail.empty': 'В вашей учётной записи AirTrail не найдено рейсов.', 'reservations.airtrail.importCta': 'Импортировать {count}', + 'reservations.airtrail.importCta.one': 'Импортировать {count}', + 'reservations.airtrail.importCta.few': 'Импортировать {count}', + 'reservations.airtrail.importCta.many': 'Импортировать {count}', 'reservations.airtrail.joinConnection': 'Импортировать как один рейс с пересадкой в {stops}', 'reservations.costsLabel': 'Расходы', 'reservations.createExpense': 'Создать расход', diff --git a/shared/src/i18n/ru/roadtrip.ts b/shared/src/i18n/ru/roadtrip.ts index 7fba53cac..b5da1bc94 100644 --- a/shared/src/i18n/ru/roadtrip.ts +++ b/shared/src/i18n/ru/roadtrip.ts @@ -213,6 +213,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'По пути ничего не соответствует «{name}».', 'roadtrip.poi.noneMatchFilters': 'На маршруте нет ничего, что подходит под эти фильтры.', 'roadtrip.poi.foundFiltered': '{count} из {total} по пути', + 'roadtrip.poi.foundFiltered.one': '{count} из {total} по пути', + 'roadtrip.poi.foundFiltered.few': '{count} из {total} по пути', + 'roadtrip.poi.foundFiltered.many': '{count} из {total} по пути', 'roadtrip.poi.truncated': 'На {count} участка нашлось больше, чем помещается в один ответ. Сузьте коридор, чтобы увидеть остальное.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/ru/settings.ts b/shared/src/i18n/ru/settings.ts index 1a3792fed..8d0e7c53f 100644 --- a/shared/src/i18n/ru/settings.ts +++ b/shared/src/i18n/ru/settings.ts @@ -584,9 +584,21 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Офлайн', 'settings.offline.banner.forced': 'Офлайн-режим', 'settings.offline.banner.queued': 'Офлайн · {count} в очереди', + 'settings.offline.banner.queued.one': 'Офлайн · {count} в очереди', + 'settings.offline.banner.queued.few': 'Офлайн · {count} в очереди', + 'settings.offline.banner.queued.many': 'Офлайн · {count} в очереди', 'settings.offline.banner.syncing': 'Синхронизация {count}…', + 'settings.offline.banner.syncing.one': 'Синхронизация {count}…', + 'settings.offline.banner.syncing.few': 'Синхронизация {count}…', + 'settings.offline.banner.syncing.many': 'Синхронизация {count}…', 'settings.offline.banner.failed': 'Не удалось синхронизировать: {count}', + 'settings.offline.banner.failed.one': 'Не удалось синхронизировать: {count}', + 'settings.offline.banner.failed.few': 'Не удалось синхронизировать: {count}', + 'settings.offline.banner.failed.many': 'Не удалось синхронизировать: {count}', 'settings.offline.banner.conflicts': 'Конфликты: {count}', + 'settings.offline.banner.conflicts.one': 'Конфликты: {count}', + 'settings.offline.banner.conflicts.few': 'Конфликты: {count}', + 'settings.offline.banner.conflicts.many': 'Конфликты: {count}', 'settings.pluginActivity.title': 'Активность плагинов', 'settings.pluginActivity.description': 'Все действия, которые плагин выполнил от вашего имени, сначала новые.', 'settings.pluginActivity.empty': 'Активности плагинов пока нет.', @@ -608,6 +620,9 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Всё', 'settings.apiScopes.noneSelected': 'Выберите хотя бы один раздел, иначе ключ не сможет ничего прочитать.', 'settings.apiScopes.limited': '{count} из {total}', + 'settings.apiScopes.limited.one': '{count} из {total}', + 'settings.apiScopes.limited.few': '{count} из {total}', + 'settings.apiScopes.limited.many': '{count} из {total}', 'settings.apiScopes.trips': 'Поездки', 'settings.apiScopes.days': 'Дни', 'settings.apiScopes.places': 'Места', diff --git a/shared/src/i18n/ru/tours.ts b/shared/src/i18n/ru/tours.ts index e0b728dba..a5caae4d8 100644 --- a/shared/src/i18n/ru/tours.ts +++ b/shared/src/i18n/ru/tours.ts @@ -70,6 +70,9 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Путевые точки', 'tours.planner.waypointLabel': 'Путевая точка {n}', 'tours.durationMinutes': '{count} мин', + 'tours.durationMinutes.one': '{count} мин', + 'tours.durationMinutes.few': '{count} мин', + 'tours.durationMinutes.many': '{count} мин', 'tours.planner.empty': 'Добавьте хотя бы две точки для расчёта пешего маршрута.', 'tours.planner.start': 'Начало', 'tours.planner.via': 'Через', diff --git a/shared/src/i18n/ru/trip.ts b/shared/src/i18n/ru/trip.ts index 9a988b889..3a1a853c3 100644 --- a/shared/src/i18n/ru/trip.ts +++ b/shared/src/i18n/ru/trip.ts @@ -79,6 +79,9 @@ const trip: TranslationStrings = { 'transit.transfers.few': '{count} пересадки', 'transit.transfers.many': '{count} пересадок', 'transit.min': '{count} мин', + 'transit.min.one': '{count} мин', + 'transit.min.few': '{count} мин', + 'transit.min.many': '{count} мин', 'transit.stops': '{count} остановки', 'transit.stops.one': '{count} остановка', 'transit.stops.few': '{count} остановки', diff --git a/shared/src/i18n/ru/vacay.ts b/shared/src/i18n/ru/vacay.ts index a068eb560..6fadcdcf1 100644 --- a/shared/src/i18n/ru/vacay.ts +++ b/shared/src/i18n/ru/vacay.ts @@ -84,6 +84,9 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Автоматически переносить оставшиеся дни отпуска на следующий год', 'vacay.carriedOverPrevPeriod': 'из предыдущего периода', 'vacay.compUsedCount': 'Отгулы: {count}', + 'vacay.compUsedCount.one': 'Отгулы: {count}', + 'vacay.compUsedCount.few': 'Отгулы: {count}', + 'vacay.compUsedCount.many': 'Отгулы: {count}', 'vacay.yearType': 'Отпускной год', 'vacay.yearTypeHint': 'Когда начинается ваш отпускной год — от этого зависят право на отпуск, использованные дни и перенос', diff --git a/shared/src/i18n/sk/admin.ts b/shared/src/i18n/sk/admin.ts index f5fb40e66..14837a09c 100644 --- a/shared/src/i18n/sk/admin.ts +++ b/shared/src/i18n/sk/admin.ts @@ -638,7 +638,11 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Vyžaduje {addon}', 'admin.plugins.cap.dependsOn': 'Vyžaduje {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Najprv povoľte potrebné doplnky: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Najprv povoľte potrebný doplnok: {addons}', + 'admin.plugins.dep.addonDisabledToast.few': 'Najprv povoľte potrebné doplnky: {addons}', 'admin.plugins.dep.autoEnabled': 'Najprv povolené potrebné pluginy: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Najprv povolený potrebný plugin: {plugins}', + 'admin.plugins.dep.autoEnabled.few': 'Najprv povolené potrebné pluginy: {plugins}', 'admin.plugins.dep.downloaded': 'Stiahnuté {id}', 'admin.plugins.dep.resolveTitle': 'Chýbajúce závislosti', 'admin.plugins.dep.resolveBody': '„{name}“ pred povolením potrebuje nainštalovať tieto pluginy.', @@ -766,7 +770,9 @@ const admin: TranslationStrings = { 'admin.audit.empty': 'Zatiaľ žiadne záznamy auditu.', 'admin.audit.refresh': 'Obnoviť', 'admin.audit.loadMore': 'Načítať ďalšie', - 'admin.audit.showing': '{count} načítaných · {total} celkom', + 'admin.audit.showing': 'Načítaných {count} záznamov · celkom {total}', + 'admin.audit.showing.one': 'Načítaný {count} záznam · celkom {total}', + 'admin.audit.showing.few': 'Načítané {count} záznamy · celkom {total}', 'admin.audit.col.time': 'Čas', 'admin.audit.col.user': 'Používateľ', 'admin.audit.col.action': 'Akcia', diff --git a/shared/src/i18n/sk/collab.ts b/shared/src/i18n/sk/collab.ts index d827df7eb..fc3cd39ca 100644 --- a/shared/src/i18n/sk/collab.ts +++ b/shared/src/i18n/sk/collab.ts @@ -45,7 +45,11 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Načítať staršie správy', 'collab.chat.justNow': 'práve teraz', 'collab.chat.minutesAgo': 'pred {n} min', + 'collab.chat.minutesAgo.one': 'pred {n} min', + 'collab.chat.minutesAgo.few': 'pred {n} min', 'collab.chat.hoursAgo': 'pred {n} h', + 'collab.chat.hoursAgo.one': 'pred {n} h', + 'collab.chat.hoursAgo.few': 'pred {n} h', 'collab.notes.title': 'Poznámky', 'collab.notes.new': 'Nová poznámka', 'collab.notes.empty': 'Zatiaľ žiadne poznámky', @@ -69,6 +73,8 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Pripnúť', 'collab.notes.unpin': 'Odopnúť', 'collab.notes.daysAgo': 'pred {n} dňami', + 'collab.notes.daysAgo.one': 'pred {n} dňom', + 'collab.notes.daysAgo.few': 'pred {n} dňami', 'collab.notes.categorySettings': 'Spravovať kategórie', 'collab.notes.create': 'Vytvoriť', 'collab.notes.website': 'Webová stránka', diff --git a/shared/src/i18n/sk/collection.ts b/shared/src/i18n/sk/collection.ts index 62404e8b1..3ab5fac3f 100644 --- a/shared/src/i18n/sk/collection.ts +++ b/shared/src/i18n/sk/collection.ts @@ -2,7 +2,11 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Uložiť {count} do zoznamu', + 'collections.saveNToList.one': 'Uložiť {count} do zoznamu', + 'collections.saveNToList.few': 'Uložiť {count} do zoznamu', 'collections.addedNToList': 'Uložených {count} do {name}', + 'collections.addedNToList.one': 'Uložený {count} do {name}', + 'collections.addedNToList.few': 'Uložené {count} do {name}', 'collections.noOwnLists': 'Zatiaľ nemáte žiadne zoznamy', 'collections.saveToListHint': 'Duplikáty sa automaticky preskočia', 'collections.role.label': 'Rola', @@ -16,7 +20,11 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Presunúť do zoznamu', 'collections.duplicateToList': 'Duplikovať do zoznamu', 'collections.moveToListTitle': 'Presunúť {count} do iného zoznamu', + 'collections.moveToListTitle.one': 'Presunúť {count} do iného zoznamu', + 'collections.moveToListTitle.few': 'Presunúť {count} do iného zoznamu', 'collections.duplicateToListTitle': 'Duplikovať {count} do iného zoznamu', + 'collections.duplicateToListTitle.one': 'Duplikovať {count} do iného zoznamu', + 'collections.duplicateToListTitle.few': 'Duplikovať {count} do iného zoznamu', 'collections.noOtherLists': 'Zatiaľ žiadne ďalšie zoznamy', 'collections.movedCount': 'Presunutých {count} miest', 'collections.movedCount.one': 'Presunuté {count} miesto', @@ -61,6 +69,8 @@ const collection: TranslationStrings = { 'collections.importSelectedCount.one': 'Vybrané {count} miesto', 'collections.importSelectedCount.few': 'Vybrané {count} miesta', 'collections.importAction': 'Importovať {count}', + 'collections.importAction.one': 'Importovať {count}', + 'collections.importAction.few': 'Importovať {count}', 'collections.importEmptyTrip': 'Táto cesta zatiaľ nemá žiadne miesta', 'collections.importNothingNew': 'Všetko z tejto cesty už na zozname je', 'collections.importDone': 'Pridaných {count} miest', @@ -123,6 +133,8 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Kopírovať do cesty', 'collections.copyToTripTitle': 'Kopírovať do cesty', 'collections.copyN': 'Kopírovať {count} do cesty', + 'collections.copyN.one': 'Kopírovať do cesty', + 'collections.copyN.few': 'Kopírovať {count} do cesty', 'collections.copyToTripSearch': 'Hľadať cesty', 'collections.searchLists': 'Hľadať zoznamy', 'collections.copyToTripConfirm': 'Kopírovať', @@ -161,6 +173,8 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Odobrané zo zbierky', 'collections.picker.title': 'Uložené miesta', 'collections.picker.showMore': 'Zobraziť ďalších {count}', + 'collections.picker.showMore.one': 'Zobraziť ešte {count}', + 'collections.picker.showMore.few': 'Zobraziť ďalšie {count}', 'collections.picker.search': 'Prehľadať vaše uložené miesta', 'collections.picker.empty': 'Žiadne uložené miesta na pridanie', 'collections.picker.hint': 'Vyberte miesto zo svojich zbierok', @@ -185,6 +199,8 @@ const collection: TranslationStrings = { 'collections.file.doneInto.one': '{count} miesto pridané do {name}', 'collections.file.doneInto.few': '{count} miesta pridané do {name}', 'collections.file.doneIntoDuplicates': '{count} pridaných do {name}, {duplicates} už tam bolo', + 'collections.file.doneIntoDuplicates.one': '{count} pridaný do {name}, {duplicates} už tam bolo', + 'collections.file.doneIntoDuplicates.few': '{count} pridané do {name}, {duplicates} už tam bolo', 'collections.file.doneIntoNothing': 'Všetky miesta zo súboru už v {name} sú', 'collections.file.change': 'Zmeniť', 'collections.file.labelCount': '{count} štítkov', @@ -219,6 +235,10 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Toto nie je súbor GPX.', 'collections.file.errorTooManyPlaces': 'Tento súbor má viac než {count} miest. Rozdeľte ho a importujte časti po jednej.', + 'collections.file.errorTooManyPlaces.one': + 'Tento súbor má viac než {count} miesto. Rozdeľte ho a importujte časti po jednej.', + 'collections.file.errorTooManyPlaces.few': + 'Tento súbor má viac než {count} miesta. Rozdeľte ho a importujte časti po jednej.', 'collections.share.title': 'Zdieľať zoznam', 'collections.share.titleNamed': 'Zdieľať „{name}“', diff --git a/shared/src/i18n/sk/common.ts b/shared/src/i18n/sk/common.ts index 2a0b5b284..eb3517c31 100644 --- a/shared/src/i18n/sk/common.ts +++ b/shared/src/i18n/sk/common.ts @@ -45,7 +45,11 @@ const common: TranslationStrings = { 'common.saving': 'Ukladá sa...', 'common.justNow': 'práve teraz', 'common.hoursAgo': 'pred {count} h', + 'common.hoursAgo.one': 'pred {count} h', + 'common.hoursAgo.few': 'pred {count} h', 'common.daysAgo': 'pred {count} d', + 'common.daysAgo.one': 'pred {count} d', + 'common.daysAgo.few': 'pred {count} d', 'common.saved': 'Uložené', 'common.update': 'Aktualizovať', 'common.change': 'Zmeniť', diff --git a/shared/src/i18n/sk/dashboard.ts b/shared/src/i18n/sk/dashboard.ts index 83b541215..d8909b808 100644 --- a/shared/src/i18n/sk/dashboard.ts +++ b/shared/src/i18n/sk/dashboard.ts @@ -7,8 +7,9 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips.one': '{count} cesta (archivované: {archived})', 'dashboard.subtitle.trips.few': '{count} cesty (archivované: {archived})', 'dashboard.subtitle.empty': 'Začnite svoju prvú cestu', - 'dashboard.subtitle.activeOne': '{count} aktívna cesta', - 'dashboard.subtitle.activeMany': '{count} aktívnych ciest', + 'dashboard.subtitle.active': '{count} aktívnych ciest', + 'dashboard.subtitle.active.one': '{count} aktívna cesta', + 'dashboard.subtitle.active.few': '{count} aktívne cesty', 'dashboard.subtitle.archivedSuffix': ' · {count} archivovaných', 'dashboard.subtitle.archivedSuffix.one': ' · {count} archivovaná', 'dashboard.subtitle.archivedSuffix.few': ' · {count} archivované', @@ -132,6 +133,8 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Odobrať dni?', 'dashboard.shrinkIntro': 'Uložením nových dátumov sa odoberú tieto dni:', 'dashboard.shrinkMoreDays': '+{count} ďalších', + 'dashboard.shrinkMoreDays.one': '+{count} ďalší', + 'dashboard.shrinkMoreDays.few': '+{count} ďalšie', 'dashboard.shrinkLastDays': 'Odoberú sa posledné dni, nie prvé', 'dashboard.shrinkLastDaysHint': 'Plány dní sa posúvajú s novými dátumami, takže vždy odpadnú posledné dni plánu, aj keď sa posunul začiatok.', diff --git a/shared/src/i18n/sk/dawarich.ts b/shared/src/i18n/sk/dawarich.ts index 0f274eb19..099d55e9b 100644 --- a/shared/src/i18n/sk/dawarich.ts +++ b/shared/src/i18n/sk/dawarich.ts @@ -98,6 +98,8 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Zamietnuté', 'dawarich.suggestions.restore': 'Vrátiť späť', 'dawarich.suggestions.showHandled': 'Zobraziť {count} už vybavených', + 'dawarich.suggestions.showHandled.one': 'Zobraziť {count} už vybavený', + 'dawarich.suggestions.showHandled.few': 'Zobraziť {count} už vybavené', 'dawarich.suggestions.hideHandled': 'Skryť už vybavené', 'dawarich.suggestions.matchesWish': 'Na vašom zozname prianí: {name}', 'dawarich.suggestions.acceptedAs.place': 'Pridané ako miesto', @@ -149,6 +151,8 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Vo vašich záznamoch sa neobjavilo nič z vášho zoznamu prianí.', 'dawarich.bucket.alreadyVisited': 'Už odškrtnuté', 'dawarich.bucket.confirm': 'Odškrtnúť {count}', + 'dawarich.bucket.confirm.one': 'Odškrtnúť {count}', + 'dawarich.bucket.confirm.few': 'Odškrtnúť {count}', 'dawarich.bucket.confirmed': 'Odškrtnutých {count} prianí', 'dawarich.bucket.confirmed.one': 'Odškrtnuté {count} prianie', 'dawarich.bucket.confirmed.few': 'Odškrtnuté {count} priania', diff --git a/shared/src/i18n/sk/dayplan.ts b/shared/src/i18n/sk/dayplan.ts index f1bd4ad60..1f8183c80 100644 --- a/shared/src/i18n/sk/dayplan.ts +++ b/shared/src/i18n/sk/dayplan.ts @@ -104,11 +104,19 @@ const dayplan: TranslationStrings = { 'Všetky miesta sa z tohto dňa odoberú. Miesta zostanú v ceste a deň si ponechá svoje poznámky aj rezervácie.', 'dayplan.deleteDayEmpty': 'Na tento deň nie je nič naplánované.', 'dayplan.impactPlaces': 'Naplánované miesta: {count}', + 'dayplan.impactPlaces.one': 'Naplánované miesta: {count}', + 'dayplan.impactPlaces.few': 'Naplánované miesta: {count}', 'dayplan.impactPlacesHint': 'Zostanú v zozname miest.', 'dayplan.impactNotes': 'Poznámky: {count}', + 'dayplan.impactNotes.one': 'Poznámky: {count}', + 'dayplan.impactNotes.few': 'Poznámky: {count}', 'dayplan.impactTexts': 'Názvy a popisy dňa: {count}', + 'dayplan.impactTexts.one': 'Názvy a popisy dňa: {count}', + 'dayplan.impactTexts.few': 'Názvy a popisy dňa: {count}', 'dayplan.impactDeletedHint': 'Vymažú sa tiež.', 'dayplan.impactBookings': 'Rezervácie: {count}', + 'dayplan.impactBookings.one': 'Rezervácie: {count}', + 'dayplan.impactBookings.few': 'Rezervácie: {count}', 'dayplan.impactStay': 'Pobyt v {name}', 'dayplan.deleteDayBookingsHint': 'Zostanú v Rezerváciách, bez dňa.', 'dayplan.deleteDayStayHint': 'Check-in alebo check-out pripadá na tento deň a pobyt sa zruší.', @@ -119,8 +127,12 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Check-in alebo check-out pripadá na tento deň a pobyt sa zruší spolu s rezerváciou „{booking}“ a jej výdavkom {amount}.', 'dayplan.deleteDayShift': 'Neskoršie dni: {count}', + 'dayplan.deleteDayShift.one': 'Neskoršie dni: {count}', + 'dayplan.deleteDayShift.few': 'Neskoršie dni: {count}', 'dayplan.deleteDayShiftHint': 'Každý sa posunie o jeden dátum skôr.', 'dayplan.deleteDayShiftBookingsHint': 'Každý sa posunie o jeden dátum skôr. Posúvajú sa aj rezervácie: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': 'Každý sa posunie o jeden dátum skôr. Posúvajú sa aj rezervácie: {count}', + 'dayplan.deleteDayShiftBookingsHint.few': 'Každý sa posunie o jeden dátum skôr. Posúvajú sa aj rezervácie: {count}', 'dayplan.deleteDayShrink': 'Cesta teraz končí {date}', 'dayplan.deleteDayShrinkHint': 'Nie je žiadny deň bez dátumu, ktorý by prevzal posledný dátum.', 'dayplan.impactStayShorter': 'Pobyt v {name}: o jednu noc kratší', diff --git a/shared/src/i18n/sk/docsync.ts b/shared/src/i18n/sk/docsync.ts index 84e6bebc1..0d6674580 100644 --- a/shared/src/i18n/sk/docsync.ts +++ b/shared/src/i18n/sk/docsync.ts @@ -70,6 +70,8 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Presunuté mimo priečinka', 'docsync.conflict.resolve': 'Vyriešiť {count}', + 'docsync.conflict.resolve.one': 'Vyriešiť {count}', + 'docsync.conflict.resolve.few': 'Vyriešiť {count}', 'docsync.conflict.title': 'Zmenili sa obe kópie', 'docsync.conflict.keepTrek': 'Ponechať verziu z TREKu', diff --git a/shared/src/i18n/sk/journey.ts b/shared/src/i18n/sk/journey.ts index e834745b7..09fbd8f75 100644 --- a/shared/src/i18n/sk/journey.ts +++ b/shared/src/i18n/sk/journey.ts @@ -691,6 +691,8 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Návrh zahodený', 'journey.suggestions.restore': 'Vrátiť zahodené návrhy', 'journey.suggestions.restoreCount': 'Zahodené návrhy ({count})', + 'journey.suggestions.restoreCount.one': 'Zahodené návrhy ({count})', + 'journey.suggestions.restoreCount.few': 'Zahodené návrhy ({count})', 'journey.suggestions.restored': 'Vrátilo sa {count} návrhov', 'journey.suggestions.restored.one': 'Vrátil sa {count} návrh', 'journey.suggestions.restored.few': 'Vrátili sa {count} návrhy', diff --git a/shared/src/i18n/sk/memories.ts b/shared/src/i18n/sk/memories.ts index 34ac3b9f8..d8c231260 100644 --- a/shared/src/i18n/sk/memories.ts +++ b/shared/src/i18n/sk/memories.ts @@ -64,6 +64,10 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Zdieľať s členmi cesty?', 'memories.confirmShareHint': '{count} fotiek bude viditeľných pre všetkých členov tejto cesty. Jednotlivé fotky môžete neskôr nastaviť ako súkromné.', + 'memories.confirmShareHint.one': + '{count} fotka bude viditeľná pre všetkých členov tejto cesty. Neskôr ju môžete nastaviť ako súkromnú.', + 'memories.confirmShareHint.few': + '{count} fotky budú viditeľné pre všetkých členov tejto cesty. Jednotlivé fotky môžete neskôr nastaviť ako súkromné.', 'memories.confirmShareButton': 'Zdieľať fotky', 'memories.error.loadAlbums': 'Načítanie albumov zlyhalo', 'memories.error.linkAlbum': 'Prepojenie albumu zlyhalo', diff --git a/shared/src/i18n/sk/packing.ts b/shared/src/i18n/sk/packing.ts index 74a511351..65fe574fe 100644 --- a/shared/src/i18n/sk/packing.ts +++ b/shared/src/i18n/sk/packing.ts @@ -31,14 +31,20 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Funguje aj zoznam v Markdowne: nadpis určuje kategóriu, z "- [ ]" a "- [x]" sa stanú položky a "3x" pred názvom nastaví množstvo.', 'packing.importAction': 'Importovať {count}', + 'packing.importAction.one': 'Importovať {count}', + 'packing.importAction.few': 'Importovať {count}', 'packing.importSuccess': '{count} položiek importovaných', 'packing.importSuccess.one': '{count} položka importovaná', 'packing.importSuccess.few': '{count} položky importované', 'packing.importError': 'Import zlyhal', 'packing.importEmpty': 'Žiadne položky na import', 'packing.progress': '{packed} z {total} zabalených ({percent} %)', - 'packing.clearChecked': 'Odstrániť {count} označených', + 'packing.clearChecked': 'Odstrániť {count} označených položiek', + 'packing.clearChecked.one': 'Odstrániť {count} označenú položku', + 'packing.clearChecked.few': 'Odstrániť {count} označené položky', 'packing.clearCheckedShort': 'Odstrániť {count}', + 'packing.clearCheckedShort.one': 'Odstrániť {count}', + 'packing.clearCheckedShort.few': 'Odstrániť {count}', 'packing.allPacked': 'Všetko je zabalené!', 'packing.addPlaceholder': 'Pridať novú položku...', 'packing.categoryPlaceholder': 'Zoznam...', @@ -89,7 +95,9 @@ const packing: TranslationStrings = { 'packing.tierShared': 'Zdieľať s…', 'packing.noOneToShare': 'Zatiaľ nikto ďalší na tejto ceste', 'packing.takenCareOf': 'od {name}', - 'packing.sharedWithCount': 'zdieľané s {count}', + 'packing.sharedWithCount': 'zdieľané s {count} osobami', + 'packing.sharedWithCount.one': 'zdieľané s {count} osobou', + 'packing.sharedWithCount.few': 'zdieľané s {count} osobami', 'packing.broughtBy': 'prináša {name}', 'packing.alsoBring': 'Môžem to vziať tiež', 'packing.alsoBringingStop': 'Neberiem to', diff --git a/shared/src/i18n/sk/photos.ts b/shared/src/i18n/sk/photos.ts index 099a8de70..972a260ab 100644 --- a/shared/src/i18n/sk/photos.ts +++ b/shared/src/i18n/sk/photos.ts @@ -17,6 +17,8 @@ const photos: TranslationStrings = { 'photos.linkPlace': 'Prepojiť s miestom', 'photos.noPlace': 'Žiadne miesto', 'photos.uploadN': 'Nahrať {n} fotiek', + 'photos.uploadN.one': 'Nahrať {n} fotku', + 'photos.uploadN.few': 'Nahrať {n} fotky', 'photos.linkDay': 'Prepojiť deň', 'photos.noDay': 'Žiadny deň', 'photos.dayLabel': 'Deň {number}', diff --git a/shared/src/i18n/sk/reservations.ts b/shared/src/i18n/sk/reservations.ts index 42cf14bc2..7a9e97f48 100644 --- a/shared/src/i18n/sk/reservations.ts +++ b/shared/src/i18n/sk/reservations.ts @@ -188,6 +188,8 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Ostatné lety', 'reservations.airtrail.empty': 'Vo vašom účte AirTrail sa nenašli žiadne lety.', 'reservations.airtrail.importCta': 'Importovať {count}', + 'reservations.airtrail.importCta.one': 'Importovať {count}', + 'reservations.airtrail.importCta.few': 'Importovať {count}', 'reservations.airtrail.joinConnection': 'Importovať ako jeden let s medzipristátím v {stops}', 'reservations.costsLabel': 'Náklady', 'reservations.createExpense': 'Vytvoriť výdavok', diff --git a/shared/src/i18n/sk/roadtrip.ts b/shared/src/i18n/sk/roadtrip.ts index 7ae35d6dc..1fa7daab2 100644 --- a/shared/src/i18n/sk/roadtrip.ts +++ b/shared/src/i18n/sk/roadtrip.ts @@ -201,6 +201,8 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Na trase nič nezodpovedá „{name}“.', 'roadtrip.poi.noneMatchFilters': 'Nič na trase nezodpovedá týmto filtrom.', 'roadtrip.poi.foundFiltered': '{count} z {total} na trase', + 'roadtrip.poi.foundFiltered.one': '{count} z {total} na trase', + 'roadtrip.poi.foundFiltered.few': '{count} z {total} na trase', 'roadtrip.poi.truncated': 'Na {count} úsekoch ich bolo viac, než sa zmestí do jednej odpovede. Zúžte koridor, aby ste videli zvyšok.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/sk/settings.ts b/shared/src/i18n/sk/settings.ts index 939492866..ed89ab6c2 100644 --- a/shared/src/i18n/sk/settings.ts +++ b/shared/src/i18n/sk/settings.ts @@ -587,9 +587,17 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Offline', 'settings.offline.banner.forced': 'Offline režim', 'settings.offline.banner.queued': 'Offline · {count} vo fronte', + 'settings.offline.banner.queued.one': 'Offline · {count} vo fronte', + 'settings.offline.banner.queued.few': 'Offline · {count} vo fronte', 'settings.offline.banner.syncing': 'Synchronizácia {count}…', + 'settings.offline.banner.syncing.one': 'Synchronizácia {count}…', + 'settings.offline.banner.syncing.few': 'Synchronizácia {count}…', 'settings.offline.banner.failed': 'Synchronizácia zlyhala: {count}', + 'settings.offline.banner.failed.one': 'Synchronizácia zlyhala: {count}', + 'settings.offline.banner.failed.few': 'Synchronizácia zlyhala: {count}', 'settings.offline.banner.conflicts': 'Konflikty: {count}', + 'settings.offline.banner.conflicts.one': 'Konflikty: {count}', + 'settings.offline.banner.conflicts.few': 'Konflikty: {count}', 'settings.alwaysShowRoutes': 'Vždy zobrazovať trasy rezervácií', 'settings.alwaysShowRoutesHint': 'Automaticky vykreslí na mape trasu každého letu, vlaku a inej rezervácie — netreba ju zapínať pri každej položke.', @@ -602,6 +610,8 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Všetko', 'settings.apiScopes.noneSelected': 'Vyberte aspoň jednu oblasť, inak by kľúč nemohol čítať nič.', 'settings.apiScopes.limited': '{count} z {total}', + 'settings.apiScopes.limited.one': '{count} z {total}', + 'settings.apiScopes.limited.few': '{count} z {total}', 'settings.apiScopes.trips': 'Cesty', 'settings.apiScopes.days': 'Dni', 'settings.apiScopes.places': 'Miesta', diff --git a/shared/src/i18n/sk/tours.ts b/shared/src/i18n/sk/tours.ts index b63048f4f..290eff665 100644 --- a/shared/src/i18n/sk/tours.ts +++ b/shared/src/i18n/sk/tours.ts @@ -67,6 +67,8 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Body trasy', 'tours.planner.waypointLabel': 'Bod trasy {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', + 'tours.durationMinutes.few': '{count} min', 'tours.planner.empty': 'Pridajte aspoň dva body na výpočet pešej trasy.', 'tours.planner.start': 'Začiatok', 'tours.planner.via': 'Cez', diff --git a/shared/src/i18n/sk/trip.ts b/shared/src/i18n/sk/trip.ts index 2c6e6b281..98c04c62c 100644 --- a/shared/src/i18n/sk/trip.ts +++ b/shared/src/i18n/sk/trip.ts @@ -76,6 +76,8 @@ const trip: TranslationStrings = { 'transit.transfers.one': '{count} prestup', 'transit.transfers.few': '{count} prestupy', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', + 'transit.min.few': '{count} min', 'transit.stops': '{count} zastávok', 'transit.stops.one': '{count} zastávka', 'transit.stops.few': '{count} zastávky', diff --git a/shared/src/i18n/sk/vacay.ts b/shared/src/i18n/sk/vacay.ts index d335c55aa..815c8c07e 100644 --- a/shared/src/i18n/sk/vacay.ts +++ b/shared/src/i18n/sk/vacay.ts @@ -90,6 +90,8 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Automaticky prevádzať zostávajúce dni dovolenky do ďalšieho roka', 'vacay.carriedOverPrevPeriod': 'z predchádzajúceho obdobia', 'vacay.compUsedCount': '{count} náhradné / pružné', + 'vacay.compUsedCount.one': '{count} náhradné / pružné', + 'vacay.compUsedCount.few': '{count} náhradné / pružné', 'vacay.yearType': 'Dovolenkový rok', 'vacay.yearTypeHint': 'Kedy začína váš dovolenkový rok — podľa toho sa riadi nárok, čerpanie aj prevod', 'vacay.yearTypeCalendar': 'Kalendárny', diff --git a/shared/src/i18n/sv/admin.ts b/shared/src/i18n/sv/admin.ts index 2960cae88..0b300e073 100644 --- a/shared/src/i18n/sv/admin.ts +++ b/shared/src/i18n/sv/admin.ts @@ -642,7 +642,9 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Kräver {addon}', 'admin.plugins.cap.dependsOn': 'Kräver {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Aktivera de nödvändiga tilläggen först: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Aktivera det nödvändiga tillägget först: {addons}', 'admin.plugins.dep.autoEnabled': 'Aktiverade nödvändiga plugin först: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Aktiverade nödvändigt plugin först: {plugins}', 'admin.plugins.dep.downloaded': 'Laddade ner {id}', 'admin.plugins.dep.resolveTitle': 'Saknade beroenden', 'admin.plugins.dep.resolveBody': '”{name}” behöver dessa plugin installerade innan det kan aktiveras.', @@ -771,7 +773,8 @@ const admin: TranslationStrings = { 'admin.audit.empty': 'Inga revisionsposter ännu.', 'admin.audit.refresh': 'Uppdatera', 'admin.audit.loadMore': 'Ladda fler', - 'admin.audit.showing': '{count} laddad · {total} totalt', + 'admin.audit.showing': '{count} laddade · {total} totalt', + 'admin.audit.showing.one': '{count} laddad · {total} totalt', 'admin.audit.col.time': 'Tid', 'admin.audit.col.user': 'Användare', 'admin.audit.col.action': 'Åtgärd', diff --git a/shared/src/i18n/sv/collab.ts b/shared/src/i18n/sv/collab.ts index 18d4ca555..b316ffd27 100644 --- a/shared/src/i18n/sv/collab.ts +++ b/shared/src/i18n/sv/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Ladda äldre meddelanden', 'collab.chat.justNow': 'just nu', 'collab.chat.minutesAgo': '{n}m sedan', + 'collab.chat.minutesAgo.one': '{n}m sedan', 'collab.chat.hoursAgo': '{n}h sedan', + 'collab.chat.hoursAgo.one': '{n}h sedan', 'collab.notes.title': 'Noteringar', 'collab.notes.new': 'Ny notering', 'collab.notes.empty': 'Inga anteckningar ännu', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Fäst', 'collab.notes.unpin': 'Ta bort fästningen', 'collab.notes.daysAgo': '{n}d sedan', + 'collab.notes.daysAgo.one': '{n}d sedan', 'collab.notes.categorySettings': 'Hantera kategorier', 'collab.notes.create': 'Skapa', 'collab.notes.website': 'Hemsida', diff --git a/shared/src/i18n/sv/collection.ts b/shared/src/i18n/sv/collection.ts index 8010e8ede..c06f2ace8 100644 --- a/shared/src/i18n/sv/collection.ts +++ b/shared/src/i18n/sv/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Spara {count} i en lista', + 'collections.saveNToList.one': 'Spara {count} i en lista', 'collections.addedNToList': 'Sparade {count} i {name}', + 'collections.addedNToList.one': 'Sparade {count} i {name}', 'collections.noOwnLists': 'Du har inga listor än', 'collections.saveToListHint': 'Dubbletter hoppas över automatiskt', 'collections.role.label': 'Roll', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Flytta till lista', 'collections.duplicateToList': 'Duplicera till lista', 'collections.moveToListTitle': 'Flytta {count} till annan lista', + 'collections.moveToListTitle.one': 'Flytta {count} till annan lista', 'collections.duplicateToListTitle': 'Duplicera {count} till annan lista', + 'collections.duplicateToListTitle.one': 'Duplicera {count} till annan lista', 'collections.noOtherLists': 'Inga andra listor än', 'collections.movedCount': 'Flyttade {count} platser', 'collections.movedCount.one': 'Flyttade {count} plats', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} markerade', 'collections.importSelectedCount.one': '{count} markerad', 'collections.importAction': 'Importera {count}', + 'collections.importAction.one': 'Importera {count}', 'collections.importEmptyTrip': 'Den här resan har inga platser än', 'collections.importNothingNew': 'Allt från den här resan finns redan i listan', 'collections.importDone': '{count} platser tillagda', @@ -114,6 +119,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Kopiera till resa', 'collections.copyToTripTitle': 'Kopiera till resa', 'collections.copyN': 'Kopiera {count} till resa', + 'collections.copyN.one': 'Kopiera till resa', 'collections.copyToTripSearch': 'Sök resor', 'collections.searchLists': 'Sök listor', 'collections.copyToTripConfirm': 'Kopiera', @@ -149,6 +155,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Borttagen från samlingen', 'collections.picker.title': 'Sparade platser', 'collections.picker.showMore': 'Visa {count} till', + 'collections.picker.showMore.one': 'Visa {count} till', 'collections.picker.search': 'Sök bland dina sparade platser', 'collections.picker.empty': 'Inga sparade platser att lägga till', 'collections.picker.hint': 'Välj en plats från dina samlingar', @@ -171,6 +178,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{count} platser tillagda i {name}', 'collections.file.doneInto.one': '{count} plats tillagd i {name}', 'collections.file.doneIntoDuplicates': '{count} tillagda i {name}, {duplicates} fanns redan', + 'collections.file.doneIntoDuplicates.one': '{count} tillagd i {name}, {duplicates} fanns redan', 'collections.file.doneIntoNothing': 'Alla platser i filen finns redan i {name}', 'collections.file.change': 'Byt', 'collections.file.labelCount': '{count} etiketter', @@ -200,6 +208,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Det här är ingen GPX-fil.', 'collections.file.errorTooManyPlaces': 'Filen har fler än {count} platser. Dela upp den och importera delarna en i taget.', + 'collections.file.errorTooManyPlaces.one': + 'Filen har fler än {count} plats. Dela upp den och importera delarna en i taget.', 'collections.share.title': 'Dela lista', 'collections.share.titleNamed': 'Dela ”{name}”', diff --git a/shared/src/i18n/sv/common.ts b/shared/src/i18n/sv/common.ts index 987645a2c..adc3a2dfe 100644 --- a/shared/src/i18n/sv/common.ts +++ b/shared/src/i18n/sv/common.ts @@ -57,7 +57,9 @@ const common: TranslationStrings = { 'common.saving': 'Sparar...', 'common.justNow': 'just nu', 'common.hoursAgo': '{count}h sedan', + 'common.hoursAgo.one': '{count}h sedan', 'common.daysAgo': '{count}d sedan', + 'common.daysAgo.one': '{count}d sedan', 'common.saved': 'Sparad', 'common.update': 'Uppdatera', 'common.change': 'Ändra', diff --git a/shared/src/i18n/sv/dashboard.ts b/shared/src/i18n/sv/dashboard.ts index d4c66dc6d..ae5232fb0 100644 --- a/shared/src/i18n/sv/dashboard.ts +++ b/shared/src/i18n/sv/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} resor ({archived} i arkivet)', 'dashboard.subtitle.trips.one': '{count} resa ({archived} i arkivet)', 'dashboard.subtitle.empty': 'Påbörja din första resa', - 'dashboard.subtitle.activeOne': '{count} aktiv resa', - 'dashboard.subtitle.activeMany': '{count} aktiva resor', + 'dashboard.subtitle.active': '{count} aktiva resor', + 'dashboard.subtitle.active.one': '{count} aktiv resa', 'dashboard.subtitle.archivedSuffix': ' · {count} arkiverade', 'dashboard.subtitle.archivedSuffix.one': ' · {count} arkiverad', 'dashboard.newTrip': 'Ny resa', @@ -126,6 +126,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Ta bort dagar?', 'dashboard.shrinkIntro': 'När de nya datumen sparas tas de här dagarna bort:', 'dashboard.shrinkMoreDays': '+{count} till', + 'dashboard.shrinkMoreDays.one': '+{count} till', 'dashboard.shrinkLastDays': 'Det är de sista dagarna som försvinner, inte de första', 'dashboard.shrinkLastDaysHint': 'Dagsplanerna följer med de nya datumen, så det är alltid de sista dagarna i planen som tas bort, även när starten har flyttats.', diff --git a/shared/src/i18n/sv/dawarich.ts b/shared/src/i18n/sv/dawarich.ts index 356edb9e2..72afa2b26 100644 --- a/shared/src/i18n/sv/dawarich.ts +++ b/shared/src/i18n/sv/dawarich.ts @@ -93,6 +93,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Avfärdad', 'dawarich.suggestions.restore': 'Lägg tillbaka', 'dawarich.suggestions.showHandled': 'Visa {count} redan hanterade', + 'dawarich.suggestions.showHandled.one': 'Visa {count} redan hanterad', 'dawarich.suggestions.hideHandled': 'Dölj de som redan är hanterade', 'dawarich.suggestions.matchesWish': 'På din önskelista: {name}', 'dawarich.suggestions.acceptedAs.place': 'Tillagd som plats', @@ -144,6 +145,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Inget på din önskelista dök upp i dina inspelningar.', 'dawarich.bucket.alreadyVisited': 'Redan avbockad', 'dawarich.bucket.confirm': 'Bocka av {count}', + 'dawarich.bucket.confirm.one': 'Bocka av {count}', 'dawarich.bucket.confirmed': '{count} önskningar avbockade', 'dawarich.bucket.confirmed.one': '{count} önskning avbockad', 'dawarich.bucket.skipped': '{count} poster saknar koordinater och kunde inte kontrolleras.', diff --git a/shared/src/i18n/sv/dayplan.ts b/shared/src/i18n/sv/dayplan.ts index 140f5eabd..9fb82fd18 100644 --- a/shared/src/i18n/sv/dayplan.ts +++ b/shared/src/i18n/sv/dayplan.ts @@ -105,11 +105,15 @@ const dayplan: TranslationStrings = { 'Alla platser tas bort från den här dagen. Platserna finns kvar i resan och dagen behåller sina noteringar och bokningar.', 'dayplan.deleteDayEmpty': 'Inget är planerat den här dagen.', 'dayplan.impactPlaces': 'Planerade platser: {count}', + 'dayplan.impactPlaces.one': 'Planerade platser: {count}', 'dayplan.impactPlacesHint': 'De ligger kvar i platslistan.', 'dayplan.impactNotes': 'Anteckningar: {count}', + 'dayplan.impactNotes.one': 'Anteckningar: {count}', 'dayplan.impactTexts': 'Dagtitlar och beskrivningar: {count}', + 'dayplan.impactTexts.one': 'Dagtitlar och beskrivningar: {count}', 'dayplan.impactDeletedHint': 'Tas också bort.', 'dayplan.impactBookings': 'Bokningar: {count}', + 'dayplan.impactBookings.one': 'Bokningar: {count}', 'dayplan.impactStay': 'Boende på {name}', 'dayplan.deleteDayBookingsHint': 'De ligger kvar under Bokningar, utan dag.', 'dayplan.deleteDayStayHint': 'Incheckning eller utcheckning sker den här dagen, så boendet avbokas.', @@ -120,8 +124,10 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Incheckning eller utcheckning sker den här dagen, så boendet avbokas tillsammans med bokningen ”{booking}” och dess utgift på {amount}.', 'dayplan.deleteDayShift': 'Senare dagar: {count}', + 'dayplan.deleteDayShift.one': 'Senare dagar: {count}', 'dayplan.deleteDayShiftHint': 'Var och en flyttas ett datum tidigare.', 'dayplan.deleteDayShiftBookingsHint': 'Var och en flyttas ett datum tidigare. Bokningar som följer med: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': 'Var och en flyttas ett datum tidigare. Bokningar som följer med: {count}', 'dayplan.deleteDayShrink': 'Resan slutar nu {date}', 'dayplan.deleteDayShrinkHint': 'Det finns ingen dag utan datum som kan ta över det sista datumet.', 'dayplan.impactStayShorter': 'Boende på {name}: en natt kortare', diff --git a/shared/src/i18n/sv/docsync.ts b/shared/src/i18n/sv/docsync.ts index a1e09165e..6c342b964 100644 --- a/shared/src/i18n/sv/docsync.ts +++ b/shared/src/i18n/sv/docsync.ts @@ -69,6 +69,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Flyttad ut ur mappen', 'docsync.conflict.resolve': 'Lös {count}', + 'docsync.conflict.resolve.one': 'Lös {count}', 'docsync.conflict.title': 'Båda kopiorna har ändrats', 'docsync.conflict.keepTrek': 'Behåll TREK-versionen', diff --git a/shared/src/i18n/sv/journey.ts b/shared/src/i18n/sv/journey.ts index 2b6bd7639..26692857e 100644 --- a/shared/src/i18n/sv/journey.ts +++ b/shared/src/i18n/sv/journey.ts @@ -669,6 +669,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Förslaget avfärdat', 'journey.suggestions.restore': 'Hämta tillbaka avfärdade förslag', 'journey.suggestions.restoreCount': 'Avfärdade förslag ({count})', + 'journey.suggestions.restoreCount.one': 'Avfärdade förslag ({count})', 'journey.suggestions.restored': '{count} förslag är tillbaka', 'journey.suggestions.restored.one': '{count} förslag är tillbaka', 'journey.detail.addOnThisDay': 'Lägg till ett inlägg den här dagen', diff --git a/shared/src/i18n/sv/memories.ts b/shared/src/i18n/sv/memories.ts index 8497efe41..c2363b488 100644 --- a/shared/src/i18n/sv/memories.ts +++ b/shared/src/i18n/sv/memories.ts @@ -62,6 +62,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Dela med resedeltagarna?', 'memories.confirmShareHint': '{count} foton kommer att vara synliga för alla deltagare i resan. Du kan senare göra enskilda foton privata.', + 'memories.confirmShareHint.one': + '{count} foto kommer att vara synligt för alla deltagare i resan. Du kan göra det privat senare.', 'memories.confirmShareButton': 'Dela foton', 'memories.error.loadAlbums': 'Det gick inte att ladda albumen', 'memories.error.linkAlbum': 'Det gick inte att länka albumet', diff --git a/shared/src/i18n/sv/packing.ts b/shared/src/i18n/sv/packing.ts index 5171e9e46..08f3402a6 100644 --- a/shared/src/i18n/sv/packing.ts +++ b/shared/src/i18n/sv/packing.ts @@ -31,13 +31,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'En Markdown-lista fungerar också: en rubrik anger kategorin, "- [ ]" och "- [x]" blir objekt och "3x" före ett namn anger antalet.', 'packing.importAction': 'Importera {count}', + 'packing.importAction.one': 'Importera {count}', 'packing.importSuccess': '{count} föremål importerade', 'packing.importSuccess.one': '{count} föremål importerat', 'packing.importError': 'Importen misslyckades', 'packing.importEmpty': 'Inga föremål att importera', 'packing.progress': '{packed} av {total} packade ({percent}%)', 'packing.clearChecked': 'Ta bort {count} markerade', + 'packing.clearChecked.one': 'Ta bort {count} markerad', 'packing.clearCheckedShort': 'Ta bort {count}', + 'packing.clearCheckedShort.one': 'Ta bort {count}', 'packing.allPacked': 'Allt packat!', 'packing.addPlaceholder': 'Lägg till nytt föremål', 'packing.categoryPlaceholder': 'Lista...', @@ -97,6 +100,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'Ingen annan på den här resan ännu', 'packing.takenCareOf': 'av {name}', 'packing.sharedWithCount': 'delat med {count}', + 'packing.sharedWithCount.one': 'delat med {count}', 'packing.broughtBy': 'tas med av {name}', 'packing.alsoBring': 'Jag kan ta med det också', 'packing.alsoBringingStop': 'Jag tar inte med det', diff --git a/shared/src/i18n/sv/photos.ts b/shared/src/i18n/sv/photos.ts index fdcc06ab3..cada2eac7 100644 --- a/shared/src/i18n/sv/photos.ts +++ b/shared/src/i18n/sv/photos.ts @@ -15,7 +15,8 @@ const photos: TranslationStrings = { 'photos.clickToSelect': 'eller klicka för att välja', 'photos.linkPlace': 'Länkplats', 'photos.noPlace': 'Ingen plats', - 'photos.uploadN': '{n} foto(n) uppladdad', + 'photos.uploadN': '{n} foton uppladdade', + 'photos.uploadN.one': '{n} foto uppladdat', 'photos.linkDay': 'Länka dag', 'photos.noDay': 'Ingen dag', 'photos.dayLabel': 'Dag {number}', diff --git a/shared/src/i18n/sv/reservations.ts b/shared/src/i18n/sv/reservations.ts index c9394a606..e346509c9 100644 --- a/shared/src/i18n/sv/reservations.ts +++ b/shared/src/i18n/sv/reservations.ts @@ -179,6 +179,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Övriga flygningar', 'reservations.airtrail.empty': 'Inga flygningar hittades i ditt AirTrail-konto.', 'reservations.airtrail.importCta': 'Importera {count}', + 'reservations.airtrail.importCta.one': 'Importera {count}', 'reservations.airtrail.joinConnection': 'Importera som en flygning med mellanlandning i {stops}', 'reservations.costsLabel': 'Kostnader', 'reservations.createExpense': 'Skapa utgift', diff --git a/shared/src/i18n/sv/roadtrip.ts b/shared/src/i18n/sv/roadtrip.ts index bb3159f37..71ac10e99 100644 --- a/shared/src/i18n/sv/roadtrip.ts +++ b/shared/src/i18n/sv/roadtrip.ts @@ -194,6 +194,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Inget längs vägen matchar ”{name}”.', 'roadtrip.poi.noneMatchFilters': 'Inget längs vägen matchar de här filtren.', 'roadtrip.poi.foundFiltered': '{count} av {total} längs vägen', + 'roadtrip.poi.foundFiltered.one': '{count} av {total} längs vägen', 'roadtrip.poi.truncated': 'På {count} sträckor fanns fler än vad som får plats i ett svar. Gör korridoren smalare för att se resten.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/sv/settings.ts b/shared/src/i18n/sv/settings.ts index 7c361636c..facd91def 100644 --- a/shared/src/i18n/sv/settings.ts +++ b/shared/src/i18n/sv/settings.ts @@ -572,9 +572,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Offline', 'settings.offline.banner.forced': 'Offlineläge', 'settings.offline.banner.queued': 'Offline · {count} i kö', + 'settings.offline.banner.queued.one': 'Offline · {count} i kö', 'settings.offline.banner.syncing': 'Synkroniserar {count}…', + 'settings.offline.banner.syncing.one': 'Synkroniserar {count}…', 'settings.offline.banner.failed': 'Kunde inte synkronisera: {count}', + 'settings.offline.banner.failed.one': 'Kunde inte synkronisera: {count}', 'settings.offline.banner.conflicts': 'Konflikter: {count}', + 'settings.offline.banner.conflicts.one': 'Konflikter: {count}', 'settings.pluginActivity.title': 'Plugin-aktivitet', 'settings.pluginActivity.description': 'Varje åtgärd som ett plugin utfört å dina vägnar, senaste först.', 'settings.pluginActivity.empty': 'Ingen plugin-aktivitet ännu.', @@ -596,6 +600,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Allt', 'settings.apiScopes.noneSelected': 'Välj minst ett område, annars kan nyckeln inte läsa någonting.', 'settings.apiScopes.limited': '{count} av {total}', + 'settings.apiScopes.limited.one': '{count} av {total}', 'settings.apiScopes.trips': 'Resor', 'settings.apiScopes.days': 'Dagar', 'settings.apiScopes.places': 'Platser', diff --git a/shared/src/i18n/sv/tours.ts b/shared/src/i18n/sv/tours.ts index d8ab6fc84..7174e6180 100644 --- a/shared/src/i18n/sv/tours.ts +++ b/shared/src/i18n/sv/tours.ts @@ -67,6 +67,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Ruttpunkter', 'tours.planner.waypointLabel': 'Ruttpunkt {n}', 'tours.durationMinutes': '{count} min', + 'tours.durationMinutes.one': '{count} min', 'tours.planner.empty': 'Lägg till minst två punkter för att beräkna en vandringsrutt.', 'tours.planner.start': 'Startpunkt', 'tours.planner.via': 'Via', diff --git a/shared/src/i18n/sv/trip.ts b/shared/src/i18n/sv/trip.ts index 95ba98dd3..1b62b8590 100644 --- a/shared/src/i18n/sv/trip.ts +++ b/shared/src/i18n/sv/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} byten', 'transit.transfers.one': '{count} byte', 'transit.min': '{count} min', + 'transit.min.one': '{count} min', 'transit.stops': '{count} hållplatser', 'transit.stops.one': '{count} hållplats', 'transit.walkTo': 'Gå till {name}', diff --git a/shared/src/i18n/sv/vacay.ts b/shared/src/i18n/sv/vacay.ts index b22693c6a..f0b8cfab3 100644 --- a/shared/src/i18n/sv/vacay.ts +++ b/shared/src/i18n/sv/vacay.ts @@ -87,6 +87,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Överför automatiskt återstående semesterdagar till nästa år', 'vacay.carriedOverPrevPeriod': 'från föregående period', 'vacay.compUsedCount': '{count} komp', + 'vacay.compUsedCount.one': '{count} komp', 'vacay.yearType': 'Semesterår', 'vacay.yearTypeHint': 'När ditt semesterår börjar — rättighet, användning och överföring följer det', 'vacay.yearTypeCalendar': 'Kalenderår', diff --git a/shared/src/i18n/th/dashboard.ts b/shared/src/i18n/th/dashboard.ts index 043e8f2fb..f2d6db7e4 100644 --- a/shared/src/i18n/th/dashboard.ts +++ b/shared/src/i18n/th/dashboard.ts @@ -5,8 +5,7 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.loading': 'กำลังโหลดการเดินทาง...', 'dashboard.subtitle.trips': '{count} ทริป (เก็บถาวรแล้ว {archived} ทริป)', 'dashboard.subtitle.empty': 'เริ่มต้นการเดินทางครั้งแรกของคุณ', - 'dashboard.subtitle.activeOne': '{count} ทริปที่กำลังดำเนินอยู่', - 'dashboard.subtitle.activeMany': '{count} ทริปที่กำลังดำเนินอยู่', + 'dashboard.subtitle.active': '{count} ทริปที่กำลังดำเนินอยู่', 'dashboard.subtitle.archivedSuffix': ' · เก็บถาวรแล้ว {count} ทริป', 'dashboard.newTrip': 'ทริปใหม่', 'dashboard.newTripSub': 'วางแผนการเดินทางใหม่ตั้งแต่ต้น', diff --git a/shared/src/i18n/tr/admin.ts b/shared/src/i18n/tr/admin.ts index 8ace7b550..e5a019552 100644 --- a/shared/src/i18n/tr/admin.ts +++ b/shared/src/i18n/tr/admin.ts @@ -631,7 +631,9 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': '{addon} gerekir', 'admin.plugins.cap.dependsOn': '{id} {version} gerekir', 'admin.plugins.dep.addonDisabledToast': 'Önce gerekli eklentileri etkinleştirin: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Önce gerekli eklentiyi etkinleştirin: {addons}', 'admin.plugins.dep.autoEnabled': 'Önce gerekli eklentiler etkinleştirildi: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Önce gerekli eklenti etkinleştirildi: {plugins}', 'admin.plugins.dep.downloaded': '{id} indirildi', 'admin.plugins.dep.resolveTitle': 'Eksik bağımlılıklar', 'admin.plugins.dep.resolveBody': '“{name}” etkinleştirilebilmesi için bu eklentilerin kurulu olması gerekir.', @@ -760,6 +762,7 @@ const admin: TranslationStrings = { 'admin.audit.refresh': 'Yenile', 'admin.audit.loadMore': 'Daha fazlasını yükle', 'admin.audit.showing': '{count} yüklendi · {total} toplam', + 'admin.audit.showing.one': '{count} yüklendi · {total} toplam', 'admin.audit.col.time': 'Zaman', 'admin.audit.col.user': 'Kullanıcı', 'admin.audit.col.action': 'Aksiyon', diff --git a/shared/src/i18n/tr/collab.ts b/shared/src/i18n/tr/collab.ts index d1c238104..a88004db9 100644 --- a/shared/src/i18n/tr/collab.ts +++ b/shared/src/i18n/tr/collab.ts @@ -45,7 +45,9 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Eski mesajları yükle', 'collab.chat.justNow': 'az önce', 'collab.chat.minutesAgo': '{n} dk önce', + 'collab.chat.minutesAgo.one': '{n} dk önce', 'collab.chat.hoursAgo': '{n} sa önce', + 'collab.chat.hoursAgo.one': '{n} sa önce', 'collab.notes.title': 'Notlar', 'collab.notes.new': 'Yeni Not', 'collab.notes.empty': 'Henüz not yok', @@ -69,6 +71,7 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Sabitle', 'collab.notes.unpin': 'Sabitlemeyi kaldır', 'collab.notes.daysAgo': '{n} gün önce', + 'collab.notes.daysAgo.one': '{n} gün önce', 'collab.notes.categorySettings': 'Kategorileri Yönet', 'collab.notes.create': 'Oluştur', 'collab.notes.website': 'Web sitesi', diff --git a/shared/src/i18n/tr/collection.ts b/shared/src/i18n/tr/collection.ts index e6a9187a1..76ff014ce 100644 --- a/shared/src/i18n/tr/collection.ts +++ b/shared/src/i18n/tr/collection.ts @@ -2,7 +2,9 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': '{count} öğeyi bir listeye kaydet', + 'collections.saveNToList.one': '{count} öğeyi bir listeye kaydet', 'collections.addedNToList': '{count} öğe {name} listesine kaydedildi', + 'collections.addedNToList.one': '{count} öğe {name} listesine kaydedildi', 'collections.noOwnLists': 'Henüz listeniz yok', 'collections.saveToListHint': 'Yinelenenler otomatik olarak atlanır', 'collections.role.label': 'Rol', @@ -16,7 +18,9 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Listeye taşı', 'collections.duplicateToList': 'Listeye çoğalt', 'collections.moveToListTitle': '{count} öğeyi başka listeye taşı', + 'collections.moveToListTitle.one': '{count} öğeyi başka listeye taşı', 'collections.duplicateToListTitle': '{count} öğeyi başka listeye çoğalt', + 'collections.duplicateToListTitle.one': '{count} öğeyi başka listeye çoğalt', 'collections.noOtherLists': 'Henüz başka liste yok', 'collections.movedCount': '{count} yer taşındı', 'collections.movedCount.one': '{count} yer taşındı', @@ -56,6 +60,7 @@ const collection: TranslationStrings = { 'collections.importSelectedCount': '{count} seçildi', 'collections.importSelectedCount.one': '{count} seçildi', 'collections.importAction': '{count} yeri aktar', + 'collections.importAction.one': '{count} yeri aktar', 'collections.importEmptyTrip': 'Bu gezide henüz yer yok', 'collections.importNothingNew': 'Bu gezideki her şey zaten bu listede', 'collections.importDone': '{count} yer eklendi', @@ -115,6 +120,7 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Geziye kopyala', 'collections.copyToTripTitle': 'Geziye kopyala', 'collections.copyN': '{count} öğeyi geziye kopyala', + 'collections.copyN.one': 'Geziye kopyala', 'collections.copyToTripSearch': 'Gezi ara', 'collections.searchLists': 'Listelerde ara', 'collections.copyToTripConfirm': 'Kopyala', @@ -150,6 +156,7 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Koleksiyondan kaldırıldı', 'collections.picker.title': 'Kaydedilen yerler', 'collections.picker.showMore': '{count} tane daha göster', + 'collections.picker.showMore.one': '{count} tane daha göster', 'collections.picker.search': 'Kaydedilen yerlerinde ara', 'collections.picker.empty': 'Eklenecek kayıtlı yer yok', 'collections.picker.hint': 'Koleksiyonlarından bir yer seç', @@ -172,6 +179,7 @@ const collection: TranslationStrings = { 'collections.file.doneInto': '{name} listesine {count} yer eklendi', 'collections.file.doneInto.one': '{name} listesine {count} yer eklendi', 'collections.file.doneIntoDuplicates': '{name} listesine {count} eklendi, {duplicates} tanesi zaten vardı', + 'collections.file.doneIntoDuplicates.one': '{name} listesine {count} eklendi, {duplicates} tanesi zaten vardı', 'collections.file.doneIntoNothing': 'Dosyadaki tüm yerler zaten {name} listesinde', 'collections.file.change': 'Değiştir', 'collections.file.labelCount': '{count} etiket', @@ -202,6 +210,8 @@ const collection: TranslationStrings = { 'collections.file.errorNotGpx': 'Bu bir GPX dosyası değil.', 'collections.file.errorTooManyPlaces': 'Bu dosyada {count} yerden fazlası var. Dosyayı bölüp parçaları tek tek içe aktar.', + 'collections.file.errorTooManyPlaces.one': + 'Bu dosyada {count} yerden fazlası var. Dosyayı bölüp parçaları tek tek içe aktar.', 'collections.share.title': 'Listeyi paylaş', 'collections.share.titleNamed': '“{name}” listesini paylaş', diff --git a/shared/src/i18n/tr/common.ts b/shared/src/i18n/tr/common.ts index 8b527d6bb..b08808739 100644 --- a/shared/src/i18n/tr/common.ts +++ b/shared/src/i18n/tr/common.ts @@ -45,7 +45,9 @@ const common: TranslationStrings = { 'common.saving': 'Kaydediliyor...', 'common.justNow': 'az önce', 'common.hoursAgo': '{count} sa. önce', + 'common.hoursAgo.one': '{count} sa. önce', 'common.daysAgo': '{count} gün önce', + 'common.daysAgo.one': '{count} gün önce', 'common.saved': 'Kaydedildi', 'common.update': 'Güncelle', 'common.change': 'Değiştir', diff --git a/shared/src/i18n/tr/dashboard.ts b/shared/src/i18n/tr/dashboard.ts index bceef35f0..f783aabe7 100644 --- a/shared/src/i18n/tr/dashboard.ts +++ b/shared/src/i18n/tr/dashboard.ts @@ -6,8 +6,8 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips': '{count} seyahat ({archived} arşivde)', 'dashboard.subtitle.trips.one': '{count} seyahat ({archived} arşivde)', 'dashboard.subtitle.empty': 'İlk seyahatinizi başlatın', - 'dashboard.subtitle.activeOne': '{count} etkin seyahat', - 'dashboard.subtitle.activeMany': '{count} etkin seyahat', + 'dashboard.subtitle.active': '{count} etkin seyahat', + 'dashboard.subtitle.active.one': '{count} etkin seyahat', 'dashboard.subtitle.archivedSuffix': ' · {count} arşivde', 'dashboard.subtitle.archivedSuffix.one': ' · {count} arşivde', 'dashboard.newTrip': 'Yeni Seyahat', @@ -127,6 +127,7 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Günler kaldırılsın mı?', 'dashboard.shrinkIntro': 'Yeni tarihler kaydedilince bu günler kaldırılır:', 'dashboard.shrinkMoreDays': '+{count} daha', + 'dashboard.shrinkMoreDays.one': '+{count} daha', 'dashboard.shrinkLastDays': 'İlk günler değil, son günler kaldırılır', 'dashboard.shrinkLastDaysHint': 'Gün planları yeni tarihlerle birlikte kayar, bu yüzden başlangıç değişse bile her zaman planın son günleri kaldırılır.', diff --git a/shared/src/i18n/tr/dawarich.ts b/shared/src/i18n/tr/dawarich.ts index 969045e3c..6d8303622 100644 --- a/shared/src/i18n/tr/dawarich.ts +++ b/shared/src/i18n/tr/dawarich.ts @@ -96,6 +96,7 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Yok sayıldı', 'dawarich.suggestions.restore': 'Geri koy', 'dawarich.suggestions.showHandled': 'Ele alınmış {count} tanesini göster', + 'dawarich.suggestions.showHandled.one': 'Ele alınmış {count} tanesini göster', 'dawarich.suggestions.hideHandled': 'Ele alınmış olanları gizle', 'dawarich.suggestions.matchesWish': 'Dilek listenizde: {name}', 'dawarich.suggestions.acceptedAs.place': 'Yer olarak eklendi', @@ -147,6 +148,7 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'Dilek listenizden hiçbir şey kayıtlarınızda çıkmadı.', 'dawarich.bucket.alreadyVisited': 'Zaten işaretlenmiş', 'dawarich.bucket.confirm': '{count} tanesini işaretle', + 'dawarich.bucket.confirm.one': '{count} tanesini işaretle', 'dawarich.bucket.confirmed': '{count} dilek işaretlendi', 'dawarich.bucket.confirmed.one': '{count} dilek işaretlendi', 'dawarich.bucket.skipped': '{count} kaydın koordinatı yok, denetlenemedi.', diff --git a/shared/src/i18n/tr/dayplan.ts b/shared/src/i18n/tr/dayplan.ts index 15d76d99d..17420c69a 100644 --- a/shared/src/i18n/tr/dayplan.ts +++ b/shared/src/i18n/tr/dayplan.ts @@ -104,11 +104,15 @@ const dayplan: TranslationStrings = { 'Tüm yerler bu günden kaldırılır. Yerler gezide kalır, gün de notlarını ve rezervasyonlarını korur.', 'dayplan.deleteDayEmpty': 'Bu gün için planlanmış bir şey yok.', 'dayplan.impactPlaces': 'Planlanan yerler: {count}', + 'dayplan.impactPlaces.one': 'Planlanan yerler: {count}', 'dayplan.impactPlacesHint': 'Yer listesinde kalırlar.', 'dayplan.impactNotes': 'Notlar: {count}', + 'dayplan.impactNotes.one': 'Notlar: {count}', 'dayplan.impactTexts': 'Gün başlıkları ve açıklamaları: {count}', + 'dayplan.impactTexts.one': 'Gün başlıkları ve açıklamaları: {count}', 'dayplan.impactDeletedHint': 'Bunlar da silinir.', 'dayplan.impactBookings': 'Rezervasyonlar: {count}', + 'dayplan.impactBookings.one': 'Rezervasyonlar: {count}', 'dayplan.impactStay': '{name} konaklaması', 'dayplan.deleteDayBookingsHint': 'Rezervasyonlar altında, bir güne bağlı olmadan kalırlar.', 'dayplan.deleteDayStayHint': 'Giriş veya çıkış bu güne denk geldiği için konaklama iptal edilir.', @@ -119,8 +123,11 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Giriş veya çıkış bu güne denk geldiği için konaklama, “{booking}” rezervasyonu ve {amount} tutarındaki harcamasıyla birlikte iptal edilir.', 'dayplan.deleteDayShift': 'Sonraki günler: {count}', + 'dayplan.deleteDayShift.one': 'Sonraki günler: {count}', 'dayplan.deleteDayShiftHint': 'Her biri bir tarih öne kayar.', 'dayplan.deleteDayShiftBookingsHint': 'Her biri bir tarih öne kayar. Onlarla birlikte kayan rezervasyonlar: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Her biri bir tarih öne kayar. Onlarla birlikte kayan rezervasyonlar: {count}', 'dayplan.deleteDayShrink': 'Seyahat artık {date} tarihinde bitiyor', 'dayplan.deleteDayShrinkHint': 'Son tarihi devralacak tarihsiz bir gün yok.', 'dayplan.impactStayShorter': '{name} konaklaması: bir gece daha kısa', diff --git a/shared/src/i18n/tr/docsync.ts b/shared/src/i18n/tr/docsync.ts index a639b734a..f1620c0a6 100644 --- a/shared/src/i18n/tr/docsync.ts +++ b/shared/src/i18n/tr/docsync.ts @@ -70,6 +70,7 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Klasörün dışına taşındı', 'docsync.conflict.resolve': '{count} tanesini çöz', + 'docsync.conflict.resolve.one': '{count} tanesini çöz', 'docsync.conflict.title': 'İki kopya da değişti', 'docsync.conflict.keepTrek': 'TREK sürümünü tut', diff --git a/shared/src/i18n/tr/journey.ts b/shared/src/i18n/tr/journey.ts index 41bf3976c..4da61c26c 100644 --- a/shared/src/i18n/tr/journey.ts +++ b/shared/src/i18n/tr/journey.ts @@ -673,6 +673,7 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Öneri yok sayıldı', 'journey.suggestions.restore': 'Yok sayılan önerileri geri getir', 'journey.suggestions.restoreCount': 'Yok sayılan öneriler ({count})', + 'journey.suggestions.restoreCount.one': 'Yok sayılan öneriler ({count})', 'journey.suggestions.restored': '{count} öneri geri geldi', 'journey.suggestions.restored.one': '{count} öneri geri geldi', 'journey.detail.addOnThisDay': 'Bu güne bir kayıt ekle', diff --git a/shared/src/i18n/tr/memories.ts b/shared/src/i18n/tr/memories.ts index 39f0ae249..eedf733d8 100644 --- a/shared/src/i18n/tr/memories.ts +++ b/shared/src/i18n/tr/memories.ts @@ -61,6 +61,8 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Seyahat üyeleriyle paylaşılsın mı?', 'memories.confirmShareHint': '{count} fotoğraf bu seyahatin tüm üyelerine görünür olacak. Daha sonra tek tek gizli yapabilirsiniz.', + 'memories.confirmShareHint.one': + '{count} fotoğraf bu seyahatin tüm üyelerine görünür olacak. Daha sonra gizli yapabilirsiniz.', 'memories.confirmShareButton': 'Fotoğrafları paylaş', 'memories.error.loadAlbums': 'Albümler yüklenemedi', 'memories.error.linkAlbum': 'Albüm bağlanamadı', diff --git a/shared/src/i18n/tr/packing.ts b/shared/src/i18n/tr/packing.ts index 88afce2de..d0266cb68 100644 --- a/shared/src/i18n/tr/packing.ts +++ b/shared/src/i18n/tr/packing.ts @@ -31,13 +31,16 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Markdown listesi de olur: başlık kategoriyi belirler, "- [ ]" ve "- [x]" öğeye dönüşür, bir adın önündeki "3x" ise miktarı belirler.', 'packing.importAction': '{count} Öğeyi içe aktar', + 'packing.importAction.one': '{count} Öğeyi içe aktar', 'packing.importSuccess': '{count} öğe içe aktarıldı', 'packing.importSuccess.one': '{count} öğe içe aktarıldı', 'packing.importError': 'İçe aktarma başarısız oldu', 'packing.importEmpty': 'İçe aktarılacak öğe yok', 'packing.progress': '{total} öğeden {packed} paketlendi (%{percent})', 'packing.clearChecked': '{count} İşaretli öğeyi kaldır', + 'packing.clearChecked.one': '{count} İşaretli öğeyi kaldır', 'packing.clearCheckedShort': '{count} Kaldır', + 'packing.clearCheckedShort.one': '{count} Kaldır', 'packing.allPacked': 'Hepsi paketlendi!', 'packing.addPlaceholder': 'Yeni öğe ekle...', 'packing.categoryPlaceholder': 'Liste...', @@ -97,6 +100,7 @@ const packing: TranslationStrings = { 'packing.noOneToShare': 'Bu seyahatte henüz başka kimse yok', 'packing.takenCareOf': '{name} getiriyor', 'packing.sharedWithCount': '{count} kişiyle paylaşıldı', + 'packing.sharedWithCount.one': '{count} kişiyle paylaşıldı', 'packing.broughtBy': '{name} getiriyor', 'packing.alsoBring': 'Ben de getirebilirim', 'packing.alsoBringingStop': 'Getirmiyorum', diff --git a/shared/src/i18n/tr/photos.ts b/shared/src/i18n/tr/photos.ts index 52c5f66bf..ed240a6c2 100644 --- a/shared/src/i18n/tr/photos.ts +++ b/shared/src/i18n/tr/photos.ts @@ -16,6 +16,7 @@ const photos: TranslationStrings = { 'photos.linkPlace': 'Yere Bağla', 'photos.noPlace': 'Yer Yok', 'photos.uploadN': '{n} fotoğraf yükle', + 'photos.uploadN.one': '{n} fotoğraf yükle', 'photos.linkDay': 'Güne Bağla', 'photos.noDay': 'Gün Yok', 'photos.dayLabel': '{number}. gün', diff --git a/shared/src/i18n/tr/reservations.ts b/shared/src/i18n/tr/reservations.ts index 1502673b5..308ceeb63 100644 --- a/shared/src/i18n/tr/reservations.ts +++ b/shared/src/i18n/tr/reservations.ts @@ -180,6 +180,7 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Diğer uçuşlar', 'reservations.airtrail.empty': 'AirTrail hesabınızda uçuş bulunamadı.', 'reservations.airtrail.importCta': '{count} içe aktar', + 'reservations.airtrail.importCta.one': '{count} içe aktar', 'reservations.airtrail.joinConnection': '{stops} aktarmalı tek uçuş olarak içe aktar', 'reservations.costsLabel': 'Maliyetler', 'reservations.createExpense': 'Harcama oluştur', diff --git a/shared/src/i18n/tr/roadtrip.ts b/shared/src/i18n/tr/roadtrip.ts index 7e8c0a90e..df25d594a 100644 --- a/shared/src/i18n/tr/roadtrip.ts +++ b/shared/src/i18n/tr/roadtrip.ts @@ -197,6 +197,7 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Yol boyunca “{name}” ile eşleşen bir şey yok.', 'roadtrip.poi.noneMatchFilters': 'Yol boyunca bu filtrelere uyan bir yer yok.', 'roadtrip.poi.foundFiltered': 'yol üzerinde {total} içinden {count}', + 'roadtrip.poi.foundFiltered.one': 'yol üzerinde {total} içinden {count}', 'roadtrip.poi.truncated': '{count} bölümde bir yanıta sığandan fazlası vardı. Geri kalanı görmek için koridoru daraltın.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/tr/settings.ts b/shared/src/i18n/tr/settings.ts index c220fb515..ee59f5b33 100644 --- a/shared/src/i18n/tr/settings.ts +++ b/shared/src/i18n/tr/settings.ts @@ -575,9 +575,13 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Çevrimdışı', 'settings.offline.banner.forced': 'Çevrimdışı mod', 'settings.offline.banner.queued': 'Çevrimdışı · {count} sırada', + 'settings.offline.banner.queued.one': 'Çevrimdışı · {count} sırada', 'settings.offline.banner.syncing': '{count} senkronize ediliyor…', + 'settings.offline.banner.syncing.one': '{count} senkronize ediliyor…', 'settings.offline.banner.failed': 'Senkronize edilemedi: {count}', + 'settings.offline.banner.failed.one': 'Senkronize edilemedi: {count}', 'settings.offline.banner.conflicts': 'Çakışmalar: {count}', + 'settings.offline.banner.conflicts.one': 'Çakışmalar: {count}', 'settings.pluginActivity.title': 'Eklenti etkinliği', 'settings.pluginActivity.description': 'Bir eklentinin sizin adınıza gerçekleştirdiği her işlem, en yenisi önce.', 'settings.pluginActivity.empty': 'Henüz eklenti etkinliği yok.', @@ -599,6 +603,7 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Her şey', 'settings.apiScopes.noneSelected': 'En az bir alan seç, yoksa anahtar hiçbir şey okuyamaz.', 'settings.apiScopes.limited': '{total} içinden {count}', + 'settings.apiScopes.limited.one': '{total} içinden {count}', 'settings.apiScopes.trips': 'Geziler', 'settings.apiScopes.days': 'Günler', 'settings.apiScopes.places': 'Yerler', diff --git a/shared/src/i18n/tr/tours.ts b/shared/src/i18n/tr/tours.ts index 304651096..94bb66d94 100644 --- a/shared/src/i18n/tr/tours.ts +++ b/shared/src/i18n/tr/tours.ts @@ -67,6 +67,7 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Rota noktaları', 'tours.planner.waypointLabel': 'Rota noktası {n}', 'tours.durationMinutes': '{count} dk', + 'tours.durationMinutes.one': '{count} dk', 'tours.planner.empty': 'Yürüyüş rotasını hesaplamak için en az iki nokta ekleyin.', 'tours.planner.start': 'Başlangıç', 'tours.planner.via': 'Ara nokta', diff --git a/shared/src/i18n/tr/trip.ts b/shared/src/i18n/tr/trip.ts index cbd73c9e4..7638c08f3 100644 --- a/shared/src/i18n/tr/trip.ts +++ b/shared/src/i18n/tr/trip.ts @@ -73,6 +73,7 @@ const trip: TranslationStrings = { 'transit.transfers': '{count} aktarma', 'transit.transfers.one': '{count} aktarma', 'transit.min': '{count} dk', + 'transit.min.one': '{count} dk', 'transit.stops': '{count} durak', 'transit.stops.one': '{count} durak', 'transit.walkTo': '{name} durağına yürü', diff --git a/shared/src/i18n/tr/vacay.ts b/shared/src/i18n/tr/vacay.ts index 0d9a51544..2de9f1694 100644 --- a/shared/src/i18n/tr/vacay.ts +++ b/shared/src/i18n/tr/vacay.ts @@ -87,6 +87,7 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Kalan tatil günlerini otomatik olarak bir sonraki yıla devredin', 'vacay.carriedOverPrevPeriod': 'önceki dönemden', 'vacay.compUsedCount': '{count} serbest zaman', + 'vacay.compUsedCount.one': '{count} serbest zaman', 'vacay.yearType': 'Tatil yılı', 'vacay.yearTypeHint': 'Tatil yılınız ne zaman başlar — hak ediş, kullanım ve devir buna göre hesaplanır', 'vacay.yearTypeCalendar': 'Takvim', diff --git a/shared/src/i18n/uk/admin.ts b/shared/src/i18n/uk/admin.ts index de26e5909..883463cae 100644 --- a/shared/src/i18n/uk/admin.ts +++ b/shared/src/i18n/uk/admin.ts @@ -588,7 +588,13 @@ const admin: TranslationStrings = { 'admin.plugins.cap.requiresAddon': 'Потрібен {addon}', 'admin.plugins.cap.dependsOn': 'Потрібен {id} {version}', 'admin.plugins.dep.addonDisabledToast': 'Спершу увімкніть потрібні доповнення: {addons}', + 'admin.plugins.dep.addonDisabledToast.one': 'Спершу увімкніть потрібне доповнення: {addons}', + 'admin.plugins.dep.addonDisabledToast.few': 'Спершу увімкніть потрібні доповнення: {addons}', + 'admin.plugins.dep.addonDisabledToast.many': 'Спершу увімкніть потрібні доповнення: {addons}', 'admin.plugins.dep.autoEnabled': 'Спершу увімкнено потрібні плагіни: {plugins}', + 'admin.plugins.dep.autoEnabled.one': 'Спершу увімкнено потрібний плагін: {plugins}', + 'admin.plugins.dep.autoEnabled.few': 'Спершу увімкнено потрібні плагіни: {plugins}', + 'admin.plugins.dep.autoEnabled.many': 'Спершу увімкнено потрібні плагіни: {plugins}', 'admin.plugins.dep.downloaded': 'Завантажено {id}', 'admin.plugins.dep.resolveTitle': 'Відсутні залежності', 'admin.plugins.dep.resolveBody': '“{name}” потребує встановлення цих плагінів, перш ніж його можна буде увімкнути.', @@ -715,7 +721,10 @@ const admin: TranslationStrings = { 'admin.audit.empty': 'Записів аудиту поки немає.', 'admin.audit.refresh': 'Оновити', 'admin.audit.loadMore': 'Завантажити ще', - 'admin.audit.showing': 'Завантажено: {count} · всього {total}', + 'admin.audit.showing': 'Завантажено {count} запису · всього {total}', + 'admin.audit.showing.one': 'Завантажено {count} запис · всього {total}', + 'admin.audit.showing.few': 'Завантажено {count} записи · всього {total}', + 'admin.audit.showing.many': 'Завантажено {count} записів · всього {total}', 'admin.audit.col.time': 'Час', 'admin.audit.col.user': 'Користувач', 'admin.audit.col.action': 'Дія', diff --git a/shared/src/i18n/uk/collab.ts b/shared/src/i18n/uk/collab.ts index 5d6ce96f3..1d04753c1 100644 --- a/shared/src/i18n/uk/collab.ts +++ b/shared/src/i18n/uk/collab.ts @@ -45,7 +45,13 @@ const collab: TranslationStrings = { 'collab.chat.loadMore': 'Завантажити старі повідомлення', 'collab.chat.justNow': 'щойно', 'collab.chat.minutesAgo': '{n} хв. тому', + 'collab.chat.minutesAgo.one': '{n} хв. тому', + 'collab.chat.minutesAgo.few': '{n} хв. тому', + 'collab.chat.minutesAgo.many': '{n} хв. тому', 'collab.chat.hoursAgo': '{n} год. тому', + 'collab.chat.hoursAgo.one': '{n} год. тому', + 'collab.chat.hoursAgo.few': '{n} год. тому', + 'collab.chat.hoursAgo.many': '{n} год. тому', 'collab.notes.title': 'Нотатки', 'collab.notes.new': 'Нова нотатка', 'collab.notes.empty': 'Нотаток поки що немає', @@ -69,6 +75,9 @@ const collab: TranslationStrings = { 'collab.notes.pin': 'Закріпити', 'collab.notes.unpin': 'Відкріпити', 'collab.notes.daysAgo': '{n} дн. тому', + 'collab.notes.daysAgo.one': '{n} дн. тому', + 'collab.notes.daysAgo.few': '{n} дн. тому', + 'collab.notes.daysAgo.many': '{n} дн. тому', 'collab.notes.categorySettings': 'Керування категоріями', 'collab.notes.create': 'Створити', 'collab.notes.website': 'Сайт', diff --git a/shared/src/i18n/uk/collection.ts b/shared/src/i18n/uk/collection.ts index bee71323b..79c5a9dea 100644 --- a/shared/src/i18n/uk/collection.ts +++ b/shared/src/i18n/uk/collection.ts @@ -2,7 +2,13 @@ import type { TranslationStrings } from '../types'; const collection: TranslationStrings = { 'collections.saveNToList': 'Зберегти {count} до списку', + 'collections.saveNToList.one': 'Зберегти {count} до списку', + 'collections.saveNToList.few': 'Зберегти {count} до списку', + 'collections.saveNToList.many': 'Зберегти {count} до списку', 'collections.addedNToList': 'Збережено {count} до {name}', + 'collections.addedNToList.one': 'Збережено {count} до {name}', + 'collections.addedNToList.few': 'Збережено {count} до {name}', + 'collections.addedNToList.many': 'Збережено {count} до {name}', 'collections.noOwnLists': 'У вас ще немає списків', 'collections.saveToListHint': 'Дублікати пропускаються автоматично', 'collections.role.label': 'Роль', @@ -16,7 +22,13 @@ const collection: TranslationStrings = { 'collections.moveToList': 'Перемістити до списку', 'collections.duplicateToList': 'Дублювати до списку', 'collections.moveToListTitle': 'Перемістити {count} до іншого списку', + 'collections.moveToListTitle.one': 'Перемістити {count} до іншого списку', + 'collections.moveToListTitle.few': 'Перемістити {count} до іншого списку', + 'collections.moveToListTitle.many': 'Перемістити {count} до іншого списку', 'collections.duplicateToListTitle': 'Дублювати {count} до іншого списку', + 'collections.duplicateToListTitle.one': 'Дублювати {count} до іншого списку', + 'collections.duplicateToListTitle.few': 'Дублювати {count} до іншого списку', + 'collections.duplicateToListTitle.many': 'Дублювати {count} до іншого списку', 'collections.noOtherLists': 'Інших списків поки немає', 'collections.movedCount': 'Переміщено {count} місця', 'collections.movedCount.one': 'Переміщено {count} місце', @@ -66,6 +78,9 @@ const collection: TranslationStrings = { 'collections.importSelectedCount.few': 'Вибрано: {count}', 'collections.importSelectedCount.many': 'Вибрано: {count}', 'collections.importAction': 'Імпортувати {count}', + 'collections.importAction.one': 'Імпортувати {count}', + 'collections.importAction.few': 'Імпортувати {count}', + 'collections.importAction.many': 'Імпортувати {count}', 'collections.importEmptyTrip': 'У цій подорожі ще немає місць', 'collections.importNothingNew': 'Усе з цієї подорожі вже є у списку', 'collections.importDone': 'Додано {count} місця', @@ -130,6 +145,9 @@ const collection: TranslationStrings = { 'collections.copyToTrip': 'Скопіювати в подорож', 'collections.copyToTripTitle': 'Скопіювати в подорож', 'collections.copyN': 'Скопіювати {count} у подорож', + 'collections.copyN.one': 'Скопіювати {count} у подорож', + 'collections.copyN.few': 'Скопіювати {count} у подорож', + 'collections.copyN.many': 'Скопіювати {count} у подорож', 'collections.copyToTripSearch': 'Пошук подорожей', 'collections.searchLists': 'Пошук списків', 'collections.copyToTripConfirm': 'Скопіювати', @@ -171,6 +189,9 @@ const collection: TranslationStrings = { 'collections.removedFromAll': 'Видалено з колекції', 'collections.picker.title': 'Збережені місця', 'collections.picker.showMore': 'Показати ще {count}', + 'collections.picker.showMore.one': 'Показати ще {count}', + 'collections.picker.showMore.few': 'Показати ще {count}', + 'collections.picker.showMore.many': 'Показати ще {count}', 'collections.picker.search': 'Пошук збережених місць', 'collections.picker.empty': 'Немає збережених місць для додавання', 'collections.picker.hint': 'Виберіть місце зі своїх колекцій', @@ -195,6 +216,9 @@ const collection: TranslationStrings = { 'collections.file.doneInto.few': '{count} місця додано до {name}', 'collections.file.doneInto.many': '{count} місць додано до {name}', 'collections.file.doneIntoDuplicates': '{count} додано до {name}, {duplicates} уже були там', + 'collections.file.doneIntoDuplicates.one': '{count} додано до {name}, {duplicates} уже були там', + 'collections.file.doneIntoDuplicates.few': '{count} додано до {name}, {duplicates} уже були там', + 'collections.file.doneIntoDuplicates.many': '{count} додано до {name}, {duplicates} уже були там', 'collections.file.doneIntoNothing': 'Усі місця з файлу вже є у {name}', 'collections.file.change': 'Змінити', 'collections.file.labelCount': '{count} мітки', @@ -235,6 +259,12 @@ const collection: TranslationStrings = { 'collections.file.gpxEmpty': 'У цьому файлі GPX немає маршрутних точок, тож імпортувати нічого.', 'collections.file.errorNotGpx': 'Це не файл GPX.', 'collections.file.errorTooManyPlaces': + 'У цьому файлі понад {count} місця. Розділіть його та імпортуйте частини по черзі.', + 'collections.file.errorTooManyPlaces.one': + 'У цьому файлі понад {count} місце. Розділіть його та імпортуйте частини по черзі.', + 'collections.file.errorTooManyPlaces.few': + 'У цьому файлі понад {count} місця. Розділіть його та імпортуйте частини по черзі.', + 'collections.file.errorTooManyPlaces.many': 'У цьому файлі понад {count} місць. Розділіть його та імпортуйте частини по черзі.', 'collections.share.title': 'Поділитися списком', diff --git a/shared/src/i18n/uk/common.ts b/shared/src/i18n/uk/common.ts index fdf6f018c..a6e1e2490 100644 --- a/shared/src/i18n/uk/common.ts +++ b/shared/src/i18n/uk/common.ts @@ -55,7 +55,13 @@ const common: TranslationStrings = { 'common.copied': 'Скопійовано', 'common.justNow': 'щойно', 'common.hoursAgo': '{count} год. тому', + 'common.hoursAgo.one': '{count} год. тому', + 'common.hoursAgo.few': '{count} год. тому', + 'common.hoursAgo.many': '{count} год. тому', 'common.daysAgo': '{count} дн. тому', + 'common.daysAgo.one': '{count} дн. тому', + 'common.daysAgo.few': '{count} дн. тому', + 'common.daysAgo.many': '{count} дн. тому', 'common.datepicker.prevMonth': 'Previous month', // en-fallback 'common.datepicker.nextMonth': 'Next month', // en-fallback 'common.datepicker.prevYear': 'Previous year', // en-fallback diff --git a/shared/src/i18n/uk/dashboard.ts b/shared/src/i18n/uk/dashboard.ts index 47c15d1b6..e1d98441c 100644 --- a/shared/src/i18n/uk/dashboard.ts +++ b/shared/src/i18n/uk/dashboard.ts @@ -8,8 +8,10 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.trips.few': '{count} поїздки ({archived} в архіві)', 'dashboard.subtitle.trips.many': '{count} поїздок ({archived} в архіві)', 'dashboard.subtitle.empty': 'Почніть свою першу поїздку', - 'dashboard.subtitle.activeOne': '{count} активна поїздка', - 'dashboard.subtitle.activeMany': '{count} активних поїздок', + 'dashboard.subtitle.active': '{count} активної поїздки', + 'dashboard.subtitle.active.one': '{count} активна поїздка', + 'dashboard.subtitle.active.few': '{count} активні поїздки', + 'dashboard.subtitle.active.many': '{count} активних поїздок', 'dashboard.subtitle.archivedSuffix': ' · {count} в архіві', 'dashboard.subtitle.archivedSuffix.one': ' · {count} в архіві', 'dashboard.subtitle.archivedSuffix.few': ' · {count} в архіві', @@ -140,6 +142,9 @@ const dashboard: TranslationStrings = { 'dashboard.shrinkTitle': 'Видалити дні?', 'dashboard.shrinkIntro': 'Під час збереження нових дат буде видалено ці дні:', 'dashboard.shrinkMoreDays': 'ще +{count}', + 'dashboard.shrinkMoreDays.one': 'ще +{count}', + 'dashboard.shrinkMoreDays.few': 'ще +{count}', + 'dashboard.shrinkMoreDays.many': 'ще +{count}', 'dashboard.shrinkLastDays': 'Видаляються останні дні, а не перші', 'dashboard.shrinkLastDaysHint': 'Плани днів переносяться разом із новими датами, тому завжди видаляються останні дні плану, навіть якщо зсунувся початок.', diff --git a/shared/src/i18n/uk/dawarich.ts b/shared/src/i18n/uk/dawarich.ts index e4681de69..139a5d978 100644 --- a/shared/src/i18n/uk/dawarich.ts +++ b/shared/src/i18n/uk/dawarich.ts @@ -99,6 +99,9 @@ const dawarich: TranslationStrings = { 'dawarich.suggestions.dismissed': 'Відхилено', 'dawarich.suggestions.restore': 'Повернути', 'dawarich.suggestions.showHandled': 'Показати вже опрацьовані: {count}', + 'dawarich.suggestions.showHandled.one': 'Показати вже опрацьовані: {count}', + 'dawarich.suggestions.showHandled.few': 'Показати вже опрацьовані: {count}', + 'dawarich.suggestions.showHandled.many': 'Показати вже опрацьовані: {count}', 'dawarich.suggestions.hideHandled': 'Сховати вже опрацьовані', 'dawarich.suggestions.matchesWish': 'У вашому списку бажань: {name}', 'dawarich.suggestions.acceptedAs.place': 'Додано як місце', @@ -150,6 +153,9 @@ const dawarich: TranslationStrings = { 'dawarich.bucket.noMatches': 'У ваших записах не знайшлося нічого зі списку бажань.', 'dawarich.bucket.alreadyVisited': 'Уже позначено виконаним', 'dawarich.bucket.confirm': 'Позначити виконаними: {count}', + 'dawarich.bucket.confirm.one': 'Позначити виконаними: {count}', + 'dawarich.bucket.confirm.few': 'Позначити виконаними: {count}', + 'dawarich.bucket.confirm.many': 'Позначити виконаними: {count}', 'dawarich.bucket.confirmed': '{count} бажання позначено виконаними', 'dawarich.bucket.confirmed.one': '{count} бажання позначено виконаним', 'dawarich.bucket.confirmed.few': '{count} бажання позначено виконаними', diff --git a/shared/src/i18n/uk/dayplan.ts b/shared/src/i18n/uk/dayplan.ts index 98562ce7e..acc17d62e 100644 --- a/shared/src/i18n/uk/dayplan.ts +++ b/shared/src/i18n/uk/dayplan.ts @@ -104,11 +104,23 @@ const dayplan: TranslationStrings = { 'Усі місця буде прибрано з цього дня. Місця залишаться в подорожі, а нотатки та бронювання дня збережуться.', 'dayplan.deleteDayEmpty': 'На цей день нічого не заплановано.', 'dayplan.impactPlaces': 'Заплановані місця: {count}', + 'dayplan.impactPlaces.one': 'Заплановані місця: {count}', + 'dayplan.impactPlaces.few': 'Заплановані місця: {count}', + 'dayplan.impactPlaces.many': 'Заплановані місця: {count}', 'dayplan.impactPlacesHint': 'Вони залишаться у списку місць.', 'dayplan.impactNotes': 'Нотатки: {count}', + 'dayplan.impactNotes.one': 'Нотатки: {count}', + 'dayplan.impactNotes.few': 'Нотатки: {count}', + 'dayplan.impactNotes.many': 'Нотатки: {count}', 'dayplan.impactTexts': 'Назви й описи дня: {count}', + 'dayplan.impactTexts.one': 'Назви й описи дня: {count}', + 'dayplan.impactTexts.few': 'Назви й описи дня: {count}', + 'dayplan.impactTexts.many': 'Назви й описи дня: {count}', 'dayplan.impactDeletedHint': 'Теж будуть видалені.', 'dayplan.impactBookings': 'Бронювання: {count}', + 'dayplan.impactBookings.one': 'Бронювання: {count}', + 'dayplan.impactBookings.few': 'Бронювання: {count}', + 'dayplan.impactBookings.many': 'Бронювання: {count}', 'dayplan.impactStay': 'Проживання в {name}', 'dayplan.deleteDayBookingsHint': 'Вони залишаться в Бронюваннях, без дня.', 'dayplan.deleteDayStayHint': 'Заїзд або виїзд припадає на цей день, тому проживання скасовується.', @@ -119,9 +131,18 @@ const dayplan: TranslationStrings = { 'dayplan.deleteDayStayPaidHint': 'Заїзд або виїзд припадає на цей день, тому проживання скасовується разом із бронюванням «{booking}» і його витратою на {amount}.', 'dayplan.deleteDayShift': 'Наступні дні: {count}', + 'dayplan.deleteDayShift.one': 'Наступні дні: {count}', + 'dayplan.deleteDayShift.few': 'Наступні дні: {count}', + 'dayplan.deleteDayShift.many': 'Наступні дні: {count}', 'dayplan.deleteDayShiftHint': 'Кожен зсувається на одну дату раніше.', 'dayplan.deleteDayShiftBookingsHint': 'Кожен зсувається на одну дату раніше. Бронювання, що зсуваються разом із ними: {count}', + 'dayplan.deleteDayShiftBookingsHint.one': + 'Кожен зсувається на одну дату раніше. Бронювання, що зсуваються разом із ними: {count}', + 'dayplan.deleteDayShiftBookingsHint.few': + 'Кожен зсувається на одну дату раніше. Бронювання, що зсуваються разом із ними: {count}', + 'dayplan.deleteDayShiftBookingsHint.many': + 'Кожен зсувається на одну дату раніше. Бронювання, що зсуваються разом із ними: {count}', 'dayplan.deleteDayShrink': 'Тепер подорож закінчується {date}', 'dayplan.deleteDayShrinkHint': 'Немає дня без дати, який міг би зайняти останню дату.', 'dayplan.impactStayShorter': 'Проживання в {name}: на одну ніч менше', diff --git a/shared/src/i18n/uk/docsync.ts b/shared/src/i18n/uk/docsync.ts index f79b420d4..9862b8e6c 100644 --- a/shared/src/i18n/uk/docsync.ts +++ b/shared/src/i18n/uk/docsync.ts @@ -72,6 +72,9 @@ const docsync: TranslationStrings = { 'docsync.state.scope_drift': 'Переміщено за межі теки', 'docsync.conflict.resolve': "Розв'язати {count}", + 'docsync.conflict.resolve.one': "Розв'язати {count}", + 'docsync.conflict.resolve.few': "Розв'язати {count}", + 'docsync.conflict.resolve.many': "Розв'язати {count}", 'docsync.conflict.title': 'Змінилися обидві копії', 'docsync.conflict.keepTrek': 'Залишити версію TREK', diff --git a/shared/src/i18n/uk/journey.ts b/shared/src/i18n/uk/journey.ts index 938abec73..4e3c7f33e 100644 --- a/shared/src/i18n/uk/journey.ts +++ b/shared/src/i18n/uk/journey.ts @@ -696,6 +696,9 @@ const journey: TranslationStrings = { 'journey.suggestions.dismissed': 'Пропозицію відхилено', 'journey.suggestions.restore': 'Повернути відхилені пропозиції', 'journey.suggestions.restoreCount': 'Відхилені пропозиції ({count})', + 'journey.suggestions.restoreCount.one': 'Відхилені пропозиції ({count})', + 'journey.suggestions.restoreCount.few': 'Відхилені пропозиції ({count})', + 'journey.suggestions.restoreCount.many': 'Відхилені пропозиції ({count})', 'journey.suggestions.restored': 'Повернулося {count} пропозиції', 'journey.suggestions.restored.one': 'Повернулася {count} пропозиція', 'journey.suggestions.restored.few': 'Повернулися {count} пропозиції', diff --git a/shared/src/i18n/uk/memories.ts b/shared/src/i18n/uk/memories.ts index f1f0b626f..b8ba0e7ed 100644 --- a/shared/src/i18n/uk/memories.ts +++ b/shared/src/i18n/uk/memories.ts @@ -65,6 +65,12 @@ const memories: TranslationStrings = { 'memories.confirmShareTitle': 'Поділитися з учасниками поїздки?', 'memories.confirmShareHint': '{count} фото стануть видимі всім учасникам цієї поїздки. Ви зможете зробити окремі фото приватними пізніше.', + 'memories.confirmShareHint.one': + '{count} фото стане видимим усім учасникам цієї поїздки. Ви зможете зробити його приватним пізніше.', + 'memories.confirmShareHint.few': + '{count} фото стануть видимі всім учасникам цієї поїздки. Ви зможете зробити окремі фото приватними пізніше.', + 'memories.confirmShareHint.many': + '{count} фото стануть видимі всім учасникам цієї поїздки. Ви зможете зробити окремі фото приватними пізніше.', 'memories.confirmShareButton': 'Поділитися фото', 'memories.error.loadAlbums': 'Не вдалося завантажити альбоми', 'memories.error.linkAlbum': "Не вдалося прив'язати альбом", diff --git a/shared/src/i18n/uk/packing.ts b/shared/src/i18n/uk/packing.ts index 43b6f762a..6b0ee2346 100644 --- a/shared/src/i18n/uk/packing.ts +++ b/shared/src/i18n/uk/packing.ts @@ -31,6 +31,9 @@ const packing: TranslationStrings = { 'packing.importHintMarkdown': 'Підійде і список у Markdown: заголовок задає категорію, "- [ ]" і "- [x]" стають пунктами, а "3x" перед назвою задає кількість.', 'packing.importAction': 'Імпортувати {count}', + 'packing.importAction.one': 'Імпортувати {count}', + 'packing.importAction.few': 'Імпортувати {count}', + 'packing.importAction.many': 'Імпортувати {count}', 'packing.importSuccess': '{count} предмета імпортовано', 'packing.importSuccess.one': '{count} предмет імпортовано', 'packing.importSuccess.few': '{count} предмети імпортовано', @@ -38,8 +41,14 @@ const packing: TranslationStrings = { 'packing.importError': 'Помилка імпорту', 'packing.importEmpty': 'Немає предметів для імпорту', 'packing.progress': '{packed} з {total} зібрано ({percent}%)', - 'packing.clearChecked': 'Видалити {count} позначених', + 'packing.clearChecked': 'Видалити {count} позначеного предмета', + 'packing.clearChecked.one': 'Видалити {count} позначений предмет', + 'packing.clearChecked.few': 'Видалити {count} позначені предмети', + 'packing.clearChecked.many': 'Видалити {count} позначених предметів', 'packing.clearCheckedShort': 'Видалити {count}', + 'packing.clearCheckedShort.one': 'Видалити {count}', + 'packing.clearCheckedShort.few': 'Видалити {count}', + 'packing.clearCheckedShort.many': 'Видалити {count}', 'packing.allPacked': 'Усе зібрано!', 'packing.addPlaceholder': 'Додати річ...', 'packing.categoryPlaceholder': 'Список...', @@ -104,7 +113,10 @@ const packing: TranslationStrings = { 'packing.tierShared': 'Поділитися з…', 'packing.noOneToShare': 'Поки більше нікого в цій подорожі', 'packing.takenCareOf': 'від {name}', - 'packing.sharedWithCount': 'надано {count}', + 'packing.sharedWithCount': 'надано {count} учасникам', + 'packing.sharedWithCount.one': 'надано {count} учаснику', + 'packing.sharedWithCount.few': 'надано {count} учасникам', + 'packing.sharedWithCount.many': 'надано {count} учасникам', 'packing.broughtBy': 'приносить {name}', 'packing.alsoBring': 'Я теж можу принести', 'packing.alsoBringingStop': 'Я не принесу', diff --git a/shared/src/i18n/uk/photos.ts b/shared/src/i18n/uk/photos.ts index 2cb4a8756..bef1f3058 100644 --- a/shared/src/i18n/uk/photos.ts +++ b/shared/src/i18n/uk/photos.ts @@ -18,6 +18,9 @@ const photos: TranslationStrings = { 'photos.linkPlace': 'Прив’язати місце', 'photos.noPlace': 'Без місця', 'photos.uploadN': '{n} фото завантажено', + 'photos.uploadN.one': '{n} фото завантажено', + 'photos.uploadN.few': '{n} фото завантажено', + 'photos.uploadN.many': '{n} фото завантажено', 'photos.linkDay': 'Прив’язати день', 'photos.noDay': 'Немає дня', 'photos.dayLabel': 'День {number}', diff --git a/shared/src/i18n/uk/reservations.ts b/shared/src/i18n/uk/reservations.ts index ef37dd7ed..2d4435467 100644 --- a/shared/src/i18n/uk/reservations.ts +++ b/shared/src/i18n/uk/reservations.ts @@ -188,6 +188,9 @@ const reservations: TranslationStrings = { 'reservations.airtrail.otherFlights': 'Інші рейси', 'reservations.airtrail.empty': 'У вашому акаунті AirTrail не знайдено рейсів.', 'reservations.airtrail.importCta': 'Імпортувати {count}', + 'reservations.airtrail.importCta.one': 'Імпортувати {count}', + 'reservations.airtrail.importCta.few': 'Імпортувати {count}', + 'reservations.airtrail.importCta.many': 'Імпортувати {count}', 'reservations.airtrail.joinConnection': 'Імпортувати як один рейс із пересадкою в {stops}', 'reservations.costsLabel': 'Витрати', 'reservations.createExpense': 'Створити витрату', diff --git a/shared/src/i18n/uk/roadtrip.ts b/shared/src/i18n/uk/roadtrip.ts index 567ae1627..bd2208601 100644 --- a/shared/src/i18n/uk/roadtrip.ts +++ b/shared/src/i18n/uk/roadtrip.ts @@ -211,6 +211,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.poi.noMatch': 'Дорогою ніщо не відповідає «{name}».', 'roadtrip.poi.noneMatchFilters': 'На маршруті немає нічого, що відповідає цим фільтрам.', 'roadtrip.poi.foundFiltered': '{count} з {total} дорогою', + 'roadtrip.poi.foundFiltered.one': '{count} з {total} дорогою', + 'roadtrip.poi.foundFiltered.few': '{count} з {total} дорогою', + 'roadtrip.poi.foundFiltered.many': '{count} з {total} дорогою', 'roadtrip.poi.truncated': 'На {count} відрізка знайшлося більше, ніж уміщується в одну відповідь. Звузьте коридор, щоб побачити решту.', 'roadtrip.poi.truncated.one': diff --git a/shared/src/i18n/uk/settings.ts b/shared/src/i18n/uk/settings.ts index 51293048e..ca2315ee4 100644 --- a/shared/src/i18n/uk/settings.ts +++ b/shared/src/i18n/uk/settings.ts @@ -580,9 +580,21 @@ const settings: TranslationStrings = { 'settings.offline.banner.offline': 'Офлайн', 'settings.offline.banner.forced': 'Офлайн-режим', 'settings.offline.banner.queued': 'Офлайн · {count} у черзі', + 'settings.offline.banner.queued.one': 'Офлайн · {count} у черзі', + 'settings.offline.banner.queued.few': 'Офлайн · {count} у черзі', + 'settings.offline.banner.queued.many': 'Офлайн · {count} у черзі', 'settings.offline.banner.syncing': 'Синхронізація {count}…', + 'settings.offline.banner.syncing.one': 'Синхронізація {count}…', + 'settings.offline.banner.syncing.few': 'Синхронізація {count}…', + 'settings.offline.banner.syncing.many': 'Синхронізація {count}…', 'settings.offline.banner.failed': 'Не вдалося синхронізувати: {count}', + 'settings.offline.banner.failed.one': 'Не вдалося синхронізувати: {count}', + 'settings.offline.banner.failed.few': 'Не вдалося синхронізувати: {count}', + 'settings.offline.banner.failed.many': 'Не вдалося синхронізувати: {count}', 'settings.offline.banner.conflicts': 'Конфлікти: {count}', + 'settings.offline.banner.conflicts.one': 'Конфлікти: {count}', + 'settings.offline.banner.conflicts.few': 'Конфлікти: {count}', + 'settings.offline.banner.conflicts.many': 'Конфлікти: {count}', 'settings.pluginActivity.title': 'Активність плагінів', 'settings.pluginActivity.description': 'Кожна дія, яку плагін виконав від вашого імені, найновіші спершу.', 'settings.pluginActivity.empty': 'Активності плагінів поки немає.', @@ -604,6 +616,9 @@ const settings: TranslationStrings = { 'settings.apiScopes.all': 'Усе', 'settings.apiScopes.noneSelected': 'Виберіть принаймні один розділ, інакше ключ не зможе нічого прочитати.', 'settings.apiScopes.limited': '{count} з {total}', + 'settings.apiScopes.limited.one': '{count} з {total}', + 'settings.apiScopes.limited.few': '{count} з {total}', + 'settings.apiScopes.limited.many': '{count} з {total}', 'settings.apiScopes.trips': 'Подорожі', 'settings.apiScopes.days': 'Дні', 'settings.apiScopes.places': 'Місця', diff --git a/shared/src/i18n/uk/tours.ts b/shared/src/i18n/uk/tours.ts index 110cd8a69..c9b081a63 100644 --- a/shared/src/i18n/uk/tours.ts +++ b/shared/src/i18n/uk/tours.ts @@ -69,6 +69,9 @@ const tours: TranslationStrings = { 'tours.planner.waypoints': 'Маршрутні точки', 'tours.planner.waypointLabel': 'Маршрутна точка {n}', 'tours.durationMinutes': '{count} хв', + 'tours.durationMinutes.one': '{count} хв', + 'tours.durationMinutes.few': '{count} хв', + 'tours.durationMinutes.many': '{count} хв', 'tours.planner.empty': 'Додайте щонайменше дві точки для розрахунку пішого маршруту.', 'tours.planner.start': 'Початок', 'tours.planner.via': 'Через', diff --git a/shared/src/i18n/uk/trip.ts b/shared/src/i18n/uk/trip.ts index eaaa8813e..8a9242274 100644 --- a/shared/src/i18n/uk/trip.ts +++ b/shared/src/i18n/uk/trip.ts @@ -79,6 +79,9 @@ const trip: TranslationStrings = { 'transit.transfers.few': '{count} пересадки', 'transit.transfers.many': '{count} пересадок', 'transit.min': '{count} хв', + 'transit.min.one': '{count} хв', + 'transit.min.few': '{count} хв', + 'transit.min.many': '{count} хв', 'transit.stops': '{count} зупинки', 'transit.stops.one': '{count} зупинка', 'transit.stops.few': '{count} зупинки', diff --git a/shared/src/i18n/uk/vacay.ts b/shared/src/i18n/uk/vacay.ts index fed64b9cd..3a5f4906e 100644 --- a/shared/src/i18n/uk/vacay.ts +++ b/shared/src/i18n/uk/vacay.ts @@ -84,6 +84,9 @@ const vacay: TranslationStrings = { 'vacay.carryOverHint': 'Автоматично переносити залишкові дні відпустки на наступний рік', 'vacay.carriedOverPrevPeriod': 'із попереднього періоду', 'vacay.compUsedCount': 'Відгули: {count}', + 'vacay.compUsedCount.one': 'Відгули: {count}', + 'vacay.compUsedCount.few': 'Відгули: {count}', + 'vacay.compUsedCount.many': 'Відгули: {count}', 'vacay.yearType': 'Відпускний рік', 'vacay.yearTypeHint': 'Коли починається ваш відпускний рік — від цього залежать право на відпустку, використані дні та перенесення', diff --git a/shared/src/i18n/vi/dashboard.ts b/shared/src/i18n/vi/dashboard.ts index c9352c71e..f35f02fbf 100644 --- a/shared/src/i18n/vi/dashboard.ts +++ b/shared/src/i18n/vi/dashboard.ts @@ -5,8 +5,7 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.loading': 'Đang tải chuyến đi...', 'dashboard.subtitle.trips': '{count} chuyến đi ({archived} đã lưu trữ)', 'dashboard.subtitle.empty': 'Bắt đầu chuyến đi đầu tiên của bạn', - 'dashboard.subtitle.activeOne': '{count} chuyến đi đang hoạt động', - 'dashboard.subtitle.activeMany': '{count} chuyến đi đang hoạt động', + 'dashboard.subtitle.active': '{count} chuyến đi đang hoạt động', 'dashboard.subtitle.archivedSuffix': ' · {count} đã lưu trữ', 'dashboard.newTrip': 'Chuyến đi mới', 'dashboard.newTripSub': 'Lên kế hoạch cho một chuyến đi mới từ đầu', diff --git a/shared/src/i18n/vi/photos.ts b/shared/src/i18n/vi/photos.ts index 11dd91532..700c944c5 100644 --- a/shared/src/i18n/vi/photos.ts +++ b/shared/src/i18n/vi/photos.ts @@ -14,7 +14,7 @@ const photos: TranslationStrings = { 'photos.clickToSelect': 'hoặc bấm để chọn', 'photos.linkPlace': 'Địa điểm liên kết', 'photos.noPlace': 'Không có nơi nào', - 'photos.uploadN': '{n} tải lên ảnh', + 'photos.uploadN': 'Tải lên {n} ảnh', 'photos.linkDay': 'Ngày liên kết', 'photos.noDay': 'Không có ngày', 'photos.dayLabel': 'Ngày {number}', diff --git a/shared/src/i18n/zh-TW/dashboard.ts b/shared/src/i18n/zh-TW/dashboard.ts index da35f50ba..ca9832f17 100644 --- a/shared/src/i18n/zh-TW/dashboard.ts +++ b/shared/src/i18n/zh-TW/dashboard.ts @@ -5,8 +5,7 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.loading': '載入旅行中...', 'dashboard.subtitle.trips': '{count} 個旅行(其中 {archived} 個已歸檔)', 'dashboard.subtitle.empty': '開始你的第一次旅行', - 'dashboard.subtitle.activeOne': '{count} 個進行中的旅行', - 'dashboard.subtitle.activeMany': '{count} 個進行中的旅行', + 'dashboard.subtitle.active': '{count} 個進行中的旅行', 'dashboard.subtitle.archivedSuffix': ' · {count} 個已歸檔', 'dashboard.newTrip': '新建旅行', 'dashboard.newTripSub': '從零開始規劃新旅行', diff --git a/shared/src/i18n/zh/dashboard.ts b/shared/src/i18n/zh/dashboard.ts index f6856d80d..e518e562d 100644 --- a/shared/src/i18n/zh/dashboard.ts +++ b/shared/src/i18n/zh/dashboard.ts @@ -5,8 +5,7 @@ const dashboard: TranslationStrings = { 'dashboard.subtitle.loading': '加载旅行中...', 'dashboard.subtitle.trips': '{count} 次旅行(其中 {archived} 次已归档)', 'dashboard.subtitle.empty': '开始你的第一次旅行', - 'dashboard.subtitle.activeOne': '{count} 个进行中的旅行', - 'dashboard.subtitle.activeMany': '{count} 个进行中的旅行', + 'dashboard.subtitle.active': '{count} 个进行中的旅行', 'dashboard.subtitle.archivedSuffix': ' · {count} 个已归档', 'dashboard.newTrip': '新建旅行', 'dashboard.newTripSub': '从零开始规划新旅行',