diff --git a/ui/src/core/i18n/I18nProvider.test.tsx b/ui/src/core/i18n/I18nProvider.test.tsx
new file mode 100644
index 0000000..f0bdc97
--- /dev/null
+++ b/ui/src/core/i18n/I18nProvider.test.tsx
@@ -0,0 +1,46 @@
+import { act, render } from '@testing-library/react'
+import { describe, expect, it } from 'vitest'
+
+import { AppI18nProvider, createAppI18n, defaultLocale } from '@core/i18n'
+
+describe('AppI18nProvider', () => {
+ it('syncs document language and direction with the active i18n language', async () => {
+ const i18n = createAppI18n('ar')
+
+ render(
+
+
+ ,
+ )
+
+ expect(document.documentElement).toHaveAttribute('lang', 'ar')
+ expect(document.documentElement).toHaveAttribute('dir', 'rtl')
+
+ await act(async () => {
+ await i18n.changeLanguage('he')
+ })
+
+ expect(document.documentElement).toHaveAttribute('lang', 'he')
+ expect(document.documentElement).toHaveAttribute('dir', 'rtl')
+
+ await act(async () => {
+ await i18n.changeLanguage(defaultLocale)
+ })
+
+ expect(document.documentElement).toHaveAttribute('lang', defaultLocale)
+ expect(document.documentElement).toHaveAttribute('dir', 'ltr')
+ })
+
+ it('uses default document metadata for unsupported locales', () => {
+ const i18n = createAppI18n('zz')
+
+ render(
+
+
+ ,
+ )
+
+ expect(document.documentElement).toHaveAttribute('lang', defaultLocale)
+ expect(document.documentElement).toHaveAttribute('dir', 'ltr')
+ })
+})
diff --git a/ui/src/core/i18n/I18nProvider.tsx b/ui/src/core/i18n/I18nProvider.tsx
index 6fe5ace..0a12842 100644
--- a/ui/src/core/i18n/I18nProvider.tsx
+++ b/ui/src/core/i18n/I18nProvider.tsx
@@ -1,13 +1,42 @@
-import type { PropsWithChildren } from 'react'
+import { useEffect, type PropsWithChildren } from 'react'
import { I18nextProvider } from 'react-i18next'
import { appI18n } from './i18n'
+import { getDocumentLocale, getLocaleDirection } from './locales'
import type { i18n } from 'i18next'
+const syncDocumentLocale = (language: string) => {
+ const locale = getDocumentLocale(language)
+
+ document.documentElement.lang = locale
+ document.documentElement.dir = getLocaleDirection(locale)
+}
+
+const I18nDocumentMetadata = ({ i18n }: { i18n: i18n }) => {
+ useEffect(() => {
+ syncDocumentLocale(i18n.resolvedLanguage ?? i18n.language)
+
+ const handleLanguageChanged = (language: string) => {
+ syncDocumentLocale(language)
+ }
+
+ i18n.on('languageChanged', handleLanguageChanged)
+
+ return () => {
+ i18n.off('languageChanged', handleLanguageChanged)
+ }
+ }, [i18n])
+
+ return null
+}
+
export const AppI18nProvider = ({
children,
i18n = appI18n,
}: PropsWithChildren<{ i18n?: i18n }>) => (
- {children}
+
+
+ {children}
+
)
diff --git a/ui/src/core/i18n/i18n.test.ts b/ui/src/core/i18n/i18n.test.ts
index 5b9ebb3..4a96b41 100644
--- a/ui/src/core/i18n/i18n.test.ts
+++ b/ui/src/core/i18n/i18n.test.ts
@@ -1,6 +1,40 @@
import { describe, expect, it } from 'vitest'
-import { createAppI18n, defaultLocale } from '@core/i18n'
+import {
+ createAppI18n,
+ defaultLocale,
+ defaultNamespace,
+ getDocumentLocale,
+ getLocaleDirection,
+ publicLocales,
+ resources,
+} from '@core/i18n'
+
+type FlatResource = Record
+
+const flattenResource = (
+ value: unknown,
+ prefix = '',
+ result: FlatResource = {},
+): FlatResource => {
+ if (typeof value === 'string') {
+ result[prefix] = value
+ return result
+ }
+
+ if (!value || typeof value !== 'object') {
+ return result
+ }
+
+ for (const [key, child] of Object.entries(value)) {
+ flattenResource(child, prefix ? `${prefix}.${key}` : key, result)
+ }
+
+ return result
+}
+
+const placeholdersFor = (value: string) =>
+ [...value.matchAll(/\{\{([^}]+)\}\}/g)].map((match) => match[1]).sort()
describe('i18n', () => {
it('creates an English i18next instance with typed selector resources', () => {
@@ -14,8 +48,297 @@ describe('i18n', () => {
})
it('falls back to English for unsupported locales', () => {
- const i18n = createAppI18n('fr-FR')
+ const i18n = createAppI18n('zz')
expect(i18n.t(($) => $.decks.labels.dueToday)).toBe('Due Today')
})
+
+ it('maps public locales to document metadata', () => {
+ expect(getDocumentLocale('ar')).toBe('ar')
+ expect(getDocumentLocale('zz')).toBe(defaultLocale)
+ expect(getLocaleDirection('fa')).toBe('rtl')
+ expect(getLocaleDirection('ar')).toBe('rtl')
+ expect(getLocaleDirection('he')).toBe('rtl')
+ expect(getLocaleDirection(defaultLocale)).toBe('ltr')
+ expect(getLocaleDirection('zz')).toBe('ltr')
+ })
+
+ it('loads each public locale through i18next resources', () => {
+ expect(publicLocales).toEqual([
+ 'en-US',
+ 'es',
+ 'pt-BR',
+ 'fr',
+ 'de',
+ 'ja',
+ 'zh-Hans',
+ 'zh-Hant',
+ 'ko',
+ 'id',
+ 'ru',
+ 'it',
+ 'nl',
+ 'tr',
+ 'pl',
+ 'vi',
+ 'cs',
+ 'uk',
+ 'hu',
+ 'sv',
+ 'ro',
+ 'el',
+ 'da',
+ 'fi',
+ 'sk',
+ 'bg',
+ 'th',
+ 'hr',
+ 'nb',
+ 'sr-Latn',
+ 'lt',
+ 'sl',
+ 'ca',
+ 'et',
+ 'lv',
+ 'bs',
+ 'fa',
+ 'ar',
+ 'he',
+ ])
+
+ expect(createAppI18n('es').t(($) => $.settings.labels.settings)).toBe('Ajustes')
+ expect(createAppI18n('pt-BR').t(($) => $.settings.labels.settings)).toBe(
+ 'Configurações',
+ )
+ expect(createAppI18n('fr').t(($) => $.settings.labels.settings)).toBe('Paramètres')
+ expect(createAppI18n('de').t(($) => $.settings.labels.settings)).toBe('Einstellungen')
+ expect(createAppI18n('ja').t(($) => $.settings.labels.settings)).toBe('設定')
+ expect(createAppI18n('zh-Hans').t(($) => $.settings.labels.settings)).toBe('设置')
+ expect(createAppI18n('zh-Hant').t(($) => $.settings.labels.settings)).toBe('設定')
+ expect(createAppI18n('ko').t(($) => $.settings.labels.settings)).toBe('설정')
+ expect(createAppI18n('id').t(($) => $.settings.labels.settings)).toBe('Pengaturan')
+ expect(createAppI18n('ru').t(($) => $.settings.labels.settings)).toBe('Настройки')
+ expect(createAppI18n('it').t(($) => $.settings.labels.settings)).toBe('Impostazioni')
+ expect(createAppI18n('nl').t(($) => $.settings.labels.settings)).toBe('Instellingen')
+ expect(createAppI18n('tr').t(($) => $.settings.labels.settings)).toBe('Ayarlar')
+ expect(createAppI18n('pl').t(($) => $.settings.labels.settings)).toBe('Ustawienia')
+ expect(createAppI18n('vi').t(($) => $.settings.labels.settings)).toBe('Cài đặt')
+ expect(createAppI18n('cs').t(($) => $.settings.labels.settings)).toBe('Nastavení')
+ expect(createAppI18n('uk').t(($) => $.settings.labels.settings)).toBe(
+ 'Налаштування',
+ )
+ expect(createAppI18n('hu').t(($) => $.settings.labels.settings)).toBe('Beállítások')
+ expect(createAppI18n('sv').t(($) => $.settings.labels.settings)).toBe('Inställningar')
+ expect(createAppI18n('ro').t(($) => $.settings.labels.settings)).toBe('Setări')
+ expect(createAppI18n('el').t(($) => $.settings.labels.settings)).toBe('Ρυθμίσεις')
+ expect(createAppI18n('da').t(($) => $.settings.labels.settings)).toBe(
+ 'Indstillinger',
+ )
+ expect(createAppI18n('fi').t(($) => $.settings.labels.settings)).toBe('Asetukset')
+ expect(createAppI18n('sk').t(($) => $.settings.labels.settings)).toBe('Nastavenia')
+ expect(createAppI18n('bg').t(($) => $.settings.labels.settings)).toBe('Настройки')
+ expect(createAppI18n('th').t(($) => $.settings.labels.settings)).toBe('การตั้งค่า')
+ expect(createAppI18n('hr').t(($) => $.settings.labels.settings)).toBe('Postavke')
+ expect(createAppI18n('nb').t(($) => $.settings.labels.settings)).toBe(
+ 'Innstillinger',
+ )
+ expect(createAppI18n('sr-Latn').t(($) => $.settings.labels.settings)).toBe(
+ 'Podešavanja',
+ )
+ expect(createAppI18n('lt').t(($) => $.settings.labels.settings)).toBe('Nustatymai')
+ expect(createAppI18n('sl').t(($) => $.settings.labels.settings)).toBe('Nastavitve')
+ expect(createAppI18n('ca').t(($) => $.settings.labels.settings)).toBe(
+ 'Configuració',
+ )
+ expect(createAppI18n('et').t(($) => $.settings.labels.settings)).toBe('Seaded')
+ expect(createAppI18n('lv').t(($) => $.settings.labels.settings)).toBe('Iestatījumi')
+ expect(createAppI18n('bs').t(($) => $.settings.labels.settings)).toBe('Postavke')
+ expect(createAppI18n('fa').t(($) => $.settings.labels.settings)).toBe('تنظیمات')
+ expect(createAppI18n('ar').t(($) => $.settings.labels.settings)).toBe('الإعدادات')
+ expect(createAppI18n('he').t(($) => $.settings.labels.settings)).toBe('הגדרות')
+ })
+
+ it('keeps locale resource keys and placeholders aligned with English', () => {
+ const defaultResource = flattenResource(resources[defaultLocale][defaultNamespace])
+ const defaultKeys = Object.keys(defaultResource).sort()
+
+ for (const locale of publicLocales) {
+ const localeResource = flattenResource(resources[locale][defaultNamespace])
+ const missingKeys = defaultKeys.filter((key) => !(key in localeResource))
+ const placeholderMismatches = defaultKeys.filter(
+ (key) =>
+ JSON.stringify(placeholdersFor(localeResource[key] ?? '')) !==
+ JSON.stringify(placeholdersFor(defaultResource[key])),
+ )
+
+ expect(missingKeys, locale).toEqual([])
+ expect(placeholderMismatches, locale).toEqual([])
+ }
+ })
+
+ it('uses Russian plural categories for count-based translations', () => {
+ const i18n = createAppI18n('ru')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 элемент')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 элемента')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 5 })).toBe('5 элементов')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 21 })).toBe('21 день назад')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 22 })).toBe('22 дня назад')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 25 })).toBe('25 дней назад')
+ })
+
+ it('uses Polish plural categories for count-based translations', () => {
+ const i18n = createAppI18n('pl')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 element')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 elementy')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 5 })).toBe('5 elementów')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('1 dzień temu')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('2 dni temu')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 5 })).toBe('5 dni temu')
+ })
+
+ it('uses Czech plural categories for count-based translations', () => {
+ const i18n = createAppI18n('cs')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 položka')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 položky')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 5 })).toBe('5 položek')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('před 1 dnem')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('před 2 dny')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 5 })).toBe('před 5 dny')
+ })
+
+ it('uses Croatian plural categories for count-based translations', () => {
+ const i18n = createAppI18n('hr')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 stavka')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 stavke')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 5 })).toBe('5 stavki')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('prije 1 dan')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('prije 2 dana')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 5 })).toBe('prije 5 dana')
+ })
+
+ it('uses Slovenian plural categories for count-based translations', () => {
+ const i18n = createAppI18n('sl')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 element')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 elementa')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 3 })).toBe('3 elementi')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 5 })).toBe('5 elementov')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('pred 1 dnem')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('pred 2 dnevoma')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 3 })).toBe('pred 3 dnevi')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 5 })).toBe('pred 5 dnevi')
+ })
+
+ it('uses Bosnian plural categories for count-based translations', () => {
+ const i18n = createAppI18n('bs')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 stavka')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 stavke')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 5 })).toBe('5 stavki')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('prije 1 dan')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('prije 2 dana')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 5 })).toBe('prije 5 dana')
+ })
+
+ it('uses Arabic plural categories for count-based translations', () => {
+ const i18n = createAppI18n('ar')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 0 })).toBe('0 عنصر')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 عنصر')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 عنصران')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 3 })).toBe('3 عناصر')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 11 })).toBe('11 عنصرا')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 100 })).toBe('100 عنصر')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 0 })).toBe('منذ 0 يوم')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('منذ 1 يوم')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('منذ 2 يومين')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 3 })).toBe('منذ 3 أيام')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 11 })).toBe('منذ 11 يوما')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 100 })).toBe('منذ 100 يوم')
+ })
+
+ it('uses Hebrew plural categories for count-based translations', () => {
+ const i18n = createAppI18n('he')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 פריט')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 פריטים')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 3 })).toBe('3 פריטים')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('לפני 1 יום')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('לפני 2 ימים')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 3 })).toBe('לפני 3 ימים')
+ })
+
+ it('uses Ukrainian plural categories for count-based translations', () => {
+ const i18n = createAppI18n('uk')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 елемент')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 елементи')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 5 })).toBe('5 елементів')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 21 })).toBe('21 день тому')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 22 })).toBe('22 дні тому')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 25 })).toBe('25 днів тому')
+ })
+
+ it('uses Slovak plural categories for count-based translations', () => {
+ const i18n = createAppI18n('sk')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 položka')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 položky')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 5 })).toBe('5 položiek')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('pred 1 dňom')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('pred 2 dňami')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 5 })).toBe('pred 5 dňami')
+ })
+
+ it('uses Serbian Latin plural categories for count-based translations', () => {
+ const i18n = createAppI18n('sr-Latn')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 stavka')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 stavke')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 5 })).toBe('5 stavki')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('pre 1 dan')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('pre 2 dana')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 5 })).toBe('pre 5 dana')
+ })
+
+ it('uses Lithuanian plural categories for count-based translations', () => {
+ const i18n = createAppI18n('lt')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 elementas')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 elementai')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 10 })).toBe('10 elementų')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('prieš 1 dieną')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('prieš 2 dienas')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 10 })).toBe('prieš 10 dienų')
+ })
+
+ it('uses Latvian plural categories for count-based translations', () => {
+ const i18n = createAppI18n('lv')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 0 })).toBe('0 vienumu')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 vienums')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 vienumi')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 0 })).toBe('pirms 0 dienām')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('pirms 1 dienas')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('pirms 2 dienām')
+ })
+
+ it('uses Romanian plural categories for count-based translations', () => {
+ const i18n = createAppI18n('ro')
+
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 1 })).toBe('1 element')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 2 })).toBe('2 elemente')
+ expect(i18n.t(($) => $.trash.labels.itemCount, { count: 21 })).toBe(
+ '21 de elemente',
+ )
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 1 })).toBe('acum 1 zi')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 2 })).toBe('acum 2 zile')
+ expect(i18n.t(($) => $.dates.age.dayAgo, { count: 21 })).toBe(
+ 'acum 21 de zile',
+ )
+ })
})
diff --git a/ui/src/core/i18n/index.ts b/ui/src/core/i18n/index.ts
index d248a72..a0ee3b9 100644
--- a/ui/src/core/i18n/index.ts
+++ b/ui/src/core/i18n/index.ts
@@ -2,9 +2,12 @@ export { AppI18nProvider } from './I18nProvider'
export { appI18n, createAppI18n } from './i18n'
export {
defaultLocale,
+ getDocumentLocale,
+ getLocaleDirection,
isPublicLocale,
publicLocales,
+ rtlLocales,
} from './locales'
export { defaultNamespace, resources } from './resources'
-export type { PublicLocale } from './locales'
+export type { LocaleDirection, PublicLocale } from './locales'
export type { TranslationResources } from './resources'
diff --git a/ui/src/core/i18n/locales.ts b/ui/src/core/i18n/locales.ts
index 2da2147..a8d937b 100644
--- a/ui/src/core/i18n/locales.ts
+++ b/ui/src/core/i18n/locales.ts
@@ -1,8 +1,57 @@
export const defaultLocale = 'en-US'
-export const publicLocales = [defaultLocale] as const
+export const publicLocales = [
+ defaultLocale,
+ 'es',
+ 'pt-BR',
+ 'fr',
+ 'de',
+ 'ja',
+ 'zh-Hans',
+ 'zh-Hant',
+ 'ko',
+ 'id',
+ 'ru',
+ 'it',
+ 'nl',
+ 'tr',
+ 'pl',
+ 'vi',
+ 'cs',
+ 'uk',
+ 'hu',
+ 'sv',
+ 'ro',
+ 'el',
+ 'da',
+ 'fi',
+ 'sk',
+ 'bg',
+ 'th',
+ 'hr',
+ 'nb',
+ 'sr-Latn',
+ 'lt',
+ 'sl',
+ 'ca',
+ 'et',
+ 'lv',
+ 'bs',
+ 'fa',
+ 'ar',
+ 'he',
+] as const
export type PublicLocale = (typeof publicLocales)[number]
+export type LocaleDirection = 'ltr' | 'rtl'
+
+export const rtlLocales = ['fa', 'ar', 'he'] satisfies readonly PublicLocale[]
export const isPublicLocale = (locale: string): locale is PublicLocale =>
publicLocales.includes(locale as PublicLocale)
+
+export const getLocaleDirection = (locale: string): LocaleDirection =>
+ rtlLocales.includes(locale as (typeof rtlLocales)[number]) ? 'rtl' : 'ltr'
+
+export const getDocumentLocale = (locale: string): PublicLocale =>
+ isPublicLocale(locale) ? locale : defaultLocale
diff --git a/ui/src/core/i18n/resources/ar.ts b/ui/src/core/i18n/resources/ar.ts
new file mode 100644
index 0000000..338d39a
--- /dev/null
+++ b/ui/src/core/i18n/resources/ar.ts
@@ -0,0 +1,675 @@
+export const ar = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'حاول مرة أخرى. إذا استمر ذلك، أعد فتح Clear.',
+ title: 'تعذر البدء',
+ },
+ loadingTitle: 'جار تحضير مساحة الدراسة الخاصة بك',
+ },
+ common: {
+ actions: {
+ back: 'رجوع',
+ cancel: 'إلغاء',
+ checkAgain: 'تحقق مرة أخرى',
+ close: 'إغلاق',
+ create: 'إنشاء',
+ delete: 'حذف',
+ dismissError: 'إخفاء الخطأ',
+ dismissStatus: 'إخفاء الحالة',
+ edit: 'تعديل',
+ itemActions: 'إجراءات {{title}}',
+ reset: 'إعادة ضبط',
+ review: 'مراجعة',
+ save: 'حفظ',
+ saveChanges: 'حفظ التغييرات',
+ tryAgain: 'حاول مرة أخرى',
+ },
+ labels: {
+ active: 'نشط',
+ clear: 'Clear',
+ custom: 'مخصص',
+ default: 'افتراضي',
+ loadingEditor: 'جار تحميل المحرر',
+ name: 'الاسم',
+ completedTask: 'مهمة مكتملة',
+ description: 'الوصف',
+ incompleteTask: 'مهمة غير مكتملة',
+ percentageInput: 'نسبة {{label}}',
+ visual: 'الشكل',
+ },
+ status: {
+ actionFailed: 'فشل الإجراء',
+ actionInProgress: 'الإجراء قيد التنفيذ',
+ },
+ sort: {
+ ascending: 'تصاعدي',
+ column: 'العمود',
+ descending: 'تنازلي',
+ direction: 'الاتجاه',
+ sort: 'فرز',
+ },
+ search: {
+ label: 'بحث',
+ },
+ visualPicker: {
+ allLucideIcons: 'كل أيقونات Lucide',
+ browseIconsFor: 'تصفح أو ابحث عن أيقونات لـ {{label}}.',
+ chooseIcon: 'اختر أيقونة',
+ iconPicker: 'منتقي أيقونة {{label}}',
+ iconSearch: 'بحث أيقونة {{label}}',
+ iconsCouldNotLoad: 'تعذر تحميل الأيقونات.',
+ loadingIcons: 'جار تحميل الأيقونات',
+ loadingMoreIcons: 'جار تحميل المزيد من الأيقونات',
+ moreIcons: 'المزيد من الأيقونات',
+ noIconsMatch: 'لا توجد أيقونات تطابق "{{query}}".',
+ searchIconsPlaceholder: 'ابحث عن أيقونات…',
+ selectedIcon: '{{label}} المحدد',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'إنشاء',
+ newDeck: 'مجموعة جديدة',
+ newFolder: 'مجلد جديد',
+ },
+ descriptions: {
+ defaultWorkspace: 'احتفظ بالمجموعات والمجلدات والملاحظات معا.',
+ emptyWorkspace: 'أنشئ مجموعة، ثم أضف ملاحظات لبناء قائمة المراجعة.',
+ emptyFolder: 'أنشئ مجموعة، ثم أضف ملاحظات لبناء قائمة مراجعة.',
+ searchPlaceholder: 'ابحث في المجلدات والمجموعات والملاحظات…',
+ },
+ empty: {
+ createFirstDeck: 'أنشئ أول مجموعة لك',
+ },
+ errors: {
+ couldNotDeleteDeck: 'تعذر حذف المجموعة',
+ couldNotDeleteFolder: 'تعذر حذف المجلد',
+ couldNotDeleteWorkspace: 'تعذر حذف مساحة العمل',
+ dashboardCouldNotOpen: 'تعذر فتح لوحة التحكم',
+ decksCouldNotLoad: 'تعذر تحميل المجموعات',
+ decksMayBeOutOfDate: 'قد تكون المجموعات قديمة',
+ foldersCouldNotLoad: 'تعذر تحميل المجلدات',
+ foldersMayBeOutOfDate: 'قد تكون المجلدات قديمة',
+ workspaceCouldNotLoad: 'تعذر تحميل مساحة العمل',
+ },
+ labels: {
+ dashboard: 'لوحة التحكم',
+ loadingDashboard: 'جار تحميل لوحة التحكم',
+ newItem: 'عنصر جديد',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'التاريخ غير متاح',
+ },
+ age: {
+ dayAgo_zero: 'منذ {{count}} يوم',
+ dayAgo_one: 'منذ {{count}} يوم',
+ dayAgo_two: 'منذ {{count}} يومين',
+ dayAgo_few: 'منذ {{count}} أيام',
+ dayAgo_many: 'منذ {{count}} يوما',
+ dayAgo_other: 'منذ {{count}} يوم',
+ hourAgo_zero: 'منذ {{count}} ساعة',
+ hourAgo_one: 'منذ {{count}} ساعة',
+ hourAgo_two: 'منذ {{count}} ساعتين',
+ hourAgo_few: 'منذ {{count}} ساعات',
+ hourAgo_many: 'منذ {{count}} ساعة',
+ hourAgo_other: 'منذ {{count}} ساعة',
+ justNow: 'الآن',
+ minuteAgo_zero: 'منذ {{count}} دقيقة',
+ minuteAgo_one: 'منذ {{count}} دقيقة',
+ minuteAgo_two: 'منذ {{count}} دقيقتين',
+ minuteAgo_few: 'منذ {{count}} دقائق',
+ minuteAgo_many: 'منذ {{count}} دقيقة',
+ minuteAgo_other: 'منذ {{count}} دقيقة',
+ unavailable: 'التاريخ غير متاح',
+ weekAgo_zero: 'منذ {{count}} أسبوع',
+ weekAgo_one: 'منذ {{count}} أسبوع',
+ weekAgo_two: 'منذ {{count}} أسبوعين',
+ weekAgo_few: 'منذ {{count}} أسابيع',
+ weekAgo_many: 'منذ {{count}} أسبوعا',
+ weekAgo_other: 'منذ {{count}} أسبوع',
+ },
+ labels: {
+ deleted: 'حذف {{value}}',
+ due: 'مستحق: {{value}}',
+ reviewed: 'تمت المراجعة: {{value}}',
+ updated: 'تم التحديث {{value}}',
+ updatedUppercase: 'تم التحديث {{value}}',
+ },
+ relative: {
+ dayAgo_zero: 'منذ {{count}} يوم',
+ dayAgo_one: 'منذ {{count}} يوم',
+ dayAgo_two: 'منذ {{count}} يومين',
+ dayAgo_few: 'منذ {{count}} أيام',
+ dayAgo_many: 'منذ {{count}} يوما',
+ dayAgo_other: 'منذ {{count}} يوم',
+ inAMoment: 'بعد لحظات',
+ inDay_zero: 'خلال {{count}} يوم',
+ inDay_one: 'خلال {{count}} يوم',
+ inDay_two: 'خلال {{count}} يومين',
+ inDay_few: 'خلال {{count}} أيام',
+ inDay_many: 'خلال {{count}} يوما',
+ inDay_other: 'خلال {{count}} يوم',
+ inMonth_zero: 'خلال {{count}} شهر',
+ inMonth_one: 'خلال {{count}} شهر',
+ inMonth_two: 'خلال {{count}} شهرين',
+ inMonth_few: 'خلال {{count}} أشهر',
+ inMonth_many: 'خلال {{count}} شهرا',
+ inMonth_other: 'خلال {{count}} شهر',
+ inWeek_zero: 'خلال {{count}} أسبوع',
+ inWeek_one: 'خلال {{count}} أسبوع',
+ inWeek_two: 'خلال {{count}} أسبوعين',
+ inWeek_few: 'خلال {{count}} أسابيع',
+ inWeek_many: 'خلال {{count}} أسبوعا',
+ inWeek_other: 'خلال {{count}} أسبوع',
+ justNow: 'الآن',
+ monthAgo_zero: 'منذ {{count}} شهر',
+ monthAgo_one: 'منذ {{count}} شهر',
+ monthAgo_two: 'منذ {{count}} شهرين',
+ monthAgo_few: 'منذ {{count}} أشهر',
+ monthAgo_many: 'منذ {{count}} شهرا',
+ monthAgo_other: 'منذ {{count}} شهر',
+ secondsAgoShort: 'قبل {{count}}ث',
+ minutesAgoShort: 'قبل {{count}}د',
+ hoursAgoShort: 'قبل {{count}}س',
+ today: 'اليوم',
+ tomorrow: 'غدا',
+ weekAgo_zero: 'منذ {{count}} أسبوع',
+ weekAgo_one: 'منذ {{count}} أسبوع',
+ weekAgo_two: 'منذ {{count}} أسبوعين',
+ weekAgo_few: 'منذ {{count}} أسابيع',
+ weekAgo_many: 'منذ {{count}} أسبوعا',
+ weekAgo_other: 'منذ {{count}} أسبوع',
+ yesterday: 'أمس',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'إجراءات {{title}}',
+ createDeck: 'إنشاء مجموعة',
+ createNote: 'إنشاء ملاحظة',
+ deleteDeck: 'حذف المجموعة',
+ editDeck: 'تعديل المجموعة',
+ newNote: 'ملاحظة جديدة',
+ openDeck: 'فتح مجموعة {{title}}',
+ saveDeck: 'تعذر حفظ المجموعة',
+ studyNow: 'ادرس الآن',
+ },
+ descriptions: {
+ emptyDeck: 'أضف ملاحظة حتى تحتوي هذه المجموعة على مادة للمراجعة.',
+ editorDefault: 'مجموعة دراسة مركزة.',
+ editorVisual: 'اختر رمزا لغلاف هذه المجموعة.',
+ notesSearchPlaceholder: 'ابحث في الملاحظات…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'سيتم نقل "{{title}}" إلى المهملات. يمكنك استعادتها لاحقا.',
+ deleteDeckFallbackDescription: 'سيتم نقل هذه المجموعة إلى المهملات. يمكنك استعادتها لاحقا.',
+ deleteDeckFallbackTitle: 'حذف المجموعة؟',
+ deleteDeckTitle: 'حذف "{{title}}"؟',
+ deleteNoteDescription: 'سيتم نقل "{{title}}" إلى المهملات. يمكنك استعادتها لاحقا.',
+ deleteNoteFallbackTitle: 'حذف الملاحظة؟',
+ deleteNoteTitle: 'حذف "{{title}}"؟',
+ },
+ empty: {
+ noMatchingNotes: 'لا توجد ملاحظات مطابقة',
+ noMatchingNotesDescription: 'لم تطابق أي ملاحظات "{{query}}".',
+ thisDeckIsEmpty: 'هذه المجموعة فارغة',
+ },
+ errors: {
+ couldNotCreateDeck: 'تعذر إنشاء المجموعة',
+ couldNotDeleteDeck: 'تعذر حذف المجموعة',
+ couldNotDeleteNote: 'تعذر حذف الملاحظة',
+ couldNotLoadFolderPath: 'تعذر تحميل مسار المجلد',
+ couldNotSaveDeck: 'تعذر حفظ المجموعة',
+ deckCouldNotLoad: 'تعذر تحميل المجموعة',
+ notesCouldNotLoad: 'تعذر تحميل الملاحظات',
+ notesMayBeOutOfDate: 'قد تكون الملاحظات قديمة',
+ },
+ fields: {
+ descriptionLabel: 'وصف المجموعة',
+ descriptionPlaceholder: 'ما الذي ستساعدك هذه المجموعة على مراجعته؟',
+ namePlaceholder: 'اسم المجموعة',
+ untitledDeck: 'مجموعة بلا عنوان',
+ untitledDeckLower: 'مجموعة بلا عنوان',
+ },
+ labels: {
+ createDeckTitle: 'إنشاء مجموعة',
+ deck: 'مجموعة',
+ deckNotesSearch: 'بحث ملاحظات المجموعة',
+ deckOverview: 'نظرة عامة على المجموعة',
+ decks: 'المجموعات',
+ due: 'مستحق',
+ dueToday: 'مستحق اليوم',
+ loadingDeck: 'جار تحميل المجموعة',
+ mastery: 'الإتقان',
+ notes: 'ملاحظات',
+ },
+ sort: {
+ ariaLabel: 'فرز المجموعات',
+ dueToday: 'مستحق اليوم',
+ title: 'العنوان',
+ updated: 'تم التحديث',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'تغيرت البيانات. حدّث وحاول مرة أخرى.',
+ forbidden: 'ليست لديك صلاحية لتنفيذ ذلك.',
+ notFound: 'تعذر العثور على هذا العنصر.',
+ offline: 'لا يمكن الوصول إلى الخدمة.',
+ timeout: 'استغرق ذلك وقتا طويلا. حاول مرة أخرى.',
+ unauthorized: 'سجل الدخول للمتابعة.',
+ unavailable: 'الخدمة غير متاحة مؤقتا.',
+ },
+ fallback: {
+ unexpected: 'خطأ غير متوقع',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'إنشاء مجلد',
+ deleteFolder: 'حذف المجلد',
+ editFolder: 'تعديل المجلد',
+ },
+ descriptions: {
+ editorDefault: 'مجلد للمجموعات ذات الصلة.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'سيتم نقل "{{name}}" إلى المهملات. يمكنك استعادته لاحقا.',
+ deleteFolderFallbackDescription: 'سيتم نقل هذا المجلد إلى المهملات. يمكنك استعادته لاحقا.',
+ deleteFolderFallbackTitle: 'حذف المجلد؟',
+ deleteFolderTitle: 'حذف "{{name}}"؟',
+ },
+ empty: {
+ noMatchesInFolder: 'لا توجد نتائج في هذا المجلد',
+ noMatchesInFolderDescription: 'لم تطابق أي مجلدات أو مجموعات أو ملاحظات "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'تعذر إنشاء المجلد',
+ couldNotDeleteFolder: 'تعذر حذف المجلد',
+ couldNotLoadFolderPath: 'تعذر تحميل مسار المجلد',
+ couldNotSaveFolder: 'تعذر حفظ المجلد',
+ folderCouldNotLoad: 'تعذر تحميل المجلد',
+ },
+ fields: {
+ descriptionLabel: 'وصف المجلد',
+ descriptionPlaceholder: 'ما الذي ينتمي إلى هذا المجلد؟',
+ namePlaceholder: 'اسم المجلد',
+ untitledFolder: 'مجلد بلا عنوان',
+ },
+ labels: {
+ createFolderTitle: 'إنشاء مجلد',
+ folder: 'مجلد',
+ folders: 'المجلدات',
+ loadingFolder: 'جار تحميل المجلد',
+ name: 'الاسم',
+ updated: 'تم التحديث',
+ },
+ sort: {
+ ariaLabel: 'فرز المجلدات',
+ name: 'الاسم',
+ updated: 'تم التحديث',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'إذا اختلفت البيانات المحلية والمزامنة، فسيظهر العنصر هنا.',
+ heading: 'حالة المزامنة',
+ title: 'التعارضات',
+ noConflicts: 'لم يتم العثور على تعارضات',
+ },
+ labels: {
+ menu: 'القائمة',
+ },
+ sections: {
+ settings: {
+ description: 'خصص بيئتك وتفضيلاتك',
+ title: 'الإعدادات',
+ },
+ trash: {
+ description: 'استعد العناصر المحذوفة أو احذفها نهائيا',
+ title: 'المهملات',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'إغلاق المحرر',
+ openActions: 'فتح الإجراءات',
+ openWorkspaces: 'فتح مساحات العمل',
+ },
+ items: {
+ home: 'الرئيسية',
+ menu: 'القائمة',
+ primary: 'أساسي',
+ settings: 'الإعدادات',
+ spaces: 'المساحات',
+ trash: 'المهملات',
+ workspaces: 'مساحات العمل',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'إضافة إخفاء',
+ deleteNote: 'حذف الملاحظة',
+ editNote: 'تعديل الملاحظة',
+ hideDerivedCardsNote: 'إخفاء ملاحظة البطاقات المشتقة',
+ openNote: 'فتح {{title}}',
+ saveNote: 'حفظ الملاحظة',
+ showDerivedCardsNote: 'إظهار ملاحظة البطاقات المشتقة',
+ },
+ descriptions: {
+ clozeFormat: 'يصبح كل جزء مخفي بطاقة مراجعة عند الحفظ.',
+ clozeFormatPrefix: 'غلّف النص المخفي بـ',
+ derivedCardsHelper: 'الملاحظات هي مصدر الحقيقة للبطاقات المشتقة.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'سيتم نقل "{{title}}" إلى المهملات. يمكنك استعادتها لاحقا.',
+ deleteNoteFallbackDescription: 'سيتم نقل هذه الملاحظة إلى المهملات. يمكنك استعادتها لاحقا.',
+ deleteNoteFallbackTitle: 'حذف الملاحظة؟',
+ deleteNoteTitle: 'حذف "{{title}}"؟',
+ },
+ errors: {
+ couldNotCreateNote: 'تعذر إنشاء الملاحظة',
+ couldNotDeleteNote: 'تعذر حذف الملاحظة',
+ couldNotSaveNote: 'تعذر حفظ الملاحظة',
+ noteCouldNotLoad: 'تعذر تحميل الملاحظة',
+ },
+ fields: {
+ back: 'الوجه الخلفي',
+ backPlaceholder: 'أدخل الوجه الخلفي',
+ bodyPlaceholder: 'اكتب نص الملاحظة مع الإخفاءات…',
+ front: 'الوجه الأمامي',
+ frontPlaceholder: 'أدخل الوجه الأمامي',
+ noteBody: 'نص الملاحظة',
+ title: 'العنوان',
+ titlePlaceholder: 'أضف عنوان ملاحظة',
+ untitledCloze: 'إخفاء بلا عنوان',
+ untitledNote: 'ملاحظة بلا عنوان',
+ },
+ labels: {
+ backUppercase: 'الوجه الخلفي',
+ basic: 'أساسي',
+ basicLower: 'أساسي',
+ basicUppercase: 'أساسي',
+ cloze: 'إخفاء',
+ clozeLower: 'إخفاء',
+ clozeFormat: 'تنسيق الإخفاء',
+ clozeUppercase: 'إخفاء',
+ deck: 'مجموعة',
+ derivedCards: 'البطاقات المشتقة',
+ due: 'مستحق',
+ frontUppercase: 'الوجه الأمامي',
+ inProgress: 'قيد التنفيذ',
+ inProgressUppercase: 'قيد التنفيذ',
+ loadingNote: 'جار تحميل الملاحظة',
+ loadingNoteEditor: 'جار تحميل محرر الملاحظات',
+ markdownFormatting: 'تنسيق Markdown',
+ mastered: 'تم إتقانه',
+ masteredUppercase: 'تم إتقانه',
+ newNote: 'ملاحظة جديدة',
+ noteBody: 'نص الملاحظة',
+ noteContent: 'محتوى الملاحظة',
+ noteDetails: 'تفاصيل الملاحظة',
+ noteMetadata: 'بيانات الملاحظة',
+ noteType: 'نوع الملاحظة',
+ notes: 'ملاحظات',
+ reviewed: 'تمت المراجعة',
+ studyProgress: 'تقدم الدراسة',
+ studyProgressUppercase: 'تقدم الدراسة',
+ titleUppercase: 'العنوان',
+ updated: 'تم التحديث',
+ },
+ sort: {
+ ariaLabel: 'فرز الملاحظات',
+ title: 'العنوان',
+ updated: 'تم التحديث',
+ },
+ toolbar: {
+ bold: 'غامق',
+ italic: 'مائل',
+ link: 'رابط',
+ list: 'قائمة',
+ },
+ },
+ review: {
+ actions: {
+ again: 'مرة أخرى',
+ backToDeck: 'العودة إلى المجموعة',
+ continueReview: 'متابعة المراجعة',
+ easy: 'سهل',
+ good: 'جيد',
+ hard: 'صعب',
+ newNote: 'ملاحظة جديدة',
+ showAnswer: 'إظهار الإجابة',
+ },
+ errors: {
+ couldNotGradeCard: 'تعذر تقييم البطاقة',
+ reviewCouldNotLoad: 'تعذر تحميل المراجعة',
+ reviewCouldNotStart: 'تعذر بدء المراجعة',
+ summaryCouldNotLoad: 'تعذر تحميل ملخص المراجعة',
+ summaryNotAvailable: 'ملخص المراجعة غير متاح',
+ summaryNotComplete: 'هذه المراجعة لم تكتمل بعد.',
+ },
+ labels: {
+ cardsReviewed: 'البطاقات التي تمت مراجعتها',
+ deck: 'مجموعة',
+ duration: 'المدة',
+ loadingReview: 'جار تحميل المراجعة',
+ loadingSummary: 'جار تحميل الملخص',
+ progress: 'تقدم المراجعة',
+ review: 'مراجعة',
+ reviewComplete: 'اكتملت المراجعة',
+ reviewed_zero: 'تمت مراجعة {{count}}',
+ reviewed_one: 'تمت مراجعة {{count}}',
+ reviewed_two: 'تمت مراجعة {{count}}',
+ reviewed_few: 'تمت مراجعة {{count}}',
+ reviewed_many: 'تمت مراجعة {{count}}',
+ reviewed_other: 'تمت مراجعة {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}}س {{minutes}}د',
+ durationMinutes: '{{minutes}}د',
+ durationSeconds: '{{seconds}}ث',
+ saved: 'تم حفظ تقدمك في هذه المجموعة.',
+ },
+ unavailable: {
+ description: 'أضف ملاحظة حتى تتمكن هذه المجموعة من دخول قائمة المراجعة.',
+ title: 'لا توجد بطاقات للمراجعة',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'مسح البحث',
+ },
+ empty: {
+ noMatchesInWorkspace: 'لا توجد نتائج في مساحة العمل هذه',
+ noMatchesInWorkspaceDescription: 'لم تطابق أي مجلدات أو مجموعات أو ملاحظات "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'تعذر إكمال البحث',
+ },
+ labels: {
+ results: 'نتائج البحث',
+ resultsFor: 'نتائج "{{query}}"',
+ searchingContent: 'جار البحث في المحتوى',
+ },
+ resultGroups: {
+ deck: 'المجموعات',
+ folder: 'المجلدات',
+ note: 'الملاحظات',
+ },
+ resultKinds: {
+ deck: 'مجموعة',
+ folder: 'مجلد',
+ note: 'ملاحظة',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'إعادة ضبط كل الإعدادات',
+ resetSettings: 'إعادة ضبط الإعدادات',
+ resetToDefaults: 'إعادة الضبط إلى الافتراضي',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'ألصق JSON صالحا يحتوي على 21 قيمة رقمية.',
+ fsrsErrorInvalidParams_zero: 'أدخل مصفوفة JSON تحتوي على {{count}} رقم محدود بالضبط.',
+ fsrsErrorInvalidParams_one: 'أدخل مصفوفة JSON تحتوي على {{count}} رقم محدود بالضبط.',
+ fsrsErrorInvalidParams_two: 'أدخل مصفوفة JSON تحتوي على {{count}} رقمين محدودين بالضبط.',
+ fsrsErrorInvalidParams_few: 'أدخل مصفوفة JSON تحتوي على {{count}} أرقام محدودة بالضبط.',
+ fsrsErrorInvalidParams_many: 'أدخل مصفوفة JSON تحتوي على {{count}} رقما محدودا بالضبط.',
+ fsrsErrorInvalidParams_other: 'أدخل مصفوفة JSON تحتوي على {{count}} رقم محدود بالضبط.',
+ fsrsHelper: 'هذا تجاوز متقدم. يجب أن تبقى القيم بالترتيب.',
+ fsrsJsonLabel: 'JSON لمعاملات FSRS',
+ fsrsTitle: 'تعديل معاملات FSRS',
+ fsrsDescription: 'ألصق مصفوفة JSON تحتوي على 21 رقما لتجاوز أوزان المجدول.',
+ resetDescription: 'سيؤدي ذلك إلى استعادة المنطقة الزمنية وحدود الدراسة وإعدادات FSRS.',
+ resetDescriptionWithLanguage: 'سيؤدي ذلك إلى استعادة اللغة والمنطقة الزمنية وحدود الدراسة وإعدادات FSRS.',
+ resetTitle: 'إعادة ضبط كل الإعدادات؟',
+ timezoneDescription: 'ابحث عن مدينة أو معرف منطقة زمنية.',
+ timezoneSearchLabel: 'بحث المناطق الزمنية',
+ timezoneSearchPlaceholder: 'ابحث عن المناطق الزمنية…',
+ timezoneTitle: 'اختيار المنطقة الزمنية',
+ },
+ errors: {
+ couldNotResetSettings: 'تعذر إعادة ضبط الإعدادات',
+ couldNotSaveSettings: 'تعذر حفظ الإعدادات',
+ settingsCouldNotLoad: 'تعذر تحميل الإعدادات',
+ settingsUnavailable: 'الإعدادات غير متاحة.',
+ },
+ labels: {
+ appearance: 'المظهر',
+ automatic: 'تلقائي',
+ fsrsParameters: 'معاملات FSRS',
+ general: 'عام',
+ language: 'اللغة',
+ loadingSettings: 'جار تحميل الإعدادات',
+ masteryHorizon: 'أفق الإتقان',
+ newCardOrder: 'ترتيب البطاقات الجديدة',
+ newCardsPerDay: 'البطاقات الجديدة يوميا',
+ reviewCardsPerDay: 'بطاقات المراجعة يوميا',
+ savingSettings: 'جار حفظ الإعدادات',
+ schedule: 'الجدول',
+ searchNoTimezones: 'لا توجد مناطق زمنية مطابقة.',
+ settings: 'الإعدادات',
+ settingsReset: 'إعادة ضبط الإعدادات',
+ study: 'الدراسة',
+ targetRecallProbability: 'احتمال التذكر المستهدف',
+ theme: 'السمة',
+ timezone: 'المنطقة الزمنية',
+ },
+ options: {
+ languageEnUs: 'الإنجليزية (الولايات المتحدة)',
+ newCardsAfterReviews: 'بعد المراجعات',
+ newCardsBeforeReviews: 'قبل المراجعات',
+ newCardsMixed: 'مختلط',
+ themeDark: 'داكن',
+ themeLight: 'فاتح',
+ themeSystem: 'النظام',
+ timezoneSystem: 'استخدام منطقة النظام الزمنية',
+ },
+ rows: {
+ fsrsDescription: 'أوزان النموذج المتقدمة',
+ languageDescription: 'لغة الواجهة',
+ masteryHorizonDescription: 'عدد الأيام التي يجب أن تبقى فيها البطاقة قابلة للتذكر عند الاحتمال المستهدف أو أعلى حتى تعد متقنة',
+ newCardOrderDescription: 'ترتيب البطاقات الجديدة بالنسبة إلى المراجعات',
+ newCardsPerDayDescription: 'الحد الأقصى للبطاقات الجديدة يوميا',
+ reviewCardsPerDayDescription: 'الحد الأقصى لبطاقات المراجعة يوميا',
+ targetRecallProbabilityDescription: 'الحد الأدنى لاحتمال التذكر في المراجعة المجدولة التالية',
+ timezoneDescription: 'استخدم المنطقة الزمنية التلقائية أو اختر مدينة.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'حذف نهائي',
+ empty: 'إفراغ',
+ emptyTrash: 'إفراغ المهملات',
+ restore: 'استعادة',
+ restoringItem: 'جار استعادة {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'سيؤدي ذلك إلى حذف "{{title}}" نهائيا. لا يمكن التراجع عن ذلك.',
+ deleteItemFallbackDescription: 'سيؤدي ذلك إلى حذف هذا العنصر نهائيا. لا يمكن التراجع عن ذلك.',
+ deleteItemFallbackTitle: 'حذف العنصر؟',
+ deleteItemTitle: 'حذف "{{title}}"؟',
+ emptyTrashDescription: 'سيؤدي ذلك إلى حذف كل شيء في المهملات نهائيا. لا يمكن التراجع عن ذلك.',
+ emptyTrashTitle: 'إفراغ المهملات؟',
+ },
+ empty: {
+ description: 'ستظهر العناصر التي تحذفها هنا قبل الإزالة النهائية.',
+ title: 'المهملات فارغة',
+ },
+ errors: {
+ couldNotDeleteItem: 'تعذر حذف العنصر',
+ couldNotEmptyTrash: 'تعذر إفراغ المهملات',
+ couldNotRestoreItem: 'تعذر استعادة العنصر',
+ trashCouldNotLoad: 'تعذر تحميل المهملات',
+ trashMayBeOutOfDate: 'قد تكون المهملات قديمة',
+ },
+ labels: {
+ deletedAge: 'حذف {{value}}',
+ itemCount_zero: '{{count}} عنصر',
+ itemCount_one: '{{count}} عنصر',
+ itemCount_two: '{{count}} عنصران',
+ itemCount_few: '{{count}} عناصر',
+ itemCount_many: '{{count}} عنصرا',
+ itemCount_other: '{{count}} عنصر',
+ lastEmptied: 'آخر إفراغ {{value}}',
+ loadingTrash: 'جار تحميل المهملات',
+ originalLocation: 'الموقع الأصلي: {{location}}',
+ title: 'المهملات',
+ trashActions: 'إجراءات مهملات {{title}}',
+ },
+ kinds: {
+ deck: 'مجموعة',
+ folder: 'مجلد',
+ note: 'ملاحظة',
+ workspace: 'مساحة عمل',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'إنشاء مساحة عمل',
+ deleteWorkspace: 'حذف مساحة العمل',
+ editWorkspace: 'تعديل مساحة العمل',
+ newWorkspace: 'مساحة عمل جديدة',
+ openWorkspace: 'فتح {{title}}',
+ openingWorkspace: 'جار فتح {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'سياق دراسة.',
+ editorVisual: 'اختر مرجعا بصريا لمساحة العمل هذه.',
+ emptyList: 'افصل المجموعات والملاحظات وقوائم المراجعة حسب سياق الدراسة.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'سيتم نقل "{{title}}" إلى المهملات. يمكنك استعادتها لاحقا.',
+ deleteWorkspaceFallbackDescription: 'سيتم نقل مساحة العمل هذه إلى المهملات. يمكنك استعادتها لاحقا.',
+ deleteWorkspaceFallbackTitle: 'حذف مساحة العمل؟',
+ deleteWorkspaceTitle: 'حذف "{{title}}"؟',
+ },
+ empty: {
+ startWithWorkspace: 'ابدأ بمساحة عمل',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'تعذر إنشاء مساحة العمل',
+ couldNotDeleteWorkspace: 'تعذر حذف مساحة العمل',
+ couldNotOpenWorkspace: 'تعذر فتح مساحة العمل',
+ couldNotSaveWorkspace: 'تعذر حفظ مساحة العمل',
+ workspaceCouldNotLoad: 'تعذر تحميل مساحة العمل',
+ workspacesCouldNotLoad: 'تعذر تحميل مساحات العمل',
+ },
+ fields: {
+ descriptionLabel: 'وصف مساحة العمل',
+ descriptionPlaceholder: 'ما الذي ينتمي إلى مساحة العمل هذه؟',
+ namePlaceholder: 'اسم مساحة العمل',
+ untitledWorkspace: 'مساحة عمل بلا عنوان',
+ },
+ labels: {
+ createWorkspaceTitle: 'إنشاء مساحة عمل',
+ loadingWorkspaces: 'جار تحميل مساحات العمل',
+ workspace: 'مساحة عمل',
+ workspaces: 'مساحات العمل',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/bg.ts b/ui/src/core/i18n/resources/bg.ts
new file mode 100644
index 0000000..3fc4855
--- /dev/null
+++ b/ui/src/core/i18n/resources/bg.ts
@@ -0,0 +1,623 @@
+export const bg = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Опитайте отново. Ако това продължи, отворете Clear отново.',
+ title: 'Не можа да се стартира',
+ },
+ loadingTitle: 'Подготвяме вашето пространство за учене',
+ },
+ common: {
+ actions: {
+ back: 'Назад',
+ cancel: 'Отказ',
+ checkAgain: 'Провери отново',
+ close: 'Затвори',
+ create: 'Създай',
+ delete: 'Изтрий',
+ dismissError: 'Скрий грешката',
+ dismissStatus: 'Скрий състоянието',
+ edit: 'Редактирай',
+ itemActions: 'Действия за {{title}}',
+ reset: 'Нулирай',
+ review: 'Преговор',
+ save: 'Запази',
+ saveChanges: 'Запази промените',
+ tryAgain: 'Опитай отново',
+ },
+ labels: {
+ active: 'Активно',
+ clear: 'Clear',
+ custom: 'Персонализирано',
+ default: 'По подразбиране',
+ loadingEditor: 'Зареждане на редактора',
+ name: 'Име',
+ completedTask: 'Завършена задача',
+ description: 'Описание',
+ incompleteTask: 'Незавършена задача',
+ percentageInput: 'Процент за {{label}}',
+ visual: 'Визуално',
+ },
+ status: {
+ actionFailed: 'Действието не бе успешно',
+ actionInProgress: 'Действието се изпълнява',
+ },
+ sort: {
+ ascending: 'Възх.',
+ column: 'Колона',
+ descending: 'Низх.',
+ direction: 'Посока',
+ sort: 'Сортиране',
+ },
+ search: {
+ label: 'Търсене',
+ },
+ visualPicker: {
+ allLucideIcons: 'Всички Lucide икони',
+ browseIconsFor: 'Прегледайте или потърсете икони за {{label}}.',
+ chooseIcon: 'Избери икона',
+ iconPicker: 'Избор на икона за {{label}}',
+ iconSearch: 'Търсене на икони за {{label}}',
+ iconsCouldNotLoad: 'Иконите не можаха да се заредят.',
+ loadingIcons: 'Зареждане на икони',
+ loadingMoreIcons: 'Зареждане на още икони',
+ moreIcons: 'Още икони',
+ noIconsMatch: 'Няма икони, съвпадащи с "{{query}}".',
+ searchIconsPlaceholder: 'Търсене на икони…',
+ selectedIcon: 'Избрано {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Създай',
+ newDeck: 'Нова колода',
+ newFolder: 'Нова папка',
+ },
+ descriptions: {
+ defaultWorkspace: 'Дръжте колодите, папките и бележките заедно.',
+ emptyWorkspace: 'Създайте колода, след това добавете бележки, за да изградите опашка за преговор.',
+ emptyFolder: 'Създайте колода, след това добавете бележки, за да изградите опашка за преговор.',
+ searchPlaceholder: 'Търсене на папки, колоди и бележки…',
+ },
+ empty: {
+ createFirstDeck: 'Създайте първата си колода',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Колодата не можа да се изтрие',
+ couldNotDeleteFolder: 'Папката не можа да се изтрие',
+ couldNotDeleteWorkspace: 'Работното пространство не можа да се изтрие',
+ dashboardCouldNotOpen: 'Таблото не можа да се отвори',
+ decksCouldNotLoad: 'Колодите не можаха да се заредят',
+ decksMayBeOutOfDate: 'Колодите може да са остарели',
+ foldersCouldNotLoad: 'Папките не можаха да се заредят',
+ foldersMayBeOutOfDate: 'Папките може да са остарели',
+ workspaceCouldNotLoad: 'Работното пространство не можа да се зареди',
+ },
+ labels: {
+ dashboard: 'Табло',
+ loadingDashboard: 'Зареждане на таблото',
+ newItem: 'Нов елемент',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Датата не е налична',
+ },
+ age: {
+ dayAgo_one: 'преди {{count}} ден',
+ dayAgo_other: 'преди {{count}} дни',
+ hourAgo_one: 'преди {{count}} час',
+ hourAgo_other: 'преди {{count}} часа',
+ justNow: 'току-що',
+ minuteAgo_one: 'преди {{count}} минута',
+ minuteAgo_other: 'преди {{count}} минути',
+ unavailable: 'датата не е налична',
+ weekAgo_one: 'преди {{count}} седмица',
+ weekAgo_other: 'преди {{count}} седмици',
+ },
+ labels: {
+ deleted: 'Изтрито {{value}}',
+ due: 'Срок: {{value}}',
+ reviewed: 'Преговорено: {{value}}',
+ updated: 'Обновено {{value}}',
+ updatedUppercase: 'ОБНОВЕНО {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'преди {{count}} ден',
+ dayAgo_other: 'преди {{count}} дни',
+ inAMoment: 'След малко',
+ inDay_one: 'След {{count}} ден',
+ inDay_other: 'След {{count}} дни',
+ inMonth_one: 'След {{count}} месец',
+ inMonth_other: 'След {{count}} месеца',
+ inWeek_one: 'След {{count}} седмица',
+ inWeek_other: 'След {{count}} седмици',
+ justNow: 'Току-що',
+ monthAgo_one: 'преди {{count}} месец',
+ monthAgo_other: 'преди {{count}} месеца',
+ secondsAgoShort: 'преди {{count}} сек',
+ minutesAgoShort: 'преди {{count}} мин',
+ hoursAgoShort: 'преди {{count}} ч',
+ today: 'Днес',
+ tomorrow: 'Утре',
+ weekAgo_one: 'преди {{count}} седмица',
+ weekAgo_other: 'преди {{count}} седмици',
+ yesterday: 'Вчера',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Действия за {{title}}',
+ createDeck: 'Създай колода',
+ createNote: 'Създай бележка',
+ deleteDeck: 'Изтрий колода',
+ editDeck: 'Редактирай колода',
+ newNote: 'Нова бележка',
+ openDeck: 'Отвори колода {{title}}',
+ saveDeck: 'Колодата не можа да се запази',
+ studyNow: 'Учи сега',
+ },
+ descriptions: {
+ emptyDeck: 'Добавете бележка, за да има тази колода материал за преговор.',
+ editorDefault: 'Фокусирана колода за учене.',
+ editorVisual: 'Изберете символ за корицата на тази колода.',
+ notesSearchPlaceholder: 'Търсене на бележки…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Това премества "{{title}}" в Кошчето. Можете да го възстановите по-късно.',
+ deleteDeckFallbackDescription: 'Това премества тази колода в Кошчето. Можете да я възстановите по-късно.',
+ deleteDeckFallbackTitle: 'Да се изтрие ли колодата?',
+ deleteDeckTitle: 'Да се изтрие ли "{{title}}"?',
+ deleteNoteDescription: 'Това премества "{{title}}" в Кошчето. Можете да я възстановите по-късно.',
+ deleteNoteFallbackTitle: 'Да се изтрие ли бележката?',
+ deleteNoteTitle: 'Да се изтрие ли "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Няма съвпадащи бележки',
+ noMatchingNotesDescription: 'Няма бележки, съвпадащи с "{{query}}".',
+ thisDeckIsEmpty: 'Тази колода е празна',
+ },
+ errors: {
+ couldNotCreateDeck: 'Колодата не можа да се създаде',
+ couldNotDeleteDeck: 'Колодата не можа да се изтрие',
+ couldNotDeleteNote: 'Бележката не можа да се изтрие',
+ couldNotLoadFolderPath: 'Пътят до папката не можа да се зареди',
+ couldNotSaveDeck: 'Колодата не можа да се запази',
+ deckCouldNotLoad: 'Колодата не можа да се зареди',
+ notesCouldNotLoad: 'Бележките не можаха да се заредят',
+ notesMayBeOutOfDate: 'Бележките може да са остарели',
+ },
+ fields: {
+ descriptionLabel: 'Описание на колодата',
+ descriptionPlaceholder: 'Какво ще ви помогне да преговаряте тази колода?',
+ namePlaceholder: 'Име на колодата',
+ untitledDeck: 'Колода без заглавие',
+ untitledDeckLower: 'колода без заглавие',
+ },
+ labels: {
+ createDeckTitle: 'Създай колода',
+ deck: 'Колода',
+ deckNotesSearch: 'Търсене в бележките на колодата',
+ deckOverview: 'Преглед на колодата',
+ decks: 'Колоди',
+ due: 'Срок',
+ dueToday: 'Срок днес',
+ loadingDeck: 'Зареждане на колодата',
+ mastery: 'Усвояване',
+ notes: 'Бележки',
+ },
+ sort: {
+ ariaLabel: 'Сортиране на колоди',
+ dueToday: 'Срок днес',
+ title: 'Заглавие',
+ updated: 'Обновено',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Данните се промениха. Обновете и опитайте отново.',
+ forbidden: 'Нямате разрешение да направите това.',
+ notFound: 'Не успяхме да намерим този елемент.',
+ offline: 'Услугата е недостъпна.',
+ timeout: 'Това отне твърде дълго. Опитайте отново.',
+ unauthorized: 'Влезте, за да продължите.',
+ unavailable: 'Услугата временно не е налична.',
+ },
+ fallback: {
+ unexpected: 'Неочаквана грешка',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Създай папка',
+ deleteFolder: 'Изтрий папка',
+ editFolder: 'Редактирай папка',
+ },
+ descriptions: {
+ editorDefault: 'Папка за свързани колоди.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Това премества "{{name}}" в Кошчето. Можете да я възстановите по-късно.',
+ deleteFolderFallbackDescription: 'Това премества тази папка в Кошчето. Можете да я възстановите по-късно.',
+ deleteFolderFallbackTitle: 'Да се изтрие ли папката?',
+ deleteFolderTitle: 'Да се изтрие ли "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Няма съвпадения в тази папка',
+ noMatchesInFolderDescription: 'Няма папки, колоди или бележки, съвпадащи с "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Папката не можа да се създаде',
+ couldNotDeleteFolder: 'Папката не можа да се изтрие',
+ couldNotLoadFolderPath: 'Пътят до папката не можа да се зареди',
+ couldNotSaveFolder: 'Папката не можа да се запази',
+ folderCouldNotLoad: 'Папката не можа да се зареди',
+ },
+ fields: {
+ descriptionLabel: 'Описание на папката',
+ descriptionPlaceholder: 'Какво принадлежи в тази папка?',
+ namePlaceholder: 'Име на папката',
+ untitledFolder: 'Папка без заглавие',
+ },
+ labels: {
+ createFolderTitle: 'Създай папка',
+ folder: 'Папка',
+ folders: 'Папки',
+ loadingFolder: 'Зареждане на папката',
+ name: 'Име',
+ updated: 'Обновено',
+ },
+ sort: {
+ ariaLabel: 'Сортиране на папки',
+ name: 'Име',
+ updated: 'Обновено',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Ако локалните и синхронизираните данни някога се разминават, елементът ще се появи тук.',
+ heading: 'Състояние на синхронизацията',
+ title: 'Конфликти',
+ noConflicts: 'Няма намерени конфликти',
+ },
+ labels: {
+ menu: 'Меню',
+ },
+ sections: {
+ settings: {
+ description: 'Персонализирайте средата и предпочитанията си',
+ title: 'Настройки',
+ },
+ trash: {
+ description: 'Възстановяване или окончателно изтриване на премахнати елементи',
+ title: 'Кошче',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Затвори редактора',
+ openActions: 'Отвори действията',
+ openWorkspaces: 'Отвори работните пространства',
+ },
+ items: {
+ home: 'Начало',
+ menu: 'Меню',
+ primary: 'Основно',
+ settings: 'Настройки',
+ spaces: 'Пространства',
+ trash: 'Кошче',
+ workspaces: 'Работни пространства',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Добави cloze',
+ deleteNote: 'Изтрий бележка',
+ editNote: 'Редактирай бележка',
+ hideDerivedCardsNote: 'Скрий бележката за производни карти',
+ openNote: 'Отвори {{title}}',
+ saveNote: 'Запази бележка',
+ showDerivedCardsNote: 'Покажи бележката за производни карти',
+ },
+ descriptions: {
+ clozeFormat: 'Всяка скрита част става карта за преговор, когато запазите.',
+ clozeFormatPrefix: 'Оградете скрития текст с',
+ derivedCardsHelper: 'Бележките са източникът на истина за производните карти.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Това премества "{{title}}" в Кошчето. Можете да я възстановите по-късно.',
+ deleteNoteFallbackDescription: 'Това премества тази бележка в Кошчето. Можете да я възстановите по-късно.',
+ deleteNoteFallbackTitle: 'Да се изтрие ли бележката?',
+ deleteNoteTitle: 'Да се изтрие ли "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Бележката не можа да се създаде',
+ couldNotDeleteNote: 'Бележката не можа да се изтрие',
+ couldNotSaveNote: 'Бележката не можа да се запази',
+ noteCouldNotLoad: 'Бележката не можа да се зареди',
+ },
+ fields: {
+ back: 'Гръб',
+ backPlaceholder: 'Въведете гръб',
+ bodyPlaceholder: 'Напишете съдържанието на бележката с cloze изтривания…',
+ front: 'Лице',
+ frontPlaceholder: 'Въведете лице',
+ noteBody: 'Съдържание на бележката',
+ title: 'Заглавие',
+ titlePlaceholder: 'Добавете заглавие на бележката',
+ untitledCloze: 'Cloze без заглавие',
+ untitledNote: 'Бележка без заглавие',
+ },
+ labels: {
+ backUppercase: 'ГРЪБ',
+ basic: 'Основна',
+ basicLower: 'основна',
+ basicUppercase: 'ОСНОВНА',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze формат',
+ clozeUppercase: 'CLOZE',
+ deck: 'Колода',
+ derivedCards: 'ПРОИЗВОДНИ КАРТИ',
+ due: 'Срок',
+ frontUppercase: 'ЛИЦЕ',
+ inProgress: 'В ход',
+ inProgressUppercase: 'В ХОД',
+ loadingNote: 'Зареждане на бележката',
+ loadingNoteEditor: 'Зареждане на редактора на бележки',
+ markdownFormatting: 'Markdown форматиране',
+ mastered: 'Усвоено',
+ masteredUppercase: 'УСВОЕНО',
+ newNote: 'Нова бележка',
+ noteBody: 'СЪДЪРЖАНИЕ НА БЕЛЕЖКАТА',
+ noteContent: 'Съдържание на бележката',
+ noteDetails: 'Детайли за бележката',
+ noteMetadata: 'Метаданни на бележката',
+ noteType: 'Тип бележка',
+ notes: 'Бележки',
+ reviewed: 'Преговорено',
+ studyProgress: 'Напредък в ученето',
+ studyProgressUppercase: 'НАПРЕДЪК В УЧЕНЕТО',
+ titleUppercase: 'ЗАГЛАВИЕ',
+ updated: 'Обновено',
+ },
+ sort: {
+ ariaLabel: 'Сортиране на бележки',
+ title: 'Заглавие',
+ updated: 'Обновено',
+ },
+ toolbar: {
+ bold: 'Удебелен',
+ italic: 'Курсив',
+ link: 'Връзка',
+ list: 'Списък',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Отново',
+ backToDeck: 'Назад към колодата',
+ continueReview: 'Продължи преговора',
+ easy: 'Лесно',
+ good: 'Добре',
+ hard: 'Трудно',
+ newNote: 'Нова бележка',
+ showAnswer: 'Покажи отговора',
+ },
+ errors: {
+ couldNotGradeCard: 'Картата не можа да се оцени',
+ reviewCouldNotLoad: 'Преговорът не можа да се зареди',
+ reviewCouldNotStart: 'Преговорът не можа да започне',
+ summaryCouldNotLoad: 'Обобщението на преговора не можа да се зареди',
+ summaryNotAvailable: 'Обобщението на преговора не е налично',
+ summaryNotComplete: 'Този преговор още не е завършен.',
+ },
+ labels: {
+ cardsReviewed: 'Преговорени карти',
+ deck: 'Колода',
+ duration: 'Продължителност',
+ loadingReview: 'Зареждане на преговора',
+ loadingSummary: 'Зареждане на обобщението',
+ progress: 'Напредък на преговора',
+ review: 'Преговор',
+ reviewComplete: 'Преговорът е завършен',
+ reviewed_one: 'Преговорена {{count}}',
+ reviewed_other: 'Преговорени {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} ч {{minutes}} мин',
+ durationMinutes: '{{minutes}} мин',
+ durationSeconds: '{{seconds}} сек',
+ saved: 'Напредъкът ви беше запазен в тази колода.',
+ },
+ unavailable: {
+ description: 'Добавете бележка, за да може тази колода да влезе в опашката за преговор.',
+ title: 'Няма карти за преговор',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Изчисти търсенето',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Няма съвпадения в това работно пространство',
+ noMatchesInWorkspaceDescription: 'Няма папки, колоди или бележки, съвпадащи с "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Търсенето не можа да се завърши',
+ },
+ labels: {
+ results: 'Резултати от търсенето',
+ resultsFor: 'Резултати за "{{query}}"',
+ searchingContent: 'Търсене в съдържанието',
+ },
+ resultGroups: {
+ deck: 'Колоди',
+ folder: 'Папки',
+ note: 'Бележки',
+ },
+ resultKinds: {
+ deck: 'колода',
+ folder: 'папка',
+ note: 'бележка',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Нулирай всички настройки',
+ resetSettings: 'Нулирай настройките',
+ resetToDefaults: 'Върни по подразбиране',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Поставете валиден JSON с 21 числови стойности.',
+ fsrsErrorInvalidParams_one: 'Въведете JSON масив с точно {{count}} крайно число.',
+ fsrsErrorInvalidParams_other: 'Въведете JSON масив с точно {{count}} крайни числа.',
+ fsrsHelper: 'Това е експертна промяна. Стойностите трябва да останат в ред.',
+ fsrsJsonLabel: 'JSON на FSRS параметрите',
+ fsrsTitle: 'Редактиране на FSRS параметри',
+ fsrsDescription: 'Поставете JSON масив с 21 числа, за да замените теглата на планировчика.',
+ resetDescription: 'Това възстановява часовата зона, учебните лимити и FSRS настройките.',
+ resetDescriptionWithLanguage: 'Това възстановява езика, часовата зона, учебните лимити и FSRS настройките.',
+ resetTitle: 'Да се нулират ли всички настройки?',
+ timezoneDescription: 'Потърсете град или идентификатор на часова зона.',
+ timezoneSearchLabel: 'Търсене на часови зони',
+ timezoneSearchPlaceholder: 'Търсене на часови зони…',
+ timezoneTitle: 'Избор на часова зона',
+ },
+ errors: {
+ couldNotResetSettings: 'Настройките не можаха да се нулират',
+ couldNotSaveSettings: 'Настройките не можаха да се запазят',
+ settingsCouldNotLoad: 'Настройките не можаха да се заредят',
+ settingsUnavailable: 'Настройките не са налични.',
+ },
+ labels: {
+ appearance: 'Външен вид',
+ automatic: 'Автоматично',
+ fsrsParameters: 'FSRS параметри',
+ general: 'Общи',
+ language: 'Език',
+ loadingSettings: 'Зареждане на настройките',
+ masteryHorizon: 'Хоризонт на усвояване',
+ newCardOrder: 'Ред на новите карти',
+ newCardsPerDay: 'Нови карти на ден',
+ reviewCardsPerDay: 'Карти за преговор на ден',
+ savingSettings: 'Запазване на настройките',
+ schedule: 'График',
+ searchNoTimezones: 'Няма съвпадащи часови зони.',
+ settings: 'Настройки',
+ settingsReset: 'Настройките са нулирани',
+ study: 'Учене',
+ targetRecallProbability: 'Целева вероятност за припомняне',
+ theme: 'Тема',
+ timezone: 'Часова зона',
+ },
+ options: {
+ languageEnUs: 'Английски (САЩ)',
+ newCardsAfterReviews: 'След преговорите',
+ newCardsBeforeReviews: 'Преди преговорите',
+ newCardsMixed: 'Смесено',
+ themeDark: 'Тъмна',
+ themeLight: 'Светла',
+ themeSystem: 'Системна',
+ timezoneSystem: 'Използвай системната часова зона',
+ },
+ rows: {
+ fsrsDescription: 'Тегла на експертния модел',
+ languageDescription: 'Език на интерфейса',
+ masteryHorizonDescription: 'Брой дни, през които картата трябва да остане припомняема на или над целевата вероятност, за да се счита за усвоена',
+ newCardOrderDescription: 'Ред на новите карти спрямо преговорите',
+ newCardsPerDayDescription: 'Максимален брой нови карти на ден',
+ reviewCardsPerDayDescription: 'Максимален брой карти за преговор на ден',
+ targetRecallProbabilityDescription: 'Минимална вероятност за припомняне при следващия планиран преговор',
+ timezoneDescription: 'Използвайте автоматична часова зона или изберете град.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Изтрий окончателно',
+ empty: 'Изпразни',
+ emptyTrash: 'Изпразни кошчето',
+ restore: 'Възстанови',
+ restoringItem: 'Възстановяване на {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Това изтрива "{{title}}" окончателно. Не може да бъде отменено.',
+ deleteItemFallbackDescription: 'Това изтрива този елемент окончателно. Не може да бъде отменено.',
+ deleteItemFallbackTitle: 'Да се изтрие ли елементът?',
+ deleteItemTitle: 'Да се изтрие ли "{{title}}"?',
+ emptyTrashDescription: 'Това изтрива окончателно всичко в Кошчето. Не може да бъде отменено.',
+ emptyTrashTitle: 'Да се изпразни ли кошчето?',
+ },
+ empty: {
+ description: 'Елементите, които изтривате, ще се появяват тук преди окончателно премахване.',
+ title: 'Кошчето е празно',
+ },
+ errors: {
+ couldNotDeleteItem: 'Елементът не можа да се изтрие',
+ couldNotEmptyTrash: 'Кошчето не можа да се изпразни',
+ couldNotRestoreItem: 'Елементът не можа да се възстанови',
+ trashCouldNotLoad: 'Кошчето не можа да се зареди',
+ trashMayBeOutOfDate: 'Кошчето може да е остаряло',
+ },
+ labels: {
+ deletedAge: 'Изтрито {{value}}',
+ itemCount_one: '{{count}} елемент',
+ itemCount_other: '{{count}} елемента',
+ lastEmptied: 'Последно изпразнено {{value}}',
+ loadingTrash: 'Зареждане на кошчето',
+ originalLocation: 'Оригинално местоположение: {{location}}',
+ title: 'Кошче',
+ trashActions: 'Действия в кошчето за {{title}}',
+ },
+ kinds: {
+ deck: 'Колода',
+ folder: 'Папка',
+ note: 'Бележка',
+ workspace: 'Работно пространство',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Създай работно пространство',
+ deleteWorkspace: 'Изтрий работно пространство',
+ editWorkspace: 'Редактирай работно пространство',
+ newWorkspace: 'Ново работно пространство',
+ openWorkspace: 'Отвори {{title}}',
+ openingWorkspace: 'Отваряне на {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Контекст за учене.',
+ editorVisual: 'Изберете визуална опора за това работно пространство.',
+ emptyList: 'Разделете колоди, бележки и опашки за преговор по контекст на учене.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Това премества "{{title}}" в Кошчето. Можете да го възстановите по-късно.',
+ deleteWorkspaceFallbackDescription: 'Това премества това работно пространство в Кошчето. Можете да го възстановите по-късно.',
+ deleteWorkspaceFallbackTitle: 'Да се изтрие ли работното пространство?',
+ deleteWorkspaceTitle: 'Да се изтрие ли "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Започнете с работно пространство',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Работното пространство не можа да се създаде',
+ couldNotDeleteWorkspace: 'Работното пространство не можа да се изтрие',
+ couldNotOpenWorkspace: 'Работното пространство не можа да се отвори',
+ couldNotSaveWorkspace: 'Работното пространство не можа да се запази',
+ workspaceCouldNotLoad: 'Работното пространство не можа да се зареди',
+ workspacesCouldNotLoad: 'Работните пространства не можаха да се заредят',
+ },
+ fields: {
+ descriptionLabel: 'Описание на работното пространство',
+ descriptionPlaceholder: 'Какво принадлежи в това работно пространство?',
+ namePlaceholder: 'Име на работното пространство',
+ untitledWorkspace: 'Работно пространство без заглавие',
+ },
+ labels: {
+ createWorkspaceTitle: 'Създай работно пространство',
+ loadingWorkspaces: 'Зареждане на работните пространства',
+ workspace: 'Работно пространство',
+ workspaces: 'Работни пространства',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/bs.ts b/ui/src/core/i18n/resources/bs.ts
new file mode 100644
index 0000000..25aeb28
--- /dev/null
+++ b/ui/src/core/i18n/resources/bs.ts
@@ -0,0 +1,636 @@
+export const bs = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Pokušajte ponovo. Ako se ovo nastavi dešavati, ponovo otvorite Clear.',
+ title: 'Pokretanje nije uspjelo',
+ },
+ loadingTitle: 'Priprema se vaš prostor za učenje',
+ },
+ common: {
+ actions: {
+ back: 'Nazad',
+ cancel: 'Otkaži',
+ checkAgain: 'Provjeri ponovo',
+ close: 'Zatvori',
+ create: 'Kreiraj',
+ delete: 'Izbriši',
+ dismissError: 'Zatvori grešku',
+ dismissStatus: 'Zatvori status',
+ edit: 'Uredi',
+ itemActions: 'Radnje za {{title}}',
+ reset: 'Resetuj',
+ review: 'Ponavljanje',
+ save: 'Spremi',
+ saveChanges: 'Spremi promjene',
+ tryAgain: 'Pokušaj ponovo',
+ },
+ labels: {
+ active: 'Aktivno',
+ clear: 'Clear',
+ custom: 'Prilagođeno',
+ default: 'Zadano',
+ loadingEditor: 'Učitavanje uređivača',
+ name: 'Naziv',
+ completedTask: 'Završen zadatak',
+ description: 'Opis',
+ incompleteTask: 'Nedovršen zadatak',
+ percentageInput: 'Procenat za {{label}}',
+ visual: 'Vizuelno',
+ },
+ status: {
+ actionFailed: 'Radnja nije uspjela',
+ actionInProgress: 'Radnja je u toku',
+ },
+ sort: {
+ ascending: 'Rast.',
+ column: 'Kolona',
+ descending: 'Opad.',
+ direction: 'Smjer',
+ sort: 'Sortiraj',
+ },
+ search: {
+ label: 'Pretraga',
+ },
+ visualPicker: {
+ allLucideIcons: 'Sve Lucide ikone',
+ browseIconsFor: 'Pregledajte ili pretražite ikone za {{label}}.',
+ chooseIcon: 'Odaberi ikonu',
+ iconPicker: 'Birač ikone za {{label}}',
+ iconSearch: 'Pretraga ikona za {{label}}',
+ iconsCouldNotLoad: 'Ikone se nisu mogle učitati.',
+ loadingIcons: 'Učitavanje ikona',
+ loadingMoreIcons: 'Učitavanje dodatnih ikona',
+ moreIcons: 'Još ikona',
+ noIconsMatch: 'Nijedna ikona ne odgovara "{{query}}".',
+ searchIconsPlaceholder: 'Pretraži ikone…',
+ selectedIcon: 'Odabrano {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Kreiraj',
+ newDeck: 'Novi špil',
+ newFolder: 'Nova mapa',
+ },
+ descriptions: {
+ defaultWorkspace: 'Držite špilove, mape i bilješke zajedno.',
+ emptyWorkspace: 'Kreirajte špil, zatim dodajte bilješke da izgradite red za ponavljanje.',
+ emptyFolder: 'Kreirajte špil, zatim dodajte bilješke da izgradite red za ponavljanje.',
+ searchPlaceholder: 'Pretraži mape, špilove i bilješke…',
+ },
+ empty: {
+ createFirstDeck: 'Kreirajte svoj prvi špil',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Špil se nije mogao izbrisati',
+ couldNotDeleteFolder: 'Mapa se nije mogla izbrisati',
+ couldNotDeleteWorkspace: 'Radni prostor se nije mogao izbrisati',
+ dashboardCouldNotOpen: 'Kontrolna tabla se nije mogla otvoriti',
+ decksCouldNotLoad: 'Špilovi se nisu mogli učitati',
+ decksMayBeOutOfDate: 'Špilovi možda nisu ažurni',
+ foldersCouldNotLoad: 'Mape se nisu mogle učitati',
+ foldersMayBeOutOfDate: 'Mape možda nisu ažurne',
+ workspaceCouldNotLoad: 'Radni prostor se nije mogao učitati',
+ },
+ labels: {
+ dashboard: 'Kontrolna tabla',
+ loadingDashboard: 'Učitavanje kontrolne table',
+ newItem: 'Nova stavka',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Datum nije dostupan',
+ },
+ age: {
+ dayAgo_one: 'prije {{count}} dan',
+ dayAgo_few: 'prije {{count}} dana',
+ dayAgo_other: 'prije {{count}} dana',
+ hourAgo_one: 'prije {{count}} sat',
+ hourAgo_few: 'prije {{count}} sata',
+ hourAgo_other: 'prije {{count}} sati',
+ justNow: 'upravo sada',
+ minuteAgo_one: 'prije {{count}} minutu',
+ minuteAgo_few: 'prije {{count}} minute',
+ minuteAgo_other: 'prije {{count}} minuta',
+ unavailable: 'datum nije dostupan',
+ weekAgo_one: 'prije {{count}} sedmicu',
+ weekAgo_few: 'prije {{count}} sedmice',
+ weekAgo_other: 'prije {{count}} sedmica',
+ },
+ labels: {
+ deleted: 'Izbrisano {{value}}',
+ due: 'Rok: {{value}}',
+ reviewed: 'Ponovljeno: {{value}}',
+ updated: 'Ažurirano {{value}}',
+ updatedUppercase: 'AŽURIRANO {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'prije {{count}} dan',
+ dayAgo_few: 'prije {{count}} dana',
+ dayAgo_other: 'prije {{count}} dana',
+ inAMoment: 'Za trenutak',
+ inDay_one: 'Za {{count}} dan',
+ inDay_few: 'Za {{count}} dana',
+ inDay_other: 'Za {{count}} dana',
+ inMonth_one: 'Za {{count}} mjesec',
+ inMonth_few: 'Za {{count}} mjeseca',
+ inMonth_other: 'Za {{count}} mjeseci',
+ inWeek_one: 'Za {{count}} sedmicu',
+ inWeek_few: 'Za {{count}} sedmice',
+ inWeek_other: 'Za {{count}} sedmica',
+ justNow: 'Upravo sada',
+ monthAgo_one: 'prije {{count}} mjesec',
+ monthAgo_few: 'prije {{count}} mjeseca',
+ monthAgo_other: 'prije {{count}} mjeseci',
+ secondsAgoShort: 'prije {{count}} s',
+ minutesAgoShort: 'prije {{count}} min',
+ hoursAgoShort: 'prije {{count}} h',
+ today: 'Danas',
+ tomorrow: 'Sutra',
+ weekAgo_one: 'prije {{count}} sedmicu',
+ weekAgo_few: 'prije {{count}} sedmice',
+ weekAgo_other: 'prije {{count}} sedmica',
+ yesterday: 'Jučer',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Radnje za {{title}}',
+ createDeck: 'Kreiraj špil',
+ createNote: 'Kreiraj bilješku',
+ deleteDeck: 'Izbriši špil',
+ editDeck: 'Uredi špil',
+ newNote: 'Nova bilješka',
+ openDeck: 'Otvori špil {{title}}',
+ saveDeck: 'Špil se nije mogao spremiti',
+ studyNow: 'Uči sada',
+ },
+ descriptions: {
+ emptyDeck: 'Dodajte bilješku da bi ovaj špil imao materijal za ponavljanje.',
+ editorDefault: 'Fokusiran špil za učenje.',
+ editorVisual: 'Odaberite simbol naslovnice za ovaj špil.',
+ notesSearchPlaceholder: 'Pretraži bilješke…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Ovo premješta "{{title}}" u Smeće. Možete ga vratiti kasnije.',
+ deleteDeckFallbackDescription: 'Ovo premješta ovaj špil u Smeće. Možete ga vratiti kasnije.',
+ deleteDeckFallbackTitle: 'Izbrisati špil?',
+ deleteDeckTitle: 'Izbrisati "{{title}}"?',
+ deleteNoteDescription: 'Ovo premješta "{{title}}" u Smeće. Možete je vratiti kasnije.',
+ deleteNoteFallbackTitle: 'Izbrisati bilješku?',
+ deleteNoteTitle: 'Izbrisati "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Nema odgovarajućih bilješki',
+ noMatchingNotesDescription: 'Nijedna bilješka ne odgovara "{{query}}".',
+ thisDeckIsEmpty: 'Ovaj špil je prazan',
+ },
+ errors: {
+ couldNotCreateDeck: 'Špil se nije mogao kreirati',
+ couldNotDeleteDeck: 'Špil se nije mogao izbrisati',
+ couldNotDeleteNote: 'Bilješka se nije mogla izbrisati',
+ couldNotLoadFolderPath: 'Putanja mape se nije mogla učitati',
+ couldNotSaveDeck: 'Špil se nije mogao spremiti',
+ deckCouldNotLoad: 'Špil se nije mogao učitati',
+ notesCouldNotLoad: 'Bilješke se nisu mogle učitati',
+ notesMayBeOutOfDate: 'Bilješke možda nisu ažurne',
+ },
+ fields: {
+ descriptionLabel: 'Opis špila',
+ descriptionPlaceholder: 'Šta će vam ovaj špil pomoći da ponavljate?',
+ namePlaceholder: 'Naziv špila',
+ untitledDeck: 'Špil bez naslova',
+ untitledDeckLower: 'špil bez naslova',
+ },
+ labels: {
+ createDeckTitle: 'Kreiraj špil',
+ deck: 'Špil',
+ deckNotesSearch: 'Pretraga bilješki u špilu',
+ deckOverview: 'Pregled špila',
+ decks: 'Špilovi',
+ due: 'Rok',
+ dueToday: 'Rok danas',
+ loadingDeck: 'Učitavanje špila',
+ mastery: 'Savladanost',
+ notes: 'Bilješke',
+ },
+ sort: {
+ ariaLabel: 'Sortiraj špilove',
+ dueToday: 'Rok danas',
+ title: 'Naslov',
+ updated: 'Ažurirano',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Podaci su se promijenili. Osvježite i pokušajte ponovo.',
+ forbidden: 'Nemate dozvolu za ovu radnju.',
+ notFound: 'Nismo mogli pronaći ovu stavku.',
+ offline: 'Usluga nije dostupna.',
+ timeout: 'Ovo je trajalo predugo. Pokušajte ponovo.',
+ unauthorized: 'Prijavite se da nastavite.',
+ unavailable: 'Usluga je privremeno nedostupna.',
+ },
+ fallback: {
+ unexpected: 'Neočekivana greška',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Kreiraj mapu',
+ deleteFolder: 'Izbriši mapu',
+ editFolder: 'Uredi mapu',
+ },
+ descriptions: {
+ editorDefault: 'Mapa za povezane špilove.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Ovo premješta "{{name}}" u Smeće. Možete je vratiti kasnije.',
+ deleteFolderFallbackDescription: 'Ovo premješta ovu mapu u Smeće. Možete je vratiti kasnije.',
+ deleteFolderFallbackTitle: 'Izbrisati mapu?',
+ deleteFolderTitle: 'Izbrisati "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Nema rezultata u ovoj mapi',
+ noMatchesInFolderDescription: 'Nijedna mapa, špil ili bilješka ne odgovara "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Mapa se nije mogla kreirati',
+ couldNotDeleteFolder: 'Mapa se nije mogla izbrisati',
+ couldNotLoadFolderPath: 'Putanja mape se nije mogla učitati',
+ couldNotSaveFolder: 'Mapa se nije mogla spremiti',
+ folderCouldNotLoad: 'Mapa se nije mogla učitati',
+ },
+ fields: {
+ descriptionLabel: 'Opis mape',
+ descriptionPlaceholder: 'Šta pripada ovoj mapi?',
+ namePlaceholder: 'Naziv mape',
+ untitledFolder: 'Mapa bez naslova',
+ },
+ labels: {
+ createFolderTitle: 'Kreiraj mapu',
+ folder: 'Mapa',
+ folders: 'Mape',
+ loadingFolder: 'Učitavanje mape',
+ name: 'Naziv',
+ updated: 'Ažurirano',
+ },
+ sort: {
+ ariaLabel: 'Sortiraj mape',
+ name: 'Naziv',
+ updated: 'Ažurirano',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Ako se lokalni i sinhronizovani podaci ikada ne poklope, stavka će se pojaviti ovdje.',
+ heading: 'Status sinhronizacije',
+ title: 'Konflikti',
+ noConflicts: 'Nema pronađenih konflikata',
+ },
+ labels: {
+ menu: 'Meni',
+ },
+ sections: {
+ settings: {
+ description: 'Prilagodite okruženje i postavke',
+ title: 'Postavke',
+ },
+ trash: {
+ description: 'Vratite ili trajno izbrišite uklonjene stavke',
+ title: 'Smeće',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Zatvori uređivač',
+ openActions: 'Otvori radnje',
+ openWorkspaces: 'Otvori radne prostore',
+ },
+ items: {
+ home: 'Početna',
+ menu: 'Meni',
+ primary: 'Primarno',
+ settings: 'Postavke',
+ spaces: 'Prostori',
+ trash: 'Smeće',
+ workspaces: 'Radni prostori',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Dodaj cloze',
+ deleteNote: 'Izbriši bilješku',
+ editNote: 'Uredi bilješku',
+ hideDerivedCardsNote: 'Sakrij bilješku o izvedenim karticama',
+ openNote: 'Otvori {{title}}',
+ saveNote: 'Spremi bilješku',
+ showDerivedCardsNote: 'Prikaži bilješku o izvedenim karticama',
+ },
+ descriptions: {
+ clozeFormat: 'Svaki skriveni dio postaje kartica za ponavljanje kada spremite.',
+ clozeFormatPrefix: 'Označite skriveni tekst pomoću',
+ derivedCardsHelper: 'Bilješke su izvor istine za izvedene kartice.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Ovo premješta "{{title}}" u Smeće. Možete je vratiti kasnije.',
+ deleteNoteFallbackDescription: 'Ovo premješta ovu bilješku u Smeće. Možete je vratiti kasnije.',
+ deleteNoteFallbackTitle: 'Izbrisati bilješku?',
+ deleteNoteTitle: 'Izbrisati "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Bilješka se nije mogla kreirati',
+ couldNotDeleteNote: 'Bilješka se nije mogla izbrisati',
+ couldNotSaveNote: 'Bilješka se nije mogla spremiti',
+ noteCouldNotLoad: 'Bilješka se nije mogla učitati',
+ },
+ fields: {
+ back: 'Poleđina',
+ backPlaceholder: 'Unesite poleđinu',
+ bodyPlaceholder: 'Napišite sadržaj bilješke sa cloze izostavljanjima…',
+ front: 'Prednja strana',
+ frontPlaceholder: 'Unesite prednju stranu',
+ noteBody: 'Sadržaj bilješke',
+ title: 'Naslov',
+ titlePlaceholder: 'Dodajte naslov bilješke',
+ untitledCloze: 'Cloze bez naslova',
+ untitledNote: 'Bilješka bez naslova',
+ },
+ labels: {
+ backUppercase: 'POLEĐINA',
+ basic: 'Osnovna',
+ basicLower: 'osnovna',
+ basicUppercase: 'OSNOVNA',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze format',
+ clozeUppercase: 'CLOZE',
+ deck: 'Špil',
+ derivedCards: 'IZVEDENE KARTICE',
+ due: 'Rok',
+ frontUppercase: 'PREDNJA STRANA',
+ inProgress: 'U toku',
+ inProgressUppercase: 'U TOKU',
+ loadingNote: 'Učitavanje bilješke',
+ loadingNoteEditor: 'Učitavanje uređivača bilješki',
+ markdownFormatting: 'Markdown formatiranje',
+ mastered: 'Savladano',
+ masteredUppercase: 'SAVLADANO',
+ newNote: 'Nova bilješka',
+ noteBody: 'SADRŽAJ BILJEŠKE',
+ noteContent: 'Sadržaj bilješke',
+ noteDetails: 'Detalji bilješke',
+ noteMetadata: 'Metapodaci bilješke',
+ noteType: 'Tip bilješke',
+ notes: 'Bilješke',
+ reviewed: 'Ponovljeno',
+ studyProgress: 'Napredak u učenju',
+ studyProgressUppercase: 'NAPREDAK U UČENJU',
+ titleUppercase: 'NASLOV',
+ updated: 'Ažurirano',
+ },
+ sort: {
+ ariaLabel: 'Sortiraj bilješke',
+ title: 'Naslov',
+ updated: 'Ažurirano',
+ },
+ toolbar: {
+ bold: 'Podebljano',
+ italic: 'Kurziv',
+ link: 'Link',
+ list: 'Lista',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Ponovo',
+ backToDeck: 'Nazad na špil',
+ continueReview: 'Nastavi ponavljanje',
+ easy: 'Lako',
+ good: 'Dobro',
+ hard: 'Teško',
+ newNote: 'Nova bilješka',
+ showAnswer: 'Prikaži odgovor',
+ },
+ errors: {
+ couldNotGradeCard: 'Kartica se nije mogla ocijeniti',
+ reviewCouldNotLoad: 'Ponavljanje se nije moglo učitati',
+ reviewCouldNotStart: 'Ponavljanje se nije moglo pokrenuti',
+ summaryCouldNotLoad: 'Sažetak ponavljanja se nije mogao učitati',
+ summaryNotAvailable: 'Sažetak ponavljanja nije dostupan',
+ summaryNotComplete: 'Ovo ponavljanje još nije završeno.',
+ },
+ labels: {
+ cardsReviewed: 'Ponovljene kartice',
+ deck: 'Špil',
+ duration: 'Trajanje',
+ loadingReview: 'Učitavanje ponavljanja',
+ loadingSummary: 'Učitavanje sažetka',
+ progress: 'Napredak ponavljanja',
+ review: 'Ponavljanje',
+ reviewComplete: 'Ponavljanje završeno',
+ reviewed_one: 'Ponovljena {{count}}',
+ reviewed_few: 'Ponovljene {{count}}',
+ reviewed_other: 'Ponovljeno {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Vaš napredak je spremljen u ovaj špil.',
+ },
+ unavailable: {
+ description: 'Dodajte bilješku da bi ovaj špil mogao ući u red za ponavljanje.',
+ title: 'Nema kartica za ponavljanje',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Obriši pretragu',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Nema rezultata u ovom radnom prostoru',
+ noMatchesInWorkspaceDescription: 'Nijedna mapa, špil ili bilješka ne odgovara "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Pretraga se nije mogla završiti',
+ },
+ labels: {
+ results: 'Rezultati pretrage',
+ resultsFor: 'Rezultati za "{{query}}"',
+ searchingContent: 'Pretraga sadržaja',
+ },
+ resultGroups: {
+ deck: 'Špilovi',
+ folder: 'Mape',
+ note: 'Bilješke',
+ },
+ resultKinds: {
+ deck: 'špil',
+ folder: 'mapa',
+ note: 'bilješka',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Resetuj sve postavke',
+ resetSettings: 'Resetuj postavke',
+ resetToDefaults: 'Vrati zadane vrijednosti',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Zalijepite važeći JSON sa 21 numeričkom vrijednošću.',
+ fsrsErrorInvalidParams_one: 'Unesite JSON niz sa tačno {{count}} konačnim brojem.',
+ fsrsErrorInvalidParams_few: 'Unesite JSON niz sa tačno {{count}} konačna broja.',
+ fsrsErrorInvalidParams_other: 'Unesite JSON niz sa tačno {{count}} konačnih brojeva.',
+ fsrsHelper: 'Ovo je stručna izmjena. Vrijednosti moraju ostati redom.',
+ fsrsJsonLabel: 'JSON FSRS parametara',
+ fsrsTitle: 'Uredi FSRS parametre',
+ fsrsDescription: 'Zalijepite JSON niz sa 21 brojem da zamijenite težine planera.',
+ resetDescription: 'Ovo vraća vremensku zonu, ograničenja učenja i FSRS postavke.',
+ resetDescriptionWithLanguage: 'Ovo vraća jezik, vremensku zonu, ograničenja učenja i FSRS postavke.',
+ resetTitle: 'Resetovati sve postavke?',
+ timezoneDescription: 'Pretražite grad ili identifikator vremenske zone.',
+ timezoneSearchLabel: 'Pretraži vremenske zone',
+ timezoneSearchPlaceholder: 'Pretraži vremenske zone…',
+ timezoneTitle: 'Odaberite vremensku zonu',
+ },
+ errors: {
+ couldNotResetSettings: 'Postavke se nisu mogle resetovati',
+ couldNotSaveSettings: 'Postavke se nisu mogle spremiti',
+ settingsCouldNotLoad: 'Postavke se nisu mogle učitati',
+ settingsUnavailable: 'Postavke nisu dostupne.',
+ },
+ labels: {
+ appearance: 'Izgled',
+ automatic: 'Automatski',
+ fsrsParameters: 'FSRS parametri',
+ general: 'Općenito',
+ language: 'Jezik',
+ loadingSettings: 'Učitavanje postavki',
+ masteryHorizon: 'Horizont savladavanja',
+ newCardOrder: 'Redoslijed novih kartica',
+ newCardsPerDay: 'Nove kartice dnevno',
+ reviewCardsPerDay: 'Kartice za ponavljanje dnevno',
+ savingSettings: 'Spremanje postavki',
+ schedule: 'Raspored',
+ searchNoTimezones: 'Nema odgovarajućih vremenskih zona.',
+ settings: 'Postavke',
+ settingsReset: 'Postavke su resetovane',
+ study: 'Učenje',
+ targetRecallProbability: 'Ciljna vjerovatnoća prisjećanja',
+ theme: 'Tema',
+ timezone: 'Vremenska zona',
+ },
+ options: {
+ languageEnUs: 'Engleski (SAD)',
+ newCardsAfterReviews: 'Nakon ponavljanja',
+ newCardsBeforeReviews: 'Prije ponavljanja',
+ newCardsMixed: 'Miješano',
+ themeDark: 'Tamna',
+ themeLight: 'Svijetla',
+ themeSystem: 'Sistem',
+ timezoneSystem: 'Koristi vremensku zonu sistema',
+ },
+ rows: {
+ fsrsDescription: 'Težine stručnog modela',
+ languageDescription: 'Jezik interfejsa',
+ masteryHorizonDescription: 'Broj dana tokom kojih kartica mora ostati prisjetljiva na ciljnoj vjerovatnoći ili iznad nje da bi se računala kao savladana',
+ newCardOrderDescription: 'Redoslijed novih kartica u odnosu na ponavljanja',
+ newCardsPerDayDescription: 'Maksimalan broj novih kartica dnevno',
+ reviewCardsPerDayDescription: 'Maksimalan broj kartica za ponavljanje dnevno',
+ targetRecallProbabilityDescription: 'Minimalna vjerovatnoća prisjećanja pri sljedećem zakazanom ponavljanju',
+ timezoneDescription: 'Koristite automatsku vremensku zonu ili odaberite grad.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Izbriši trajno',
+ empty: 'Isprazni',
+ emptyTrash: 'Isprazni smeće',
+ restore: 'Vrati',
+ restoringItem: 'Vraćanje {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Ovo trajno briše "{{title}}". To se ne može poništiti.',
+ deleteItemFallbackDescription: 'Ovo trajno briše ovu stavku. To se ne može poništiti.',
+ deleteItemFallbackTitle: 'Izbrisati stavku?',
+ deleteItemTitle: 'Izbrisati "{{title}}"?',
+ emptyTrashDescription: 'Ovo trajno briše sve u Smeću. To se ne može poništiti.',
+ emptyTrashTitle: 'Isprazniti smeće?',
+ },
+ empty: {
+ description: 'Stavke koje izbrišete pojavit će se ovdje prije trajnog uklanjanja.',
+ title: 'Smeće je prazno',
+ },
+ errors: {
+ couldNotDeleteItem: 'Stavka se nije mogla izbrisati',
+ couldNotEmptyTrash: 'Smeće se nije moglo isprazniti',
+ couldNotRestoreItem: 'Stavka se nije mogla vratiti',
+ trashCouldNotLoad: 'Smeće se nije moglo učitati',
+ trashMayBeOutOfDate: 'Smeće možda nije ažurno',
+ },
+ labels: {
+ deletedAge: 'Izbrisano {{value}}',
+ itemCount_one: '{{count}} stavka',
+ itemCount_few: '{{count}} stavke',
+ itemCount_other: '{{count}} stavki',
+ lastEmptied: 'Zadnje ispražnjeno {{value}}',
+ loadingTrash: 'Učitavanje Smeća',
+ originalLocation: 'Izvorna lokacija: {{location}}',
+ title: 'Smeće',
+ trashActions: 'Radnje u Smeću za {{title}}',
+ },
+ kinds: {
+ deck: 'Špil',
+ folder: 'Mapa',
+ note: 'Bilješka',
+ workspace: 'Radni prostor',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Kreiraj radni prostor',
+ deleteWorkspace: 'Izbriši radni prostor',
+ editWorkspace: 'Uredi radni prostor',
+ newWorkspace: 'Novi radni prostor',
+ openWorkspace: 'Otvori {{title}}',
+ openingWorkspace: 'Otvaranje {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Kontekst učenja.',
+ editorVisual: 'Odaberite vizuelno sidro za ovaj radni prostor.',
+ emptyList: 'Odvojite špilove, bilješke i redove za ponavljanje po kontekstu učenja.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Ovo premješta "{{title}}" u Smeće. Možete ga vratiti kasnije.',
+ deleteWorkspaceFallbackDescription: 'Ovo premješta ovaj radni prostor u Smeće. Možete ga vratiti kasnije.',
+ deleteWorkspaceFallbackTitle: 'Izbrisati radni prostor?',
+ deleteWorkspaceTitle: 'Izbrisati "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Počnite s radnim prostorom',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Radni prostor se nije mogao kreirati',
+ couldNotDeleteWorkspace: 'Radni prostor se nije mogao izbrisati',
+ couldNotOpenWorkspace: 'Radni prostor se nije mogao otvoriti',
+ couldNotSaveWorkspace: 'Radni prostor se nije mogao spremiti',
+ workspaceCouldNotLoad: 'Radni prostor se nije mogao učitati',
+ workspacesCouldNotLoad: 'Radni prostori se nisu mogli učitati',
+ },
+ fields: {
+ descriptionLabel: 'Opis radnog prostora',
+ descriptionPlaceholder: 'Šta pripada ovom radnom prostoru?',
+ namePlaceholder: 'Naziv radnog prostora',
+ untitledWorkspace: 'Radni prostor bez naslova',
+ },
+ labels: {
+ createWorkspaceTitle: 'Kreiraj radni prostor',
+ loadingWorkspaces: 'Učitavanje radnih prostora',
+ workspace: 'Radni prostor',
+ workspaces: 'Radni prostori',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/ca.ts b/ui/src/core/i18n/resources/ca.ts
new file mode 100644
index 0000000..4479b1c
--- /dev/null
+++ b/ui/src/core/i18n/resources/ca.ts
@@ -0,0 +1,636 @@
+export const ca = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Torna-ho a provar. Si continua passant, torna a obrir Clear.',
+ title: 'No s\'ha pogut iniciar',
+ },
+ loadingTitle: 'Preparant el teu espai d\'estudi',
+ },
+ common: {
+ actions: {
+ back: 'Enrere',
+ cancel: 'Cancel·la',
+ checkAgain: 'Comprova-ho de nou',
+ close: 'Tanca',
+ create: 'Crea',
+ delete: 'Suprimeix',
+ dismissError: 'Descarta l\'error',
+ dismissStatus: 'Descarta l\'estat',
+ edit: 'Edita',
+ itemActions: 'Accions de {{title}}',
+ reset: 'Restableix',
+ review: 'Repassa',
+ save: 'Desa',
+ saveChanges: 'Desa els canvis',
+ tryAgain: 'Torna-ho a provar',
+ },
+ labels: {
+ active: 'Actiu',
+ clear: 'Clear',
+ custom: 'Personalitzat',
+ default: 'Predeterminat',
+ loadingEditor: 'S\'està carregant l\'editor',
+ name: 'Nom',
+ completedTask: 'Tasca completada',
+ description: 'Descripció',
+ incompleteTask: 'Tasca incompleta',
+ percentageInput: 'Percentatge de {{label}}',
+ visual: 'Visual',
+ },
+ status: {
+ actionFailed: 'L\'acció ha fallat',
+ actionInProgress: 'Acció en curs',
+ },
+ sort: {
+ ascending: 'Asc.',
+ column: 'Columna',
+ descending: 'Desc.',
+ direction: 'Direcció',
+ sort: 'Ordena',
+ },
+ search: {
+ label: 'Cerca',
+ },
+ visualPicker: {
+ allLucideIcons: 'Totes les icones Lucide',
+ browseIconsFor: 'Explora o cerca icones per a {{label}}.',
+ chooseIcon: 'Tria una icona',
+ iconPicker: 'Selector d\'icona de {{label}}',
+ iconSearch: 'Cerca d\'icones de {{label}}',
+ iconsCouldNotLoad: 'No s\'han pogut carregar les icones.',
+ loadingIcons: 'S\'estan carregant les icones',
+ loadingMoreIcons: 'S\'estan carregant més icones',
+ moreIcons: 'Més icones',
+ noIconsMatch: 'Cap icona coincideix amb "{{query}}".',
+ searchIconsPlaceholder: 'Cerca icones…',
+ selectedIcon: '{{label}} seleccionat',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Crea',
+ newDeck: 'Baralla nova',
+ newFolder: 'Carpeta nova',
+ },
+ descriptions: {
+ defaultWorkspace: 'Mantén juntes les baralles, les carpetes i les notes.',
+ emptyWorkspace: 'Crea una baralla i després afegeix notes per construir la teva cua de repàs.',
+ emptyFolder: 'Crea una baralla i després afegeix notes per construir una cua de repàs.',
+ searchPlaceholder: 'Cerca carpetes, baralles i notes…',
+ },
+ empty: {
+ createFirstDeck: 'Crea la teva primera baralla',
+ },
+ errors: {
+ couldNotDeleteDeck: 'No s\'ha pogut suprimir la baralla',
+ couldNotDeleteFolder: 'No s\'ha pogut suprimir la carpeta',
+ couldNotDeleteWorkspace: 'No s\'ha pogut suprimir l\'espai de treball',
+ dashboardCouldNotOpen: 'No s\'ha pogut obrir el tauler',
+ decksCouldNotLoad: 'No s\'han pogut carregar les baralles',
+ decksMayBeOutOfDate: 'Les baralles poden estar desactualitzades',
+ foldersCouldNotLoad: 'No s\'han pogut carregar les carpetes',
+ foldersMayBeOutOfDate: 'Les carpetes poden estar desactualitzades',
+ workspaceCouldNotLoad: 'No s\'ha pogut carregar l\'espai de treball',
+ },
+ labels: {
+ dashboard: 'Tauler',
+ loadingDashboard: 'S\'està carregant el tauler',
+ newItem: 'Element nou',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Data no disponible',
+ },
+ age: {
+ dayAgo_one: 'fa {{count}} dia',
+ dayAgo_many: 'fa {{count}} dies',
+ dayAgo_other: 'fa {{count}} dies',
+ hourAgo_one: 'fa {{count}} hora',
+ hourAgo_many: 'fa {{count}} hores',
+ hourAgo_other: 'fa {{count}} hores',
+ justNow: 'ara mateix',
+ minuteAgo_one: 'fa {{count}} minut',
+ minuteAgo_many: 'fa {{count}} minuts',
+ minuteAgo_other: 'fa {{count}} minuts',
+ unavailable: 'data no disponible',
+ weekAgo_one: 'fa {{count}} setmana',
+ weekAgo_many: 'fa {{count}} setmanes',
+ weekAgo_other: 'fa {{count}} setmanes',
+ },
+ labels: {
+ deleted: 'Suprimit {{value}}',
+ due: 'Venciment: {{value}}',
+ reviewed: 'Repassat: {{value}}',
+ updated: 'Actualitzat {{value}}',
+ updatedUppercase: 'ACTUALITZAT {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'fa {{count}} dia',
+ dayAgo_many: 'fa {{count}} dies',
+ dayAgo_other: 'fa {{count}} dies',
+ inAMoment: 'D\'aquí a un moment',
+ inDay_one: 'D\'aquí a {{count}} dia',
+ inDay_many: 'D\'aquí a {{count}} dies',
+ inDay_other: 'D\'aquí a {{count}} dies',
+ inMonth_one: 'D\'aquí a {{count}} mes',
+ inMonth_many: 'D\'aquí a {{count}} mesos',
+ inMonth_other: 'D\'aquí a {{count}} mesos',
+ inWeek_one: 'D\'aquí a {{count}} setmana',
+ inWeek_many: 'D\'aquí a {{count}} setmanes',
+ inWeek_other: 'D\'aquí a {{count}} setmanes',
+ justNow: 'Ara mateix',
+ monthAgo_one: 'fa {{count}} mes',
+ monthAgo_many: 'fa {{count}} mesos',
+ monthAgo_other: 'fa {{count}} mesos',
+ secondsAgoShort: 'fa {{count}} s',
+ minutesAgoShort: 'fa {{count}} min',
+ hoursAgoShort: 'fa {{count}} h',
+ today: 'Avui',
+ tomorrow: 'Demà',
+ weekAgo_one: 'fa {{count}} setmana',
+ weekAgo_many: 'fa {{count}} setmanes',
+ weekAgo_other: 'fa {{count}} setmanes',
+ yesterday: 'Ahir',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Accions de {{title}}',
+ createDeck: 'Crea una baralla',
+ createNote: 'Crea una nota',
+ deleteDeck: 'Suprimeix la baralla',
+ editDeck: 'Edita la baralla',
+ newNote: 'Nota nova',
+ openDeck: 'Obre la baralla {{title}}',
+ saveDeck: 'No s\'ha pogut desar la baralla',
+ studyNow: 'Estudia ara',
+ },
+ descriptions: {
+ emptyDeck: 'Afegeix una nota perquè aquesta baralla tingui material per repassar.',
+ editorDefault: 'Baralla d\'estudi enfocada.',
+ editorVisual: 'Tria un símbol de portada per a aquesta baralla.',
+ notesSearchPlaceholder: 'Cerca notes…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Això mou "{{title}}" a la Paperera. Pots restaurar-ho més tard.',
+ deleteDeckFallbackDescription: 'Això mou aquesta baralla a la Paperera. Pots restaurar-la més tard.',
+ deleteDeckFallbackTitle: 'Vols suprimir la baralla?',
+ deleteDeckTitle: 'Vols suprimir "{{title}}"?',
+ deleteNoteDescription: 'Això mou "{{title}}" a la Paperera. Pots restaurar-la més tard.',
+ deleteNoteFallbackTitle: 'Vols suprimir la nota?',
+ deleteNoteTitle: 'Vols suprimir "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'No hi ha notes coincidents',
+ noMatchingNotesDescription: 'Cap nota coincideix amb "{{query}}".',
+ thisDeckIsEmpty: 'Aquesta baralla és buida',
+ },
+ errors: {
+ couldNotCreateDeck: 'No s\'ha pogut crear la baralla',
+ couldNotDeleteDeck: 'No s\'ha pogut suprimir la baralla',
+ couldNotDeleteNote: 'No s\'ha pogut suprimir la nota',
+ couldNotLoadFolderPath: 'No s\'ha pogut carregar el camí de la carpeta',
+ couldNotSaveDeck: 'No s\'ha pogut desar la baralla',
+ deckCouldNotLoad: 'No s\'ha pogut carregar la baralla',
+ notesCouldNotLoad: 'No s\'han pogut carregar les notes',
+ notesMayBeOutOfDate: 'Les notes poden estar desactualitzades',
+ },
+ fields: {
+ descriptionLabel: 'Descripció de la baralla',
+ descriptionPlaceholder: 'Què t\'ajudarà a repassar aquesta baralla?',
+ namePlaceholder: 'Nom de la baralla',
+ untitledDeck: 'Baralla sense títol',
+ untitledDeckLower: 'baralla sense títol',
+ },
+ labels: {
+ createDeckTitle: 'Crea una baralla',
+ deck: 'Baralla',
+ deckNotesSearch: 'Cerca de notes de la baralla',
+ deckOverview: 'Vista general de la baralla',
+ decks: 'Baralles',
+ due: 'Venciment',
+ dueToday: 'Venciment avui',
+ loadingDeck: 'S\'està carregant la baralla',
+ mastery: 'Domini',
+ notes: 'Notes',
+ },
+ sort: {
+ ariaLabel: 'Ordena les baralles',
+ dueToday: 'Venciment avui',
+ title: 'Títol',
+ updated: 'Actualitzat',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Les dades han canviat. Actualitza i torna-ho a provar.',
+ forbidden: 'No tens permís per fer això.',
+ notFound: 'No hem pogut trobar aquest element.',
+ offline: 'No es pot contactar amb el servei.',
+ timeout: 'Això ha trigat massa. Torna-ho a provar.',
+ unauthorized: 'Inicia la sessió per continuar.',
+ unavailable: 'El servei no està disponible temporalment.',
+ },
+ fallback: {
+ unexpected: 'Error inesperat',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Crea una carpeta',
+ deleteFolder: 'Suprimeix la carpeta',
+ editFolder: 'Edita la carpeta',
+ },
+ descriptions: {
+ editorDefault: 'Carpeta per a baralles relacionades.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Això mou "{{name}}" a la Paperera. Pots restaurar-la més tard.',
+ deleteFolderFallbackDescription: 'Això mou aquesta carpeta a la Paperera. Pots restaurar-la més tard.',
+ deleteFolderFallbackTitle: 'Vols suprimir la carpeta?',
+ deleteFolderTitle: 'Vols suprimir "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'No hi ha coincidències en aquesta carpeta',
+ noMatchesInFolderDescription: 'Cap carpeta, baralla o nota coincideix amb "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'No s\'ha pogut crear la carpeta',
+ couldNotDeleteFolder: 'No s\'ha pogut suprimir la carpeta',
+ couldNotLoadFolderPath: 'No s\'ha pogut carregar el camí de la carpeta',
+ couldNotSaveFolder: 'No s\'ha pogut desar la carpeta',
+ folderCouldNotLoad: 'No s\'ha pogut carregar la carpeta',
+ },
+ fields: {
+ descriptionLabel: 'Descripció de la carpeta',
+ descriptionPlaceholder: 'Què pertany a aquesta carpeta?',
+ namePlaceholder: 'Nom de la carpeta',
+ untitledFolder: 'Carpeta sense títol',
+ },
+ labels: {
+ createFolderTitle: 'Crea una carpeta',
+ folder: 'Carpeta',
+ folders: 'Carpetes',
+ loadingFolder: 'S\'està carregant la carpeta',
+ name: 'Nom',
+ updated: 'Actualitzat',
+ },
+ sort: {
+ ariaLabel: 'Ordena les carpetes',
+ name: 'Nom',
+ updated: 'Actualitzat',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Si les dades locals i sincronitzades no coincideixen mai, l\'element apareixerà aquí.',
+ heading: 'Estat de sincronització',
+ title: 'Conflictes',
+ noConflicts: 'No s\'han trobat conflictes',
+ },
+ labels: {
+ menu: 'Menú',
+ },
+ sections: {
+ settings: {
+ description: 'Personalitza el teu entorn i preferències',
+ title: 'Configuració',
+ },
+ trash: {
+ description: 'Restaura o suprimeix permanentment els elements eliminats',
+ title: 'Paperera',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Tanca l\'editor',
+ openActions: 'Obre les accions',
+ openWorkspaces: 'Obre els espais de treball',
+ },
+ items: {
+ home: 'Inici',
+ menu: 'Menú',
+ primary: 'Principal',
+ settings: 'Configuració',
+ spaces: 'Espais',
+ trash: 'Paperera',
+ workspaces: 'Espais de treball',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Afegeix cloze',
+ deleteNote: 'Suprimeix la nota',
+ editNote: 'Edita la nota',
+ hideDerivedCardsNote: 'Amaga la nota sobre targetes derivades',
+ openNote: 'Obre {{title}}',
+ saveNote: 'Desa la nota',
+ showDerivedCardsNote: 'Mostra la nota sobre targetes derivades',
+ },
+ descriptions: {
+ clozeFormat: 'Cada part amagada es converteix en una targeta de repàs quan deses.',
+ clozeFormatPrefix: 'Envolta el text amagat amb',
+ derivedCardsHelper: 'Les notes són la font de veritat de les targetes derivades.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Això mou "{{title}}" a la Paperera. Pots restaurar-la més tard.',
+ deleteNoteFallbackDescription: 'Això mou aquesta nota a la Paperera. Pots restaurar-la més tard.',
+ deleteNoteFallbackTitle: 'Vols suprimir la nota?',
+ deleteNoteTitle: 'Vols suprimir "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'No s\'ha pogut crear la nota',
+ couldNotDeleteNote: 'No s\'ha pogut suprimir la nota',
+ couldNotSaveNote: 'No s\'ha pogut desar la nota',
+ noteCouldNotLoad: 'No s\'ha pogut carregar la nota',
+ },
+ fields: {
+ back: 'Dors',
+ backPlaceholder: 'Introdueix el dors',
+ bodyPlaceholder: 'Escriu el contingut de la nota amb eliminacions cloze…',
+ front: 'Anvers',
+ frontPlaceholder: 'Introdueix l\'anvers',
+ noteBody: 'Contingut de la nota',
+ title: 'Títol',
+ titlePlaceholder: 'Afegeix un títol de nota',
+ untitledCloze: 'Cloze sense títol',
+ untitledNote: 'Nota sense títol',
+ },
+ labels: {
+ backUppercase: 'DORS',
+ basic: 'Bàsica',
+ basicLower: 'bàsica',
+ basicUppercase: 'BÀSICA',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Format cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Baralla',
+ derivedCards: 'TARGETES DERIVADES',
+ due: 'Venciment',
+ frontUppercase: 'ANVERS',
+ inProgress: 'En curs',
+ inProgressUppercase: 'EN CURS',
+ loadingNote: 'S\'està carregant la nota',
+ loadingNoteEditor: 'S\'està carregant l\'editor de notes',
+ markdownFormatting: 'Format Markdown',
+ mastered: 'Dominada',
+ masteredUppercase: 'DOMINADA',
+ newNote: 'Nota nova',
+ noteBody: 'CONTINGUT DE LA NOTA',
+ noteContent: 'Contingut de la nota',
+ noteDetails: 'Detalls de la nota',
+ noteMetadata: 'Metadades de la nota',
+ noteType: 'Tipus de nota',
+ notes: 'Notes',
+ reviewed: 'Repassat',
+ studyProgress: 'Progrés d\'estudi',
+ studyProgressUppercase: 'PROGRÉS D\'ESTUDI',
+ titleUppercase: 'TÍTOL',
+ updated: 'Actualitzat',
+ },
+ sort: {
+ ariaLabel: 'Ordena les notes',
+ title: 'Títol',
+ updated: 'Actualitzat',
+ },
+ toolbar: {
+ bold: 'Negreta',
+ italic: 'Cursiva',
+ link: 'Enllaç',
+ list: 'Llista',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Una altra vegada',
+ backToDeck: 'Torna a la baralla',
+ continueReview: 'Continua el repàs',
+ easy: 'Fàcil',
+ good: 'Bé',
+ hard: 'Difícil',
+ newNote: 'Nota nova',
+ showAnswer: 'Mostra la resposta',
+ },
+ errors: {
+ couldNotGradeCard: 'No s\'ha pogut qualificar la targeta',
+ reviewCouldNotLoad: 'No s\'ha pogut carregar el repàs',
+ reviewCouldNotStart: 'No s\'ha pogut iniciar el repàs',
+ summaryCouldNotLoad: 'No s\'ha pogut carregar el resum del repàs',
+ summaryNotAvailable: 'El resum del repàs no està disponible',
+ summaryNotComplete: 'Aquest repàs encara no està complet.',
+ },
+ labels: {
+ cardsReviewed: 'Targetes repassades',
+ deck: 'Baralla',
+ duration: 'Durada',
+ loadingReview: 'S\'està carregant el repàs',
+ loadingSummary: 'S\'està carregant el resum',
+ progress: 'Progrés del repàs',
+ review: 'Repàs',
+ reviewComplete: 'Repàs completat',
+ reviewed_one: 'Repassada {{count}}',
+ reviewed_many: 'Repassades {{count}}',
+ reviewed_other: 'Repassades {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'El teu progrés s\'ha desat en aquesta baralla.',
+ },
+ unavailable: {
+ description: 'Afegeix una nota perquè aquesta baralla pugui entrar a la cua de repàs.',
+ title: 'No hi ha targetes per repassar',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Esborra la cerca',
+ },
+ empty: {
+ noMatchesInWorkspace: 'No hi ha coincidències en aquest espai de treball',
+ noMatchesInWorkspaceDescription: 'Cap carpeta, baralla o nota coincideix amb "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'No s\'ha pogut completar la cerca',
+ },
+ labels: {
+ results: 'Resultats de cerca',
+ resultsFor: 'Resultats per a "{{query}}"',
+ searchingContent: 'S\'està cercant contingut',
+ },
+ resultGroups: {
+ deck: 'Baralles',
+ folder: 'Carpetes',
+ note: 'Notes',
+ },
+ resultKinds: {
+ deck: 'baralla',
+ folder: 'carpeta',
+ note: 'nota',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Restableix tota la configuració',
+ resetSettings: 'Restableix la configuració',
+ resetToDefaults: 'Restableix els valors predeterminats',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Enganxa un JSON vàlid amb 21 valors numèrics.',
+ fsrsErrorInvalidParams_one: 'Introdueix una matriu JSON amb exactament {{count}} nombre finit.',
+ fsrsErrorInvalidParams_many: 'Introdueix una matriu JSON amb exactament {{count}} nombres finits.',
+ fsrsErrorInvalidParams_other: 'Introdueix una matriu JSON amb exactament {{count}} nombres finits.',
+ fsrsHelper: 'Això és una substitució experta. Els valors han de mantenir l\'ordre.',
+ fsrsJsonLabel: 'JSON de paràmetres FSRS',
+ fsrsTitle: 'Edita els paràmetres FSRS',
+ fsrsDescription: 'Enganxa una matriu JSON amb 21 nombres per substituir els pesos del planificador.',
+ resetDescription: 'Això restaura la zona horària, els límits d\'estudi i la configuració FSRS.',
+ resetDescriptionWithLanguage: 'Això restaura l\'idioma, la zona horària, els límits d\'estudi i la configuració FSRS.',
+ resetTitle: 'Vols restablir tota la configuració?',
+ timezoneDescription: 'Cerca una ciutat o un identificador de zona horària.',
+ timezoneSearchLabel: 'Cerca zones horàries',
+ timezoneSearchPlaceholder: 'Cerca zones horàries…',
+ timezoneTitle: 'Tria la zona horària',
+ },
+ errors: {
+ couldNotResetSettings: 'No s\'ha pogut restablir la configuració',
+ couldNotSaveSettings: 'No s\'ha pogut desar la configuració',
+ settingsCouldNotLoad: 'No s\'ha pogut carregar la configuració',
+ settingsUnavailable: 'La configuració no està disponible.',
+ },
+ labels: {
+ appearance: 'Aparença',
+ automatic: 'Automàtic',
+ fsrsParameters: 'Paràmetres FSRS',
+ general: 'General',
+ language: 'Idioma',
+ loadingSettings: 'S\'està carregant la configuració',
+ masteryHorizon: 'Horitzó de domini',
+ newCardOrder: 'Ordre de les targetes noves',
+ newCardsPerDay: 'Targetes noves per dia',
+ reviewCardsPerDay: 'Targetes de repàs per dia',
+ savingSettings: 'S\'està desant la configuració',
+ schedule: 'Programació',
+ searchNoTimezones: 'No hi ha zones horàries coincidents.',
+ settings: 'Configuració',
+ settingsReset: 'Configuració restablerta',
+ study: 'Estudi',
+ targetRecallProbability: 'Probabilitat objectiu de record',
+ theme: 'Tema',
+ timezone: 'Zona horària',
+ },
+ options: {
+ languageEnUs: 'Anglès (EUA)',
+ newCardsAfterReviews: 'Després dels repassos',
+ newCardsBeforeReviews: 'Abans dels repassos',
+ newCardsMixed: 'Mixt',
+ themeDark: 'Fosc',
+ themeLight: 'Clar',
+ themeSystem: 'Sistema',
+ timezoneSystem: 'Utilitza la zona horària del sistema',
+ },
+ rows: {
+ fsrsDescription: 'Pesos del model expert',
+ languageDescription: 'Idioma de la interfície',
+ masteryHorizonDescription: 'Dies que una targeta ha de romandre recordable a la probabilitat objectiu o per sobre per comptar com a dominada',
+ newCardOrderDescription: 'Ordre de les targetes noves respecte als repassos',
+ newCardsPerDayDescription: 'Nombre màxim de targetes noves per dia',
+ reviewCardsPerDayDescription: 'Nombre màxim de targetes de repàs per dia',
+ targetRecallProbabilityDescription: 'Probabilitat mínima de record en el proper repàs programat',
+ timezoneDescription: 'Utilitza la zona horària automàtica o tria una ciutat.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Suprimeix permanentment',
+ empty: 'Buida',
+ emptyTrash: 'Buida la paperera',
+ restore: 'Restaura',
+ restoringItem: 'S\'està restaurant {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Això suprimeix "{{title}}" permanentment. No es pot desfer.',
+ deleteItemFallbackDescription: 'Això suprimeix aquest element permanentment. No es pot desfer.',
+ deleteItemFallbackTitle: 'Vols suprimir l\'element?',
+ deleteItemTitle: 'Vols suprimir "{{title}}"?',
+ emptyTrashDescription: 'Això suprimeix permanentment tot el que hi ha a la Paperera. No es pot desfer.',
+ emptyTrashTitle: 'Vols buidar la paperera?',
+ },
+ empty: {
+ description: 'Els elements que suprimeixis apareixeran aquí abans de l\'eliminació permanent.',
+ title: 'La paperera és buida',
+ },
+ errors: {
+ couldNotDeleteItem: 'No s\'ha pogut suprimir l\'element',
+ couldNotEmptyTrash: 'No s\'ha pogut buidar la paperera',
+ couldNotRestoreItem: 'No s\'ha pogut restaurar l\'element',
+ trashCouldNotLoad: 'No s\'ha pogut carregar la paperera',
+ trashMayBeOutOfDate: 'La paperera pot estar desactualitzada',
+ },
+ labels: {
+ deletedAge: 'Suprimit {{value}}',
+ itemCount_one: '{{count}} element',
+ itemCount_many: '{{count}} elements',
+ itemCount_other: '{{count}} elements',
+ lastEmptied: 'Buidada per última vegada {{value}}',
+ loadingTrash: 'S\'està carregant la Paperera',
+ originalLocation: 'Ubicació original: {{location}}',
+ title: 'Paperera',
+ trashActions: 'Accions de paperera de {{title}}',
+ },
+ kinds: {
+ deck: 'Baralla',
+ folder: 'Carpeta',
+ note: 'Nota',
+ workspace: 'Espai de treball',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Crea un espai de treball',
+ deleteWorkspace: 'Suprimeix l\'espai de treball',
+ editWorkspace: 'Edita l\'espai de treball',
+ newWorkspace: 'Espai de treball nou',
+ openWorkspace: 'Obre {{title}}',
+ openingWorkspace: 'S\'està obrint {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Context d\'estudi.',
+ editorVisual: 'Tria un ancoratge visual per a aquest espai de treball.',
+ emptyList: 'Separa baralles, notes i cues de repàs per context d\'estudi.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Això mou "{{title}}" a la Paperera. Pots restaurar-ho més tard.',
+ deleteWorkspaceFallbackDescription: 'Això mou aquest espai de treball a la Paperera. Pots restaurar-lo més tard.',
+ deleteWorkspaceFallbackTitle: 'Vols suprimir l\'espai de treball?',
+ deleteWorkspaceTitle: 'Vols suprimir "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Comença amb un espai de treball',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'No s\'ha pogut crear l\'espai de treball',
+ couldNotDeleteWorkspace: 'No s\'ha pogut suprimir l\'espai de treball',
+ couldNotOpenWorkspace: 'No s\'ha pogut obrir l\'espai de treball',
+ couldNotSaveWorkspace: 'No s\'ha pogut desar l\'espai de treball',
+ workspaceCouldNotLoad: 'No s\'ha pogut carregar l\'espai de treball',
+ workspacesCouldNotLoad: 'No s\'han pogut carregar els espais de treball',
+ },
+ fields: {
+ descriptionLabel: 'Descripció de l\'espai de treball',
+ descriptionPlaceholder: 'Què pertany a aquest espai de treball?',
+ namePlaceholder: 'Nom de l\'espai de treball',
+ untitledWorkspace: 'Espai de treball sense títol',
+ },
+ labels: {
+ createWorkspaceTitle: 'Crea un espai de treball',
+ loadingWorkspaces: 'S\'estan carregant els espais de treball',
+ workspace: 'Espai de treball',
+ workspaces: 'Espais de treball',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/cs.ts b/ui/src/core/i18n/resources/cs.ts
new file mode 100644
index 0000000..8fe8568
--- /dev/null
+++ b/ui/src/core/i18n/resources/cs.ts
@@ -0,0 +1,649 @@
+export const cs = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Zkuste to znovu. Pokud se to bude opakovat, znovu otevřete Clear.',
+ title: 'Nepodařilo se spustit',
+ },
+ loadingTitle: 'Připravuje se váš studijní prostor',
+ },
+ common: {
+ actions: {
+ back: 'Zpět',
+ cancel: 'Zrušit',
+ checkAgain: 'Zkontrolovat znovu',
+ close: 'Zavřít',
+ create: 'Vytvořit',
+ delete: 'Smazat',
+ dismissError: 'Zavřít chybu',
+ dismissStatus: 'Zavřít stav',
+ edit: 'Upravit',
+ itemActions: 'Akce pro {{title}}',
+ reset: 'Resetovat',
+ review: 'Opakovat',
+ save: 'Uložit',
+ saveChanges: 'Uložit změny',
+ tryAgain: 'Zkusit znovu',
+ },
+ labels: {
+ active: 'Aktivní',
+ clear: 'Clear',
+ custom: 'Vlastní',
+ default: 'Výchozí',
+ loadingEditor: 'Načítání editoru',
+ name: 'Název',
+ completedTask: 'Dokončený úkol',
+ description: 'Popis',
+ incompleteTask: 'Nedokončený úkol',
+ percentageInput: 'Procento pro {{label}}',
+ visual: 'Vizuál',
+ },
+ status: {
+ actionFailed: 'Akce se nezdařila',
+ actionInProgress: 'Akce probíhá',
+ },
+ sort: {
+ ascending: 'Vzest.',
+ column: 'Sloupec',
+ descending: 'Sest.',
+ direction: 'Směr',
+ sort: 'Řadit',
+ },
+ search: {
+ label: 'Hledat',
+ },
+ visualPicker: {
+ allLucideIcons: 'Všechny ikony Lucide',
+ browseIconsFor: 'Procházejte nebo hledejte ikony pro {{label}}.',
+ chooseIcon: 'Vybrat ikonu',
+ iconPicker: 'Výběr ikony pro {{label}}',
+ iconSearch: 'Hledání ikon pro {{label}}',
+ iconsCouldNotLoad: 'Ikony se nepodařilo načíst.',
+ loadingIcons: 'Načítání ikon',
+ loadingMoreIcons: 'Načítání dalších ikon',
+ moreIcons: 'Další ikony',
+ noIconsMatch: 'Žádné ikony neodpovídají "{{query}}".',
+ searchIconsPlaceholder: 'Hledat ikony…',
+ selectedIcon: 'Vybráno {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Vytvořit',
+ newDeck: 'Nový balíček',
+ newFolder: 'Nová složka',
+ },
+ descriptions: {
+ defaultWorkspace: 'Mějte balíčky, složky a poznámky pohromadě.',
+ emptyWorkspace: 'Vytvořte balíček a poté přidejte poznámky, abyste sestavili frontu opakování.',
+ emptyFolder: 'Vytvořte balíček a poté přidejte poznámky, abyste sestavili frontu opakování.',
+ searchPlaceholder: 'Hledat složky, balíčky a poznámky…',
+ },
+ empty: {
+ createFirstDeck: 'Vytvořte svůj první balíček',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Balíček se nepodařilo smazat',
+ couldNotDeleteFolder: 'Složku se nepodařilo smazat',
+ couldNotDeleteWorkspace: 'Pracovní prostor se nepodařilo smazat',
+ dashboardCouldNotOpen: 'Panel se nepodařilo otevřít',
+ decksCouldNotLoad: 'Balíčky se nepodařilo načíst',
+ decksMayBeOutOfDate: 'Balíčky mohou být zastaralé',
+ foldersCouldNotLoad: 'Složky se nepodařilo načíst',
+ foldersMayBeOutOfDate: 'Složky mohou být zastaralé',
+ workspaceCouldNotLoad: 'Pracovní prostor se nepodařilo načíst',
+ },
+ labels: {
+ dashboard: 'Panel',
+ loadingDashboard: 'Načítání panelu',
+ newItem: 'Nová položka',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Datum není k dispozici',
+ },
+ age: {
+ dayAgo_one: 'před {{count}} dnem',
+ dayAgo_few: 'před {{count}} dny',
+ dayAgo_many: 'před {{count}} dne',
+ dayAgo_other: 'před {{count}} dny',
+ hourAgo_one: 'před {{count}} hodinou',
+ hourAgo_few: 'před {{count}} hodinami',
+ hourAgo_many: 'před {{count}} hodiny',
+ hourAgo_other: 'před {{count}} hodinami',
+ justNow: 'právě teď',
+ minuteAgo_one: 'před {{count}} minutou',
+ minuteAgo_few: 'před {{count}} minutami',
+ minuteAgo_many: 'před {{count}} minuty',
+ minuteAgo_other: 'před {{count}} minutami',
+ unavailable: 'datum není k dispozici',
+ weekAgo_one: 'před {{count}} týdnem',
+ weekAgo_few: 'před {{count}} týdny',
+ weekAgo_many: 'před {{count}} týdne',
+ weekAgo_other: 'před {{count}} týdny',
+ },
+ labels: {
+ deleted: 'Smazáno {{value}}',
+ due: 'Termín: {{value}}',
+ reviewed: 'Opakováno: {{value}}',
+ updated: 'Aktualizováno {{value}}',
+ updatedUppercase: 'AKTUALIZOVÁNO {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'před {{count}} dnem',
+ dayAgo_few: 'před {{count}} dny',
+ dayAgo_many: 'před {{count}} dne',
+ dayAgo_other: 'před {{count}} dny',
+ inAMoment: 'Za chvíli',
+ inDay_one: 'Za {{count}} den',
+ inDay_few: 'Za {{count}} dny',
+ inDay_many: 'Za {{count}} dne',
+ inDay_other: 'Za {{count}} dní',
+ inMonth_one: 'Za {{count}} měsíc',
+ inMonth_few: 'Za {{count}} měsíce',
+ inMonth_many: 'Za {{count}} měsíce',
+ inMonth_other: 'Za {{count}} měsíců',
+ inWeek_one: 'Za {{count}} týden',
+ inWeek_few: 'Za {{count}} týdny',
+ inWeek_many: 'Za {{count}} týdne',
+ inWeek_other: 'Za {{count}} týdnů',
+ justNow: 'Právě teď',
+ monthAgo_one: 'před {{count}} měsícem',
+ monthAgo_few: 'před {{count}} měsíci',
+ monthAgo_many: 'před {{count}} měsíce',
+ monthAgo_other: 'před {{count}} měsíci',
+ secondsAgoShort: 'před {{count}} s',
+ minutesAgoShort: 'před {{count}} min',
+ hoursAgoShort: 'před {{count}} h',
+ today: 'Dnes',
+ tomorrow: 'Zítra',
+ weekAgo_one: 'před {{count}} týdnem',
+ weekAgo_few: 'před {{count}} týdny',
+ weekAgo_many: 'před {{count}} týdne',
+ weekAgo_other: 'před {{count}} týdny',
+ yesterday: 'Včera',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Akce pro {{title}}',
+ createDeck: 'Vytvořit balíček',
+ createNote: 'Vytvořit poznámku',
+ deleteDeck: 'Smazat balíček',
+ editDeck: 'Upravit balíček',
+ newNote: 'Nová poznámka',
+ openDeck: 'Otevřít balíček {{title}}',
+ saveDeck: 'Balíček se nepodařilo uložit',
+ studyNow: 'Studovat teď',
+ },
+ descriptions: {
+ emptyDeck: 'Přidejte poznámku, aby měl tento balíček materiál k opakování.',
+ editorDefault: 'Zaměřený studijní balíček.',
+ editorVisual: 'Vyberte krycí symbol pro tento balíček.',
+ notesSearchPlaceholder: 'Hledat poznámky…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Tím se "{{title}}" přesune do Koše. Později ho můžete obnovit.',
+ deleteDeckFallbackDescription: 'Tím se tento balíček přesune do Koše. Později ho můžete obnovit.',
+ deleteDeckFallbackTitle: 'Smazat balíček?',
+ deleteDeckTitle: 'Smazat "{{title}}"?',
+ deleteNoteDescription: 'Tím se "{{title}}" přesune do Koše. Později ji můžete obnovit.',
+ deleteNoteFallbackTitle: 'Smazat poznámku?',
+ deleteNoteTitle: 'Smazat "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Žádné odpovídající poznámky',
+ noMatchingNotesDescription: 'Žádné poznámky neodpovídají "{{query}}".',
+ thisDeckIsEmpty: 'Tento balíček je prázdný',
+ },
+ errors: {
+ couldNotCreateDeck: 'Balíček se nepodařilo vytvořit',
+ couldNotDeleteDeck: 'Balíček se nepodařilo smazat',
+ couldNotDeleteNote: 'Poznámku se nepodařilo smazat',
+ couldNotLoadFolderPath: 'Cestu ke složce se nepodařilo načíst',
+ couldNotSaveDeck: 'Balíček se nepodařilo uložit',
+ deckCouldNotLoad: 'Balíček se nepodařilo načíst',
+ notesCouldNotLoad: 'Poznámky se nepodařilo načíst',
+ notesMayBeOutOfDate: 'Poznámky mohou být zastaralé',
+ },
+ fields: {
+ descriptionLabel: 'Popis balíčku',
+ descriptionPlaceholder: 'Co vám tento balíček pomůže opakovat?',
+ namePlaceholder: 'Název balíčku',
+ untitledDeck: 'Balíček bez názvu',
+ untitledDeckLower: 'balíček bez názvu',
+ },
+ labels: {
+ createDeckTitle: 'Vytvořit balíček',
+ deck: 'Balíček',
+ deckNotesSearch: 'Hledání poznámek v balíčku',
+ deckOverview: 'Přehled balíčku',
+ decks: 'Balíčky',
+ due: 'Termín',
+ dueToday: 'Termín dnes',
+ loadingDeck: 'Načítání balíčku',
+ mastery: 'Zvládnutí',
+ notes: 'Poznámky',
+ },
+ sort: {
+ ariaLabel: 'Řadit balíčky',
+ dueToday: 'Termín dnes',
+ title: 'Název',
+ updated: 'Aktualizováno',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Data se změnila. Obnovte je a zkuste to znovu.',
+ forbidden: 'K této akci nemáte oprávnění.',
+ notFound: 'Tuto položku se nepodařilo najít.',
+ offline: 'Službu nelze kontaktovat.',
+ timeout: 'Trvá to příliš dlouho. Zkuste to znovu.',
+ unauthorized: 'Pro pokračování se přihlaste.',
+ unavailable: 'Služba je dočasně nedostupná.',
+ },
+ fallback: {
+ unexpected: 'Neočekávaná chyba',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Vytvořit složku',
+ deleteFolder: 'Smazat složku',
+ editFolder: 'Upravit složku',
+ },
+ descriptions: {
+ editorDefault: 'Složka pro související balíčky.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Tím se "{{name}}" přesune do Koše. Později ji můžete obnovit.',
+ deleteFolderFallbackDescription: 'Tím se tato složka přesune do Koše. Později ji můžete obnovit.',
+ deleteFolderFallbackTitle: 'Smazat složku?',
+ deleteFolderTitle: 'Smazat "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'V této složce nejsou žádné shody',
+ noMatchesInFolderDescription: 'Žádné složky, balíčky ani poznámky neodpovídají "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Složku se nepodařilo vytvořit',
+ couldNotDeleteFolder: 'Složku se nepodařilo smazat',
+ couldNotLoadFolderPath: 'Cestu ke složce se nepodařilo načíst',
+ couldNotSaveFolder: 'Složku se nepodařilo uložit',
+ folderCouldNotLoad: 'Složku se nepodařilo načíst',
+ },
+ fields: {
+ descriptionLabel: 'Popis složky',
+ descriptionPlaceholder: 'Co patří do této složky?',
+ namePlaceholder: 'Název složky',
+ untitledFolder: 'Složka bez názvu',
+ },
+ labels: {
+ createFolderTitle: 'Vytvořit složku',
+ folder: 'Složka',
+ folders: 'Složky',
+ loadingFolder: 'Načítání složky',
+ name: 'Název',
+ updated: 'Aktualizováno',
+ },
+ sort: {
+ ariaLabel: 'Řadit složky',
+ name: 'Název',
+ updated: 'Aktualizováno',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Pokud se místní a synchronizovaná data budou lišit, položka se objeví zde.',
+ heading: 'Stav synchronizace',
+ title: 'Konflikty',
+ noConflicts: 'Nebyly nalezeny žádné konflikty',
+ },
+ labels: {
+ menu: 'Menu',
+ },
+ sections: {
+ settings: {
+ description: 'Přizpůsobte si prostředí a předvolby',
+ title: 'Nastavení',
+ },
+ trash: {
+ description: 'Obnovte nebo trvale smažte odebrané položky',
+ title: 'Koš',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Zavřít editor',
+ openActions: 'Otevřít akce',
+ openWorkspaces: 'Otevřít pracovní prostory',
+ },
+ items: {
+ home: 'Domů',
+ menu: 'Menu',
+ primary: 'Primární',
+ settings: 'Nastavení',
+ spaces: 'Prostory',
+ trash: 'Koš',
+ workspaces: 'Pracovní prostory',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Přidat cloze',
+ deleteNote: 'Smazat poznámku',
+ editNote: 'Upravit poznámku',
+ hideDerivedCardsNote: 'Skrýt poznámku k odvozeným kartám',
+ openNote: 'Otevřít {{title}}',
+ saveNote: 'Uložit poznámku',
+ showDerivedCardsNote: 'Zobrazit poznámku k odvozeným kartám',
+ },
+ descriptions: {
+ clozeFormat: 'Každá skrytá část se po uložení stane kartou k opakování.',
+ clozeFormatPrefix: 'Skrytý text obalte pomocí',
+ derivedCardsHelper: 'Poznámky jsou zdrojem pravdy pro odvozené karty.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Tím se "{{title}}" přesune do Koše. Později ji můžete obnovit.',
+ deleteNoteFallbackDescription: 'Tím se tato poznámka přesune do Koše. Později ji můžete obnovit.',
+ deleteNoteFallbackTitle: 'Smazat poznámku?',
+ deleteNoteTitle: 'Smazat "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Poznámku se nepodařilo vytvořit',
+ couldNotDeleteNote: 'Poznámku se nepodařilo smazat',
+ couldNotSaveNote: 'Poznámku se nepodařilo uložit',
+ noteCouldNotLoad: 'Poznámku se nepodařilo načíst',
+ },
+ fields: {
+ back: 'Zadní strana',
+ backPlaceholder: 'Zadejte zadní stranu',
+ bodyPlaceholder: 'Napište tělo poznámky s cloze vynechávkami…',
+ front: 'Přední strana',
+ frontPlaceholder: 'Zadejte přední stranu',
+ noteBody: 'Tělo poznámky',
+ title: 'Název',
+ titlePlaceholder: 'Přidejte název poznámky',
+ untitledCloze: 'Cloze bez názvu',
+ untitledNote: 'Poznámka bez názvu',
+ },
+ labels: {
+ backUppercase: 'ZADNÍ STRANA',
+ basic: 'Základní',
+ basicLower: 'základní',
+ basicUppercase: 'ZÁKLADNÍ',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Formát cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Balíček',
+ derivedCards: 'ODVOZENÉ KARTY',
+ due: 'Termín',
+ frontUppercase: 'PŘEDNÍ STRANA',
+ inProgress: 'Probíhá',
+ inProgressUppercase: 'PROBÍHÁ',
+ loadingNote: 'Načítání poznámky',
+ loadingNoteEditor: 'Načítání editoru poznámek',
+ markdownFormatting: 'Formátování Markdown',
+ mastered: 'Zvládnuto',
+ masteredUppercase: 'ZVLÁDNUTO',
+ newNote: 'Nová poznámka',
+ noteBody: 'TĚLO POZNÁMKY',
+ noteContent: 'Obsah poznámky',
+ noteDetails: 'Podrobnosti poznámky',
+ noteMetadata: 'Metadata poznámky',
+ noteType: 'Typ poznámky',
+ notes: 'Poznámky',
+ reviewed: 'Opakováno',
+ studyProgress: 'Průběh studia',
+ studyProgressUppercase: 'PRŮBĚH STUDIA',
+ titleUppercase: 'NÁZEV',
+ updated: 'Aktualizováno',
+ },
+ sort: {
+ ariaLabel: 'Řadit poznámky',
+ title: 'Název',
+ updated: 'Aktualizováno',
+ },
+ toolbar: {
+ bold: 'Tučně',
+ italic: 'Kurzíva',
+ link: 'Odkaz',
+ list: 'Seznam',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Znovu',
+ backToDeck: 'Zpět na balíček',
+ continueReview: 'Pokračovat v opakování',
+ easy: 'Snadné',
+ good: 'Dobré',
+ hard: 'Těžké',
+ newNote: 'Nová poznámka',
+ showAnswer: 'Zobrazit odpověď',
+ },
+ errors: {
+ couldNotGradeCard: 'Kartu se nepodařilo ohodnotit',
+ reviewCouldNotLoad: 'Opakování se nepodařilo načíst',
+ reviewCouldNotStart: 'Opakování se nepodařilo spustit',
+ summaryCouldNotLoad: 'Souhrn opakování se nepodařilo načíst',
+ summaryNotAvailable: 'Souhrn opakování není k dispozici',
+ summaryNotComplete: 'Toto opakování ještě není dokončené.',
+ },
+ labels: {
+ cardsReviewed: 'Opakované karty',
+ deck: 'Balíček',
+ duration: 'Doba trvání',
+ loadingReview: 'Načítání opakování',
+ loadingSummary: 'Načítání souhrnu',
+ progress: 'Průběh opakování',
+ review: 'Opakování',
+ reviewComplete: 'Opakování dokončeno',
+ reviewed_one: 'Opakována {{count}}',
+ reviewed_few: 'Opakovány {{count}}',
+ reviewed_many: 'Opakováno {{count}}',
+ reviewed_other: 'Opakováno {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Váš postup byl uložen do tohoto balíčku.',
+ },
+ unavailable: {
+ description: 'Přidejte poznámku, aby tento balíček mohl vstoupit do fronty opakování.',
+ title: 'Žádné karty k opakování',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Vymazat hledání',
+ },
+ empty: {
+ noMatchesInWorkspace: 'V tomto pracovním prostoru nejsou žádné shody',
+ noMatchesInWorkspaceDescription: 'Žádné složky, balíčky ani poznámky neodpovídají "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Hledání se nepodařilo dokončit',
+ },
+ labels: {
+ results: 'Výsledky hledání',
+ resultsFor: 'Výsledky pro "{{query}}"',
+ searchingContent: 'Hledání obsahu',
+ },
+ resultGroups: {
+ deck: 'Balíčky',
+ folder: 'Složky',
+ note: 'Poznámky',
+ },
+ resultKinds: {
+ deck: 'balíček',
+ folder: 'složka',
+ note: 'poznámka',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Resetovat všechna nastavení',
+ resetSettings: 'Resetovat nastavení',
+ resetToDefaults: 'Obnovit výchozí',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Vložte platný JSON s 21 číselnými hodnotami.',
+ fsrsErrorInvalidParams_one: 'Zadejte pole JSON s přesně {{count}} konečným číslem.',
+ fsrsErrorInvalidParams_few: 'Zadejte pole JSON s přesně {{count}} konečnými čísly.',
+ fsrsErrorInvalidParams_many: 'Zadejte pole JSON s přesně {{count}} konečného čísla.',
+ fsrsErrorInvalidParams_other: 'Zadejte pole JSON s přesně {{count}} konečnými čísly.',
+ fsrsHelper: 'Toto je expertní přepsání. Hodnoty musí zůstat ve správném pořadí.',
+ fsrsJsonLabel: 'JSON parametrů FSRS',
+ fsrsTitle: 'Upravit parametry FSRS',
+ fsrsDescription: 'Vložte pole JSON s 21 čísly, kterým přepíšete váhy scheduler.',
+ resetDescription: 'Tím se obnoví časové pásmo, studijní limity a nastavení FSRS.',
+ resetDescriptionWithLanguage: 'Tím se obnoví jazyk, časové pásmo, studijní limity a nastavení FSRS.',
+ resetTitle: 'Resetovat všechna nastavení?',
+ timezoneDescription: 'Vyhledejte město nebo identifikátor časového pásma.',
+ timezoneSearchLabel: 'Hledat časová pásma',
+ timezoneSearchPlaceholder: 'Hledat časová pásma…',
+ timezoneTitle: 'Vybrat časové pásmo',
+ },
+ errors: {
+ couldNotResetSettings: 'Nastavení se nepodařilo resetovat',
+ couldNotSaveSettings: 'Nastavení se nepodařilo uložit',
+ settingsCouldNotLoad: 'Nastavení se nepodařilo načíst',
+ settingsUnavailable: 'Nastavení nejsou k dispozici.',
+ },
+ labels: {
+ appearance: 'Vzhled',
+ automatic: 'Automaticky',
+ fsrsParameters: 'Parametry FSRS',
+ general: 'Obecné',
+ language: 'Jazyk',
+ loadingSettings: 'Načítání nastavení',
+ masteryHorizon: 'Horizont zvládnutí',
+ newCardOrder: 'Pořadí nových karet',
+ newCardsPerDay: 'Nové karty za den',
+ reviewCardsPerDay: 'Karty k opakování za den',
+ savingSettings: 'Ukládání nastavení',
+ schedule: 'Rozvrh',
+ searchNoTimezones: 'Žádná odpovídající časová pásma.',
+ settings: 'Nastavení',
+ settingsReset: 'Nastavení resetována',
+ study: 'Studium',
+ targetRecallProbability: 'Cílová pravděpodobnost vybavení',
+ theme: 'Motiv',
+ timezone: 'Časové pásmo',
+ },
+ options: {
+ languageEnUs: 'Angličtina (USA)',
+ newCardsAfterReviews: 'Po opakováních',
+ newCardsBeforeReviews: 'Před opakováními',
+ newCardsMixed: 'Smíšené',
+ themeDark: 'Tmavý',
+ themeLight: 'Světlý',
+ themeSystem: 'Systémový',
+ timezoneSystem: 'Použít systémové časové pásmo',
+ },
+ rows: {
+ fsrsDescription: 'Váhy expertního modelu',
+ languageDescription: 'Jazyk rozhraní',
+ masteryHorizonDescription: 'Počet dní, po které musí karta zůstat vybavitelná na cílové pravděpodobnosti nebo výše, aby se počítala jako zvládnutá',
+ newCardOrderDescription: 'Pořadí nových karet vůči opakováním',
+ newCardsPerDayDescription: 'Maximum nových karet za den',
+ reviewCardsPerDayDescription: 'Maximum karet k opakování za den',
+ targetRecallProbabilityDescription: 'Minimální pravděpodobnost vybavení při příštím naplánovaném opakování',
+ timezoneDescription: 'Použijte automatické časové pásmo nebo vyberte město.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Smazat trvale',
+ empty: 'Vyprázdnit',
+ emptyTrash: 'Vyprázdnit koš',
+ restore: 'Obnovit',
+ restoringItem: 'Obnovování {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Tím se "{{title}}" trvale smaže. Tuto akci nelze vrátit zpět.',
+ deleteItemFallbackDescription: 'Tím se tato položka trvale smaže. Tuto akci nelze vrátit zpět.',
+ deleteItemFallbackTitle: 'Smazat položku?',
+ deleteItemTitle: 'Smazat "{{title}}"?',
+ emptyTrashDescription: 'Tím se trvale smaže vše v Koši. Tuto akci nelze vrátit zpět.',
+ emptyTrashTitle: 'Vyprázdnit koš?',
+ },
+ empty: {
+ description: 'Položky, které smažete, se před trvalým odstraněním zobrazí zde.',
+ title: 'Koš je prázdný',
+ },
+ errors: {
+ couldNotDeleteItem: 'Položku se nepodařilo smazat',
+ couldNotEmptyTrash: 'Koš se nepodařilo vyprázdnit',
+ couldNotRestoreItem: 'Položku se nepodařilo obnovit',
+ trashCouldNotLoad: 'Koš se nepodařilo načíst',
+ trashMayBeOutOfDate: 'Koš může být zastaralý',
+ },
+ labels: {
+ deletedAge: 'Smazáno {{value}}',
+ itemCount_one: '{{count}} položka',
+ itemCount_few: '{{count}} položky',
+ itemCount_many: '{{count}} položky',
+ itemCount_other: '{{count}} položek',
+ lastEmptied: 'Naposledy vyprázdněno {{value}}',
+ loadingTrash: 'Načítání Koše',
+ originalLocation: 'Původní umístění: {{location}}',
+ title: 'Koš',
+ trashActions: 'Akce koše pro {{title}}',
+ },
+ kinds: {
+ deck: 'Balíček',
+ folder: 'Složka',
+ note: 'Poznámka',
+ workspace: 'Pracovní prostor',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Vytvořit pracovní prostor',
+ deleteWorkspace: 'Smazat pracovní prostor',
+ editWorkspace: 'Upravit pracovní prostor',
+ newWorkspace: 'Nový pracovní prostor',
+ openWorkspace: 'Otevřít {{title}}',
+ openingWorkspace: 'Otevírání {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Studijní kontext.',
+ editorVisual: 'Vyberte vizuální kotvu pro tento pracovní prostor.',
+ emptyList: 'Oddělte balíčky, poznámky a fronty opakování podle studijního kontextu.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Tím se "{{title}}" přesune do Koše. Později ho můžete obnovit.',
+ deleteWorkspaceFallbackDescription: 'Tím se tento pracovní prostor přesune do Koše. Později ho můžete obnovit.',
+ deleteWorkspaceFallbackTitle: 'Smazat pracovní prostor?',
+ deleteWorkspaceTitle: 'Smazat "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Začněte pracovním prostorem',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Pracovní prostor se nepodařilo vytvořit',
+ couldNotDeleteWorkspace: 'Pracovní prostor se nepodařilo smazat',
+ couldNotOpenWorkspace: 'Pracovní prostor se nepodařilo otevřít',
+ couldNotSaveWorkspace: 'Pracovní prostor se nepodařilo uložit',
+ workspaceCouldNotLoad: 'Pracovní prostor se nepodařilo načíst',
+ workspacesCouldNotLoad: 'Pracovní prostory se nepodařilo načíst',
+ },
+ fields: {
+ descriptionLabel: 'Popis pracovního prostoru',
+ descriptionPlaceholder: 'Co patří do tohoto pracovního prostoru?',
+ namePlaceholder: 'Název pracovního prostoru',
+ untitledWorkspace: 'Pracovní prostor bez názvu',
+ },
+ labels: {
+ createWorkspaceTitle: 'Vytvořit pracovní prostor',
+ loadingWorkspaces: 'Načítání pracovních prostorů',
+ workspace: 'Pracovní prostor',
+ workspaces: 'Pracovní prostory',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/da.ts b/ui/src/core/i18n/resources/da.ts
new file mode 100644
index 0000000..75cd673
--- /dev/null
+++ b/ui/src/core/i18n/resources/da.ts
@@ -0,0 +1,623 @@
+export const da = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Prøv igen. Hvis det bliver ved, skal du åbne Clear igen.',
+ title: 'Kunne ikke starte',
+ },
+ loadingTitle: 'Forbereder dit studieområde',
+ },
+ common: {
+ actions: {
+ back: 'Tilbage',
+ cancel: 'Annuller',
+ checkAgain: 'Tjek igen',
+ close: 'Luk',
+ create: 'Opret',
+ delete: 'Slet',
+ dismissError: 'Afvis fejl',
+ dismissStatus: 'Afvis status',
+ edit: 'Rediger',
+ itemActions: 'Handlinger for {{title}}',
+ reset: 'Nulstil',
+ review: 'Gentag',
+ save: 'Gem',
+ saveChanges: 'Gem ændringer',
+ tryAgain: 'Prøv igen',
+ },
+ labels: {
+ active: 'Aktiv',
+ clear: 'Clear',
+ custom: 'Tilpasset',
+ default: 'Standard',
+ loadingEditor: 'Indlæser editor',
+ name: 'Navn',
+ completedTask: 'Fuldført opgave',
+ description: 'Beskrivelse',
+ incompleteTask: 'Ufuldført opgave',
+ percentageInput: '{{label}} i procent',
+ visual: 'Visuel',
+ },
+ status: {
+ actionFailed: 'Handlingen mislykkedes',
+ actionInProgress: 'Handling i gang',
+ },
+ sort: {
+ ascending: 'Stig.',
+ column: 'Kolonne',
+ descending: 'Fald.',
+ direction: 'Retning',
+ sort: 'Sortér',
+ },
+ search: {
+ label: 'Søg',
+ },
+ visualPicker: {
+ allLucideIcons: 'Alle Lucide-ikoner',
+ browseIconsFor: 'Gennemse eller søg efter ikoner til {{label}}.',
+ chooseIcon: 'Vælg ikon',
+ iconPicker: 'Ikonvælger til {{label}}',
+ iconSearch: 'Ikonsøgning til {{label}}',
+ iconsCouldNotLoad: 'Ikonerne kunne ikke indlæses.',
+ loadingIcons: 'Indlæser ikoner',
+ loadingMoreIcons: 'Indlæser flere ikoner',
+ moreIcons: 'Flere ikoner',
+ noIconsMatch: 'Ingen ikoner matcher "{{query}}".',
+ searchIconsPlaceholder: 'Søg efter ikoner…',
+ selectedIcon: '{{label}} valgt',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Opret',
+ newDeck: 'Nyt kortsæt',
+ newFolder: 'Ny mappe',
+ },
+ descriptions: {
+ defaultWorkspace: 'Hold kortsæt, mapper og noter samlet.',
+ emptyWorkspace: 'Opret et kortsæt, og tilføj derefter noter for at opbygge din gentagelseskø.',
+ emptyFolder: 'Opret et kortsæt, og tilføj derefter noter for at opbygge en gentagelseskø.',
+ searchPlaceholder: 'Søg efter mapper, kortsæt og noter…',
+ },
+ empty: {
+ createFirstDeck: 'Opret dit første kortsæt',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Kortsættet kunne ikke slettes',
+ couldNotDeleteFolder: 'Mappen kunne ikke slettes',
+ couldNotDeleteWorkspace: 'Arbejdsområdet kunne ikke slettes',
+ dashboardCouldNotOpen: 'Dashboardet kunne ikke åbnes',
+ decksCouldNotLoad: 'Kortsæt kunne ikke indlæses',
+ decksMayBeOutOfDate: 'Kortsæt kan være forældede',
+ foldersCouldNotLoad: 'Mapper kunne ikke indlæses',
+ foldersMayBeOutOfDate: 'Mapper kan være forældede',
+ workspaceCouldNotLoad: 'Arbejdsområdet kunne ikke indlæses',
+ },
+ labels: {
+ dashboard: 'Dashboard',
+ loadingDashboard: 'Indlæser dashboard',
+ newItem: 'Nyt element',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Dato utilgængelig',
+ },
+ age: {
+ dayAgo_one: '{{count}} dag siden',
+ dayAgo_other: '{{count}} dage siden',
+ hourAgo_one: '{{count}} time siden',
+ hourAgo_other: '{{count}} timer siden',
+ justNow: 'lige nu',
+ minuteAgo_one: '{{count}} minut siden',
+ minuteAgo_other: '{{count}} minutter siden',
+ unavailable: 'dato utilgængelig',
+ weekAgo_one: '{{count}} uge siden',
+ weekAgo_other: '{{count}} uger siden',
+ },
+ labels: {
+ deleted: 'Slettet {{value}}',
+ due: 'Forfalder: {{value}}',
+ reviewed: 'Gentaget: {{value}}',
+ updated: 'Opdateret {{value}}',
+ updatedUppercase: 'OPDATERET {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} dag siden',
+ dayAgo_other: '{{count}} dage siden',
+ inAMoment: 'Om et øjeblik',
+ inDay_one: 'Om {{count}} dag',
+ inDay_other: 'Om {{count}} dage',
+ inMonth_one: 'Om {{count}} måned',
+ inMonth_other: 'Om {{count}} måneder',
+ inWeek_one: 'Om {{count}} uge',
+ inWeek_other: 'Om {{count}} uger',
+ justNow: 'Lige nu',
+ monthAgo_one: '{{count}} måned siden',
+ monthAgo_other: '{{count}} måneder siden',
+ secondsAgoShort: '{{count}} s siden',
+ minutesAgoShort: '{{count}} min siden',
+ hoursAgoShort: '{{count}} t siden',
+ today: 'I dag',
+ tomorrow: 'I morgen',
+ weekAgo_one: '{{count}} uge siden',
+ weekAgo_other: '{{count}} uger siden',
+ yesterday: 'I går',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Handlinger for {{title}}',
+ createDeck: 'Opret kortsæt',
+ createNote: 'Opret note',
+ deleteDeck: 'Slet kortsæt',
+ editDeck: 'Rediger kortsæt',
+ newNote: 'Ny note',
+ openDeck: 'Åbn kortsættet {{title}}',
+ saveDeck: 'Kortsættet kunne ikke gemmes',
+ studyNow: 'Studér nu',
+ },
+ descriptions: {
+ emptyDeck: 'Tilføj en note, så dette kortsæt har materiale til gentagelse.',
+ editorDefault: 'Fokuseret studiekortsæt.',
+ editorVisual: 'Vælg et omslagssymbol til dette kortsæt.',
+ notesSearchPlaceholder: 'Søg i noter…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Dette flytter "{{title}}" til Papirkurv. Du kan gendanne det senere.',
+ deleteDeckFallbackDescription: 'Dette flytter dette kortsæt til Papirkurv. Du kan gendanne det senere.',
+ deleteDeckFallbackTitle: 'Slet kortsæt?',
+ deleteDeckTitle: 'Slet "{{title}}"?',
+ deleteNoteDescription: 'Dette flytter "{{title}}" til Papirkurv. Du kan gendanne den senere.',
+ deleteNoteFallbackTitle: 'Slet note?',
+ deleteNoteTitle: 'Slet "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Ingen matchende noter',
+ noMatchingNotesDescription: 'Ingen noter matchede "{{query}}".',
+ thisDeckIsEmpty: 'Dette kortsæt er tomt',
+ },
+ errors: {
+ couldNotCreateDeck: 'Kortsættet kunne ikke oprettes',
+ couldNotDeleteDeck: 'Kortsættet kunne ikke slettes',
+ couldNotDeleteNote: 'Noten kunne ikke slettes',
+ couldNotLoadFolderPath: 'Mappestien kunne ikke indlæses',
+ couldNotSaveDeck: 'Kortsættet kunne ikke gemmes',
+ deckCouldNotLoad: 'Kortsættet kunne ikke indlæses',
+ notesCouldNotLoad: 'Noter kunne ikke indlæses',
+ notesMayBeOutOfDate: 'Noter kan være forældede',
+ },
+ fields: {
+ descriptionLabel: 'Beskrivelse af kortsæt',
+ descriptionPlaceholder: 'Hvad skal dette kortsæt hjælpe dig med at gentage?',
+ namePlaceholder: 'Navn på kortsæt',
+ untitledDeck: 'Kortsæt uden titel',
+ untitledDeckLower: 'kortsæt uden titel',
+ },
+ labels: {
+ createDeckTitle: 'Opret kortsæt',
+ deck: 'Kortsæt',
+ deckNotesSearch: 'Søg i kortsætnoter',
+ deckOverview: 'Oversigt over kortsæt',
+ decks: 'Kortsæt',
+ due: 'Forfalder',
+ dueToday: 'Forfalder i dag',
+ loadingDeck: 'Indlæser kortsæt',
+ mastery: 'Beherskelse',
+ notes: 'Noter',
+ },
+ sort: {
+ ariaLabel: 'Sortér kortsæt',
+ dueToday: 'Forfalder i dag',
+ title: 'Titel',
+ updated: 'Opdateret',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Dataene blev ændret. Opdater, og prøv igen.',
+ forbidden: 'Du har ikke tilladelse til dette.',
+ notFound: 'Vi kunne ikke finde dette element.',
+ offline: 'Kan ikke nå tjenesten.',
+ timeout: 'Dette tog for lang tid. Prøv igen.',
+ unauthorized: 'Log ind for at fortsætte.',
+ unavailable: 'Tjenesten er midlertidigt utilgængelig.',
+ },
+ fallback: {
+ unexpected: 'Uventet fejl',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Opret mappe',
+ deleteFolder: 'Slet mappe',
+ editFolder: 'Rediger mappe',
+ },
+ descriptions: {
+ editorDefault: 'Mappe til relaterede kortsæt.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Dette flytter "{{name}}" til Papirkurv. Du kan gendanne den senere.',
+ deleteFolderFallbackDescription: 'Dette flytter denne mappe til Papirkurv. Du kan gendanne den senere.',
+ deleteFolderFallbackTitle: 'Slet mappe?',
+ deleteFolderTitle: 'Slet "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Ingen match i denne mappe',
+ noMatchesInFolderDescription: 'Ingen mapper, kortsæt eller noter matchede "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Mappen kunne ikke oprettes',
+ couldNotDeleteFolder: 'Mappen kunne ikke slettes',
+ couldNotLoadFolderPath: 'Mappestien kunne ikke indlæses',
+ couldNotSaveFolder: 'Mappen kunne ikke gemmes',
+ folderCouldNotLoad: 'Mappen kunne ikke indlæses',
+ },
+ fields: {
+ descriptionLabel: 'Mappebeskrivelse',
+ descriptionPlaceholder: 'Hvad hører hjemme i denne mappe?',
+ namePlaceholder: 'Mappenavn',
+ untitledFolder: 'Mappe uden titel',
+ },
+ labels: {
+ createFolderTitle: 'Opret mappe',
+ folder: 'Mappe',
+ folders: 'Mapper',
+ loadingFolder: 'Indlæser mappe',
+ name: 'Navn',
+ updated: 'Opdateret',
+ },
+ sort: {
+ ariaLabel: 'Sortér mapper',
+ name: 'Navn',
+ updated: 'Opdateret',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Hvis lokale og synkroniserede data nogensinde er forskellige, vises elementet her.',
+ heading: 'Synkroniseringsstatus',
+ title: 'Konflikter',
+ noConflicts: 'Ingen konflikter fundet',
+ },
+ labels: {
+ menu: 'Menu',
+ },
+ sections: {
+ settings: {
+ description: 'Tilpas dit miljø og dine præferencer',
+ title: 'Indstillinger',
+ },
+ trash: {
+ description: 'Gendan eller slet fjernede elementer permanent',
+ title: 'Papirkurv',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Luk editor',
+ openActions: 'Åbn handlinger',
+ openWorkspaces: 'Åbn arbejdsområder',
+ },
+ items: {
+ home: 'Hjem',
+ menu: 'Menu',
+ primary: 'Primær',
+ settings: 'Indstillinger',
+ spaces: 'Områder',
+ trash: 'Papirkurv',
+ workspaces: 'Arbejdsområder',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Tilføj cloze',
+ deleteNote: 'Slet note',
+ editNote: 'Rediger note',
+ hideDerivedCardsNote: 'Skjul note om afledte kort',
+ openNote: 'Åbn {{title}}',
+ saveNote: 'Gem note',
+ showDerivedCardsNote: 'Vis note om afledte kort',
+ },
+ descriptions: {
+ clozeFormat: 'Hver skjult del bliver til et gentagelseskort, når du gemmer.',
+ clozeFormatPrefix: 'Ombryd skjult tekst med',
+ derivedCardsHelper: 'Noter er sandhedskilden for afledte kort.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Dette flytter "{{title}}" til Papirkurv. Du kan gendanne den senere.',
+ deleteNoteFallbackDescription: 'Dette flytter denne note til Papirkurv. Du kan gendanne den senere.',
+ deleteNoteFallbackTitle: 'Slet note?',
+ deleteNoteTitle: 'Slet "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Noten kunne ikke oprettes',
+ couldNotDeleteNote: 'Noten kunne ikke slettes',
+ couldNotSaveNote: 'Noten kunne ikke gemmes',
+ noteCouldNotLoad: 'Noten kunne ikke indlæses',
+ },
+ fields: {
+ back: 'Bagside',
+ backPlaceholder: 'Indtast bagside',
+ bodyPlaceholder: 'Skriv notens indhold med cloze-sletninger…',
+ front: 'Forside',
+ frontPlaceholder: 'Indtast forside',
+ noteBody: 'Noteindhold',
+ title: 'Titel',
+ titlePlaceholder: 'Tilføj en notetitel',
+ untitledCloze: 'Cloze uden titel',
+ untitledNote: 'Note uden titel',
+ },
+ labels: {
+ backUppercase: 'BAGSIDE',
+ basic: 'Grundlæggende',
+ basicLower: 'grundlæggende',
+ basicUppercase: 'GRUNDLÆGGENDE',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze-format',
+ clozeUppercase: 'CLOZE',
+ deck: 'Kortsæt',
+ derivedCards: 'AFLEDTE KORT',
+ due: 'Forfalder',
+ frontUppercase: 'FORSIDE',
+ inProgress: 'I gang',
+ inProgressUppercase: 'I GANG',
+ loadingNote: 'Indlæser note',
+ loadingNoteEditor: 'Indlæser noteeditor',
+ markdownFormatting: 'Markdown-formatering',
+ mastered: 'Behersket',
+ masteredUppercase: 'BEHERSKET',
+ newNote: 'Ny note',
+ noteBody: 'NOTEINDHOLD',
+ noteContent: 'Noteindhold',
+ noteDetails: 'Notedetaljer',
+ noteMetadata: 'Notemetadata',
+ noteType: 'Notetype',
+ notes: 'Noter',
+ reviewed: 'Gentaget',
+ studyProgress: 'Studiefremskridt',
+ studyProgressUppercase: 'STUDIEFREMSKRIDT',
+ titleUppercase: 'TITEL',
+ updated: 'Opdateret',
+ },
+ sort: {
+ ariaLabel: 'Sortér noter',
+ title: 'Titel',
+ updated: 'Opdateret',
+ },
+ toolbar: {
+ bold: 'Fed',
+ italic: 'Kursiv',
+ link: 'Link',
+ list: 'Liste',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Igen',
+ backToDeck: 'Tilbage til kortsæt',
+ continueReview: 'Fortsæt gentagelse',
+ easy: 'Let',
+ good: 'God',
+ hard: 'Svær',
+ newNote: 'Ny note',
+ showAnswer: 'Vis svar',
+ },
+ errors: {
+ couldNotGradeCard: 'Kortet kunne ikke bedømmes',
+ reviewCouldNotLoad: 'Gentagelsen kunne ikke indlæses',
+ reviewCouldNotStart: 'Gentagelsen kunne ikke startes',
+ summaryCouldNotLoad: 'Gentagelsesoversigten kunne ikke indlæses',
+ summaryNotAvailable: 'Gentagelsesoversigten er ikke tilgængelig',
+ summaryNotComplete: 'Denne gentagelse er ikke færdig endnu.',
+ },
+ labels: {
+ cardsReviewed: 'Gentagne kort',
+ deck: 'Kortsæt',
+ duration: 'Varighed',
+ loadingReview: 'Indlæser gentagelse',
+ loadingSummary: 'Indlæser oversigt',
+ progress: 'Gentagelsesfremgang',
+ review: 'Gentagelse',
+ reviewComplete: 'Gentagelse fuldført',
+ reviewed_one: 'Gentaget {{count}}',
+ reviewed_other: 'Gentaget {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} t {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Dine fremskridt blev gemt i dette kortsæt.',
+ },
+ unavailable: {
+ description: 'Tilføj en note, så dette kortsæt kan komme i gentagelseskøen.',
+ title: 'Ingen kort at gentage',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Ryd søgning',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Ingen match i dette arbejdsområde',
+ noMatchesInWorkspaceDescription: 'Ingen mapper, kortsæt eller noter matchede "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Søgningen kunne ikke fuldføres',
+ },
+ labels: {
+ results: 'Søgeresultater',
+ resultsFor: 'Resultater for "{{query}}"',
+ searchingContent: 'Søger i indhold',
+ },
+ resultGroups: {
+ deck: 'Kortsæt',
+ folder: 'Mapper',
+ note: 'Noter',
+ },
+ resultKinds: {
+ deck: 'kortsæt',
+ folder: 'mappe',
+ note: 'note',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Nulstil alle indstillinger',
+ resetSettings: 'Nulstil indstillinger',
+ resetToDefaults: 'Gendan standarder',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Indsæt gyldig JSON med 21 numeriske værdier.',
+ fsrsErrorInvalidParams_one: 'Indtast et JSON-array med præcis {{count}} endeligt tal.',
+ fsrsErrorInvalidParams_other: 'Indtast et JSON-array med præcis {{count}} endelige tal.',
+ fsrsHelper: 'Dette er en ekspertoverskrivning. Værdierne skal forblive i rækkefølge.',
+ fsrsJsonLabel: 'FSRS-parametre JSON',
+ fsrsTitle: 'Rediger FSRS-parametre',
+ fsrsDescription: 'Indsæt et JSON-array med 21 tal for at overskrive scheduler-vægtene.',
+ resetDescription: 'Dette gendanner tidszone, studiegrænser og FSRS-indstillinger.',
+ resetDescriptionWithLanguage: 'Dette gendanner sprog, tidszone, studiegrænser og FSRS-indstillinger.',
+ resetTitle: 'Nulstil alle indstillinger?',
+ timezoneDescription: 'Søg efter en by eller tidszoneidentifikator.',
+ timezoneSearchLabel: 'Søg tidszoner',
+ timezoneSearchPlaceholder: 'Søg tidszoner…',
+ timezoneTitle: 'Vælg tidszone',
+ },
+ errors: {
+ couldNotResetSettings: 'Indstillingerne kunne ikke nulstilles',
+ couldNotSaveSettings: 'Indstillingerne kunne ikke gemmes',
+ settingsCouldNotLoad: 'Indstillingerne kunne ikke indlæses',
+ settingsUnavailable: 'Indstillinger er ikke tilgængelige.',
+ },
+ labels: {
+ appearance: 'Udseende',
+ automatic: 'Automatisk',
+ fsrsParameters: 'FSRS-parametre',
+ general: 'Generelt',
+ language: 'Sprog',
+ loadingSettings: 'Indlæser indstillinger',
+ masteryHorizon: 'Beherskelseshorisont',
+ newCardOrder: 'Rækkefølge for nye kort',
+ newCardsPerDay: 'Nye kort pr. dag',
+ reviewCardsPerDay: 'Gentagelseskort pr. dag',
+ savingSettings: 'Gemmer indstillinger',
+ schedule: 'Plan',
+ searchNoTimezones: 'Ingen matchende tidszoner.',
+ settings: 'Indstillinger',
+ settingsReset: 'Indstillinger nulstillet',
+ study: 'Studie',
+ targetRecallProbability: 'Målsandsynlighed for genkaldelse',
+ theme: 'Tema',
+ timezone: 'Tidszone',
+ },
+ options: {
+ languageEnUs: 'Engelsk (USA)',
+ newCardsAfterReviews: 'Efter gentagelser',
+ newCardsBeforeReviews: 'Før gentagelser',
+ newCardsMixed: 'Blandet',
+ themeDark: 'Mørk',
+ themeLight: 'Lys',
+ themeSystem: 'System',
+ timezoneSystem: 'Brug systemets tidszone',
+ },
+ rows: {
+ fsrsDescription: 'Ekspertmodelvægte',
+ languageDescription: 'Grænsefladesprog',
+ masteryHorizonDescription: 'Antal dage et kort skal forblive genkaldeligt ved eller over målsandsynligheden for at tælle som behersket',
+ newCardOrderDescription: 'Rækkefølge for nye kort i forhold til gentagelser',
+ newCardsPerDayDescription: 'Maksimalt antal nye kort pr. dag',
+ reviewCardsPerDayDescription: 'Maksimalt antal gentagelseskort pr. dag',
+ targetRecallProbabilityDescription: 'Minimumssandsynlighed for genkaldelse ved næste planlagte gentagelse',
+ timezoneDescription: 'Brug automatisk tidszone, eller vælg en by.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Slet permanent',
+ empty: 'Tøm',
+ emptyTrash: 'Tøm papirkurv',
+ restore: 'Gendan',
+ restoringItem: 'Gendanner {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Dette sletter "{{title}}" permanent. Det kan ikke fortrydes.',
+ deleteItemFallbackDescription: 'Dette sletter dette element permanent. Det kan ikke fortrydes.',
+ deleteItemFallbackTitle: 'Slet element?',
+ deleteItemTitle: 'Slet "{{title}}"?',
+ emptyTrashDescription: 'Dette sletter alt i Papirkurv permanent. Det kan ikke fortrydes.',
+ emptyTrashTitle: 'Tøm papirkurv?',
+ },
+ empty: {
+ description: 'Elementer, du sletter, vises her før permanent fjernelse.',
+ title: 'Papirkurven er tom',
+ },
+ errors: {
+ couldNotDeleteItem: 'Elementet kunne ikke slettes',
+ couldNotEmptyTrash: 'Papirkurven kunne ikke tømmes',
+ couldNotRestoreItem: 'Elementet kunne ikke gendannes',
+ trashCouldNotLoad: 'Papirkurven kunne ikke indlæses',
+ trashMayBeOutOfDate: 'Papirkurven kan være forældet',
+ },
+ labels: {
+ deletedAge: 'Slettet {{value}}',
+ itemCount_one: '{{count}} element',
+ itemCount_other: '{{count}} elementer',
+ lastEmptied: 'Sidst tømt {{value}}',
+ loadingTrash: 'Indlæser Papirkurv',
+ originalLocation: 'Oprindelig placering: {{location}}',
+ title: 'Papirkurv',
+ trashActions: 'Papirkurvshandlinger for {{title}}',
+ },
+ kinds: {
+ deck: 'Kortsæt',
+ folder: 'Mappe',
+ note: 'Note',
+ workspace: 'Arbejdsområde',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Opret arbejdsområde',
+ deleteWorkspace: 'Slet arbejdsområde',
+ editWorkspace: 'Rediger arbejdsområde',
+ newWorkspace: 'Nyt arbejdsområde',
+ openWorkspace: 'Åbn {{title}}',
+ openingWorkspace: 'Åbner {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Studiekontekst.',
+ editorVisual: 'Vælg et visuelt anker til dette arbejdsområde.',
+ emptyList: 'Adskil kortsæt, noter og gentagelseskøer efter studiekontekst.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Dette flytter "{{title}}" til Papirkurv. Du kan gendanne det senere.',
+ deleteWorkspaceFallbackDescription: 'Dette flytter dette arbejdsområde til Papirkurv. Du kan gendanne det senere.',
+ deleteWorkspaceFallbackTitle: 'Slet arbejdsområde?',
+ deleteWorkspaceTitle: 'Slet "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Start med et arbejdsområde',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Arbejdsområdet kunne ikke oprettes',
+ couldNotDeleteWorkspace: 'Arbejdsområdet kunne ikke slettes',
+ couldNotOpenWorkspace: 'Arbejdsområdet kunne ikke åbnes',
+ couldNotSaveWorkspace: 'Arbejdsområdet kunne ikke gemmes',
+ workspaceCouldNotLoad: 'Arbejdsområdet kunne ikke indlæses',
+ workspacesCouldNotLoad: 'Arbejdsområder kunne ikke indlæses',
+ },
+ fields: {
+ descriptionLabel: 'Beskrivelse af arbejdsområde',
+ descriptionPlaceholder: 'Hvad hører hjemme i dette arbejdsområde?',
+ namePlaceholder: 'Navn på arbejdsområde',
+ untitledWorkspace: 'Arbejdsområde uden titel',
+ },
+ labels: {
+ createWorkspaceTitle: 'Opret arbejdsområde',
+ loadingWorkspaces: 'Indlæser arbejdsområder',
+ workspace: 'Arbejdsområde',
+ workspaces: 'Arbejdsområder',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/de.ts b/ui/src/core/i18n/resources/de.ts
new file mode 100644
index 0000000..41d3aeb
--- /dev/null
+++ b/ui/src/core/i18n/resources/de.ts
@@ -0,0 +1,623 @@
+export const de = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Versuche es erneut. Wenn das Problem bleibt, öffne Clear neu.',
+ title: 'Start fehlgeschlagen',
+ },
+ loadingTitle: 'Dein Lernbereich wird vorbereitet',
+ },
+ common: {
+ actions: {
+ back: 'Zurück',
+ cancel: 'Abbrechen',
+ checkAgain: 'Erneut prüfen',
+ close: 'Schließen',
+ create: 'Erstellen',
+ delete: 'Löschen',
+ dismissError: 'Fehler ausblenden',
+ dismissStatus: 'Status ausblenden',
+ edit: 'Bearbeiten',
+ itemActions: 'Aktionen für {{title}}',
+ reset: 'Zurücksetzen',
+ review: 'Wiederholen',
+ save: 'Speichern',
+ saveChanges: 'Änderungen speichern',
+ tryAgain: 'Erneut versuchen',
+ },
+ labels: {
+ active: 'Aktiv',
+ clear: 'Clear',
+ custom: 'Benutzerdefiniert',
+ default: 'Standard',
+ loadingEditor: 'Editor wird geladen',
+ name: 'Name',
+ completedTask: 'Aufgabe erledigt',
+ description: 'Beschreibung',
+ incompleteTask: 'Aufgabe offen',
+ percentageInput: '{{label}} in Prozent',
+ visual: 'Visuell',
+ },
+ status: {
+ actionFailed: 'Aktion fehlgeschlagen',
+ actionInProgress: 'Aktion läuft',
+ },
+ sort: {
+ ascending: 'Aufst.',
+ column: 'Spalte',
+ descending: 'Abst.',
+ direction: 'Richtung',
+ sort: 'Sortieren',
+ },
+ search: {
+ label: 'Suchen',
+ },
+ visualPicker: {
+ allLucideIcons: 'Alle Lucide-Symbole',
+ browseIconsFor: 'Symbole für {{label}} durchsuchen.',
+ chooseIcon: 'Symbol wählen',
+ iconPicker: 'Symbolauswahl für {{label}}',
+ iconSearch: 'Symbolsuche für {{label}}',
+ iconsCouldNotLoad: 'Symbole konnten nicht geladen werden.',
+ loadingIcons: 'Symbole werden geladen',
+ loadingMoreIcons: 'Weitere Symbole werden geladen',
+ moreIcons: 'Weitere Symbole',
+ noIconsMatch: 'Keine Symbole passen zu "{{query}}".',
+ searchIconsPlaceholder: 'Symbole suchen…',
+ selectedIcon: '{{label}} ausgewählt',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Erstellen',
+ newDeck: 'Neuer Stapel',
+ newFolder: 'Neuer Ordner',
+ },
+ descriptions: {
+ defaultWorkspace: 'Halte Stapel, Ordner und Notizen zusammen.',
+ emptyWorkspace: 'Erstelle einen Stapel und füge Notizen für deine Wiederholungen hinzu.',
+ emptyFolder: 'Erstelle einen Stapel und füge Notizen für eine Wiederholungsliste hinzu.',
+ searchPlaceholder: 'Ordner, Stapel und Notizen suchen…',
+ },
+ empty: {
+ createFirstDeck: 'Erstelle deinen ersten Stapel',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Stapel konnte nicht gelöscht werden',
+ couldNotDeleteFolder: 'Ordner konnte nicht gelöscht werden',
+ couldNotDeleteWorkspace: 'Arbeitsbereich konnte nicht gelöscht werden',
+ dashboardCouldNotOpen: 'Dashboard konnte nicht geöffnet werden',
+ decksCouldNotLoad: 'Stapel konnten nicht geladen werden',
+ decksMayBeOutOfDate: 'Stapel sind möglicherweise veraltet',
+ foldersCouldNotLoad: 'Ordner konnten nicht geladen werden',
+ foldersMayBeOutOfDate: 'Ordner sind möglicherweise veraltet',
+ workspaceCouldNotLoad: 'Arbeitsbereich konnte nicht geladen werden',
+ },
+ labels: {
+ dashboard: 'Dashboard',
+ loadingDashboard: 'Dashboard wird geladen',
+ newItem: 'Neues Element',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Datum nicht verfügbar',
+ },
+ age: {
+ dayAgo_one: 'vor {{count}} Tag',
+ dayAgo_other: 'vor {{count}} Tagen',
+ hourAgo_one: 'vor {{count}} Stunde',
+ hourAgo_other: 'vor {{count}} Stunden',
+ justNow: 'gerade eben',
+ minuteAgo_one: 'vor {{count}} Minute',
+ minuteAgo_other: 'vor {{count}} Minuten',
+ unavailable: 'Datum nicht verfügbar',
+ weekAgo_one: 'vor {{count}} Woche',
+ weekAgo_other: 'vor {{count}} Wochen',
+ },
+ labels: {
+ deleted: 'Gelöscht {{value}}',
+ due: 'Fällig: {{value}}',
+ reviewed: 'Wiederholt: {{value}}',
+ updated: 'Aktualisiert {{value}}',
+ updatedUppercase: 'AKTUALISIERT {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'vor {{count}} Tag',
+ dayAgo_other: 'vor {{count}} Tagen',
+ inAMoment: 'Gleich',
+ inDay_one: 'In {{count}} Tag',
+ inDay_other: 'In {{count}} Tagen',
+ inMonth_one: 'In {{count}} Monat',
+ inMonth_other: 'In {{count}} Monaten',
+ inWeek_one: 'In {{count}} Woche',
+ inWeek_other: 'In {{count}} Wochen',
+ justNow: 'Gerade eben',
+ monthAgo_one: 'vor {{count}} Monat',
+ monthAgo_other: 'vor {{count}} Monaten',
+ secondsAgoShort: 'vor {{count}} s',
+ minutesAgoShort: 'vor {{count}} min',
+ hoursAgoShort: 'vor {{count}} h',
+ today: 'Heute',
+ tomorrow: 'Morgen',
+ weekAgo_one: 'vor {{count}} Woche',
+ weekAgo_other: 'vor {{count}} Wochen',
+ yesterday: 'Gestern',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Aktionen für {{title}}',
+ createDeck: 'Stapel erstellen',
+ createNote: 'Notiz erstellen',
+ deleteDeck: 'Stapel löschen',
+ editDeck: 'Stapel bearbeiten',
+ newNote: 'Neue Notiz',
+ openDeck: 'Stapel {{title}} öffnen',
+ saveDeck: 'Stapel konnte nicht gespeichert werden',
+ studyNow: 'Jetzt lernen',
+ },
+ descriptions: {
+ emptyDeck: 'Füge eine Notiz hinzu, damit dieser Stapel Wiederholungsstoff hat.',
+ editorDefault: 'Fokussierter Lernstapel.',
+ editorVisual: 'Wähle ein Titelzeichen für diesen Stapel.',
+ notesSearchPlaceholder: 'Notizen suchen…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Dadurch wird "{{title}}" in den Papierkorb verschoben. Du kannst es später wiederherstellen.',
+ deleteDeckFallbackDescription: 'Dadurch wird dieser Stapel in den Papierkorb verschoben. Du kannst ihn später wiederherstellen.',
+ deleteDeckFallbackTitle: 'Stapel löschen?',
+ deleteDeckTitle: '"{{title}}" löschen?',
+ deleteNoteDescription: 'Dadurch wird "{{title}}" in den Papierkorb verschoben. Du kannst sie später wiederherstellen.',
+ deleteNoteFallbackTitle: 'Notiz löschen?',
+ deleteNoteTitle: '"{{title}}" löschen?',
+ },
+ empty: {
+ noMatchingNotes: 'Keine passenden Notizen',
+ noMatchingNotesDescription: 'Keine Notizen passen zu "{{query}}".',
+ thisDeckIsEmpty: 'Dieser Stapel ist leer',
+ },
+ errors: {
+ couldNotCreateDeck: 'Stapel konnte nicht erstellt werden',
+ couldNotDeleteDeck: 'Stapel konnte nicht gelöscht werden',
+ couldNotDeleteNote: 'Notiz konnte nicht gelöscht werden',
+ couldNotLoadFolderPath: 'Ordnerpfad konnte nicht geladen werden',
+ couldNotSaveDeck: 'Stapel konnte nicht gespeichert werden',
+ deckCouldNotLoad: 'Stapel konnte nicht geladen werden',
+ notesCouldNotLoad: 'Notizen konnten nicht geladen werden',
+ notesMayBeOutOfDate: 'Notizen sind möglicherweise veraltet',
+ },
+ fields: {
+ descriptionLabel: 'Stapelbeschreibung',
+ descriptionPlaceholder: 'Was hilft dir dieser Stapel zu wiederholen?',
+ namePlaceholder: 'Stapelname',
+ untitledDeck: 'Unbenannter Stapel',
+ untitledDeckLower: 'unbenannter Stapel',
+ },
+ labels: {
+ createDeckTitle: 'Stapel erstellen',
+ deck: 'Stapel',
+ deckNotesSearch: 'Notizen im Stapel suchen',
+ deckOverview: 'Stapelübersicht',
+ decks: 'Stapel',
+ due: 'Fällig',
+ dueToday: 'Heute fällig',
+ loadingDeck: 'Stapel wird geladen',
+ mastery: 'Beherrschung',
+ notes: 'Notizen',
+ },
+ sort: {
+ ariaLabel: 'Stapel sortieren',
+ dueToday: 'Heute fällig',
+ title: 'Titel',
+ updated: 'Aktualisiert',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Die Daten haben sich geändert. Aktualisiere und versuche es erneut.',
+ forbidden: 'Du hast keine Berechtigung dafür.',
+ notFound: 'Wir konnten dieses Element nicht finden.',
+ offline: 'Der Dienst ist nicht erreichbar.',
+ timeout: 'Das hat zu lange gedauert. Versuche es erneut.',
+ unauthorized: 'Melde dich an, um fortzufahren.',
+ unavailable: 'Der Dienst ist vorübergehend nicht verfügbar.',
+ },
+ fallback: {
+ unexpected: 'Unerwarteter Fehler',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Ordner erstellen',
+ deleteFolder: 'Ordner löschen',
+ editFolder: 'Ordner bearbeiten',
+ },
+ descriptions: {
+ editorDefault: 'Ordner für verwandte Stapel.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Dadurch wird "{{name}}" in den Papierkorb verschoben. Du kannst ihn später wiederherstellen.',
+ deleteFolderFallbackDescription: 'Dadurch wird dieser Ordner in den Papierkorb verschoben. Du kannst ihn später wiederherstellen.',
+ deleteFolderFallbackTitle: 'Ordner löschen?',
+ deleteFolderTitle: '"{{name}}" löschen?',
+ },
+ empty: {
+ noMatchesInFolder: 'Keine Treffer in diesem Ordner',
+ noMatchesInFolderDescription: 'Keine Ordner, Stapel oder Notizen passen zu "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Ordner konnte nicht erstellt werden',
+ couldNotDeleteFolder: 'Ordner konnte nicht gelöscht werden',
+ couldNotLoadFolderPath: 'Ordnerpfad konnte nicht geladen werden',
+ couldNotSaveFolder: 'Ordner konnte nicht gespeichert werden',
+ folderCouldNotLoad: 'Ordner konnte nicht geladen werden',
+ },
+ fields: {
+ descriptionLabel: 'Ordnerbeschreibung',
+ descriptionPlaceholder: 'Was gehört in diesen Ordner?',
+ namePlaceholder: 'Ordnername',
+ untitledFolder: 'Unbenannter Ordner',
+ },
+ labels: {
+ createFolderTitle: 'Ordner erstellen',
+ folder: 'Ordner',
+ folders: 'Ordner',
+ loadingFolder: 'Ordner wird geladen',
+ name: 'Name',
+ updated: 'Aktualisiert',
+ },
+ sort: {
+ ariaLabel: 'Ordner sortieren',
+ name: 'Name',
+ updated: 'Aktualisiert',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Wenn lokale und synchronisierte Daten voneinander abweichen, erscheint das Element hier.',
+ heading: 'Synchronisierungsstatus',
+ title: 'Konflikte',
+ noConflicts: 'Keine Konflikte gefunden',
+ },
+ labels: {
+ menu: 'Menü',
+ },
+ sections: {
+ settings: {
+ description: 'Passe Umgebung und Einstellungen an',
+ title: 'Einstellungen',
+ },
+ trash: {
+ description: 'Entfernte Elemente wiederherstellen oder endgültig löschen',
+ title: 'Papierkorb',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Editor schließen',
+ openActions: 'Aktionen öffnen',
+ openWorkspaces: 'Arbeitsbereiche öffnen',
+ },
+ items: {
+ home: 'Start',
+ menu: 'Menü',
+ primary: 'Primär',
+ settings: 'Einstellungen',
+ spaces: 'Bereiche',
+ trash: 'Papierkorb',
+ workspaces: 'Arbeitsbereiche',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Cloze hinzufügen',
+ deleteNote: 'Notiz löschen',
+ editNote: 'Notiz bearbeiten',
+ hideDerivedCardsNote: 'Hinweis zu abgeleiteten Karten ausblenden',
+ openNote: '{{title}} öffnen',
+ saveNote: 'Notiz speichern',
+ showDerivedCardsNote: 'Hinweis zu abgeleiteten Karten anzeigen',
+ },
+ descriptions: {
+ clozeFormat: 'Jeder verborgene Teil wird beim Speichern zu einer Wiederholungskarte.',
+ clozeFormatPrefix: 'Umschließe verborgenen Text mit',
+ derivedCardsHelper: 'Notizen sind die Quelle der Wahrheit für abgeleitete Karten.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Dadurch wird "{{title}}" in den Papierkorb verschoben. Du kannst sie später wiederherstellen.',
+ deleteNoteFallbackDescription: 'Dadurch wird diese Notiz in den Papierkorb verschoben. Du kannst sie später wiederherstellen.',
+ deleteNoteFallbackTitle: 'Notiz löschen?',
+ deleteNoteTitle: '"{{title}}" löschen?',
+ },
+ errors: {
+ couldNotCreateNote: 'Notiz konnte nicht erstellt werden',
+ couldNotDeleteNote: 'Notiz konnte nicht gelöscht werden',
+ couldNotSaveNote: 'Notiz konnte nicht gespeichert werden',
+ noteCouldNotLoad: 'Notiz konnte nicht geladen werden',
+ },
+ fields: {
+ back: 'Rückseite',
+ backPlaceholder: 'Rückseite eingeben',
+ bodyPlaceholder: 'Notizinhalt mit Cloze-Löschungen schreiben…',
+ front: 'Vorderseite',
+ frontPlaceholder: 'Vorderseite eingeben',
+ noteBody: 'Notizinhalt',
+ title: 'Titel',
+ titlePlaceholder: 'Notiztitel hinzufügen',
+ untitledCloze: 'Unbenannter Cloze',
+ untitledNote: 'Unbenannte Notiz',
+ },
+ labels: {
+ backUppercase: 'RÜCKSEITE',
+ basic: 'Einfach',
+ basicLower: 'einfach',
+ basicUppercase: 'EINFACH',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze-Format',
+ clozeUppercase: 'CLOZE',
+ deck: 'Stapel',
+ derivedCards: 'ABGELEITETE KARTEN',
+ due: 'Fällig',
+ frontUppercase: 'VORDERSEITE',
+ inProgress: 'In Arbeit',
+ inProgressUppercase: 'IN ARBEIT',
+ loadingNote: 'Notiz wird geladen',
+ loadingNoteEditor: 'Notizeditor wird geladen',
+ markdownFormatting: 'Markdown-Formatierung',
+ mastered: 'Beherrscht',
+ masteredUppercase: 'BEHERRSCHT',
+ newNote: 'Neue Notiz',
+ noteBody: 'NOTIZINHALT',
+ noteContent: 'Notizinhalt',
+ noteDetails: 'Notizdetails',
+ noteMetadata: 'Notizmetadaten',
+ noteType: 'Notiztyp',
+ notes: 'Notizen',
+ reviewed: 'Wiederholt',
+ studyProgress: 'Lernfortschritt',
+ studyProgressUppercase: 'LERNFORTSCHRITT',
+ titleUppercase: 'TITEL',
+ updated: 'Aktualisiert',
+ },
+ sort: {
+ ariaLabel: 'Notizen sortieren',
+ title: 'Titel',
+ updated: 'Aktualisiert',
+ },
+ toolbar: {
+ bold: 'Fett',
+ italic: 'Kursiv',
+ link: 'Link',
+ list: 'Liste',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Nochmal',
+ backToDeck: 'Zurück zum Stapel',
+ continueReview: 'Wiederholung fortsetzen',
+ easy: 'Einfach',
+ good: 'Gut',
+ hard: 'Schwer',
+ newNote: 'Neue Notiz',
+ showAnswer: 'Antwort zeigen',
+ },
+ errors: {
+ couldNotGradeCard: 'Karte konnte nicht bewertet werden',
+ reviewCouldNotLoad: 'Wiederholung konnte nicht geladen werden',
+ reviewCouldNotStart: 'Wiederholung konnte nicht gestartet werden',
+ summaryCouldNotLoad: 'Zusammenfassung konnte nicht geladen werden',
+ summaryNotAvailable: 'Zusammenfassung ist nicht verfügbar',
+ summaryNotComplete: 'Diese Wiederholung ist noch nicht abgeschlossen.',
+ },
+ labels: {
+ cardsReviewed: 'Wiederholte Karten',
+ deck: 'Stapel',
+ duration: 'Dauer',
+ loadingReview: 'Wiederholung wird geladen',
+ loadingSummary: 'Zusammenfassung wird geladen',
+ progress: 'Wiederholungsfortschritt',
+ review: 'Wiederholung',
+ reviewComplete: 'Wiederholung abgeschlossen',
+ reviewed_one: '{{count}} wiederholt',
+ reviewed_other: '{{count}} wiederholt',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Dein Fortschritt wurde in diesem Stapel gespeichert.',
+ },
+ unavailable: {
+ description: 'Füge eine Notiz hinzu, damit dieser Stapel in die Wiederholungsliste kommt.',
+ title: 'Keine Karten zum Wiederholen',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Suche leeren',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Keine Treffer in diesem Arbeitsbereich',
+ noMatchesInWorkspaceDescription: 'Keine Ordner, Stapel oder Notizen passen zu "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Suche konnte nicht abgeschlossen werden',
+ },
+ labels: {
+ results: 'Suchergebnisse',
+ resultsFor: 'Ergebnisse für "{{query}}"',
+ searchingContent: 'Inhalte werden gesucht',
+ },
+ resultGroups: {
+ deck: 'Stapel',
+ folder: 'Ordner',
+ note: 'Notizen',
+ },
+ resultKinds: {
+ deck: 'Stapel',
+ folder: 'Ordner',
+ note: 'Notiz',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Alle Einstellungen zurücksetzen',
+ resetSettings: 'Einstellungen zurücksetzen',
+ resetToDefaults: 'Standardwerte wiederherstellen',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Füge gültiges JSON mit 21 numerischen Werten ein.',
+ fsrsErrorInvalidParams_one: 'Gib ein JSON-Array mit genau {{count}} endlicher Zahl ein.',
+ fsrsErrorInvalidParams_other: 'Gib ein JSON-Array mit genau {{count}} endlichen Zahlen ein.',
+ fsrsHelper: 'Dies ist eine Expertenüberschreibung. Die Werte müssen in Reihenfolge bleiben.',
+ fsrsJsonLabel: 'FSRS-Parameter-JSON',
+ fsrsTitle: 'FSRS-Parameter bearbeiten',
+ fsrsDescription: 'Füge ein JSON-Array mit 21 Zahlen ein, um die Scheduler-Gewichte zu überschreiben.',
+ resetDescription: 'Dadurch werden Zeitzone, Lernlimits und FSRS-Einstellungen wiederhergestellt.',
+ resetDescriptionWithLanguage: 'Dadurch werden Sprache, Zeitzone, Lernlimits und FSRS-Einstellungen wiederhergestellt.',
+ resetTitle: 'Alle Einstellungen zurücksetzen?',
+ timezoneDescription: 'Suche nach einer Stadt oder Zeitzonenkennung.',
+ timezoneSearchLabel: 'Zeitzonen suchen',
+ timezoneSearchPlaceholder: 'Zeitzonen suchen…',
+ timezoneTitle: 'Zeitzone wählen',
+ },
+ errors: {
+ couldNotResetSettings: 'Einstellungen konnten nicht zurückgesetzt werden',
+ couldNotSaveSettings: 'Einstellungen konnten nicht gespeichert werden',
+ settingsCouldNotLoad: 'Einstellungen konnten nicht geladen werden',
+ settingsUnavailable: 'Einstellungen sind nicht verfügbar.',
+ },
+ labels: {
+ appearance: 'Darstellung',
+ automatic: 'Automatisch',
+ fsrsParameters: 'FSRS-Parameter',
+ general: 'Allgemein',
+ language: 'Sprache',
+ loadingSettings: 'Einstellungen werden geladen',
+ masteryHorizon: 'Beherrschungshorizont',
+ newCardOrder: 'Reihenfolge neuer Karten',
+ newCardsPerDay: 'Neue Karten pro Tag',
+ reviewCardsPerDay: 'Wiederholungskarten pro Tag',
+ savingSettings: 'Einstellungen werden gespeichert',
+ schedule: 'Zeitplan',
+ searchNoTimezones: 'Keine passenden Zeitzonen.',
+ settings: 'Einstellungen',
+ settingsReset: 'Einstellungen zurückgesetzt',
+ study: 'Lernen',
+ targetRecallProbability: 'Ziel-Erinnerungswahrscheinlichkeit',
+ theme: 'Design',
+ timezone: 'Zeitzone',
+ },
+ options: {
+ languageEnUs: 'Englisch (USA)',
+ newCardsAfterReviews: 'Nach Wiederholungen',
+ newCardsBeforeReviews: 'Vor Wiederholungen',
+ newCardsMixed: 'Gemischt',
+ themeDark: 'Dunkel',
+ themeLight: 'Hell',
+ themeSystem: 'System',
+ timezoneSystem: 'Systemzeitzone verwenden',
+ },
+ rows: {
+ fsrsDescription: 'Expertenmodell-Gewichte',
+ languageDescription: 'Sprache der Oberfläche',
+ masteryHorizonDescription: 'Tage, die eine Karte bei oder über der Zielwahrscheinlichkeit abrufbar bleiben muss, um als beherrscht zu gelten',
+ newCardOrderDescription: 'Reihenfolge neuer Karten im Verhältnis zu Wiederholungen',
+ newCardsPerDayDescription: 'Maximale neue Karten pro Tag',
+ reviewCardsPerDayDescription: 'Maximale Wiederholungskarten pro Tag',
+ targetRecallProbabilityDescription: 'Minimale Erinnerungswahrscheinlichkeit bei der nächsten geplanten Wiederholung',
+ timezoneDescription: 'Automatische Zeitzone verwenden oder eine Stadt wählen.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Endgültig löschen',
+ empty: 'Leeren',
+ emptyTrash: 'Papierkorb leeren',
+ restore: 'Wiederherstellen',
+ restoringItem: '{{title}} wird wiederhergestellt',
+ },
+ dialogs: {
+ deleteItemDescription: 'Dadurch wird "{{title}}" endgültig gelöscht. Das kann nicht rückgängig gemacht werden.',
+ deleteItemFallbackDescription: 'Dadurch wird dieses Element endgültig gelöscht. Das kann nicht rückgängig gemacht werden.',
+ deleteItemFallbackTitle: 'Element löschen?',
+ deleteItemTitle: '"{{title}}" löschen?',
+ emptyTrashDescription: 'Dadurch wird alles im Papierkorb endgültig gelöscht. Das kann nicht rückgängig gemacht werden.',
+ emptyTrashTitle: 'Papierkorb leeren?',
+ },
+ empty: {
+ description: 'Gelöschte Elemente erscheinen hier vor der endgültigen Entfernung.',
+ title: 'Der Papierkorb ist leer',
+ },
+ errors: {
+ couldNotDeleteItem: 'Element konnte nicht gelöscht werden',
+ couldNotEmptyTrash: 'Papierkorb konnte nicht geleert werden',
+ couldNotRestoreItem: 'Element konnte nicht wiederhergestellt werden',
+ trashCouldNotLoad: 'Papierkorb konnte nicht geladen werden',
+ trashMayBeOutOfDate: 'Papierkorb ist möglicherweise veraltet',
+ },
+ labels: {
+ deletedAge: 'Gelöscht {{value}}',
+ itemCount_one: '{{count}} Element',
+ itemCount_other: '{{count}} Elemente',
+ lastEmptied: 'Zuletzt geleert {{value}}',
+ loadingTrash: 'Papierkorb wird geladen',
+ originalLocation: 'Ursprünglicher Ort: {{location}}',
+ title: 'Papierkorb',
+ trashActions: 'Papierkorb-Aktionen für {{title}}',
+ },
+ kinds: {
+ deck: 'Stapel',
+ folder: 'Ordner',
+ note: 'Notiz',
+ workspace: 'Arbeitsbereich',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Arbeitsbereich erstellen',
+ deleteWorkspace: 'Arbeitsbereich löschen',
+ editWorkspace: 'Arbeitsbereich bearbeiten',
+ newWorkspace: 'Neuer Arbeitsbereich',
+ openWorkspace: '{{title}} öffnen',
+ openingWorkspace: '{{title}} wird geöffnet',
+ },
+ descriptions: {
+ editorDefault: 'Lernkontext.',
+ editorVisual: 'Wähle einen visuellen Anker für diesen Arbeitsbereich.',
+ emptyList: 'Trenne Stapel, Notizen und Wiederholungslisten nach Lernkontext.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Dadurch wird "{{title}}" in den Papierkorb verschoben. Du kannst ihn später wiederherstellen.',
+ deleteWorkspaceFallbackDescription: 'Dadurch wird dieser Arbeitsbereich in den Papierkorb verschoben. Du kannst ihn später wiederherstellen.',
+ deleteWorkspaceFallbackTitle: 'Arbeitsbereich löschen?',
+ deleteWorkspaceTitle: '"{{title}}" löschen?',
+ },
+ empty: {
+ startWithWorkspace: 'Beginne mit einem Arbeitsbereich',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Arbeitsbereich konnte nicht erstellt werden',
+ couldNotDeleteWorkspace: 'Arbeitsbereich konnte nicht gelöscht werden',
+ couldNotOpenWorkspace: 'Arbeitsbereich konnte nicht geöffnet werden',
+ couldNotSaveWorkspace: 'Arbeitsbereich konnte nicht gespeichert werden',
+ workspaceCouldNotLoad: 'Arbeitsbereich konnte nicht geladen werden',
+ workspacesCouldNotLoad: 'Arbeitsbereiche konnten nicht geladen werden',
+ },
+ fields: {
+ descriptionLabel: 'Arbeitsbereichsbeschreibung',
+ descriptionPlaceholder: 'Was gehört in diesen Arbeitsbereich?',
+ namePlaceholder: 'Name des Arbeitsbereichs',
+ untitledWorkspace: 'Unbenannter Arbeitsbereich',
+ },
+ labels: {
+ createWorkspaceTitle: 'Arbeitsbereich erstellen',
+ loadingWorkspaces: 'Arbeitsbereiche werden geladen',
+ workspace: 'Arbeitsbereich',
+ workspaces: 'Arbeitsbereiche',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/el.ts b/ui/src/core/i18n/resources/el.ts
new file mode 100644
index 0000000..57c87c5
--- /dev/null
+++ b/ui/src/core/i18n/resources/el.ts
@@ -0,0 +1,623 @@
+export const el = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Δοκιμάστε ξανά. Αν συνεχίσει να συμβαίνει, ανοίξτε ξανά το Clear.',
+ title: 'Δεν ήταν δυνατή η εκκίνηση',
+ },
+ loadingTitle: 'Προετοιμασία του χώρου μελέτης σας',
+ },
+ common: {
+ actions: {
+ back: 'Πίσω',
+ cancel: 'Ακύρωση',
+ checkAgain: 'Έλεγχος ξανά',
+ close: 'Κλείσιμο',
+ create: 'Δημιουργία',
+ delete: 'Διαγραφή',
+ dismissError: 'Απόκρυψη σφάλματος',
+ dismissStatus: 'Απόκρυψη κατάστασης',
+ edit: 'Επεξεργασία',
+ itemActions: 'Ενέργειες για {{title}}',
+ reset: 'Επαναφορά',
+ review: 'Επανάληψη',
+ save: 'Αποθήκευση',
+ saveChanges: 'Αποθήκευση αλλαγών',
+ tryAgain: 'Δοκιμάστε ξανά',
+ },
+ labels: {
+ active: 'Ενεργό',
+ clear: 'Clear',
+ custom: 'Προσαρμοσμένο',
+ default: 'Προεπιλογή',
+ loadingEditor: 'Φόρτωση επεξεργαστή',
+ name: 'Όνομα',
+ completedTask: 'Ολοκληρωμένη εργασία',
+ description: 'Περιγραφή',
+ incompleteTask: 'Μη ολοκληρωμένη εργασία',
+ percentageInput: 'Ποσοστό για {{label}}',
+ visual: 'Οπτικό',
+ },
+ status: {
+ actionFailed: 'Η ενέργεια απέτυχε',
+ actionInProgress: 'Ενέργεια σε εξέλιξη',
+ },
+ sort: {
+ ascending: 'Αύξ.',
+ column: 'Στήλη',
+ descending: 'Φθίν.',
+ direction: 'Κατεύθυνση',
+ sort: 'Ταξινόμηση',
+ },
+ search: {
+ label: 'Αναζήτηση',
+ },
+ visualPicker: {
+ allLucideIcons: 'Όλα τα εικονίδια Lucide',
+ browseIconsFor: 'Περιηγηθείτε ή αναζητήστε εικονίδια για {{label}}.',
+ chooseIcon: 'Επιλογή εικονιδίου',
+ iconPicker: 'Επιλογέας εικονιδίου για {{label}}',
+ iconSearch: 'Αναζήτηση εικονιδίων για {{label}}',
+ iconsCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση των εικονιδίων.',
+ loadingIcons: 'Φόρτωση εικονιδίων',
+ loadingMoreIcons: 'Φόρτωση περισσότερων εικονιδίων',
+ moreIcons: 'Περισσότερα εικονίδια',
+ noIconsMatch: 'Κανένα εικονίδιο δεν ταιριάζει με "{{query}}".',
+ searchIconsPlaceholder: 'Αναζήτηση εικονιδίων…',
+ selectedIcon: 'Επιλέχθηκε {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Δημιουργία',
+ newDeck: 'Νέα τράπουλα',
+ newFolder: 'Νέος φάκελος',
+ },
+ descriptions: {
+ defaultWorkspace: 'Κρατήστε τράπουλες, φακέλους και σημειώσεις μαζί.',
+ emptyWorkspace: 'Δημιουργήστε μια τράπουλα και μετά προσθέστε σημειώσεις για να φτιάξετε την ουρά επανάληψης.',
+ emptyFolder: 'Δημιουργήστε μια τράπουλα και μετά προσθέστε σημειώσεις για να φτιάξετε μια ουρά επανάληψης.',
+ searchPlaceholder: 'Αναζήτηση φακέλων, τράπουλων και σημειώσεων…',
+ },
+ empty: {
+ createFirstDeck: 'Δημιουργήστε την πρώτη σας τράπουλα',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Δεν ήταν δυνατή η διαγραφή της τράπουλας',
+ couldNotDeleteFolder: 'Δεν ήταν δυνατή η διαγραφή του φακέλου',
+ couldNotDeleteWorkspace: 'Δεν ήταν δυνατή η διαγραφή του χώρου εργασίας',
+ dashboardCouldNotOpen: 'Δεν ήταν δυνατό το άνοιγμα του πίνακα',
+ decksCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση των τράπουλων',
+ decksMayBeOutOfDate: 'Οι τράπουλες μπορεί να μην είναι ενημερωμένες',
+ foldersCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση των φακέλων',
+ foldersMayBeOutOfDate: 'Οι φάκελοι μπορεί να μην είναι ενημερωμένοι',
+ workspaceCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση του χώρου εργασίας',
+ },
+ labels: {
+ dashboard: 'Πίνακας',
+ loadingDashboard: 'Φόρτωση πίνακα',
+ newItem: 'Νέο στοιχείο',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Η ημερομηνία δεν είναι διαθέσιμη',
+ },
+ age: {
+ dayAgo_one: 'πριν από {{count}} ημέρα',
+ dayAgo_other: 'πριν από {{count}} ημέρες',
+ hourAgo_one: 'πριν από {{count}} ώρα',
+ hourAgo_other: 'πριν από {{count}} ώρες',
+ justNow: 'μόλις τώρα',
+ minuteAgo_one: 'πριν από {{count}} λεπτό',
+ minuteAgo_other: 'πριν από {{count}} λεπτά',
+ unavailable: 'η ημερομηνία δεν είναι διαθέσιμη',
+ weekAgo_one: 'πριν από {{count}} εβδομάδα',
+ weekAgo_other: 'πριν από {{count}} εβδομάδες',
+ },
+ labels: {
+ deleted: 'Διαγράφηκε {{value}}',
+ due: 'Προθεσμία: {{value}}',
+ reviewed: 'Επαναλήφθηκε: {{value}}',
+ updated: 'Ενημερώθηκε {{value}}',
+ updatedUppercase: 'ΕΝΗΜΕΡΩΘΗΚΕ {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'πριν από {{count}} ημέρα',
+ dayAgo_other: 'πριν από {{count}} ημέρες',
+ inAMoment: 'Σε λίγο',
+ inDay_one: 'Σε {{count}} ημέρα',
+ inDay_other: 'Σε {{count}} ημέρες',
+ inMonth_one: 'Σε {{count}} μήνα',
+ inMonth_other: 'Σε {{count}} μήνες',
+ inWeek_one: 'Σε {{count}} εβδομάδα',
+ inWeek_other: 'Σε {{count}} εβδομάδες',
+ justNow: 'Μόλις τώρα',
+ monthAgo_one: 'πριν από {{count}} μήνα',
+ monthAgo_other: 'πριν από {{count}} μήνες',
+ secondsAgoShort: 'πριν από {{count}} δ',
+ minutesAgoShort: 'πριν από {{count}} λεπ',
+ hoursAgoShort: 'πριν από {{count}} ώ',
+ today: 'Σήμερα',
+ tomorrow: 'Αύριο',
+ weekAgo_one: 'πριν από {{count}} εβδομάδα',
+ weekAgo_other: 'πριν από {{count}} εβδομάδες',
+ yesterday: 'Χθες',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Ενέργειες για {{title}}',
+ createDeck: 'Δημιουργία τράπουλας',
+ createNote: 'Δημιουργία σημείωσης',
+ deleteDeck: 'Διαγραφή τράπουλας',
+ editDeck: 'Επεξεργασία τράπουλας',
+ newNote: 'Νέα σημείωση',
+ openDeck: 'Άνοιγμα τράπουλας {{title}}',
+ saveDeck: 'Δεν ήταν δυνατή η αποθήκευση της τράπουλας',
+ studyNow: 'Μελέτη τώρα',
+ },
+ descriptions: {
+ emptyDeck: 'Προσθέστε μια σημείωση ώστε αυτή η τράπουλα να έχει υλικό για επανάληψη.',
+ editorDefault: 'Εστιασμένη τράπουλα μελέτης.',
+ editorVisual: 'Επιλέξτε ένα σύμβολο εξωφύλλου για αυτήν την τράπουλα.',
+ notesSearchPlaceholder: 'Αναζήτηση σημειώσεων…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Αυτό μετακινεί το "{{title}}" στον Κάδο. Μπορείτε να το επαναφέρετε αργότερα.',
+ deleteDeckFallbackDescription: 'Αυτό μετακινεί αυτήν την τράπουλα στον Κάδο. Μπορείτε να την επαναφέρετε αργότερα.',
+ deleteDeckFallbackTitle: 'Διαγραφή τράπουλας;',
+ deleteDeckTitle: 'Διαγραφή "{{title}}";',
+ deleteNoteDescription: 'Αυτό μετακινεί το "{{title}}" στον Κάδο. Μπορείτε να το επαναφέρετε αργότερα.',
+ deleteNoteFallbackTitle: 'Διαγραφή σημείωσης;',
+ deleteNoteTitle: 'Διαγραφή "{{title}}";',
+ },
+ empty: {
+ noMatchingNotes: 'Δεν υπάρχουν αντίστοιχες σημειώσεις',
+ noMatchingNotesDescription: 'Καμία σημείωση δεν ταιριάζει με "{{query}}".',
+ thisDeckIsEmpty: 'Αυτή η τράπουλα είναι κενή',
+ },
+ errors: {
+ couldNotCreateDeck: 'Δεν ήταν δυνατή η δημιουργία της τράπουλας',
+ couldNotDeleteDeck: 'Δεν ήταν δυνατή η διαγραφή της τράπουλας',
+ couldNotDeleteNote: 'Δεν ήταν δυνατή η διαγραφή της σημείωσης',
+ couldNotLoadFolderPath: 'Δεν ήταν δυνατή η φόρτωση της διαδρομής φακέλου',
+ couldNotSaveDeck: 'Δεν ήταν δυνατή η αποθήκευση της τράπουλας',
+ deckCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση της τράπουλας',
+ notesCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση των σημειώσεων',
+ notesMayBeOutOfDate: 'Οι σημειώσεις μπορεί να μην είναι ενημερωμένες',
+ },
+ fields: {
+ descriptionLabel: 'Περιγραφή τράπουλας',
+ descriptionPlaceholder: 'Τι θα σας βοηθήσει να επαναλάβετε αυτή η τράπουλα;',
+ namePlaceholder: 'Όνομα τράπουλας',
+ untitledDeck: 'Τράπουλα χωρίς τίτλο',
+ untitledDeckLower: 'τράπουλα χωρίς τίτλο',
+ },
+ labels: {
+ createDeckTitle: 'Δημιουργία τράπουλας',
+ deck: 'Τράπουλα',
+ deckNotesSearch: 'Αναζήτηση σημειώσεων τράπουλας',
+ deckOverview: 'Επισκόπηση τράπουλας',
+ decks: 'Τράπουλες',
+ due: 'Προθεσμία',
+ dueToday: 'Προθεσμία σήμερα',
+ loadingDeck: 'Φόρτωση τράπουλας',
+ mastery: 'Κατάκτηση',
+ notes: 'Σημειώσεις',
+ },
+ sort: {
+ ariaLabel: 'Ταξινόμηση τράπουλων',
+ dueToday: 'Προθεσμία σήμερα',
+ title: 'Τίτλος',
+ updated: 'Ενημερώθηκε',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Τα δεδομένα άλλαξαν. Ανανεώστε και δοκιμάστε ξανά.',
+ forbidden: 'Δεν έχετε άδεια για αυτήν την ενέργεια.',
+ notFound: 'Δεν μπορέσαμε να βρούμε αυτό το στοιχείο.',
+ offline: 'Δεν είναι δυνατή η πρόσβαση στην υπηρεσία.',
+ timeout: 'Αυτό πήρε πολύ χρόνο. Δοκιμάστε ξανά.',
+ unauthorized: 'Συνδεθείτε για να συνεχίσετε.',
+ unavailable: 'Η υπηρεσία δεν είναι προσωρινά διαθέσιμη.',
+ },
+ fallback: {
+ unexpected: 'Απροσδόκητο σφάλμα',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Δημιουργία φακέλου',
+ deleteFolder: 'Διαγραφή φακέλου',
+ editFolder: 'Επεξεργασία φακέλου',
+ },
+ descriptions: {
+ editorDefault: 'Φάκελος για σχετικές τράπουλες.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Αυτό μετακινεί το "{{name}}" στον Κάδο. Μπορείτε να το επαναφέρετε αργότερα.',
+ deleteFolderFallbackDescription: 'Αυτό μετακινεί αυτόν τον φάκελο στον Κάδο. Μπορείτε να τον επαναφέρετε αργότερα.',
+ deleteFolderFallbackTitle: 'Διαγραφή φακέλου;',
+ deleteFolderTitle: 'Διαγραφή "{{name}}";',
+ },
+ empty: {
+ noMatchesInFolder: 'Δεν υπάρχουν αντιστοιχίες σε αυτόν τον φάκελο',
+ noMatchesInFolderDescription: 'Κανένας φάκελος, τράπουλα ή σημείωση δεν ταιριάζει με "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Δεν ήταν δυνατή η δημιουργία του φακέλου',
+ couldNotDeleteFolder: 'Δεν ήταν δυνατή η διαγραφή του φακέλου',
+ couldNotLoadFolderPath: 'Δεν ήταν δυνατή η φόρτωση της διαδρομής φακέλου',
+ couldNotSaveFolder: 'Δεν ήταν δυνατή η αποθήκευση του φακέλου',
+ folderCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση του φακέλου',
+ },
+ fields: {
+ descriptionLabel: 'Περιγραφή φακέλου',
+ descriptionPlaceholder: 'Τι ανήκει σε αυτόν τον φάκελο;',
+ namePlaceholder: 'Όνομα φακέλου',
+ untitledFolder: 'Φάκελος χωρίς τίτλο',
+ },
+ labels: {
+ createFolderTitle: 'Δημιουργία φακέλου',
+ folder: 'Φάκελος',
+ folders: 'Φάκελοι',
+ loadingFolder: 'Φόρτωση φακέλου',
+ name: 'Όνομα',
+ updated: 'Ενημερώθηκε',
+ },
+ sort: {
+ ariaLabel: 'Ταξινόμηση φακέλων',
+ name: 'Όνομα',
+ updated: 'Ενημερώθηκε',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Αν τα τοπικά και συγχρονισμένα δεδομένα διαφέρουν, το στοιχείο θα εμφανιστεί εδώ.',
+ heading: 'Κατάσταση συγχρονισμού',
+ title: 'Διενέξεις',
+ noConflicts: 'Δεν βρέθηκαν διενέξεις',
+ },
+ labels: {
+ menu: 'Μενού',
+ },
+ sections: {
+ settings: {
+ description: 'Προσαρμόστε το περιβάλλον και τις προτιμήσεις σας',
+ title: 'Ρυθμίσεις',
+ },
+ trash: {
+ description: 'Επαναφέρετε ή διαγράψτε οριστικά αφαιρεμένα στοιχεία',
+ title: 'Κάδος',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Κλείσιμο επεξεργαστή',
+ openActions: 'Άνοιγμα ενεργειών',
+ openWorkspaces: 'Άνοιγμα χώρων εργασίας',
+ },
+ items: {
+ home: 'Αρχική',
+ menu: 'Μενού',
+ primary: 'Κύριο',
+ settings: 'Ρυθμίσεις',
+ spaces: 'Χώροι',
+ trash: 'Κάδος',
+ workspaces: 'Χώροι εργασίας',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Προσθήκη cloze',
+ deleteNote: 'Διαγραφή σημείωσης',
+ editNote: 'Επεξεργασία σημείωσης',
+ hideDerivedCardsNote: 'Απόκρυψη σημείωσης παράγωγων καρτών',
+ openNote: 'Άνοιγμα {{title}}',
+ saveNote: 'Αποθήκευση σημείωσης',
+ showDerivedCardsNote: 'Εμφάνιση σημείωσης παράγωγων καρτών',
+ },
+ descriptions: {
+ clozeFormat: 'Κάθε κρυφό τμήμα γίνεται κάρτα επανάληψης όταν αποθηκεύετε.',
+ clozeFormatPrefix: 'Τυλίξτε το κρυφό κείμενο με',
+ derivedCardsHelper: 'Οι σημειώσεις είναι η πηγή αλήθειας για τις παράγωγες κάρτες.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Αυτό μετακινεί το "{{title}}" στον Κάδο. Μπορείτε να το επαναφέρετε αργότερα.',
+ deleteNoteFallbackDescription: 'Αυτό μετακινεί αυτήν τη σημείωση στον Κάδο. Μπορείτε να την επαναφέρετε αργότερα.',
+ deleteNoteFallbackTitle: 'Διαγραφή σημείωσης;',
+ deleteNoteTitle: 'Διαγραφή "{{title}}";',
+ },
+ errors: {
+ couldNotCreateNote: 'Δεν ήταν δυνατή η δημιουργία της σημείωσης',
+ couldNotDeleteNote: 'Δεν ήταν δυνατή η διαγραφή της σημείωσης',
+ couldNotSaveNote: 'Δεν ήταν δυνατή η αποθήκευση της σημείωσης',
+ noteCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση της σημείωσης',
+ },
+ fields: {
+ back: 'Πίσω πλευρά',
+ backPlaceholder: 'Εισαγάγετε πίσω πλευρά',
+ bodyPlaceholder: 'Γράψτε το σώμα της σημείωσης με cloze deletions…',
+ front: 'Μπροστινή πλευρά',
+ frontPlaceholder: 'Εισαγάγετε μπροστινή πλευρά',
+ noteBody: 'Σώμα σημείωσης',
+ title: 'Τίτλος',
+ titlePlaceholder: 'Προσθέστε τίτλο σημείωσης',
+ untitledCloze: 'Cloze χωρίς τίτλο',
+ untitledNote: 'Σημείωση χωρίς τίτλο',
+ },
+ labels: {
+ backUppercase: 'ΠΙΣΩ ΠΛΕΥΡΑ',
+ basic: 'Βασική',
+ basicLower: 'βασική',
+ basicUppercase: 'ΒΑΣΙΚΗ',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Μορφή cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Τράπουλα',
+ derivedCards: 'ΠΑΡΑΓΩΓΕΣ ΚΑΡΤΕΣ',
+ due: 'Προθεσμία',
+ frontUppercase: 'ΜΠΡΟΣΤΙΝΗ ΠΛΕΥΡΑ',
+ inProgress: 'Σε εξέλιξη',
+ inProgressUppercase: 'ΣΕ ΕΞΕΛΙΞΗ',
+ loadingNote: 'Φόρτωση σημείωσης',
+ loadingNoteEditor: 'Φόρτωση επεξεργαστή σημειώσεων',
+ markdownFormatting: 'Μορφοποίηση Markdown',
+ mastered: 'Κατακτημένο',
+ masteredUppercase: 'ΚΑΤΑΚΤΗΜΕΝΟ',
+ newNote: 'Νέα σημείωση',
+ noteBody: 'ΣΩΜΑ ΣΗΜΕΙΩΣΗΣ',
+ noteContent: 'Περιεχόμενο σημείωσης',
+ noteDetails: 'Λεπτομέρειες σημείωσης',
+ noteMetadata: 'Μεταδεδομένα σημείωσης',
+ noteType: 'Τύπος σημείωσης',
+ notes: 'Σημειώσεις',
+ reviewed: 'Επαναλήφθηκε',
+ studyProgress: 'Πρόοδος μελέτης',
+ studyProgressUppercase: 'ΠΡΟΟΔΟΣ ΜΕΛΕΤΗΣ',
+ titleUppercase: 'ΤΙΤΛΟΣ',
+ updated: 'Ενημερώθηκε',
+ },
+ sort: {
+ ariaLabel: 'Ταξινόμηση σημειώσεων',
+ title: 'Τίτλος',
+ updated: 'Ενημερώθηκε',
+ },
+ toolbar: {
+ bold: 'Έντονα',
+ italic: 'Πλάγια',
+ link: 'Σύνδεσμος',
+ list: 'Λίστα',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Ξανά',
+ backToDeck: 'Πίσω στην τράπουλα',
+ continueReview: 'Συνέχεια επανάληψης',
+ easy: 'Εύκολο',
+ good: 'Καλό',
+ hard: 'Δύσκολο',
+ newNote: 'Νέα σημείωση',
+ showAnswer: 'Εμφάνιση απάντησης',
+ },
+ errors: {
+ couldNotGradeCard: 'Δεν ήταν δυνατή η αξιολόγηση της κάρτας',
+ reviewCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση της επανάληψης',
+ reviewCouldNotStart: 'Δεν ήταν δυνατή η έναρξη της επανάληψης',
+ summaryCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση της σύνοψης επανάληψης',
+ summaryNotAvailable: 'Η σύνοψη επανάληψης δεν είναι διαθέσιμη',
+ summaryNotComplete: 'Αυτή η επανάληψη δεν έχει ολοκληρωθεί ακόμη.',
+ },
+ labels: {
+ cardsReviewed: 'Κάρτες που επαναλήφθηκαν',
+ deck: 'Τράπουλα',
+ duration: 'Διάρκεια',
+ loadingReview: 'Φόρτωση επανάληψης',
+ loadingSummary: 'Φόρτωση σύνοψης',
+ progress: 'Πρόοδος επανάληψης',
+ review: 'Επανάληψη',
+ reviewComplete: 'Η επανάληψη ολοκληρώθηκε',
+ reviewed_one: 'Επαναλήφθηκε {{count}}',
+ reviewed_other: 'Επαναλήφθηκαν {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} ώ {{minutes}} λεπ',
+ durationMinutes: '{{minutes}} λεπ',
+ durationSeconds: '{{seconds}} δ',
+ saved: 'Η πρόοδός σας αποθηκεύτηκε σε αυτήν την τράπουλα.',
+ },
+ unavailable: {
+ description: 'Προσθέστε μια σημείωση ώστε αυτή η τράπουλα να μπει στην ουρά επανάληψης.',
+ title: 'Δεν υπάρχουν κάρτες για επανάληψη',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Εκκαθάριση αναζήτησης',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Δεν υπάρχουν αντιστοιχίες σε αυτόν τον χώρο εργασίας',
+ noMatchesInWorkspaceDescription: 'Κανένας φάκελος, τράπουλα ή σημείωση δεν ταιριάζει με "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Δεν ήταν δυνατή η ολοκλήρωση της αναζήτησης',
+ },
+ labels: {
+ results: 'Αποτελέσματα αναζήτησης',
+ resultsFor: 'Αποτελέσματα για "{{query}}"',
+ searchingContent: 'Αναζήτηση περιεχομένου',
+ },
+ resultGroups: {
+ deck: 'Τράπουλες',
+ folder: 'Φάκελοι',
+ note: 'Σημειώσεις',
+ },
+ resultKinds: {
+ deck: 'τράπουλα',
+ folder: 'φάκελος',
+ note: 'σημείωση',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Επαναφορά όλων των ρυθμίσεων',
+ resetSettings: 'Επαναφορά ρυθμίσεων',
+ resetToDefaults: 'Επαναφορά προεπιλογών',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Επικολλήστε έγκυρο JSON με 21 αριθμητικές τιμές.',
+ fsrsErrorInvalidParams_one: 'Εισαγάγετε έναν πίνακα JSON με ακριβώς {{count}} πεπερασμένο αριθμό.',
+ fsrsErrorInvalidParams_other: 'Εισαγάγετε έναν πίνακα JSON με ακριβώς {{count}} πεπερασμένους αριθμούς.',
+ fsrsHelper: 'Αυτή είναι μια ρύθμιση για προχωρημένους. Οι τιμές πρέπει να παραμείνουν στη σειρά.',
+ fsrsJsonLabel: 'JSON παραμέτρων FSRS',
+ fsrsTitle: 'Επεξεργασία παραμέτρων FSRS',
+ fsrsDescription: 'Επικολλήστε έναν πίνακα JSON με 21 αριθμούς για να παρακάμψετε τα βάρη του scheduler.',
+ resetDescription: 'Αυτό επαναφέρει ζώνη ώρας, όρια μελέτης και ρυθμίσεις FSRS.',
+ resetDescriptionWithLanguage: 'Αυτό επαναφέρει γλώσσα, ζώνη ώρας, όρια μελέτης και ρυθμίσεις FSRS.',
+ resetTitle: 'Επαναφορά όλων των ρυθμίσεων;',
+ timezoneDescription: 'Αναζητήστε πόλη ή αναγνωριστικό ζώνης ώρας.',
+ timezoneSearchLabel: 'Αναζήτηση ζωνών ώρας',
+ timezoneSearchPlaceholder: 'Αναζήτηση ζωνών ώρας…',
+ timezoneTitle: 'Επιλογή ζώνης ώρας',
+ },
+ errors: {
+ couldNotResetSettings: 'Δεν ήταν δυνατή η επαναφορά των ρυθμίσεων',
+ couldNotSaveSettings: 'Δεν ήταν δυνατή η αποθήκευση των ρυθμίσεων',
+ settingsCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση των ρυθμίσεων',
+ settingsUnavailable: 'Οι ρυθμίσεις δεν είναι διαθέσιμες.',
+ },
+ labels: {
+ appearance: 'Εμφάνιση',
+ automatic: 'Αυτόματα',
+ fsrsParameters: 'Παράμετροι FSRS',
+ general: 'Γενικά',
+ language: 'Γλώσσα',
+ loadingSettings: 'Φόρτωση ρυθμίσεων',
+ masteryHorizon: 'Ορίζοντας κατάκτησης',
+ newCardOrder: 'Σειρά νέων καρτών',
+ newCardsPerDay: 'Νέες κάρτες ανά ημέρα',
+ reviewCardsPerDay: 'Κάρτες επανάληψης ανά ημέρα',
+ savingSettings: 'Αποθήκευση ρυθμίσεων',
+ schedule: 'Πρόγραμμα',
+ searchNoTimezones: 'Δεν υπάρχουν αντίστοιχες ζώνες ώρας.',
+ settings: 'Ρυθμίσεις',
+ settingsReset: 'Οι ρυθμίσεις επαναφέρθηκαν',
+ study: 'Μελέτη',
+ targetRecallProbability: 'Στόχος πιθανότητας ανάκλησης',
+ theme: 'Θέμα',
+ timezone: 'Ζώνη ώρας',
+ },
+ options: {
+ languageEnUs: 'Αγγλικά (ΗΠΑ)',
+ newCardsAfterReviews: 'Μετά τις επαναλήψεις',
+ newCardsBeforeReviews: 'Πριν από τις επαναλήψεις',
+ newCardsMixed: 'Μικτά',
+ themeDark: 'Σκούρο',
+ themeLight: 'Ανοιχτό',
+ themeSystem: 'Σύστημα',
+ timezoneSystem: 'Χρήση ζώνης ώρας συστήματος',
+ },
+ rows: {
+ fsrsDescription: 'Βάρη μοντέλου για προχωρημένους',
+ languageDescription: 'Γλώσσα διεπαφής',
+ masteryHorizonDescription: 'Ημέρες που μια κάρτα πρέπει να παραμένει ανακλήσιμη στην πιθανότητα στόχο ή πάνω από αυτή για να θεωρηθεί κατακτημένη',
+ newCardOrderDescription: 'Σειρά νέων καρτών σε σχέση με τις επαναλήψεις',
+ newCardsPerDayDescription: 'Μέγιστος αριθμός νέων καρτών ανά ημέρα',
+ reviewCardsPerDayDescription: 'Μέγιστος αριθμός καρτών επανάληψης ανά ημέρα',
+ targetRecallProbabilityDescription: 'Ελάχιστη πιθανότητα ανάκλησης στην επόμενη προγραμματισμένη επανάληψη',
+ timezoneDescription: 'Χρησιμοποιήστε αυτόματη ζώνη ώρας ή επιλέξτε πόλη.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Οριστική διαγραφή',
+ empty: 'Άδειασμα',
+ emptyTrash: 'Άδειασμα κάδου',
+ restore: 'Επαναφορά',
+ restoringItem: 'Επαναφορά {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Αυτό διαγράφει οριστικά το "{{title}}". Δεν μπορεί να αναιρεθεί.',
+ deleteItemFallbackDescription: 'Αυτό διαγράφει οριστικά αυτό το στοιχείο. Δεν μπορεί να αναιρεθεί.',
+ deleteItemFallbackTitle: 'Διαγραφή στοιχείου;',
+ deleteItemTitle: 'Διαγραφή "{{title}}";',
+ emptyTrashDescription: 'Αυτό διαγράφει οριστικά όλα τα στοιχεία στον Κάδο. Δεν μπορεί να αναιρεθεί.',
+ emptyTrashTitle: 'Άδειασμα κάδου;',
+ },
+ empty: {
+ description: 'Τα στοιχεία που διαγράφετε θα εμφανίζονται εδώ πριν αφαιρεθούν οριστικά.',
+ title: 'Ο Κάδος είναι άδειος',
+ },
+ errors: {
+ couldNotDeleteItem: 'Δεν ήταν δυνατή η διαγραφή του στοιχείου',
+ couldNotEmptyTrash: 'Δεν ήταν δυνατό το άδειασμα του Κάδου',
+ couldNotRestoreItem: 'Δεν ήταν δυνατή η επαναφορά του στοιχείου',
+ trashCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση του Κάδου',
+ trashMayBeOutOfDate: 'Ο Κάδος μπορεί να μην είναι ενημερωμένος',
+ },
+ labels: {
+ deletedAge: 'Διαγράφηκε {{value}}',
+ itemCount_one: '{{count}} στοιχείο',
+ itemCount_other: '{{count}} στοιχεία',
+ lastEmptied: 'Τελευταίο άδειασμα {{value}}',
+ loadingTrash: 'Φόρτωση Κάδου',
+ originalLocation: 'Αρχική τοποθεσία: {{location}}',
+ title: 'Κάδος',
+ trashActions: 'Ενέργειες κάδου για {{title}}',
+ },
+ kinds: {
+ deck: 'Τράπουλα',
+ folder: 'Φάκελος',
+ note: 'Σημείωση',
+ workspace: 'Χώρος εργασίας',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Δημιουργία χώρου εργασίας',
+ deleteWorkspace: 'Διαγραφή χώρου εργασίας',
+ editWorkspace: 'Επεξεργασία χώρου εργασίας',
+ newWorkspace: 'Νέος χώρος εργασίας',
+ openWorkspace: 'Άνοιγμα {{title}}',
+ openingWorkspace: 'Άνοιγμα {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Πλαίσιο μελέτης.',
+ editorVisual: 'Επιλέξτε μια οπτική άγκυρα για αυτόν τον χώρο εργασίας.',
+ emptyList: 'Διαχωρίστε τράπουλες, σημειώσεις και ουρές επανάληψης ανά πλαίσιο μελέτης.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Αυτό μετακινεί το "{{title}}" στον Κάδο. Μπορείτε να το επαναφέρετε αργότερα.',
+ deleteWorkspaceFallbackDescription: 'Αυτό μετακινεί αυτόν τον χώρο εργασίας στον Κάδο. Μπορείτε να τον επαναφέρετε αργότερα.',
+ deleteWorkspaceFallbackTitle: 'Διαγραφή χώρου εργασίας;',
+ deleteWorkspaceTitle: 'Διαγραφή "{{title}}";',
+ },
+ empty: {
+ startWithWorkspace: 'Ξεκινήστε με έναν χώρο εργασίας',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Δεν ήταν δυνατή η δημιουργία του χώρου εργασίας',
+ couldNotDeleteWorkspace: 'Δεν ήταν δυνατή η διαγραφή του χώρου εργασίας',
+ couldNotOpenWorkspace: 'Δεν ήταν δυνατό το άνοιγμα του χώρου εργασίας',
+ couldNotSaveWorkspace: 'Δεν ήταν δυνατή η αποθήκευση του χώρου εργασίας',
+ workspaceCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση του χώρου εργασίας',
+ workspacesCouldNotLoad: 'Δεν ήταν δυνατή η φόρτωση των χώρων εργασίας',
+ },
+ fields: {
+ descriptionLabel: 'Περιγραφή χώρου εργασίας',
+ descriptionPlaceholder: 'Τι ανήκει σε αυτόν τον χώρο εργασίας;',
+ namePlaceholder: 'Όνομα χώρου εργασίας',
+ untitledWorkspace: 'Χώρος εργασίας χωρίς τίτλο',
+ },
+ labels: {
+ createWorkspaceTitle: 'Δημιουργία χώρου εργασίας',
+ loadingWorkspaces: 'Φόρτωση χώρων εργασίας',
+ workspace: 'Χώρος εργασίας',
+ workspaces: 'Χώροι εργασίας',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/en-US.ts b/ui/src/core/i18n/resources/en-US.ts
index 8cf7217..9add2ab 100644
--- a/ui/src/core/i18n/resources/en-US.ts
+++ b/ui/src/core/i18n/resources/en-US.ts
@@ -103,16 +103,16 @@ export const enUS = {
unavailable: 'Date unavailable',
},
age: {
- dayAgo: '{{count}} day ago',
- daysAgo: '{{count}} days ago',
- hourAgo: '{{count}} hour ago',
- hoursAgo: '{{count}} hours ago',
+ dayAgo_one: '{{count}} day ago',
+ dayAgo_other: '{{count}} days ago',
+ hourAgo_one: '{{count}} hour ago',
+ hourAgo_other: '{{count}} hours ago',
justNow: 'just now',
- minuteAgo: '{{count}} minute ago',
- minutesAgo: '{{count}} minutes ago',
+ minuteAgo_one: '{{count}} minute ago',
+ minuteAgo_other: '{{count}} minutes ago',
unavailable: 'date unavailable',
- weekAgo: '{{count}} week ago',
- weeksAgo: '{{count}} weeks ago',
+ weekAgo_one: '{{count}} week ago',
+ weekAgo_other: '{{count}} weeks ago',
},
labels: {
deleted: 'Deleted {{value}}',
@@ -122,25 +122,25 @@ export const enUS = {
updatedUppercase: 'UPDATED {{value}}',
},
relative: {
- dayAgo: '{{count}} day ago',
- daysAgo: '{{count}} days ago',
+ dayAgo_one: '{{count}} day ago',
+ dayAgo_other: '{{count}} days ago',
inAMoment: 'In a moment',
- inDay: 'In {{count}} day',
- inDays: 'In {{count}} days',
- inMonth: 'In {{count}} month',
- inMonths: 'In {{count}} months',
- inWeek: 'In {{count}} week',
- inWeeks: 'In {{count}} weeks',
+ inDay_one: 'In {{count}} day',
+ inDay_other: 'In {{count}} days',
+ inMonth_one: 'In {{count}} month',
+ inMonth_other: 'In {{count}} months',
+ inWeek_one: 'In {{count}} week',
+ inWeek_other: 'In {{count}} weeks',
justNow: 'Just now',
- monthAgo: '{{count}} month ago',
- monthsAgo: '{{count}} months ago',
+ monthAgo_one: '{{count}} month ago',
+ monthAgo_other: '{{count}} months ago',
secondsAgoShort: '{{count}}s ago',
minutesAgoShort: '{{count}}m ago',
hoursAgoShort: '{{count}}h ago',
today: 'Today',
tomorrow: 'Tomorrow',
- weekAgo: '{{count}} week ago',
- weeksAgo: '{{count}} weeks ago',
+ weekAgo_one: '{{count}} week ago',
+ weekAgo_other: '{{count}} weeks ago',
yesterday: 'Yesterday',
},
},
@@ -421,7 +421,8 @@ export const enUS = {
progress: 'Review progress',
review: 'Review',
reviewComplete: 'Review complete',
- reviewed: 'Reviewed {{count}}',
+ reviewed_one: 'Reviewed {{count}}',
+ reviewed_other: 'Reviewed {{count}}',
},
summary: {
durationHoursMinutes: '{{hours}}h {{minutes}}m',
@@ -469,7 +470,8 @@ export const enUS = {
},
dialogs: {
fsrsErrorInvalidJson: 'Paste valid JSON with 21 numeric values.',
- fsrsErrorInvalidParams: 'Enter a JSON array with exactly {{count}} finite numbers.',
+ fsrsErrorInvalidParams_one: 'Enter a JSON array with exactly {{count}} finite number.',
+ fsrsErrorInvalidParams_other: 'Enter a JSON array with exactly {{count}} finite numbers.',
fsrsHelper: 'This is an expert override. Values must stay in order.',
fsrsJsonLabel: 'FSRS Parameters JSON',
fsrsTitle: 'Edit FSRS parameters',
@@ -559,8 +561,8 @@ export const enUS = {
},
labels: {
deletedAge: 'Deleted {{value}}',
- itemCount: '{{count}} item',
- itemCountPlural: '{{count}} items',
+ itemCount_one: '{{count}} item',
+ itemCount_other: '{{count}} items',
lastEmptied: 'Last emptied {{value}}',
loadingTrash: 'Loading trash',
originalLocation: 'Original location: {{location}}',
diff --git a/ui/src/core/i18n/resources/es.ts b/ui/src/core/i18n/resources/es.ts
new file mode 100644
index 0000000..3333ab9
--- /dev/null
+++ b/ui/src/core/i18n/resources/es.ts
@@ -0,0 +1,623 @@
+export const es = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Inténtalo de nuevo. Si sigue ocurriendo, vuelve a abrir Clear.',
+ title: 'No se pudo iniciar',
+ },
+ loadingTitle: 'Preparando tu espacio de estudio',
+ },
+ common: {
+ actions: {
+ back: 'Atrás',
+ cancel: 'Cancelar',
+ checkAgain: 'Comprobar de nuevo',
+ close: 'Cerrar',
+ create: 'Crear',
+ delete: 'Eliminar',
+ dismissError: 'Descartar error',
+ dismissStatus: 'Descartar estado',
+ edit: 'Editar',
+ itemActions: 'Acciones de {{title}}',
+ reset: 'Restablecer',
+ review: 'Repasar',
+ save: 'Guardar',
+ saveChanges: 'Guardar cambios',
+ tryAgain: 'Intentar de nuevo',
+ },
+ labels: {
+ active: 'Activo',
+ clear: 'Clear',
+ custom: 'Personalizado',
+ default: 'Predeterminado',
+ loadingEditor: 'Cargando editor',
+ name: 'Nombre',
+ completedTask: 'Tarea completada',
+ description: 'Descripción',
+ incompleteTask: 'Tarea incompleta',
+ percentageInput: 'Porcentaje de {{label}}',
+ visual: 'Visual',
+ },
+ status: {
+ actionFailed: 'La acción falló',
+ actionInProgress: 'Acción en curso',
+ },
+ sort: {
+ ascending: 'Asc',
+ column: 'Columna',
+ descending: 'Desc',
+ direction: 'Dirección',
+ sort: 'Ordenar',
+ },
+ search: {
+ label: 'Buscar',
+ },
+ visualPicker: {
+ allLucideIcons: 'Todos los iconos de Lucide',
+ browseIconsFor: 'Explora o busca iconos para {{label}}.',
+ chooseIcon: 'Elegir icono',
+ iconPicker: 'Selector de iconos de {{label}}',
+ iconSearch: 'Búsqueda de iconos de {{label}}',
+ iconsCouldNotLoad: 'No se pudieron cargar los iconos.',
+ loadingIcons: 'Cargando iconos',
+ loadingMoreIcons: 'Cargando más iconos',
+ moreIcons: 'Más iconos',
+ noIconsMatch: 'Ningún icono coincide con "{{query}}".',
+ searchIconsPlaceholder: 'Buscar iconos…',
+ selectedIcon: '{{label}} seleccionado',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Crear',
+ newDeck: 'Nuevo mazo',
+ newFolder: 'Nueva carpeta',
+ },
+ descriptions: {
+ defaultWorkspace: 'Mantén juntos mazos, carpetas y notas.',
+ emptyWorkspace: 'Crea un mazo y luego añade notas para crear tu cola de repaso.',
+ emptyFolder: 'Crea un mazo y luego añade notas para crear una cola de repaso.',
+ searchPlaceholder: 'Buscar carpetas, mazos y notas…',
+ },
+ empty: {
+ createFirstDeck: 'Crea tu primer mazo',
+ },
+ errors: {
+ couldNotDeleteDeck: 'No se pudo eliminar el mazo',
+ couldNotDeleteFolder: 'No se pudo eliminar la carpeta',
+ couldNotDeleteWorkspace: 'No se pudo eliminar el espacio de trabajo',
+ dashboardCouldNotOpen: 'No se pudo abrir el panel',
+ decksCouldNotLoad: 'No se pudieron cargar los mazos',
+ decksMayBeOutOfDate: 'Los mazos pueden estar desactualizados',
+ foldersCouldNotLoad: 'No se pudieron cargar las carpetas',
+ foldersMayBeOutOfDate: 'Las carpetas pueden estar desactualizadas',
+ workspaceCouldNotLoad: 'No se pudo cargar el espacio de trabajo',
+ },
+ labels: {
+ dashboard: 'Panel',
+ loadingDashboard: 'Cargando panel',
+ newItem: 'Nuevo elemento',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Fecha no disponible',
+ },
+ age: {
+ dayAgo_one: 'hace {{count}} día',
+ dayAgo_other: 'hace {{count}} días',
+ hourAgo_one: 'hace {{count}} hora',
+ hourAgo_other: 'hace {{count}} horas',
+ justNow: 'ahora mismo',
+ minuteAgo_one: 'hace {{count}} minuto',
+ minuteAgo_other: 'hace {{count}} minutos',
+ unavailable: 'fecha no disponible',
+ weekAgo_one: 'hace {{count}} semana',
+ weekAgo_other: 'hace {{count}} semanas',
+ },
+ labels: {
+ deleted: 'Eliminado {{value}}',
+ due: 'Vence: {{value}}',
+ reviewed: 'Repasado: {{value}}',
+ updated: 'Actualizado {{value}}',
+ updatedUppercase: 'ACTUALIZADO {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'hace {{count}} día',
+ dayAgo_other: 'hace {{count}} días',
+ inAMoment: 'En un momento',
+ inDay_one: 'En {{count}} día',
+ inDay_other: 'En {{count}} días',
+ inMonth_one: 'En {{count}} mes',
+ inMonth_other: 'En {{count}} meses',
+ inWeek_one: 'En {{count}} semana',
+ inWeek_other: 'En {{count}} semanas',
+ justNow: 'Ahora mismo',
+ monthAgo_one: 'hace {{count}} mes',
+ monthAgo_other: 'hace {{count}} meses',
+ secondsAgoShort: 'hace {{count}} s',
+ minutesAgoShort: 'hace {{count}} min',
+ hoursAgoShort: 'hace {{count}} h',
+ today: 'Hoy',
+ tomorrow: 'Mañana',
+ weekAgo_one: 'hace {{count}} semana',
+ weekAgo_other: 'hace {{count}} semanas',
+ yesterday: 'Ayer',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Acciones de {{title}}',
+ createDeck: 'Crear mazo',
+ createNote: 'Crear nota',
+ deleteDeck: 'Eliminar mazo',
+ editDeck: 'Editar mazo',
+ newNote: 'Nueva nota',
+ openDeck: 'Abrir mazo {{title}}',
+ saveDeck: 'No se pudo guardar el mazo',
+ studyNow: 'Estudiar ahora',
+ },
+ descriptions: {
+ emptyDeck: 'Añade una nota para que este mazo tenga material de repaso.',
+ editorDefault: 'Mazo de estudio enfocado.',
+ editorVisual: 'Elige un glifo de portada para este mazo.',
+ notesSearchPlaceholder: 'Buscar notas…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Esto mueve "{{title}}" a la Papelera. Puedes restaurarlo más tarde.',
+ deleteDeckFallbackDescription: 'Esto mueve este mazo a la Papelera. Puedes restaurarlo más tarde.',
+ deleteDeckFallbackTitle: '¿Eliminar mazo?',
+ deleteDeckTitle: '¿Eliminar "{{title}}"?',
+ deleteNoteDescription: 'Esto mueve "{{title}}" a la Papelera. Puedes restaurarla más tarde.',
+ deleteNoteFallbackTitle: '¿Eliminar nota?',
+ deleteNoteTitle: '¿Eliminar "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'No hay notas coincidentes',
+ noMatchingNotesDescription: 'Ninguna nota coincidió con "{{query}}".',
+ thisDeckIsEmpty: 'Este mazo está vacío',
+ },
+ errors: {
+ couldNotCreateDeck: 'No se pudo crear el mazo',
+ couldNotDeleteDeck: 'No se pudo eliminar el mazo',
+ couldNotDeleteNote: 'No se pudo eliminar la nota',
+ couldNotLoadFolderPath: 'No se pudo cargar la ruta de la carpeta',
+ couldNotSaveDeck: 'No se pudo guardar el mazo',
+ deckCouldNotLoad: 'No se pudo cargar el mazo',
+ notesCouldNotLoad: 'No se pudieron cargar las notas',
+ notesMayBeOutOfDate: 'Las notas pueden estar desactualizadas',
+ },
+ fields: {
+ descriptionLabel: 'Descripción del mazo',
+ descriptionPlaceholder: '¿Qué te ayudará a repasar este mazo?',
+ namePlaceholder: 'Nombre del mazo',
+ untitledDeck: 'Mazo sin título',
+ untitledDeckLower: 'mazo sin título',
+ },
+ labels: {
+ createDeckTitle: 'Crear mazo',
+ deck: 'Mazo',
+ deckNotesSearch: 'Búsqueda de notas del mazo',
+ deckOverview: 'Resumen del mazo',
+ decks: 'Mazos',
+ due: 'Vence',
+ dueToday: 'Vence hoy',
+ loadingDeck: 'Cargando mazo',
+ mastery: 'Dominio',
+ notes: 'Notas',
+ },
+ sort: {
+ ariaLabel: 'Ordenar mazos',
+ dueToday: 'Vence hoy',
+ title: 'Título',
+ updated: 'Actualizado',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Los datos cambiaron. Actualiza e inténtalo de nuevo.',
+ forbidden: 'No tienes permiso para hacer esto.',
+ notFound: 'No pudimos encontrar este elemento.',
+ offline: 'No se puede conectar con el servicio.',
+ timeout: 'Esto tardó demasiado. Inténtalo de nuevo.',
+ unauthorized: 'Inicia sesión para continuar.',
+ unavailable: 'El servicio no está disponible temporalmente.',
+ },
+ fallback: {
+ unexpected: 'Error inesperado',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Crear carpeta',
+ deleteFolder: 'Eliminar carpeta',
+ editFolder: 'Editar carpeta',
+ },
+ descriptions: {
+ editorDefault: 'Carpeta para mazos relacionados.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Esto mueve "{{name}}" a la Papelera. Puedes restaurarla más tarde.',
+ deleteFolderFallbackDescription: 'Esto mueve esta carpeta a la Papelera. Puedes restaurarla más tarde.',
+ deleteFolderFallbackTitle: '¿Eliminar carpeta?',
+ deleteFolderTitle: '¿Eliminar "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'No hay coincidencias en esta carpeta',
+ noMatchesInFolderDescription: 'Ninguna carpeta, mazo o nota coincidió con "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'No se pudo crear la carpeta',
+ couldNotDeleteFolder: 'No se pudo eliminar la carpeta',
+ couldNotLoadFolderPath: 'No se pudo cargar la ruta de la carpeta',
+ couldNotSaveFolder: 'No se pudo guardar la carpeta',
+ folderCouldNotLoad: 'No se pudo cargar la carpeta',
+ },
+ fields: {
+ descriptionLabel: 'Descripción de la carpeta',
+ descriptionPlaceholder: '¿Qué pertenece a esta carpeta?',
+ namePlaceholder: 'Nombre de la carpeta',
+ untitledFolder: 'Carpeta sin título',
+ },
+ labels: {
+ createFolderTitle: 'Crear carpeta',
+ folder: 'Carpeta',
+ folders: 'Carpetas',
+ loadingFolder: 'Cargando carpeta',
+ name: 'Nombre',
+ updated: 'Actualizado',
+ },
+ sort: {
+ ariaLabel: 'Ordenar carpetas',
+ name: 'Nombre',
+ updated: 'Actualizado',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Si los datos locales y sincronizados alguna vez difieren, el elemento aparecerá aquí.',
+ heading: 'Estado de sincronización',
+ title: 'Conflictos',
+ noConflicts: 'No se encontraron conflictos',
+ },
+ labels: {
+ menu: 'Menú',
+ },
+ sections: {
+ settings: {
+ description: 'Personaliza tu entorno y preferencias',
+ title: 'Ajustes',
+ },
+ trash: {
+ description: 'Restaura o elimina permanentemente elementos quitados',
+ title: 'Papelera',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Cerrar editor',
+ openActions: 'Abrir acciones',
+ openWorkspaces: 'Abrir espacios de trabajo',
+ },
+ items: {
+ home: 'Inicio',
+ menu: 'Menú',
+ primary: 'Principal',
+ settings: 'Ajustes',
+ spaces: 'Espacios',
+ trash: 'Papelera',
+ workspaces: 'Espacios de trabajo',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Añadir cloze',
+ deleteNote: 'Eliminar nota',
+ editNote: 'Editar nota',
+ hideDerivedCardsNote: 'Ocultar nota de tarjetas derivadas',
+ openNote: 'Abrir {{title}}',
+ saveNote: 'Guardar nota',
+ showDerivedCardsNote: 'Mostrar nota de tarjetas derivadas',
+ },
+ descriptions: {
+ clozeFormat: 'Cada parte oculta se convierte en una tarjeta de repaso al guardar.',
+ clozeFormatPrefix: 'Envuelve el texto oculto con',
+ derivedCardsHelper: 'Las notas son la fuente de verdad de las tarjetas derivadas.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Esto mueve "{{title}}" a la Papelera. Puedes restaurarla más tarde.',
+ deleteNoteFallbackDescription: 'Esto mueve esta nota a la Papelera. Puedes restaurarla más tarde.',
+ deleteNoteFallbackTitle: '¿Eliminar nota?',
+ deleteNoteTitle: '¿Eliminar "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'No se pudo crear la nota',
+ couldNotDeleteNote: 'No se pudo eliminar la nota',
+ couldNotSaveNote: 'No se pudo guardar la nota',
+ noteCouldNotLoad: 'No se pudo cargar la nota',
+ },
+ fields: {
+ back: 'Reverso',
+ backPlaceholder: 'Introduce el reverso',
+ bodyPlaceholder: 'Escribe el cuerpo de la nota con cloze deletions…',
+ front: 'Anverso',
+ frontPlaceholder: 'Introduce el anverso',
+ noteBody: 'Cuerpo de la nota',
+ title: 'Título',
+ titlePlaceholder: 'Añade un título de nota',
+ untitledCloze: 'Cloze sin título',
+ untitledNote: 'Nota sin título',
+ },
+ labels: {
+ backUppercase: 'REVERSO',
+ basic: 'Básica',
+ basicLower: 'básica',
+ basicUppercase: 'BÁSICA',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Formato cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Mazo',
+ derivedCards: 'TARJETAS DERIVADAS',
+ due: 'Vence',
+ frontUppercase: 'ANVERSO',
+ inProgress: 'En curso',
+ inProgressUppercase: 'EN CURSO',
+ loadingNote: 'Cargando nota',
+ loadingNoteEditor: 'Cargando editor de notas',
+ markdownFormatting: 'Formato Markdown',
+ mastered: 'Dominado',
+ masteredUppercase: 'DOMINADO',
+ newNote: 'Nueva nota',
+ noteBody: 'CUERPO DE LA NOTA',
+ noteContent: 'Contenido de la nota',
+ noteDetails: 'Detalles de la nota',
+ noteMetadata: 'Metadatos de la nota',
+ noteType: 'Tipo de nota',
+ notes: 'Notas',
+ reviewed: 'Repasado',
+ studyProgress: 'Progreso de estudio',
+ studyProgressUppercase: 'PROGRESO DE ESTUDIO',
+ titleUppercase: 'TÍTULO',
+ updated: 'Actualizado',
+ },
+ sort: {
+ ariaLabel: 'Ordenar notas',
+ title: 'Título',
+ updated: 'Actualizado',
+ },
+ toolbar: {
+ bold: 'Negrita',
+ italic: 'Cursiva',
+ link: 'Enlace',
+ list: 'Lista',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Otra vez',
+ backToDeck: 'Volver al mazo',
+ continueReview: 'Continuar repaso',
+ easy: 'Fácil',
+ good: 'Bien',
+ hard: 'Difícil',
+ newNote: 'Nueva nota',
+ showAnswer: 'Mostrar respuesta',
+ },
+ errors: {
+ couldNotGradeCard: 'No se pudo calificar la tarjeta',
+ reviewCouldNotLoad: 'No se pudo cargar el repaso',
+ reviewCouldNotStart: 'No se pudo iniciar el repaso',
+ summaryCouldNotLoad: 'No se pudo cargar el resumen del repaso',
+ summaryNotAvailable: 'El resumen del repaso no está disponible',
+ summaryNotComplete: 'Este repaso aún no está completo.',
+ },
+ labels: {
+ cardsReviewed: 'Tarjetas repasadas',
+ deck: 'Mazo',
+ duration: 'Duración',
+ loadingReview: 'Cargando repaso',
+ loadingSummary: 'Cargando resumen',
+ progress: 'Progreso del repaso',
+ review: 'Repaso',
+ reviewComplete: 'Repaso completo',
+ reviewed_one: '{{count}} repasada',
+ reviewed_other: '{{count}} repasadas',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Tu progreso se guardó en este mazo.',
+ },
+ unavailable: {
+ description: 'Añade una nota para que este mazo pueda entrar en la cola de repaso.',
+ title: 'No hay tarjetas para repasar',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Borrar búsqueda',
+ },
+ empty: {
+ noMatchesInWorkspace: 'No hay coincidencias en este espacio de trabajo',
+ noMatchesInWorkspaceDescription: 'Ninguna carpeta, mazo o nota coincidió con "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'No se pudo completar la búsqueda',
+ },
+ labels: {
+ results: 'Resultados de búsqueda',
+ resultsFor: 'Resultados para "{{query}}"',
+ searchingContent: 'Buscando contenido',
+ },
+ resultGroups: {
+ deck: 'Mazos',
+ folder: 'Carpetas',
+ note: 'Notas',
+ },
+ resultKinds: {
+ deck: 'mazo',
+ folder: 'carpeta',
+ note: 'nota',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Restablecer todos los ajustes',
+ resetSettings: 'Restablecer ajustes',
+ resetToDefaults: 'Restablecer valores predeterminados',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Pega un JSON válido con 21 valores numéricos.',
+ fsrsErrorInvalidParams_one: 'Introduce un array JSON con exactamente {{count}} número finito.',
+ fsrsErrorInvalidParams_other: 'Introduce un array JSON con exactamente {{count}} números finitos.',
+ fsrsHelper: 'Esta es una sobrescritura experta. Los valores deben mantenerse en orden.',
+ fsrsJsonLabel: 'JSON de parámetros FSRS',
+ fsrsTitle: 'Editar parámetros FSRS',
+ fsrsDescription: 'Pega un array JSON con 21 números para sobrescribir los pesos del scheduler.',
+ resetDescription: 'Esto restaura zona horaria, límites de estudio y ajustes de FSRS.',
+ resetDescriptionWithLanguage: 'Esto restaura idioma, zona horaria, límites de estudio y ajustes de FSRS.',
+ resetTitle: '¿Restablecer todos los ajustes?',
+ timezoneDescription: 'Busca una ciudad o identificador de zona horaria.',
+ timezoneSearchLabel: 'Buscar zonas horarias',
+ timezoneSearchPlaceholder: 'Buscar zonas horarias…',
+ timezoneTitle: 'Elegir zona horaria',
+ },
+ errors: {
+ couldNotResetSettings: 'No se pudieron restablecer los ajustes',
+ couldNotSaveSettings: 'No se pudieron guardar los ajustes',
+ settingsCouldNotLoad: 'No se pudieron cargar los ajustes',
+ settingsUnavailable: 'Los ajustes no están disponibles.',
+ },
+ labels: {
+ appearance: 'Apariencia',
+ automatic: 'Automático',
+ fsrsParameters: 'Parámetros FSRS',
+ general: 'General',
+ language: 'Idioma',
+ loadingSettings: 'Cargando ajustes',
+ masteryHorizon: 'Horizonte de dominio',
+ newCardOrder: 'Orden de tarjetas nuevas',
+ newCardsPerDay: 'Tarjetas nuevas por día',
+ reviewCardsPerDay: 'Tarjetas de repaso por día',
+ savingSettings: 'Guardando ajustes',
+ schedule: 'Programación',
+ searchNoTimezones: 'No hay zonas horarias coincidentes.',
+ settings: 'Ajustes',
+ settingsReset: 'Ajustes restablecidos',
+ study: 'Estudio',
+ targetRecallProbability: 'Probabilidad de recuerdo objetivo',
+ theme: 'Tema',
+ timezone: 'Zona horaria',
+ },
+ options: {
+ languageEnUs: 'Inglés (EE. UU.)',
+ newCardsAfterReviews: 'Después de los repasos',
+ newCardsBeforeReviews: 'Antes de los repasos',
+ newCardsMixed: 'Mezcladas',
+ themeDark: 'Oscuro',
+ themeLight: 'Claro',
+ themeSystem: 'Sistema',
+ timezoneSystem: 'Usar zona horaria del sistema',
+ },
+ rows: {
+ fsrsDescription: 'Pesos del modelo experto',
+ languageDescription: 'Idioma de la interfaz',
+ masteryHorizonDescription: 'Días que una tarjeta debe permanecer recordable al objetivo o por encima de él para contar como dominada',
+ newCardOrderDescription: 'Orden de tarjetas nuevas respecto a los repasos',
+ newCardsPerDayDescription: 'Máximo de tarjetas nuevas por día',
+ reviewCardsPerDayDescription: 'Máximo de tarjetas de repaso por día',
+ targetRecallProbabilityDescription: 'Probabilidad mínima de recuerdo en el próximo repaso programado',
+ timezoneDescription: 'Usa la zona horaria automática o elige una ciudad.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Eliminar permanentemente',
+ empty: 'Vaciar',
+ emptyTrash: 'Vaciar papelera',
+ restore: 'Restaurar',
+ restoringItem: 'Restaurando {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Esto elimina permanentemente "{{title}}". No se puede deshacer.',
+ deleteItemFallbackDescription: 'Esto elimina permanentemente este elemento. No se puede deshacer.',
+ deleteItemFallbackTitle: '¿Eliminar elemento?',
+ deleteItemTitle: '¿Eliminar "{{title}}"?',
+ emptyTrashDescription: 'Esto elimina permanentemente todo lo que está en la Papelera. No se puede deshacer.',
+ emptyTrashTitle: '¿Vaciar papelera?',
+ },
+ empty: {
+ description: 'Los elementos que elimines aparecerán aquí antes de su eliminación permanente.',
+ title: 'La Papelera está vacía',
+ },
+ errors: {
+ couldNotDeleteItem: 'No se pudo eliminar el elemento',
+ couldNotEmptyTrash: 'No se pudo vaciar la Papelera',
+ couldNotRestoreItem: 'No se pudo restaurar el elemento',
+ trashCouldNotLoad: 'No se pudo cargar la Papelera',
+ trashMayBeOutOfDate: 'La Papelera puede estar desactualizada',
+ },
+ labels: {
+ deletedAge: 'Eliminado {{value}}',
+ itemCount_one: '{{count}} elemento',
+ itemCount_other: '{{count}} elementos',
+ lastEmptied: 'Vaciada por última vez {{value}}',
+ loadingTrash: 'Cargando Papelera',
+ originalLocation: 'Ubicación original: {{location}}',
+ title: 'Papelera',
+ trashActions: 'Acciones de Papelera para {{title}}',
+ },
+ kinds: {
+ deck: 'Mazo',
+ folder: 'Carpeta',
+ note: 'Nota',
+ workspace: 'Espacio de trabajo',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Crear espacio de trabajo',
+ deleteWorkspace: 'Eliminar espacio de trabajo',
+ editWorkspace: 'Editar espacio de trabajo',
+ newWorkspace: 'Nuevo espacio de trabajo',
+ openWorkspace: 'Abrir {{title}}',
+ openingWorkspace: 'Abriendo {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Contexto de estudio.',
+ editorVisual: 'Elige un ancla visual para este espacio de trabajo.',
+ emptyList: 'Separa mazos, notas y colas de repaso por contexto de estudio.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Esto mueve "{{title}}" a la Papelera. Puedes restaurarlo más tarde.',
+ deleteWorkspaceFallbackDescription: 'Esto mueve este espacio de trabajo a la Papelera. Puedes restaurarlo más tarde.',
+ deleteWorkspaceFallbackTitle: '¿Eliminar espacio de trabajo?',
+ deleteWorkspaceTitle: '¿Eliminar "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Empieza con un espacio de trabajo',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'No se pudo crear el espacio de trabajo',
+ couldNotDeleteWorkspace: 'No se pudo eliminar el espacio de trabajo',
+ couldNotOpenWorkspace: 'No se pudo abrir el espacio de trabajo',
+ couldNotSaveWorkspace: 'No se pudo guardar el espacio de trabajo',
+ workspaceCouldNotLoad: 'No se pudo cargar el espacio de trabajo',
+ workspacesCouldNotLoad: 'No se pudieron cargar los espacios de trabajo',
+ },
+ fields: {
+ descriptionLabel: 'Descripción del espacio de trabajo',
+ descriptionPlaceholder: '¿Qué pertenece a este espacio de trabajo?',
+ namePlaceholder: 'Nombre del espacio de trabajo',
+ untitledWorkspace: 'Espacio de trabajo sin título',
+ },
+ labels: {
+ createWorkspaceTitle: 'Crear espacio de trabajo',
+ loadingWorkspaces: 'Cargando espacios de trabajo',
+ workspace: 'Espacio de trabajo',
+ workspaces: 'Espacios de trabajo',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/et.ts b/ui/src/core/i18n/resources/et.ts
new file mode 100644
index 0000000..0a71d5c
--- /dev/null
+++ b/ui/src/core/i18n/resources/et.ts
@@ -0,0 +1,623 @@
+export const et = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Proovi uuesti. Kui see jätkub, ava Clear uuesti.',
+ title: 'Käivitamine nurjus',
+ },
+ loadingTitle: 'Õpperuumi ettevalmistamine',
+ },
+ common: {
+ actions: {
+ back: 'Tagasi',
+ cancel: 'Tühista',
+ checkAgain: 'Kontrolli uuesti',
+ close: 'Sulge',
+ create: 'Loo',
+ delete: 'Kustuta',
+ dismissError: 'Sulge tõrge',
+ dismissStatus: 'Sulge olek',
+ edit: 'Muuda',
+ itemActions: '{{title}} toimingud',
+ reset: 'Lähtesta',
+ review: 'Korda',
+ save: 'Salvesta',
+ saveChanges: 'Salvesta muudatused',
+ tryAgain: 'Proovi uuesti',
+ },
+ labels: {
+ active: 'Aktiivne',
+ clear: 'Clear',
+ custom: 'Kohandatud',
+ default: 'Vaikimisi',
+ loadingEditor: 'Redaktori laadimine',
+ name: 'Nimi',
+ completedTask: 'Lõpetatud ülesanne',
+ description: 'Kirjeldus',
+ incompleteTask: 'Lõpetamata ülesanne',
+ percentageInput: '{{label}} protsent',
+ visual: 'Visuaal',
+ },
+ status: {
+ actionFailed: 'Toiming nurjus',
+ actionInProgress: 'Toiming on pooleli',
+ },
+ sort: {
+ ascending: 'Kasvav',
+ column: 'Veerg',
+ descending: 'Kahanev',
+ direction: 'Suund',
+ sort: 'Sordi',
+ },
+ search: {
+ label: 'Otsing',
+ },
+ visualPicker: {
+ allLucideIcons: 'Kõik Lucide ikoonid',
+ browseIconsFor: 'Sirvi või otsi ikoone: {{label}}.',
+ chooseIcon: 'Vali ikoon',
+ iconPicker: '{{label}} ikoonivalija',
+ iconSearch: '{{label}} ikooniotsing',
+ iconsCouldNotLoad: 'Ikoone ei saanud laadida.',
+ loadingIcons: 'Ikoonide laadimine',
+ loadingMoreIcons: 'Rohkemate ikoonide laadimine',
+ moreIcons: 'Rohkem ikoone',
+ noIconsMatch: 'Ükski ikoon ei vasta otsingule "{{query}}".',
+ searchIconsPlaceholder: 'Otsi ikoone…',
+ selectedIcon: 'Valitud {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Loo',
+ newDeck: 'Uus pakk',
+ newFolder: 'Uus kaust',
+ },
+ descriptions: {
+ defaultWorkspace: 'Hoia pakid, kaustad ja märkmed koos.',
+ emptyWorkspace: 'Loo pakk ja lisa seejärel märkmeid, et ehitada kordamisjärjekord.',
+ emptyFolder: 'Loo pakk ja lisa seejärel märkmeid, et ehitada kordamisjärjekord.',
+ searchPlaceholder: 'Otsi kaustu, pakke ja märkmeid…',
+ },
+ empty: {
+ createFirstDeck: 'Loo oma esimene pakk',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Pakki ei saanud kustutada',
+ couldNotDeleteFolder: 'Kausta ei saanud kustutada',
+ couldNotDeleteWorkspace: 'Tööruumi ei saanud kustutada',
+ dashboardCouldNotOpen: 'Töölauda ei saanud avada',
+ decksCouldNotLoad: 'Pakke ei saanud laadida',
+ decksMayBeOutOfDate: 'Pakid võivad olla aegunud',
+ foldersCouldNotLoad: 'Kaustu ei saanud laadida',
+ foldersMayBeOutOfDate: 'Kaustad võivad olla aegunud',
+ workspaceCouldNotLoad: 'Tööruumi ei saanud laadida',
+ },
+ labels: {
+ dashboard: 'Töölaud',
+ loadingDashboard: 'Töölaua laadimine',
+ newItem: 'Uus üksus',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Kuupäev pole saadaval',
+ },
+ age: {
+ dayAgo_one: '{{count}} päev tagasi',
+ dayAgo_other: '{{count}} päeva tagasi',
+ hourAgo_one: '{{count}} tund tagasi',
+ hourAgo_other: '{{count}} tundi tagasi',
+ justNow: 'just praegu',
+ minuteAgo_one: '{{count}} minut tagasi',
+ minuteAgo_other: '{{count}} minutit tagasi',
+ unavailable: 'kuupäev pole saadaval',
+ weekAgo_one: '{{count}} nädal tagasi',
+ weekAgo_other: '{{count}} nädalat tagasi',
+ },
+ labels: {
+ deleted: 'Kustutatud {{value}}',
+ due: 'Tähtaeg: {{value}}',
+ reviewed: 'Korratud: {{value}}',
+ updated: 'Uuendatud {{value}}',
+ updatedUppercase: 'UUENDATUD {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} päev tagasi',
+ dayAgo_other: '{{count}} päeva tagasi',
+ inAMoment: 'Hetke pärast',
+ inDay_one: '{{count}} päeva pärast',
+ inDay_other: '{{count}} päeva pärast',
+ inMonth_one: '{{count}} kuu pärast',
+ inMonth_other: '{{count}} kuu pärast',
+ inWeek_one: '{{count}} nädala pärast',
+ inWeek_other: '{{count}} nädala pärast',
+ justNow: 'Just praegu',
+ monthAgo_one: '{{count}} kuu tagasi',
+ monthAgo_other: '{{count}} kuud tagasi',
+ secondsAgoShort: '{{count}} s tagasi',
+ minutesAgoShort: '{{count}} min tagasi',
+ hoursAgoShort: '{{count}} h tagasi',
+ today: 'Täna',
+ tomorrow: 'Homme',
+ weekAgo_one: '{{count}} nädal tagasi',
+ weekAgo_other: '{{count}} nädalat tagasi',
+ yesterday: 'Eile',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: '{{title}} toimingud',
+ createDeck: 'Loo pakk',
+ createNote: 'Loo märge',
+ deleteDeck: 'Kustuta pakk',
+ editDeck: 'Muuda pakki',
+ newNote: 'Uus märge',
+ openDeck: 'Ava pakk {{title}}',
+ saveDeck: 'Pakki ei saanud salvestada',
+ studyNow: 'Õpi kohe',
+ },
+ descriptions: {
+ emptyDeck: 'Lisa märge, et sellel pakil oleks kordamiseks materjali.',
+ editorDefault: 'Fookustatud õppepakk.',
+ editorVisual: 'Vali selle paki kaanesümbol.',
+ notesSearchPlaceholder: 'Otsi märkmeid…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'See teisaldab "{{title}}" prügikasti. Saad selle hiljem taastada.',
+ deleteDeckFallbackDescription: 'See teisaldab selle paki prügikasti. Saad selle hiljem taastada.',
+ deleteDeckFallbackTitle: 'Kas kustutada pakk?',
+ deleteDeckTitle: 'Kas kustutada "{{title}}"?',
+ deleteNoteDescription: 'See teisaldab "{{title}}" prügikasti. Saad selle hiljem taastada.',
+ deleteNoteFallbackTitle: 'Kas kustutada märge?',
+ deleteNoteTitle: 'Kas kustutada "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Sobivaid märkmeid pole',
+ noMatchingNotesDescription: 'Ükski märge ei vastanud otsingule "{{query}}".',
+ thisDeckIsEmpty: 'See pakk on tühi',
+ },
+ errors: {
+ couldNotCreateDeck: 'Pakki ei saanud luua',
+ couldNotDeleteDeck: 'Pakki ei saanud kustutada',
+ couldNotDeleteNote: 'Märget ei saanud kustutada',
+ couldNotLoadFolderPath: 'Kaustateed ei saanud laadida',
+ couldNotSaveDeck: 'Pakki ei saanud salvestada',
+ deckCouldNotLoad: 'Pakki ei saanud laadida',
+ notesCouldNotLoad: 'Märkmeid ei saanud laadida',
+ notesMayBeOutOfDate: 'Märkmed võivad olla aegunud',
+ },
+ fields: {
+ descriptionLabel: 'Paki kirjeldus',
+ descriptionPlaceholder: 'Mida see pakk aitab sul korrata?',
+ namePlaceholder: 'Paki nimi',
+ untitledDeck: 'Pealkirjata pakk',
+ untitledDeckLower: 'pealkirjata pakk',
+ },
+ labels: {
+ createDeckTitle: 'Loo pakk',
+ deck: 'Pakk',
+ deckNotesSearch: 'Paki märkmete otsing',
+ deckOverview: 'Paki ülevaade',
+ decks: 'Pakid',
+ due: 'Tähtaeg',
+ dueToday: 'Tähtaeg täna',
+ loadingDeck: 'Paki laadimine',
+ mastery: 'Omandamine',
+ notes: 'Märkmed',
+ },
+ sort: {
+ ariaLabel: 'Sordi pakke',
+ dueToday: 'Tähtaeg täna',
+ title: 'Pealkiri',
+ updated: 'Uuendatud',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Andmed muutusid. Värskenda ja proovi uuesti.',
+ forbidden: 'Sul pole luba seda teha.',
+ notFound: 'Me ei leidnud seda üksust.',
+ offline: 'Teenusega ei saa ühendust.',
+ timeout: 'See võttis liiga kaua aega. Proovi uuesti.',
+ unauthorized: 'Jätkamiseks logi sisse.',
+ unavailable: 'Teenus pole ajutiselt saadaval.',
+ },
+ fallback: {
+ unexpected: 'Ootamatu tõrge',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Loo kaust',
+ deleteFolder: 'Kustuta kaust',
+ editFolder: 'Muuda kausta',
+ },
+ descriptions: {
+ editorDefault: 'Kaust seotud pakkide jaoks.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'See teisaldab "{{name}}" prügikasti. Saad selle hiljem taastada.',
+ deleteFolderFallbackDescription: 'See teisaldab selle kausta prügikasti. Saad selle hiljem taastada.',
+ deleteFolderFallbackTitle: 'Kas kustutada kaust?',
+ deleteFolderTitle: 'Kas kustutada "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Selles kaustas vasteid pole',
+ noMatchesInFolderDescription: 'Ükski kaust, pakk ega märge ei vastanud otsingule "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Kausta ei saanud luua',
+ couldNotDeleteFolder: 'Kausta ei saanud kustutada',
+ couldNotLoadFolderPath: 'Kaustateed ei saanud laadida',
+ couldNotSaveFolder: 'Kausta ei saanud salvestada',
+ folderCouldNotLoad: 'Kausta ei saanud laadida',
+ },
+ fields: {
+ descriptionLabel: 'Kausta kirjeldus',
+ descriptionPlaceholder: 'Mis sellesse kausta kuulub?',
+ namePlaceholder: 'Kausta nimi',
+ untitledFolder: 'Pealkirjata kaust',
+ },
+ labels: {
+ createFolderTitle: 'Loo kaust',
+ folder: 'Kaust',
+ folders: 'Kaustad',
+ loadingFolder: 'Kausta laadimine',
+ name: 'Nimi',
+ updated: 'Uuendatud',
+ },
+ sort: {
+ ariaLabel: 'Sordi kaustu',
+ name: 'Nimi',
+ updated: 'Uuendatud',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Kui kohalikud ja sünkroonitud andmed kunagi ei kattu, kuvatakse üksus siin.',
+ heading: 'Sünkroonimise olek',
+ title: 'Konfliktid',
+ noConflicts: 'Konflikte ei leitud',
+ },
+ labels: {
+ menu: 'Menüü',
+ },
+ sections: {
+ settings: {
+ description: 'Kohanda oma keskkonda ja eelistusi',
+ title: 'Seaded',
+ },
+ trash: {
+ description: 'Taasta või kustuta eemaldatud üksused jäädavalt',
+ title: 'Prügikast',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Sulge redaktor',
+ openActions: 'Ava toimingud',
+ openWorkspaces: 'Ava tööruumid',
+ },
+ items: {
+ home: 'Avaleht',
+ menu: 'Menüü',
+ primary: 'Peamine',
+ settings: 'Seaded',
+ spaces: 'Ruumid',
+ trash: 'Prügikast',
+ workspaces: 'Tööruumid',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Lisa cloze',
+ deleteNote: 'Kustuta märge',
+ editNote: 'Muuda märget',
+ hideDerivedCardsNote: 'Peida tuletatud kaartide märkus',
+ openNote: 'Ava {{title}}',
+ saveNote: 'Salvesta märge',
+ showDerivedCardsNote: 'Kuva tuletatud kaartide märkus',
+ },
+ descriptions: {
+ clozeFormat: 'Iga peidetud osa muutub salvestamisel kordamiskaardiks.',
+ clozeFormatPrefix: 'Ümbritse peidetud tekst märgendiga',
+ derivedCardsHelper: 'Märkmed on tuletatud kaartide tõeallikas.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'See teisaldab "{{title}}" prügikasti. Saad selle hiljem taastada.',
+ deleteNoteFallbackDescription: 'See teisaldab selle märkme prügikasti. Saad selle hiljem taastada.',
+ deleteNoteFallbackTitle: 'Kas kustutada märge?',
+ deleteNoteTitle: 'Kas kustutada "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Märget ei saanud luua',
+ couldNotDeleteNote: 'Märget ei saanud kustutada',
+ couldNotSaveNote: 'Märget ei saanud salvestada',
+ noteCouldNotLoad: 'Märget ei saanud laadida',
+ },
+ fields: {
+ back: 'Tagakülg',
+ backPlaceholder: 'Sisesta tagakülg',
+ bodyPlaceholder: 'Kirjuta märkme sisu cloze-kustutustega…',
+ front: 'Esikülg',
+ frontPlaceholder: 'Sisesta esikülg',
+ noteBody: 'Märkme sisu',
+ title: 'Pealkiri',
+ titlePlaceholder: 'Lisa märkme pealkiri',
+ untitledCloze: 'Pealkirjata cloze',
+ untitledNote: 'Pealkirjata märge',
+ },
+ labels: {
+ backUppercase: 'TAGAKÜLG',
+ basic: 'Tavaline',
+ basicLower: 'tavaline',
+ basicUppercase: 'TAVALINE',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze-vorming',
+ clozeUppercase: 'CLOZE',
+ deck: 'Pakk',
+ derivedCards: 'TULETATUD KAARDID',
+ due: 'Tähtaeg',
+ frontUppercase: 'ESIKÜLG',
+ inProgress: 'Pooleli',
+ inProgressUppercase: 'POOLELI',
+ loadingNote: 'Märkme laadimine',
+ loadingNoteEditor: 'Märkmeredaktori laadimine',
+ markdownFormatting: 'Markdown-vormindus',
+ mastered: 'Omandatud',
+ masteredUppercase: 'OMANDATUD',
+ newNote: 'Uus märge',
+ noteBody: 'MÄRKME SISU',
+ noteContent: 'Märkme sisu',
+ noteDetails: 'Märkme üksikasjad',
+ noteMetadata: 'Märkme metaandmed',
+ noteType: 'Märkme tüüp',
+ notes: 'Märkmed',
+ reviewed: 'Korratud',
+ studyProgress: 'Õppimise edenemine',
+ studyProgressUppercase: 'ÕPPIMISE EDENEMINE',
+ titleUppercase: 'PEALKIRI',
+ updated: 'Uuendatud',
+ },
+ sort: {
+ ariaLabel: 'Sordi märkmeid',
+ title: 'Pealkiri',
+ updated: 'Uuendatud',
+ },
+ toolbar: {
+ bold: 'Paks kiri',
+ italic: 'Kaldkiri',
+ link: 'Link',
+ list: 'Loend',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Uuesti',
+ backToDeck: 'Tagasi paki juurde',
+ continueReview: 'Jätka kordamist',
+ easy: 'Lihtne',
+ good: 'Hea',
+ hard: 'Raske',
+ newNote: 'Uus märge',
+ showAnswer: 'Näita vastust',
+ },
+ errors: {
+ couldNotGradeCard: 'Kaarti ei saanud hinnata',
+ reviewCouldNotLoad: 'Kordamist ei saanud laadida',
+ reviewCouldNotStart: 'Kordamist ei saanud alustada',
+ summaryCouldNotLoad: 'Kordamise kokkuvõtet ei saanud laadida',
+ summaryNotAvailable: 'Kordamise kokkuvõte pole saadaval',
+ summaryNotComplete: 'See kordamine pole veel lõpetatud.',
+ },
+ labels: {
+ cardsReviewed: 'Korratud kaardid',
+ deck: 'Pakk',
+ duration: 'Kestus',
+ loadingReview: 'Kordamise laadimine',
+ loadingSummary: 'Kokkuvõtte laadimine',
+ progress: 'Kordamise edenemine',
+ review: 'Kordamine',
+ reviewComplete: 'Kordamine lõpetatud',
+ reviewed_one: 'Korratud {{count}}',
+ reviewed_other: 'Korratud {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Sinu edenemine salvestati sellesse pakki.',
+ },
+ unavailable: {
+ description: 'Lisa märge, et see pakk saaks kordamisjärjekorda minna.',
+ title: 'Kordamiseks pole kaarte',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Tühjenda otsing',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Selles tööruumis vasteid pole',
+ noMatchesInWorkspaceDescription: 'Ükski kaust, pakk ega märge ei vastanud otsingule "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Otsingut ei saanud lõpetada',
+ },
+ labels: {
+ results: 'Otsingutulemused',
+ resultsFor: 'Tulemused otsingule "{{query}}"',
+ searchingContent: 'Sisu otsimine',
+ },
+ resultGroups: {
+ deck: 'Pakid',
+ folder: 'Kaustad',
+ note: 'Märkmed',
+ },
+ resultKinds: {
+ deck: 'pakk',
+ folder: 'kaust',
+ note: 'märge',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Lähtesta kõik seaded',
+ resetSettings: 'Lähtesta seaded',
+ resetToDefaults: 'Taasta vaikeväärtused',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Kleebi kehtiv JSON 21 arvväärtusega.',
+ fsrsErrorInvalidParams_one: 'Sisesta JSON-massiiv täpselt {{count}} lõpliku arvuga.',
+ fsrsErrorInvalidParams_other: 'Sisesta JSON-massiiv täpselt {{count}} lõpliku arvuga.',
+ fsrsHelper: 'See on eksperdi ülekirjutus. Väärtused peavad jääma järjekorda.',
+ fsrsJsonLabel: 'FSRS-i parameetrite JSON',
+ fsrsTitle: 'Muuda FSRS-i parameetreid',
+ fsrsDescription: 'Kleebi 21 arvuga JSON-massiiv, et ajastaja kaalud üle kirjutada.',
+ resetDescription: 'See taastab ajavööndi, õppepiirangud ja FSRS-i seaded.',
+ resetDescriptionWithLanguage: 'See taastab keele, ajavööndi, õppepiirangud ja FSRS-i seaded.',
+ resetTitle: 'Kas lähtestada kõik seaded?',
+ timezoneDescription: 'Otsi linna või ajavööndi identifikaatorit.',
+ timezoneSearchLabel: 'Otsi ajavööndeid',
+ timezoneSearchPlaceholder: 'Otsi ajavööndeid…',
+ timezoneTitle: 'Vali ajavöönd',
+ },
+ errors: {
+ couldNotResetSettings: 'Seadeid ei saanud lähtestada',
+ couldNotSaveSettings: 'Seadeid ei saanud salvestada',
+ settingsCouldNotLoad: 'Seadeid ei saanud laadida',
+ settingsUnavailable: 'Seaded pole saadaval.',
+ },
+ labels: {
+ appearance: 'Välimus',
+ automatic: 'Automaatne',
+ fsrsParameters: 'FSRS-i parameetrid',
+ general: 'Üldine',
+ language: 'Keel',
+ loadingSettings: 'Seadete laadimine',
+ masteryHorizon: 'Omandamise horisont',
+ newCardOrder: 'Uute kaartide järjekord',
+ newCardsPerDay: 'Uusi kaarte päevas',
+ reviewCardsPerDay: 'Kordamiskaarte päevas',
+ savingSettings: 'Seadete salvestamine',
+ schedule: 'Ajakava',
+ searchNoTimezones: 'Sobivaid ajavööndeid pole.',
+ settings: 'Seaded',
+ settingsReset: 'Seaded lähtestatud',
+ study: 'Õppimine',
+ targetRecallProbability: 'Sihtmeenutuse tõenäosus',
+ theme: 'Teema',
+ timezone: 'Ajavöönd',
+ },
+ options: {
+ languageEnUs: 'Inglise (USA)',
+ newCardsAfterReviews: 'Pärast kordamisi',
+ newCardsBeforeReviews: 'Enne kordamisi',
+ newCardsMixed: 'Segatud',
+ themeDark: 'Tume',
+ themeLight: 'Hele',
+ themeSystem: 'Süsteem',
+ timezoneSystem: 'Kasuta süsteemi ajavööndit',
+ },
+ rows: {
+ fsrsDescription: 'Ekspertmudeli kaalud',
+ languageDescription: 'Liidese keel',
+ masteryHorizonDescription: 'Päevade arv, mille jooksul kaart peab püsima meelde tuletatav sihttõenäosusel või sellest kõrgemal, et seda loetaks omandatuks',
+ newCardOrderDescription: 'Uute kaartide järjekord kordamiste suhtes',
+ newCardsPerDayDescription: 'Maksimaalne uute kaartide arv päevas',
+ reviewCardsPerDayDescription: 'Maksimaalne kordamiskaartide arv päevas',
+ targetRecallProbabilityDescription: 'Minimaalne meenutamise tõenäosus järgmisel ajastatud kordamisel',
+ timezoneDescription: 'Kasuta automaatset ajavööndit või vali linn.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Kustuta jäädavalt',
+ empty: 'Tühjenda',
+ emptyTrash: 'Tühjenda prügikast',
+ restore: 'Taasta',
+ restoringItem: '{{title}} taastamine',
+ },
+ dialogs: {
+ deleteItemDescription: 'See kustutab "{{title}}" jäädavalt. Seda ei saa tagasi võtta.',
+ deleteItemFallbackDescription: 'See kustutab selle üksuse jäädavalt. Seda ei saa tagasi võtta.',
+ deleteItemFallbackTitle: 'Kas kustutada üksus?',
+ deleteItemTitle: 'Kas kustutada "{{title}}"?',
+ emptyTrashDescription: 'See kustutab kõik prügikastis oleva jäädavalt. Seda ei saa tagasi võtta.',
+ emptyTrashTitle: 'Kas tühjendada prügikast?',
+ },
+ empty: {
+ description: 'Kustutatud üksused ilmuvad siia enne jäädavat eemaldamist.',
+ title: 'Prügikast on tühi',
+ },
+ errors: {
+ couldNotDeleteItem: 'Üksust ei saanud kustutada',
+ couldNotEmptyTrash: 'Prügikasti ei saanud tühjendada',
+ couldNotRestoreItem: 'Üksust ei saanud taastada',
+ trashCouldNotLoad: 'Prügikasti ei saanud laadida',
+ trashMayBeOutOfDate: 'Prügikast võib olla aegunud',
+ },
+ labels: {
+ deletedAge: 'Kustutatud {{value}}',
+ itemCount_one: '{{count}} üksus',
+ itemCount_other: '{{count}} üksust',
+ lastEmptied: 'Viimati tühjendatud {{value}}',
+ loadingTrash: 'Prügikasti laadimine',
+ originalLocation: 'Algne asukoht: {{location}}',
+ title: 'Prügikast',
+ trashActions: '{{title}} prügikasti toimingud',
+ },
+ kinds: {
+ deck: 'Pakk',
+ folder: 'Kaust',
+ note: 'Märge',
+ workspace: 'Tööruum',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Loo tööruum',
+ deleteWorkspace: 'Kustuta tööruum',
+ editWorkspace: 'Muuda tööruumi',
+ newWorkspace: 'Uus tööruum',
+ openWorkspace: 'Ava {{title}}',
+ openingWorkspace: '{{title}} avamine',
+ },
+ descriptions: {
+ editorDefault: 'Õppekontekst.',
+ editorVisual: 'Vali selle tööruumi visuaalne ankur.',
+ emptyList: 'Eralda pakid, märkmed ja kordamisjärjekorrad õppekonteksti järgi.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'See teisaldab "{{title}}" prügikasti. Saad selle hiljem taastada.',
+ deleteWorkspaceFallbackDescription: 'See teisaldab selle tööruumi prügikasti. Saad selle hiljem taastada.',
+ deleteWorkspaceFallbackTitle: 'Kas kustutada tööruum?',
+ deleteWorkspaceTitle: 'Kas kustutada "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Alusta tööruumiga',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Tööruumi ei saanud luua',
+ couldNotDeleteWorkspace: 'Tööruumi ei saanud kustutada',
+ couldNotOpenWorkspace: 'Tööruumi ei saanud avada',
+ couldNotSaveWorkspace: 'Tööruumi ei saanud salvestada',
+ workspaceCouldNotLoad: 'Tööruumi ei saanud laadida',
+ workspacesCouldNotLoad: 'Tööruume ei saanud laadida',
+ },
+ fields: {
+ descriptionLabel: 'Tööruumi kirjeldus',
+ descriptionPlaceholder: 'Mis sellesse tööruumi kuulub?',
+ namePlaceholder: 'Tööruumi nimi',
+ untitledWorkspace: 'Pealkirjata tööruum',
+ },
+ labels: {
+ createWorkspaceTitle: 'Loo tööruum',
+ loadingWorkspaces: 'Tööruumide laadimine',
+ workspace: 'Tööruum',
+ workspaces: 'Tööruumid',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/fa.ts b/ui/src/core/i18n/resources/fa.ts
new file mode 100644
index 0000000..667267b
--- /dev/null
+++ b/ui/src/core/i18n/resources/fa.ts
@@ -0,0 +1,623 @@
+export const fa = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'دوباره تلاش کنید. اگر این مشکل ادامه داشت، Clear را دوباره باز کنید.',
+ title: 'شروع نشد',
+ },
+ loadingTitle: 'در حال آماده کردن فضای مطالعه شما',
+ },
+ common: {
+ actions: {
+ back: 'بازگشت',
+ cancel: 'لغو',
+ checkAgain: 'بررسی دوباره',
+ close: 'بستن',
+ create: 'ایجاد',
+ delete: 'حذف',
+ dismissError: 'بستن خطا',
+ dismissStatus: 'بستن وضعیت',
+ edit: 'ویرایش',
+ itemActions: 'اقدامهای {{title}}',
+ reset: 'بازنشانی',
+ review: 'مرور',
+ save: 'ذخیره',
+ saveChanges: 'ذخیره تغییرات',
+ tryAgain: 'تلاش دوباره',
+ },
+ labels: {
+ active: 'فعال',
+ clear: 'Clear',
+ custom: 'سفارشی',
+ default: 'پیشفرض',
+ loadingEditor: 'در حال بارگیری ویرایشگر',
+ name: 'نام',
+ completedTask: 'کار تکمیلشده',
+ description: 'توضیحات',
+ incompleteTask: 'کار ناتمام',
+ percentageInput: 'درصد {{label}}',
+ visual: 'نمایه',
+ },
+ status: {
+ actionFailed: 'اقدام ناموفق بود',
+ actionInProgress: 'اقدام در حال انجام است',
+ },
+ sort: {
+ ascending: 'صعودی',
+ column: 'ستون',
+ descending: 'نزولی',
+ direction: 'جهت',
+ sort: 'مرتبسازی',
+ },
+ search: {
+ label: 'جستجو',
+ },
+ visualPicker: {
+ allLucideIcons: 'همه آیکنهای Lucide',
+ browseIconsFor: 'آیکنهای {{label}} را مرور یا جستجو کنید.',
+ chooseIcon: 'انتخاب آیکن',
+ iconPicker: 'انتخابگر آیکن {{label}}',
+ iconSearch: 'جستجوی آیکن {{label}}',
+ iconsCouldNotLoad: 'آیکنها بارگیری نشدند.',
+ loadingIcons: 'در حال بارگیری آیکنها',
+ loadingMoreIcons: 'در حال بارگیری آیکنهای بیشتر',
+ moreIcons: 'آیکنهای بیشتر',
+ noIconsMatch: 'هیچ آیکنی با "{{query}}" مطابقت ندارد.',
+ searchIconsPlaceholder: 'جستجوی آیکنها…',
+ selectedIcon: '{{label}} انتخابشده',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'ایجاد',
+ newDeck: 'دسته جدید',
+ newFolder: 'پوشه جدید',
+ },
+ descriptions: {
+ defaultWorkspace: 'دستهها، پوشهها و یادداشتها را کنار هم نگه دارید.',
+ emptyWorkspace: 'یک دسته بسازید، سپس یادداشت اضافه کنید تا صف مرور را شکل دهید.',
+ emptyFolder: 'یک دسته بسازید، سپس یادداشت اضافه کنید تا صف مرور شکل بگیرد.',
+ searchPlaceholder: 'جستجو در پوشهها، دستهها و یادداشتها…',
+ },
+ empty: {
+ createFirstDeck: 'اولین دسته خود را بسازید',
+ },
+ errors: {
+ couldNotDeleteDeck: 'دسته حذف نشد',
+ couldNotDeleteFolder: 'پوشه حذف نشد',
+ couldNotDeleteWorkspace: 'فضای کاری حذف نشد',
+ dashboardCouldNotOpen: 'داشبورد باز نشد',
+ decksCouldNotLoad: 'دستهها بارگیری نشدند',
+ decksMayBeOutOfDate: 'ممکن است دستهها بهروز نباشند',
+ foldersCouldNotLoad: 'پوشهها بارگیری نشدند',
+ foldersMayBeOutOfDate: 'ممکن است پوشهها بهروز نباشند',
+ workspaceCouldNotLoad: 'فضای کاری بارگیری نشد',
+ },
+ labels: {
+ dashboard: 'داشبورد',
+ loadingDashboard: 'در حال بارگیری داشبورد',
+ newItem: 'مورد جدید',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'تاریخ در دسترس نیست',
+ },
+ age: {
+ dayAgo_one: '{{count}} روز پیش',
+ dayAgo_other: '{{count}} روز پیش',
+ hourAgo_one: '{{count}} ساعت پیش',
+ hourAgo_other: '{{count}} ساعت پیش',
+ justNow: 'همین حالا',
+ minuteAgo_one: '{{count}} دقیقه پیش',
+ minuteAgo_other: '{{count}} دقیقه پیش',
+ unavailable: 'تاریخ در دسترس نیست',
+ weekAgo_one: '{{count}} هفته پیش',
+ weekAgo_other: '{{count}} هفته پیش',
+ },
+ labels: {
+ deleted: 'حذفشده {{value}}',
+ due: 'موعد: {{value}}',
+ reviewed: 'مرور شد: {{value}}',
+ updated: 'بهروزرسانیشده {{value}}',
+ updatedUppercase: 'بهروزرسانیشده {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} روز پیش',
+ dayAgo_other: '{{count}} روز پیش',
+ inAMoment: 'تا لحظاتی دیگر',
+ inDay_one: 'در {{count}} روز',
+ inDay_other: 'در {{count}} روز',
+ inMonth_one: 'در {{count}} ماه',
+ inMonth_other: 'در {{count}} ماه',
+ inWeek_one: 'در {{count}} هفته',
+ inWeek_other: 'در {{count}} هفته',
+ justNow: 'همین حالا',
+ monthAgo_one: '{{count}} ماه پیش',
+ monthAgo_other: '{{count}} ماه پیش',
+ secondsAgoShort: '{{count}}ث پیش',
+ minutesAgoShort: '{{count}}د پیش',
+ hoursAgoShort: '{{count}}س پیش',
+ today: 'امروز',
+ tomorrow: 'فردا',
+ weekAgo_one: '{{count}} هفته پیش',
+ weekAgo_other: '{{count}} هفته پیش',
+ yesterday: 'دیروز',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'اقدامهای {{title}}',
+ createDeck: 'ایجاد دسته',
+ createNote: 'ایجاد یادداشت',
+ deleteDeck: 'حذف دسته',
+ editDeck: 'ویرایش دسته',
+ newNote: 'یادداشت جدید',
+ openDeck: 'باز کردن دسته {{title}}',
+ saveDeck: 'دسته ذخیره نشد',
+ studyNow: 'اکنون مطالعه کن',
+ },
+ descriptions: {
+ emptyDeck: 'یک یادداشت اضافه کنید تا این دسته محتوایی برای مرور داشته باشد.',
+ editorDefault: 'دسته مطالعه متمرکز.',
+ editorVisual: 'یک نماد جلد برای این دسته انتخاب کنید.',
+ notesSearchPlaceholder: 'جستجو در یادداشتها…',
+ },
+ dialogs: {
+ deleteDeckDescription: '"{{title}}" به سطل زباله منتقل میشود. بعدا میتوانید آن را بازیابی کنید.',
+ deleteDeckFallbackDescription: 'این دسته به سطل زباله منتقل میشود. بعدا میتوانید آن را بازیابی کنید.',
+ deleteDeckFallbackTitle: 'دسته حذف شود؟',
+ deleteDeckTitle: '"{{title}}" حذف شود؟',
+ deleteNoteDescription: '"{{title}}" به سطل زباله منتقل میشود. بعدا میتوانید آن را بازیابی کنید.',
+ deleteNoteFallbackTitle: 'یادداشت حذف شود؟',
+ deleteNoteTitle: '"{{title}}" حذف شود؟',
+ },
+ empty: {
+ noMatchingNotes: 'یادداشت مطابقی نیست',
+ noMatchingNotesDescription: 'هیچ یادداشتی با "{{query}}" مطابقت نداشت.',
+ thisDeckIsEmpty: 'این دسته خالی است',
+ },
+ errors: {
+ couldNotCreateDeck: 'دسته ایجاد نشد',
+ couldNotDeleteDeck: 'دسته حذف نشد',
+ couldNotDeleteNote: 'یادداشت حذف نشد',
+ couldNotLoadFolderPath: 'مسیر پوشه بارگیری نشد',
+ couldNotSaveDeck: 'دسته ذخیره نشد',
+ deckCouldNotLoad: 'دسته بارگیری نشد',
+ notesCouldNotLoad: 'یادداشتها بارگیری نشدند',
+ notesMayBeOutOfDate: 'ممکن است یادداشتها بهروز نباشند',
+ },
+ fields: {
+ descriptionLabel: 'توضیحات دسته',
+ descriptionPlaceholder: 'این دسته به مرور چه چیزی کمک میکند؟',
+ namePlaceholder: 'نام دسته',
+ untitledDeck: 'دسته بدون عنوان',
+ untitledDeckLower: 'دسته بدون عنوان',
+ },
+ labels: {
+ createDeckTitle: 'ایجاد دسته',
+ deck: 'دسته',
+ deckNotesSearch: 'جستجوی یادداشتهای دسته',
+ deckOverview: 'نمای کلی دسته',
+ decks: 'دستهها',
+ due: 'موعد',
+ dueToday: 'موعد امروز',
+ loadingDeck: 'در حال بارگیری دسته',
+ mastery: 'تسلط',
+ notes: 'یادداشتها',
+ },
+ sort: {
+ ariaLabel: 'مرتبسازی دستهها',
+ dueToday: 'موعد امروز',
+ title: 'عنوان',
+ updated: 'بهروزرسانیشده',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'دادهها تغییر کردهاند. تازهسازی کنید و دوباره تلاش کنید.',
+ forbidden: 'اجازه انجام این کار را ندارید.',
+ notFound: 'این مورد پیدا نشد.',
+ offline: 'دسترسی به سرویس ممکن نیست.',
+ timeout: 'این کار بیش از حد طول کشید. دوباره تلاش کنید.',
+ unauthorized: 'برای ادامه وارد شوید.',
+ unavailable: 'سرویس موقتا در دسترس نیست.',
+ },
+ fallback: {
+ unexpected: 'خطای غیرمنتظره',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'ایجاد پوشه',
+ deleteFolder: 'حذف پوشه',
+ editFolder: 'ویرایش پوشه',
+ },
+ descriptions: {
+ editorDefault: 'پوشهای برای دستههای مرتبط.',
+ },
+ dialogs: {
+ deleteFolderDescription: '"{{name}}" به سطل زباله منتقل میشود. بعدا میتوانید آن را بازیابی کنید.',
+ deleteFolderFallbackDescription: 'این پوشه به سطل زباله منتقل میشود. بعدا میتوانید آن را بازیابی کنید.',
+ deleteFolderFallbackTitle: 'پوشه حذف شود؟',
+ deleteFolderTitle: '"{{name}}" حذف شود؟',
+ },
+ empty: {
+ noMatchesInFolder: 'در این پوشه نتیجهای نیست',
+ noMatchesInFolderDescription: 'هیچ پوشه، دسته یا یادداشتی با "{{query}}" مطابقت نداشت.',
+ },
+ errors: {
+ couldNotCreateFolder: 'پوشه ایجاد نشد',
+ couldNotDeleteFolder: 'پوشه حذف نشد',
+ couldNotLoadFolderPath: 'مسیر پوشه بارگیری نشد',
+ couldNotSaveFolder: 'پوشه ذخیره نشد',
+ folderCouldNotLoad: 'پوشه بارگیری نشد',
+ },
+ fields: {
+ descriptionLabel: 'توضیحات پوشه',
+ descriptionPlaceholder: 'چه چیزی در این پوشه قرار میگیرد؟',
+ namePlaceholder: 'نام پوشه',
+ untitledFolder: 'پوشه بدون عنوان',
+ },
+ labels: {
+ createFolderTitle: 'ایجاد پوشه',
+ folder: 'پوشه',
+ folders: 'پوشهها',
+ loadingFolder: 'در حال بارگیری پوشه',
+ name: 'نام',
+ updated: 'بهروزرسانیشده',
+ },
+ sort: {
+ ariaLabel: 'مرتبسازی پوشهها',
+ name: 'نام',
+ updated: 'بهروزرسانیشده',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'اگر دادههای محلی و همگامسازیشده تفاوت داشته باشند، مورد اینجا ظاهر میشود.',
+ heading: 'وضعیت همگامسازی',
+ title: 'تعارضها',
+ noConflicts: 'تعارضی پیدا نشد',
+ },
+ labels: {
+ menu: 'منو',
+ },
+ sections: {
+ settings: {
+ description: 'محیط و ترجیحات خود را شخصیسازی کنید',
+ title: 'تنظیمات',
+ },
+ trash: {
+ description: 'موارد حذفشده را بازیابی یا برای همیشه حذف کنید',
+ title: 'سطل زباله',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'بستن ویرایشگر',
+ openActions: 'باز کردن اقدامها',
+ openWorkspaces: 'باز کردن فضاهای کاری',
+ },
+ items: {
+ home: 'خانه',
+ menu: 'منو',
+ primary: 'اصلی',
+ settings: 'تنظیمات',
+ spaces: 'فضاها',
+ trash: 'سطل زباله',
+ workspaces: 'فضاهای کاری',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'افزودن جای خالی',
+ deleteNote: 'حذف یادداشت',
+ editNote: 'ویرایش یادداشت',
+ hideDerivedCardsNote: 'پنهان کردن یادداشت کارتهای مشتقشده',
+ openNote: 'باز کردن {{title}}',
+ saveNote: 'ذخیره یادداشت',
+ showDerivedCardsNote: 'نمایش یادداشت کارتهای مشتقشده',
+ },
+ descriptions: {
+ clozeFormat: 'هر بخش پنهان پس از ذخیره به یک کارت مرور تبدیل میشود.',
+ clozeFormatPrefix: 'متن پنهان را با این قالب بنویسید',
+ derivedCardsHelper: 'یادداشتها منبع اصلی کارتهای مشتقشده هستند.',
+ },
+ dialogs: {
+ deleteNoteDescription: '"{{title}}" به سطل زباله منتقل میشود. بعدا میتوانید آن را بازیابی کنید.',
+ deleteNoteFallbackDescription: 'این یادداشت به سطل زباله منتقل میشود. بعدا میتوانید آن را بازیابی کنید.',
+ deleteNoteFallbackTitle: 'یادداشت حذف شود؟',
+ deleteNoteTitle: '"{{title}}" حذف شود؟',
+ },
+ errors: {
+ couldNotCreateNote: 'یادداشت ایجاد نشد',
+ couldNotDeleteNote: 'یادداشت حذف نشد',
+ couldNotSaveNote: 'یادداشت ذخیره نشد',
+ noteCouldNotLoad: 'یادداشت بارگیری نشد',
+ },
+ fields: {
+ back: 'پشت',
+ backPlaceholder: 'متن پشت را وارد کنید',
+ bodyPlaceholder: 'متن یادداشت را با حذفهای جای خالی بنویسید…',
+ front: 'رو',
+ frontPlaceholder: 'متن رو را وارد کنید',
+ noteBody: 'متن یادداشت',
+ title: 'عنوان',
+ titlePlaceholder: 'عنوان یادداشت را اضافه کنید',
+ untitledCloze: 'جای خالی بدون عنوان',
+ untitledNote: 'یادداشت بدون عنوان',
+ },
+ labels: {
+ backUppercase: 'پشت',
+ basic: 'ساده',
+ basicLower: 'ساده',
+ basicUppercase: 'ساده',
+ cloze: 'جای خالی',
+ clozeLower: 'جای خالی',
+ clozeFormat: 'قالب جای خالی',
+ clozeUppercase: 'جای خالی',
+ deck: 'دسته',
+ derivedCards: 'کارتهای مشتقشده',
+ due: 'موعد',
+ frontUppercase: 'رو',
+ inProgress: 'در حال انجام',
+ inProgressUppercase: 'در حال انجام',
+ loadingNote: 'در حال بارگیری یادداشت',
+ loadingNoteEditor: 'در حال بارگیری ویرایشگر یادداشت',
+ markdownFormatting: 'قالببندی Markdown',
+ mastered: 'مسلط',
+ masteredUppercase: 'مسلط',
+ newNote: 'یادداشت جدید',
+ noteBody: 'متن یادداشت',
+ noteContent: 'محتوای یادداشت',
+ noteDetails: 'جزئیات یادداشت',
+ noteMetadata: 'فراداده یادداشت',
+ noteType: 'نوع یادداشت',
+ notes: 'یادداشتها',
+ reviewed: 'مرور شد',
+ studyProgress: 'پیشرفت مطالعه',
+ studyProgressUppercase: 'پیشرفت مطالعه',
+ titleUppercase: 'عنوان',
+ updated: 'بهروزرسانیشده',
+ },
+ sort: {
+ ariaLabel: 'مرتبسازی یادداشتها',
+ title: 'عنوان',
+ updated: 'بهروزرسانیشده',
+ },
+ toolbar: {
+ bold: 'پررنگ',
+ italic: 'کج',
+ link: 'پیوند',
+ list: 'فهرست',
+ },
+ },
+ review: {
+ actions: {
+ again: 'دوباره',
+ backToDeck: 'بازگشت به دسته',
+ continueReview: 'ادامه مرور',
+ easy: 'آسان',
+ good: 'خوب',
+ hard: 'سخت',
+ newNote: 'یادداشت جدید',
+ showAnswer: 'نمایش پاسخ',
+ },
+ errors: {
+ couldNotGradeCard: 'کارت ارزیابی نشد',
+ reviewCouldNotLoad: 'مرور بارگیری نشد',
+ reviewCouldNotStart: 'مرور شروع نشد',
+ summaryCouldNotLoad: 'خلاصه مرور بارگیری نشد',
+ summaryNotAvailable: 'خلاصه مرور در دسترس نیست',
+ summaryNotComplete: 'این مرور هنوز کامل نشده است.',
+ },
+ labels: {
+ cardsReviewed: 'کارتهای مرورشده',
+ deck: 'دسته',
+ duration: 'مدت',
+ loadingReview: 'در حال بارگیری مرور',
+ loadingSummary: 'در حال بارگیری خلاصه',
+ progress: 'پیشرفت مرور',
+ review: 'مرور',
+ reviewComplete: 'مرور کامل شد',
+ reviewed_one: '{{count}} مرور شد',
+ reviewed_other: '{{count}} مرور شد',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}}س {{minutes}}د',
+ durationMinutes: '{{minutes}}د',
+ durationSeconds: '{{seconds}}ث',
+ saved: 'پیشرفت شما در این دسته ذخیره شد.',
+ },
+ unavailable: {
+ description: 'یک یادداشت اضافه کنید تا این دسته وارد صف مرور شود.',
+ title: 'کارتی برای مرور نیست',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'پاک کردن جستجو',
+ },
+ empty: {
+ noMatchesInWorkspace: 'در این فضای کاری نتیجهای نیست',
+ noMatchesInWorkspaceDescription: 'هیچ پوشه، دسته یا یادداشتی با "{{query}}" مطابقت نداشت.',
+ },
+ errors: {
+ couldNotComplete: 'جستجو کامل نشد',
+ },
+ labels: {
+ results: 'نتایج جستجو',
+ resultsFor: 'نتایج برای "{{query}}"',
+ searchingContent: 'در حال جستجو در محتوا',
+ },
+ resultGroups: {
+ deck: 'دستهها',
+ folder: 'پوشهها',
+ note: 'یادداشتها',
+ },
+ resultKinds: {
+ deck: 'دسته',
+ folder: 'پوشه',
+ note: 'یادداشت',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'بازنشانی همه تنظیمات',
+ resetSettings: 'بازنشانی تنظیمات',
+ resetToDefaults: 'بازنشانی به پیشفرضها',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'JSON معتبر با 21 مقدار عددی وارد کنید.',
+ fsrsErrorInvalidParams_one: 'یک آرایه JSON با دقیقا {{count}} عدد محدود وارد کنید.',
+ fsrsErrorInvalidParams_other: 'یک آرایه JSON با دقیقا {{count}} عدد محدود وارد کنید.',
+ fsrsHelper: 'این یک تنظیم پیشرفته است. مقدارها باید به ترتیب بمانند.',
+ fsrsJsonLabel: 'JSON پارامترهای FSRS',
+ fsrsTitle: 'ویرایش پارامترهای FSRS',
+ fsrsDescription: 'برای بازنویسی وزنهای زمانبند، یک آرایه JSON با 21 عدد وارد کنید.',
+ resetDescription: 'این کار منطقه زمانی، محدودیتهای مطالعه و تنظیمات FSRS را بازمیگرداند.',
+ resetDescriptionWithLanguage: 'این کار زبان، منطقه زمانی، محدودیتهای مطالعه و تنظیمات FSRS را بازمیگرداند.',
+ resetTitle: 'همه تنظیمات بازنشانی شوند؟',
+ timezoneDescription: 'نام شهر یا شناسه منطقه زمانی را جستجو کنید.',
+ timezoneSearchLabel: 'جستجوی مناطق زمانی',
+ timezoneSearchPlaceholder: 'جستجوی مناطق زمانی…',
+ timezoneTitle: 'انتخاب منطقه زمانی',
+ },
+ errors: {
+ couldNotResetSettings: 'تنظیمات بازنشانی نشد',
+ couldNotSaveSettings: 'تنظیمات ذخیره نشد',
+ settingsCouldNotLoad: 'تنظیمات بارگیری نشد',
+ settingsUnavailable: 'تنظیمات در دسترس نیست.',
+ },
+ labels: {
+ appearance: 'ظاهر',
+ automatic: 'خودکار',
+ fsrsParameters: 'پارامترهای FSRS',
+ general: 'عمومی',
+ language: 'زبان',
+ loadingSettings: 'در حال بارگیری تنظیمات',
+ masteryHorizon: 'افق تسلط',
+ newCardOrder: 'ترتیب کارتهای جدید',
+ newCardsPerDay: 'کارت جدید در روز',
+ reviewCardsPerDay: 'کارت مرور در روز',
+ savingSettings: 'در حال ذخیره تنظیمات',
+ schedule: 'زمانبندی',
+ searchNoTimezones: 'منطقه زمانی مطابقی نیست.',
+ settings: 'تنظیمات',
+ settingsReset: 'بازنشانی تنظیمات',
+ study: 'مطالعه',
+ targetRecallProbability: 'احتمال یادآوری هدف',
+ theme: 'پوسته',
+ timezone: 'منطقه زمانی',
+ },
+ options: {
+ languageEnUs: 'انگلیسی (آمریکا)',
+ newCardsAfterReviews: 'بعد از مرورها',
+ newCardsBeforeReviews: 'قبل از مرورها',
+ newCardsMixed: 'ترکیبی',
+ themeDark: 'تیره',
+ themeLight: 'روشن',
+ themeSystem: 'سیستم',
+ timezoneSystem: 'استفاده از منطقه زمانی سیستم',
+ },
+ rows: {
+ fsrsDescription: 'وزنهای مدل پیشرفته',
+ languageDescription: 'زبان رابط',
+ masteryHorizonDescription: 'تعداد روزهایی که کارت باید در احتمال هدف یا بالاتر قابل یادآوری بماند تا مسلط محسوب شود',
+ newCardOrderDescription: 'ترتیب کارتهای جدید نسبت به مرورها',
+ newCardsPerDayDescription: 'حداکثر کارتهای جدید در روز',
+ reviewCardsPerDayDescription: 'حداکثر کارتهای مرور در روز',
+ targetRecallProbabilityDescription: 'حداقل احتمال یادآوری در مرور زمانبندیشده بعدی',
+ timezoneDescription: 'از منطقه زمانی خودکار استفاده کنید یا یک شهر انتخاب کنید.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'حذف دائمی',
+ empty: 'خالی کردن',
+ emptyTrash: 'خالی کردن سطل زباله',
+ restore: 'بازیابی',
+ restoringItem: 'در حال بازیابی {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: '"{{title}}" برای همیشه حذف میشود. این کار قابل بازگشت نیست.',
+ deleteItemFallbackDescription: 'این مورد برای همیشه حذف میشود. این کار قابل بازگشت نیست.',
+ deleteItemFallbackTitle: 'مورد حذف شود؟',
+ deleteItemTitle: '"{{title}}" حذف شود؟',
+ emptyTrashDescription: 'همه چیز در سطل زباله برای همیشه حذف میشود. این کار قابل بازگشت نیست.',
+ emptyTrashTitle: 'سطل زباله خالی شود؟',
+ },
+ empty: {
+ description: 'مواردی که حذف میکنید پیش از حذف دائمی اینجا ظاهر میشوند.',
+ title: 'سطل زباله خالی است',
+ },
+ errors: {
+ couldNotDeleteItem: 'مورد حذف نشد',
+ couldNotEmptyTrash: 'سطل زباله خالی نشد',
+ couldNotRestoreItem: 'مورد بازیابی نشد',
+ trashCouldNotLoad: 'سطل زباله بارگیری نشد',
+ trashMayBeOutOfDate: 'ممکن است سطل زباله بهروز نباشد',
+ },
+ labels: {
+ deletedAge: 'حذفشده {{value}}',
+ itemCount_one: '{{count}} مورد',
+ itemCount_other: '{{count}} مورد',
+ lastEmptied: 'آخرین خالیسازی {{value}}',
+ loadingTrash: 'در حال بارگیری سطل زباله',
+ originalLocation: 'مکان اصلی: {{location}}',
+ title: 'سطل زباله',
+ trashActions: 'اقدامهای سطل زباله {{title}}',
+ },
+ kinds: {
+ deck: 'دسته',
+ folder: 'پوشه',
+ note: 'یادداشت',
+ workspace: 'فضای کاری',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'ایجاد فضای کاری',
+ deleteWorkspace: 'حذف فضای کاری',
+ editWorkspace: 'ویرایش فضای کاری',
+ newWorkspace: 'فضای کاری جدید',
+ openWorkspace: 'باز کردن {{title}}',
+ openingWorkspace: 'در حال باز کردن {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'زمینه مطالعه.',
+ editorVisual: 'یک نشانه بصری برای این فضای کاری انتخاب کنید.',
+ emptyList: 'دستهها، یادداشتها و صفهای مرور را بر اساس زمینه مطالعه جدا کنید.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: '"{{title}}" به سطل زباله منتقل میشود. بعدا میتوانید آن را بازیابی کنید.',
+ deleteWorkspaceFallbackDescription: 'این فضای کاری به سطل زباله منتقل میشود. بعدا میتوانید آن را بازیابی کنید.',
+ deleteWorkspaceFallbackTitle: 'فضای کاری حذف شود؟',
+ deleteWorkspaceTitle: '"{{title}}" حذف شود؟',
+ },
+ empty: {
+ startWithWorkspace: 'با یک فضای کاری شروع کنید',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'فضای کاری ایجاد نشد',
+ couldNotDeleteWorkspace: 'فضای کاری حذف نشد',
+ couldNotOpenWorkspace: 'فضای کاری باز نشد',
+ couldNotSaveWorkspace: 'فضای کاری ذخیره نشد',
+ workspaceCouldNotLoad: 'فضای کاری بارگیری نشد',
+ workspacesCouldNotLoad: 'فضاهای کاری بارگیری نشدند',
+ },
+ fields: {
+ descriptionLabel: 'توضیحات فضای کاری',
+ descriptionPlaceholder: 'چه چیزی در این فضای کاری قرار میگیرد؟',
+ namePlaceholder: 'نام فضای کاری',
+ untitledWorkspace: 'فضای کاری بدون عنوان',
+ },
+ labels: {
+ createWorkspaceTitle: 'ایجاد فضای کاری',
+ loadingWorkspaces: 'در حال بارگیری فضاهای کاری',
+ workspace: 'فضای کاری',
+ workspaces: 'فضاهای کاری',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/fi.ts b/ui/src/core/i18n/resources/fi.ts
new file mode 100644
index 0000000..540de32
--- /dev/null
+++ b/ui/src/core/i18n/resources/fi.ts
@@ -0,0 +1,623 @@
+export const fi = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Yritä uudelleen. Jos tämä jatkuu, avaa Clear uudelleen.',
+ title: 'Käynnistys epäonnistui',
+ },
+ loadingTitle: 'Valmistellaan opiskelutilaasi',
+ },
+ common: {
+ actions: {
+ back: 'Takaisin',
+ cancel: 'Peruuta',
+ checkAgain: 'Tarkista uudelleen',
+ close: 'Sulje',
+ create: 'Luo',
+ delete: 'Poista',
+ dismissError: 'Piilota virhe',
+ dismissStatus: 'Piilota tila',
+ edit: 'Muokkaa',
+ itemActions: '{{title}}: toiminnot',
+ reset: 'Palauta',
+ review: 'Kertaa',
+ save: 'Tallenna',
+ saveChanges: 'Tallenna muutokset',
+ tryAgain: 'Yritä uudelleen',
+ },
+ labels: {
+ active: 'Aktiivinen',
+ clear: 'Clear',
+ custom: 'Mukautettu',
+ default: 'Oletus',
+ loadingEditor: 'Ladataan editoria',
+ name: 'Nimi',
+ completedTask: 'Valmis tehtävä',
+ description: 'Kuvaus',
+ incompleteTask: 'Keskeneräinen tehtävä',
+ percentageInput: '{{label}} prosentteina',
+ visual: 'Visuaalinen',
+ },
+ status: {
+ actionFailed: 'Toiminto epäonnistui',
+ actionInProgress: 'Toiminto käynnissä',
+ },
+ sort: {
+ ascending: 'Nouseva',
+ column: 'Sarake',
+ descending: 'Laskeva',
+ direction: 'Suunta',
+ sort: 'Lajittelu',
+ },
+ search: {
+ label: 'Haku',
+ },
+ visualPicker: {
+ allLucideIcons: 'Kaikki Lucide-kuvakkeet',
+ browseIconsFor: 'Selaa tai hae kuvakkeita kohteelle {{label}}.',
+ chooseIcon: 'Valitse kuvake',
+ iconPicker: '{{label}}: kuvakkeen valinta',
+ iconSearch: '{{label}}: kuvakehaku',
+ iconsCouldNotLoad: 'Kuvakkeita ei voitu ladata.',
+ loadingIcons: 'Ladataan kuvakkeita',
+ loadingMoreIcons: 'Ladataan lisää kuvakkeita',
+ moreIcons: 'Lisää kuvakkeita',
+ noIconsMatch: 'Mikään kuvake ei vastaa hakua "{{query}}".',
+ searchIconsPlaceholder: 'Hae kuvakkeita…',
+ selectedIcon: 'Valittu {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Luo',
+ newDeck: 'Uusi pakka',
+ newFolder: 'Uusi kansio',
+ },
+ descriptions: {
+ defaultWorkspace: 'Pidä pakat, kansiot ja muistiinpanot yhdessä.',
+ emptyWorkspace: 'Luo pakka ja lisää sitten muistiinpanoja kertausta varten.',
+ emptyFolder: 'Luo pakka ja lisää sitten muistiinpanoja kertausta varten.',
+ searchPlaceholder: 'Hae kansioita, pakkoja ja muistiinpanoja…',
+ },
+ empty: {
+ createFirstDeck: 'Luo ensimmäinen pakkasi',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Pakkaa ei voitu poistaa',
+ couldNotDeleteFolder: 'Kansiota ei voitu poistaa',
+ couldNotDeleteWorkspace: 'Työtilaa ei voitu poistaa',
+ dashboardCouldNotOpen: 'Koontinäkymää ei voitu avata',
+ decksCouldNotLoad: 'Pakkoja ei voitu ladata',
+ decksMayBeOutOfDate: 'Pakat voivat olla vanhentuneita',
+ foldersCouldNotLoad: 'Kansioita ei voitu ladata',
+ foldersMayBeOutOfDate: 'Kansiot voivat olla vanhentuneita',
+ workspaceCouldNotLoad: 'Työtilaa ei voitu ladata',
+ },
+ labels: {
+ dashboard: 'Koontinäkymä',
+ loadingDashboard: 'Ladataan koontinäkymää',
+ newItem: 'Uusi kohde',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Päivämäärä ei ole saatavilla',
+ },
+ age: {
+ dayAgo_one: '{{count}} päivä sitten',
+ dayAgo_other: '{{count}} päivää sitten',
+ hourAgo_one: '{{count}} tunti sitten',
+ hourAgo_other: '{{count}} tuntia sitten',
+ justNow: 'juuri nyt',
+ minuteAgo_one: '{{count}} minuutti sitten',
+ minuteAgo_other: '{{count}} minuuttia sitten',
+ unavailable: 'päivämäärä ei ole saatavilla',
+ weekAgo_one: '{{count}} viikko sitten',
+ weekAgo_other: '{{count}} viikkoa sitten',
+ },
+ labels: {
+ deleted: 'Poistettu {{value}}',
+ due: 'Erääntyy: {{value}}',
+ reviewed: 'Kerrattu: {{value}}',
+ updated: 'Päivitetty {{value}}',
+ updatedUppercase: 'PÄIVITETTY {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} päivä sitten',
+ dayAgo_other: '{{count}} päivää sitten',
+ inAMoment: 'Hetken kuluttua',
+ inDay_one: '{{count}} päivän päästä',
+ inDay_other: '{{count}} päivän päästä',
+ inMonth_one: '{{count}} kuukauden päästä',
+ inMonth_other: '{{count}} kuukauden päästä',
+ inWeek_one: '{{count}} viikon päästä',
+ inWeek_other: '{{count}} viikon päästä',
+ justNow: 'Juuri nyt',
+ monthAgo_one: '{{count}} kuukausi sitten',
+ monthAgo_other: '{{count}} kuukautta sitten',
+ secondsAgoShort: '{{count}} s sitten',
+ minutesAgoShort: '{{count}} min sitten',
+ hoursAgoShort: '{{count}} h sitten',
+ today: 'Tänään',
+ tomorrow: 'Huomenna',
+ weekAgo_one: '{{count}} viikko sitten',
+ weekAgo_other: '{{count}} viikkoa sitten',
+ yesterday: 'Eilen',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: '{{title}}: toiminnot',
+ createDeck: 'Luo pakka',
+ createNote: 'Luo muistiinpano',
+ deleteDeck: 'Poista pakka',
+ editDeck: 'Muokkaa pakkaa',
+ newNote: 'Uusi muistiinpano',
+ openDeck: 'Avaa pakka {{title}}',
+ saveDeck: 'Pakkaa ei voitu tallentaa',
+ studyNow: 'Opiskele nyt',
+ },
+ descriptions: {
+ emptyDeck: 'Lisää muistiinpano, jotta tässä pakassa on kerrattavaa.',
+ editorDefault: 'Keskittynyt opiskelupakka.',
+ editorVisual: 'Valitse tälle pakalle kansikuvake.',
+ notesSearchPlaceholder: 'Hae muistiinpanoja…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Tämä siirtää kohteen "{{title}}" roskakoriin. Voit palauttaa sen myöhemmin.',
+ deleteDeckFallbackDescription: 'Tämä siirtää tämän pakan roskakoriin. Voit palauttaa sen myöhemmin.',
+ deleteDeckFallbackTitle: 'Poistetaanko pakka?',
+ deleteDeckTitle: 'Poistetaanko "{{title}}"?',
+ deleteNoteDescription: 'Tämä siirtää kohteen "{{title}}" roskakoriin. Voit palauttaa sen myöhemmin.',
+ deleteNoteFallbackTitle: 'Poistetaanko muistiinpano?',
+ deleteNoteTitle: 'Poistetaanko "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Ei vastaavia muistiinpanoja',
+ noMatchingNotesDescription: 'Yksikään muistiinpano ei vastannut hakua "{{query}}".',
+ thisDeckIsEmpty: 'Tämä pakka on tyhjä',
+ },
+ errors: {
+ couldNotCreateDeck: 'Pakkaa ei voitu luoda',
+ couldNotDeleteDeck: 'Pakkaa ei voitu poistaa',
+ couldNotDeleteNote: 'Muistiinpanoa ei voitu poistaa',
+ couldNotLoadFolderPath: 'Kansiopolkua ei voitu ladata',
+ couldNotSaveDeck: 'Pakkaa ei voitu tallentaa',
+ deckCouldNotLoad: 'Pakkaa ei voitu ladata',
+ notesCouldNotLoad: 'Muistiinpanoja ei voitu ladata',
+ notesMayBeOutOfDate: 'Muistiinpanot voivat olla vanhentuneita',
+ },
+ fields: {
+ descriptionLabel: 'Pakan kuvaus',
+ descriptionPlaceholder: 'Mitä tämä pakka auttaa sinua kertaamaan?',
+ namePlaceholder: 'Pakan nimi',
+ untitledDeck: 'Nimetön pakka',
+ untitledDeckLower: 'nimetön pakka',
+ },
+ labels: {
+ createDeckTitle: 'Luo pakka',
+ deck: 'Pakka',
+ deckNotesSearch: 'Pakan muistiinpanojen haku',
+ deckOverview: 'Pakan yleiskatsaus',
+ decks: 'Pakat',
+ due: 'Erääntyy',
+ dueToday: 'Erääntyy tänään',
+ loadingDeck: 'Ladataan pakkaa',
+ mastery: 'Hallinta',
+ notes: 'Muistiinpanot',
+ },
+ sort: {
+ ariaLabel: 'Lajittele pakat',
+ dueToday: 'Erääntyy tänään',
+ title: 'Otsikko',
+ updated: 'Päivitetty',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Tiedot muuttuivat. Päivitä ja yritä uudelleen.',
+ forbidden: 'Sinulla ei ole oikeutta tehdä tätä.',
+ notFound: 'Emme löytäneet tätä kohdetta.',
+ offline: 'Palveluun ei saada yhteyttä.',
+ timeout: 'Tässä kesti liian kauan. Yritä uudelleen.',
+ unauthorized: 'Kirjaudu sisään jatkaaksesi.',
+ unavailable: 'Palvelu ei ole tilapäisesti saatavilla.',
+ },
+ fallback: {
+ unexpected: 'Odottamaton virhe',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Luo kansio',
+ deleteFolder: 'Poista kansio',
+ editFolder: 'Muokkaa kansiota',
+ },
+ descriptions: {
+ editorDefault: 'Kansio toisiinsa liittyville pakoille.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Tämä siirtää kohteen "{{name}}" roskakoriin. Voit palauttaa sen myöhemmin.',
+ deleteFolderFallbackDescription: 'Tämä siirtää tämän kansion roskakoriin. Voit palauttaa sen myöhemmin.',
+ deleteFolderFallbackTitle: 'Poistetaanko kansio?',
+ deleteFolderTitle: 'Poistetaanko "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Ei osumia tässä kansiossa',
+ noMatchesInFolderDescription: 'Yksikään kansio, pakka tai muistiinpano ei vastannut hakua "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Kansiota ei voitu luoda',
+ couldNotDeleteFolder: 'Kansiota ei voitu poistaa',
+ couldNotLoadFolderPath: 'Kansiopolkua ei voitu ladata',
+ couldNotSaveFolder: 'Kansiota ei voitu tallentaa',
+ folderCouldNotLoad: 'Kansiota ei voitu ladata',
+ },
+ fields: {
+ descriptionLabel: 'Kansion kuvaus',
+ descriptionPlaceholder: 'Mitä tähän kansioon kuuluu?',
+ namePlaceholder: 'Kansion nimi',
+ untitledFolder: 'Nimetön kansio',
+ },
+ labels: {
+ createFolderTitle: 'Luo kansio',
+ folder: 'Kansio',
+ folders: 'Kansiot',
+ loadingFolder: 'Ladataan kansiota',
+ name: 'Nimi',
+ updated: 'Päivitetty',
+ },
+ sort: {
+ ariaLabel: 'Lajittele kansiot',
+ name: 'Nimi',
+ updated: 'Päivitetty',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Jos paikalliset ja synkronoidut tiedot eroavat toisistaan, kohde näkyy täällä.',
+ heading: 'Synkronoinnin tila',
+ title: 'Ristiriidat',
+ noConflicts: 'Ristiriitoja ei löytynyt',
+ },
+ labels: {
+ menu: 'Valikko',
+ },
+ sections: {
+ settings: {
+ description: 'Mukauta ympäristöäsi ja asetuksiasi',
+ title: 'Asetukset',
+ },
+ trash: {
+ description: 'Palauta tai poista poistettuja kohteita pysyvästi',
+ title: 'Roskakori',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Sulje editori',
+ openActions: 'Avaa toiminnot',
+ openWorkspaces: 'Avaa työtilat',
+ },
+ items: {
+ home: 'Etusivu',
+ menu: 'Valikko',
+ primary: 'Ensisijainen',
+ settings: 'Asetukset',
+ spaces: 'Tilat',
+ trash: 'Roskakori',
+ workspaces: 'Työtilat',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Lisää cloze',
+ deleteNote: 'Poista muistiinpano',
+ editNote: 'Muokkaa muistiinpanoa',
+ hideDerivedCardsNote: 'Piilota johdettujen korttien huomautus',
+ openNote: 'Avaa {{title}}',
+ saveNote: 'Tallenna muistiinpano',
+ showDerivedCardsNote: 'Näytä johdettujen korttien huomautus',
+ },
+ descriptions: {
+ clozeFormat: 'Jokaisesta piilotetusta osasta tulee kertauskortti, kun tallennat.',
+ clozeFormatPrefix: 'Kääri piilotettu teksti merkinnällä',
+ derivedCardsHelper: 'Muistiinpanot ovat johdettujen korttien totuuden lähde.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Tämä siirtää kohteen "{{title}}" roskakoriin. Voit palauttaa sen myöhemmin.',
+ deleteNoteFallbackDescription: 'Tämä siirtää tämän muistiinpanon roskakoriin. Voit palauttaa sen myöhemmin.',
+ deleteNoteFallbackTitle: 'Poistetaanko muistiinpano?',
+ deleteNoteTitle: 'Poistetaanko "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Muistiinpanoa ei voitu luoda',
+ couldNotDeleteNote: 'Muistiinpanoa ei voitu poistaa',
+ couldNotSaveNote: 'Muistiinpanoa ei voitu tallentaa',
+ noteCouldNotLoad: 'Muistiinpanoa ei voitu ladata',
+ },
+ fields: {
+ back: 'Kääntöpuoli',
+ backPlaceholder: 'Kirjoita kääntöpuoli',
+ bodyPlaceholder: 'Kirjoita muistiinpanon sisältö cloze-poistoilla…',
+ front: 'Etupuoli',
+ frontPlaceholder: 'Kirjoita etupuoli',
+ noteBody: 'Muistiinpanon sisältö',
+ title: 'Otsikko',
+ titlePlaceholder: 'Lisää muistiinpanon otsikko',
+ untitledCloze: 'Nimetön cloze',
+ untitledNote: 'Nimetön muistiinpano',
+ },
+ labels: {
+ backUppercase: 'KÄÄNTÖPUOLI',
+ basic: 'Perus',
+ basicLower: 'perus',
+ basicUppercase: 'PERUS',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze-muoto',
+ clozeUppercase: 'CLOZE',
+ deck: 'Pakka',
+ derivedCards: 'JOHDETUT KORTIT',
+ due: 'Erääntyy',
+ frontUppercase: 'ETUPUOLI',
+ inProgress: 'Kesken',
+ inProgressUppercase: 'KESKEN',
+ loadingNote: 'Ladataan muistiinpanoa',
+ loadingNoteEditor: 'Ladataan muistiinpanoeditoria',
+ markdownFormatting: 'Markdown-muotoilu',
+ mastered: 'Hallittu',
+ masteredUppercase: 'HALLITTU',
+ newNote: 'Uusi muistiinpano',
+ noteBody: 'MUISTIINPANON SISÄLTÖ',
+ noteContent: 'Muistiinpanon sisältö',
+ noteDetails: 'Muistiinpanon tiedot',
+ noteMetadata: 'Muistiinpanon metatiedot',
+ noteType: 'Muistiinpanon tyyppi',
+ notes: 'Muistiinpanot',
+ reviewed: 'Kerrattu',
+ studyProgress: 'Opiskelun edistyminen',
+ studyProgressUppercase: 'OPISKELUN EDISTYMINEN',
+ titleUppercase: 'OTSIKKO',
+ updated: 'Päivitetty',
+ },
+ sort: {
+ ariaLabel: 'Lajittele muistiinpanot',
+ title: 'Otsikko',
+ updated: 'Päivitetty',
+ },
+ toolbar: {
+ bold: 'Lihavointi',
+ italic: 'Kursivointi',
+ link: 'Linkki',
+ list: 'Luettelo',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Uudelleen',
+ backToDeck: 'Takaisin pakkaan',
+ continueReview: 'Jatka kertausta',
+ easy: 'Helppo',
+ good: 'Hyvä',
+ hard: 'Vaikea',
+ newNote: 'Uusi muistiinpano',
+ showAnswer: 'Näytä vastaus',
+ },
+ errors: {
+ couldNotGradeCard: 'Korttia ei voitu arvioida',
+ reviewCouldNotLoad: 'Kertausta ei voitu ladata',
+ reviewCouldNotStart: 'Kertausta ei voitu aloittaa',
+ summaryCouldNotLoad: 'Kertauksen yhteenvetoa ei voitu ladata',
+ summaryNotAvailable: 'Kertauksen yhteenveto ei ole saatavilla',
+ summaryNotComplete: 'Tämä kertaus ei ole vielä valmis.',
+ },
+ labels: {
+ cardsReviewed: 'Kerratut kortit',
+ deck: 'Pakka',
+ duration: 'Kesto',
+ loadingReview: 'Ladataan kertausta',
+ loadingSummary: 'Ladataan yhteenvetoa',
+ progress: 'Kertauksen edistyminen',
+ review: 'Kertaus',
+ reviewComplete: 'Kertaus valmis',
+ reviewed_one: 'Kerrattu {{count}}',
+ reviewed_other: 'Kerrattu {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Edistymisesi tallennettiin tähän pakkaan.',
+ },
+ unavailable: {
+ description: 'Lisää muistiinpano, jotta tämä pakka voi siirtyä kertausjonoon.',
+ title: 'Ei kortteja kerrattavaksi',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Tyhjennä haku',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Ei osumia tässä työtilassa',
+ noMatchesInWorkspaceDescription: 'Yksikään kansio, pakka tai muistiinpano ei vastannut hakua "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Hakua ei voitu suorittaa',
+ },
+ labels: {
+ results: 'Hakutulokset',
+ resultsFor: 'Tulokset haulle "{{query}}"',
+ searchingContent: 'Haetaan sisältöä',
+ },
+ resultGroups: {
+ deck: 'Pakat',
+ folder: 'Kansiot',
+ note: 'Muistiinpanot',
+ },
+ resultKinds: {
+ deck: 'pakka',
+ folder: 'kansio',
+ note: 'muistiinpano',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Palauta kaikki asetukset',
+ resetSettings: 'Palauta asetukset',
+ resetToDefaults: 'Palauta oletukset',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Liitä kelvollinen JSON, jossa on 21 numeerista arvoa.',
+ fsrsErrorInvalidParams_one: 'Syötä JSON-taulukko, jossa on täsmälleen {{count}} äärellinen luku.',
+ fsrsErrorInvalidParams_other: 'Syötä JSON-taulukko, jossa on täsmälleen {{count}} äärellistä lukua.',
+ fsrsHelper: 'Tämä on asiantuntijan ohitus. Arvojen on pysyttävä järjestyksessä.',
+ fsrsJsonLabel: 'FSRS-parametrit JSON',
+ fsrsTitle: 'Muokkaa FSRS-parametreja',
+ fsrsDescription: 'Liitä JSON-taulukko, jossa on 21 lukua, korvataksesi ajoituspainot.',
+ resetDescription: 'Tämä palauttaa aikavyöhykkeen, opiskelurajat ja FSRS-asetukset.',
+ resetDescriptionWithLanguage: 'Tämä palauttaa kielen, aikavyöhykkeen, opiskelurajat ja FSRS-asetukset.',
+ resetTitle: 'Palautetaanko kaikki asetukset?',
+ timezoneDescription: 'Hae kaupunkia tai aikavyöhykkeen tunnistetta.',
+ timezoneSearchLabel: 'Hae aikavyöhykkeitä',
+ timezoneSearchPlaceholder: 'Hae aikavyöhykkeitä…',
+ timezoneTitle: 'Valitse aikavyöhyke',
+ },
+ errors: {
+ couldNotResetSettings: 'Asetuksia ei voitu palauttaa',
+ couldNotSaveSettings: 'Asetuksia ei voitu tallentaa',
+ settingsCouldNotLoad: 'Asetuksia ei voitu ladata',
+ settingsUnavailable: 'Asetukset eivät ole saatavilla.',
+ },
+ labels: {
+ appearance: 'Ulkoasu',
+ automatic: 'Automaattinen',
+ fsrsParameters: 'FSRS-parametrit',
+ general: 'Yleiset',
+ language: 'Kieli',
+ loadingSettings: 'Ladataan asetuksia',
+ masteryHorizon: 'Hallinnan aikahorisontti',
+ newCardOrder: 'Uusien korttien järjestys',
+ newCardsPerDay: 'Uusia kortteja päivässä',
+ reviewCardsPerDay: 'Kertauskortteja päivässä',
+ savingSettings: 'Tallennetaan asetuksia',
+ schedule: 'Aikataulu',
+ searchNoTimezones: 'Ei vastaavia aikavyöhykkeitä.',
+ settings: 'Asetukset',
+ settingsReset: 'Asetukset palautettu',
+ study: 'Opiskelu',
+ targetRecallProbability: 'Tavoiteltu muistamisen todennäköisyys',
+ theme: 'Teema',
+ timezone: 'Aikavyöhyke',
+ },
+ options: {
+ languageEnUs: 'Englanti (Yhdysvallat)',
+ newCardsAfterReviews: 'Kertausten jälkeen',
+ newCardsBeforeReviews: 'Ennen kertauksia',
+ newCardsMixed: 'Sekoitettu',
+ themeDark: 'Tumma',
+ themeLight: 'Vaalea',
+ themeSystem: 'Järjestelmä',
+ timezoneSystem: 'Käytä järjestelmän aikavyöhykettä',
+ },
+ rows: {
+ fsrsDescription: 'Asiantuntijamallin painot',
+ languageDescription: 'Käyttöliittymän kieli',
+ masteryHorizonDescription: 'Päivien määrä, joiden ajan kortin on pysyttävä muistettavissa tavoitetodennäköisyydellä tai sitä paremmin, jotta se lasketaan hallituksi',
+ newCardOrderDescription: 'Uusien korttien järjestys suhteessa kertauksiin',
+ newCardsPerDayDescription: 'Uusien korttien enimmäismäärä päivässä',
+ reviewCardsPerDayDescription: 'Kertauskorttien enimmäismäärä päivässä',
+ targetRecallProbabilityDescription: 'Muistamisen vähimmäistodennäköisyys seuraavassa ajoitetussa kertauksessa',
+ timezoneDescription: 'Käytä automaattista aikavyöhykettä tai valitse kaupunki.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Poista pysyvästi',
+ empty: 'Tyhjennä',
+ emptyTrash: 'Tyhjennä roskakori',
+ restore: 'Palauta',
+ restoringItem: 'Palautetaan {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Tämä poistaa kohteen "{{title}}" pysyvästi. Tätä ei voi kumota.',
+ deleteItemFallbackDescription: 'Tämä poistaa tämän kohteen pysyvästi. Tätä ei voi kumota.',
+ deleteItemFallbackTitle: 'Poistetaanko kohde?',
+ deleteItemTitle: 'Poistetaanko "{{title}}"?',
+ emptyTrashDescription: 'Tämä poistaa pysyvästi kaiken roskakorista. Tätä ei voi kumota.',
+ emptyTrashTitle: 'Tyhjennetäänkö roskakori?',
+ },
+ empty: {
+ description: 'Poistamasi kohteet näkyvät täällä ennen pysyvää poistamista.',
+ title: 'Roskakori on tyhjä',
+ },
+ errors: {
+ couldNotDeleteItem: 'Kohdetta ei voitu poistaa',
+ couldNotEmptyTrash: 'Roskakoria ei voitu tyhjentää',
+ couldNotRestoreItem: 'Kohdetta ei voitu palauttaa',
+ trashCouldNotLoad: 'Roskakoria ei voitu ladata',
+ trashMayBeOutOfDate: 'Roskakori voi olla vanhentunut',
+ },
+ labels: {
+ deletedAge: 'Poistettu {{value}}',
+ itemCount_one: '{{count}} kohde',
+ itemCount_other: '{{count}} kohdetta',
+ lastEmptied: 'Viimeksi tyhjennetty {{value}}',
+ loadingTrash: 'Ladataan roskakoria',
+ originalLocation: 'Alkuperäinen sijainti: {{location}}',
+ title: 'Roskakori',
+ trashActions: '{{title}}: roskakoritoiminnot',
+ },
+ kinds: {
+ deck: 'Pakka',
+ folder: 'Kansio',
+ note: 'Muistiinpano',
+ workspace: 'Työtila',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Luo työtila',
+ deleteWorkspace: 'Poista työtila',
+ editWorkspace: 'Muokkaa työtilaa',
+ newWorkspace: 'Uusi työtila',
+ openWorkspace: 'Avaa {{title}}',
+ openingWorkspace: 'Avataan {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Opiskelukonteksti.',
+ editorVisual: 'Valitse tälle työtilalle visuaalinen ankkuri.',
+ emptyList: 'Erota pakat, muistiinpanot ja kertausjonot opiskelukontekstin mukaan.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Tämä siirtää kohteen "{{title}}" roskakoriin. Voit palauttaa sen myöhemmin.',
+ deleteWorkspaceFallbackDescription: 'Tämä siirtää tämän työtilan roskakoriin. Voit palauttaa sen myöhemmin.',
+ deleteWorkspaceFallbackTitle: 'Poistetaanko työtila?',
+ deleteWorkspaceTitle: 'Poistetaanko "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Aloita työtilalla',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Työtilaa ei voitu luoda',
+ couldNotDeleteWorkspace: 'Työtilaa ei voitu poistaa',
+ couldNotOpenWorkspace: 'Työtilaa ei voitu avata',
+ couldNotSaveWorkspace: 'Työtilaa ei voitu tallentaa',
+ workspaceCouldNotLoad: 'Työtilaa ei voitu ladata',
+ workspacesCouldNotLoad: 'Työtiloja ei voitu ladata',
+ },
+ fields: {
+ descriptionLabel: 'Työtilan kuvaus',
+ descriptionPlaceholder: 'Mitä tähän työtilaan kuuluu?',
+ namePlaceholder: 'Työtilan nimi',
+ untitledWorkspace: 'Nimetön työtila',
+ },
+ labels: {
+ createWorkspaceTitle: 'Luo työtila',
+ loadingWorkspaces: 'Ladataan työtiloja',
+ workspace: 'Työtila',
+ workspaces: 'Työtilat',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/fr.ts b/ui/src/core/i18n/resources/fr.ts
new file mode 100644
index 0000000..bb780f1
--- /dev/null
+++ b/ui/src/core/i18n/resources/fr.ts
@@ -0,0 +1,623 @@
+export const fr = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Réessayez. Si le problème persiste, rouvrez Clear.',
+ title: 'Impossible de démarrer',
+ },
+ loadingTitle: 'Préparation de votre espace d’étude',
+ },
+ common: {
+ actions: {
+ back: 'Retour',
+ cancel: 'Annuler',
+ checkAgain: 'Vérifier à nouveau',
+ close: 'Fermer',
+ create: 'Créer',
+ delete: 'Supprimer',
+ dismissError: 'Masquer l’erreur',
+ dismissStatus: 'Masquer l’état',
+ edit: 'Modifier',
+ itemActions: 'Actions pour {{title}}',
+ reset: 'Réinitialiser',
+ review: 'Réviser',
+ save: 'Enregistrer',
+ saveChanges: 'Enregistrer les modifications',
+ tryAgain: 'Réessayer',
+ },
+ labels: {
+ active: 'Actif',
+ clear: 'Clear',
+ custom: 'Personnalisé',
+ default: 'Par défaut',
+ loadingEditor: 'Chargement de l’éditeur',
+ name: 'Nom',
+ completedTask: 'Tâche terminée',
+ description: 'Description',
+ incompleteTask: 'Tâche incomplète',
+ percentageInput: 'Pourcentage de {{label}}',
+ visual: 'Visuel',
+ },
+ status: {
+ actionFailed: 'L’action a échoué',
+ actionInProgress: 'Action en cours',
+ },
+ sort: {
+ ascending: 'Asc',
+ column: 'Colonne',
+ descending: 'Desc',
+ direction: 'Sens',
+ sort: 'Trier',
+ },
+ search: {
+ label: 'Rechercher',
+ },
+ visualPicker: {
+ allLucideIcons: 'Toutes les icônes Lucide',
+ browseIconsFor: 'Parcourez ou recherchez des icônes pour {{label}}.',
+ chooseIcon: 'Choisir une icône',
+ iconPicker: 'Sélecteur d’icône pour {{label}}',
+ iconSearch: 'Recherche d’icône pour {{label}}',
+ iconsCouldNotLoad: 'Les icônes n’ont pas pu être chargées.',
+ loadingIcons: 'Chargement des icônes',
+ loadingMoreIcons: 'Chargement d’autres icônes',
+ moreIcons: 'Plus d’icônes',
+ noIconsMatch: 'Aucune icône ne correspond à "{{query}}".',
+ searchIconsPlaceholder: 'Rechercher des icônes…',
+ selectedIcon: '{{label}} sélectionné',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Créer',
+ newDeck: 'Nouveau paquet',
+ newFolder: 'Nouveau dossier',
+ },
+ descriptions: {
+ defaultWorkspace: 'Gardez paquets, dossiers et notes ensemble.',
+ emptyWorkspace: 'Créez un paquet, puis ajoutez des notes pour constituer votre file de révision.',
+ emptyFolder: 'Créez un paquet, puis ajoutez des notes pour constituer une file de révision.',
+ searchPlaceholder: 'Rechercher dossiers, paquets et notes…',
+ },
+ empty: {
+ createFirstDeck: 'Créez votre premier paquet',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Impossible de supprimer le paquet',
+ couldNotDeleteFolder: 'Impossible de supprimer le dossier',
+ couldNotDeleteWorkspace: 'Impossible de supprimer l’espace de travail',
+ dashboardCouldNotOpen: 'Impossible d’ouvrir le tableau de bord',
+ decksCouldNotLoad: 'Impossible de charger les paquets',
+ decksMayBeOutOfDate: 'Les paquets peuvent être obsolètes',
+ foldersCouldNotLoad: 'Impossible de charger les dossiers',
+ foldersMayBeOutOfDate: 'Les dossiers peuvent être obsolètes',
+ workspaceCouldNotLoad: 'Impossible de charger l’espace de travail',
+ },
+ labels: {
+ dashboard: 'Tableau de bord',
+ loadingDashboard: 'Chargement du tableau de bord',
+ newItem: 'Nouvel élément',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Date indisponible',
+ },
+ age: {
+ dayAgo_one: 'il y a {{count}} jour',
+ dayAgo_other: 'il y a {{count}} jours',
+ hourAgo_one: 'il y a {{count}} heure',
+ hourAgo_other: 'il y a {{count}} heures',
+ justNow: 'à l’instant',
+ minuteAgo_one: 'il y a {{count}} minute',
+ minuteAgo_other: 'il y a {{count}} minutes',
+ unavailable: 'date indisponible',
+ weekAgo_one: 'il y a {{count}} semaine',
+ weekAgo_other: 'il y a {{count}} semaines',
+ },
+ labels: {
+ deleted: 'Supprimé {{value}}',
+ due: 'À réviser : {{value}}',
+ reviewed: 'Révisé : {{value}}',
+ updated: 'Mis à jour {{value}}',
+ updatedUppercase: 'MIS À JOUR {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'il y a {{count}} jour',
+ dayAgo_other: 'il y a {{count}} jours',
+ inAMoment: 'Dans un instant',
+ inDay_one: 'Dans {{count}} jour',
+ inDay_other: 'Dans {{count}} jours',
+ inMonth_one: 'Dans {{count}} mois',
+ inMonth_other: 'Dans {{count}} mois',
+ inWeek_one: 'Dans {{count}} semaine',
+ inWeek_other: 'Dans {{count}} semaines',
+ justNow: 'À l’instant',
+ monthAgo_one: 'il y a {{count}} mois',
+ monthAgo_other: 'il y a {{count}} mois',
+ secondsAgoShort: 'il y a {{count}} s',
+ minutesAgoShort: 'il y a {{count}} min',
+ hoursAgoShort: 'il y a {{count}} h',
+ today: 'Aujourd’hui',
+ tomorrow: 'Demain',
+ weekAgo_one: 'il y a {{count}} semaine',
+ weekAgo_other: 'il y a {{count}} semaines',
+ yesterday: 'Hier',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Actions pour {{title}}',
+ createDeck: 'Créer un paquet',
+ createNote: 'Créer une note',
+ deleteDeck: 'Supprimer le paquet',
+ editDeck: 'Modifier le paquet',
+ newNote: 'Nouvelle note',
+ openDeck: 'Ouvrir le paquet {{title}}',
+ saveDeck: 'Impossible d’enregistrer le paquet',
+ studyNow: 'Étudier maintenant',
+ },
+ descriptions: {
+ emptyDeck: 'Ajoutez une note pour donner du contenu à réviser à ce paquet.',
+ editorDefault: 'Paquet d’étude ciblé.',
+ editorVisual: 'Choisissez un glyphe de couverture pour ce paquet.',
+ notesSearchPlaceholder: 'Rechercher des notes…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Cela déplace "{{title}}" vers la corbeille. Vous pourrez le restaurer plus tard.',
+ deleteDeckFallbackDescription: 'Cela déplace ce paquet vers la corbeille. Vous pourrez le restaurer plus tard.',
+ deleteDeckFallbackTitle: 'Supprimer le paquet ?',
+ deleteDeckTitle: 'Supprimer "{{title}}" ?',
+ deleteNoteDescription: 'Cela déplace "{{title}}" vers la corbeille. Vous pourrez la restaurer plus tard.',
+ deleteNoteFallbackTitle: 'Supprimer la note ?',
+ deleteNoteTitle: 'Supprimer "{{title}}" ?',
+ },
+ empty: {
+ noMatchingNotes: 'Aucune note correspondante',
+ noMatchingNotesDescription: 'Aucune note ne correspond à "{{query}}".',
+ thisDeckIsEmpty: 'Ce paquet est vide',
+ },
+ errors: {
+ couldNotCreateDeck: 'Impossible de créer le paquet',
+ couldNotDeleteDeck: 'Impossible de supprimer le paquet',
+ couldNotDeleteNote: 'Impossible de supprimer la note',
+ couldNotLoadFolderPath: 'Impossible de charger le chemin du dossier',
+ couldNotSaveDeck: 'Impossible d’enregistrer le paquet',
+ deckCouldNotLoad: 'Impossible de charger le paquet',
+ notesCouldNotLoad: 'Impossible de charger les notes',
+ notesMayBeOutOfDate: 'Les notes peuvent être obsolètes',
+ },
+ fields: {
+ descriptionLabel: 'Description du paquet',
+ descriptionPlaceholder: 'Que ce paquet vous aidera-t-il à réviser ?',
+ namePlaceholder: 'Nom du paquet',
+ untitledDeck: 'Paquet sans titre',
+ untitledDeckLower: 'paquet sans titre',
+ },
+ labels: {
+ createDeckTitle: 'Créer un paquet',
+ deck: 'Paquet',
+ deckNotesSearch: 'Recherche des notes du paquet',
+ deckOverview: 'Aperçu du paquet',
+ decks: 'Paquets',
+ due: 'À réviser',
+ dueToday: 'À réviser aujourd’hui',
+ loadingDeck: 'Chargement du paquet',
+ mastery: 'Maîtrise',
+ notes: 'Notes',
+ },
+ sort: {
+ ariaLabel: 'Trier les paquets',
+ dueToday: 'À réviser aujourd’hui',
+ title: 'Titre',
+ updated: 'Mis à jour',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Les données ont changé. Actualisez et réessayez.',
+ forbidden: 'Vous n’avez pas l’autorisation de faire cela.',
+ notFound: 'Nous n’avons pas trouvé cet élément.',
+ offline: 'Impossible de joindre le service.',
+ timeout: 'Cela a pris trop de temps. Réessayez.',
+ unauthorized: 'Connectez-vous pour continuer.',
+ unavailable: 'Le service est temporairement indisponible.',
+ },
+ fallback: {
+ unexpected: 'Erreur inattendue',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Créer un dossier',
+ deleteFolder: 'Supprimer le dossier',
+ editFolder: 'Modifier le dossier',
+ },
+ descriptions: {
+ editorDefault: 'Dossier pour paquets associés.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Cela déplace "{{name}}" vers la corbeille. Vous pourrez le restaurer plus tard.',
+ deleteFolderFallbackDescription: 'Cela déplace ce dossier vers la corbeille. Vous pourrez le restaurer plus tard.',
+ deleteFolderFallbackTitle: 'Supprimer le dossier ?',
+ deleteFolderTitle: 'Supprimer "{{name}}" ?',
+ },
+ empty: {
+ noMatchesInFolder: 'Aucune correspondance dans ce dossier',
+ noMatchesInFolderDescription: 'Aucun dossier, paquet ou note ne correspond à "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Impossible de créer le dossier',
+ couldNotDeleteFolder: 'Impossible de supprimer le dossier',
+ couldNotLoadFolderPath: 'Impossible de charger le chemin du dossier',
+ couldNotSaveFolder: 'Impossible d’enregistrer le dossier',
+ folderCouldNotLoad: 'Impossible de charger le dossier',
+ },
+ fields: {
+ descriptionLabel: 'Description du dossier',
+ descriptionPlaceholder: 'Qu’est-ce qui appartient à ce dossier ?',
+ namePlaceholder: 'Nom du dossier',
+ untitledFolder: 'Dossier sans titre',
+ },
+ labels: {
+ createFolderTitle: 'Créer un dossier',
+ folder: 'Dossier',
+ folders: 'Dossiers',
+ loadingFolder: 'Chargement du dossier',
+ name: 'Nom',
+ updated: 'Mis à jour',
+ },
+ sort: {
+ ariaLabel: 'Trier les dossiers',
+ name: 'Nom',
+ updated: 'Mis à jour',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Si les données locales et synchronisées divergent, l’élément apparaîtra ici.',
+ heading: 'État de synchronisation',
+ title: 'Conflits',
+ noConflicts: 'Aucun conflit trouvé',
+ },
+ labels: {
+ menu: 'Menu',
+ },
+ sections: {
+ settings: {
+ description: 'Personnalisez votre environnement et vos préférences',
+ title: 'Paramètres',
+ },
+ trash: {
+ description: 'Restaurez ou supprimez définitivement les éléments retirés',
+ title: 'Corbeille',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Fermer l’éditeur',
+ openActions: 'Ouvrir les actions',
+ openWorkspaces: 'Ouvrir les espaces de travail',
+ },
+ items: {
+ home: 'Accueil',
+ menu: 'Menu',
+ primary: 'Principal',
+ settings: 'Paramètres',
+ spaces: 'Espaces',
+ trash: 'Corbeille',
+ workspaces: 'Espaces de travail',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Ajouter un cloze',
+ deleteNote: 'Supprimer la note',
+ editNote: 'Modifier la note',
+ hideDerivedCardsNote: 'Masquer la note des cartes dérivées',
+ openNote: 'Ouvrir {{title}}',
+ saveNote: 'Enregistrer la note',
+ showDerivedCardsNote: 'Afficher la note des cartes dérivées',
+ },
+ descriptions: {
+ clozeFormat: 'Chaque partie masquée devient une carte de révision à l’enregistrement.',
+ clozeFormatPrefix: 'Entourez le texte masqué avec',
+ derivedCardsHelper: 'Les notes sont la source de vérité des cartes dérivées.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Cela déplace "{{title}}" vers la corbeille. Vous pourrez la restaurer plus tard.',
+ deleteNoteFallbackDescription: 'Cela déplace cette note vers la corbeille. Vous pourrez la restaurer plus tard.',
+ deleteNoteFallbackTitle: 'Supprimer la note ?',
+ deleteNoteTitle: 'Supprimer "{{title}}" ?',
+ },
+ errors: {
+ couldNotCreateNote: 'Impossible de créer la note',
+ couldNotDeleteNote: 'Impossible de supprimer la note',
+ couldNotSaveNote: 'Impossible d’enregistrer la note',
+ noteCouldNotLoad: 'Impossible de charger la note',
+ },
+ fields: {
+ back: 'Verso',
+ backPlaceholder: 'Saisissez le verso',
+ bodyPlaceholder: 'Rédigez le corps de la note avec des cloze deletions…',
+ front: 'Recto',
+ frontPlaceholder: 'Saisissez le recto',
+ noteBody: 'Corps de la note',
+ title: 'Titre',
+ titlePlaceholder: 'Ajoutez un titre de note',
+ untitledCloze: 'Cloze sans titre',
+ untitledNote: 'Note sans titre',
+ },
+ labels: {
+ backUppercase: 'VERSO',
+ basic: 'Basique',
+ basicLower: 'basique',
+ basicUppercase: 'BASIQUE',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Format cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Paquet',
+ derivedCards: 'CARTES DÉRIVÉES',
+ due: 'À réviser',
+ frontUppercase: 'RECTO',
+ inProgress: 'En cours',
+ inProgressUppercase: 'EN COURS',
+ loadingNote: 'Chargement de la note',
+ loadingNoteEditor: 'Chargement de l’éditeur de notes',
+ markdownFormatting: 'Mise en forme Markdown',
+ mastered: 'Maîtrisé',
+ masteredUppercase: 'MAÎTRISÉ',
+ newNote: 'Nouvelle note',
+ noteBody: 'CORPS DE LA NOTE',
+ noteContent: 'Contenu de la note',
+ noteDetails: 'Détails de la note',
+ noteMetadata: 'Métadonnées de la note',
+ noteType: 'Type de note',
+ notes: 'Notes',
+ reviewed: 'Révisé',
+ studyProgress: 'Progression de l’étude',
+ studyProgressUppercase: 'PROGRESSION DE L’ÉTUDE',
+ titleUppercase: 'TITRE',
+ updated: 'Mis à jour',
+ },
+ sort: {
+ ariaLabel: 'Trier les notes',
+ title: 'Titre',
+ updated: 'Mis à jour',
+ },
+ toolbar: {
+ bold: 'Gras',
+ italic: 'Italique',
+ link: 'Lien',
+ list: 'Liste',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Encore',
+ backToDeck: 'Retour au paquet',
+ continueReview: 'Continuer la révision',
+ easy: 'Facile',
+ good: 'Bien',
+ hard: 'Difficile',
+ newNote: 'Nouvelle note',
+ showAnswer: 'Afficher la réponse',
+ },
+ errors: {
+ couldNotGradeCard: 'Impossible de noter la carte',
+ reviewCouldNotLoad: 'Impossible de charger la révision',
+ reviewCouldNotStart: 'Impossible de démarrer la révision',
+ summaryCouldNotLoad: 'Impossible de charger le résumé de révision',
+ summaryNotAvailable: 'Le résumé de révision n’est pas disponible',
+ summaryNotComplete: 'Cette révision n’est pas encore terminée.',
+ },
+ labels: {
+ cardsReviewed: 'Cartes révisées',
+ deck: 'Paquet',
+ duration: 'Durée',
+ loadingReview: 'Chargement de la révision',
+ loadingSummary: 'Chargement du résumé',
+ progress: 'Progression de la révision',
+ review: 'Révision',
+ reviewComplete: 'Révision terminée',
+ reviewed_one: '{{count}} révisée',
+ reviewed_other: '{{count}} révisées',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Votre progression a été enregistrée dans ce paquet.',
+ },
+ unavailable: {
+ description: 'Ajoutez une note pour que ce paquet puisse entrer dans la file de révision.',
+ title: 'Aucune carte à réviser',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Effacer la recherche',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Aucune correspondance dans cet espace de travail',
+ noMatchesInWorkspaceDescription: 'Aucun dossier, paquet ou note ne correspond à "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'La recherche n’a pas pu aboutir',
+ },
+ labels: {
+ results: 'Résultats de recherche',
+ resultsFor: 'Résultats pour "{{query}}"',
+ searchingContent: 'Recherche de contenu',
+ },
+ resultGroups: {
+ deck: 'Paquets',
+ folder: 'Dossiers',
+ note: 'Notes',
+ },
+ resultKinds: {
+ deck: 'paquet',
+ folder: 'dossier',
+ note: 'note',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Réinitialiser tous les paramètres',
+ resetSettings: 'Réinitialiser les paramètres',
+ resetToDefaults: 'Rétablir les valeurs par défaut',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Collez un JSON valide avec 21 valeurs numériques.',
+ fsrsErrorInvalidParams_one: 'Saisissez un tableau JSON avec exactement {{count}} nombre fini.',
+ fsrsErrorInvalidParams_other: 'Saisissez un tableau JSON avec exactement {{count}} nombres finis.',
+ fsrsHelper: 'Il s’agit d’un réglage expert. Les valeurs doivent rester dans l’ordre.',
+ fsrsJsonLabel: 'JSON des paramètres FSRS',
+ fsrsTitle: 'Modifier les paramètres FSRS',
+ fsrsDescription: 'Collez un tableau JSON de 21 nombres pour remplacer les poids du scheduler.',
+ resetDescription: 'Cela restaure le fuseau horaire, les limites d’étude et les paramètres FSRS.',
+ resetDescriptionWithLanguage: 'Cela restaure la langue, le fuseau horaire, les limites d’étude et les paramètres FSRS.',
+ resetTitle: 'Réinitialiser tous les paramètres ?',
+ timezoneDescription: 'Recherchez une ville ou un identifiant de fuseau horaire.',
+ timezoneSearchLabel: 'Rechercher des fuseaux horaires',
+ timezoneSearchPlaceholder: 'Rechercher des fuseaux horaires…',
+ timezoneTitle: 'Choisir un fuseau horaire',
+ },
+ errors: {
+ couldNotResetSettings: 'Impossible de réinitialiser les paramètres',
+ couldNotSaveSettings: 'Impossible d’enregistrer les paramètres',
+ settingsCouldNotLoad: 'Impossible de charger les paramètres',
+ settingsUnavailable: 'Les paramètres sont indisponibles.',
+ },
+ labels: {
+ appearance: 'Apparence',
+ automatic: 'Automatique',
+ fsrsParameters: 'Paramètres FSRS',
+ general: 'Général',
+ language: 'Langue',
+ loadingSettings: 'Chargement des paramètres',
+ masteryHorizon: 'Horizon de maîtrise',
+ newCardOrder: 'Ordre des nouvelles cartes',
+ newCardsPerDay: 'Nouvelles cartes par jour',
+ reviewCardsPerDay: 'Cartes de révision par jour',
+ savingSettings: 'Enregistrement des paramètres',
+ schedule: 'Planification',
+ searchNoTimezones: 'Aucun fuseau horaire correspondant.',
+ settings: 'Paramètres',
+ settingsReset: 'Paramètres réinitialisés',
+ study: 'Étude',
+ targetRecallProbability: 'Probabilité de rappel cible',
+ theme: 'Thème',
+ timezone: 'Fuseau horaire',
+ },
+ options: {
+ languageEnUs: 'Anglais (États-Unis)',
+ newCardsAfterReviews: 'Après les révisions',
+ newCardsBeforeReviews: 'Avant les révisions',
+ newCardsMixed: 'Mélangé',
+ themeDark: 'Sombre',
+ themeLight: 'Clair',
+ themeSystem: 'Système',
+ timezoneSystem: 'Utiliser le fuseau horaire du système',
+ },
+ rows: {
+ fsrsDescription: 'Poids du modèle expert',
+ languageDescription: 'Langue de l’interface',
+ masteryHorizonDescription: 'Nombre de jours pendant lesquels une carte doit rester rappelable au seuil cible ou au-dessus pour compter comme maîtrisée',
+ newCardOrderDescription: 'Ordre des nouvelles cartes par rapport aux révisions',
+ newCardsPerDayDescription: 'Nombre maximal de nouvelles cartes par jour',
+ reviewCardsPerDayDescription: 'Nombre maximal de cartes de révision par jour',
+ targetRecallProbabilityDescription: 'Probabilité minimale de rappel lors de la prochaine révision planifiée',
+ timezoneDescription: 'Utilisez le fuseau horaire automatique ou choisissez une ville.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Supprimer définitivement',
+ empty: 'Vider',
+ emptyTrash: 'Vider la corbeille',
+ restore: 'Restaurer',
+ restoringItem: 'Restauration de {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Cela supprime définitivement "{{title}}". Cette action est irréversible.',
+ deleteItemFallbackDescription: 'Cela supprime définitivement cet élément. Cette action est irréversible.',
+ deleteItemFallbackTitle: 'Supprimer l’élément ?',
+ deleteItemTitle: 'Supprimer "{{title}}" ?',
+ emptyTrashDescription: 'Cela supprime définitivement tout ce qui se trouve dans la corbeille. Cette action est irréversible.',
+ emptyTrashTitle: 'Vider la corbeille ?',
+ },
+ empty: {
+ description: 'Les éléments que vous supprimez apparaissent ici avant leur suppression définitive.',
+ title: 'La corbeille est vide',
+ },
+ errors: {
+ couldNotDeleteItem: 'Impossible de supprimer l’élément',
+ couldNotEmptyTrash: 'Impossible de vider la corbeille',
+ couldNotRestoreItem: 'Impossible de restaurer l’élément',
+ trashCouldNotLoad: 'Impossible de charger la corbeille',
+ trashMayBeOutOfDate: 'La corbeille peut être obsolète',
+ },
+ labels: {
+ deletedAge: 'Supprimé {{value}}',
+ itemCount_one: '{{count}} élément',
+ itemCount_other: '{{count}} éléments',
+ lastEmptied: 'Vidée pour la dernière fois {{value}}',
+ loadingTrash: 'Chargement de la corbeille',
+ originalLocation: 'Emplacement d’origine : {{location}}',
+ title: 'Corbeille',
+ trashActions: 'Actions de corbeille pour {{title}}',
+ },
+ kinds: {
+ deck: 'Paquet',
+ folder: 'Dossier',
+ note: 'Note',
+ workspace: 'Espace de travail',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Créer un espace de travail',
+ deleteWorkspace: 'Supprimer l’espace de travail',
+ editWorkspace: 'Modifier l’espace de travail',
+ newWorkspace: 'Nouvel espace de travail',
+ openWorkspace: 'Ouvrir {{title}}',
+ openingWorkspace: 'Ouverture de {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Contexte d’étude.',
+ editorVisual: 'Choisissez un repère visuel pour cet espace de travail.',
+ emptyList: 'Séparez les paquets, les notes et les files de révision par contexte d’étude.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Cela déplace "{{title}}" vers la corbeille. Vous pourrez le restaurer plus tard.',
+ deleteWorkspaceFallbackDescription: 'Cela déplace cet espace de travail vers la corbeille. Vous pourrez le restaurer plus tard.',
+ deleteWorkspaceFallbackTitle: 'Supprimer l’espace de travail ?',
+ deleteWorkspaceTitle: 'Supprimer "{{title}}" ?',
+ },
+ empty: {
+ startWithWorkspace: 'Commencez avec un espace de travail',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Impossible de créer l’espace de travail',
+ couldNotDeleteWorkspace: 'Impossible de supprimer l’espace de travail',
+ couldNotOpenWorkspace: 'Impossible d’ouvrir l’espace de travail',
+ couldNotSaveWorkspace: 'Impossible d’enregistrer l’espace de travail',
+ workspaceCouldNotLoad: 'Impossible de charger l’espace de travail',
+ workspacesCouldNotLoad: 'Impossible de charger les espaces de travail',
+ },
+ fields: {
+ descriptionLabel: 'Description de l’espace de travail',
+ descriptionPlaceholder: 'Qu’est-ce qui appartient à cet espace de travail ?',
+ namePlaceholder: 'Nom de l’espace de travail',
+ untitledWorkspace: 'Espace de travail sans titre',
+ },
+ labels: {
+ createWorkspaceTitle: 'Créer un espace de travail',
+ loadingWorkspaces: 'Chargement des espaces de travail',
+ workspace: 'Espace de travail',
+ workspaces: 'Espaces de travail',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/he.ts b/ui/src/core/i18n/resources/he.ts
new file mode 100644
index 0000000..e90b8f9
--- /dev/null
+++ b/ui/src/core/i18n/resources/he.ts
@@ -0,0 +1,636 @@
+export const he = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'נסו שוב. אם זה ממשיך לקרות, פתחו את Clear מחדש.',
+ title: 'לא ניתן להתחיל',
+ },
+ loadingTitle: 'מכינים את מרחב הלמידה שלכם',
+ },
+ common: {
+ actions: {
+ back: 'חזרה',
+ cancel: 'ביטול',
+ checkAgain: 'בדיקה חוזרת',
+ close: 'סגירה',
+ create: 'יצירה',
+ delete: 'מחיקה',
+ dismissError: 'הסתרת שגיאה',
+ dismissStatus: 'הסתרת סטטוס',
+ edit: 'עריכה',
+ itemActions: 'פעולות עבור {{title}}',
+ reset: 'איפוס',
+ review: 'סקירה',
+ save: 'שמירה',
+ saveChanges: 'שמירת שינויים',
+ tryAgain: 'נסו שוב',
+ },
+ labels: {
+ active: 'פעיל',
+ clear: 'Clear',
+ custom: 'מותאם אישית',
+ default: 'ברירת מחדל',
+ loadingEditor: 'העורך נטען',
+ name: 'שם',
+ completedTask: 'משימה שהושלמה',
+ description: 'תיאור',
+ incompleteTask: 'משימה שלא הושלמה',
+ percentageInput: 'אחוז {{label}}',
+ visual: 'ייצוג חזותי',
+ },
+ status: {
+ actionFailed: 'הפעולה נכשלה',
+ actionInProgress: 'הפעולה מתבצעת',
+ },
+ sort: {
+ ascending: 'עולה',
+ column: 'עמודה',
+ descending: 'יורד',
+ direction: 'כיוון',
+ sort: 'מיון',
+ },
+ search: {
+ label: 'חיפוש',
+ },
+ visualPicker: {
+ allLucideIcons: 'כל סמלי Lucide',
+ browseIconsFor: 'עיינו או חפשו סמלים עבור {{label}}.',
+ chooseIcon: 'בחירת סמל',
+ iconPicker: 'בורר סמלים עבור {{label}}',
+ iconSearch: 'חיפוש סמלים עבור {{label}}',
+ iconsCouldNotLoad: 'לא ניתן היה לטעון את הסמלים.',
+ loadingIcons: 'הסמלים נטענים',
+ loadingMoreIcons: 'סמלים נוספים נטענים',
+ moreIcons: 'סמלים נוספים',
+ noIconsMatch: 'אין סמלים שתואמים ל-"{{query}}".',
+ searchIconsPlaceholder: 'חיפוש סמלים…',
+ selectedIcon: '{{label}} נבחר',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'יצירה',
+ newDeck: 'חפיסה חדשה',
+ newFolder: 'תיקייה חדשה',
+ },
+ descriptions: {
+ defaultWorkspace: 'שמרו חפיסות, תיקיות והערות יחד.',
+ emptyWorkspace: 'צרו חפיסה, ואז הוסיפו הערות כדי לבנות תור סקירה.',
+ emptyFolder: 'צרו חפיסה, ואז הוסיפו הערות כדי לבנות תור סקירה.',
+ searchPlaceholder: 'חיפוש תיקיות, חפיסות והערות…',
+ },
+ empty: {
+ createFirstDeck: 'צרו את החפיסה הראשונה שלכם',
+ },
+ errors: {
+ couldNotDeleteDeck: 'לא ניתן היה למחוק את החפיסה',
+ couldNotDeleteFolder: 'לא ניתן היה למחוק את התיקייה',
+ couldNotDeleteWorkspace: 'לא ניתן היה למחוק את מרחב העבודה',
+ dashboardCouldNotOpen: 'לא ניתן היה לפתוח את לוח הבקרה',
+ decksCouldNotLoad: 'לא ניתן היה לטעון חפיסות',
+ decksMayBeOutOfDate: 'ייתכן שהחפיסות אינן עדכניות',
+ foldersCouldNotLoad: 'לא ניתן היה לטעון תיקיות',
+ foldersMayBeOutOfDate: 'ייתכן שהתיקיות אינן עדכניות',
+ workspaceCouldNotLoad: 'לא ניתן היה לטעון את מרחב העבודה',
+ },
+ labels: {
+ dashboard: 'לוח בקרה',
+ loadingDashboard: 'לוח הבקרה נטען',
+ newItem: 'פריט חדש',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'התאריך לא זמין',
+ },
+ age: {
+ dayAgo_one: 'לפני {{count}} יום',
+ dayAgo_two: 'לפני {{count}} ימים',
+ dayAgo_other: 'לפני {{count}} ימים',
+ hourAgo_one: 'לפני {{count}} שעה',
+ hourAgo_two: 'לפני {{count}} שעות',
+ hourAgo_other: 'לפני {{count}} שעות',
+ justNow: 'ממש עכשיו',
+ minuteAgo_one: 'לפני {{count}} דקה',
+ minuteAgo_two: 'לפני {{count}} דקות',
+ minuteAgo_other: 'לפני {{count}} דקות',
+ unavailable: 'התאריך לא זמין',
+ weekAgo_one: 'לפני {{count}} שבוע',
+ weekAgo_two: 'לפני {{count}} שבועות',
+ weekAgo_other: 'לפני {{count}} שבועות',
+ },
+ labels: {
+ deleted: 'נמחק {{value}}',
+ due: 'מועד: {{value}}',
+ reviewed: 'נסקר: {{value}}',
+ updated: 'עודכן {{value}}',
+ updatedUppercase: 'עודכן {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'לפני {{count}} יום',
+ dayAgo_two: 'לפני {{count}} ימים',
+ dayAgo_other: 'לפני {{count}} ימים',
+ inAMoment: 'בעוד רגע',
+ inDay_one: 'בעוד {{count}} יום',
+ inDay_two: 'בעוד {{count}} ימים',
+ inDay_other: 'בעוד {{count}} ימים',
+ inMonth_one: 'בעוד {{count}} חודש',
+ inMonth_two: 'בעוד {{count}} חודשים',
+ inMonth_other: 'בעוד {{count}} חודשים',
+ inWeek_one: 'בעוד {{count}} שבוע',
+ inWeek_two: 'בעוד {{count}} שבועות',
+ inWeek_other: 'בעוד {{count}} שבועות',
+ justNow: 'ממש עכשיו',
+ monthAgo_one: 'לפני {{count}} חודש',
+ monthAgo_two: 'לפני {{count}} חודשים',
+ monthAgo_other: 'לפני {{count}} חודשים',
+ secondsAgoShort: 'לפני {{count}}ש',
+ minutesAgoShort: 'לפני {{count}}ד',
+ hoursAgoShort: 'לפני {{count}}ש׳',
+ today: 'היום',
+ tomorrow: 'מחר',
+ weekAgo_one: 'לפני {{count}} שבוע',
+ weekAgo_two: 'לפני {{count}} שבועות',
+ weekAgo_other: 'לפני {{count}} שבועות',
+ yesterday: 'אתמול',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'פעולות עבור {{title}}',
+ createDeck: 'יצירת חפיסה',
+ createNote: 'יצירת הערה',
+ deleteDeck: 'מחיקת חפיסה',
+ editDeck: 'עריכת חפיסה',
+ newNote: 'הערה חדשה',
+ openDeck: 'פתיחת חפיסת {{title}}',
+ saveDeck: 'לא ניתן היה לשמור את החפיסה',
+ studyNow: 'ללמוד עכשיו',
+ },
+ descriptions: {
+ emptyDeck: 'הוסיפו הערה כדי שלחפיסה הזו יהיה חומר לסקירה.',
+ editorDefault: 'חפיסת לימוד ממוקדת.',
+ editorVisual: 'בחרו סמל כיסוי לחפיסה הזו.',
+ notesSearchPlaceholder: 'חיפוש הערות…',
+ },
+ dialogs: {
+ deleteDeckDescription: '"{{title}}" תועבר לאשפה. ניתן לשחזר אותה מאוחר יותר.',
+ deleteDeckFallbackDescription: 'החפיסה הזו תועבר לאשפה. ניתן לשחזר אותה מאוחר יותר.',
+ deleteDeckFallbackTitle: 'למחוק את החפיסה?',
+ deleteDeckTitle: 'למחוק את "{{title}}"?',
+ deleteNoteDescription: '"{{title}}" תועבר לאשפה. ניתן לשחזר אותה מאוחר יותר.',
+ deleteNoteFallbackTitle: 'למחוק את ההערה?',
+ deleteNoteTitle: 'למחוק את "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'אין הערות תואמות',
+ noMatchingNotesDescription: 'לא נמצאו הערות שתואמות ל-"{{query}}".',
+ thisDeckIsEmpty: 'החפיסה הזו ריקה',
+ },
+ errors: {
+ couldNotCreateDeck: 'לא ניתן היה ליצור את החפיסה',
+ couldNotDeleteDeck: 'לא ניתן היה למחוק את החפיסה',
+ couldNotDeleteNote: 'לא ניתן היה למחוק את ההערה',
+ couldNotLoadFolderPath: 'לא ניתן היה לטעון את נתיב התיקייה',
+ couldNotSaveDeck: 'לא ניתן היה לשמור את החפיסה',
+ deckCouldNotLoad: 'לא ניתן היה לטעון את החפיסה',
+ notesCouldNotLoad: 'לא ניתן היה לטעון הערות',
+ notesMayBeOutOfDate: 'ייתכן שההערות אינן עדכניות',
+ },
+ fields: {
+ descriptionLabel: 'תיאור החפיסה',
+ descriptionPlaceholder: 'מה החפיסה הזו תעזור לכם לסקור?',
+ namePlaceholder: 'שם החפיסה',
+ untitledDeck: 'חפיסה ללא שם',
+ untitledDeckLower: 'חפיסה ללא שם',
+ },
+ labels: {
+ createDeckTitle: 'יצירת חפיסה',
+ deck: 'חפיסה',
+ deckNotesSearch: 'חיפוש הערות בחפיסה',
+ deckOverview: 'סקירת חפיסה',
+ decks: 'חפיסות',
+ due: 'מועד',
+ dueToday: 'מועד היום',
+ loadingDeck: 'החפיסה נטענת',
+ mastery: 'שליטה',
+ notes: 'הערות',
+ },
+ sort: {
+ ariaLabel: 'מיון חפיסות',
+ dueToday: 'מועד היום',
+ title: 'כותרת',
+ updated: 'עודכן',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'הנתונים השתנו. רעננו ונסו שוב.',
+ forbidden: 'אין לכם הרשאה לבצע זאת.',
+ notFound: 'לא הצלחנו למצוא את הפריט הזה.',
+ offline: 'לא ניתן להגיע לשירות.',
+ timeout: 'זה נמשך יותר מדי זמן. נסו שוב.',
+ unauthorized: 'התחברו כדי להמשיך.',
+ unavailable: 'השירות אינו זמין זמנית.',
+ },
+ fallback: {
+ unexpected: 'שגיאה בלתי צפויה',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'יצירת תיקייה',
+ deleteFolder: 'מחיקת תיקייה',
+ editFolder: 'עריכת תיקייה',
+ },
+ descriptions: {
+ editorDefault: 'תיקייה לחפיסות קשורות.',
+ },
+ dialogs: {
+ deleteFolderDescription: '"{{name}}" תועבר לאשפה. ניתן לשחזר אותה מאוחר יותר.',
+ deleteFolderFallbackDescription: 'התיקייה הזו תועבר לאשפה. ניתן לשחזר אותה מאוחר יותר.',
+ deleteFolderFallbackTitle: 'למחוק את התיקייה?',
+ deleteFolderTitle: 'למחוק את "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'אין תוצאות בתיקייה הזו',
+ noMatchesInFolderDescription: 'לא נמצאו תיקיות, חפיסות או הערות שתואמות ל-"{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'לא ניתן היה ליצור את התיקייה',
+ couldNotDeleteFolder: 'לא ניתן היה למחוק את התיקייה',
+ couldNotLoadFolderPath: 'לא ניתן היה לטעון את נתיב התיקייה',
+ couldNotSaveFolder: 'לא ניתן היה לשמור את התיקייה',
+ folderCouldNotLoad: 'לא ניתן היה לטעון את התיקייה',
+ },
+ fields: {
+ descriptionLabel: 'תיאור התיקייה',
+ descriptionPlaceholder: 'מה שייך לתיקייה הזו?',
+ namePlaceholder: 'שם התיקייה',
+ untitledFolder: 'תיקייה ללא שם',
+ },
+ labels: {
+ createFolderTitle: 'יצירת תיקייה',
+ folder: 'תיקייה',
+ folders: 'תיקיות',
+ loadingFolder: 'התיקייה נטענת',
+ name: 'שם',
+ updated: 'עודכן',
+ },
+ sort: {
+ ariaLabel: 'מיון תיקיות',
+ name: 'שם',
+ updated: 'עודכן',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'אם נתונים מקומיים ומסונכרנים יהיו שונים, הפריט יופיע כאן.',
+ heading: 'סטטוס סנכרון',
+ title: 'התנגשויות',
+ noConflicts: 'לא נמצאו התנגשויות',
+ },
+ labels: {
+ menu: 'תפריט',
+ },
+ sections: {
+ settings: {
+ description: 'התאימו את הסביבה וההעדפות שלכם',
+ title: 'הגדרות',
+ },
+ trash: {
+ description: 'שחזרו או מחקו לצמיתות פריטים שהוסרו',
+ title: 'אשפה',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'סגירת העורך',
+ openActions: 'פתיחת פעולות',
+ openWorkspaces: 'פתיחת מרחבי עבודה',
+ },
+ items: {
+ home: 'בית',
+ menu: 'תפריט',
+ primary: 'ראשי',
+ settings: 'הגדרות',
+ spaces: 'מרחבים',
+ trash: 'אשפה',
+ workspaces: 'מרחבי עבודה',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'הוספת Cloze',
+ deleteNote: 'מחיקת הערה',
+ editNote: 'עריכת הערה',
+ hideDerivedCardsNote: 'הסתרת הערת כרטיסים נגזרים',
+ openNote: 'פתיחת {{title}}',
+ saveNote: 'שמירת הערה',
+ showDerivedCardsNote: 'הצגת הערת כרטיסים נגזרים',
+ },
+ descriptions: {
+ clozeFormat: 'כל חלק מוסתר יהפוך לכרטיס סקירה לאחר השמירה.',
+ clozeFormatPrefix: 'עטפו טקסט מוסתר עם',
+ derivedCardsHelper: 'הערות הן מקור האמת לכרטיסים נגזרים.',
+ },
+ dialogs: {
+ deleteNoteDescription: '"{{title}}" תועבר לאשפה. ניתן לשחזר אותה מאוחר יותר.',
+ deleteNoteFallbackDescription: 'ההערה הזו תועבר לאשפה. ניתן לשחזר אותה מאוחר יותר.',
+ deleteNoteFallbackTitle: 'למחוק את ההערה?',
+ deleteNoteTitle: 'למחוק את "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'לא ניתן היה ליצור את ההערה',
+ couldNotDeleteNote: 'לא ניתן היה למחוק את ההערה',
+ couldNotSaveNote: 'לא ניתן היה לשמור את ההערה',
+ noteCouldNotLoad: 'לא ניתן היה לטעון את ההערה',
+ },
+ fields: {
+ back: 'גב',
+ backPlaceholder: 'הזינו צד גב',
+ bodyPlaceholder: 'כתבו את גוף ההערה עם מחיקות Cloze…',
+ front: 'חזית',
+ frontPlaceholder: 'הזינו צד חזית',
+ noteBody: 'גוף ההערה',
+ title: 'כותרת',
+ titlePlaceholder: 'הוסיפו כותרת להערה',
+ untitledCloze: 'Cloze ללא שם',
+ untitledNote: 'הערה ללא שם',
+ },
+ labels: {
+ backUppercase: 'גב',
+ basic: 'בסיסי',
+ basicLower: 'בסיסי',
+ basicUppercase: 'בסיסי',
+ cloze: 'Cloze',
+ clozeLower: 'Cloze',
+ clozeFormat: 'תבנית Cloze',
+ clozeUppercase: 'Cloze',
+ deck: 'חפיסה',
+ derivedCards: 'כרטיסים נגזרים',
+ due: 'מועד',
+ frontUppercase: 'חזית',
+ inProgress: 'בתהליך',
+ inProgressUppercase: 'בתהליך',
+ loadingNote: 'ההערה נטענת',
+ loadingNoteEditor: 'עורך ההערות נטען',
+ markdownFormatting: 'עיצוב Markdown',
+ mastered: 'נשלט',
+ masteredUppercase: 'נשלט',
+ newNote: 'הערה חדשה',
+ noteBody: 'גוף ההערה',
+ noteContent: 'תוכן ההערה',
+ noteDetails: 'פרטי ההערה',
+ noteMetadata: 'מטא־נתוני ההערה',
+ noteType: 'סוג הערה',
+ notes: 'הערות',
+ reviewed: 'נסקר',
+ studyProgress: 'התקדמות לימוד',
+ studyProgressUppercase: 'התקדמות לימוד',
+ titleUppercase: 'כותרת',
+ updated: 'עודכן',
+ },
+ sort: {
+ ariaLabel: 'מיון הערות',
+ title: 'כותרת',
+ updated: 'עודכן',
+ },
+ toolbar: {
+ bold: 'מודגש',
+ italic: 'נטוי',
+ link: 'קישור',
+ list: 'רשימה',
+ },
+ },
+ review: {
+ actions: {
+ again: 'שוב',
+ backToDeck: 'חזרה לחפיסה',
+ continueReview: 'המשך סקירה',
+ easy: 'קל',
+ good: 'טוב',
+ hard: 'קשה',
+ newNote: 'הערה חדשה',
+ showAnswer: 'הצגת תשובה',
+ },
+ errors: {
+ couldNotGradeCard: 'לא ניתן היה לדרג את הכרטיס',
+ reviewCouldNotLoad: 'לא ניתן היה לטעון את הסקירה',
+ reviewCouldNotStart: 'לא ניתן היה להתחיל את הסקירה',
+ summaryCouldNotLoad: 'לא ניתן היה לטעון את סיכום הסקירה',
+ summaryNotAvailable: 'סיכום הסקירה אינו זמין',
+ summaryNotComplete: 'הסקירה הזו עדיין לא הושלמה.',
+ },
+ labels: {
+ cardsReviewed: 'כרטיסים שנסקרו',
+ deck: 'חפיסה',
+ duration: 'משך',
+ loadingReview: 'הסקירה נטענת',
+ loadingSummary: 'הסיכום נטען',
+ progress: 'התקדמות הסקירה',
+ review: 'סקירה',
+ reviewComplete: 'הסקירה הושלמה',
+ reviewed_one: '{{count}} נסקר',
+ reviewed_two: '{{count}} נסקרו',
+ reviewed_other: '{{count}} נסקרו',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}}ש {{minutes}}ד',
+ durationMinutes: '{{minutes}}ד',
+ durationSeconds: '{{seconds}}שנ',
+ saved: 'ההתקדמות שלכם נשמרה בחפיסה הזו.',
+ },
+ unavailable: {
+ description: 'הוסיפו הערה כדי שהחפיסה הזו תוכל להיכנס לתור הסקירה.',
+ title: 'אין כרטיסים לסקירה',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'ניקוי חיפוש',
+ },
+ empty: {
+ noMatchesInWorkspace: 'אין תוצאות במרחב העבודה הזה',
+ noMatchesInWorkspaceDescription: 'לא נמצאו תיקיות, חפיסות או הערות שתואמות ל-"{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'לא ניתן היה להשלים את החיפוש',
+ },
+ labels: {
+ results: 'תוצאות חיפוש',
+ resultsFor: 'תוצאות עבור "{{query}}"',
+ searchingContent: 'מתבצע חיפוש בתוכן',
+ },
+ resultGroups: {
+ deck: 'חפיסות',
+ folder: 'תיקיות',
+ note: 'הערות',
+ },
+ resultKinds: {
+ deck: 'חפיסה',
+ folder: 'תיקייה',
+ note: 'הערה',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'איפוס כל ההגדרות',
+ resetSettings: 'איפוס הגדרות',
+ resetToDefaults: 'איפוס לברירות המחדל',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'הדביקו JSON תקין עם 21 ערכים מספריים.',
+ fsrsErrorInvalidParams_one: 'הזינו מערך JSON עם בדיוק {{count}} מספר סופי.',
+ fsrsErrorInvalidParams_two: 'הזינו מערך JSON עם בדיוק {{count}} מספרים סופיים.',
+ fsrsErrorInvalidParams_other: 'הזינו מערך JSON עם בדיוק {{count}} מספרים סופיים.',
+ fsrsHelper: 'זו עקיפה למומחים. הערכים חייבים להישאר לפי הסדר.',
+ fsrsJsonLabel: 'JSON של פרמטרי FSRS',
+ fsrsTitle: 'עריכת פרמטרי FSRS',
+ fsrsDescription: 'הדביקו מערך JSON עם 21 מספרים כדי לעקוף את משקלי המתזמן.',
+ resetDescription: 'פעולה זו משחזרת אזור זמן, מגבלות לימוד והגדרות FSRS.',
+ resetDescriptionWithLanguage: 'פעולה זו משחזרת שפה, אזור זמן, מגבלות לימוד והגדרות FSRS.',
+ resetTitle: 'לאפס את כל ההגדרות?',
+ timezoneDescription: 'חפשו עיר או מזהה אזור זמן.',
+ timezoneSearchLabel: 'חיפוש אזורי זמן',
+ timezoneSearchPlaceholder: 'חיפוש אזורי זמן…',
+ timezoneTitle: 'בחירת אזור זמן',
+ },
+ errors: {
+ couldNotResetSettings: 'לא ניתן היה לאפס את ההגדרות',
+ couldNotSaveSettings: 'לא ניתן היה לשמור את ההגדרות',
+ settingsCouldNotLoad: 'לא ניתן היה לטעון את ההגדרות',
+ settingsUnavailable: 'ההגדרות אינן זמינות.',
+ },
+ labels: {
+ appearance: 'מראה',
+ automatic: 'אוטומטי',
+ fsrsParameters: 'פרמטרי FSRS',
+ general: 'כללי',
+ language: 'שפה',
+ loadingSettings: 'ההגדרות נטענות',
+ masteryHorizon: 'אופק שליטה',
+ newCardOrder: 'סדר כרטיסים חדשים',
+ newCardsPerDay: 'כרטיסים חדשים ביום',
+ reviewCardsPerDay: 'כרטיסי סקירה ביום',
+ savingSettings: 'ההגדרות נשמרות',
+ schedule: 'לוח זמנים',
+ searchNoTimezones: 'אין אזורי זמן תואמים.',
+ settings: 'הגדרות',
+ settingsReset: 'איפוס הגדרות',
+ study: 'לימוד',
+ targetRecallProbability: 'הסתברות זכירה יעד',
+ theme: 'ערכת נושא',
+ timezone: 'אזור זמן',
+ },
+ options: {
+ languageEnUs: 'אנגלית (ארה״ב)',
+ newCardsAfterReviews: 'אחרי סקירות',
+ newCardsBeforeReviews: 'לפני סקירות',
+ newCardsMixed: 'מעורב',
+ themeDark: 'כהה',
+ themeLight: 'בהיר',
+ themeSystem: 'מערכת',
+ timezoneSystem: 'שימוש באזור הזמן של המערכת',
+ },
+ rows: {
+ fsrsDescription: 'משקלי מודל למומחים',
+ languageDescription: 'שפת הממשק',
+ masteryHorizonDescription: 'מספר הימים שכרטיס צריך להישאר ניתן לזכירה ברמת הסתברות היעד או מעליה כדי להיחשב נשלט',
+ newCardOrderDescription: 'סדר הכרטיסים החדשים ביחס לסקירות',
+ newCardsPerDayDescription: 'מספר מרבי של כרטיסים חדשים ביום',
+ reviewCardsPerDayDescription: 'מספר מרבי של כרטיסי סקירה ביום',
+ targetRecallProbabilityDescription: 'הסתברות הזכירה המזערית בסקירה המתוזמנת הבאה',
+ timezoneDescription: 'השתמשו באזור זמן אוטומטי או בחרו עיר.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'מחיקה לצמיתות',
+ empty: 'ריקון',
+ emptyTrash: 'ריקון האשפה',
+ restore: 'שחזור',
+ restoringItem: '{{title}} משוחזר',
+ },
+ dialogs: {
+ deleteItemDescription: '"{{title}}" יימחק לצמיתות. לא ניתן לבטל פעולה זו.',
+ deleteItemFallbackDescription: 'הפריט הזה יימחק לצמיתות. לא ניתן לבטל פעולה זו.',
+ deleteItemFallbackTitle: 'למחוק את הפריט?',
+ deleteItemTitle: 'למחוק את "{{title}}"?',
+ emptyTrashDescription: 'כל מה שבאשפה יימחק לצמיתות. לא ניתן לבטל פעולה זו.',
+ emptyTrashTitle: 'לרוקן את האשפה?',
+ },
+ empty: {
+ description: 'פריטים שתמחקו יופיעו כאן לפני הסרה לצמיתות.',
+ title: 'האשפה ריקה',
+ },
+ errors: {
+ couldNotDeleteItem: 'לא ניתן היה למחוק את הפריט',
+ couldNotEmptyTrash: 'לא ניתן היה לרוקן את האשפה',
+ couldNotRestoreItem: 'לא ניתן היה לשחזר את הפריט',
+ trashCouldNotLoad: 'לא ניתן היה לטעון את האשפה',
+ trashMayBeOutOfDate: 'ייתכן שהאשפה אינה עדכנית',
+ },
+ labels: {
+ deletedAge: 'נמחק {{value}}',
+ itemCount_one: '{{count}} פריט',
+ itemCount_two: '{{count}} פריטים',
+ itemCount_other: '{{count}} פריטים',
+ lastEmptied: 'רוקנה לאחרונה {{value}}',
+ loadingTrash: 'האשפה נטענת',
+ originalLocation: 'מיקום מקורי: {{location}}',
+ title: 'אשפה',
+ trashActions: 'פעולות אשפה עבור {{title}}',
+ },
+ kinds: {
+ deck: 'חפיסה',
+ folder: 'תיקייה',
+ note: 'הערה',
+ workspace: 'מרחב עבודה',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'יצירת מרחב עבודה',
+ deleteWorkspace: 'מחיקת מרחב עבודה',
+ editWorkspace: 'עריכת מרחב עבודה',
+ newWorkspace: 'מרחב עבודה חדש',
+ openWorkspace: 'פתיחת {{title}}',
+ openingWorkspace: '{{title}} נפתח',
+ },
+ descriptions: {
+ editorDefault: 'הקשר לימוד.',
+ editorVisual: 'בחרו עוגן חזותי למרחב העבודה הזה.',
+ emptyList: 'הפרידו חפיסות, הערות ותורי סקירה לפי הקשר לימוד.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: '"{{title}}" יועבר לאשפה. ניתן לשחזר אותו מאוחר יותר.',
+ deleteWorkspaceFallbackDescription: 'מרחב העבודה הזה יועבר לאשפה. ניתן לשחזר אותו מאוחר יותר.',
+ deleteWorkspaceFallbackTitle: 'למחוק את מרחב העבודה?',
+ deleteWorkspaceTitle: 'למחוק את "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'התחילו עם מרחב עבודה',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'לא ניתן היה ליצור את מרחב העבודה',
+ couldNotDeleteWorkspace: 'לא ניתן היה למחוק את מרחב העבודה',
+ couldNotOpenWorkspace: 'לא ניתן היה לפתוח את מרחב העבודה',
+ couldNotSaveWorkspace: 'לא ניתן היה לשמור את מרחב העבודה',
+ workspaceCouldNotLoad: 'לא ניתן היה לטעון את מרחב העבודה',
+ workspacesCouldNotLoad: 'לא ניתן היה לטעון מרחבי עבודה',
+ },
+ fields: {
+ descriptionLabel: 'תיאור מרחב העבודה',
+ descriptionPlaceholder: 'מה שייך למרחב העבודה הזה?',
+ namePlaceholder: 'שם מרחב העבודה',
+ untitledWorkspace: 'מרחב עבודה ללא שם',
+ },
+ labels: {
+ createWorkspaceTitle: 'יצירת מרחב עבודה',
+ loadingWorkspaces: 'מרחבי העבודה נטענים',
+ workspace: 'מרחב עבודה',
+ workspaces: 'מרחבי עבודה',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/hr.ts b/ui/src/core/i18n/resources/hr.ts
new file mode 100644
index 0000000..debad50
--- /dev/null
+++ b/ui/src/core/i18n/resources/hr.ts
@@ -0,0 +1,636 @@
+export const hr = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Pokušajte ponovno. Ako se ovo nastavi događati, ponovno otvorite Clear.',
+ title: 'Pokretanje nije uspjelo',
+ },
+ loadingTitle: 'Priprema se vaš prostor za učenje',
+ },
+ common: {
+ actions: {
+ back: 'Natrag',
+ cancel: 'Odustani',
+ checkAgain: 'Provjeri ponovno',
+ close: 'Zatvori',
+ create: 'Stvori',
+ delete: 'Izbriši',
+ dismissError: 'Zatvori pogrešku',
+ dismissStatus: 'Zatvori status',
+ edit: 'Uredi',
+ itemActions: 'Radnje za {{title}}',
+ reset: 'Vrati na početno',
+ review: 'Ponavljanje',
+ save: 'Spremi',
+ saveChanges: 'Spremi promjene',
+ tryAgain: 'Pokušaj ponovno',
+ },
+ labels: {
+ active: 'Aktivno',
+ clear: 'Clear',
+ custom: 'Prilagođeno',
+ default: 'Zadano',
+ loadingEditor: 'Učitavanje uređivača',
+ name: 'Naziv',
+ completedTask: 'Dovršen zadatak',
+ description: 'Opis',
+ incompleteTask: 'Nedovršen zadatak',
+ percentageInput: 'Postotak za {{label}}',
+ visual: 'Vizual',
+ },
+ status: {
+ actionFailed: 'Radnja nije uspjela',
+ actionInProgress: 'Radnja je u tijeku',
+ },
+ sort: {
+ ascending: 'Uzlazno',
+ column: 'Stupac',
+ descending: 'Silazno',
+ direction: 'Smjer',
+ sort: 'Sortiraj',
+ },
+ search: {
+ label: 'Pretraživanje',
+ },
+ visualPicker: {
+ allLucideIcons: 'Sve Lucide ikone',
+ browseIconsFor: 'Pregledajte ili pretražite ikone za {{label}}.',
+ chooseIcon: 'Odaberi ikonu',
+ iconPicker: 'Odabir ikone za {{label}}',
+ iconSearch: 'Pretraživanje ikona za {{label}}',
+ iconsCouldNotLoad: 'Ikone se nisu mogle učitati.',
+ loadingIcons: 'Učitavanje ikona',
+ loadingMoreIcons: 'Učitavanje dodatnih ikona',
+ moreIcons: 'Više ikona',
+ noIconsMatch: 'Nijedna ikona ne odgovara upitu "{{query}}".',
+ searchIconsPlaceholder: 'Pretraži ikone…',
+ selectedIcon: 'Odabrano: {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Stvori',
+ newDeck: 'Novi špil',
+ newFolder: 'Nova mapa',
+ },
+ descriptions: {
+ defaultWorkspace: 'Držite špilove, mape i bilješke zajedno.',
+ emptyWorkspace: 'Stvorite špil, zatim dodajte bilješke za izgradnju reda za ponavljanje.',
+ emptyFolder: 'Stvorite špil, zatim dodajte bilješke za izgradnju reda za ponavljanje.',
+ searchPlaceholder: 'Pretražite mape, špilove i bilješke…',
+ },
+ empty: {
+ createFirstDeck: 'Stvorite svoj prvi špil',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Špil se nije mogao izbrisati',
+ couldNotDeleteFolder: 'Mapa se nije mogla izbrisati',
+ couldNotDeleteWorkspace: 'Radni prostor se nije mogao izbrisati',
+ dashboardCouldNotOpen: 'Nadzorna ploča se nije mogla otvoriti',
+ decksCouldNotLoad: 'Špilovi se nisu mogli učitati',
+ decksMayBeOutOfDate: 'Špilovi možda nisu ažurni',
+ foldersCouldNotLoad: 'Mape se nisu mogle učitati',
+ foldersMayBeOutOfDate: 'Mape možda nisu ažurne',
+ workspaceCouldNotLoad: 'Radni prostor se nije mogao učitati',
+ },
+ labels: {
+ dashboard: 'Nadzorna ploča',
+ loadingDashboard: 'Učitavanje nadzorne ploče',
+ newItem: 'Nova stavka',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Datum nije dostupan',
+ },
+ age: {
+ dayAgo_one: 'prije {{count}} dan',
+ dayAgo_few: 'prije {{count}} dana',
+ dayAgo_other: 'prije {{count}} dana',
+ hourAgo_one: 'prije {{count}} sat',
+ hourAgo_few: 'prije {{count}} sata',
+ hourAgo_other: 'prije {{count}} sati',
+ justNow: 'upravo sada',
+ minuteAgo_one: 'prije {{count}} minutu',
+ minuteAgo_few: 'prije {{count}} minute',
+ minuteAgo_other: 'prije {{count}} minuta',
+ unavailable: 'datum nije dostupan',
+ weekAgo_one: 'prije {{count}} tjedan',
+ weekAgo_few: 'prije {{count}} tjedna',
+ weekAgo_other: 'prije {{count}} tjedana',
+ },
+ labels: {
+ deleted: 'Izbrisano {{value}}',
+ due: 'Rok: {{value}}',
+ reviewed: 'Ponovljeno: {{value}}',
+ updated: 'Ažurirano {{value}}',
+ updatedUppercase: 'AŽURIRANO {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'prije {{count}} dan',
+ dayAgo_few: 'prije {{count}} dana',
+ dayAgo_other: 'prije {{count}} dana',
+ inAMoment: 'Za trenutak',
+ inDay_one: 'Za {{count}} dan',
+ inDay_few: 'Za {{count}} dana',
+ inDay_other: 'Za {{count}} dana',
+ inMonth_one: 'Za {{count}} mjesec',
+ inMonth_few: 'Za {{count}} mjeseca',
+ inMonth_other: 'Za {{count}} mjeseci',
+ inWeek_one: 'Za {{count}} tjedan',
+ inWeek_few: 'Za {{count}} tjedna',
+ inWeek_other: 'Za {{count}} tjedana',
+ justNow: 'Upravo sada',
+ monthAgo_one: 'prije {{count}} mjesec',
+ monthAgo_few: 'prije {{count}} mjeseca',
+ monthAgo_other: 'prije {{count}} mjeseci',
+ secondsAgoShort: 'prije {{count}} s',
+ minutesAgoShort: 'prije {{count}} min',
+ hoursAgoShort: 'prije {{count}} h',
+ today: 'Danas',
+ tomorrow: 'Sutra',
+ weekAgo_one: 'prije {{count}} tjedan',
+ weekAgo_few: 'prije {{count}} tjedna',
+ weekAgo_other: 'prije {{count}} tjedana',
+ yesterday: 'Jučer',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Radnje za {{title}}',
+ createDeck: 'Stvori špil',
+ createNote: 'Stvori bilješku',
+ deleteDeck: 'Izbriši špil',
+ editDeck: 'Uredi špil',
+ newNote: 'Nova bilješka',
+ openDeck: 'Otvori špil {{title}}',
+ saveDeck: 'Špil se nije mogao spremiti',
+ studyNow: 'Uči sada',
+ },
+ descriptions: {
+ emptyDeck: 'Dodajte bilješku kako bi ovaj špil imao materijal za ponavljanje.',
+ editorDefault: 'Fokusirani špil za učenje.',
+ editorVisual: 'Odaberite simbol naslovnice za ovaj špil.',
+ notesSearchPlaceholder: 'Pretraži bilješke…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Ovo premješta "{{title}}" u Smeće. Možete ga vratiti kasnije.',
+ deleteDeckFallbackDescription: 'Ovo premješta ovaj špil u Smeće. Možete ga vratiti kasnije.',
+ deleteDeckFallbackTitle: 'Izbrisati špil?',
+ deleteDeckTitle: 'Izbrisati "{{title}}"?',
+ deleteNoteDescription: 'Ovo premješta "{{title}}" u Smeće. Možete je vratiti kasnije.',
+ deleteNoteFallbackTitle: 'Izbrisati bilješku?',
+ deleteNoteTitle: 'Izbrisati "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Nema odgovarajućih bilješki',
+ noMatchingNotesDescription: 'Nijedna bilješka ne odgovara upitu "{{query}}".',
+ thisDeckIsEmpty: 'Ovaj špil je prazan',
+ },
+ errors: {
+ couldNotCreateDeck: 'Špil se nije mogao stvoriti',
+ couldNotDeleteDeck: 'Špil se nije mogao izbrisati',
+ couldNotDeleteNote: 'Bilješka se nije mogla izbrisati',
+ couldNotLoadFolderPath: 'Putanja mape se nije mogla učitati',
+ couldNotSaveDeck: 'Špil se nije mogao spremiti',
+ deckCouldNotLoad: 'Špil se nije mogao učitati',
+ notesCouldNotLoad: 'Bilješke se nisu mogle učitati',
+ notesMayBeOutOfDate: 'Bilješke možda nisu ažurne',
+ },
+ fields: {
+ descriptionLabel: 'Opis špila',
+ descriptionPlaceholder: 'Što će vam ovaj špil pomoći ponavljati?',
+ namePlaceholder: 'Naziv špila',
+ untitledDeck: 'Špil bez naslova',
+ untitledDeckLower: 'špil bez naslova',
+ },
+ labels: {
+ createDeckTitle: 'Stvori špil',
+ deck: 'Špil',
+ deckNotesSearch: 'Pretraživanje bilješki u špilu',
+ deckOverview: 'Pregled špila',
+ decks: 'Špilovi',
+ due: 'Rok',
+ dueToday: 'Rok danas',
+ loadingDeck: 'Učitavanje špila',
+ mastery: 'Ovladanost',
+ notes: 'Bilješke',
+ },
+ sort: {
+ ariaLabel: 'Sortiraj špilove',
+ dueToday: 'Rok danas',
+ title: 'Naslov',
+ updated: 'Ažurirano',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Podaci su se promijenili. Osvježite i pokušajte ponovno.',
+ forbidden: 'Nemate dopuštenje za ovu radnju.',
+ notFound: 'Nismo mogli pronaći ovu stavku.',
+ offline: 'Usluga nije dostupna.',
+ timeout: 'Ovo je trajalo predugo. Pokušajte ponovno.',
+ unauthorized: 'Prijavite se za nastavak.',
+ unavailable: 'Usluga je privremeno nedostupna.',
+ },
+ fallback: {
+ unexpected: 'Neočekivana pogreška',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Stvori mapu',
+ deleteFolder: 'Izbriši mapu',
+ editFolder: 'Uredi mapu',
+ },
+ descriptions: {
+ editorDefault: 'Mapa za povezane špilove.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Ovo premješta "{{name}}" u Smeće. Možete je vratiti kasnije.',
+ deleteFolderFallbackDescription: 'Ovo premješta ovu mapu u Smeće. Možete je vratiti kasnije.',
+ deleteFolderFallbackTitle: 'Izbrisati mapu?',
+ deleteFolderTitle: 'Izbrisati "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Nema rezultata u ovoj mapi',
+ noMatchesInFolderDescription: 'Nijedna mapa, špil ili bilješka ne odgovara upitu "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Mapa se nije mogla stvoriti',
+ couldNotDeleteFolder: 'Mapa se nije mogla izbrisati',
+ couldNotLoadFolderPath: 'Putanja mape se nije mogla učitati',
+ couldNotSaveFolder: 'Mapa se nije mogla spremiti',
+ folderCouldNotLoad: 'Mapa se nije mogla učitati',
+ },
+ fields: {
+ descriptionLabel: 'Opis mape',
+ descriptionPlaceholder: 'Što pripada u ovu mapu?',
+ namePlaceholder: 'Naziv mape',
+ untitledFolder: 'Mapa bez naslova',
+ },
+ labels: {
+ createFolderTitle: 'Stvori mapu',
+ folder: 'Mapa',
+ folders: 'Mape',
+ loadingFolder: 'Učitavanje mape',
+ name: 'Naziv',
+ updated: 'Ažurirano',
+ },
+ sort: {
+ ariaLabel: 'Sortiraj mape',
+ name: 'Naziv',
+ updated: 'Ažurirano',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Ako se lokalni i sinkronizirani podaci ikada razlikuju, stavka će se pojaviti ovdje.',
+ heading: 'Status sinkronizacije',
+ title: 'Sukobi',
+ noConflicts: 'Nema pronađenih sukoba',
+ },
+ labels: {
+ menu: 'Izbornik',
+ },
+ sections: {
+ settings: {
+ description: 'Prilagodite svoje okruženje i postavke',
+ title: 'Postavke',
+ },
+ trash: {
+ description: 'Vratite ili trajno izbrišite uklonjene stavke',
+ title: 'Smeće',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Zatvori uređivač',
+ openActions: 'Otvori radnje',
+ openWorkspaces: 'Otvori radne prostore',
+ },
+ items: {
+ home: 'Početna',
+ menu: 'Izbornik',
+ primary: 'Primarno',
+ settings: 'Postavke',
+ spaces: 'Prostori',
+ trash: 'Smeće',
+ workspaces: 'Radni prostori',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Dodaj cloze',
+ deleteNote: 'Izbriši bilješku',
+ editNote: 'Uredi bilješku',
+ hideDerivedCardsNote: 'Sakrij bilješku o izvedenim karticama',
+ openNote: 'Otvori {{title}}',
+ saveNote: 'Spremi bilješku',
+ showDerivedCardsNote: 'Prikaži bilješku o izvedenim karticama',
+ },
+ descriptions: {
+ clozeFormat: 'Svaki skriveni dio postaje kartica za ponavljanje kada spremite.',
+ clozeFormatPrefix: 'Označite skriveni tekst pomoću',
+ derivedCardsHelper: 'Bilješke su izvor istine za izvedene kartice.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Ovo premješta "{{title}}" u Smeće. Možete je vratiti kasnije.',
+ deleteNoteFallbackDescription: 'Ovo premješta ovu bilješku u Smeće. Možete je vratiti kasnije.',
+ deleteNoteFallbackTitle: 'Izbrisati bilješku?',
+ deleteNoteTitle: 'Izbrisati "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Bilješka se nije mogla stvoriti',
+ couldNotDeleteNote: 'Bilješka se nije mogla izbrisati',
+ couldNotSaveNote: 'Bilješka se nije mogla spremiti',
+ noteCouldNotLoad: 'Bilješka se nije mogla učitati',
+ },
+ fields: {
+ back: 'Poleđina',
+ backPlaceholder: 'Unesite poleđinu',
+ bodyPlaceholder: 'Napišite sadržaj bilješke s cloze izostavljanjima…',
+ front: 'Prednja strana',
+ frontPlaceholder: 'Unesite prednju stranu',
+ noteBody: 'Sadržaj bilješke',
+ title: 'Naslov',
+ titlePlaceholder: 'Dodajte naslov bilješke',
+ untitledCloze: 'Cloze bez naslova',
+ untitledNote: 'Bilješka bez naslova',
+ },
+ labels: {
+ backUppercase: 'POLEĐINA',
+ basic: 'Osnovna',
+ basicLower: 'osnovna',
+ basicUppercase: 'OSNOVNA',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze format',
+ clozeUppercase: 'CLOZE',
+ deck: 'Špil',
+ derivedCards: 'IZVEDENE KARTICE',
+ due: 'Rok',
+ frontUppercase: 'PREDNJA STRANA',
+ inProgress: 'U tijeku',
+ inProgressUppercase: 'U TIJEKU',
+ loadingNote: 'Učitavanje bilješke',
+ loadingNoteEditor: 'Učitavanje uređivača bilješki',
+ markdownFormatting: 'Markdown oblikovanje',
+ mastered: 'Ovladano',
+ masteredUppercase: 'OVLADANO',
+ newNote: 'Nova bilješka',
+ noteBody: 'SADRŽAJ BILJEŠKE',
+ noteContent: 'Sadržaj bilješke',
+ noteDetails: 'Pojedinosti bilješke',
+ noteMetadata: 'Metapodaci bilješke',
+ noteType: 'Vrsta bilješke',
+ notes: 'Bilješke',
+ reviewed: 'Ponovljeno',
+ studyProgress: 'Napredak u učenju',
+ studyProgressUppercase: 'NAPREDAK U UČENJU',
+ titleUppercase: 'NASLOV',
+ updated: 'Ažurirano',
+ },
+ sort: {
+ ariaLabel: 'Sortiraj bilješke',
+ title: 'Naslov',
+ updated: 'Ažurirano',
+ },
+ toolbar: {
+ bold: 'Podebljano',
+ italic: 'Kurziv',
+ link: 'Poveznica',
+ list: 'Popis',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Ponovno',
+ backToDeck: 'Natrag na špil',
+ continueReview: 'Nastavi ponavljanje',
+ easy: 'Lako',
+ good: 'Dobro',
+ hard: 'Teško',
+ newNote: 'Nova bilješka',
+ showAnswer: 'Prikaži odgovor',
+ },
+ errors: {
+ couldNotGradeCard: 'Kartica se nije mogla ocijeniti',
+ reviewCouldNotLoad: 'Ponavljanje se nije moglo učitati',
+ reviewCouldNotStart: 'Ponavljanje se nije moglo pokrenuti',
+ summaryCouldNotLoad: 'Sažetak ponavljanja se nije mogao učitati',
+ summaryNotAvailable: 'Sažetak ponavljanja nije dostupan',
+ summaryNotComplete: 'Ovo ponavljanje još nije dovršeno.',
+ },
+ labels: {
+ cardsReviewed: 'Ponovljene kartice',
+ deck: 'Špil',
+ duration: 'Trajanje',
+ loadingReview: 'Učitavanje ponavljanja',
+ loadingSummary: 'Učitavanje sažetka',
+ progress: 'Napredak ponavljanja',
+ review: 'Ponavljanje',
+ reviewComplete: 'Ponavljanje dovršeno',
+ reviewed_one: 'Ponovljena {{count}}',
+ reviewed_few: 'Ponovljene {{count}}',
+ reviewed_other: 'Ponovljeno {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Vaš napredak spremljen je u ovaj špil.',
+ },
+ unavailable: {
+ description: 'Dodajte bilješku kako bi ovaj špil mogao ući u red za ponavljanje.',
+ title: 'Nema kartica za ponavljanje',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Očisti pretraživanje',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Nema rezultata u ovom radnom prostoru',
+ noMatchesInWorkspaceDescription: 'Nijedna mapa, špil ili bilješka ne odgovara upitu "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Pretraživanje se nije moglo dovršiti',
+ },
+ labels: {
+ results: 'Rezultati pretraživanja',
+ resultsFor: 'Rezultati za "{{query}}"',
+ searchingContent: 'Pretraživanje sadržaja',
+ },
+ resultGroups: {
+ deck: 'Špilovi',
+ folder: 'Mape',
+ note: 'Bilješke',
+ },
+ resultKinds: {
+ deck: 'špil',
+ folder: 'mapa',
+ note: 'bilješka',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Vrati sve postavke na početno',
+ resetSettings: 'Vrati postavke na početno',
+ resetToDefaults: 'Vrati zadane vrijednosti',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Zalijepite valjani JSON s 21 brojčanom vrijednošću.',
+ fsrsErrorInvalidParams_one: 'Unesite JSON polje s točno {{count}} konačnim brojem.',
+ fsrsErrorInvalidParams_few: 'Unesite JSON polje s točno {{count}} konačna broja.',
+ fsrsErrorInvalidParams_other: 'Unesite JSON polje s točno {{count}} konačnih brojeva.',
+ fsrsHelper: 'Ovo je stručna zamjena. Vrijednosti moraju ostati redom.',
+ fsrsJsonLabel: 'JSON FSRS parametara',
+ fsrsTitle: 'Uredi FSRS parametre',
+ fsrsDescription: 'Zalijepite JSON polje s 21 brojem za zamjenu težina planera.',
+ resetDescription: 'Ovo vraća vremensku zonu, ograničenja učenja i FSRS postavke.',
+ resetDescriptionWithLanguage: 'Ovo vraća jezik, vremensku zonu, ograničenja učenja i FSRS postavke.',
+ resetTitle: 'Vratiti sve postavke na početno?',
+ timezoneDescription: 'Pretražite grad ili identifikator vremenske zone.',
+ timezoneSearchLabel: 'Pretraži vremenske zone',
+ timezoneSearchPlaceholder: 'Pretraži vremenske zone…',
+ timezoneTitle: 'Odaberite vremensku zonu',
+ },
+ errors: {
+ couldNotResetSettings: 'Postavke se nisu mogle vratiti na početno',
+ couldNotSaveSettings: 'Postavke se nisu mogle spremiti',
+ settingsCouldNotLoad: 'Postavke se nisu mogle učitati',
+ settingsUnavailable: 'Postavke nisu dostupne.',
+ },
+ labels: {
+ appearance: 'Izgled',
+ automatic: 'Automatski',
+ fsrsParameters: 'FSRS parametri',
+ general: 'Općenito',
+ language: 'Jezik',
+ loadingSettings: 'Učitavanje postavki',
+ masteryHorizon: 'Horizont ovladavanja',
+ newCardOrder: 'Redoslijed novih kartica',
+ newCardsPerDay: 'Nove kartice po danu',
+ reviewCardsPerDay: 'Kartice za ponavljanje po danu',
+ savingSettings: 'Spremanje postavki',
+ schedule: 'Raspored',
+ searchNoTimezones: 'Nema odgovarajućih vremenskih zona.',
+ settings: 'Postavke',
+ settingsReset: 'Postavke su vraćene na početno',
+ study: 'Učenje',
+ targetRecallProbability: 'Ciljana vjerojatnost prisjećanja',
+ theme: 'Tema',
+ timezone: 'Vremenska zona',
+ },
+ options: {
+ languageEnUs: 'Engleski (SAD)',
+ newCardsAfterReviews: 'Nakon ponavljanja',
+ newCardsBeforeReviews: 'Prije ponavljanja',
+ newCardsMixed: 'Miješano',
+ themeDark: 'Tamna',
+ themeLight: 'Svijetla',
+ themeSystem: 'Sustav',
+ timezoneSystem: 'Koristi vremensku zonu sustava',
+ },
+ rows: {
+ fsrsDescription: 'Težine stručnog modela',
+ languageDescription: 'Jezik sučelja',
+ masteryHorizonDescription: 'Broj dana tijekom kojih kartica mora ostati prisjetljiva na ciljanoj vjerojatnosti ili iznad nje da bi se smatrala ovladanom',
+ newCardOrderDescription: 'Redoslijed novih kartica u odnosu na ponavljanja',
+ newCardsPerDayDescription: 'Maksimalan broj novih kartica po danu',
+ reviewCardsPerDayDescription: 'Maksimalan broj kartica za ponavljanje po danu',
+ targetRecallProbabilityDescription: 'Minimalna vjerojatnost prisjećanja pri sljedećem zakazanom ponavljanju',
+ timezoneDescription: 'Koristite automatsku vremensku zonu ili odaberite grad.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Izbriši trajno',
+ empty: 'Isprazni',
+ emptyTrash: 'Isprazni smeće',
+ restore: 'Vrati',
+ restoringItem: 'Vraćanje {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Ovo trajno briše "{{title}}". To se ne može poništiti.',
+ deleteItemFallbackDescription: 'Ovo trajno briše ovu stavku. To se ne može poništiti.',
+ deleteItemFallbackTitle: 'Izbrisati stavku?',
+ deleteItemTitle: 'Izbrisati "{{title}}"?',
+ emptyTrashDescription: 'Ovo trajno briše sve u Smeću. To se ne može poništiti.',
+ emptyTrashTitle: 'Isprazniti smeće?',
+ },
+ empty: {
+ description: 'Stavke koje izbrišete pojavit će se ovdje prije trajnog uklanjanja.',
+ title: 'Smeće je prazno',
+ },
+ errors: {
+ couldNotDeleteItem: 'Stavka se nije mogla izbrisati',
+ couldNotEmptyTrash: 'Smeće se nije moglo isprazniti',
+ couldNotRestoreItem: 'Stavka se nije mogla vratiti',
+ trashCouldNotLoad: 'Smeće se nije moglo učitati',
+ trashMayBeOutOfDate: 'Smeće možda nije ažurno',
+ },
+ labels: {
+ deletedAge: 'Izbrisano {{value}}',
+ itemCount_one: '{{count}} stavka',
+ itemCount_few: '{{count}} stavke',
+ itemCount_other: '{{count}} stavki',
+ lastEmptied: 'Zadnje ispražnjeno {{value}}',
+ loadingTrash: 'Učitavanje Smeća',
+ originalLocation: 'Izvorna lokacija: {{location}}',
+ title: 'Smeće',
+ trashActions: 'Radnje u Smeću za {{title}}',
+ },
+ kinds: {
+ deck: 'Špil',
+ folder: 'Mapa',
+ note: 'Bilješka',
+ workspace: 'Radni prostor',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Stvori radni prostor',
+ deleteWorkspace: 'Izbriši radni prostor',
+ editWorkspace: 'Uredi radni prostor',
+ newWorkspace: 'Novi radni prostor',
+ openWorkspace: 'Otvori {{title}}',
+ openingWorkspace: 'Otvaranje {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Kontekst učenja.',
+ editorVisual: 'Odaberite vizualno sidro za ovaj radni prostor.',
+ emptyList: 'Odvojite špilove, bilješke i redove za ponavljanje prema kontekstu učenja.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Ovo premješta "{{title}}" u Smeće. Možete ga vratiti kasnije.',
+ deleteWorkspaceFallbackDescription: 'Ovo premješta ovaj radni prostor u Smeće. Možete ga vratiti kasnije.',
+ deleteWorkspaceFallbackTitle: 'Izbrisati radni prostor?',
+ deleteWorkspaceTitle: 'Izbrisati "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Počnite s radnim prostorom',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Radni prostor se nije mogao stvoriti',
+ couldNotDeleteWorkspace: 'Radni prostor se nije mogao izbrisati',
+ couldNotOpenWorkspace: 'Radni prostor se nije mogao otvoriti',
+ couldNotSaveWorkspace: 'Radni prostor se nije mogao spremiti',
+ workspaceCouldNotLoad: 'Radni prostor se nije mogao učitati',
+ workspacesCouldNotLoad: 'Radni prostori se nisu mogli učitati',
+ },
+ fields: {
+ descriptionLabel: 'Opis radnog prostora',
+ descriptionPlaceholder: 'Što pripada u ovaj radni prostor?',
+ namePlaceholder: 'Naziv radnog prostora',
+ untitledWorkspace: 'Radni prostor bez naslova',
+ },
+ labels: {
+ createWorkspaceTitle: 'Stvori radni prostor',
+ loadingWorkspaces: 'Učitavanje radnih prostora',
+ workspace: 'Radni prostor',
+ workspaces: 'Radni prostori',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/hu.ts b/ui/src/core/i18n/resources/hu.ts
new file mode 100644
index 0000000..90aa9c9
--- /dev/null
+++ b/ui/src/core/i18n/resources/hu.ts
@@ -0,0 +1,623 @@
+export const hu = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Próbálja újra. Ha ez továbbra is előfordul, nyissa meg újra a Clear alkalmazást.',
+ title: 'Nem sikerült elindítani',
+ },
+ loadingTitle: 'A tanulási tér előkészítése',
+ },
+ common: {
+ actions: {
+ back: 'Vissza',
+ cancel: 'Mégse',
+ checkAgain: 'Ellenőrzés újra',
+ close: 'Bezárás',
+ create: 'Létrehozás',
+ delete: 'Törlés',
+ dismissError: 'Hiba bezárása',
+ dismissStatus: 'Állapot bezárása',
+ edit: 'Szerkesztés',
+ itemActions: '{{title}} műveletei',
+ reset: 'Visszaállítás',
+ review: 'Ismétlés',
+ save: 'Mentés',
+ saveChanges: 'Módosítások mentése',
+ tryAgain: 'Próbálja újra',
+ },
+ labels: {
+ active: 'Aktív',
+ clear: 'Clear',
+ custom: 'Egyéni',
+ default: 'Alapértelmezett',
+ loadingEditor: 'Szerkesztő betöltése',
+ name: 'Név',
+ completedTask: 'Befejezett feladat',
+ description: 'Leírás',
+ incompleteTask: 'Befejezetlen feladat',
+ percentageInput: '{{label}} százaléka',
+ visual: 'Vizuális elem',
+ },
+ status: {
+ actionFailed: 'A művelet sikertelen',
+ actionInProgress: 'Művelet folyamatban',
+ },
+ sort: {
+ ascending: 'Növ.',
+ column: 'Oszlop',
+ descending: 'Csökk.',
+ direction: 'Irány',
+ sort: 'Rendezés',
+ },
+ search: {
+ label: 'Keresés',
+ },
+ visualPicker: {
+ allLucideIcons: 'Minden Lucide ikon',
+ browseIconsFor: 'Böngésszen vagy keressen ikonokat ehhez: {{label}}.',
+ chooseIcon: 'Ikon kiválasztása',
+ iconPicker: '{{label}} ikonválasztó',
+ iconSearch: '{{label}} ikonkeresés',
+ iconsCouldNotLoad: 'Az ikonokat nem sikerült betölteni.',
+ loadingIcons: 'Ikonok betöltése',
+ loadingMoreIcons: 'További ikonok betöltése',
+ moreIcons: 'További ikonok',
+ noIconsMatch: 'Nincs ikon ehhez: "{{query}}".',
+ searchIconsPlaceholder: 'Ikonok keresése…',
+ selectedIcon: '{{label}} kiválasztva',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Létrehozás',
+ newDeck: 'Új pakli',
+ newFolder: 'Új mappa',
+ },
+ descriptions: {
+ defaultWorkspace: 'Tartsa együtt a paklikat, mappákat és jegyzeteket.',
+ emptyWorkspace: 'Hozzon létre egy paklit, majd adjon hozzá jegyzeteket az ismétlési sor felépítéséhez.',
+ emptyFolder: 'Hozzon létre egy paklit, majd adjon hozzá jegyzeteket az ismétlési sor felépítéséhez.',
+ searchPlaceholder: 'Mappák, paklik és jegyzetek keresése…',
+ },
+ empty: {
+ createFirstDeck: 'Hozza létre az első paklit',
+ },
+ errors: {
+ couldNotDeleteDeck: 'A paklit nem sikerült törölni',
+ couldNotDeleteFolder: 'A mappát nem sikerült törölni',
+ couldNotDeleteWorkspace: 'A munkaterületet nem sikerült törölni',
+ dashboardCouldNotOpen: 'Az irányítópult nem nyitható meg',
+ decksCouldNotLoad: 'A paklikat nem sikerült betölteni',
+ decksMayBeOutOfDate: 'A paklik elavultak lehetnek',
+ foldersCouldNotLoad: 'A mappákat nem sikerült betölteni',
+ foldersMayBeOutOfDate: 'A mappák elavultak lehetnek',
+ workspaceCouldNotLoad: 'A munkaterületet nem sikerült betölteni',
+ },
+ labels: {
+ dashboard: 'Irányítópult',
+ loadingDashboard: 'Irányítópult betöltése',
+ newItem: 'Új elem',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'A dátum nem érhető el',
+ },
+ age: {
+ dayAgo_one: '{{count}} nappal ezelőtt',
+ dayAgo_other: '{{count}} nappal ezelőtt',
+ hourAgo_one: '{{count}} órája',
+ hourAgo_other: '{{count}} órája',
+ justNow: 'éppen most',
+ minuteAgo_one: '{{count}} perce',
+ minuteAgo_other: '{{count}} perce',
+ unavailable: 'a dátum nem érhető el',
+ weekAgo_one: '{{count}} hete',
+ weekAgo_other: '{{count}} hete',
+ },
+ labels: {
+ deleted: 'Törölve {{value}}',
+ due: 'Esedékes: {{value}}',
+ reviewed: 'Ismételve: {{value}}',
+ updated: 'Frissítve {{value}}',
+ updatedUppercase: 'FRISSÍTVE {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} nappal ezelőtt',
+ dayAgo_other: '{{count}} nappal ezelőtt',
+ inAMoment: 'Hamarosan',
+ inDay_one: '{{count}} nap múlva',
+ inDay_other: '{{count}} nap múlva',
+ inMonth_one: '{{count}} hónap múlva',
+ inMonth_other: '{{count}} hónap múlva',
+ inWeek_one: '{{count}} hét múlva',
+ inWeek_other: '{{count}} hét múlva',
+ justNow: 'Éppen most',
+ monthAgo_one: '{{count}} hónapja',
+ monthAgo_other: '{{count}} hónapja',
+ secondsAgoShort: '{{count}} mp',
+ minutesAgoShort: '{{count}} p',
+ hoursAgoShort: '{{count}} ó',
+ today: 'Ma',
+ tomorrow: 'Holnap',
+ weekAgo_one: '{{count}} hete',
+ weekAgo_other: '{{count}} hete',
+ yesterday: 'Tegnap',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: '{{title}} műveletei',
+ createDeck: 'Pakli létrehozása',
+ createNote: 'Jegyzet létrehozása',
+ deleteDeck: 'Pakli törlése',
+ editDeck: 'Pakli szerkesztése',
+ newNote: 'Új jegyzet',
+ openDeck: '{{title}} pakli megnyitása',
+ saveDeck: 'A paklit nem sikerült menteni',
+ studyNow: 'Tanulás most',
+ },
+ descriptions: {
+ emptyDeck: 'Adjon hozzá jegyzetet, hogy legyen mit ismételni ebben a pakliban.',
+ editorDefault: 'Fókuszált tanulási pakli.',
+ editorVisual: 'Válasszon borítójelet ehhez a paklihoz.',
+ notesSearchPlaceholder: 'Jegyzetek keresése…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Ez áthelyezi a következőt a Kukába: "{{title}}". Később visszaállítható.',
+ deleteDeckFallbackDescription: 'Ez áthelyezi ezt a paklit a Kukába. Később visszaállítható.',
+ deleteDeckFallbackTitle: 'Törli a paklit?',
+ deleteDeckTitle: 'Törli ezt: "{{title}}"?',
+ deleteNoteDescription: 'Ez áthelyezi a következőt a Kukába: "{{title}}". Később visszaállítható.',
+ deleteNoteFallbackTitle: 'Törli a jegyzetet?',
+ deleteNoteTitle: 'Törli ezt: "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Nincs megfelelő jegyzet',
+ noMatchingNotesDescription: 'Nincs jegyzet ehhez: "{{query}}".',
+ thisDeckIsEmpty: 'Ez a pakli üres',
+ },
+ errors: {
+ couldNotCreateDeck: 'A paklit nem sikerült létrehozni',
+ couldNotDeleteDeck: 'A paklit nem sikerült törölni',
+ couldNotDeleteNote: 'A jegyzetet nem sikerült törölni',
+ couldNotLoadFolderPath: 'A mappa útvonalát nem sikerült betölteni',
+ couldNotSaveDeck: 'A paklit nem sikerült menteni',
+ deckCouldNotLoad: 'A paklit nem sikerült betölteni',
+ notesCouldNotLoad: 'A jegyzeteket nem sikerült betölteni',
+ notesMayBeOutOfDate: 'A jegyzetek elavultak lehetnek',
+ },
+ fields: {
+ descriptionLabel: 'Pakli leírása',
+ descriptionPlaceholder: 'Mit segít ismételni ez a pakli?',
+ namePlaceholder: 'Pakli neve',
+ untitledDeck: 'Névtelen pakli',
+ untitledDeckLower: 'névtelen pakli',
+ },
+ labels: {
+ createDeckTitle: 'Pakli létrehozása',
+ deck: 'Pakli',
+ deckNotesSearch: 'Paklijegyzetek keresése',
+ deckOverview: 'Pakli áttekintése',
+ decks: 'Paklik',
+ due: 'Esedékes',
+ dueToday: 'Ma esedékes',
+ loadingDeck: 'Pakli betöltése',
+ mastery: 'Elsajátítás',
+ notes: 'Jegyzetek',
+ },
+ sort: {
+ ariaLabel: 'Paklik rendezése',
+ dueToday: 'Ma esedékes',
+ title: 'Cím',
+ updated: 'Frissítve',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Az adatok megváltoztak. Frissítsen, majd próbálja újra.',
+ forbidden: 'Nincs jogosultsága ehhez.',
+ notFound: 'Ezt az elemet nem találtuk.',
+ offline: 'A szolgáltatás nem érhető el.',
+ timeout: 'Ez túl sokáig tartott. Próbálja újra.',
+ unauthorized: 'A folytatáshoz jelentkezzen be.',
+ unavailable: 'A szolgáltatás átmenetileg nem érhető el.',
+ },
+ fallback: {
+ unexpected: 'Váratlan hiba',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Mappa létrehozása',
+ deleteFolder: 'Mappa törlése',
+ editFolder: 'Mappa szerkesztése',
+ },
+ descriptions: {
+ editorDefault: 'Mappa kapcsolódó paklikhoz.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Ez áthelyezi a következőt a Kukába: "{{name}}". Később visszaállítható.',
+ deleteFolderFallbackDescription: 'Ez áthelyezi ezt a mappát a Kukába. Később visszaállítható.',
+ deleteFolderFallbackTitle: 'Törli a mappát?',
+ deleteFolderTitle: 'Törli ezt: "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Nincs találat ebben a mappában',
+ noMatchesInFolderDescription: 'Nincs mappa, pakli vagy jegyzet ehhez: "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'A mappát nem sikerült létrehozni',
+ couldNotDeleteFolder: 'A mappát nem sikerült törölni',
+ couldNotLoadFolderPath: 'A mappa útvonalát nem sikerült betölteni',
+ couldNotSaveFolder: 'A mappát nem sikerült menteni',
+ folderCouldNotLoad: 'A mappát nem sikerült betölteni',
+ },
+ fields: {
+ descriptionLabel: 'Mappa leírása',
+ descriptionPlaceholder: 'Mi tartozik ebbe a mappába?',
+ namePlaceholder: 'Mappa neve',
+ untitledFolder: 'Névtelen mappa',
+ },
+ labels: {
+ createFolderTitle: 'Mappa létrehozása',
+ folder: 'Mappa',
+ folders: 'Mappák',
+ loadingFolder: 'Mappa betöltése',
+ name: 'Név',
+ updated: 'Frissítve',
+ },
+ sort: {
+ ariaLabel: 'Mappák rendezése',
+ name: 'Név',
+ updated: 'Frissítve',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Ha a helyi és a szinkronizált adatok eltérnek, az elem itt jelenik meg.',
+ heading: 'Szinkronizálási állapot',
+ title: 'Ütközések',
+ noConflicts: 'Nem találhatók ütközések',
+ },
+ labels: {
+ menu: 'Menü',
+ },
+ sections: {
+ settings: {
+ description: 'Személyre szabhatja a környezetét és beállításait',
+ title: 'Beállítások',
+ },
+ trash: {
+ description: 'Visszaállíthatja vagy végleg törölheti az eltávolított elemeket',
+ title: 'Kuka',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Szerkesztő bezárása',
+ openActions: 'Műveletek megnyitása',
+ openWorkspaces: 'Munkaterületek megnyitása',
+ },
+ items: {
+ home: 'Kezdőlap',
+ menu: 'Menü',
+ primary: 'Elsődleges',
+ settings: 'Beállítások',
+ spaces: 'Terek',
+ trash: 'Kuka',
+ workspaces: 'Munkaterületek',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Cloze hozzáadása',
+ deleteNote: 'Jegyzet törlése',
+ editNote: 'Jegyzet szerkesztése',
+ hideDerivedCardsNote: 'Származtatott kártyák jegyzetének elrejtése',
+ openNote: '{{title}} megnyitása',
+ saveNote: 'Jegyzet mentése',
+ showDerivedCardsNote: 'Származtatott kártyák jegyzetének megjelenítése',
+ },
+ descriptions: {
+ clozeFormat: 'Mentéskor minden rejtett rész ismétlőkártyává válik.',
+ clozeFormatPrefix: 'A rejtett szöveget ezzel vegye körbe:',
+ derivedCardsHelper: 'A jegyzetek a származtatott kártyák igazságforrásai.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Ez áthelyezi a következőt a Kukába: "{{title}}". Később visszaállítható.',
+ deleteNoteFallbackDescription: 'Ez áthelyezi ezt a jegyzetet a Kukába. Később visszaállítható.',
+ deleteNoteFallbackTitle: 'Törli a jegyzetet?',
+ deleteNoteTitle: 'Törli ezt: "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'A jegyzetet nem sikerült létrehozni',
+ couldNotDeleteNote: 'A jegyzetet nem sikerült törölni',
+ couldNotSaveNote: 'A jegyzetet nem sikerült menteni',
+ noteCouldNotLoad: 'A jegyzetet nem sikerült betölteni',
+ },
+ fields: {
+ back: 'Hátoldal',
+ backPlaceholder: 'Adja meg a hátoldalt',
+ bodyPlaceholder: 'Írja meg a jegyzet törzsét cloze törlésekkel…',
+ front: 'Előlap',
+ frontPlaceholder: 'Adja meg az előlapot',
+ noteBody: 'Jegyzet törzse',
+ title: 'Cím',
+ titlePlaceholder: 'Adjon címet a jegyzetnek',
+ untitledCloze: 'Névtelen cloze',
+ untitledNote: 'Névtelen jegyzet',
+ },
+ labels: {
+ backUppercase: 'HÁTOLDAL',
+ basic: 'Alap',
+ basicLower: 'alap',
+ basicUppercase: 'ALAP',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze formátum',
+ clozeUppercase: 'CLOZE',
+ deck: 'Pakli',
+ derivedCards: 'SZÁRMAZTATOTT KÁRTYÁK',
+ due: 'Esedékes',
+ frontUppercase: 'ELŐLAP',
+ inProgress: 'Folyamatban',
+ inProgressUppercase: 'FOLYAMATBAN',
+ loadingNote: 'Jegyzet betöltése',
+ loadingNoteEditor: 'Jegyzetszerkesztő betöltése',
+ markdownFormatting: 'Markdown formázás',
+ mastered: 'Elsajátítva',
+ masteredUppercase: 'ELSAJÁTÍTVA',
+ newNote: 'Új jegyzet',
+ noteBody: 'JEGYZET TÖRZSE',
+ noteContent: 'Jegyzet tartalma',
+ noteDetails: 'Jegyzet részletei',
+ noteMetadata: 'Jegyzet metaadatai',
+ noteType: 'Jegyzet típusa',
+ notes: 'Jegyzetek',
+ reviewed: 'Ismételve',
+ studyProgress: 'Tanulási előrehaladás',
+ studyProgressUppercase: 'TANULÁSI ELŐREHALADÁS',
+ titleUppercase: 'CÍM',
+ updated: 'Frissítve',
+ },
+ sort: {
+ ariaLabel: 'Jegyzetek rendezése',
+ title: 'Cím',
+ updated: 'Frissítve',
+ },
+ toolbar: {
+ bold: 'Félkövér',
+ italic: 'Dőlt',
+ link: 'Hivatkozás',
+ list: 'Lista',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Újra',
+ backToDeck: 'Vissza a paklihoz',
+ continueReview: 'Ismétlés folytatása',
+ easy: 'Könnyű',
+ good: 'Jó',
+ hard: 'Nehéz',
+ newNote: 'Új jegyzet',
+ showAnswer: 'Válasz megjelenítése',
+ },
+ errors: {
+ couldNotGradeCard: 'A kártyát nem sikerült értékelni',
+ reviewCouldNotLoad: 'Az ismétlést nem sikerült betölteni',
+ reviewCouldNotStart: 'Az ismétlést nem sikerült elindítani',
+ summaryCouldNotLoad: 'Az ismétlési összegzést nem sikerült betölteni',
+ summaryNotAvailable: 'Az ismétlési összegzés nem érhető el',
+ summaryNotComplete: 'Ez az ismétlés még nem fejeződött be.',
+ },
+ labels: {
+ cardsReviewed: 'Ismételt kártyák',
+ deck: 'Pakli',
+ duration: 'Időtartam',
+ loadingReview: 'Ismétlés betöltése',
+ loadingSummary: 'Összegzés betöltése',
+ progress: 'Ismétlési előrehaladás',
+ review: 'Ismétlés',
+ reviewComplete: 'Ismétlés kész',
+ reviewed_one: 'Ismételve {{count}}',
+ reviewed_other: 'Ismételve {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} ó {{minutes}} p',
+ durationMinutes: '{{minutes}} p',
+ durationSeconds: '{{seconds}} mp',
+ saved: 'Az előrehaladása mentve lett ebbe a pakliba.',
+ },
+ unavailable: {
+ description: 'Adjon hozzá jegyzetet, hogy ez a pakli bekerülhessen az ismétlési sorba.',
+ title: 'Nincs ismételhető kártya',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Keresés törlése',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Nincs találat ezen a munkaterületen',
+ noMatchesInWorkspaceDescription: 'Nincs mappa, pakli vagy jegyzet ehhez: "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'A keresést nem sikerült befejezni',
+ },
+ labels: {
+ results: 'Keresési eredmények',
+ resultsFor: 'Találatok erre: "{{query}}"',
+ searchingContent: 'Tartalom keresése',
+ },
+ resultGroups: {
+ deck: 'Paklik',
+ folder: 'Mappák',
+ note: 'Jegyzetek',
+ },
+ resultKinds: {
+ deck: 'pakli',
+ folder: 'mappa',
+ note: 'jegyzet',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Összes beállítás visszaállítása',
+ resetSettings: 'Beállítások visszaállítása',
+ resetToDefaults: 'Alapértelmezések visszaállítása',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Illesszen be érvényes JSON-t 21 numerikus értékkel.',
+ fsrsErrorInvalidParams_one: 'Adjon meg egy JSON tömböt pontosan {{count}} véges számmal.',
+ fsrsErrorInvalidParams_other: 'Adjon meg egy JSON tömböt pontosan {{count}} véges számmal.',
+ fsrsHelper: 'Ez egy szakértői felülírás. Az értékeknek sorrendben kell maradniuk.',
+ fsrsJsonLabel: 'FSRS-paraméterek JSON',
+ fsrsTitle: 'FSRS-paraméterek szerkesztése',
+ fsrsDescription: 'Illesszen be egy 21 számból álló JSON tömböt a scheduler súlyainak felülírásához.',
+ resetDescription: 'Ez visszaállítja az időzónát, a tanulási korlátokat és az FSRS-beállításokat.',
+ resetDescriptionWithLanguage: 'Ez visszaállítja a nyelvet, az időzónát, a tanulási korlátokat és az FSRS-beállításokat.',
+ resetTitle: 'Visszaállítja az összes beállítást?',
+ timezoneDescription: 'Keressen várost vagy időzóna-azonosítót.',
+ timezoneSearchLabel: 'Időzónák keresése',
+ timezoneSearchPlaceholder: 'Időzónák keresése…',
+ timezoneTitle: 'Időzóna kiválasztása',
+ },
+ errors: {
+ couldNotResetSettings: 'A beállításokat nem sikerült visszaállítani',
+ couldNotSaveSettings: 'A beállításokat nem sikerült menteni',
+ settingsCouldNotLoad: 'A beállításokat nem sikerült betölteni',
+ settingsUnavailable: 'A beállítások nem érhetők el.',
+ },
+ labels: {
+ appearance: 'Megjelenés',
+ automatic: 'Automatikus',
+ fsrsParameters: 'FSRS-paraméterek',
+ general: 'Általános',
+ language: 'Nyelv',
+ loadingSettings: 'Beállítások betöltése',
+ masteryHorizon: 'Elsajátítási horizont',
+ newCardOrder: 'Új kártyák sorrendje',
+ newCardsPerDay: 'Új kártyák naponta',
+ reviewCardsPerDay: 'Ismétlőkártyák naponta',
+ savingSettings: 'Beállítások mentése',
+ schedule: 'Ütemezés',
+ searchNoTimezones: 'Nincs megfelelő időzóna.',
+ settings: 'Beállítások',
+ settingsReset: 'Beállítások visszaállítva',
+ study: 'Tanulás',
+ targetRecallProbability: 'Cél felidézési valószínűség',
+ theme: 'Téma',
+ timezone: 'Időzóna',
+ },
+ options: {
+ languageEnUs: 'Angol (USA)',
+ newCardsAfterReviews: 'Ismétlések után',
+ newCardsBeforeReviews: 'Ismétlések előtt',
+ newCardsMixed: 'Vegyes',
+ themeDark: 'Sötét',
+ themeLight: 'Világos',
+ themeSystem: 'Rendszer',
+ timezoneSystem: 'Rendszer időzónájának használata',
+ },
+ rows: {
+ fsrsDescription: 'Szakértői modell súlyai',
+ languageDescription: 'Felület nyelve',
+ masteryHorizonDescription: 'Hány napig kell egy kártyának a célvalószínűségen vagy felette felidézhetőnek maradnia ahhoz, hogy elsajátítottnak számítson',
+ newCardOrderDescription: 'Az új kártyák sorrendje az ismétlésekhez képest',
+ newCardsPerDayDescription: 'Új kártyák maximális száma naponta',
+ reviewCardsPerDayDescription: 'Ismétlőkártyák maximális száma naponta',
+ targetRecallProbabilityDescription: 'Minimális felidézési valószínűség a következő ütemezett ismétlésnél',
+ timezoneDescription: 'Használjon automatikus időzónát, vagy válasszon várost.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Végleges törlés',
+ empty: 'Ürítés',
+ emptyTrash: 'Kuka ürítése',
+ restore: 'Visszaállítás',
+ restoringItem: '{{title}} visszaállítása',
+ },
+ dialogs: {
+ deleteItemDescription: 'Ez végleg törli a következőt: "{{title}}". Nem vonható vissza.',
+ deleteItemFallbackDescription: 'Ez végleg törli ezt az elemet. Nem vonható vissza.',
+ deleteItemFallbackTitle: 'Törli az elemet?',
+ deleteItemTitle: 'Törli ezt: "{{title}}"?',
+ emptyTrashDescription: 'Ez végleg töröl mindent a Kukából. Nem vonható vissza.',
+ emptyTrashTitle: 'Kiüríti a Kukát?',
+ },
+ empty: {
+ description: 'A törölt elemek itt jelennek meg a végleges eltávolítás előtt.',
+ title: 'A Kuka üres',
+ },
+ errors: {
+ couldNotDeleteItem: 'Az elemet nem sikerült törölni',
+ couldNotEmptyTrash: 'A Kukát nem sikerült kiüríteni',
+ couldNotRestoreItem: 'Az elemet nem sikerült visszaállítani',
+ trashCouldNotLoad: 'A Kukát nem sikerült betölteni',
+ trashMayBeOutOfDate: 'A Kuka elavult lehet',
+ },
+ labels: {
+ deletedAge: 'Törölve {{value}}',
+ itemCount_one: '{{count}} elem',
+ itemCount_other: '{{count}} elem',
+ lastEmptied: 'Utoljára ürítve {{value}}',
+ loadingTrash: 'Kuka betöltése',
+ originalLocation: 'Eredeti hely: {{location}}',
+ title: 'Kuka',
+ trashActions: '{{title}} kuka műveletei',
+ },
+ kinds: {
+ deck: 'Pakli',
+ folder: 'Mappa',
+ note: 'Jegyzet',
+ workspace: 'Munkaterület',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Munkaterület létrehozása',
+ deleteWorkspace: 'Munkaterület törlése',
+ editWorkspace: 'Munkaterület szerkesztése',
+ newWorkspace: 'Új munkaterület',
+ openWorkspace: '{{title}} megnyitása',
+ openingWorkspace: '{{title}} megnyitása',
+ },
+ descriptions: {
+ editorDefault: 'Tanulási kontextus.',
+ editorVisual: 'Válasszon vizuális horgonyt ehhez a munkaterülethez.',
+ emptyList: 'Válassza szét a paklikat, jegyzeteket és ismétlési sorokat tanulási kontextus szerint.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Ez áthelyezi a következőt a Kukába: "{{title}}". Később visszaállítható.',
+ deleteWorkspaceFallbackDescription: 'Ez áthelyezi ezt a munkaterületet a Kukába. Később visszaállítható.',
+ deleteWorkspaceFallbackTitle: 'Törli a munkaterületet?',
+ deleteWorkspaceTitle: 'Törli ezt: "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Kezdjen egy munkaterülettel',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'A munkaterületet nem sikerült létrehozni',
+ couldNotDeleteWorkspace: 'A munkaterületet nem sikerült törölni',
+ couldNotOpenWorkspace: 'A munkaterületet nem sikerült megnyitni',
+ couldNotSaveWorkspace: 'A munkaterületet nem sikerült menteni',
+ workspaceCouldNotLoad: 'A munkaterületet nem sikerült betölteni',
+ workspacesCouldNotLoad: 'A munkaterületeket nem sikerült betölteni',
+ },
+ fields: {
+ descriptionLabel: 'Munkaterület leírása',
+ descriptionPlaceholder: 'Mi tartozik ebbe a munkaterületbe?',
+ namePlaceholder: 'Munkaterület neve',
+ untitledWorkspace: 'Névtelen munkaterület',
+ },
+ labels: {
+ createWorkspaceTitle: 'Munkaterület létrehozása',
+ loadingWorkspaces: 'Munkaterületek betöltése',
+ workspace: 'Munkaterület',
+ workspaces: 'Munkaterületek',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/id.ts b/ui/src/core/i18n/resources/id.ts
new file mode 100644
index 0000000..3b488b7
--- /dev/null
+++ b/ui/src/core/i18n/resources/id.ts
@@ -0,0 +1,623 @@
+export const id = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Coba lagi. Jika terus terjadi, buka ulang Clear.',
+ title: 'Tidak dapat memulai',
+ },
+ loadingTitle: 'Menyiapkan ruang belajar Anda',
+ },
+ common: {
+ actions: {
+ back: 'Kembali',
+ cancel: 'Batal',
+ checkAgain: 'Periksa lagi',
+ close: 'Tutup',
+ create: 'Buat',
+ delete: 'Hapus',
+ dismissError: 'Tutup error',
+ dismissStatus: 'Tutup status',
+ edit: 'Edit',
+ itemActions: 'Tindakan {{title}}',
+ reset: 'Reset',
+ review: 'Ulas',
+ save: 'Simpan',
+ saveChanges: 'Simpan perubahan',
+ tryAgain: 'Coba lagi',
+ },
+ labels: {
+ active: 'Aktif',
+ clear: 'Clear',
+ custom: 'Kustom',
+ default: 'Default',
+ loadingEditor: 'Memuat editor',
+ name: 'Nama',
+ completedTask: 'Tugas selesai',
+ description: 'Deskripsi',
+ incompleteTask: 'Tugas belum selesai',
+ percentageInput: 'Persentase {{label}}',
+ visual: 'Visual',
+ },
+ status: {
+ actionFailed: 'Tindakan gagal',
+ actionInProgress: 'Tindakan berlangsung',
+ },
+ sort: {
+ ascending: 'Naik',
+ column: 'Kolom',
+ descending: 'Turun',
+ direction: 'Arah',
+ sort: 'Urutkan',
+ },
+ search: {
+ label: 'Cari',
+ },
+ visualPicker: {
+ allLucideIcons: 'Semua ikon Lucide',
+ browseIconsFor: 'Jelajahi atau cari ikon untuk {{label}}.',
+ chooseIcon: 'Pilih ikon',
+ iconPicker: 'Pemilih ikon {{label}}',
+ iconSearch: 'Pencarian ikon {{label}}',
+ iconsCouldNotLoad: 'Ikon tidak dapat dimuat.',
+ loadingIcons: 'Memuat ikon',
+ loadingMoreIcons: 'Memuat ikon lainnya',
+ moreIcons: 'Ikon lainnya',
+ noIconsMatch: 'Tidak ada ikon yang cocok dengan "{{query}}".',
+ searchIconsPlaceholder: 'Cari ikon…',
+ selectedIcon: '{{label}} dipilih',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Buat',
+ newDeck: 'Deck baru',
+ newFolder: 'Folder baru',
+ },
+ descriptions: {
+ defaultWorkspace: 'Simpan deck, folder, dan catatan bersama.',
+ emptyWorkspace: 'Buat deck, lalu tambahkan catatan untuk membangun antrean ulasan.',
+ emptyFolder: 'Buat deck, lalu tambahkan catatan untuk membangun antrean ulasan.',
+ searchPlaceholder: 'Cari folder, deck, dan catatan…',
+ },
+ empty: {
+ createFirstDeck: 'Buat deck pertama Anda',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Deck tidak dapat dihapus',
+ couldNotDeleteFolder: 'Folder tidak dapat dihapus',
+ couldNotDeleteWorkspace: 'Workspace tidak dapat dihapus',
+ dashboardCouldNotOpen: 'Dashboard tidak dapat dibuka',
+ decksCouldNotLoad: 'Deck tidak dapat dimuat',
+ decksMayBeOutOfDate: 'Deck mungkin tidak terbaru',
+ foldersCouldNotLoad: 'Folder tidak dapat dimuat',
+ foldersMayBeOutOfDate: 'Folder mungkin tidak terbaru',
+ workspaceCouldNotLoad: 'Workspace tidak dapat dimuat',
+ },
+ labels: {
+ dashboard: 'Dashboard',
+ loadingDashboard: 'Memuat dashboard',
+ newItem: 'Item baru',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Tanggal tidak tersedia',
+ },
+ age: {
+ dayAgo_one: '{{count}} hari lalu',
+ dayAgo_other: '{{count}} hari lalu',
+ hourAgo_one: '{{count}} jam lalu',
+ hourAgo_other: '{{count}} jam lalu',
+ justNow: 'baru saja',
+ minuteAgo_one: '{{count}} menit lalu',
+ minuteAgo_other: '{{count}} menit lalu',
+ unavailable: 'tanggal tidak tersedia',
+ weekAgo_one: '{{count}} minggu lalu',
+ weekAgo_other: '{{count}} minggu lalu',
+ },
+ labels: {
+ deleted: 'Dihapus {{value}}',
+ due: 'Jatuh tempo: {{value}}',
+ reviewed: 'Diulas: {{value}}',
+ updated: 'Diperbarui {{value}}',
+ updatedUppercase: 'DIPERBARUI {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} hari lalu',
+ dayAgo_other: '{{count}} hari lalu',
+ inAMoment: 'Sebentar lagi',
+ inDay_one: 'Dalam {{count}} hari',
+ inDay_other: 'Dalam {{count}} hari',
+ inMonth_one: 'Dalam {{count}} bulan',
+ inMonth_other: 'Dalam {{count}} bulan',
+ inWeek_one: 'Dalam {{count}} minggu',
+ inWeek_other: 'Dalam {{count}} minggu',
+ justNow: 'Baru saja',
+ monthAgo_one: '{{count}} bulan lalu',
+ monthAgo_other: '{{count}} bulan lalu',
+ secondsAgoShort: '{{count}} dtk lalu',
+ minutesAgoShort: '{{count}} mnt lalu',
+ hoursAgoShort: '{{count}} jam lalu',
+ today: 'Hari ini',
+ tomorrow: 'Besok',
+ weekAgo_one: '{{count}} minggu lalu',
+ weekAgo_other: '{{count}} minggu lalu',
+ yesterday: 'Kemarin',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Tindakan {{title}}',
+ createDeck: 'Buat deck',
+ createNote: 'Buat catatan',
+ deleteDeck: 'Hapus deck',
+ editDeck: 'Edit deck',
+ newNote: 'Catatan baru',
+ openDeck: 'Buka deck {{title}}',
+ saveDeck: 'Deck tidak dapat disimpan',
+ studyNow: 'Belajar sekarang',
+ },
+ descriptions: {
+ emptyDeck: 'Tambahkan catatan agar deck ini memiliki materi untuk diulas.',
+ editorDefault: 'Deck belajar terfokus.',
+ editorVisual: 'Pilih glif sampul untuk deck ini.',
+ notesSearchPlaceholder: 'Cari catatan…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Ini memindahkan "{{title}}" ke Sampah. Anda dapat memulihkannya nanti.',
+ deleteDeckFallbackDescription: 'Ini memindahkan deck ini ke Sampah. Anda dapat memulihkannya nanti.',
+ deleteDeckFallbackTitle: 'Hapus deck?',
+ deleteDeckTitle: 'Hapus "{{title}}"?',
+ deleteNoteDescription: 'Ini memindahkan "{{title}}" ke Sampah. Anda dapat memulihkannya nanti.',
+ deleteNoteFallbackTitle: 'Hapus catatan?',
+ deleteNoteTitle: 'Hapus "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Tidak ada catatan yang cocok',
+ noMatchingNotesDescription: 'Tidak ada catatan yang cocok dengan "{{query}}".',
+ thisDeckIsEmpty: 'Deck ini kosong',
+ },
+ errors: {
+ couldNotCreateDeck: 'Deck tidak dapat dibuat',
+ couldNotDeleteDeck: 'Deck tidak dapat dihapus',
+ couldNotDeleteNote: 'Catatan tidak dapat dihapus',
+ couldNotLoadFolderPath: 'Jalur folder tidak dapat dimuat',
+ couldNotSaveDeck: 'Deck tidak dapat disimpan',
+ deckCouldNotLoad: 'Deck tidak dapat dimuat',
+ notesCouldNotLoad: 'Catatan tidak dapat dimuat',
+ notesMayBeOutOfDate: 'Catatan mungkin tidak terbaru',
+ },
+ fields: {
+ descriptionLabel: 'Deskripsi deck',
+ descriptionPlaceholder: 'Apa yang akan dibantu deck ini untuk Anda ulas?',
+ namePlaceholder: 'Nama deck',
+ untitledDeck: 'Deck tanpa judul',
+ untitledDeckLower: 'deck tanpa judul',
+ },
+ labels: {
+ createDeckTitle: 'Buat deck',
+ deck: 'Deck',
+ deckNotesSearch: 'Pencarian catatan deck',
+ deckOverview: 'Ringkasan deck',
+ decks: 'Deck',
+ due: 'Jatuh tempo',
+ dueToday: 'Jatuh tempo hari ini',
+ loadingDeck: 'Memuat deck',
+ mastery: 'Penguasaan',
+ notes: 'Catatan',
+ },
+ sort: {
+ ariaLabel: 'Urutkan deck',
+ dueToday: 'Jatuh tempo hari ini',
+ title: 'Judul',
+ updated: 'Diperbarui',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Data telah berubah. Segarkan dan coba lagi.',
+ forbidden: 'Anda tidak memiliki izin untuk melakukan ini.',
+ notFound: 'Kami tidak dapat menemukan item ini.',
+ offline: 'Tidak dapat menjangkau layanan.',
+ timeout: 'Ini terlalu lama. Coba lagi.',
+ unauthorized: 'Masuk untuk melanjutkan.',
+ unavailable: 'Layanan sementara tidak tersedia.',
+ },
+ fallback: {
+ unexpected: 'Error tidak terduga',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Buat folder',
+ deleteFolder: 'Hapus folder',
+ editFolder: 'Edit folder',
+ },
+ descriptions: {
+ editorDefault: 'Folder untuk deck terkait.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Ini memindahkan "{{name}}" ke Sampah. Anda dapat memulihkannya nanti.',
+ deleteFolderFallbackDescription: 'Ini memindahkan folder ini ke Sampah. Anda dapat memulihkannya nanti.',
+ deleteFolderFallbackTitle: 'Hapus folder?',
+ deleteFolderTitle: 'Hapus "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Tidak ada kecocokan di folder ini',
+ noMatchesInFolderDescription: 'Tidak ada folder, deck, atau catatan yang cocok dengan "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Folder tidak dapat dibuat',
+ couldNotDeleteFolder: 'Folder tidak dapat dihapus',
+ couldNotLoadFolderPath: 'Jalur folder tidak dapat dimuat',
+ couldNotSaveFolder: 'Folder tidak dapat disimpan',
+ folderCouldNotLoad: 'Folder tidak dapat dimuat',
+ },
+ fields: {
+ descriptionLabel: 'Deskripsi folder',
+ descriptionPlaceholder: 'Apa yang termasuk dalam folder ini?',
+ namePlaceholder: 'Nama folder',
+ untitledFolder: 'Folder tanpa judul',
+ },
+ labels: {
+ createFolderTitle: 'Buat folder',
+ folder: 'Folder',
+ folders: 'Folder',
+ loadingFolder: 'Memuat folder',
+ name: 'Nama',
+ updated: 'Diperbarui',
+ },
+ sort: {
+ ariaLabel: 'Urutkan folder',
+ name: 'Nama',
+ updated: 'Diperbarui',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Jika data lokal dan data tersinkron berbeda, item akan muncul di sini.',
+ heading: 'Status sinkronisasi',
+ title: 'Konflik',
+ noConflicts: 'Tidak ada konflik ditemukan',
+ },
+ labels: {
+ menu: 'Menu',
+ },
+ sections: {
+ settings: {
+ description: 'Personalisasi lingkungan dan preferensi Anda',
+ title: 'Pengaturan',
+ },
+ trash: {
+ description: 'Pulihkan atau hapus permanen item yang dihapus',
+ title: 'Sampah',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Tutup editor',
+ openActions: 'Buka tindakan',
+ openWorkspaces: 'Buka workspace',
+ },
+ items: {
+ home: 'Beranda',
+ menu: 'Menu',
+ primary: 'Utama',
+ settings: 'Pengaturan',
+ spaces: 'Ruang',
+ trash: 'Sampah',
+ workspaces: 'Workspace',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Tambah cloze',
+ deleteNote: 'Hapus catatan',
+ editNote: 'Edit catatan',
+ hideDerivedCardsNote: 'Sembunyikan catatan kartu turunan',
+ openNote: 'Buka {{title}}',
+ saveNote: 'Simpan catatan',
+ showDerivedCardsNote: 'Tampilkan catatan kartu turunan',
+ },
+ descriptions: {
+ clozeFormat: 'Setiap bagian tersembunyi menjadi kartu ulasan saat Anda menyimpan.',
+ clozeFormatPrefix: 'Bungkus teks tersembunyi dengan',
+ derivedCardsHelper: 'Catatan adalah sumber kebenaran untuk kartu turunan.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Ini memindahkan "{{title}}" ke Sampah. Anda dapat memulihkannya nanti.',
+ deleteNoteFallbackDescription: 'Ini memindahkan catatan ini ke Sampah. Anda dapat memulihkannya nanti.',
+ deleteNoteFallbackTitle: 'Hapus catatan?',
+ deleteNoteTitle: 'Hapus "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Catatan tidak dapat dibuat',
+ couldNotDeleteNote: 'Catatan tidak dapat dihapus',
+ couldNotSaveNote: 'Catatan tidak dapat disimpan',
+ noteCouldNotLoad: 'Catatan tidak dapat dimuat',
+ },
+ fields: {
+ back: 'Belakang',
+ backPlaceholder: 'Masukkan sisi belakang',
+ bodyPlaceholder: 'Tulis isi catatan dengan cloze deletions…',
+ front: 'Depan',
+ frontPlaceholder: 'Masukkan sisi depan',
+ noteBody: 'Isi catatan',
+ title: 'Judul',
+ titlePlaceholder: 'Tambahkan judul catatan',
+ untitledCloze: 'Cloze tanpa judul',
+ untitledNote: 'Catatan tanpa judul',
+ },
+ labels: {
+ backUppercase: 'BELAKANG',
+ basic: 'Dasar',
+ basicLower: 'dasar',
+ basicUppercase: 'DASAR',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Format cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Deck',
+ derivedCards: 'KARTU TURUNAN',
+ due: 'Jatuh tempo',
+ frontUppercase: 'DEPAN',
+ inProgress: 'Berlangsung',
+ inProgressUppercase: 'BERLANGSUNG',
+ loadingNote: 'Memuat catatan',
+ loadingNoteEditor: 'Memuat editor catatan',
+ markdownFormatting: 'Pemformatan Markdown',
+ mastered: 'Dikuasai',
+ masteredUppercase: 'DIKUASAI',
+ newNote: 'Catatan baru',
+ noteBody: 'ISI CATATAN',
+ noteContent: 'Konten catatan',
+ noteDetails: 'Detail catatan',
+ noteMetadata: 'Metadata catatan',
+ noteType: 'Jenis catatan',
+ notes: 'Catatan',
+ reviewed: 'Diulas',
+ studyProgress: 'Progres belajar',
+ studyProgressUppercase: 'PROGRES BELAJAR',
+ titleUppercase: 'JUDUL',
+ updated: 'Diperbarui',
+ },
+ sort: {
+ ariaLabel: 'Urutkan catatan',
+ title: 'Judul',
+ updated: 'Diperbarui',
+ },
+ toolbar: {
+ bold: 'Tebal',
+ italic: 'Miring',
+ link: 'Tautan',
+ list: 'Daftar',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Lagi',
+ backToDeck: 'Kembali ke deck',
+ continueReview: 'Lanjutkan ulasan',
+ easy: 'Mudah',
+ good: 'Baik',
+ hard: 'Sulit',
+ newNote: 'Catatan baru',
+ showAnswer: 'Tampilkan jawaban',
+ },
+ errors: {
+ couldNotGradeCard: 'Kartu tidak dapat dinilai',
+ reviewCouldNotLoad: 'Ulasan tidak dapat dimuat',
+ reviewCouldNotStart: 'Ulasan tidak dapat dimulai',
+ summaryCouldNotLoad: 'Ringkasan ulasan tidak dapat dimuat',
+ summaryNotAvailable: 'Ringkasan ulasan tidak tersedia',
+ summaryNotComplete: 'Ulasan ini belum selesai.',
+ },
+ labels: {
+ cardsReviewed: 'Kartu diulas',
+ deck: 'Deck',
+ duration: 'Durasi',
+ loadingReview: 'Memuat ulasan',
+ loadingSummary: 'Memuat ringkasan',
+ progress: 'Progres ulasan',
+ review: 'Ulasan',
+ reviewComplete: 'Ulasan selesai',
+ reviewed_one: '{{count}} diulas',
+ reviewed_other: '{{count}} diulas',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} j {{minutes}} mnt',
+ durationMinutes: '{{minutes}} mnt',
+ durationSeconds: '{{seconds}} dtk',
+ saved: 'Progres Anda disimpan ke deck ini.',
+ },
+ unavailable: {
+ description: 'Tambahkan catatan agar deck ini dapat masuk antrean ulasan.',
+ title: 'Tidak ada kartu untuk diulas',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Bersihkan pencarian',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Tidak ada kecocokan di workspace ini',
+ noMatchesInWorkspaceDescription: 'Tidak ada folder, deck, atau catatan yang cocok dengan "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Pencarian tidak dapat diselesaikan',
+ },
+ labels: {
+ results: 'Hasil pencarian',
+ resultsFor: 'Hasil untuk "{{query}}"',
+ searchingContent: 'Mencari konten',
+ },
+ resultGroups: {
+ deck: 'Deck',
+ folder: 'Folder',
+ note: 'Catatan',
+ },
+ resultKinds: {
+ deck: 'deck',
+ folder: 'folder',
+ note: 'catatan',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Reset semua pengaturan',
+ resetSettings: 'Reset pengaturan',
+ resetToDefaults: 'Kembalikan default',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Tempel JSON valid dengan 21 nilai numerik.',
+ fsrsErrorInvalidParams_one: 'Masukkan array JSON dengan tepat {{count}} angka finite.',
+ fsrsErrorInvalidParams_other: 'Masukkan array JSON dengan tepat {{count}} angka finite.',
+ fsrsHelper: 'Ini adalah override ahli. Nilai harus tetap berurutan.',
+ fsrsJsonLabel: 'JSON parameter FSRS',
+ fsrsTitle: 'Edit parameter FSRS',
+ fsrsDescription: 'Tempel array JSON dengan 21 angka untuk override bobot scheduler.',
+ resetDescription: 'Ini memulihkan zona waktu, batas belajar, dan pengaturan FSRS.',
+ resetDescriptionWithLanguage: 'Ini memulihkan bahasa, zona waktu, batas belajar, dan pengaturan FSRS.',
+ resetTitle: 'Reset semua pengaturan?',
+ timezoneDescription: 'Cari kota atau identifier zona waktu.',
+ timezoneSearchLabel: 'Cari zona waktu',
+ timezoneSearchPlaceholder: 'Cari zona waktu…',
+ timezoneTitle: 'Pilih zona waktu',
+ },
+ errors: {
+ couldNotResetSettings: 'Pengaturan tidak dapat direset',
+ couldNotSaveSettings: 'Pengaturan tidak dapat disimpan',
+ settingsCouldNotLoad: 'Pengaturan tidak dapat dimuat',
+ settingsUnavailable: 'Pengaturan tidak tersedia.',
+ },
+ labels: {
+ appearance: 'Tampilan',
+ automatic: 'Otomatis',
+ fsrsParameters: 'Parameter FSRS',
+ general: 'Umum',
+ language: 'Bahasa',
+ loadingSettings: 'Memuat pengaturan',
+ masteryHorizon: 'Horizon penguasaan',
+ newCardOrder: 'Urutan kartu baru',
+ newCardsPerDay: 'Kartu baru per hari',
+ reviewCardsPerDay: 'Kartu ulasan per hari',
+ savingSettings: 'Menyimpan pengaturan',
+ schedule: 'Jadwal',
+ searchNoTimezones: 'Tidak ada zona waktu yang cocok.',
+ settings: 'Pengaturan',
+ settingsReset: 'Pengaturan direset',
+ study: 'Belajar',
+ targetRecallProbability: 'Probabilitas ingat target',
+ theme: 'Tema',
+ timezone: 'Zona waktu',
+ },
+ options: {
+ languageEnUs: 'Inggris (AS)',
+ newCardsAfterReviews: 'Setelah ulasan',
+ newCardsBeforeReviews: 'Sebelum ulasan',
+ newCardsMixed: 'Campur',
+ themeDark: 'Gelap',
+ themeLight: 'Terang',
+ themeSystem: 'Sistem',
+ timezoneSystem: 'Gunakan zona waktu sistem',
+ },
+ rows: {
+ fsrsDescription: 'Bobot model ahli',
+ languageDescription: 'Bahasa antarmuka',
+ masteryHorizonDescription: 'Jumlah hari kartu harus tetap dapat diingat pada atau di atas probabilitas target agar dihitung dikuasai',
+ newCardOrderDescription: 'Urutan kartu baru relatif terhadap ulasan',
+ newCardsPerDayDescription: 'Maksimum kartu baru per hari',
+ reviewCardsPerDayDescription: 'Maksimum kartu ulasan per hari',
+ targetRecallProbabilityDescription: 'Probabilitas minimum untuk mengingat pada ulasan terjadwal berikutnya',
+ timezoneDescription: 'Gunakan zona waktu otomatis atau pilih kota.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Hapus permanen',
+ empty: 'Kosongkan',
+ emptyTrash: 'Kosongkan sampah',
+ restore: 'Pulihkan',
+ restoringItem: 'Memulihkan {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Ini menghapus "{{title}}" secara permanen. Tindakan ini tidak dapat dibatalkan.',
+ deleteItemFallbackDescription: 'Ini menghapus item ini secara permanen. Tindakan ini tidak dapat dibatalkan.',
+ deleteItemFallbackTitle: 'Hapus item?',
+ deleteItemTitle: 'Hapus "{{title}}"?',
+ emptyTrashDescription: 'Ini menghapus semua isi Sampah secara permanen. Tindakan ini tidak dapat dibatalkan.',
+ emptyTrashTitle: 'Kosongkan sampah?',
+ },
+ empty: {
+ description: 'Item yang Anda hapus akan muncul di sini sebelum dihapus permanen.',
+ title: 'Sampah kosong',
+ },
+ errors: {
+ couldNotDeleteItem: 'Item tidak dapat dihapus',
+ couldNotEmptyTrash: 'Sampah tidak dapat dikosongkan',
+ couldNotRestoreItem: 'Item tidak dapat dipulihkan',
+ trashCouldNotLoad: 'Sampah tidak dapat dimuat',
+ trashMayBeOutOfDate: 'Sampah mungkin tidak terbaru',
+ },
+ labels: {
+ deletedAge: 'Dihapus {{value}}',
+ itemCount_one: '{{count}} item',
+ itemCount_other: '{{count}} item',
+ lastEmptied: 'Terakhir dikosongkan {{value}}',
+ loadingTrash: 'Memuat Sampah',
+ originalLocation: 'Lokasi asal: {{location}}',
+ title: 'Sampah',
+ trashActions: 'Tindakan sampah {{title}}',
+ },
+ kinds: {
+ deck: 'Deck',
+ folder: 'Folder',
+ note: 'Catatan',
+ workspace: 'Workspace',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Buat workspace',
+ deleteWorkspace: 'Hapus workspace',
+ editWorkspace: 'Edit workspace',
+ newWorkspace: 'Workspace baru',
+ openWorkspace: 'Buka {{title}}',
+ openingWorkspace: 'Membuka {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Konteks belajar.',
+ editorVisual: 'Pilih jangkar visual untuk workspace ini.',
+ emptyList: 'Pisahkan deck, catatan, dan antrean ulasan berdasarkan konteks belajar.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Ini memindahkan "{{title}}" ke Sampah. Anda dapat memulihkannya nanti.',
+ deleteWorkspaceFallbackDescription: 'Ini memindahkan workspace ini ke Sampah. Anda dapat memulihkannya nanti.',
+ deleteWorkspaceFallbackTitle: 'Hapus workspace?',
+ deleteWorkspaceTitle: 'Hapus "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Mulai dengan workspace',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Workspace tidak dapat dibuat',
+ couldNotDeleteWorkspace: 'Workspace tidak dapat dihapus',
+ couldNotOpenWorkspace: 'Workspace tidak dapat dibuka',
+ couldNotSaveWorkspace: 'Workspace tidak dapat disimpan',
+ workspaceCouldNotLoad: 'Workspace tidak dapat dimuat',
+ workspacesCouldNotLoad: 'Workspace tidak dapat dimuat',
+ },
+ fields: {
+ descriptionLabel: 'Deskripsi workspace',
+ descriptionPlaceholder: 'Apa yang termasuk dalam workspace ini?',
+ namePlaceholder: 'Nama workspace',
+ untitledWorkspace: 'Workspace tanpa judul',
+ },
+ labels: {
+ createWorkspaceTitle: 'Buat workspace',
+ loadingWorkspaces: 'Memuat workspace',
+ workspace: 'Workspace',
+ workspaces: 'Workspace',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/index.ts b/ui/src/core/i18n/resources/index.ts
index d9b74bb..621cb23 100644
--- a/ui/src/core/i18n/resources/index.ts
+++ b/ui/src/core/i18n/resources/index.ts
@@ -1,12 +1,164 @@
import { defaultLocale } from '../locales'
+import { ar } from './ar'
+import { bg } from './bg'
+import { bs } from './bs'
+import { ca } from './ca'
+import { cs } from './cs'
+import { da } from './da'
+import { de } from './de'
+import { el } from './el'
import { enUS } from './en-US'
+import { es } from './es'
+import { et } from './et'
+import { fa } from './fa'
+import { fi } from './fi'
+import { fr } from './fr'
+import { he } from './he'
+import { hr } from './hr'
+import { hu } from './hu'
+import { id } from './id'
+import { it } from './it'
+import { ja } from './ja'
+import { ko } from './ko'
+import { lt } from './lt'
+import { lv } from './lv'
+import { nb } from './nb'
+import { nl } from './nl'
+import { pl } from './pl'
+import { ptBR } from './pt-BR'
+import { ro } from './ro'
+import { ru } from './ru'
+import { sk } from './sk'
+import { sl } from './sl'
+import { srLatn } from './sr-Latn'
+import { sv } from './sv'
+import { th } from './th'
+import { tr } from './tr'
+import { uk } from './uk'
+import { vi } from './vi'
+import { zhHans } from './zh-Hans'
+import { zhHant } from './zh-Hant'
export const defaultNamespace = 'translation'
export const resources = {
+ ar: {
+ [defaultNamespace]: ar,
+ },
+ bg: {
+ [defaultNamespace]: bg,
+ },
+ bs: {
+ [defaultNamespace]: bs,
+ },
+ ca: {
+ [defaultNamespace]: ca,
+ },
+ cs: {
+ [defaultNamespace]: cs,
+ },
+ da: {
+ [defaultNamespace]: da,
+ },
+ de: {
+ [defaultNamespace]: de,
+ },
+ el: {
+ [defaultNamespace]: el,
+ },
[defaultLocale]: {
[defaultNamespace]: enUS,
},
+ es: {
+ [defaultNamespace]: es,
+ },
+ et: {
+ [defaultNamespace]: et,
+ },
+ fa: {
+ [defaultNamespace]: fa,
+ },
+ fi: {
+ [defaultNamespace]: fi,
+ },
+ fr: {
+ [defaultNamespace]: fr,
+ },
+ he: {
+ [defaultNamespace]: he,
+ },
+ hr: {
+ [defaultNamespace]: hr,
+ },
+ hu: {
+ [defaultNamespace]: hu,
+ },
+ id: {
+ [defaultNamespace]: id,
+ },
+ it: {
+ [defaultNamespace]: it,
+ },
+ ja: {
+ [defaultNamespace]: ja,
+ },
+ ko: {
+ [defaultNamespace]: ko,
+ },
+ lt: {
+ [defaultNamespace]: lt,
+ },
+ lv: {
+ [defaultNamespace]: lv,
+ },
+ nb: {
+ [defaultNamespace]: nb,
+ },
+ nl: {
+ [defaultNamespace]: nl,
+ },
+ pl: {
+ [defaultNamespace]: pl,
+ },
+ 'pt-BR': {
+ [defaultNamespace]: ptBR,
+ },
+ ro: {
+ [defaultNamespace]: ro,
+ },
+ ru: {
+ [defaultNamespace]: ru,
+ },
+ sk: {
+ [defaultNamespace]: sk,
+ },
+ sl: {
+ [defaultNamespace]: sl,
+ },
+ 'sr-Latn': {
+ [defaultNamespace]: srLatn,
+ },
+ sv: {
+ [defaultNamespace]: sv,
+ },
+ th: {
+ [defaultNamespace]: th,
+ },
+ tr: {
+ [defaultNamespace]: tr,
+ },
+ uk: {
+ [defaultNamespace]: uk,
+ },
+ vi: {
+ [defaultNamespace]: vi,
+ },
+ 'zh-Hans': {
+ [defaultNamespace]: zhHans,
+ },
+ 'zh-Hant': {
+ [defaultNamespace]: zhHant,
+ },
} as const
export type TranslationResources = (typeof resources)[typeof defaultLocale]
diff --git a/ui/src/core/i18n/resources/it.ts b/ui/src/core/i18n/resources/it.ts
new file mode 100644
index 0000000..cbec46c
--- /dev/null
+++ b/ui/src/core/i18n/resources/it.ts
@@ -0,0 +1,636 @@
+export const it = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Riprova. Se continua a succedere, riapri Clear.',
+ title: 'Impossibile avviare',
+ },
+ loadingTitle: 'Preparazione del tuo spazio di studio',
+ },
+ common: {
+ actions: {
+ back: 'Indietro',
+ cancel: 'Annulla',
+ checkAgain: 'Controlla di nuovo',
+ close: 'Chiudi',
+ create: 'Crea',
+ delete: 'Elimina',
+ dismissError: 'Ignora errore',
+ dismissStatus: 'Ignora stato',
+ edit: 'Modifica',
+ itemActions: 'Azioni per {{title}}',
+ reset: 'Reimposta',
+ review: 'Ripassa',
+ save: 'Salva',
+ saveChanges: 'Salva modifiche',
+ tryAgain: 'Riprova',
+ },
+ labels: {
+ active: 'Attivo',
+ clear: 'Clear',
+ custom: 'Personalizzato',
+ default: 'Predefinito',
+ loadingEditor: 'Caricamento editor',
+ name: 'Nome',
+ completedTask: 'Attività completata',
+ description: 'Descrizione',
+ incompleteTask: 'Attività incompleta',
+ percentageInput: 'Percentuale di {{label}}',
+ visual: 'Visuale',
+ },
+ status: {
+ actionFailed: 'Azione non riuscita',
+ actionInProgress: 'Azione in corso',
+ },
+ sort: {
+ ascending: 'Cresc.',
+ column: 'Colonna',
+ descending: 'Decresc.',
+ direction: 'Direzione',
+ sort: 'Ordina',
+ },
+ search: {
+ label: 'Cerca',
+ },
+ visualPicker: {
+ allLucideIcons: 'Tutte le icone Lucide',
+ browseIconsFor: 'Sfoglia o cerca icone per {{label}}.',
+ chooseIcon: 'Scegli icona',
+ iconPicker: 'Selettore icone per {{label}}',
+ iconSearch: 'Ricerca icone per {{label}}',
+ iconsCouldNotLoad: 'Impossibile caricare le icone.',
+ loadingIcons: 'Caricamento icone',
+ loadingMoreIcons: 'Caricamento di altre icone',
+ moreIcons: 'Altre icone',
+ noIconsMatch: 'Nessuna icona corrisponde a "{{query}}".',
+ searchIconsPlaceholder: 'Cerca icone…',
+ selectedIcon: '{{label}} selezionato',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Crea',
+ newDeck: 'Nuovo mazzo',
+ newFolder: 'Nuova cartella',
+ },
+ descriptions: {
+ defaultWorkspace: 'Tieni insieme mazzi, cartelle e note.',
+ emptyWorkspace: 'Crea un mazzo, poi aggiungi note per costruire la coda di ripasso.',
+ emptyFolder: 'Crea un mazzo, poi aggiungi note per costruire una coda di ripasso.',
+ searchPlaceholder: 'Cerca cartelle, mazzi e note…',
+ },
+ empty: {
+ createFirstDeck: 'Crea il tuo primo mazzo',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Impossibile eliminare il mazzo',
+ couldNotDeleteFolder: 'Impossibile eliminare la cartella',
+ couldNotDeleteWorkspace: 'Impossibile eliminare lo spazio di lavoro',
+ dashboardCouldNotOpen: 'Impossibile aprire la dashboard',
+ decksCouldNotLoad: 'Impossibile caricare i mazzi',
+ decksMayBeOutOfDate: 'I mazzi potrebbero non essere aggiornati',
+ foldersCouldNotLoad: 'Impossibile caricare le cartelle',
+ foldersMayBeOutOfDate: 'Le cartelle potrebbero non essere aggiornate',
+ workspaceCouldNotLoad: 'Impossibile caricare lo spazio di lavoro',
+ },
+ labels: {
+ dashboard: 'Dashboard',
+ loadingDashboard: 'Caricamento dashboard',
+ newItem: 'Nuovo elemento',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Data non disponibile',
+ },
+ age: {
+ dayAgo_one: '{{count}} giorno fa',
+ dayAgo_many: '{{count}} giorni fa',
+ dayAgo_other: '{{count}} giorni fa',
+ hourAgo_one: '{{count}} ora fa',
+ hourAgo_many: '{{count}} ore fa',
+ hourAgo_other: '{{count}} ore fa',
+ justNow: 'adesso',
+ minuteAgo_one: '{{count}} minuto fa',
+ minuteAgo_many: '{{count}} minuti fa',
+ minuteAgo_other: '{{count}} minuti fa',
+ unavailable: 'data non disponibile',
+ weekAgo_one: '{{count}} settimana fa',
+ weekAgo_many: '{{count}} settimane fa',
+ weekAgo_other: '{{count}} settimane fa',
+ },
+ labels: {
+ deleted: 'Eliminato {{value}}',
+ due: 'In scadenza: {{value}}',
+ reviewed: 'Ripassato: {{value}}',
+ updated: 'Aggiornato {{value}}',
+ updatedUppercase: 'AGGIORNATO {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} giorno fa',
+ dayAgo_many: '{{count}} giorni fa',
+ dayAgo_other: '{{count}} giorni fa',
+ inAMoment: 'Tra un momento',
+ inDay_one: 'Tra {{count}} giorno',
+ inDay_many: 'Tra {{count}} giorni',
+ inDay_other: 'Tra {{count}} giorni',
+ inMonth_one: 'Tra {{count}} mese',
+ inMonth_many: 'Tra {{count}} mesi',
+ inMonth_other: 'Tra {{count}} mesi',
+ inWeek_one: 'Tra {{count}} settimana',
+ inWeek_many: 'Tra {{count}} settimane',
+ inWeek_other: 'Tra {{count}} settimane',
+ justNow: 'Adesso',
+ monthAgo_one: '{{count}} mese fa',
+ monthAgo_many: '{{count}} mesi fa',
+ monthAgo_other: '{{count}} mesi fa',
+ secondsAgoShort: '{{count}} s fa',
+ minutesAgoShort: '{{count}} min fa',
+ hoursAgoShort: '{{count}} h fa',
+ today: 'Oggi',
+ tomorrow: 'Domani',
+ weekAgo_one: '{{count}} settimana fa',
+ weekAgo_many: '{{count}} settimane fa',
+ weekAgo_other: '{{count}} settimane fa',
+ yesterday: 'Ieri',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Azioni per {{title}}',
+ createDeck: 'Crea mazzo',
+ createNote: 'Crea nota',
+ deleteDeck: 'Elimina mazzo',
+ editDeck: 'Modifica mazzo',
+ newNote: 'Nuova nota',
+ openDeck: 'Apri il mazzo {{title}}',
+ saveDeck: 'Impossibile salvare il mazzo',
+ studyNow: 'Studia ora',
+ },
+ descriptions: {
+ emptyDeck: 'Aggiungi una nota per dare a questo mazzo materiale da ripassare.',
+ editorDefault: 'Mazzo di studio focalizzato.',
+ editorVisual: 'Scegli un glifo di copertina per questo mazzo.',
+ notesSearchPlaceholder: 'Cerca note…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Questo sposta "{{title}}" nel Cestino. Puoi ripristinarlo più tardi.',
+ deleteDeckFallbackDescription: 'Questo sposta questo mazzo nel Cestino. Puoi ripristinarlo più tardi.',
+ deleteDeckFallbackTitle: 'Eliminare mazzo?',
+ deleteDeckTitle: 'Eliminare "{{title}}"?',
+ deleteNoteDescription: 'Questo sposta "{{title}}" nel Cestino. Puoi ripristinarla più tardi.',
+ deleteNoteFallbackTitle: 'Eliminare nota?',
+ deleteNoteTitle: 'Eliminare "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Nessuna nota corrispondente',
+ noMatchingNotesDescription: 'Nessuna nota corrisponde a "{{query}}".',
+ thisDeckIsEmpty: 'Questo mazzo è vuoto',
+ },
+ errors: {
+ couldNotCreateDeck: 'Impossibile creare il mazzo',
+ couldNotDeleteDeck: 'Impossibile eliminare il mazzo',
+ couldNotDeleteNote: 'Impossibile eliminare la nota',
+ couldNotLoadFolderPath: 'Impossibile caricare il percorso della cartella',
+ couldNotSaveDeck: 'Impossibile salvare il mazzo',
+ deckCouldNotLoad: 'Impossibile caricare il mazzo',
+ notesCouldNotLoad: 'Impossibile caricare le note',
+ notesMayBeOutOfDate: 'Le note potrebbero non essere aggiornate',
+ },
+ fields: {
+ descriptionLabel: 'Descrizione del mazzo',
+ descriptionPlaceholder: 'Cosa ti aiuterà a ripassare questo mazzo?',
+ namePlaceholder: 'Nome del mazzo',
+ untitledDeck: 'Mazzo senza titolo',
+ untitledDeckLower: 'mazzo senza titolo',
+ },
+ labels: {
+ createDeckTitle: 'Crea mazzo',
+ deck: 'Mazzo',
+ deckNotesSearch: 'Ricerca note del mazzo',
+ deckOverview: 'Panoramica del mazzo',
+ decks: 'Mazzi',
+ due: 'In scadenza',
+ dueToday: 'In scadenza oggi',
+ loadingDeck: 'Caricamento mazzo',
+ mastery: 'Padronanza',
+ notes: 'Note',
+ },
+ sort: {
+ ariaLabel: 'Ordina mazzi',
+ dueToday: 'In scadenza oggi',
+ title: 'Titolo',
+ updated: 'Aggiornato',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'I dati sono cambiati. Aggiorna e riprova.',
+ forbidden: 'Non hai il permesso di farlo.',
+ notFound: 'Non siamo riusciti a trovare questo elemento.',
+ offline: 'Impossibile raggiungere il servizio.',
+ timeout: 'Ci sta mettendo troppo tempo. Riprova.',
+ unauthorized: 'Accedi per continuare.',
+ unavailable: 'Il servizio è temporaneamente non disponibile.',
+ },
+ fallback: {
+ unexpected: 'Errore imprevisto',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Crea cartella',
+ deleteFolder: 'Elimina cartella',
+ editFolder: 'Modifica cartella',
+ },
+ descriptions: {
+ editorDefault: 'Cartella per mazzi correlati.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Questo sposta "{{name}}" nel Cestino. Puoi ripristinarla più tardi.',
+ deleteFolderFallbackDescription: 'Questo sposta questa cartella nel Cestino. Puoi ripristinarla più tardi.',
+ deleteFolderFallbackTitle: 'Eliminare cartella?',
+ deleteFolderTitle: 'Eliminare "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Nessuna corrispondenza in questa cartella',
+ noMatchesInFolderDescription: 'Nessuna cartella, mazzo o nota corrisponde a "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Impossibile creare la cartella',
+ couldNotDeleteFolder: 'Impossibile eliminare la cartella',
+ couldNotLoadFolderPath: 'Impossibile caricare il percorso della cartella',
+ couldNotSaveFolder: 'Impossibile salvare la cartella',
+ folderCouldNotLoad: 'Impossibile caricare la cartella',
+ },
+ fields: {
+ descriptionLabel: 'Descrizione della cartella',
+ descriptionPlaceholder: 'Cosa appartiene a questa cartella?',
+ namePlaceholder: 'Nome della cartella',
+ untitledFolder: 'Cartella senza titolo',
+ },
+ labels: {
+ createFolderTitle: 'Crea cartella',
+ folder: 'Cartella',
+ folders: 'Cartelle',
+ loadingFolder: 'Caricamento cartella',
+ name: 'Nome',
+ updated: 'Aggiornato',
+ },
+ sort: {
+ ariaLabel: 'Ordina cartelle',
+ name: 'Nome',
+ updated: 'Aggiornato',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Se i dati locali e sincronizzati non coincidono, l\'elemento apparirà qui.',
+ heading: 'Stato sincronizzazione',
+ title: 'Conflitti',
+ noConflicts: 'Nessun conflitto trovato',
+ },
+ labels: {
+ menu: 'Menu',
+ },
+ sections: {
+ settings: {
+ description: 'Personalizza ambiente e preferenze',
+ title: 'Impostazioni',
+ },
+ trash: {
+ description: 'Ripristina o elimina definitivamente gli elementi rimossi',
+ title: 'Cestino',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Chiudi editor',
+ openActions: 'Apri azioni',
+ openWorkspaces: 'Apri spazi di lavoro',
+ },
+ items: {
+ home: 'Home',
+ menu: 'Menu',
+ primary: 'Principale',
+ settings: 'Impostazioni',
+ spaces: 'Spazi',
+ trash: 'Cestino',
+ workspaces: 'Spazi di lavoro',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Aggiungi cloze',
+ deleteNote: 'Elimina nota',
+ editNote: 'Modifica nota',
+ hideDerivedCardsNote: 'Nascondi nota sulle carte derivate',
+ openNote: 'Apri {{title}}',
+ saveNote: 'Salva nota',
+ showDerivedCardsNote: 'Mostra nota sulle carte derivate',
+ },
+ descriptions: {
+ clozeFormat: 'Ogni parte nascosta diventa una carta di ripasso quando salvi.',
+ clozeFormatPrefix: 'Racchiudi il testo nascosto con',
+ derivedCardsHelper: 'Le note sono la fonte di verità per le carte derivate.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Questo sposta "{{title}}" nel Cestino. Puoi ripristinarla più tardi.',
+ deleteNoteFallbackDescription: 'Questo sposta questa nota nel Cestino. Puoi ripristinarla più tardi.',
+ deleteNoteFallbackTitle: 'Eliminare nota?',
+ deleteNoteTitle: 'Eliminare "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Impossibile creare la nota',
+ couldNotDeleteNote: 'Impossibile eliminare la nota',
+ couldNotSaveNote: 'Impossibile salvare la nota',
+ noteCouldNotLoad: 'Impossibile caricare la nota',
+ },
+ fields: {
+ back: 'Retro',
+ backPlaceholder: 'Inserisci il retro',
+ bodyPlaceholder: 'Scrivi il corpo della nota con cloze deletion…',
+ front: 'Fronte',
+ frontPlaceholder: 'Inserisci il fronte',
+ noteBody: 'Corpo della nota',
+ title: 'Titolo',
+ titlePlaceholder: 'Aggiungi un titolo alla nota',
+ untitledCloze: 'Cloze senza titolo',
+ untitledNote: 'Nota senza titolo',
+ },
+ labels: {
+ backUppercase: 'RETRO',
+ basic: 'Base',
+ basicLower: 'base',
+ basicUppercase: 'BASE',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Formato cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Mazzo',
+ derivedCards: 'CARTE DERIVATE',
+ due: 'In scadenza',
+ frontUppercase: 'FRONTE',
+ inProgress: 'In corso',
+ inProgressUppercase: 'IN CORSO',
+ loadingNote: 'Caricamento nota',
+ loadingNoteEditor: 'Caricamento editor note',
+ markdownFormatting: 'Formattazione Markdown',
+ mastered: 'Acquisita',
+ masteredUppercase: 'ACQUISITA',
+ newNote: 'Nuova nota',
+ noteBody: 'CORPO NOTA',
+ noteContent: 'Contenuto nota',
+ noteDetails: 'Dettagli nota',
+ noteMetadata: 'Metadati nota',
+ noteType: 'Tipo di nota',
+ notes: 'Note',
+ reviewed: 'Ripassata',
+ studyProgress: 'Progresso di studio',
+ studyProgressUppercase: 'PROGRESSO DI STUDIO',
+ titleUppercase: 'TITOLO',
+ updated: 'Aggiornata',
+ },
+ sort: {
+ ariaLabel: 'Ordina note',
+ title: 'Titolo',
+ updated: 'Aggiornata',
+ },
+ toolbar: {
+ bold: 'Grassetto',
+ italic: 'Corsivo',
+ link: 'Link',
+ list: 'Elenco',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Di nuovo',
+ backToDeck: 'Torna al mazzo',
+ continueReview: 'Continua ripasso',
+ easy: 'Facile',
+ good: 'Buono',
+ hard: 'Difficile',
+ newNote: 'Nuova nota',
+ showAnswer: 'Mostra risposta',
+ },
+ errors: {
+ couldNotGradeCard: 'Impossibile valutare la carta',
+ reviewCouldNotLoad: 'Impossibile caricare il ripasso',
+ reviewCouldNotStart: 'Impossibile avviare il ripasso',
+ summaryCouldNotLoad: 'Impossibile caricare il riepilogo del ripasso',
+ summaryNotAvailable: 'Il riepilogo del ripasso non è disponibile',
+ summaryNotComplete: 'Questo ripasso non è ancora completo.',
+ },
+ labels: {
+ cardsReviewed: 'Carte ripassate',
+ deck: 'Mazzo',
+ duration: 'Durata',
+ loadingReview: 'Caricamento ripasso',
+ loadingSummary: 'Caricamento riepilogo',
+ progress: 'Progresso ripasso',
+ review: 'Ripasso',
+ reviewComplete: 'Ripasso completato',
+ reviewed_one: 'Ripassata {{count}}',
+ reviewed_many: 'Ripassate {{count}}',
+ reviewed_other: 'Ripassate {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'I tuoi progressi sono stati salvati in questo mazzo.',
+ },
+ unavailable: {
+ description: 'Aggiungi una nota per far entrare questo mazzo nella coda di ripasso.',
+ title: 'Nessuna carta da ripassare',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Cancella ricerca',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Nessuna corrispondenza in questo spazio di lavoro',
+ noMatchesInWorkspaceDescription: 'Nessuna cartella, mazzo o nota corrisponde a "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Impossibile completare la ricerca',
+ },
+ labels: {
+ results: 'Risultati ricerca',
+ resultsFor: 'Risultati per "{{query}}"',
+ searchingContent: 'Ricerca contenuti',
+ },
+ resultGroups: {
+ deck: 'Mazzi',
+ folder: 'Cartelle',
+ note: 'Note',
+ },
+ resultKinds: {
+ deck: 'mazzo',
+ folder: 'cartella',
+ note: 'nota',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Reimposta tutte le impostazioni',
+ resetSettings: 'Reimposta impostazioni',
+ resetToDefaults: 'Ripristina predefiniti',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Incolla JSON valido con 21 valori numerici.',
+ fsrsErrorInvalidParams_one: 'Inserisci un array JSON con esattamente {{count}} numero finito.',
+ fsrsErrorInvalidParams_many: 'Inserisci un array JSON con esattamente {{count}} numeri finiti.',
+ fsrsErrorInvalidParams_other: 'Inserisci un array JSON con esattamente {{count}} numeri finiti.',
+ fsrsHelper: 'Questa è una modifica esperta. I valori devono restare in ordine.',
+ fsrsJsonLabel: 'JSON parametri FSRS',
+ fsrsTitle: 'Modifica parametri FSRS',
+ fsrsDescription: 'Incolla un array JSON con 21 numeri per sovrascrivere i pesi dello scheduler.',
+ resetDescription: 'Ripristina fuso orario, limiti di studio e impostazioni FSRS.',
+ resetDescriptionWithLanguage: 'Ripristina lingua, fuso orario, limiti di studio e impostazioni FSRS.',
+ resetTitle: 'Reimpostare tutte le impostazioni?',
+ timezoneDescription: 'Cerca una città o un identificatore di fuso orario.',
+ timezoneSearchLabel: 'Cerca fusi orari',
+ timezoneSearchPlaceholder: 'Cerca fusi orari…',
+ timezoneTitle: 'Scegli fuso orario',
+ },
+ errors: {
+ couldNotResetSettings: 'Impossibile reimpostare le impostazioni',
+ couldNotSaveSettings: 'Impossibile salvare le impostazioni',
+ settingsCouldNotLoad: 'Impossibile caricare le impostazioni',
+ settingsUnavailable: 'Le impostazioni non sono disponibili.',
+ },
+ labels: {
+ appearance: 'Aspetto',
+ automatic: 'Automatico',
+ fsrsParameters: 'Parametri FSRS',
+ general: 'Generali',
+ language: 'Lingua',
+ loadingSettings: 'Caricamento impostazioni',
+ masteryHorizon: 'Orizzonte di padronanza',
+ newCardOrder: 'Ordine nuove carte',
+ newCardsPerDay: 'Nuove carte al giorno',
+ reviewCardsPerDay: 'Carte di ripasso al giorno',
+ savingSettings: 'Salvataggio impostazioni',
+ schedule: 'Programma',
+ searchNoTimezones: 'Nessun fuso orario corrispondente.',
+ settings: 'Impostazioni',
+ settingsReset: 'Impostazioni reimpostate',
+ study: 'Studio',
+ targetRecallProbability: 'Probabilità di richiamo target',
+ theme: 'Tema',
+ timezone: 'Fuso orario',
+ },
+ options: {
+ languageEnUs: 'Inglese (USA)',
+ newCardsAfterReviews: 'Dopo i ripassi',
+ newCardsBeforeReviews: 'Prima dei ripassi',
+ newCardsMixed: 'Misto',
+ themeDark: 'Scuro',
+ themeLight: 'Chiaro',
+ themeSystem: 'Sistema',
+ timezoneSystem: 'Usa fuso orario di sistema',
+ },
+ rows: {
+ fsrsDescription: 'Pesi del modello esperto',
+ languageDescription: 'Lingua dell\'interfaccia',
+ masteryHorizonDescription: 'Giorni in cui una carta deve restare richiamabile alla probabilità target o superiore per contare come acquisita',
+ newCardOrderDescription: 'Ordine delle nuove carte rispetto ai ripassi',
+ newCardsPerDayDescription: 'Massimo di nuove carte al giorno',
+ reviewCardsPerDayDescription: 'Massimo di carte di ripasso al giorno',
+ targetRecallProbabilityDescription: 'Probabilita minima di richiamo al prossimo ripasso programmato',
+ timezoneDescription: 'Usa il fuso orario automatico o scegli una città.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Elimina definitivamente',
+ empty: 'Svuota',
+ emptyTrash: 'Svuota cestino',
+ restore: 'Ripristina',
+ restoringItem: 'Ripristino di {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Questo elimina definitivamente "{{title}}". Non può essere annullato.',
+ deleteItemFallbackDescription: 'Questo elimina definitivamente questo elemento. Non può essere annullato.',
+ deleteItemFallbackTitle: 'Eliminare elemento?',
+ deleteItemTitle: 'Eliminare "{{title}}"?',
+ emptyTrashDescription: 'Questo elimina definitivamente tutto nel Cestino. Non può essere annullato.',
+ emptyTrashTitle: 'Svuotare cestino?',
+ },
+ empty: {
+ description: 'Gli elementi eliminati appariranno qui prima della rimozione definitiva.',
+ title: 'Il Cestino è vuoto',
+ },
+ errors: {
+ couldNotDeleteItem: 'Impossibile eliminare l\'elemento',
+ couldNotEmptyTrash: 'Impossibile svuotare il Cestino',
+ couldNotRestoreItem: 'Impossibile ripristinare l\'elemento',
+ trashCouldNotLoad: 'Impossibile caricare il Cestino',
+ trashMayBeOutOfDate: 'Il Cestino potrebbe non essere aggiornato',
+ },
+ labels: {
+ deletedAge: 'Eliminato {{value}}',
+ itemCount_one: '{{count}} elemento',
+ itemCount_many: '{{count}} elementi',
+ itemCount_other: '{{count}} elementi',
+ lastEmptied: 'Ultimo svuotamento {{value}}',
+ loadingTrash: 'Caricamento Cestino',
+ originalLocation: 'Posizione originale: {{location}}',
+ title: 'Cestino',
+ trashActions: 'Azioni cestino per {{title}}',
+ },
+ kinds: {
+ deck: 'Mazzo',
+ folder: 'Cartella',
+ note: 'Nota',
+ workspace: 'Spazio di lavoro',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Crea spazio di lavoro',
+ deleteWorkspace: 'Elimina spazio di lavoro',
+ editWorkspace: 'Modifica spazio di lavoro',
+ newWorkspace: 'Nuovo spazio di lavoro',
+ openWorkspace: 'Apri {{title}}',
+ openingWorkspace: 'Apertura di {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Contesto di studio.',
+ editorVisual: 'Scegli un riferimento visivo per questo spazio di lavoro.',
+ emptyList: 'Separa mazzi, note e code di ripasso per contesto di studio.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Questo sposta "{{title}}" nel Cestino. Puoi ripristinarlo più tardi.',
+ deleteWorkspaceFallbackDescription: 'Questo sposta questo spazio di lavoro nel Cestino. Puoi ripristinarlo più tardi.',
+ deleteWorkspaceFallbackTitle: 'Eliminare spazio di lavoro?',
+ deleteWorkspaceTitle: 'Eliminare "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Inizia con uno spazio di lavoro',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Impossibile creare lo spazio di lavoro',
+ couldNotDeleteWorkspace: 'Impossibile eliminare lo spazio di lavoro',
+ couldNotOpenWorkspace: 'Impossibile aprire lo spazio di lavoro',
+ couldNotSaveWorkspace: 'Impossibile salvare lo spazio di lavoro',
+ workspaceCouldNotLoad: 'Impossibile caricare lo spazio di lavoro',
+ workspacesCouldNotLoad: 'Impossibile caricare gli spazi di lavoro',
+ },
+ fields: {
+ descriptionLabel: 'Descrizione dello spazio di lavoro',
+ descriptionPlaceholder: 'Cosa appartiene a questo spazio di lavoro?',
+ namePlaceholder: 'Nome dello spazio di lavoro',
+ untitledWorkspace: 'Spazio di lavoro senza titolo',
+ },
+ labels: {
+ createWorkspaceTitle: 'Crea spazio di lavoro',
+ loadingWorkspaces: 'Caricamento spazi di lavoro',
+ workspace: 'Spazio di lavoro',
+ workspaces: 'Spazi di lavoro',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/ja.ts b/ui/src/core/i18n/resources/ja.ts
new file mode 100644
index 0000000..f889300
--- /dev/null
+++ b/ui/src/core/i18n/resources/ja.ts
@@ -0,0 +1,623 @@
+export const ja = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'もう一度お試しください。問題が続く場合は Clear を開き直してください。',
+ title: '開始できませんでした',
+ },
+ loadingTitle: '学習スペースを準備しています',
+ },
+ common: {
+ actions: {
+ back: '戻る',
+ cancel: 'キャンセル',
+ checkAgain: '再確認',
+ close: '閉じる',
+ create: '作成',
+ delete: '削除',
+ dismissError: 'エラーを閉じる',
+ dismissStatus: 'ステータスを閉じる',
+ edit: '編集',
+ itemActions: '{{title}} の操作',
+ reset: 'リセット',
+ review: '復習',
+ save: '保存',
+ saveChanges: '変更を保存',
+ tryAgain: 'もう一度試す',
+ },
+ labels: {
+ active: '有効',
+ clear: 'Clear',
+ custom: 'カスタム',
+ default: 'デフォルト',
+ loadingEditor: 'エディターを読み込み中',
+ name: '名前',
+ completedTask: '完了したタスク',
+ description: '説明',
+ incompleteTask: '未完了のタスク',
+ percentageInput: '{{label}} の割合',
+ visual: 'ビジュアル',
+ },
+ status: {
+ actionFailed: '操作に失敗しました',
+ actionInProgress: '操作中',
+ },
+ sort: {
+ ascending: '昇順',
+ column: '列',
+ descending: '降順',
+ direction: '方向',
+ sort: '並べ替え',
+ },
+ search: {
+ label: '検索',
+ },
+ visualPicker: {
+ allLucideIcons: 'すべての Lucide アイコン',
+ browseIconsFor: '{{label}} のアイコンを参照または検索します。',
+ chooseIcon: 'アイコンを選択',
+ iconPicker: '{{label}} のアイコン選択',
+ iconSearch: '{{label}} のアイコン検索',
+ iconsCouldNotLoad: 'アイコンを読み込めませんでした。',
+ loadingIcons: 'アイコンを読み込み中',
+ loadingMoreIcons: 'さらにアイコンを読み込み中',
+ moreIcons: 'さらに表示',
+ noIconsMatch: '"{{query}}" に一致するアイコンはありません。',
+ searchIconsPlaceholder: 'アイコンを検索…',
+ selectedIcon: '選択中の {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: '作成',
+ newDeck: '新しいデッキ',
+ newFolder: '新しいフォルダー',
+ },
+ descriptions: {
+ defaultWorkspace: 'デッキ、フォルダー、ノートをまとめて管理します。',
+ emptyWorkspace: 'デッキを作成し、ノートを追加して復習キューを作りましょう。',
+ emptyFolder: 'デッキを作成し、ノートを追加して復習キューを作りましょう。',
+ searchPlaceholder: 'フォルダー、デッキ、ノートを検索…',
+ },
+ empty: {
+ createFirstDeck: '最初のデッキを作成',
+ },
+ errors: {
+ couldNotDeleteDeck: 'デッキを削除できませんでした',
+ couldNotDeleteFolder: 'フォルダーを削除できませんでした',
+ couldNotDeleteWorkspace: 'ワークスペースを削除できませんでした',
+ dashboardCouldNotOpen: 'ダッシュボードを開けませんでした',
+ decksCouldNotLoad: 'デッキを読み込めませんでした',
+ decksMayBeOutOfDate: 'デッキが最新でない可能性があります',
+ foldersCouldNotLoad: 'フォルダーを読み込めませんでした',
+ foldersMayBeOutOfDate: 'フォルダーが最新でない可能性があります',
+ workspaceCouldNotLoad: 'ワークスペースを読み込めませんでした',
+ },
+ labels: {
+ dashboard: 'ダッシュボード',
+ loadingDashboard: 'ダッシュボードを読み込み中',
+ newItem: '新しい項目',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: '日付を利用できません',
+ },
+ age: {
+ dayAgo_one: '{{count}}日前',
+ dayAgo_other: '{{count}}日前',
+ hourAgo_one: '{{count}}時間前',
+ hourAgo_other: '{{count}}時間前',
+ justNow: 'たった今',
+ minuteAgo_one: '{{count}}分前',
+ minuteAgo_other: '{{count}}分前',
+ unavailable: '日付を利用できません',
+ weekAgo_one: '{{count}}週間前',
+ weekAgo_other: '{{count}}週間前',
+ },
+ labels: {
+ deleted: '{{value}}に削除',
+ due: '期限: {{value}}',
+ reviewed: '復習済み: {{value}}',
+ updated: '{{value}}に更新',
+ updatedUppercase: '{{value}}に更新',
+ },
+ relative: {
+ dayAgo_one: '{{count}}日前',
+ dayAgo_other: '{{count}}日前',
+ inAMoment: 'まもなく',
+ inDay_one: '{{count}}日後',
+ inDay_other: '{{count}}日後',
+ inMonth_one: '{{count}}か月後',
+ inMonth_other: '{{count}}か月後',
+ inWeek_one: '{{count}}週間後',
+ inWeek_other: '{{count}}週間後',
+ justNow: 'たった今',
+ monthAgo_one: '{{count}}か月前',
+ monthAgo_other: '{{count}}か月前',
+ secondsAgoShort: '{{count}}秒前',
+ minutesAgoShort: '{{count}}分前',
+ hoursAgoShort: '{{count}}時間前',
+ today: '今日',
+ tomorrow: '明日',
+ weekAgo_one: '{{count}}週間前',
+ weekAgo_other: '{{count}}週間前',
+ yesterday: '昨日',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: '{{title}} の操作',
+ createDeck: 'デッキを作成',
+ createNote: 'ノートを作成',
+ deleteDeck: 'デッキを削除',
+ editDeck: 'デッキを編集',
+ newNote: '新しいノート',
+ openDeck: '{{title}} デッキを開く',
+ saveDeck: 'デッキを保存できませんでした',
+ studyNow: '今すぐ学習',
+ },
+ descriptions: {
+ emptyDeck: '復習する内容を作るためにノートを追加してください。',
+ editorDefault: '集中学習用のデッキ。',
+ editorVisual: 'このデッキのカバーグリフを選びます。',
+ notesSearchPlaceholder: 'ノートを検索…',
+ },
+ dialogs: {
+ deleteDeckDescription: '"{{title}}" をゴミ箱に移動します。後で復元できます。',
+ deleteDeckFallbackDescription: 'このデッキをゴミ箱に移動します。後で復元できます。',
+ deleteDeckFallbackTitle: 'デッキを削除しますか?',
+ deleteDeckTitle: '"{{title}}" を削除しますか?',
+ deleteNoteDescription: '"{{title}}" をゴミ箱に移動します。後で復元できます。',
+ deleteNoteFallbackTitle: 'ノートを削除しますか?',
+ deleteNoteTitle: '"{{title}}" を削除しますか?',
+ },
+ empty: {
+ noMatchingNotes: '一致するノートはありません',
+ noMatchingNotesDescription: '"{{query}}" に一致するノートはありません。',
+ thisDeckIsEmpty: 'このデッキは空です',
+ },
+ errors: {
+ couldNotCreateDeck: 'デッキを作成できませんでした',
+ couldNotDeleteDeck: 'デッキを削除できませんでした',
+ couldNotDeleteNote: 'ノートを削除できませんでした',
+ couldNotLoadFolderPath: 'フォルダーのパスを読み込めませんでした',
+ couldNotSaveDeck: 'デッキを保存できませんでした',
+ deckCouldNotLoad: 'デッキを読み込めませんでした',
+ notesCouldNotLoad: 'ノートを読み込めませんでした',
+ notesMayBeOutOfDate: 'ノートが最新でない可能性があります',
+ },
+ fields: {
+ descriptionLabel: 'デッキの説明',
+ descriptionPlaceholder: 'このデッキで何を復習しますか?',
+ namePlaceholder: 'デッキ名',
+ untitledDeck: '無題のデッキ',
+ untitledDeckLower: '無題のデッキ',
+ },
+ labels: {
+ createDeckTitle: 'デッキを作成',
+ deck: 'デッキ',
+ deckNotesSearch: 'デッキ内ノート検索',
+ deckOverview: 'デッキ概要',
+ decks: 'デッキ',
+ due: '期限',
+ dueToday: '今日が期限',
+ loadingDeck: 'デッキを読み込み中',
+ mastery: '習熟度',
+ notes: 'ノート',
+ },
+ sort: {
+ ariaLabel: 'デッキを並べ替え',
+ dueToday: '今日が期限',
+ title: 'タイトル',
+ updated: '更新日',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'データが変更されました。更新してからもう一度お試しください。',
+ forbidden: 'この操作を行う権限がありません。',
+ notFound: 'この項目が見つかりませんでした。',
+ offline: 'サービスに接続できません。',
+ timeout: '時間がかかりすぎました。もう一度お試しください。',
+ unauthorized: '続行するにはサインインしてください。',
+ unavailable: 'サービスは一時的に利用できません。',
+ },
+ fallback: {
+ unexpected: '予期しないエラー',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'フォルダーを作成',
+ deleteFolder: 'フォルダーを削除',
+ editFolder: 'フォルダーを編集',
+ },
+ descriptions: {
+ editorDefault: '関連するデッキ用のフォルダー。',
+ },
+ dialogs: {
+ deleteFolderDescription: '"{{name}}" をゴミ箱に移動します。後で復元できます。',
+ deleteFolderFallbackDescription: 'このフォルダーをゴミ箱に移動します。後で復元できます。',
+ deleteFolderFallbackTitle: 'フォルダーを削除しますか?',
+ deleteFolderTitle: '"{{name}}" を削除しますか?',
+ },
+ empty: {
+ noMatchesInFolder: 'このフォルダーに一致する項目はありません',
+ noMatchesInFolderDescription: '"{{query}}" に一致するフォルダー、デッキ、ノートはありません。',
+ },
+ errors: {
+ couldNotCreateFolder: 'フォルダーを作成できませんでした',
+ couldNotDeleteFolder: 'フォルダーを削除できませんでした',
+ couldNotLoadFolderPath: 'フォルダーのパスを読み込めませんでした',
+ couldNotSaveFolder: 'フォルダーを保存できませんでした',
+ folderCouldNotLoad: 'フォルダーを読み込めませんでした',
+ },
+ fields: {
+ descriptionLabel: 'フォルダーの説明',
+ descriptionPlaceholder: 'このフォルダーには何を入れますか?',
+ namePlaceholder: 'フォルダー名',
+ untitledFolder: '無題のフォルダー',
+ },
+ labels: {
+ createFolderTitle: 'フォルダーを作成',
+ folder: 'フォルダー',
+ folders: 'フォルダー',
+ loadingFolder: 'フォルダーを読み込み中',
+ name: '名前',
+ updated: '更新日',
+ },
+ sort: {
+ ariaLabel: 'フォルダーを並べ替え',
+ name: '名前',
+ updated: '更新日',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'ローカルデータと同期済みデータが一致しない場合、項目はここに表示されます。',
+ heading: '同期ステータス',
+ title: '競合',
+ noConflicts: '競合はありません',
+ },
+ labels: {
+ menu: 'メニュー',
+ },
+ sections: {
+ settings: {
+ description: '環境と設定をカスタマイズ',
+ title: '設定',
+ },
+ trash: {
+ description: '削除した項目を復元または完全に削除',
+ title: 'ゴミ箱',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'エディターを閉じる',
+ openActions: '操作を開く',
+ openWorkspaces: 'ワークスペースを開く',
+ },
+ items: {
+ home: 'ホーム',
+ menu: 'メニュー',
+ primary: 'メイン',
+ settings: '設定',
+ spaces: 'スペース',
+ trash: 'ゴミ箱',
+ workspaces: 'ワークスペース',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: '穴埋めを追加',
+ deleteNote: 'ノートを削除',
+ editNote: 'ノートを編集',
+ hideDerivedCardsNote: '派生カードの注記を非表示',
+ openNote: '{{title}} を開く',
+ saveNote: 'ノートを保存',
+ showDerivedCardsNote: '派生カードの注記を表示',
+ },
+ descriptions: {
+ clozeFormat: '保存すると、隠した各部分が復習カードになります。',
+ clozeFormatPrefix: '隠すテキストを次で囲みます',
+ derivedCardsHelper: 'ノートは派生カードの信頼できる元データです。',
+ },
+ dialogs: {
+ deleteNoteDescription: '"{{title}}" をゴミ箱に移動します。後で復元できます。',
+ deleteNoteFallbackDescription: 'このノートをゴミ箱に移動します。後で復元できます。',
+ deleteNoteFallbackTitle: 'ノートを削除しますか?',
+ deleteNoteTitle: '"{{title}}" を削除しますか?',
+ },
+ errors: {
+ couldNotCreateNote: 'ノートを作成できませんでした',
+ couldNotDeleteNote: 'ノートを削除できませんでした',
+ couldNotSaveNote: 'ノートを保存できませんでした',
+ noteCouldNotLoad: 'ノートを読み込めませんでした',
+ },
+ fields: {
+ back: '裏面',
+ backPlaceholder: '裏面を入力',
+ bodyPlaceholder: '穴埋め削除を使ってノート本文を書く…',
+ front: '表面',
+ frontPlaceholder: '表面を入力',
+ noteBody: 'ノート本文',
+ title: 'タイトル',
+ titlePlaceholder: 'ノートのタイトルを追加',
+ untitledCloze: '無題の穴埋め',
+ untitledNote: '無題のノート',
+ },
+ labels: {
+ backUppercase: '裏面',
+ basic: '基本',
+ basicLower: '基本',
+ basicUppercase: '基本',
+ cloze: '穴埋め',
+ clozeLower: '穴埋め',
+ clozeFormat: '穴埋め形式',
+ clozeUppercase: '穴埋め',
+ deck: 'デッキ',
+ derivedCards: '派生カード',
+ due: '期限',
+ frontUppercase: '表面',
+ inProgress: '進行中',
+ inProgressUppercase: '進行中',
+ loadingNote: 'ノートを読み込み中',
+ loadingNoteEditor: 'ノートエディターを読み込み中',
+ markdownFormatting: 'Markdown 書式',
+ mastered: '習得済み',
+ masteredUppercase: '習得済み',
+ newNote: '新しいノート',
+ noteBody: 'ノート本文',
+ noteContent: 'ノート内容',
+ noteDetails: 'ノート詳細',
+ noteMetadata: 'ノートメタデータ',
+ noteType: 'ノートタイプ',
+ notes: 'ノート',
+ reviewed: '復習済み',
+ studyProgress: '学習進捗',
+ studyProgressUppercase: '学習進捗',
+ titleUppercase: 'タイトル',
+ updated: '更新日',
+ },
+ sort: {
+ ariaLabel: 'ノートを並べ替え',
+ title: 'タイトル',
+ updated: '更新日',
+ },
+ toolbar: {
+ bold: '太字',
+ italic: '斜体',
+ link: 'リンク',
+ list: 'リスト',
+ },
+ },
+ review: {
+ actions: {
+ again: 'もう一度',
+ backToDeck: 'デッキに戻る',
+ continueReview: '復習を続ける',
+ easy: '簡単',
+ good: '良い',
+ hard: '難しい',
+ newNote: '新しいノート',
+ showAnswer: '答えを表示',
+ },
+ errors: {
+ couldNotGradeCard: 'カードを採点できませんでした',
+ reviewCouldNotLoad: '復習を読み込めませんでした',
+ reviewCouldNotStart: '復習を開始できませんでした',
+ summaryCouldNotLoad: '復習サマリーを読み込めませんでした',
+ summaryNotAvailable: '復習サマリーは利用できません',
+ summaryNotComplete: 'この復習はまだ完了していません。',
+ },
+ labels: {
+ cardsReviewed: '復習したカード',
+ deck: 'デッキ',
+ duration: '時間',
+ loadingReview: '復習を読み込み中',
+ loadingSummary: 'サマリーを読み込み中',
+ progress: '復習の進捗',
+ review: '復習',
+ reviewComplete: '復習完了',
+ reviewed_one: '{{count}} 件復習済み',
+ reviewed_other: '{{count}} 件復習済み',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}}時間 {{minutes}}分',
+ durationMinutes: '{{minutes}}分',
+ durationSeconds: '{{seconds}}秒',
+ saved: '進捗はこのデッキに保存されました。',
+ },
+ unavailable: {
+ description: 'このデッキを復習キューに入れるにはノートを追加してください。',
+ title: '復習するカードがありません',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: '検索をクリア',
+ },
+ empty: {
+ noMatchesInWorkspace: 'このワークスペースに一致する項目はありません',
+ noMatchesInWorkspaceDescription: '"{{query}}" に一致するフォルダー、デッキ、ノートはありません。',
+ },
+ errors: {
+ couldNotComplete: '検索を完了できませんでした',
+ },
+ labels: {
+ results: '検索結果',
+ resultsFor: '"{{query}}" の結果',
+ searchingContent: 'コンテンツを検索中',
+ },
+ resultGroups: {
+ deck: 'デッキ',
+ folder: 'フォルダー',
+ note: 'ノート',
+ },
+ resultKinds: {
+ deck: 'デッキ',
+ folder: 'フォルダー',
+ note: 'ノート',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'すべての設定をリセット',
+ resetSettings: '設定をリセット',
+ resetToDefaults: 'デフォルトに戻す',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: '21 個の数値を含む有効な JSON を貼り付けてください。',
+ fsrsErrorInvalidParams_one: 'ちょうど {{count}} 個の有限数を含む JSON 配列を入力してください。',
+ fsrsErrorInvalidParams_other: 'ちょうど {{count}} 個の有限数を含む JSON 配列を入力してください。',
+ fsrsHelper: 'これは上級者向けの上書き設定です。値の順序を保ってください。',
+ fsrsJsonLabel: 'FSRS パラメーター JSON',
+ fsrsTitle: 'FSRS パラメーターを編集',
+ fsrsDescription: 'scheduler の重みを上書きするには、21 個の数値を含む JSON 配列を貼り付けます。',
+ resetDescription: 'タイムゾーン、学習上限、FSRS 設定を復元します。',
+ resetDescriptionWithLanguage: '言語、タイムゾーン、学習上限、FSRS 設定を復元します。',
+ resetTitle: 'すべての設定をリセットしますか?',
+ timezoneDescription: '都市またはタイムゾーン識別子を検索します。',
+ timezoneSearchLabel: 'タイムゾーンを検索',
+ timezoneSearchPlaceholder: 'タイムゾーンを検索…',
+ timezoneTitle: 'タイムゾーンを選択',
+ },
+ errors: {
+ couldNotResetSettings: '設定をリセットできませんでした',
+ couldNotSaveSettings: '設定を保存できませんでした',
+ settingsCouldNotLoad: '設定を読み込めませんでした',
+ settingsUnavailable: '設定を利用できません。',
+ },
+ labels: {
+ appearance: '外観',
+ automatic: '自動',
+ fsrsParameters: 'FSRS パラメーター',
+ general: '一般',
+ language: '言語',
+ loadingSettings: '設定を読み込み中',
+ masteryHorizon: '習熟判定期間',
+ newCardOrder: '新規カードの順序',
+ newCardsPerDay: '1日の新規カード',
+ reviewCardsPerDay: '1日の復習カード',
+ savingSettings: '設定を保存中',
+ schedule: 'スケジュール',
+ searchNoTimezones: '一致するタイムゾーンはありません。',
+ settings: '設定',
+ settingsReset: '設定をリセットしました',
+ study: '学習',
+ targetRecallProbability: '目標想起確率',
+ theme: 'テーマ',
+ timezone: 'タイムゾーン',
+ },
+ options: {
+ languageEnUs: '英語(米国)',
+ newCardsAfterReviews: '復習の後',
+ newCardsBeforeReviews: '復習の前',
+ newCardsMixed: '混在',
+ themeDark: 'ダーク',
+ themeLight: 'ライト',
+ themeSystem: 'システム',
+ timezoneSystem: 'システムのタイムゾーンを使用',
+ },
+ rows: {
+ fsrsDescription: '上級モデルの重み',
+ languageDescription: 'インターフェイスの言語',
+ masteryHorizonDescription: 'カードが目標確率以上で想起可能な状態を保つ必要がある日数',
+ newCardOrderDescription: '復習に対する新規カードの順序',
+ newCardsPerDayDescription: '1日あたりの新規カード上限',
+ reviewCardsPerDayDescription: '1日あたりの復習カード上限',
+ targetRecallProbabilityDescription: '次回予定復習での最小想起確率',
+ timezoneDescription: '自動タイムゾーンを使うか、都市を選択します。',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: '完全に削除',
+ empty: '空にする',
+ emptyTrash: 'ゴミ箱を空にする',
+ restore: '復元',
+ restoringItem: '{{title}} を復元中',
+ },
+ dialogs: {
+ deleteItemDescription: '"{{title}}" を完全に削除します。元に戻せません。',
+ deleteItemFallbackDescription: 'この項目を完全に削除します。元に戻せません。',
+ deleteItemFallbackTitle: '項目を削除しますか?',
+ deleteItemTitle: '"{{title}}" を削除しますか?',
+ emptyTrashDescription: 'ゴミ箱内のすべてを完全に削除します。元に戻せません。',
+ emptyTrashTitle: 'ゴミ箱を空にしますか?',
+ },
+ empty: {
+ description: '削除した項目は完全に削除される前にここに表示されます。',
+ title: 'ゴミ箱は空です',
+ },
+ errors: {
+ couldNotDeleteItem: '項目を削除できませんでした',
+ couldNotEmptyTrash: 'ゴミ箱を空にできませんでした',
+ couldNotRestoreItem: '項目を復元できませんでした',
+ trashCouldNotLoad: 'ゴミ箱を読み込めませんでした',
+ trashMayBeOutOfDate: 'ゴミ箱が最新でない可能性があります',
+ },
+ labels: {
+ deletedAge: '{{value}}に削除',
+ itemCount_one: '{{count}} 件',
+ itemCount_other: '{{count}} 件',
+ lastEmptied: '最後に空にした日時: {{value}}',
+ loadingTrash: 'ゴミ箱を読み込み中',
+ originalLocation: '元の場所: {{location}}',
+ title: 'ゴミ箱',
+ trashActions: '{{title}} のゴミ箱操作',
+ },
+ kinds: {
+ deck: 'デッキ',
+ folder: 'フォルダー',
+ note: 'ノート',
+ workspace: 'ワークスペース',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'ワークスペースを作成',
+ deleteWorkspace: 'ワークスペースを削除',
+ editWorkspace: 'ワークスペースを編集',
+ newWorkspace: '新しいワークスペース',
+ openWorkspace: '{{title}} を開く',
+ openingWorkspace: '{{title}} を開いています',
+ },
+ descriptions: {
+ editorDefault: '学習コンテキスト。',
+ editorVisual: 'このワークスペースの視覚的な目印を選びます。',
+ emptyList: 'デッキ、ノート、復習キューを学習コンテキストごとに分けます。',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: '"{{title}}" をゴミ箱に移動します。後で復元できます。',
+ deleteWorkspaceFallbackDescription: 'このワークスペースをゴミ箱に移動します。後で復元できます。',
+ deleteWorkspaceFallbackTitle: 'ワークスペースを削除しますか?',
+ deleteWorkspaceTitle: '"{{title}}" を削除しますか?',
+ },
+ empty: {
+ startWithWorkspace: 'ワークスペースから始める',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'ワークスペースを作成できませんでした',
+ couldNotDeleteWorkspace: 'ワークスペースを削除できませんでした',
+ couldNotOpenWorkspace: 'ワークスペースを開けませんでした',
+ couldNotSaveWorkspace: 'ワークスペースを保存できませんでした',
+ workspaceCouldNotLoad: 'ワークスペースを読み込めませんでした',
+ workspacesCouldNotLoad: 'ワークスペースを読み込めませんでした',
+ },
+ fields: {
+ descriptionLabel: 'ワークスペースの説明',
+ descriptionPlaceholder: 'このワークスペースには何を入れますか?',
+ namePlaceholder: 'ワークスペース名',
+ untitledWorkspace: '無題のワークスペース',
+ },
+ labels: {
+ createWorkspaceTitle: 'ワークスペースを作成',
+ loadingWorkspaces: 'ワークスペースを読み込み中',
+ workspace: 'ワークスペース',
+ workspaces: 'ワークスペース',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/ko.ts b/ui/src/core/i18n/resources/ko.ts
new file mode 100644
index 0000000..1a3580f
--- /dev/null
+++ b/ui/src/core/i18n/resources/ko.ts
@@ -0,0 +1,623 @@
+export const ko = {
+ bootstrap: {
+ error: {
+ fallbackMessage: '다시 시도하세요. 문제가 계속되면 Clear를 다시 여세요.',
+ title: '시작할 수 없음',
+ },
+ loadingTitle: '학습 공간을 준비하는 중',
+ },
+ common: {
+ actions: {
+ back: '뒤로',
+ cancel: '취소',
+ checkAgain: '다시 확인',
+ close: '닫기',
+ create: '만들기',
+ delete: '삭제',
+ dismissError: '오류 닫기',
+ dismissStatus: '상태 닫기',
+ edit: '편집',
+ itemActions: '{{title}} 작업',
+ reset: '초기화',
+ review: '복습',
+ save: '저장',
+ saveChanges: '변경 사항 저장',
+ tryAgain: '다시 시도',
+ },
+ labels: {
+ active: '활성',
+ clear: 'Clear',
+ custom: '사용자 지정',
+ default: '기본값',
+ loadingEditor: '편집기 로드 중',
+ name: '이름',
+ completedTask: '완료된 작업',
+ description: '설명',
+ incompleteTask: '미완료 작업',
+ percentageInput: '{{label}} 백분율',
+ visual: '시각 요소',
+ },
+ status: {
+ actionFailed: '작업 실패',
+ actionInProgress: '작업 진행 중',
+ },
+ sort: {
+ ascending: '오름차순',
+ column: '열',
+ descending: '내림차순',
+ direction: '방향',
+ sort: '정렬',
+ },
+ search: {
+ label: '검색',
+ },
+ visualPicker: {
+ allLucideIcons: '모든 Lucide 아이콘',
+ browseIconsFor: '{{label}} 아이콘을 둘러보거나 검색하세요.',
+ chooseIcon: '아이콘 선택',
+ iconPicker: '{{label}} 아이콘 선택기',
+ iconSearch: '{{label}} 아이콘 검색',
+ iconsCouldNotLoad: '아이콘을 불러올 수 없습니다.',
+ loadingIcons: '아이콘 로드 중',
+ loadingMoreIcons: '아이콘 더 불러오는 중',
+ moreIcons: '아이콘 더 보기',
+ noIconsMatch: '"{{query}}"와 일치하는 아이콘이 없습니다.',
+ searchIconsPlaceholder: '아이콘 검색…',
+ selectedIcon: '선택한 {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: '만들기',
+ newDeck: '새 덱',
+ newFolder: '새 폴더',
+ },
+ descriptions: {
+ defaultWorkspace: '덱, 폴더, 노트를 함께 보관하세요.',
+ emptyWorkspace: '덱을 만든 다음 노트를 추가해 복습 대기열을 만드세요.',
+ emptyFolder: '덱을 만든 다음 노트를 추가해 복습 대기열을 만드세요.',
+ searchPlaceholder: '폴더, 덱, 노트 검색…',
+ },
+ empty: {
+ createFirstDeck: '첫 덱 만들기',
+ },
+ errors: {
+ couldNotDeleteDeck: '덱을 삭제할 수 없습니다',
+ couldNotDeleteFolder: '폴더를 삭제할 수 없습니다',
+ couldNotDeleteWorkspace: '워크스페이스를 삭제할 수 없습니다',
+ dashboardCouldNotOpen: '대시보드를 열 수 없습니다',
+ decksCouldNotLoad: '덱을 불러올 수 없습니다',
+ decksMayBeOutOfDate: '덱이 최신 상태가 아닐 수 있습니다',
+ foldersCouldNotLoad: '폴더를 불러올 수 없습니다',
+ foldersMayBeOutOfDate: '폴더가 최신 상태가 아닐 수 있습니다',
+ workspaceCouldNotLoad: '워크스페이스를 불러올 수 없습니다',
+ },
+ labels: {
+ dashboard: '대시보드',
+ loadingDashboard: '대시보드 로드 중',
+ newItem: '새 항목',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: '날짜를 사용할 수 없음',
+ },
+ age: {
+ dayAgo_one: '{{count}}일 전',
+ dayAgo_other: '{{count}}일 전',
+ hourAgo_one: '{{count}}시간 전',
+ hourAgo_other: '{{count}}시간 전',
+ justNow: '방금',
+ minuteAgo_one: '{{count}}분 전',
+ minuteAgo_other: '{{count}}분 전',
+ unavailable: '날짜를 사용할 수 없음',
+ weekAgo_one: '{{count}}주 전',
+ weekAgo_other: '{{count}}주 전',
+ },
+ labels: {
+ deleted: '{{value}} 삭제됨',
+ due: '기한: {{value}}',
+ reviewed: '복습함: {{value}}',
+ updated: '{{value}} 업데이트됨',
+ updatedUppercase: '{{value}} 업데이트됨',
+ },
+ relative: {
+ dayAgo_one: '{{count}}일 전',
+ dayAgo_other: '{{count}}일 전',
+ inAMoment: '잠시 후',
+ inDay_one: '{{count}}일 후',
+ inDay_other: '{{count}}일 후',
+ inMonth_one: '{{count}}개월 후',
+ inMonth_other: '{{count}}개월 후',
+ inWeek_one: '{{count}}주 후',
+ inWeek_other: '{{count}}주 후',
+ justNow: '방금',
+ monthAgo_one: '{{count}}개월 전',
+ monthAgo_other: '{{count}}개월 전',
+ secondsAgoShort: '{{count}}초 전',
+ minutesAgoShort: '{{count}}분 전',
+ hoursAgoShort: '{{count}}시간 전',
+ today: '오늘',
+ tomorrow: '내일',
+ weekAgo_one: '{{count}}주 전',
+ weekAgo_other: '{{count}}주 전',
+ yesterday: '어제',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: '{{title}} 작업',
+ createDeck: '덱 만들기',
+ createNote: '노트 만들기',
+ deleteDeck: '덱 삭제',
+ editDeck: '덱 편집',
+ newNote: '새 노트',
+ openDeck: '{{title}} 덱 열기',
+ saveDeck: '덱을 저장할 수 없습니다',
+ studyNow: '지금 학습',
+ },
+ descriptions: {
+ emptyDeck: '이 덱에 복습할 자료가 생기도록 노트를 추가하세요.',
+ editorDefault: '집중 학습 덱.',
+ editorVisual: '이 덱의 표지 글리프를 선택하세요.',
+ notesSearchPlaceholder: '노트 검색…',
+ },
+ dialogs: {
+ deleteDeckDescription: '"{{title}}"을 휴지통으로 이동합니다. 나중에 복원할 수 있습니다.',
+ deleteDeckFallbackDescription: '이 덱을 휴지통으로 이동합니다. 나중에 복원할 수 있습니다.',
+ deleteDeckFallbackTitle: '덱을 삭제할까요?',
+ deleteDeckTitle: '"{{title}}"을 삭제할까요?',
+ deleteNoteDescription: '"{{title}}"을 휴지통으로 이동합니다. 나중에 복원할 수 있습니다.',
+ deleteNoteFallbackTitle: '노트를 삭제할까요?',
+ deleteNoteTitle: '"{{title}}"을 삭제할까요?',
+ },
+ empty: {
+ noMatchingNotes: '일치하는 노트 없음',
+ noMatchingNotesDescription: '"{{query}}"와 일치하는 노트가 없습니다.',
+ thisDeckIsEmpty: '이 덱은 비어 있습니다',
+ },
+ errors: {
+ couldNotCreateDeck: '덱을 만들 수 없습니다',
+ couldNotDeleteDeck: '덱을 삭제할 수 없습니다',
+ couldNotDeleteNote: '노트를 삭제할 수 없습니다',
+ couldNotLoadFolderPath: '폴더 경로를 불러올 수 없습니다',
+ couldNotSaveDeck: '덱을 저장할 수 없습니다',
+ deckCouldNotLoad: '덱을 불러올 수 없습니다',
+ notesCouldNotLoad: '노트를 불러올 수 없습니다',
+ notesMayBeOutOfDate: '노트가 최신 상태가 아닐 수 있습니다',
+ },
+ fields: {
+ descriptionLabel: '덱 설명',
+ descriptionPlaceholder: '이 덱은 무엇을 복습하는 데 도움이 되나요?',
+ namePlaceholder: '덱 이름',
+ untitledDeck: '제목 없는 덱',
+ untitledDeckLower: '제목 없는 덱',
+ },
+ labels: {
+ createDeckTitle: '덱 만들기',
+ deck: '덱',
+ deckNotesSearch: '덱 노트 검색',
+ deckOverview: '덱 개요',
+ decks: '덱',
+ due: '기한',
+ dueToday: '오늘 기한',
+ loadingDeck: '덱 로드 중',
+ mastery: '숙련도',
+ notes: '노트',
+ },
+ sort: {
+ ariaLabel: '덱 정렬',
+ dueToday: '오늘 기한',
+ title: '제목',
+ updated: '업데이트',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: '데이터가 변경되었습니다. 새로고침한 뒤 다시 시도하세요.',
+ forbidden: '이 작업을 수행할 권한이 없습니다.',
+ notFound: '이 항목을 찾을 수 없습니다.',
+ offline: '서비스에 연결할 수 없습니다.',
+ timeout: '너무 오래 걸렸습니다. 다시 시도하세요.',
+ unauthorized: '계속하려면 로그인하세요.',
+ unavailable: '서비스를 일시적으로 사용할 수 없습니다.',
+ },
+ fallback: {
+ unexpected: '예상치 못한 오류',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: '폴더 만들기',
+ deleteFolder: '폴더 삭제',
+ editFolder: '폴더 편집',
+ },
+ descriptions: {
+ editorDefault: '관련 덱을 위한 폴더.',
+ },
+ dialogs: {
+ deleteFolderDescription: '"{{name}}"을 휴지통으로 이동합니다. 나중에 복원할 수 있습니다.',
+ deleteFolderFallbackDescription: '이 폴더를 휴지통으로 이동합니다. 나중에 복원할 수 있습니다.',
+ deleteFolderFallbackTitle: '폴더를 삭제할까요?',
+ deleteFolderTitle: '"{{name}}"을 삭제할까요?',
+ },
+ empty: {
+ noMatchesInFolder: '이 폴더에 일치하는 항목 없음',
+ noMatchesInFolderDescription: '"{{query}}"와 일치하는 폴더, 덱 또는 노트가 없습니다.',
+ },
+ errors: {
+ couldNotCreateFolder: '폴더를 만들 수 없습니다',
+ couldNotDeleteFolder: '폴더를 삭제할 수 없습니다',
+ couldNotLoadFolderPath: '폴더 경로를 불러올 수 없습니다',
+ couldNotSaveFolder: '폴더를 저장할 수 없습니다',
+ folderCouldNotLoad: '폴더를 불러올 수 없습니다',
+ },
+ fields: {
+ descriptionLabel: '폴더 설명',
+ descriptionPlaceholder: '이 폴더에는 무엇이 들어가나요?',
+ namePlaceholder: '폴더 이름',
+ untitledFolder: '제목 없는 폴더',
+ },
+ labels: {
+ createFolderTitle: '폴더 만들기',
+ folder: '폴더',
+ folders: '폴더',
+ loadingFolder: '폴더 로드 중',
+ name: '이름',
+ updated: '업데이트',
+ },
+ sort: {
+ ariaLabel: '폴더 정렬',
+ name: '이름',
+ updated: '업데이트',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: '로컬 데이터와 동기화된 데이터가 서로 다르면 항목이 여기에 표시됩니다.',
+ heading: '동기화 상태',
+ title: '충돌',
+ noConflicts: '충돌이 없습니다',
+ },
+ labels: {
+ menu: '메뉴',
+ },
+ sections: {
+ settings: {
+ description: '환경과 기본 설정을 개인화하세요',
+ title: '설정',
+ },
+ trash: {
+ description: '제거된 항목을 복원하거나 영구 삭제하세요',
+ title: '휴지통',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: '편집기 닫기',
+ openActions: '작업 열기',
+ openWorkspaces: '워크스페이스 열기',
+ },
+ items: {
+ home: '홈',
+ menu: '메뉴',
+ primary: '기본',
+ settings: '설정',
+ spaces: '공간',
+ trash: '휴지통',
+ workspaces: '워크스페이스',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: '빈칸 추가',
+ deleteNote: '노트 삭제',
+ editNote: '노트 편집',
+ hideDerivedCardsNote: '파생 카드 안내 숨기기',
+ openNote: '{{title}} 열기',
+ saveNote: '노트 저장',
+ showDerivedCardsNote: '파생 카드 안내 보기',
+ },
+ descriptions: {
+ clozeFormat: '저장하면 숨긴 각 부분이 복습 카드가 됩니다.',
+ clozeFormatPrefix: '숨길 텍스트를 다음으로 감싸세요',
+ derivedCardsHelper: '노트는 파생 카드의 기준 데이터입니다.',
+ },
+ dialogs: {
+ deleteNoteDescription: '"{{title}}"을 휴지통으로 이동합니다. 나중에 복원할 수 있습니다.',
+ deleteNoteFallbackDescription: '이 노트를 휴지통으로 이동합니다. 나중에 복원할 수 있습니다.',
+ deleteNoteFallbackTitle: '노트를 삭제할까요?',
+ deleteNoteTitle: '"{{title}}"을 삭제할까요?',
+ },
+ errors: {
+ couldNotCreateNote: '노트를 만들 수 없습니다',
+ couldNotDeleteNote: '노트를 삭제할 수 없습니다',
+ couldNotSaveNote: '노트를 저장할 수 없습니다',
+ noteCouldNotLoad: '노트를 불러올 수 없습니다',
+ },
+ fields: {
+ back: '뒷면',
+ backPlaceholder: '뒷면 입력',
+ bodyPlaceholder: '빈칸 삭제를 사용해 노트 본문 작성…',
+ front: '앞면',
+ frontPlaceholder: '앞면 입력',
+ noteBody: '노트 본문',
+ title: '제목',
+ titlePlaceholder: '노트 제목 추가',
+ untitledCloze: '제목 없는 빈칸',
+ untitledNote: '제목 없는 노트',
+ },
+ labels: {
+ backUppercase: '뒷면',
+ basic: '기본',
+ basicLower: '기본',
+ basicUppercase: '기본',
+ cloze: '빈칸',
+ clozeLower: '빈칸',
+ clozeFormat: '빈칸 형식',
+ clozeUppercase: '빈칸',
+ deck: '덱',
+ derivedCards: '파생 카드',
+ due: '기한',
+ frontUppercase: '앞면',
+ inProgress: '진행 중',
+ inProgressUppercase: '진행 중',
+ loadingNote: '노트 로드 중',
+ loadingNoteEditor: '노트 편집기 로드 중',
+ markdownFormatting: 'Markdown 서식',
+ mastered: '숙달됨',
+ masteredUppercase: '숙달됨',
+ newNote: '새 노트',
+ noteBody: '노트 본문',
+ noteContent: '노트 내용',
+ noteDetails: '노트 세부 정보',
+ noteMetadata: '노트 메타데이터',
+ noteType: '노트 유형',
+ notes: '노트',
+ reviewed: '복습함',
+ studyProgress: '학습 진행률',
+ studyProgressUppercase: '학습 진행률',
+ titleUppercase: '제목',
+ updated: '업데이트',
+ },
+ sort: {
+ ariaLabel: '노트 정렬',
+ title: '제목',
+ updated: '업데이트',
+ },
+ toolbar: {
+ bold: '굵게',
+ italic: '기울임',
+ link: '링크',
+ list: '목록',
+ },
+ },
+ review: {
+ actions: {
+ again: '다시',
+ backToDeck: '덱으로 돌아가기',
+ continueReview: '복습 계속',
+ easy: '쉬움',
+ good: '좋음',
+ hard: '어려움',
+ newNote: '새 노트',
+ showAnswer: '답 보기',
+ },
+ errors: {
+ couldNotGradeCard: '카드를 평가할 수 없습니다',
+ reviewCouldNotLoad: '복습을 불러올 수 없습니다',
+ reviewCouldNotStart: '복습을 시작할 수 없습니다',
+ summaryCouldNotLoad: '복습 요약을 불러올 수 없습니다',
+ summaryNotAvailable: '복습 요약을 사용할 수 없습니다',
+ summaryNotComplete: '이 복습은 아직 완료되지 않았습니다.',
+ },
+ labels: {
+ cardsReviewed: '복습한 카드',
+ deck: '덱',
+ duration: '소요 시간',
+ loadingReview: '복습 로드 중',
+ loadingSummary: '요약 로드 중',
+ progress: '복습 진행률',
+ review: '복습',
+ reviewComplete: '복습 완료',
+ reviewed_one: '{{count}}개 복습함',
+ reviewed_other: '{{count}}개 복습함',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}}시간 {{minutes}}분',
+ durationMinutes: '{{minutes}}분',
+ durationSeconds: '{{seconds}}초',
+ saved: '진행 상황이 이 덱에 저장되었습니다.',
+ },
+ unavailable: {
+ description: '이 덱이 복습 대기열에 들어가도록 노트를 추가하세요.',
+ title: '복습할 카드가 없습니다',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: '검색 지우기',
+ },
+ empty: {
+ noMatchesInWorkspace: '이 워크스페이스에 일치하는 항목 없음',
+ noMatchesInWorkspaceDescription: '"{{query}}"와 일치하는 폴더, 덱 또는 노트가 없습니다.',
+ },
+ errors: {
+ couldNotComplete: '검색을 완료할 수 없습니다',
+ },
+ labels: {
+ results: '검색 결과',
+ resultsFor: '"{{query}}" 결과',
+ searchingContent: '콘텐츠 검색 중',
+ },
+ resultGroups: {
+ deck: '덱',
+ folder: '폴더',
+ note: '노트',
+ },
+ resultKinds: {
+ deck: '덱',
+ folder: '폴더',
+ note: '노트',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: '모든 설정 초기화',
+ resetSettings: '설정 초기화',
+ resetToDefaults: '기본값으로 되돌리기',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: '21개의 숫자 값이 있는 유효한 JSON을 붙여넣으세요.',
+ fsrsErrorInvalidParams_one: '정확히 {{count}}개의 유한 숫자가 있는 JSON 배열을 입력하세요.',
+ fsrsErrorInvalidParams_other: '정확히 {{count}}개의 유한 숫자가 있는 JSON 배열을 입력하세요.',
+ fsrsHelper: '전문가용 재정의입니다. 값의 순서를 유지해야 합니다.',
+ fsrsJsonLabel: 'FSRS 매개변수 JSON',
+ fsrsTitle: 'FSRS 매개변수 편집',
+ fsrsDescription: 'scheduler 가중치를 재정의하려면 21개의 숫자가 있는 JSON 배열을 붙여넣으세요.',
+ resetDescription: '시간대, 학습 제한, FSRS 설정을 복원합니다.',
+ resetDescriptionWithLanguage: '언어, 시간대, 학습 제한, FSRS 설정을 복원합니다.',
+ resetTitle: '모든 설정을 초기화할까요?',
+ timezoneDescription: '도시 또는 시간대 식별자를 검색하세요.',
+ timezoneSearchLabel: '시간대 검색',
+ timezoneSearchPlaceholder: '시간대 검색…',
+ timezoneTitle: '시간대 선택',
+ },
+ errors: {
+ couldNotResetSettings: '설정을 초기화할 수 없습니다',
+ couldNotSaveSettings: '설정을 저장할 수 없습니다',
+ settingsCouldNotLoad: '설정을 불러올 수 없습니다',
+ settingsUnavailable: '설정을 사용할 수 없습니다.',
+ },
+ labels: {
+ appearance: '모양',
+ automatic: '자동',
+ fsrsParameters: 'FSRS 매개변수',
+ general: '일반',
+ language: '언어',
+ loadingSettings: '설정 로드 중',
+ masteryHorizon: '숙달 기간',
+ newCardOrder: '새 카드 순서',
+ newCardsPerDay: '일일 새 카드',
+ reviewCardsPerDay: '일일 복습 카드',
+ savingSettings: '설정 저장 중',
+ schedule: '일정',
+ searchNoTimezones: '일치하는 시간대가 없습니다.',
+ settings: '설정',
+ settingsReset: '설정 초기화됨',
+ study: '학습',
+ targetRecallProbability: '목표 회상 확률',
+ theme: '테마',
+ timezone: '시간대',
+ },
+ options: {
+ languageEnUs: '영어(미국)',
+ newCardsAfterReviews: '복습 후',
+ newCardsBeforeReviews: '복습 전',
+ newCardsMixed: '섞기',
+ themeDark: '어둡게',
+ themeLight: '밝게',
+ themeSystem: '시스템',
+ timezoneSystem: '시스템 시간대 사용',
+ },
+ rows: {
+ fsrsDescription: '전문가 모델 가중치',
+ languageDescription: '인터페이스 언어',
+ masteryHorizonDescription: '카드가 숙달된 것으로 간주되려면 목표 확률 이상으로 회상 가능해야 하는 일수',
+ newCardOrderDescription: '복습에 대한 새 카드의 순서',
+ newCardsPerDayDescription: '하루 최대 새 카드 수',
+ reviewCardsPerDayDescription: '하루 최대 복습 카드 수',
+ targetRecallProbabilityDescription: '다음 예정 복습에서의 최소 회상 확률',
+ timezoneDescription: '자동 시간대를 사용하거나 도시를 선택하세요.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: '영구 삭제',
+ empty: '비우기',
+ emptyTrash: '휴지통 비우기',
+ restore: '복원',
+ restoringItem: '{{title}} 복원 중',
+ },
+ dialogs: {
+ deleteItemDescription: '"{{title}}"을 영구 삭제합니다. 되돌릴 수 없습니다.',
+ deleteItemFallbackDescription: '이 항목을 영구 삭제합니다. 되돌릴 수 없습니다.',
+ deleteItemFallbackTitle: '항목을 삭제할까요?',
+ deleteItemTitle: '"{{title}}"을 삭제할까요?',
+ emptyTrashDescription: '휴지통의 모든 항목을 영구 삭제합니다. 되돌릴 수 없습니다.',
+ emptyTrashTitle: '휴지통을 비울까요?',
+ },
+ empty: {
+ description: '삭제한 항목은 영구 제거되기 전에 여기에 표시됩니다.',
+ title: '휴지통이 비어 있습니다',
+ },
+ errors: {
+ couldNotDeleteItem: '항목을 삭제할 수 없습니다',
+ couldNotEmptyTrash: '휴지통을 비울 수 없습니다',
+ couldNotRestoreItem: '항목을 복원할 수 없습니다',
+ trashCouldNotLoad: '휴지통을 불러올 수 없습니다',
+ trashMayBeOutOfDate: '휴지통이 최신 상태가 아닐 수 있습니다',
+ },
+ labels: {
+ deletedAge: '{{value}} 삭제됨',
+ itemCount_one: '{{count}}개 항목',
+ itemCount_other: '{{count}}개 항목',
+ lastEmptied: '마지막으로 비운 시각 {{value}}',
+ loadingTrash: '휴지통 로드 중',
+ originalLocation: '원래 위치: {{location}}',
+ title: '휴지통',
+ trashActions: '{{title}} 휴지통 작업',
+ },
+ kinds: {
+ deck: '덱',
+ folder: '폴더',
+ note: '노트',
+ workspace: '워크스페이스',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: '워크스페이스 만들기',
+ deleteWorkspace: '워크스페이스 삭제',
+ editWorkspace: '워크스페이스 편집',
+ newWorkspace: '새 워크스페이스',
+ openWorkspace: '{{title}} 열기',
+ openingWorkspace: '{{title}} 여는 중',
+ },
+ descriptions: {
+ editorDefault: '학습 컨텍스트.',
+ editorVisual: '이 워크스페이스의 시각적 기준을 선택하세요.',
+ emptyList: '덱, 노트, 복습 대기열을 학습 컨텍스트별로 나누세요.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: '"{{title}}"을 휴지통으로 이동합니다. 나중에 복원할 수 있습니다.',
+ deleteWorkspaceFallbackDescription: '이 워크스페이스를 휴지통으로 이동합니다. 나중에 복원할 수 있습니다.',
+ deleteWorkspaceFallbackTitle: '워크스페이스를 삭제할까요?',
+ deleteWorkspaceTitle: '"{{title}}"을 삭제할까요?',
+ },
+ empty: {
+ startWithWorkspace: '워크스페이스로 시작하기',
+ },
+ errors: {
+ couldNotCreateWorkspace: '워크스페이스를 만들 수 없습니다',
+ couldNotDeleteWorkspace: '워크스페이스를 삭제할 수 없습니다',
+ couldNotOpenWorkspace: '워크스페이스를 열 수 없습니다',
+ couldNotSaveWorkspace: '워크스페이스를 저장할 수 없습니다',
+ workspaceCouldNotLoad: '워크스페이스를 불러올 수 없습니다',
+ workspacesCouldNotLoad: '워크스페이스를 불러올 수 없습니다',
+ },
+ fields: {
+ descriptionLabel: '워크스페이스 설명',
+ descriptionPlaceholder: '이 워크스페이스에는 무엇이 들어가나요?',
+ namePlaceholder: '워크스페이스 이름',
+ untitledWorkspace: '제목 없는 워크스페이스',
+ },
+ labels: {
+ createWorkspaceTitle: '워크스페이스 만들기',
+ loadingWorkspaces: '워크스페이스 로드 중',
+ workspace: '워크스페이스',
+ workspaces: '워크스페이스',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/lt.ts b/ui/src/core/i18n/resources/lt.ts
new file mode 100644
index 0000000..35e5954
--- /dev/null
+++ b/ui/src/core/i18n/resources/lt.ts
@@ -0,0 +1,649 @@
+export const lt = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Bandykite dar kartą. Jei tai kartojasi, iš naujo atidarykite Clear.',
+ title: 'Nepavyko paleisti',
+ },
+ loadingTitle: 'Ruošiama jūsų mokymosi erdvė',
+ },
+ common: {
+ actions: {
+ back: 'Atgal',
+ cancel: 'Atšaukti',
+ checkAgain: 'Patikrinti dar kartą',
+ close: 'Uždaryti',
+ create: 'Sukurti',
+ delete: 'Ištrinti',
+ dismissError: 'Uždaryti klaidą',
+ dismissStatus: 'Uždaryti būseną',
+ edit: 'Redaguoti',
+ itemActions: '{{title}} veiksmai',
+ reset: 'Atstatyti',
+ review: 'Kartoti',
+ save: 'Įrašyti',
+ saveChanges: 'Įrašyti pakeitimus',
+ tryAgain: 'Bandyti dar kartą',
+ },
+ labels: {
+ active: 'Aktyvu',
+ clear: 'Clear',
+ custom: 'Pasirinktinis',
+ default: 'Numatytasis',
+ loadingEditor: 'Įkeliamas redaktorius',
+ name: 'Pavadinimas',
+ completedTask: 'Atlikta užduotis',
+ description: 'Aprašas',
+ incompleteTask: 'Nebaigta užduotis',
+ percentageInput: '{{label}} procentais',
+ visual: 'Vizualas',
+ },
+ status: {
+ actionFailed: 'Veiksmas nepavyko',
+ actionInProgress: 'Veiksmas vykdomas',
+ },
+ sort: {
+ ascending: 'Didėj.',
+ column: 'Stulpelis',
+ descending: 'Mažėj.',
+ direction: 'Kryptis',
+ sort: 'Rikiuoti',
+ },
+ search: {
+ label: 'Paieška',
+ },
+ visualPicker: {
+ allLucideIcons: 'Visos Lucide piktogramos',
+ browseIconsFor: 'Naršykite arba ieškokite piktogramų: {{label}}.',
+ chooseIcon: 'Pasirinkti piktogramą',
+ iconPicker: '{{label}} piktogramos parinkiklis',
+ iconSearch: '{{label}} piktogramų paieška',
+ iconsCouldNotLoad: 'Piktogramų nepavyko įkelti.',
+ loadingIcons: 'Įkeliamos piktogramos',
+ loadingMoreIcons: 'Įkeliama daugiau piktogramų',
+ moreIcons: 'Daugiau piktogramų',
+ noIconsMatch: 'Nėra piktogramų, atitinkančių "{{query}}".',
+ searchIconsPlaceholder: 'Ieškoti piktogramų…',
+ selectedIcon: 'Pasirinkta {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Sukurti',
+ newDeck: 'Nauja kaladė',
+ newFolder: 'Naujas aplankas',
+ },
+ descriptions: {
+ defaultWorkspace: 'Laikykite kalades, aplankus ir pastabas kartu.',
+ emptyWorkspace: 'Sukurkite kaladę, tada pridėkite pastabų, kad sudarytumėte kartojimo eilę.',
+ emptyFolder: 'Sukurkite kaladę, tada pridėkite pastabų, kad sudarytumėte kartojimo eilę.',
+ searchPlaceholder: 'Ieškoti aplankų, kaladžių ir pastabų…',
+ },
+ empty: {
+ createFirstDeck: 'Sukurkite pirmąją kaladę',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Kaladės nepavyko ištrinti',
+ couldNotDeleteFolder: 'Aplanko nepavyko ištrinti',
+ couldNotDeleteWorkspace: 'Darbo srities nepavyko ištrinti',
+ dashboardCouldNotOpen: 'Skydelio nepavyko atidaryti',
+ decksCouldNotLoad: 'Kaladžių nepavyko įkelti',
+ decksMayBeOutOfDate: 'Kaladės gali būti pasenusios',
+ foldersCouldNotLoad: 'Aplankų nepavyko įkelti',
+ foldersMayBeOutOfDate: 'Aplankai gali būti pasenę',
+ workspaceCouldNotLoad: 'Darbo srities nepavyko įkelti',
+ },
+ labels: {
+ dashboard: 'Skydelis',
+ loadingDashboard: 'Įkeliamas skydelis',
+ newItem: 'Naujas elementas',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Data nepasiekiama',
+ },
+ age: {
+ dayAgo_one: 'prieš {{count}} dieną',
+ dayAgo_few: 'prieš {{count}} dienas',
+ dayAgo_many: 'prieš {{count}} dienos',
+ dayAgo_other: 'prieš {{count}} dienų',
+ hourAgo_one: 'prieš {{count}} valandą',
+ hourAgo_few: 'prieš {{count}} valandas',
+ hourAgo_many: 'prieš {{count}} valandos',
+ hourAgo_other: 'prieš {{count}} valandų',
+ justNow: 'ką tik',
+ minuteAgo_one: 'prieš {{count}} minutę',
+ minuteAgo_few: 'prieš {{count}} minutes',
+ minuteAgo_many: 'prieš {{count}} minutės',
+ minuteAgo_other: 'prieš {{count}} minučių',
+ unavailable: 'data nepasiekiama',
+ weekAgo_one: 'prieš {{count}} savaitę',
+ weekAgo_few: 'prieš {{count}} savaites',
+ weekAgo_many: 'prieš {{count}} savaitės',
+ weekAgo_other: 'prieš {{count}} savaičių',
+ },
+ labels: {
+ deleted: 'Ištrinta {{value}}',
+ due: 'Terminas: {{value}}',
+ reviewed: 'Kartota: {{value}}',
+ updated: 'Atnaujinta {{value}}',
+ updatedUppercase: 'ATNAUJINTA {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'prieš {{count}} dieną',
+ dayAgo_few: 'prieš {{count}} dienas',
+ dayAgo_many: 'prieš {{count}} dienos',
+ dayAgo_other: 'prieš {{count}} dienų',
+ inAMoment: 'Netrukus',
+ inDay_one: 'Po {{count}} dienos',
+ inDay_few: 'Po {{count}} dienų',
+ inDay_many: 'Po {{count}} dienos',
+ inDay_other: 'Po {{count}} dienų',
+ inMonth_one: 'Po {{count}} mėnesio',
+ inMonth_few: 'Po {{count}} mėnesių',
+ inMonth_many: 'Po {{count}} mėnesio',
+ inMonth_other: 'Po {{count}} mėnesių',
+ inWeek_one: 'Po {{count}} savaitės',
+ inWeek_few: 'Po {{count}} savaičių',
+ inWeek_many: 'Po {{count}} savaitės',
+ inWeek_other: 'Po {{count}} savaičių',
+ justNow: 'Ką tik',
+ monthAgo_one: 'prieš {{count}} mėnesį',
+ monthAgo_few: 'prieš {{count}} mėnesius',
+ monthAgo_many: 'prieš {{count}} mėnesio',
+ monthAgo_other: 'prieš {{count}} mėnesių',
+ secondsAgoShort: 'prieš {{count}} sek.',
+ minutesAgoShort: 'prieš {{count}} min.',
+ hoursAgoShort: 'prieš {{count}} val.',
+ today: 'Šiandien',
+ tomorrow: 'Rytoj',
+ weekAgo_one: 'prieš {{count}} savaitę',
+ weekAgo_few: 'prieš {{count}} savaites',
+ weekAgo_many: 'prieš {{count}} savaitės',
+ weekAgo_other: 'prieš {{count}} savaičių',
+ yesterday: 'Vakar',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: '{{title}} veiksmai',
+ createDeck: 'Sukurti kaladę',
+ createNote: 'Sukurti pastabą',
+ deleteDeck: 'Ištrinti kaladę',
+ editDeck: 'Redaguoti kaladę',
+ newNote: 'Nauja pastaba',
+ openDeck: 'Atidaryti kaladę {{title}}',
+ saveDeck: 'Kaladės nepavyko įrašyti',
+ studyNow: 'Mokytis dabar',
+ },
+ descriptions: {
+ emptyDeck: 'Pridėkite pastabą, kad ši kaladė turėtų medžiagos kartojimui.',
+ editorDefault: 'Sutelktam mokymuisi skirta kaladė.',
+ editorVisual: 'Pasirinkite šios kaladės viršelio simbolį.',
+ notesSearchPlaceholder: 'Ieškoti pastabų…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Tai perkels "{{title}}" į Šiukšlinę. Galėsite atkurti vėliau.',
+ deleteDeckFallbackDescription: 'Tai perkels šią kaladę į Šiukšlinę. Galėsite atkurti vėliau.',
+ deleteDeckFallbackTitle: 'Ištrinti kaladę?',
+ deleteDeckTitle: 'Ištrinti "{{title}}"?',
+ deleteNoteDescription: 'Tai perkels "{{title}}" į Šiukšlinę. Galėsite atkurti vėliau.',
+ deleteNoteFallbackTitle: 'Ištrinti pastabą?',
+ deleteNoteTitle: 'Ištrinti "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Nėra atitinkančių pastabų',
+ noMatchingNotesDescription: 'Jokia pastaba neatitiko "{{query}}".',
+ thisDeckIsEmpty: 'Ši kaladė tuščia',
+ },
+ errors: {
+ couldNotCreateDeck: 'Kaladės nepavyko sukurti',
+ couldNotDeleteDeck: 'Kaladės nepavyko ištrinti',
+ couldNotDeleteNote: 'Pastabos nepavyko ištrinti',
+ couldNotLoadFolderPath: 'Aplanko kelio nepavyko įkelti',
+ couldNotSaveDeck: 'Kaladės nepavyko įrašyti',
+ deckCouldNotLoad: 'Kaladės nepavyko įkelti',
+ notesCouldNotLoad: 'Pastabų nepavyko įkelti',
+ notesMayBeOutOfDate: 'Pastabos gali būti pasenusios',
+ },
+ fields: {
+ descriptionLabel: 'Kaladės aprašas',
+ descriptionPlaceholder: 'Ką ši kaladė padės jums kartoti?',
+ namePlaceholder: 'Kaladės pavadinimas',
+ untitledDeck: 'Kaladė be pavadinimo',
+ untitledDeckLower: 'kaladė be pavadinimo',
+ },
+ labels: {
+ createDeckTitle: 'Sukurti kaladę',
+ deck: 'Kaladė',
+ deckNotesSearch: 'Kaladės pastabų paieška',
+ deckOverview: 'Kaladės apžvalga',
+ decks: 'Kaladės',
+ due: 'Terminas',
+ dueToday: 'Terminas šiandien',
+ loadingDeck: 'Įkeliama kaladė',
+ mastery: 'Įsisavinimas',
+ notes: 'Pastabos',
+ },
+ sort: {
+ ariaLabel: 'Rikiuoti kalades',
+ dueToday: 'Terminas šiandien',
+ title: 'Pavadinimas',
+ updated: 'Atnaujinta',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Duomenys pasikeitė. Atnaujinkite ir bandykite dar kartą.',
+ forbidden: 'Neturite leidimo tai atlikti.',
+ notFound: 'Nepavyko rasti šio elemento.',
+ offline: 'Nepavyksta pasiekti paslaugos.',
+ timeout: 'Tai užtruko per ilgai. Bandykite dar kartą.',
+ unauthorized: 'Prisijunkite, kad tęstumėte.',
+ unavailable: 'Paslauga laikinai nepasiekiama.',
+ },
+ fallback: {
+ unexpected: 'Netikėta klaida',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Sukurti aplanką',
+ deleteFolder: 'Ištrinti aplanką',
+ editFolder: 'Redaguoti aplanką',
+ },
+ descriptions: {
+ editorDefault: 'Aplankas susijusioms kaladėms.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Tai perkels "{{name}}" į Šiukšlinę. Galėsite atkurti vėliau.',
+ deleteFolderFallbackDescription: 'Tai perkels šį aplanką į Šiukšlinę. Galėsite atkurti vėliau.',
+ deleteFolderFallbackTitle: 'Ištrinti aplanką?',
+ deleteFolderTitle: 'Ištrinti "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Šiame aplanke nėra atitikmenų',
+ noMatchesInFolderDescription: 'Joks aplankas, kaladė ar pastaba neatitiko "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Aplanko nepavyko sukurti',
+ couldNotDeleteFolder: 'Aplanko nepavyko ištrinti',
+ couldNotLoadFolderPath: 'Aplanko kelio nepavyko įkelti',
+ couldNotSaveFolder: 'Aplanko nepavyko įrašyti',
+ folderCouldNotLoad: 'Aplanko nepavyko įkelti',
+ },
+ fields: {
+ descriptionLabel: 'Aplanko aprašas',
+ descriptionPlaceholder: 'Kas priklauso šiam aplankui?',
+ namePlaceholder: 'Aplanko pavadinimas',
+ untitledFolder: 'Aplankas be pavadinimo',
+ },
+ labels: {
+ createFolderTitle: 'Sukurti aplanką',
+ folder: 'Aplankas',
+ folders: 'Aplankai',
+ loadingFolder: 'Įkeliamas aplankas',
+ name: 'Pavadinimas',
+ updated: 'Atnaujinta',
+ },
+ sort: {
+ ariaLabel: 'Rikiuoti aplankus',
+ name: 'Pavadinimas',
+ updated: 'Atnaujinta',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Jei vietiniai ir sinchronizuoti duomenys kada nors nesutaps, elementas bus rodomas čia.',
+ heading: 'Sinchronizavimo būsena',
+ title: 'Konfliktai',
+ noConflicts: 'Konfliktų nerasta',
+ },
+ labels: {
+ menu: 'Meniu',
+ },
+ sections: {
+ settings: {
+ description: 'Pritaikykite aplinką ir nuostatas',
+ title: 'Nustatymai',
+ },
+ trash: {
+ description: 'Atkurkite arba visam laikui ištrinkite pašalintus elementus',
+ title: 'Šiukšlinė',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Uždaryti redaktorių',
+ openActions: 'Atidaryti veiksmus',
+ openWorkspaces: 'Atidaryti darbo sritis',
+ },
+ items: {
+ home: 'Pradžia',
+ menu: 'Meniu',
+ primary: 'Pagrindinis',
+ settings: 'Nustatymai',
+ spaces: 'Sritys',
+ trash: 'Šiukšlinė',
+ workspaces: 'Darbo sritys',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Pridėti cloze',
+ deleteNote: 'Ištrinti pastabą',
+ editNote: 'Redaguoti pastabą',
+ hideDerivedCardsNote: 'Slėpti pastabą apie išvestines korteles',
+ openNote: 'Atidaryti {{title}}',
+ saveNote: 'Įrašyti pastabą',
+ showDerivedCardsNote: 'Rodyti pastabą apie išvestines korteles',
+ },
+ descriptions: {
+ clozeFormat: 'Kiekviena paslėpta dalis įrašius tampa kartojimo kortele.',
+ clozeFormatPrefix: 'Apgaubkite paslėptą tekstą',
+ derivedCardsHelper: 'Pastabos yra pagrindinis išvestinių kortelių šaltinis.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Tai perkels "{{title}}" į Šiukšlinę. Galėsite atkurti vėliau.',
+ deleteNoteFallbackDescription: 'Tai perkels šią pastabą į Šiukšlinę. Galėsite atkurti vėliau.',
+ deleteNoteFallbackTitle: 'Ištrinti pastabą?',
+ deleteNoteTitle: 'Ištrinti "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Pastabos nepavyko sukurti',
+ couldNotDeleteNote: 'Pastabos nepavyko ištrinti',
+ couldNotSaveNote: 'Pastabos nepavyko įrašyti',
+ noteCouldNotLoad: 'Pastabos nepavyko įkelti',
+ },
+ fields: {
+ back: 'Kita pusė',
+ backPlaceholder: 'Įveskite kitą pusę',
+ bodyPlaceholder: 'Rašykite pastabos turinį su cloze ištrynimais…',
+ front: 'Priekinė pusė',
+ frontPlaceholder: 'Įveskite priekinę pusę',
+ noteBody: 'Pastabos turinys',
+ title: 'Pavadinimas',
+ titlePlaceholder: 'Pridėkite pastabos pavadinimą',
+ untitledCloze: 'Cloze be pavadinimo',
+ untitledNote: 'Pastaba be pavadinimo',
+ },
+ labels: {
+ backUppercase: 'KITA PUSĖ',
+ basic: 'Paprasta',
+ basicLower: 'paprasta',
+ basicUppercase: 'PAPRASTA',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze formatas',
+ clozeUppercase: 'CLOZE',
+ deck: 'Kaladė',
+ derivedCards: 'IŠVESTINĖS KORTELĖS',
+ due: 'Terminas',
+ frontUppercase: 'PRIEKINĖ PUSĖ',
+ inProgress: 'Vykdoma',
+ inProgressUppercase: 'VYKDOMA',
+ loadingNote: 'Įkeliama pastaba',
+ loadingNoteEditor: 'Įkeliamas pastabų redaktorius',
+ markdownFormatting: 'Markdown formatavimas',
+ mastered: 'Įsisavinta',
+ masteredUppercase: 'ĮSISAVINTA',
+ newNote: 'Nauja pastaba',
+ noteBody: 'PASTABOS TURINYS',
+ noteContent: 'Pastabos turinys',
+ noteDetails: 'Pastabos informacija',
+ noteMetadata: 'Pastabos metaduomenys',
+ noteType: 'Pastabos tipas',
+ notes: 'Pastabos',
+ reviewed: 'Kartota',
+ studyProgress: 'Mokymosi pažanga',
+ studyProgressUppercase: 'MOKYMOSI PAŽANGA',
+ titleUppercase: 'PAVADINIMAS',
+ updated: 'Atnaujinta',
+ },
+ sort: {
+ ariaLabel: 'Rikiuoti pastabas',
+ title: 'Pavadinimas',
+ updated: 'Atnaujinta',
+ },
+ toolbar: {
+ bold: 'Paryškintas',
+ italic: 'Kursyvas',
+ link: 'Nuoroda',
+ list: 'Sąrašas',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Vėl',
+ backToDeck: 'Grįžti į kaladę',
+ continueReview: 'Tęsti kartojimą',
+ easy: 'Lengva',
+ good: 'Gerai',
+ hard: 'Sunku',
+ newNote: 'Nauja pastaba',
+ showAnswer: 'Rodyti atsakymą',
+ },
+ errors: {
+ couldNotGradeCard: 'Kortelės nepavyko įvertinti',
+ reviewCouldNotLoad: 'Kartojimo nepavyko įkelti',
+ reviewCouldNotStart: 'Kartojimo nepavyko pradėti',
+ summaryCouldNotLoad: 'Kartojimo suvestinės nepavyko įkelti',
+ summaryNotAvailable: 'Kartojimo suvestinė nepasiekiama',
+ summaryNotComplete: 'Šis kartojimas dar nebaigtas.',
+ },
+ labels: {
+ cardsReviewed: 'Kartotos kortelės',
+ deck: 'Kaladė',
+ duration: 'Trukmė',
+ loadingReview: 'Įkeliamas kartojimas',
+ loadingSummary: 'Įkeliama suvestinė',
+ progress: 'Kartojimo pažanga',
+ review: 'Kartojimas',
+ reviewComplete: 'Kartojimas baigtas',
+ reviewed_one: 'Kartota {{count}}',
+ reviewed_few: 'Kartotos {{count}}',
+ reviewed_many: 'Kartota {{count}}',
+ reviewed_other: 'Kartota {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} val. {{minutes}} min.',
+ durationMinutes: '{{minutes}} min.',
+ durationSeconds: '{{seconds}} sek.',
+ saved: 'Jūsų pažanga įrašyta į šią kaladę.',
+ },
+ unavailable: {
+ description: 'Pridėkite pastabą, kad ši kaladė galėtų patekti į kartojimo eilę.',
+ title: 'Nėra kortelių kartojimui',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Išvalyti paiešką',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Šioje darbo srityje nėra atitikmenų',
+ noMatchesInWorkspaceDescription: 'Joks aplankas, kaladė ar pastaba neatitiko "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Paieškos nepavyko užbaigti',
+ },
+ labels: {
+ results: 'Paieškos rezultatai',
+ resultsFor: '"{{query}}" rezultatai',
+ searchingContent: 'Ieškoma turinyje',
+ },
+ resultGroups: {
+ deck: 'Kaladės',
+ folder: 'Aplankai',
+ note: 'Pastabos',
+ },
+ resultKinds: {
+ deck: 'kaladė',
+ folder: 'aplankas',
+ note: 'pastaba',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Atstatyti visus nustatymus',
+ resetSettings: 'Atstatyti nustatymus',
+ resetToDefaults: 'Atstatyti numatytuosius',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Įklijuokite tinkamą JSON su 21 skaitine reikšme.',
+ fsrsErrorInvalidParams_one: 'Įveskite JSON masyvą su tiksliai {{count}} baigtiniu skaičiumi.',
+ fsrsErrorInvalidParams_few: 'Įveskite JSON masyvą su tiksliai {{count}} baigtiniais skaičiais.',
+ fsrsErrorInvalidParams_many: 'Įveskite JSON masyvą su tiksliai {{count}} baigtinio skaičiaus.',
+ fsrsErrorInvalidParams_other: 'Įveskite JSON masyvą su tiksliai {{count}} baigtinių skaičių.',
+ fsrsHelper: 'Tai ekspertinis perrašymas. Reikšmės turi likti tokia pačia tvarka.',
+ fsrsJsonLabel: 'FSRS parametrų JSON',
+ fsrsTitle: 'Redaguoti FSRS parametrus',
+ fsrsDescription: 'Įklijuokite JSON masyvą su 21 skaičiumi, kad perrašytumėte planuoklio svorius.',
+ resetDescription: 'Tai atstatys laiko juostą, mokymosi limitus ir FSRS nustatymus.',
+ resetDescriptionWithLanguage: 'Tai atstatys kalbą, laiko juostą, mokymosi limitus ir FSRS nustatymus.',
+ resetTitle: 'Atstatyti visus nustatymus?',
+ timezoneDescription: 'Ieškokite miesto arba laiko juostos identifikatoriaus.',
+ timezoneSearchLabel: 'Ieškoti laiko juostų',
+ timezoneSearchPlaceholder: 'Ieškoti laiko juostų…',
+ timezoneTitle: 'Pasirinkti laiko juostą',
+ },
+ errors: {
+ couldNotResetSettings: 'Nustatymų nepavyko atstatyti',
+ couldNotSaveSettings: 'Nustatymų nepavyko įrašyti',
+ settingsCouldNotLoad: 'Nustatymų nepavyko įkelti',
+ settingsUnavailable: 'Nustatymai nepasiekiami.',
+ },
+ labels: {
+ appearance: 'Išvaizda',
+ automatic: 'Automatiškai',
+ fsrsParameters: 'FSRS parametrai',
+ general: 'Bendra',
+ language: 'Kalba',
+ loadingSettings: 'Įkeliami nustatymai',
+ masteryHorizon: 'Įsisavinimo horizontas',
+ newCardOrder: 'Naujų kortelių tvarka',
+ newCardsPerDay: 'Naujos kortelės per dieną',
+ reviewCardsPerDay: 'Kartojimo kortelės per dieną',
+ savingSettings: 'Įrašomi nustatymai',
+ schedule: 'Tvarkaraštis',
+ searchNoTimezones: 'Nėra atitinkančių laiko juostų.',
+ settings: 'Nustatymai',
+ settingsReset: 'Nustatymai atstatyti',
+ study: 'Mokymasis',
+ targetRecallProbability: 'Tikslinė prisiminimo tikimybė',
+ theme: 'Tema',
+ timezone: 'Laiko juosta',
+ },
+ options: {
+ languageEnUs: 'Anglų (JAV)',
+ newCardsAfterReviews: 'Po kartojimų',
+ newCardsBeforeReviews: 'Prieš kartojimus',
+ newCardsMixed: 'Mišriai',
+ themeDark: 'Tamsi',
+ themeLight: 'Šviesi',
+ themeSystem: 'Sistema',
+ timezoneSystem: 'Naudoti sistemos laiko juostą',
+ },
+ rows: {
+ fsrsDescription: 'Ekspertinio modelio svoriai',
+ languageDescription: 'Sąsajos kalba',
+ masteryHorizonDescription: 'Dienų skaičius, kurį kortelė turi išlikti prisimenama tiksline tikimybe arba didesne, kad būtų laikoma įsisavinta',
+ newCardOrderDescription: 'Naujų kortelių tvarka kartojimų atžvilgiu',
+ newCardsPerDayDescription: 'Didžiausias naujų kortelių skaičius per dieną',
+ reviewCardsPerDayDescription: 'Didžiausias kartojimo kortelių skaičius per dieną',
+ targetRecallProbabilityDescription: 'Mažiausia prisiminimo tikimybė per kitą suplanuotą kartojimą',
+ timezoneDescription: 'Naudokite automatinę laiko juostą arba pasirinkite miestą.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Ištrinti visam laikui',
+ empty: 'Ištuštinti',
+ emptyTrash: 'Ištuštinti šiukšlinę',
+ restore: 'Atkurti',
+ restoringItem: 'Atkuriama {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Tai visam laikui ištrins "{{title}}". To negalima atšaukti.',
+ deleteItemFallbackDescription: 'Tai visam laikui ištrins šį elementą. To negalima atšaukti.',
+ deleteItemFallbackTitle: 'Ištrinti elementą?',
+ deleteItemTitle: 'Ištrinti "{{title}}"?',
+ emptyTrashDescription: 'Tai visam laikui ištrins viską Šiukšlinėje. To negalima atšaukti.',
+ emptyTrashTitle: 'Ištuštinti šiukšlinę?',
+ },
+ empty: {
+ description: 'Elementai, kuriuos ištrinsite, čia bus rodomi prieš pašalinant visam laikui.',
+ title: 'Šiukšlinė tuščia',
+ },
+ errors: {
+ couldNotDeleteItem: 'Elemento nepavyko ištrinti',
+ couldNotEmptyTrash: 'Šiukšlinės nepavyko ištuštinti',
+ couldNotRestoreItem: 'Elemento nepavyko atkurti',
+ trashCouldNotLoad: 'Šiukšlinės nepavyko įkelti',
+ trashMayBeOutOfDate: 'Šiukšlinė gali būti pasenusi',
+ },
+ labels: {
+ deletedAge: 'Ištrinta {{value}}',
+ itemCount_one: '{{count}} elementas',
+ itemCount_few: '{{count}} elementai',
+ itemCount_many: '{{count}} elemento',
+ itemCount_other: '{{count}} elementų',
+ lastEmptied: 'Paskutinį kartą ištuštinta {{value}}',
+ loadingTrash: 'Įkeliama Šiukšlinė',
+ originalLocation: 'Pradinė vieta: {{location}}',
+ title: 'Šiukšlinė',
+ trashActions: '{{title}} šiukšlinės veiksmai',
+ },
+ kinds: {
+ deck: 'Kaladė',
+ folder: 'Aplankas',
+ note: 'Pastaba',
+ workspace: 'Darbo sritis',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Sukurti darbo sritį',
+ deleteWorkspace: 'Ištrinti darbo sritį',
+ editWorkspace: 'Redaguoti darbo sritį',
+ newWorkspace: 'Nauja darbo sritis',
+ openWorkspace: 'Atidaryti {{title}}',
+ openingWorkspace: 'Atidaroma {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Mokymosi kontekstas.',
+ editorVisual: 'Pasirinkite šios darbo srities vizualinį orientyrą.',
+ emptyList: 'Atskirkite kalades, pastabas ir kartojimo eiles pagal mokymosi kontekstą.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Tai perkels "{{title}}" į Šiukšlinę. Galėsite atkurti vėliau.',
+ deleteWorkspaceFallbackDescription: 'Tai perkels šią darbo sritį į Šiukšlinę. Galėsite atkurti vėliau.',
+ deleteWorkspaceFallbackTitle: 'Ištrinti darbo sritį?',
+ deleteWorkspaceTitle: 'Ištrinti "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Pradėkite nuo darbo srities',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Darbo srities nepavyko sukurti',
+ couldNotDeleteWorkspace: 'Darbo srities nepavyko ištrinti',
+ couldNotOpenWorkspace: 'Darbo srities nepavyko atidaryti',
+ couldNotSaveWorkspace: 'Darbo srities nepavyko įrašyti',
+ workspaceCouldNotLoad: 'Darbo srities nepavyko įkelti',
+ workspacesCouldNotLoad: 'Darbo sričių nepavyko įkelti',
+ },
+ fields: {
+ descriptionLabel: 'Darbo srities aprašas',
+ descriptionPlaceholder: 'Kas priklauso šiai darbo sričiai?',
+ namePlaceholder: 'Darbo srities pavadinimas',
+ untitledWorkspace: 'Darbo sritis be pavadinimo',
+ },
+ labels: {
+ createWorkspaceTitle: 'Sukurti darbo sritį',
+ loadingWorkspaces: 'Įkeliamos darbo sritys',
+ workspace: 'Darbo sritis',
+ workspaces: 'Darbo sritys',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/lv.ts b/ui/src/core/i18n/resources/lv.ts
new file mode 100644
index 0000000..17bddfa
--- /dev/null
+++ b/ui/src/core/i18n/resources/lv.ts
@@ -0,0 +1,636 @@
+export const lv = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Mēģiniet vēlreiz. Ja tas turpinās, vēlreiz atveriet Clear.',
+ title: 'Neizdevās startēt',
+ },
+ loadingTitle: 'Sagatavo jūsu mācību vietu',
+ },
+ common: {
+ actions: {
+ back: 'Atpakaļ',
+ cancel: 'Atcelt',
+ checkAgain: 'Pārbaudīt vēlreiz',
+ close: 'Aizvērt',
+ create: 'Izveidot',
+ delete: 'Dzēst',
+ dismissError: 'Aizvērt kļūdu',
+ dismissStatus: 'Aizvērt statusu',
+ edit: 'Rediģēt',
+ itemActions: '{{title}} darbības',
+ reset: 'Atiestatīt',
+ review: 'Atkārtot',
+ save: 'Saglabāt',
+ saveChanges: 'Saglabāt izmaiņas',
+ tryAgain: 'Mēģināt vēlreiz',
+ },
+ labels: {
+ active: 'Aktīvs',
+ clear: 'Clear',
+ custom: 'Pielāgots',
+ default: 'Noklusējums',
+ loadingEditor: 'Ielādē redaktoru',
+ name: 'Nosaukums',
+ completedTask: 'Pabeigts uzdevums',
+ description: 'Apraksts',
+ incompleteTask: 'Nepabeigts uzdevums',
+ percentageInput: '{{label}} procentos',
+ visual: 'Vizuāls',
+ },
+ status: {
+ actionFailed: 'Darbība neizdevās',
+ actionInProgress: 'Darbība notiek',
+ },
+ sort: {
+ ascending: 'Augošā',
+ column: 'Kolonna',
+ descending: 'Dilstošā',
+ direction: 'Virziens',
+ sort: 'Kārtot',
+ },
+ search: {
+ label: 'Meklēšana',
+ },
+ visualPicker: {
+ allLucideIcons: 'Visas Lucide ikonas',
+ browseIconsFor: 'Pārlūkojiet vai meklējiet ikonas: {{label}}.',
+ chooseIcon: 'Izvēlēties ikonu',
+ iconPicker: '{{label}} ikonas izvēle',
+ iconSearch: '{{label}} ikonu meklēšana',
+ iconsCouldNotLoad: 'Ikonas neizdevās ielādēt.',
+ loadingIcons: 'Ielādē ikonas',
+ loadingMoreIcons: 'Ielādē papildu ikonas',
+ moreIcons: 'Vairāk ikonu',
+ noIconsMatch: 'Neviena ikona neatbilst "{{query}}".',
+ searchIconsPlaceholder: 'Meklēt ikonas…',
+ selectedIcon: 'Izvēlēts {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Izveidot',
+ newDeck: 'Jauna kava',
+ newFolder: 'Jauna mape',
+ },
+ descriptions: {
+ defaultWorkspace: 'Glabājiet kavas, mapes un piezīmes kopā.',
+ emptyWorkspace: 'Izveidojiet kavu un pēc tam pievienojiet piezīmes, lai izveidotu atkārtošanas rindu.',
+ emptyFolder: 'Izveidojiet kavu un pēc tam pievienojiet piezīmes, lai izveidotu atkārtošanas rindu.',
+ searchPlaceholder: 'Meklēt mapes, kavas un piezīmes…',
+ },
+ empty: {
+ createFirstDeck: 'Izveidojiet savu pirmo kavu',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Neizdevās dzēst kavu',
+ couldNotDeleteFolder: 'Neizdevās dzēst mapi',
+ couldNotDeleteWorkspace: 'Neizdevās dzēst darbvietu',
+ dashboardCouldNotOpen: 'Neizdevās atvērt informācijas paneli',
+ decksCouldNotLoad: 'Neizdevās ielādēt kavas',
+ decksMayBeOutOfDate: 'Kavas var būt novecojušas',
+ foldersCouldNotLoad: 'Neizdevās ielādēt mapes',
+ foldersMayBeOutOfDate: 'Mapes var būt novecojušas',
+ workspaceCouldNotLoad: 'Neizdevās ielādēt darbvietu',
+ },
+ labels: {
+ dashboard: 'Informācijas panelis',
+ loadingDashboard: 'Ielādē informācijas paneli',
+ newItem: 'Jauns vienums',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Datums nav pieejams',
+ },
+ age: {
+ dayAgo_zero: 'pirms {{count}} dienām',
+ dayAgo_one: 'pirms {{count}} dienas',
+ dayAgo_other: 'pirms {{count}} dienām',
+ hourAgo_zero: 'pirms {{count}} stundām',
+ hourAgo_one: 'pirms {{count}} stundas',
+ hourAgo_other: 'pirms {{count}} stundām',
+ justNow: 'tikko',
+ minuteAgo_zero: 'pirms {{count}} minūtēm',
+ minuteAgo_one: 'pirms {{count}} minūtes',
+ minuteAgo_other: 'pirms {{count}} minūtēm',
+ unavailable: 'datums nav pieejams',
+ weekAgo_zero: 'pirms {{count}} nedēļām',
+ weekAgo_one: 'pirms {{count}} nedēļas',
+ weekAgo_other: 'pirms {{count}} nedēļām',
+ },
+ labels: {
+ deleted: 'Dzēsts {{value}}',
+ due: 'Termiņš: {{value}}',
+ reviewed: 'Atkārtots: {{value}}',
+ updated: 'Atjaunināts {{value}}',
+ updatedUppercase: 'ATJAUNINĀTS {{value}}',
+ },
+ relative: {
+ dayAgo_zero: 'pirms {{count}} dienām',
+ dayAgo_one: 'pirms {{count}} dienas',
+ dayAgo_other: 'pirms {{count}} dienām',
+ inAMoment: 'Pēc brīža',
+ inDay_zero: 'Pēc {{count}} dienām',
+ inDay_one: 'Pēc {{count}} dienas',
+ inDay_other: 'Pēc {{count}} dienām',
+ inMonth_zero: 'Pēc {{count}} mēnešiem',
+ inMonth_one: 'Pēc {{count}} mēneša',
+ inMonth_other: 'Pēc {{count}} mēnešiem',
+ inWeek_zero: 'Pēc {{count}} nedēļām',
+ inWeek_one: 'Pēc {{count}} nedēļas',
+ inWeek_other: 'Pēc {{count}} nedēļām',
+ justNow: 'Tikko',
+ monthAgo_zero: 'pirms {{count}} mēnešiem',
+ monthAgo_one: 'pirms {{count}} mēneša',
+ monthAgo_other: 'pirms {{count}} mēnešiem',
+ secondsAgoShort: 'pirms {{count}} s',
+ minutesAgoShort: 'pirms {{count}} min',
+ hoursAgoShort: 'pirms {{count}} st',
+ today: 'Šodien',
+ tomorrow: 'Rīt',
+ weekAgo_zero: 'pirms {{count}} nedēļām',
+ weekAgo_one: 'pirms {{count}} nedēļas',
+ weekAgo_other: 'pirms {{count}} nedēļām',
+ yesterday: 'Vakar',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: '{{title}} darbības',
+ createDeck: 'Izveidot kavu',
+ createNote: 'Izveidot piezīmi',
+ deleteDeck: 'Dzēst kavu',
+ editDeck: 'Rediģēt kavu',
+ newNote: 'Jauna piezīme',
+ openDeck: 'Atvērt kavu {{title}}',
+ saveDeck: 'Neizdevās saglabāt kavu',
+ studyNow: 'Mācīties tagad',
+ },
+ descriptions: {
+ emptyDeck: 'Pievienojiet piezīmi, lai šai kavai būtu materiāls atkārtošanai.',
+ editorDefault: 'Mērķēta mācību kava.',
+ editorVisual: 'Izvēlieties vāka simbolu šai kavai.',
+ notesSearchPlaceholder: 'Meklēt piezīmes…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Tas pārvieto "{{title}}" uz Atkritni. Vēlāk to varēsiet atjaunot.',
+ deleteDeckFallbackDescription: 'Tas pārvieto šo kavu uz Atkritni. Vēlāk to varēsiet atjaunot.',
+ deleteDeckFallbackTitle: 'Dzēst kavu?',
+ deleteDeckTitle: 'Dzēst "{{title}}"?',
+ deleteNoteDescription: 'Tas pārvieto "{{title}}" uz Atkritni. Vēlāk to varēsiet atjaunot.',
+ deleteNoteFallbackTitle: 'Dzēst piezīmi?',
+ deleteNoteTitle: 'Dzēst "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Nav atbilstošu piezīmju',
+ noMatchingNotesDescription: 'Neviena piezīme neatbilda "{{query}}".',
+ thisDeckIsEmpty: 'Šī kava ir tukša',
+ },
+ errors: {
+ couldNotCreateDeck: 'Neizdevās izveidot kavu',
+ couldNotDeleteDeck: 'Neizdevās dzēst kavu',
+ couldNotDeleteNote: 'Neizdevās dzēst piezīmi',
+ couldNotLoadFolderPath: 'Neizdevās ielādēt mapes ceļu',
+ couldNotSaveDeck: 'Neizdevās saglabāt kavu',
+ deckCouldNotLoad: 'Neizdevās ielādēt kavu',
+ notesCouldNotLoad: 'Neizdevās ielādēt piezīmes',
+ notesMayBeOutOfDate: 'Piezīmes var būt novecojušas',
+ },
+ fields: {
+ descriptionLabel: 'Kavas apraksts',
+ descriptionPlaceholder: 'Ko šī kava palīdzēs atkārtot?',
+ namePlaceholder: 'Kavas nosaukums',
+ untitledDeck: 'Kava bez nosaukuma',
+ untitledDeckLower: 'kava bez nosaukuma',
+ },
+ labels: {
+ createDeckTitle: 'Izveidot kavu',
+ deck: 'Kava',
+ deckNotesSearch: 'Kavas piezīmju meklēšana',
+ deckOverview: 'Kavas pārskats',
+ decks: 'Kavas',
+ due: 'Termiņš',
+ dueToday: 'Termiņš šodien',
+ loadingDeck: 'Ielādē kavu',
+ mastery: 'Apgūšana',
+ notes: 'Piezīmes',
+ },
+ sort: {
+ ariaLabel: 'Kārtot kavas',
+ dueToday: 'Termiņš šodien',
+ title: 'Nosaukums',
+ updated: 'Atjaunināts',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Dati ir mainījušies. Atsvaidziniet un mēģiniet vēlreiz.',
+ forbidden: 'Jums nav atļaujas to darīt.',
+ notFound: 'Neizdevās atrast šo vienumu.',
+ offline: 'Nevar sasniegt pakalpojumu.',
+ timeout: 'Tas aizņēma pārāk ilgu laiku. Mēģiniet vēlreiz.',
+ unauthorized: 'Pierakstieties, lai turpinātu.',
+ unavailable: 'Pakalpojums īslaicīgi nav pieejams.',
+ },
+ fallback: {
+ unexpected: 'Negaidīta kļūda',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Izveidot mapi',
+ deleteFolder: 'Dzēst mapi',
+ editFolder: 'Rediģēt mapi',
+ },
+ descriptions: {
+ editorDefault: 'Mape saistītām kavām.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Tas pārvieto "{{name}}" uz Atkritni. Vēlāk to varēsiet atjaunot.',
+ deleteFolderFallbackDescription: 'Tas pārvieto šo mapi uz Atkritni. Vēlāk to varēsiet atjaunot.',
+ deleteFolderFallbackTitle: 'Dzēst mapi?',
+ deleteFolderTitle: 'Dzēst "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Šajā mapē nav atbilstību',
+ noMatchesInFolderDescription: 'Neviena mape, kava vai piezīme neatbilda "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Neizdevās izveidot mapi',
+ couldNotDeleteFolder: 'Neizdevās dzēst mapi',
+ couldNotLoadFolderPath: 'Neizdevās ielādēt mapes ceļu',
+ couldNotSaveFolder: 'Neizdevās saglabāt mapi',
+ folderCouldNotLoad: 'Neizdevās ielādēt mapi',
+ },
+ fields: {
+ descriptionLabel: 'Mapes apraksts',
+ descriptionPlaceholder: 'Kas pieder šai mapei?',
+ namePlaceholder: 'Mapes nosaukums',
+ untitledFolder: 'Mape bez nosaukuma',
+ },
+ labels: {
+ createFolderTitle: 'Izveidot mapi',
+ folder: 'Mape',
+ folders: 'Mapes',
+ loadingFolder: 'Ielādē mapi',
+ name: 'Nosaukums',
+ updated: 'Atjaunināts',
+ },
+ sort: {
+ ariaLabel: 'Kārtot mapes',
+ name: 'Nosaukums',
+ updated: 'Atjaunināts',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Ja vietējie un sinhronizētie dati kādreiz nesakritīs, vienums parādīsies šeit.',
+ heading: 'Sinhronizācijas statuss',
+ title: 'Konflikti',
+ noConflicts: 'Konflikti nav atrasti',
+ },
+ labels: {
+ menu: 'Izvēlne',
+ },
+ sections: {
+ settings: {
+ description: 'Pielāgojiet vidi un preferences',
+ title: 'Iestatījumi',
+ },
+ trash: {
+ description: 'Atjaunojiet vai neatgriezeniski dzēsiet noņemtos vienumus',
+ title: 'Atkritne',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Aizvērt redaktoru',
+ openActions: 'Atvērt darbības',
+ openWorkspaces: 'Atvērt darbvietas',
+ },
+ items: {
+ home: 'Sākums',
+ menu: 'Izvēlne',
+ primary: 'Galvenais',
+ settings: 'Iestatījumi',
+ spaces: 'Vietas',
+ trash: 'Atkritne',
+ workspaces: 'Darbvietas',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Pievienot cloze',
+ deleteNote: 'Dzēst piezīmi',
+ editNote: 'Rediģēt piezīmi',
+ hideDerivedCardsNote: 'Paslēpt piezīmi par atvasinātajām kartītēm',
+ openNote: 'Atvērt {{title}}',
+ saveNote: 'Saglabāt piezīmi',
+ showDerivedCardsNote: 'Rādīt piezīmi par atvasinātajām kartītēm',
+ },
+ descriptions: {
+ clozeFormat: 'Katra paslēptā daļa pēc saglabāšanas kļūst par atkārtošanas kartīti.',
+ clozeFormatPrefix: 'Ievietojiet paslēpto tekstu starp',
+ derivedCardsHelper: 'Piezīmes ir patiesības avots atvasinātajām kartītēm.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Tas pārvieto "{{title}}" uz Atkritni. Vēlāk to varēsiet atjaunot.',
+ deleteNoteFallbackDescription: 'Tas pārvieto šo piezīmi uz Atkritni. Vēlāk to varēsiet atjaunot.',
+ deleteNoteFallbackTitle: 'Dzēst piezīmi?',
+ deleteNoteTitle: 'Dzēst "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Neizdevās izveidot piezīmi',
+ couldNotDeleteNote: 'Neizdevās dzēst piezīmi',
+ couldNotSaveNote: 'Neizdevās saglabāt piezīmi',
+ noteCouldNotLoad: 'Neizdevās ielādēt piezīmi',
+ },
+ fields: {
+ back: 'Aizmugure',
+ backPlaceholder: 'Ievadiet aizmuguri',
+ bodyPlaceholder: 'Rakstiet piezīmes saturu ar cloze dzēsumiem…',
+ front: 'Priekšpuse',
+ frontPlaceholder: 'Ievadiet priekšpusi',
+ noteBody: 'Piezīmes saturs',
+ title: 'Nosaukums',
+ titlePlaceholder: 'Pievienojiet piezīmes nosaukumu',
+ untitledCloze: 'Cloze bez nosaukuma',
+ untitledNote: 'Piezīme bez nosaukuma',
+ },
+ labels: {
+ backUppercase: 'AIZMUGURE',
+ basic: 'Pamata',
+ basicLower: 'pamata',
+ basicUppercase: 'PAMATA',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze formāts',
+ clozeUppercase: 'CLOZE',
+ deck: 'Kava',
+ derivedCards: 'ATVASINĀTĀS KARTĪTES',
+ due: 'Termiņš',
+ frontUppercase: 'PRIEKŠPUSE',
+ inProgress: 'Notiek',
+ inProgressUppercase: 'NOTIEK',
+ loadingNote: 'Ielādē piezīmi',
+ loadingNoteEditor: 'Ielādē piezīmju redaktoru',
+ markdownFormatting: 'Markdown formatēšana',
+ mastered: 'Apgūts',
+ masteredUppercase: 'APGŪTS',
+ newNote: 'Jauna piezīme',
+ noteBody: 'PIEZĪMES SATURS',
+ noteContent: 'Piezīmes saturs',
+ noteDetails: 'Piezīmes informācija',
+ noteMetadata: 'Piezīmes metadati',
+ noteType: 'Piezīmes tips',
+ notes: 'Piezīmes',
+ reviewed: 'Atkārtots',
+ studyProgress: 'Mācību progress',
+ studyProgressUppercase: 'MĀCĪBU PROGRESS',
+ titleUppercase: 'NOSAUKUMS',
+ updated: 'Atjaunināts',
+ },
+ sort: {
+ ariaLabel: 'Kārtot piezīmes',
+ title: 'Nosaukums',
+ updated: 'Atjaunināts',
+ },
+ toolbar: {
+ bold: 'Treknraksts',
+ italic: 'Slīpraksts',
+ link: 'Saite',
+ list: 'Saraksts',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Vēlreiz',
+ backToDeck: 'Atpakaļ uz kavu',
+ continueReview: 'Turpināt atkārtošanu',
+ easy: 'Viegli',
+ good: 'Labi',
+ hard: 'Grūti',
+ newNote: 'Jauna piezīme',
+ showAnswer: 'Rādīt atbildi',
+ },
+ errors: {
+ couldNotGradeCard: 'Neizdevās novērtēt kartīti',
+ reviewCouldNotLoad: 'Neizdevās ielādēt atkārtošanu',
+ reviewCouldNotStart: 'Neizdevās sākt atkārtošanu',
+ summaryCouldNotLoad: 'Neizdevās ielādēt atkārtošanas kopsavilkumu',
+ summaryNotAvailable: 'Atkārtošanas kopsavilkums nav pieejams',
+ summaryNotComplete: 'Šī atkārtošana vēl nav pabeigta.',
+ },
+ labels: {
+ cardsReviewed: 'Atkārtotas kartītes',
+ deck: 'Kava',
+ duration: 'Ilgums',
+ loadingReview: 'Ielādē atkārtošanu',
+ loadingSummary: 'Ielādē kopsavilkumu',
+ progress: 'Atkārtošanas progress',
+ review: 'Atkārtošana',
+ reviewComplete: 'Atkārtošana pabeigta',
+ reviewed_zero: 'Atkārtots {{count}}',
+ reviewed_one: 'Atkārtota {{count}}',
+ reviewed_other: 'Atkārtotas {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} st {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Jūsu progress tika saglabāts šajā kavā.',
+ },
+ unavailable: {
+ description: 'Pievienojiet piezīmi, lai šī kava varētu nonākt atkārtošanas rindā.',
+ title: 'Nav kartīšu atkārtošanai',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Notīrīt meklēšanu',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Šajā darbvietā nav atbilstību',
+ noMatchesInWorkspaceDescription: 'Neviena mape, kava vai piezīme neatbilda "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Neizdevās pabeigt meklēšanu',
+ },
+ labels: {
+ results: 'Meklēšanas rezultāti',
+ resultsFor: 'Rezultāti vaicājumam "{{query}}"',
+ searchingContent: 'Meklē saturā',
+ },
+ resultGroups: {
+ deck: 'Kavas',
+ folder: 'Mapes',
+ note: 'Piezīmes',
+ },
+ resultKinds: {
+ deck: 'kava',
+ folder: 'mape',
+ note: 'piezīme',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Atiestatīt visus iestatījumus',
+ resetSettings: 'Atiestatīt iestatījumus',
+ resetToDefaults: 'Atiestatīt uz noklusējumu',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Ielīmējiet derīgu JSON ar 21 skaitlisku vērtību.',
+ fsrsErrorInvalidParams_zero: 'Ievadiet JSON masīvu tieši ar {{count}} galīgiem skaitļiem.',
+ fsrsErrorInvalidParams_one: 'Ievadiet JSON masīvu tieši ar {{count}} galīgu skaitli.',
+ fsrsErrorInvalidParams_other: 'Ievadiet JSON masīvu tieši ar {{count}} galīgiem skaitļiem.',
+ fsrsHelper: 'Šī ir eksperta pārrakstīšana. Vērtībām jāpaliek secībā.',
+ fsrsJsonLabel: 'FSRS parametru JSON',
+ fsrsTitle: 'Rediģēt FSRS parametrus',
+ fsrsDescription: 'Ielīmējiet JSON masīvu ar 21 skaitli, lai pārrakstītu plānotāja svarus.',
+ resetDescription: 'Tas atjauno laika joslu, mācību limitus un FSRS iestatījumus.',
+ resetDescriptionWithLanguage: 'Tas atjauno valodu, laika joslu, mācību limitus un FSRS iestatījumus.',
+ resetTitle: 'Atiestatīt visus iestatījumus?',
+ timezoneDescription: 'Meklējiet pilsētu vai laika joslas identifikatoru.',
+ timezoneSearchLabel: 'Meklēt laika joslas',
+ timezoneSearchPlaceholder: 'Meklēt laika joslas…',
+ timezoneTitle: 'Izvēlieties laika joslu',
+ },
+ errors: {
+ couldNotResetSettings: 'Neizdevās atiestatīt iestatījumus',
+ couldNotSaveSettings: 'Neizdevās saglabāt iestatījumus',
+ settingsCouldNotLoad: 'Neizdevās ielādēt iestatījumus',
+ settingsUnavailable: 'Iestatījumi nav pieejami.',
+ },
+ labels: {
+ appearance: 'Izskats',
+ automatic: 'Automātiski',
+ fsrsParameters: 'FSRS parametri',
+ general: 'Vispārīgi',
+ language: 'Valoda',
+ loadingSettings: 'Ielādē iestatījumus',
+ masteryHorizon: 'Apgūšanas horizonts',
+ newCardOrder: 'Jauno kartīšu secība',
+ newCardsPerDay: 'Jaunas kartītes dienā',
+ reviewCardsPerDay: 'Atkārtošanas kartītes dienā',
+ savingSettings: 'Saglabā iestatījumus',
+ schedule: 'Grafiks',
+ searchNoTimezones: 'Nav atbilstošu laika joslu.',
+ settings: 'Iestatījumi',
+ settingsReset: 'Iestatījumi atiestatīti',
+ study: 'Mācības',
+ targetRecallProbability: 'Mērķa atcerēšanās varbūtība',
+ theme: 'Motīvs',
+ timezone: 'Laika josla',
+ },
+ options: {
+ languageEnUs: 'Angļu (ASV)',
+ newCardsAfterReviews: 'Pēc atkārtošanām',
+ newCardsBeforeReviews: 'Pirms atkārtošanām',
+ newCardsMixed: 'Jaukti',
+ themeDark: 'Tumšs',
+ themeLight: 'Gaišs',
+ themeSystem: 'Sistēma',
+ timezoneSystem: 'Izmantot sistēmas laika joslu',
+ },
+ rows: {
+ fsrsDescription: 'Eksperta modeļa svari',
+ languageDescription: 'Saskarnes valoda',
+ masteryHorizonDescription: 'Dienu skaits, cik ilgi kartītei jāpaliek atceramai pie mērķa varbūtības vai virs tās, lai tā skaitītos apgūta',
+ newCardOrderDescription: 'Jauno kartīšu secība attiecībā pret atkārtošanām',
+ newCardsPerDayDescription: 'Maksimālais jauno kartīšu skaits dienā',
+ reviewCardsPerDayDescription: 'Maksimālais atkārtošanas kartīšu skaits dienā',
+ targetRecallProbabilityDescription: 'Minimālā atcerēšanās varbūtība nākamajā ieplānotajā atkārtošanā',
+ timezoneDescription: 'Izmantojiet automātisku laika joslu vai izvēlieties pilsētu.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Dzēst neatgriezeniski',
+ empty: 'Iztukšot',
+ emptyTrash: 'Iztukšot atkritni',
+ restore: 'Atjaunot',
+ restoringItem: 'Atjauno {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Tas neatgriezeniski dzēsīs "{{title}}". To nevar atsaukt.',
+ deleteItemFallbackDescription: 'Tas neatgriezeniski dzēsīs šo vienumu. To nevar atsaukt.',
+ deleteItemFallbackTitle: 'Dzēst vienumu?',
+ deleteItemTitle: 'Dzēst "{{title}}"?',
+ emptyTrashDescription: 'Tas neatgriezeniski dzēsīs visu Atkritnē. To nevar atsaukt.',
+ emptyTrashTitle: 'Iztukšot atkritni?',
+ },
+ empty: {
+ description: 'Dzēstie vienumi parādīsies šeit pirms neatgriezeniskas noņemšanas.',
+ title: 'Atkritne ir tukša',
+ },
+ errors: {
+ couldNotDeleteItem: 'Neizdevās dzēst vienumu',
+ couldNotEmptyTrash: 'Neizdevās iztukšot atkritni',
+ couldNotRestoreItem: 'Neizdevās atjaunot vienumu',
+ trashCouldNotLoad: 'Neizdevās ielādēt atkritni',
+ trashMayBeOutOfDate: 'Atkritne var būt novecojusi',
+ },
+ labels: {
+ deletedAge: 'Dzēsts {{value}}',
+ itemCount_zero: '{{count}} vienumu',
+ itemCount_one: '{{count}} vienums',
+ itemCount_other: '{{count}} vienumi',
+ lastEmptied: 'Pēdējoreiz iztukšots {{value}}',
+ loadingTrash: 'Ielādē Atkritni',
+ originalLocation: 'Sākotnējā atrašanās vieta: {{location}}',
+ title: 'Atkritne',
+ trashActions: '{{title}} atkritnes darbības',
+ },
+ kinds: {
+ deck: 'Kava',
+ folder: 'Mape',
+ note: 'Piezīme',
+ workspace: 'Darbvieta',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Izveidot darbvietu',
+ deleteWorkspace: 'Dzēst darbvietu',
+ editWorkspace: 'Rediģēt darbvietu',
+ newWorkspace: 'Jauna darbvieta',
+ openWorkspace: 'Atvērt {{title}}',
+ openingWorkspace: 'Atver {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Mācību konteksts.',
+ editorVisual: 'Izvēlieties vizuālo enkuru šai darbvietai.',
+ emptyList: 'Atdaliet kavas, piezīmes un atkārtošanas rindas pēc mācību konteksta.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Tas pārvieto "{{title}}" uz Atkritni. Vēlāk to varēsiet atjaunot.',
+ deleteWorkspaceFallbackDescription: 'Tas pārvieto šo darbvietu uz Atkritni. Vēlāk to varēsiet atjaunot.',
+ deleteWorkspaceFallbackTitle: 'Dzēst darbvietu?',
+ deleteWorkspaceTitle: 'Dzēst "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Sāciet ar darbvietu',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Neizdevās izveidot darbvietu',
+ couldNotDeleteWorkspace: 'Neizdevās dzēst darbvietu',
+ couldNotOpenWorkspace: 'Neizdevās atvērt darbvietu',
+ couldNotSaveWorkspace: 'Neizdevās saglabāt darbvietu',
+ workspaceCouldNotLoad: 'Neizdevās ielādēt darbvietu',
+ workspacesCouldNotLoad: 'Neizdevās ielādēt darbvietas',
+ },
+ fields: {
+ descriptionLabel: 'Darbvietas apraksts',
+ descriptionPlaceholder: 'Kas pieder šai darbvietai?',
+ namePlaceholder: 'Darbvietas nosaukums',
+ untitledWorkspace: 'Darbvieta bez nosaukuma',
+ },
+ labels: {
+ createWorkspaceTitle: 'Izveidot darbvietu',
+ loadingWorkspaces: 'Ielādē darbvietas',
+ workspace: 'Darbvieta',
+ workspaces: 'Darbvietas',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/nb.ts b/ui/src/core/i18n/resources/nb.ts
new file mode 100644
index 0000000..a4d7d01
--- /dev/null
+++ b/ui/src/core/i18n/resources/nb.ts
@@ -0,0 +1,623 @@
+export const nb = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Prøv igjen. Hvis dette fortsetter, åpner du Clear på nytt.',
+ title: 'Kunne ikke starte',
+ },
+ loadingTitle: 'Forbereder studieområdet ditt',
+ },
+ common: {
+ actions: {
+ back: 'Tilbake',
+ cancel: 'Avbryt',
+ checkAgain: 'Sjekk igjen',
+ close: 'Lukk',
+ create: 'Opprett',
+ delete: 'Slett',
+ dismissError: 'Lukk feil',
+ dismissStatus: 'Lukk status',
+ edit: 'Rediger',
+ itemActions: 'Handlinger for {{title}}',
+ reset: 'Tilbakestill',
+ review: 'Repetisjon',
+ save: 'Lagre',
+ saveChanges: 'Lagre endringer',
+ tryAgain: 'Prøv igjen',
+ },
+ labels: {
+ active: 'Aktiv',
+ clear: 'Clear',
+ custom: 'Tilpasset',
+ default: 'Standard',
+ loadingEditor: 'Laster redigerer',
+ name: 'Navn',
+ completedTask: 'Fullført oppgave',
+ description: 'Beskrivelse',
+ incompleteTask: 'Ufullført oppgave',
+ percentageInput: '{{label}} i prosent',
+ visual: 'Visuell',
+ },
+ status: {
+ actionFailed: 'Handlingen mislyktes',
+ actionInProgress: 'Handling pågår',
+ },
+ sort: {
+ ascending: 'Stig.',
+ column: 'Kolonne',
+ descending: 'Synk.',
+ direction: 'Retning',
+ sort: 'Sorter',
+ },
+ search: {
+ label: 'Søk',
+ },
+ visualPicker: {
+ allLucideIcons: 'Alle Lucide-ikoner',
+ browseIconsFor: 'Bla gjennom eller søk etter ikoner for {{label}}.',
+ chooseIcon: 'Velg ikon',
+ iconPicker: 'Ikonvelger for {{label}}',
+ iconSearch: 'Ikonsøk for {{label}}',
+ iconsCouldNotLoad: 'Ikonene kunne ikke lastes inn.',
+ loadingIcons: 'Laster ikoner',
+ loadingMoreIcons: 'Laster flere ikoner',
+ moreIcons: 'Flere ikoner',
+ noIconsMatch: 'Ingen ikoner samsvarer med "{{query}}".',
+ searchIconsPlaceholder: 'Søk etter ikoner…',
+ selectedIcon: 'Valgt {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Opprett',
+ newDeck: 'Ny kortstokk',
+ newFolder: 'Ny mappe',
+ },
+ descriptions: {
+ defaultWorkspace: 'Hold kortstokker, mapper og notater samlet.',
+ emptyWorkspace: 'Opprett en kortstokk, og legg deretter til notater for å bygge repetisjonskøen din.',
+ emptyFolder: 'Opprett en kortstokk, og legg deretter til notater for å bygge en repetisjonskø.',
+ searchPlaceholder: 'Søk i mapper, kortstokker og notater…',
+ },
+ empty: {
+ createFirstDeck: 'Opprett din første kortstokk',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Kortstokken kunne ikke slettes',
+ couldNotDeleteFolder: 'Mappen kunne ikke slettes',
+ couldNotDeleteWorkspace: 'Arbeidsområdet kunne ikke slettes',
+ dashboardCouldNotOpen: 'Dashbordet kunne ikke åpnes',
+ decksCouldNotLoad: 'Kortstokker kunne ikke lastes inn',
+ decksMayBeOutOfDate: 'Kortstokker kan være utdaterte',
+ foldersCouldNotLoad: 'Mapper kunne ikke lastes inn',
+ foldersMayBeOutOfDate: 'Mapper kan være utdaterte',
+ workspaceCouldNotLoad: 'Arbeidsområdet kunne ikke lastes inn',
+ },
+ labels: {
+ dashboard: 'Dashbord',
+ loadingDashboard: 'Laster dashbord',
+ newItem: 'Nytt element',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Dato utilgjengelig',
+ },
+ age: {
+ dayAgo_one: '{{count}} dag siden',
+ dayAgo_other: '{{count}} dager siden',
+ hourAgo_one: '{{count}} time siden',
+ hourAgo_other: '{{count}} timer siden',
+ justNow: 'akkurat nå',
+ minuteAgo_one: '{{count}} minutt siden',
+ minuteAgo_other: '{{count}} minutter siden',
+ unavailable: 'dato utilgjengelig',
+ weekAgo_one: '{{count}} uke siden',
+ weekAgo_other: '{{count}} uker siden',
+ },
+ labels: {
+ deleted: 'Slettet {{value}}',
+ due: 'Frist: {{value}}',
+ reviewed: 'Repetert: {{value}}',
+ updated: 'Oppdatert {{value}}',
+ updatedUppercase: 'OPPDATERT {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} dag siden',
+ dayAgo_other: '{{count}} dager siden',
+ inAMoment: 'Om et øyeblikk',
+ inDay_one: 'Om {{count}} dag',
+ inDay_other: 'Om {{count}} dager',
+ inMonth_one: 'Om {{count}} måned',
+ inMonth_other: 'Om {{count}} måneder',
+ inWeek_one: 'Om {{count}} uke',
+ inWeek_other: 'Om {{count}} uker',
+ justNow: 'Akkurat nå',
+ monthAgo_one: '{{count}} måned siden',
+ monthAgo_other: '{{count}} måneder siden',
+ secondsAgoShort: '{{count}} s siden',
+ minutesAgoShort: '{{count}} min siden',
+ hoursAgoShort: '{{count}} t siden',
+ today: 'I dag',
+ tomorrow: 'I morgen',
+ weekAgo_one: '{{count}} uke siden',
+ weekAgo_other: '{{count}} uker siden',
+ yesterday: 'I går',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Handlinger for {{title}}',
+ createDeck: 'Opprett kortstokk',
+ createNote: 'Opprett notat',
+ deleteDeck: 'Slett kortstokk',
+ editDeck: 'Rediger kortstokk',
+ newNote: 'Nytt notat',
+ openDeck: 'Åpne kortstokken {{title}}',
+ saveDeck: 'Kortstokken kunne ikke lagres',
+ studyNow: 'Studer nå',
+ },
+ descriptions: {
+ emptyDeck: 'Legg til et notat, så denne kortstokken har materiale å repetere.',
+ editorDefault: 'Fokusert studiekortstokk.',
+ editorVisual: 'Velg et omslagssymbol for denne kortstokken.',
+ notesSearchPlaceholder: 'Søk i notater…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Dette flytter "{{title}}" til Papirkurv. Du kan gjenopprette den senere.',
+ deleteDeckFallbackDescription: 'Dette flytter denne kortstokken til Papirkurv. Du kan gjenopprette den senere.',
+ deleteDeckFallbackTitle: 'Slette kortstokk?',
+ deleteDeckTitle: 'Slette "{{title}}"?',
+ deleteNoteDescription: 'Dette flytter "{{title}}" til Papirkurv. Du kan gjenopprette det senere.',
+ deleteNoteFallbackTitle: 'Slette notat?',
+ deleteNoteTitle: 'Slette "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Ingen samsvarende notater',
+ noMatchingNotesDescription: 'Ingen notater samsvarte med "{{query}}".',
+ thisDeckIsEmpty: 'Denne kortstokken er tom',
+ },
+ errors: {
+ couldNotCreateDeck: 'Kortstokken kunne ikke opprettes',
+ couldNotDeleteDeck: 'Kortstokken kunne ikke slettes',
+ couldNotDeleteNote: 'Notatet kunne ikke slettes',
+ couldNotLoadFolderPath: 'Mappestien kunne ikke lastes inn',
+ couldNotSaveDeck: 'Kortstokken kunne ikke lagres',
+ deckCouldNotLoad: 'Kortstokken kunne ikke lastes inn',
+ notesCouldNotLoad: 'Notater kunne ikke lastes inn',
+ notesMayBeOutOfDate: 'Notater kan være utdaterte',
+ },
+ fields: {
+ descriptionLabel: 'Kortstokkbeskrivelse',
+ descriptionPlaceholder: 'Hva skal denne kortstokken hjelpe deg med å repetere?',
+ namePlaceholder: 'Navn på kortstokk',
+ untitledDeck: 'Kortstokk uten tittel',
+ untitledDeckLower: 'kortstokk uten tittel',
+ },
+ labels: {
+ createDeckTitle: 'Opprett kortstokk',
+ deck: 'Kortstokk',
+ deckNotesSearch: 'Søk i kortstokknotater',
+ deckOverview: 'Kortstokkoversikt',
+ decks: 'Kortstokker',
+ due: 'Frist',
+ dueToday: 'Frist i dag',
+ loadingDeck: 'Laster kortstokk',
+ mastery: 'Mestring',
+ notes: 'Notater',
+ },
+ sort: {
+ ariaLabel: 'Sorter kortstokker',
+ dueToday: 'Frist i dag',
+ title: 'Tittel',
+ updated: 'Oppdatert',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Dataene ble endret. Oppdater og prøv igjen.',
+ forbidden: 'Du har ikke tillatelse til å gjøre dette.',
+ notFound: 'Vi fant ikke dette elementet.',
+ offline: 'Kan ikke nå tjenesten.',
+ timeout: 'Dette tok for lang tid. Prøv igjen.',
+ unauthorized: 'Logg inn for å fortsette.',
+ unavailable: 'Tjenesten er midlertidig utilgjengelig.',
+ },
+ fallback: {
+ unexpected: 'Uventet feil',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Opprett mappe',
+ deleteFolder: 'Slett mappe',
+ editFolder: 'Rediger mappe',
+ },
+ descriptions: {
+ editorDefault: 'Mappe for relaterte kortstokker.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Dette flytter "{{name}}" til Papirkurv. Du kan gjenopprette den senere.',
+ deleteFolderFallbackDescription: 'Dette flytter denne mappen til Papirkurv. Du kan gjenopprette den senere.',
+ deleteFolderFallbackTitle: 'Slette mappe?',
+ deleteFolderTitle: 'Slette "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Ingen treff i denne mappen',
+ noMatchesInFolderDescription: 'Ingen mapper, kortstokker eller notater samsvarte med "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Mappen kunne ikke opprettes',
+ couldNotDeleteFolder: 'Mappen kunne ikke slettes',
+ couldNotLoadFolderPath: 'Mappestien kunne ikke lastes inn',
+ couldNotSaveFolder: 'Mappen kunne ikke lagres',
+ folderCouldNotLoad: 'Mappen kunne ikke lastes inn',
+ },
+ fields: {
+ descriptionLabel: 'Mappebeskrivelse',
+ descriptionPlaceholder: 'Hva hører hjemme i denne mappen?',
+ namePlaceholder: 'Mappenavn',
+ untitledFolder: 'Mappe uten tittel',
+ },
+ labels: {
+ createFolderTitle: 'Opprett mappe',
+ folder: 'Mappe',
+ folders: 'Mapper',
+ loadingFolder: 'Laster mappe',
+ name: 'Navn',
+ updated: 'Oppdatert',
+ },
+ sort: {
+ ariaLabel: 'Sorter mapper',
+ name: 'Navn',
+ updated: 'Oppdatert',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Hvis lokale og synkroniserte data noen gang er uenige, vises elementet her.',
+ heading: 'Synkroniseringsstatus',
+ title: 'Konflikter',
+ noConflicts: 'Ingen konflikter funnet',
+ },
+ labels: {
+ menu: 'Meny',
+ },
+ sections: {
+ settings: {
+ description: 'Tilpass miljøet og innstillingene dine',
+ title: 'Innstillinger',
+ },
+ trash: {
+ description: 'Gjenopprett eller slett fjernede elementer permanent',
+ title: 'Papirkurv',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Lukk redigerer',
+ openActions: 'Åpne handlinger',
+ openWorkspaces: 'Åpne arbeidsområder',
+ },
+ items: {
+ home: 'Hjem',
+ menu: 'Meny',
+ primary: 'Primær',
+ settings: 'Innstillinger',
+ spaces: 'Områder',
+ trash: 'Papirkurv',
+ workspaces: 'Arbeidsområder',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Legg til cloze',
+ deleteNote: 'Slett notat',
+ editNote: 'Rediger notat',
+ hideDerivedCardsNote: 'Skjul notat om avledede kort',
+ openNote: 'Åpne {{title}}',
+ saveNote: 'Lagre notat',
+ showDerivedCardsNote: 'Vis notat om avledede kort',
+ },
+ descriptions: {
+ clozeFormat: 'Hver skjulte del blir et repetisjonskort når du lagrer.',
+ clozeFormatPrefix: 'Pakk skjult tekst inn med',
+ derivedCardsHelper: 'Notater er sannhetskilden for avledede kort.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Dette flytter "{{title}}" til Papirkurv. Du kan gjenopprette det senere.',
+ deleteNoteFallbackDescription: 'Dette flytter dette notatet til Papirkurv. Du kan gjenopprette det senere.',
+ deleteNoteFallbackTitle: 'Slette notat?',
+ deleteNoteTitle: 'Slette "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Notatet kunne ikke opprettes',
+ couldNotDeleteNote: 'Notatet kunne ikke slettes',
+ couldNotSaveNote: 'Notatet kunne ikke lagres',
+ noteCouldNotLoad: 'Notatet kunne ikke lastes inn',
+ },
+ fields: {
+ back: 'Bakside',
+ backPlaceholder: 'Skriv inn bakside',
+ bodyPlaceholder: 'Skriv notatinnholdet med cloze-slettinger…',
+ front: 'Forside',
+ frontPlaceholder: 'Skriv inn forside',
+ noteBody: 'Notatinnhold',
+ title: 'Tittel',
+ titlePlaceholder: 'Legg til en notattittel',
+ untitledCloze: 'Cloze uten tittel',
+ untitledNote: 'Notat uten tittel',
+ },
+ labels: {
+ backUppercase: 'BAKSIDE',
+ basic: 'Grunnleggende',
+ basicLower: 'grunnleggende',
+ basicUppercase: 'GRUNNLEGGENDE',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze-format',
+ clozeUppercase: 'CLOZE',
+ deck: 'Kortstokk',
+ derivedCards: 'AVLEDEDE KORT',
+ due: 'Frist',
+ frontUppercase: 'FORSIDE',
+ inProgress: 'Pågår',
+ inProgressUppercase: 'PÅGÅR',
+ loadingNote: 'Laster notat',
+ loadingNoteEditor: 'Laster notatredigerer',
+ markdownFormatting: 'Markdown-formatering',
+ mastered: 'Mestret',
+ masteredUppercase: 'MESTRET',
+ newNote: 'Nytt notat',
+ noteBody: 'NOTATINNHOLD',
+ noteContent: 'Notatinnhold',
+ noteDetails: 'Notatdetaljer',
+ noteMetadata: 'Notatmetadata',
+ noteType: 'Notattype',
+ notes: 'Notater',
+ reviewed: 'Repetert',
+ studyProgress: 'Studiefremgang',
+ studyProgressUppercase: 'STUDIEFREMGANG',
+ titleUppercase: 'TITTEL',
+ updated: 'Oppdatert',
+ },
+ sort: {
+ ariaLabel: 'Sorter notater',
+ title: 'Tittel',
+ updated: 'Oppdatert',
+ },
+ toolbar: {
+ bold: 'Fet',
+ italic: 'Kursiv',
+ link: 'Lenke',
+ list: 'Liste',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Igjen',
+ backToDeck: 'Tilbake til kortstokk',
+ continueReview: 'Fortsett repetisjon',
+ easy: 'Lett',
+ good: 'Bra',
+ hard: 'Vanskelig',
+ newNote: 'Nytt notat',
+ showAnswer: 'Vis svar',
+ },
+ errors: {
+ couldNotGradeCard: 'Kortet kunne ikke vurderes',
+ reviewCouldNotLoad: 'Repetisjonen kunne ikke lastes inn',
+ reviewCouldNotStart: 'Repetisjonen kunne ikke startes',
+ summaryCouldNotLoad: 'Repetisjonssammendraget kunne ikke lastes inn',
+ summaryNotAvailable: 'Repetisjonssammendraget er ikke tilgjengelig',
+ summaryNotComplete: 'Denne repetisjonen er ikke fullført ennå.',
+ },
+ labels: {
+ cardsReviewed: 'Kort repetert',
+ deck: 'Kortstokk',
+ duration: 'Varighet',
+ loadingReview: 'Laster repetisjon',
+ loadingSummary: 'Laster sammendrag',
+ progress: 'Repetisjonsfremgang',
+ review: 'Repetisjon',
+ reviewComplete: 'Repetisjon fullført',
+ reviewed_one: 'Repetert {{count}}',
+ reviewed_other: 'Repetert {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} t {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Fremgangen din ble lagret i denne kortstokken.',
+ },
+ unavailable: {
+ description: 'Legg til et notat, så denne kortstokken kan gå inn i repetisjonskøen.',
+ title: 'Ingen kort å repetere',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Tøm søk',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Ingen treff i dette arbeidsområdet',
+ noMatchesInWorkspaceDescription: 'Ingen mapper, kortstokker eller notater samsvarte med "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Søket kunne ikke fullføres',
+ },
+ labels: {
+ results: 'Søkeresultater',
+ resultsFor: 'Resultater for "{{query}}"',
+ searchingContent: 'Søker i innhold',
+ },
+ resultGroups: {
+ deck: 'Kortstokker',
+ folder: 'Mapper',
+ note: 'Notater',
+ },
+ resultKinds: {
+ deck: 'kortstokk',
+ folder: 'mappe',
+ note: 'notat',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Tilbakestill alle innstillinger',
+ resetSettings: 'Tilbakestill innstillinger',
+ resetToDefaults: 'Tilbakestill til standard',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Lim inn gyldig JSON med 21 numeriske verdier.',
+ fsrsErrorInvalidParams_one: 'Skriv inn en JSON-matrise med nøyaktig {{count}} endelig tall.',
+ fsrsErrorInvalidParams_other: 'Skriv inn en JSON-matrise med nøyaktig {{count}} endelige tall.',
+ fsrsHelper: 'Dette er en ekspert-overstyring. Verdiene må beholde rekkefølgen.',
+ fsrsJsonLabel: 'FSRS-parametere JSON',
+ fsrsTitle: 'Rediger FSRS-parametere',
+ fsrsDescription: 'Lim inn en JSON-matrise med 21 tall for å overstyre planleggervektene.',
+ resetDescription: 'Dette tilbakestiller tidssone, studiegrenser og FSRS-innstillinger.',
+ resetDescriptionWithLanguage: 'Dette tilbakestiller språk, tidssone, studiegrenser og FSRS-innstillinger.',
+ resetTitle: 'Tilbakestille alle innstillinger?',
+ timezoneDescription: 'Søk etter en by eller tidssoneidentifikator.',
+ timezoneSearchLabel: 'Søk tidssoner',
+ timezoneSearchPlaceholder: 'Søk tidssoner…',
+ timezoneTitle: 'Velg tidssone',
+ },
+ errors: {
+ couldNotResetSettings: 'Innstillingene kunne ikke tilbakestilles',
+ couldNotSaveSettings: 'Innstillingene kunne ikke lagres',
+ settingsCouldNotLoad: 'Innstillingene kunne ikke lastes inn',
+ settingsUnavailable: 'Innstillinger er utilgjengelige.',
+ },
+ labels: {
+ appearance: 'Utseende',
+ automatic: 'Automatisk',
+ fsrsParameters: 'FSRS-parametere',
+ general: 'Generelt',
+ language: 'Språk',
+ loadingSettings: 'Laster innstillinger',
+ masteryHorizon: 'Mestringshorisont',
+ newCardOrder: 'Rekkefølge for nye kort',
+ newCardsPerDay: 'Nye kort per dag',
+ reviewCardsPerDay: 'Repetisjonskort per dag',
+ savingSettings: 'Lagrer innstillinger',
+ schedule: 'Plan',
+ searchNoTimezones: 'Ingen samsvarende tidssoner.',
+ settings: 'Innstillinger',
+ settingsReset: 'Innstillinger tilbakestilt',
+ study: 'Studie',
+ targetRecallProbability: 'Mål for sannsynlighet for gjenkalling',
+ theme: 'Tema',
+ timezone: 'Tidssone',
+ },
+ options: {
+ languageEnUs: 'Engelsk (USA)',
+ newCardsAfterReviews: 'Etter repetisjoner',
+ newCardsBeforeReviews: 'Før repetisjoner',
+ newCardsMixed: 'Blandet',
+ themeDark: 'Mørk',
+ themeLight: 'Lys',
+ themeSystem: 'System',
+ timezoneSystem: 'Bruk systemets tidssone',
+ },
+ rows: {
+ fsrsDescription: 'Ekspertmodellvekter',
+ languageDescription: 'Grensesnittspråk',
+ masteryHorizonDescription: 'Antall dager et kort må forbli gjenkallbart ved eller over målsannsynligheten for å telle som mestret',
+ newCardOrderDescription: 'Rekkefølge for nye kort i forhold til repetisjoner',
+ newCardsPerDayDescription: 'Maksimalt antall nye kort per dag',
+ reviewCardsPerDayDescription: 'Maksimalt antall repetisjonskort per dag',
+ targetRecallProbabilityDescription: 'Minimum sannsynlighet for gjenkalling ved neste planlagte repetisjon',
+ timezoneDescription: 'Bruk automatisk tidssone eller velg en by.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Slett permanent',
+ empty: 'Tøm',
+ emptyTrash: 'Tøm papirkurv',
+ restore: 'Gjenopprett',
+ restoringItem: 'Gjenoppretter {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Dette sletter "{{title}}" permanent. Dette kan ikke angres.',
+ deleteItemFallbackDescription: 'Dette sletter dette elementet permanent. Dette kan ikke angres.',
+ deleteItemFallbackTitle: 'Slette element?',
+ deleteItemTitle: 'Slette "{{title}}"?',
+ emptyTrashDescription: 'Dette sletter alt i Papirkurv permanent. Dette kan ikke angres.',
+ emptyTrashTitle: 'Tømme papirkurv?',
+ },
+ empty: {
+ description: 'Elementer du sletter, vises her før permanent fjerning.',
+ title: 'Papirkurven er tom',
+ },
+ errors: {
+ couldNotDeleteItem: 'Elementet kunne ikke slettes',
+ couldNotEmptyTrash: 'Papirkurven kunne ikke tømmes',
+ couldNotRestoreItem: 'Elementet kunne ikke gjenopprettes',
+ trashCouldNotLoad: 'Papirkurven kunne ikke lastes inn',
+ trashMayBeOutOfDate: 'Papirkurven kan være utdatert',
+ },
+ labels: {
+ deletedAge: 'Slettet {{value}}',
+ itemCount_one: '{{count}} element',
+ itemCount_other: '{{count}} elementer',
+ lastEmptied: 'Sist tømt {{value}}',
+ loadingTrash: 'Laster Papirkurv',
+ originalLocation: 'Opprinnelig plassering: {{location}}',
+ title: 'Papirkurv',
+ trashActions: 'Papirkurvhandlinger for {{title}}',
+ },
+ kinds: {
+ deck: 'Kortstokk',
+ folder: 'Mappe',
+ note: 'Notat',
+ workspace: 'Arbeidsområde',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Opprett arbeidsområde',
+ deleteWorkspace: 'Slett arbeidsområde',
+ editWorkspace: 'Rediger arbeidsområde',
+ newWorkspace: 'Nytt arbeidsområde',
+ openWorkspace: 'Åpne {{title}}',
+ openingWorkspace: 'Åpner {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Studiekontekst.',
+ editorVisual: 'Velg et visuelt anker for dette arbeidsområdet.',
+ emptyList: 'Skill kortstokker, notater og repetisjonskøer etter studiekontekst.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Dette flytter "{{title}}" til Papirkurv. Du kan gjenopprette det senere.',
+ deleteWorkspaceFallbackDescription: 'Dette flytter dette arbeidsområdet til Papirkurv. Du kan gjenopprette det senere.',
+ deleteWorkspaceFallbackTitle: 'Slette arbeidsområde?',
+ deleteWorkspaceTitle: 'Slette "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Start med et arbeidsområde',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Arbeidsområdet kunne ikke opprettes',
+ couldNotDeleteWorkspace: 'Arbeidsområdet kunne ikke slettes',
+ couldNotOpenWorkspace: 'Arbeidsområdet kunne ikke åpnes',
+ couldNotSaveWorkspace: 'Arbeidsområdet kunne ikke lagres',
+ workspaceCouldNotLoad: 'Arbeidsområdet kunne ikke lastes inn',
+ workspacesCouldNotLoad: 'Arbeidsområder kunne ikke lastes inn',
+ },
+ fields: {
+ descriptionLabel: 'Arbeidsområdebeskrivelse',
+ descriptionPlaceholder: 'Hva hører hjemme i dette arbeidsområdet?',
+ namePlaceholder: 'Navn på arbeidsområde',
+ untitledWorkspace: 'Arbeidsområde uten tittel',
+ },
+ labels: {
+ createWorkspaceTitle: 'Opprett arbeidsområde',
+ loadingWorkspaces: 'Laster arbeidsområder',
+ workspace: 'Arbeidsområde',
+ workspaces: 'Arbeidsområder',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/nl.ts b/ui/src/core/i18n/resources/nl.ts
new file mode 100644
index 0000000..f8c9c82
--- /dev/null
+++ b/ui/src/core/i18n/resources/nl.ts
@@ -0,0 +1,623 @@
+export const nl = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Probeer het opnieuw. Als dit blijft gebeuren, open Clear opnieuw.',
+ title: 'Kan niet starten',
+ },
+ loadingTitle: 'Je studieruimte voorbereiden',
+ },
+ common: {
+ actions: {
+ back: 'Terug',
+ cancel: 'Annuleren',
+ checkAgain: 'Opnieuw controleren',
+ close: 'Sluiten',
+ create: 'Maken',
+ delete: 'Verwijderen',
+ dismissError: 'Fout sluiten',
+ dismissStatus: 'Status sluiten',
+ edit: 'Bewerken',
+ itemActions: 'Acties voor {{title}}',
+ reset: 'Resetten',
+ review: 'Herhalen',
+ save: 'Opslaan',
+ saveChanges: 'Wijzigingen opslaan',
+ tryAgain: 'Opnieuw proberen',
+ },
+ labels: {
+ active: 'Actief',
+ clear: 'Clear',
+ custom: 'Aangepast',
+ default: 'Standaard',
+ loadingEditor: 'Editor laden',
+ name: 'Naam',
+ completedTask: 'Voltooide taak',
+ description: 'Beschrijving',
+ incompleteTask: 'Onvoltooide taak',
+ percentageInput: 'Percentage voor {{label}}',
+ visual: 'Visueel',
+ },
+ status: {
+ actionFailed: 'Actie mislukt',
+ actionInProgress: 'Actie bezig',
+ },
+ sort: {
+ ascending: 'Opl.',
+ column: 'Kolom',
+ descending: 'Afl.',
+ direction: 'Richting',
+ sort: 'Sorteren',
+ },
+ search: {
+ label: 'Zoeken',
+ },
+ visualPicker: {
+ allLucideIcons: 'Alle Lucide-iconen',
+ browseIconsFor: 'Blader door iconen of zoek iconen voor {{label}}.',
+ chooseIcon: 'Icoon kiezen',
+ iconPicker: 'Iconenkiezer voor {{label}}',
+ iconSearch: 'Iconen zoeken voor {{label}}',
+ iconsCouldNotLoad: 'Iconen konden niet worden geladen.',
+ loadingIcons: 'Iconen laden',
+ loadingMoreIcons: 'Meer iconen laden',
+ moreIcons: 'Meer iconen',
+ noIconsMatch: 'Geen iconen gevonden voor "{{query}}".',
+ searchIconsPlaceholder: 'Iconen zoeken…',
+ selectedIcon: '{{label}} geselecteerd',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Maken',
+ newDeck: 'Nieuwe kaartenset',
+ newFolder: 'Nieuwe map',
+ },
+ descriptions: {
+ defaultWorkspace: 'Houd kaartensets, mappen en notities bij elkaar.',
+ emptyWorkspace: 'Maak een kaartenset en voeg daarna notities toe om je herhaalwachtrij op te bouwen.',
+ emptyFolder: 'Maak een kaartenset en voeg daarna notities toe om een herhaalwachtrij op te bouwen.',
+ searchPlaceholder: 'Mappen, kaartensets en notities zoeken…',
+ },
+ empty: {
+ createFirstDeck: 'Maak je eerste kaartenset',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Kan kaartenset niet verwijderen',
+ couldNotDeleteFolder: 'Kan map niet verwijderen',
+ couldNotDeleteWorkspace: 'Kan werkruimte niet verwijderen',
+ dashboardCouldNotOpen: 'Dashboard kon niet worden geopend',
+ decksCouldNotLoad: 'Kaartensets konden niet worden geladen',
+ decksMayBeOutOfDate: 'Kaartensets zijn mogelijk verouderd',
+ foldersCouldNotLoad: 'Mappen konden niet worden geladen',
+ foldersMayBeOutOfDate: 'Mappen zijn mogelijk verouderd',
+ workspaceCouldNotLoad: 'Werkruimte kon niet worden geladen',
+ },
+ labels: {
+ dashboard: 'Dashboard',
+ loadingDashboard: 'Dashboard laden',
+ newItem: 'Nieuw item',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Datum niet beschikbaar',
+ },
+ age: {
+ dayAgo_one: '{{count}} dag geleden',
+ dayAgo_other: '{{count}} dagen geleden',
+ hourAgo_one: '{{count}} uur geleden',
+ hourAgo_other: '{{count}} uur geleden',
+ justNow: 'zojuist',
+ minuteAgo_one: '{{count}} minuut geleden',
+ minuteAgo_other: '{{count}} minuten geleden',
+ unavailable: 'datum niet beschikbaar',
+ weekAgo_one: '{{count}} week geleden',
+ weekAgo_other: '{{count}} weken geleden',
+ },
+ labels: {
+ deleted: 'Verwijderd {{value}}',
+ due: 'Te doen: {{value}}',
+ reviewed: 'Herhaald: {{value}}',
+ updated: 'Bijgewerkt {{value}}',
+ updatedUppercase: 'BIJGEWERKT {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} dag geleden',
+ dayAgo_other: '{{count}} dagen geleden',
+ inAMoment: 'Zo meteen',
+ inDay_one: 'Over {{count}} dag',
+ inDay_other: 'Over {{count}} dagen',
+ inMonth_one: 'Over {{count}} maand',
+ inMonth_other: 'Over {{count}} maanden',
+ inWeek_one: 'Over {{count}} week',
+ inWeek_other: 'Over {{count}} weken',
+ justNow: 'Zojuist',
+ monthAgo_one: '{{count}} maand geleden',
+ monthAgo_other: '{{count}} maanden geleden',
+ secondsAgoShort: '{{count}} s geleden',
+ minutesAgoShort: '{{count}} min geleden',
+ hoursAgoShort: '{{count}} u geleden',
+ today: 'Vandaag',
+ tomorrow: 'Morgen',
+ weekAgo_one: '{{count}} week geleden',
+ weekAgo_other: '{{count}} weken geleden',
+ yesterday: 'Gisteren',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Acties voor {{title}}',
+ createDeck: 'Kaartenset maken',
+ createNote: 'Notitie maken',
+ deleteDeck: 'Kaartenset verwijderen',
+ editDeck: 'Kaartenset bewerken',
+ newNote: 'Nieuwe notitie',
+ openDeck: 'Kaartenset {{title}} openen',
+ saveDeck: 'Kan kaartenset niet opslaan',
+ studyNow: 'Nu studeren',
+ },
+ descriptions: {
+ emptyDeck: 'Voeg een notitie toe zodat deze kaartenset materiaal heeft om te herhalen.',
+ editorDefault: 'Gerichte studiekaartenset.',
+ editorVisual: 'Kies een omslagicoon voor deze kaartenset.',
+ notesSearchPlaceholder: 'Notities zoeken…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Dit verplaatst "{{title}}" naar de Prullenbak. Je kunt het later herstellen.',
+ deleteDeckFallbackDescription: 'Dit verplaatst deze kaartenset naar de Prullenbak. Je kunt hem later herstellen.',
+ deleteDeckFallbackTitle: 'Kaartenset verwijderen?',
+ deleteDeckTitle: '"{{title}}" verwijderen?',
+ deleteNoteDescription: 'Dit verplaatst "{{title}}" naar de Prullenbak. Je kunt hem later herstellen.',
+ deleteNoteFallbackTitle: 'Notitie verwijderen?',
+ deleteNoteTitle: '"{{title}}" verwijderen?',
+ },
+ empty: {
+ noMatchingNotes: 'Geen overeenkomende notities',
+ noMatchingNotesDescription: 'Geen notities gevonden voor "{{query}}".',
+ thisDeckIsEmpty: 'Deze kaartenset is leeg',
+ },
+ errors: {
+ couldNotCreateDeck: 'Kan kaartenset niet maken',
+ couldNotDeleteDeck: 'Kan kaartenset niet verwijderen',
+ couldNotDeleteNote: 'Kan notitie niet verwijderen',
+ couldNotLoadFolderPath: 'Kan mappad niet laden',
+ couldNotSaveDeck: 'Kan kaartenset niet opslaan',
+ deckCouldNotLoad: 'Kaartenset kon niet worden geladen',
+ notesCouldNotLoad: 'Notities konden niet worden geladen',
+ notesMayBeOutOfDate: 'Notities zijn mogelijk verouderd',
+ },
+ fields: {
+ descriptionLabel: 'Beschrijving van kaartenset',
+ descriptionPlaceholder: 'Wat helpt deze kaartenset je te herhalen?',
+ namePlaceholder: 'Naam van kaartenset',
+ untitledDeck: 'Naamloze kaartenset',
+ untitledDeckLower: 'naamloze kaartenset',
+ },
+ labels: {
+ createDeckTitle: 'Kaartenset maken',
+ deck: 'Kaartenset',
+ deckNotesSearch: 'Notities in kaartenset zoeken',
+ deckOverview: 'Overzicht van kaartenset',
+ decks: 'Kaartensets',
+ due: 'Te doen',
+ dueToday: 'Vandaag te doen',
+ loadingDeck: 'Kaartenset laden',
+ mastery: 'Beheersing',
+ notes: 'Notities',
+ },
+ sort: {
+ ariaLabel: 'Kaartensets sorteren',
+ dueToday: 'Vandaag te doen',
+ title: 'Titel',
+ updated: 'Bijgewerkt',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'De gegevens zijn gewijzigd. Vernieuw en probeer opnieuw.',
+ forbidden: 'Je hebt geen toestemming om dit te doen.',
+ notFound: 'We konden dit item niet vinden.',
+ offline: 'Kan de service niet bereiken.',
+ timeout: 'Dit duurt te lang. Probeer opnieuw.',
+ unauthorized: 'Log in om door te gaan.',
+ unavailable: 'De service is tijdelijk niet beschikbaar.',
+ },
+ fallback: {
+ unexpected: 'Onverwachte fout',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Map maken',
+ deleteFolder: 'Map verwijderen',
+ editFolder: 'Map bewerken',
+ },
+ descriptions: {
+ editorDefault: 'Map voor verwante kaartensets.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Dit verplaatst "{{name}}" naar de Prullenbak. Je kunt hem later herstellen.',
+ deleteFolderFallbackDescription: 'Dit verplaatst deze map naar de Prullenbak. Je kunt hem later herstellen.',
+ deleteFolderFallbackTitle: 'Map verwijderen?',
+ deleteFolderTitle: '"{{name}}" verwijderen?',
+ },
+ empty: {
+ noMatchesInFolder: 'Geen resultaten in deze map',
+ noMatchesInFolderDescription: 'Geen mappen, kaartensets of notities gevonden voor "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Kan map niet maken',
+ couldNotDeleteFolder: 'Kan map niet verwijderen',
+ couldNotLoadFolderPath: 'Kan mappad niet laden',
+ couldNotSaveFolder: 'Kan map niet opslaan',
+ folderCouldNotLoad: 'Map kon niet worden geladen',
+ },
+ fields: {
+ descriptionLabel: 'Mapbeschrijving',
+ descriptionPlaceholder: 'Wat hoort in deze map?',
+ namePlaceholder: 'Mapnaam',
+ untitledFolder: 'Naamloze map',
+ },
+ labels: {
+ createFolderTitle: 'Map maken',
+ folder: 'Map',
+ folders: 'Mappen',
+ loadingFolder: 'Map laden',
+ name: 'Naam',
+ updated: 'Bijgewerkt',
+ },
+ sort: {
+ ariaLabel: 'Mappen sorteren',
+ name: 'Naam',
+ updated: 'Bijgewerkt',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Als lokale en gesynchroniseerde gegevens verschillen, verschijnt het item hier.',
+ heading: 'Synchronisatiestatus',
+ title: 'Conflicten',
+ noConflicts: 'Geen conflicten gevonden',
+ },
+ labels: {
+ menu: 'Menu',
+ },
+ sections: {
+ settings: {
+ description: 'Personaliseer je omgeving en voorkeuren',
+ title: 'Instellingen',
+ },
+ trash: {
+ description: 'Herstel of verwijder verwijderde items definitief',
+ title: 'Prullenbak',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Editor sluiten',
+ openActions: 'Acties openen',
+ openWorkspaces: 'Werkruimten openen',
+ },
+ items: {
+ home: 'Home',
+ menu: 'Menu',
+ primary: 'Primair',
+ settings: 'Instellingen',
+ spaces: 'Ruimten',
+ trash: 'Prullenbak',
+ workspaces: 'Werkruimten',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Cloze toevoegen',
+ deleteNote: 'Notitie verwijderen',
+ editNote: 'Notitie bewerken',
+ hideDerivedCardsNote: 'Notitie over afgeleide kaarten verbergen',
+ openNote: '{{title}} openen',
+ saveNote: 'Notitie opslaan',
+ showDerivedCardsNote: 'Notitie over afgeleide kaarten tonen',
+ },
+ descriptions: {
+ clozeFormat: 'Elk verborgen deel wordt een herhaalkaart wanneer je opslaat.',
+ clozeFormatPrefix: 'Zet verborgen tekst tussen',
+ derivedCardsHelper: 'Notities zijn de bron van waarheid voor afgeleide kaarten.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Dit verplaatst "{{title}}" naar de Prullenbak. Je kunt hem later herstellen.',
+ deleteNoteFallbackDescription: 'Dit verplaatst deze notitie naar de Prullenbak. Je kunt hem later herstellen.',
+ deleteNoteFallbackTitle: 'Notitie verwijderen?',
+ deleteNoteTitle: '"{{title}}" verwijderen?',
+ },
+ errors: {
+ couldNotCreateNote: 'Kan notitie niet maken',
+ couldNotDeleteNote: 'Kan notitie niet verwijderen',
+ couldNotSaveNote: 'Kan notitie niet opslaan',
+ noteCouldNotLoad: 'Notitie kon niet worden geladen',
+ },
+ fields: {
+ back: 'Achterkant',
+ backPlaceholder: 'Voer achterkant in',
+ bodyPlaceholder: 'Schrijf de notitietekst met cloze-verwijderingen…',
+ front: 'Voorkant',
+ frontPlaceholder: 'Voer voorkant in',
+ noteBody: 'Notitietekst',
+ title: 'Titel',
+ titlePlaceholder: 'Voeg een notitietitel toe',
+ untitledCloze: 'Naamloze cloze',
+ untitledNote: 'Naamloze notitie',
+ },
+ labels: {
+ backUppercase: 'ACHTERKANT',
+ basic: 'Basis',
+ basicLower: 'basis',
+ basicUppercase: 'BASIS',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze-indeling',
+ clozeUppercase: 'CLOZE',
+ deck: 'Kaartenset',
+ derivedCards: 'AFGELEIDE KAARTEN',
+ due: 'Te doen',
+ frontUppercase: 'VOORKANT',
+ inProgress: 'Bezig',
+ inProgressUppercase: 'BEZIG',
+ loadingNote: 'Notitie laden',
+ loadingNoteEditor: 'Notitie-editor laden',
+ markdownFormatting: 'Markdown-opmaak',
+ mastered: 'Beheerst',
+ masteredUppercase: 'BEHEERST',
+ newNote: 'Nieuwe notitie',
+ noteBody: 'NOTITIETEKST',
+ noteContent: 'Notitie-inhoud',
+ noteDetails: 'Notitiedetails',
+ noteMetadata: 'Notitiemetadata',
+ noteType: 'Notitietype',
+ notes: 'Notities',
+ reviewed: 'Herhaald',
+ studyProgress: 'Studievoortgang',
+ studyProgressUppercase: 'STUDIEVOORTGANG',
+ titleUppercase: 'TITEL',
+ updated: 'Bijgewerkt',
+ },
+ sort: {
+ ariaLabel: 'Notities sorteren',
+ title: 'Titel',
+ updated: 'Bijgewerkt',
+ },
+ toolbar: {
+ bold: 'Vet',
+ italic: 'Cursief',
+ link: 'Link',
+ list: 'Lijst',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Opnieuw',
+ backToDeck: 'Terug naar kaartenset',
+ continueReview: 'Doorgaan met herhalen',
+ easy: 'Makkelijk',
+ good: 'Goed',
+ hard: 'Moeilijk',
+ newNote: 'Nieuwe notitie',
+ showAnswer: 'Antwoord tonen',
+ },
+ errors: {
+ couldNotGradeCard: 'Kan kaart niet beoordelen',
+ reviewCouldNotLoad: 'Herhaling kon niet worden geladen',
+ reviewCouldNotStart: 'Herhaling kon niet worden gestart',
+ summaryCouldNotLoad: 'Herhalingsoverzicht kon niet worden geladen',
+ summaryNotAvailable: 'Herhalingsoverzicht is niet beschikbaar',
+ summaryNotComplete: 'Deze herhaling is nog niet voltooid.',
+ },
+ labels: {
+ cardsReviewed: 'Kaarten herhaald',
+ deck: 'Kaartenset',
+ duration: 'Duur',
+ loadingReview: 'Herhaling laden',
+ loadingSummary: 'Overzicht laden',
+ progress: 'Herhalingsvoortgang',
+ review: 'Herhaling',
+ reviewComplete: 'Herhaling voltooid',
+ reviewed_one: '{{count}} herhaald',
+ reviewed_other: '{{count}} herhaald',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} u {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Je voortgang is opgeslagen in deze kaartenset.',
+ },
+ unavailable: {
+ description: 'Voeg een notitie toe zodat deze kaartenset in de herhaalwachtrij kan komen.',
+ title: 'Geen kaarten om te herhalen',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Zoekopdracht wissen',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Geen resultaten in deze werkruimte',
+ noMatchesInWorkspaceDescription: 'Geen mappen, kaartensets of notities gevonden voor "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Zoekopdracht kon niet worden voltooid',
+ },
+ labels: {
+ results: 'Zoekresultaten',
+ resultsFor: 'Resultaten voor "{{query}}"',
+ searchingContent: 'Inhoud zoeken',
+ },
+ resultGroups: {
+ deck: 'Kaartensets',
+ folder: 'Mappen',
+ note: 'Notities',
+ },
+ resultKinds: {
+ deck: 'kaartenset',
+ folder: 'map',
+ note: 'notitie',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Alle instellingen resetten',
+ resetSettings: 'Instellingen resetten',
+ resetToDefaults: 'Standaardwaarden herstellen',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Plak geldige JSON met 21 numerieke waarden.',
+ fsrsErrorInvalidParams_one: 'Voer een JSON-array in met precies {{count}} eindig getal.',
+ fsrsErrorInvalidParams_other: 'Voer een JSON-array in met precies {{count}} eindige getallen.',
+ fsrsHelper: 'Dit is een expertinstelling. Waarden moeten in volgorde blijven.',
+ fsrsJsonLabel: 'JSON voor FSRS-parameters',
+ fsrsTitle: 'FSRS-parameters bewerken',
+ fsrsDescription: 'Plak een JSON-array met 21 getallen om de scheduler-gewichten te overschrijven.',
+ resetDescription: 'Dit herstelt tijdzone, studielimieten en FSRS-instellingen.',
+ resetDescriptionWithLanguage: 'Dit herstelt taal, tijdzone, studielimieten en FSRS-instellingen.',
+ resetTitle: 'Alle instellingen resetten?',
+ timezoneDescription: 'Zoek naar een stad of tijdzone-id.',
+ timezoneSearchLabel: 'Tijdzones zoeken',
+ timezoneSearchPlaceholder: 'Tijdzones zoeken…',
+ timezoneTitle: 'Tijdzone kiezen',
+ },
+ errors: {
+ couldNotResetSettings: 'Kan instellingen niet resetten',
+ couldNotSaveSettings: 'Kan instellingen niet opslaan',
+ settingsCouldNotLoad: 'Instellingen konden niet worden geladen',
+ settingsUnavailable: 'Instellingen zijn niet beschikbaar.',
+ },
+ labels: {
+ appearance: 'Weergave',
+ automatic: 'Automatisch',
+ fsrsParameters: 'FSRS-parameters',
+ general: 'Algemeen',
+ language: 'Taal',
+ loadingSettings: 'Instellingen laden',
+ masteryHorizon: 'Beheersingshorizon',
+ newCardOrder: 'Volgorde nieuwe kaarten',
+ newCardsPerDay: 'Nieuwe kaarten per dag',
+ reviewCardsPerDay: 'Herhaalkaarten per dag',
+ savingSettings: 'Instellingen opslaan',
+ schedule: 'Planning',
+ searchNoTimezones: 'Geen overeenkomende tijdzones.',
+ settings: 'Instellingen',
+ settingsReset: 'Instellingen gereset',
+ study: 'Studie',
+ targetRecallProbability: 'Doelherinneringskans',
+ theme: 'Thema',
+ timezone: 'Tijdzone',
+ },
+ options: {
+ languageEnUs: 'Engels (VS)',
+ newCardsAfterReviews: 'Na herhalingen',
+ newCardsBeforeReviews: 'Voor herhalingen',
+ newCardsMixed: 'Gemengd',
+ themeDark: 'Donker',
+ themeLight: 'Licht',
+ themeSystem: 'Systeem',
+ timezoneSystem: 'Systeemtijdzone gebruiken',
+ },
+ rows: {
+ fsrsDescription: 'Gewichten van expertmodel',
+ languageDescription: 'Interfacetaal',
+ masteryHorizonDescription: 'Aantal dagen dat een kaart op of boven de doelkans oproepbaar moet blijven om als beheerst te tellen',
+ newCardOrderDescription: 'Volgorde van nieuwe kaarten ten opzichte van herhalingen',
+ newCardsPerDayDescription: 'Maximumaantal nieuwe kaarten per dag',
+ reviewCardsPerDayDescription: 'Maximumaantal herhaalkaarten per dag',
+ targetRecallProbabilityDescription: 'Minimale kans op herinnering bij de volgende geplande herhaling',
+ timezoneDescription: 'Gebruik automatische tijdzone of kies een stad.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Definitief verwijderen',
+ empty: 'Leegmaken',
+ emptyTrash: 'Prullenbak legen',
+ restore: 'Herstellen',
+ restoringItem: '{{title}} herstellen',
+ },
+ dialogs: {
+ deleteItemDescription: 'Dit verwijdert "{{title}}" definitief. Dit kan niet ongedaan worden gemaakt.',
+ deleteItemFallbackDescription: 'Dit verwijdert dit item definitief. Dit kan niet ongedaan worden gemaakt.',
+ deleteItemFallbackTitle: 'Item verwijderen?',
+ deleteItemTitle: '"{{title}}" verwijderen?',
+ emptyTrashDescription: 'Dit verwijdert alles in de Prullenbak definitief. Dit kan niet ongedaan worden gemaakt.',
+ emptyTrashTitle: 'Prullenbak legen?',
+ },
+ empty: {
+ description: 'Items die je verwijdert verschijnen hier voordat ze definitief worden verwijderd.',
+ title: 'Prullenbak is leeg',
+ },
+ errors: {
+ couldNotDeleteItem: 'Kan item niet verwijderen',
+ couldNotEmptyTrash: 'Kan Prullenbak niet legen',
+ couldNotRestoreItem: 'Kan item niet herstellen',
+ trashCouldNotLoad: 'Prullenbak kon niet worden geladen',
+ trashMayBeOutOfDate: 'Prullenbak is mogelijk verouderd',
+ },
+ labels: {
+ deletedAge: 'Verwijderd {{value}}',
+ itemCount_one: '{{count}} item',
+ itemCount_other: '{{count}} items',
+ lastEmptied: 'Laatst geleegd {{value}}',
+ loadingTrash: 'Prullenbak laden',
+ originalLocation: 'Oorspronkelijke locatie: {{location}}',
+ title: 'Prullenbak',
+ trashActions: 'Prullenbakacties voor {{title}}',
+ },
+ kinds: {
+ deck: 'Kaartenset',
+ folder: 'Map',
+ note: 'Notitie',
+ workspace: 'Werkruimte',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Werkruimte maken',
+ deleteWorkspace: 'Werkruimte verwijderen',
+ editWorkspace: 'Werkruimte bewerken',
+ newWorkspace: 'Nieuwe werkruimte',
+ openWorkspace: '{{title}} openen',
+ openingWorkspace: '{{title}} openen',
+ },
+ descriptions: {
+ editorDefault: 'Studiecontext.',
+ editorVisual: 'Kies een visueel anker voor deze werkruimte.',
+ emptyList: 'Scheid kaartensets, notities en herhaalwachtrijen per studiecontext.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Dit verplaatst "{{title}}" naar de Prullenbak. Je kunt hem later herstellen.',
+ deleteWorkspaceFallbackDescription: 'Dit verplaatst deze werkruimte naar de Prullenbak. Je kunt hem later herstellen.',
+ deleteWorkspaceFallbackTitle: 'Werkruimte verwijderen?',
+ deleteWorkspaceTitle: '"{{title}}" verwijderen?',
+ },
+ empty: {
+ startWithWorkspace: 'Begin met een werkruimte',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Kan werkruimte niet maken',
+ couldNotDeleteWorkspace: 'Kan werkruimte niet verwijderen',
+ couldNotOpenWorkspace: 'Kan werkruimte niet openen',
+ couldNotSaveWorkspace: 'Kan werkruimte niet opslaan',
+ workspaceCouldNotLoad: 'Werkruimte kon niet worden geladen',
+ workspacesCouldNotLoad: 'Werkruimten konden niet worden geladen',
+ },
+ fields: {
+ descriptionLabel: 'Beschrijving van werkruimte',
+ descriptionPlaceholder: 'Wat hoort in deze werkruimte?',
+ namePlaceholder: 'Naam van werkruimte',
+ untitledWorkspace: 'Naamloze werkruimte',
+ },
+ labels: {
+ createWorkspaceTitle: 'Werkruimte maken',
+ loadingWorkspaces: 'Werkruimten laden',
+ workspace: 'Werkruimte',
+ workspaces: 'Werkruimten',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/pl.ts b/ui/src/core/i18n/resources/pl.ts
new file mode 100644
index 0000000..161052d
--- /dev/null
+++ b/ui/src/core/i18n/resources/pl.ts
@@ -0,0 +1,649 @@
+export const pl = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Spróbuj ponownie. Jeśli problem będzie się powtarzał, otwórz Clear jeszcze raz.',
+ title: 'Nie udało się uruchomić',
+ },
+ loadingTitle: 'Przygotowywanie przestrzeni do nauki',
+ },
+ common: {
+ actions: {
+ back: 'Wstecz',
+ cancel: 'Anuluj',
+ checkAgain: 'Sprawdź ponownie',
+ close: 'Zamknij',
+ create: 'Utwórz',
+ delete: 'Usuń',
+ dismissError: 'Zamknij błąd',
+ dismissStatus: 'Zamknij status',
+ edit: 'Edytuj',
+ itemActions: 'Działania dla {{title}}',
+ reset: 'Resetuj',
+ review: 'Powtarzaj',
+ save: 'Zapisz',
+ saveChanges: 'Zapisz zmiany',
+ tryAgain: 'Spróbuj ponownie',
+ },
+ labels: {
+ active: 'Aktywne',
+ clear: 'Clear',
+ custom: 'Niestandardowe',
+ default: 'Domyślne',
+ loadingEditor: 'Ładowanie edytora',
+ name: 'Nazwa',
+ completedTask: 'Zadanie ukończone',
+ description: 'Opis',
+ incompleteTask: 'Zadanie nieukończone',
+ percentageInput: 'Procent dla {{label}}',
+ visual: 'Wizualizacja',
+ },
+ status: {
+ actionFailed: 'Działanie nie powiodło się',
+ actionInProgress: 'Działanie w toku',
+ },
+ sort: {
+ ascending: 'Rosn.',
+ column: 'Kolumna',
+ descending: 'Mal.',
+ direction: 'Kierunek',
+ sort: 'Sortuj',
+ },
+ search: {
+ label: 'Szukaj',
+ },
+ visualPicker: {
+ allLucideIcons: 'Wszystkie ikony Lucide',
+ browseIconsFor: 'Przeglądaj lub wyszukuj ikony dla {{label}}.',
+ chooseIcon: 'Wybierz ikonę',
+ iconPicker: 'Wybór ikony dla {{label}}',
+ iconSearch: 'Wyszukiwanie ikon dla {{label}}',
+ iconsCouldNotLoad: 'Nie udało się załadować ikon.',
+ loadingIcons: 'Ładowanie ikon',
+ loadingMoreIcons: 'Ładowanie kolejnych ikon',
+ moreIcons: 'Więcej ikon',
+ noIconsMatch: 'Brak ikon pasujących do "{{query}}".',
+ searchIconsPlaceholder: 'Szukaj ikon…',
+ selectedIcon: 'Wybrano {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Utwórz',
+ newDeck: 'Nowy zestaw',
+ newFolder: 'Nowy folder',
+ },
+ descriptions: {
+ defaultWorkspace: 'Trzymaj zestawy, foldery i notatki razem.',
+ emptyWorkspace: 'Utwórz zestaw, a potem dodaj notatki, aby zbudować kolejkę powtórek.',
+ emptyFolder: 'Utwórz zestaw, a potem dodaj notatki, aby zbudować kolejkę powtórek.',
+ searchPlaceholder: 'Szukaj folderów, zestawów i notatek…',
+ },
+ empty: {
+ createFirstDeck: 'Utwórz pierwszy zestaw',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Nie udało się usunąć zestawu',
+ couldNotDeleteFolder: 'Nie udało się usunąć folderu',
+ couldNotDeleteWorkspace: 'Nie udało się usunąć obszaru roboczego',
+ dashboardCouldNotOpen: 'Nie udało się otworzyć pulpitu',
+ decksCouldNotLoad: 'Nie udało się załadować zestawów',
+ decksMayBeOutOfDate: 'Zestawy mogą być nieaktualne',
+ foldersCouldNotLoad: 'Nie udało się załadować folderów',
+ foldersMayBeOutOfDate: 'Foldery mogą być nieaktualne',
+ workspaceCouldNotLoad: 'Nie udało się załadować obszaru roboczego',
+ },
+ labels: {
+ dashboard: 'Pulpit',
+ loadingDashboard: 'Ładowanie pulpitu',
+ newItem: 'Nowy element',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Data niedostępna',
+ },
+ age: {
+ dayAgo_one: '{{count}} dzień temu',
+ dayAgo_few: '{{count}} dni temu',
+ dayAgo_many: '{{count}} dni temu',
+ dayAgo_other: '{{count}} dnia temu',
+ hourAgo_one: '{{count}} godzinę temu',
+ hourAgo_few: '{{count}} godziny temu',
+ hourAgo_many: '{{count}} godzin temu',
+ hourAgo_other: '{{count}} godziny temu',
+ justNow: 'przed chwilą',
+ minuteAgo_one: '{{count}} minutę temu',
+ minuteAgo_few: '{{count}} minuty temu',
+ minuteAgo_many: '{{count}} minut temu',
+ minuteAgo_other: '{{count}} minuty temu',
+ unavailable: 'data niedostępna',
+ weekAgo_one: '{{count}} tydzień temu',
+ weekAgo_few: '{{count}} tygodnie temu',
+ weekAgo_many: '{{count}} tygodni temu',
+ weekAgo_other: '{{count}} tygodnia temu',
+ },
+ labels: {
+ deleted: 'Usunięto {{value}}',
+ due: 'Do powtórki: {{value}}',
+ reviewed: 'Powtórzono: {{value}}',
+ updated: 'Zaktualizowano {{value}}',
+ updatedUppercase: 'ZAKTUALIZOWANO {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} dzień temu',
+ dayAgo_few: '{{count}} dni temu',
+ dayAgo_many: '{{count}} dni temu',
+ dayAgo_other: '{{count}} dnia temu',
+ inAMoment: 'Za chwilę',
+ inDay_one: 'Za {{count}} dzień',
+ inDay_few: 'Za {{count}} dni',
+ inDay_many: 'Za {{count}} dni',
+ inDay_other: 'Za {{count}} dnia',
+ inMonth_one: 'Za {{count}} miesiąc',
+ inMonth_few: 'Za {{count}} miesiące',
+ inMonth_many: 'Za {{count}} miesięcy',
+ inMonth_other: 'Za {{count}} miesiąca',
+ inWeek_one: 'Za {{count}} tydzień',
+ inWeek_few: 'Za {{count}} tygodnie',
+ inWeek_many: 'Za {{count}} tygodni',
+ inWeek_other: 'Za {{count}} tygodnia',
+ justNow: 'Przed chwilą',
+ monthAgo_one: '{{count}} miesiąc temu',
+ monthAgo_few: '{{count}} miesiące temu',
+ monthAgo_many: '{{count}} miesięcy temu',
+ monthAgo_other: '{{count}} miesiąca temu',
+ secondsAgoShort: '{{count}} s temu',
+ minutesAgoShort: '{{count}} min temu',
+ hoursAgoShort: '{{count}} godz. temu',
+ today: 'Dzisiaj',
+ tomorrow: 'Jutro',
+ weekAgo_one: '{{count}} tydzień temu',
+ weekAgo_few: '{{count}} tygodnie temu',
+ weekAgo_many: '{{count}} tygodni temu',
+ weekAgo_other: '{{count}} tygodnia temu',
+ yesterday: 'Wczoraj',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Działania dla {{title}}',
+ createDeck: 'Utwórz zestaw',
+ createNote: 'Utwórz notatkę',
+ deleteDeck: 'Usuń zestaw',
+ editDeck: 'Edytuj zestaw',
+ newNote: 'Nowa notatka',
+ openDeck: 'Otwórz zestaw {{title}}',
+ saveDeck: 'Nie udało się zapisać zestawu',
+ studyNow: 'Ucz się teraz',
+ },
+ descriptions: {
+ emptyDeck: 'Dodaj notatkę, aby ten zestaw miał materiał do powtórek.',
+ editorDefault: 'Skupiony zestaw do nauki.',
+ editorVisual: 'Wybierz glif okładki dla tego zestawu.',
+ notesSearchPlaceholder: 'Szukaj notatek…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'To przeniesie "{{title}}" do Kosza. Możesz przywrócić go później.',
+ deleteDeckFallbackDescription: 'To przeniesie ten zestaw do Kosza. Możesz przywrócić go później.',
+ deleteDeckFallbackTitle: 'Usunąć zestaw?',
+ deleteDeckTitle: 'Usunąć "{{title}}"?',
+ deleteNoteDescription: 'To przeniesie "{{title}}" do Kosza. Możesz przywrócić ją później.',
+ deleteNoteFallbackTitle: 'Usunąć notatkę?',
+ deleteNoteTitle: 'Usunąć "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Brak pasujących notatek',
+ noMatchingNotesDescription: 'Żadna notatka nie pasuje do "{{query}}".',
+ thisDeckIsEmpty: 'Ten zestaw jest pusty',
+ },
+ errors: {
+ couldNotCreateDeck: 'Nie udało się utworzyć zestawu',
+ couldNotDeleteDeck: 'Nie udało się usunąć zestawu',
+ couldNotDeleteNote: 'Nie udało się usunąć notatki',
+ couldNotLoadFolderPath: 'Nie udało się załadować ścieżki folderu',
+ couldNotSaveDeck: 'Nie udało się zapisać zestawu',
+ deckCouldNotLoad: 'Nie udało się załadować zestawu',
+ notesCouldNotLoad: 'Nie udało się załadować notatek',
+ notesMayBeOutOfDate: 'Notatki mogą być nieaktualne',
+ },
+ fields: {
+ descriptionLabel: 'Opis zestawu',
+ descriptionPlaceholder: 'Co ten zestaw pomoże Ci powtórzyć?',
+ namePlaceholder: 'Nazwa zestawu',
+ untitledDeck: 'Zestaw bez tytułu',
+ untitledDeckLower: 'zestaw bez tytułu',
+ },
+ labels: {
+ createDeckTitle: 'Utwórz zestaw',
+ deck: 'Zestaw',
+ deckNotesSearch: 'Wyszukiwanie notatek w zestawie',
+ deckOverview: 'Przegląd zestawu',
+ decks: 'Zestawy',
+ due: 'Do powtórki',
+ dueToday: 'Do powtórki dziś',
+ loadingDeck: 'Ładowanie zestawu',
+ mastery: 'Opanowanie',
+ notes: 'Notatki',
+ },
+ sort: {
+ ariaLabel: 'Sortuj zestawy',
+ dueToday: 'Do powtórki dziś',
+ title: 'Tytuł',
+ updated: 'Zaktualizowano',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Dane uległy zmianie. Odśwież i spróbuj ponownie.',
+ forbidden: 'Nie masz uprawnień, aby to zrobić.',
+ notFound: 'Nie udało się znaleźć tego elementu.',
+ offline: 'Nie można połączyć się z usługą.',
+ timeout: 'To trwa zbyt długo. Spróbuj ponownie.',
+ unauthorized: 'Zaloguj się, aby kontynuować.',
+ unavailable: 'Usługa jest tymczasowo niedostępna.',
+ },
+ fallback: {
+ unexpected: 'Nieoczekiwany błąd',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Utwórz folder',
+ deleteFolder: 'Usuń folder',
+ editFolder: 'Edytuj folder',
+ },
+ descriptions: {
+ editorDefault: 'Folder na powiązane zestawy.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'To przeniesie "{{name}}" do Kosza. Możesz przywrócić go później.',
+ deleteFolderFallbackDescription: 'To przeniesie ten folder do Kosza. Możesz przywrócić go później.',
+ deleteFolderFallbackTitle: 'Usunąć folder?',
+ deleteFolderTitle: 'Usunąć "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Brak wyników w tym folderze',
+ noMatchesInFolderDescription: 'Żaden folder, zestaw ani notatka nie pasuje do "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Nie udało się utworzyć folderu',
+ couldNotDeleteFolder: 'Nie udało się usunąć folderu',
+ couldNotLoadFolderPath: 'Nie udało się załadować ścieżki folderu',
+ couldNotSaveFolder: 'Nie udało się zapisać folderu',
+ folderCouldNotLoad: 'Nie udało się załadować folderu',
+ },
+ fields: {
+ descriptionLabel: 'Opis folderu',
+ descriptionPlaceholder: 'Co należy do tego folderu?',
+ namePlaceholder: 'Nazwa folderu',
+ untitledFolder: 'Folder bez tytułu',
+ },
+ labels: {
+ createFolderTitle: 'Utwórz folder',
+ folder: 'Folder',
+ folders: 'Foldery',
+ loadingFolder: 'Ładowanie folderu',
+ name: 'Nazwa',
+ updated: 'Zaktualizowano',
+ },
+ sort: {
+ ariaLabel: 'Sortuj foldery',
+ name: 'Nazwa',
+ updated: 'Zaktualizowano',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Jeśli dane lokalne i zsynchronizowane będą się różnić, element pojawi się tutaj.',
+ heading: 'Status synchronizacji',
+ title: 'Konflikty',
+ noConflicts: 'Nie znaleziono konfliktów',
+ },
+ labels: {
+ menu: 'Menu',
+ },
+ sections: {
+ settings: {
+ description: 'Dostosuj środowisko i preferencje',
+ title: 'Ustawienia',
+ },
+ trash: {
+ description: 'Przywróć lub trwale usuń usunięte elementy',
+ title: 'Kosz',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Zamknij edytor',
+ openActions: 'Otwórz działania',
+ openWorkspaces: 'Otwórz obszary robocze',
+ },
+ items: {
+ home: 'Start',
+ menu: 'Menu',
+ primary: 'Główne',
+ settings: 'Ustawienia',
+ spaces: 'Obszary',
+ trash: 'Kosz',
+ workspaces: 'Obszary robocze',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Dodaj cloze',
+ deleteNote: 'Usuń notatkę',
+ editNote: 'Edytuj notatkę',
+ hideDerivedCardsNote: 'Ukryj notatkę o kartach pochodnych',
+ openNote: 'Otwórz {{title}}',
+ saveNote: 'Zapisz notatkę',
+ showDerivedCardsNote: 'Pokaż notatkę o kartach pochodnych',
+ },
+ descriptions: {
+ clozeFormat: 'Każdy ukryty fragment stanie się kartą do powtórki po zapisaniu.',
+ clozeFormatPrefix: 'Otocz ukryty tekst za pomocą',
+ derivedCardsHelper: 'Notatki są źródłem prawdy dla kart pochodnych.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'To przeniesie "{{title}}" do Kosza. Możesz przywrócić ją później.',
+ deleteNoteFallbackDescription: 'To przeniesie tę notatkę do Kosza. Możesz przywrócić ją później.',
+ deleteNoteFallbackTitle: 'Usunąć notatkę?',
+ deleteNoteTitle: 'Usunąć "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Nie udało się utworzyć notatki',
+ couldNotDeleteNote: 'Nie udało się usunąć notatki',
+ couldNotSaveNote: 'Nie udało się zapisać notatki',
+ noteCouldNotLoad: 'Nie udało się załadować notatki',
+ },
+ fields: {
+ back: 'Tył',
+ backPlaceholder: 'Wpisz tylną stronę',
+ bodyPlaceholder: 'Napisz treść notatki z lukami cloze…',
+ front: 'Przód',
+ frontPlaceholder: 'Wpisz przednią stronę',
+ noteBody: 'Treść notatki',
+ title: 'Tytuł',
+ titlePlaceholder: 'Dodaj tytuł notatki',
+ untitledCloze: 'Cloze bez tytułu',
+ untitledNote: 'Notatka bez tytułu',
+ },
+ labels: {
+ backUppercase: 'TYŁ',
+ basic: 'Podstawowa',
+ basicLower: 'podstawowa',
+ basicUppercase: 'PODSTAWOWA',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Format cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Zestaw',
+ derivedCards: 'KARTY POCHODNE',
+ due: 'Do powtórki',
+ frontUppercase: 'PRZÓD',
+ inProgress: 'W toku',
+ inProgressUppercase: 'W TOKU',
+ loadingNote: 'Ładowanie notatki',
+ loadingNoteEditor: 'Ładowanie edytora notatek',
+ markdownFormatting: 'Formatowanie Markdown',
+ mastered: 'Opanowane',
+ masteredUppercase: 'OPANOWANE',
+ newNote: 'Nowa notatka',
+ noteBody: 'TREŚĆ NOTATKI',
+ noteContent: 'Zawartość notatki',
+ noteDetails: 'Szczegóły notatki',
+ noteMetadata: 'Metadane notatki',
+ noteType: 'Typ notatki',
+ notes: 'Notatki',
+ reviewed: 'Powtórzono',
+ studyProgress: 'Postęp nauki',
+ studyProgressUppercase: 'POSTĘP NAUKI',
+ titleUppercase: 'TYTUŁ',
+ updated: 'Zaktualizowano',
+ },
+ sort: {
+ ariaLabel: 'Sortuj notatki',
+ title: 'Tytuł',
+ updated: 'Zaktualizowano',
+ },
+ toolbar: {
+ bold: 'Pogrubienie',
+ italic: 'Kursywa',
+ link: 'Link',
+ list: 'Lista',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Znowu',
+ backToDeck: 'Wróć do zestawu',
+ continueReview: 'Kontynuuj powtórkę',
+ easy: 'Łatwe',
+ good: 'Dobrze',
+ hard: 'Trudne',
+ newNote: 'Nowa notatka',
+ showAnswer: 'Pokaż odpowiedź',
+ },
+ errors: {
+ couldNotGradeCard: 'Nie udało się ocenić karty',
+ reviewCouldNotLoad: 'Nie udało się załadować powtórki',
+ reviewCouldNotStart: 'Nie udało się rozpocząć powtórki',
+ summaryCouldNotLoad: 'Nie udało się załadować podsumowania powtórki',
+ summaryNotAvailable: 'Podsumowanie powtórki jest niedostępne',
+ summaryNotComplete: 'Ta powtórka nie jest jeszcze ukończona.',
+ },
+ labels: {
+ cardsReviewed: 'Powtórzone karty',
+ deck: 'Zestaw',
+ duration: 'Czas trwania',
+ loadingReview: 'Ładowanie powtórki',
+ loadingSummary: 'Ładowanie podsumowania',
+ progress: 'Postęp powtórki',
+ review: 'Powtórka',
+ reviewComplete: 'Powtórka ukończona',
+ reviewed_one: 'Powtórzono {{count}}',
+ reviewed_few: 'Powtórzono {{count}}',
+ reviewed_many: 'Powtórzono {{count}}',
+ reviewed_other: 'Powtórzono {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} godz. {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Twój postęp został zapisany w tym zestawie.',
+ },
+ unavailable: {
+ description: 'Dodaj notatkę, aby ten zestaw mógł trafić do kolejki powtórek.',
+ title: 'Brak kart do powtórki',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Wyczyść wyszukiwanie',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Brak wyników w tym obszarze roboczym',
+ noMatchesInWorkspaceDescription: 'Żaden folder, zestaw ani notatka nie pasuje do "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Nie udało się ukończyć wyszukiwania',
+ },
+ labels: {
+ results: 'Wyniki wyszukiwania',
+ resultsFor: 'Wyniki dla "{{query}}"',
+ searchingContent: 'Wyszukiwanie treści',
+ },
+ resultGroups: {
+ deck: 'Zestawy',
+ folder: 'Foldery',
+ note: 'Notatki',
+ },
+ resultKinds: {
+ deck: 'zestaw',
+ folder: 'folder',
+ note: 'notatka',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Resetuj wszystkie ustawienia',
+ resetSettings: 'Resetuj ustawienia',
+ resetToDefaults: 'Przywróć domyślne',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Wklej prawidłowy JSON z 21 wartościami liczbowymi.',
+ fsrsErrorInvalidParams_one: 'Wpisz tablicę JSON z dokładnie {{count}} skończoną liczbą.',
+ fsrsErrorInvalidParams_few: 'Wpisz tablicę JSON z dokładnie {{count}} skończonymi liczbami.',
+ fsrsErrorInvalidParams_many: 'Wpisz tablicę JSON z dokładnie {{count}} skończonymi liczbami.',
+ fsrsErrorInvalidParams_other: 'Wpisz tablicę JSON z dokładnie {{count}} skończonej liczby.',
+ fsrsHelper: 'To ustawienie eksperckie. Wartości muszą pozostać w kolejności.',
+ fsrsJsonLabel: 'JSON parametrów FSRS',
+ fsrsTitle: 'Edytuj parametry FSRS',
+ fsrsDescription: 'Wklej tablicę JSON z 21 liczbami, aby nadpisać wagi scheduler.',
+ resetDescription: 'To przywróci strefę czasową, limity nauki i ustawienia FSRS.',
+ resetDescriptionWithLanguage: 'To przywróci język, strefę czasową, limity nauki i ustawienia FSRS.',
+ resetTitle: 'Zresetować wszystkie ustawienia?',
+ timezoneDescription: 'Szukaj miasta lub identyfikatora strefy czasowej.',
+ timezoneSearchLabel: 'Szukaj stref czasowych',
+ timezoneSearchPlaceholder: 'Szukaj stref czasowych…',
+ timezoneTitle: 'Wybierz strefę czasową',
+ },
+ errors: {
+ couldNotResetSettings: 'Nie udało się zresetować ustawień',
+ couldNotSaveSettings: 'Nie udało się zapisać ustawień',
+ settingsCouldNotLoad: 'Nie udało się załadować ustawień',
+ settingsUnavailable: 'Ustawienia są niedostępne.',
+ },
+ labels: {
+ appearance: 'Wygląd',
+ automatic: 'Automatycznie',
+ fsrsParameters: 'Parametry FSRS',
+ general: 'Ogólne',
+ language: 'Język',
+ loadingSettings: 'Ładowanie ustawień',
+ masteryHorizon: 'Horyzont opanowania',
+ newCardOrder: 'Kolejność nowych kart',
+ newCardsPerDay: 'Nowe karty dziennie',
+ reviewCardsPerDay: 'Karty do powtórki dziennie',
+ savingSettings: 'Zapisywanie ustawień',
+ schedule: 'Harmonogram',
+ searchNoTimezones: 'Brak pasujących stref czasowych.',
+ settings: 'Ustawienia',
+ settingsReset: 'Ustawienia zresetowane',
+ study: 'Nauka',
+ targetRecallProbability: 'Docelowe prawdopodobieństwo przypomnienia',
+ theme: 'Motyw',
+ timezone: 'Strefa czasowa',
+ },
+ options: {
+ languageEnUs: 'Angielski (USA)',
+ newCardsAfterReviews: 'Po powtórkach',
+ newCardsBeforeReviews: 'Przed powtórkami',
+ newCardsMixed: 'Mieszane',
+ themeDark: 'Ciemny',
+ themeLight: 'Jasny',
+ themeSystem: 'Systemowy',
+ timezoneSystem: 'Użyj systemowej strefy czasowej',
+ },
+ rows: {
+ fsrsDescription: 'Wagi modelu eksperckiego',
+ languageDescription: 'Język interfejsu',
+ masteryHorizonDescription: 'Liczba dni, przez które karta musi pozostać możliwa do przypomnienia na poziomie docelowego prawdopodobieństwa lub wyżej, aby została uznana za opanowaną',
+ newCardOrderDescription: 'Kolejność nowych kart względem powtórek',
+ newCardsPerDayDescription: 'Maksymalna liczba nowych kart dziennie',
+ reviewCardsPerDayDescription: 'Maksymalna liczba kart do powtórki dziennie',
+ targetRecallProbabilityDescription: 'Minimalne prawdopodobieństwo przypomnienia przy następnej zaplanowanej powtórce',
+ timezoneDescription: 'Użyj automatycznej strefy czasowej lub wybierz miasto.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Usuń trwale',
+ empty: 'Opróżnij',
+ emptyTrash: 'Opróżnij kosz',
+ restore: 'Przywróć',
+ restoringItem: 'Przywracanie {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'To trwale usunie "{{title}}". Tej czynności nie można cofnąć.',
+ deleteItemFallbackDescription: 'To trwale usunie ten element. Tej czynności nie można cofnąć.',
+ deleteItemFallbackTitle: 'Usunąć element?',
+ deleteItemTitle: 'Usunąć "{{title}}"?',
+ emptyTrashDescription: 'To trwale usunie wszystko z Kosza. Tej czynności nie można cofnąć.',
+ emptyTrashTitle: 'Opróżnić kosz?',
+ },
+ empty: {
+ description: 'Usunięte elementy pojawią się tutaj przed trwałym usunięciem.',
+ title: 'Kosz jest pusty',
+ },
+ errors: {
+ couldNotDeleteItem: 'Nie udało się usunąć elementu',
+ couldNotEmptyTrash: 'Nie udało się opróżnić Kosza',
+ couldNotRestoreItem: 'Nie udało się przywrócić elementu',
+ trashCouldNotLoad: 'Nie udało się załadować Kosza',
+ trashMayBeOutOfDate: 'Kosz może być nieaktualny',
+ },
+ labels: {
+ deletedAge: 'Usunięto {{value}}',
+ itemCount_one: '{{count}} element',
+ itemCount_few: '{{count}} elementy',
+ itemCount_many: '{{count}} elementów',
+ itemCount_other: '{{count}} elementu',
+ lastEmptied: 'Ostatnio opróżniono {{value}}',
+ loadingTrash: 'Ładowanie Kosza',
+ originalLocation: 'Oryginalna lokalizacja: {{location}}',
+ title: 'Kosz',
+ trashActions: 'Działania kosza dla {{title}}',
+ },
+ kinds: {
+ deck: 'Zestaw',
+ folder: 'Folder',
+ note: 'Notatka',
+ workspace: 'Obszar roboczy',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Utwórz obszar roboczy',
+ deleteWorkspace: 'Usuń obszar roboczy',
+ editWorkspace: 'Edytuj obszar roboczy',
+ newWorkspace: 'Nowy obszar roboczy',
+ openWorkspace: 'Otwórz {{title}}',
+ openingWorkspace: 'Otwieranie {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Kontekst nauki.',
+ editorVisual: 'Wybierz wizualny punkt odniesienia dla tego obszaru roboczego.',
+ emptyList: 'Oddziel zestawy, notatki i kolejki powtórek według kontekstu nauki.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'To przeniesie "{{title}}" do Kosza. Możesz przywrócić go później.',
+ deleteWorkspaceFallbackDescription: 'To przeniesie ten obszar roboczy do Kosza. Możesz przywrócić go później.',
+ deleteWorkspaceFallbackTitle: 'Usunąć obszar roboczy?',
+ deleteWorkspaceTitle: 'Usunąć "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Zacznij od obszaru roboczego',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Nie udało się utworzyć obszaru roboczego',
+ couldNotDeleteWorkspace: 'Nie udało się usunąć obszaru roboczego',
+ couldNotOpenWorkspace: 'Nie udało się otworzyć obszaru roboczego',
+ couldNotSaveWorkspace: 'Nie udało się zapisać obszaru roboczego',
+ workspaceCouldNotLoad: 'Nie udało się załadować obszaru roboczego',
+ workspacesCouldNotLoad: 'Nie udało się załadować obszarów roboczych',
+ },
+ fields: {
+ descriptionLabel: 'Opis obszaru roboczego',
+ descriptionPlaceholder: 'Co należy do tego obszaru roboczego?',
+ namePlaceholder: 'Nazwa obszaru roboczego',
+ untitledWorkspace: 'Obszar roboczy bez tytułu',
+ },
+ labels: {
+ createWorkspaceTitle: 'Utwórz obszar roboczy',
+ loadingWorkspaces: 'Ładowanie obszarów roboczych',
+ workspace: 'Obszar roboczy',
+ workspaces: 'Obszary robocze',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/pt-BR.ts b/ui/src/core/i18n/resources/pt-BR.ts
new file mode 100644
index 0000000..6899753
--- /dev/null
+++ b/ui/src/core/i18n/resources/pt-BR.ts
@@ -0,0 +1,623 @@
+export const ptBR = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Tente novamente. Se isso continuar acontecendo, reabra o Clear.',
+ title: 'Não foi possível iniciar',
+ },
+ loadingTitle: 'Preparando seu espaço de estudo',
+ },
+ common: {
+ actions: {
+ back: 'Voltar',
+ cancel: 'Cancelar',
+ checkAgain: 'Verificar novamente',
+ close: 'Fechar',
+ create: 'Criar',
+ delete: 'Excluir',
+ dismissError: 'Dispensar erro',
+ dismissStatus: 'Dispensar status',
+ edit: 'Editar',
+ itemActions: 'Ações de {{title}}',
+ reset: 'Redefinir',
+ review: 'Revisar',
+ save: 'Salvar',
+ saveChanges: 'Salvar alterações',
+ tryAgain: 'Tentar novamente',
+ },
+ labels: {
+ active: 'Ativo',
+ clear: 'Clear',
+ custom: 'Personalizado',
+ default: 'Padrão',
+ loadingEditor: 'Carregando editor',
+ name: 'Nome',
+ completedTask: 'Tarefa concluída',
+ description: 'Descrição',
+ incompleteTask: 'Tarefa incompleta',
+ percentageInput: 'Percentual de {{label}}',
+ visual: 'Visual',
+ },
+ status: {
+ actionFailed: 'A ação falhou',
+ actionInProgress: 'Ação em andamento',
+ },
+ sort: {
+ ascending: 'Asc',
+ column: 'Coluna',
+ descending: 'Desc',
+ direction: 'Direção',
+ sort: 'Ordenar',
+ },
+ search: {
+ label: 'Pesquisar',
+ },
+ visualPicker: {
+ allLucideIcons: 'Todos os ícones do Lucide',
+ browseIconsFor: 'Explore ou pesquise ícones para {{label}}.',
+ chooseIcon: 'Escolher ícone',
+ iconPicker: 'Seletor de ícones de {{label}}',
+ iconSearch: 'Pesquisa de ícones de {{label}}',
+ iconsCouldNotLoad: 'Não foi possível carregar os ícones.',
+ loadingIcons: 'Carregando ícones',
+ loadingMoreIcons: 'Carregando mais ícones',
+ moreIcons: 'Mais ícones',
+ noIconsMatch: 'Nenhum ícone corresponde a "{{query}}".',
+ searchIconsPlaceholder: 'Pesquisar ícones…',
+ selectedIcon: '{{label}} selecionado',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Criar',
+ newDeck: 'Novo baralho',
+ newFolder: 'Nova pasta',
+ },
+ descriptions: {
+ defaultWorkspace: 'Mantenha baralhos, pastas e notas juntos.',
+ emptyWorkspace: 'Crie um baralho e depois adicione notas para montar sua fila de revisão.',
+ emptyFolder: 'Crie um baralho e depois adicione notas para montar uma fila de revisão.',
+ searchPlaceholder: 'Pesquisar pastas, baralhos e notas…',
+ },
+ empty: {
+ createFirstDeck: 'Crie seu primeiro baralho',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Não foi possível excluir o baralho',
+ couldNotDeleteFolder: 'Não foi possível excluir a pasta',
+ couldNotDeleteWorkspace: 'Não foi possível excluir o espaço de trabalho',
+ dashboardCouldNotOpen: 'Não foi possível abrir o painel',
+ decksCouldNotLoad: 'Não foi possível carregar os baralhos',
+ decksMayBeOutOfDate: 'Os baralhos podem estar desatualizados',
+ foldersCouldNotLoad: 'Não foi possível carregar as pastas',
+ foldersMayBeOutOfDate: 'As pastas podem estar desatualizadas',
+ workspaceCouldNotLoad: 'Não foi possível carregar o espaço de trabalho',
+ },
+ labels: {
+ dashboard: 'Painel',
+ loadingDashboard: 'Carregando painel',
+ newItem: 'Novo item',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Data indisponível',
+ },
+ age: {
+ dayAgo_one: 'há {{count}} dia',
+ dayAgo_other: 'há {{count}} dias',
+ hourAgo_one: 'há {{count}} hora',
+ hourAgo_other: 'há {{count}} horas',
+ justNow: 'agora mesmo',
+ minuteAgo_one: 'há {{count}} minuto',
+ minuteAgo_other: 'há {{count}} minutos',
+ unavailable: 'data indisponível',
+ weekAgo_one: 'há {{count}} semana',
+ weekAgo_other: 'há {{count}} semanas',
+ },
+ labels: {
+ deleted: 'Excluído {{value}}',
+ due: 'Vence: {{value}}',
+ reviewed: 'Revisado: {{value}}',
+ updated: 'Atualizado {{value}}',
+ updatedUppercase: 'ATUALIZADO {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'há {{count}} dia',
+ dayAgo_other: 'há {{count}} dias',
+ inAMoment: 'Em instantes',
+ inDay_one: 'Em {{count}} dia',
+ inDay_other: 'Em {{count}} dias',
+ inMonth_one: 'Em {{count}} mês',
+ inMonth_other: 'Em {{count}} meses',
+ inWeek_one: 'Em {{count}} semana',
+ inWeek_other: 'Em {{count}} semanas',
+ justNow: 'Agora mesmo',
+ monthAgo_one: 'há {{count}} mês',
+ monthAgo_other: 'há {{count}} meses',
+ secondsAgoShort: 'há {{count}} s',
+ minutesAgoShort: 'há {{count}} min',
+ hoursAgoShort: 'há {{count}} h',
+ today: 'Hoje',
+ tomorrow: 'Amanhã',
+ weekAgo_one: 'há {{count}} semana',
+ weekAgo_other: 'há {{count}} semanas',
+ yesterday: 'Ontem',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Ações de {{title}}',
+ createDeck: 'Criar baralho',
+ createNote: 'Criar nota',
+ deleteDeck: 'Excluir baralho',
+ editDeck: 'Editar baralho',
+ newNote: 'Nova nota',
+ openDeck: 'Abrir baralho {{title}}',
+ saveDeck: 'Não foi possível salvar o baralho',
+ studyNow: 'Estudar agora',
+ },
+ descriptions: {
+ emptyDeck: 'Adicione uma nota para que este baralho tenha material para revisão.',
+ editorDefault: 'Baralho de estudo focado.',
+ editorVisual: 'Escolha um glifo de capa para este baralho.',
+ notesSearchPlaceholder: 'Pesquisar notas…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Isso move "{{title}}" para a Lixeira. Você pode restaurá-lo depois.',
+ deleteDeckFallbackDescription: 'Isso move este baralho para a Lixeira. Você pode restaurá-lo depois.',
+ deleteDeckFallbackTitle: 'Excluir baralho?',
+ deleteDeckTitle: 'Excluir "{{title}}"?',
+ deleteNoteDescription: 'Isso move "{{title}}" para a Lixeira. Você pode restaurá-la depois.',
+ deleteNoteFallbackTitle: 'Excluir nota?',
+ deleteNoteTitle: 'Excluir "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Nenhuma nota correspondente',
+ noMatchingNotesDescription: 'Nenhuma nota correspondeu a "{{query}}".',
+ thisDeckIsEmpty: 'Este baralho está vazio',
+ },
+ errors: {
+ couldNotCreateDeck: 'Não foi possível criar o baralho',
+ couldNotDeleteDeck: 'Não foi possível excluir o baralho',
+ couldNotDeleteNote: 'Não foi possível excluir a nota',
+ couldNotLoadFolderPath: 'Não foi possível carregar o caminho da pasta',
+ couldNotSaveDeck: 'Não foi possível salvar o baralho',
+ deckCouldNotLoad: 'Não foi possível carregar o baralho',
+ notesCouldNotLoad: 'Não foi possível carregar as notas',
+ notesMayBeOutOfDate: 'As notas podem estar desatualizadas',
+ },
+ fields: {
+ descriptionLabel: 'Descrição do baralho',
+ descriptionPlaceholder: 'O que este baralho vai ajudar você a revisar?',
+ namePlaceholder: 'Nome do baralho',
+ untitledDeck: 'Baralho sem título',
+ untitledDeckLower: 'baralho sem título',
+ },
+ labels: {
+ createDeckTitle: 'Criar baralho',
+ deck: 'Baralho',
+ deckNotesSearch: 'Pesquisa de notas do baralho',
+ deckOverview: 'Visão geral do baralho',
+ decks: 'Baralhos',
+ due: 'Vence',
+ dueToday: 'Vence hoje',
+ loadingDeck: 'Carregando baralho',
+ mastery: 'Domínio',
+ notes: 'Notas',
+ },
+ sort: {
+ ariaLabel: 'Ordenar baralhos',
+ dueToday: 'Vence hoje',
+ title: 'Título',
+ updated: 'Atualizado',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Os dados mudaram. Atualize e tente novamente.',
+ forbidden: 'Você não tem permissão para fazer isso.',
+ notFound: 'Não encontramos este item.',
+ offline: 'Não é possível acessar o serviço.',
+ timeout: 'Isso demorou demais. Tente novamente.',
+ unauthorized: 'Entre para continuar.',
+ unavailable: 'O serviço está temporariamente indisponível.',
+ },
+ fallback: {
+ unexpected: 'Erro inesperado',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Criar pasta',
+ deleteFolder: 'Excluir pasta',
+ editFolder: 'Editar pasta',
+ },
+ descriptions: {
+ editorDefault: 'Pasta para baralhos relacionados.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Isso move "{{name}}" para a Lixeira. Você pode restaurá-la depois.',
+ deleteFolderFallbackDescription: 'Isso move esta pasta para a Lixeira. Você pode restaurá-la depois.',
+ deleteFolderFallbackTitle: 'Excluir pasta?',
+ deleteFolderTitle: 'Excluir "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Nenhuma correspondência nesta pasta',
+ noMatchesInFolderDescription: 'Nenhuma pasta, baralho ou nota correspondeu a "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Não foi possível criar a pasta',
+ couldNotDeleteFolder: 'Não foi possível excluir a pasta',
+ couldNotLoadFolderPath: 'Não foi possível carregar o caminho da pasta',
+ couldNotSaveFolder: 'Não foi possível salvar a pasta',
+ folderCouldNotLoad: 'Não foi possível carregar a pasta',
+ },
+ fields: {
+ descriptionLabel: 'Descrição da pasta',
+ descriptionPlaceholder: 'O que pertence a esta pasta?',
+ namePlaceholder: 'Nome da pasta',
+ untitledFolder: 'Pasta sem título',
+ },
+ labels: {
+ createFolderTitle: 'Criar pasta',
+ folder: 'Pasta',
+ folders: 'Pastas',
+ loadingFolder: 'Carregando pasta',
+ name: 'Nome',
+ updated: 'Atualizado',
+ },
+ sort: {
+ ariaLabel: 'Ordenar pastas',
+ name: 'Nome',
+ updated: 'Atualizado',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Se os dados locais e sincronizados discordarem, o item aparecerá aqui.',
+ heading: 'Status de sincronização',
+ title: 'Conflitos',
+ noConflicts: 'Nenhum conflito encontrado',
+ },
+ labels: {
+ menu: 'Menu',
+ },
+ sections: {
+ settings: {
+ description: 'Personalize seu ambiente e suas preferências',
+ title: 'Configurações',
+ },
+ trash: {
+ description: 'Restaure ou exclua permanentemente itens removidos',
+ title: 'Lixeira',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Fechar editor',
+ openActions: 'Abrir ações',
+ openWorkspaces: 'Abrir espaços de trabalho',
+ },
+ items: {
+ home: 'Início',
+ menu: 'Menu',
+ primary: 'Principal',
+ settings: 'Configurações',
+ spaces: 'Espaços',
+ trash: 'Lixeira',
+ workspaces: 'Espaços de trabalho',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Adicionar cloze',
+ deleteNote: 'Excluir nota',
+ editNote: 'Editar nota',
+ hideDerivedCardsNote: 'Ocultar nota de cartões derivados',
+ openNote: 'Abrir {{title}}',
+ saveNote: 'Salvar nota',
+ showDerivedCardsNote: 'Mostrar nota de cartões derivados',
+ },
+ descriptions: {
+ clozeFormat: 'Cada parte oculta vira um cartão de revisão quando você salva.',
+ clozeFormatPrefix: 'Envolva o texto oculto com',
+ derivedCardsHelper: 'As notas são a fonte da verdade para cartões derivados.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Isso move "{{title}}" para a Lixeira. Você pode restaurá-la depois.',
+ deleteNoteFallbackDescription: 'Isso move esta nota para a Lixeira. Você pode restaurá-la depois.',
+ deleteNoteFallbackTitle: 'Excluir nota?',
+ deleteNoteTitle: 'Excluir "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Não foi possível criar a nota',
+ couldNotDeleteNote: 'Não foi possível excluir a nota',
+ couldNotSaveNote: 'Não foi possível salvar a nota',
+ noteCouldNotLoad: 'Não foi possível carregar a nota',
+ },
+ fields: {
+ back: 'Verso',
+ backPlaceholder: 'Digite o verso',
+ bodyPlaceholder: 'Escreva o corpo da nota com cloze deletions…',
+ front: 'Frente',
+ frontPlaceholder: 'Digite a frente',
+ noteBody: 'Corpo da nota',
+ title: 'Título',
+ titlePlaceholder: 'Adicione um título à nota',
+ untitledCloze: 'Cloze sem título',
+ untitledNote: 'Nota sem título',
+ },
+ labels: {
+ backUppercase: 'VERSO',
+ basic: 'Básica',
+ basicLower: 'básica',
+ basicUppercase: 'BÁSICA',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Formato cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Baralho',
+ derivedCards: 'CARTÕES DERIVADOS',
+ due: 'Vence',
+ frontUppercase: 'FRENTE',
+ inProgress: 'Em andamento',
+ inProgressUppercase: 'EM ANDAMENTO',
+ loadingNote: 'Carregando nota',
+ loadingNoteEditor: 'Carregando editor de notas',
+ markdownFormatting: 'Formatação Markdown',
+ mastered: 'Dominado',
+ masteredUppercase: 'DOMINADO',
+ newNote: 'Nova nota',
+ noteBody: 'CORPO DA NOTA',
+ noteContent: 'Conteúdo da nota',
+ noteDetails: 'Detalhes da nota',
+ noteMetadata: 'Metadados da nota',
+ noteType: 'Tipo de nota',
+ notes: 'Notas',
+ reviewed: 'Revisado',
+ studyProgress: 'Progresso de estudo',
+ studyProgressUppercase: 'PROGRESSO DE ESTUDO',
+ titleUppercase: 'TÍTULO',
+ updated: 'Atualizado',
+ },
+ sort: {
+ ariaLabel: 'Ordenar notas',
+ title: 'Título',
+ updated: 'Atualizado',
+ },
+ toolbar: {
+ bold: 'Negrito',
+ italic: 'Itálico',
+ link: 'Link',
+ list: 'Lista',
+ },
+ },
+ review: {
+ actions: {
+ again: 'De novo',
+ backToDeck: 'Voltar ao baralho',
+ continueReview: 'Continuar revisão',
+ easy: 'Fácil',
+ good: 'Bom',
+ hard: 'Difícil',
+ newNote: 'Nova nota',
+ showAnswer: 'Mostrar resposta',
+ },
+ errors: {
+ couldNotGradeCard: 'Não foi possível avaliar o cartão',
+ reviewCouldNotLoad: 'Não foi possível carregar a revisão',
+ reviewCouldNotStart: 'Não foi possível iniciar a revisão',
+ summaryCouldNotLoad: 'Não foi possível carregar o resumo da revisão',
+ summaryNotAvailable: 'O resumo da revisão não está disponível',
+ summaryNotComplete: 'Esta revisão ainda não foi concluída.',
+ },
+ labels: {
+ cardsReviewed: 'Cartões revisados',
+ deck: 'Baralho',
+ duration: 'Duração',
+ loadingReview: 'Carregando revisão',
+ loadingSummary: 'Carregando resumo',
+ progress: 'Progresso da revisão',
+ review: 'Revisão',
+ reviewComplete: 'Revisão concluída',
+ reviewed_one: '{{count}} revisado',
+ reviewed_other: '{{count}} revisados',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Seu progresso foi salvo neste baralho.',
+ },
+ unavailable: {
+ description: 'Adicione uma nota para que este baralho possa entrar na fila de revisão.',
+ title: 'Nenhum cartão para revisar',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Limpar pesquisa',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Nenhuma correspondência neste espaço de trabalho',
+ noMatchesInWorkspaceDescription: 'Nenhuma pasta, baralho ou nota correspondeu a "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Não foi possível concluir a pesquisa',
+ },
+ labels: {
+ results: 'Resultados da pesquisa',
+ resultsFor: 'Resultados para "{{query}}"',
+ searchingContent: 'Pesquisando conteúdo',
+ },
+ resultGroups: {
+ deck: 'Baralhos',
+ folder: 'Pastas',
+ note: 'Notas',
+ },
+ resultKinds: {
+ deck: 'baralho',
+ folder: 'pasta',
+ note: 'nota',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Redefinir todas as configurações',
+ resetSettings: 'Redefinir configurações',
+ resetToDefaults: 'Restaurar padrões',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Cole um JSON válido com 21 valores numéricos.',
+ fsrsErrorInvalidParams_one: 'Insira um array JSON com exatamente {{count}} número finito.',
+ fsrsErrorInvalidParams_other: 'Insira um array JSON com exatamente {{count}} números finitos.',
+ fsrsHelper: 'Esta é uma substituição avançada. Os valores devem permanecer em ordem.',
+ fsrsJsonLabel: 'JSON de parâmetros FSRS',
+ fsrsTitle: 'Editar parâmetros FSRS',
+ fsrsDescription: 'Cole um array JSON com 21 números para substituir os pesos do scheduler.',
+ resetDescription: 'Isso restaura fuso horário, limites de estudo e configurações de FSRS.',
+ resetDescriptionWithLanguage: 'Isso restaura idioma, fuso horário, limites de estudo e configurações de FSRS.',
+ resetTitle: 'Redefinir todas as configurações?',
+ timezoneDescription: 'Pesquise uma cidade ou identificador de fuso horário.',
+ timezoneSearchLabel: 'Pesquisar fusos horários',
+ timezoneSearchPlaceholder: 'Pesquisar fusos horários…',
+ timezoneTitle: 'Escolher fuso horário',
+ },
+ errors: {
+ couldNotResetSettings: 'Não foi possível redefinir as configurações',
+ couldNotSaveSettings: 'Não foi possível salvar as configurações',
+ settingsCouldNotLoad: 'Não foi possível carregar as configurações',
+ settingsUnavailable: 'As configurações estão indisponíveis.',
+ },
+ labels: {
+ appearance: 'Aparência',
+ automatic: 'Automático',
+ fsrsParameters: 'Parâmetros FSRS',
+ general: 'Geral',
+ language: 'Idioma',
+ loadingSettings: 'Carregando configurações',
+ masteryHorizon: 'Horizonte de domínio',
+ newCardOrder: 'Ordem de cartões novos',
+ newCardsPerDay: 'Cartões novos por dia',
+ reviewCardsPerDay: 'Cartões de revisão por dia',
+ savingSettings: 'Salvando configurações',
+ schedule: 'Agenda',
+ searchNoTimezones: 'Nenhum fuso horário correspondente.',
+ settings: 'Configurações',
+ settingsReset: 'Configurações redefinidas',
+ study: 'Estudo',
+ targetRecallProbability: 'Probabilidade-alvo de lembrança',
+ theme: 'Tema',
+ timezone: 'Fuso horário',
+ },
+ options: {
+ languageEnUs: 'Inglês (EUA)',
+ newCardsAfterReviews: 'Depois das revisões',
+ newCardsBeforeReviews: 'Antes das revisões',
+ newCardsMixed: 'Misturados',
+ themeDark: 'Escuro',
+ themeLight: 'Claro',
+ themeSystem: 'Sistema',
+ timezoneSystem: 'Usar fuso horário do sistema',
+ },
+ rows: {
+ fsrsDescription: 'Pesos do modelo avançado',
+ languageDescription: 'Idioma da interface',
+ masteryHorizonDescription: 'Dias em que um cartão deve permanecer recuperável no alvo ou acima dele para contar como dominado',
+ newCardOrderDescription: 'Ordem dos cartões novos em relação às revisões',
+ newCardsPerDayDescription: 'Máximo de cartões novos por dia',
+ reviewCardsPerDayDescription: 'Máximo de cartões de revisão por dia',
+ targetRecallProbabilityDescription: 'Probabilidade mínima de lembrança na próxima revisão agendada',
+ timezoneDescription: 'Use o fuso horário automático ou escolha uma cidade.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Excluir permanentemente',
+ empty: 'Esvaziar',
+ emptyTrash: 'Esvaziar lixeira',
+ restore: 'Restaurar',
+ restoringItem: 'Restaurando {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Isso exclui "{{title}}" permanentemente. Não é possível desfazer.',
+ deleteItemFallbackDescription: 'Isso exclui este item permanentemente. Não é possível desfazer.',
+ deleteItemFallbackTitle: 'Excluir item?',
+ deleteItemTitle: 'Excluir "{{title}}"?',
+ emptyTrashDescription: 'Isso exclui permanentemente tudo na Lixeira. Não é possível desfazer.',
+ emptyTrashTitle: 'Esvaziar lixeira?',
+ },
+ empty: {
+ description: 'Os itens que você excluir aparecerão aqui antes da remoção permanente.',
+ title: 'A Lixeira está vazia',
+ },
+ errors: {
+ couldNotDeleteItem: 'Não foi possível excluir o item',
+ couldNotEmptyTrash: 'Não foi possível esvaziar a Lixeira',
+ couldNotRestoreItem: 'Não foi possível restaurar o item',
+ trashCouldNotLoad: 'Não foi possível carregar a Lixeira',
+ trashMayBeOutOfDate: 'A Lixeira pode estar desatualizada',
+ },
+ labels: {
+ deletedAge: 'Excluído {{value}}',
+ itemCount_one: '{{count}} item',
+ itemCount_other: '{{count}} itens',
+ lastEmptied: 'Esvaziada pela última vez {{value}}',
+ loadingTrash: 'Carregando Lixeira',
+ originalLocation: 'Local original: {{location}}',
+ title: 'Lixeira',
+ trashActions: 'Ações de lixeira de {{title}}',
+ },
+ kinds: {
+ deck: 'Baralho',
+ folder: 'Pasta',
+ note: 'Nota',
+ workspace: 'Espaço de trabalho',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Criar espaço de trabalho',
+ deleteWorkspace: 'Excluir espaço de trabalho',
+ editWorkspace: 'Editar espaço de trabalho',
+ newWorkspace: 'Novo espaço de trabalho',
+ openWorkspace: 'Abrir {{title}}',
+ openingWorkspace: 'Abrindo {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Contexto de estudo.',
+ editorVisual: 'Escolha uma âncora visual para este espaço de trabalho.',
+ emptyList: 'Separe baralhos, notas e filas de revisão por contexto de estudo.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Isso move "{{title}}" para a Lixeira. Você pode restaurá-lo depois.',
+ deleteWorkspaceFallbackDescription: 'Isso move este espaço de trabalho para a Lixeira. Você pode restaurá-lo depois.',
+ deleteWorkspaceFallbackTitle: 'Excluir espaço de trabalho?',
+ deleteWorkspaceTitle: 'Excluir "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Comece com um espaço de trabalho',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Não foi possível criar o espaço de trabalho',
+ couldNotDeleteWorkspace: 'Não foi possível excluir o espaço de trabalho',
+ couldNotOpenWorkspace: 'Não foi possível abrir o espaço de trabalho',
+ couldNotSaveWorkspace: 'Não foi possível salvar o espaço de trabalho',
+ workspaceCouldNotLoad: 'Não foi possível carregar o espaço de trabalho',
+ workspacesCouldNotLoad: 'Não foi possível carregar os espaços de trabalho',
+ },
+ fields: {
+ descriptionLabel: 'Descrição do espaço de trabalho',
+ descriptionPlaceholder: 'O que pertence a este espaço de trabalho?',
+ namePlaceholder: 'Nome do espaço de trabalho',
+ untitledWorkspace: 'Espaço de trabalho sem título',
+ },
+ labels: {
+ createWorkspaceTitle: 'Criar espaço de trabalho',
+ loadingWorkspaces: 'Carregando espaços de trabalho',
+ workspace: 'Espaço de trabalho',
+ workspaces: 'Espaços de trabalho',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/ro.ts b/ui/src/core/i18n/resources/ro.ts
new file mode 100644
index 0000000..a485893
--- /dev/null
+++ b/ui/src/core/i18n/resources/ro.ts
@@ -0,0 +1,636 @@
+export const ro = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Încearcă din nou. Dacă se repetă, redeschide Clear.',
+ title: 'Nu s-a putut porni',
+ },
+ loadingTitle: 'Se pregătește spațiul tău de studiu',
+ },
+ common: {
+ actions: {
+ back: 'Înapoi',
+ cancel: 'Anulează',
+ checkAgain: 'Verifică din nou',
+ close: 'Închide',
+ create: 'Creează',
+ delete: 'Șterge',
+ dismissError: 'Închide eroarea',
+ dismissStatus: 'Închide starea',
+ edit: 'Editează',
+ itemActions: 'Acțiuni pentru {{title}}',
+ reset: 'Resetează',
+ review: 'Recapitulează',
+ save: 'Salvează',
+ saveChanges: 'Salvează modificările',
+ tryAgain: 'Încearcă din nou',
+ },
+ labels: {
+ active: 'Activ',
+ clear: 'Clear',
+ custom: 'Personalizat',
+ default: 'Implicit',
+ loadingEditor: 'Se încarcă editorul',
+ name: 'Nume',
+ completedTask: 'Sarcină finalizată',
+ description: 'Descriere',
+ incompleteTask: 'Sarcină nefinalizată',
+ percentageInput: 'Procent pentru {{label}}',
+ visual: 'Vizual',
+ },
+ status: {
+ actionFailed: 'Acțiunea a eșuat',
+ actionInProgress: 'Acțiune în curs',
+ },
+ sort: {
+ ascending: 'Asc.',
+ column: 'Coloană',
+ descending: 'Desc.',
+ direction: 'Direcție',
+ sort: 'Sortează',
+ },
+ search: {
+ label: 'Caută',
+ },
+ visualPicker: {
+ allLucideIcons: 'Toate pictogramele Lucide',
+ browseIconsFor: 'Răsfoiește sau caută pictograme pentru {{label}}.',
+ chooseIcon: 'Alege pictograma',
+ iconPicker: 'Selector de pictograme pentru {{label}}',
+ iconSearch: 'Căutare pictograme pentru {{label}}',
+ iconsCouldNotLoad: 'Pictogramele nu au putut fi încărcate.',
+ loadingIcons: 'Se încarcă pictogramele',
+ loadingMoreIcons: 'Se încarcă mai multe pictograme',
+ moreIcons: 'Mai multe pictograme',
+ noIconsMatch: 'Nicio pictogramă nu se potrivește cu "{{query}}".',
+ searchIconsPlaceholder: 'Caută pictograme…',
+ selectedIcon: '{{label}} selectat',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Creează',
+ newDeck: 'Pachet nou',
+ newFolder: 'Folder nou',
+ },
+ descriptions: {
+ defaultWorkspace: 'Ține pachetele, folderele și notițele împreună.',
+ emptyWorkspace: 'Creează un pachet, apoi adaugă notițe pentru a construi coada de recapitulare.',
+ emptyFolder: 'Creează un pachet, apoi adaugă notițe pentru a construi o coadă de recapitulare.',
+ searchPlaceholder: 'Caută foldere, pachete și notițe…',
+ },
+ empty: {
+ createFirstDeck: 'Creează primul pachet',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Pachetul nu a putut fi șters',
+ couldNotDeleteFolder: 'Folderul nu a putut fi șters',
+ couldNotDeleteWorkspace: 'Spațiul de lucru nu a putut fi șters',
+ dashboardCouldNotOpen: 'Panoul nu a putut fi deschis',
+ decksCouldNotLoad: 'Pachetele nu au putut fi încărcate',
+ decksMayBeOutOfDate: 'Pachetele pot fi neactualizate',
+ foldersCouldNotLoad: 'Folderele nu au putut fi încărcate',
+ foldersMayBeOutOfDate: 'Folderele pot fi neactualizate',
+ workspaceCouldNotLoad: 'Spațiul de lucru nu a putut fi încărcat',
+ },
+ labels: {
+ dashboard: 'Panou',
+ loadingDashboard: 'Se încarcă panoul',
+ newItem: 'Element nou',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Data nu este disponibilă',
+ },
+ age: {
+ dayAgo_one: 'acum {{count}} zi',
+ dayAgo_few: 'acum {{count}} zile',
+ dayAgo_other: 'acum {{count}} de zile',
+ hourAgo_one: 'acum {{count}} oră',
+ hourAgo_few: 'acum {{count}} ore',
+ hourAgo_other: 'acum {{count}} de ore',
+ justNow: 'chiar acum',
+ minuteAgo_one: 'acum {{count}} minut',
+ minuteAgo_few: 'acum {{count}} minute',
+ minuteAgo_other: 'acum {{count}} de minute',
+ unavailable: 'data nu este disponibilă',
+ weekAgo_one: 'acum {{count}} săptămână',
+ weekAgo_few: 'acum {{count}} săptămâni',
+ weekAgo_other: 'acum {{count}} de săptămâni',
+ },
+ labels: {
+ deleted: 'Șters {{value}}',
+ due: 'Scadent: {{value}}',
+ reviewed: 'Recapitulat: {{value}}',
+ updated: 'Actualizat {{value}}',
+ updatedUppercase: 'ACTUALIZAT {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'acum {{count}} zi',
+ dayAgo_few: 'acum {{count}} zile',
+ dayAgo_other: 'acum {{count}} de zile',
+ inAMoment: 'Într-o clipă',
+ inDay_one: 'În {{count}} zi',
+ inDay_few: 'În {{count}} zile',
+ inDay_other: 'În {{count}} de zile',
+ inMonth_one: 'În {{count}} lună',
+ inMonth_few: 'În {{count}} luni',
+ inMonth_other: 'În {{count}} de luni',
+ inWeek_one: 'În {{count}} săptămână',
+ inWeek_few: 'În {{count}} săptămâni',
+ inWeek_other: 'În {{count}} de săptămâni',
+ justNow: 'Chiar acum',
+ monthAgo_one: 'acum {{count}} lună',
+ monthAgo_few: 'acum {{count}} luni',
+ monthAgo_other: 'acum {{count}} de luni',
+ secondsAgoShort: 'acum {{count}} s',
+ minutesAgoShort: 'acum {{count}} min',
+ hoursAgoShort: 'acum {{count}} h',
+ today: 'Astăzi',
+ tomorrow: 'Mâine',
+ weekAgo_one: 'acum {{count}} săptămână',
+ weekAgo_few: 'acum {{count}} săptămâni',
+ weekAgo_other: 'acum {{count}} de săptămâni',
+ yesterday: 'Ieri',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Acțiuni pentru {{title}}',
+ createDeck: 'Creează pachet',
+ createNote: 'Creează notiță',
+ deleteDeck: 'Șterge pachetul',
+ editDeck: 'Editează pachetul',
+ newNote: 'Notiță nouă',
+ openDeck: 'Deschide pachetul {{title}}',
+ saveDeck: 'Pachetul nu a putut fi salvat',
+ studyNow: 'Studiază acum',
+ },
+ descriptions: {
+ emptyDeck: 'Adaugă o notiță pentru ca acest pachet să aibă material de recapitulat.',
+ editorDefault: 'Pachet de studiu concentrat.',
+ editorVisual: 'Alege un simbol de copertă pentru acest pachet.',
+ notesSearchPlaceholder: 'Caută notițe…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Aceasta mută "{{title}}" în Coș. Îl poți restaura mai târziu.',
+ deleteDeckFallbackDescription: 'Aceasta mută acest pachet în Coș. Îl poți restaura mai târziu.',
+ deleteDeckFallbackTitle: 'Ștergi pachetul?',
+ deleteDeckTitle: 'Ștergi "{{title}}"?',
+ deleteNoteDescription: 'Aceasta mută "{{title}}" în Coș. O poți restaura mai târziu.',
+ deleteNoteFallbackTitle: 'Ștergi notița?',
+ deleteNoteTitle: 'Ștergi "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Nicio notiță potrivită',
+ noMatchingNotesDescription: 'Nicio notiță nu se potrivește cu "{{query}}".',
+ thisDeckIsEmpty: 'Acest pachet este gol',
+ },
+ errors: {
+ couldNotCreateDeck: 'Pachetul nu a putut fi creat',
+ couldNotDeleteDeck: 'Pachetul nu a putut fi șters',
+ couldNotDeleteNote: 'Notița nu a putut fi ștearsă',
+ couldNotLoadFolderPath: 'Calea folderului nu a putut fi încărcată',
+ couldNotSaveDeck: 'Pachetul nu a putut fi salvat',
+ deckCouldNotLoad: 'Pachetul nu a putut fi încărcat',
+ notesCouldNotLoad: 'Notițele nu au putut fi încărcate',
+ notesMayBeOutOfDate: 'Notițele pot fi neactualizate',
+ },
+ fields: {
+ descriptionLabel: 'Descrierea pachetului',
+ descriptionPlaceholder: 'Ce te va ajuta să recapitulezi acest pachet?',
+ namePlaceholder: 'Numele pachetului',
+ untitledDeck: 'Pachet fără titlu',
+ untitledDeckLower: 'pachet fără titlu',
+ },
+ labels: {
+ createDeckTitle: 'Creează pachet',
+ deck: 'Pachet',
+ deckNotesSearch: 'Căutare notițe în pachet',
+ deckOverview: 'Prezentare pachet',
+ decks: 'Pachete',
+ due: 'Scadent',
+ dueToday: 'Scadent astăzi',
+ loadingDeck: 'Se încarcă pachetul',
+ mastery: 'Stăpânire',
+ notes: 'Notițe',
+ },
+ sort: {
+ ariaLabel: 'Sortează pachetele',
+ dueToday: 'Scadent astăzi',
+ title: 'Titlu',
+ updated: 'Actualizat',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Datele s-au schimbat. Reîmprospătează și încearcă din nou.',
+ forbidden: 'Nu ai permisiunea să faci asta.',
+ notFound: 'Nu am putut găsi acest element.',
+ offline: 'Serviciul nu poate fi contactat.',
+ timeout: 'A durat prea mult. Încearcă din nou.',
+ unauthorized: 'Conectează-te pentru a continua.',
+ unavailable: 'Serviciul este temporar indisponibil.',
+ },
+ fallback: {
+ unexpected: 'Eroare neașteptată',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Creează folder',
+ deleteFolder: 'Șterge folderul',
+ editFolder: 'Editează folderul',
+ },
+ descriptions: {
+ editorDefault: 'Folder pentru pachete asociate.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Aceasta mută "{{name}}" în Coș. Îl poți restaura mai târziu.',
+ deleteFolderFallbackDescription: 'Aceasta mută acest folder în Coș. Îl poți restaura mai târziu.',
+ deleteFolderFallbackTitle: 'Ștergi folderul?',
+ deleteFolderTitle: 'Ștergi "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Nicio potrivire în acest folder',
+ noMatchesInFolderDescription: 'Niciun folder, pachet sau nicio notiță nu se potrivește cu "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Folderul nu a putut fi creat',
+ couldNotDeleteFolder: 'Folderul nu a putut fi șters',
+ couldNotLoadFolderPath: 'Calea folderului nu a putut fi încărcată',
+ couldNotSaveFolder: 'Folderul nu a putut fi salvat',
+ folderCouldNotLoad: 'Folderul nu a putut fi încărcat',
+ },
+ fields: {
+ descriptionLabel: 'Descrierea folderului',
+ descriptionPlaceholder: 'Ce aparține acestui folder?',
+ namePlaceholder: 'Numele folderului',
+ untitledFolder: 'Folder fără titlu',
+ },
+ labels: {
+ createFolderTitle: 'Creează folder',
+ folder: 'Folder',
+ folders: 'Foldere',
+ loadingFolder: 'Se încarcă folderul',
+ name: 'Nume',
+ updated: 'Actualizat',
+ },
+ sort: {
+ ariaLabel: 'Sortează folderele',
+ name: 'Nume',
+ updated: 'Actualizat',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Dacă datele locale și cele sincronizate diferă, elementul va apărea aici.',
+ heading: 'Stare sincronizare',
+ title: 'Conflicte',
+ noConflicts: 'Nu s-au găsit conflicte',
+ },
+ labels: {
+ menu: 'Meniu',
+ },
+ sections: {
+ settings: {
+ description: 'Personalizează mediul și preferințele',
+ title: 'Setări',
+ },
+ trash: {
+ description: 'Restaurează sau șterge definitiv elementele eliminate',
+ title: 'Coș',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Închide editorul',
+ openActions: 'Deschide acțiunile',
+ openWorkspaces: 'Deschide spațiile de lucru',
+ },
+ items: {
+ home: 'Acasă',
+ menu: 'Meniu',
+ primary: 'Principal',
+ settings: 'Setări',
+ spaces: 'Spații',
+ trash: 'Coș',
+ workspaces: 'Spații de lucru',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Adaugă cloze',
+ deleteNote: 'Șterge notița',
+ editNote: 'Editează notița',
+ hideDerivedCardsNote: 'Ascunde nota despre cardurile derivate',
+ openNote: 'Deschide {{title}}',
+ saveNote: 'Salvează notița',
+ showDerivedCardsNote: 'Arată nota despre cardurile derivate',
+ },
+ descriptions: {
+ clozeFormat: 'Fiecare parte ascunsă devine un card de recapitulare când salvezi.',
+ clozeFormatPrefix: 'Încadrează textul ascuns cu',
+ derivedCardsHelper: 'Notițele sunt sursa de adevăr pentru cardurile derivate.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Aceasta mută "{{title}}" în Coș. O poți restaura mai târziu.',
+ deleteNoteFallbackDescription: 'Aceasta mută această notiță în Coș. O poți restaura mai târziu.',
+ deleteNoteFallbackTitle: 'Ștergi notița?',
+ deleteNoteTitle: 'Ștergi "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Notița nu a putut fi creată',
+ couldNotDeleteNote: 'Notița nu a putut fi ștearsă',
+ couldNotSaveNote: 'Notița nu a putut fi salvată',
+ noteCouldNotLoad: 'Notița nu a putut fi încărcată',
+ },
+ fields: {
+ back: 'Verso',
+ backPlaceholder: 'Introdu verso',
+ bodyPlaceholder: 'Scrie conținutul notiței cu ștergeri cloze…',
+ front: 'Față',
+ frontPlaceholder: 'Introdu fața',
+ noteBody: 'Conținutul notiței',
+ title: 'Titlu',
+ titlePlaceholder: 'Adaugă un titlu pentru notiță',
+ untitledCloze: 'Cloze fără titlu',
+ untitledNote: 'Notiță fără titlu',
+ },
+ labels: {
+ backUppercase: 'VERSO',
+ basic: 'De bază',
+ basicLower: 'de bază',
+ basicUppercase: 'DE BAZĂ',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Format cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Pachet',
+ derivedCards: 'CARDURI DERIVATE',
+ due: 'Scadent',
+ frontUppercase: 'FAȚĂ',
+ inProgress: 'În curs',
+ inProgressUppercase: 'ÎN CURS',
+ loadingNote: 'Se încarcă notița',
+ loadingNoteEditor: 'Se încarcă editorul de notițe',
+ markdownFormatting: 'Formatare Markdown',
+ mastered: 'Stăpânit',
+ masteredUppercase: 'STĂPÂNIT',
+ newNote: 'Notiță nouă',
+ noteBody: 'CONȚINUTUL NOTIȚEI',
+ noteContent: 'Conținut notiță',
+ noteDetails: 'Detalii notiță',
+ noteMetadata: 'Metadate notiță',
+ noteType: 'Tip notiță',
+ notes: 'Notițe',
+ reviewed: 'Recapitulat',
+ studyProgress: 'Progresul studiului',
+ studyProgressUppercase: 'PROGRESUL STUDIULUI',
+ titleUppercase: 'TITLU',
+ updated: 'Actualizat',
+ },
+ sort: {
+ ariaLabel: 'Sortează notițele',
+ title: 'Titlu',
+ updated: 'Actualizat',
+ },
+ toolbar: {
+ bold: 'Aldin',
+ italic: 'Cursiv',
+ link: 'Link',
+ list: 'Listă',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Din nou',
+ backToDeck: 'Înapoi la pachet',
+ continueReview: 'Continuă recapitularea',
+ easy: 'Ușor',
+ good: 'Bine',
+ hard: 'Greu',
+ newNote: 'Notiță nouă',
+ showAnswer: 'Arată răspunsul',
+ },
+ errors: {
+ couldNotGradeCard: 'Cardul nu a putut fi evaluat',
+ reviewCouldNotLoad: 'Recapitularea nu a putut fi încărcată',
+ reviewCouldNotStart: 'Recapitularea nu a putut fi pornită',
+ summaryCouldNotLoad: 'Rezumatul recapitulării nu a putut fi încărcat',
+ summaryNotAvailable: 'Rezumatul recapitulării nu este disponibil',
+ summaryNotComplete: 'Această recapitulare nu este încă finalizată.',
+ },
+ labels: {
+ cardsReviewed: 'Carduri recapitulate',
+ deck: 'Pachet',
+ duration: 'Durată',
+ loadingReview: 'Se încarcă recapitularea',
+ loadingSummary: 'Se încarcă rezumatul',
+ progress: 'Progres recapitulare',
+ review: 'Recapitulare',
+ reviewComplete: 'Recapitulare finalizată',
+ reviewed_one: 'Recapitulat {{count}}',
+ reviewed_few: 'Recapitulate {{count}}',
+ reviewed_other: 'Recapitulate {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Progresul tău a fost salvat în acest pachet.',
+ },
+ unavailable: {
+ description: 'Adaugă o notiță pentru ca acest pachet să intre în coada de recapitulare.',
+ title: 'Nu există carduri de recapitulat',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Golește căutarea',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Nicio potrivire în acest spațiu de lucru',
+ noMatchesInWorkspaceDescription: 'Niciun folder, pachet sau nicio notiță nu se potrivește cu "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Căutarea nu a putut fi finalizată',
+ },
+ labels: {
+ results: 'Rezultatele căutării',
+ resultsFor: 'Rezultate pentru "{{query}}"',
+ searchingContent: 'Se caută conținut',
+ },
+ resultGroups: {
+ deck: 'Pachete',
+ folder: 'Foldere',
+ note: 'Notițe',
+ },
+ resultKinds: {
+ deck: 'pachet',
+ folder: 'folder',
+ note: 'notiță',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Resetează toate setările',
+ resetSettings: 'Resetează setările',
+ resetToDefaults: 'Revino la valorile implicite',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Lipește JSON valid cu 21 de valori numerice.',
+ fsrsErrorInvalidParams_one: 'Introdu un array JSON cu exact {{count}} număr finit.',
+ fsrsErrorInvalidParams_few: 'Introdu un array JSON cu exact {{count}} numere finite.',
+ fsrsErrorInvalidParams_other: 'Introdu un array JSON cu exact {{count}} de numere finite.',
+ fsrsHelper: 'Aceasta este o suprascriere expert. Valorile trebuie să rămână în ordine.',
+ fsrsJsonLabel: 'JSON parametri FSRS',
+ fsrsTitle: 'Editează parametrii FSRS',
+ fsrsDescription: 'Lipește un array JSON cu 21 de numere pentru a suprascrie ponderile scheduler.',
+ resetDescription: 'Aceasta restaurează fusul orar, limitele de studiu și setările FSRS.',
+ resetDescriptionWithLanguage: 'Aceasta restaurează limba, fusul orar, limitele de studiu și setările FSRS.',
+ resetTitle: 'Resetezi toate setările?',
+ timezoneDescription: 'Caută un oraș sau un identificator de fus orar.',
+ timezoneSearchLabel: 'Caută fusuri orare',
+ timezoneSearchPlaceholder: 'Caută fusuri orare…',
+ timezoneTitle: 'Alege fusul orar',
+ },
+ errors: {
+ couldNotResetSettings: 'Setările nu au putut fi resetate',
+ couldNotSaveSettings: 'Setările nu au putut fi salvate',
+ settingsCouldNotLoad: 'Setările nu au putut fi încărcate',
+ settingsUnavailable: 'Setările nu sunt disponibile.',
+ },
+ labels: {
+ appearance: 'Aspect',
+ automatic: 'Automat',
+ fsrsParameters: 'Parametri FSRS',
+ general: 'General',
+ language: 'Limbă',
+ loadingSettings: 'Se încarcă setările',
+ masteryHorizon: 'Orizont de stăpânire',
+ newCardOrder: 'Ordinea cardurilor noi',
+ newCardsPerDay: 'Carduri noi pe zi',
+ reviewCardsPerDay: 'Carduri de recapitulat pe zi',
+ savingSettings: 'Se salvează setările',
+ schedule: 'Program',
+ searchNoTimezones: 'Niciun fus orar potrivit.',
+ settings: 'Setări',
+ settingsReset: 'Setări resetate',
+ study: 'Studiu',
+ targetRecallProbability: 'Probabilitate țintă de reamintire',
+ theme: 'Temă',
+ timezone: 'Fus orar',
+ },
+ options: {
+ languageEnUs: 'Engleză (SUA)',
+ newCardsAfterReviews: 'După recapitulări',
+ newCardsBeforeReviews: 'Înainte de recapitulări',
+ newCardsMixed: 'Amestecat',
+ themeDark: 'Întunecată',
+ themeLight: 'Luminoasă',
+ themeSystem: 'Sistem',
+ timezoneSystem: 'Folosește fusul orar al sistemului',
+ },
+ rows: {
+ fsrsDescription: 'Ponderi ale modelului expert',
+ languageDescription: 'Limba interfeței',
+ masteryHorizonDescription: 'Numărul de zile în care un card trebuie să rămână reamintibil la probabilitatea țintă sau peste pentru a fi considerat stăpânit',
+ newCardOrderDescription: 'Ordinea cardurilor noi față de recapitulări',
+ newCardsPerDayDescription: 'Numărul maxim de carduri noi pe zi',
+ reviewCardsPerDayDescription: 'Numărul maxim de carduri de recapitulat pe zi',
+ targetRecallProbabilityDescription: 'Probabilitatea minimă de reamintire la următoarea recapitulare programată',
+ timezoneDescription: 'Folosește fusul orar automat sau alege un oraș.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Șterge definitiv',
+ empty: 'Golește',
+ emptyTrash: 'Golește coșul',
+ restore: 'Restaurează',
+ restoringItem: 'Se restaurează {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Aceasta șterge definitiv "{{title}}". Acțiunea nu poate fi anulată.',
+ deleteItemFallbackDescription: 'Aceasta șterge definitiv acest element. Acțiunea nu poate fi anulată.',
+ deleteItemFallbackTitle: 'Ștergi elementul?',
+ deleteItemTitle: 'Ștergi "{{title}}"?',
+ emptyTrashDescription: 'Aceasta șterge definitiv tot din Coș. Acțiunea nu poate fi anulată.',
+ emptyTrashTitle: 'Golești coșul?',
+ },
+ empty: {
+ description: 'Elementele pe care le ștergi vor apărea aici înainte de eliminarea definitivă.',
+ title: 'Coșul este gol',
+ },
+ errors: {
+ couldNotDeleteItem: 'Elementul nu a putut fi șters',
+ couldNotEmptyTrash: 'Coșul nu a putut fi golit',
+ couldNotRestoreItem: 'Elementul nu a putut fi restaurat',
+ trashCouldNotLoad: 'Coșul nu a putut fi încărcat',
+ trashMayBeOutOfDate: 'Coșul poate fi neactualizat',
+ },
+ labels: {
+ deletedAge: 'Șters {{value}}',
+ itemCount_one: '{{count}} element',
+ itemCount_few: '{{count}} elemente',
+ itemCount_other: '{{count}} de elemente',
+ lastEmptied: 'Golit ultima dată {{value}}',
+ loadingTrash: 'Se încarcă Coșul',
+ originalLocation: 'Locația originală: {{location}}',
+ title: 'Coș',
+ trashActions: 'Acțiuni în coș pentru {{title}}',
+ },
+ kinds: {
+ deck: 'Pachet',
+ folder: 'Folder',
+ note: 'Notiță',
+ workspace: 'Spațiu de lucru',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Creează spațiu de lucru',
+ deleteWorkspace: 'Șterge spațiul de lucru',
+ editWorkspace: 'Editează spațiul de lucru',
+ newWorkspace: 'Spațiu de lucru nou',
+ openWorkspace: 'Deschide {{title}}',
+ openingWorkspace: 'Se deschide {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Context de studiu.',
+ editorVisual: 'Alege o ancoră vizuală pentru acest spațiu de lucru.',
+ emptyList: 'Separă pachetele, notițele și cozile de recapitulare după contextul de studiu.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Aceasta mută "{{title}}" în Coș. Îl poți restaura mai târziu.',
+ deleteWorkspaceFallbackDescription: 'Aceasta mută acest spațiu de lucru în Coș. Îl poți restaura mai târziu.',
+ deleteWorkspaceFallbackTitle: 'Ștergi spațiul de lucru?',
+ deleteWorkspaceTitle: 'Ștergi "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Începe cu un spațiu de lucru',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Spațiul de lucru nu a putut fi creat',
+ couldNotDeleteWorkspace: 'Spațiul de lucru nu a putut fi șters',
+ couldNotOpenWorkspace: 'Spațiul de lucru nu a putut fi deschis',
+ couldNotSaveWorkspace: 'Spațiul de lucru nu a putut fi salvat',
+ workspaceCouldNotLoad: 'Spațiul de lucru nu a putut fi încărcat',
+ workspacesCouldNotLoad: 'Spațiile de lucru nu au putut fi încărcate',
+ },
+ fields: {
+ descriptionLabel: 'Descrierea spațiului de lucru',
+ descriptionPlaceholder: 'Ce aparține acestui spațiu de lucru?',
+ namePlaceholder: 'Numele spațiului de lucru',
+ untitledWorkspace: 'Spațiu de lucru fără titlu',
+ },
+ labels: {
+ createWorkspaceTitle: 'Creează spațiu de lucru',
+ loadingWorkspaces: 'Se încarcă spațiile de lucru',
+ workspace: 'Spațiu de lucru',
+ workspaces: 'Spații de lucru',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/ru.ts b/ui/src/core/i18n/resources/ru.ts
new file mode 100644
index 0000000..01942ed
--- /dev/null
+++ b/ui/src/core/i18n/resources/ru.ts
@@ -0,0 +1,649 @@
+export const ru = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Попробуйте еще раз. Если ошибка повторится, откройте Clear заново.',
+ title: 'Не удалось запустить',
+ },
+ loadingTitle: 'Готовим пространство для учебы',
+ },
+ common: {
+ actions: {
+ back: 'Назад',
+ cancel: 'Отмена',
+ checkAgain: 'Проверить снова',
+ close: 'Закрыть',
+ create: 'Создать',
+ delete: 'Удалить',
+ dismissError: 'Скрыть ошибку',
+ dismissStatus: 'Скрыть статус',
+ edit: 'Изменить',
+ itemActions: 'Действия для {{title}}',
+ reset: 'Сбросить',
+ review: 'Повторять',
+ save: 'Сохранить',
+ saveChanges: 'Сохранить изменения',
+ tryAgain: 'Попробовать снова',
+ },
+ labels: {
+ active: 'Активно',
+ clear: 'Clear',
+ custom: 'Пользовательский',
+ default: 'По умолчанию',
+ loadingEditor: 'Загрузка редактора',
+ name: 'Название',
+ completedTask: 'Завершенная задача',
+ description: 'Описание',
+ incompleteTask: 'Незавершенная задача',
+ percentageInput: '{{label}}, процент',
+ visual: 'Визуал',
+ },
+ status: {
+ actionFailed: 'Действие не выполнено',
+ actionInProgress: 'Действие выполняется',
+ },
+ sort: {
+ ascending: 'Возр.',
+ column: 'Столбец',
+ descending: 'Убыв.',
+ direction: 'Порядок',
+ sort: 'Сортировка',
+ },
+ search: {
+ label: 'Поиск',
+ },
+ visualPicker: {
+ allLucideIcons: 'Все иконки Lucide',
+ browseIconsFor: 'Просматривайте или ищите иконки для {{label}}.',
+ chooseIcon: 'Выбрать иконку',
+ iconPicker: 'Выбор иконки для {{label}}',
+ iconSearch: 'Поиск иконок для {{label}}',
+ iconsCouldNotLoad: 'Не удалось загрузить иконки.',
+ loadingIcons: 'Загрузка иконок',
+ loadingMoreIcons: 'Загрузка дополнительных иконок',
+ moreIcons: 'Еще иконки',
+ noIconsMatch: 'Нет иконок по запросу "{{query}}".',
+ searchIconsPlaceholder: 'Искать иконки…',
+ selectedIcon: 'Выбрано: {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Создать',
+ newDeck: 'Новая колода',
+ newFolder: 'Новая папка',
+ },
+ descriptions: {
+ defaultWorkspace: 'Храните колоды, папки и заметки вместе.',
+ emptyWorkspace: 'Создайте колоду, затем добавьте заметки, чтобы собрать очередь повторения.',
+ emptyFolder: 'Создайте колоду, затем добавьте заметки, чтобы собрать очередь повторения.',
+ searchPlaceholder: 'Искать папки, колоды и заметки…',
+ },
+ empty: {
+ createFirstDeck: 'Создайте первую колоду',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Не удалось удалить колоду',
+ couldNotDeleteFolder: 'Не удалось удалить папку',
+ couldNotDeleteWorkspace: 'Не удалось удалить рабочее пространство',
+ dashboardCouldNotOpen: 'Не удалось открыть панель',
+ decksCouldNotLoad: 'Не удалось загрузить колоды',
+ decksMayBeOutOfDate: 'Колоды могут быть устаревшими',
+ foldersCouldNotLoad: 'Не удалось загрузить папки',
+ foldersMayBeOutOfDate: 'Папки могут быть устаревшими',
+ workspaceCouldNotLoad: 'Не удалось загрузить рабочее пространство',
+ },
+ labels: {
+ dashboard: 'Панель',
+ loadingDashboard: 'Загрузка панели',
+ newItem: 'Новый элемент',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Дата недоступна',
+ },
+ age: {
+ dayAgo_one: '{{count}} день назад',
+ dayAgo_few: '{{count}} дня назад',
+ dayAgo_many: '{{count}} дней назад',
+ dayAgo_other: '{{count}} дня назад',
+ hourAgo_one: '{{count}} час назад',
+ hourAgo_few: '{{count}} часа назад',
+ hourAgo_many: '{{count}} часов назад',
+ hourAgo_other: '{{count}} часа назад',
+ justNow: 'только что',
+ minuteAgo_one: '{{count}} минуту назад',
+ minuteAgo_few: '{{count}} минуты назад',
+ minuteAgo_many: '{{count}} минут назад',
+ minuteAgo_other: '{{count}} минуты назад',
+ unavailable: 'дата недоступна',
+ weekAgo_one: '{{count}} неделю назад',
+ weekAgo_few: '{{count}} недели назад',
+ weekAgo_many: '{{count}} недель назад',
+ weekAgo_other: '{{count}} недели назад',
+ },
+ labels: {
+ deleted: 'Удалено {{value}}',
+ due: 'К повторению: {{value}}',
+ reviewed: 'Повторено: {{value}}',
+ updated: 'Обновлено {{value}}',
+ updatedUppercase: 'ОБНОВЛЕНО {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} день назад',
+ dayAgo_few: '{{count}} дня назад',
+ dayAgo_many: '{{count}} дней назад',
+ dayAgo_other: '{{count}} дня назад',
+ inAMoment: 'Сейчас',
+ inDay_one: 'Через {{count}} день',
+ inDay_few: 'Через {{count}} дня',
+ inDay_many: 'Через {{count}} дней',
+ inDay_other: 'Через {{count}} дня',
+ inMonth_one: 'Через {{count}} месяц',
+ inMonth_few: 'Через {{count}} месяца',
+ inMonth_many: 'Через {{count}} месяцев',
+ inMonth_other: 'Через {{count}} месяца',
+ inWeek_one: 'Через {{count}} неделю',
+ inWeek_few: 'Через {{count}} недели',
+ inWeek_many: 'Через {{count}} недель',
+ inWeek_other: 'Через {{count}} недели',
+ justNow: 'Только что',
+ monthAgo_one: '{{count}} месяц назад',
+ monthAgo_few: '{{count}} месяца назад',
+ monthAgo_many: '{{count}} месяцев назад',
+ monthAgo_other: '{{count}} месяца назад',
+ secondsAgoShort: '{{count}} с назад',
+ minutesAgoShort: '{{count}} мин назад',
+ hoursAgoShort: '{{count}} ч назад',
+ today: 'Сегодня',
+ tomorrow: 'Завтра',
+ weekAgo_one: '{{count}} неделю назад',
+ weekAgo_few: '{{count}} недели назад',
+ weekAgo_many: '{{count}} недель назад',
+ weekAgo_other: '{{count}} недели назад',
+ yesterday: 'Вчера',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Действия для {{title}}',
+ createDeck: 'Создать колоду',
+ createNote: 'Создать заметку',
+ deleteDeck: 'Удалить колоду',
+ editDeck: 'Изменить колоду',
+ newNote: 'Новая заметка',
+ openDeck: 'Открыть колоду {{title}}',
+ saveDeck: 'Не удалось сохранить колоду',
+ studyNow: 'Учиться сейчас',
+ },
+ descriptions: {
+ emptyDeck: 'Добавьте заметку, чтобы в этой колоде был материал для повторения.',
+ editorDefault: 'Колода для сфокусированного обучения.',
+ editorVisual: 'Выберите символ обложки для этой колоды.',
+ notesSearchPlaceholder: 'Искать заметки…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Это переместит "{{title}}" в Корзину. Вы сможете восстановить ее позже.',
+ deleteDeckFallbackDescription: 'Это переместит эту колоду в Корзину. Вы сможете восстановить ее позже.',
+ deleteDeckFallbackTitle: 'Удалить колоду?',
+ deleteDeckTitle: 'Удалить "{{title}}"?',
+ deleteNoteDescription: 'Это переместит "{{title}}" в Корзину. Вы сможете восстановить ее позже.',
+ deleteNoteFallbackTitle: 'Удалить заметку?',
+ deleteNoteTitle: 'Удалить "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Нет подходящих заметок',
+ noMatchingNotesDescription: 'Нет заметок по запросу "{{query}}".',
+ thisDeckIsEmpty: 'Эта колода пуста',
+ },
+ errors: {
+ couldNotCreateDeck: 'Не удалось создать колоду',
+ couldNotDeleteDeck: 'Не удалось удалить колоду',
+ couldNotDeleteNote: 'Не удалось удалить заметку',
+ couldNotLoadFolderPath: 'Не удалось загрузить путь к папке',
+ couldNotSaveDeck: 'Не удалось сохранить колоду',
+ deckCouldNotLoad: 'Не удалось загрузить колоду',
+ notesCouldNotLoad: 'Не удалось загрузить заметки',
+ notesMayBeOutOfDate: 'Заметки могут быть устаревшими',
+ },
+ fields: {
+ descriptionLabel: 'Описание колоды',
+ descriptionPlaceholder: 'Что эта колода поможет вам повторять?',
+ namePlaceholder: 'Название колоды',
+ untitledDeck: 'Колода без названия',
+ untitledDeckLower: 'колода без названия',
+ },
+ labels: {
+ createDeckTitle: 'Создать колоду',
+ deck: 'Колода',
+ deckNotesSearch: 'Поиск заметок в колоде',
+ deckOverview: 'Обзор колоды',
+ decks: 'Колоды',
+ due: 'Повторить',
+ dueToday: 'К повторению сегодня',
+ loadingDeck: 'Загрузка колоды',
+ mastery: 'Освоение',
+ notes: 'Заметки',
+ },
+ sort: {
+ ariaLabel: 'Сортировать колоды',
+ dueToday: 'К повторению сегодня',
+ title: 'Название',
+ updated: 'Обновлено',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Данные изменились. Обновите и попробуйте снова.',
+ forbidden: 'У вас нет разрешения на это действие.',
+ notFound: 'Мы не нашли этот элемент.',
+ offline: 'Не удается подключиться к сервису.',
+ timeout: 'Это заняло слишком много времени. Попробуйте снова.',
+ unauthorized: 'Войдите, чтобы продолжить.',
+ unavailable: 'Сервис временно недоступен.',
+ },
+ fallback: {
+ unexpected: 'Неожиданная ошибка',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Создать папку',
+ deleteFolder: 'Удалить папку',
+ editFolder: 'Изменить папку',
+ },
+ descriptions: {
+ editorDefault: 'Папка для связанных колод.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Это переместит "{{name}}" в Корзину. Вы сможете восстановить ее позже.',
+ deleteFolderFallbackDescription: 'Это переместит эту папку в Корзину. Вы сможете восстановить ее позже.',
+ deleteFolderFallbackTitle: 'Удалить папку?',
+ deleteFolderTitle: 'Удалить "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'В этой папке ничего не найдено',
+ noMatchesInFolderDescription: 'Нет папок, колод или заметок по запросу "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Не удалось создать папку',
+ couldNotDeleteFolder: 'Не удалось удалить папку',
+ couldNotLoadFolderPath: 'Не удалось загрузить путь к папке',
+ couldNotSaveFolder: 'Не удалось сохранить папку',
+ folderCouldNotLoad: 'Не удалось загрузить папку',
+ },
+ fields: {
+ descriptionLabel: 'Описание папки',
+ descriptionPlaceholder: 'Что относится к этой папке?',
+ namePlaceholder: 'Название папки',
+ untitledFolder: 'Папка без названия',
+ },
+ labels: {
+ createFolderTitle: 'Создать папку',
+ folder: 'Папка',
+ folders: 'Папки',
+ loadingFolder: 'Загрузка папки',
+ name: 'Название',
+ updated: 'Обновлено',
+ },
+ sort: {
+ ariaLabel: 'Сортировать папки',
+ name: 'Название',
+ updated: 'Обновлено',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Если локальные и синхронизированные данные разойдутся, элемент появится здесь.',
+ heading: 'Статус синхронизации',
+ title: 'Конфликты',
+ noConflicts: 'Конфликтов не найдено',
+ },
+ labels: {
+ menu: 'Меню',
+ },
+ sections: {
+ settings: {
+ description: 'Настройте среду и предпочтения',
+ title: 'Настройки',
+ },
+ trash: {
+ description: 'Восстановить или навсегда удалить удаленные элементы',
+ title: 'Корзина',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Закрыть редактор',
+ openActions: 'Открыть действия',
+ openWorkspaces: 'Открыть рабочие пространства',
+ },
+ items: {
+ home: 'Главная',
+ menu: 'Меню',
+ primary: 'Основное',
+ settings: 'Настройки',
+ spaces: 'Пространства',
+ trash: 'Корзина',
+ workspaces: 'Рабочие пространства',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Добавить cloze',
+ deleteNote: 'Удалить заметку',
+ editNote: 'Изменить заметку',
+ hideDerivedCardsNote: 'Скрыть заметку о производных карточках',
+ openNote: 'Открыть {{title}}',
+ saveNote: 'Сохранить заметку',
+ showDerivedCardsNote: 'Показать заметку о производных карточках',
+ },
+ descriptions: {
+ clozeFormat: 'Каждая скрытая часть станет карточкой для повторения после сохранения.',
+ clozeFormatPrefix: 'Оберните скрытый текст в',
+ derivedCardsHelper: 'Заметки — источник истины для производных карточек.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Это переместит "{{title}}" в Корзину. Вы сможете восстановить ее позже.',
+ deleteNoteFallbackDescription: 'Это переместит эту заметку в Корзину. Вы сможете восстановить ее позже.',
+ deleteNoteFallbackTitle: 'Удалить заметку?',
+ deleteNoteTitle: 'Удалить "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Не удалось создать заметку',
+ couldNotDeleteNote: 'Не удалось удалить заметку',
+ couldNotSaveNote: 'Не удалось сохранить заметку',
+ noteCouldNotLoad: 'Не удалось загрузить заметку',
+ },
+ fields: {
+ back: 'Оборот',
+ backPlaceholder: 'Введите оборот',
+ bodyPlaceholder: 'Напишите текст заметки с cloze-удалениями…',
+ front: 'Лицевая сторона',
+ frontPlaceholder: 'Введите лицевую сторону',
+ noteBody: 'Текст заметки',
+ title: 'Название',
+ titlePlaceholder: 'Добавьте название заметки',
+ untitledCloze: 'Cloze без названия',
+ untitledNote: 'Заметка без названия',
+ },
+ labels: {
+ backUppercase: 'ОБОРОТ',
+ basic: 'Базовая',
+ basicLower: 'базовая',
+ basicUppercase: 'БАЗОВАЯ',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Формат cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Колода',
+ derivedCards: 'ПРОИЗВОДНЫЕ КАРТОЧКИ',
+ due: 'К повторению',
+ frontUppercase: 'ЛИЦЕВАЯ СТОРОНА',
+ inProgress: 'В процессе',
+ inProgressUppercase: 'В ПРОЦЕССЕ',
+ loadingNote: 'Загрузка заметки',
+ loadingNoteEditor: 'Загрузка редактора заметок',
+ markdownFormatting: 'Форматирование Markdown',
+ mastered: 'Освоено',
+ masteredUppercase: 'ОСВОЕНО',
+ newNote: 'Новая заметка',
+ noteBody: 'ТЕКСТ ЗАМЕТКИ',
+ noteContent: 'Содержимое заметки',
+ noteDetails: 'Детали заметки',
+ noteMetadata: 'Метаданные заметки',
+ noteType: 'Тип заметки',
+ notes: 'Заметки',
+ reviewed: 'Повторено',
+ studyProgress: 'Учебный прогресс',
+ studyProgressUppercase: 'УЧЕБНЫЙ ПРОГРЕСС',
+ titleUppercase: 'НАЗВАНИЕ',
+ updated: 'Обновлено',
+ },
+ sort: {
+ ariaLabel: 'Сортировать заметки',
+ title: 'Название',
+ updated: 'Обновлено',
+ },
+ toolbar: {
+ bold: 'Жирный',
+ italic: 'Курсив',
+ link: 'Ссылка',
+ list: 'Список',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Снова',
+ backToDeck: 'Назад к колоде',
+ continueReview: 'Продолжить повторение',
+ easy: 'Легко',
+ good: 'Хорошо',
+ hard: 'Трудно',
+ newNote: 'Новая заметка',
+ showAnswer: 'Показать ответ',
+ },
+ errors: {
+ couldNotGradeCard: 'Не удалось оценить карточку',
+ reviewCouldNotLoad: 'Не удалось загрузить повторение',
+ reviewCouldNotStart: 'Не удалось начать повторение',
+ summaryCouldNotLoad: 'Не удалось загрузить итог повторения',
+ summaryNotAvailable: 'Итог повторения недоступен',
+ summaryNotComplete: 'Это повторение еще не завершено.',
+ },
+ labels: {
+ cardsReviewed: 'Карточек повторено',
+ deck: 'Колода',
+ duration: 'Длительность',
+ loadingReview: 'Загрузка повторения',
+ loadingSummary: 'Загрузка итога',
+ progress: 'Прогресс повторения',
+ review: 'Повторение',
+ reviewComplete: 'Повторение завершено',
+ reviewed_one: 'Повторено {{count}}',
+ reviewed_few: 'Повторено {{count}}',
+ reviewed_many: 'Повторено {{count}}',
+ reviewed_other: 'Повторено {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} ч {{minutes}} мин',
+ durationMinutes: '{{minutes}} мин',
+ durationSeconds: '{{seconds}} с',
+ saved: 'Ваш прогресс сохранен в этой колоде.',
+ },
+ unavailable: {
+ description: 'Добавьте заметку, чтобы эта колода попала в очередь повторения.',
+ title: 'Нет карточек для повторения',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Очистить поиск',
+ },
+ empty: {
+ noMatchesInWorkspace: 'В этом пространстве ничего не найдено',
+ noMatchesInWorkspaceDescription: 'Нет папок, колод или заметок по запросу "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Не удалось выполнить поиск',
+ },
+ labels: {
+ results: 'Результаты поиска',
+ resultsFor: 'Результаты для "{{query}}"',
+ searchingContent: 'Поиск содержимого',
+ },
+ resultGroups: {
+ deck: 'Колоды',
+ folder: 'Папки',
+ note: 'Заметки',
+ },
+ resultKinds: {
+ deck: 'колода',
+ folder: 'папка',
+ note: 'заметка',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Сбросить все настройки',
+ resetSettings: 'Сбросить настройки',
+ resetToDefaults: 'Вернуть значения по умолчанию',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Вставьте корректный JSON с 21 числовым значением.',
+ fsrsErrorInvalidParams_one: 'Введите JSON-массив ровно с {{count}} конечным числом.',
+ fsrsErrorInvalidParams_few: 'Введите JSON-массив ровно с {{count}} конечными числами.',
+ fsrsErrorInvalidParams_many: 'Введите JSON-массив ровно с {{count}} конечными числами.',
+ fsrsErrorInvalidParams_other: 'Введите JSON-массив ровно с {{count}} конечными числами.',
+ fsrsHelper: 'Это экспертная настройка. Значения должны оставаться в порядке.',
+ fsrsJsonLabel: 'JSON параметров FSRS',
+ fsrsTitle: 'Изменить параметры FSRS',
+ fsrsDescription: 'Вставьте JSON-массив с 21 числом, чтобы переопределить веса scheduler.',
+ resetDescription: 'Это восстановит часовой пояс, лимиты учебы и настройки FSRS.',
+ resetDescriptionWithLanguage: 'Это восстановит язык, часовой пояс, лимиты учебы и настройки FSRS.',
+ resetTitle: 'Сбросить все настройки?',
+ timezoneDescription: 'Ищите город или идентификатор часового пояса.',
+ timezoneSearchLabel: 'Поиск часовых поясов',
+ timezoneSearchPlaceholder: 'Искать часовые пояса…',
+ timezoneTitle: 'Выберите часовой пояс',
+ },
+ errors: {
+ couldNotResetSettings: 'Не удалось сбросить настройки',
+ couldNotSaveSettings: 'Не удалось сохранить настройки',
+ settingsCouldNotLoad: 'Не удалось загрузить настройки',
+ settingsUnavailable: 'Настройки недоступны.',
+ },
+ labels: {
+ appearance: 'Оформление',
+ automatic: 'Автоматически',
+ fsrsParameters: 'Параметры FSRS',
+ general: 'Основные',
+ language: 'Язык',
+ loadingSettings: 'Загрузка настроек',
+ masteryHorizon: 'Горизонт освоения',
+ newCardOrder: 'Порядок новых карточек',
+ newCardsPerDay: 'Новых карточек в день',
+ reviewCardsPerDay: 'Карточек для повторения в день',
+ savingSettings: 'Сохранение настроек',
+ schedule: 'Расписание',
+ searchNoTimezones: 'Нет подходящих часовых поясов.',
+ settings: 'Настройки',
+ settingsReset: 'Настройки сброшены',
+ study: 'Учеба',
+ targetRecallProbability: 'Целевая вероятность вспоминания',
+ theme: 'Тема',
+ timezone: 'Часовой пояс',
+ },
+ options: {
+ languageEnUs: 'Английский (США)',
+ newCardsAfterReviews: 'После повторений',
+ newCardsBeforeReviews: 'Перед повторениями',
+ newCardsMixed: 'Смешанно',
+ themeDark: 'Темная',
+ themeLight: 'Светлая',
+ themeSystem: 'Системная',
+ timezoneSystem: 'Использовать системный часовой пояс',
+ },
+ rows: {
+ fsrsDescription: 'Веса экспертной модели',
+ languageDescription: 'Язык интерфейса',
+ masteryHorizonDescription: 'Сколько дней карточка должна оставаться вспоминаемой на целевой вероятности или выше, чтобы считаться освоенной',
+ newCardOrderDescription: 'Порядок новых карточек относительно повторений',
+ newCardsPerDayDescription: 'Максимум новых карточек в день',
+ reviewCardsPerDayDescription: 'Максимум карточек для повторения в день',
+ targetRecallProbabilityDescription: 'Минимальная вероятность вспоминания на следующем запланированном повторении',
+ timezoneDescription: 'Используйте автоматический часовой пояс или выберите город.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Удалить навсегда',
+ empty: 'Очистить',
+ emptyTrash: 'Очистить корзину',
+ restore: 'Восстановить',
+ restoringItem: 'Восстановление {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Это навсегда удалит "{{title}}". Отменить действие нельзя.',
+ deleteItemFallbackDescription: 'Это навсегда удалит этот элемент. Отменить действие нельзя.',
+ deleteItemFallbackTitle: 'Удалить элемент?',
+ deleteItemTitle: 'Удалить "{{title}}"?',
+ emptyTrashDescription: 'Это навсегда удалит все из Корзины. Отменить действие нельзя.',
+ emptyTrashTitle: 'Очистить корзину?',
+ },
+ empty: {
+ description: 'Удаленные элементы появятся здесь перед окончательным удалением.',
+ title: 'Корзина пуста',
+ },
+ errors: {
+ couldNotDeleteItem: 'Не удалось удалить элемент',
+ couldNotEmptyTrash: 'Не удалось очистить Корзину',
+ couldNotRestoreItem: 'Не удалось восстановить элемент',
+ trashCouldNotLoad: 'Не удалось загрузить Корзину',
+ trashMayBeOutOfDate: 'Корзина может быть устаревшей',
+ },
+ labels: {
+ deletedAge: 'Удалено {{value}}',
+ itemCount_one: '{{count}} элемент',
+ itemCount_few: '{{count}} элемента',
+ itemCount_many: '{{count}} элементов',
+ itemCount_other: '{{count}} элемента',
+ lastEmptied: 'Последняя очистка {{value}}',
+ loadingTrash: 'Загрузка Корзины',
+ originalLocation: 'Исходное расположение: {{location}}',
+ title: 'Корзина',
+ trashActions: 'Действия корзины для {{title}}',
+ },
+ kinds: {
+ deck: 'Колода',
+ folder: 'Папка',
+ note: 'Заметка',
+ workspace: 'Рабочее пространство',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Создать рабочее пространство',
+ deleteWorkspace: 'Удалить рабочее пространство',
+ editWorkspace: 'Изменить рабочее пространство',
+ newWorkspace: 'Новое рабочее пространство',
+ openWorkspace: 'Открыть {{title}}',
+ openingWorkspace: 'Открытие {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Учебный контекст.',
+ editorVisual: 'Выберите визуальный якорь для этого пространства.',
+ emptyList: 'Разделяйте колоды, заметки и очереди повторения по учебному контексту.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Это переместит "{{title}}" в Корзину. Вы сможете восстановить его позже.',
+ deleteWorkspaceFallbackDescription: 'Это переместит это рабочее пространство в Корзину. Вы сможете восстановить его позже.',
+ deleteWorkspaceFallbackTitle: 'Удалить рабочее пространство?',
+ deleteWorkspaceTitle: 'Удалить "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Начните с рабочего пространства',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Не удалось создать рабочее пространство',
+ couldNotDeleteWorkspace: 'Не удалось удалить рабочее пространство',
+ couldNotOpenWorkspace: 'Не удалось открыть рабочее пространство',
+ couldNotSaveWorkspace: 'Не удалось сохранить рабочее пространство',
+ workspaceCouldNotLoad: 'Не удалось загрузить рабочее пространство',
+ workspacesCouldNotLoad: 'Не удалось загрузить рабочие пространства',
+ },
+ fields: {
+ descriptionLabel: 'Описание рабочего пространства',
+ descriptionPlaceholder: 'Что относится к этому рабочему пространству?',
+ namePlaceholder: 'Название рабочего пространства',
+ untitledWorkspace: 'Рабочее пространство без названия',
+ },
+ labels: {
+ createWorkspaceTitle: 'Создать рабочее пространство',
+ loadingWorkspaces: 'Загрузка рабочих пространств',
+ workspace: 'Рабочее пространство',
+ workspaces: 'Рабочие пространства',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/sk.ts b/ui/src/core/i18n/resources/sk.ts
new file mode 100644
index 0000000..cb9e183
--- /dev/null
+++ b/ui/src/core/i18n/resources/sk.ts
@@ -0,0 +1,649 @@
+export const sk = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Skúste to znova. Ak sa to bude opakovať, znova otvorte Clear.',
+ title: 'Nepodarilo sa spustiť',
+ },
+ loadingTitle: 'Pripravuje sa váš študijný priestor',
+ },
+ common: {
+ actions: {
+ back: 'Späť',
+ cancel: 'Zrušiť',
+ checkAgain: 'Skontrolovať znova',
+ close: 'Zavrieť',
+ create: 'Vytvoriť',
+ delete: 'Odstrániť',
+ dismissError: 'Zavrieť chybu',
+ dismissStatus: 'Zavrieť stav',
+ edit: 'Upraviť',
+ itemActions: 'Akcie pre {{title}}',
+ reset: 'Resetovať',
+ review: 'Opakovať',
+ save: 'Uložiť',
+ saveChanges: 'Uložiť zmeny',
+ tryAgain: 'Skúsiť znova',
+ },
+ labels: {
+ active: 'Aktívne',
+ clear: 'Clear',
+ custom: 'Vlastné',
+ default: 'Predvolené',
+ loadingEditor: 'Načítava sa editor',
+ name: 'Názov',
+ completedTask: 'Dokončená úloha',
+ description: 'Popis',
+ incompleteTask: 'Nedokončená úloha',
+ percentageInput: 'Percento pre {{label}}',
+ visual: 'Vizuál',
+ },
+ status: {
+ actionFailed: 'Akcia zlyhala',
+ actionInProgress: 'Akcia prebieha',
+ },
+ sort: {
+ ascending: 'Vzost.',
+ column: 'Stĺpec',
+ descending: 'Zost.',
+ direction: 'Smer',
+ sort: 'Triediť',
+ },
+ search: {
+ label: 'Hľadať',
+ },
+ visualPicker: {
+ allLucideIcons: 'Všetky ikony Lucide',
+ browseIconsFor: 'Prehliadajte alebo hľadajte ikony pre {{label}}.',
+ chooseIcon: 'Vybrať ikonu',
+ iconPicker: 'Výber ikony pre {{label}}',
+ iconSearch: 'Hľadanie ikon pre {{label}}',
+ iconsCouldNotLoad: 'Ikony sa nepodarilo načítať.',
+ loadingIcons: 'Načítavajú sa ikony',
+ loadingMoreIcons: 'Načítavajú sa ďalšie ikony',
+ moreIcons: 'Ďalšie ikony',
+ noIconsMatch: 'Žiadne ikony nezodpovedajú "{{query}}".',
+ searchIconsPlaceholder: 'Hľadať ikony…',
+ selectedIcon: 'Vybraté {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Vytvoriť',
+ newDeck: 'Nový balíček',
+ newFolder: 'Nový priečinok',
+ },
+ descriptions: {
+ defaultWorkspace: 'Majte balíčky, priečinky a poznámky spolu.',
+ emptyWorkspace: 'Vytvorte balíček a potom pridajte poznámky na zostavenie frontu opakovania.',
+ emptyFolder: 'Vytvorte balíček a potom pridajte poznámky na zostavenie frontu opakovania.',
+ searchPlaceholder: 'Hľadať priečinky, balíčky a poznámky…',
+ },
+ empty: {
+ createFirstDeck: 'Vytvorte svoj prvý balíček',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Balíček sa nepodarilo odstrániť',
+ couldNotDeleteFolder: 'Priečinok sa nepodarilo odstrániť',
+ couldNotDeleteWorkspace: 'Pracovný priestor sa nepodarilo odstrániť',
+ dashboardCouldNotOpen: 'Prehľad sa nepodarilo otvoriť',
+ decksCouldNotLoad: 'Balíčky sa nepodarilo načítať',
+ decksMayBeOutOfDate: 'Balíčky môžu byť zastarané',
+ foldersCouldNotLoad: 'Priečinky sa nepodarilo načítať',
+ foldersMayBeOutOfDate: 'Priečinky môžu byť zastarané',
+ workspaceCouldNotLoad: 'Pracovný priestor sa nepodarilo načítať',
+ },
+ labels: {
+ dashboard: 'Prehľad',
+ loadingDashboard: 'Načítava sa prehľad',
+ newItem: 'Nová položka',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Dátum nie je dostupný',
+ },
+ age: {
+ dayAgo_one: 'pred {{count}} dňom',
+ dayAgo_few: 'pred {{count}} dňami',
+ dayAgo_many: 'pred {{count}} dňa',
+ dayAgo_other: 'pred {{count}} dňami',
+ hourAgo_one: 'pred {{count}} hodinou',
+ hourAgo_few: 'pred {{count}} hodinami',
+ hourAgo_many: 'pred {{count}} hodiny',
+ hourAgo_other: 'pred {{count}} hodinami',
+ justNow: 'práve teraz',
+ minuteAgo_one: 'pred {{count}} minútou',
+ minuteAgo_few: 'pred {{count}} minútami',
+ minuteAgo_many: 'pred {{count}} minúty',
+ minuteAgo_other: 'pred {{count}} minútami',
+ unavailable: 'dátum nie je dostupný',
+ weekAgo_one: 'pred {{count}} týždňom',
+ weekAgo_few: 'pred {{count}} týždňami',
+ weekAgo_many: 'pred {{count}} týždňa',
+ weekAgo_other: 'pred {{count}} týždňami',
+ },
+ labels: {
+ deleted: 'Odstránené {{value}}',
+ due: 'Termín: {{value}}',
+ reviewed: 'Opakované: {{value}}',
+ updated: 'Aktualizované {{value}}',
+ updatedUppercase: 'AKTUALIZOVANÉ {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'pred {{count}} dňom',
+ dayAgo_few: 'pred {{count}} dňami',
+ dayAgo_many: 'pred {{count}} dňa',
+ dayAgo_other: 'pred {{count}} dňami',
+ inAMoment: 'O chvíľu',
+ inDay_one: 'O {{count}} deň',
+ inDay_few: 'O {{count}} dni',
+ inDay_many: 'O {{count}} dňa',
+ inDay_other: 'O {{count}} dní',
+ inMonth_one: 'O {{count}} mesiac',
+ inMonth_few: 'O {{count}} mesiace',
+ inMonth_many: 'O {{count}} mesiaca',
+ inMonth_other: 'O {{count}} mesiacov',
+ inWeek_one: 'O {{count}} týždeň',
+ inWeek_few: 'O {{count}} týždne',
+ inWeek_many: 'O {{count}} týždňa',
+ inWeek_other: 'O {{count}} týždňov',
+ justNow: 'Práve teraz',
+ monthAgo_one: 'pred {{count}} mesiacom',
+ monthAgo_few: 'pred {{count}} mesiacmi',
+ monthAgo_many: 'pred {{count}} mesiaca',
+ monthAgo_other: 'pred {{count}} mesiacmi',
+ secondsAgoShort: 'pred {{count}} s',
+ minutesAgoShort: 'pred {{count}} min',
+ hoursAgoShort: 'pred {{count}} h',
+ today: 'Dnes',
+ tomorrow: 'Zajtra',
+ weekAgo_one: 'pred {{count}} týždňom',
+ weekAgo_few: 'pred {{count}} týždňami',
+ weekAgo_many: 'pred {{count}} týždňa',
+ weekAgo_other: 'pred {{count}} týždňami',
+ yesterday: 'Včera',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Akcie pre {{title}}',
+ createDeck: 'Vytvoriť balíček',
+ createNote: 'Vytvoriť poznámku',
+ deleteDeck: 'Odstrániť balíček',
+ editDeck: 'Upraviť balíček',
+ newNote: 'Nová poznámka',
+ openDeck: 'Otvoriť balíček {{title}}',
+ saveDeck: 'Balíček sa nepodarilo uložiť',
+ studyNow: 'Študovať teraz',
+ },
+ descriptions: {
+ emptyDeck: 'Pridajte poznámku, aby mal tento balíček materiál na opakovanie.',
+ editorDefault: 'Sústredený študijný balíček.',
+ editorVisual: 'Vyberte symbol obalu pre tento balíček.',
+ notesSearchPlaceholder: 'Hľadať poznámky…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Toto presunie "{{title}}" do Koša. Neskôr ho môžete obnoviť.',
+ deleteDeckFallbackDescription: 'Toto presunie tento balíček do Koša. Neskôr ho môžete obnoviť.',
+ deleteDeckFallbackTitle: 'Odstrániť balíček?',
+ deleteDeckTitle: 'Odstrániť "{{title}}"?',
+ deleteNoteDescription: 'Toto presunie "{{title}}" do Koša. Neskôr ju môžete obnoviť.',
+ deleteNoteFallbackTitle: 'Odstrániť poznámku?',
+ deleteNoteTitle: 'Odstrániť "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Žiadne zodpovedajúce poznámky',
+ noMatchingNotesDescription: 'Žiadne poznámky nezodpovedali "{{query}}".',
+ thisDeckIsEmpty: 'Tento balíček je prázdny',
+ },
+ errors: {
+ couldNotCreateDeck: 'Balíček sa nepodarilo vytvoriť',
+ couldNotDeleteDeck: 'Balíček sa nepodarilo odstrániť',
+ couldNotDeleteNote: 'Poznámku sa nepodarilo odstrániť',
+ couldNotLoadFolderPath: 'Cestu priečinka sa nepodarilo načítať',
+ couldNotSaveDeck: 'Balíček sa nepodarilo uložiť',
+ deckCouldNotLoad: 'Balíček sa nepodarilo načítať',
+ notesCouldNotLoad: 'Poznámky sa nepodarilo načítať',
+ notesMayBeOutOfDate: 'Poznámky môžu byť zastarané',
+ },
+ fields: {
+ descriptionLabel: 'Popis balíčka',
+ descriptionPlaceholder: 'Čo vám tento balíček pomôže opakovať?',
+ namePlaceholder: 'Názov balíčka',
+ untitledDeck: 'Balíček bez názvu',
+ untitledDeckLower: 'balíček bez názvu',
+ },
+ labels: {
+ createDeckTitle: 'Vytvoriť balíček',
+ deck: 'Balíček',
+ deckNotesSearch: 'Hľadanie poznámok v balíčku',
+ deckOverview: 'Prehľad balíčka',
+ decks: 'Balíčky',
+ due: 'Termín',
+ dueToday: 'Termín dnes',
+ loadingDeck: 'Načítava sa balíček',
+ mastery: 'Zvládnutie',
+ notes: 'Poznámky',
+ },
+ sort: {
+ ariaLabel: 'Triediť balíčky',
+ dueToday: 'Termín dnes',
+ title: 'Názov',
+ updated: 'Aktualizované',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Údaje sa zmenili. Obnovte ich a skúste to znova.',
+ forbidden: 'Na túto akciu nemáte povolenie.',
+ notFound: 'Túto položku sa nám nepodarilo nájsť.',
+ offline: 'Služba je nedostupná.',
+ timeout: 'Trvalo to príliš dlho. Skúste to znova.',
+ unauthorized: 'Ak chcete pokračovať, prihláste sa.',
+ unavailable: 'Služba je dočasne nedostupná.',
+ },
+ fallback: {
+ unexpected: 'Neočakávaná chyba',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Vytvoriť priečinok',
+ deleteFolder: 'Odstrániť priečinok',
+ editFolder: 'Upraviť priečinok',
+ },
+ descriptions: {
+ editorDefault: 'Priečinok pre súvisiace balíčky.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Toto presunie "{{name}}" do Koša. Neskôr ho môžete obnoviť.',
+ deleteFolderFallbackDescription: 'Toto presunie tento priečinok do Koša. Neskôr ho môžete obnoviť.',
+ deleteFolderFallbackTitle: 'Odstrániť priečinok?',
+ deleteFolderTitle: 'Odstrániť "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'V tomto priečinku nie sú žiadne zhody',
+ noMatchesInFolderDescription: 'Žiadne priečinky, balíčky ani poznámky nezodpovedali "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Priečinok sa nepodarilo vytvoriť',
+ couldNotDeleteFolder: 'Priečinok sa nepodarilo odstrániť',
+ couldNotLoadFolderPath: 'Cestu priečinka sa nepodarilo načítať',
+ couldNotSaveFolder: 'Priečinok sa nepodarilo uložiť',
+ folderCouldNotLoad: 'Priečinok sa nepodarilo načítať',
+ },
+ fields: {
+ descriptionLabel: 'Popis priečinka',
+ descriptionPlaceholder: 'Čo patrí do tohto priečinka?',
+ namePlaceholder: 'Názov priečinka',
+ untitledFolder: 'Priečinok bez názvu',
+ },
+ labels: {
+ createFolderTitle: 'Vytvoriť priečinok',
+ folder: 'Priečinok',
+ folders: 'Priečinky',
+ loadingFolder: 'Načítava sa priečinok',
+ name: 'Názov',
+ updated: 'Aktualizované',
+ },
+ sort: {
+ ariaLabel: 'Triediť priečinky',
+ name: 'Názov',
+ updated: 'Aktualizované',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Ak sa lokálne a synchronizované údaje niekedy nezhodnú, položka sa zobrazí tu.',
+ heading: 'Stav synchronizácie',
+ title: 'Konflikty',
+ noConflicts: 'Nenašli sa žiadne konflikty',
+ },
+ labels: {
+ menu: 'Menu',
+ },
+ sections: {
+ settings: {
+ description: 'Prispôsobte si prostredie a predvoľby',
+ title: 'Nastavenia',
+ },
+ trash: {
+ description: 'Obnovte alebo natrvalo odstráňte odstránené položky',
+ title: 'Kôš',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Zavrieť editor',
+ openActions: 'Otvoriť akcie',
+ openWorkspaces: 'Otvoriť pracovné priestory',
+ },
+ items: {
+ home: 'Domov',
+ menu: 'Menu',
+ primary: 'Primárne',
+ settings: 'Nastavenia',
+ spaces: 'Priestory',
+ trash: 'Kôš',
+ workspaces: 'Pracovné priestory',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Pridať cloze',
+ deleteNote: 'Odstrániť poznámku',
+ editNote: 'Upraviť poznámku',
+ hideDerivedCardsNote: 'Skryť poznámku o odvodených kartách',
+ openNote: 'Otvoriť {{title}}',
+ saveNote: 'Uložiť poznámku',
+ showDerivedCardsNote: 'Zobraziť poznámku o odvodených kartách',
+ },
+ descriptions: {
+ clozeFormat: 'Každá skrytá časť sa po uložení zmení na kartu na opakovanie.',
+ clozeFormatPrefix: 'Skrytý text obaľte pomocou',
+ derivedCardsHelper: 'Poznámky sú zdrojom pravdy pre odvodené karty.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Toto presunie "{{title}}" do Koša. Neskôr ju môžete obnoviť.',
+ deleteNoteFallbackDescription: 'Toto presunie túto poznámku do Koša. Neskôr ju môžete obnoviť.',
+ deleteNoteFallbackTitle: 'Odstrániť poznámku?',
+ deleteNoteTitle: 'Odstrániť "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Poznámku sa nepodarilo vytvoriť',
+ couldNotDeleteNote: 'Poznámku sa nepodarilo odstrániť',
+ couldNotSaveNote: 'Poznámku sa nepodarilo uložiť',
+ noteCouldNotLoad: 'Poznámku sa nepodarilo načítať',
+ },
+ fields: {
+ back: 'Zadná strana',
+ backPlaceholder: 'Zadajte zadnú stranu',
+ bodyPlaceholder: 'Napíšte telo poznámky s cloze vynechávkami…',
+ front: 'Predná strana',
+ frontPlaceholder: 'Zadajte prednú stranu',
+ noteBody: 'Telo poznámky',
+ title: 'Názov',
+ titlePlaceholder: 'Pridajte názov poznámky',
+ untitledCloze: 'Cloze bez názvu',
+ untitledNote: 'Poznámka bez názvu',
+ },
+ labels: {
+ backUppercase: 'ZADNÁ STRANA',
+ basic: 'Základná',
+ basicLower: 'základná',
+ basicUppercase: 'ZÁKLADNÁ',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Formát cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Balíček',
+ derivedCards: 'ODVODENÉ KARTY',
+ due: 'Termín',
+ frontUppercase: 'PREDNÁ STRANA',
+ inProgress: 'Prebieha',
+ inProgressUppercase: 'PREBIEHA',
+ loadingNote: 'Načítava sa poznámka',
+ loadingNoteEditor: 'Načítava sa editor poznámok',
+ markdownFormatting: 'Formátovanie Markdown',
+ mastered: 'Zvládnuté',
+ masteredUppercase: 'ZVLÁDNUTÉ',
+ newNote: 'Nová poznámka',
+ noteBody: 'TELO POZNÁMKY',
+ noteContent: 'Obsah poznámky',
+ noteDetails: 'Podrobnosti poznámky',
+ noteMetadata: 'Metadáta poznámky',
+ noteType: 'Typ poznámky',
+ notes: 'Poznámky',
+ reviewed: 'Opakované',
+ studyProgress: 'Študijný pokrok',
+ studyProgressUppercase: 'ŠTUDIJNÝ POKROK',
+ titleUppercase: 'NÁZOV',
+ updated: 'Aktualizované',
+ },
+ sort: {
+ ariaLabel: 'Triediť poznámky',
+ title: 'Názov',
+ updated: 'Aktualizované',
+ },
+ toolbar: {
+ bold: 'Tučné',
+ italic: 'Kurzíva',
+ link: 'Odkaz',
+ list: 'Zoznam',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Znova',
+ backToDeck: 'Späť na balíček',
+ continueReview: 'Pokračovať v opakovaní',
+ easy: 'Ľahké',
+ good: 'Dobré',
+ hard: 'Ťažké',
+ newNote: 'Nová poznámka',
+ showAnswer: 'Zobraziť odpoveď',
+ },
+ errors: {
+ couldNotGradeCard: 'Kartu sa nepodarilo ohodnotiť',
+ reviewCouldNotLoad: 'Opakovanie sa nepodarilo načítať',
+ reviewCouldNotStart: 'Opakovanie sa nepodarilo spustiť',
+ summaryCouldNotLoad: 'Súhrn opakovania sa nepodarilo načítať',
+ summaryNotAvailable: 'Súhrn opakovania nie je dostupný',
+ summaryNotComplete: 'Toto opakovanie ešte nie je dokončené.',
+ },
+ labels: {
+ cardsReviewed: 'Opakované karty',
+ deck: 'Balíček',
+ duration: 'Trvanie',
+ loadingReview: 'Načítava sa opakovanie',
+ loadingSummary: 'Načítava sa súhrn',
+ progress: 'Pokrok opakovania',
+ review: 'Opakovanie',
+ reviewComplete: 'Opakovanie dokončené',
+ reviewed_one: 'Opakovaná {{count}}',
+ reviewed_few: 'Opakované {{count}}',
+ reviewed_many: 'Opakované {{count}}',
+ reviewed_other: 'Opakované {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Váš pokrok bol uložený do tohto balíčka.',
+ },
+ unavailable: {
+ description: 'Pridajte poznámku, aby sa tento balíček mohol dostať do frontu opakovania.',
+ title: 'Žiadne karty na opakovanie',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Vymazať hľadanie',
+ },
+ empty: {
+ noMatchesInWorkspace: 'V tomto pracovnom priestore nie sú žiadne zhody',
+ noMatchesInWorkspaceDescription: 'Žiadne priečinky, balíčky ani poznámky nezodpovedali "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Hľadanie sa nepodarilo dokončiť',
+ },
+ labels: {
+ results: 'Výsledky hľadania',
+ resultsFor: 'Výsledky pre "{{query}}"',
+ searchingContent: 'Hľadá sa obsah',
+ },
+ resultGroups: {
+ deck: 'Balíčky',
+ folder: 'Priečinky',
+ note: 'Poznámky',
+ },
+ resultKinds: {
+ deck: 'balíček',
+ folder: 'priečinok',
+ note: 'poznámka',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Resetovať všetky nastavenia',
+ resetSettings: 'Resetovať nastavenia',
+ resetToDefaults: 'Obnoviť predvolené',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Vložte platný JSON s 21 číselnými hodnotami.',
+ fsrsErrorInvalidParams_one: 'Zadajte pole JSON s presne {{count}} konečným číslom.',
+ fsrsErrorInvalidParams_few: 'Zadajte pole JSON s presne {{count}} konečnými číslami.',
+ fsrsErrorInvalidParams_many: 'Zadajte pole JSON s presne {{count}} konečného čísla.',
+ fsrsErrorInvalidParams_other: 'Zadajte pole JSON s presne {{count}} konečnými číslami.',
+ fsrsHelper: 'Toto je expertné prepísanie. Hodnoty musia zostať v poradí.',
+ fsrsJsonLabel: 'JSON parametrov FSRS',
+ fsrsTitle: 'Upraviť parametre FSRS',
+ fsrsDescription: 'Vložte pole JSON s 21 číslami na prepísanie váh plánovača.',
+ resetDescription: 'Toto obnoví časové pásmo, študijné limity a nastavenia FSRS.',
+ resetDescriptionWithLanguage: 'Toto obnoví jazyk, časové pásmo, študijné limity a nastavenia FSRS.',
+ resetTitle: 'Resetovať všetky nastavenia?',
+ timezoneDescription: 'Hľadajte mesto alebo identifikátor časového pásma.',
+ timezoneSearchLabel: 'Hľadať časové pásma',
+ timezoneSearchPlaceholder: 'Hľadať časové pásma…',
+ timezoneTitle: 'Vybrať časové pásmo',
+ },
+ errors: {
+ couldNotResetSettings: 'Nastavenia sa nepodarilo resetovať',
+ couldNotSaveSettings: 'Nastavenia sa nepodarilo uložiť',
+ settingsCouldNotLoad: 'Nastavenia sa nepodarilo načítať',
+ settingsUnavailable: 'Nastavenia nie sú dostupné.',
+ },
+ labels: {
+ appearance: 'Vzhľad',
+ automatic: 'Automaticky',
+ fsrsParameters: 'Parametre FSRS',
+ general: 'Všeobecné',
+ language: 'Jazyk',
+ loadingSettings: 'Načítavajú sa nastavenia',
+ masteryHorizon: 'Horizont zvládnutia',
+ newCardOrder: 'Poradie nových kariet',
+ newCardsPerDay: 'Nové karty za deň',
+ reviewCardsPerDay: 'Karty na opakovanie za deň',
+ savingSettings: 'Ukladajú sa nastavenia',
+ schedule: 'Plán',
+ searchNoTimezones: 'Žiadne zodpovedajúce časové pásma.',
+ settings: 'Nastavenia',
+ settingsReset: 'Nastavenia resetované',
+ study: 'Štúdium',
+ targetRecallProbability: 'Cieľová pravdepodobnosť vybavenia',
+ theme: 'Motív',
+ timezone: 'Časové pásmo',
+ },
+ options: {
+ languageEnUs: 'Angličtina (USA)',
+ newCardsAfterReviews: 'Po opakovaniach',
+ newCardsBeforeReviews: 'Pred opakovaniami',
+ newCardsMixed: 'Zmiešané',
+ themeDark: 'Tmavý',
+ themeLight: 'Svetlý',
+ themeSystem: 'Systém',
+ timezoneSystem: 'Použiť systémové časové pásmo',
+ },
+ rows: {
+ fsrsDescription: 'Váhy expertného modelu',
+ languageDescription: 'Jazyk rozhrania',
+ masteryHorizonDescription: 'Počet dní, počas ktorých musí karta zostať vybaviteľná na cieľovej pravdepodobnosti alebo nad ňou, aby sa počítala ako zvládnutá',
+ newCardOrderDescription: 'Poradie nových kariet vzhľadom na opakovania',
+ newCardsPerDayDescription: 'Maximálny počet nových kariet za deň',
+ reviewCardsPerDayDescription: 'Maximálny počet kariet na opakovanie za deň',
+ targetRecallProbabilityDescription: 'Minimálna pravdepodobnosť vybavenia pri najbližšom naplánovanom opakovaní',
+ timezoneDescription: 'Použiť automatické časové pásmo alebo vybrať mesto.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Odstrániť natrvalo',
+ empty: 'Vyprázdniť',
+ emptyTrash: 'Vyprázdniť kôš',
+ restore: 'Obnoviť',
+ restoringItem: 'Obnovuje sa {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Toto natrvalo odstráni "{{title}}". Nedá sa to vrátiť späť.',
+ deleteItemFallbackDescription: 'Toto natrvalo odstráni túto položku. Nedá sa to vrátiť späť.',
+ deleteItemFallbackTitle: 'Odstrániť položku?',
+ deleteItemTitle: 'Odstrániť "{{title}}"?',
+ emptyTrashDescription: 'Toto natrvalo odstráni všetko v Koši. Nedá sa to vrátiť späť.',
+ emptyTrashTitle: 'Vyprázdniť kôš?',
+ },
+ empty: {
+ description: 'Položky, ktoré odstránite, sa tu zobrazia pred trvalým odstránením.',
+ title: 'Kôš je prázdny',
+ },
+ errors: {
+ couldNotDeleteItem: 'Položku sa nepodarilo odstrániť',
+ couldNotEmptyTrash: 'Kôš sa nepodarilo vyprázdniť',
+ couldNotRestoreItem: 'Položku sa nepodarilo obnoviť',
+ trashCouldNotLoad: 'Kôš sa nepodarilo načítať',
+ trashMayBeOutOfDate: 'Kôš môže byť zastaraný',
+ },
+ labels: {
+ deletedAge: 'Odstránené {{value}}',
+ itemCount_one: '{{count}} položka',
+ itemCount_few: '{{count}} položky',
+ itemCount_many: '{{count}} položky',
+ itemCount_other: '{{count}} položiek',
+ lastEmptied: 'Naposledy vyprázdnené {{value}}',
+ loadingTrash: 'Načítava sa kôš',
+ originalLocation: 'Pôvodné umiestnenie: {{location}}',
+ title: 'Kôš',
+ trashActions: 'Akcie Koša pre {{title}}',
+ },
+ kinds: {
+ deck: 'Balíček',
+ folder: 'Priečinok',
+ note: 'Poznámka',
+ workspace: 'Pracovný priestor',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Vytvoriť pracovný priestor',
+ deleteWorkspace: 'Odstrániť pracovný priestor',
+ editWorkspace: 'Upraviť pracovný priestor',
+ newWorkspace: 'Nový pracovný priestor',
+ openWorkspace: 'Otvoriť {{title}}',
+ openingWorkspace: 'Otvára sa {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Študijný kontext.',
+ editorVisual: 'Vyberte vizuálnu kotvu pre tento pracovný priestor.',
+ emptyList: 'Oddeľte balíčky, poznámky a fronty opakovania podľa študijného kontextu.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Toto presunie "{{title}}" do Koša. Neskôr ho môžete obnoviť.',
+ deleteWorkspaceFallbackDescription: 'Toto presunie tento pracovný priestor do Koša. Neskôr ho môžete obnoviť.',
+ deleteWorkspaceFallbackTitle: 'Odstrániť pracovný priestor?',
+ deleteWorkspaceTitle: 'Odstrániť "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Začnite pracovným priestorom',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Pracovný priestor sa nepodarilo vytvoriť',
+ couldNotDeleteWorkspace: 'Pracovný priestor sa nepodarilo odstrániť',
+ couldNotOpenWorkspace: 'Pracovný priestor sa nepodarilo otvoriť',
+ couldNotSaveWorkspace: 'Pracovný priestor sa nepodarilo uložiť',
+ workspaceCouldNotLoad: 'Pracovný priestor sa nepodarilo načítať',
+ workspacesCouldNotLoad: 'Pracovné priestory sa nepodarilo načítať',
+ },
+ fields: {
+ descriptionLabel: 'Popis pracovného priestoru',
+ descriptionPlaceholder: 'Čo patrí do tohto pracovného priestoru?',
+ namePlaceholder: 'Názov pracovného priestoru',
+ untitledWorkspace: 'Pracovný priestor bez názvu',
+ },
+ labels: {
+ createWorkspaceTitle: 'Vytvoriť pracovný priestor',
+ loadingWorkspaces: 'Načítavajú sa pracovné priestory',
+ workspace: 'Pracovný priestor',
+ workspaces: 'Pracovné priestory',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/sl.ts b/ui/src/core/i18n/resources/sl.ts
new file mode 100644
index 0000000..9ed9767
--- /dev/null
+++ b/ui/src/core/i18n/resources/sl.ts
@@ -0,0 +1,649 @@
+export const sl = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Poskusite znova. Če se to ponavlja, znova odprite Clear.',
+ title: 'Zagon ni uspel',
+ },
+ loadingTitle: 'Pripravljamo vaš učni prostor',
+ },
+ common: {
+ actions: {
+ back: 'Nazaj',
+ cancel: 'Prekliči',
+ checkAgain: 'Preveri znova',
+ close: 'Zapri',
+ create: 'Ustvari',
+ delete: 'Izbriši',
+ dismissError: 'Zapri napako',
+ dismissStatus: 'Zapri stanje',
+ edit: 'Uredi',
+ itemActions: 'Dejanja za {{title}}',
+ reset: 'Ponastavi',
+ review: 'Ponavljanje',
+ save: 'Shrani',
+ saveChanges: 'Shrani spremembe',
+ tryAgain: 'Poskusi znova',
+ },
+ labels: {
+ active: 'Aktivno',
+ clear: 'Clear',
+ custom: 'Po meri',
+ default: 'Privzeto',
+ loadingEditor: 'Nalaganje urejevalnika',
+ name: 'Ime',
+ completedTask: 'Dokončano opravilo',
+ description: 'Opis',
+ incompleteTask: 'Nedokončano opravilo',
+ percentageInput: 'Odstotek za {{label}}',
+ visual: 'Vizualno',
+ },
+ status: {
+ actionFailed: 'Dejanje ni uspelo',
+ actionInProgress: 'Dejanje poteka',
+ },
+ sort: {
+ ascending: 'Narašč.',
+ column: 'Stolpec',
+ descending: 'Padaj.',
+ direction: 'Smer',
+ sort: 'Razvrsti',
+ },
+ search: {
+ label: 'Iskanje',
+ },
+ visualPicker: {
+ allLucideIcons: 'Vse ikone Lucide',
+ browseIconsFor: 'Brskajte ali iščite ikone za {{label}}.',
+ chooseIcon: 'Izberi ikono',
+ iconPicker: 'Izbirnik ikon za {{label}}',
+ iconSearch: 'Iskanje ikon za {{label}}',
+ iconsCouldNotLoad: 'Ikon ni bilo mogoče naložiti.',
+ loadingIcons: 'Nalaganje ikon',
+ loadingMoreIcons: 'Nalaganje dodatnih ikon',
+ moreIcons: 'Več ikon',
+ noIconsMatch: 'Nobena ikona se ne ujema z "{{query}}".',
+ searchIconsPlaceholder: 'Išči ikone…',
+ selectedIcon: 'Izbrano {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Ustvari',
+ newDeck: 'Nov komplet',
+ newFolder: 'Nova mapa',
+ },
+ descriptions: {
+ defaultWorkspace: 'Komplete, mape in zapiske imejte skupaj.',
+ emptyWorkspace: 'Ustvarite komplet in nato dodajte zapiske, da sestavite čakalno vrsto za ponavljanje.',
+ emptyFolder: 'Ustvarite komplet in nato dodajte zapiske, da sestavite čakalno vrsto za ponavljanje.',
+ searchPlaceholder: 'Išči mape, komplete in zapiske…',
+ },
+ empty: {
+ createFirstDeck: 'Ustvarite svoj prvi komplet',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Kompleta ni bilo mogoče izbrisati',
+ couldNotDeleteFolder: 'Mape ni bilo mogoče izbrisati',
+ couldNotDeleteWorkspace: 'Delovnega prostora ni bilo mogoče izbrisati',
+ dashboardCouldNotOpen: 'Nadzorne plošče ni bilo mogoče odpreti',
+ decksCouldNotLoad: 'Kompletov ni bilo mogoče naložiti',
+ decksMayBeOutOfDate: 'Kompleti so morda zastareli',
+ foldersCouldNotLoad: 'Map ni bilo mogoče naložiti',
+ foldersMayBeOutOfDate: 'Mape so morda zastarele',
+ workspaceCouldNotLoad: 'Delovnega prostora ni bilo mogoče naložiti',
+ },
+ labels: {
+ dashboard: 'Nadzorna plošča',
+ loadingDashboard: 'Nalaganje nadzorne plošče',
+ newItem: 'Nov element',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Datum ni na voljo',
+ },
+ age: {
+ dayAgo_one: 'pred {{count}} dnem',
+ dayAgo_two: 'pred {{count}} dnevoma',
+ dayAgo_few: 'pred {{count}} dnevi',
+ dayAgo_other: 'pred {{count}} dnevi',
+ hourAgo_one: 'pred {{count}} uro',
+ hourAgo_two: 'pred {{count}} urama',
+ hourAgo_few: 'pred {{count}} urami',
+ hourAgo_other: 'pred {{count}} urami',
+ justNow: 'pravkar',
+ minuteAgo_one: 'pred {{count}} minuto',
+ minuteAgo_two: 'pred {{count}} minutama',
+ minuteAgo_few: 'pred {{count}} minutami',
+ minuteAgo_other: 'pred {{count}} minutami',
+ unavailable: 'datum ni na voljo',
+ weekAgo_one: 'pred {{count}} tednom',
+ weekAgo_two: 'pred {{count}} tednoma',
+ weekAgo_few: 'pred {{count}} tedni',
+ weekAgo_other: 'pred {{count}} tedni',
+ },
+ labels: {
+ deleted: 'Izbrisano {{value}}',
+ due: 'Rok: {{value}}',
+ reviewed: 'Ponovljeno: {{value}}',
+ updated: 'Posodobljeno {{value}}',
+ updatedUppercase: 'POSODOBLJENO {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'pred {{count}} dnem',
+ dayAgo_two: 'pred {{count}} dnevoma',
+ dayAgo_few: 'pred {{count}} dnevi',
+ dayAgo_other: 'pred {{count}} dnevi',
+ inAMoment: 'Čez trenutek',
+ inDay_one: 'Čez {{count}} dan',
+ inDay_two: 'Čez {{count}} dneva',
+ inDay_few: 'Čez {{count}} dni',
+ inDay_other: 'Čez {{count}} dni',
+ inMonth_one: 'Čez {{count}} mesec',
+ inMonth_two: 'Čez {{count}} meseca',
+ inMonth_few: 'Čez {{count}} mesece',
+ inMonth_other: 'Čez {{count}} mesecev',
+ inWeek_one: 'Čez {{count}} teden',
+ inWeek_two: 'Čez {{count}} tedna',
+ inWeek_few: 'Čez {{count}} tedne',
+ inWeek_other: 'Čez {{count}} tednov',
+ justNow: 'Pravkar',
+ monthAgo_one: 'pred {{count}} mesecem',
+ monthAgo_two: 'pred {{count}} mesecema',
+ monthAgo_few: 'pred {{count}} meseci',
+ monthAgo_other: 'pred {{count}} meseci',
+ secondsAgoShort: 'pred {{count}} s',
+ minutesAgoShort: 'pred {{count}} min',
+ hoursAgoShort: 'pred {{count}} h',
+ today: 'Danes',
+ tomorrow: 'Jutri',
+ weekAgo_one: 'pred {{count}} tednom',
+ weekAgo_two: 'pred {{count}} tednoma',
+ weekAgo_few: 'pred {{count}} tedni',
+ weekAgo_other: 'pred {{count}} tedni',
+ yesterday: 'Včeraj',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Dejanja za {{title}}',
+ createDeck: 'Ustvari komplet',
+ createNote: 'Ustvari zapisek',
+ deleteDeck: 'Izbriši komplet',
+ editDeck: 'Uredi komplet',
+ newNote: 'Nov zapisek',
+ openDeck: 'Odpri komplet {{title}}',
+ saveDeck: 'Kompleta ni bilo mogoče shraniti',
+ studyNow: 'Uči se zdaj',
+ },
+ descriptions: {
+ emptyDeck: 'Dodajte zapisek, da bo imel ta komplet gradivo za ponavljanje.',
+ editorDefault: 'Osredotočen učni komplet.',
+ editorVisual: 'Izberite simbol naslovnice za ta komplet.',
+ notesSearchPlaceholder: 'Išči zapiske…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'To premakne "{{title}}" v Koš. Pozneje ga lahko obnovite.',
+ deleteDeckFallbackDescription: 'To premakne ta komplet v Koš. Pozneje ga lahko obnovite.',
+ deleteDeckFallbackTitle: 'Izbrisati komplet?',
+ deleteDeckTitle: 'Izbrisati "{{title}}"?',
+ deleteNoteDescription: 'To premakne "{{title}}" v Koš. Pozneje ga lahko obnovite.',
+ deleteNoteFallbackTitle: 'Izbrisati zapisek?',
+ deleteNoteTitle: 'Izbrisati "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Ni ujemajočih se zapiskov',
+ noMatchingNotesDescription: 'Noben zapisek se ne ujema z "{{query}}".',
+ thisDeckIsEmpty: 'Ta komplet je prazen',
+ },
+ errors: {
+ couldNotCreateDeck: 'Kompleta ni bilo mogoče ustvariti',
+ couldNotDeleteDeck: 'Kompleta ni bilo mogoče izbrisati',
+ couldNotDeleteNote: 'Zapiska ni bilo mogoče izbrisati',
+ couldNotLoadFolderPath: 'Poti mape ni bilo mogoče naložiti',
+ couldNotSaveDeck: 'Kompleta ni bilo mogoče shraniti',
+ deckCouldNotLoad: 'Kompleta ni bilo mogoče naložiti',
+ notesCouldNotLoad: 'Zapiskov ni bilo mogoče naložiti',
+ notesMayBeOutOfDate: 'Zapiski so morda zastareli',
+ },
+ fields: {
+ descriptionLabel: 'Opis kompleta',
+ descriptionPlaceholder: 'Kaj vam bo ta komplet pomagal ponavljati?',
+ namePlaceholder: 'Ime kompleta',
+ untitledDeck: 'Komplet brez naslova',
+ untitledDeckLower: 'komplet brez naslova',
+ },
+ labels: {
+ createDeckTitle: 'Ustvari komplet',
+ deck: 'Komplet',
+ deckNotesSearch: 'Iskanje zapiskov v kompletu',
+ deckOverview: 'Pregled kompleta',
+ decks: 'Kompleti',
+ due: 'Rok',
+ dueToday: 'Rok danes',
+ loadingDeck: 'Nalaganje kompleta',
+ mastery: 'Obvladovanje',
+ notes: 'Zapiski',
+ },
+ sort: {
+ ariaLabel: 'Razvrsti komplete',
+ dueToday: 'Rok danes',
+ title: 'Naslov',
+ updated: 'Posodobljeno',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Podatki so se spremenili. Osvežite in poskusite znova.',
+ forbidden: 'Nimate dovoljenja za to dejanje.',
+ notFound: 'Tega elementa nismo mogli najti.',
+ offline: 'Storitve ni mogoče doseči.',
+ timeout: 'To je trajalo predolgo. Poskusite znova.',
+ unauthorized: 'Za nadaljevanje se prijavite.',
+ unavailable: 'Storitev začasno ni na voljo.',
+ },
+ fallback: {
+ unexpected: 'Nepričakovana napaka',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Ustvari mapo',
+ deleteFolder: 'Izbriši mapo',
+ editFolder: 'Uredi mapo',
+ },
+ descriptions: {
+ editorDefault: 'Mapa za povezane komplete.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'To premakne "{{name}}" v Koš. Pozneje jo lahko obnovite.',
+ deleteFolderFallbackDescription: 'To premakne to mapo v Koš. Pozneje jo lahko obnovite.',
+ deleteFolderFallbackTitle: 'Izbrisati mapo?',
+ deleteFolderTitle: 'Izbrisati "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'V tej mapi ni zadetkov',
+ noMatchesInFolderDescription: 'Nobena mapa, komplet ali zapisek se ne ujema z "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Mape ni bilo mogoče ustvariti',
+ couldNotDeleteFolder: 'Mape ni bilo mogoče izbrisati',
+ couldNotLoadFolderPath: 'Poti mape ni bilo mogoče naložiti',
+ couldNotSaveFolder: 'Mape ni bilo mogoče shraniti',
+ folderCouldNotLoad: 'Mape ni bilo mogoče naložiti',
+ },
+ fields: {
+ descriptionLabel: 'Opis mape',
+ descriptionPlaceholder: 'Kaj spada v to mapo?',
+ namePlaceholder: 'Ime mape',
+ untitledFolder: 'Mapa brez naslova',
+ },
+ labels: {
+ createFolderTitle: 'Ustvari mapo',
+ folder: 'Mapa',
+ folders: 'Mape',
+ loadingFolder: 'Nalaganje mape',
+ name: 'Ime',
+ updated: 'Posodobljeno',
+ },
+ sort: {
+ ariaLabel: 'Razvrsti mape',
+ name: 'Ime',
+ updated: 'Posodobljeno',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Če se lokalni in sinhronizirani podatki kdaj ne ujemajo, se bo element prikazal tukaj.',
+ heading: 'Stanje sinhronizacije',
+ title: 'Spori',
+ noConflicts: 'Ni najdenih sporov',
+ },
+ labels: {
+ menu: 'Meni',
+ },
+ sections: {
+ settings: {
+ description: 'Prilagodite svoje okolje in nastavitve',
+ title: 'Nastavitve',
+ },
+ trash: {
+ description: 'Obnovite ali trajno izbrišite odstranjene elemente',
+ title: 'Koš',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Zapri urejevalnik',
+ openActions: 'Odpri dejanja',
+ openWorkspaces: 'Odpri delovne prostore',
+ },
+ items: {
+ home: 'Domov',
+ menu: 'Meni',
+ primary: 'Glavno',
+ settings: 'Nastavitve',
+ spaces: 'Prostori',
+ trash: 'Koš',
+ workspaces: 'Delovni prostori',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Dodaj cloze',
+ deleteNote: 'Izbriši zapisek',
+ editNote: 'Uredi zapisek',
+ hideDerivedCardsNote: 'Skrij opombo o izpeljanih karticah',
+ openNote: 'Odpri {{title}}',
+ saveNote: 'Shrani zapisek',
+ showDerivedCardsNote: 'Prikaži opombo o izpeljanih karticah',
+ },
+ descriptions: {
+ clozeFormat: 'Vsak skriti del po shranjevanju postane kartica za ponavljanje.',
+ clozeFormatPrefix: 'Skrito besedilo obdajte z',
+ derivedCardsHelper: 'Zapiski so vir resnice za izpeljane kartice.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'To premakne "{{title}}" v Koš. Pozneje ga lahko obnovite.',
+ deleteNoteFallbackDescription: 'To premakne ta zapisek v Koš. Pozneje ga lahko obnovite.',
+ deleteNoteFallbackTitle: 'Izbrisati zapisek?',
+ deleteNoteTitle: 'Izbrisati "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Zapiska ni bilo mogoče ustvariti',
+ couldNotDeleteNote: 'Zapiska ni bilo mogoče izbrisati',
+ couldNotSaveNote: 'Zapiska ni bilo mogoče shraniti',
+ noteCouldNotLoad: 'Zapiska ni bilo mogoče naložiti',
+ },
+ fields: {
+ back: 'Hrbtna stran',
+ backPlaceholder: 'Vnesite hrbtno stran',
+ bodyPlaceholder: 'Napišite vsebino zapiska z izbrisi cloze…',
+ front: 'Sprednja stran',
+ frontPlaceholder: 'Vnesite sprednjo stran',
+ noteBody: 'Vsebina zapiska',
+ title: 'Naslov',
+ titlePlaceholder: 'Dodajte naslov zapiska',
+ untitledCloze: 'Cloze brez naslova',
+ untitledNote: 'Zapisek brez naslova',
+ },
+ labels: {
+ backUppercase: 'HRBTNA STRAN',
+ basic: 'Osnovno',
+ basicLower: 'osnovno',
+ basicUppercase: 'OSNOVNO',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Oblika cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Komplet',
+ derivedCards: 'IZPELJANE KARTICE',
+ due: 'Rok',
+ frontUppercase: 'SPREDNJA STRAN',
+ inProgress: 'V teku',
+ inProgressUppercase: 'V TEKU',
+ loadingNote: 'Nalaganje zapiska',
+ loadingNoteEditor: 'Nalaganje urejevalnika zapiskov',
+ markdownFormatting: 'Oblikovanje Markdown',
+ mastered: 'Obvladano',
+ masteredUppercase: 'OBVLADANO',
+ newNote: 'Nov zapisek',
+ noteBody: 'VSEBINA ZAPISKA',
+ noteContent: 'Vsebina zapiska',
+ noteDetails: 'Podrobnosti zapiska',
+ noteMetadata: 'Metapodatki zapiska',
+ noteType: 'Vrsta zapiska',
+ notes: 'Zapiski',
+ reviewed: 'Ponovljeno',
+ studyProgress: 'Napredek učenja',
+ studyProgressUppercase: 'NAPREDEK UČENJA',
+ titleUppercase: 'NASLOV',
+ updated: 'Posodobljeno',
+ },
+ sort: {
+ ariaLabel: 'Razvrsti zapiske',
+ title: 'Naslov',
+ updated: 'Posodobljeno',
+ },
+ toolbar: {
+ bold: 'Krepko',
+ italic: 'Ležeče',
+ link: 'Povezava',
+ list: 'Seznam',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Znova',
+ backToDeck: 'Nazaj na komplet',
+ continueReview: 'Nadaljuj ponavljanje',
+ easy: 'Lahko',
+ good: 'Dobro',
+ hard: 'Težko',
+ newNote: 'Nov zapisek',
+ showAnswer: 'Prikaži odgovor',
+ },
+ errors: {
+ couldNotGradeCard: 'Kartice ni bilo mogoče oceniti',
+ reviewCouldNotLoad: 'Ponavljanja ni bilo mogoče naložiti',
+ reviewCouldNotStart: 'Ponavljanja ni bilo mogoče začeti',
+ summaryCouldNotLoad: 'Povzetka ponavljanja ni bilo mogoče naložiti',
+ summaryNotAvailable: 'Povzetek ponavljanja ni na voljo',
+ summaryNotComplete: 'To ponavljanje še ni dokončano.',
+ },
+ labels: {
+ cardsReviewed: 'Ponovljene kartice',
+ deck: 'Komplet',
+ duration: 'Trajanje',
+ loadingReview: 'Nalaganje ponavljanja',
+ loadingSummary: 'Nalaganje povzetka',
+ progress: 'Napredek ponavljanja',
+ review: 'Ponavljanje',
+ reviewComplete: 'Ponavljanje dokončano',
+ reviewed_one: 'Ponovljena {{count}}',
+ reviewed_two: 'Ponovljeni {{count}}',
+ reviewed_few: 'Ponovljene {{count}}',
+ reviewed_other: 'Ponovljeno {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Vaš napredek je bil shranjen v ta komplet.',
+ },
+ unavailable: {
+ description: 'Dodajte zapisek, da lahko ta komplet vstopi v čakalno vrsto za ponavljanje.',
+ title: 'Ni kartic za ponavljanje',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Počisti iskanje',
+ },
+ empty: {
+ noMatchesInWorkspace: 'V tem delovnem prostoru ni zadetkov',
+ noMatchesInWorkspaceDescription: 'Nobena mapa, komplet ali zapisek se ne ujema z "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Iskanja ni bilo mogoče dokončati',
+ },
+ labels: {
+ results: 'Rezultati iskanja',
+ resultsFor: 'Rezultati za "{{query}}"',
+ searchingContent: 'Iskanje vsebine',
+ },
+ resultGroups: {
+ deck: 'Kompleti',
+ folder: 'Mape',
+ note: 'Zapiski',
+ },
+ resultKinds: {
+ deck: 'komplet',
+ folder: 'mapa',
+ note: 'zapisek',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Ponastavi vse nastavitve',
+ resetSettings: 'Ponastavi nastavitve',
+ resetToDefaults: 'Ponastavi na privzeto',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Prilepite veljaven JSON z 21 številskimi vrednostmi.',
+ fsrsErrorInvalidParams_one: 'Vnesite polje JSON z natanko {{count}} končnim številom.',
+ fsrsErrorInvalidParams_two: 'Vnesite polje JSON z natanko {{count}} končnima številoma.',
+ fsrsErrorInvalidParams_few: 'Vnesite polje JSON z natanko {{count}} končnimi števili.',
+ fsrsErrorInvalidParams_other: 'Vnesite polje JSON z natanko {{count}} končnimi števili.',
+ fsrsHelper: 'To je strokovna preglasitev. Vrednosti morajo ostati v zaporedju.',
+ fsrsJsonLabel: 'JSON parametrov FSRS',
+ fsrsTitle: 'Uredi parametre FSRS',
+ fsrsDescription: 'Prilepite polje JSON z 21 števili, da preglasite uteži razporejevalnika.',
+ resetDescription: 'To obnovi časovni pas, učne omejitve in nastavitve FSRS.',
+ resetDescriptionWithLanguage: 'To obnovi jezik, časovni pas, učne omejitve in nastavitve FSRS.',
+ resetTitle: 'Ponastaviti vse nastavitve?',
+ timezoneDescription: 'Poiščite mesto ali identifikator časovnega pasu.',
+ timezoneSearchLabel: 'Išči časovne pasove',
+ timezoneSearchPlaceholder: 'Išči časovne pasove…',
+ timezoneTitle: 'Izberi časovni pas',
+ },
+ errors: {
+ couldNotResetSettings: 'Nastavitev ni bilo mogoče ponastaviti',
+ couldNotSaveSettings: 'Nastavitev ni bilo mogoče shraniti',
+ settingsCouldNotLoad: 'Nastavitev ni bilo mogoče naložiti',
+ settingsUnavailable: 'Nastavitve niso na voljo.',
+ },
+ labels: {
+ appearance: 'Videz',
+ automatic: 'Samodejno',
+ fsrsParameters: 'Parametri FSRS',
+ general: 'Splošno',
+ language: 'Jezik',
+ loadingSettings: 'Nalaganje nastavitev',
+ masteryHorizon: 'Obzorje obvladovanja',
+ newCardOrder: 'Vrstni red novih kartic',
+ newCardsPerDay: 'Nove kartice na dan',
+ reviewCardsPerDay: 'Kartice za ponavljanje na dan',
+ savingSettings: 'Shranjevanje nastavitev',
+ schedule: 'Razpored',
+ searchNoTimezones: 'Ni ujemajočih se časovnih pasov.',
+ settings: 'Nastavitve',
+ settingsReset: 'Nastavitve ponastavljene',
+ study: 'Učenje',
+ targetRecallProbability: 'Ciljna verjetnost priklica',
+ theme: 'Tema',
+ timezone: 'Časovni pas',
+ },
+ options: {
+ languageEnUs: 'Angleščina (ZDA)',
+ newCardsAfterReviews: 'Po ponavljanjih',
+ newCardsBeforeReviews: 'Pred ponavljanji',
+ newCardsMixed: 'Mešano',
+ themeDark: 'Temna',
+ themeLight: 'Svetla',
+ themeSystem: 'Sistem',
+ timezoneSystem: 'Uporabi sistemski časovni pas',
+ },
+ rows: {
+ fsrsDescription: 'Uteži strokovnega modela',
+ languageDescription: 'Jezik vmesnika',
+ masteryHorizonDescription: 'Število dni, ko mora kartica ostati priklicljiva pri ciljni verjetnosti ali nad njo, da šteje kot obvladana',
+ newCardOrderDescription: 'Vrstni red novih kartic glede na ponavljanja',
+ newCardsPerDayDescription: 'Največje število novih kartic na dan',
+ reviewCardsPerDayDescription: 'Največje število kartic za ponavljanje na dan',
+ targetRecallProbabilityDescription: 'Najmanjša verjetnost priklica pri naslednjem načrtovanem ponavljanju',
+ timezoneDescription: 'Uporabite samodejni časovni pas ali izberite mesto.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Trajno izbriši',
+ empty: 'Izprazni',
+ emptyTrash: 'Izprazni koš',
+ restore: 'Obnovi',
+ restoringItem: 'Obnavljanje {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'To trajno izbriše "{{title}}". Tega ni mogoče razveljaviti.',
+ deleteItemFallbackDescription: 'To trajno izbriše ta element. Tega ni mogoče razveljaviti.',
+ deleteItemFallbackTitle: 'Izbrisati element?',
+ deleteItemTitle: 'Izbrisati "{{title}}"?',
+ emptyTrashDescription: 'To trajno izbriše vse v Košu. Tega ni mogoče razveljaviti.',
+ emptyTrashTitle: 'Izprazniti koš?',
+ },
+ empty: {
+ description: 'Elementi, ki jih izbrišete, se bodo prikazali tukaj pred trajno odstranitvijo.',
+ title: 'Koš je prazen',
+ },
+ errors: {
+ couldNotDeleteItem: 'Elementa ni bilo mogoče izbrisati',
+ couldNotEmptyTrash: 'Koša ni bilo mogoče izprazniti',
+ couldNotRestoreItem: 'Elementa ni bilo mogoče obnoviti',
+ trashCouldNotLoad: 'Koša ni bilo mogoče naložiti',
+ trashMayBeOutOfDate: 'Koš je morda zastarel',
+ },
+ labels: {
+ deletedAge: 'Izbrisano {{value}}',
+ itemCount_one: '{{count}} element',
+ itemCount_two: '{{count}} elementa',
+ itemCount_few: '{{count}} elementi',
+ itemCount_other: '{{count}} elementov',
+ lastEmptied: 'Nazadnje izpraznjeno {{value}}',
+ loadingTrash: 'Nalaganje Koša',
+ originalLocation: 'Izvorna lokacija: {{location}}',
+ title: 'Koš',
+ trashActions: 'Dejanja Koša za {{title}}',
+ },
+ kinds: {
+ deck: 'Komplet',
+ folder: 'Mapa',
+ note: 'Zapisek',
+ workspace: 'Delovni prostor',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Ustvari delovni prostor',
+ deleteWorkspace: 'Izbriši delovni prostor',
+ editWorkspace: 'Uredi delovni prostor',
+ newWorkspace: 'Nov delovni prostor',
+ openWorkspace: 'Odpri {{title}}',
+ openingWorkspace: 'Odpiranje {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Učni kontekst.',
+ editorVisual: 'Izberite vizualno sidro za ta delovni prostor.',
+ emptyList: 'Ločite komplete, zapiske in čakalne vrste za ponavljanje po učnem kontekstu.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'To premakne "{{title}}" v Koš. Pozneje ga lahko obnovite.',
+ deleteWorkspaceFallbackDescription: 'To premakne ta delovni prostor v Koš. Pozneje ga lahko obnovite.',
+ deleteWorkspaceFallbackTitle: 'Izbrisati delovni prostor?',
+ deleteWorkspaceTitle: 'Izbrisati "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Začnite z delovnim prostorom',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Delovnega prostora ni bilo mogoče ustvariti',
+ couldNotDeleteWorkspace: 'Delovnega prostora ni bilo mogoče izbrisati',
+ couldNotOpenWorkspace: 'Delovnega prostora ni bilo mogoče odpreti',
+ couldNotSaveWorkspace: 'Delovnega prostora ni bilo mogoče shraniti',
+ workspaceCouldNotLoad: 'Delovnega prostora ni bilo mogoče naložiti',
+ workspacesCouldNotLoad: 'Delovnih prostorov ni bilo mogoče naložiti',
+ },
+ fields: {
+ descriptionLabel: 'Opis delovnega prostora',
+ descriptionPlaceholder: 'Kaj spada v ta delovni prostor?',
+ namePlaceholder: 'Ime delovnega prostora',
+ untitledWorkspace: 'Delovni prostor brez naslova',
+ },
+ labels: {
+ createWorkspaceTitle: 'Ustvari delovni prostor',
+ loadingWorkspaces: 'Nalaganje delovnih prostorov',
+ workspace: 'Delovni prostor',
+ workspaces: 'Delovni prostori',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/sr-Latn.ts b/ui/src/core/i18n/resources/sr-Latn.ts
new file mode 100644
index 0000000..cff69bf
--- /dev/null
+++ b/ui/src/core/i18n/resources/sr-Latn.ts
@@ -0,0 +1,636 @@
+export const srLatn = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Pokušajte ponovo. Ako se ovo i dalje dešava, ponovo otvorite Clear.',
+ title: 'Pokretanje nije uspelo',
+ },
+ loadingTitle: 'Priprema se vaš prostor za učenje',
+ },
+ common: {
+ actions: {
+ back: 'Nazad',
+ cancel: 'Otkaži',
+ checkAgain: 'Proveri ponovo',
+ close: 'Zatvori',
+ create: 'Napravi',
+ delete: 'Obriši',
+ dismissError: 'Zatvori grešku',
+ dismissStatus: 'Zatvori status',
+ edit: 'Uredi',
+ itemActions: 'Radnje za {{title}}',
+ reset: 'Resetuj',
+ review: 'Ponavljanje',
+ save: 'Sačuvaj',
+ saveChanges: 'Sačuvaj izmene',
+ tryAgain: 'Pokušaj ponovo',
+ },
+ labels: {
+ active: 'Aktivno',
+ clear: 'Clear',
+ custom: 'Prilagođeno',
+ default: 'Podrazumevano',
+ loadingEditor: 'Učitavanje uređivača',
+ name: 'Naziv',
+ completedTask: 'Završen zadatak',
+ description: 'Opis',
+ incompleteTask: 'Nedovršen zadatak',
+ percentageInput: 'Procenat za {{label}}',
+ visual: 'Vizuelno',
+ },
+ status: {
+ actionFailed: 'Radnja nije uspela',
+ actionInProgress: 'Radnja je u toku',
+ },
+ sort: {
+ ascending: 'Rast.',
+ column: 'Kolona',
+ descending: 'Opad.',
+ direction: 'Smer',
+ sort: 'Sortiraj',
+ },
+ search: {
+ label: 'Pretraga',
+ },
+ visualPicker: {
+ allLucideIcons: 'Sve Lucide ikonice',
+ browseIconsFor: 'Pregledajte ili pretražite ikonice za {{label}}.',
+ chooseIcon: 'Izaberi ikonicu',
+ iconPicker: 'Birač ikonice za {{label}}',
+ iconSearch: 'Pretraga ikonica za {{label}}',
+ iconsCouldNotLoad: 'Ikonice nisu mogle da se učitaju.',
+ loadingIcons: 'Učitavanje ikonica',
+ loadingMoreIcons: 'Učitavanje dodatnih ikonica',
+ moreIcons: 'Još ikonica',
+ noIconsMatch: 'Nijedna ikonica ne odgovara upitu "{{query}}".',
+ searchIconsPlaceholder: 'Pretraži ikonice…',
+ selectedIcon: 'Izabrano {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Napravi',
+ newDeck: 'Novi špil',
+ newFolder: 'Nova fascikla',
+ },
+ descriptions: {
+ defaultWorkspace: 'Držite špilove, fascikle i beleške zajedno.',
+ emptyWorkspace: 'Napravite špil, pa dodajte beleške da izgradite red za ponavljanje.',
+ emptyFolder: 'Napravite špil, pa dodajte beleške da izgradite red za ponavljanje.',
+ searchPlaceholder: 'Pretraži fascikle, špilove i beleške…',
+ },
+ empty: {
+ createFirstDeck: 'Napravite svoj prvi špil',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Špil nije mogao da se obriše',
+ couldNotDeleteFolder: 'Fascikla nije mogla da se obriše',
+ couldNotDeleteWorkspace: 'Radni prostor nije mogao da se obriše',
+ dashboardCouldNotOpen: 'Kontrolna tabla nije mogla da se otvori',
+ decksCouldNotLoad: 'Špilovi nisu mogli da se učitaju',
+ decksMayBeOutOfDate: 'Špilovi možda nisu ažurni',
+ foldersCouldNotLoad: 'Fascikle nisu mogle da se učitaju',
+ foldersMayBeOutOfDate: 'Fascikle možda nisu ažurne',
+ workspaceCouldNotLoad: 'Radni prostor nije mogao da se učita',
+ },
+ labels: {
+ dashboard: 'Kontrolna tabla',
+ loadingDashboard: 'Učitavanje kontrolne table',
+ newItem: 'Nova stavka',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Datum nije dostupan',
+ },
+ age: {
+ dayAgo_one: 'pre {{count}} dan',
+ dayAgo_few: 'pre {{count}} dana',
+ dayAgo_other: 'pre {{count}} dana',
+ hourAgo_one: 'pre {{count}} sat',
+ hourAgo_few: 'pre {{count}} sata',
+ hourAgo_other: 'pre {{count}} sati',
+ justNow: 'upravo sada',
+ minuteAgo_one: 'pre {{count}} minut',
+ minuteAgo_few: 'pre {{count}} minuta',
+ minuteAgo_other: 'pre {{count}} minuta',
+ unavailable: 'datum nije dostupan',
+ weekAgo_one: 'pre {{count}} nedelju',
+ weekAgo_few: 'pre {{count}} nedelje',
+ weekAgo_other: 'pre {{count}} nedelja',
+ },
+ labels: {
+ deleted: 'Obrisano {{value}}',
+ due: 'Rok: {{value}}',
+ reviewed: 'Ponovljeno: {{value}}',
+ updated: 'Ažurirano {{value}}',
+ updatedUppercase: 'AŽURIRANO {{value}}',
+ },
+ relative: {
+ dayAgo_one: 'pre {{count}} dan',
+ dayAgo_few: 'pre {{count}} dana',
+ dayAgo_other: 'pre {{count}} dana',
+ inAMoment: 'Za trenutak',
+ inDay_one: 'Za {{count}} dan',
+ inDay_few: 'Za {{count}} dana',
+ inDay_other: 'Za {{count}} dana',
+ inMonth_one: 'Za {{count}} mesec',
+ inMonth_few: 'Za {{count}} meseca',
+ inMonth_other: 'Za {{count}} meseci',
+ inWeek_one: 'Za {{count}} nedelju',
+ inWeek_few: 'Za {{count}} nedelje',
+ inWeek_other: 'Za {{count}} nedelja',
+ justNow: 'Upravo sada',
+ monthAgo_one: 'pre {{count}} mesec',
+ monthAgo_few: 'pre {{count}} meseca',
+ monthAgo_other: 'pre {{count}} meseci',
+ secondsAgoShort: 'pre {{count}} s',
+ minutesAgoShort: 'pre {{count}} min',
+ hoursAgoShort: 'pre {{count}} h',
+ today: 'Danas',
+ tomorrow: 'Sutra',
+ weekAgo_one: 'pre {{count}} nedelju',
+ weekAgo_few: 'pre {{count}} nedelje',
+ weekAgo_other: 'pre {{count}} nedelja',
+ yesterday: 'Juče',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Radnje za {{title}}',
+ createDeck: 'Napravi špil',
+ createNote: 'Napravi belešku',
+ deleteDeck: 'Obriši špil',
+ editDeck: 'Uredi špil',
+ newNote: 'Nova beleška',
+ openDeck: 'Otvori špil {{title}}',
+ saveDeck: 'Špil nije mogao da se sačuva',
+ studyNow: 'Uči sada',
+ },
+ descriptions: {
+ emptyDeck: 'Dodajte belešku da bi ovaj špil imao materijal za ponavljanje.',
+ editorDefault: 'Fokusiran špil za učenje.',
+ editorVisual: 'Izaberite simbol naslovnice za ovaj špil.',
+ notesSearchPlaceholder: 'Pretraži beleške…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Ovo premešta "{{title}}" u Smeće. Možete ga vratiti kasnije.',
+ deleteDeckFallbackDescription: 'Ovo premešta ovaj špil u Smeće. Možete ga vratiti kasnije.',
+ deleteDeckFallbackTitle: 'Obrisati špil?',
+ deleteDeckTitle: 'Obrisati "{{title}}"?',
+ deleteNoteDescription: 'Ovo premešta "{{title}}" u Smeće. Možete je vratiti kasnije.',
+ deleteNoteFallbackTitle: 'Obrisati belešku?',
+ deleteNoteTitle: 'Obrisati "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Nema odgovarajućih beleški',
+ noMatchingNotesDescription: 'Nijedna beleška ne odgovara upitu "{{query}}".',
+ thisDeckIsEmpty: 'Ovaj špil je prazan',
+ },
+ errors: {
+ couldNotCreateDeck: 'Špil nije mogao da se napravi',
+ couldNotDeleteDeck: 'Špil nije mogao da se obriše',
+ couldNotDeleteNote: 'Beleška nije mogla da se obriše',
+ couldNotLoadFolderPath: 'Putanja fascikle nije mogla da se učita',
+ couldNotSaveDeck: 'Špil nije mogao da se sačuva',
+ deckCouldNotLoad: 'Špil nije mogao da se učita',
+ notesCouldNotLoad: 'Beleške nisu mogle da se učitaju',
+ notesMayBeOutOfDate: 'Beleške možda nisu ažurne',
+ },
+ fields: {
+ descriptionLabel: 'Opis špila',
+ descriptionPlaceholder: 'Šta će vam ovaj špil pomoći da ponavljate?',
+ namePlaceholder: 'Naziv špila',
+ untitledDeck: 'Špil bez naslova',
+ untitledDeckLower: 'špil bez naslova',
+ },
+ labels: {
+ createDeckTitle: 'Napravi špil',
+ deck: 'Špil',
+ deckNotesSearch: 'Pretraga beleški u špilu',
+ deckOverview: 'Pregled špila',
+ decks: 'Špilovi',
+ due: 'Rok',
+ dueToday: 'Rok danas',
+ loadingDeck: 'Učitavanje špila',
+ mastery: 'Savladanost',
+ notes: 'Beleške',
+ },
+ sort: {
+ ariaLabel: 'Sortiraj špilove',
+ dueToday: 'Rok danas',
+ title: 'Naslov',
+ updated: 'Ažurirano',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Podaci su se promenili. Osvežite i pokušajte ponovo.',
+ forbidden: 'Nemate dozvolu za ovu radnju.',
+ notFound: 'Nismo mogli da pronađemo ovu stavku.',
+ offline: 'Usluga nije dostupna.',
+ timeout: 'Ovo je trajalo predugo. Pokušajte ponovo.',
+ unauthorized: 'Prijavite se da nastavite.',
+ unavailable: 'Usluga je privremeno nedostupna.',
+ },
+ fallback: {
+ unexpected: 'Neočekivana greška',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Napravi fasciklu',
+ deleteFolder: 'Obriši fasciklu',
+ editFolder: 'Uredi fasciklu',
+ },
+ descriptions: {
+ editorDefault: 'Fascikla za povezane špilove.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Ovo premešta "{{name}}" u Smeće. Možete je vratiti kasnije.',
+ deleteFolderFallbackDescription: 'Ovo premešta ovu fasciklu u Smeće. Možete je vratiti kasnije.',
+ deleteFolderFallbackTitle: 'Obrisati fasciklu?',
+ deleteFolderTitle: 'Obrisati "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Nema rezultata u ovoj fascikli',
+ noMatchesInFolderDescription: 'Nijedna fascikla, špil ili beleška ne odgovara upitu "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Fascikla nije mogla da se napravi',
+ couldNotDeleteFolder: 'Fascikla nije mogla da se obriše',
+ couldNotLoadFolderPath: 'Putanja fascikle nije mogla da se učita',
+ couldNotSaveFolder: 'Fascikla nije mogla da se sačuva',
+ folderCouldNotLoad: 'Fascikla nije mogla da se učita',
+ },
+ fields: {
+ descriptionLabel: 'Opis fascikle',
+ descriptionPlaceholder: 'Šta pripada ovoj fascikli?',
+ namePlaceholder: 'Naziv fascikle',
+ untitledFolder: 'Fascikla bez naslova',
+ },
+ labels: {
+ createFolderTitle: 'Napravi fasciklu',
+ folder: 'Fascikla',
+ folders: 'Fascikle',
+ loadingFolder: 'Učitavanje fascikle',
+ name: 'Naziv',
+ updated: 'Ažurirano',
+ },
+ sort: {
+ ariaLabel: 'Sortiraj fascikle',
+ name: 'Naziv',
+ updated: 'Ažurirano',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Ako se lokalni i sinhronizovani podaci ikada razlikuju, stavka će se pojaviti ovde.',
+ heading: 'Status sinhronizacije',
+ title: 'Sukobi',
+ noConflicts: 'Nisu pronađeni sukobi',
+ },
+ labels: {
+ menu: 'Meni',
+ },
+ sections: {
+ settings: {
+ description: 'Prilagodite okruženje i podešavanja',
+ title: 'Podešavanja',
+ },
+ trash: {
+ description: 'Vratite ili trajno obrišite uklonjene stavke',
+ title: 'Smeće',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Zatvori uređivač',
+ openActions: 'Otvori radnje',
+ openWorkspaces: 'Otvori radne prostore',
+ },
+ items: {
+ home: 'Početna',
+ menu: 'Meni',
+ primary: 'Primarno',
+ settings: 'Podešavanja',
+ spaces: 'Prostori',
+ trash: 'Smeće',
+ workspaces: 'Radni prostori',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Dodaj cloze',
+ deleteNote: 'Obriši belešku',
+ editNote: 'Uredi belešku',
+ hideDerivedCardsNote: 'Sakrij belešku o izvedenim karticama',
+ openNote: 'Otvori {{title}}',
+ saveNote: 'Sačuvaj belešku',
+ showDerivedCardsNote: 'Prikaži belešku o izvedenim karticama',
+ },
+ descriptions: {
+ clozeFormat: 'Svaki skriveni deo postaje kartica za ponavljanje kada sačuvate.',
+ clozeFormatPrefix: 'Označite skriveni tekst pomoću',
+ derivedCardsHelper: 'Beleške su izvor istine za izvedene kartice.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Ovo premešta "{{title}}" u Smeće. Možete je vratiti kasnije.',
+ deleteNoteFallbackDescription: 'Ovo premešta ovu belešku u Smeće. Možete je vratiti kasnije.',
+ deleteNoteFallbackTitle: 'Obrisati belešku?',
+ deleteNoteTitle: 'Obrisati "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Beleška nije mogla da se napravi',
+ couldNotDeleteNote: 'Beleška nije mogla da se obriše',
+ couldNotSaveNote: 'Beleška nije mogla da se sačuva',
+ noteCouldNotLoad: 'Beleška nije mogla da se učita',
+ },
+ fields: {
+ back: 'Poleđina',
+ backPlaceholder: 'Unesite poleđinu',
+ bodyPlaceholder: 'Napišite sadržaj beleške sa cloze izostavljanjima…',
+ front: 'Prednja strana',
+ frontPlaceholder: 'Unesite prednju stranu',
+ noteBody: 'Sadržaj beleške',
+ title: 'Naslov',
+ titlePlaceholder: 'Dodajte naslov beleške',
+ untitledCloze: 'Cloze bez naslova',
+ untitledNote: 'Beleška bez naslova',
+ },
+ labels: {
+ backUppercase: 'POLEĐINA',
+ basic: 'Osnovna',
+ basicLower: 'osnovna',
+ basicUppercase: 'OSNOVNA',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze format',
+ clozeUppercase: 'CLOZE',
+ deck: 'Špil',
+ derivedCards: 'IZVEDENE KARTICE',
+ due: 'Rok',
+ frontUppercase: 'PREDNJA STRANA',
+ inProgress: 'U toku',
+ inProgressUppercase: 'U TOKU',
+ loadingNote: 'Učitavanje beleške',
+ loadingNoteEditor: 'Učitavanje uređivača beleški',
+ markdownFormatting: 'Markdown formatiranje',
+ mastered: 'Savladano',
+ masteredUppercase: 'SAVLADANO',
+ newNote: 'Nova beleška',
+ noteBody: 'SADRŽAJ BELEŠKE',
+ noteContent: 'Sadržaj beleške',
+ noteDetails: 'Detalji beleške',
+ noteMetadata: 'Metapodaci beleške',
+ noteType: 'Tip beleške',
+ notes: 'Beleške',
+ reviewed: 'Ponovljeno',
+ studyProgress: 'Napredak u učenju',
+ studyProgressUppercase: 'NAPREDAK U UČENJU',
+ titleUppercase: 'NASLOV',
+ updated: 'Ažurirano',
+ },
+ sort: {
+ ariaLabel: 'Sortiraj beleške',
+ title: 'Naslov',
+ updated: 'Ažurirano',
+ },
+ toolbar: {
+ bold: 'Podebljano',
+ italic: 'Kurziv',
+ link: 'Link',
+ list: 'Lista',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Ponovo',
+ backToDeck: 'Nazad na špil',
+ continueReview: 'Nastavi ponavljanje',
+ easy: 'Lako',
+ good: 'Dobro',
+ hard: 'Teško',
+ newNote: 'Nova beleška',
+ showAnswer: 'Prikaži odgovor',
+ },
+ errors: {
+ couldNotGradeCard: 'Kartica nije mogla da se oceni',
+ reviewCouldNotLoad: 'Ponavljanje nije moglo da se učita',
+ reviewCouldNotStart: 'Ponavljanje nije moglo da se pokrene',
+ summaryCouldNotLoad: 'Sažetak ponavljanja nije mogao da se učita',
+ summaryNotAvailable: 'Sažetak ponavljanja nije dostupan',
+ summaryNotComplete: 'Ovo ponavljanje još nije završeno.',
+ },
+ labels: {
+ cardsReviewed: 'Ponovljene kartice',
+ deck: 'Špil',
+ duration: 'Trajanje',
+ loadingReview: 'Učitavanje ponavljanja',
+ loadingSummary: 'Učitavanje sažetka',
+ progress: 'Napredak ponavljanja',
+ review: 'Ponavljanje',
+ reviewComplete: 'Ponavljanje završeno',
+ reviewed_one: 'Ponovljena {{count}}',
+ reviewed_few: 'Ponovljene {{count}}',
+ reviewed_other: 'Ponovljeno {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Vaš napredak je sačuvan u ovom špilu.',
+ },
+ unavailable: {
+ description: 'Dodajte belešku da bi ovaj špil mogao da uđe u red za ponavljanje.',
+ title: 'Nema kartica za ponavljanje',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Obriši pretragu',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Nema rezultata u ovom radnom prostoru',
+ noMatchesInWorkspaceDescription: 'Nijedna fascikla, špil ili beleška ne odgovara upitu "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Pretraga nije mogla da se završi',
+ },
+ labels: {
+ results: 'Rezultati pretrage',
+ resultsFor: 'Rezultati za "{{query}}"',
+ searchingContent: 'Pretraga sadržaja',
+ },
+ resultGroups: {
+ deck: 'Špilovi',
+ folder: 'Fascikle',
+ note: 'Beleške',
+ },
+ resultKinds: {
+ deck: 'špil',
+ folder: 'fascikla',
+ note: 'beleška',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Resetuj sva podešavanja',
+ resetSettings: 'Resetuj podešavanja',
+ resetToDefaults: 'Vrati podrazumevano',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Nalepite važeći JSON sa 21 numeričkom vrednošću.',
+ fsrsErrorInvalidParams_one: 'Unesite JSON niz sa tačno {{count}} konačnim brojem.',
+ fsrsErrorInvalidParams_few: 'Unesite JSON niz sa tačno {{count}} konačna broja.',
+ fsrsErrorInvalidParams_other: 'Unesite JSON niz sa tačno {{count}} konačnih brojeva.',
+ fsrsHelper: 'Ovo je stručno prepisivanje. Vrednosti moraju ostati redom.',
+ fsrsJsonLabel: 'JSON FSRS parametara',
+ fsrsTitle: 'Uredi FSRS parametre',
+ fsrsDescription: 'Nalepite JSON niz sa 21 brojem da zamenite težine planera.',
+ resetDescription: 'Ovo vraća vremensku zonu, ograničenja učenja i FSRS podešavanja.',
+ resetDescriptionWithLanguage: 'Ovo vraća jezik, vremensku zonu, ograničenja učenja i FSRS podešavanja.',
+ resetTitle: 'Resetovati sva podešavanja?',
+ timezoneDescription: 'Pretražite grad ili identifikator vremenske zone.',
+ timezoneSearchLabel: 'Pretraži vremenske zone',
+ timezoneSearchPlaceholder: 'Pretraži vremenske zone…',
+ timezoneTitle: 'Izaberite vremensku zonu',
+ },
+ errors: {
+ couldNotResetSettings: 'Podešavanja nisu mogla da se resetuju',
+ couldNotSaveSettings: 'Podešavanja nisu mogla da se sačuvaju',
+ settingsCouldNotLoad: 'Podešavanja nisu mogla da se učitaju',
+ settingsUnavailable: 'Podešavanja nisu dostupna.',
+ },
+ labels: {
+ appearance: 'Izgled',
+ automatic: 'Automatski',
+ fsrsParameters: 'FSRS parametri',
+ general: 'Opšte',
+ language: 'Jezik',
+ loadingSettings: 'Učitavanje podešavanja',
+ masteryHorizon: 'Horizont savladavanja',
+ newCardOrder: 'Redosled novih kartica',
+ newCardsPerDay: 'Nove kartice dnevno',
+ reviewCardsPerDay: 'Kartice za ponavljanje dnevno',
+ savingSettings: 'Čuvanje podešavanja',
+ schedule: 'Raspored',
+ searchNoTimezones: 'Nema odgovarajućih vremenskih zona.',
+ settings: 'Podešavanja',
+ settingsReset: 'Podešavanja su resetovana',
+ study: 'Učenje',
+ targetRecallProbability: 'Ciljna verovatnoća prisećanja',
+ theme: 'Tema',
+ timezone: 'Vremenska zona',
+ },
+ options: {
+ languageEnUs: 'Engleski (SAD)',
+ newCardsAfterReviews: 'Posle ponavljanja',
+ newCardsBeforeReviews: 'Pre ponavljanja',
+ newCardsMixed: 'Mešano',
+ themeDark: 'Tamna',
+ themeLight: 'Svetla',
+ themeSystem: 'Sistem',
+ timezoneSystem: 'Koristi vremensku zonu sistema',
+ },
+ rows: {
+ fsrsDescription: 'Težine stručnog modela',
+ languageDescription: 'Jezik interfejsa',
+ masteryHorizonDescription: 'Broj dana tokom kojih kartica mora ostati prisećiva na ciljnoj verovatnoći ili iznad nje da bi se računala kao savladana',
+ newCardOrderDescription: 'Redosled novih kartica u odnosu na ponavljanja',
+ newCardsPerDayDescription: 'Maksimalan broj novih kartica dnevno',
+ reviewCardsPerDayDescription: 'Maksimalan broj kartica za ponavljanje dnevno',
+ targetRecallProbabilityDescription: 'Minimalna verovatnoća prisećanja pri sledećem zakazanom ponavljanju',
+ timezoneDescription: 'Koristite automatsku vremensku zonu ili izaberite grad.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Obriši trajno',
+ empty: 'Isprazni',
+ emptyTrash: 'Isprazni smeće',
+ restore: 'Vrati',
+ restoringItem: 'Vraćanje {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Ovo trajno briše "{{title}}". To ne može da se poništi.',
+ deleteItemFallbackDescription: 'Ovo trajno briše ovu stavku. To ne može da se poništi.',
+ deleteItemFallbackTitle: 'Obrisati stavku?',
+ deleteItemTitle: 'Obrisati "{{title}}"?',
+ emptyTrashDescription: 'Ovo trajno briše sve iz Smeća. To ne može da se poništi.',
+ emptyTrashTitle: 'Isprazniti smeće?',
+ },
+ empty: {
+ description: 'Stavke koje obrišete pojaviće se ovde pre trajnog uklanjanja.',
+ title: 'Smeće je prazno',
+ },
+ errors: {
+ couldNotDeleteItem: 'Stavka nije mogla da se obriše',
+ couldNotEmptyTrash: 'Smeće nije moglo da se isprazni',
+ couldNotRestoreItem: 'Stavka nije mogla da se vrati',
+ trashCouldNotLoad: 'Smeće nije moglo da se učita',
+ trashMayBeOutOfDate: 'Smeće možda nije ažurno',
+ },
+ labels: {
+ deletedAge: 'Obrisano {{value}}',
+ itemCount_one: '{{count}} stavka',
+ itemCount_few: '{{count}} stavke',
+ itemCount_other: '{{count}} stavki',
+ lastEmptied: 'Poslednje pražnjenje {{value}}',
+ loadingTrash: 'Učitavanje Smeća',
+ originalLocation: 'Originalna lokacija: {{location}}',
+ title: 'Smeće',
+ trashActions: 'Radnje u Smeću za {{title}}',
+ },
+ kinds: {
+ deck: 'Špil',
+ folder: 'Fascikla',
+ note: 'Beleška',
+ workspace: 'Radni prostor',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Napravi radni prostor',
+ deleteWorkspace: 'Obriši radni prostor',
+ editWorkspace: 'Uredi radni prostor',
+ newWorkspace: 'Novi radni prostor',
+ openWorkspace: 'Otvori {{title}}',
+ openingWorkspace: 'Otvaranje {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Kontekst učenja.',
+ editorVisual: 'Izaberite vizuelno sidro za ovaj radni prostor.',
+ emptyList: 'Odvojite špilove, beleške i redove za ponavljanje po kontekstu učenja.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Ovo premešta "{{title}}" u Smeće. Možete ga vratiti kasnije.',
+ deleteWorkspaceFallbackDescription: 'Ovo premešta ovaj radni prostor u Smeće. Možete ga vratiti kasnije.',
+ deleteWorkspaceFallbackTitle: 'Obrisati radni prostor?',
+ deleteWorkspaceTitle: 'Obrisati "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Počnite sa radnim prostorom',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Radni prostor nije mogao da se napravi',
+ couldNotDeleteWorkspace: 'Radni prostor nije mogao da se obriše',
+ couldNotOpenWorkspace: 'Radni prostor nije mogao da se otvori',
+ couldNotSaveWorkspace: 'Radni prostor nije mogao da se sačuva',
+ workspaceCouldNotLoad: 'Radni prostor nije mogao da se učita',
+ workspacesCouldNotLoad: 'Radni prostori nisu mogli da se učitaju',
+ },
+ fields: {
+ descriptionLabel: 'Opis radnog prostora',
+ descriptionPlaceholder: 'Šta pripada ovom radnom prostoru?',
+ namePlaceholder: 'Naziv radnog prostora',
+ untitledWorkspace: 'Radni prostor bez naslova',
+ },
+ labels: {
+ createWorkspaceTitle: 'Napravi radni prostor',
+ loadingWorkspaces: 'Učitavanje radnih prostora',
+ workspace: 'Radni prostor',
+ workspaces: 'Radni prostori',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/sv.ts b/ui/src/core/i18n/resources/sv.ts
new file mode 100644
index 0000000..0204bd0
--- /dev/null
+++ b/ui/src/core/i18n/resources/sv.ts
@@ -0,0 +1,623 @@
+export const sv = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Försök igen. Om det fortsätter att hända, öppna Clear igen.',
+ title: 'Kunde inte starta',
+ },
+ loadingTitle: 'Förbereder din studieyta',
+ },
+ common: {
+ actions: {
+ back: 'Tillbaka',
+ cancel: 'Avbryt',
+ checkAgain: 'Kontrollera igen',
+ close: 'Stäng',
+ create: 'Skapa',
+ delete: 'Ta bort',
+ dismissError: 'Stäng fel',
+ dismissStatus: 'Stäng status',
+ edit: 'Redigera',
+ itemActions: 'Åtgärder för {{title}}',
+ reset: 'Återställ',
+ review: 'Repetera',
+ save: 'Spara',
+ saveChanges: 'Spara ändringar',
+ tryAgain: 'Försök igen',
+ },
+ labels: {
+ active: 'Aktiv',
+ clear: 'Clear',
+ custom: 'Anpassad',
+ default: 'Standard',
+ loadingEditor: 'Läser in redigerare',
+ name: 'Namn',
+ completedTask: 'Slutförd uppgift',
+ description: 'Beskrivning',
+ incompleteTask: 'Oslutförd uppgift',
+ percentageInput: '{{label}} procent',
+ visual: 'Visuell',
+ },
+ status: {
+ actionFailed: 'Åtgärden misslyckades',
+ actionInProgress: 'Åtgärd pågår',
+ },
+ sort: {
+ ascending: 'Stig.',
+ column: 'Kolumn',
+ descending: 'Fall.',
+ direction: 'Riktning',
+ sort: 'Sortera',
+ },
+ search: {
+ label: 'Sök',
+ },
+ visualPicker: {
+ allLucideIcons: 'Alla Lucide-ikoner',
+ browseIconsFor: 'Bläddra eller sök efter ikoner för {{label}}.',
+ chooseIcon: 'Välj ikon',
+ iconPicker: 'Ikonväljare för {{label}}',
+ iconSearch: 'Ikonsökning för {{label}}',
+ iconsCouldNotLoad: 'Ikonerna kunde inte läsas in.',
+ loadingIcons: 'Läser in ikoner',
+ loadingMoreIcons: 'Läser in fler ikoner',
+ moreIcons: 'Fler ikoner',
+ noIconsMatch: 'Inga ikoner matchar "{{query}}".',
+ searchIconsPlaceholder: 'Sök ikoner…',
+ selectedIcon: '{{label}} vald',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Skapa',
+ newDeck: 'Ny kortlek',
+ newFolder: 'Ny mapp',
+ },
+ descriptions: {
+ defaultWorkspace: 'Håll kortlekar, mappar och anteckningar samlade.',
+ emptyWorkspace: 'Skapa en kortlek och lägg sedan till anteckningar för att bygga din repetitionskö.',
+ emptyFolder: 'Skapa en kortlek och lägg sedan till anteckningar för att bygga en repetitionskö.',
+ searchPlaceholder: 'Sök mappar, kortlekar och anteckningar…',
+ },
+ empty: {
+ createFirstDeck: 'Skapa din första kortlek',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Kunde inte ta bort kortlek',
+ couldNotDeleteFolder: 'Kunde inte ta bort mapp',
+ couldNotDeleteWorkspace: 'Kunde inte ta bort arbetsyta',
+ dashboardCouldNotOpen: 'Instrumentpanelen kunde inte öppnas',
+ decksCouldNotLoad: 'Kortlekar kunde inte läsas in',
+ decksMayBeOutOfDate: 'Kortlekar kan vara inaktuella',
+ foldersCouldNotLoad: 'Mappar kunde inte läsas in',
+ foldersMayBeOutOfDate: 'Mappar kan vara inaktuella',
+ workspaceCouldNotLoad: 'Arbetsytan kunde inte läsas in',
+ },
+ labels: {
+ dashboard: 'Instrumentpanel',
+ loadingDashboard: 'Läser in instrumentpanel',
+ newItem: 'Nytt objekt',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Datum saknas',
+ },
+ age: {
+ dayAgo_one: '{{count}} dag sedan',
+ dayAgo_other: '{{count}} dagar sedan',
+ hourAgo_one: '{{count}} timme sedan',
+ hourAgo_other: '{{count}} timmar sedan',
+ justNow: 'nyss',
+ minuteAgo_one: '{{count}} minut sedan',
+ minuteAgo_other: '{{count}} minuter sedan',
+ unavailable: 'datum saknas',
+ weekAgo_one: '{{count}} vecka sedan',
+ weekAgo_other: '{{count}} veckor sedan',
+ },
+ labels: {
+ deleted: 'Borttaget {{value}}',
+ due: 'Förfaller: {{value}}',
+ reviewed: 'Repeterat: {{value}}',
+ updated: 'Uppdaterat {{value}}',
+ updatedUppercase: 'UPPDATERAT {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} dag sedan',
+ dayAgo_other: '{{count}} dagar sedan',
+ inAMoment: 'Om ett ögonblick',
+ inDay_one: 'Om {{count}} dag',
+ inDay_other: 'Om {{count}} dagar',
+ inMonth_one: 'Om {{count}} månad',
+ inMonth_other: 'Om {{count}} månader',
+ inWeek_one: 'Om {{count}} vecka',
+ inWeek_other: 'Om {{count}} veckor',
+ justNow: 'Nyss',
+ monthAgo_one: '{{count}} månad sedan',
+ monthAgo_other: '{{count}} månader sedan',
+ secondsAgoShort: '{{count}} s sedan',
+ minutesAgoShort: '{{count}} min sedan',
+ hoursAgoShort: '{{count}} h sedan',
+ today: 'I dag',
+ tomorrow: 'I morgon',
+ weekAgo_one: '{{count}} vecka sedan',
+ weekAgo_other: '{{count}} veckor sedan',
+ yesterday: 'I går',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Åtgärder för {{title}}',
+ createDeck: 'Skapa kortlek',
+ createNote: 'Skapa anteckning',
+ deleteDeck: 'Ta bort kortlek',
+ editDeck: 'Redigera kortlek',
+ newNote: 'Ny anteckning',
+ openDeck: 'Öppna kortleken {{title}}',
+ saveDeck: 'Kunde inte spara kortlek',
+ studyNow: 'Studera nu',
+ },
+ descriptions: {
+ emptyDeck: 'Lägg till en anteckning så att kortleken har material att repetera.',
+ editorDefault: 'Fokuserad studiekortlek.',
+ editorVisual: 'Välj en omslagsikon för den här kortleken.',
+ notesSearchPlaceholder: 'Sök anteckningar…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Detta flyttar "{{title}}" till Papperskorgen. Du kan återställa den senare.',
+ deleteDeckFallbackDescription: 'Detta flyttar den här kortleken till Papperskorgen. Du kan återställa den senare.',
+ deleteDeckFallbackTitle: 'Ta bort kortlek?',
+ deleteDeckTitle: 'Ta bort "{{title}}"?',
+ deleteNoteDescription: 'Detta flyttar "{{title}}" till Papperskorgen. Du kan återställa den senare.',
+ deleteNoteFallbackTitle: 'Ta bort anteckning?',
+ deleteNoteTitle: 'Ta bort "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Inga matchande anteckningar',
+ noMatchingNotesDescription: 'Inga anteckningar matchade "{{query}}".',
+ thisDeckIsEmpty: 'Den här kortleken är tom',
+ },
+ errors: {
+ couldNotCreateDeck: 'Kunde inte skapa kortlek',
+ couldNotDeleteDeck: 'Kunde inte ta bort kortlek',
+ couldNotDeleteNote: 'Kunde inte ta bort anteckning',
+ couldNotLoadFolderPath: 'Kunde inte läsa in mappsökväg',
+ couldNotSaveDeck: 'Kunde inte spara kortlek',
+ deckCouldNotLoad: 'Kortleken kunde inte läsas in',
+ notesCouldNotLoad: 'Anteckningar kunde inte läsas in',
+ notesMayBeOutOfDate: 'Anteckningar kan vara inaktuella',
+ },
+ fields: {
+ descriptionLabel: 'Kortleksbeskrivning',
+ descriptionPlaceholder: 'Vad hjälper den här kortleken dig att repetera?',
+ namePlaceholder: 'Kortleksnamn',
+ untitledDeck: 'Namnlös kortlek',
+ untitledDeckLower: 'namnlös kortlek',
+ },
+ labels: {
+ createDeckTitle: 'Skapa kortlek',
+ deck: 'Kortlek',
+ deckNotesSearch: 'Sök anteckningar i kortlek',
+ deckOverview: 'Kortleksöversikt',
+ decks: 'Kortlekar',
+ due: 'Förfaller',
+ dueToday: 'Förfaller i dag',
+ loadingDeck: 'Läser in kortlek',
+ mastery: 'Behärskning',
+ notes: 'Anteckningar',
+ },
+ sort: {
+ ariaLabel: 'Sortera kortlekar',
+ dueToday: 'Förfaller i dag',
+ title: 'Titel',
+ updated: 'Uppdaterad',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Datan ändrades. Uppdatera och försök igen.',
+ forbidden: 'Du har inte behörighet att göra detta.',
+ notFound: 'Vi kunde inte hitta det här objektet.',
+ offline: 'Kan inte nå tjänsten.',
+ timeout: 'Detta tog för lång tid. Försök igen.',
+ unauthorized: 'Logga in för att fortsätta.',
+ unavailable: 'Tjänsten är tillfälligt otillgänglig.',
+ },
+ fallback: {
+ unexpected: 'Oväntat fel',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Skapa mapp',
+ deleteFolder: 'Ta bort mapp',
+ editFolder: 'Redigera mapp',
+ },
+ descriptions: {
+ editorDefault: 'Mapp för relaterade kortlekar.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Detta flyttar "{{name}}" till Papperskorgen. Du kan återställa den senare.',
+ deleteFolderFallbackDescription: 'Detta flyttar den här mappen till Papperskorgen. Du kan återställa den senare.',
+ deleteFolderFallbackTitle: 'Ta bort mapp?',
+ deleteFolderTitle: 'Ta bort "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Inga träffar i den här mappen',
+ noMatchesInFolderDescription: 'Inga mappar, kortlekar eller anteckningar matchade "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Kunde inte skapa mapp',
+ couldNotDeleteFolder: 'Kunde inte ta bort mapp',
+ couldNotLoadFolderPath: 'Kunde inte läsa in mappsökväg',
+ couldNotSaveFolder: 'Kunde inte spara mapp',
+ folderCouldNotLoad: 'Mappen kunde inte läsas in',
+ },
+ fields: {
+ descriptionLabel: 'Mappbeskrivning',
+ descriptionPlaceholder: 'Vad hör hemma i den här mappen?',
+ namePlaceholder: 'Mappnamn',
+ untitledFolder: 'Namnlös mapp',
+ },
+ labels: {
+ createFolderTitle: 'Skapa mapp',
+ folder: 'Mapp',
+ folders: 'Mappar',
+ loadingFolder: 'Läser in mapp',
+ name: 'Namn',
+ updated: 'Uppdaterad',
+ },
+ sort: {
+ ariaLabel: 'Sortera mappar',
+ name: 'Namn',
+ updated: 'Uppdaterad',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Om lokal och synkroniserad data skiljer sig åt visas objektet här.',
+ heading: 'Synkroniseringsstatus',
+ title: 'Konflikter',
+ noConflicts: 'Inga konflikter hittades',
+ },
+ labels: {
+ menu: 'Meny',
+ },
+ sections: {
+ settings: {
+ description: 'Anpassa din miljö och dina inställningar',
+ title: 'Inställningar',
+ },
+ trash: {
+ description: 'Återställ eller ta bort borttagna objekt permanent',
+ title: 'Papperskorg',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Stäng redigerare',
+ openActions: 'Öppna åtgärder',
+ openWorkspaces: 'Öppna arbetsytor',
+ },
+ items: {
+ home: 'Hem',
+ menu: 'Meny',
+ primary: 'Primär',
+ settings: 'Inställningar',
+ spaces: 'Ytor',
+ trash: 'Papperskorg',
+ workspaces: 'Arbetsytor',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Lägg till cloze',
+ deleteNote: 'Ta bort anteckning',
+ editNote: 'Redigera anteckning',
+ hideDerivedCardsNote: 'Dölj anteckning om härledda kort',
+ openNote: 'Öppna {{title}}',
+ saveNote: 'Spara anteckning',
+ showDerivedCardsNote: 'Visa anteckning om härledda kort',
+ },
+ descriptions: {
+ clozeFormat: 'Varje dold del blir ett repetitionskort när du sparar.',
+ clozeFormatPrefix: 'Omslut dold text med',
+ derivedCardsHelper: 'Anteckningar är källan till sanning för härledda kort.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Detta flyttar "{{title}}" till Papperskorgen. Du kan återställa den senare.',
+ deleteNoteFallbackDescription: 'Detta flyttar den här anteckningen till Papperskorgen. Du kan återställa den senare.',
+ deleteNoteFallbackTitle: 'Ta bort anteckning?',
+ deleteNoteTitle: 'Ta bort "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Kunde inte skapa anteckning',
+ couldNotDeleteNote: 'Kunde inte ta bort anteckning',
+ couldNotSaveNote: 'Kunde inte spara anteckning',
+ noteCouldNotLoad: 'Anteckningen kunde inte läsas in',
+ },
+ fields: {
+ back: 'Baksida',
+ backPlaceholder: 'Ange baksida',
+ bodyPlaceholder: 'Skriv anteckningens innehåll med cloze-borttagningar…',
+ front: 'Framsida',
+ frontPlaceholder: 'Ange framsida',
+ noteBody: 'Anteckningens innehåll',
+ title: 'Titel',
+ titlePlaceholder: 'Lägg till en anteckningstitel',
+ untitledCloze: 'Namnlös cloze',
+ untitledNote: 'Namnlös anteckning',
+ },
+ labels: {
+ backUppercase: 'BAKSIDA',
+ basic: 'Grundläggande',
+ basicLower: 'grundläggande',
+ basicUppercase: 'GRUNDLÄGGANDE',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze-format',
+ clozeUppercase: 'CLOZE',
+ deck: 'Kortlek',
+ derivedCards: 'HÄRLEDDA KORT',
+ due: 'Förfaller',
+ frontUppercase: 'FRAMSIDA',
+ inProgress: 'Pågår',
+ inProgressUppercase: 'PÅGÅR',
+ loadingNote: 'Läser in anteckning',
+ loadingNoteEditor: 'Läser in anteckningsredigerare',
+ markdownFormatting: 'Markdown-formatering',
+ mastered: 'Behärskad',
+ masteredUppercase: 'BEHÄRSKAD',
+ newNote: 'Ny anteckning',
+ noteBody: 'ANTECKNINGENS INNEHÅLL',
+ noteContent: 'Anteckningsinnehåll',
+ noteDetails: 'Anteckningsdetaljer',
+ noteMetadata: 'Anteckningsmetadata',
+ noteType: 'Anteckningstyp',
+ notes: 'Anteckningar',
+ reviewed: 'Repeterad',
+ studyProgress: 'Studieframsteg',
+ studyProgressUppercase: 'STUDIEFRAMSTEG',
+ titleUppercase: 'TITEL',
+ updated: 'Uppdaterad',
+ },
+ sort: {
+ ariaLabel: 'Sortera anteckningar',
+ title: 'Titel',
+ updated: 'Uppdaterad',
+ },
+ toolbar: {
+ bold: 'Fet',
+ italic: 'Kursiv',
+ link: 'Länk',
+ list: 'Lista',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Igen',
+ backToDeck: 'Tillbaka till kortlek',
+ continueReview: 'Fortsätt repetition',
+ easy: 'Lätt',
+ good: 'Bra',
+ hard: 'Svår',
+ newNote: 'Ny anteckning',
+ showAnswer: 'Visa svar',
+ },
+ errors: {
+ couldNotGradeCard: 'Kunde inte betygsätta kort',
+ reviewCouldNotLoad: 'Repetition kunde inte läsas in',
+ reviewCouldNotStart: 'Repetition kunde inte startas',
+ summaryCouldNotLoad: 'Repetitionssammanfattning kunde inte läsas in',
+ summaryNotAvailable: 'Repetitionssammanfattning är inte tillgänglig',
+ summaryNotComplete: 'Den här repetitionen är inte klar än.',
+ },
+ labels: {
+ cardsReviewed: 'Repeterade kort',
+ deck: 'Kortlek',
+ duration: 'Varaktighet',
+ loadingReview: 'Läser in repetition',
+ loadingSummary: 'Läser in sammanfattning',
+ progress: 'Repetitionsframsteg',
+ review: 'Repetition',
+ reviewComplete: 'Repetition slutförd',
+ reviewed_one: 'Repeterat {{count}}',
+ reviewed_other: 'Repeterat {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} h {{minutes}} min',
+ durationMinutes: '{{minutes}} min',
+ durationSeconds: '{{seconds}} s',
+ saved: 'Dina framsteg sparades i den här kortleken.',
+ },
+ unavailable: {
+ description: 'Lägg till en anteckning så att kortleken kan hamna i repetitionskön.',
+ title: 'Inga kort att repetera',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Rensa sökning',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Inga träffar i den här arbetsytan',
+ noMatchesInWorkspaceDescription: 'Inga mappar, kortlekar eller anteckningar matchade "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Sökningen kunde inte slutföras',
+ },
+ labels: {
+ results: 'Sökresultat',
+ resultsFor: 'Resultat för "{{query}}"',
+ searchingContent: 'Söker innehåll',
+ },
+ resultGroups: {
+ deck: 'Kortlekar',
+ folder: 'Mappar',
+ note: 'Anteckningar',
+ },
+ resultKinds: {
+ deck: 'kortlek',
+ folder: 'mapp',
+ note: 'anteckning',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Återställ alla inställningar',
+ resetSettings: 'Återställ inställningar',
+ resetToDefaults: 'Återställ standardvärden',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Klistra in giltig JSON med 21 numeriska värden.',
+ fsrsErrorInvalidParams_one: 'Ange en JSON-array med exakt {{count}} ändligt tal.',
+ fsrsErrorInvalidParams_other: 'Ange en JSON-array med exakt {{count}} ändliga tal.',
+ fsrsHelper: 'Detta är en expertåsidosättning. Värdena måste behålla ordningen.',
+ fsrsJsonLabel: 'FSRS-parametrar JSON',
+ fsrsTitle: 'Redigera FSRS-parametrar',
+ fsrsDescription: 'Klistra in en JSON-array med 21 tal för att åsidosätta scheduler-vikterna.',
+ resetDescription: 'Detta återställer tidszon, studiegränser och FSRS-inställningar.',
+ resetDescriptionWithLanguage: 'Detta återställer språk, tidszon, studiegränser och FSRS-inställningar.',
+ resetTitle: 'Återställa alla inställningar?',
+ timezoneDescription: 'Sök efter en stad eller tidszonsidentifierare.',
+ timezoneSearchLabel: 'Sök tidszoner',
+ timezoneSearchPlaceholder: 'Sök tidszoner…',
+ timezoneTitle: 'Välj tidszon',
+ },
+ errors: {
+ couldNotResetSettings: 'Kunde inte återställa inställningar',
+ couldNotSaveSettings: 'Kunde inte spara inställningar',
+ settingsCouldNotLoad: 'Inställningar kunde inte läsas in',
+ settingsUnavailable: 'Inställningar är inte tillgängliga.',
+ },
+ labels: {
+ appearance: 'Utseende',
+ automatic: 'Automatisk',
+ fsrsParameters: 'FSRS-parametrar',
+ general: 'Allmänt',
+ language: 'Språk',
+ loadingSettings: 'Läser in inställningar',
+ masteryHorizon: 'Behärskningshorisont',
+ newCardOrder: 'Ordning för nya kort',
+ newCardsPerDay: 'Nya kort per dag',
+ reviewCardsPerDay: 'Repetitionskort per dag',
+ savingSettings: 'Sparar inställningar',
+ schedule: 'Schema',
+ searchNoTimezones: 'Inga matchande tidszoner.',
+ settings: 'Inställningar',
+ settingsReset: 'Inställningar återställda',
+ study: 'Studier',
+ targetRecallProbability: 'Målsannolikhet för återkallelse',
+ theme: 'Tema',
+ timezone: 'Tidszon',
+ },
+ options: {
+ languageEnUs: 'Engelska (USA)',
+ newCardsAfterReviews: 'Efter repetitioner',
+ newCardsBeforeReviews: 'Före repetitioner',
+ newCardsMixed: 'Blandat',
+ themeDark: 'Mörkt',
+ themeLight: 'Ljust',
+ themeSystem: 'System',
+ timezoneSystem: 'Använd systemets tidszon',
+ },
+ rows: {
+ fsrsDescription: 'Expertmodellens vikter',
+ languageDescription: 'Gränssnittsspråk',
+ masteryHorizonDescription: 'Antal dagar ett kort måste vara återkalleligt vid eller över målsannolikheten för att räknas som behärskat',
+ newCardOrderDescription: 'Ordning för nya kort relativt repetitioner',
+ newCardsPerDayDescription: 'Maximalt antal nya kort per dag',
+ reviewCardsPerDayDescription: 'Maximalt antal repetitionskort per dag',
+ targetRecallProbabilityDescription: 'Minsta sannolikhet för återkallelse vid nästa schemalagda repetition',
+ timezoneDescription: 'Använd automatisk tidszon eller välj en stad.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Ta bort permanent',
+ empty: 'Töm',
+ emptyTrash: 'Töm papperskorg',
+ restore: 'Återställ',
+ restoringItem: 'Återställer {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Detta tar bort "{{title}}" permanent. Det kan inte ångras.',
+ deleteItemFallbackDescription: 'Detta tar bort objektet permanent. Det kan inte ångras.',
+ deleteItemFallbackTitle: 'Ta bort objekt?',
+ deleteItemTitle: 'Ta bort "{{title}}"?',
+ emptyTrashDescription: 'Detta tar bort allt i Papperskorgen permanent. Det kan inte ångras.',
+ emptyTrashTitle: 'Tömma papperskorgen?',
+ },
+ empty: {
+ description: 'Objekt du tar bort visas här innan de tas bort permanent.',
+ title: 'Papperskorgen är tom',
+ },
+ errors: {
+ couldNotDeleteItem: 'Kunde inte ta bort objekt',
+ couldNotEmptyTrash: 'Kunde inte tömma Papperskorgen',
+ couldNotRestoreItem: 'Kunde inte återställa objekt',
+ trashCouldNotLoad: 'Papperskorgen kunde inte läsas in',
+ trashMayBeOutOfDate: 'Papperskorgen kan vara inaktuell',
+ },
+ labels: {
+ deletedAge: 'Borttaget {{value}}',
+ itemCount_one: '{{count}} objekt',
+ itemCount_other: '{{count}} objekt',
+ lastEmptied: 'Senast tömd {{value}}',
+ loadingTrash: 'Läser in Papperskorgen',
+ originalLocation: 'Ursprunglig plats: {{location}}',
+ title: 'Papperskorg',
+ trashActions: 'Papperskorgsåtgärder för {{title}}',
+ },
+ kinds: {
+ deck: 'Kortlek',
+ folder: 'Mapp',
+ note: 'Anteckning',
+ workspace: 'Arbetsyta',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Skapa arbetsyta',
+ deleteWorkspace: 'Ta bort arbetsyta',
+ editWorkspace: 'Redigera arbetsyta',
+ newWorkspace: 'Ny arbetsyta',
+ openWorkspace: 'Öppna {{title}}',
+ openingWorkspace: 'Öppnar {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Studiekontext.',
+ editorVisual: 'Välj ett visuellt ankare för den här arbetsytan.',
+ emptyList: 'Separera kortlekar, anteckningar och repetitionsköer efter studiekontext.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Detta flyttar "{{title}}" till Papperskorgen. Du kan återställa den senare.',
+ deleteWorkspaceFallbackDescription: 'Detta flyttar den här arbetsytan till Papperskorgen. Du kan återställa den senare.',
+ deleteWorkspaceFallbackTitle: 'Ta bort arbetsyta?',
+ deleteWorkspaceTitle: 'Ta bort "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Börja med en arbetsyta',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Kunde inte skapa arbetsyta',
+ couldNotDeleteWorkspace: 'Kunde inte ta bort arbetsyta',
+ couldNotOpenWorkspace: 'Kunde inte öppna arbetsyta',
+ couldNotSaveWorkspace: 'Kunde inte spara arbetsyta',
+ workspaceCouldNotLoad: 'Arbetsytan kunde inte läsas in',
+ workspacesCouldNotLoad: 'Arbetsytor kunde inte läsas in',
+ },
+ fields: {
+ descriptionLabel: 'Beskrivning av arbetsyta',
+ descriptionPlaceholder: 'Vad hör hemma i den här arbetsytan?',
+ namePlaceholder: 'Namn på arbetsyta',
+ untitledWorkspace: 'Namnlös arbetsyta',
+ },
+ labels: {
+ createWorkspaceTitle: 'Skapa arbetsyta',
+ loadingWorkspaces: 'Läser in arbetsytor',
+ workspace: 'Arbetsyta',
+ workspaces: 'Arbetsytor',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/th.ts b/ui/src/core/i18n/resources/th.ts
new file mode 100644
index 0000000..477695a
--- /dev/null
+++ b/ui/src/core/i18n/resources/th.ts
@@ -0,0 +1,623 @@
+export const th = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'ลองอีกครั้ง หากยังเกิดขึ้นอยู่ ให้เปิด Clear ใหม่',
+ title: 'ไม่สามารถเริ่มต้นได้',
+ },
+ loadingTitle: 'กำลังเตรียมพื้นที่เรียนของคุณ',
+ },
+ common: {
+ actions: {
+ back: 'กลับ',
+ cancel: 'ยกเลิก',
+ checkAgain: 'ตรวจสอบอีกครั้ง',
+ close: 'ปิด',
+ create: 'สร้าง',
+ delete: 'ลบ',
+ dismissError: 'ปิดข้อผิดพลาด',
+ dismissStatus: 'ปิดสถานะ',
+ edit: 'แก้ไข',
+ itemActions: 'การทำงานของ {{title}}',
+ reset: 'รีเซ็ต',
+ review: 'ทบทวน',
+ save: 'บันทึก',
+ saveChanges: 'บันทึกการเปลี่ยนแปลง',
+ tryAgain: 'ลองอีกครั้ง',
+ },
+ labels: {
+ active: 'ใช้งานอยู่',
+ clear: 'Clear',
+ custom: 'กำหนดเอง',
+ default: 'ค่าเริ่มต้น',
+ loadingEditor: 'กำลังโหลดตัวแก้ไข',
+ name: 'ชื่อ',
+ completedTask: 'งานที่เสร็จแล้ว',
+ description: 'คำอธิบาย',
+ incompleteTask: 'งานที่ยังไม่เสร็จ',
+ percentageInput: 'เปอร์เซ็นต์ของ {{label}}',
+ visual: 'ภาพ',
+ },
+ status: {
+ actionFailed: 'การทำงานล้มเหลว',
+ actionInProgress: 'กำลังดำเนินการ',
+ },
+ sort: {
+ ascending: 'น้อยไปมาก',
+ column: 'คอลัมน์',
+ descending: 'มากไปน้อย',
+ direction: 'ทิศทาง',
+ sort: 'เรียงลำดับ',
+ },
+ search: {
+ label: 'ค้นหา',
+ },
+ visualPicker: {
+ allLucideIcons: 'ไอคอน Lucide ทั้งหมด',
+ browseIconsFor: 'เรียกดูหรือค้นหาไอคอนสำหรับ {{label}}',
+ chooseIcon: 'เลือกไอคอน',
+ iconPicker: 'ตัวเลือกไอคอนสำหรับ {{label}}',
+ iconSearch: 'ค้นหาไอคอนสำหรับ {{label}}',
+ iconsCouldNotLoad: 'ไม่สามารถโหลดไอคอนได้',
+ loadingIcons: 'กำลังโหลดไอคอน',
+ loadingMoreIcons: 'กำลังโหลดไอคอนเพิ่มเติม',
+ moreIcons: 'ไอคอนเพิ่มเติม',
+ noIconsMatch: 'ไม่มีไอคอนที่ตรงกับ "{{query}}"',
+ searchIconsPlaceholder: 'ค้นหาไอคอน…',
+ selectedIcon: 'เลือก {{label}} แล้ว',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'สร้าง',
+ newDeck: 'สำรับใหม่',
+ newFolder: 'โฟลเดอร์ใหม่',
+ },
+ descriptions: {
+ defaultWorkspace: 'เก็บสำรับ โฟลเดอร์ และโน้ตไว้ด้วยกัน',
+ emptyWorkspace: 'สร้างสำรับ แล้วเพิ่มโน้ตเพื่อสร้างคิวทบทวนของคุณ',
+ emptyFolder: 'สร้างสำรับ แล้วเพิ่มโน้ตเพื่อสร้างคิวทบทวน',
+ searchPlaceholder: 'ค้นหาโฟลเดอร์ สำรับ และโน้ต…',
+ },
+ empty: {
+ createFirstDeck: 'สร้างสำรับแรกของคุณ',
+ },
+ errors: {
+ couldNotDeleteDeck: 'ไม่สามารถลบสำรับได้',
+ couldNotDeleteFolder: 'ไม่สามารถลบโฟลเดอร์ได้',
+ couldNotDeleteWorkspace: 'ไม่สามารถลบพื้นที่ทำงานได้',
+ dashboardCouldNotOpen: 'ไม่สามารถเปิดแดชบอร์ดได้',
+ decksCouldNotLoad: 'ไม่สามารถโหลดสำรับได้',
+ decksMayBeOutOfDate: 'สำรับอาจล้าสมัย',
+ foldersCouldNotLoad: 'ไม่สามารถโหลดโฟลเดอร์ได้',
+ foldersMayBeOutOfDate: 'โฟลเดอร์อาจล้าสมัย',
+ workspaceCouldNotLoad: 'ไม่สามารถโหลดพื้นที่ทำงานได้',
+ },
+ labels: {
+ dashboard: 'แดชบอร์ด',
+ loadingDashboard: 'กำลังโหลดแดชบอร์ด',
+ newItem: 'รายการใหม่',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'ไม่มีวันที่',
+ },
+ age: {
+ dayAgo_one: '{{count}} วันที่แล้ว',
+ dayAgo_other: '{{count}} วันที่แล้ว',
+ hourAgo_one: '{{count}} ชั่วโมงที่แล้ว',
+ hourAgo_other: '{{count}} ชั่วโมงที่แล้ว',
+ justNow: 'เมื่อสักครู่',
+ minuteAgo_one: '{{count}} นาทีที่แล้ว',
+ minuteAgo_other: '{{count}} นาทีที่แล้ว',
+ unavailable: 'ไม่มีวันที่',
+ weekAgo_one: '{{count}} สัปดาห์ที่แล้ว',
+ weekAgo_other: '{{count}} สัปดาห์ที่แล้ว',
+ },
+ labels: {
+ deleted: 'ลบแล้ว {{value}}',
+ due: 'ครบกำหนด: {{value}}',
+ reviewed: 'ทบทวนแล้ว: {{value}}',
+ updated: 'อัปเดตแล้ว {{value}}',
+ updatedUppercase: 'อัปเดตแล้ว {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} วันที่แล้ว',
+ dayAgo_other: '{{count}} วันที่แล้ว',
+ inAMoment: 'อีกสักครู่',
+ inDay_one: 'อีก {{count}} วัน',
+ inDay_other: 'อีก {{count}} วัน',
+ inMonth_one: 'อีก {{count}} เดือน',
+ inMonth_other: 'อีก {{count}} เดือน',
+ inWeek_one: 'อีก {{count}} สัปดาห์',
+ inWeek_other: 'อีก {{count}} สัปดาห์',
+ justNow: 'เมื่อสักครู่',
+ monthAgo_one: '{{count}} เดือนที่แล้ว',
+ monthAgo_other: '{{count}} เดือนที่แล้ว',
+ secondsAgoShort: '{{count}} วิที่แล้ว',
+ minutesAgoShort: '{{count}} นาทีที่แล้ว',
+ hoursAgoShort: '{{count}} ชม.ที่แล้ว',
+ today: 'วันนี้',
+ tomorrow: 'พรุ่งนี้',
+ weekAgo_one: '{{count}} สัปดาห์ที่แล้ว',
+ weekAgo_other: '{{count}} สัปดาห์ที่แล้ว',
+ yesterday: 'เมื่อวาน',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'การทำงานของ {{title}}',
+ createDeck: 'สร้างสำรับ',
+ createNote: 'สร้างโน้ต',
+ deleteDeck: 'ลบสำรับ',
+ editDeck: 'แก้ไขสำรับ',
+ newNote: 'โน้ตใหม่',
+ openDeck: 'เปิดสำรับ {{title}}',
+ saveDeck: 'ไม่สามารถบันทึกสำรับได้',
+ studyNow: 'เรียนตอนนี้',
+ },
+ descriptions: {
+ emptyDeck: 'เพิ่มโน้ตเพื่อให้สำรับนี้มีเนื้อหาสำหรับทบทวน',
+ editorDefault: 'สำรับเรียนแบบโฟกัส',
+ editorVisual: 'เลือกสัญลักษณ์หน้าปกสำหรับสำรับนี้',
+ notesSearchPlaceholder: 'ค้นหาโน้ต…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'การทำงานนี้จะย้าย "{{title}}" ไปที่ถังขยะ คุณสามารถกู้คืนได้ภายหลัง',
+ deleteDeckFallbackDescription: 'การทำงานนี้จะย้ายสำรับนี้ไปที่ถังขยะ คุณสามารถกู้คืนได้ภายหลัง',
+ deleteDeckFallbackTitle: 'ลบสำรับหรือไม่',
+ deleteDeckTitle: 'ลบ "{{title}}" หรือไม่',
+ deleteNoteDescription: 'การทำงานนี้จะย้าย "{{title}}" ไปที่ถังขยะ คุณสามารถกู้คืนได้ภายหลัง',
+ deleteNoteFallbackTitle: 'ลบโน้ตหรือไม่',
+ deleteNoteTitle: 'ลบ "{{title}}" หรือไม่',
+ },
+ empty: {
+ noMatchingNotes: 'ไม่มีโน้ตที่ตรงกัน',
+ noMatchingNotesDescription: 'ไม่มีโน้ตที่ตรงกับ "{{query}}"',
+ thisDeckIsEmpty: 'สำรับนี้ว่างเปล่า',
+ },
+ errors: {
+ couldNotCreateDeck: 'ไม่สามารถสร้างสำรับได้',
+ couldNotDeleteDeck: 'ไม่สามารถลบสำรับได้',
+ couldNotDeleteNote: 'ไม่สามารถลบโน้ตได้',
+ couldNotLoadFolderPath: 'ไม่สามารถโหลดเส้นทางโฟลเดอร์ได้',
+ couldNotSaveDeck: 'ไม่สามารถบันทึกสำรับได้',
+ deckCouldNotLoad: 'ไม่สามารถโหลดสำรับได้',
+ notesCouldNotLoad: 'ไม่สามารถโหลดโน้ตได้',
+ notesMayBeOutOfDate: 'โน้ตอาจล้าสมัย',
+ },
+ fields: {
+ descriptionLabel: 'คำอธิบายสำรับ',
+ descriptionPlaceholder: 'สำรับนี้จะช่วยคุณทบทวนอะไร',
+ namePlaceholder: 'ชื่อสำรับ',
+ untitledDeck: 'สำรับไม่มีชื่อ',
+ untitledDeckLower: 'สำรับไม่มีชื่อ',
+ },
+ labels: {
+ createDeckTitle: 'สร้างสำรับ',
+ deck: 'สำรับ',
+ deckNotesSearch: 'ค้นหาโน้ตในสำรับ',
+ deckOverview: 'ภาพรวมสำรับ',
+ decks: 'สำรับ',
+ due: 'ครบกำหนด',
+ dueToday: 'ครบกำหนดวันนี้',
+ loadingDeck: 'กำลังโหลดสำรับ',
+ mastery: 'ความเชี่ยวชาญ',
+ notes: 'โน้ต',
+ },
+ sort: {
+ ariaLabel: 'เรียงลำดับสำรับ',
+ dueToday: 'ครบกำหนดวันนี้',
+ title: 'ชื่อเรื่อง',
+ updated: 'อัปเดตแล้ว',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'ข้อมูลมีการเปลี่ยนแปลง รีเฟรชแล้วลองอีกครั้ง',
+ forbidden: 'คุณไม่มีสิทธิ์ทำสิ่งนี้',
+ notFound: 'เราไม่พบรายการนี้',
+ offline: 'ไม่สามารถติดต่อบริการได้',
+ timeout: 'ใช้เวลานานเกินไป ลองอีกครั้ง',
+ unauthorized: 'ลงชื่อเข้าใช้เพื่อดำเนินการต่อ',
+ unavailable: 'บริการไม่พร้อมใช้งานชั่วคราว',
+ },
+ fallback: {
+ unexpected: 'ข้อผิดพลาดที่ไม่คาดคิด',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'สร้างโฟลเดอร์',
+ deleteFolder: 'ลบโฟลเดอร์',
+ editFolder: 'แก้ไขโฟลเดอร์',
+ },
+ descriptions: {
+ editorDefault: 'โฟลเดอร์สำหรับสำรับที่เกี่ยวข้องกัน',
+ },
+ dialogs: {
+ deleteFolderDescription: 'การทำงานนี้จะย้าย "{{name}}" ไปที่ถังขยะ คุณสามารถกู้คืนได้ภายหลัง',
+ deleteFolderFallbackDescription: 'การทำงานนี้จะย้ายโฟลเดอร์นี้ไปที่ถังขยะ คุณสามารถกู้คืนได้ภายหลัง',
+ deleteFolderFallbackTitle: 'ลบโฟลเดอร์หรือไม่',
+ deleteFolderTitle: 'ลบ "{{name}}" หรือไม่',
+ },
+ empty: {
+ noMatchesInFolder: 'ไม่มีรายการที่ตรงกันในโฟลเดอร์นี้',
+ noMatchesInFolderDescription: 'ไม่มีโฟลเดอร์ สำรับ หรือโน้ตที่ตรงกับ "{{query}}"',
+ },
+ errors: {
+ couldNotCreateFolder: 'ไม่สามารถสร้างโฟลเดอร์ได้',
+ couldNotDeleteFolder: 'ไม่สามารถลบโฟลเดอร์ได้',
+ couldNotLoadFolderPath: 'ไม่สามารถโหลดเส้นทางโฟลเดอร์ได้',
+ couldNotSaveFolder: 'ไม่สามารถบันทึกโฟลเดอร์ได้',
+ folderCouldNotLoad: 'ไม่สามารถโหลดโฟลเดอร์ได้',
+ },
+ fields: {
+ descriptionLabel: 'คำอธิบายโฟลเดอร์',
+ descriptionPlaceholder: 'อะไรอยู่ในโฟลเดอร์นี้',
+ namePlaceholder: 'ชื่อโฟลเดอร์',
+ untitledFolder: 'โฟลเดอร์ไม่มีชื่อ',
+ },
+ labels: {
+ createFolderTitle: 'สร้างโฟลเดอร์',
+ folder: 'โฟลเดอร์',
+ folders: 'โฟลเดอร์',
+ loadingFolder: 'กำลังโหลดโฟลเดอร์',
+ name: 'ชื่อ',
+ updated: 'อัปเดตแล้ว',
+ },
+ sort: {
+ ariaLabel: 'เรียงลำดับโฟลเดอร์',
+ name: 'ชื่อ',
+ updated: 'อัปเดตแล้ว',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'หากข้อมูลในเครื่องและข้อมูลที่ซิงค์ไม่ตรงกัน รายการจะปรากฏที่นี่',
+ heading: 'สถานะการซิงค์',
+ title: 'ข้อขัดแย้ง',
+ noConflicts: 'ไม่พบข้อขัดแย้ง',
+ },
+ labels: {
+ menu: 'เมนู',
+ },
+ sections: {
+ settings: {
+ description: 'ปรับแต่งสภาพแวดล้อมและค่ากำหนดของคุณ',
+ title: 'การตั้งค่า',
+ },
+ trash: {
+ description: 'กู้คืนหรือลบรายการที่ถูกลบอย่างถาวร',
+ title: 'ถังขยะ',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'ปิดตัวแก้ไข',
+ openActions: 'เปิดการทำงาน',
+ openWorkspaces: 'เปิดพื้นที่ทำงาน',
+ },
+ items: {
+ home: 'หน้าแรก',
+ menu: 'เมนู',
+ primary: 'หลัก',
+ settings: 'การตั้งค่า',
+ spaces: 'พื้นที่',
+ trash: 'ถังขยะ',
+ workspaces: 'พื้นที่ทำงาน',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'เพิ่ม cloze',
+ deleteNote: 'ลบโน้ต',
+ editNote: 'แก้ไขโน้ต',
+ hideDerivedCardsNote: 'ซ่อนโน้ตเกี่ยวกับการ์ดที่สร้างตามมา',
+ openNote: 'เปิด {{title}}',
+ saveNote: 'บันทึกโน้ต',
+ showDerivedCardsNote: 'แสดงโน้ตเกี่ยวกับการ์ดที่สร้างตามมา',
+ },
+ descriptions: {
+ clozeFormat: 'แต่ละส่วนที่ซ่อนจะกลายเป็นการ์ดทบทวนเมื่อคุณบันทึก',
+ clozeFormatPrefix: 'ครอบข้อความที่ซ่อนด้วย',
+ derivedCardsHelper: 'โน้ตคือแหล่งข้อมูลหลักสำหรับการ์ดที่สร้างตามมา',
+ },
+ dialogs: {
+ deleteNoteDescription: 'การทำงานนี้จะย้าย "{{title}}" ไปที่ถังขยะ คุณสามารถกู้คืนได้ภายหลัง',
+ deleteNoteFallbackDescription: 'การทำงานนี้จะย้ายโน้ตนี้ไปที่ถังขยะ คุณสามารถกู้คืนได้ภายหลัง',
+ deleteNoteFallbackTitle: 'ลบโน้ตหรือไม่',
+ deleteNoteTitle: 'ลบ "{{title}}" หรือไม่',
+ },
+ errors: {
+ couldNotCreateNote: 'ไม่สามารถสร้างโน้ตได้',
+ couldNotDeleteNote: 'ไม่สามารถลบโน้ตได้',
+ couldNotSaveNote: 'ไม่สามารถบันทึกโน้ตได้',
+ noteCouldNotLoad: 'ไม่สามารถโหลดโน้ตได้',
+ },
+ fields: {
+ back: 'ด้านหลัง',
+ backPlaceholder: 'ป้อนด้านหลัง',
+ bodyPlaceholder: 'เขียนเนื้อหาโน้ตพร้อม cloze deletions…',
+ front: 'ด้านหน้า',
+ frontPlaceholder: 'ป้อนด้านหน้า',
+ noteBody: 'เนื้อหาโน้ต',
+ title: 'ชื่อเรื่อง',
+ titlePlaceholder: 'เพิ่มชื่อโน้ต',
+ untitledCloze: 'Cloze ไม่มีชื่อ',
+ untitledNote: 'โน้ตไม่มีชื่อ',
+ },
+ labels: {
+ backUppercase: 'ด้านหลัง',
+ basic: 'พื้นฐาน',
+ basicLower: 'พื้นฐาน',
+ basicUppercase: 'พื้นฐาน',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'รูปแบบ Cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'สำรับ',
+ derivedCards: 'การ์ดที่สร้างตามมา',
+ due: 'ครบกำหนด',
+ frontUppercase: 'ด้านหน้า',
+ inProgress: 'กำลังดำเนินการ',
+ inProgressUppercase: 'กำลังดำเนินการ',
+ loadingNote: 'กำลังโหลดโน้ต',
+ loadingNoteEditor: 'กำลังโหลดตัวแก้ไขโน้ต',
+ markdownFormatting: 'การจัดรูปแบบ Markdown',
+ mastered: 'เชี่ยวชาญแล้ว',
+ masteredUppercase: 'เชี่ยวชาญแล้ว',
+ newNote: 'โน้ตใหม่',
+ noteBody: 'เนื้อหาโน้ต',
+ noteContent: 'เนื้อหาโน้ต',
+ noteDetails: 'รายละเอียดโน้ต',
+ noteMetadata: 'เมตาดาต้าโน้ต',
+ noteType: 'ประเภทโน้ต',
+ notes: 'โน้ต',
+ reviewed: 'ทบทวนแล้ว',
+ studyProgress: 'ความคืบหน้าการเรียน',
+ studyProgressUppercase: 'ความคืบหน้าการเรียน',
+ titleUppercase: 'ชื่อเรื่อง',
+ updated: 'อัปเดตแล้ว',
+ },
+ sort: {
+ ariaLabel: 'เรียงลำดับโน้ต',
+ title: 'ชื่อเรื่อง',
+ updated: 'อัปเดตแล้ว',
+ },
+ toolbar: {
+ bold: 'ตัวหนา',
+ italic: 'ตัวเอียง',
+ link: 'ลิงก์',
+ list: 'รายการ',
+ },
+ },
+ review: {
+ actions: {
+ again: 'อีกครั้ง',
+ backToDeck: 'กลับไปที่สำรับ',
+ continueReview: 'ทบทวนต่อ',
+ easy: 'ง่าย',
+ good: 'ดี',
+ hard: 'ยาก',
+ newNote: 'โน้ตใหม่',
+ showAnswer: 'แสดงคำตอบ',
+ },
+ errors: {
+ couldNotGradeCard: 'ไม่สามารถให้คะแนนการ์ดได้',
+ reviewCouldNotLoad: 'ไม่สามารถโหลดการทบทวนได้',
+ reviewCouldNotStart: 'ไม่สามารถเริ่มการทบทวนได้',
+ summaryCouldNotLoad: 'ไม่สามารถโหลดสรุปการทบทวนได้',
+ summaryNotAvailable: 'สรุปการทบทวนไม่พร้อมใช้งาน',
+ summaryNotComplete: 'การทบทวนนี้ยังไม่เสร็จสมบูรณ์',
+ },
+ labels: {
+ cardsReviewed: 'การ์ดที่ทบทวนแล้ว',
+ deck: 'สำรับ',
+ duration: 'ระยะเวลา',
+ loadingReview: 'กำลังโหลดการทบทวน',
+ loadingSummary: 'กำลังโหลดสรุป',
+ progress: 'ความคืบหน้าการทบทวน',
+ review: 'ทบทวน',
+ reviewComplete: 'ทบทวนเสร็จแล้ว',
+ reviewed_one: 'ทบทวนแล้ว {{count}}',
+ reviewed_other: 'ทบทวนแล้ว {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} ชม. {{minutes}} นาที',
+ durationMinutes: '{{minutes}} นาที',
+ durationSeconds: '{{seconds}} วิ',
+ saved: 'บันทึกความคืบหน้าของคุณลงในสำรับนี้แล้ว',
+ },
+ unavailable: {
+ description: 'เพิ่มโน้ตเพื่อให้สำรับนี้เข้าสู่คิวทบทวนได้',
+ title: 'ไม่มีการ์ดให้ทบทวน',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'ล้างการค้นหา',
+ },
+ empty: {
+ noMatchesInWorkspace: 'ไม่มีรายการที่ตรงกันในพื้นที่ทำงานนี้',
+ noMatchesInWorkspaceDescription: 'ไม่มีโฟลเดอร์ สำรับ หรือโน้ตที่ตรงกับ "{{query}}"',
+ },
+ errors: {
+ couldNotComplete: 'ไม่สามารถค้นหาให้เสร็จได้',
+ },
+ labels: {
+ results: 'ผลการค้นหา',
+ resultsFor: 'ผลลัพธ์สำหรับ "{{query}}"',
+ searchingContent: 'กำลังค้นหาเนื้อหา',
+ },
+ resultGroups: {
+ deck: 'สำรับ',
+ folder: 'โฟลเดอร์',
+ note: 'โน้ต',
+ },
+ resultKinds: {
+ deck: 'สำรับ',
+ folder: 'โฟลเดอร์',
+ note: 'โน้ต',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'รีเซ็ตการตั้งค่าทั้งหมด',
+ resetSettings: 'รีเซ็ตการตั้งค่า',
+ resetToDefaults: 'กลับเป็นค่าเริ่มต้น',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'วาง JSON ที่ถูกต้องพร้อมค่าตัวเลข 21 ค่า',
+ fsrsErrorInvalidParams_one: 'ป้อนอาร์เรย์ JSON ที่มีตัวเลขจำกัดจำนวน {{count}} ค่า',
+ fsrsErrorInvalidParams_other: 'ป้อนอาร์เรย์ JSON ที่มีตัวเลขจำกัดจำนวน {{count}} ค่า',
+ fsrsHelper: 'นี่คือการตั้งค่าขั้นสูง ค่าต้องคงลำดับเดิม',
+ fsrsJsonLabel: 'JSON พารามิเตอร์ FSRS',
+ fsrsTitle: 'แก้ไขพารามิเตอร์ FSRS',
+ fsrsDescription: 'วางอาร์เรย์ JSON ที่มีตัวเลข 21 ค่าเพื่อแทนที่น้ำหนักของตัวจัดตาราง',
+ resetDescription: 'การทำงานนี้จะคืนค่าเขตเวลา ขีดจำกัดการเรียน และการตั้งค่า FSRS',
+ resetDescriptionWithLanguage: 'การทำงานนี้จะคืนค่าภาษา เขตเวลา ขีดจำกัดการเรียน และการตั้งค่า FSRS',
+ resetTitle: 'รีเซ็ตการตั้งค่าทั้งหมดหรือไม่',
+ timezoneDescription: 'ค้นหาเมืองหรือตัวระบุเขตเวลา',
+ timezoneSearchLabel: 'ค้นหาเขตเวลา',
+ timezoneSearchPlaceholder: 'ค้นหาเขตเวลา…',
+ timezoneTitle: 'เลือกเขตเวลา',
+ },
+ errors: {
+ couldNotResetSettings: 'ไม่สามารถรีเซ็ตการตั้งค่าได้',
+ couldNotSaveSettings: 'ไม่สามารถบันทึกการตั้งค่าได้',
+ settingsCouldNotLoad: 'ไม่สามารถโหลดการตั้งค่าได้',
+ settingsUnavailable: 'การตั้งค่าไม่พร้อมใช้งาน',
+ },
+ labels: {
+ appearance: 'รูปลักษณ์',
+ automatic: 'อัตโนมัติ',
+ fsrsParameters: 'พารามิเตอร์ FSRS',
+ general: 'ทั่วไป',
+ language: 'ภาษา',
+ loadingSettings: 'กำลังโหลดการตั้งค่า',
+ masteryHorizon: 'ช่วงเวลาความเชี่ยวชาญ',
+ newCardOrder: 'ลำดับการ์ดใหม่',
+ newCardsPerDay: 'การ์ดใหม่ต่อวัน',
+ reviewCardsPerDay: 'การ์ดทบทวนต่อวัน',
+ savingSettings: 'กำลังบันทึกการตั้งค่า',
+ schedule: 'ตารางเวลา',
+ searchNoTimezones: 'ไม่มีเขตเวลาที่ตรงกัน',
+ settings: 'การตั้งค่า',
+ settingsReset: 'รีเซ็ตการตั้งค่าแล้ว',
+ study: 'การเรียน',
+ targetRecallProbability: 'ความน่าจะเป็นเป้าหมายในการจำได้',
+ theme: 'ธีม',
+ timezone: 'เขตเวลา',
+ },
+ options: {
+ languageEnUs: 'อังกฤษ (สหรัฐฯ)',
+ newCardsAfterReviews: 'หลังการทบทวน',
+ newCardsBeforeReviews: 'ก่อนการทบทวน',
+ newCardsMixed: 'ผสม',
+ themeDark: 'มืด',
+ themeLight: 'สว่าง',
+ themeSystem: 'ระบบ',
+ timezoneSystem: 'ใช้เขตเวลาของระบบ',
+ },
+ rows: {
+ fsrsDescription: 'น้ำหนักโมเดลขั้นสูง',
+ languageDescription: 'ภาษาของอินเทอร์เฟซ',
+ masteryHorizonDescription: 'จำนวนวันที่การ์ดต้องยังจำได้ที่หรือสูงกว่าความน่าจะเป็นเป้าหมายเพื่อให้นับว่าเชี่ยวชาญ',
+ newCardOrderDescription: 'ลำดับการ์ดใหม่เทียบกับการทบทวน',
+ newCardsPerDayDescription: 'จำนวนการ์ดใหม่สูงสุดต่อวัน',
+ reviewCardsPerDayDescription: 'จำนวนการ์ดทบทวนสูงสุดต่อวัน',
+ targetRecallProbabilityDescription: 'ความน่าจะเป็นขั้นต่ำในการจำได้ในการทบทวนที่กำหนดไว้ครั้งถัดไป',
+ timezoneDescription: 'ใช้เขตเวลาอัตโนมัติหรือเลือกเมือง',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'ลบถาวร',
+ empty: 'ล้าง',
+ emptyTrash: 'ล้างถังขยะ',
+ restore: 'กู้คืน',
+ restoringItem: 'กำลังกู้คืน {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'การทำงานนี้จะลบ "{{title}}" อย่างถาวร และย้อนกลับไม่ได้',
+ deleteItemFallbackDescription: 'การทำงานนี้จะลบรายการนี้อย่างถาวร และย้อนกลับไม่ได้',
+ deleteItemFallbackTitle: 'ลบรายการหรือไม่',
+ deleteItemTitle: 'ลบ "{{title}}" หรือไม่',
+ emptyTrashDescription: 'การทำงานนี้จะลบทุกอย่างในถังขยะอย่างถาวร และย้อนกลับไม่ได้',
+ emptyTrashTitle: 'ล้างถังขยะหรือไม่',
+ },
+ empty: {
+ description: 'รายการที่คุณลบจะปรากฏที่นี่ก่อนถูกลบถาวร',
+ title: 'ถังขยะว่างเปล่า',
+ },
+ errors: {
+ couldNotDeleteItem: 'ไม่สามารถลบรายการได้',
+ couldNotEmptyTrash: 'ไม่สามารถล้างถังขยะได้',
+ couldNotRestoreItem: 'ไม่สามารถกู้คืนรายการได้',
+ trashCouldNotLoad: 'ไม่สามารถโหลดถังขยะได้',
+ trashMayBeOutOfDate: 'ถังขยะอาจล้าสมัย',
+ },
+ labels: {
+ deletedAge: 'ลบแล้ว {{value}}',
+ itemCount_one: '{{count}} รายการ',
+ itemCount_other: '{{count}} รายการ',
+ lastEmptied: 'ล้างครั้งล่าสุด {{value}}',
+ loadingTrash: 'กำลังโหลดถังขยะ',
+ originalLocation: 'ตำแหน่งเดิม: {{location}}',
+ title: 'ถังขยะ',
+ trashActions: 'การทำงานในถังขยะของ {{title}}',
+ },
+ kinds: {
+ deck: 'สำรับ',
+ folder: 'โฟลเดอร์',
+ note: 'โน้ต',
+ workspace: 'พื้นที่ทำงาน',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'สร้างพื้นที่ทำงาน',
+ deleteWorkspace: 'ลบพื้นที่ทำงาน',
+ editWorkspace: 'แก้ไขพื้นที่ทำงาน',
+ newWorkspace: 'พื้นที่ทำงานใหม่',
+ openWorkspace: 'เปิด {{title}}',
+ openingWorkspace: 'กำลังเปิด {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'บริบทการเรียน',
+ editorVisual: 'เลือกจุดยึดภาพสำหรับพื้นที่ทำงานนี้',
+ emptyList: 'แยกสำรับ โน้ต และคิวทบทวนตามบริบทการเรียน',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'การทำงานนี้จะย้าย "{{title}}" ไปที่ถังขยะ คุณสามารถกู้คืนได้ภายหลัง',
+ deleteWorkspaceFallbackDescription: 'การทำงานนี้จะย้ายพื้นที่ทำงานนี้ไปที่ถังขยะ คุณสามารถกู้คืนได้ภายหลัง',
+ deleteWorkspaceFallbackTitle: 'ลบพื้นที่ทำงานหรือไม่',
+ deleteWorkspaceTitle: 'ลบ "{{title}}" หรือไม่',
+ },
+ empty: {
+ startWithWorkspace: 'เริ่มด้วยพื้นที่ทำงาน',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'ไม่สามารถสร้างพื้นที่ทำงานได้',
+ couldNotDeleteWorkspace: 'ไม่สามารถลบพื้นที่ทำงานได้',
+ couldNotOpenWorkspace: 'ไม่สามารถเปิดพื้นที่ทำงานได้',
+ couldNotSaveWorkspace: 'ไม่สามารถบันทึกพื้นที่ทำงานได้',
+ workspaceCouldNotLoad: 'ไม่สามารถโหลดพื้นที่ทำงานได้',
+ workspacesCouldNotLoad: 'ไม่สามารถโหลดพื้นที่ทำงานได้',
+ },
+ fields: {
+ descriptionLabel: 'คำอธิบายพื้นที่ทำงาน',
+ descriptionPlaceholder: 'อะไรอยู่ในพื้นที่ทำงานนี้',
+ namePlaceholder: 'ชื่อพื้นที่ทำงาน',
+ untitledWorkspace: 'พื้นที่ทำงานไม่มีชื่อ',
+ },
+ labels: {
+ createWorkspaceTitle: 'สร้างพื้นที่ทำงาน',
+ loadingWorkspaces: 'กำลังโหลดพื้นที่ทำงาน',
+ workspace: 'พื้นที่ทำงาน',
+ workspaces: 'พื้นที่ทำงาน',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/tr.ts b/ui/src/core/i18n/resources/tr.ts
new file mode 100644
index 0000000..2d8c7d7
--- /dev/null
+++ b/ui/src/core/i18n/resources/tr.ts
@@ -0,0 +1,623 @@
+export const tr = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Tekrar deneyin. Bu devam ederse Clear uygulamasını yeniden açın.',
+ title: 'Başlatılamadı',
+ },
+ loadingTitle: 'Çalışma alanınız hazırlanıyor',
+ },
+ common: {
+ actions: {
+ back: 'Geri',
+ cancel: 'İptal',
+ checkAgain: 'Tekrar kontrol et',
+ close: 'Kapat',
+ create: 'Oluştur',
+ delete: 'Sil',
+ dismissError: 'Hatayı kapat',
+ dismissStatus: 'Durumu kapat',
+ edit: 'Düzenle',
+ itemActions: '{{title}} işlemleri',
+ reset: 'Sıfırla',
+ review: 'Tekrar et',
+ save: 'Kaydet',
+ saveChanges: 'Değişiklikleri kaydet',
+ tryAgain: 'Tekrar dene',
+ },
+ labels: {
+ active: 'Etkin',
+ clear: 'Clear',
+ custom: 'Özel',
+ default: 'Varsayılan',
+ loadingEditor: 'Düzenleyici yükleniyor',
+ name: 'Ad',
+ completedTask: 'Tamamlanan görev',
+ description: 'Açıklama',
+ incompleteTask: 'Tamamlanmayan görev',
+ percentageInput: '{{label}} yüzdesi',
+ visual: 'Görsel',
+ },
+ status: {
+ actionFailed: 'İşlem başarısız oldu',
+ actionInProgress: 'İşlem devam ediyor',
+ },
+ sort: {
+ ascending: 'Artan',
+ column: 'Sütun',
+ descending: 'Azalan',
+ direction: 'Yön',
+ sort: 'Sırala',
+ },
+ search: {
+ label: 'Ara',
+ },
+ visualPicker: {
+ allLucideIcons: 'Tüm Lucide simgeleri',
+ browseIconsFor: '{{label}} için simgelere göz atın veya arayın.',
+ chooseIcon: 'Simge seç',
+ iconPicker: '{{label}} simge seçici',
+ iconSearch: '{{label}} simge araması',
+ iconsCouldNotLoad: 'Simgeler yüklenemedi.',
+ loadingIcons: 'Simgeler yükleniyor',
+ loadingMoreIcons: 'Daha fazla simge yükleniyor',
+ moreIcons: 'Daha fazla simge',
+ noIconsMatch: '"{{query}}" ile eşleşen simge yok.',
+ searchIconsPlaceholder: 'Simge ara…',
+ selectedIcon: '{{label}} seçildi',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Oluştur',
+ newDeck: 'Yeni deste',
+ newFolder: 'Yeni klasör',
+ },
+ descriptions: {
+ defaultWorkspace: 'Desteleri, klasörleri ve notları bir arada tutun.',
+ emptyWorkspace: 'Bir deste oluşturun, ardından tekrar sıranızı kurmak için notlar ekleyin.',
+ emptyFolder: 'Bir deste oluşturun, ardından bir tekrar sırası kurmak için notlar ekleyin.',
+ searchPlaceholder: 'Klasör, deste ve not ara…',
+ },
+ empty: {
+ createFirstDeck: 'İlk destenizi oluşturun',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Deste silinemedi',
+ couldNotDeleteFolder: 'Klasör silinemedi',
+ couldNotDeleteWorkspace: 'Çalışma alanı silinemedi',
+ dashboardCouldNotOpen: 'Panel açılamadı',
+ decksCouldNotLoad: 'Desteler yüklenemedi',
+ decksMayBeOutOfDate: 'Desteler güncel olmayabilir',
+ foldersCouldNotLoad: 'Klasörler yüklenemedi',
+ foldersMayBeOutOfDate: 'Klasörler güncel olmayabilir',
+ workspaceCouldNotLoad: 'Çalışma alanı yüklenemedi',
+ },
+ labels: {
+ dashboard: 'Panel',
+ loadingDashboard: 'Panel yükleniyor',
+ newItem: 'Yeni öğe',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Tarih kullanılamıyor',
+ },
+ age: {
+ dayAgo_one: '{{count}} gün önce',
+ dayAgo_other: '{{count}} gün önce',
+ hourAgo_one: '{{count}} saat önce',
+ hourAgo_other: '{{count}} saat önce',
+ justNow: 'az önce',
+ minuteAgo_one: '{{count}} dakika önce',
+ minuteAgo_other: '{{count}} dakika önce',
+ unavailable: 'tarih kullanılamıyor',
+ weekAgo_one: '{{count}} hafta önce',
+ weekAgo_other: '{{count}} hafta önce',
+ },
+ labels: {
+ deleted: '{{value}} silindi',
+ due: 'Sıra zamanı: {{value}}',
+ reviewed: 'Tekrarlandı: {{value}}',
+ updated: '{{value}} güncellendi',
+ updatedUppercase: '{{value}} GÜNCELLENDİ',
+ },
+ relative: {
+ dayAgo_one: '{{count}} gün önce',
+ dayAgo_other: '{{count}} gün önce',
+ inAMoment: 'Birazdan',
+ inDay_one: '{{count}} gün içinde',
+ inDay_other: '{{count}} gün içinde',
+ inMonth_one: '{{count}} ay içinde',
+ inMonth_other: '{{count}} ay içinde',
+ inWeek_one: '{{count}} hafta içinde',
+ inWeek_other: '{{count}} hafta içinde',
+ justNow: 'Az önce',
+ monthAgo_one: '{{count}} ay önce',
+ monthAgo_other: '{{count}} ay önce',
+ secondsAgoShort: '{{count}} sn önce',
+ minutesAgoShort: '{{count}} dk önce',
+ hoursAgoShort: '{{count}} sa önce',
+ today: 'Bugün',
+ tomorrow: 'Yarın',
+ weekAgo_one: '{{count}} hafta önce',
+ weekAgo_other: '{{count}} hafta önce',
+ yesterday: 'Dün',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: '{{title}} işlemleri',
+ createDeck: 'Deste oluştur',
+ createNote: 'Not oluştur',
+ deleteDeck: 'Desteyi sil',
+ editDeck: 'Desteyi düzenle',
+ newNote: 'Yeni not',
+ openDeck: '{{title}} destesini aç',
+ saveDeck: 'Deste kaydedilemedi',
+ studyNow: 'Şimdi çalış',
+ },
+ descriptions: {
+ emptyDeck: 'Bu destede tekrar edilecek materyal olması için bir not ekleyin.',
+ editorDefault: 'Odaklı çalışma destesi.',
+ editorVisual: 'Bu deste için bir kapak glifi seçin.',
+ notesSearchPlaceholder: 'Not ara…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Bu, "{{title}}" öğesini Çöp Kutusu\'na taşır. Daha sonra geri yükleyebilirsiniz.',
+ deleteDeckFallbackDescription: 'Bu, bu desteyi Çöp Kutusu\'na taşır. Daha sonra geri yükleyebilirsiniz.',
+ deleteDeckFallbackTitle: 'Deste silinsin mi?',
+ deleteDeckTitle: '"{{title}}" silinsin mi?',
+ deleteNoteDescription: 'Bu, "{{title}}" öğesini Çöp Kutusu\'na taşır. Daha sonra geri yükleyebilirsiniz.',
+ deleteNoteFallbackTitle: 'Not silinsin mi?',
+ deleteNoteTitle: '"{{title}}" silinsin mi?',
+ },
+ empty: {
+ noMatchingNotes: 'Eşleşen not yok',
+ noMatchingNotesDescription: '"{{query}}" ile eşleşen not yok.',
+ thisDeckIsEmpty: 'Bu deste boş',
+ },
+ errors: {
+ couldNotCreateDeck: 'Deste oluşturulamadı',
+ couldNotDeleteDeck: 'Deste silinemedi',
+ couldNotDeleteNote: 'Not silinemedi',
+ couldNotLoadFolderPath: 'Klasör yolu yüklenemedi',
+ couldNotSaveDeck: 'Deste kaydedilemedi',
+ deckCouldNotLoad: 'Deste yüklenemedi',
+ notesCouldNotLoad: 'Notlar yüklenemedi',
+ notesMayBeOutOfDate: 'Notlar güncel olmayabilir',
+ },
+ fields: {
+ descriptionLabel: 'Deste açıklaması',
+ descriptionPlaceholder: 'Bu deste neyi tekrar etmenize yardımcı olacak?',
+ namePlaceholder: 'Deste adı',
+ untitledDeck: 'Adsız deste',
+ untitledDeckLower: 'adsız deste',
+ },
+ labels: {
+ createDeckTitle: 'Deste oluştur',
+ deck: 'Deste',
+ deckNotesSearch: 'Deste notlarında ara',
+ deckOverview: 'Deste özeti',
+ decks: 'Desteler',
+ due: 'Sırası geldi',
+ dueToday: 'Bugün sırası geldi',
+ loadingDeck: 'Deste yükleniyor',
+ mastery: 'Uzmanlık',
+ notes: 'Notlar',
+ },
+ sort: {
+ ariaLabel: 'Desteleri sırala',
+ dueToday: 'Bugün sırası geldi',
+ title: 'Başlık',
+ updated: 'Güncellendi',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Veriler değişti. Yenileyin ve tekrar deneyin.',
+ forbidden: 'Bunu yapma izniniz yok.',
+ notFound: 'Bu öğeyi bulamadık.',
+ offline: 'Hizmete ulaşılamıyor.',
+ timeout: 'Bu işlem çok uzun sürdü. Tekrar deneyin.',
+ unauthorized: 'Devam etmek için oturum açın.',
+ unavailable: 'Hizmet geçici olarak kullanılamıyor.',
+ },
+ fallback: {
+ unexpected: 'Beklenmeyen hata',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Klasör oluştur',
+ deleteFolder: 'Klasörü sil',
+ editFolder: 'Klasörü düzenle',
+ },
+ descriptions: {
+ editorDefault: 'İlgili desteler için klasör.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Bu, "{{name}}" öğesini Çöp Kutusu\'na taşır. Daha sonra geri yükleyebilirsiniz.',
+ deleteFolderFallbackDescription: 'Bu, bu klasörü Çöp Kutusu\'na taşır. Daha sonra geri yükleyebilirsiniz.',
+ deleteFolderFallbackTitle: 'Klasör silinsin mi?',
+ deleteFolderTitle: '"{{name}}" silinsin mi?',
+ },
+ empty: {
+ noMatchesInFolder: 'Bu klasörde eşleşme yok',
+ noMatchesInFolderDescription: '"{{query}}" ile eşleşen klasör, deste veya not yok.',
+ },
+ errors: {
+ couldNotCreateFolder: 'Klasör oluşturulamadı',
+ couldNotDeleteFolder: 'Klasör silinemedi',
+ couldNotLoadFolderPath: 'Klasör yolu yüklenemedi',
+ couldNotSaveFolder: 'Klasör kaydedilemedi',
+ folderCouldNotLoad: 'Klasör yüklenemedi',
+ },
+ fields: {
+ descriptionLabel: 'Klasör açıklaması',
+ descriptionPlaceholder: 'Bu klasöre neler ait?',
+ namePlaceholder: 'Klasör adı',
+ untitledFolder: 'Adsız klasör',
+ },
+ labels: {
+ createFolderTitle: 'Klasör oluştur',
+ folder: 'Klasör',
+ folders: 'Klasörler',
+ loadingFolder: 'Klasör yükleniyor',
+ name: 'Ad',
+ updated: 'Güncellendi',
+ },
+ sort: {
+ ariaLabel: 'Klasörleri sırala',
+ name: 'Ad',
+ updated: 'Güncellendi',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Yerel ve senkronize veriler farklılaşırsa öğe burada görünür.',
+ heading: 'Senkronizasyon durumu',
+ title: 'Çakışmalar',
+ noConflicts: 'Çakışma bulunamadı',
+ },
+ labels: {
+ menu: 'Menü',
+ },
+ sections: {
+ settings: {
+ description: 'Ortamınızı ve tercihlerinizi kişiselleştirin',
+ title: 'Ayarlar',
+ },
+ trash: {
+ description: 'Kaldırılan öğeleri geri yükleyin veya kalıcı olarak silin',
+ title: 'Çöp Kutusu',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Düzenleyiciyi kapat',
+ openActions: 'İşlemleri aç',
+ openWorkspaces: 'Çalışma alanlarını aç',
+ },
+ items: {
+ home: 'Ana sayfa',
+ menu: 'Menü',
+ primary: 'Birincil',
+ settings: 'Ayarlar',
+ spaces: 'Alanlar',
+ trash: 'Çöp Kutusu',
+ workspaces: 'Çalışma alanları',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Cloze ekle',
+ deleteNote: 'Notu sil',
+ editNote: 'Notu düzenle',
+ hideDerivedCardsNote: 'Türetilen kart notunu gizle',
+ openNote: '{{title}} aç',
+ saveNote: 'Notu kaydet',
+ showDerivedCardsNote: 'Türetilen kart notunu göster',
+ },
+ descriptions: {
+ clozeFormat: 'Her gizli bölüm, kaydettiğinizde bir tekrar kartına dönüşür.',
+ clozeFormatPrefix: 'Gizli metni şununla sarın:',
+ derivedCardsHelper: 'Notlar, türetilen kartlar için doğruluk kaynağıdır.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Bu, "{{title}}" öğesini Çöp Kutusu\'na taşır. Daha sonra geri yükleyebilirsiniz.',
+ deleteNoteFallbackDescription: 'Bu, bu notu Çöp Kutusu\'na taşır. Daha sonra geri yükleyebilirsiniz.',
+ deleteNoteFallbackTitle: 'Not silinsin mi?',
+ deleteNoteTitle: '"{{title}}" silinsin mi?',
+ },
+ errors: {
+ couldNotCreateNote: 'Not oluşturulamadı',
+ couldNotDeleteNote: 'Not silinemedi',
+ couldNotSaveNote: 'Not kaydedilemedi',
+ noteCouldNotLoad: 'Not yüklenemedi',
+ },
+ fields: {
+ back: 'Arka',
+ backPlaceholder: 'Arka yüzü girin',
+ bodyPlaceholder: 'Not gövdesini cloze silmeleriyle yazın…',
+ front: 'Ön',
+ frontPlaceholder: 'Ön yüzü girin',
+ noteBody: 'Not gövdesi',
+ title: 'Başlık',
+ titlePlaceholder: 'Not başlığı ekle',
+ untitledCloze: 'Adsız cloze',
+ untitledNote: 'Adsız not',
+ },
+ labels: {
+ backUppercase: 'ARKA',
+ basic: 'Temel',
+ basicLower: 'temel',
+ basicUppercase: 'TEMEL',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Cloze biçimi',
+ clozeUppercase: 'CLOZE',
+ deck: 'Deste',
+ derivedCards: 'TÜRETİLEN KARTLAR',
+ due: 'Sırası geldi',
+ frontUppercase: 'ÖN',
+ inProgress: 'Devam ediyor',
+ inProgressUppercase: 'DEVAM EDİYOR',
+ loadingNote: 'Not yükleniyor',
+ loadingNoteEditor: 'Not düzenleyici yükleniyor',
+ markdownFormatting: 'Markdown biçimlendirme',
+ mastered: 'Uzmanlaşıldı',
+ masteredUppercase: 'UZMANLAŞILDI',
+ newNote: 'Yeni not',
+ noteBody: 'NOT GÖVDESİ',
+ noteContent: 'Not içeriği',
+ noteDetails: 'Not ayrıntıları',
+ noteMetadata: 'Not meta verileri',
+ noteType: 'Not türü',
+ notes: 'Notlar',
+ reviewed: 'Tekrarlandı',
+ studyProgress: 'Çalışma ilerlemesi',
+ studyProgressUppercase: 'ÇALIŞMA İLERLEMESİ',
+ titleUppercase: 'BAŞLIK',
+ updated: 'Güncellendi',
+ },
+ sort: {
+ ariaLabel: 'Notları sırala',
+ title: 'Başlık',
+ updated: 'Güncellendi',
+ },
+ toolbar: {
+ bold: 'Kalın',
+ italic: 'İtalik',
+ link: 'Bağlantı',
+ list: 'Liste',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Tekrar',
+ backToDeck: 'Desteye dön',
+ continueReview: 'Tekrara devam et',
+ easy: 'Kolay',
+ good: 'İyi',
+ hard: 'Zor',
+ newNote: 'Yeni not',
+ showAnswer: 'Yanıtı göster',
+ },
+ errors: {
+ couldNotGradeCard: 'Kart değerlendirilemedi',
+ reviewCouldNotLoad: 'Tekrar yüklenemedi',
+ reviewCouldNotStart: 'Tekrar başlatılamadı',
+ summaryCouldNotLoad: 'Tekrar özeti yüklenemedi',
+ summaryNotAvailable: 'Tekrar özeti kullanılamıyor',
+ summaryNotComplete: 'Bu tekrar henüz tamamlanmadı.',
+ },
+ labels: {
+ cardsReviewed: 'Tekrar edilen kartlar',
+ deck: 'Deste',
+ duration: 'Süre',
+ loadingReview: 'Tekrar yükleniyor',
+ loadingSummary: 'Özet yükleniyor',
+ progress: 'Tekrar ilerlemesi',
+ review: 'Tekrar',
+ reviewComplete: 'Tekrar tamamlandı',
+ reviewed_one: '{{count}} tekrarlandı',
+ reviewed_other: '{{count}} tekrarlandı',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} sa {{minutes}} dk',
+ durationMinutes: '{{minutes}} dk',
+ durationSeconds: '{{seconds}} sn',
+ saved: 'İlerlemeniz bu desteye kaydedildi.',
+ },
+ unavailable: {
+ description: 'Bu destenin tekrar sırasına girebilmesi için bir not ekleyin.',
+ title: 'Tekrar edilecek kart yok',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Aramayı temizle',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Bu çalışma alanında eşleşme yok',
+ noMatchesInWorkspaceDescription: '"{{query}}" ile eşleşen klasör, deste veya not yok.',
+ },
+ errors: {
+ couldNotComplete: 'Arama tamamlanamadı',
+ },
+ labels: {
+ results: 'Arama sonuçları',
+ resultsFor: '"{{query}}" için sonuçlar',
+ searchingContent: 'İçerik aranıyor',
+ },
+ resultGroups: {
+ deck: 'Desteler',
+ folder: 'Klasörler',
+ note: 'Notlar',
+ },
+ resultKinds: {
+ deck: 'deste',
+ folder: 'klasör',
+ note: 'not',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Tüm ayarları sıfırla',
+ resetSettings: 'Ayarları sıfırla',
+ resetToDefaults: 'Varsayılanlara dön',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: '21 sayısal değer içeren geçerli JSON yapıştırın.',
+ fsrsErrorInvalidParams_one: 'Tam olarak {{count}} sonlu sayı içeren bir JSON dizisi girin.',
+ fsrsErrorInvalidParams_other: 'Tam olarak {{count}} sonlu sayı içeren bir JSON dizisi girin.',
+ fsrsHelper: 'Bu bir uzman geçersiz kılmasıdır. Değerler sırasını korumalıdır.',
+ fsrsJsonLabel: 'FSRS Parametreleri JSON',
+ fsrsTitle: 'FSRS parametrelerini düzenle',
+ fsrsDescription: 'Zamanlayıcı ağırlıklarını geçersiz kılmak için 21 sayı içeren bir JSON dizisi yapıştırın.',
+ resetDescription: 'Bu, saat dilimi, çalışma sınırları ve FSRS ayarlarını geri yükler.',
+ resetDescriptionWithLanguage: 'Bu, dil, saat dilimi, çalışma sınırları ve FSRS ayarlarını geri yükler.',
+ resetTitle: 'Tüm ayarlar sıfırlansın mı?',
+ timezoneDescription: 'Bir şehir veya saat dilimi tanımlayıcısı arayın.',
+ timezoneSearchLabel: 'Saat dilimlerinde ara',
+ timezoneSearchPlaceholder: 'Saat dilimlerinde ara…',
+ timezoneTitle: 'Saat dilimi seç',
+ },
+ errors: {
+ couldNotResetSettings: 'Ayarlar sıfırlanamadı',
+ couldNotSaveSettings: 'Ayarlar kaydedilemedi',
+ settingsCouldNotLoad: 'Ayarlar yüklenemedi',
+ settingsUnavailable: 'Ayarlar kullanılamıyor.',
+ },
+ labels: {
+ appearance: 'Görünüm',
+ automatic: 'Otomatik',
+ fsrsParameters: 'FSRS Parametreleri',
+ general: 'Genel',
+ language: 'Dil',
+ loadingSettings: 'Ayarlar yükleniyor',
+ masteryHorizon: 'Uzmanlık ufku',
+ newCardOrder: 'Yeni kart sırası',
+ newCardsPerDay: 'Günlük yeni kart',
+ reviewCardsPerDay: 'Günlük tekrar kartı',
+ savingSettings: 'Ayarlar kaydediliyor',
+ schedule: 'Program',
+ searchNoTimezones: 'Eşleşen saat dilimi yok.',
+ settings: 'Ayarlar',
+ settingsReset: 'Ayarlar sıfırlandı',
+ study: 'Çalışma',
+ targetRecallProbability: 'Hedef hatırlama olasılığı',
+ theme: 'Tema',
+ timezone: 'Saat dilimi',
+ },
+ options: {
+ languageEnUs: 'İngilizce (ABD)',
+ newCardsAfterReviews: 'Tekrarlardan sonra',
+ newCardsBeforeReviews: 'Tekrarlardan önce',
+ newCardsMixed: 'Karışık',
+ themeDark: 'Koyu',
+ themeLight: 'Açık',
+ themeSystem: 'Sistem',
+ timezoneSystem: 'Sistem saat dilimini kullan',
+ },
+ rows: {
+ fsrsDescription: 'Uzman model ağırlıkları',
+ languageDescription: 'Arayüz dili',
+ masteryHorizonDescription: 'Bir kartın öğrenilmiş sayılması için hedef olasılıkta veya üstünde hatırlanabilir kalması gereken gün sayısı',
+ newCardOrderDescription: 'Yeni kartların tekrarlara göre sırası',
+ newCardsPerDayDescription: 'Günlük maksimum yeni kart',
+ reviewCardsPerDayDescription: 'Günlük maksimum tekrar kartı',
+ targetRecallProbabilityDescription: 'Bir sonraki planlı tekrarda minimum hatırlama olasılığı',
+ timezoneDescription: 'Otomatik saat dilimini kullanın veya bir şehir seçin.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Kalıcı olarak sil',
+ empty: 'Boşalt',
+ emptyTrash: 'Çöp Kutusu\'nu boşalt',
+ restore: 'Geri yükle',
+ restoringItem: '{{title}} geri yükleniyor',
+ },
+ dialogs: {
+ deleteItemDescription: 'Bu, "{{title}}" öğesini kalıcı olarak siler. Bu işlem geri alınamaz.',
+ deleteItemFallbackDescription: 'Bu, bu öğeyi kalıcı olarak siler. Bu işlem geri alınamaz.',
+ deleteItemFallbackTitle: 'Öğe silinsin mi?',
+ deleteItemTitle: '"{{title}}" silinsin mi?',
+ emptyTrashDescription: 'Bu, Çöp Kutusu\'ndaki her şeyi kalıcı olarak siler. Bu işlem geri alınamaz.',
+ emptyTrashTitle: 'Çöp Kutusu boşaltılsın mı?',
+ },
+ empty: {
+ description: 'Sildiğiniz öğeler kalıcı olarak kaldırılmadan önce burada görünür.',
+ title: 'Çöp Kutusu boş',
+ },
+ errors: {
+ couldNotDeleteItem: 'Öğe silinemedi',
+ couldNotEmptyTrash: 'Çöp Kutusu boşaltılamadı',
+ couldNotRestoreItem: 'Öğe geri yüklenemedi',
+ trashCouldNotLoad: 'Çöp Kutusu yüklenemedi',
+ trashMayBeOutOfDate: 'Çöp Kutusu güncel olmayabilir',
+ },
+ labels: {
+ deletedAge: '{{value}} silindi',
+ itemCount_one: '{{count}} öğe',
+ itemCount_other: '{{count}} öğe',
+ lastEmptied: 'Son boşaltma {{value}}',
+ loadingTrash: 'Çöp Kutusu yükleniyor',
+ originalLocation: 'Orijinal konum: {{location}}',
+ title: 'Çöp Kutusu',
+ trashActions: '{{title}} çöp kutusu işlemleri',
+ },
+ kinds: {
+ deck: 'Deste',
+ folder: 'Klasör',
+ note: 'Not',
+ workspace: 'Çalışma alanı',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Çalışma alanı oluştur',
+ deleteWorkspace: 'Çalışma alanını sil',
+ editWorkspace: 'Çalışma alanını düzenle',
+ newWorkspace: 'Yeni çalışma alanı',
+ openWorkspace: '{{title}} aç',
+ openingWorkspace: '{{title}} açılıyor',
+ },
+ descriptions: {
+ editorDefault: 'Çalışma bağlamı.',
+ editorVisual: 'Bu çalışma alanı için görsel bir işaret seçin.',
+ emptyList: 'Desteleri, notları ve tekrar sıralarını çalışma bağlamına göre ayırın.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Bu, "{{title}}" öğesini Çöp Kutusu\'na taşır. Daha sonra geri yükleyebilirsiniz.',
+ deleteWorkspaceFallbackDescription: 'Bu, bu çalışma alanını Çöp Kutusu\'na taşır. Daha sonra geri yükleyebilirsiniz.',
+ deleteWorkspaceFallbackTitle: 'Çalışma alanı silinsin mi?',
+ deleteWorkspaceTitle: '"{{title}}" silinsin mi?',
+ },
+ empty: {
+ startWithWorkspace: 'Bir çalışma alanıyla başlayın',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Çalışma alanı oluşturulamadı',
+ couldNotDeleteWorkspace: 'Çalışma alanı silinemedi',
+ couldNotOpenWorkspace: 'Çalışma alanı açılamadı',
+ couldNotSaveWorkspace: 'Çalışma alanı kaydedilemedi',
+ workspaceCouldNotLoad: 'Çalışma alanı yüklenemedi',
+ workspacesCouldNotLoad: 'Çalışma alanları yüklenemedi',
+ },
+ fields: {
+ descriptionLabel: 'Çalışma alanı açıklaması',
+ descriptionPlaceholder: 'Bu çalışma alanına neler ait?',
+ namePlaceholder: 'Çalışma alanı adı',
+ untitledWorkspace: 'Adsız çalışma alanı',
+ },
+ labels: {
+ createWorkspaceTitle: 'Çalışma alanı oluştur',
+ loadingWorkspaces: 'Çalışma alanları yükleniyor',
+ workspace: 'Çalışma alanı',
+ workspaces: 'Çalışma alanları',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/uk.ts b/ui/src/core/i18n/resources/uk.ts
new file mode 100644
index 0000000..f6d25ac
--- /dev/null
+++ b/ui/src/core/i18n/resources/uk.ts
@@ -0,0 +1,649 @@
+export const uk = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Спробуйте ще раз. Якщо це повториться, відкрийте Clear знову.',
+ title: 'Не вдалося запустити',
+ },
+ loadingTitle: 'Готуємо ваш простір для навчання',
+ },
+ common: {
+ actions: {
+ back: 'Назад',
+ cancel: 'Скасувати',
+ checkAgain: 'Перевірити знову',
+ close: 'Закрити',
+ create: 'Створити',
+ delete: 'Видалити',
+ dismissError: 'Закрити помилку',
+ dismissStatus: 'Закрити статус',
+ edit: 'Редагувати',
+ itemActions: 'Дії для {{title}}',
+ reset: 'Скинути',
+ review: 'Повторювати',
+ save: 'Зберегти',
+ saveChanges: 'Зберегти зміни',
+ tryAgain: 'Спробувати ще раз',
+ },
+ labels: {
+ active: 'Активно',
+ clear: 'Clear',
+ custom: 'Власне',
+ default: 'Типово',
+ loadingEditor: 'Завантаження редактора',
+ name: 'Назва',
+ completedTask: 'Завершене завдання',
+ description: 'Опис',
+ incompleteTask: 'Незавершене завдання',
+ percentageInput: 'Відсоток для {{label}}',
+ visual: 'Візуал',
+ },
+ status: {
+ actionFailed: 'Дію не виконано',
+ actionInProgress: 'Дія виконується',
+ },
+ sort: {
+ ascending: 'Зрост.',
+ column: 'Стовпець',
+ descending: 'Спад.',
+ direction: 'Напрям',
+ sort: 'Сортувати',
+ },
+ search: {
+ label: 'Пошук',
+ },
+ visualPicker: {
+ allLucideIcons: 'Усі іконки Lucide',
+ browseIconsFor: 'Переглядайте або шукайте іконки для {{label}}.',
+ chooseIcon: 'Вибрати іконку',
+ iconPicker: 'Вибір іконки для {{label}}',
+ iconSearch: 'Пошук іконок для {{label}}',
+ iconsCouldNotLoad: 'Не вдалося завантажити іконки.',
+ loadingIcons: 'Завантаження іконок',
+ loadingMoreIcons: 'Завантаження додаткових іконок',
+ moreIcons: 'Більше іконок',
+ noIconsMatch: 'Немає іконок за запитом "{{query}}".',
+ searchIconsPlaceholder: 'Шукати іконки…',
+ selectedIcon: 'Вибрано {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Створити',
+ newDeck: 'Нова колода',
+ newFolder: 'Нова папка',
+ },
+ descriptions: {
+ defaultWorkspace: 'Тримайте колоди, папки й нотатки разом.',
+ emptyWorkspace: 'Створіть колоду, а потім додайте нотатки, щоб зібрати чергу повторення.',
+ emptyFolder: 'Створіть колоду, а потім додайте нотатки, щоб зібрати чергу повторення.',
+ searchPlaceholder: 'Шукати папки, колоди й нотатки…',
+ },
+ empty: {
+ createFirstDeck: 'Створіть першу колоду',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Не вдалося видалити колоду',
+ couldNotDeleteFolder: 'Не вдалося видалити папку',
+ couldNotDeleteWorkspace: 'Не вдалося видалити робочий простір',
+ dashboardCouldNotOpen: 'Не вдалося відкрити панель',
+ decksCouldNotLoad: 'Не вдалося завантажити колоди',
+ decksMayBeOutOfDate: 'Колоди можуть бути застарілими',
+ foldersCouldNotLoad: 'Не вдалося завантажити папки',
+ foldersMayBeOutOfDate: 'Папки можуть бути застарілими',
+ workspaceCouldNotLoad: 'Не вдалося завантажити робочий простір',
+ },
+ labels: {
+ dashboard: 'Панель',
+ loadingDashboard: 'Завантаження панелі',
+ newItem: 'Новий елемент',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Дата недоступна',
+ },
+ age: {
+ dayAgo_one: '{{count}} день тому',
+ dayAgo_few: '{{count}} дні тому',
+ dayAgo_many: '{{count}} днів тому',
+ dayAgo_other: '{{count}} дня тому',
+ hourAgo_one: '{{count}} годину тому',
+ hourAgo_few: '{{count}} години тому',
+ hourAgo_many: '{{count}} годин тому',
+ hourAgo_other: '{{count}} години тому',
+ justNow: 'щойно',
+ minuteAgo_one: '{{count}} хвилину тому',
+ minuteAgo_few: '{{count}} хвилини тому',
+ minuteAgo_many: '{{count}} хвилин тому',
+ minuteAgo_other: '{{count}} хвилини тому',
+ unavailable: 'дата недоступна',
+ weekAgo_one: '{{count}} тиждень тому',
+ weekAgo_few: '{{count}} тижні тому',
+ weekAgo_many: '{{count}} тижнів тому',
+ weekAgo_other: '{{count}} тижня тому',
+ },
+ labels: {
+ deleted: 'Видалено {{value}}',
+ due: 'До повторення: {{value}}',
+ reviewed: 'Повторено: {{value}}',
+ updated: 'Оновлено {{value}}',
+ updatedUppercase: 'ОНОВЛЕНО {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} день тому',
+ dayAgo_few: '{{count}} дні тому',
+ dayAgo_many: '{{count}} днів тому',
+ dayAgo_other: '{{count}} дня тому',
+ inAMoment: 'Невдовзі',
+ inDay_one: 'Через {{count}} день',
+ inDay_few: 'Через {{count}} дні',
+ inDay_many: 'Через {{count}} днів',
+ inDay_other: 'Через {{count}} дня',
+ inMonth_one: 'Через {{count}} місяць',
+ inMonth_few: 'Через {{count}} місяці',
+ inMonth_many: 'Через {{count}} місяців',
+ inMonth_other: 'Через {{count}} місяця',
+ inWeek_one: 'Через {{count}} тиждень',
+ inWeek_few: 'Через {{count}} тижні',
+ inWeek_many: 'Через {{count}} тижнів',
+ inWeek_other: 'Через {{count}} тижня',
+ justNow: 'Щойно',
+ monthAgo_one: '{{count}} місяць тому',
+ monthAgo_few: '{{count}} місяці тому',
+ monthAgo_many: '{{count}} місяців тому',
+ monthAgo_other: '{{count}} місяця тому',
+ secondsAgoShort: '{{count}} с тому',
+ minutesAgoShort: '{{count}} хв тому',
+ hoursAgoShort: '{{count}} год тому',
+ today: 'Сьогодні',
+ tomorrow: 'Завтра',
+ weekAgo_one: '{{count}} тиждень тому',
+ weekAgo_few: '{{count}} тижні тому',
+ weekAgo_many: '{{count}} тижнів тому',
+ weekAgo_other: '{{count}} тижня тому',
+ yesterday: 'Вчора',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Дії для {{title}}',
+ createDeck: 'Створити колоду',
+ createNote: 'Створити нотатку',
+ deleteDeck: 'Видалити колоду',
+ editDeck: 'Редагувати колоду',
+ newNote: 'Нова нотатка',
+ openDeck: 'Відкрити колоду {{title}}',
+ saveDeck: 'Не вдалося зберегти колоду',
+ studyNow: 'Вчитися зараз',
+ },
+ descriptions: {
+ emptyDeck: 'Додайте нотатку, щоб у цій колоді був матеріал для повторення.',
+ editorDefault: 'Сфокусована навчальна колода.',
+ editorVisual: 'Виберіть символ обкладинки для цієї колоди.',
+ notesSearchPlaceholder: 'Шукати нотатки…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Це перемістить "{{title}}" до Кошика. Ви зможете відновити її пізніше.',
+ deleteDeckFallbackDescription: 'Це перемістить цю колоду до Кошика. Ви зможете відновити її пізніше.',
+ deleteDeckFallbackTitle: 'Видалити колоду?',
+ deleteDeckTitle: 'Видалити "{{title}}"?',
+ deleteNoteDescription: 'Це перемістить "{{title}}" до Кошика. Ви зможете відновити її пізніше.',
+ deleteNoteFallbackTitle: 'Видалити нотатку?',
+ deleteNoteTitle: 'Видалити "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Немає відповідних нотаток',
+ noMatchingNotesDescription: 'Немає нотаток за запитом "{{query}}".',
+ thisDeckIsEmpty: 'Ця колода порожня',
+ },
+ errors: {
+ couldNotCreateDeck: 'Не вдалося створити колоду',
+ couldNotDeleteDeck: 'Не вдалося видалити колоду',
+ couldNotDeleteNote: 'Не вдалося видалити нотатку',
+ couldNotLoadFolderPath: 'Не вдалося завантажити шлях до папки',
+ couldNotSaveDeck: 'Не вдалося зберегти колоду',
+ deckCouldNotLoad: 'Не вдалося завантажити колоду',
+ notesCouldNotLoad: 'Не вдалося завантажити нотатки',
+ notesMayBeOutOfDate: 'Нотатки можуть бути застарілими',
+ },
+ fields: {
+ descriptionLabel: 'Опис колоди',
+ descriptionPlaceholder: 'Що ця колода допоможе вам повторювати?',
+ namePlaceholder: 'Назва колоди',
+ untitledDeck: 'Колода без назви',
+ untitledDeckLower: 'колода без назви',
+ },
+ labels: {
+ createDeckTitle: 'Створити колоду',
+ deck: 'Колода',
+ deckNotesSearch: 'Пошук нотаток у колоді',
+ deckOverview: 'Огляд колоди',
+ decks: 'Колоди',
+ due: 'Повторити',
+ dueToday: 'До повторення сьогодні',
+ loadingDeck: 'Завантаження колоди',
+ mastery: 'Опанування',
+ notes: 'Нотатки',
+ },
+ sort: {
+ ariaLabel: 'Сортувати колоди',
+ dueToday: 'До повторення сьогодні',
+ title: 'Назва',
+ updated: 'Оновлено',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Дані змінилися. Оновіть і спробуйте ще раз.',
+ forbidden: 'У вас немає дозволу на цю дію.',
+ notFound: 'Не вдалося знайти цей елемент.',
+ offline: 'Не вдається зв’язатися із сервісом.',
+ timeout: 'Це зайняло забагато часу. Спробуйте ще раз.',
+ unauthorized: 'Увійдіть, щоб продовжити.',
+ unavailable: 'Сервіс тимчасово недоступний.',
+ },
+ fallback: {
+ unexpected: 'Неочікувана помилка',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Створити папку',
+ deleteFolder: 'Видалити папку',
+ editFolder: 'Редагувати папку',
+ },
+ descriptions: {
+ editorDefault: 'Папка для пов’язаних колод.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Це перемістить "{{name}}" до Кошика. Ви зможете відновити її пізніше.',
+ deleteFolderFallbackDescription: 'Це перемістить цю папку до Кошика. Ви зможете відновити її пізніше.',
+ deleteFolderFallbackTitle: 'Видалити папку?',
+ deleteFolderTitle: 'Видалити "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'У цій папці немає збігів',
+ noMatchesInFolderDescription: 'Немає папок, колод або нотаток за запитом "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Не вдалося створити папку',
+ couldNotDeleteFolder: 'Не вдалося видалити папку',
+ couldNotLoadFolderPath: 'Не вдалося завантажити шлях до папки',
+ couldNotSaveFolder: 'Не вдалося зберегти папку',
+ folderCouldNotLoad: 'Не вдалося завантажити папку',
+ },
+ fields: {
+ descriptionLabel: 'Опис папки',
+ descriptionPlaceholder: 'Що належить до цієї папки?',
+ namePlaceholder: 'Назва папки',
+ untitledFolder: 'Папка без назви',
+ },
+ labels: {
+ createFolderTitle: 'Створити папку',
+ folder: 'Папка',
+ folders: 'Папки',
+ loadingFolder: 'Завантаження папки',
+ name: 'Назва',
+ updated: 'Оновлено',
+ },
+ sort: {
+ ariaLabel: 'Сортувати папки',
+ name: 'Назва',
+ updated: 'Оновлено',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Якщо локальні й синхронізовані дані відрізнятимуться, елемент з’явиться тут.',
+ heading: 'Статус синхронізації',
+ title: 'Конфлікти',
+ noConflicts: 'Конфліктів не знайдено',
+ },
+ labels: {
+ menu: 'Меню',
+ },
+ sections: {
+ settings: {
+ description: 'Персоналізуйте середовище й уподобання',
+ title: 'Налаштування',
+ },
+ trash: {
+ description: 'Відновлюйте або остаточно видаляйте вилучені елементи',
+ title: 'Кошик',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Закрити редактор',
+ openActions: 'Відкрити дії',
+ openWorkspaces: 'Відкрити робочі простори',
+ },
+ items: {
+ home: 'Головна',
+ menu: 'Меню',
+ primary: 'Основне',
+ settings: 'Налаштування',
+ spaces: 'Простори',
+ trash: 'Кошик',
+ workspaces: 'Робочі простори',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Додати cloze',
+ deleteNote: 'Видалити нотатку',
+ editNote: 'Редагувати нотатку',
+ hideDerivedCardsNote: 'Сховати примітку про похідні картки',
+ openNote: 'Відкрити {{title}}',
+ saveNote: 'Зберегти нотатку',
+ showDerivedCardsNote: 'Показати примітку про похідні картки',
+ },
+ descriptions: {
+ clozeFormat: 'Кожна прихована частина стане карткою для повторення після збереження.',
+ clozeFormatPrefix: 'Оберніть прихований текст у',
+ derivedCardsHelper: 'Нотатки є джерелом істини для похідних карток.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Це перемістить "{{title}}" до Кошика. Ви зможете відновити її пізніше.',
+ deleteNoteFallbackDescription: 'Це перемістить цю нотатку до Кошика. Ви зможете відновити її пізніше.',
+ deleteNoteFallbackTitle: 'Видалити нотатку?',
+ deleteNoteTitle: 'Видалити "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Не вдалося створити нотатку',
+ couldNotDeleteNote: 'Не вдалося видалити нотатку',
+ couldNotSaveNote: 'Не вдалося зберегти нотатку',
+ noteCouldNotLoad: 'Не вдалося завантажити нотатку',
+ },
+ fields: {
+ back: 'Зворот',
+ backPlaceholder: 'Введіть зворотний бік',
+ bodyPlaceholder: 'Напишіть тіло нотатки з cloze-пропусками…',
+ front: 'Лицьовий бік',
+ frontPlaceholder: 'Введіть лицьовий бік',
+ noteBody: 'Тіло нотатки',
+ title: 'Назва',
+ titlePlaceholder: 'Додайте назву нотатки',
+ untitledCloze: 'Cloze без назви',
+ untitledNote: 'Нотатка без назви',
+ },
+ labels: {
+ backUppercase: 'ЗВОРОТ',
+ basic: 'Базова',
+ basicLower: 'базова',
+ basicUppercase: 'БАЗОВА',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Формат cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Колода',
+ derivedCards: 'ПОХІДНІ КАРТКИ',
+ due: 'До повторення',
+ frontUppercase: 'ЛИЦЬОВИЙ БІК',
+ inProgress: 'У процесі',
+ inProgressUppercase: 'У ПРОЦЕСІ',
+ loadingNote: 'Завантаження нотатки',
+ loadingNoteEditor: 'Завантаження редактора нотаток',
+ markdownFormatting: 'Форматування Markdown',
+ mastered: 'Опановано',
+ masteredUppercase: 'ОПАНОВАНО',
+ newNote: 'Нова нотатка',
+ noteBody: 'ТІЛО НОТАТКИ',
+ noteContent: 'Вміст нотатки',
+ noteDetails: 'Деталі нотатки',
+ noteMetadata: 'Метадані нотатки',
+ noteType: 'Тип нотатки',
+ notes: 'Нотатки',
+ reviewed: 'Повторено',
+ studyProgress: 'Прогрес навчання',
+ studyProgressUppercase: 'ПРОГРЕС НАВЧАННЯ',
+ titleUppercase: 'НАЗВА',
+ updated: 'Оновлено',
+ },
+ sort: {
+ ariaLabel: 'Сортувати нотатки',
+ title: 'Назва',
+ updated: 'Оновлено',
+ },
+ toolbar: {
+ bold: 'Жирний',
+ italic: 'Курсив',
+ link: 'Посилання',
+ list: 'Список',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Знову',
+ backToDeck: 'Назад до колоди',
+ continueReview: 'Продовжити повторення',
+ easy: 'Легко',
+ good: 'Добре',
+ hard: 'Важко',
+ newNote: 'Нова нотатка',
+ showAnswer: 'Показати відповідь',
+ },
+ errors: {
+ couldNotGradeCard: 'Не вдалося оцінити картку',
+ reviewCouldNotLoad: 'Не вдалося завантажити повторення',
+ reviewCouldNotStart: 'Не вдалося почати повторення',
+ summaryCouldNotLoad: 'Не вдалося завантажити підсумок повторення',
+ summaryNotAvailable: 'Підсумок повторення недоступний',
+ summaryNotComplete: 'Це повторення ще не завершене.',
+ },
+ labels: {
+ cardsReviewed: 'Повторені картки',
+ deck: 'Колода',
+ duration: 'Тривалість',
+ loadingReview: 'Завантаження повторення',
+ loadingSummary: 'Завантаження підсумку',
+ progress: 'Прогрес повторення',
+ review: 'Повторення',
+ reviewComplete: 'Повторення завершено',
+ reviewed_one: 'Повторено {{count}}',
+ reviewed_few: 'Повторено {{count}}',
+ reviewed_many: 'Повторено {{count}}',
+ reviewed_other: 'Повторено {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} год {{minutes}} хв',
+ durationMinutes: '{{minutes}} хв',
+ durationSeconds: '{{seconds}} с',
+ saved: 'Ваш прогрес збережено в цій колоді.',
+ },
+ unavailable: {
+ description: 'Додайте нотатку, щоб ця колода потрапила до черги повторення.',
+ title: 'Немає карток для повторення',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Очистити пошук',
+ },
+ empty: {
+ noMatchesInWorkspace: 'У цьому робочому просторі немає збігів',
+ noMatchesInWorkspaceDescription: 'Немає папок, колод або нотаток за запитом "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Не вдалося завершити пошук',
+ },
+ labels: {
+ results: 'Результати пошуку',
+ resultsFor: 'Результати для "{{query}}"',
+ searchingContent: 'Пошук вмісту',
+ },
+ resultGroups: {
+ deck: 'Колоди',
+ folder: 'Папки',
+ note: 'Нотатки',
+ },
+ resultKinds: {
+ deck: 'колода',
+ folder: 'папка',
+ note: 'нотатка',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Скинути всі налаштування',
+ resetSettings: 'Скинути налаштування',
+ resetToDefaults: 'Відновити типові',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Вставте коректний JSON з 21 числовим значенням.',
+ fsrsErrorInvalidParams_one: 'Введіть JSON-масив рівно з {{count}} скінченним числом.',
+ fsrsErrorInvalidParams_few: 'Введіть JSON-масив рівно з {{count}} скінченними числами.',
+ fsrsErrorInvalidParams_many: 'Введіть JSON-масив рівно з {{count}} скінченними числами.',
+ fsrsErrorInvalidParams_other: 'Введіть JSON-масив рівно з {{count}} скінченного числа.',
+ fsrsHelper: 'Це експертне перевизначення. Значення мають залишатися в порядку.',
+ fsrsJsonLabel: 'JSON параметрів FSRS',
+ fsrsTitle: 'Редагувати параметри FSRS',
+ fsrsDescription: 'Вставте JSON-масив з 21 числом, щоб перевизначити ваги scheduler.',
+ resetDescription: 'Це відновить часовий пояс, ліміти навчання й налаштування FSRS.',
+ resetDescriptionWithLanguage: 'Це відновить мову, часовий пояс, ліміти навчання й налаштування FSRS.',
+ resetTitle: 'Скинути всі налаштування?',
+ timezoneDescription: 'Шукайте місто або ідентифікатор часового поясу.',
+ timezoneSearchLabel: 'Пошук часових поясів',
+ timezoneSearchPlaceholder: 'Шукати часові пояси…',
+ timezoneTitle: 'Виберіть часовий пояс',
+ },
+ errors: {
+ couldNotResetSettings: 'Не вдалося скинути налаштування',
+ couldNotSaveSettings: 'Не вдалося зберегти налаштування',
+ settingsCouldNotLoad: 'Не вдалося завантажити налаштування',
+ settingsUnavailable: 'Налаштування недоступні.',
+ },
+ labels: {
+ appearance: 'Вигляд',
+ automatic: 'Автоматично',
+ fsrsParameters: 'Параметри FSRS',
+ general: 'Загальні',
+ language: 'Мова',
+ loadingSettings: 'Завантаження налаштувань',
+ masteryHorizon: 'Горизонт опанування',
+ newCardOrder: 'Порядок нових карток',
+ newCardsPerDay: 'Нових карток на день',
+ reviewCardsPerDay: 'Карток для повторення на день',
+ savingSettings: 'Збереження налаштувань',
+ schedule: 'Розклад',
+ searchNoTimezones: 'Немає відповідних часових поясів.',
+ settings: 'Налаштування',
+ settingsReset: 'Налаштування скинуто',
+ study: 'Навчання',
+ targetRecallProbability: 'Цільова ймовірність пригадування',
+ theme: 'Тема',
+ timezone: 'Часовий пояс',
+ },
+ options: {
+ languageEnUs: 'Англійська (США)',
+ newCardsAfterReviews: 'Після повторень',
+ newCardsBeforeReviews: 'Перед повтореннями',
+ newCardsMixed: 'Змішано',
+ themeDark: 'Темна',
+ themeLight: 'Світла',
+ themeSystem: 'Системна',
+ timezoneSystem: 'Використовувати системний часовий пояс',
+ },
+ rows: {
+ fsrsDescription: 'Ваги експертної моделі',
+ languageDescription: 'Мова інтерфейсу',
+ masteryHorizonDescription: 'Скільки днів картка має залишатися пригадуваною на цільовій імовірності або вище, щоб вважатися опанованою',
+ newCardOrderDescription: 'Порядок нових карток відносно повторень',
+ newCardsPerDayDescription: 'Максимум нових карток на день',
+ reviewCardsPerDayDescription: 'Максимум карток для повторення на день',
+ targetRecallProbabilityDescription: 'Мінімальна ймовірність пригадування на наступному запланованому повторенні',
+ timezoneDescription: 'Використовуйте автоматичний часовий пояс або виберіть місто.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Видалити назавжди',
+ empty: 'Очистити',
+ emptyTrash: 'Очистити кошик',
+ restore: 'Відновити',
+ restoringItem: 'Відновлення {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Це назавжди видалить "{{title}}". Дію не можна скасувати.',
+ deleteItemFallbackDescription: 'Це назавжди видалить цей елемент. Дію не можна скасувати.',
+ deleteItemFallbackTitle: 'Видалити елемент?',
+ deleteItemTitle: 'Видалити "{{title}}"?',
+ emptyTrashDescription: 'Це назавжди видалить усе з Кошика. Дію не можна скасувати.',
+ emptyTrashTitle: 'Очистити кошик?',
+ },
+ empty: {
+ description: 'Елементи, які ви видаляєте, з’являтимуться тут перед остаточним видаленням.',
+ title: 'Кошик порожній',
+ },
+ errors: {
+ couldNotDeleteItem: 'Не вдалося видалити елемент',
+ couldNotEmptyTrash: 'Не вдалося очистити Кошик',
+ couldNotRestoreItem: 'Не вдалося відновити елемент',
+ trashCouldNotLoad: 'Не вдалося завантажити Кошик',
+ trashMayBeOutOfDate: 'Кошик може бути застарілим',
+ },
+ labels: {
+ deletedAge: 'Видалено {{value}}',
+ itemCount_one: '{{count}} елемент',
+ itemCount_few: '{{count}} елементи',
+ itemCount_many: '{{count}} елементів',
+ itemCount_other: '{{count}} елемента',
+ lastEmptied: 'Останнє очищення {{value}}',
+ loadingTrash: 'Завантаження Кошика',
+ originalLocation: 'Початкове розташування: {{location}}',
+ title: 'Кошик',
+ trashActions: 'Дії кошика для {{title}}',
+ },
+ kinds: {
+ deck: 'Колода',
+ folder: 'Папка',
+ note: 'Нотатка',
+ workspace: 'Робочий простір',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Створити робочий простір',
+ deleteWorkspace: 'Видалити робочий простір',
+ editWorkspace: 'Редагувати робочий простір',
+ newWorkspace: 'Новий робочий простір',
+ openWorkspace: 'Відкрити {{title}}',
+ openingWorkspace: 'Відкриття {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Навчальний контекст.',
+ editorVisual: 'Виберіть візуальний орієнтир для цього робочого простору.',
+ emptyList: 'Розділяйте колоди, нотатки й черги повторення за навчальним контекстом.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Це перемістить "{{title}}" до Кошика. Ви зможете відновити його пізніше.',
+ deleteWorkspaceFallbackDescription: 'Це перемістить цей робочий простір до Кошика. Ви зможете відновити його пізніше.',
+ deleteWorkspaceFallbackTitle: 'Видалити робочий простір?',
+ deleteWorkspaceTitle: 'Видалити "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Почніть з робочого простору',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Не вдалося створити робочий простір',
+ couldNotDeleteWorkspace: 'Не вдалося видалити робочий простір',
+ couldNotOpenWorkspace: 'Не вдалося відкрити робочий простір',
+ couldNotSaveWorkspace: 'Не вдалося зберегти робочий простір',
+ workspaceCouldNotLoad: 'Не вдалося завантажити робочий простір',
+ workspacesCouldNotLoad: 'Не вдалося завантажити робочі простори',
+ },
+ fields: {
+ descriptionLabel: 'Опис робочого простору',
+ descriptionPlaceholder: 'Що належить до цього робочого простору?',
+ namePlaceholder: 'Назва робочого простору',
+ untitledWorkspace: 'Робочий простір без назви',
+ },
+ labels: {
+ createWorkspaceTitle: 'Створити робочий простір',
+ loadingWorkspaces: 'Завантаження робочих просторів',
+ workspace: 'Робочий простір',
+ workspaces: 'Робочі простори',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/vi.ts b/ui/src/core/i18n/resources/vi.ts
new file mode 100644
index 0000000..a0a7069
--- /dev/null
+++ b/ui/src/core/i18n/resources/vi.ts
@@ -0,0 +1,623 @@
+export const vi = {
+ bootstrap: {
+ error: {
+ fallbackMessage: 'Thử lại. Nếu lỗi vẫn xảy ra, hãy mở lại Clear.',
+ title: 'Không thể khởi động',
+ },
+ loadingTitle: 'Đang chuẩn bị không gian học tập của bạn',
+ },
+ common: {
+ actions: {
+ back: 'Quay lại',
+ cancel: 'Hủy',
+ checkAgain: 'Kiểm tra lại',
+ close: 'Đóng',
+ create: 'Tạo',
+ delete: 'Xóa',
+ dismissError: 'Đóng lỗi',
+ dismissStatus: 'Đóng trạng thái',
+ edit: 'Chỉnh sửa',
+ itemActions: 'Thao tác cho {{title}}',
+ reset: 'Đặt lại',
+ review: 'Ôn tập',
+ save: 'Lưu',
+ saveChanges: 'Lưu thay đổi',
+ tryAgain: 'Thử lại',
+ },
+ labels: {
+ active: 'Đang hoạt động',
+ clear: 'Clear',
+ custom: 'Tùy chỉnh',
+ default: 'Mặc định',
+ loadingEditor: 'Đang tải trình chỉnh sửa',
+ name: 'Tên',
+ completedTask: 'Tác vụ đã hoàn tất',
+ description: 'Mô tả',
+ incompleteTask: 'Tác vụ chưa hoàn tất',
+ percentageInput: 'Phần trăm của {{label}}',
+ visual: 'Hình ảnh',
+ },
+ status: {
+ actionFailed: 'Thao tác thất bại',
+ actionInProgress: 'Đang thực hiện thao tác',
+ },
+ sort: {
+ ascending: 'Tăng',
+ column: 'Cột',
+ descending: 'Giảm',
+ direction: 'Hướng',
+ sort: 'Sắp xếp',
+ },
+ search: {
+ label: 'Tìm kiếm',
+ },
+ visualPicker: {
+ allLucideIcons: 'Tất cả biểu tượng Lucide',
+ browseIconsFor: 'Duyệt hoặc tìm biểu tượng cho {{label}}.',
+ chooseIcon: 'Chọn biểu tượng',
+ iconPicker: 'Bộ chọn biểu tượng cho {{label}}',
+ iconSearch: 'Tìm biểu tượng cho {{label}}',
+ iconsCouldNotLoad: 'Không thể tải biểu tượng.',
+ loadingIcons: 'Đang tải biểu tượng',
+ loadingMoreIcons: 'Đang tải thêm biểu tượng',
+ moreIcons: 'Thêm biểu tượng',
+ noIconsMatch: 'Không có biểu tượng nào khớp với "{{query}}".',
+ searchIconsPlaceholder: 'Tìm biểu tượng…',
+ selectedIcon: 'Đã chọn {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: 'Tạo',
+ newDeck: 'Bộ thẻ mới',
+ newFolder: 'Thư mục mới',
+ },
+ descriptions: {
+ defaultWorkspace: 'Giữ bộ thẻ, thư mục và ghi chú cùng nhau.',
+ emptyWorkspace: 'Tạo một bộ thẻ, rồi thêm ghi chú để xây dựng hàng đợi ôn tập.',
+ emptyFolder: 'Tạo một bộ thẻ, rồi thêm ghi chú để xây dựng hàng đợi ôn tập.',
+ searchPlaceholder: 'Tìm thư mục, bộ thẻ và ghi chú…',
+ },
+ empty: {
+ createFirstDeck: 'Tạo bộ thẻ đầu tiên',
+ },
+ errors: {
+ couldNotDeleteDeck: 'Không thể xóa bộ thẻ',
+ couldNotDeleteFolder: 'Không thể xóa thư mục',
+ couldNotDeleteWorkspace: 'Không thể xóa không gian làm việc',
+ dashboardCouldNotOpen: 'Không thể mở bảng điều khiển',
+ decksCouldNotLoad: 'Không thể tải bộ thẻ',
+ decksMayBeOutOfDate: 'Bộ thẻ có thể đã lỗi thời',
+ foldersCouldNotLoad: 'Không thể tải thư mục',
+ foldersMayBeOutOfDate: 'Thư mục có thể đã lỗi thời',
+ workspaceCouldNotLoad: 'Không thể tải không gian làm việc',
+ },
+ labels: {
+ dashboard: 'Bảng điều khiển',
+ loadingDashboard: 'Đang tải bảng điều khiển',
+ newItem: 'Mục mới',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: 'Ngày không khả dụng',
+ },
+ age: {
+ dayAgo_one: '{{count}} ngày trước',
+ dayAgo_other: '{{count}} ngày trước',
+ hourAgo_one: '{{count}} giờ trước',
+ hourAgo_other: '{{count}} giờ trước',
+ justNow: 'vừa xong',
+ minuteAgo_one: '{{count}} phút trước',
+ minuteAgo_other: '{{count}} phút trước',
+ unavailable: 'ngày không khả dụng',
+ weekAgo_one: '{{count}} tuần trước',
+ weekAgo_other: '{{count}} tuần trước',
+ },
+ labels: {
+ deleted: 'Đã xóa {{value}}',
+ due: 'Đến hạn: {{value}}',
+ reviewed: 'Đã ôn tập: {{value}}',
+ updated: 'Đã cập nhật {{value}}',
+ updatedUppercase: 'ĐÃ CẬP NHẬT {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} ngày trước',
+ dayAgo_other: '{{count}} ngày trước',
+ inAMoment: 'Trong giây lát',
+ inDay_one: 'Trong {{count}} ngày',
+ inDay_other: 'Trong {{count}} ngày',
+ inMonth_one: 'Trong {{count}} tháng',
+ inMonth_other: 'Trong {{count}} tháng',
+ inWeek_one: 'Trong {{count}} tuần',
+ inWeek_other: 'Trong {{count}} tuần',
+ justNow: 'Vừa xong',
+ monthAgo_one: '{{count}} tháng trước',
+ monthAgo_other: '{{count}} tháng trước',
+ secondsAgoShort: '{{count}} giây trước',
+ minutesAgoShort: '{{count}} phút trước',
+ hoursAgoShort: '{{count}} giờ trước',
+ today: 'Hôm nay',
+ tomorrow: 'Ngày mai',
+ weekAgo_one: '{{count}} tuần trước',
+ weekAgo_other: '{{count}} tuần trước',
+ yesterday: 'Hôm qua',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: 'Thao tác cho {{title}}',
+ createDeck: 'Tạo bộ thẻ',
+ createNote: 'Tạo ghi chú',
+ deleteDeck: 'Xóa bộ thẻ',
+ editDeck: 'Chỉnh sửa bộ thẻ',
+ newNote: 'Ghi chú mới',
+ openDeck: 'Mở bộ thẻ {{title}}',
+ saveDeck: 'Không thể lưu bộ thẻ',
+ studyNow: 'Học ngay',
+ },
+ descriptions: {
+ emptyDeck: 'Thêm ghi chú để bộ thẻ này có nội dung ôn tập.',
+ editorDefault: 'Bộ thẻ học tập tập trung.',
+ editorVisual: 'Chọn một glyph bìa cho bộ thẻ này.',
+ notesSearchPlaceholder: 'Tìm ghi chú…',
+ },
+ dialogs: {
+ deleteDeckDescription: 'Thao tác này chuyển "{{title}}" vào Thùng rác. Bạn có thể khôi phục sau.',
+ deleteDeckFallbackDescription: 'Thao tác này chuyển bộ thẻ này vào Thùng rác. Bạn có thể khôi phục sau.',
+ deleteDeckFallbackTitle: 'Xóa bộ thẻ?',
+ deleteDeckTitle: 'Xóa "{{title}}"?',
+ deleteNoteDescription: 'Thao tác này chuyển "{{title}}" vào Thùng rác. Bạn có thể khôi phục sau.',
+ deleteNoteFallbackTitle: 'Xóa ghi chú?',
+ deleteNoteTitle: 'Xóa "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: 'Không có ghi chú phù hợp',
+ noMatchingNotesDescription: 'Không có ghi chú nào khớp với "{{query}}".',
+ thisDeckIsEmpty: 'Bộ thẻ này đang trống',
+ },
+ errors: {
+ couldNotCreateDeck: 'Không thể tạo bộ thẻ',
+ couldNotDeleteDeck: 'Không thể xóa bộ thẻ',
+ couldNotDeleteNote: 'Không thể xóa ghi chú',
+ couldNotLoadFolderPath: 'Không thể tải đường dẫn thư mục',
+ couldNotSaveDeck: 'Không thể lưu bộ thẻ',
+ deckCouldNotLoad: 'Không thể tải bộ thẻ',
+ notesCouldNotLoad: 'Không thể tải ghi chú',
+ notesMayBeOutOfDate: 'Ghi chú có thể đã lỗi thời',
+ },
+ fields: {
+ descriptionLabel: 'Mô tả bộ thẻ',
+ descriptionPlaceholder: 'Bộ thẻ này giúp bạn ôn tập điều gì?',
+ namePlaceholder: 'Tên bộ thẻ',
+ untitledDeck: 'Bộ thẻ chưa đặt tên',
+ untitledDeckLower: 'bộ thẻ chưa đặt tên',
+ },
+ labels: {
+ createDeckTitle: 'Tạo bộ thẻ',
+ deck: 'Bộ thẻ',
+ deckNotesSearch: 'Tìm ghi chú trong bộ thẻ',
+ deckOverview: 'Tổng quan bộ thẻ',
+ decks: 'Bộ thẻ',
+ due: 'Đến hạn',
+ dueToday: 'Đến hạn hôm nay',
+ loadingDeck: 'Đang tải bộ thẻ',
+ mastery: 'Mức thành thạo',
+ notes: 'Ghi chú',
+ },
+ sort: {
+ ariaLabel: 'Sắp xếp bộ thẻ',
+ dueToday: 'Đến hạn hôm nay',
+ title: 'Tiêu đề',
+ updated: 'Đã cập nhật',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: 'Dữ liệu đã thay đổi. Làm mới rồi thử lại.',
+ forbidden: 'Bạn không có quyền thực hiện việc này.',
+ notFound: 'Chúng tôi không tìm thấy mục này.',
+ offline: 'Không thể kết nối tới dịch vụ.',
+ timeout: 'Thao tác này mất quá lâu. Hãy thử lại.',
+ unauthorized: 'Đăng nhập để tiếp tục.',
+ unavailable: 'Dịch vụ tạm thời không khả dụng.',
+ },
+ fallback: {
+ unexpected: 'Lỗi không mong muốn',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: 'Tạo thư mục',
+ deleteFolder: 'Xóa thư mục',
+ editFolder: 'Chỉnh sửa thư mục',
+ },
+ descriptions: {
+ editorDefault: 'Thư mục cho các bộ thẻ liên quan.',
+ },
+ dialogs: {
+ deleteFolderDescription: 'Thao tác này chuyển "{{name}}" vào Thùng rác. Bạn có thể khôi phục sau.',
+ deleteFolderFallbackDescription: 'Thao tác này chuyển thư mục này vào Thùng rác. Bạn có thể khôi phục sau.',
+ deleteFolderFallbackTitle: 'Xóa thư mục?',
+ deleteFolderTitle: 'Xóa "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: 'Không có kết quả trong thư mục này',
+ noMatchesInFolderDescription: 'Không có thư mục, bộ thẻ hoặc ghi chú nào khớp với "{{query}}".',
+ },
+ errors: {
+ couldNotCreateFolder: 'Không thể tạo thư mục',
+ couldNotDeleteFolder: 'Không thể xóa thư mục',
+ couldNotLoadFolderPath: 'Không thể tải đường dẫn thư mục',
+ couldNotSaveFolder: 'Không thể lưu thư mục',
+ folderCouldNotLoad: 'Không thể tải thư mục',
+ },
+ fields: {
+ descriptionLabel: 'Mô tả thư mục',
+ descriptionPlaceholder: 'Những gì thuộc về thư mục này?',
+ namePlaceholder: 'Tên thư mục',
+ untitledFolder: 'Thư mục chưa đặt tên',
+ },
+ labels: {
+ createFolderTitle: 'Tạo thư mục',
+ folder: 'Thư mục',
+ folders: 'Thư mục',
+ loadingFolder: 'Đang tải thư mục',
+ name: 'Tên',
+ updated: 'Đã cập nhật',
+ },
+ sort: {
+ ariaLabel: 'Sắp xếp thư mục',
+ name: 'Tên',
+ updated: 'Đã cập nhật',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: 'Nếu dữ liệu cục bộ và dữ liệu đã đồng bộ khác nhau, mục đó sẽ xuất hiện ở đây.',
+ heading: 'Trạng thái đồng bộ',
+ title: 'Xung đột',
+ noConflicts: 'Không tìm thấy xung đột',
+ },
+ labels: {
+ menu: 'Menu',
+ },
+ sections: {
+ settings: {
+ description: 'Cá nhân hóa môi trường và tùy chọn của bạn',
+ title: 'Cài đặt',
+ },
+ trash: {
+ description: 'Khôi phục hoặc xóa vĩnh viễn các mục đã xóa',
+ title: 'Thùng rác',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: 'Đóng trình chỉnh sửa',
+ openActions: 'Mở thao tác',
+ openWorkspaces: 'Mở không gian làm việc',
+ },
+ items: {
+ home: 'Trang chủ',
+ menu: 'Menu',
+ primary: 'Chính',
+ settings: 'Cài đặt',
+ spaces: 'Không gian',
+ trash: 'Thùng rác',
+ workspaces: 'Không gian làm việc',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: 'Thêm cloze',
+ deleteNote: 'Xóa ghi chú',
+ editNote: 'Chỉnh sửa ghi chú',
+ hideDerivedCardsNote: 'Ẩn ghi chú về thẻ phát sinh',
+ openNote: 'Mở {{title}}',
+ saveNote: 'Lưu ghi chú',
+ showDerivedCardsNote: 'Hiện ghi chú về thẻ phát sinh',
+ },
+ descriptions: {
+ clozeFormat: 'Mỗi phần bị ẩn sẽ trở thành thẻ ôn tập khi bạn lưu.',
+ clozeFormatPrefix: 'Bọc văn bản bị ẩn bằng',
+ derivedCardsHelper: 'Ghi chú là nguồn sự thật cho các thẻ phát sinh.',
+ },
+ dialogs: {
+ deleteNoteDescription: 'Thao tác này chuyển "{{title}}" vào Thùng rác. Bạn có thể khôi phục sau.',
+ deleteNoteFallbackDescription: 'Thao tác này chuyển ghi chú này vào Thùng rác. Bạn có thể khôi phục sau.',
+ deleteNoteFallbackTitle: 'Xóa ghi chú?',
+ deleteNoteTitle: 'Xóa "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: 'Không thể tạo ghi chú',
+ couldNotDeleteNote: 'Không thể xóa ghi chú',
+ couldNotSaveNote: 'Không thể lưu ghi chú',
+ noteCouldNotLoad: 'Không thể tải ghi chú',
+ },
+ fields: {
+ back: 'Mặt sau',
+ backPlaceholder: 'Nhập mặt sau',
+ bodyPlaceholder: 'Viết nội dung ghi chú với cloze deletion…',
+ front: 'Mặt trước',
+ frontPlaceholder: 'Nhập mặt trước',
+ noteBody: 'Nội dung ghi chú',
+ title: 'Tiêu đề',
+ titlePlaceholder: 'Thêm tiêu đề ghi chú',
+ untitledCloze: 'Cloze chưa đặt tên',
+ untitledNote: 'Ghi chú chưa đặt tên',
+ },
+ labels: {
+ backUppercase: 'MẶT SAU',
+ basic: 'Cơ bản',
+ basicLower: 'cơ bản',
+ basicUppercase: 'CƠ BẢN',
+ cloze: 'Cloze',
+ clozeLower: 'cloze',
+ clozeFormat: 'Định dạng cloze',
+ clozeUppercase: 'CLOZE',
+ deck: 'Bộ thẻ',
+ derivedCards: 'THẺ PHÁT SINH',
+ due: 'Đến hạn',
+ frontUppercase: 'MẶT TRƯỚC',
+ inProgress: 'Đang tiến hành',
+ inProgressUppercase: 'ĐANG TIẾN HÀNH',
+ loadingNote: 'Đang tải ghi chú',
+ loadingNoteEditor: 'Đang tải trình chỉnh sửa ghi chú',
+ markdownFormatting: 'Định dạng Markdown',
+ mastered: 'Đã thành thạo',
+ masteredUppercase: 'ĐÃ THÀNH THẠO',
+ newNote: 'Ghi chú mới',
+ noteBody: 'NỘI DUNG GHI CHÚ',
+ noteContent: 'Nội dung ghi chú',
+ noteDetails: 'Chi tiết ghi chú',
+ noteMetadata: 'Siêu dữ liệu ghi chú',
+ noteType: 'Loại ghi chú',
+ notes: 'Ghi chú',
+ reviewed: 'Đã ôn tập',
+ studyProgress: 'Tiến độ học tập',
+ studyProgressUppercase: 'TIẾN ĐỘ HỌC TẬP',
+ titleUppercase: 'TIÊU ĐỀ',
+ updated: 'Đã cập nhật',
+ },
+ sort: {
+ ariaLabel: 'Sắp xếp ghi chú',
+ title: 'Tiêu đề',
+ updated: 'Đã cập nhật',
+ },
+ toolbar: {
+ bold: 'Đậm',
+ italic: 'Nghiêng',
+ link: 'Liên kết',
+ list: 'Danh sách',
+ },
+ },
+ review: {
+ actions: {
+ again: 'Lại',
+ backToDeck: 'Quay lại bộ thẻ',
+ continueReview: 'Tiếp tục ôn tập',
+ easy: 'Dễ',
+ good: 'Tốt',
+ hard: 'Khó',
+ newNote: 'Ghi chú mới',
+ showAnswer: 'Hiện đáp án',
+ },
+ errors: {
+ couldNotGradeCard: 'Không thể chấm thẻ',
+ reviewCouldNotLoad: 'Không thể tải phiên ôn tập',
+ reviewCouldNotStart: 'Không thể bắt đầu phiên ôn tập',
+ summaryCouldNotLoad: 'Không thể tải tóm tắt ôn tập',
+ summaryNotAvailable: 'Tóm tắt ôn tập không khả dụng',
+ summaryNotComplete: 'Phiên ôn tập này chưa hoàn tất.',
+ },
+ labels: {
+ cardsReviewed: 'Thẻ đã ôn tập',
+ deck: 'Bộ thẻ',
+ duration: 'Thời lượng',
+ loadingReview: 'Đang tải phiên ôn tập',
+ loadingSummary: 'Đang tải tóm tắt',
+ progress: 'Tiến độ ôn tập',
+ review: 'Ôn tập',
+ reviewComplete: 'Ôn tập hoàn tất',
+ reviewed_one: 'Đã ôn tập {{count}}',
+ reviewed_other: 'Đã ôn tập {{count}}',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} giờ {{minutes}} phút',
+ durationMinutes: '{{minutes}} phút',
+ durationSeconds: '{{seconds}} giây',
+ saved: 'Tiến độ của bạn đã được lưu vào bộ thẻ này.',
+ },
+ unavailable: {
+ description: 'Thêm ghi chú để bộ thẻ này có thể vào hàng đợi ôn tập.',
+ title: 'Không có thẻ để ôn tập',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: 'Xóa tìm kiếm',
+ },
+ empty: {
+ noMatchesInWorkspace: 'Không có kết quả trong không gian làm việc này',
+ noMatchesInWorkspaceDescription: 'Không có thư mục, bộ thẻ hoặc ghi chú nào khớp với "{{query}}".',
+ },
+ errors: {
+ couldNotComplete: 'Không thể hoàn tất tìm kiếm',
+ },
+ labels: {
+ results: 'Kết quả tìm kiếm',
+ resultsFor: 'Kết quả cho "{{query}}"',
+ searchingContent: 'Đang tìm nội dung',
+ },
+ resultGroups: {
+ deck: 'Bộ thẻ',
+ folder: 'Thư mục',
+ note: 'Ghi chú',
+ },
+ resultKinds: {
+ deck: 'bộ thẻ',
+ folder: 'thư mục',
+ note: 'ghi chú',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: 'Đặt lại tất cả cài đặt',
+ resetSettings: 'Đặt lại cài đặt',
+ resetToDefaults: 'Khôi phục mặc định',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: 'Dán JSON hợp lệ với 21 giá trị số.',
+ fsrsErrorInvalidParams_one: 'Nhập một mảng JSON có đúng {{count}} số hữu hạn.',
+ fsrsErrorInvalidParams_other: 'Nhập một mảng JSON có đúng {{count}} số hữu hạn.',
+ fsrsHelper: 'Đây là ghi đè nâng cao. Các giá trị phải giữ đúng thứ tự.',
+ fsrsJsonLabel: 'JSON tham số FSRS',
+ fsrsTitle: 'Chỉnh sửa tham số FSRS',
+ fsrsDescription: 'Dán một mảng JSON gồm 21 số để ghi đè trọng số của scheduler.',
+ resetDescription: 'Thao tác này khôi phục múi giờ, giới hạn học tập và cài đặt FSRS.',
+ resetDescriptionWithLanguage: 'Thao tác này khôi phục ngôn ngữ, múi giờ, giới hạn học tập và cài đặt FSRS.',
+ resetTitle: 'Đặt lại tất cả cài đặt?',
+ timezoneDescription: 'Tìm kiếm thành phố hoặc mã định danh múi giờ.',
+ timezoneSearchLabel: 'Tìm múi giờ',
+ timezoneSearchPlaceholder: 'Tìm múi giờ…',
+ timezoneTitle: 'Chọn múi giờ',
+ },
+ errors: {
+ couldNotResetSettings: 'Không thể đặt lại cài đặt',
+ couldNotSaveSettings: 'Không thể lưu cài đặt',
+ settingsCouldNotLoad: 'Không thể tải cài đặt',
+ settingsUnavailable: 'Cài đặt không khả dụng.',
+ },
+ labels: {
+ appearance: 'Giao diện',
+ automatic: 'Tự động',
+ fsrsParameters: 'Tham số FSRS',
+ general: 'Chung',
+ language: 'Ngôn ngữ',
+ loadingSettings: 'Đang tải cài đặt',
+ masteryHorizon: 'Ngưỡng thành thạo',
+ newCardOrder: 'Thứ tự thẻ mới',
+ newCardsPerDay: 'Thẻ mới mỗi ngày',
+ reviewCardsPerDay: 'Thẻ ôn tập mỗi ngày',
+ savingSettings: 'Đang lưu cài đặt',
+ schedule: 'Lịch',
+ searchNoTimezones: 'Không có múi giờ phù hợp.',
+ settings: 'Cài đặt',
+ settingsReset: 'Đã đặt lại cài đặt',
+ study: 'Học tập',
+ targetRecallProbability: 'Xác suất nhớ mục tiêu',
+ theme: 'Chủ đề',
+ timezone: 'Múi giờ',
+ },
+ options: {
+ languageEnUs: 'Tiếng Anh (Mỹ)',
+ newCardsAfterReviews: 'Sau ôn tập',
+ newCardsBeforeReviews: 'Trước ôn tập',
+ newCardsMixed: 'Trộn',
+ themeDark: 'Tối',
+ themeLight: 'Sáng',
+ themeSystem: 'Hệ thống',
+ timezoneSystem: 'Dùng múi giờ hệ thống',
+ },
+ rows: {
+ fsrsDescription: 'Trọng số mô hình nâng cao',
+ languageDescription: 'Ngôn ngữ giao diện',
+ masteryHorizonDescription: 'Số ngày một thẻ phải duy trì khả năng nhớ ở mức xác suất mục tiêu hoặc cao hơn để được tính là đã thành thạo',
+ newCardOrderDescription: 'Thứ tự thẻ mới so với thẻ ôn tập',
+ newCardsPerDayDescription: 'Số thẻ mới tối đa mỗi ngày',
+ reviewCardsPerDayDescription: 'Số thẻ ôn tập tối đa mỗi ngày',
+ targetRecallProbabilityDescription: 'Xác suất nhớ tối thiểu ở lần ôn tập đã lên lịch tiếp theo',
+ timezoneDescription: 'Dùng múi giờ tự động hoặc chọn một thành phố.',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: 'Xóa vĩnh viễn',
+ empty: 'Dọn sạch',
+ emptyTrash: 'Dọn Thùng rác',
+ restore: 'Khôi phục',
+ restoringItem: 'Đang khôi phục {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: 'Thao tác này xóa vĩnh viễn "{{title}}". Không thể hoàn tác.',
+ deleteItemFallbackDescription: 'Thao tác này xóa vĩnh viễn mục này. Không thể hoàn tác.',
+ deleteItemFallbackTitle: 'Xóa mục?',
+ deleteItemTitle: 'Xóa "{{title}}"?',
+ emptyTrashDescription: 'Thao tác này xóa vĩnh viễn mọi thứ trong Thùng rác. Không thể hoàn tác.',
+ emptyTrashTitle: 'Dọn Thùng rác?',
+ },
+ empty: {
+ description: 'Các mục bạn xóa sẽ xuất hiện ở đây trước khi bị xóa vĩnh viễn.',
+ title: 'Thùng rác đang trống',
+ },
+ errors: {
+ couldNotDeleteItem: 'Không thể xóa mục',
+ couldNotEmptyTrash: 'Không thể dọn Thùng rác',
+ couldNotRestoreItem: 'Không thể khôi phục mục',
+ trashCouldNotLoad: 'Không thể tải Thùng rác',
+ trashMayBeOutOfDate: 'Thùng rác có thể đã lỗi thời',
+ },
+ labels: {
+ deletedAge: 'Đã xóa {{value}}',
+ itemCount_one: '{{count}} mục',
+ itemCount_other: '{{count}} mục',
+ lastEmptied: 'Dọn lần cuối {{value}}',
+ loadingTrash: 'Đang tải Thùng rác',
+ originalLocation: 'Vị trí ban đầu: {{location}}',
+ title: 'Thùng rác',
+ trashActions: 'Thao tác Thùng rác cho {{title}}',
+ },
+ kinds: {
+ deck: 'Bộ thẻ',
+ folder: 'Thư mục',
+ note: 'Ghi chú',
+ workspace: 'Không gian làm việc',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: 'Tạo không gian làm việc',
+ deleteWorkspace: 'Xóa không gian làm việc',
+ editWorkspace: 'Chỉnh sửa không gian làm việc',
+ newWorkspace: 'Không gian làm việc mới',
+ openWorkspace: 'Mở {{title}}',
+ openingWorkspace: 'Đang mở {{title}}',
+ },
+ descriptions: {
+ editorDefault: 'Ngữ cảnh học tập.',
+ editorVisual: 'Chọn điểm neo hình ảnh cho không gian làm việc này.',
+ emptyList: 'Tách bộ thẻ, ghi chú và hàng đợi ôn tập theo ngữ cảnh học tập.',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: 'Thao tác này chuyển "{{title}}" vào Thùng rác. Bạn có thể khôi phục sau.',
+ deleteWorkspaceFallbackDescription: 'Thao tác này chuyển không gian làm việc này vào Thùng rác. Bạn có thể khôi phục sau.',
+ deleteWorkspaceFallbackTitle: 'Xóa không gian làm việc?',
+ deleteWorkspaceTitle: 'Xóa "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: 'Bắt đầu với một không gian làm việc',
+ },
+ errors: {
+ couldNotCreateWorkspace: 'Không thể tạo không gian làm việc',
+ couldNotDeleteWorkspace: 'Không thể xóa không gian làm việc',
+ couldNotOpenWorkspace: 'Không thể mở không gian làm việc',
+ couldNotSaveWorkspace: 'Không thể lưu không gian làm việc',
+ workspaceCouldNotLoad: 'Không thể tải không gian làm việc',
+ workspacesCouldNotLoad: 'Không thể tải không gian làm việc',
+ },
+ fields: {
+ descriptionLabel: 'Mô tả không gian làm việc',
+ descriptionPlaceholder: 'Những gì thuộc về không gian làm việc này?',
+ namePlaceholder: 'Tên không gian làm việc',
+ untitledWorkspace: 'Không gian làm việc chưa đặt tên',
+ },
+ labels: {
+ createWorkspaceTitle: 'Tạo không gian làm việc',
+ loadingWorkspaces: 'Đang tải không gian làm việc',
+ workspace: 'Không gian làm việc',
+ workspaces: 'Không gian làm việc',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/zh-Hans.ts b/ui/src/core/i18n/resources/zh-Hans.ts
new file mode 100644
index 0000000..002ad43
--- /dev/null
+++ b/ui/src/core/i18n/resources/zh-Hans.ts
@@ -0,0 +1,623 @@
+export const zhHans = {
+ bootstrap: {
+ error: {
+ fallbackMessage: '请重试。如果问题仍然存在,请重新打开 Clear。',
+ title: '无法启动',
+ },
+ loadingTitle: '正在准备你的学习空间',
+ },
+ common: {
+ actions: {
+ back: '返回',
+ cancel: '取消',
+ checkAgain: '再次检查',
+ close: '关闭',
+ create: '创建',
+ delete: '删除',
+ dismissError: '关闭错误',
+ dismissStatus: '关闭状态',
+ edit: '编辑',
+ itemActions: '{{title}} 操作',
+ reset: '重置',
+ review: '复习',
+ save: '保存',
+ saveChanges: '保存更改',
+ tryAgain: '重试',
+ },
+ labels: {
+ active: '启用',
+ clear: 'Clear',
+ custom: '自定义',
+ default: '默认',
+ loadingEditor: '正在加载编辑器',
+ name: '名称',
+ completedTask: '已完成任务',
+ description: '描述',
+ incompleteTask: '未完成任务',
+ percentageInput: '{{label}} 百分比',
+ visual: '视觉',
+ },
+ status: {
+ actionFailed: '操作失败',
+ actionInProgress: '操作进行中',
+ },
+ sort: {
+ ascending: '升序',
+ column: '列',
+ descending: '降序',
+ direction: '方向',
+ sort: '排序',
+ },
+ search: {
+ label: '搜索',
+ },
+ visualPicker: {
+ allLucideIcons: '所有 Lucide 图标',
+ browseIconsFor: '浏览或搜索 {{label}} 的图标。',
+ chooseIcon: '选择图标',
+ iconPicker: '{{label}} 图标选择器',
+ iconSearch: '{{label}} 图标搜索',
+ iconsCouldNotLoad: '无法加载图标。',
+ loadingIcons: '正在加载图标',
+ loadingMoreIcons: '正在加载更多图标',
+ moreIcons: '更多图标',
+ noIconsMatch: '没有图标匹配 "{{query}}"。',
+ searchIconsPlaceholder: '搜索图标…',
+ selectedIcon: '已选择 {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: '创建',
+ newDeck: '新建牌组',
+ newFolder: '新建文件夹',
+ },
+ descriptions: {
+ defaultWorkspace: '将牌组、文件夹和笔记放在一起。',
+ emptyWorkspace: '创建一个牌组,然后添加笔记来建立复习队列。',
+ emptyFolder: '创建一个牌组,然后添加笔记来建立复习队列。',
+ searchPlaceholder: '搜索文件夹、牌组和笔记…',
+ },
+ empty: {
+ createFirstDeck: '创建你的第一个牌组',
+ },
+ errors: {
+ couldNotDeleteDeck: '无法删除牌组',
+ couldNotDeleteFolder: '无法删除文件夹',
+ couldNotDeleteWorkspace: '无法删除工作区',
+ dashboardCouldNotOpen: '无法打开仪表板',
+ decksCouldNotLoad: '无法加载牌组',
+ decksMayBeOutOfDate: '牌组可能已过期',
+ foldersCouldNotLoad: '无法加载文件夹',
+ foldersMayBeOutOfDate: '文件夹可能已过期',
+ workspaceCouldNotLoad: '无法加载工作区',
+ },
+ labels: {
+ dashboard: '仪表板',
+ loadingDashboard: '正在加载仪表板',
+ newItem: '新项目',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: '日期不可用',
+ },
+ age: {
+ dayAgo_one: '{{count}} 天前',
+ dayAgo_other: '{{count}} 天前',
+ hourAgo_one: '{{count}} 小时前',
+ hourAgo_other: '{{count}} 小时前',
+ justNow: '刚刚',
+ minuteAgo_one: '{{count}} 分钟前',
+ minuteAgo_other: '{{count}} 分钟前',
+ unavailable: '日期不可用',
+ weekAgo_one: '{{count}} 周前',
+ weekAgo_other: '{{count}} 周前',
+ },
+ labels: {
+ deleted: '已删除 {{value}}',
+ due: '到期:{{value}}',
+ reviewed: '已复习:{{value}}',
+ updated: '已更新 {{value}}',
+ updatedUppercase: '已更新 {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} 天前',
+ dayAgo_other: '{{count}} 天前',
+ inAMoment: '马上',
+ inDay_one: '{{count}} 天后',
+ inDay_other: '{{count}} 天后',
+ inMonth_one: '{{count}} 个月后',
+ inMonth_other: '{{count}} 个月后',
+ inWeek_one: '{{count}} 周后',
+ inWeek_other: '{{count}} 周后',
+ justNow: '刚刚',
+ monthAgo_one: '{{count}} 个月前',
+ monthAgo_other: '{{count}} 个月前',
+ secondsAgoShort: '{{count}} 秒前',
+ minutesAgoShort: '{{count}} 分钟前',
+ hoursAgoShort: '{{count}} 小时前',
+ today: '今天',
+ tomorrow: '明天',
+ weekAgo_one: '{{count}} 周前',
+ weekAgo_other: '{{count}} 周前',
+ yesterday: '昨天',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: '{{title}} 操作',
+ createDeck: '创建牌组',
+ createNote: '创建笔记',
+ deleteDeck: '删除牌组',
+ editDeck: '编辑牌组',
+ newNote: '新建笔记',
+ openDeck: '打开 {{title}} 牌组',
+ saveDeck: '无法保存牌组',
+ studyNow: '立即学习',
+ },
+ descriptions: {
+ emptyDeck: '添加一条笔记,让这个牌组有可复习的内容。',
+ editorDefault: '专注学习牌组。',
+ editorVisual: '为这个牌组选择封面符号。',
+ notesSearchPlaceholder: '搜索笔记…',
+ },
+ dialogs: {
+ deleteDeckDescription: '这会将 "{{title}}" 移至回收站。你稍后可以恢复它。',
+ deleteDeckFallbackDescription: '这会将此牌组移至回收站。你稍后可以恢复它。',
+ deleteDeckFallbackTitle: '删除牌组?',
+ deleteDeckTitle: '删除 "{{title}}"?',
+ deleteNoteDescription: '这会将 "{{title}}" 移至回收站。你稍后可以恢复它。',
+ deleteNoteFallbackTitle: '删除笔记?',
+ deleteNoteTitle: '删除 "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: '没有匹配的笔记',
+ noMatchingNotesDescription: '没有笔记匹配 "{{query}}"。',
+ thisDeckIsEmpty: '这个牌组是空的',
+ },
+ errors: {
+ couldNotCreateDeck: '无法创建牌组',
+ couldNotDeleteDeck: '无法删除牌组',
+ couldNotDeleteNote: '无法删除笔记',
+ couldNotLoadFolderPath: '无法加载文件夹路径',
+ couldNotSaveDeck: '无法保存牌组',
+ deckCouldNotLoad: '无法加载牌组',
+ notesCouldNotLoad: '无法加载笔记',
+ notesMayBeOutOfDate: '笔记可能已过期',
+ },
+ fields: {
+ descriptionLabel: '牌组描述',
+ descriptionPlaceholder: '这个牌组会帮助你复习什么?',
+ namePlaceholder: '牌组名称',
+ untitledDeck: '未命名牌组',
+ untitledDeckLower: '未命名牌组',
+ },
+ labels: {
+ createDeckTitle: '创建牌组',
+ deck: '牌组',
+ deckNotesSearch: '牌组笔记搜索',
+ deckOverview: '牌组概览',
+ decks: '牌组',
+ due: '到期',
+ dueToday: '今日到期',
+ loadingDeck: '正在加载牌组',
+ mastery: '掌握度',
+ notes: '笔记',
+ },
+ sort: {
+ ariaLabel: '排序牌组',
+ dueToday: '今日到期',
+ title: '标题',
+ updated: '更新时间',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: '数据已更改。请刷新后重试。',
+ forbidden: '你没有权限执行此操作。',
+ notFound: '找不到此项目。',
+ offline: '无法连接到服务。',
+ timeout: '耗时过长。请重试。',
+ unauthorized: '请登录以继续。',
+ unavailable: '服务暂时不可用。',
+ },
+ fallback: {
+ unexpected: '意外错误',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: '创建文件夹',
+ deleteFolder: '删除文件夹',
+ editFolder: '编辑文件夹',
+ },
+ descriptions: {
+ editorDefault: '用于相关牌组的文件夹。',
+ },
+ dialogs: {
+ deleteFolderDescription: '这会将 "{{name}}" 移至回收站。你稍后可以恢复它。',
+ deleteFolderFallbackDescription: '这会将此文件夹移至回收站。你稍后可以恢复它。',
+ deleteFolderFallbackTitle: '删除文件夹?',
+ deleteFolderTitle: '删除 "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: '此文件夹中没有匹配项',
+ noMatchesInFolderDescription: '没有文件夹、牌组或笔记匹配 "{{query}}"。',
+ },
+ errors: {
+ couldNotCreateFolder: '无法创建文件夹',
+ couldNotDeleteFolder: '无法删除文件夹',
+ couldNotLoadFolderPath: '无法加载文件夹路径',
+ couldNotSaveFolder: '无法保存文件夹',
+ folderCouldNotLoad: '无法加载文件夹',
+ },
+ fields: {
+ descriptionLabel: '文件夹描述',
+ descriptionPlaceholder: '这个文件夹里放什么?',
+ namePlaceholder: '文件夹名称',
+ untitledFolder: '未命名文件夹',
+ },
+ labels: {
+ createFolderTitle: '创建文件夹',
+ folder: '文件夹',
+ folders: '文件夹',
+ loadingFolder: '正在加载文件夹',
+ name: '名称',
+ updated: '更新时间',
+ },
+ sort: {
+ ariaLabel: '排序文件夹',
+ name: '名称',
+ updated: '更新时间',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: '如果本地数据和同步数据不一致,项目会显示在这里。',
+ heading: '同步状态',
+ title: '冲突',
+ noConflicts: '未发现冲突',
+ },
+ labels: {
+ menu: '菜单',
+ },
+ sections: {
+ settings: {
+ description: '个性化你的环境和偏好',
+ title: '设置',
+ },
+ trash: {
+ description: '恢复或永久删除已移除的项目',
+ title: '回收站',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: '关闭编辑器',
+ openActions: '打开操作',
+ openWorkspaces: '打开工作区',
+ },
+ items: {
+ home: '首页',
+ menu: '菜单',
+ primary: '主要',
+ settings: '设置',
+ spaces: '空间',
+ trash: '回收站',
+ workspaces: '工作区',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: '添加填空',
+ deleteNote: '删除笔记',
+ editNote: '编辑笔记',
+ hideDerivedCardsNote: '隐藏派生卡片提示',
+ openNote: '打开 {{title}}',
+ saveNote: '保存笔记',
+ showDerivedCardsNote: '显示派生卡片提示',
+ },
+ descriptions: {
+ clozeFormat: '保存后,每个隐藏部分都会成为一张复习卡片。',
+ clozeFormatPrefix: '用以下标记包裹隐藏文本',
+ derivedCardsHelper: '笔记是派生卡片的事实来源。',
+ },
+ dialogs: {
+ deleteNoteDescription: '这会将 "{{title}}" 移至回收站。你稍后可以恢复它。',
+ deleteNoteFallbackDescription: '这会将此笔记移至回收站。你稍后可以恢复它。',
+ deleteNoteFallbackTitle: '删除笔记?',
+ deleteNoteTitle: '删除 "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: '无法创建笔记',
+ couldNotDeleteNote: '无法删除笔记',
+ couldNotSaveNote: '无法保存笔记',
+ noteCouldNotLoad: '无法加载笔记',
+ },
+ fields: {
+ back: '背面',
+ backPlaceholder: '输入背面',
+ bodyPlaceholder: '用填空删除编写笔记正文…',
+ front: '正面',
+ frontPlaceholder: '输入正面',
+ noteBody: '笔记正文',
+ title: '标题',
+ titlePlaceholder: '添加笔记标题',
+ untitledCloze: '未命名填空',
+ untitledNote: '未命名笔记',
+ },
+ labels: {
+ backUppercase: '背面',
+ basic: '基础',
+ basicLower: '基础',
+ basicUppercase: '基础',
+ cloze: '填空',
+ clozeLower: '填空',
+ clozeFormat: '填空格式',
+ clozeUppercase: '填空',
+ deck: '牌组',
+ derivedCards: '派生卡片',
+ due: '到期',
+ frontUppercase: '正面',
+ inProgress: '进行中',
+ inProgressUppercase: '进行中',
+ loadingNote: '正在加载笔记',
+ loadingNoteEditor: '正在加载笔记编辑器',
+ markdownFormatting: 'Markdown 格式',
+ mastered: '已掌握',
+ masteredUppercase: '已掌握',
+ newNote: '新建笔记',
+ noteBody: '笔记正文',
+ noteContent: '笔记内容',
+ noteDetails: '笔记详情',
+ noteMetadata: '笔记元数据',
+ noteType: '笔记类型',
+ notes: '笔记',
+ reviewed: '已复习',
+ studyProgress: '学习进度',
+ studyProgressUppercase: '学习进度',
+ titleUppercase: '标题',
+ updated: '更新时间',
+ },
+ sort: {
+ ariaLabel: '排序笔记',
+ title: '标题',
+ updated: '更新时间',
+ },
+ toolbar: {
+ bold: '加粗',
+ italic: '斜体',
+ link: '链接',
+ list: '列表',
+ },
+ },
+ review: {
+ actions: {
+ again: '重来',
+ backToDeck: '返回牌组',
+ continueReview: '继续复习',
+ easy: '简单',
+ good: '良好',
+ hard: '困难',
+ newNote: '新建笔记',
+ showAnswer: '显示答案',
+ },
+ errors: {
+ couldNotGradeCard: '无法评分卡片',
+ reviewCouldNotLoad: '无法加载复习',
+ reviewCouldNotStart: '无法开始复习',
+ summaryCouldNotLoad: '无法加载复习总结',
+ summaryNotAvailable: '复习总结不可用',
+ summaryNotComplete: '这次复习尚未完成。',
+ },
+ labels: {
+ cardsReviewed: '已复习卡片',
+ deck: '牌组',
+ duration: '时长',
+ loadingReview: '正在加载复习',
+ loadingSummary: '正在加载总结',
+ progress: '复习进度',
+ review: '复习',
+ reviewComplete: '复习完成',
+ reviewed_one: '已复习 {{count}} 张',
+ reviewed_other: '已复习 {{count}} 张',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} 小时 {{minutes}} 分钟',
+ durationMinutes: '{{minutes}} 分钟',
+ durationSeconds: '{{seconds}} 秒',
+ saved: '你的进度已保存到这个牌组。',
+ },
+ unavailable: {
+ description: '添加一条笔记,让这个牌组可以进入复习队列。',
+ title: '没有可复习的卡片',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: '清除搜索',
+ },
+ empty: {
+ noMatchesInWorkspace: '此工作区中没有匹配项',
+ noMatchesInWorkspaceDescription: '没有文件夹、牌组或笔记匹配 "{{query}}"。',
+ },
+ errors: {
+ couldNotComplete: '无法完成搜索',
+ },
+ labels: {
+ results: '搜索结果',
+ resultsFor: '"{{query}}" 的结果',
+ searchingContent: '正在搜索内容',
+ },
+ resultGroups: {
+ deck: '牌组',
+ folder: '文件夹',
+ note: '笔记',
+ },
+ resultKinds: {
+ deck: '牌组',
+ folder: '文件夹',
+ note: '笔记',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: '重置所有设置',
+ resetSettings: '重置设置',
+ resetToDefaults: '恢复默认值',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: '请粘贴包含 21 个数值的有效 JSON。',
+ fsrsErrorInvalidParams_one: '请输入正好包含 {{count}} 个有限数的 JSON 数组。',
+ fsrsErrorInvalidParams_other: '请输入正好包含 {{count}} 个有限数的 JSON 数组。',
+ fsrsHelper: '这是专家级覆盖设置。值必须保持顺序。',
+ fsrsJsonLabel: 'FSRS 参数 JSON',
+ fsrsTitle: '编辑 FSRS 参数',
+ fsrsDescription: '粘贴包含 21 个数字的 JSON 数组以覆盖 scheduler 权重。',
+ resetDescription: '这会恢复时区、学习上限和 FSRS 设置。',
+ resetDescriptionWithLanguage: '这会恢复语言、时区、学习上限和 FSRS 设置。',
+ resetTitle: '重置所有设置?',
+ timezoneDescription: '搜索城市或时区标识符。',
+ timezoneSearchLabel: '搜索时区',
+ timezoneSearchPlaceholder: '搜索时区…',
+ timezoneTitle: '选择时区',
+ },
+ errors: {
+ couldNotResetSettings: '无法重置设置',
+ couldNotSaveSettings: '无法保存设置',
+ settingsCouldNotLoad: '无法加载设置',
+ settingsUnavailable: '设置不可用。',
+ },
+ labels: {
+ appearance: '外观',
+ automatic: '自动',
+ fsrsParameters: 'FSRS 参数',
+ general: '通用',
+ language: '语言',
+ loadingSettings: '正在加载设置',
+ masteryHorizon: '掌握期限',
+ newCardOrder: '新卡顺序',
+ newCardsPerDay: '每日新卡',
+ reviewCardsPerDay: '每日复习卡',
+ savingSettings: '正在保存设置',
+ schedule: '计划',
+ searchNoTimezones: '没有匹配的时区。',
+ settings: '设置',
+ settingsReset: '设置已重置',
+ study: '学习',
+ targetRecallProbability: '目标回忆概率',
+ theme: '主题',
+ timezone: '时区',
+ },
+ options: {
+ languageEnUs: '英语(美国)',
+ newCardsAfterReviews: '复习之后',
+ newCardsBeforeReviews: '复习之前',
+ newCardsMixed: '混合',
+ themeDark: '深色',
+ themeLight: '浅色',
+ themeSystem: '系统',
+ timezoneSystem: '使用系统时区',
+ },
+ rows: {
+ fsrsDescription: '专家模型权重',
+ languageDescription: '界面语言',
+ masteryHorizonDescription: '卡片必须在目标概率或以上保持可回忆的天数,才算已掌握',
+ newCardOrderDescription: '新卡相对于复习的顺序',
+ newCardsPerDayDescription: '每日最多新卡数',
+ reviewCardsPerDayDescription: '每日最多复习卡数',
+ targetRecallProbabilityDescription: '下次计划复习时的最低回忆概率',
+ timezoneDescription: '使用自动时区或选择城市。',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: '永久删除',
+ empty: '清空',
+ emptyTrash: '清空回收站',
+ restore: '恢复',
+ restoringItem: '正在恢复 {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: '这会永久删除 "{{title}}"。此操作无法撤销。',
+ deleteItemFallbackDescription: '这会永久删除此项目。此操作无法撤销。',
+ deleteItemFallbackTitle: '删除项目?',
+ deleteItemTitle: '删除 "{{title}}"?',
+ emptyTrashDescription: '这会永久删除回收站中的所有内容。此操作无法撤销。',
+ emptyTrashTitle: '清空回收站?',
+ },
+ empty: {
+ description: '你删除的项目会在永久移除前显示在这里。',
+ title: '回收站为空',
+ },
+ errors: {
+ couldNotDeleteItem: '无法删除项目',
+ couldNotEmptyTrash: '无法清空回收站',
+ couldNotRestoreItem: '无法恢复项目',
+ trashCouldNotLoad: '无法加载回收站',
+ trashMayBeOutOfDate: '回收站可能已过期',
+ },
+ labels: {
+ deletedAge: '已删除 {{value}}',
+ itemCount_one: '{{count}} 个项目',
+ itemCount_other: '{{count}} 个项目',
+ lastEmptied: '上次清空 {{value}}',
+ loadingTrash: '正在加载回收站',
+ originalLocation: '原位置:{{location}}',
+ title: '回收站',
+ trashActions: '{{title}} 回收站操作',
+ },
+ kinds: {
+ deck: '牌组',
+ folder: '文件夹',
+ note: '笔记',
+ workspace: '工作区',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: '创建工作区',
+ deleteWorkspace: '删除工作区',
+ editWorkspace: '编辑工作区',
+ newWorkspace: '新建工作区',
+ openWorkspace: '打开 {{title}}',
+ openingWorkspace: '正在打开 {{title}}',
+ },
+ descriptions: {
+ editorDefault: '学习上下文。',
+ editorVisual: '为此工作区选择视觉锚点。',
+ emptyList: '按学习上下文分隔牌组、笔记和复习队列。',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: '这会将 "{{title}}" 移至回收站。你稍后可以恢复它。',
+ deleteWorkspaceFallbackDescription: '这会将此工作区移至回收站。你稍后可以恢复它。',
+ deleteWorkspaceFallbackTitle: '删除工作区?',
+ deleteWorkspaceTitle: '删除 "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: '从工作区开始',
+ },
+ errors: {
+ couldNotCreateWorkspace: '无法创建工作区',
+ couldNotDeleteWorkspace: '无法删除工作区',
+ couldNotOpenWorkspace: '无法打开工作区',
+ couldNotSaveWorkspace: '无法保存工作区',
+ workspaceCouldNotLoad: '无法加载工作区',
+ workspacesCouldNotLoad: '无法加载工作区',
+ },
+ fields: {
+ descriptionLabel: '工作区描述',
+ descriptionPlaceholder: '这个工作区里放什么?',
+ namePlaceholder: '工作区名称',
+ untitledWorkspace: '未命名工作区',
+ },
+ labels: {
+ createWorkspaceTitle: '创建工作区',
+ loadingWorkspaces: '正在加载工作区',
+ workspace: '工作区',
+ workspaces: '工作区',
+ },
+ },
+} as const
diff --git a/ui/src/core/i18n/resources/zh-Hant.ts b/ui/src/core/i18n/resources/zh-Hant.ts
new file mode 100644
index 0000000..8672755
--- /dev/null
+++ b/ui/src/core/i18n/resources/zh-Hant.ts
@@ -0,0 +1,623 @@
+export const zhHant = {
+ bootstrap: {
+ error: {
+ fallbackMessage: '請重試。如果問題仍然存在,請重新打開 Clear。',
+ title: '無法啟動',
+ },
+ loadingTitle: '正在準備你的學習空間',
+ },
+ common: {
+ actions: {
+ back: '返回',
+ cancel: '取消',
+ checkAgain: '再次檢查',
+ close: '關閉',
+ create: '建立',
+ delete: '刪除',
+ dismissError: '關閉錯誤',
+ dismissStatus: '關閉狀態',
+ edit: '編輯',
+ itemActions: '{{title}} 操作',
+ reset: '重置',
+ review: '複習',
+ save: '儲存',
+ saveChanges: '儲存變更',
+ tryAgain: '重試',
+ },
+ labels: {
+ active: '啟用',
+ clear: 'Clear',
+ custom: '自訂',
+ default: '預設',
+ loadingEditor: '正在載入編輯器',
+ name: '名稱',
+ completedTask: '已完成任務',
+ description: '描述',
+ incompleteTask: '未完成任務',
+ percentageInput: '{{label}} 百分比',
+ visual: '視覺',
+ },
+ status: {
+ actionFailed: '操作失敗',
+ actionInProgress: '操作進行中',
+ },
+ sort: {
+ ascending: '升冪',
+ column: '列',
+ descending: '降冪',
+ direction: '方向',
+ sort: '排序',
+ },
+ search: {
+ label: '搜尋',
+ },
+ visualPicker: {
+ allLucideIcons: '所有 Lucide 圖示',
+ browseIconsFor: '瀏覽或搜尋 {{label}} 的圖示。',
+ chooseIcon: '選擇圖示',
+ iconPicker: '{{label}} 圖示選擇器',
+ iconSearch: '{{label}} 圖示搜尋',
+ iconsCouldNotLoad: '無法載入圖示。',
+ loadingIcons: '正在載入圖示',
+ loadingMoreIcons: '正在載入更多圖示',
+ moreIcons: '更多圖示',
+ noIconsMatch: '沒有圖示符合 "{{query}}"。',
+ searchIconsPlaceholder: '搜尋圖示…',
+ selectedIcon: '已選擇 {{label}}',
+ },
+ },
+ dashboard: {
+ actions: {
+ create: '建立',
+ newDeck: '新建牌組',
+ newFolder: '新建資料夾',
+ },
+ descriptions: {
+ defaultWorkspace: '將牌組、資料夾和筆記放在一起。',
+ emptyWorkspace: '建立一個牌組,然後新增筆記來建立複習佇列。',
+ emptyFolder: '建立一個牌組,然後新增筆記來建立複習佇列。',
+ searchPlaceholder: '搜尋資料夾、牌組和筆記…',
+ },
+ empty: {
+ createFirstDeck: '建立你的第一個牌組',
+ },
+ errors: {
+ couldNotDeleteDeck: '無法刪除牌組',
+ couldNotDeleteFolder: '無法刪除資料夾',
+ couldNotDeleteWorkspace: '無法刪除工作區',
+ dashboardCouldNotOpen: '無法打開儀表板',
+ decksCouldNotLoad: '無法載入牌組',
+ decksMayBeOutOfDate: '牌組可能已過期',
+ foldersCouldNotLoad: '無法載入資料夾',
+ foldersMayBeOutOfDate: '資料夾可能已過期',
+ workspaceCouldNotLoad: '無法載入工作區',
+ },
+ labels: {
+ dashboard: '儀表板',
+ loadingDashboard: '正在載入儀表板',
+ newItem: '新項目',
+ },
+ },
+ dates: {
+ absolute: {
+ unavailable: '日期不可用',
+ },
+ age: {
+ dayAgo_one: '{{count}} 天前',
+ dayAgo_other: '{{count}} 天前',
+ hourAgo_one: '{{count}} 小時前',
+ hourAgo_other: '{{count}} 小時前',
+ justNow: '剛剛',
+ minuteAgo_one: '{{count}} 分鐘前',
+ minuteAgo_other: '{{count}} 分鐘前',
+ unavailable: '日期不可用',
+ weekAgo_one: '{{count}} 週前',
+ weekAgo_other: '{{count}} 週前',
+ },
+ labels: {
+ deleted: '已刪除 {{value}}',
+ due: '到期:{{value}}',
+ reviewed: '已複習:{{value}}',
+ updated: '已更新 {{value}}',
+ updatedUppercase: '已更新 {{value}}',
+ },
+ relative: {
+ dayAgo_one: '{{count}} 天前',
+ dayAgo_other: '{{count}} 天前',
+ inAMoment: '马上',
+ inDay_one: '{{count}} 天後',
+ inDay_other: '{{count}} 天後',
+ inMonth_one: '{{count}} 個月後',
+ inMonth_other: '{{count}} 個月後',
+ inWeek_one: '{{count}} 週後',
+ inWeek_other: '{{count}} 週後',
+ justNow: '剛剛',
+ monthAgo_one: '{{count}} 個月前',
+ monthAgo_other: '{{count}} 個月前',
+ secondsAgoShort: '{{count}} 秒前',
+ minutesAgoShort: '{{count}} 分鐘前',
+ hoursAgoShort: '{{count}} 小時前',
+ today: '今天',
+ tomorrow: '明天',
+ weekAgo_one: '{{count}} 週前',
+ weekAgo_other: '{{count}} 週前',
+ yesterday: '昨天',
+ },
+ },
+ decks: {
+ actions: {
+ actionMenu: '{{title}} 操作',
+ createDeck: '建立牌組',
+ createNote: '建立筆記',
+ deleteDeck: '刪除牌組',
+ editDeck: '編輯牌組',
+ newNote: '新建筆記',
+ openDeck: '打開 {{title}} 牌組',
+ saveDeck: '無法儲存牌組',
+ studyNow: '立即學習',
+ },
+ descriptions: {
+ emptyDeck: '新增一則筆記,让這個牌組有可複習的內容。',
+ editorDefault: '专注學習牌組。',
+ editorVisual: '為這個牌組選擇封面符號。',
+ notesSearchPlaceholder: '搜尋筆記…',
+ },
+ dialogs: {
+ deleteDeckDescription: '這會將 "{{title}}" 移至回收站。你稍後可以還原它。',
+ deleteDeckFallbackDescription: '這會將此牌組移至回收站。你稍後可以還原它。',
+ deleteDeckFallbackTitle: '刪除牌組?',
+ deleteDeckTitle: '刪除 "{{title}}"?',
+ deleteNoteDescription: '這會將 "{{title}}" 移至回收站。你稍後可以還原它。',
+ deleteNoteFallbackTitle: '刪除筆記?',
+ deleteNoteTitle: '刪除 "{{title}}"?',
+ },
+ empty: {
+ noMatchingNotes: '沒有符合的筆記',
+ noMatchingNotesDescription: '沒有筆記符合 "{{query}}"。',
+ thisDeckIsEmpty: '這個牌組是空的',
+ },
+ errors: {
+ couldNotCreateDeck: '無法建立牌組',
+ couldNotDeleteDeck: '無法刪除牌組',
+ couldNotDeleteNote: '無法刪除筆記',
+ couldNotLoadFolderPath: '無法載入資料夾路径',
+ couldNotSaveDeck: '無法儲存牌組',
+ deckCouldNotLoad: '無法載入牌組',
+ notesCouldNotLoad: '無法載入筆記',
+ notesMayBeOutOfDate: '筆記可能已過期',
+ },
+ fields: {
+ descriptionLabel: '牌組描述',
+ descriptionPlaceholder: '這個牌組會帮助你複習什么?',
+ namePlaceholder: '牌組名稱',
+ untitledDeck: '未命名牌組',
+ untitledDeckLower: '未命名牌組',
+ },
+ labels: {
+ createDeckTitle: '建立牌組',
+ deck: '牌組',
+ deckNotesSearch: '牌組筆記搜尋',
+ deckOverview: '牌組概覽',
+ decks: '牌組',
+ due: '到期',
+ dueToday: '今日到期',
+ loadingDeck: '正在載入牌組',
+ mastery: '掌握度',
+ notes: '筆記',
+ },
+ sort: {
+ ariaLabel: '排序牌組',
+ dueToday: '今日到期',
+ title: '標題',
+ updated: '更新時間',
+ },
+ },
+ errors: {
+ byType: {
+ conflict: '資料已變更。請重新整理後重試。',
+ forbidden: '你沒有權限执行此操作。',
+ notFound: '找不到此項目。',
+ offline: '無法連線到服務。',
+ timeout: '耗時過长。請重試。',
+ unauthorized: '請登入以继续。',
+ unavailable: '服務暫時不可用。',
+ },
+ fallback: {
+ unexpected: '意外錯誤',
+ },
+ },
+ folders: {
+ actions: {
+ createFolder: '建立資料夾',
+ deleteFolder: '刪除資料夾',
+ editFolder: '編輯資料夾',
+ },
+ descriptions: {
+ editorDefault: '用于相關牌組的資料夾。',
+ },
+ dialogs: {
+ deleteFolderDescription: '這會將 "{{name}}" 移至回收站。你稍後可以還原它。',
+ deleteFolderFallbackDescription: '這會將此資料夾移至回收站。你稍後可以還原它。',
+ deleteFolderFallbackTitle: '刪除資料夾?',
+ deleteFolderTitle: '刪除 "{{name}}"?',
+ },
+ empty: {
+ noMatchesInFolder: '此資料夾中沒有符合項',
+ noMatchesInFolderDescription: '沒有資料夾、牌組或筆記符合 "{{query}}"。',
+ },
+ errors: {
+ couldNotCreateFolder: '無法建立資料夾',
+ couldNotDeleteFolder: '無法刪除資料夾',
+ couldNotLoadFolderPath: '無法載入資料夾路径',
+ couldNotSaveFolder: '無法儲存資料夾',
+ folderCouldNotLoad: '無法載入資料夾',
+ },
+ fields: {
+ descriptionLabel: '資料夾描述',
+ descriptionPlaceholder: '這個資料夾裡放什么?',
+ namePlaceholder: '資料夾名稱',
+ untitledFolder: '未命名資料夾',
+ },
+ labels: {
+ createFolderTitle: '建立資料夾',
+ folder: '資料夾',
+ folders: '資料夾',
+ loadingFolder: '正在載入資料夾',
+ name: '名稱',
+ updated: '更新時間',
+ },
+ sort: {
+ ariaLabel: '排序資料夾',
+ name: '名稱',
+ updated: '更新時間',
+ },
+ },
+ menu: {
+ conflicts: {
+ description: '如果本地資料和同步資料不一致,項目會顯示在這裡。',
+ heading: '同步狀態',
+ title: '衝突',
+ noConflicts: '未發現衝突',
+ },
+ labels: {
+ menu: '選單',
+ },
+ sections: {
+ settings: {
+ description: '個人化你的環境和偏好',
+ title: '設定',
+ },
+ trash: {
+ description: '還原或永久刪除已移除的項目',
+ title: '回收站',
+ },
+ },
+ },
+ navigation: {
+ actions: {
+ closeEditor: '關閉編輯器',
+ openActions: '打開操作',
+ openWorkspaces: '打開工作區',
+ },
+ items: {
+ home: '首頁',
+ menu: '選單',
+ primary: '主要',
+ settings: '設定',
+ spaces: '空間',
+ trash: '回收站',
+ workspaces: '工作區',
+ },
+ },
+ notes: {
+ actions: {
+ addCloze: '新增克漏字',
+ deleteNote: '刪除筆記',
+ editNote: '編輯筆記',
+ hideDerivedCardsNote: '隱藏衍生卡片提示',
+ openNote: '打開 {{title}}',
+ saveNote: '儲存筆記',
+ showDerivedCardsNote: '顯示衍生卡片提示',
+ },
+ descriptions: {
+ clozeFormat: '儲存後,每個隱藏部分都會成為一張複習卡片。',
+ clozeFormatPrefix: '用以下標記包裹隱藏文本',
+ derivedCardsHelper: '筆記是衍生卡片的事實來源。',
+ },
+ dialogs: {
+ deleteNoteDescription: '這會將 "{{title}}" 移至回收站。你稍後可以還原它。',
+ deleteNoteFallbackDescription: '這會將此筆記移至回收站。你稍後可以還原它。',
+ deleteNoteFallbackTitle: '刪除筆記?',
+ deleteNoteTitle: '刪除 "{{title}}"?',
+ },
+ errors: {
+ couldNotCreateNote: '無法建立筆記',
+ couldNotDeleteNote: '無法刪除筆記',
+ couldNotSaveNote: '無法儲存筆記',
+ noteCouldNotLoad: '無法載入筆記',
+ },
+ fields: {
+ back: '背面',
+ backPlaceholder: '輸入背面',
+ bodyPlaceholder: '用克漏字刪除编寫筆記內文…',
+ front: '正面',
+ frontPlaceholder: '輸入正面',
+ noteBody: '筆記內文',
+ title: '標題',
+ titlePlaceholder: '新增筆記標題',
+ untitledCloze: '未命名克漏字',
+ untitledNote: '未命名筆記',
+ },
+ labels: {
+ backUppercase: '背面',
+ basic: '基本',
+ basicLower: '基本',
+ basicUppercase: '基本',
+ cloze: '克漏字',
+ clozeLower: '克漏字',
+ clozeFormat: '克漏字格式',
+ clozeUppercase: '克漏字',
+ deck: '牌組',
+ derivedCards: '衍生卡片',
+ due: '到期',
+ frontUppercase: '正面',
+ inProgress: '進行中',
+ inProgressUppercase: '進行中',
+ loadingNote: '正在載入筆記',
+ loadingNoteEditor: '正在載入筆記編輯器',
+ markdownFormatting: 'Markdown 格式',
+ mastered: '已掌握',
+ masteredUppercase: '已掌握',
+ newNote: '新建筆記',
+ noteBody: '筆記內文',
+ noteContent: '筆記內容',
+ noteDetails: '筆記详情',
+ noteMetadata: '筆記元資料',
+ noteType: '筆記类型',
+ notes: '筆記',
+ reviewed: '已複習',
+ studyProgress: '學習進度',
+ studyProgressUppercase: '學習進度',
+ titleUppercase: '標題',
+ updated: '更新時間',
+ },
+ sort: {
+ ariaLabel: '排序筆記',
+ title: '標題',
+ updated: '更新時間',
+ },
+ toolbar: {
+ bold: '粗體',
+ italic: '斜體',
+ link: '連結',
+ list: '清單',
+ },
+ },
+ review: {
+ actions: {
+ again: '重來',
+ backToDeck: '返回牌組',
+ continueReview: '继续複習',
+ easy: '简單',
+ good: '良好',
+ hard: '困难',
+ newNote: '新建筆記',
+ showAnswer: '顯示答案',
+ },
+ errors: {
+ couldNotGradeCard: '無法評分卡片',
+ reviewCouldNotLoad: '無法載入複習',
+ reviewCouldNotStart: '無法開始複習',
+ summaryCouldNotLoad: '無法載入複習摘要',
+ summaryNotAvailable: '複習摘要不可用',
+ summaryNotComplete: '這次複習尚未完成。',
+ },
+ labels: {
+ cardsReviewed: '已複習卡片',
+ deck: '牌組',
+ duration: '時长',
+ loadingReview: '正在載入複習',
+ loadingSummary: '正在載入摘要',
+ progress: '複習進度',
+ review: '複習',
+ reviewComplete: '複習完成',
+ reviewed_one: '已複習 {{count}} 張',
+ reviewed_other: '已複習 {{count}} 張',
+ },
+ summary: {
+ durationHoursMinutes: '{{hours}} 小時 {{minutes}} 分鐘',
+ durationMinutes: '{{minutes}} 分鐘',
+ durationSeconds: '{{seconds}} 秒',
+ saved: '你的進度已儲存到這個牌組。',
+ },
+ unavailable: {
+ description: '新增一則筆記,让這個牌組可以進入複習佇列。',
+ title: '沒有可複習的卡片',
+ },
+ },
+ search: {
+ actions: {
+ clearSearch: '清除搜尋',
+ },
+ empty: {
+ noMatchesInWorkspace: '此工作區中沒有符合項',
+ noMatchesInWorkspaceDescription: '沒有資料夾、牌組或筆記符合 "{{query}}"。',
+ },
+ errors: {
+ couldNotComplete: '無法完成搜尋',
+ },
+ labels: {
+ results: '搜尋結果',
+ resultsFor: '"{{query}}" 的結果',
+ searchingContent: '正在搜尋內容',
+ },
+ resultGroups: {
+ deck: '牌組',
+ folder: '資料夾',
+ note: '筆記',
+ },
+ resultKinds: {
+ deck: '牌組',
+ folder: '資料夾',
+ note: '筆記',
+ },
+ },
+ settings: {
+ actions: {
+ resetAll: '重設所有設定',
+ resetSettings: '重設設定',
+ resetToDefaults: '還原預設值',
+ },
+ dialogs: {
+ fsrsErrorInvalidJson: '請貼上包含 21 個數值的有效 JSON。',
+ fsrsErrorInvalidParams_one: '請輸入正好包含 {{count}} 個有限數的 JSON 陣列。',
+ fsrsErrorInvalidParams_other: '請輸入正好包含 {{count}} 個有限數的 JSON 陣列。',
+ fsrsHelper: '這是專家級覆寫設定。值必須保持順序。',
+ fsrsJsonLabel: 'FSRS 參數 JSON',
+ fsrsTitle: '編輯 FSRS 參數',
+ fsrsDescription: '貼上包含 21 個數字的 JSON 陣列以覆寫 scheduler 權重。',
+ resetDescription: '這會還原時區、學習上限和 FSRS 設定。',
+ resetDescriptionWithLanguage: '這會還原語言、時區、學習上限和 FSRS 設定。',
+ resetTitle: '重設所有設定?',
+ timezoneDescription: '搜尋城市或時區識別碼。',
+ timezoneSearchLabel: '搜尋時區',
+ timezoneSearchPlaceholder: '搜尋時區…',
+ timezoneTitle: '選擇時區',
+ },
+ errors: {
+ couldNotResetSettings: '無法重設設定',
+ couldNotSaveSettings: '無法儲存設定',
+ settingsCouldNotLoad: '無法載入設定',
+ settingsUnavailable: '設定不可用。',
+ },
+ labels: {
+ appearance: '外觀',
+ automatic: '自動',
+ fsrsParameters: 'FSRS 參數',
+ general: '一般',
+ language: '語言',
+ loadingSettings: '正在載入設定',
+ masteryHorizon: '掌握期限',
+ newCardOrder: '新卡順序',
+ newCardsPerDay: '每日新卡',
+ reviewCardsPerDay: '每日複習卡',
+ savingSettings: '正在儲存設定',
+ schedule: '排程',
+ searchNoTimezones: '沒有符合的時區。',
+ settings: '設定',
+ settingsReset: '設定已重設',
+ study: '學習',
+ targetRecallProbability: '目標回憶機率',
+ theme: '主題',
+ timezone: '時區',
+ },
+ options: {
+ languageEnUs: '英語(美國)',
+ newCardsAfterReviews: '複習之後',
+ newCardsBeforeReviews: '複習之前',
+ newCardsMixed: '混合',
+ themeDark: '深色',
+ themeLight: '淺色',
+ themeSystem: '系統',
+ timezoneSystem: '使用系統時區',
+ },
+ rows: {
+ fsrsDescription: '專家模型權重',
+ languageDescription: '介面語言',
+ masteryHorizonDescription: '卡片必須在目標機率或以上保持可回憶的天數,才算已掌握',
+ newCardOrderDescription: '新卡相對於複習的順序',
+ newCardsPerDayDescription: '每日最多新卡數',
+ reviewCardsPerDayDescription: '每日最多複習卡數',
+ targetRecallProbabilityDescription: '下次排程複習時的最低回憶機率',
+ timezoneDescription: '使用自動時區或選擇城市。',
+ },
+ },
+ trash: {
+ actions: {
+ deletePermanently: '永久刪除',
+ empty: '清空',
+ emptyTrash: '清空回收站',
+ restore: '還原',
+ restoringItem: '正在還原 {{title}}',
+ },
+ dialogs: {
+ deleteItemDescription: '這會永久刪除 "{{title}}"。此操作無法撤销。',
+ deleteItemFallbackDescription: '這會永久刪除此項目。此操作無法撤销。',
+ deleteItemFallbackTitle: '刪除項目?',
+ deleteItemTitle: '刪除 "{{title}}"?',
+ emptyTrashDescription: '這會永久刪除回收站中的所有內容。此操作無法撤销。',
+ emptyTrashTitle: '清空回收站?',
+ },
+ empty: {
+ description: '你刪除的項目會在永久移除前顯示在這裡。',
+ title: '回收站為空',
+ },
+ errors: {
+ couldNotDeleteItem: '無法刪除項目',
+ couldNotEmptyTrash: '無法清空回收站',
+ couldNotRestoreItem: '無法還原項目',
+ trashCouldNotLoad: '無法載入回收站',
+ trashMayBeOutOfDate: '回收站可能已過期',
+ },
+ labels: {
+ deletedAge: '已刪除 {{value}}',
+ itemCount_one: '{{count}} 個項目',
+ itemCount_other: '{{count}} 個項目',
+ lastEmptied: '上次清空 {{value}}',
+ loadingTrash: '正在載入回收站',
+ originalLocation: '原始位置:{{location}}',
+ title: '回收站',
+ trashActions: '{{title}} 回收站操作',
+ },
+ kinds: {
+ deck: '牌組',
+ folder: '資料夾',
+ note: '筆記',
+ workspace: '工作區',
+ },
+ },
+ workspaces: {
+ actions: {
+ createWorkspace: '建立工作區',
+ deleteWorkspace: '刪除工作區',
+ editWorkspace: '編輯工作區',
+ newWorkspace: '新建工作區',
+ openWorkspace: '打開 {{title}}',
+ openingWorkspace: '正在打開 {{title}}',
+ },
+ descriptions: {
+ editorDefault: '學習脈絡。',
+ editorVisual: '為此工作區選擇視覺锚点。',
+ emptyList: '按學習脈絡分隔牌組、筆記和複習佇列。',
+ },
+ dialogs: {
+ deleteWorkspaceDescription: '這會將 "{{title}}" 移至回收站。你稍後可以還原它。',
+ deleteWorkspaceFallbackDescription: '這會將此工作區移至回收站。你稍後可以還原它。',
+ deleteWorkspaceFallbackTitle: '刪除工作區?',
+ deleteWorkspaceTitle: '刪除 "{{title}}"?',
+ },
+ empty: {
+ startWithWorkspace: '從工作區開始',
+ },
+ errors: {
+ couldNotCreateWorkspace: '無法建立工作區',
+ couldNotDeleteWorkspace: '無法刪除工作區',
+ couldNotOpenWorkspace: '無法打開工作區',
+ couldNotSaveWorkspace: '無法儲存工作區',
+ workspaceCouldNotLoad: '無法載入工作區',
+ workspacesCouldNotLoad: '無法載入工作區',
+ },
+ fields: {
+ descriptionLabel: '工作區描述',
+ descriptionPlaceholder: '這個工作區裡放什么?',
+ namePlaceholder: '工作區名稱',
+ untitledWorkspace: '未命名工作區',
+ },
+ labels: {
+ createWorkspaceTitle: '建立工作區',
+ loadingWorkspaces: '正在載入工作區',
+ workspace: '工作區',
+ workspaces: '工作區',
+ },
+ },
+} as const
diff --git a/ui/src/features/settings/components/SettingsPageContent.tsx b/ui/src/features/settings/components/SettingsPageContent.tsx
index 79f2c0f..3cb5f15 100644
--- a/ui/src/features/settings/components/SettingsPageContent.tsx
+++ b/ui/src/features/settings/components/SettingsPageContent.tsx
@@ -1,4 +1,5 @@
import type { ThemePreference } from '@core/theme'
+import { getDocumentLocale } from '@core/i18n'
import { Button } from '@shared/components/ui/button'
import { useTranslation } from 'react-i18next'
@@ -86,7 +87,7 @@ const SettingsPageContentInner = ({
description={t(($) => $.settings.rows.languageDescription)}
label={t(($) => $.settings.labels.language)}
options={settingsLanguageOptions}
- value={settings.language}
+ value={getDocumentLocale(settings.language)}
onSelect={(language) => {
onUpdateSettings({ language })
}}
diff --git a/ui/src/features/settings/constants/settings-options.test.ts b/ui/src/features/settings/constants/settings-options.test.ts
new file mode 100644
index 0000000..0ba034c
--- /dev/null
+++ b/ui/src/features/settings/constants/settings-options.test.ts
@@ -0,0 +1,59 @@
+import { describe, expect, it } from 'vitest'
+
+import { publicLocales } from '@core/i18n'
+
+import { settingsLanguageOptions } from './settings-options'
+
+describe('settings options', () => {
+ it('lists public locales with English language labels sorted alphabetically', () => {
+ expect(settingsLanguageOptions).toEqual([
+ { label: 'Arabic', value: 'ar' },
+ { label: 'Bosnian', value: 'bs' },
+ { label: 'Bulgarian', value: 'bg' },
+ { label: 'Catalan', value: 'ca' },
+ { label: 'Chinese (Simplified)', value: 'zh-Hans' },
+ { label: 'Chinese (Traditional)', value: 'zh-Hant' },
+ { label: 'Croatian', value: 'hr' },
+ { label: 'Czech', value: 'cs' },
+ { label: 'Danish', value: 'da' },
+ { label: 'Dutch', value: 'nl' },
+ { label: 'English', value: 'en-US' },
+ { label: 'Estonian', value: 'et' },
+ { label: 'Finnish', value: 'fi' },
+ { label: 'French', value: 'fr' },
+ { label: 'German', value: 'de' },
+ { label: 'Greek', value: 'el' },
+ { label: 'Hebrew', value: 'he' },
+ { label: 'Hungarian', value: 'hu' },
+ { label: 'Indonesian', value: 'id' },
+ { label: 'Italian', value: 'it' },
+ { label: 'Japanese', value: 'ja' },
+ { label: 'Korean', value: 'ko' },
+ { label: 'Latvian', value: 'lv' },
+ { label: 'Lithuanian', value: 'lt' },
+ { label: 'Norwegian Bokmål', value: 'nb' },
+ { label: 'Persian', value: 'fa' },
+ { label: 'Polish', value: 'pl' },
+ { label: 'Portuguese (Brazil)', value: 'pt-BR' },
+ { label: 'Romanian', value: 'ro' },
+ { label: 'Russian', value: 'ru' },
+ { label: 'Serbian', value: 'sr-Latn' },
+ { label: 'Slovak', value: 'sk' },
+ { label: 'Slovenian', value: 'sl' },
+ { label: 'Spanish', value: 'es' },
+ { label: 'Swedish', value: 'sv' },
+ { label: 'Thai', value: 'th' },
+ { label: 'Turkish', value: 'tr' },
+ { label: 'Ukrainian', value: 'uk' },
+ { label: 'Vietnamese', value: 'vi' },
+ ])
+ expect(settingsLanguageOptions.map((option) => option.label)).toEqual(
+ settingsLanguageOptions
+ .map((option) => option.label)
+ .sort((left, right) => left.localeCompare(right)),
+ )
+ expect([...settingsLanguageOptions.map((option) => option.value)].sort()).toEqual(
+ [...publicLocales].sort(),
+ )
+ })
+})
diff --git a/ui/src/features/settings/constants/settings-options.ts b/ui/src/features/settings/constants/settings-options.ts
index d34b42f..2ed4aaa 100644
--- a/ui/src/features/settings/constants/settings-options.ts
+++ b/ui/src/features/settings/constants/settings-options.ts
@@ -1,36 +1,52 @@
+import type { PublicLocale } from '@core/i18n'
+
import type { SettingsNewCardsOrder } from '../types/settings.types'
export type SettingsLanguageOption = Readonly<{
label: string
- value: string
+ value: PublicLocale
}>
export const settingsLanguageOptions: SettingsLanguageOption[] = [
- { label: 'English (US)', value: 'en-US' },
- { label: 'English (UK)', value: 'en-GB' },
- { label: 'Spanish', value: 'es' },
+ { label: 'Arabic', value: 'ar' },
+ { label: 'Bosnian', value: 'bs' },
+ { label: 'Bulgarian', value: 'bg' },
+ { label: 'Catalan', value: 'ca' },
+ { label: 'Chinese (Simplified)', value: 'zh-Hans' },
+ { label: 'Chinese (Traditional)', value: 'zh-Hant' },
+ { label: 'Croatian', value: 'hr' },
+ { label: 'Czech', value: 'cs' },
+ { label: 'Danish', value: 'da' },
+ { label: 'Dutch', value: 'nl' },
+ { label: 'English', value: 'en-US' },
+ { label: 'Estonian', value: 'et' },
+ { label: 'Finnish', value: 'fi' },
{ label: 'French', value: 'fr' },
{ label: 'German', value: 'de' },
- { label: 'Russian', value: 'ru' },
+ { label: 'Greek', value: 'el' },
+ { label: 'Hebrew', value: 'he' },
+ { label: 'Hungarian', value: 'hu' },
+ { label: 'Indonesian', value: 'id' },
{ label: 'Italian', value: 'it' },
- { label: 'Portuguese (Brazil)', value: 'pt-BR' },
- { label: 'Portuguese (Portugal)', value: 'pt-PT' },
{ label: 'Japanese', value: 'ja' },
- { label: 'Chinese (Simplified)', value: 'zh-Hans' },
- { label: 'Chinese (Traditional)', value: 'zh-Hant' },
{ label: 'Korean', value: 'ko' },
- { label: 'Arabic', value: 'ar' },
- { label: 'Hindi', value: 'hi' },
- { label: 'Turkish', value: 'tr' },
- { label: 'Dutch', value: 'nl' },
+ { label: 'Latvian', value: 'lv' },
+ { label: 'Lithuanian', value: 'lt' },
+ { label: 'Norwegian Bokmål', value: 'nb' },
+ { label: 'Persian', value: 'fa' },
{ label: 'Polish', value: 'pl' },
+ { label: 'Portuguese (Brazil)', value: 'pt-BR' },
+ { label: 'Romanian', value: 'ro' },
+ { label: 'Russian', value: 'ru' },
+ { label: 'Serbian', value: 'sr-Latn' },
+ { label: 'Slovak', value: 'sk' },
+ { label: 'Slovenian', value: 'sl' },
+ { label: 'Spanish', value: 'es' },
{ label: 'Swedish', value: 'sv' },
- { label: 'Greek', value: 'el' },
- { label: 'Hebrew', value: 'he' },
- { label: 'Indonesian', value: 'id' },
- { label: 'Vietnamese', value: 'vi' },
{ label: 'Thai', value: 'th' },
+ { label: 'Turkish', value: 'tr' },
{ label: 'Ukrainian', value: 'uk' },
+ { label: 'Vietnamese', value: 'vi' },
]
export const settingsNewCardsOrderOptions: Array<{
diff --git a/ui/src/features/settings/constants/settings-ui.ts b/ui/src/features/settings/constants/settings-ui.ts
index f9b6fe1..74f3ab7 100644
--- a/ui/src/features/settings/constants/settings-ui.ts
+++ b/ui/src/features/settings/constants/settings-ui.ts
@@ -1 +1 @@
-export const showSettingsLanguageControl = false
+export const showSettingsLanguageControl = true
diff --git a/ui/src/features/settings/pages/SettingsPage.test.tsx b/ui/src/features/settings/pages/SettingsPage.test.tsx
index 8cbe52a..76b0b3c 100644
--- a/ui/src/features/settings/pages/SettingsPage.test.tsx
+++ b/ui/src/features/settings/pages/SettingsPage.test.tsx
@@ -119,7 +119,7 @@ describe('SettingsPage', () => {
})
expect(screen.getByRole('button', { name: 'Timezone' })).toBeInTheDocument()
- expect(screen.queryByRole('button', { name: 'Language' })).not.toBeInTheDocument()
+ expect(screen.getByRole('button', { name: 'Language' })).toBeInTheDocument()
await act(async () => {
await vi.advanceTimersByTimeAsync(180)
@@ -138,7 +138,7 @@ describe('SettingsPage', () => {
expect(screen.getByText('Appearance')).toBeInTheDocument()
expect(screen.getByText('Study')).toBeInTheDocument()
expect(screen.getByText('FSRS Parameters')).toBeInTheDocument()
- expect(screen.queryByRole('button', { name: 'Language' })).not.toBeInTheDocument()
+ expect(screen.getByRole('button', { name: 'Language' })).toHaveTextContent('English')
await user.click(await screen.findByRole('button', { name: 'Timezone' }))
const timezoneDialog = await screen.findByRole('dialog', { name: 'Choose Timezone' })
@@ -163,6 +163,37 @@ describe('SettingsPage', () => {
)
})
+ it('switches the interface language when a language option is selected', async () => {
+ const user = userEvent.setup()
+ const baseServices = createAppServices('mock')
+ const write = vi.fn(baseServices.settings.write)
+ const services = {
+ ...baseServices,
+ settings: {
+ ...baseServices.settings,
+ write,
+ },
+ }
+
+ renderRoute('/menu/settings', { services })
+
+ const languageButton = await screen.findByRole('button', { name: 'Language' })
+
+ expect(languageButton).toHaveTextContent('English')
+ expect(document.documentElement).toHaveAttribute('lang', 'en-US')
+ expect(document.documentElement).toHaveAttribute('dir', 'ltr')
+
+ await user.click(languageButton)
+ await user.click(await screen.findByRole('menuitem', { name: 'Arabic' }))
+
+ expect(await screen.findByRole('heading', { name: 'الإعدادات' })).toBeInTheDocument()
+ expect(document.documentElement).toHaveAttribute('lang', 'ar')
+ expect(document.documentElement).toHaveAttribute('dir', 'rtl')
+ await waitFor(() => {
+ expect(write).toHaveBeenCalledWith(expect.objectContaining({ language: 'ar' }))
+ })
+ })
+
it('renders in the desktop sidebar layout', async () => {
const user = userEvent.setup()
mockMatchMedia(true)
@@ -171,7 +202,7 @@ describe('SettingsPage', () => {
const heading = await screen.findByRole('heading', { name: 'Settings' })
expect(heading).toBeInTheDocument()
expect(await screen.findByRole('button', { name: 'Timezone' })).toBeInTheDocument()
- expect(screen.queryByRole('button', { name: 'Language' })).not.toBeInTheDocument()
+ expect(screen.getByRole('button', { name: 'Language' })).toHaveTextContent('English')
expect(heading.closest('div.mx-auto')).toHaveClass('max-w-page-narrow')
expect(screen.getByText('General')).toBeInTheDocument()
expect(screen.getByText('Appearance')).toBeInTheDocument()
@@ -189,7 +220,9 @@ describe('SettingsPage', () => {
await user.click(resetButton)
const dialog = await screen.findByRole('dialog', { name: 'Reset all settings?' })
expect(dialog).toBeInTheDocument()
- expect(dialog).toHaveTextContent('This restores timezone, study limits, and FSRS settings.')
+ expect(dialog).toHaveTextContent(
+ 'This restores language, timezone, study limits, and FSRS settings.',
+ )
expect(screen.getByRole('link', { name: 'Settings', hidden: true })).toHaveAttribute(
'aria-current',
'page',
diff --git a/ui/src/features/settings/pages/SettingsPage.tsx b/ui/src/features/settings/pages/SettingsPage.tsx
index 9ab3bd9..6512e15 100644
--- a/ui/src/features/settings/pages/SettingsPage.tsx
+++ b/ui/src/features/settings/pages/SettingsPage.tsx
@@ -5,6 +5,7 @@ import {
BottomActionErrorStatus,
desktopBottomStatusStackClassName,
} from '@shared/components/feedback/BottomActionErrorStatus'
+import { getDocumentLocale } from '@core/i18n'
import { useThemeStore } from '@core/theme'
import { LoadErrorState } from '@shared/components/feedback/LoadErrorState'
import { PendingSpinner } from '@shared/components/feedback/PendingSpinner'
@@ -26,7 +27,7 @@ import {
import type { Settings } from '../types/settings.types'
export const SettingsPage = () => {
- const { t } = useTranslation()
+ const { i18n, t } = useTranslation()
const activeWorkspaceIdQuery = useActiveWorkspaceId()
const homeTarget = activeWorkspaceIdQuery.data
? { to: `/dashboard/${activeWorkspaceIdQuery.data}` }
@@ -53,8 +54,9 @@ export const SettingsPage = () => {
useEffect(() => {
if (settingsQuery.data) {
setSettings(settingsQuery.data)
+ void i18n.changeLanguage(getDocumentLocale(settingsQuery.data.language))
}
- }, [settingsQuery.data])
+ }, [i18n, settingsQuery.data])
const isInitialLoading = settingsQuery.isLoading || (!settings && !settingsQuery.isError)
const showInitialLoading = useDelayedBoolean(isInitialLoading, 180)
@@ -104,6 +106,9 @@ export const SettingsPage = () => {
const nextSettings = { ...settings, ...patch }
setSettings(nextSettings)
+ if (typeof patch.language === 'string') {
+ void i18n.changeLanguage(getDocumentLocale(patch.language))
+ }
writeSettings.mutate(nextSettings)
}
@@ -170,6 +175,7 @@ export const SettingsPage = () => {
resetSettings.mutate(undefined, {
onSuccess: (nextSettings) => {
setSettings(nextSettings)
+ void i18n.changeLanguage(getDocumentLocale(nextSettings.language))
setIsResetSettingsDialogOpen(false)
},
})
diff --git a/ui/src/features/trash/pages/TrashPage.tsx b/ui/src/features/trash/pages/TrashPage.tsx
index d2279e2..5fb738f 100644
--- a/ui/src/features/trash/pages/TrashPage.tsx
+++ b/ui/src/features/trash/pages/TrashPage.tsx
@@ -100,10 +100,7 @@ export const TrashPage = () => {
lastEmptiedAt: new Date().toISOString(),
}
const itemCount = trashState.items.length
- const summaryLabel =
- itemCount === 1
- ? t(($) => $.trash.labels.itemCount, { count: itemCount })
- : t(($) => $.trash.labels.itemCountPlural, { count: itemCount })
+ const summaryLabel = t(($) => $.trash.labels.itemCount, { count: itemCount })
const summaryAge = t(($) => $.trash.labels.lastEmptied, {
value: formatRelativeAge(trashState.lastEmptiedAt),
})
diff --git a/ui/src/shared/lib/translated-date-format.ts b/ui/src/shared/lib/translated-date-format.ts
index e31be14..b1a1661 100644
--- a/ui/src/shared/lib/translated-date-format.ts
+++ b/ui/src/shared/lib/translated-date-format.ts
@@ -43,8 +43,8 @@ const formatRelativeDayCount = (
}
return tense === 'past'
- ? t(($) => $.dates.relative.daysAgo, { count })
- : t(($) => $.dates.relative.inDays, { count })
+ ? t(($) => $.dates.relative.dayAgo, { count })
+ : t(($) => $.dates.relative.inDay, { count })
}
const formatRelativeWeekCount = (
@@ -53,8 +53,8 @@ const formatRelativeWeekCount = (
tense: 'past' | 'future',
) => {
return tense === 'past'
- ? t(($) => $.dates.relative.weeksAgo, { count })
- : t(($) => $.dates.relative.inWeeks, { count })
+ ? t(($) => $.dates.relative.weekAgo, { count })
+ : t(($) => $.dates.relative.inWeek, { count })
}
const formatRelativeMonthCount = (
@@ -62,15 +62,9 @@ const formatRelativeMonthCount = (
count: number,
tense: 'past' | 'future',
) => {
- if (count === 1) {
- return tense === 'past'
- ? t(($) => $.dates.relative.monthAgo, { count })
- : t(($) => $.dates.relative.inMonth, { count })
- }
-
return tense === 'past'
- ? t(($) => $.dates.relative.monthsAgo, { count })
- : t(($) => $.dates.relative.inMonths, { count })
+ ? t(($) => $.dates.relative.monthAgo, { count })
+ : t(($) => $.dates.relative.inMonth, { count })
}
const formatRelativeAgeValue = (t: TFunction, isoDate: string) => {
@@ -88,17 +82,13 @@ const formatRelativeAgeValue = (t: TFunction, isoDate: string) => {
}
if (diffMinutes < 60) {
- return diffMinutes === 1
- ? t(($) => $.dates.age.minuteAgo, { count: diffMinutes })
- : t(($) => $.dates.age.minutesAgo, { count: diffMinutes })
+ return t(($) => $.dates.age.minuteAgo, { count: diffMinutes })
}
const diffHours = Math.max(1, Math.round(diffMinutes / 60))
if (diffHours < 24) {
- return diffHours === 1
- ? t(($) => $.dates.age.hourAgo, { count: diffHours })
- : t(($) => $.dates.age.hoursAgo, { count: diffHours })
+ return t(($) => $.dates.age.hourAgo, { count: diffHours })
}
const diffDays = Math.max(1, Math.round(diffMs / dayMs))
@@ -106,14 +96,10 @@ const formatRelativeAgeValue = (t: TFunction, isoDate: string) => {
if (diffDays >= 7 && diffDays % 7 === 0) {
const weeks = diffDays / 7
- return weeks === 1
- ? t(($) => $.dates.age.weekAgo, { count: weeks })
- : t(($) => $.dates.age.weeksAgo, { count: weeks })
+ return t(($) => $.dates.age.weekAgo, { count: weeks })
}
- return diffDays === 1
- ? t(($) => $.dates.age.dayAgo, { count: diffDays })
- : t(($) => $.dates.age.daysAgo, { count: diffDays })
+ return t(($) => $.dates.age.dayAgo, { count: diffDays })
}
const formatUpdatedAgeValue = (t: TFunction, value: string) => {
@@ -146,9 +132,7 @@ const formatUpdatedAgeValue = (t: TFunction, value: string) => {
if (diffMs < weekMs) {
const days = Math.max(1, Math.round(diffMs / dayMs))
- return days === 1
- ? t(($) => $.dates.relative.dayAgo, { count: days })
- : t(($) => $.dates.relative.daysAgo, { count: days })
+ return t(($) => $.dates.relative.dayAgo, { count: days })
}
return formatAbsoluteDate(value)
diff --git a/ui/src/test/setup.ts b/ui/src/test/setup.ts
index c2f9bab..0f149e7 100644
--- a/ui/src/test/setup.ts
+++ b/ui/src/test/setup.ts
@@ -2,6 +2,7 @@ import '@testing-library/jest-dom/vitest'
import { cleanup } from '@testing-library/react'
import { afterEach, beforeEach, vi } from 'vitest'
+import { setI18n } from 'react-i18next'
import { queryClient } from '@core/query/query-client'
import { resetThemeStoreForTests } from '@core/theme'
@@ -69,6 +70,7 @@ beforeEach(async () => {
window.sessionStorage.clear()
resetThemeStoreForTests()
await appI18n.changeLanguage(defaultLocale)
+ setI18n(appI18n)
await mockStateRepository.reset()
queryClient.clear()
})