From 9170a5879e5a41089d575e41dc4eca7bf9677b65 Mon Sep 17 00:00:00 2001 From: Sam Potts Date: Fri, 19 Jun 2026 05:16:47 +1000 Subject: [PATCH] feat(core): add built-in locale packs and lazy loadLocale (#1590) Co-authored-by: Cursor --- build/scripts/check-workspace.mjs | 85 ++++++++++++ packages/core/package.json | 2 + .../core/scripts/generate-i18n-locales.ts | 118 +++++++++++++++++ .../core/src/core/i18n/built-in-locales.ts | 58 +++++++++ packages/core/src/core/i18n/index.ts | 3 + packages/core/src/core/i18n/load-locale.ts | 123 ++++++++++++++++++ packages/core/src/core/i18n/locales/all.ts | 115 ++++++++++++++++ packages/core/src/core/i18n/locales/ar.ts | 54 ++++++++ packages/core/src/core/i18n/locales/az.ts | 53 ++++++++ packages/core/src/core/i18n/locales/bg.ts | 54 ++++++++ packages/core/src/core/i18n/locales/bn.ts | 53 ++++++++ packages/core/src/core/i18n/locales/bs.ts | 52 ++++++++ packages/core/src/core/i18n/locales/ca.ts | 54 ++++++++ packages/core/src/core/i18n/locales/cs.ts | 53 ++++++++ packages/core/src/core/i18n/locales/cy.ts | 54 ++++++++ packages/core/src/core/i18n/locales/da.ts | 54 ++++++++ packages/core/src/core/i18n/locales/de.ts | 54 ++++++++ packages/core/src/core/i18n/locales/el.ts | 55 ++++++++ packages/core/src/core/i18n/locales/es.ts | 54 ++++++++ packages/core/src/core/i18n/locales/et.ts | 54 ++++++++ packages/core/src/core/i18n/locales/eu.ts | 54 ++++++++ packages/core/src/core/i18n/locales/fa.ts | 53 ++++++++ packages/core/src/core/i18n/locales/fi.ts | 54 ++++++++ packages/core/src/core/i18n/locales/fr.ts | 54 ++++++++ packages/core/src/core/i18n/locales/gd.ts | 54 ++++++++ packages/core/src/core/i18n/locales/gl.ts | 54 ++++++++ packages/core/src/core/i18n/locales/he.ts | 52 ++++++++ packages/core/src/core/i18n/locales/hi.ts | 54 ++++++++ packages/core/src/core/i18n/locales/hr.ts | 52 ++++++++ packages/core/src/core/i18n/locales/hu.ts | 54 ++++++++ packages/core/src/core/i18n/locales/it.ts | 54 ++++++++ packages/core/src/core/i18n/locales/ja.ts | 54 ++++++++ packages/core/src/core/i18n/locales/ko.ts | 54 ++++++++ packages/core/src/core/i18n/locales/lv.ts | 53 ++++++++ packages/core/src/core/i18n/locales/mr.ts | 54 ++++++++ packages/core/src/core/i18n/locales/nb.ts | 54 ++++++++ packages/core/src/core/i18n/locales/ne.ts | 52 ++++++++ packages/core/src/core/i18n/locales/nl.ts | 54 ++++++++ packages/core/src/core/i18n/locales/nn.ts | 54 ++++++++ packages/core/src/core/i18n/locales/oc.ts | 54 ++++++++ packages/core/src/core/i18n/locales/pl.ts | 54 ++++++++ packages/core/src/core/i18n/locales/pt-BR.ts | 54 ++++++++ packages/core/src/core/i18n/locales/pt-PT.ts | 54 ++++++++ packages/core/src/core/i18n/locales/pt.ts | 2 + packages/core/src/core/i18n/locales/ro.ts | 54 ++++++++ packages/core/src/core/i18n/locales/ru.ts | 54 ++++++++ packages/core/src/core/i18n/locales/sk.ts | 54 ++++++++ packages/core/src/core/i18n/locales/sl.ts | 54 ++++++++ packages/core/src/core/i18n/locales/sr.ts | 52 ++++++++ packages/core/src/core/i18n/locales/sv.ts | 54 ++++++++ packages/core/src/core/i18n/locales/te.ts | 52 ++++++++ packages/core/src/core/i18n/locales/th.ts | 52 ++++++++ packages/core/src/core/i18n/locales/tr.ts | 53 ++++++++ packages/core/src/core/i18n/locales/uk.ts | 54 ++++++++ packages/core/src/core/i18n/locales/vi.ts | 52 ++++++++ packages/core/src/core/i18n/locales/zh-CN.ts | 52 ++++++++ packages/core/src/core/i18n/locales/zh-TW.ts | 52 ++++++++ packages/core/src/core/i18n/locales/zh.ts | 2 + packages/core/src/core/i18n/registry.ts | 2 +- .../src/core/i18n/tests/load-locale.test.ts | 43 ++++++ packages/core/src/core/i18n/types.ts | 5 +- packages/core/tsdown.config.ts | 9 +- packages/html/scripts/build-cdn-locales.ts | 20 +++ packages/html/src/cdn/i18n-registry.ts | 1 + packages/html/src/cdn/locales/.gitignore | 1 + packages/html/src/i18n/locales/all.ts | 2 + packages/html/src/i18n/locales/ar.ts | 2 + packages/html/src/i18n/locales/az.ts | 2 + packages/html/src/i18n/locales/bg.ts | 2 + packages/html/src/i18n/locales/bn.ts | 2 + packages/html/src/i18n/locales/bs.ts | 2 + packages/html/src/i18n/locales/ca.ts | 2 + packages/html/src/i18n/locales/cs.ts | 2 + packages/html/src/i18n/locales/cy.ts | 2 + packages/html/src/i18n/locales/da.ts | 2 + packages/html/src/i18n/locales/de.ts | 2 + packages/html/src/i18n/locales/el.ts | 2 + packages/html/src/i18n/locales/en.ts | 2 + packages/html/src/i18n/locales/es.ts | 2 + packages/html/src/i18n/locales/et.ts | 2 + packages/html/src/i18n/locales/eu.ts | 2 + packages/html/src/i18n/locales/fa.ts | 2 + packages/html/src/i18n/locales/fi.ts | 2 + packages/html/src/i18n/locales/fr.ts | 2 + packages/html/src/i18n/locales/gd.ts | 2 + packages/html/src/i18n/locales/gl.ts | 2 + packages/html/src/i18n/locales/he.ts | 2 + packages/html/src/i18n/locales/hi.ts | 2 + packages/html/src/i18n/locales/hr.ts | 2 + packages/html/src/i18n/locales/hu.ts | 2 + packages/html/src/i18n/locales/it.ts | 2 + packages/html/src/i18n/locales/ja.ts | 2 + packages/html/src/i18n/locales/ko.ts | 2 + packages/html/src/i18n/locales/lv.ts | 2 + packages/html/src/i18n/locales/mr.ts | 2 + packages/html/src/i18n/locales/nb.ts | 2 + packages/html/src/i18n/locales/ne.ts | 2 + packages/html/src/i18n/locales/nl.ts | 2 + packages/html/src/i18n/locales/nn.ts | 2 + packages/html/src/i18n/locales/oc.ts | 2 + packages/html/src/i18n/locales/pl.ts | 2 + packages/html/src/i18n/locales/pt-BR.ts | 2 + packages/html/src/i18n/locales/pt-PT.ts | 2 + packages/html/src/i18n/locales/pt.ts | 2 + packages/html/src/i18n/locales/ro.ts | 2 + packages/html/src/i18n/locales/ru.ts | 2 + packages/html/src/i18n/locales/sk.ts | 2 + packages/html/src/i18n/locales/sl.ts | 2 + packages/html/src/i18n/locales/sr.ts | 2 + packages/html/src/i18n/locales/sv.ts | 2 + packages/html/src/i18n/locales/te.ts | 2 + packages/html/src/i18n/locales/th.ts | 2 + packages/html/src/i18n/locales/tr.ts | 2 + packages/html/src/i18n/locales/uk.ts | 2 + packages/html/src/i18n/locales/vi.ts | 2 + packages/html/src/i18n/locales/zh-CN.ts | 2 + packages/html/src/i18n/locales/zh-TW.ts | 2 + packages/html/src/i18n/locales/zh.ts | 2 + packages/react/src/i18n/locales/all.ts | 2 + packages/react/src/i18n/locales/ar.ts | 2 + packages/react/src/i18n/locales/az.ts | 2 + packages/react/src/i18n/locales/bg.ts | 2 + packages/react/src/i18n/locales/bn.ts | 2 + packages/react/src/i18n/locales/bs.ts | 2 + packages/react/src/i18n/locales/ca.ts | 2 + packages/react/src/i18n/locales/cs.ts | 2 + packages/react/src/i18n/locales/cy.ts | 2 + packages/react/src/i18n/locales/da.ts | 2 + packages/react/src/i18n/locales/de.ts | 2 + packages/react/src/i18n/locales/el.ts | 2 + packages/react/src/i18n/locales/en.ts | 2 + packages/react/src/i18n/locales/es.ts | 2 + packages/react/src/i18n/locales/et.ts | 2 + packages/react/src/i18n/locales/eu.ts | 2 + packages/react/src/i18n/locales/fa.ts | 2 + packages/react/src/i18n/locales/fi.ts | 2 + packages/react/src/i18n/locales/fr.ts | 2 + packages/react/src/i18n/locales/gd.ts | 2 + packages/react/src/i18n/locales/gl.ts | 2 + packages/react/src/i18n/locales/he.ts | 2 + packages/react/src/i18n/locales/hi.ts | 2 + packages/react/src/i18n/locales/hr.ts | 2 + packages/react/src/i18n/locales/hu.ts | 2 + packages/react/src/i18n/locales/it.ts | 2 + packages/react/src/i18n/locales/ja.ts | 2 + packages/react/src/i18n/locales/ko.ts | 2 + packages/react/src/i18n/locales/lv.ts | 2 + packages/react/src/i18n/locales/mr.ts | 2 + packages/react/src/i18n/locales/nb.ts | 2 + packages/react/src/i18n/locales/ne.ts | 2 + packages/react/src/i18n/locales/nl.ts | 2 + packages/react/src/i18n/locales/nn.ts | 2 + packages/react/src/i18n/locales/oc.ts | 2 + packages/react/src/i18n/locales/pl.ts | 2 + packages/react/src/i18n/locales/pt-BR.ts | 2 + packages/react/src/i18n/locales/pt-PT.ts | 2 + packages/react/src/i18n/locales/pt.ts | 2 + packages/react/src/i18n/locales/ro.ts | 2 + packages/react/src/i18n/locales/ru.ts | 2 + packages/react/src/i18n/locales/sk.ts | 2 + packages/react/src/i18n/locales/sl.ts | 2 + packages/react/src/i18n/locales/sr.ts | 2 + packages/react/src/i18n/locales/sv.ts | 2 + packages/react/src/i18n/locales/te.ts | 2 + packages/react/src/i18n/locales/th.ts | 2 + packages/react/src/i18n/locales/tr.ts | 2 + packages/react/src/i18n/locales/uk.ts | 2 + packages/react/src/i18n/locales/vi.ts | 2 + packages/react/src/i18n/locales/zh-CN.ts | 2 + packages/react/src/i18n/locales/zh-TW.ts | 2 + packages/react/src/i18n/locales/zh.ts | 2 + 171 files changed, 3416 insertions(+), 6 deletions(-) create mode 100644 packages/core/scripts/generate-i18n-locales.ts create mode 100644 packages/core/src/core/i18n/built-in-locales.ts create mode 100644 packages/core/src/core/i18n/load-locale.ts create mode 100644 packages/core/src/core/i18n/locales/all.ts create mode 100644 packages/core/src/core/i18n/locales/ar.ts create mode 100644 packages/core/src/core/i18n/locales/az.ts create mode 100644 packages/core/src/core/i18n/locales/bg.ts create mode 100644 packages/core/src/core/i18n/locales/bn.ts create mode 100644 packages/core/src/core/i18n/locales/bs.ts create mode 100644 packages/core/src/core/i18n/locales/ca.ts create mode 100644 packages/core/src/core/i18n/locales/cs.ts create mode 100644 packages/core/src/core/i18n/locales/cy.ts create mode 100644 packages/core/src/core/i18n/locales/da.ts create mode 100644 packages/core/src/core/i18n/locales/de.ts create mode 100644 packages/core/src/core/i18n/locales/el.ts create mode 100644 packages/core/src/core/i18n/locales/es.ts create mode 100644 packages/core/src/core/i18n/locales/et.ts create mode 100644 packages/core/src/core/i18n/locales/eu.ts create mode 100644 packages/core/src/core/i18n/locales/fa.ts create mode 100644 packages/core/src/core/i18n/locales/fi.ts create mode 100644 packages/core/src/core/i18n/locales/fr.ts create mode 100644 packages/core/src/core/i18n/locales/gd.ts create mode 100644 packages/core/src/core/i18n/locales/gl.ts create mode 100644 packages/core/src/core/i18n/locales/he.ts create mode 100644 packages/core/src/core/i18n/locales/hi.ts create mode 100644 packages/core/src/core/i18n/locales/hr.ts create mode 100644 packages/core/src/core/i18n/locales/hu.ts create mode 100644 packages/core/src/core/i18n/locales/it.ts create mode 100644 packages/core/src/core/i18n/locales/ja.ts create mode 100644 packages/core/src/core/i18n/locales/ko.ts create mode 100644 packages/core/src/core/i18n/locales/lv.ts create mode 100644 packages/core/src/core/i18n/locales/mr.ts create mode 100644 packages/core/src/core/i18n/locales/nb.ts create mode 100644 packages/core/src/core/i18n/locales/ne.ts create mode 100644 packages/core/src/core/i18n/locales/nl.ts create mode 100644 packages/core/src/core/i18n/locales/nn.ts create mode 100644 packages/core/src/core/i18n/locales/oc.ts create mode 100644 packages/core/src/core/i18n/locales/pl.ts create mode 100644 packages/core/src/core/i18n/locales/pt-BR.ts create mode 100644 packages/core/src/core/i18n/locales/pt-PT.ts create mode 100644 packages/core/src/core/i18n/locales/pt.ts create mode 100644 packages/core/src/core/i18n/locales/ro.ts create mode 100644 packages/core/src/core/i18n/locales/ru.ts create mode 100644 packages/core/src/core/i18n/locales/sk.ts create mode 100644 packages/core/src/core/i18n/locales/sl.ts create mode 100644 packages/core/src/core/i18n/locales/sr.ts create mode 100644 packages/core/src/core/i18n/locales/sv.ts create mode 100644 packages/core/src/core/i18n/locales/te.ts create mode 100644 packages/core/src/core/i18n/locales/th.ts create mode 100644 packages/core/src/core/i18n/locales/tr.ts create mode 100644 packages/core/src/core/i18n/locales/uk.ts create mode 100644 packages/core/src/core/i18n/locales/vi.ts create mode 100644 packages/core/src/core/i18n/locales/zh-CN.ts create mode 100644 packages/core/src/core/i18n/locales/zh-TW.ts create mode 100644 packages/core/src/core/i18n/locales/zh.ts create mode 100644 packages/core/src/core/i18n/tests/load-locale.test.ts create mode 100644 packages/html/scripts/build-cdn-locales.ts create mode 100644 packages/html/src/cdn/i18n-registry.ts create mode 100644 packages/html/src/cdn/locales/.gitignore create mode 100644 packages/html/src/i18n/locales/all.ts create mode 100644 packages/html/src/i18n/locales/ar.ts create mode 100644 packages/html/src/i18n/locales/az.ts create mode 100644 packages/html/src/i18n/locales/bg.ts create mode 100644 packages/html/src/i18n/locales/bn.ts create mode 100644 packages/html/src/i18n/locales/bs.ts create mode 100644 packages/html/src/i18n/locales/ca.ts create mode 100644 packages/html/src/i18n/locales/cs.ts create mode 100644 packages/html/src/i18n/locales/cy.ts create mode 100644 packages/html/src/i18n/locales/da.ts create mode 100644 packages/html/src/i18n/locales/de.ts create mode 100644 packages/html/src/i18n/locales/el.ts create mode 100644 packages/html/src/i18n/locales/en.ts create mode 100644 packages/html/src/i18n/locales/es.ts create mode 100644 packages/html/src/i18n/locales/et.ts create mode 100644 packages/html/src/i18n/locales/eu.ts create mode 100644 packages/html/src/i18n/locales/fa.ts create mode 100644 packages/html/src/i18n/locales/fi.ts create mode 100644 packages/html/src/i18n/locales/fr.ts create mode 100644 packages/html/src/i18n/locales/gd.ts create mode 100644 packages/html/src/i18n/locales/gl.ts create mode 100644 packages/html/src/i18n/locales/he.ts create mode 100644 packages/html/src/i18n/locales/hi.ts create mode 100644 packages/html/src/i18n/locales/hr.ts create mode 100644 packages/html/src/i18n/locales/hu.ts create mode 100644 packages/html/src/i18n/locales/it.ts create mode 100644 packages/html/src/i18n/locales/ja.ts create mode 100644 packages/html/src/i18n/locales/ko.ts create mode 100644 packages/html/src/i18n/locales/lv.ts create mode 100644 packages/html/src/i18n/locales/mr.ts create mode 100644 packages/html/src/i18n/locales/nb.ts create mode 100644 packages/html/src/i18n/locales/ne.ts create mode 100644 packages/html/src/i18n/locales/nl.ts create mode 100644 packages/html/src/i18n/locales/nn.ts create mode 100644 packages/html/src/i18n/locales/oc.ts create mode 100644 packages/html/src/i18n/locales/pl.ts create mode 100644 packages/html/src/i18n/locales/pt-BR.ts create mode 100644 packages/html/src/i18n/locales/pt-PT.ts create mode 100644 packages/html/src/i18n/locales/pt.ts create mode 100644 packages/html/src/i18n/locales/ro.ts create mode 100644 packages/html/src/i18n/locales/ru.ts create mode 100644 packages/html/src/i18n/locales/sk.ts create mode 100644 packages/html/src/i18n/locales/sl.ts create mode 100644 packages/html/src/i18n/locales/sr.ts create mode 100644 packages/html/src/i18n/locales/sv.ts create mode 100644 packages/html/src/i18n/locales/te.ts create mode 100644 packages/html/src/i18n/locales/th.ts create mode 100644 packages/html/src/i18n/locales/tr.ts create mode 100644 packages/html/src/i18n/locales/uk.ts create mode 100644 packages/html/src/i18n/locales/vi.ts create mode 100644 packages/html/src/i18n/locales/zh-CN.ts create mode 100644 packages/html/src/i18n/locales/zh-TW.ts create mode 100644 packages/html/src/i18n/locales/zh.ts create mode 100644 packages/react/src/i18n/locales/all.ts create mode 100644 packages/react/src/i18n/locales/ar.ts create mode 100644 packages/react/src/i18n/locales/az.ts create mode 100644 packages/react/src/i18n/locales/bg.ts create mode 100644 packages/react/src/i18n/locales/bn.ts create mode 100644 packages/react/src/i18n/locales/bs.ts create mode 100644 packages/react/src/i18n/locales/ca.ts create mode 100644 packages/react/src/i18n/locales/cs.ts create mode 100644 packages/react/src/i18n/locales/cy.ts create mode 100644 packages/react/src/i18n/locales/da.ts create mode 100644 packages/react/src/i18n/locales/de.ts create mode 100644 packages/react/src/i18n/locales/el.ts create mode 100644 packages/react/src/i18n/locales/en.ts create mode 100644 packages/react/src/i18n/locales/es.ts create mode 100644 packages/react/src/i18n/locales/et.ts create mode 100644 packages/react/src/i18n/locales/eu.ts create mode 100644 packages/react/src/i18n/locales/fa.ts create mode 100644 packages/react/src/i18n/locales/fi.ts create mode 100644 packages/react/src/i18n/locales/fr.ts create mode 100644 packages/react/src/i18n/locales/gd.ts create mode 100644 packages/react/src/i18n/locales/gl.ts create mode 100644 packages/react/src/i18n/locales/he.ts create mode 100644 packages/react/src/i18n/locales/hi.ts create mode 100644 packages/react/src/i18n/locales/hr.ts create mode 100644 packages/react/src/i18n/locales/hu.ts create mode 100644 packages/react/src/i18n/locales/it.ts create mode 100644 packages/react/src/i18n/locales/ja.ts create mode 100644 packages/react/src/i18n/locales/ko.ts create mode 100644 packages/react/src/i18n/locales/lv.ts create mode 100644 packages/react/src/i18n/locales/mr.ts create mode 100644 packages/react/src/i18n/locales/nb.ts create mode 100644 packages/react/src/i18n/locales/ne.ts create mode 100644 packages/react/src/i18n/locales/nl.ts create mode 100644 packages/react/src/i18n/locales/nn.ts create mode 100644 packages/react/src/i18n/locales/oc.ts create mode 100644 packages/react/src/i18n/locales/pl.ts create mode 100644 packages/react/src/i18n/locales/pt-BR.ts create mode 100644 packages/react/src/i18n/locales/pt-PT.ts create mode 100644 packages/react/src/i18n/locales/pt.ts create mode 100644 packages/react/src/i18n/locales/ro.ts create mode 100644 packages/react/src/i18n/locales/ru.ts create mode 100644 packages/react/src/i18n/locales/sk.ts create mode 100644 packages/react/src/i18n/locales/sl.ts create mode 100644 packages/react/src/i18n/locales/sr.ts create mode 100644 packages/react/src/i18n/locales/sv.ts create mode 100644 packages/react/src/i18n/locales/te.ts create mode 100644 packages/react/src/i18n/locales/th.ts create mode 100644 packages/react/src/i18n/locales/tr.ts create mode 100644 packages/react/src/i18n/locales/uk.ts create mode 100644 packages/react/src/i18n/locales/vi.ts create mode 100644 packages/react/src/i18n/locales/zh-CN.ts create mode 100644 packages/react/src/i18n/locales/zh-TW.ts create mode 100644 packages/react/src/i18n/locales/zh.ts diff --git a/build/scripts/check-workspace.mjs b/build/scripts/check-workspace.mjs index bfba6d6a..fc12f8da 100644 --- a/build/scripts/check-workspace.mjs +++ b/build/scripts/check-workspace.mjs @@ -11,6 +11,7 @@ * 4. Package metadata — non-private packages have required fields * 5. Release-please config — every versioned package is registered * 6. Define imports — no bare side-effect imports from relative paths + * 7. i18n locales — tag lists match locale files and generated stubs */ import { existsSync, readdirSync, readFileSync } from 'node:fs'; import { dirname, join, resolve } from 'node:path'; @@ -324,6 +325,89 @@ function checkDefineImports() { return { ok: warnings.length === 0, warnings }; } +// ── Check 7: i18n locale consistency ───────────────────────────────────────── + +const GENERATED_I18N_HEADER = '/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */'; + +function parseLocaleTagArray(source, exportName) { + const match = source.match(new RegExp(`export const ${exportName} = \\[([\\s\\S]*?)\\] as const`)); + if (!match) { + throw new Error(`Could not parse ${exportName} from built-in-locales.ts`); + } + return [...match[1].matchAll(/'([^']+)'/g)].map((m) => m[1]); +} + +function checkI18nLocales() { + const warnings = []; + const builtInPath = join(PACKAGES_DIR, 'core/src/core/i18n/built-in-locales.ts'); + const builtInSource = readText(builtInPath); + const builtInLocales = parseLocaleTagArray(builtInSource, 'BUILT_IN_LOCALES'); + const aliasTags = parseLocaleTagArray(builtInSource, 'LOCALE_ALIAS_TAGS'); + const shippedTags = [...builtInLocales, ...aliasTags]; + + const coreLocalesDir = join(PACKAGES_DIR, 'core/src/core/i18n/locales'); + const coreFiles = readdirSync(coreLocalesDir) + .filter((file) => file.endsWith('.ts')) + .map((file) => file.slice(0, -3)); + + const expectedCore = new Set(['all', 'en', ...builtInLocales, ...aliasTags]); + + for (const tag of builtInLocales) { + if (!coreFiles.includes(tag)) { + warnings.push(`BUILT_IN_LOCALES tag "${tag}" has no packages/core/src/core/i18n/locales/${tag}.ts`); + } + } + + for (const tag of aliasTags) { + if (!coreFiles.includes(tag)) { + warnings.push(`LOCALE_ALIAS_TAGS tag "${tag}" has no packages/core/src/core/i18n/locales/${tag}.ts`); + } + } + + for (const file of coreFiles) { + if (!expectedCore.has(file)) { + warnings.push( + `Unexpected locale file packages/core/src/core/i18n/locales/${file}.ts (not in built-in-locales.ts)` + ); + } + } + + const allPath = join(coreLocalesDir, 'all.ts'); + if (!readText(allPath).startsWith(GENERATED_I18N_HEADER)) { + warnings.push( + 'packages/core/src/core/i18n/locales/all.ts is not generated — run pnpm -F @videojs/core generate:locales' + ); + } + + for (const pkg of ['html', 'react']) { + const localesDir = join(PACKAGES_DIR, `${pkg}/src/i18n/locales`); + const expectedPlatform = new Set(['all', 'en', ...shippedTags]); + + for (const tag of expectedPlatform) { + const filePath = join(localesDir, `${tag}.ts`); + if (!existsSync(filePath)) { + warnings.push(`Missing generated re-export packages/${pkg}/src/i18n/locales/${tag}.ts`); + continue; + } + if (!readText(filePath).startsWith(GENERATED_I18N_HEADER)) { + warnings.push( + `packages/${pkg}/src/i18n/locales/${tag}.ts is not generated — run pnpm -F @videojs/core generate:locales` + ); + } + } + + for (const file of readdirSync(localesDir)) { + if (!file.endsWith('.ts')) continue; + const tag = file.slice(0, -3); + if (!expectedPlatform.has(tag)) { + warnings.push(`Unexpected locale re-export packages/${pkg}/src/i18n/locales/${file}`); + } + } + } + + return { ok: warnings.length === 0, warnings }; +} + // ── Main ──────────────────────────────────────────────────────────────────── const checks = [ @@ -334,6 +418,7 @@ const checks = [ { name: 'Release-please config', fn: checkReleasePleaseConfig }, { name: 'Bundled docs publishing', fn: checkBundledDocs }, { name: 'Define imports', fn: checkDefineImports }, + { name: 'i18n locales', fn: checkI18nLocales }, ]; let failed = 0; diff --git a/packages/core/package.json b/packages/core/package.json index c58db596..6795fc90 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -52,6 +52,8 @@ "dist" ], "scripts": { + "generate:locales": "node --import tsx ./scripts/generate-i18n-locales.ts", + "prebuild": "pnpm run generate:locales", "build": "tsdown", "build:watch": "tsdown --watch ./src --no-clean", "dev": "pnpm run build:watch", diff --git a/packages/core/scripts/generate-i18n-locales.ts b/packages/core/scripts/generate-i18n-locales.ts new file mode 100644 index 00000000..a9095513 --- /dev/null +++ b/packages/core/scripts/generate-i18n-locales.ts @@ -0,0 +1,118 @@ +import { readdirSync, unlinkSync, writeFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { BUILT_IN_LOCALES, LOCALE_ALIAS_TAGS, SHIPPED_LOCALE_TAGS } from '../src/core/i18n/built-in-locales.ts'; + +const GENERATED_HEADER = '/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */\n'; + +const coreRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const coreLocalesDir = resolve(coreRoot, 'src/core/i18n/locales'); +const htmlLocalesDir = resolve(coreRoot, '../html/src/i18n/locales'); +const reactLocalesDir = resolve(coreRoot, '../react/src/i18n/locales'); + +const PLATFORM_LOCALE_TAGS = ['en', ...SHIPPED_LOCALE_TAGS] as const; + +function importBinding(tag: string): string { + return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(tag) ? tag : tag.replace(/-/g, '_'); +} + +function objectEntry(tag: string): string { + const binding = importBinding(tag); + if (tag === binding) { + return ` ${tag},`; + } + return ` '${tag}': ${binding},`; +} + +function generateLoadLocaleTs(): string { + const tags = [...BUILT_IN_LOCALES, ...LOCALE_ALIAS_TAGS]; + const entries = tags.map((tag) => ` '${tag}': () => import('./locales/${tag}'),`).join('\n'); + const normalizedEntries = tags + .map((tag) => ` '${tag.trim().replaceAll('_', '-').toLowerCase()}': '${tag}',`) + .join('\n'); + + return `${GENERATED_HEADER}import { canonicalLocaleRegistryKey, hasRegisteredI18n, localeLookupChain } from './registry'; +import type { Translations } from './types'; + +const loaders = { +${entries} +} as const satisfies Record Promise<{ default: Partial }>>; + +const loaderTagByNormalized = { +${normalizedEntries} +} as const satisfies Record; + +/** Lazy-import a shipped locale pack when the tag is not already in the registry. */ +export async function loadLocale(tag: string): Promise | undefined> { + if (hasRegisteredI18n(tag)) return undefined; + for (const chainTag of localeLookupChain(tag)) { + if (hasRegisteredI18n(chainTag)) return undefined; + const loaderTag = + loaderTagByNormalized[canonicalLocaleRegistryKey(chainTag) as keyof typeof loaderTagByNormalized]; + const load = loaderTag ? loaders[loaderTag] : undefined; + if (load) return (await load()).default; + } + return undefined; +} +`; +} + +function generateCoreAllTs(): string { + const importTags = ['en', ...BUILT_IN_LOCALES, ...LOCALE_ALIAS_TAGS]; + const imports = importTags.map((tag) => `import ${importBinding(tag)} from './${tag}';`).join('\n'); + + const objectLines = [' en,', ...BUILT_IN_LOCALES.map(objectEntry), ...LOCALE_ALIAS_TAGS.map(objectEntry)].join('\n'); + + return `${GENERATED_HEADER}import type { Translations } from '../types'; +${imports} + +/** Every built-in locale pack keyed by BCP 47 tag (includes \`en\` and shorthand aliases \`pt\` / \`zh\`). */ +export const all = { +${objectLines} +} as const satisfies Record>; + +export type LocaleTag = keyof typeof all; + +/** BCP 47 tags for every pack in {@link all}. */ +export const localeTags = Object.keys(all) as LocaleTag[]; +`; +} + +function generatePlatformDefaultReExport(tag: string): string { + return `${GENERATED_HEADER}export { default } from '@videojs/core/i18n/locales/${tag}'; +`; +} + +function generatePlatformAllReExport(): string { + return `${GENERATED_HEADER}export { all, type LocaleTag, localeTags } from '@videojs/core/i18n/locales/all'; +`; +} + +function writeGenerated(path: string, content: string): void { + writeFileSync(path, content.endsWith('\n') ? content : `${content}\n`); +} + +function syncPlatformLocaleDir(dir: string): void { + const expected = new Set([...PLATFORM_LOCALE_TAGS, 'all'].map((tag) => `${tag}.ts`)); + + for (const tag of PLATFORM_LOCALE_TAGS) { + writeGenerated(resolve(dir, `${tag}.ts`), generatePlatformDefaultReExport(tag)); + } + + writeGenerated(resolve(dir, 'all.ts'), generatePlatformAllReExport()); + + for (const file of readdirSync(dir)) { + if (!file.endsWith('.ts') || expected.has(file)) { + continue; + } + unlinkSync(resolve(dir, file)); + } +} + +writeGenerated(resolve(coreLocalesDir, 'all.ts'), generateCoreAllTs()); +writeGenerated(resolve(coreRoot, 'src/core/i18n/load-locale.ts'), generateLoadLocaleTs()); +syncPlatformLocaleDir(htmlLocalesDir); +syncPlatformLocaleDir(reactLocalesDir); + +console.log('[generate-i18n-locales] Updated core all.ts, load-locale.ts, and html/react locale re-exports'); diff --git a/packages/core/src/core/i18n/built-in-locales.ts b/packages/core/src/core/i18n/built-in-locales.ts new file mode 100644 index 00000000..4adac1ac --- /dev/null +++ b/packages/core/src/core/i18n/built-in-locales.ts @@ -0,0 +1,58 @@ +/** All non-English locale packs shipped with Video.js (parity with video.js v8 `lang/`). */ +export const BUILT_IN_LOCALES = [ + 'ar', + 'az', + 'bs', + 'bg', + 'bn', + 'ca', + 'cs', + 'cy', + 'da', + 'de', + 'el', + 'es', + 'et', + 'eu', + 'fa', + 'fi', + 'fr', + 'gd', + 'gl', + 'he', + 'hi', + 'hr', + 'hu', + 'it', + 'ja', + 'ko', + 'lv', + 'mr', + 'nb', + 'nl', + 'nn', + 'ne', + 'oc', + 'pl', + 'pt-BR', + 'pt-PT', + 'ro', + 'ru', + 'sk', + 'sl', + 'sr', + 'sv', + 'te', + 'th', + 'tr', + 'uk', + 'vi', + 'zh-CN', + 'zh-TW', +] as const; + +/** Shorthand tags (`pt`, `zh`) that resolve to regional packs via the i18n lookup chain. */ +export const LOCALE_ALIAS_TAGS = ['pt', 'zh'] as const; + +/** Non-English tags with shipped translation packs (built-ins + aliases). */ +export const SHIPPED_LOCALE_TAGS = [...BUILT_IN_LOCALES, ...LOCALE_ALIAS_TAGS] as const; diff --git a/packages/core/src/core/i18n/index.ts b/packages/core/src/core/i18n/index.ts index 6b535e15..233df16d 100644 --- a/packages/core/src/core/i18n/index.ts +++ b/packages/core/src/core/i18n/index.ts @@ -5,8 +5,11 @@ export { resolveBrowserTranslationTarget, shouldAttemptBrowserTranslation, } from './browser-translation'; +export { BUILT_IN_LOCALES, LOCALE_ALIAS_TAGS, SHIPPED_LOCALE_TAGS } from './built-in-locales'; +export { loadLocale } from './load-locale'; export { default as translations } from './locales/en'; export { + canonicalLocaleRegistryKey, getI18nTranslations, hasRegisteredI18n, localeLookupChain, diff --git a/packages/core/src/core/i18n/load-locale.ts b/packages/core/src/core/i18n/load-locale.ts new file mode 100644 index 00000000..92613b35 --- /dev/null +++ b/packages/core/src/core/i18n/load-locale.ts @@ -0,0 +1,123 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +import { canonicalLocaleRegistryKey, hasRegisteredI18n, localeLookupChain } from './registry'; +import type { Translations } from './types'; + +const loaders = { + ar: () => import('./locales/ar'), + az: () => import('./locales/az'), + bs: () => import('./locales/bs'), + bg: () => import('./locales/bg'), + bn: () => import('./locales/bn'), + ca: () => import('./locales/ca'), + cs: () => import('./locales/cs'), + cy: () => import('./locales/cy'), + da: () => import('./locales/da'), + de: () => import('./locales/de'), + el: () => import('./locales/el'), + es: () => import('./locales/es'), + et: () => import('./locales/et'), + eu: () => import('./locales/eu'), + fa: () => import('./locales/fa'), + fi: () => import('./locales/fi'), + fr: () => import('./locales/fr'), + gd: () => import('./locales/gd'), + gl: () => import('./locales/gl'), + he: () => import('./locales/he'), + hi: () => import('./locales/hi'), + hr: () => import('./locales/hr'), + hu: () => import('./locales/hu'), + it: () => import('./locales/it'), + ja: () => import('./locales/ja'), + ko: () => import('./locales/ko'), + lv: () => import('./locales/lv'), + mr: () => import('./locales/mr'), + nb: () => import('./locales/nb'), + nl: () => import('./locales/nl'), + nn: () => import('./locales/nn'), + ne: () => import('./locales/ne'), + oc: () => import('./locales/oc'), + pl: () => import('./locales/pl'), + 'pt-BR': () => import('./locales/pt-BR'), + 'pt-PT': () => import('./locales/pt-PT'), + ro: () => import('./locales/ro'), + ru: () => import('./locales/ru'), + sk: () => import('./locales/sk'), + sl: () => import('./locales/sl'), + sr: () => import('./locales/sr'), + sv: () => import('./locales/sv'), + te: () => import('./locales/te'), + th: () => import('./locales/th'), + tr: () => import('./locales/tr'), + uk: () => import('./locales/uk'), + vi: () => import('./locales/vi'), + 'zh-CN': () => import('./locales/zh-CN'), + 'zh-TW': () => import('./locales/zh-TW'), + pt: () => import('./locales/pt'), + zh: () => import('./locales/zh'), +} as const satisfies Record Promise<{ default: Partial }>>; + +const loaderTagByNormalized = { + ar: 'ar', + az: 'az', + bs: 'bs', + bg: 'bg', + bn: 'bn', + ca: 'ca', + cs: 'cs', + cy: 'cy', + da: 'da', + de: 'de', + el: 'el', + es: 'es', + et: 'et', + eu: 'eu', + fa: 'fa', + fi: 'fi', + fr: 'fr', + gd: 'gd', + gl: 'gl', + he: 'he', + hi: 'hi', + hr: 'hr', + hu: 'hu', + it: 'it', + ja: 'ja', + ko: 'ko', + lv: 'lv', + mr: 'mr', + nb: 'nb', + nl: 'nl', + nn: 'nn', + ne: 'ne', + oc: 'oc', + pl: 'pl', + 'pt-br': 'pt-BR', + 'pt-pt': 'pt-PT', + ro: 'ro', + ru: 'ru', + sk: 'sk', + sl: 'sl', + sr: 'sr', + sv: 'sv', + te: 'te', + th: 'th', + tr: 'tr', + uk: 'uk', + vi: 'vi', + 'zh-cn': 'zh-CN', + 'zh-tw': 'zh-TW', + pt: 'pt', + zh: 'zh', +} as const satisfies Record; + +/** Lazy-import a shipped locale pack when the tag is not already in the registry. */ +export async function loadLocale(tag: string): Promise | undefined> { + if (hasRegisteredI18n(tag)) return undefined; + for (const chainTag of localeLookupChain(tag)) { + if (hasRegisteredI18n(chainTag)) return undefined; + const loaderTag = loaderTagByNormalized[canonicalLocaleRegistryKey(chainTag) as keyof typeof loaderTagByNormalized]; + const load = loaderTag ? loaders[loaderTag] : undefined; + if (load) return (await load()).default; + } + return undefined; +} diff --git a/packages/core/src/core/i18n/locales/all.ts b/packages/core/src/core/i18n/locales/all.ts new file mode 100644 index 00000000..040f7b53 --- /dev/null +++ b/packages/core/src/core/i18n/locales/all.ts @@ -0,0 +1,115 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +import type { Translations } from '../types'; +import ar from './ar'; +import az from './az'; +import bg from './bg'; +import bn from './bn'; +import bs from './bs'; +import ca from './ca'; +import cs from './cs'; +import cy from './cy'; +import da from './da'; +import de from './de'; +import el from './el'; +import en from './en'; +import es from './es'; +import et from './et'; +import eu from './eu'; +import fa from './fa'; +import fi from './fi'; +import fr from './fr'; +import gd from './gd'; +import gl from './gl'; +import he from './he'; +import hi from './hi'; +import hr from './hr'; +import hu from './hu'; +import it from './it'; +import ja from './ja'; +import ko from './ko'; +import lv from './lv'; +import mr from './mr'; +import nb from './nb'; +import ne from './ne'; +import nl from './nl'; +import nn from './nn'; +import oc from './oc'; +import pl from './pl'; +import pt from './pt'; +import pt_BR from './pt-BR'; +import pt_PT from './pt-PT'; +import ro from './ro'; +import ru from './ru'; +import sk from './sk'; +import sl from './sl'; +import sr from './sr'; +import sv from './sv'; +import te from './te'; +import th from './th'; +import tr from './tr'; +import uk from './uk'; +import vi from './vi'; +import zh from './zh'; +import zh_CN from './zh-CN'; +import zh_TW from './zh-TW'; + +/** Every built-in locale pack keyed by BCP 47 tag (includes `en` and shorthand aliases `pt` / `zh`). */ +export const all = { + en, + ar, + az, + bs, + bg, + bn, + ca, + cs, + cy, + da, + de, + el, + es, + et, + eu, + fa, + fi, + fr, + gd, + gl, + he, + hi, + hr, + hu, + it, + ja, + ko, + lv, + mr, + nb, + nl, + nn, + ne, + oc, + pl, + 'pt-BR': pt_BR, + 'pt-PT': pt_PT, + ro, + ru, + sk, + sl, + sr, + sv, + te, + th, + tr, + uk, + vi, + 'zh-CN': zh_CN, + 'zh-TW': zh_TW, + pt, + zh, +} as const satisfies Record>; + +export type LocaleTag = keyof typeof all; + +/** BCP 47 tags for every pack in {@link all}. */ +export const localeTags = Object.keys(all) as LocaleTag[]; diff --git a/packages/core/src/core/i18n/locales/ar.ts b/packages/core/src/core/i18n/locales/ar.ts new file mode 100644 index 00000000..81552d4f --- /dev/null +++ b/packages/core/src/core/i18n/locales/ar.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'تشغيل', + pause: 'إيقاف', + replay: 'إعادة التشغيل', + mute: 'كتم', + unmute: 'إلغاء الكتم', + seekForward: 'التخطي للأمام {seconds}', + seekBackward: 'الرجوع للخلف {seconds}', + enterFullscreen: 'ملء الشاشة', + exitFullscreen: 'الخروج من وضع ملء الشاشة', + enableCaptions: 'تفعيل التسميات التوضيحية', + disableCaptions: 'إيقاف التسميات التوضيحية', + enterPictureInPicture: 'صورة داخل صورة', + exitPictureInPicture: 'الخروج من وضع صورة داخل صورة', + playingLive: 'بث مباشر', + seekToLiveEdge: 'الانتقال إلى البث المباشر', + liveBadge: 'مباشر', + startCasting: 'بدء الإرسال', + stopCasting: 'إيقاف الإرسال', + connectingCast: 'جارٍ الاتصال', + seek: 'تقديم', + volume: 'مستوى الصوت', + timeCurrent: 'الوقت الحالي', + timeDuration: 'المدة', + timeRemaining: 'الوقت المتبقي', + timeRemainingPhrase: 'متبقٍ {duration}', + playbackRateAria: 'سرعة التشغيل {rate}', + timeSliderValueTextRange: '{current} من {duration}', + volumeSliderValueTextMuted: '{percent}، مكتوم', + indicatorMuted: 'صامت', + indicatorVolume: 'مستوى الصوت', + indicatorVolumeWithValue: 'مستوى الصوت {value}', + indicatorCaptionsOn: 'الترجمة مفعّلة', + indicatorCaptionsOff: 'الترجمة متوقفة', + indicatorPaused: 'متوقف مؤقتاً', + indicatorPlaying: 'قيد التشغيل', + indicatorFullscreen: 'ملء الشاشة', + indicatorExitFullscreen: 'الخروج من ملء الشاشة', + indicatorPictureInPicture: 'صورة داخل صورة', + indicatorExitPictureInPicture: 'الخروج من صورة داخل صورة', + mediaErrorAborted: 'لقد ألغيت تشغيل الفيديو', + mediaErrorNetwork: 'تسبب خطأ في الشبكة بفشل تحميل الفيديو بالكامل.', + mediaErrorDecode: + 'تم إيقاف تشغيل الفيديو بسبب عدم صلاحية الفيديو أو لأن الفيديو المستخدم يستخدم ميزات غير مدعومة من متصفحك.', + mediaErrorSrcNotSupported: + 'لا يمكن تحميل الفيديو بسبب فشل في الخادم أو الشبكة ، أو بسبب عدم إمكانية قراءة تنسيق الفيديو.', + mediaErrorEncrypted: 'الوسائط مشفرة وليس لدينا الرموز اللازمة لفك شفرتها.', + mediaErrorCustom: '', + errorDialogTitle: 'حدث خطأ ما.', + errorDialogDismiss: 'أغلق', + mediaErrorFallback: 'حدث خطأ. يُرجى المحاولة مرة أخرى.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/az.ts b/packages/core/src/core/i18n/locales/az.ts new file mode 100644 index 00000000..cfe32fb1 --- /dev/null +++ b/packages/core/src/core/i18n/locales/az.ts @@ -0,0 +1,53 @@ +import type { Translations } from '../types'; + +export default { + play: 'Oynat', + pause: 'Pauza', + replay: 'Yenidən oynat', + mute: 'Səssizi qoş', + unmute: 'Səssizi söndür', + seekForward: '{seconds} saniyə qabağa keçin', + seekBackward: '{seconds} saniyə geriyə keçin', + enterFullscreen: 'Tam ekran', + exitFullscreen: 'Tam ekrandan çıx', + enableCaptions: 'Altyazıları aktiv et', + disableCaptions: 'Altyazıları söndür', + enterPictureInPicture: 'Şəkil içində şəkil rejimi', + exitPictureInPicture: 'Şəkil içində şəkil rejimindən çıxın', + playingLive: 'Canlı yayımda', + seekToLiveEdge: 'Canlı yayıma keç', + liveBadge: 'Canlı', + startCasting: 'Yayımı başlat', + stopCasting: 'Yayımı durdur', + connectingCast: 'Qoşulur', + seek: 'Sürüşdür', + volume: 'Səs Səviyyəsi', + timeCurrent: 'Cari Vaxt', + timeDuration: 'Müddət', + timeRemaining: 'Qalan vaxt', + timeRemainingPhrase: 'Qalan {duration}', + playbackRateAria: 'Oynatma sürəti {rate}', + timeSliderValueTextRange: '{current} / {duration}', + volumeSliderValueTextMuted: '{percent}, səssiz', + indicatorMuted: 'Səssiz', + indicatorVolume: 'Səs', + indicatorVolumeWithValue: 'Səs {value}', + indicatorCaptionsOn: 'Başlıqlar aktiv', + indicatorCaptionsOff: 'Başlıqlar söndürülüb', + indicatorPaused: 'Dayandırılıb', + indicatorPlaying: 'Oynadılır', + indicatorFullscreen: 'Tam ekran', + indicatorExitFullscreen: 'Tam ekrandan çıx', + indicatorPictureInPicture: 'Şəkil içində şəkil', + indicatorExitPictureInPicture: 'Şəkil içində şəkildən çıxın', + mediaErrorAborted: 'Siz medianın oxudulmasını dayandırdınız', + mediaErrorNetwork: 'Şəbəkə xətası səbəbindən medianın endirilməsi yarıda qaldı.', + mediaErrorDecode: + 'Media faylının korlanması səbəbilə və ya media faylın brauzerinizin dəstəkləmədiyi funksiyalardan istifadə etdiyinə görə medianın oxudulması dayandırılıb.', + mediaErrorSrcNotSupported: 'Yükləmə xətası.', + mediaErrorEncrypted: 'Media faylı şifrələnib və onun şifrəsini açmaq üçün açarlar yoxdur.', + mediaErrorCustom: '', + errorDialogTitle: 'Bir şey yanlış getdi.', + errorDialogDismiss: 'Bağla', + mediaErrorFallback: 'Xəta baş verdi. Yenidən cəhd edin.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/bg.ts b/packages/core/src/core/i18n/locales/bg.ts new file mode 100644 index 00000000..b5f92a89 --- /dev/null +++ b/packages/core/src/core/i18n/locales/bg.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Възпроизвеждане', + pause: 'Пауза', + replay: 'Повтори', + mute: 'Без звук', + unmute: 'Със звук', + seekForward: 'Превъртане напред с {seconds} секунди', + seekBackward: 'Превъртане назад с {seconds} секунди', + enterFullscreen: 'Цял екран', + exitFullscreen: 'Спиране на цял екран', + enableCaptions: 'Включи субтитри', + disableCaptions: 'Изключи субтитри', + enterPictureInPicture: 'Картина в картина', + exitPictureInPicture: 'Изход от картина в картина', + playingLive: 'На живо', + seekToLiveEdge: 'Към живото предаване', + liveBadge: 'На живо', + startCasting: 'Започни излъчване', + stopCasting: 'Спри излъчването', + connectingCast: 'Свързване', + seek: 'Превъртане', + volume: 'Сила на звука', + timeCurrent: 'Текущо време', + timeDuration: 'Продължителност', + timeRemaining: 'Оставащо време', + timeRemainingPhrase: 'Остават {duration}', + playbackRateAria: 'Скорост на възпроизвеждане {rate}', + timeSliderValueTextRange: '{current} от {duration}', + volumeSliderValueTextMuted: '{percent}, без звук', + indicatorMuted: 'Без звук', + indicatorVolume: 'Сила на звука', + indicatorVolumeWithValue: 'Сила на звука {value}', + indicatorCaptionsOn: 'Субтитри включени', + indicatorCaptionsOff: 'Субтитри изключени', + indicatorPaused: 'На пауза', + indicatorPlaying: 'Възпроизвеждане', + indicatorFullscreen: 'Цял екран', + indicatorExitFullscreen: 'Изход от цял екран', + indicatorPictureInPicture: 'Картина в картина', + indicatorExitPictureInPicture: 'Изход от картина в картина', + mediaErrorAborted: 'Спряхте възпроизвеждането на видеото', + mediaErrorNetwork: 'Грешка в мрежата провали изтеглянето на видеото.', + mediaErrorDecode: + 'Възпроизвеждането на видеото беше прекъснато заради проблем с файла или защото видеото използва опции които браузърът Ви не поддържа.', + mediaErrorSrcNotSupported: + 'Видеото не може да бъде заредено заради проблем със сървъра или мрежата или защото този формат не е поддържан.', + mediaErrorEncrypted: 'Медията е шифрована и няма ключове за дешифриране.', + mediaErrorCustom: '', + errorDialogTitle: 'Нещо се обърка.', + errorDialogDismiss: 'OK', + mediaErrorFallback: 'Възникна грешка. Моля, опитайте отново.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/bn.ts b/packages/core/src/core/i18n/locales/bn.ts new file mode 100644 index 00000000..e9e18f02 --- /dev/null +++ b/packages/core/src/core/i18n/locales/bn.ts @@ -0,0 +1,53 @@ +import type { Translations } from '../types'; + +export default { + play: 'প্লে করুন', + pause: 'বিরাম', + replay: 'রিপ্লে করুন', + mute: 'মিউট', + unmute: 'আনমিউট', + seekForward: '{seconds} সেকেন্ড এগিয়ে যান', + seekBackward: '{seconds} সেকেন্ড পিছিয়ে যান', + enterFullscreen: 'পূর্ণ স্ক্রীন', + exitFullscreen: 'পূর্ণ স্ক্রীন থেকে বেরিয়ে আসুন', + enableCaptions: 'ক্যাপশন', + disableCaptions: 'ক্যাপশন বন্ধ করুন', + enterPictureInPicture: 'পিকচার-ইন-পিকচার', + exitPictureInPicture: 'পিকচার-ইন-পিকচার থেকে প্রস্থান করুন', + playingLive: 'লাইভ চলছে', + seekToLiveEdge: 'লাইভে যান', + liveBadge: 'লাইভ', + startCasting: 'কাস্টিং শুরু করুন', + stopCasting: 'কাস্টিং বন্ধ করুন', + connectingCast: 'সংযুক্ত হচ্ছে', + seek: 'অনুসন্ধান', + volume: 'ভলিউম লেভেল', + timeCurrent: 'বর্তমান সময়', + timeDuration: 'ব্যাপ্তিকাল', + timeRemaining: 'অবশিষ্ট সময়', + timeRemainingPhrase: 'বাকি {duration}', + playbackRateAria: 'প্লেব্যাক রেট {rate}', + timeSliderValueTextRange: '{duration} এর মধ্যে {current}', + volumeSliderValueTextMuted: '{percent}, নিঃশব্দ', + indicatorMuted: 'নিঃশব্দ', + indicatorVolume: 'ভলিউম', + indicatorVolumeWithValue: 'ভলিউম {value}', + indicatorCaptionsOn: 'ক্যাপশন চালু', + indicatorCaptionsOff: 'ক্যাপশন বন্ধ', + indicatorPaused: 'বিরাম', + indicatorPlaying: 'চলছে', + indicatorFullscreen: 'পূর্ণ স্ক্রীন', + indicatorExitFullscreen: 'পূর্ণ স্ক্রীন থেকে বেরিয়ে আসুন', + indicatorPictureInPicture: 'পিকচার ইন পিকচার', + indicatorExitPictureInPicture: 'পিকচার ইন পিকচার থেকে বেরিয়ে আসুন', + mediaErrorAborted: 'আপনি মিডিয়া প্লেব্যাক বাতিল করেছেন', + mediaErrorNetwork: 'একটি নেটওয়ার্ক ত্রুটির কারণে মিডিয়া ডাউনলোড আংশিকভাবে ব্যর্থ হয়েছে৷', + mediaErrorDecode: + 'মিডিয়া প্লেব্যাক একটি সমস্যার কারণে বা মিডিয়া ব্যবহার করা বৈশিষ্ট্যগুলি আপনার ব্রাউজার সমর্থন করে না বলে বাতিল করা হয়েছে৷', + mediaErrorSrcNotSupported: 'মিডিয়া লোড করা যায়নি, হয় সার্ভার বা নেটওয়ার্ক ব্যর্থ হওয়ার কারণে বা ফর্ম্যাটটি সমর্থিত নয়।', + mediaErrorEncrypted: 'মিডিয়া এনক্রিপ্ট করা হয়েছে এবং এটি ডিক্রিপ্ট করার সমাধান আমাদের কাছে নেই।', + mediaErrorCustom: '', + errorDialogTitle: 'কিছু একটা ভুল হয়েছে।', + errorDialogDismiss: 'বন্ধ করুন', + mediaErrorFallback: 'একটি ত্রুটি ঘটেছে। আবার চেষ্টা করুন।', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/bs.ts b/packages/core/src/core/i18n/locales/bs.ts new file mode 100644 index 00000000..7cf73bea --- /dev/null +++ b/packages/core/src/core/i18n/locales/bs.ts @@ -0,0 +1,52 @@ +import type { Translations } from '../types'; + +export default { + play: 'Pusti', + pause: 'Pauza', + replay: 'Ponovi', + mute: 'Prigušen', + unmute: 'Ne-prigušen', + seekForward: 'Premotaj naprijed {seconds} sekundi', + seekBackward: 'Premotaj nazad {seconds} sekundi', + enterFullscreen: 'Puni ekran', + exitFullscreen: 'Izađi iz cijelog ekrana', + enableCaptions: 'Uključi titlove', + disableCaptions: 'Isključi titlove', + enterPictureInPicture: 'Slika u slici', + exitPictureInPicture: 'Izlaz iz slike u slici', + playingLive: 'Reprodukcija uživo', + seekToLiveEdge: 'Idi na live', + liveBadge: 'Uživo', + startCasting: 'Pokreni emitovanje', + stopCasting: 'Zaustavi emitovanje', + connectingCast: 'Povezivanje', + seek: 'Premotavanje', + volume: 'Glasnoća', + timeCurrent: 'Trenutno vrijeme', + timeDuration: 'Vrijeme trajanja', + timeRemaining: 'Preostalo vrijeme', + timeRemainingPhrase: 'Preostalo {duration}', + playbackRateAria: 'Stopa reprodukcije {rate}', + timeSliderValueTextRange: '{current} od {duration}', + volumeSliderValueTextMuted: '{percent}, isključen zvuk', + indicatorMuted: 'Isključen zvuk', + indicatorVolume: 'Glasnoća', + indicatorVolumeWithValue: 'Glasnoća {value}', + indicatorCaptionsOn: 'Titlovi uključeni', + indicatorCaptionsOff: 'Titlovi isključeni', + indicatorPaused: 'Pauzirano', + indicatorPlaying: 'Reprodukcija', + indicatorFullscreen: 'Puni ekran', + indicatorExitFullscreen: 'Izlaz iz punog ekrana', + indicatorPictureInPicture: 'Slika u slici', + indicatorExitPictureInPicture: 'Izlaz iz slike u slici', + mediaErrorAborted: 'Isključili ste reprodukciju videa.', + mediaErrorNetwork: 'Video se prestao preuzimati zbog greške na mreži.', + mediaErrorDecode: 'Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.', + mediaErrorSrcNotSupported: 'Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.', + mediaErrorEncrypted: 'Medij je šifriran i nema ključeva za dešifriranje.', + mediaErrorCustom: '', + errorDialogTitle: 'Nešto je pošlo po krivu.', + errorDialogDismiss: 'OK', + mediaErrorFallback: 'Došlo je do greške. Pokušajte ponovo.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/ca.ts b/packages/core/src/core/i18n/locales/ca.ts new file mode 100644 index 00000000..7b344080 --- /dev/null +++ b/packages/core/src/core/i18n/locales/ca.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Reproduir', + pause: 'Pausa', + replay: 'Repetir', + mute: 'Silenciar', + unmute: 'Activar el so', + seekForward: 'Salta endavant {seconds} segons', + seekBackward: 'Salta enrere {seconds} segons', + enterFullscreen: 'Pantalla completa', + exitFullscreen: 'Sortir de pantalla completa', + enableCaptions: 'Activa subtítols', + disableCaptions: 'Desactiva subtítols', + enterPictureInPicture: 'Imatge en imatge', + exitPictureInPicture: 'Sortir de la imatge en imatge', + playingLive: 'Reproducció en directe', + seekToLiveEdge: 'Anar al directe', + liveBadge: 'En directe', + startCasting: 'Comença a emetre', + stopCasting: 'Atura la transmissió', + connectingCast: 'Connectant', + seek: 'Desplaçament', + volume: 'Nivell de volum', + timeCurrent: 'Temps actual', + timeDuration: 'Durada', + timeRemaining: 'Temps restant', + timeRemainingPhrase: 'Queden {duration}', + playbackRateAria: 'Velocitat de reproducció {rate}', + timeSliderValueTextRange: '{current} de {duration}', + volumeSliderValueTextMuted: '{percent}, silenciat', + indicatorMuted: 'Silenciat', + indicatorVolume: 'Volum', + indicatorVolumeWithValue: 'Volum {value}', + indicatorCaptionsOn: 'Llegendes activades', + indicatorCaptionsOff: 'Llegendes desactivades', + indicatorPaused: 'En pausa', + indicatorPlaying: 'Reproduint', + indicatorFullscreen: 'Pantalla completa', + indicatorExitFullscreen: 'Surt de pantalla completa', + indicatorPictureInPicture: 'Imatge en imatge', + indicatorExitPictureInPicture: 'Surt de la imatge en imatge', + mediaErrorAborted: 'Has interromput la reproducció del contingut', + mediaErrorNetwork: 'Un error de xarxa ha interromput la descàrrega del contingut.', + mediaErrorDecode: + "La reproducció del contingut s'ha interromput a causa d'un problema de corrupció o perquè el contingut fa servir funcions que el teu navegador no suporta.", + mediaErrorSrcNotSupported: + "No s'ha pogut carregar el contingut, ja sigui perquè el servidor o la xarxa han fallat o perquè el format no està suportat.", + mediaErrorEncrypted: 'El contingut està xifrat i no disposem de les claus per desxifrar-lo.', + mediaErrorCustom: '', + errorDialogTitle: 'Alguna cosa ha anat malament.', + errorDialogDismiss: 'Tancar', + mediaErrorFallback: "S'ha produït un error. Torneu-ho a intentar.", +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/cs.ts b/packages/core/src/core/i18n/locales/cs.ts new file mode 100644 index 00000000..ea649535 --- /dev/null +++ b/packages/core/src/core/i18n/locales/cs.ts @@ -0,0 +1,53 @@ +import type { Translations } from '../types'; + +export default { + play: 'Přehrát', + pause: 'Pozastavit', + replay: 'Přehrát znovu', + mute: 'Ztlumit', + unmute: 'Zrušit ztlumení', + seekForward: 'Posunout vpřed o {seconds} sekund', + seekBackward: 'Posunout zpět o {seconds} sekund', + enterFullscreen: 'Celá obrazovka', + exitFullscreen: 'Ukončit režim celé obrazovky', + enableCaptions: 'Zapnout titulky', + disableCaptions: 'Vypnout titulky', + enterPictureInPicture: 'Obraz v obraze', + exitPictureInPicture: 'Ukončit obraz v obraze', + playingLive: 'Přehrává se živě', + seekToLiveEdge: 'Přejít na živé vysílání', + liveBadge: 'Živě', + startCasting: 'Začít přenášet', + stopCasting: 'Zastavit přenos', + connectingCast: 'Připojování', + seek: 'Posun', + volume: 'Hlasitost', + timeCurrent: 'Aktuální čas', + timeDuration: 'Doba trvání', + timeRemaining: 'Zbývající čas', + timeRemainingPhrase: 'Zbývá {duration}', + playbackRateAria: 'Rychlost přehrávání {rate}', + timeSliderValueTextRange: '{current} z {duration}', + volumeSliderValueTextMuted: '{percent}, ztlumeno', + indicatorMuted: 'Ztlumeno', + indicatorVolume: 'Hlasitost', + indicatorVolumeWithValue: 'Hlasitost {value}', + indicatorCaptionsOn: 'Popisky zapnuty', + indicatorCaptionsOff: 'Popisky vypnuty', + indicatorPaused: 'Pozastaveno', + indicatorPlaying: 'Přehrávání', + indicatorFullscreen: 'Celá obrazovka', + indicatorExitFullscreen: 'Ukončit celou obrazovku', + indicatorPictureInPicture: 'Obraz v obraze', + indicatorExitPictureInPicture: 'Ukončit obraz v obraze', + mediaErrorAborted: 'Přehrávání videa bylo přerušeno.', + mediaErrorNetwork: 'Video nemohlo být načteno kvůli chybě v síti.', + mediaErrorDecode: 'Váš prohlížeč nepodporuje tento formát videa.', + mediaErrorSrcNotSupported: + 'Video nemohlo být načteno, buď kvůli chybě serveru, sítě nebo proto, že daný formát není podporován.', + mediaErrorEncrypted: 'Chyba při dešifrování videa.', + mediaErrorCustom: '', + errorDialogTitle: 'Něco se pokazilo.', + errorDialogDismiss: 'Zavřít', + mediaErrorFallback: 'Došlo k chybě. Zkuste to prosím znovu.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/cy.ts b/packages/core/src/core/i18n/locales/cy.ts new file mode 100644 index 00000000..92262e4f --- /dev/null +++ b/packages/core/src/core/i18n/locales/cy.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Chwarae', + pause: 'Oedi', + replay: 'Ailchwarae', + mute: 'Pylu', + unmute: 'Dad-bylu', + seekForward: 'Neidla ymlaen {seconds} eiliad', + seekBackward: 'Neidla yn ôl {seconds} eiliad', + enterFullscreen: 'Sgrîn Lawn', + exitFullscreen: 'Gadael sgrîn lawn', + enableCaptions: 'Galluogi capsiynau', + disableCaptions: 'Analluogi capsiynau', + enterPictureInPicture: 'Llun mewn llun', + exitPictureInPicture: 'Gadael llun mewn llun', + playingLive: 'Yn chwarae’n fyw', + seekToLiveEdge: 'Mynd i’r ymyl byw', + liveBadge: 'Yn fyw', + startCasting: 'Dechrau bwrw', + stopCasting: 'Stopio bwrw', + connectingCast: 'Cysylltu', + seek: 'Chwilio', + volume: 'Lefel Sain', + timeCurrent: 'Amser Cyfredol', + timeDuration: 'Parhad', + timeRemaining: 'Amser ar ôl', + timeRemainingPhrase: '{duration} yn weddill', + playbackRateAria: 'Cyfradd Chwarae {rate}', + timeSliderValueTextRange: '{current} o {duration}', + volumeSliderValueTextMuted: '{percent}, mud', + indicatorMuted: 'Mud', + indicatorVolume: 'Sain', + indicatorVolumeWithValue: 'Sain {value}', + indicatorCaptionsOn: 'Capsiynau ymlaen', + indicatorCaptionsOff: 'Capsiynau i ffwrdd', + indicatorPaused: 'Wedi oedi', + indicatorPlaying: 'Yn chwarae', + indicatorFullscreen: 'Sgrîn lawn', + indicatorExitFullscreen: 'Gadael sgrîn lawn', + indicatorPictureInPicture: 'Llun mewn llun', + indicatorExitPictureInPicture: 'Gadael llun mewn llun', + mediaErrorAborted: 'Atalwyd y fideo gennych', + mediaErrorNetwork: 'Mae gwall rhwydwaith wedi achosi methiant lawrlwytho.', + mediaErrorDecode: + "Atalwyd y fideo oherwydd problem llygredd data neu oherwydd nid yw'ch porwr yn cefnogi nodweddion penodol o'r fideo.", + mediaErrorSrcNotSupported: + "Ni lwythodd y fideo, oherwydd methiant gweinydd neu rwydwaith, neu achos nid yw'r system yn cefnogi'r fformat.", + mediaErrorEncrypted: "Mae'r fideo wedi ei amgryptio ac nid oes allweddion gennym.", + mediaErrorCustom: '', + errorDialogTitle: "Aeth rhywbeth o'i le.", + errorDialogDismiss: 'Cau', + mediaErrorFallback: 'Digwyddodd gwall. Ceisiwch eto.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/da.ts b/packages/core/src/core/i18n/locales/da.ts new file mode 100644 index 00000000..996fd302 --- /dev/null +++ b/packages/core/src/core/i18n/locales/da.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Afspil', + pause: 'Pause', + replay: 'Afspil igen', + mute: 'Uden lyd', + unmute: 'Med lyd', + seekForward: 'Spring {seconds} sekunder frem', + seekBackward: 'Spring {seconds} sekunder tilbage', + enterFullscreen: 'Fuldskærm', + exitFullscreen: 'Luk fuldskærm', + enableCaptions: 'Aktivér undertekster', + disableCaptions: 'Deaktiver undertekster', + enterPictureInPicture: 'Billede-i-billede', + exitPictureInPicture: 'Afslut billede-i-billede', + playingLive: 'Afspiller live', + seekToLiveEdge: 'Gå til live', + liveBadge: 'Live', + startCasting: 'Start afsendelse', + stopCasting: 'Stop afsendelse', + connectingCast: 'Forbinder', + seek: 'Spol', + volume: 'Lydstyrke', + timeCurrent: 'Aktuel tid', + timeDuration: 'Varighed', + timeRemaining: 'Resterende tid', + timeRemainingPhrase: '{duration} tilbage', + playbackRateAria: 'Afspilningsrate {rate}', + timeSliderValueTextRange: '{current} af {duration}', + volumeSliderValueTextMuted: '{percent}, lydløs', + indicatorMuted: 'Lydløs', + indicatorVolume: 'Lydstyrke', + indicatorVolumeWithValue: 'Lydstyrke {value}', + indicatorCaptionsOn: 'Undertekster til', + indicatorCaptionsOff: 'Undertekster fra', + indicatorPaused: 'Pauseret', + indicatorPlaying: 'Afspiller', + indicatorFullscreen: 'Fuldskærm', + indicatorExitFullscreen: 'Luk fuldskærm', + indicatorPictureInPicture: 'Billede i billede', + indicatorExitPictureInPicture: 'Afslut billede i billede', + mediaErrorAborted: 'Du afbrød videoafspilningen.', + mediaErrorNetwork: 'En netværksfejl fik download af videoen til at fejle.', + mediaErrorDecode: + 'Videoafspilningen blev afbrudt på grund af ødelagte data eller fordi videoen benyttede faciliteter som din browser ikke understøtter.', + mediaErrorSrcNotSupported: + 'Videoen kunne ikke indlæses, enten fordi serveren eller netværket fejlede, eller fordi formatet ikke er understøttet.', + mediaErrorEncrypted: 'Mediet er krypteret, og der er ingen nøgler til at dekryptere det.', + mediaErrorCustom: '', + errorDialogTitle: 'Noget gik galt.', + errorDialogDismiss: 'OK', + mediaErrorFallback: 'Der opstod en fejl. Prøv igen.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/de.ts b/packages/core/src/core/i18n/locales/de.ts new file mode 100644 index 00000000..6afe2809 --- /dev/null +++ b/packages/core/src/core/i18n/locales/de.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Wiedergabe', + pause: 'Pause', + replay: 'Erneut abspielen', + mute: 'Stumm schalten', + unmute: 'Ton einschalten', + seekForward: '{seconds} Sekunden vorwärts', + seekBackward: '{seconds} Sekunden zurück', + enterFullscreen: 'Vollbild', + exitFullscreen: 'Vollbildmodus beenden', + enableCaptions: 'Untertitel einschalten', + disableCaptions: 'Untertitel ausschalten', + enterPictureInPicture: 'Bild-im-Bild-Modus', + exitPictureInPicture: 'Bild-im-Bild-Modus beenden', + playingLive: 'Wird live wiedergegeben', + seekToLiveEdge: 'Zum Live-Rand springen', + liveBadge: 'Live', + startCasting: 'Übertragung starten', + stopCasting: 'Übertragung beenden', + connectingCast: 'Verbinden', + seek: 'Spule', + volume: 'Lautstärke', + timeCurrent: 'Aktueller Zeitpunkt', + timeDuration: 'Dauer', + timeRemaining: 'Verbleibende Zeit', + timeRemainingPhrase: 'Noch {duration}', + playbackRateAria: 'Wiedergabegeschwindigkeit {rate}', + timeSliderValueTextRange: '{current} von {duration}', + volumeSliderValueTextMuted: '{percent}, stummgeschaltet', + indicatorMuted: 'Stummgeschaltet', + indicatorVolume: 'Lautstärke', + indicatorVolumeWithValue: 'Lautstärke {value}', + indicatorCaptionsOn: 'Untertitel ein', + indicatorCaptionsOff: 'Untertitel aus', + indicatorPaused: 'Pausiert', + indicatorPlaying: 'Wird wiedergegeben', + indicatorFullscreen: 'Vollbild', + indicatorExitFullscreen: 'Vollbild beenden', + indicatorPictureInPicture: 'Bild-in-Bild', + indicatorExitPictureInPicture: 'Bild-in-Bild beenden', + mediaErrorAborted: 'Sie haben die Videowiedergabe abgebrochen.', + mediaErrorNetwork: 'Der Videodownload ist aufgrund eines Netzwerkfehlers fehlgeschlagen.', + mediaErrorDecode: + 'Die Videowiedergabe wurde entweder wegen eines Problems mit einem beschädigten Video oder wegen verwendeten Funktionen, die vom Browser nicht unterstützt werden, abgebrochen.', + mediaErrorSrcNotSupported: + 'Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.', + mediaErrorEncrypted: 'Die Entschlüsselungsschlüssel für den verschlüsselten Medieninhalt sind nicht verfügbar.', + mediaErrorCustom: '', + errorDialogTitle: 'Etwas ist schiefgelaufen.', + errorDialogDismiss: 'Schließen', + mediaErrorFallback: 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/el.ts b/packages/core/src/core/i18n/locales/el.ts new file mode 100644 index 00000000..a1a47b89 --- /dev/null +++ b/packages/core/src/core/i18n/locales/el.ts @@ -0,0 +1,55 @@ +import type { Translations } from '../types'; + +export default { + play: 'Aναπαραγωγή', + pause: 'Παύση', + replay: 'Επανάληψη', + mute: 'Σίγαση', + unmute: 'Kατάργηση σίγασης', + seekForward: 'Μεταβείτε μπροστά {seconds} δευτερόλεπτα', + seekBackward: 'Μεταβείτε πίσω {seconds} δευτερόλεπτα', + enterFullscreen: 'Πλήρης οθόνη', + exitFullscreen: 'Έξοδος από πλήρη οθόνη', + enableCaptions: 'Ενεργοποίηση υποτίτλων', + disableCaptions: 'Απενεργοποίηση υποτίτλων', + enterPictureInPicture: 'Εικόνα-μέσα-σε-Εικόνα', + exitPictureInPicture: 'Έξοδος από την Εικόνα-μέσα-σε-Εικόνα', + playingLive: 'Αναπαραγωγή ζωντανά', + seekToLiveEdge: 'Μετάβαση στο ζωντανό', + liveBadge: 'Ζωντανά', + startCasting: 'Έναρξη μετάδοσης', + stopCasting: 'Διακοπή μετάδοσης', + connectingCast: 'Σύνδεση', + seek: 'Μετακίνηση', + volume: 'Επίπεδο Ήχου', + timeCurrent: 'Τρέχων χρόνος', + timeDuration: 'Συνολικός χρόνος', + timeRemaining: 'Υπολοιπόμενος χρόνος', + timeRemainingPhrase: 'Απομένουν {duration}', + playbackRateAria: 'Ρυθμός αναπαραγωγής {rate}', + timeSliderValueTextRange: '{current} από {duration}', + volumeSliderValueTextMuted: '{percent}, σε σίγαση', + indicatorMuted: 'Σε σίγαση', + indicatorVolume: 'Ένταση', + indicatorVolumeWithValue: 'Ένταση {value}', + indicatorCaptionsOn: 'Λεζάντες ενεργές', + indicatorCaptionsOff: 'Λεζάντες ανενεργές', + indicatorPaused: 'Σε παύση', + indicatorPlaying: 'Αναπαραγωγή', + indicatorFullscreen: 'Πλήρης οθόνη', + indicatorExitFullscreen: 'Έξοδος από πλήρη οθόνη', + indicatorPictureInPicture: 'Εικόνα μέσα σε εικόνα', + indicatorExitPictureInPicture: 'Έξοδος από εικόνα μέσα σε εικόνα', + mediaErrorAborted: 'Ακυρώσατε την αναπαραγωγή', + mediaErrorNetwork: 'Ένα σφάλμα δικτύου προκάλεσε την αποτυχία μεταφόρτωσης του αρχείου προς αναπαραγωγή.', + mediaErrorDecode: + 'Η αναπαραγωγή ακυρώθηκε είτε λόγω κατεστραμμένου αρχείου, είτε γιατί το αρχείο απαιτεί λειτουργίες που δεν υποστηρίζονται από το πρόγραμμα περιήγησης που χρησιμοποιείτε.', + mediaErrorSrcNotSupported: + 'Το αρχείο προς αναπαραγωγή δεν ήταν δυνατό να φορτωθεί είτε γιατί υπήρξε σφάλμα στον διακομιστή ή το δίκτυο, είτε γιατί ο τύπος του αρχείου δεν υποστηρίζεται.', + mediaErrorEncrypted: + 'Το αρχείο προς αναπαραγωγή είναι κρυπτογραφημένo και δεν υπάρχουν τα απαραίτητα κλειδιά αποκρυπτογράφησης.', + mediaErrorCustom: '', + errorDialogTitle: 'Κάτι πήγε στραβά.', + errorDialogDismiss: 'Κλείσιμο', + mediaErrorFallback: 'Παρουσιάστηκε σφάλμα. Δοκιμάστε ξανά.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/es.ts b/packages/core/src/core/i18n/locales/es.ts new file mode 100644 index 00000000..e407f4ed --- /dev/null +++ b/packages/core/src/core/i18n/locales/es.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Reproducir', + pause: 'Pausa', + replay: 'Volver a reproducir', + mute: 'Desactivar el sonido', + unmute: 'Activar el sonido', + seekForward: 'Avanza {seconds} segundos', + seekBackward: 'Retrocede {seconds} segundos', + enterFullscreen: 'Pantalla completa', + exitFullscreen: 'Salir de pantalla completa', + enableCaptions: 'Activar subtítulos', + disableCaptions: 'Desactivar subtítulos', + enterPictureInPicture: 'Imagen sobre imagen', + exitPictureInPicture: 'Salir de imagen sobre imagen', + playingLive: 'Reproduciendo en directo', + seekToLiveEdge: 'Ir al directo', + liveBadge: 'Directo', + startCasting: 'Iniciar transmisión', + stopCasting: 'Detener transmisión', + connectingCast: 'Conectando', + seek: 'Buscar', + volume: 'Nivel de volumen', + timeCurrent: 'Tiempo reproducido', + timeDuration: 'Duración total', + timeRemaining: 'Tiempo restante', + timeRemainingPhrase: 'Quedan {duration}', + playbackRateAria: 'Velocidad de reproducción {rate}', + timeSliderValueTextRange: '{current} de {duration}', + volumeSliderValueTextMuted: '{percent}, silenciado', + indicatorMuted: 'Silenciado', + indicatorVolume: 'Volumen', + indicatorVolumeWithValue: 'Volumen {value}', + indicatorCaptionsOn: 'Subtítulos activados', + indicatorCaptionsOff: 'Subtítulos desactivados', + indicatorPaused: 'En pausa', + indicatorPlaying: 'Reproduciendo', + indicatorFullscreen: 'Pantalla completa', + indicatorExitFullscreen: 'Salir de pantalla completa', + indicatorPictureInPicture: 'Imagen en imagen', + indicatorExitPictureInPicture: 'Salir de imagen en imagen', + mediaErrorAborted: 'Ha interrumpido la reproducción del vídeo.', + mediaErrorNetwork: 'Un error de red ha interrumpido la descarga del vídeo.', + mediaErrorDecode: + 'La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.', + mediaErrorSrcNotSupported: + 'No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.', + mediaErrorEncrypted: 'El material audiovisual está cifrado y no tenemos las claves para descifrarlo.', + mediaErrorCustom: '', + errorDialogTitle: 'Algo ha salido mal.', + errorDialogDismiss: 'Cerrar', + mediaErrorFallback: 'Se ha producido un error. Inténtalo de nuevo.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/et.ts b/packages/core/src/core/i18n/locales/et.ts new file mode 100644 index 00000000..8397523d --- /dev/null +++ b/packages/core/src/core/i18n/locales/et.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Esita', + pause: 'Paus', + replay: 'Esita uuesti', + mute: 'Vaigista', + unmute: 'Lõpeta vaigistus', + seekForward: 'Liigu edasi {seconds} sekundit', + seekBackward: 'Liigu tagasi {seconds} sekundit', + enterFullscreen: 'Täisekraan', + exitFullscreen: 'Välju täisekraanist', + enableCaptions: 'Lülita subtiitrid sisse', + disableCaptions: 'Lülita subtiitrid välja', + enterPictureInPicture: 'Pilt pildis', + exitPictureInPicture: 'Välju funktsioonist pilt pildis', + playingLive: 'Mängib reaalajas', + seekToLiveEdge: 'Mine otseülekande äärele', + liveBadge: 'Otse', + startCasting: 'Alusta ülekandmist', + stopCasting: 'Lõpeta ülekandmine', + connectingCast: 'Ühendumine', + seek: 'Kerimine', + volume: 'Helitugevuse tase', + timeCurrent: 'Praegune aeg', + timeDuration: 'Kestus', + timeRemaining: 'Järelejäänud aeg', + timeRemainingPhrase: 'Jäänud {duration}', + playbackRateAria: 'Taasesituse kiirus {rate}', + timeSliderValueTextRange: '{current} / {duration}', + volumeSliderValueTextMuted: '{percent}, vaigistatud', + indicatorMuted: 'Vaigistatud', + indicatorVolume: 'Helitugevus', + indicatorVolumeWithValue: 'Helitugevus {value}', + indicatorCaptionsOn: 'Pealdised sees', + indicatorCaptionsOff: 'Pealdised väljas', + indicatorPaused: 'Pausitud', + indicatorPlaying: 'Esitamine', + indicatorFullscreen: 'Täisekraan', + indicatorExitFullscreen: 'Välju täisekraanist', + indicatorPictureInPicture: 'Pilt pildis', + indicatorExitPictureInPicture: 'Välju funktsioonist pilt pildis', + mediaErrorAborted: 'Katkestasid taasesituse', + mediaErrorNetwork: 'Võrguvea tõttu nurjus meediumifaili allalaadimine poole pealt.', + mediaErrorDecode: + 'Meediumifaili taasesitamine katkestati, kuna fail on rikutud või see kasutab funktsiooni, mida sinu brauser ei toeta.', + mediaErrorSrcNotSupported: + 'Seda meediumifaili ei õnnestunud laadida, kuna serveris või võrgus esines tõrge või kuna vormingut ei toetata.', + mediaErrorEncrypted: 'See meediumifail on krüpteeritud ja meil pole dekrüpteerimiseks vajalikku võtit.', + mediaErrorCustom: '', + errorDialogTitle: 'Midagi läks valesti.', + errorDialogDismiss: 'Sule', + mediaErrorFallback: 'Esines viga. Palun proovige uuesti.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/eu.ts b/packages/core/src/core/i18n/locales/eu.ts new file mode 100644 index 00000000..454806c3 --- /dev/null +++ b/packages/core/src/core/i18n/locales/eu.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Hasi', + pause: 'Gelditu', + replay: 'Berriz hasi', + mute: 'Ixildu', + unmute: 'Soinua jarri', + seekForward: 'Joan aurrera {seconds} segundo', + seekBackward: 'Joan atzera {seconds} segundo', + enterFullscreen: 'Pantaila osoa', + exitFullscreen: 'Irten pantaila osotik', + enableCaptions: 'Aktibatu azpitituluak', + disableCaptions: 'Desaktibatu azpitituluak', + enterPictureInPicture: 'Irudiz-irudi', + exitPictureInPicture: 'Irten irudiz-irudiztik', + playingLive: 'Zuzenean erreproduzitzen', + seekToLiveEdge: 'Zuzeneko ertzeraino joan', + liveBadge: 'Zuzenean', + startCasting: 'Hasi emankizuna', + stopCasting: 'Gelditu emankizuna', + connectingCast: 'Konektatzen', + seek: 'Bilatu', + volume: 'Bolumen maila', + timeCurrent: 'Uneko denbora', + timeDuration: 'Iraupena', + timeRemaining: 'Gelditzen den denbora', + timeRemainingPhrase: 'Geratzen den {duration}', + playbackRateAria: 'Abiadura {rate}', + timeSliderValueTextRange: '{current} / {duration}', + volumeSliderValueTextMuted: '{percent}, isilarazia', + indicatorMuted: 'Isilarazia', + indicatorVolume: 'Bolumena', + indicatorVolumeWithValue: 'Bolumena {value}', + indicatorCaptionsOn: 'Oharrak aktibo', + indicatorCaptionsOff: 'Oharrak ez aktibo', + indicatorPaused: 'Geldituta', + indicatorPlaying: 'Erreproduzitzen', + indicatorFullscreen: 'Pantaila osoa', + indicatorExitFullscreen: 'Irten pantaila osotik', + indicatorPictureInPicture: 'Irudiz irudi', + indicatorExitPictureInPicture: 'Irten irudiz irudiztik', + mediaErrorAborted: 'Bertan behera utzi duzu', + mediaErrorNetwork: 'Sare errore batek deskargak huts egitea eragin du.', + mediaErrorDecode: + 'Bertan behera gelditu da fitxategia ondo ez dagoelako edo zure nabigatzailean erabili ezin diren ezaugarriak dituelako.', + mediaErrorSrcNotSupported: + 'Media ezin izan da kargatu, zerbitzariak edo sareak huts egin duelako edo formatu horretako media erabili ezin delako.', + mediaErrorEncrypted: 'Media zifratuta dago eta ez ditugu beharrezko gakoak.', + mediaErrorCustom: '', + errorDialogTitle: 'Zerbait gaizki joan da.', + errorDialogDismiss: 'Itxi', + mediaErrorFallback: 'Errore bat gertatu da. Saiatu berriro.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/fa.ts b/packages/core/src/core/i18n/locales/fa.ts new file mode 100644 index 00000000..97ec0173 --- /dev/null +++ b/packages/core/src/core/i18n/locales/fa.ts @@ -0,0 +1,53 @@ +import type { Translations } from '../types'; + +export default { + play: 'پخش', + pause: 'توقف', + replay: 'پخش مجدد', + mute: 'بی‌صدا', + unmute: 'صدادار', + seekForward: '{seconds} ثانیه بعد', + seekBackward: '{seconds} ثانیه قبل', + enterFullscreen: 'تمام‌صفحه', + exitFullscreen: 'غیر تمام‌صفحه', + enableCaptions: 'فعال‌سازی زیرنویس', + disableCaptions: 'غیرفعال‌سازی زیرنویس', + enterPictureInPicture: 'تصویر در تصویر', + exitPictureInPicture: 'خروج از حالت تصویر در تصویر', + playingLive: 'پخش زنده', + seekToLiveEdge: 'رفتن به پخش زنده', + liveBadge: 'زنده', + startCasting: 'شروع پخش به تلویزیون', + stopCasting: 'توقف پخش به تلویزیون', + connectingCast: 'در حال اتصال', + seek: 'جستجو', + volume: 'سطح صدا', + timeCurrent: 'زمان فعلی', + timeDuration: 'مدت', + timeRemaining: 'زمان باقی‌مانده', + timeRemainingPhrase: '{duration} باقی‌مانده', + playbackRateAria: 'سرعت پخش {rate}', + timeSliderValueTextRange: '{current} از {duration}', + volumeSliderValueTextMuted: '{percent}, بی‌صدا', + indicatorMuted: 'بی‌صدا', + indicatorVolume: 'صدا', + indicatorVolumeWithValue: 'صدا {value}', + indicatorCaptionsOn: 'توضیحات روشن', + indicatorCaptionsOff: 'توضیحات خاموش', + indicatorPaused: 'متوقف شده', + indicatorPlaying: 'در حال پخش', + indicatorFullscreen: 'تمام‌صفحه', + indicatorExitFullscreen: 'خروج از تمام‌صفحه', + indicatorPictureInPicture: 'تصویر در تصویر', + indicatorExitPictureInPicture: 'خروج از حالت تصویر در تصویر', + mediaErrorAborted: 'شما پخش رسانه را قطع نمودید', + mediaErrorNetwork: 'وقوع مشکلی در شبکه باعث اختلال در دانلود رسانه شد.', + mediaErrorDecode: 'پخش رسانه به‌علت اشکال در آن یا عدم پشتیبانی مرورگر شما قطع شد.', + mediaErrorSrcNotSupported: + 'رسانه قابل بارگیری نیست. ممکن است مشکلی در شبکه یا سرور رخ داده باشد یا قالب رسانه در دستگاه شما پشتیبانی نشود.', + mediaErrorEncrypted: 'این رسانه رمزنگاری شده‌است و کلیدهای رمزگشایی آن موجود نیست.', + mediaErrorCustom: '', + errorDialogTitle: 'مشکلی پیش آمد.', + errorDialogDismiss: 'بستن', + mediaErrorFallback: 'خطایی رخ داد. لطفاً دوباره امتحان کنید.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/fi.ts b/packages/core/src/core/i18n/locales/fi.ts new file mode 100644 index 00000000..82608f20 --- /dev/null +++ b/packages/core/src/core/i18n/locales/fi.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Toista', + pause: 'Keskeytä toisto', + replay: 'Toista uudelleen', + mute: 'Mykistä', + unmute: 'Poista mykistys', + seekForward: 'Hyppää eteenpäin {seconds} sekuntia', + seekBackward: 'Hyppää taaksepäin {seconds} sekuntia', + enterFullscreen: 'Koko näytön tila', + exitFullscreen: 'Poistu koko näytön tilasta', + enableCaptions: 'Ota tekstitykset käyttöön', + disableCaptions: 'Poista tekstitykset käytöstä', + enterPictureInPicture: 'Kuva kuvassa -tila', + exitPictureInPicture: 'Poistu kuva kuvassa -tilasta', + playingLive: 'Toistetaan livenä', + seekToLiveEdge: 'Siirry liveen', + liveBadge: 'Live', + startCasting: 'Aloita lähetys', + stopCasting: 'Lopeta lähetys', + connectingCast: 'Yhdistetään', + seek: 'Kelaa', + volume: 'Äänenvoimakkuus', + timeCurrent: 'Tämänhetkinen aika', + timeDuration: 'Kokonaiskesto', + timeRemaining: 'Jäljellä oleva aika', + timeRemainingPhrase: '{duration} jäljellä', + playbackRateAria: 'Toistonopeus {rate}', + timeSliderValueTextRange: '{current} / {duration}', + volumeSliderValueTextMuted: '{percent}, mykistetty', + indicatorMuted: 'Mykistetty', + indicatorVolume: 'Äänenvoimakkuus', + indicatorVolumeWithValue: 'Äänenvoimakkuus {value}', + indicatorCaptionsOn: 'Tekstitys päällä', + indicatorCaptionsOff: 'Tekstitys pois', + indicatorPaused: 'Keskeytetty', + indicatorPlaying: 'Toistetaan', + indicatorFullscreen: 'Koko näyttö', + indicatorExitFullscreen: 'Poistu koko näytöltä', + indicatorPictureInPicture: 'Kuva kuvassa', + indicatorExitPictureInPicture: 'Poistu kuva kuvassa -tilasta', + mediaErrorAborted: 'Olet keskeyttänyt videotoiston', + mediaErrorNetwork: 'Verkkovirhe keskeytti videon latauksen.', + mediaErrorDecode: + 'Videon toisto keskeytyi, koska videotiedosto on vioittunut tai käyttää toimintoja, joita selaimesi ei tue.', + mediaErrorSrcNotSupported: + 'Videon lataus ei onnistunut joko palvelin- tai verkkovirheestä tai väärästä formaatista johtuen.', + mediaErrorEncrypted: 'Media on salattu eikä siihen ole purkuavaimia.', + mediaErrorCustom: '', + errorDialogTitle: 'Jotain meni pieleen.', + errorDialogDismiss: 'OK', + mediaErrorFallback: 'Tapahtui virhe. Yritä uudelleen.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/fr.ts b/packages/core/src/core/i18n/locales/fr.ts new file mode 100644 index 00000000..af807742 --- /dev/null +++ b/packages/core/src/core/i18n/locales/fr.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Lecture', + pause: 'Pause', + replay: 'Revoir', + mute: 'Mettre en sourdine', + unmute: 'Activer le son', + seekForward: 'Avancer de {seconds} secondes', + seekBackward: 'Reculer de {seconds} secondes', + enterFullscreen: 'Plein écran', + exitFullscreen: 'Quitter le plein écran', + enableCaptions: 'Activer les sous-titres', + disableCaptions: 'Désactiver les sous-titres', + enterPictureInPicture: "Image dans l'image", + exitPictureInPicture: "Quitter le mode image dans l'image", + playingLive: 'Lecture en direct', + seekToLiveEdge: 'Aller au direct', + liveBadge: 'En direct', + startCasting: 'Démarrer la diffusion', + stopCasting: 'Arrêter la diffusion', + connectingCast: 'Connexion', + seek: 'Barre de lecture', + volume: 'Niveau de volume', + timeCurrent: 'Temps actuel', + timeDuration: 'Durée', + timeRemaining: 'Temps restant', + timeRemainingPhrase: 'Il reste {duration}', + playbackRateAria: 'Vitesse de lecture {rate}', + timeSliderValueTextRange: '{current} de {duration}', + volumeSliderValueTextMuted: '{percent}, son coupé', + indicatorMuted: 'Son coupé', + indicatorVolume: 'Niveau de volume', + indicatorVolumeWithValue: 'Niveau de volume {value}', + indicatorCaptionsOn: 'Sous-titres activés', + indicatorCaptionsOff: 'Sous-titres désactivés', + indicatorPaused: 'En pause', + indicatorPlaying: 'Lecture en cours', + indicatorFullscreen: 'Plein écran', + indicatorExitFullscreen: 'Quitter le plein écran', + indicatorPictureInPicture: 'Image dans l’image', + indicatorExitPictureInPicture: 'Quitter l’image dans l’image', + mediaErrorAborted: 'Vous avez interrompu la lecture de la vidéo.', + mediaErrorNetwork: 'Une erreur de réseau a interrompu le téléchargement de la vidéo.', + mediaErrorDecode: + "La lecture de la vidéo a été interrompue à cause d'un problème de corruption ou parce que la vidéo utilise des fonctionnalités non prises en charge par votre navigateur.", + mediaErrorSrcNotSupported: + "Cette vidéo n'a pas pu être chargée, soit parce que le serveur ou le réseau a échoué ou parce que le format n'est pas reconnu.", + mediaErrorEncrypted: "Le média est chiffré et nous n'avons pas les clés pour le déchiffrer.", + mediaErrorCustom: '', + errorDialogTitle: 'Une erreur s’est produite.', + errorDialogDismiss: 'Fermer', + mediaErrorFallback: 'Une erreur s’est produite. Veuillez réessayer.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/gd.ts b/packages/core/src/core/i18n/locales/gd.ts new file mode 100644 index 00000000..ab0eb468 --- /dev/null +++ b/packages/core/src/core/i18n/locales/gd.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Cluich', + pause: 'Cuir ’na stad', + replay: 'Cluich a-rithist', + mute: 'Mùch', + unmute: 'Dì-mhùch', + seekForward: 'Gluais air adhart {seconds} diog', + seekBackward: 'Gluais air ais {seconds} diog', + enterFullscreen: 'Làn-sgrìn', + exitFullscreen: 'Fàg modh làn-sgrìn', + enableCaptions: 'Cuir capsaidean air', + disableCaptions: 'Toir capsaidean dheth', + enterPictureInPicture: 'Dealbh beag anns a’ dealbh mhòr', + exitPictureInPicture: 'Fàg dealbh beag anns a’ dealbh mhòr', + playingLive: 'A’ cluich beò', + seekToLiveEdge: 'Tèarmann gu beò', + liveBadge: 'Beò', + startCasting: 'Tòisich air tar-chur', + stopCasting: 'Cuir stad air tar-chur', + connectingCast: 'A’ ceangal', + seek: 'Lorg', + volume: 'Àirde na fuaime', + timeCurrent: 'An ùine làithreach', + timeDuration: 'Faide', + timeRemaining: 'An ùine air fhàgail', + timeRemainingPhrase: '{duration} air fhàgail', + playbackRateAria: 'Reat cluich {rate}', + timeSliderValueTextRange: '{current} à {duration}', + volumeSliderValueTextMuted: '{percent}, air mùchadh', + indicatorMuted: 'Air mùchadh', + indicatorVolume: 'Àirde na fuaime', + indicatorVolumeWithValue: 'Àirde na fuaime {value}', + indicatorCaptionsOn: 'Caipseanan air', + indicatorCaptionsOff: 'Caipseanan dheth', + indicatorPaused: 'Air stad', + indicatorPlaying: 'A’ cluich', + indicatorFullscreen: 'Làn-sgrìn', + indicatorExitFullscreen: 'Fàg làn-sgrìn', + indicatorPictureInPicture: 'Dealbh beag anns a’ dealbh mhòr', + indicatorExitPictureInPicture: 'Fàg dealbh beag', + mediaErrorAborted: 'Sguir thu de chluich a’ mheadhain', + mediaErrorNetwork: 'Cha deach leinn an còrr dhen mheadhan a luchdadh a-nuas ri linn mearachd lìonraidh.', + mediaErrorDecode: + 'Sguir sinn de chluich a’ mheadhain – dh’fhaoidte gu bheil e coirbte no gu bheil gleus aig a’ mheadhan nach cuir am brabhsair taic ris.', + mediaErrorSrcNotSupported: + 'Cha b’ urrainn dhuinn am meadhan a luchdadh – dh’fhaoidte gun do dh’fhàillig leis an fhrithealaiche no an lìonra no nach cuir sinn taic ris an fhòrmat.', + mediaErrorEncrypted: 'Tha am meadhan crioptaichte ’s chan eil iuchair dì-chrioptachaidh againn dha.', + mediaErrorCustom: '', + errorDialogTitle: 'Chaidh rudeigin ceàrr.', + errorDialogDismiss: 'Dùin', + mediaErrorFallback: 'Thachair mearachd. Feuch ris a-rithist.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/gl.ts b/packages/core/src/core/i18n/locales/gl.ts new file mode 100644 index 00000000..c015ca27 --- /dev/null +++ b/packages/core/src/core/i18n/locales/gl.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Reproducir', + pause: 'Pausa', + replay: 'Repetir', + mute: 'Silenciar', + unmute: 'Son activado', + seekForward: 'Avanzar {seconds} segundos', + seekBackward: 'Retroceder {seconds} segundos', + enterFullscreen: 'Pantalla completa', + exitFullscreen: 'Saír da pantalla completa', + enableCaptions: 'Activar subtítulos', + disableCaptions: 'Desactivar subtítulos', + enterPictureInPicture: 'Imaxe en imaxe', + exitPictureInPicture: 'Saír de imaxe en imaxe', + playingLive: 'Reproducindo en directo', + seekToLiveEdge: 'Ir ao directo', + liveBadge: 'En directo', + startCasting: 'Iniciar emisión', + stopCasting: 'Deter emisión', + connectingCast: 'Conectando', + seek: 'Buscar', + volume: 'Nivel do volume', + timeCurrent: 'Tempo reproducido', + timeDuration: 'Duración', + timeRemaining: 'Tempo restante', + timeRemainingPhrase: 'Quedan {duration}', + playbackRateAria: 'Velocidade de reprodución {rate}', + timeSliderValueTextRange: '{current} de {duration}', + volumeSliderValueTextMuted: '{percent}, silenciado', + indicatorMuted: 'Silenciado', + indicatorVolume: 'Nivel do volume', + indicatorVolumeWithValue: 'Nivel do volume {value}', + indicatorCaptionsOn: 'Subtítulos activados', + indicatorCaptionsOff: 'Subtítulos desactivados', + indicatorPaused: 'En pausa', + indicatorPlaying: 'Reproducindo', + indicatorFullscreen: 'Pantalla completa', + indicatorExitFullscreen: 'Saír da pantalla completa', + indicatorPictureInPicture: 'Imaxe en imaxe', + indicatorExitPictureInPicture: 'Saír de imaxe en imaxe', + mediaErrorAborted: 'Vostede interrompeu a reprodución do medio.', + mediaErrorNetwork: 'Un erro de rede interrompeu a descarga do medio.', + mediaErrorDecode: + 'Interrompeuse a reprodución do medio por mor dun problema de estragamento dos datos ou porque o medio precisa funcións que o seu navegador non ofrece.', + mediaErrorSrcNotSupported: + 'Non foi posíbel cargar o medio por mor dun fallo de rede ou do servidor ou porque o formato non é compatíbel.', + mediaErrorEncrypted: 'O medio está cifrado e non temos as chaves para descifralo.', + mediaErrorCustom: '', + errorDialogTitle: 'Algo saíu mal.', + errorDialogDismiss: 'Pechar', + mediaErrorFallback: 'Produciuse un erro. Por favor, ténteo de novo.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/he.ts b/packages/core/src/core/i18n/locales/he.ts new file mode 100644 index 00000000..a46dd4aa --- /dev/null +++ b/packages/core/src/core/i18n/locales/he.ts @@ -0,0 +1,52 @@ +import type { Translations } from '../types'; + +export default { + play: 'נַגֵּן', + pause: 'השהה', + replay: 'נַגֵּן שוב', + mute: 'השתק', + unmute: 'בטל השתקה', + seekForward: 'דילוג קדימה {seconds} שניות', + seekBackward: 'דילוג אחורה {seconds} שניות', + enterFullscreen: 'מסך מלא', + exitFullscreen: 'יציאה ממסך מלא', + enableCaptions: 'הפעל כתוביות', + disableCaptions: 'כבה כתוביות', + enterPictureInPicture: 'תמונה בתוך תמונה', + exitPictureInPicture: 'יציאה מתמונה בתוך תמונה', + playingLive: 'משדר חי', + seekToLiveEdge: 'עבור לשידור חי', + liveBadge: 'שידור חי', + startCasting: 'התחל שידור', + stopCasting: 'עצור שידור', + connectingCast: 'מתחבר', + seek: 'חיפוש', + volume: 'רמת ווליום', + timeCurrent: 'זמן נוכחי', + timeDuration: 'זמן כולל', + timeRemaining: 'זמן נותר', + timeRemainingPhrase: 'נותרו {duration}', + playbackRateAria: 'קצב ניגון {rate}', + timeSliderValueTextRange: '{current} מתוך {duration}', + volumeSliderValueTextMuted: '{percent}, מושתק', + indicatorMuted: 'מושתק', + indicatorVolume: 'עוצמת קול', + indicatorVolumeWithValue: 'עוצמת קול {value}', + indicatorCaptionsOn: 'כיתובים פועלים', + indicatorCaptionsOff: 'כיתובים כבויים', + indicatorPaused: 'מושהה', + indicatorPlaying: 'מתנגן', + indicatorFullscreen: 'מסך מלא', + indicatorExitFullscreen: 'יציאה ממסך מלא', + indicatorPictureInPicture: 'תמונה בתוך תמונה', + indicatorExitPictureInPicture: 'יציאה מתמונה בתוך תמונה', + mediaErrorAborted: 'ביטלת את השמעת המדיה', + mediaErrorNetwork: 'שגיאת רשת גרמה להורדת המדיה להיכשל באמצע.', + mediaErrorDecode: 'השמעת המדיה בוטלה בשל בעית השחטת מידע או מכיוון שהמדיה עשתה שימוש בתכונות שהדפדפן שלך לא תמך בהן.', + mediaErrorSrcNotSupported: 'לא ניתן לטעון את המדיה, או מכיוון שהרשת או השרת כשלו או מכיוון שהפורמט אינו נתמך.', + mediaErrorEncrypted: 'המדיה מוצפנת ואין בידינו את המפתח כדי לפענח אותה.', + mediaErrorCustom: '', + errorDialogTitle: 'אירעה שגיאה.', + errorDialogDismiss: 'סְגוֹר', + mediaErrorFallback: 'אירעה שגיאה. אנא נסה שוב.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/hi.ts b/packages/core/src/core/i18n/locales/hi.ts new file mode 100644 index 00000000..080efdb5 --- /dev/null +++ b/packages/core/src/core/i18n/locales/hi.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'चलाएँ', + pause: 'रोकें', + replay: 'फिर से चलाएँ', + mute: 'म्यूट करें', + unmute: 'अनम्यूट करें', + seekForward: '{seconds} सेकंड आगे बढ़ें', + seekBackward: '{seconds} सेकंड पीछे जाएं', + enterFullscreen: 'फ़ुल स्क्रीन', + exitFullscreen: 'फ़ुल स्क्रीन से बाहर निकलें', + enableCaptions: 'कैप्शन चालू करें', + disableCaptions: 'कैप्शन बंद करें', + enterPictureInPicture: 'पिक्चर-इन-पिक्चर', + exitPictureInPicture: 'पिक्चर-इन-पिक्चर से बाहर निकलें', + playingLive: 'लाइव चल रहा है', + seekToLiveEdge: 'लाइव पर जाएँ', + liveBadge: 'लाइव', + startCasting: 'कास्टिंग शुरू करें', + stopCasting: 'कास्टिंग बंद करें', + connectingCast: 'कनेक्ट हो रहा है', + seek: 'खोजें', + volume: 'वॉल्यूम स्तर', + timeCurrent: 'वर्तमान समय', + timeDuration: 'अवधि', + timeRemaining: 'शेष समय', + timeRemainingPhrase: '{duration} शेष', + playbackRateAria: 'चलाने की दर {rate}', + timeSliderValueTextRange: '{duration} में से {current}', + volumeSliderValueTextMuted: '{percent}, म्यूट', + indicatorMuted: 'म्यूट', + indicatorVolume: 'वॉल्यूम', + indicatorVolumeWithValue: 'वॉल्यूम {value}', + indicatorCaptionsOn: 'कैप्शन चालू', + indicatorCaptionsOff: 'कैप्शन बंद', + indicatorPaused: 'रोका गया', + indicatorPlaying: 'चल रहा है', + indicatorFullscreen: 'पूर्ण स्क्रीन', + indicatorExitFullscreen: 'पूर्ण स्क्रीन से बाहर', + indicatorPictureInPicture: 'पिक्चर में पिक्चर', + indicatorExitPictureInPicture: 'पिक्चर में पिक्चर से बाहर', + mediaErrorAborted: 'आपने मीडिया प्लेबैक को रोक दिया', + mediaErrorNetwork: 'एक नेटवर्क त्रुटि के कारण मीडिया डाउनलोड आंशिक रूप से विफल हो गया।', + mediaErrorDecode: + 'मीडिया प्लेबैक निरस्त कर दिया गया, कारण: दूषण की समस्या या मीडिया ने उन सुविधाओं का उपयोग किया था जिनका आपके ब्राउज़र ने समर्थन नहीं किया।', + mediaErrorSrcNotSupported: + 'मीडिया लोड नहीं किया जा सका, या तो सर्वर या नेटवर्क विफल होने के कारण या प्रारूप समर्थित नहीं होने के कारण।', + mediaErrorEncrypted: 'मीडिया एन्क्रिप्टेड है और हमारे पास इसे डिक्रिप्ट करने की चाबी नहीं है।', + mediaErrorCustom: '', + errorDialogTitle: 'कुछ गलत हुआ।', + errorDialogDismiss: 'बंद करें', + mediaErrorFallback: 'एक त्रुटि हुई। कृपया पुनः प्रयास करें।', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/hr.ts b/packages/core/src/core/i18n/locales/hr.ts new file mode 100644 index 00000000..b7dd41be --- /dev/null +++ b/packages/core/src/core/i18n/locales/hr.ts @@ -0,0 +1,52 @@ +import type { Translations } from '../types'; + +export default { + play: 'Pusti', + pause: 'Pauza', + replay: 'Ponovi', + mute: 'Prigušen', + unmute: 'Ne-prigušen', + seekForward: 'Preskoči naprijed {seconds} sekundi', + seekBackward: 'Preskoči unatrag {seconds} sekundi', + enterFullscreen: 'Puni ekran', + exitFullscreen: 'Izađi iz cijelog zaslona', + enableCaptions: 'Uključi titlove', + disableCaptions: 'Isključi titlove', + enterPictureInPicture: 'Slika u slici', + exitPictureInPicture: 'Izađi iz slike u slici', + playingLive: 'Reprodukcija uživo', + seekToLiveEdge: 'Prijeđi na live', + liveBadge: 'Uživo', + startCasting: 'Pokreni emitiranje', + stopCasting: 'Zaustavi emitiranje', + connectingCast: 'Povezivanje', + seek: 'Premotavanje', + volume: 'Glasnoća', + timeCurrent: 'Trenutno vrijeme', + timeDuration: 'Vrijeme trajanja', + timeRemaining: 'Preostalo vrijeme', + timeRemainingPhrase: 'Preostalo {duration}', + playbackRateAria: 'Stopa reprodukcije {rate}', + timeSliderValueTextRange: '{current} od {duration}', + volumeSliderValueTextMuted: '{percent}, utišano', + indicatorMuted: 'Utišano', + indicatorVolume: 'Glasnoća', + indicatorVolumeWithValue: 'Glasnoća {value}', + indicatorCaptionsOn: 'Titlovi uključeni', + indicatorCaptionsOff: 'Titlovi isključeni', + indicatorPaused: 'Pauzirano', + indicatorPlaying: 'Reproducira se', + indicatorFullscreen: 'Cijeli zaslon', + indicatorExitFullscreen: 'Izađi iz cijelog zaslona', + indicatorPictureInPicture: 'Slika u slici', + indicatorExitPictureInPicture: 'Izađi iz slike u slici', + mediaErrorAborted: 'Isključili ste reprodukciju videa.', + mediaErrorNetwork: 'Video se prestao preuzimati zbog greške na mreži.', + mediaErrorDecode: 'Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.', + mediaErrorSrcNotSupported: 'Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.', + mediaErrorEncrypted: 'Medij je šifriran i nema ključeva za dešifriranje.', + mediaErrorCustom: '', + errorDialogTitle: 'Nešto je pošlo po zlu.', + errorDialogDismiss: 'Zatvori', + mediaErrorFallback: 'Došlo je do pogreške. Pokušajte ponovo.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/hu.ts b/packages/core/src/core/i18n/locales/hu.ts new file mode 100644 index 00000000..4de33efa --- /dev/null +++ b/packages/core/src/core/i18n/locales/hu.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Lejátszás', + pause: 'Szünet', + replay: 'Visszajátszás', + mute: 'Némítás', + unmute: 'Némítás kikapcsolva', + seekForward: 'Ugrás előre {seconds} másodpercet', + seekBackward: 'Ugrás vissza {seconds} másodpercet', + enterFullscreen: 'Teljes képernyő', + exitFullscreen: 'Kilépés a teljes képernyős módból', + enableCaptions: 'Feliratok bekapcsolása', + disableCaptions: 'Feliratok kikapcsolása', + enterPictureInPicture: 'Kép a képben', + exitPictureInPicture: 'Kilépés kép a képben módból', + playingLive: 'Élő adás', + seekToLiveEdge: 'Ugrás az élő adáshoz', + liveBadge: 'Élő', + startCasting: 'Vetítés indítása', + stopCasting: 'Vetítés leállítása', + connectingCast: 'Csatlakozás', + seek: 'Teke', + volume: 'Hangerő', + timeCurrent: 'Aktuális időpont', + timeDuration: 'Hossz', + timeRemaining: 'Hátralévő idő', + timeRemainingPhrase: '{duration} van hátra', + playbackRateAria: 'Lejátszási sebesség {rate}', + timeSliderValueTextRange: '{current} / {duration}', + volumeSliderValueTextMuted: '{percent}, némítva', + indicatorMuted: 'Némítva', + indicatorVolume: 'Hangerő', + indicatorVolumeWithValue: 'Hangerő {value}', + indicatorCaptionsOn: 'Feliratok bekapcsolva', + indicatorCaptionsOff: 'Feliratok kikapcsolva', + indicatorPaused: 'Szüneteltetve', + indicatorPlaying: 'Lejátszás', + indicatorFullscreen: 'Teljes képernyő', + indicatorExitFullscreen: 'Kilépés teljes képernyőből', + indicatorPictureInPicture: 'Kép a képben', + indicatorExitPictureInPicture: 'Kilépés kép a képben módból', + mediaErrorAborted: 'Leállította a lejátszást', + mediaErrorNetwork: 'Hálózati hiba miatt a videó részlegesen töltődött le.', + mediaErrorDecode: + 'A lejátszás adatsérülés miatt leállt, vagy a videó egyes tulajdonságait a böngészője nem támogatja.', + mediaErrorSrcNotSupported: + 'A videó nem tölthető be hálózati vagy kiszolgálói hiba miatt, vagy a formátuma nem támogatott.', + mediaErrorEncrypted: 'A média titkosítva van és nincsenek kulcsok a visszafejtéshez.', + mediaErrorCustom: '', + errorDialogTitle: 'Valami hiba történt.', + errorDialogDismiss: 'Bezárás', + mediaErrorFallback: 'Hiba történt. Kérjük, próbálja újra.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/it.ts b/packages/core/src/core/i18n/locales/it.ts new file mode 100644 index 00000000..44368738 --- /dev/null +++ b/packages/core/src/core/i18n/locales/it.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Riproduci', + pause: 'Pausa', + replay: 'Riproduci di nuovo', + mute: 'Disattiva l’audio', + unmute: 'Attiva l’audio', + seekForward: 'Avanti {seconds} secondi', + seekBackward: 'Indietro {seconds} secondi', + enterFullscreen: 'Schermo intero', + exitFullscreen: 'Chiudi Schermo intero', + enableCaptions: 'Attiva sottotitoli', + disableCaptions: 'Disattiva sottotitoli', + enterPictureInPicture: 'Picture-in-Picture', + exitPictureInPicture: 'Esci dalla modalità Picture-in-Picture', + playingLive: 'Riproduzione in diretta', + seekToLiveEdge: 'Vai al live', + liveBadge: 'In diretta', + startCasting: 'Avvia trasmissione', + stopCasting: 'Interrompi trasmissione', + connectingCast: 'Connessione', + seek: 'Scorrimento', + volume: 'Livello del volume', + timeCurrent: 'Orario attuale', + timeDuration: 'Durata', + timeRemaining: 'Tempo rimanente', + timeRemainingPhrase: 'Restano {duration}', + playbackRateAria: 'Velocità di riproduzione {rate}', + timeSliderValueTextRange: '{current} di {duration}', + volumeSliderValueTextMuted: '{percent}, audio disattivato', + indicatorMuted: 'Audio disattivato', + indicatorVolume: 'Livello del volume', + indicatorVolumeWithValue: 'Livello del volume {value}', + indicatorCaptionsOn: 'Sottotitoli attivi', + indicatorCaptionsOff: 'Sottotitoli disattivi', + indicatorPaused: 'In pausa', + indicatorPlaying: 'In riproduzione', + indicatorFullscreen: 'Schermo intero', + indicatorExitFullscreen: 'Esci da schermo intero', + indicatorPictureInPicture: 'Picture-in-picture', + indicatorExitPictureInPicture: 'Esci dalla modalità Picture-in-picture', + mediaErrorAborted: 'La riproduzione del contenuto multimediale è stata interrotta.', + mediaErrorNetwork: 'Il download del contenuto multimediale è stato interrotto a causa di un problema rete.', + mediaErrorDecode: + 'La riproduzione del contenuto multimediale è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.', + mediaErrorSrcNotSupported: + 'Il contenuto multimediale non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.', + mediaErrorEncrypted: 'Il contenuto multimediale è criptato e non disponiamo delle chiavi per decifrarlo.', + mediaErrorCustom: '', + errorDialogTitle: 'Qualcosa è andato storto.', + errorDialogDismiss: 'Chiudi', + mediaErrorFallback: 'Si è verificato un errore. Riprova.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/ja.ts b/packages/core/src/core/i18n/locales/ja.ts new file mode 100644 index 00000000..64e72ac8 --- /dev/null +++ b/packages/core/src/core/i18n/locales/ja.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: '再生', + pause: '一時停止', + replay: 'もう一度見る', + mute: 'ミュート', + unmute: 'サウンドをオン', + seekForward: '{seconds}秒進む', + seekBackward: '{seconds}秒戻る', + enterFullscreen: 'フルスクリーン', + exitFullscreen: '全画面表示を終了', + enableCaptions: '字幕を表示', + disableCaptions: '字幕を非表示', + enterPictureInPicture: 'ピクチャーインピクチャー', + exitPictureInPicture: 'ピクチャーインピクチャー機能の終了', + playingLive: 'ライブ再生中', + seekToLiveEdge: 'ライブ位置へ移動', + liveBadge: 'ライブ', + startCasting: 'キャスト開始', + stopCasting: 'キャスト停止', + connectingCast: '接続中', + seek: 'シーク', + volume: 'ボリュームレベル', + timeCurrent: '現在の時間', + timeDuration: '長さ', + timeRemaining: '残りの時間', + timeRemainingPhrase: '残り {duration}', + playbackRateAria: '再生レート {rate}', + timeSliderValueTextRange: '{duration}の{current}', + volumeSliderValueTextMuted: '{percent}、ミュート', + indicatorMuted: 'ミュート', + indicatorVolume: '音量', + indicatorVolumeWithValue: '音量 {value}', + indicatorCaptionsOn: '字幕オン', + indicatorCaptionsOff: '字幕オフ', + indicatorPaused: '一時停止', + indicatorPlaying: '再生中', + indicatorFullscreen: '全画面表示', + indicatorExitFullscreen: '全画面表示解除', + indicatorPictureInPicture: 'ピクチャーインピクチャー表示', + indicatorExitPictureInPicture: 'ピクチャーインピクチャー表示解除', + mediaErrorAborted: '動画再生を中止しました', + mediaErrorNetwork: 'ネットワーク エラーにより動画のダウンロードが途中で失敗しました', + mediaErrorDecode: + '破損の問題、またはお使いのブラウザがサポートしていない機能が動画に使用されていたため、動画の再生が中止されました', + mediaErrorSrcNotSupported: + 'サーバーまたはネットワークのエラー、またはフォーマットがサポートされていないため、動画をロードできませんでした', + mediaErrorEncrypted: 'メディアは暗号化されており、解読するためのキーがありません。', + mediaErrorCustom: '', + errorDialogTitle: '問題が発生しました。', + errorDialogDismiss: '閉じる', + mediaErrorFallback: 'エラーが発生しました。再度お試しください。', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/ko.ts b/packages/core/src/core/i18n/locales/ko.ts new file mode 100644 index 00000000..51d97bb6 --- /dev/null +++ b/packages/core/src/core/i18n/locales/ko.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: '재생', + pause: '일시중지', + replay: '다시 재생', + mute: '음소거', + unmute: '소리 활성화하기', + seekForward: '{seconds}초 앞으로', + seekBackward: '{seconds}초 뒤로', + enterFullscreen: '전체 화면', + exitFullscreen: '전체 화면 해제', + enableCaptions: '자막 켜기', + disableCaptions: '자막 끄기', + enterPictureInPicture: '화면 속 화면', + exitPictureInPicture: '화면 속 화면 종료', + playingLive: '라이브 재생 중', + seekToLiveEdge: '라이브 지점으로 이동', + liveBadge: '라이브', + startCasting: '전송 시작', + stopCasting: '전송 중지', + connectingCast: '연결 중', + seek: '탐색', + volume: '볼륨 레벨', + timeCurrent: '현재 시간', + timeDuration: '지정 기간', + timeRemaining: '남은 시간', + timeRemainingPhrase: '{duration} 남음', + playbackRateAria: '재생 속도 {rate}', + timeSliderValueTextRange: '{duration} 중 {current}', + volumeSliderValueTextMuted: '{percent}, 음소거', + indicatorMuted: '음소거', + indicatorVolume: '볼륨', + indicatorVolumeWithValue: '볼륨 {value}', + indicatorCaptionsOn: '자막 켜짐', + indicatorCaptionsOff: '자막 꺼짐', + indicatorPaused: '일시정지', + indicatorPlaying: '재생 중', + indicatorFullscreen: '전체 화면', + indicatorExitFullscreen: '전체 화면 종료', + indicatorPictureInPicture: '화면 속 화면', + indicatorExitPictureInPicture: '화면 속 화면 종료', + mediaErrorAborted: '비디오 재생을 취소했습니다.', + mediaErrorNetwork: '네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.', + mediaErrorDecode: + '비디오 재생이 취소됐습니다. 비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.', + mediaErrorSrcNotSupported: + '비디오를 로드할 수 없습니다. 서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.', + mediaErrorEncrypted: '미디어는 암호화되어 있으며 이를 해독할 키를 갖고 있지 않습니다.', + mediaErrorCustom: '', + errorDialogTitle: '문제가 발생했습니다.', + errorDialogDismiss: '닫기', + mediaErrorFallback: '오류가 발생했습니다. 다시 시도해 주세요.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/lv.ts b/packages/core/src/core/i18n/locales/lv.ts new file mode 100644 index 00000000..082957d7 --- /dev/null +++ b/packages/core/src/core/i18n/locales/lv.ts @@ -0,0 +1,53 @@ +import type { Translations } from '../types'; + +export default { + play: 'Atskaņot', + pause: 'Pauzēt', + replay: 'Atkārtot', + mute: 'Izslēgt skaņu', + unmute: 'Ieslēgt skaņu', + seekForward: 'Pārtīt uz priekšu {seconds} sekundes', + seekBackward: 'Pārtīt atpakaļ {seconds} sekundes', + enterFullscreen: 'Pilnekrāna režīms', + exitFullscreen: 'Iziet no pilnekrāna režīma', + enableCaptions: 'Ieslēgt parakstus', + disableCaptions: 'Izslēgt parakstus', + enterPictureInPicture: 'Attēls attēlā', + exitPictureInPicture: 'Iziet no attēls attēlā', + playingLive: 'Tiešraide', + seekToLiveEdge: 'Pāriet uz tiešraidi', + liveBadge: 'Tiešraide', + startCasting: 'Sākt pārraidīšanu', + stopCasting: 'Beigt pārraidīšanu', + connectingCast: 'Savienošanās', + seek: 'Meklēt', + volume: 'Skaļums', + timeCurrent: 'Esošais laiks', + timeDuration: 'Ilgums', + timeRemaining: 'Atlikušais laiks', + timeRemainingPhrase: 'Atlicis {duration}', + playbackRateAria: 'Atskaņošanas ātrums {rate}', + timeSliderValueTextRange: '{current} no {duration}', + volumeSliderValueTextMuted: '{percent}, izslēgts', + indicatorMuted: 'Skaņa izslēgta', + indicatorVolume: 'Skaļums', + indicatorVolumeWithValue: 'Skaļums {value}', + indicatorCaptionsOn: 'Paraksti ieslēgti', + indicatorCaptionsOff: 'Paraksti izslēgti', + indicatorPaused: 'Pauzēts', + indicatorPlaying: 'Atskaņo', + indicatorFullscreen: 'Pilnekrāna režīms', + indicatorExitFullscreen: 'Iziet no pilnekrāna', + indicatorPictureInPicture: 'Attēls attēlā', + indicatorExitPictureInPicture: 'Iziet no attēls attēlā', + mediaErrorAborted: 'Atskaņošana atcelta', + mediaErrorNetwork: 'Tīkla kļūdas dēļ, multivides lejupielāde neizdevās.', + mediaErrorDecode: 'Atskaņošana tika pārtraukta tīkla kļūmes dēļ vai pārlūkprogrammas iespēju trūkuma dēļ.', + mediaErrorSrcNotSupported: + 'Neizdevās ielādēt multividi, iespējams severa, vai tīkla kļūmes dēļ, vai neatbalstīta formāta dēļ.', + mediaErrorEncrypted: 'Multividi nevar atskaņot, jo tas ir kriptēts un nav pieejama dekriptēšanas atslēga.', + mediaErrorCustom: '', + errorDialogTitle: 'Kaut kas nogāja greizi.', + errorDialogDismiss: 'Aizvērt', + mediaErrorFallback: 'Radās kļūda. Lūdzu, mēģiniet vēlreiz.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/mr.ts b/packages/core/src/core/i18n/locales/mr.ts new file mode 100644 index 00000000..035970cb --- /dev/null +++ b/packages/core/src/core/i18n/locales/mr.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'वाजवा', + pause: 'थांबा', + replay: 'पुन्हा वाजवा', + mute: 'म्यूट करा', + unmute: 'अनम्यूट करा', + seekForward: 'पुढे जा {seconds} सेकंद', + seekBackward: 'मागे जा {seconds} सेकंद', + enterFullscreen: 'संपूर्ण पडदा', + exitFullscreen: 'संपूर्ण पडद्यातून बाहेर पडा', + enableCaptions: 'मथळे', + disableCaptions: 'मथळे बंद', + enterPictureInPicture: 'पिक्चर-इन-पिक्चर', + exitPictureInPicture: 'पिक्चर-इन-पिक्चरमधून बाहेर पडा', + playingLive: 'थेट प्रसारण सुरू आहे', + seekToLiveEdge: 'थेट प्रसारणाकडे जा', + liveBadge: 'थेट प्रसारण', + startCasting: 'कास्टिंग सुरू करा', + stopCasting: 'कास्टिंग थांबवा', + connectingCast: 'कनेक्ट होत आहे', + seek: 'शोध', + volume: 'आवाज पातळी', + timeCurrent: 'वर्तमान वेळ', + timeDuration: 'कालावधी', + timeRemaining: 'उर्वरित वेळ', + timeRemainingPhrase: '{duration} उर्वरित', + playbackRateAria: 'प्लेबॅक दर {rate}', + timeSliderValueTextRange: '{duration} पैकी {current}', + volumeSliderValueTextMuted: '{percent}, म्यूट केलेले', + indicatorMuted: 'म्यूट केलेले', + indicatorVolume: 'आवाज', + indicatorVolumeWithValue: 'आवाज {value}', + indicatorCaptionsOn: 'मथळे चालू', + indicatorCaptionsOff: 'मथळे बंद', + indicatorPaused: 'थांबलेले', + indicatorPlaying: 'वाजत आहे', + indicatorFullscreen: 'संपूर्ण पडदा', + indicatorExitFullscreen: 'संपूर्ण पडद्यातून बाहेर', + indicatorPictureInPicture: 'पिक्चरमध्ये पिक्चर', + indicatorExitPictureInPicture: 'पिक्चरमध्ये पिक्चरमधून बाहेर', + mediaErrorAborted: 'तुम्ही मीडिया प्लेबॅक रद्द केला', + mediaErrorNetwork: 'नेटवर्क त्रुटीमुळे मीडिया डाउनलोड अर्ध्यात अयशस्वी झाला.', + mediaErrorDecode: + 'मीडिया प्लेबॅक भ्रष्टाचाराच्या समस्येमुळे किंवा मीडियाने वापरलेल्या वैशिष्ट्यांमुळे तुमचा ब्राउझर सपोर्ट करत नसल्यामुळे रद्द करण्यात आला.', + mediaErrorSrcNotSupported: + 'मीडिया लोड करता आला नाही, एकतर सर्व्हर किंवा नेटवर्क अयशस्वी झाल्यामुळे किंवा फॉरमॅट समर्थित नसल्यामुळे.', + mediaErrorEncrypted: 'मीडिया एन्क्रिप्ट केलेला आहे आणि तो डिक्रिप्ट करण्यासाठी आमच्याकडे कळा नाहीत.', + mediaErrorCustom: '', + errorDialogTitle: 'काहीतरी चुकले.', + errorDialogDismiss: 'बंद', + mediaErrorFallback: 'एक त्रुटी आली. कृपया पुन्हा प्रयत्न करा.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/nb.ts b/packages/core/src/core/i18n/locales/nb.ts new file mode 100644 index 00000000..8fd25cb6 --- /dev/null +++ b/packages/core/src/core/i18n/locales/nb.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Spill', + pause: 'Pause', + replay: 'Spill om igjen', + mute: 'Lyd av', + unmute: 'Lyd på', + seekForward: 'Hopp frem {seconds} sekunder', + seekBackward: 'Hopp tilbake {seconds} sekunder', + enterFullscreen: 'Fullskjerm', + exitFullscreen: 'Lukk fullskjerm', + enableCaptions: 'Slå på teksting', + disableCaptions: 'Slå av teksting', + enterPictureInPicture: 'Bilde-i-bilde', + exitPictureInPicture: 'Avslutt bilde-i-bilde', + playingLive: 'Spiller live', + seekToLiveEdge: 'Gå til live', + liveBadge: 'Direkte', + startCasting: 'Start sending', + stopCasting: 'Stopp sending', + connectingCast: 'Kobler til', + seek: 'Spol', + volume: 'Volumnivå', + timeCurrent: 'Aktuell tid', + timeDuration: 'Varighet', + timeRemaining: 'Gjenstående tid', + timeRemainingPhrase: '{duration} igjen', + playbackRateAria: 'Avspillingshastighet {rate}', + timeSliderValueTextRange: '{current} av {duration}', + volumeSliderValueTextMuted: '{percent}, dempet', + indicatorMuted: 'Dempet', + indicatorVolume: 'Volum', + indicatorVolumeWithValue: 'Volum {value}', + indicatorCaptionsOn: 'Teksting på', + indicatorCaptionsOff: 'Teksting av', + indicatorPaused: 'Satt på pause', + indicatorPlaying: 'Spiller', + indicatorFullscreen: 'Fullskjerm', + indicatorExitFullscreen: 'Avslutt fullskjerm', + indicatorPictureInPicture: 'Bilde i bilde', + indicatorExitPictureInPicture: 'Avslutt bilde i bilde', + mediaErrorAborted: 'Du avbrøt avspillingen.', + mediaErrorNetwork: 'En nettverksfeil avbrøt nedlasting av videoen.', + mediaErrorDecode: + 'Videoavspillingen ble avbrudt på grunn av ødelagte data eller fordi videoen ville gjøre noe som nettleseren din ikke har støtte for.', + mediaErrorSrcNotSupported: + 'Videoen kunne ikke lastes ned, på grunn av nettverksfeil eller serverfeil, eller fordi formatet ikke er støttet.', + mediaErrorEncrypted: 'Mediefilen er kryptert og vi mangler nøkler for å dekryptere den.', + mediaErrorCustom: '', + errorDialogTitle: 'Noe gikk galt.', + errorDialogDismiss: 'Lukk', + mediaErrorFallback: 'En feil oppstod. Vennligst prøv igjen.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/ne.ts b/packages/core/src/core/i18n/locales/ne.ts new file mode 100644 index 00000000..09617ecc --- /dev/null +++ b/packages/core/src/core/i18n/locales/ne.ts @@ -0,0 +1,52 @@ +import type { Translations } from '../types'; + +export default { + play: 'चलाउनु', + pause: 'रोक्नु', + replay: 'फेरि चलाउनु', + mute: 'म्यूट गर्नुहोस्', + unmute: 'अनम्यूट गर्नुहोस्', + seekForward: '{seconds} सेकेन्ड अगाडि सार्नुहोस्', + seekBackward: '{seconds} सेकेन्ड पछाडि सार्नुहोस्', + enterFullscreen: 'पूर्ण स्क्रिन', + exitFullscreen: 'पूर्ण स्क्रिनबाट बाहिर निस्कनुहोस्', + enableCaptions: 'क्याप्शन', + disableCaptions: 'क्याप्शन बंद', + enterPictureInPicture: 'पिक्चर-इन-पिक्चर', + exitPictureInPicture: 'पिक्चर-इन-पिक्चरबाट बाहिर निस्कनुहोस्', + playingLive: 'लाइभ चलिरहेको छ', + seekToLiveEdge: 'लाइभमा जानुहोस्', + liveBadge: 'लाइव', + startCasting: 'कास्टिंग सुरू गर्नुहोस्', + stopCasting: 'कास्टिंग रोक्नुहोस्', + connectingCast: 'जडान हुँदैछ', + seek: 'खोज', + volume: 'वॉल्यूम स्तर', + timeCurrent: 'हालको समय', + timeDuration: 'अवधि', + timeRemaining: 'बाँकी समय', + timeRemainingPhrase: '{duration} बाँकी', + playbackRateAria: 'प्लेब्याक दर {rate}', + timeSliderValueTextRange: '{duration} मध्ये {current}', + volumeSliderValueTextMuted: '{percent}, म्यूट', + indicatorMuted: 'म्यूट', + indicatorVolume: 'भोल्युम', + indicatorVolumeWithValue: 'भोल्युम {value}', + indicatorCaptionsOn: 'क्याप्शन चालू', + indicatorCaptionsOff: 'क्याप्शन बंद', + indicatorPaused: 'रोकिएको', + indicatorPlaying: 'चलिरहेको', + indicatorFullscreen: 'पूर्ण स्क्रिन', + indicatorExitFullscreen: 'पूर्ण स्क्रिनबाट बाहिर', + indicatorPictureInPicture: 'पिक्चर इन पिक्चर', + indicatorExitPictureInPicture: 'पिक्चर इन पिक्चरबाट बाहिर', + mediaErrorAborted: 'तपाईंले मिडिया प्लेब्याक रद्द गर्नुभयो', + mediaErrorNetwork: 'नेटवर्क त्रुटिले मिडिया डाउनलोडलाई आधा मार्गमा असफल गर्यो।', + mediaErrorDecode: 'मिडिया प्लेब्याक अवरुद्ध गरियो, कारण मिडिया दूषित भयो वा तपाईंको ब्राउजरले समर्थन नगरेको सुविधाहरू प्रयोग गर्यो।', + mediaErrorSrcNotSupported: 'मिडिया लोड गर्न सकिएन, नेटवर्क वा सर्भर विफल भयो वा त्यसको प्रारूप समर्थित छैन।', + mediaErrorEncrypted: 'मिडिया एन्क्रिप्ट गरिएको छ र हामीसँग डिक्रिप्ट गर्ने कुञ्जीहरू छैनन्।', + mediaErrorCustom: '', + errorDialogTitle: 'केही गलत भयो।', + errorDialogDismiss: 'बन्द गर्नुहोस्', + mediaErrorFallback: 'एउटा त्रुटि भयो। कृपया पुन: प्रयास गर्नुहोस्।', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/nl.ts b/packages/core/src/core/i18n/locales/nl.ts new file mode 100644 index 00000000..976bd4f7 --- /dev/null +++ b/packages/core/src/core/i18n/locales/nl.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Afspelen', + pause: 'Pauzeren', + replay: 'Opnieuw afspelen', + mute: 'Dempen', + unmute: 'Dempen uit', + seekForward: '{seconds} seconden vooruit', + seekBackward: '{seconds} seconden terug', + enterFullscreen: 'Volledig scherm', + exitFullscreen: 'Volledig scherm sluiten', + enableCaptions: 'Ondertiteling inschakelen', + disableCaptions: 'Ondertiteling uitschakelen', + enterPictureInPicture: 'Picture-in-Picture', + exitPictureInPicture: 'Picture-in-Picture uit', + playingLive: 'Speelt live', + seekToLiveEdge: 'Ga naar live', + liveBadge: 'Live', + startCasting: 'Casten starten', + stopCasting: 'Casten stoppen', + connectingCast: 'Verbinden', + seek: 'Spoelen', + volume: 'Geluidsniveau', + timeCurrent: 'Huidige tijd', + timeDuration: 'Tijdsduur', + timeRemaining: 'Resterende tijd', + timeRemainingPhrase: 'Nog {duration}', + playbackRateAria: 'Afspeelsnelheid {rate}', + timeSliderValueTextRange: '{current} van {duration}', + volumeSliderValueTextMuted: '{percent}, gedempt', + indicatorMuted: 'Gedempt', + indicatorVolume: 'Geluidsniveau', + indicatorVolumeWithValue: 'Geluidsniveau {value}', + indicatorCaptionsOn: 'Ondertiteling aan', + indicatorCaptionsOff: 'Ondertiteling uit', + indicatorPaused: 'Gepauzeerd', + indicatorPlaying: 'Wordt afgespeeld', + indicatorFullscreen: 'Volledig scherm', + indicatorExitFullscreen: 'Volledig scherm verlaten', + indicatorPictureInPicture: 'Beeld-in-beeld', + indicatorExitPictureInPicture: 'Beeld-in-beeld verlaten', + mediaErrorAborted: 'U heeft het afspelen van de media afgebroken', + mediaErrorNetwork: 'Een netwerkfout heeft ervoor gezorgd dat het downloaden van de media is mislukt.', + mediaErrorDecode: + 'Het afspelen van de media werd afgebroken vanwege een corruptieprobleem of omdat de uw browser de gebruikte mediafuncties niet ondersteund.', + mediaErrorSrcNotSupported: + 'De media kon niet worden geladen, doordat de server of het netwerk faalde of doordat het formaat niet wordt ondersteund.', + mediaErrorEncrypted: 'De media is gecodeerd en we hebben niet de sleutels om het te decoderen.', + mediaErrorCustom: '', + errorDialogTitle: 'Er is iets misgegaan.', + errorDialogDismiss: 'Sluiten', + mediaErrorFallback: 'Er is een fout opgetreden. Probeer het opnieuw.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/nn.ts b/packages/core/src/core/i18n/locales/nn.ts new file mode 100644 index 00000000..335c3a78 --- /dev/null +++ b/packages/core/src/core/i18n/locales/nn.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Spel', + pause: 'Pause', + replay: 'Spel om att', + mute: 'Lyd av', + unmute: 'Lyd på', + seekForward: 'Hopp fram {seconds} sekund', + seekBackward: 'Hopp tilbake {seconds} sekund', + enterFullscreen: 'Fullskjerm', + exitFullscreen: 'Stenga fullskjerm', + enableCaptions: 'Slå på teksting', + disableCaptions: 'Slå av teksting', + enterPictureInPicture: 'Bilete-i-bilete', + exitPictureInPicture: 'Avslutt bilete-i-bilete', + playingLive: 'Spelar live', + seekToLiveEdge: 'Hopp til live', + liveBadge: 'Direkte', + startCasting: 'Start sending', + stopCasting: 'Stopp sending', + connectingCast: 'Koplar til', + seek: 'Spol', + volume: 'Volumnivå', + timeCurrent: 'Aktuell tid', + timeDuration: 'Varigheit', + timeRemaining: 'Tid attende', + timeRemainingPhrase: '{duration} att', + playbackRateAria: 'Avspelingshastigheit {rate}', + timeSliderValueTextRange: '{current} av {duration}', + volumeSliderValueTextMuted: '{percent}, dempa', + indicatorMuted: 'Dempa', + indicatorVolume: 'Volum', + indicatorVolumeWithValue: 'Volum {value}', + indicatorCaptionsOn: 'Teksting på', + indicatorCaptionsOff: 'Teksting av', + indicatorPaused: 'Satt på pause', + indicatorPlaying: 'Spelar', + indicatorFullscreen: 'Fullskjerm', + indicatorExitFullscreen: 'Stenga fullskjerm', + indicatorPictureInPicture: 'Bilete i bilete', + indicatorExitPictureInPicture: 'Avslutt bilete i bilete', + mediaErrorAborted: 'Du avbraut avspelinga.', + mediaErrorNetwork: 'Ein nettverksfeil avbraut nedlasting av videoen.', + mediaErrorDecode: + 'Videoavspelinga blei broten på grunn av øydelagde data eller av di videoen ville gjera noe som nettlesaren din ikkje stodar.', + mediaErrorSrcNotSupported: + 'Videoen kunne ikkje lastas ned, på grunn av ein nettverksfeil eller serverfeil, eller av di formatet ikkje er stoda.', + mediaErrorEncrypted: 'Mediefila er kryptert og vi manglar nyklar for å dekryptere ho.', + mediaErrorCustom: '', + errorDialogTitle: 'Noko gjekk gale.', + errorDialogDismiss: 'Lukk', + mediaErrorFallback: 'Det oppstod ein feil. Ver venleg prøv igjen.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/oc.ts b/packages/core/src/core/i18n/locales/oc.ts new file mode 100644 index 00000000..a27210b2 --- /dev/null +++ b/packages/core/src/core/i18n/locales/oc.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Lectura', + pause: 'Pausa', + replay: 'Tornar legir', + mute: 'Copar lo son', + unmute: 'Restablir lo son', + seekForward: 'Avançar de {seconds} segondas', + seekBackward: 'Recular de {seconds} segondas', + enterFullscreen: 'Ecran complèt', + exitFullscreen: 'Sortir del ecran complèt', + enableCaptions: 'Activar los subtítols', + disableCaptions: 'Desactivar los subtítols', + enterPictureInPicture: 'Vidèo incrustada', + exitPictureInPicture: 'Sortir de la vidèo incrustada', + playingLive: 'Lectura dirècta', + seekToLiveEdge: 'Anar al dirècte', + liveBadge: 'Dirècte', + startCasting: 'Anar en dirècte', + stopCasting: 'Aturar la difusion', + connectingCast: 'Connexion en cors', + seek: 'Desfilament', + volume: 'Nivèl del volum', + timeCurrent: 'Durada passada', + timeDuration: 'Durada', + timeRemaining: 'Temps restant', + timeRemainingPhrase: 'Demòra {duration}', + playbackRateAria: 'Velocitat de lectura {rate}', + timeSliderValueTextRange: '{current} sus {duration}', + volumeSliderValueTextMuted: '{percent}, silenciat', + indicatorMuted: 'Silenciat', + indicatorVolume: 'Volum', + indicatorVolumeWithValue: 'Volum {value}', + indicatorCaptionsOn: 'Legendas activadas', + indicatorCaptionsOff: 'Legendas desactivadas', + indicatorPaused: 'En pausa', + indicatorPlaying: 'En lectura', + indicatorFullscreen: 'Ecran complèt', + indicatorExitFullscreen: "Sortir de l'ecran complèt", + indicatorPictureInPicture: 'Vidèo incrustada', + indicatorExitPictureInPicture: 'Sortir de la vidèo incrustada', + mediaErrorAborted: 'Avètz copat la lectura del mèdia.', + mediaErrorNetwork: 'Una error de ret a provocat un fracàs del telecargament.', + mediaErrorDecode: + "La lectura del mèdia es copada a causa d'un problèma de corrupcion o perque lo mèdia utiliza de foncionalitats pas suportadas pel navigador.", + mediaErrorSrcNotSupported: + 'Lo mèdia a pas pogut èsser cargat, siá perque lo servidor o lo ret a fracassat siá perque lo format es pas compatible.', + mediaErrorEncrypted: 'Lo mèdia es chifrat e avèm pas las claus per lo deschifrar.', + mediaErrorCustom: '', + errorDialogTitle: "Quaucarèn s'es mal passat.", + errorDialogDismiss: 'Tampar', + mediaErrorFallback: "Una error s'es produsida. Provatz d'un autre còp.", +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/pl.ts b/packages/core/src/core/i18n/locales/pl.ts new file mode 100644 index 00000000..1f300b0c --- /dev/null +++ b/packages/core/src/core/i18n/locales/pl.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Odtwórz', + pause: 'Wstrzymaj', + replay: 'Odtwórz ponownie', + mute: 'Wycisz', + unmute: 'Wyłącz wyciszenie', + seekForward: 'Przewiń do przodu o {seconds} s', + seekBackward: 'Przewiń do tyłu o {seconds} s', + enterFullscreen: 'Pełny ekran', + exitFullscreen: 'Wyjdź z trybu pełnoekranowego', + enableCaptions: 'Włącz napisy', + disableCaptions: 'Wyłącz napisy', + enterPictureInPicture: 'Obraz w obrazie', + exitPictureInPicture: 'Wyjdź z trybu obraz w obrazie', + playingLive: 'Odtwarzanie na żywo', + seekToLiveEdge: 'Przejdź na transmisję na żywo', + liveBadge: 'Na żywo', + startCasting: 'Rozpocznij przesyłanie', + stopCasting: 'Zatrzymaj przesyłanie', + connectingCast: 'Łączenie', + seek: 'Przewijanie', + volume: 'Poziom głośności', + timeCurrent: 'Aktualny czas', + timeDuration: 'Czas trwania', + timeRemaining: 'Pozostały czas', + timeRemainingPhrase: 'Pozostało {duration}', + playbackRateAria: 'Prędkość odtwarzania {rate}', + timeSliderValueTextRange: '{current} z {duration}', + volumeSliderValueTextMuted: '{percent}, wyciszono', + indicatorMuted: 'Wyciszono', + indicatorVolume: 'Głośność', + indicatorVolumeWithValue: 'Głośność {value}', + indicatorCaptionsOn: 'Napisy włączone', + indicatorCaptionsOff: 'Napisy wyłączone', + indicatorPaused: 'Wstrzymano', + indicatorPlaying: 'Odtwarzanie', + indicatorFullscreen: 'Pełny ekran', + indicatorExitFullscreen: 'Wyjdź z pełnego ekranu', + indicatorPictureInPicture: 'Obraz w obrazie', + indicatorExitPictureInPicture: 'Wyjdź z obrazu w obrazie', + mediaErrorAborted: 'Odtwarzanie zostało przerwane', + mediaErrorNetwork: 'Błąd sieci spowodował częściowe niepowodzenie pobierania materiału wideo.', + mediaErrorDecode: + 'Odtwarzanie materiału wideo zostało przerwane z powodu uszkodzonego pliku wideo lub z powodu użycia funkcji multimediów nieobsługiwanych przez Twoją przeglądarkę.', + mediaErrorSrcNotSupported: + 'Materiał wideo nie może zostać załadowany, ponieważ wystąpił problem z serwerem lub siecią albo format materiału wideo nie jest obsługiwany', + mediaErrorEncrypted: 'Materiał jest zaszyfrowany, a nie mamy kluczy do jego odszyfrowania.', + mediaErrorCustom: '', + errorDialogTitle: 'Coś poszło nie tak.', + errorDialogDismiss: 'Zamknij', + mediaErrorFallback: 'Wystąpił błąd. Spróbuj ponownie.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/pt-BR.ts b/packages/core/src/core/i18n/locales/pt-BR.ts new file mode 100644 index 00000000..48f12d1b --- /dev/null +++ b/packages/core/src/core/i18n/locales/pt-BR.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Tocar', + pause: 'Pausar', + replay: 'Tocar novamente', + mute: 'Mudo', + unmute: 'Ativar o som', + seekForward: 'Avançar {seconds} segundos', + seekBackward: 'Retroceder {seconds} segundos', + enterFullscreen: 'Tela Cheia', + exitFullscreen: 'Sair da tela cheia', + enableCaptions: 'Ativar legendas', + disableCaptions: 'Desativar legendas', + enterPictureInPicture: 'Picture-in-Picture', + exitPictureInPicture: 'Sair de Picture-in-Picture', + playingLive: 'Reproduzindo ao vivo', + seekToLiveEdge: 'Ir para o ao vivo', + liveBadge: 'Ao vivo', + startCasting: 'Iniciar transmissão', + stopCasting: 'Parar transmissão', + connectingCast: 'Conectando', + seek: 'Buscar', + volume: 'Nível de volume', + timeCurrent: 'Tempo', + timeDuration: 'Duração', + timeRemaining: 'Tempo Restante', + timeRemainingPhrase: 'Restam {duration}', + playbackRateAria: 'Velocidade {rate}', + timeSliderValueTextRange: '{current} de {duration}', + volumeSliderValueTextMuted: '{percent}, silenciado', + indicatorMuted: 'Silenciado', + indicatorVolume: 'Nível de volume', + indicatorVolumeWithValue: 'Nível de volume {value}', + indicatorCaptionsOn: 'Legendas ativadas', + indicatorCaptionsOff: 'Legendas desativadas', + indicatorPaused: 'Pausado', + indicatorPlaying: 'Reproduzindo', + indicatorFullscreen: 'Tela cheia', + indicatorExitFullscreen: 'Sair da tela cheia', + indicatorPictureInPicture: 'Picture-in-picture', + indicatorExitPictureInPicture: 'Sair do picture-in-picture', + mediaErrorAborted: 'Você parou a execução do vídeo.', + mediaErrorNetwork: 'Um erro na rede causou falha durante o download da mídia.', + mediaErrorDecode: + 'A reprodução foi interrompida devido à um problema de mídia corrompida ou porque a mídia utiliza funções que seu navegador não suporta.', + mediaErrorSrcNotSupported: + 'A mídia não pode ser carregada, por uma falha de rede ou servidor ou o formato não é suportado.', + mediaErrorEncrypted: 'A mídia está criptografada e não temos as chaves para descriptografar.', + mediaErrorCustom: '', + errorDialogTitle: 'Algo deu errado.', + errorDialogDismiss: 'Fechar', + mediaErrorFallback: 'Ocorreu um erro. Tente novamente.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/pt-PT.ts b/packages/core/src/core/i18n/locales/pt-PT.ts new file mode 100644 index 00000000..71df5de8 --- /dev/null +++ b/packages/core/src/core/i18n/locales/pt-PT.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Reproduzir', + pause: 'Pausar', + replay: 'Reiniciar', + mute: 'Desativar som', + unmute: 'Ativar som', + seekForward: 'Avançar {seconds} segundos', + seekBackward: 'Recuar {seconds} segundos', + enterFullscreen: 'Ecrã inteiro', + exitFullscreen: 'Sair de ecrã inteiro', + enableCaptions: 'Ativar legendas', + disableCaptions: 'Desativar legendas', + enterPictureInPicture: 'Imagem em imagem', + exitPictureInPicture: 'Sair de imagem em imagem', + playingLive: 'A reproduzir em direto', + seekToLiveEdge: 'Ir para o em direto', + liveBadge: 'Em direto', + startCasting: 'Iniciar transmissão', + stopCasting: 'Parar transmissão', + connectingCast: 'A ligar', + seek: 'Procurar', + volume: 'Nível de volume', + timeCurrent: 'Tempo Atual', + timeDuration: 'Duração', + timeRemaining: 'Tempo Restante', + timeRemainingPhrase: 'Restam {duration}', + playbackRateAria: 'Velocidade de reprodução {rate}', + timeSliderValueTextRange: '{current} de {duration}', + volumeSliderValueTextMuted: '{percent}, sem som', + indicatorMuted: 'Sem som', + indicatorVolume: 'Nível de volume', + indicatorVolumeWithValue: 'Nível de volume {value}', + indicatorCaptionsOn: 'Legendas ativas', + indicatorCaptionsOff: 'Legendas desativadas', + indicatorPaused: 'Em pausa', + indicatorPlaying: 'A reproduzir', + indicatorFullscreen: 'Ecrã inteiro', + indicatorExitFullscreen: 'Sair de ecrã inteiro', + indicatorPictureInPicture: 'Imagem em imagem', + indicatorExitPictureInPicture: 'Sair de imagem em imagem', + mediaErrorAborted: 'Parou a reprodução do vídeo.', + mediaErrorNetwork: 'Um erro na rede fez o vídeo falhar parcialmente.', + mediaErrorDecode: + 'A reprodução foi interrompida por um problema com o vídeo ou porque o formato não é compatível com o seu navegador.', + mediaErrorSrcNotSupported: + 'O vídeo não pode ser carregado, ou porque houve um problema na rede ou no servidor, ou porque o formato do vídeo não é compatível.', + mediaErrorEncrypted: 'O vídeo está encriptado e não há uma chave para o desencriptar.', + mediaErrorCustom: '', + errorDialogTitle: 'Algo correu mal.', + errorDialogDismiss: 'Fechar', + mediaErrorFallback: 'Ocorreu um erro. Por favor tente novamente.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/pt.ts b/packages/core/src/core/i18n/locales/pt.ts new file mode 100644 index 00000000..8607aa03 --- /dev/null +++ b/packages/core/src/core/i18n/locales/pt.ts @@ -0,0 +1,2 @@ +/** Alias for `lang="pt"` — same strings as `pt-BR`. */ +export { default } from './pt-BR'; diff --git a/packages/core/src/core/i18n/locales/ro.ts b/packages/core/src/core/i18n/locales/ro.ts new file mode 100644 index 00000000..a8d18527 --- /dev/null +++ b/packages/core/src/core/i18n/locales/ro.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Redare', + pause: 'Pauză', + replay: 'Reluare', + mute: 'Fără sunet', + unmute: 'Cu sunet', + seekForward: 'Salt înainte {seconds} secunde', + seekBackward: 'Salt înapoi {seconds} secunde', + enterFullscreen: 'Ecran complet', + exitFullscreen: 'Ieșire ecran complet', + enableCaptions: 'Activează subtitrările', + disableCaptions: 'Dezactivează subtitrările', + enterPictureInPicture: 'Imagine în imagine', + exitPictureInPicture: 'Închidere imagine în imagine', + playingLive: 'Redare în direct', + seekToLiveEdge: 'Salt la direct', + liveBadge: 'În direct', + startCasting: 'Pornire transmisie', + stopCasting: 'Oprire transmisie', + connectingCast: 'Se conectează', + seek: 'Derulare', + volume: 'Nivel volum', + timeCurrent: 'Ora curentă', + timeDuration: 'Durată', + timeRemaining: 'Timp rămas', + timeRemainingPhrase: 'Mai rămân {duration}', + playbackRateAria: 'Rată de redare {rate}', + timeSliderValueTextRange: '{current} din {duration}', + volumeSliderValueTextMuted: '{percent}, mut', + indicatorMuted: 'Mut', + indicatorVolume: 'Volum', + indicatorVolumeWithValue: 'Volum {value}', + indicatorCaptionsOn: 'Subtitrări activate', + indicatorCaptionsOff: 'Subtitrări dezactivate', + indicatorPaused: 'Pauză', + indicatorPlaying: 'Se redă', + indicatorFullscreen: 'Ecran complet', + indicatorExitFullscreen: 'Ieșire ecran complet', + indicatorPictureInPicture: 'Imagine în imagine', + indicatorExitPictureInPicture: 'Închidere imagine în imagine', + mediaErrorAborted: 'Ați abandonat redarea media', + mediaErrorNetwork: 'O eroare de rețea a provocat eșecul descărcării conținutului media în timpul procesului.', + mediaErrorDecode: + 'Redarea media a fost întreruptă din cauza conținutului corupt sau din cauza faptului că acest conținut media folosește funcții pe care browserul dvs. nu le acceptă.', + mediaErrorSrcNotSupported: + 'Conținutul media nu a putut fi încărcat, fie pentru că serverul sau rețeaua a eșuat, fie pentru că formatul nu este acceptat.', + mediaErrorEncrypted: 'Conținutul media este criptat și nu avem cheile pentru decriptare.', + mediaErrorCustom: '', + errorDialogTitle: 'Ceva a mers greșit.', + errorDialogDismiss: 'Închidere', + mediaErrorFallback: 'A apărut o eroare. Vă rugăm să încercați din nou.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/ru.ts b/packages/core/src/core/i18n/locales/ru.ts new file mode 100644 index 00000000..455e6694 --- /dev/null +++ b/packages/core/src/core/i18n/locales/ru.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Воспроизвести', + pause: 'Приостановить', + replay: 'Воспроизвести снова', + mute: 'Без звука', + unmute: 'Со звуком', + seekForward: 'На {seconds} секунд вперед', + seekBackward: 'На {seconds} секунд назад', + enterFullscreen: 'Полноэкранный режим', + exitFullscreen: 'Выйти из полноэкранного режима', + enableCaptions: 'Включить субтитры', + disableCaptions: 'Отключить субтитры', + enterPictureInPicture: 'Картинка в картинке', + exitPictureInPicture: 'Закрыть картинку в картинке', + playingLive: 'Прямой эфир', + seekToLiveEdge: 'Перейти к прямому эфиру', + liveBadge: 'Прямой эфир', + startCasting: 'Начать трансляцию', + stopCasting: 'Остановить трансляцию', + connectingCast: 'Подключение', + seek: 'Перемотка', + volume: 'Уровень громкости', + timeCurrent: 'Текущее время', + timeDuration: 'Продолжительность', + timeRemaining: 'Оставшееся время', + timeRemainingPhrase: 'Осталось {duration}', + playbackRateAria: 'Скорость воспроизведения {rate}', + timeSliderValueTextRange: '{current} из {duration}', + volumeSliderValueTextMuted: '{percent}, без звука', + indicatorMuted: 'Без звука', + indicatorVolume: 'Громкость', + indicatorVolumeWithValue: 'Громкость {value}', + indicatorCaptionsOn: 'Субтитры включены', + indicatorCaptionsOff: 'Субтитры выключены', + indicatorPaused: 'На паузе', + indicatorPlaying: 'Воспроизведение', + indicatorFullscreen: 'Полноэкранный режим', + indicatorExitFullscreen: 'Выйти из полноэкранного режима', + indicatorPictureInPicture: 'Картинка в картинке', + indicatorExitPictureInPicture: 'Выйти из режима «картинка в картинке»', + mediaErrorAborted: 'Вы прервали воспроизведение видео', + mediaErrorNetwork: 'Ошибка сети вызвала сбой во время загрузки.', + mediaErrorDecode: + 'Воспроизведение прервано из-за повреждения либо в связи с тем, что видео использует функции, неподдерживаемые вашим браузером.', + mediaErrorSrcNotSupported: + 'Не удалось загрузить видео из-за сетевого или серверного сбоя либо неподдерживаемого формата видео.', + mediaErrorEncrypted: 'Видео зашифровано, а у нас нет ключей для его расшифровки.', + mediaErrorCustom: '', + errorDialogTitle: 'Что-то пошло не так.', + errorDialogDismiss: 'Закрыть', + mediaErrorFallback: 'Произошла ошибка. Попробуйте снова.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/sk.ts b/packages/core/src/core/i18n/locales/sk.ts new file mode 100644 index 00000000..bf063686 --- /dev/null +++ b/packages/core/src/core/i18n/locales/sk.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Prehrať', + pause: 'Pozastaviť', + replay: 'Prehrať znova', + mute: 'Stlmiť', + unmute: 'Zrušiť stlmenie', + seekForward: 'Posunúť dopredu o {seconds} s', + seekBackward: 'Posunúť dozadu o {seconds} s', + enterFullscreen: 'Režim celej obrazovky', + exitFullscreen: 'Zavrieť režim celej obrazovky', + enableCaptions: 'Zapnúť titulky', + disableCaptions: 'Vypnúť titulky', + enterPictureInPicture: 'Obraz v obraze', + exitPictureInPicture: 'Zavrieť obraz v obraze', + playingLive: 'Prehráva sa naživo', + seekToLiveEdge: 'Prejsť na živé vysielanie', + liveBadge: 'Naživo', + startCasting: 'Spustiť prenos', + stopCasting: 'Zastaviť prenos', + connectingCast: 'Pripájam', + seek: 'Posun', + volume: 'Úroveň hlasitosti', + timeCurrent: 'Aktuálny čas', + timeDuration: 'Čas trvania', + timeRemaining: 'Zostávajúci čas', + timeRemainingPhrase: 'Zostáva {duration}', + playbackRateAria: 'Rýchlosť prehrávania {rate}', + timeSliderValueTextRange: '{current} z {duration}', + volumeSliderValueTextMuted: '{percent}, stlmené', + indicatorMuted: 'Stlmené', + indicatorVolume: 'Hlasitosť', + indicatorVolumeWithValue: 'Hlasitosť {value}', + indicatorCaptionsOn: 'Popisky zapnuté', + indicatorCaptionsOff: 'Popisky vypnuté', + indicatorPaused: 'Pozastavené', + indicatorPlaying: 'Prehráva sa', + indicatorFullscreen: 'Celá obrazovka', + indicatorExitFullscreen: 'Zavrieť celú obrazovku', + indicatorPictureInPicture: 'Obraz v obraze', + indicatorExitPictureInPicture: 'Zavrieť obraz v obraze', + mediaErrorAborted: 'Prerušili ste prehrávanie', + mediaErrorNetwork: 'Sťahovanie súboru bolo zrušené pre chybu na sieti.', + mediaErrorDecode: + 'Prehrávanie súboru bolo prerušené pre poškodené dáta, alebo súbor používa vlastnosti, ktoré váš prehliadač nepodporuje.', + mediaErrorSrcNotSupported: + 'Súbor sa nepodarilo načítať pre chybu servera, sieťového pripojenia, alebo je formát súboru nepodporovaný.', + mediaErrorEncrypted: 'Súbor je zašifrovaný a nie je k dispozícii kľúč na rozšifrovanie.', + mediaErrorCustom: '', + errorDialogTitle: 'Niečo sa pokazilo.', + errorDialogDismiss: 'Zatvoriť', + mediaErrorFallback: 'Vyskytla sa chyba. Skúste to znova.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/sl.ts b/packages/core/src/core/i18n/locales/sl.ts new file mode 100644 index 00000000..9806c815 --- /dev/null +++ b/packages/core/src/core/i18n/locales/sl.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Predvajaj', + pause: 'Začasno ustavi', + replay: 'Predvajaj ponovno', + mute: 'Izključi zvok', + unmute: 'Vključi zvok', + seekForward: 'Preskoči naprej {seconds} sekund', + seekBackward: 'Preskoči nazaj {seconds} sekund', + enterFullscreen: 'Celozaslonski prikaz', + exitFullscreen: 'Izhod iz celozaslonskega prikaza', + enableCaptions: 'Vklopi podnapise', + disableCaptions: 'Izklopi podnapise', + enterPictureInPicture: 'Slika v sliki', + exitPictureInPicture: 'Izhod iz slike v sliki', + playingLive: 'Predvajanje v živo', + seekToLiveEdge: 'Skoči na live', + liveBadge: 'V živo', + startCasting: 'Začni predvajanje na zaslonu', + stopCasting: 'Ustavi predvajanje na zaslonu', + connectingCast: 'Povezovanje', + seek: 'Premikanje', + volume: 'Raven glasnosti', + timeCurrent: 'Trenutni čas', + timeDuration: 'Trajanje', + timeRemaining: 'Preostali čas', + timeRemainingPhrase: 'Preostane {duration}', + playbackRateAria: 'Hitrost predvajanja {rate}', + timeSliderValueTextRange: '{current} od {duration}', + volumeSliderValueTextMuted: '{percent}, izklopljeno', + indicatorMuted: 'Izklopljeno', + indicatorVolume: 'Glasnost', + indicatorVolumeWithValue: 'Glasnost {value}', + indicatorCaptionsOn: 'Zvočni zapis vklopljen', + indicatorCaptionsOff: 'Zvočni zapis izklopljen', + indicatorPaused: 'Začasno ustavljeno', + indicatorPlaying: 'Predvaja', + indicatorFullscreen: 'Celozaslonski prikaz', + indicatorExitFullscreen: 'Izhod iz celozaslonskega prikaza', + indicatorPictureInPicture: 'Slika v sliki', + indicatorExitPictureInPicture: 'Izhod iz slike v sliki', + mediaErrorAborted: 'Prekinili ste predvajanje.', + mediaErrorNetwork: 'Prenos multimedijske datoteke ni uspel zaradi napake v omrežju.', + mediaErrorDecode: + 'Predvajanje datoteke je bilo prekinjeno zaradi napak v datoteki ali ker uporablja funkcije, ki jih brskalnik ne podpira.', + mediaErrorSrcNotSupported: + 'Multimedijske datoteke ni bilo mogoče naložiti zaradi napake na strežniku oziroma omrežju ali ker ta oblika ni podprta.', + mediaErrorEncrypted: 'Datoteka je šifrirana in predvajalnik nima ključev za njeno dešifriranje.', + mediaErrorCustom: '', + errorDialogTitle: 'Nekaj je šlo narobe.', + errorDialogDismiss: 'Zapri', + mediaErrorFallback: 'Prišlo je do napake. Poskusite znova.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/sr.ts b/packages/core/src/core/i18n/locales/sr.ts new file mode 100644 index 00000000..227dabc8 --- /dev/null +++ b/packages/core/src/core/i18n/locales/sr.ts @@ -0,0 +1,52 @@ +import type { Translations } from '../types'; + +export default { + play: 'Pusti', + pause: 'Pauza', + replay: 'Ponovi', + mute: 'Utišaj', + unmute: 'Poništi utišavanje', + seekForward: 'Premotaj unapred {seconds} sekundi', + seekBackward: 'Premotaj unazad {seconds} sekundi', + enterFullscreen: 'Pun ekran', + exitFullscreen: 'Izađi iz punog ekrana', + enableCaptions: 'Uključi titlove', + disableCaptions: 'Isključi titlove', + enterPictureInPicture: 'Slika u slici', + exitPictureInPicture: 'Izađi iz slike u slici', + playingLive: 'Reprodukcija uživo', + seekToLiveEdge: 'Idi na live', + liveBadge: 'Uživo', + startCasting: 'Počni emitovanje', + stopCasting: 'Zaustavi emitovanje', + connectingCast: 'Povezivanje', + seek: 'Premotavanje', + volume: 'Jačina zvuka', + timeCurrent: 'Trenutno vreme', + timeDuration: 'Vreme trajanja', + timeRemaining: 'Preostalo vreme', + timeRemainingPhrase: 'Preostalo {duration}', + playbackRateAria: 'Stopa reprodukcije {rate}', + timeSliderValueTextRange: '{current} od {duration}', + volumeSliderValueTextMuted: '{percent}, utišano', + indicatorMuted: 'Utišano', + indicatorVolume: 'Jačina zvuka', + indicatorVolumeWithValue: 'Jačina zvuka {value}', + indicatorCaptionsOn: 'Titlovi uključeni', + indicatorCaptionsOff: 'Titlovi isključeni', + indicatorPaused: 'Pauzirano', + indicatorPlaying: 'Reprodukuje se', + indicatorFullscreen: 'Pun ekran', + indicatorExitFullscreen: 'Izađi iz punog ekrana', + indicatorPictureInPicture: 'Slika u slici', + indicatorExitPictureInPicture: 'Izađi iz slike u slici', + mediaErrorAborted: 'Isključili ste reprodukciju videa.', + mediaErrorNetwork: 'Video se prestao preuzimati zbog greške na mreži.', + mediaErrorDecode: 'Reprodukcija videa je zaustavljena zbog greške u formatu ili zbog verzije vašeg pretraživača.', + mediaErrorSrcNotSupported: 'Video se ne može reproducirati zbog servera, greške u mreži ili format nije podržan.', + mediaErrorEncrypted: 'Medij je šifrovan i nema ključeva za dešifrovanje.', + mediaErrorCustom: '', + errorDialogTitle: 'Nešto je pošlo po zlu.', + errorDialogDismiss: 'Zatvori', + mediaErrorFallback: 'Došlo je do greške. Molimo pokušajte ponovo.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/sv.ts b/packages/core/src/core/i18n/locales/sv.ts new file mode 100644 index 00000000..d0545785 --- /dev/null +++ b/packages/core/src/core/i18n/locales/sv.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Spela', + pause: 'Pausa', + replay: 'Spela upp igen', + mute: 'Ljud av', + unmute: 'Ljud på', + seekForward: 'Hoppa framåt {seconds} sekunder', + seekBackward: 'Hoppa bakåt {seconds} sekunder', + enterFullscreen: 'Fullskärm', + exitFullscreen: 'Avsluta fullskärm', + enableCaptions: 'Aktivera textning', + disableCaptions: 'Inaktivera textning', + enterPictureInPicture: 'Bild-i-bild', + exitPictureInPicture: 'Avsluta bild-i-bild', + playingLive: 'Spelar live', + seekToLiveEdge: 'Gå till live', + liveBadge: 'Live', + startCasting: 'Starta casting', + stopCasting: 'Stoppa casting', + connectingCast: 'Ansluter', + seek: 'Spola', + volume: 'Volymnivå', + timeCurrent: 'Aktuell tid', + timeDuration: 'Total tid', + timeRemaining: 'Återstående tid', + timeRemainingPhrase: '{duration} kvar', + playbackRateAria: 'Uppspelningshastighet {rate}', + timeSliderValueTextRange: '{current} av {duration}', + volumeSliderValueTextMuted: '{percent}, tystat', + indicatorMuted: 'Tystat', + indicatorVolume: 'Volym', + indicatorVolumeWithValue: 'Volym {value}', + indicatorCaptionsOn: 'Text på', + indicatorCaptionsOff: 'Text av', + indicatorPaused: 'Pausad', + indicatorPlaying: 'Spelar', + indicatorFullscreen: 'Fullskärm', + indicatorExitFullscreen: 'Avsluta fullskärm', + indicatorPictureInPicture: 'Bild i bild', + indicatorExitPictureInPicture: 'Avsluta bild i bild', + mediaErrorAborted: 'Du har avbrutit videouppspelningen.', + mediaErrorNetwork: 'Ett nätverksfel gjorde att nedladdningen av videon avbröts.', + mediaErrorDecode: + 'Uppspelningen avbröts på grund av att videon är skadad, eller också för att videon använder funktioner som din webbläsare inte stöder.', + mediaErrorSrcNotSupported: + 'Det gick inte att ladda videon, antingen på grund av ett server- eller nätverksfel, eller för att formatet inte stöds.', + mediaErrorEncrypted: 'Mediat är krypterat och vi har inte nycklarna för att dekryptera det.', + mediaErrorCustom: '', + errorDialogTitle: 'Något gick fel.', + errorDialogDismiss: 'Stäng', + mediaErrorFallback: 'Ett fel uppstod. Försök igen.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/te.ts b/packages/core/src/core/i18n/locales/te.ts new file mode 100644 index 00000000..ae233f01 --- /dev/null +++ b/packages/core/src/core/i18n/locales/te.ts @@ -0,0 +1,52 @@ +import type { Translations } from '../types'; + +export default { + play: 'ప్లే', + pause: 'పాజ్', + replay: 'రీప్లే', + mute: 'మ్యూట్', + unmute: 'అన్మ్యూట్ చేయండి', + seekForward: '{seconds} సెకన్లు ముందుకు', + seekBackward: '{seconds} సెకన్లు వెనుకకు', + enterFullscreen: 'పూర్తి స్క్రీన్', + exitFullscreen: 'పూర్తి స్క్రీన్ నుండి నిష్క్రమించండి', + enableCaptions: 'శీర్షికలు', + disableCaptions: 'శీర్షికలు ఆఫ్ చేయండి', + enterPictureInPicture: 'పిక్చర్-ఇన్-పిక్చర్', + exitPictureInPicture: 'పిక్చర్-ఇన్-పిక్చర్ నుండి నిష్క్రమించండి', + playingLive: 'లైవ్‌లో ప్లే అవుతోంది', + seekToLiveEdge: 'లైవ్‌కు వెళ్లండి', + liveBadge: 'లైవ్', + startCasting: 'కాస్టింగ్ ప్రారంభించండి', + stopCasting: 'కాస్టింగ్ ఆపండి', + connectingCast: 'కనెక్ట్ అవుతోంది', + seek: 'శోధించు', + volume: 'వాల్యూమ్ స్థాయి', + timeCurrent: 'ప్రస్తుత సమయం', + timeDuration: 'వ్యవధి', + timeRemaining: 'మిగిలిన సమయం', + timeRemainingPhrase: '{duration} మిగిలి', + playbackRateAria: 'ప్లేబ్యాక్ రేట్ {rate}', + timeSliderValueTextRange: '{current} యొక్క {duration}', + volumeSliderValueTextMuted: '{percent}, మ్యూట్ చేయబడింది', + indicatorMuted: 'మ్యూట్ చేయబడింది', + indicatorVolume: 'వాల్యూమ్', + indicatorVolumeWithValue: 'వాల్యూమ్ {value}', + indicatorCaptionsOn: 'శీర్షికలు ఆన్', + indicatorCaptionsOff: 'శీర్షికలు ఆఫ్', + indicatorPaused: 'పాజ్ చేయబడింది', + indicatorPlaying: 'ప్లే అవుతోంది', + indicatorFullscreen: 'పూర్తి స్క్రీన్', + indicatorExitFullscreen: 'పూర్తి స్క్రీన్ నుండి నిష్క్రమించండి', + indicatorPictureInPicture: 'పిక్చర్ ఇన్ పిక్చర్', + indicatorExitPictureInPicture: 'పిక్చర్ ఇన్ పిక్చర్ నుండి నిష్క్రమించండి', + mediaErrorAborted: 'మీరు మీడియా ప్లేబ్యాక్‌ను రద్దు చేశారు', + mediaErrorNetwork: 'నెట్‌వర్క్ లోపం వలన మీడియా డౌన్‌లోడ్ విఫలమైంది.', + mediaErrorDecode: 'అవినీతి సమస్య కారణంగా లేదా మీ బ్రౌజర్ మద్దతు ఇవ్వని లక్షణాలను మీడియా ఉపయోగించినందున మీడియా ప్లేబ్యాక్ నిలిపివేయబడింది.', + mediaErrorSrcNotSupported: 'సర్వర్ లేదా నెట్‌వర్క్ విఫలమైనందున లేదా ఫార్మాట్‌కు మద్దతు లేనందున మీడియాను లోడ్ చేయడం సాధ్యం కాలేదు.', + mediaErrorEncrypted: 'మీడియా గుప్తీకరించబడింది మరియు దానిని డీక్రిప్ట్ చేయడానికి మాకు కీలు లేవు.', + mediaErrorCustom: '', + errorDialogTitle: 'ఏదో తప్పు జరిగింది.', + errorDialogDismiss: 'మూసివేయండి', + mediaErrorFallback: 'ఒక లోపం సంభవించింది. దయచేసి మళ్ళీ ప్రయత్నించండి.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/th.ts b/packages/core/src/core/i18n/locales/th.ts new file mode 100644 index 00000000..85b1609a --- /dev/null +++ b/packages/core/src/core/i18n/locales/th.ts @@ -0,0 +1,52 @@ +import type { Translations } from '../types'; + +export default { + play: 'เล่น', + pause: 'หยุดชั่วคราว', + replay: 'เล่นซ้ำ', + mute: 'ปิดเสียง', + unmute: 'ยกเลิกการปิดเสียง', + seekForward: 'ข้ามไปข้างหน้า {seconds} วินาที', + seekBackward: 'ข้ามไปข้างหลัง {seconds} วินาที', + enterFullscreen: 'แบบเต็มหน้าจอ', + exitFullscreen: 'ออกจากเต็มหน้าจอ', + enableCaptions: 'เปิดคำบรรยาย', + disableCaptions: 'ปิดคำบรรยาย', + enterPictureInPicture: 'การเล่นภาพควบคู่', + exitPictureInPicture: 'ออกจากการเล่นภาพควบคู่', + playingLive: 'กำลังถ่ายทอดสด', + seekToLiveEdge: 'ไปยังจุดถ่ายทอดสด', + liveBadge: 'ถ่ายทอดสด', + startCasting: 'เริ่มแคสต์', + stopCasting: 'หยุดแคสต์', + connectingCast: 'กำลังเชื่อมต่อ', + seek: 'ค้นหา', + volume: 'ระดับเสียง', + timeCurrent: 'เวลาปัจจุบัน', + timeDuration: 'ระยะเวลา', + timeRemaining: 'เวลาที่เหลือ', + timeRemainingPhrase: 'เหลือ {duration}', + playbackRateAria: 'อัตราการเล่น {rate}', + timeSliderValueTextRange: '{current} ของ {duration}', + volumeSliderValueTextMuted: '{percent}, ปิดเสียง', + indicatorMuted: 'ปิดเสียงแล้ว', + indicatorVolume: 'ระดับเสียง', + indicatorVolumeWithValue: 'ระดับเสียง {value}', + indicatorCaptionsOn: 'เปิดคำอธิบายภาพ', + indicatorCaptionsOff: 'ปิดคำอธิบายภาพ', + indicatorPaused: 'หยุดชั่วคราว', + indicatorPlaying: 'กำลังเล่น', + indicatorFullscreen: 'เต็มหน้าจอ', + indicatorExitFullscreen: 'ออกจากเต็มหน้าจอ', + indicatorPictureInPicture: 'ภาพซ้อนภาพ', + indicatorExitPictureInPicture: 'ออกจากภาพซ้อนภาพ', + mediaErrorAborted: 'คุณยกเลิกการเล่นสื่อแล้ว', + mediaErrorNetwork: 'ข้อผิดพลาดของเครือข่ายทำให้การดาวน์โหลดสื่อไม่สำเร็จเป็นบางส่วน', + mediaErrorDecode: 'การเล่นสื่อถูกยกเลิกเนื่องจากปัญหาเกี่ยวกับความเสียหาย หรือเนื่องจากสื่อใช้ฟีเจอร์ที่เบราว์เซอร์ของคุณไม่รองรับ', + mediaErrorSrcNotSupported: 'ไม่สามารถโหลดสื่อได้ โดยอาจเป็นเพราะเซิร์ฟเวอร์หรือเครือข่ายล้มเหลว หรือเพราะรูปแบบไม่ได้รับการรองรับ', + mediaErrorEncrypted: 'สื่อถูกเข้ารหัสลับแล้ว และเราไม่มีคีย์ที่จะถอดรหัสลับดังกล่าว', + mediaErrorCustom: '', + errorDialogTitle: 'เกิดข้อผิดพลาด', + errorDialogDismiss: 'ปิด', + mediaErrorFallback: 'เกิดข้อผิดพลาด กรุณาลองอีกครั้ง', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/tr.ts b/packages/core/src/core/i18n/locales/tr.ts new file mode 100644 index 00000000..d13ce240 --- /dev/null +++ b/packages/core/src/core/i18n/locales/tr.ts @@ -0,0 +1,53 @@ +import type { Translations } from '../types'; + +export default { + play: 'Oynat', + pause: 'Duraklat', + replay: 'Yeniden Oynat', + mute: 'Sessiz', + unmute: 'Sesi Aç', + seekForward: '{seconds} saniye ileri sar', + seekBackward: '{seconds} saniye geri sar', + enterFullscreen: 'Tam Ekran', + exitFullscreen: 'Tam Ekrandan Çık', + enableCaptions: 'Altyazıları aç', + disableCaptions: 'Altyazıları kapat', + enterPictureInPicture: 'Mini oynatıcı', + exitPictureInPicture: 'Mini oynatıcıdan çık', + playingLive: 'Canlı oynatılıyor', + seekToLiveEdge: 'Canlıya git', + liveBadge: 'Canlı', + startCasting: 'Yansıtmayı başlat', + stopCasting: 'Yansıtmayı durdur', + connectingCast: 'Bağlanıyor', + seek: 'Ara', + volume: 'Ses Düzeyi', + timeCurrent: 'Süre', + timeDuration: 'Toplam Süre', + timeRemaining: 'Kalan Süre', + timeRemainingPhrase: '{duration} kaldı', + playbackRateAria: 'Oynatma Hızı {rate}', + timeSliderValueTextRange: '{current} / {duration}', + volumeSliderValueTextMuted: '{percent}, sessiz', + indicatorMuted: 'Sessiz', + indicatorVolume: 'Ses', + indicatorVolumeWithValue: 'Ses {value}', + indicatorCaptionsOn: 'Altyazılar açık', + indicatorCaptionsOff: 'Altyazılar kapalı', + indicatorPaused: 'Duraklatıldı', + indicatorPlaying: 'Oynatılıyor', + indicatorFullscreen: 'Tam ekran', + indicatorExitFullscreen: 'Tam ekrandan çık', + indicatorPictureInPicture: 'Resim içinde resim', + indicatorExitPictureInPicture: 'Resim içinde resimden çık', + mediaErrorAborted: 'Medyayı oynatmayı iptal ettiniz', + mediaErrorNetwork: 'Medya indirme işleminin kısmen başarısız olmasına neden olan bir ağ sorunu oluştu.', + mediaErrorDecode: + 'Medya oynatma, bir bozulma sorunu nedeniyle veya medya, tarayıcınızın desteklemediği özellikleri kullandığı için durduruldu.', + mediaErrorSrcNotSupported: 'Sunucu veya ağ hatasından ya da biçim desteklenmediğinden medya yüklenemedi.', + mediaErrorEncrypted: 'Medya, şifrelenmiş bir kaynaktan geliyor ve oynatmak için gerekli anahtar bulunamadı.', + mediaErrorCustom: '', + errorDialogTitle: 'Bir şeyler ters gitti.', + errorDialogDismiss: 'Kapat', + mediaErrorFallback: 'Bir hata oluştu. Lütfen tekrar deneyin.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/uk.ts b/packages/core/src/core/i18n/locales/uk.ts new file mode 100644 index 00000000..d06df670 --- /dev/null +++ b/packages/core/src/core/i18n/locales/uk.ts @@ -0,0 +1,54 @@ +import type { Translations } from '../types'; + +export default { + play: 'Відтворити', + pause: 'Призупинити', + replay: 'Відтворити знову', + mute: 'Без звуку', + unmute: 'Зі звуком', + seekForward: 'Перемотати вперед на {seconds} с', + seekBackward: 'Перемотати назад на {seconds} с', + enterFullscreen: 'Повноекранний режим', + exitFullscreen: 'Вийти з повноекранного режиму', + enableCaptions: 'Увімкнути субтитри', + disableCaptions: 'Вимкнути субтитри', + enterPictureInPicture: 'Зображення в зображенні', + exitPictureInPicture: 'Вийти із режиму зображення в зображенні', + playingLive: 'Прямий ефір', + seekToLiveEdge: 'Перейти до прямого ефіру', + liveBadge: 'На живо', + startCasting: 'Почати трансляцію', + stopCasting: 'Зупинити трансляцію', + connectingCast: 'Підключення', + seek: 'Перемотка', + volume: 'Рівень гучності', + timeCurrent: 'Поточний час', + timeDuration: 'Тривалість', + timeRemaining: 'Час, що залишився', + timeRemainingPhrase: 'Залишилось {duration}', + playbackRateAria: 'Швидкість відтворення {rate}', + timeSliderValueTextRange: '{current} з {duration}', + volumeSliderValueTextMuted: '{percent}, вимкнено', + indicatorMuted: 'Вимкнено', + indicatorVolume: 'Гучність', + indicatorVolumeWithValue: 'Гучність {value}', + indicatorCaptionsOn: 'Підписи увімкнено', + indicatorCaptionsOff: 'Підписи вимкнено', + indicatorPaused: 'На паузі', + indicatorPlaying: 'Відтворення', + indicatorFullscreen: 'Повноекранний режим', + indicatorExitFullscreen: 'Вийти з повноекранного режиму', + indicatorPictureInPicture: 'Зображення в зображенні', + indicatorExitPictureInPicture: 'Вийти із режиму зображення в зображенні', + mediaErrorAborted: 'Ви припинили відтворення відео', + mediaErrorNetwork: 'Помилка мережі викликала збій під час завантаження відео.', + mediaErrorDecode: + "Відтворення відео було припинено через пошкодження або у зв'язку з тим, що відео використовує функції, які не підтримуються вашим браузером.", + mediaErrorSrcNotSupported: + 'Неможливо завантажити відео через мережевий чи серверний збій або формат не підтримується.', + mediaErrorEncrypted: 'Відео в зашифрованому вигляді, і ми не маємо ключі для розшифровки.', + mediaErrorCustom: '', + errorDialogTitle: 'Щось пішло не так.', + errorDialogDismiss: 'Закрити', + mediaErrorFallback: 'Сталася помилка. Будь ласка, спробуйте ще раз.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/vi.ts b/packages/core/src/core/i18n/locales/vi.ts new file mode 100644 index 00000000..9c7c4db8 --- /dev/null +++ b/packages/core/src/core/i18n/locales/vi.ts @@ -0,0 +1,52 @@ +import type { Translations } from '../types'; + +export default { + play: 'Phát', + pause: 'Tạm dừng', + replay: 'Phát lại', + mute: 'Tắt tiếng', + unmute: 'Bật âm thanh', + seekForward: 'Tua tới {seconds} giây', + seekBackward: 'Tua lại {seconds} giây', + enterFullscreen: 'Toàn màn hình', + exitFullscreen: 'Thoát toàn màn hình', + enableCaptions: 'Bật phụ đề', + disableCaptions: 'Tắt chú thích', + enterPictureInPicture: 'Màn hình trong màn hình', + exitPictureInPicture: 'Thoát màn hình trong màn hình', + playingLive: 'Đang phát trực tiếp', + seekToLiveEdge: 'Tua tới trực tiếp', + liveBadge: 'Trực tiếp', + startCasting: 'Bắt đầu truyền phát', + stopCasting: 'Dừng truyền phát', + connectingCast: 'Đang kết nối', + seek: 'Tua', + volume: 'Mức âm lượng', + timeCurrent: 'Thời gian hiện tại', + timeDuration: 'Độ dài', + timeRemaining: 'Thời gian còn lại', + timeRemainingPhrase: 'Còn {duration}', + playbackRateAria: 'Tỉ lệ phát lại {rate}', + timeSliderValueTextRange: '{current} của {duration}', + volumeSliderValueTextMuted: '{percent}, đã tắt tiếng', + indicatorMuted: 'Đã tắt tiếng', + indicatorVolume: 'Âm lượng', + indicatorVolumeWithValue: 'Âm lượng {value}', + indicatorCaptionsOn: 'Bật chú thích', + indicatorCaptionsOff: 'Tắt chú thích', + indicatorPaused: 'Đã tạm dừng', + indicatorPlaying: 'Đang phát', + indicatorFullscreen: 'Toàn màn hình', + indicatorExitFullscreen: 'Thoát toàn màn hình', + indicatorPictureInPicture: 'Màn hình trong màn hình', + indicatorExitPictureInPicture: 'Thoát màn hình trong màn hình', + mediaErrorAborted: 'Bạn đã hủy việc phát lại media.', + mediaErrorNetwork: 'Một lỗi mạng dẫn đến việc tải media bị lỗi.', + mediaErrorDecode: 'Phát media đã bị hủy do một sai lỗi hoặc media sử dụng những tính năng trình duyệt không hỗ trợ.', + mediaErrorSrcNotSupported: 'Video không tải được, mạng hay server có lỗi hoặc định dạng không được hỗ trợ.', + mediaErrorEncrypted: 'Media đã được mã hóa và chúng tôi không có khóa để giải mã.', + mediaErrorCustom: '', + errorDialogTitle: 'Đã xảy ra lỗi.', + errorDialogDismiss: 'Đóng', + mediaErrorFallback: 'Đã xảy ra lỗi. Vui lòng thử lại.', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/zh-CN.ts b/packages/core/src/core/i18n/locales/zh-CN.ts new file mode 100644 index 00000000..2b19c8df --- /dev/null +++ b/packages/core/src/core/i18n/locales/zh-CN.ts @@ -0,0 +1,52 @@ +import type { Translations } from '../types'; + +export default { + play: '播放', + pause: '暂停', + replay: '重新播放', + mute: '静音', + unmute: '开启音效', + seekForward: '快进 {seconds} 秒', + seekBackward: '快退 {seconds} 秒', + enterFullscreen: '全屏', + exitFullscreen: '退出全屏', + enableCaptions: '开启字幕', + disableCaptions: '关闭字幕', + enterPictureInPicture: '画中画', + exitPictureInPicture: '退出画中画', + playingLive: '正在直播', + seekToLiveEdge: '跳转到直播', + liveBadge: '直播', + startCasting: '开始投屏', + stopCasting: '停止投屏', + connectingCast: '正在连接', + seek: '定位', + volume: '音量', + timeCurrent: '当前时间', + timeDuration: '时长', + timeRemaining: '剩余时间', + timeRemainingPhrase: '剩余 {duration}', + playbackRateAria: '播放速度 {rate}', + timeSliderValueTextRange: '{current},总时长 {duration}', + volumeSliderValueTextMuted: '{percent},已静音', + indicatorMuted: '已静音', + indicatorVolume: '音量', + indicatorVolumeWithValue: '音量 {value}', + indicatorCaptionsOn: '字幕已开启', + indicatorCaptionsOff: '字幕已关闭', + indicatorPaused: '已暂停', + indicatorPlaying: '正在播放', + indicatorFullscreen: '全屏', + indicatorExitFullscreen: '退出全屏', + indicatorPictureInPicture: '画中画', + indicatorExitPictureInPicture: '退出画中画', + mediaErrorAborted: '视频播放被终止', + mediaErrorNetwork: '网络错误导致视频下载中途失败。', + mediaErrorDecode: '由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。', + mediaErrorSrcNotSupported: '视频因格式不支持或者服务器或网络的问题无法加载。', + mediaErrorEncrypted: '视频已加密,无法解密。', + mediaErrorCustom: '', + errorDialogTitle: '出现问题。', + errorDialogDismiss: '关闭', + mediaErrorFallback: '发生错误,请重试。', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/zh-TW.ts b/packages/core/src/core/i18n/locales/zh-TW.ts new file mode 100644 index 00000000..b95767aa --- /dev/null +++ b/packages/core/src/core/i18n/locales/zh-TW.ts @@ -0,0 +1,52 @@ +import type { Translations } from '../types'; + +export default { + play: '播放', + pause: '暫停', + replay: '重播', + mute: '靜音', + unmute: '開啟音效', + seekForward: '快轉 {seconds} 秒', + seekBackward: '倒轉 {seconds} 秒', + enterFullscreen: '全螢幕', + exitFullscreen: '退出全螢幕', + enableCaptions: '開啟字幕', + disableCaptions: '關閉字幕', + enterPictureInPicture: '子母畫面', + exitPictureInPicture: '離開子母畫面', + playingLive: '正在直播', + seekToLiveEdge: '跳轉至直播', + liveBadge: '直播', + startCasting: '開始投屏', + stopCasting: '停止投屏', + connectingCast: '連線中', + seek: '定位', + volume: '音量', + timeCurrent: '目前時間', + timeDuration: '總共時間', + timeRemaining: '剩餘時間', + timeRemainingPhrase: '剩餘 {duration}', + playbackRateAria: '播放速率 {rate}', + timeSliderValueTextRange: '{current},總時長 {duration}', + volumeSliderValueTextMuted: '{percent},已靜音', + indicatorMuted: '已靜音', + indicatorVolume: '音量', + indicatorVolumeWithValue: '音量 {value}', + indicatorCaptionsOn: '字幕已開啟', + indicatorCaptionsOff: '字幕已關閉', + indicatorPaused: '已暫停', + indicatorPlaying: '正在播放', + indicatorFullscreen: '全螢幕', + indicatorExitFullscreen: '退出全螢幕', + indicatorPictureInPicture: '子母畫面', + indicatorExitPictureInPicture: '離開子母畫面', + mediaErrorAborted: '影片播放已終止', + mediaErrorNetwork: '網路錯誤導致影片下載失敗。', + mediaErrorDecode: '由於影片檔案損毀或是該影片使用了您的瀏覽器不支援的功能,已終止播放媒體。', + mediaErrorSrcNotSupported: '因格式不支援、伺服器或網路的問題無法載入媒體。', + mediaErrorEncrypted: '媒體已加密,無法解密。', + mediaErrorCustom: '', + errorDialogTitle: '發生問題。', + errorDialogDismiss: '關閉', + mediaErrorFallback: '發生錯誤,請重試。', +} as const satisfies Partial; diff --git a/packages/core/src/core/i18n/locales/zh.ts b/packages/core/src/core/i18n/locales/zh.ts new file mode 100644 index 00000000..6bf47c16 --- /dev/null +++ b/packages/core/src/core/i18n/locales/zh.ts @@ -0,0 +1,2 @@ +/** Alias for `lang="zh"` — same strings as `zh-CN`. */ +export { default } from './zh-CN'; diff --git a/packages/core/src/core/i18n/registry.ts b/packages/core/src/core/i18n/registry.ts index eb772780..18635060 100644 --- a/packages/core/src/core/i18n/registry.ts +++ b/packages/core/src/core/i18n/registry.ts @@ -26,7 +26,7 @@ function stripUnicodeExtensions(tag: string): string { } /** Registry map key: normalized tag with unicode extensions removed (same base as {@link localeLookupChain}). */ -function canonicalLocaleRegistryKey(locale: string): string { +export function canonicalLocaleRegistryKey(locale: string): string { return stripUnicodeExtensions(normalizeLocaleTag(locale)); } diff --git a/packages/core/src/core/i18n/tests/load-locale.test.ts b/packages/core/src/core/i18n/tests/load-locale.test.ts new file mode 100644 index 00000000..afb74e0e --- /dev/null +++ b/packages/core/src/core/i18n/tests/load-locale.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, it } from 'vitest'; + +import { loadLocale } from '../load-locale'; +import { registerI18n, resetI18nRegistryForTesting } from '../registry'; + +describe('loadLocale', () => { + it('returns undefined for unknown tags', async () => { + await expect(loadLocale('xx-unknown')).resolves.toBeUndefined(); + }); + + it('skips tags already registered via registerI18n', async () => { + registerI18n('es', { play: 'Custom' }); + await expect(loadLocale('es')).resolves.toBeUndefined(); + resetI18nRegistryForTesting(); + }); + + it('loads shipped locale packs by tag', async () => { + const es = await loadLocale('es'); + expect(es?.play).toBe('Reproducir'); + }); + + it('loads alias tags', async () => { + const pt = await loadLocale('pt'); + expect(pt?.play).toBeTruthy(); + }); + + it('loads regional tags regardless of casing', async () => { + const ptBr = await loadLocale('pt-br'); + const zhTw = await loadLocale('zh-TW'); + expect(ptBr?.play).toBeTruthy(); + expect(zhTw?.play).toBeTruthy(); + }); + + it('loads regional tags via the locale lookup chain', async () => { + const esMx = await loadLocale('es-MX'); + expect(esMx?.play).toBe('Reproducir'); + }); + + it('loads packs when unicode locale extensions are present', async () => { + const zhCn = await loadLocale('zh-CN-u-nu-hans'); + expect(zhCn?.play).toBeTruthy(); + }); +}); diff --git a/packages/core/src/core/i18n/types.ts b/packages/core/src/core/i18n/types.ts index d5cfbf85..75c76ed6 100644 --- a/packages/core/src/core/i18n/types.ts +++ b/packages/core/src/core/i18n/types.ts @@ -1,8 +1,9 @@ +import type { BUILT_IN_LOCALES, LOCALE_ALIAS_TAGS } from './built-in-locales'; + /** Matches strings that include the literal substring `needle` (for example a `{param}` token). */ export type Contains = `${string}${Needle}${string}`; -/** Shipped built-in locale tags are expanded in a follow-up PR with locale packs. */ -export type BuiltInLocale = 'en'; +export type BuiltInLocale = (typeof BUILT_IN_LOCALES)[number] | (typeof LOCALE_ALIAS_TAGS)[number]; /** BCP 47 language tag; built-ins are narrowed for autocomplete. */ export type Locale = BuiltInLocale | (string & {}); diff --git a/packages/core/tsdown.config.ts b/packages/core/tsdown.config.ts index cdba9648..ab773b0a 100644 --- a/packages/core/tsdown.config.ts +++ b/packages/core/tsdown.config.ts @@ -2,10 +2,13 @@ import type { UserConfig } from 'tsdown'; import { defineConfig } from 'tsdown'; import { type PackageBuildMode, packageBuildConfig, packageBuildModes } from '../../build/tsdown.ts'; import packageJson from './package.json' with { type: 'json' }; +import { SHIPPED_LOCALE_TAGS } from './src/core/i18n/built-in-locales.ts'; -const localeEntries = { - 'i18n/locales/en': './src/core/i18n/locales/en.ts', -}; +const localeEntries = Object.fromEntries([ + ['i18n/locales/all', './src/core/i18n/locales/all.ts'], + ['i18n/locales/en', './src/core/i18n/locales/en.ts'], + ...SHIPPED_LOCALE_TAGS.map((tag) => [`i18n/locales/${tag}`, `./src/core/i18n/locales/${tag}.ts`]), +]); const createConfig = (mode: PackageBuildMode): UserConfig => ({ ...packageBuildConfig(mode, 'neutral'), diff --git a/packages/html/scripts/build-cdn-locales.ts b/packages/html/scripts/build-cdn-locales.ts new file mode 100644 index 00000000..2d4bd159 --- /dev/null +++ b/packages/html/scripts/build-cdn-locales.ts @@ -0,0 +1,20 @@ +import { mkdirSync, writeFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { SHIPPED_LOCALE_TAGS } from '../../core/src/core/i18n/built-in-locales.ts'; + +const REGISTRY = '@videojs/html/cdn/i18n-registry'; +const outDir = resolve(dirname(fileURLToPath(import.meta.url)), '../src/cdn/locales'); +const tags = SHIPPED_LOCALE_TAGS; + +mkdirSync(outDir, { recursive: true }); + +for (const tag of tags) { + const body = `import { registerI18n } from '${REGISTRY}'; +import translations from '@videojs/core/i18n/locales/${tag}'; + +registerI18n('${tag}', translations); +`; + writeFileSync(resolve(outDir, `${tag}.ts`), body); +} diff --git a/packages/html/src/cdn/i18n-registry.ts b/packages/html/src/cdn/i18n-registry.ts new file mode 100644 index 00000000..3227819b --- /dev/null +++ b/packages/html/src/cdn/i18n-registry.ts @@ -0,0 +1 @@ +export { registerI18n } from '@videojs/core/i18n'; diff --git a/packages/html/src/cdn/locales/.gitignore b/packages/html/src/cdn/locales/.gitignore new file mode 100644 index 00000000..6461deec --- /dev/null +++ b/packages/html/src/cdn/locales/.gitignore @@ -0,0 +1 @@ +*.ts diff --git a/packages/html/src/i18n/locales/all.ts b/packages/html/src/i18n/locales/all.ts new file mode 100644 index 00000000..e1016b19 --- /dev/null +++ b/packages/html/src/i18n/locales/all.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { all, type LocaleTag, localeTags } from '@videojs/core/i18n/locales/all'; diff --git a/packages/html/src/i18n/locales/ar.ts b/packages/html/src/i18n/locales/ar.ts new file mode 100644 index 00000000..0e389db2 --- /dev/null +++ b/packages/html/src/i18n/locales/ar.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ar'; diff --git a/packages/html/src/i18n/locales/az.ts b/packages/html/src/i18n/locales/az.ts new file mode 100644 index 00000000..6d46a490 --- /dev/null +++ b/packages/html/src/i18n/locales/az.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/az'; diff --git a/packages/html/src/i18n/locales/bg.ts b/packages/html/src/i18n/locales/bg.ts new file mode 100644 index 00000000..118cef65 --- /dev/null +++ b/packages/html/src/i18n/locales/bg.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/bg'; diff --git a/packages/html/src/i18n/locales/bn.ts b/packages/html/src/i18n/locales/bn.ts new file mode 100644 index 00000000..76d645b5 --- /dev/null +++ b/packages/html/src/i18n/locales/bn.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/bn'; diff --git a/packages/html/src/i18n/locales/bs.ts b/packages/html/src/i18n/locales/bs.ts new file mode 100644 index 00000000..ef50bd94 --- /dev/null +++ b/packages/html/src/i18n/locales/bs.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/bs'; diff --git a/packages/html/src/i18n/locales/ca.ts b/packages/html/src/i18n/locales/ca.ts new file mode 100644 index 00000000..050a7265 --- /dev/null +++ b/packages/html/src/i18n/locales/ca.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ca'; diff --git a/packages/html/src/i18n/locales/cs.ts b/packages/html/src/i18n/locales/cs.ts new file mode 100644 index 00000000..924e7107 --- /dev/null +++ b/packages/html/src/i18n/locales/cs.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/cs'; diff --git a/packages/html/src/i18n/locales/cy.ts b/packages/html/src/i18n/locales/cy.ts new file mode 100644 index 00000000..9c0bbd4a --- /dev/null +++ b/packages/html/src/i18n/locales/cy.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/cy'; diff --git a/packages/html/src/i18n/locales/da.ts b/packages/html/src/i18n/locales/da.ts new file mode 100644 index 00000000..9f3fd735 --- /dev/null +++ b/packages/html/src/i18n/locales/da.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/da'; diff --git a/packages/html/src/i18n/locales/de.ts b/packages/html/src/i18n/locales/de.ts new file mode 100644 index 00000000..67a9d0c5 --- /dev/null +++ b/packages/html/src/i18n/locales/de.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/de'; diff --git a/packages/html/src/i18n/locales/el.ts b/packages/html/src/i18n/locales/el.ts new file mode 100644 index 00000000..0e812607 --- /dev/null +++ b/packages/html/src/i18n/locales/el.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/el'; diff --git a/packages/html/src/i18n/locales/en.ts b/packages/html/src/i18n/locales/en.ts new file mode 100644 index 00000000..17569535 --- /dev/null +++ b/packages/html/src/i18n/locales/en.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/en'; diff --git a/packages/html/src/i18n/locales/es.ts b/packages/html/src/i18n/locales/es.ts new file mode 100644 index 00000000..592a8e3b --- /dev/null +++ b/packages/html/src/i18n/locales/es.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/es'; diff --git a/packages/html/src/i18n/locales/et.ts b/packages/html/src/i18n/locales/et.ts new file mode 100644 index 00000000..2cdaa205 --- /dev/null +++ b/packages/html/src/i18n/locales/et.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/et'; diff --git a/packages/html/src/i18n/locales/eu.ts b/packages/html/src/i18n/locales/eu.ts new file mode 100644 index 00000000..3aedfc0b --- /dev/null +++ b/packages/html/src/i18n/locales/eu.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/eu'; diff --git a/packages/html/src/i18n/locales/fa.ts b/packages/html/src/i18n/locales/fa.ts new file mode 100644 index 00000000..cad46b97 --- /dev/null +++ b/packages/html/src/i18n/locales/fa.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/fa'; diff --git a/packages/html/src/i18n/locales/fi.ts b/packages/html/src/i18n/locales/fi.ts new file mode 100644 index 00000000..c72f17ed --- /dev/null +++ b/packages/html/src/i18n/locales/fi.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/fi'; diff --git a/packages/html/src/i18n/locales/fr.ts b/packages/html/src/i18n/locales/fr.ts new file mode 100644 index 00000000..c71d6575 --- /dev/null +++ b/packages/html/src/i18n/locales/fr.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/fr'; diff --git a/packages/html/src/i18n/locales/gd.ts b/packages/html/src/i18n/locales/gd.ts new file mode 100644 index 00000000..4a9cdef7 --- /dev/null +++ b/packages/html/src/i18n/locales/gd.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/gd'; diff --git a/packages/html/src/i18n/locales/gl.ts b/packages/html/src/i18n/locales/gl.ts new file mode 100644 index 00000000..313cea85 --- /dev/null +++ b/packages/html/src/i18n/locales/gl.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/gl'; diff --git a/packages/html/src/i18n/locales/he.ts b/packages/html/src/i18n/locales/he.ts new file mode 100644 index 00000000..c108668f --- /dev/null +++ b/packages/html/src/i18n/locales/he.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/he'; diff --git a/packages/html/src/i18n/locales/hi.ts b/packages/html/src/i18n/locales/hi.ts new file mode 100644 index 00000000..53b36476 --- /dev/null +++ b/packages/html/src/i18n/locales/hi.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/hi'; diff --git a/packages/html/src/i18n/locales/hr.ts b/packages/html/src/i18n/locales/hr.ts new file mode 100644 index 00000000..bd7eab16 --- /dev/null +++ b/packages/html/src/i18n/locales/hr.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/hr'; diff --git a/packages/html/src/i18n/locales/hu.ts b/packages/html/src/i18n/locales/hu.ts new file mode 100644 index 00000000..a163f809 --- /dev/null +++ b/packages/html/src/i18n/locales/hu.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/hu'; diff --git a/packages/html/src/i18n/locales/it.ts b/packages/html/src/i18n/locales/it.ts new file mode 100644 index 00000000..fd1233ed --- /dev/null +++ b/packages/html/src/i18n/locales/it.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/it'; diff --git a/packages/html/src/i18n/locales/ja.ts b/packages/html/src/i18n/locales/ja.ts new file mode 100644 index 00000000..4e36df11 --- /dev/null +++ b/packages/html/src/i18n/locales/ja.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ja'; diff --git a/packages/html/src/i18n/locales/ko.ts b/packages/html/src/i18n/locales/ko.ts new file mode 100644 index 00000000..548d7bf6 --- /dev/null +++ b/packages/html/src/i18n/locales/ko.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ko'; diff --git a/packages/html/src/i18n/locales/lv.ts b/packages/html/src/i18n/locales/lv.ts new file mode 100644 index 00000000..c59135b4 --- /dev/null +++ b/packages/html/src/i18n/locales/lv.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/lv'; diff --git a/packages/html/src/i18n/locales/mr.ts b/packages/html/src/i18n/locales/mr.ts new file mode 100644 index 00000000..df74d3da --- /dev/null +++ b/packages/html/src/i18n/locales/mr.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/mr'; diff --git a/packages/html/src/i18n/locales/nb.ts b/packages/html/src/i18n/locales/nb.ts new file mode 100644 index 00000000..87bc17cf --- /dev/null +++ b/packages/html/src/i18n/locales/nb.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/nb'; diff --git a/packages/html/src/i18n/locales/ne.ts b/packages/html/src/i18n/locales/ne.ts new file mode 100644 index 00000000..7910ce89 --- /dev/null +++ b/packages/html/src/i18n/locales/ne.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ne'; diff --git a/packages/html/src/i18n/locales/nl.ts b/packages/html/src/i18n/locales/nl.ts new file mode 100644 index 00000000..9cc416cc --- /dev/null +++ b/packages/html/src/i18n/locales/nl.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/nl'; diff --git a/packages/html/src/i18n/locales/nn.ts b/packages/html/src/i18n/locales/nn.ts new file mode 100644 index 00000000..02a3df21 --- /dev/null +++ b/packages/html/src/i18n/locales/nn.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/nn'; diff --git a/packages/html/src/i18n/locales/oc.ts b/packages/html/src/i18n/locales/oc.ts new file mode 100644 index 00000000..c19d4111 --- /dev/null +++ b/packages/html/src/i18n/locales/oc.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/oc'; diff --git a/packages/html/src/i18n/locales/pl.ts b/packages/html/src/i18n/locales/pl.ts new file mode 100644 index 00000000..e4c4e758 --- /dev/null +++ b/packages/html/src/i18n/locales/pl.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/pl'; diff --git a/packages/html/src/i18n/locales/pt-BR.ts b/packages/html/src/i18n/locales/pt-BR.ts new file mode 100644 index 00000000..1c82e0f0 --- /dev/null +++ b/packages/html/src/i18n/locales/pt-BR.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/pt-BR'; diff --git a/packages/html/src/i18n/locales/pt-PT.ts b/packages/html/src/i18n/locales/pt-PT.ts new file mode 100644 index 00000000..248f58ee --- /dev/null +++ b/packages/html/src/i18n/locales/pt-PT.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/pt-PT'; diff --git a/packages/html/src/i18n/locales/pt.ts b/packages/html/src/i18n/locales/pt.ts new file mode 100644 index 00000000..99e488b4 --- /dev/null +++ b/packages/html/src/i18n/locales/pt.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/pt'; diff --git a/packages/html/src/i18n/locales/ro.ts b/packages/html/src/i18n/locales/ro.ts new file mode 100644 index 00000000..55fd4cc0 --- /dev/null +++ b/packages/html/src/i18n/locales/ro.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ro'; diff --git a/packages/html/src/i18n/locales/ru.ts b/packages/html/src/i18n/locales/ru.ts new file mode 100644 index 00000000..535f4973 --- /dev/null +++ b/packages/html/src/i18n/locales/ru.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ru'; diff --git a/packages/html/src/i18n/locales/sk.ts b/packages/html/src/i18n/locales/sk.ts new file mode 100644 index 00000000..418d05bc --- /dev/null +++ b/packages/html/src/i18n/locales/sk.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/sk'; diff --git a/packages/html/src/i18n/locales/sl.ts b/packages/html/src/i18n/locales/sl.ts new file mode 100644 index 00000000..e8f07397 --- /dev/null +++ b/packages/html/src/i18n/locales/sl.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/sl'; diff --git a/packages/html/src/i18n/locales/sr.ts b/packages/html/src/i18n/locales/sr.ts new file mode 100644 index 00000000..da2c2d73 --- /dev/null +++ b/packages/html/src/i18n/locales/sr.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/sr'; diff --git a/packages/html/src/i18n/locales/sv.ts b/packages/html/src/i18n/locales/sv.ts new file mode 100644 index 00000000..ed0d042f --- /dev/null +++ b/packages/html/src/i18n/locales/sv.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/sv'; diff --git a/packages/html/src/i18n/locales/te.ts b/packages/html/src/i18n/locales/te.ts new file mode 100644 index 00000000..4bcc9314 --- /dev/null +++ b/packages/html/src/i18n/locales/te.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/te'; diff --git a/packages/html/src/i18n/locales/th.ts b/packages/html/src/i18n/locales/th.ts new file mode 100644 index 00000000..5e24e370 --- /dev/null +++ b/packages/html/src/i18n/locales/th.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/th'; diff --git a/packages/html/src/i18n/locales/tr.ts b/packages/html/src/i18n/locales/tr.ts new file mode 100644 index 00000000..135a7f68 --- /dev/null +++ b/packages/html/src/i18n/locales/tr.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/tr'; diff --git a/packages/html/src/i18n/locales/uk.ts b/packages/html/src/i18n/locales/uk.ts new file mode 100644 index 00000000..f191b229 --- /dev/null +++ b/packages/html/src/i18n/locales/uk.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/uk'; diff --git a/packages/html/src/i18n/locales/vi.ts b/packages/html/src/i18n/locales/vi.ts new file mode 100644 index 00000000..e34b456a --- /dev/null +++ b/packages/html/src/i18n/locales/vi.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/vi'; diff --git a/packages/html/src/i18n/locales/zh-CN.ts b/packages/html/src/i18n/locales/zh-CN.ts new file mode 100644 index 00000000..712195e9 --- /dev/null +++ b/packages/html/src/i18n/locales/zh-CN.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/zh-CN'; diff --git a/packages/html/src/i18n/locales/zh-TW.ts b/packages/html/src/i18n/locales/zh-TW.ts new file mode 100644 index 00000000..c61e3979 --- /dev/null +++ b/packages/html/src/i18n/locales/zh-TW.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/zh-TW'; diff --git a/packages/html/src/i18n/locales/zh.ts b/packages/html/src/i18n/locales/zh.ts new file mode 100644 index 00000000..b561ec25 --- /dev/null +++ b/packages/html/src/i18n/locales/zh.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/zh'; diff --git a/packages/react/src/i18n/locales/all.ts b/packages/react/src/i18n/locales/all.ts new file mode 100644 index 00000000..e1016b19 --- /dev/null +++ b/packages/react/src/i18n/locales/all.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { all, type LocaleTag, localeTags } from '@videojs/core/i18n/locales/all'; diff --git a/packages/react/src/i18n/locales/ar.ts b/packages/react/src/i18n/locales/ar.ts new file mode 100644 index 00000000..0e389db2 --- /dev/null +++ b/packages/react/src/i18n/locales/ar.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ar'; diff --git a/packages/react/src/i18n/locales/az.ts b/packages/react/src/i18n/locales/az.ts new file mode 100644 index 00000000..6d46a490 --- /dev/null +++ b/packages/react/src/i18n/locales/az.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/az'; diff --git a/packages/react/src/i18n/locales/bg.ts b/packages/react/src/i18n/locales/bg.ts new file mode 100644 index 00000000..118cef65 --- /dev/null +++ b/packages/react/src/i18n/locales/bg.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/bg'; diff --git a/packages/react/src/i18n/locales/bn.ts b/packages/react/src/i18n/locales/bn.ts new file mode 100644 index 00000000..76d645b5 --- /dev/null +++ b/packages/react/src/i18n/locales/bn.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/bn'; diff --git a/packages/react/src/i18n/locales/bs.ts b/packages/react/src/i18n/locales/bs.ts new file mode 100644 index 00000000..ef50bd94 --- /dev/null +++ b/packages/react/src/i18n/locales/bs.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/bs'; diff --git a/packages/react/src/i18n/locales/ca.ts b/packages/react/src/i18n/locales/ca.ts new file mode 100644 index 00000000..050a7265 --- /dev/null +++ b/packages/react/src/i18n/locales/ca.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ca'; diff --git a/packages/react/src/i18n/locales/cs.ts b/packages/react/src/i18n/locales/cs.ts new file mode 100644 index 00000000..924e7107 --- /dev/null +++ b/packages/react/src/i18n/locales/cs.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/cs'; diff --git a/packages/react/src/i18n/locales/cy.ts b/packages/react/src/i18n/locales/cy.ts new file mode 100644 index 00000000..9c0bbd4a --- /dev/null +++ b/packages/react/src/i18n/locales/cy.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/cy'; diff --git a/packages/react/src/i18n/locales/da.ts b/packages/react/src/i18n/locales/da.ts new file mode 100644 index 00000000..9f3fd735 --- /dev/null +++ b/packages/react/src/i18n/locales/da.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/da'; diff --git a/packages/react/src/i18n/locales/de.ts b/packages/react/src/i18n/locales/de.ts new file mode 100644 index 00000000..67a9d0c5 --- /dev/null +++ b/packages/react/src/i18n/locales/de.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/de'; diff --git a/packages/react/src/i18n/locales/el.ts b/packages/react/src/i18n/locales/el.ts new file mode 100644 index 00000000..0e812607 --- /dev/null +++ b/packages/react/src/i18n/locales/el.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/el'; diff --git a/packages/react/src/i18n/locales/en.ts b/packages/react/src/i18n/locales/en.ts new file mode 100644 index 00000000..17569535 --- /dev/null +++ b/packages/react/src/i18n/locales/en.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/en'; diff --git a/packages/react/src/i18n/locales/es.ts b/packages/react/src/i18n/locales/es.ts new file mode 100644 index 00000000..592a8e3b --- /dev/null +++ b/packages/react/src/i18n/locales/es.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/es'; diff --git a/packages/react/src/i18n/locales/et.ts b/packages/react/src/i18n/locales/et.ts new file mode 100644 index 00000000..2cdaa205 --- /dev/null +++ b/packages/react/src/i18n/locales/et.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/et'; diff --git a/packages/react/src/i18n/locales/eu.ts b/packages/react/src/i18n/locales/eu.ts new file mode 100644 index 00000000..3aedfc0b --- /dev/null +++ b/packages/react/src/i18n/locales/eu.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/eu'; diff --git a/packages/react/src/i18n/locales/fa.ts b/packages/react/src/i18n/locales/fa.ts new file mode 100644 index 00000000..cad46b97 --- /dev/null +++ b/packages/react/src/i18n/locales/fa.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/fa'; diff --git a/packages/react/src/i18n/locales/fi.ts b/packages/react/src/i18n/locales/fi.ts new file mode 100644 index 00000000..c72f17ed --- /dev/null +++ b/packages/react/src/i18n/locales/fi.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/fi'; diff --git a/packages/react/src/i18n/locales/fr.ts b/packages/react/src/i18n/locales/fr.ts new file mode 100644 index 00000000..c71d6575 --- /dev/null +++ b/packages/react/src/i18n/locales/fr.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/fr'; diff --git a/packages/react/src/i18n/locales/gd.ts b/packages/react/src/i18n/locales/gd.ts new file mode 100644 index 00000000..4a9cdef7 --- /dev/null +++ b/packages/react/src/i18n/locales/gd.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/gd'; diff --git a/packages/react/src/i18n/locales/gl.ts b/packages/react/src/i18n/locales/gl.ts new file mode 100644 index 00000000..313cea85 --- /dev/null +++ b/packages/react/src/i18n/locales/gl.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/gl'; diff --git a/packages/react/src/i18n/locales/he.ts b/packages/react/src/i18n/locales/he.ts new file mode 100644 index 00000000..c108668f --- /dev/null +++ b/packages/react/src/i18n/locales/he.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/he'; diff --git a/packages/react/src/i18n/locales/hi.ts b/packages/react/src/i18n/locales/hi.ts new file mode 100644 index 00000000..53b36476 --- /dev/null +++ b/packages/react/src/i18n/locales/hi.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/hi'; diff --git a/packages/react/src/i18n/locales/hr.ts b/packages/react/src/i18n/locales/hr.ts new file mode 100644 index 00000000..bd7eab16 --- /dev/null +++ b/packages/react/src/i18n/locales/hr.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/hr'; diff --git a/packages/react/src/i18n/locales/hu.ts b/packages/react/src/i18n/locales/hu.ts new file mode 100644 index 00000000..a163f809 --- /dev/null +++ b/packages/react/src/i18n/locales/hu.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/hu'; diff --git a/packages/react/src/i18n/locales/it.ts b/packages/react/src/i18n/locales/it.ts new file mode 100644 index 00000000..fd1233ed --- /dev/null +++ b/packages/react/src/i18n/locales/it.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/it'; diff --git a/packages/react/src/i18n/locales/ja.ts b/packages/react/src/i18n/locales/ja.ts new file mode 100644 index 00000000..4e36df11 --- /dev/null +++ b/packages/react/src/i18n/locales/ja.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ja'; diff --git a/packages/react/src/i18n/locales/ko.ts b/packages/react/src/i18n/locales/ko.ts new file mode 100644 index 00000000..548d7bf6 --- /dev/null +++ b/packages/react/src/i18n/locales/ko.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ko'; diff --git a/packages/react/src/i18n/locales/lv.ts b/packages/react/src/i18n/locales/lv.ts new file mode 100644 index 00000000..c59135b4 --- /dev/null +++ b/packages/react/src/i18n/locales/lv.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/lv'; diff --git a/packages/react/src/i18n/locales/mr.ts b/packages/react/src/i18n/locales/mr.ts new file mode 100644 index 00000000..df74d3da --- /dev/null +++ b/packages/react/src/i18n/locales/mr.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/mr'; diff --git a/packages/react/src/i18n/locales/nb.ts b/packages/react/src/i18n/locales/nb.ts new file mode 100644 index 00000000..87bc17cf --- /dev/null +++ b/packages/react/src/i18n/locales/nb.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/nb'; diff --git a/packages/react/src/i18n/locales/ne.ts b/packages/react/src/i18n/locales/ne.ts new file mode 100644 index 00000000..7910ce89 --- /dev/null +++ b/packages/react/src/i18n/locales/ne.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ne'; diff --git a/packages/react/src/i18n/locales/nl.ts b/packages/react/src/i18n/locales/nl.ts new file mode 100644 index 00000000..9cc416cc --- /dev/null +++ b/packages/react/src/i18n/locales/nl.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/nl'; diff --git a/packages/react/src/i18n/locales/nn.ts b/packages/react/src/i18n/locales/nn.ts new file mode 100644 index 00000000..02a3df21 --- /dev/null +++ b/packages/react/src/i18n/locales/nn.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/nn'; diff --git a/packages/react/src/i18n/locales/oc.ts b/packages/react/src/i18n/locales/oc.ts new file mode 100644 index 00000000..c19d4111 --- /dev/null +++ b/packages/react/src/i18n/locales/oc.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/oc'; diff --git a/packages/react/src/i18n/locales/pl.ts b/packages/react/src/i18n/locales/pl.ts new file mode 100644 index 00000000..e4c4e758 --- /dev/null +++ b/packages/react/src/i18n/locales/pl.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/pl'; diff --git a/packages/react/src/i18n/locales/pt-BR.ts b/packages/react/src/i18n/locales/pt-BR.ts new file mode 100644 index 00000000..1c82e0f0 --- /dev/null +++ b/packages/react/src/i18n/locales/pt-BR.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/pt-BR'; diff --git a/packages/react/src/i18n/locales/pt-PT.ts b/packages/react/src/i18n/locales/pt-PT.ts new file mode 100644 index 00000000..248f58ee --- /dev/null +++ b/packages/react/src/i18n/locales/pt-PT.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/pt-PT'; diff --git a/packages/react/src/i18n/locales/pt.ts b/packages/react/src/i18n/locales/pt.ts new file mode 100644 index 00000000..99e488b4 --- /dev/null +++ b/packages/react/src/i18n/locales/pt.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/pt'; diff --git a/packages/react/src/i18n/locales/ro.ts b/packages/react/src/i18n/locales/ro.ts new file mode 100644 index 00000000..55fd4cc0 --- /dev/null +++ b/packages/react/src/i18n/locales/ro.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ro'; diff --git a/packages/react/src/i18n/locales/ru.ts b/packages/react/src/i18n/locales/ru.ts new file mode 100644 index 00000000..535f4973 --- /dev/null +++ b/packages/react/src/i18n/locales/ru.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/ru'; diff --git a/packages/react/src/i18n/locales/sk.ts b/packages/react/src/i18n/locales/sk.ts new file mode 100644 index 00000000..418d05bc --- /dev/null +++ b/packages/react/src/i18n/locales/sk.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/sk'; diff --git a/packages/react/src/i18n/locales/sl.ts b/packages/react/src/i18n/locales/sl.ts new file mode 100644 index 00000000..e8f07397 --- /dev/null +++ b/packages/react/src/i18n/locales/sl.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/sl'; diff --git a/packages/react/src/i18n/locales/sr.ts b/packages/react/src/i18n/locales/sr.ts new file mode 100644 index 00000000..da2c2d73 --- /dev/null +++ b/packages/react/src/i18n/locales/sr.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/sr'; diff --git a/packages/react/src/i18n/locales/sv.ts b/packages/react/src/i18n/locales/sv.ts new file mode 100644 index 00000000..ed0d042f --- /dev/null +++ b/packages/react/src/i18n/locales/sv.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/sv'; diff --git a/packages/react/src/i18n/locales/te.ts b/packages/react/src/i18n/locales/te.ts new file mode 100644 index 00000000..4bcc9314 --- /dev/null +++ b/packages/react/src/i18n/locales/te.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/te'; diff --git a/packages/react/src/i18n/locales/th.ts b/packages/react/src/i18n/locales/th.ts new file mode 100644 index 00000000..5e24e370 --- /dev/null +++ b/packages/react/src/i18n/locales/th.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/th'; diff --git a/packages/react/src/i18n/locales/tr.ts b/packages/react/src/i18n/locales/tr.ts new file mode 100644 index 00000000..135a7f68 --- /dev/null +++ b/packages/react/src/i18n/locales/tr.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/tr'; diff --git a/packages/react/src/i18n/locales/uk.ts b/packages/react/src/i18n/locales/uk.ts new file mode 100644 index 00000000..f191b229 --- /dev/null +++ b/packages/react/src/i18n/locales/uk.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/uk'; diff --git a/packages/react/src/i18n/locales/vi.ts b/packages/react/src/i18n/locales/vi.ts new file mode 100644 index 00000000..e34b456a --- /dev/null +++ b/packages/react/src/i18n/locales/vi.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/vi'; diff --git a/packages/react/src/i18n/locales/zh-CN.ts b/packages/react/src/i18n/locales/zh-CN.ts new file mode 100644 index 00000000..712195e9 --- /dev/null +++ b/packages/react/src/i18n/locales/zh-CN.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/zh-CN'; diff --git a/packages/react/src/i18n/locales/zh-TW.ts b/packages/react/src/i18n/locales/zh-TW.ts new file mode 100644 index 00000000..c61e3979 --- /dev/null +++ b/packages/react/src/i18n/locales/zh-TW.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/zh-TW'; diff --git a/packages/react/src/i18n/locales/zh.ts b/packages/react/src/i18n/locales/zh.ts new file mode 100644 index 00000000..b561ec25 --- /dev/null +++ b/packages/react/src/i18n/locales/zh.ts @@ -0,0 +1,2 @@ +/** Generated by packages/core/scripts/generate-i18n-locales.ts — do not edit. */ +export { default } from '@videojs/core/i18n/locales/zh';