@djangocfg/layouts 2.1.591 → 2.1.593

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/package.json +12 -12
  2. package/src/components/errors/ErrorLayout.tsx +1 -164
  3. package/src/components/errors/ErrorsTracker/providers/ErrorTrackingProvider.tsx +1 -100
  4. package/src/components/errors/ErrorsTracker/providers/errorDedupe.ts +101 -0
  5. package/src/components/errors/errorGlyphs.tsx +167 -0
  6. package/src/layouts/AppLayout/BaseApp.tsx +1 -1
  7. package/src/layouts/AppLayout/index.ts +2 -2
  8. package/src/layouts/AuthLayout/AuthLayout.tsx +3 -23
  9. package/src/layouts/AuthLayout/components/shared/AuthTopBar.tsx +1 -1
  10. package/src/layouts/AuthLayout/components/steps/IdentifierStep.tsx +1 -1
  11. package/src/layouts/AuthLayout/layoutContext.ts +25 -0
  12. package/src/layouts/AuthLayout/styles/split-shell.css +0 -1
  13. package/src/layouts/PrivateLayout/PrivateLayout.tsx +37 -26
  14. package/src/layouts/PrivateLayout/README.md +20 -12
  15. package/src/layouts/PrivateLayout/components/PrivateContent.tsx +29 -42
  16. package/src/layouts/PrivateLayout/components/PrivateSidebar.tsx +23 -92
  17. package/src/layouts/PrivateLayout/components/PrivateSidebarAccount.tsx +41 -112
  18. package/src/layouts/PrivateLayout/components/SidebarBody.tsx +45 -0
  19. package/src/layouts/PrivateLayout/components/SidebarBrand.tsx +64 -152
  20. package/src/layouts/PrivateLayout/components/SidebarBrandSwitcher.tsx +2 -30
  21. package/src/layouts/PrivateLayout/components/SidebarNavGroup.tsx +55 -115
  22. package/src/layouts/PrivateLayout/components/SidebarNavItem.tsx +37 -100
  23. package/src/layouts/PrivateLayout/components/SidebarPeek.tsx +34 -0
  24. package/src/layouts/PrivateLayout/components/SidebarResizeHandle.tsx +76 -0
  25. package/src/layouts/PrivateLayout/components/SidebarSlots.tsx +14 -53
  26. package/src/layouts/PrivateLayout/components/index.ts +0 -4
  27. package/src/layouts/PrivateLayout/context.tsx +10 -115
  28. package/src/layouts/PrivateLayout/geometry.ts +17 -0
  29. package/src/layouts/PrivateLayout/hooks/index.ts +2 -1
  30. package/src/layouts/PrivateLayout/hooks/useLayoutVisual.ts +4 -4
  31. package/src/layouts/PrivateLayout/hooks/useSidebarKeyboard.ts +33 -93
  32. package/src/layouts/PrivateLayout/hooks/useSidebarPeek.tsx +151 -0
  33. package/src/layouts/PrivateLayout/hooks/useSidebarWidth.ts +83 -0
  34. package/src/layouts/PrivateLayout/types.ts +13 -20
  35. package/src/layouts/PublicLayout/footers/DefaultFooter/DefaultFooter.tsx +3 -89
  36. package/src/layouts/PublicLayout/footers/DefaultFooter/ThemeModeControl.tsx +90 -0
  37. package/src/layouts/PublicLayout/primitives/DesktopDropdownPortal.tsx +47 -0
  38. package/src/layouts/PublicLayout/primitives/NavControls.tsx +1 -1
  39. package/src/layouts/PublicLayout/primitives/NavDesktopItems.tsx +2 -83
  40. package/src/layouts/PublicLayout/primitives/navDesktopStyles.ts +42 -0
  41. package/src/layouts/PublicLayout/shared/NavbarShell.tsx +4 -171
  42. package/src/layouts/PublicLayout/shared/index.ts +1 -1
  43. package/src/layouts/PublicLayout/shared/navbarShell.types.ts +109 -0
  44. package/src/layouts/PublicLayout/shared/navbarShellStyles.ts +69 -0
  45. package/src/layouts/SettingsLayout/README.md +23 -10
  46. package/src/layouts/SettingsLayout/SettingsDialog.tsx +27 -11
  47. package/src/layouts/SettingsLayout/SettingsForm.tsx +13 -9
  48. package/src/layouts/SettingsLayout/components/AccountMenuButton.tsx +83 -0
  49. package/src/layouts/SettingsLayout/components/ApiKeySection/ApiKeySection.tsx +9 -7
  50. package/src/layouts/SettingsLayout/components/ApiKeySection/context.tsx +6 -41
  51. package/src/layouts/SettingsLayout/components/AvatarSection.tsx +11 -3
  52. package/src/layouts/SettingsLayout/components/SettingsNav.tsx +5 -9
  53. package/src/layouts/SettingsLayout/components/SettingsNavItem.tsx +5 -7
  54. package/src/layouts/SettingsLayout/components/SettingsPanel.tsx +5 -10
  55. package/src/layouts/SettingsLayout/components/SettingsSearch.tsx +5 -3
  56. package/src/layouts/SettingsLayout/components/SettingsShell.tsx +14 -21
  57. package/src/layouts/SettingsLayout/components/TwoFactorSection/TwoFactorSection.tsx +63 -131
  58. package/src/layouts/SettingsLayout/components/TwoFactorSection/TwoFactorSetupDialog.tsx +35 -0
  59. package/src/layouts/SettingsLayout/components/index.ts +0 -1
  60. package/src/layouts/SettingsLayout/context/SettingsContext.tsx +5 -2
  61. package/src/layouts/SettingsLayout/hooks/index.ts +3 -0
  62. package/src/layouts/SettingsLayout/hooks/useAccountMenuItems.ts +69 -0
  63. package/src/layouts/SettingsLayout/hooks/useSettingsDialog.ts +6 -3
  64. package/src/layouts/SettingsLayout/i18n/index.ts +39 -0
  65. package/src/layouts/SettingsLayout/i18n/locales/ar.ts +66 -0
  66. package/src/layouts/SettingsLayout/i18n/locales/da.ts +66 -0
  67. package/src/layouts/SettingsLayout/i18n/locales/de.ts +66 -0
  68. package/src/layouts/SettingsLayout/i18n/locales/en.ts +66 -0
  69. package/src/layouts/SettingsLayout/i18n/locales/es.ts +66 -0
  70. package/src/layouts/SettingsLayout/i18n/locales/fr.ts +66 -0
  71. package/src/layouts/SettingsLayout/i18n/locales/it.ts +66 -0
  72. package/src/layouts/SettingsLayout/i18n/locales/ja.ts +66 -0
  73. package/src/layouts/SettingsLayout/i18n/locales/ko.ts +66 -0
  74. package/src/layouts/SettingsLayout/i18n/locales/nl.ts +66 -0
  75. package/src/layouts/SettingsLayout/i18n/locales/no.ts +66 -0
  76. package/src/layouts/SettingsLayout/i18n/locales/pl.ts +66 -0
  77. package/src/layouts/SettingsLayout/i18n/locales/ptBR.ts +66 -0
  78. package/src/layouts/SettingsLayout/i18n/locales/ru.ts +66 -0
  79. package/src/layouts/SettingsLayout/i18n/locales/sv.ts +66 -0
  80. package/src/layouts/SettingsLayout/i18n/locales/tr.ts +66 -0
  81. package/src/layouts/SettingsLayout/i18n/locales/zh.ts +66 -0
  82. package/src/layouts/SettingsLayout/i18n/types.ts +65 -0
  83. package/src/layouts/SettingsLayout/index.ts +3 -1
  84. package/src/layouts/SettingsLayout/sections/AccountSection.tsx +9 -4
  85. package/src/layouts/SettingsLayout/sections/DeleteAccountRow.tsx +4 -1
  86. package/src/layouts/SettingsLayout/sections/GeneralSection.tsx +25 -0
  87. package/src/layouts/SettingsLayout/sections/PreferencesRows.tsx +13 -5
  88. package/src/layouts/SettingsLayout/sections/builtins.tsx +34 -29
  89. package/src/layouts/SettingsLayout/sections/index.ts +2 -2
  90. package/src/layouts/SettingsLayout/store.ts +12 -0
  91. package/src/layouts/SettingsLayout/types.ts +12 -4
  92. package/src/layouts/_components/locale-switcher/LocaleSwitcher.tsx +1 -1
  93. package/src/layouts/types/layout.types.ts +5 -6
  94. package/src/{layouts/AppLayout → shared}/LayoutI18nProvider.tsx +1 -1
  95. package/src/styles/dashboard.css +10 -0
  96. package/src/layouts/PrivateLayout/density.ts +0 -48
  97. package/src/layouts/PrivateLayout/hooks/useHoverExpand.ts +0 -110
  98. package/src/layouts/PrivateLayout/hooks/useShellVisualState.ts +0 -130
  99. package/src/layouts/SettingsLayout/components/SettingsRailFooter.tsx +0 -74
  100. package/src/layouts/SettingsLayout/sections/SecuritySection.tsx +0 -15
@@ -0,0 +1,69 @@
1
+ 'use client';
2
+
3
+ import { LogOut, Settings as SettingsIcon } from 'lucide-react';
4
+ import { useMemo } from 'react';
5
+
6
+ import { useAuth } from '@djangocfg/api/auth';
7
+ import { useAppT } from '@djangocfg/i18n';
8
+ import type { MenuItem } from '@djangocfg/ui-core/components';
9
+
10
+ import { useLogout } from '../../../hooks';
11
+ import { useSettingsDialogStore } from '../store';
12
+
13
+ export interface UseAccountMenuItemsOptions {
14
+ /** Items placed between the settings shortcuts and Sign out (language, app links). */
15
+ extra?: MenuItem[];
16
+ /** Label above the items; defaults to the signed-in user's email. */
17
+ label?: string | null;
18
+ }
19
+
20
+ /**
21
+ * The user menu every host shares: email, Settings, a shortcut per Settings section (built-in and the host's),
22
+ * then Sign out. Feed it to `MenuBuilder` with any trigger, so a site's own chrome gets the same menu as
23
+ * `PrivateLayout`'s sidebar footer instead of a hand-rolled copy.
24
+ */
25
+ export function useAccountMenuItems({ extra, label }: UseAccountMenuItemsOptions = {}): MenuItem[] {
26
+ const { user } = useAuth();
27
+ const t = useAppT();
28
+ const handleLogout = useLogout();
29
+ const sections = useSettingsDialogStore((s) => s.sections);
30
+ const headerLabel = label === undefined ? (user?.email ?? null) : label;
31
+ const signOutLabel = t('layouts.profile.signOut');
32
+ const settingsLabel = t('layouts.profile.settings') || 'Settings';
33
+
34
+ return useMemo<MenuItem[]>(() => {
35
+ const items: MenuItem[] = [];
36
+ if (headerLabel) items.push({ kind: 'label', id: 'email', label: headerLabel });
37
+
38
+ items.push({
39
+ kind: 'item',
40
+ id: 'settings',
41
+ label: settingsLabel,
42
+ icon: SettingsIcon,
43
+ shortcut: '⇧⌘,',
44
+ onSelect: () => useSettingsDialogStore.getState().open(),
45
+ });
46
+ for (const section of sections) {
47
+ items.push({
48
+ kind: 'item',
49
+ id: `settings-${section.id}`,
50
+ label: section.label,
51
+ icon: section.icon,
52
+ onSelect: () => useSettingsDialogStore.getState().open(section.id),
53
+ });
54
+ }
55
+
56
+ if (extra?.length) items.push(...extra);
57
+
58
+ items.push({ kind: 'separator', id: 'sep-logout' });
59
+ items.push({
60
+ kind: 'item',
61
+ id: 'logout',
62
+ label: signOutLabel,
63
+ icon: LogOut,
64
+ variant: 'destructive',
65
+ onSelect: () => handleLogout(),
66
+ });
67
+ return items;
68
+ }, [headerLabel, settingsLabel, sections, extra, signOutLabel, handleLogout]);
69
+ }
@@ -15,7 +15,7 @@
15
15
 
16
16
  import { useCallback, useMemo } from 'react';
17
17
 
18
- import { useSettingsDialogStore } from '../store';
18
+ import { useSettingsDialogStore, type SettingsMenuSection } from '../store';
19
19
 
20
20
  export interface UseSettingsDialogReturn {
21
21
  /** Whether the dialog is currently open. */
@@ -30,6 +30,8 @@ export interface UseSettingsDialogReturn {
30
30
  toggle: () => void;
31
31
  /** Switch the active section. */
32
32
  setSection: (sectionId: string) => void;
33
+ /** The visible sections of the mounted dialog (built-in and the host's), in rail order: for menu shortcuts, `open(id)`. */
34
+ sections: SettingsMenuSection[];
33
35
  }
34
36
 
35
37
  export function useSettingsDialog(): UseSettingsDialogReturn {
@@ -39,6 +41,7 @@ export function useSettingsDialog(): UseSettingsDialogReturn {
39
41
  const storeClose = useSettingsDialogStore((s) => s.close);
40
42
  const storeToggle = useSettingsDialogStore((s) => s.toggle);
41
43
  const storeSetSection = useSettingsDialogStore((s) => s.setSection);
44
+ const sections = useSettingsDialogStore((s) => s.sections);
42
45
 
43
46
  const open = useCallback((sectionId?: string) => storeOpen(sectionId), [storeOpen]);
44
47
  const close = useCallback(() => storeClose(), [storeClose]);
@@ -46,7 +49,7 @@ export function useSettingsDialog(): UseSettingsDialogReturn {
46
49
  const setSection = useCallback((id: string) => storeSetSection(id), [storeSetSection]);
47
50
 
48
51
  return useMemo(
49
- () => ({ isOpen, activeSection, open, close, toggle, setSection }),
50
- [isOpen, activeSection, open, close, toggle, setSection],
52
+ () => ({ isOpen, activeSection, open, close, toggle, setSection, sections }),
53
+ [isOpen, activeSection, open, close, toggle, setSection, sections],
51
54
  );
52
55
  }
@@ -0,0 +1,39 @@
1
+ 'use client';
2
+
3
+ import { createCopy, type Locale } from '@djangocfg/i18n/copy';
4
+
5
+ import { ar } from './locales/ar';
6
+ import { da } from './locales/da';
7
+ import { de } from './locales/de';
8
+ import { en } from './locales/en';
9
+ import { es } from './locales/es';
10
+ import { fr } from './locales/fr';
11
+ import { it } from './locales/it';
12
+ import { ja } from './locales/ja';
13
+ import { ko } from './locales/ko';
14
+ import { nl } from './locales/nl';
15
+ import { no } from './locales/no';
16
+ import { pl } from './locales/pl';
17
+ import { ptBR } from './locales/ptBR';
18
+ import { ru } from './locales/ru';
19
+ import { sv } from './locales/sv';
20
+ import { tr } from './locales/tr';
21
+ import { zh } from './locales/zh';
22
+
23
+ import type { SettingsCopy } from './types';
24
+
25
+ export type { SettingsCopy } from './types';
26
+ export { fill } from '@djangocfg/i18n/copy';
27
+
28
+ /** Every bundled dictionary, typed complete over the shared `Locale` union. */
29
+ export const SETTINGS_DICTIONARIES: Readonly<Record<Locale, SettingsCopy>> = {
30
+ en, ru, ko, ja, de, fr, zh, it, es, nl, ar, tr, pl, sv, no, da,
31
+ 'pt-BR': ptBR,
32
+ };
33
+
34
+ /** Settings copy for the active language: the `@djangocfg/i18n` provider, else English. */
35
+ const kit = createCopy(SETTINGS_DICTIONARIES);
36
+ export const useSettingsCopy = kit.useCopy;
37
+
38
+ /** The bundled locale `useSettingsCopy` resolved to, for date formatting. */
39
+ export const useSettingsLocale = kit.useLocale;
@@ -0,0 +1,66 @@
1
+ import type { SettingsCopy } from '../types';
2
+
3
+ export const ar: SettingsCopy = {
4
+ nav: {
5
+ title: "الإعدادات",
6
+ platform: "المنصة",
7
+ account: "الحساب",
8
+ preferences: "التفضيلات",
9
+ apiKeys: "مفاتيح API",
10
+ apiKeysDescription: "أنشئ المفاتيح وأدرها للوصول البرمجي.",
11
+ },
12
+ prefs: {
13
+ general: "عام",
14
+ other: "أخرى",
15
+ language: "اللغة",
16
+ timeZone: "المنطقة الزمنية",
17
+ theme: "المظهر",
18
+ },
19
+ account: {
20
+ dangerZone: "منطقة الخطر",
21
+ deleteAccountDescription: "احذف حسابك وجميع البيانات المرتبطة به نهائيًا.",
22
+ changeAvatar: "تغيير الصورة الرمزية",
23
+ },
24
+ search: {
25
+ clear: "مسح البحث",
26
+ },
27
+ security: {
28
+ title: "الأمان",
29
+ twoFactor: "المصادقة الثنائية",
30
+ on: "مفعّلة",
31
+ off: "متوقفة · تضيف خطوة ثانية عند تسجيل الدخول",
32
+ checking: "جارٍ التحقق…",
33
+ unavailable: "غير متاحة",
34
+ turnOn: "تفعيل",
35
+ turnOff: "إيقاف",
36
+ setupTitle: "إعداد المصادقة الثنائية",
37
+ setupHint: "امسح رمز QR بتطبيق المصادقة (Google Authenticator أو Authy وغيرهما)",
38
+ cancel: "إلغاء",
39
+ deviceAdded: "أُضيف في {{date}}",
40
+ devicePrimary: "أساسي",
41
+ disableTitle: "إيقاف المصادقة الثنائية؟",
42
+ disableHint: "أدخل الرمز المكوّن من 6 أرقام من تطبيق المصادقة للتأكيد. سيجعل ذلك حسابك أقل أمانًا.",
43
+ disabling: "جارٍ الإيقاف…",
44
+ disable: "إيقاف المصادقة الثنائية",
45
+ },
46
+ apiKey: {
47
+ title: "مفتاح API",
48
+ description: "مفتاح API الشخصي للوصول البرمجي",
49
+ created: "تاريخ الإنشاء",
50
+ reissued: "آخر إعادة إصدار",
51
+ neverReissued: "لم يُعاد إصداره قط",
52
+ regenerate: "إعادة إنشاء مفتاح API",
53
+ confirmRegenerate: "انقر للتأكيد",
54
+ regenerating: "جارٍ إعادة الإنشاء…",
55
+ regenerated: "تمت إعادة إنشاء مفتاح API",
56
+ failedToRegenerate: "تعذّرت إعادة إنشاء مفتاح API",
57
+ done: "تم",
58
+ test: "اختبار مفتاح API",
59
+ testing: "جارٍ الاختبار…",
60
+ testSuccess: "مفتاح API صالح",
61
+ testFailed: "فشل اختبار مفتاح API",
62
+ keyRow: "مفتاح API",
63
+ active: "نشط",
64
+ freshKey: "هذا هو مفتاح API الجديد، انسخه الآن. سيُخفى عند مغادرة هذه الصفحة.",
65
+ },
66
+ };
@@ -0,0 +1,66 @@
1
+ import type { SettingsCopy } from '../types';
2
+
3
+ export const da: SettingsCopy = {
4
+ nav: {
5
+ title: "Indstillinger",
6
+ platform: "Platform",
7
+ account: "Konto",
8
+ preferences: "Indstillinger",
9
+ apiKeys: "API-nøgler",
10
+ apiKeysDescription: "Opret og administrer nøgler til programmatisk adgang.",
11
+ },
12
+ prefs: {
13
+ general: "Generelt",
14
+ other: "Andet",
15
+ language: "Sprog",
16
+ timeZone: "Tidszone",
17
+ theme: "Tema",
18
+ },
19
+ account: {
20
+ dangerZone: "Farezone",
21
+ deleteAccountDescription: "Slet din konto og alle tilknyttede data permanent.",
22
+ changeAvatar: "Skift avatar",
23
+ },
24
+ search: {
25
+ clear: "Ryd søgning",
26
+ },
27
+ security: {
28
+ title: "Sikkerhed",
29
+ twoFactor: "Tofaktorgodkendelse",
30
+ on: "Til",
31
+ off: "Fra · tilføjer et ekstra trin ved login",
32
+ checking: "Kontrollerer…",
33
+ unavailable: "Ikke tilgængelig",
34
+ turnOn: "Slå til",
35
+ turnOff: "Slå fra",
36
+ setupTitle: "Opsæt tofaktorgodkendelse",
37
+ setupHint: "Scan QR-koden med din godkendelsesapp (Google Authenticator, Authy osv.)",
38
+ cancel: "Annuller",
39
+ deviceAdded: "Tilføjet {{date}}",
40
+ devicePrimary: "Primær",
41
+ disableTitle: "Slå tofaktorgodkendelse fra?",
42
+ disableHint: "Indtast den 6-cifrede kode fra din godkendelsesapp for at bekræfte. Din konto bliver mindre sikker.",
43
+ disabling: "Slår fra…",
44
+ disable: "Slå 2FA fra",
45
+ },
46
+ apiKey: {
47
+ title: "API-nøgle",
48
+ description: "Din personlige API-nøgle til programmatisk adgang",
49
+ created: "Oprettet",
50
+ reissued: "Sidst udstedt igen",
51
+ neverReissued: "Aldrig udstedt igen",
52
+ regenerate: "Generer API-nøgle igen",
53
+ confirmRegenerate: "Klik for at bekræfte",
54
+ regenerating: "Genererer igen…",
55
+ regenerated: "API-nøglen blev genereret igen",
56
+ failedToRegenerate: "API-nøglen kunne ikke genereres igen",
57
+ done: "Færdig",
58
+ test: "Test API-nøgle",
59
+ testing: "Tester…",
60
+ testSuccess: "API-nøglen er gyldig",
61
+ testFailed: "API-nøgletesten mislykkedes",
62
+ keyRow: "API-nøgle",
63
+ active: "Aktiv",
64
+ freshKey: "Det er din nye API-nøgle – kopier den nu. Den skjules, når du forlader siden.",
65
+ },
66
+ };
@@ -0,0 +1,66 @@
1
+ import type { SettingsCopy } from '../types';
2
+
3
+ export const de: SettingsCopy = {
4
+ nav: {
5
+ title: "Einstellungen",
6
+ platform: "Plattform",
7
+ account: "Konto",
8
+ preferences: "Einstellungen",
9
+ apiKeys: "API-Schlüssel",
10
+ apiKeysDescription: "Schlüssel für den programmatischen Zugriff erstellen und verwalten.",
11
+ },
12
+ prefs: {
13
+ general: "Allgemein",
14
+ other: "Sonstiges",
15
+ language: "Sprache",
16
+ timeZone: "Zeitzone",
17
+ theme: "Design",
18
+ },
19
+ account: {
20
+ dangerZone: "Gefahrenbereich",
21
+ deleteAccountDescription: "Konto und alle zugehörigen Daten dauerhaft löschen.",
22
+ changeAvatar: "Avatar ändern",
23
+ },
24
+ search: {
25
+ clear: "Suche löschen",
26
+ },
27
+ security: {
28
+ title: "Sicherheit",
29
+ twoFactor: "Zwei-Faktor-Authentifizierung",
30
+ on: "An",
31
+ off: "Aus · fügt beim Anmelden einen zweiten Schritt hinzu",
32
+ checking: "Wird geprüft…",
33
+ unavailable: "Nicht verfügbar",
34
+ turnOn: "Einschalten",
35
+ turnOff: "Ausschalten",
36
+ setupTitle: "Zwei-Faktor-Authentifizierung einrichten",
37
+ setupHint: "Scannen Sie den QR-Code mit Ihrer Authenticator-App (Google Authenticator, Authy usw.)",
38
+ cancel: "Abbrechen",
39
+ deviceAdded: "Hinzugefügt am {{date}}",
40
+ devicePrimary: "Primär",
41
+ disableTitle: "Zwei-Faktor-Authentifizierung deaktivieren?",
42
+ disableHint: "Geben Sie zur Bestätigung den 6-stelligen Code Ihrer Authenticator-App ein. Ihr Konto ist dann weniger sicher.",
43
+ disabling: "Wird deaktiviert…",
44
+ disable: "2FA deaktivieren",
45
+ },
46
+ apiKey: {
47
+ title: "API-Schlüssel",
48
+ description: "Ihr persönlicher API-Schlüssel für den programmatischen Zugriff",
49
+ created: "Erstellt",
50
+ reissued: "Zuletzt neu ausgestellt",
51
+ neverReissued: "Nie neu ausgestellt",
52
+ regenerate: "API-Schlüssel neu erzeugen",
53
+ confirmRegenerate: "Zum Bestätigen klicken",
54
+ regenerating: "Wird neu erzeugt…",
55
+ regenerated: "API-Schlüssel neu erzeugt",
56
+ failedToRegenerate: "API-Schlüssel konnte nicht neu erzeugt werden",
57
+ done: "Fertig",
58
+ test: "API-Schlüssel testen",
59
+ testing: "Wird getestet…",
60
+ testSuccess: "API-Schlüssel ist gültig",
61
+ testFailed: "API-Schlüssel-Test fehlgeschlagen",
62
+ keyRow: "API-Schlüssel",
63
+ active: "Aktiv",
64
+ freshKey: "Das ist Ihr neuer API-Schlüssel – kopieren Sie ihn jetzt. Beim Verlassen der Seite wird er ausgeblendet.",
65
+ },
66
+ };
@@ -0,0 +1,66 @@
1
+ import type { SettingsCopy } from '../types';
2
+
3
+ export const en: SettingsCopy = {
4
+ nav: {
5
+ title: "Settings",
6
+ platform: "Platform",
7
+ account: "Account",
8
+ preferences: "Preferences",
9
+ apiKeys: "API keys",
10
+ apiKeysDescription: "Create and manage keys for programmatic access.",
11
+ },
12
+ prefs: {
13
+ general: "General",
14
+ other: "Other",
15
+ language: "Language",
16
+ timeZone: "Time zone",
17
+ theme: "Theme",
18
+ },
19
+ account: {
20
+ dangerZone: "Danger zone",
21
+ deleteAccountDescription: "Permanently remove your account and all associated data.",
22
+ changeAvatar: "Change avatar",
23
+ },
24
+ search: {
25
+ clear: "Clear search",
26
+ },
27
+ security: {
28
+ title: "Security",
29
+ twoFactor: "Two-factor authentication",
30
+ on: "On",
31
+ off: "Off · adds a second step when you sign in",
32
+ checking: "Checking…",
33
+ unavailable: "Unavailable",
34
+ turnOn: "Turn on",
35
+ turnOff: "Turn off",
36
+ setupTitle: "Set up two-factor authentication",
37
+ setupHint: "Scan the QR code with your authenticator app (Google Authenticator, Authy, etc.)",
38
+ cancel: "Cancel",
39
+ deviceAdded: "Added {{date}}",
40
+ devicePrimary: "Primary",
41
+ disableTitle: "Disable two-factor authentication?",
42
+ disableHint: "Enter the 6-digit code from your authenticator app to confirm. This will make your account less secure.",
43
+ disabling: "Disabling…",
44
+ disable: "Disable 2FA",
45
+ },
46
+ apiKey: {
47
+ title: "API key",
48
+ description: "Your personal API key for programmatic access",
49
+ created: "Created",
50
+ reissued: "Last reissued",
51
+ neverReissued: "Never reissued",
52
+ regenerate: "Regenerate API key",
53
+ confirmRegenerate: "Click to confirm",
54
+ regenerating: "Regenerating…",
55
+ regenerated: "API key regenerated",
56
+ failedToRegenerate: "Failed to regenerate API key",
57
+ done: "Done",
58
+ test: "Test API key",
59
+ testing: "Testing…",
60
+ testSuccess: "API key is valid",
61
+ testFailed: "API key test failed",
62
+ keyRow: "API key",
63
+ active: "Active",
64
+ freshKey: "This is your new API key — copy it now. It will be masked when you leave this page.",
65
+ },
66
+ };
@@ -0,0 +1,66 @@
1
+ import type { SettingsCopy } from '../types';
2
+
3
+ export const es: SettingsCopy = {
4
+ nav: {
5
+ title: "Ajustes",
6
+ platform: "Plataforma",
7
+ account: "Cuenta",
8
+ preferences: "Preferencias",
9
+ apiKeys: "Claves API",
10
+ apiKeysDescription: "Crea y gestiona claves para el acceso programático.",
11
+ },
12
+ prefs: {
13
+ general: "General",
14
+ other: "Otros",
15
+ language: "Idioma",
16
+ timeZone: "Zona horaria",
17
+ theme: "Tema",
18
+ },
19
+ account: {
20
+ dangerZone: "Zona de peligro",
21
+ deleteAccountDescription: "Elimina de forma permanente tu cuenta y todos los datos asociados.",
22
+ changeAvatar: "Cambiar avatar",
23
+ },
24
+ search: {
25
+ clear: "Borrar búsqueda",
26
+ },
27
+ security: {
28
+ title: "Seguridad",
29
+ twoFactor: "Autenticación en dos pasos",
30
+ on: "Activada",
31
+ off: "Desactivada · añade un segundo paso al iniciar sesión",
32
+ checking: "Comprobando…",
33
+ unavailable: "No disponible",
34
+ turnOn: "Activar",
35
+ turnOff: "Desactivar",
36
+ setupTitle: "Configurar la autenticación en dos pasos",
37
+ setupHint: "Escanea el código QR con tu aplicación de autenticación (Google Authenticator, Authy, etc.)",
38
+ cancel: "Cancelar",
39
+ deviceAdded: "Añadido el {{date}}",
40
+ devicePrimary: "Principal",
41
+ disableTitle: "¿Desactivar la autenticación en dos pasos?",
42
+ disableHint: "Introduce el código de 6 dígitos de tu aplicación de autenticación para confirmar. Tu cuenta será menos segura.",
43
+ disabling: "Desactivando…",
44
+ disable: "Desactivar 2FA",
45
+ },
46
+ apiKey: {
47
+ title: "Clave API",
48
+ description: "Tu clave API personal para el acceso programático",
49
+ created: "Creada",
50
+ reissued: "Última regeneración",
51
+ neverReissued: "Nunca regenerada",
52
+ regenerate: "Regenerar clave API",
53
+ confirmRegenerate: "Haz clic para confirmar",
54
+ regenerating: "Regenerando…",
55
+ regenerated: "Clave API regenerada",
56
+ failedToRegenerate: "No se pudo regenerar la clave API",
57
+ done: "Hecho",
58
+ test: "Probar clave API",
59
+ testing: "Probando…",
60
+ testSuccess: "La clave API es válida",
61
+ testFailed: "Falló la prueba de la clave API",
62
+ keyRow: "Clave API",
63
+ active: "Activa",
64
+ freshKey: "Esta es tu nueva clave API: cópiala ahora. Se ocultará al salir de esta página.",
65
+ },
66
+ };
@@ -0,0 +1,66 @@
1
+ import type { SettingsCopy } from '../types';
2
+
3
+ export const fr: SettingsCopy = {
4
+ nav: {
5
+ title: "Paramètres",
6
+ platform: "Plateforme",
7
+ account: "Compte",
8
+ preferences: "Préférences",
9
+ apiKeys: "Clés API",
10
+ apiKeysDescription: "Créez et gérez des clés pour l'accès programmatique.",
11
+ },
12
+ prefs: {
13
+ general: "Général",
14
+ other: "Autre",
15
+ language: "Langue",
16
+ timeZone: "Fuseau horaire",
17
+ theme: "Thème",
18
+ },
19
+ account: {
20
+ dangerZone: "Zone de danger",
21
+ deleteAccountDescription: "Supprimer définitivement votre compte et toutes les données associées.",
22
+ changeAvatar: "Changer d'avatar",
23
+ },
24
+ search: {
25
+ clear: "Effacer la recherche",
26
+ },
27
+ security: {
28
+ title: "Sécurité",
29
+ twoFactor: "Authentification à deux facteurs",
30
+ on: "Activée",
31
+ off: "Désactivée · ajoute une deuxième étape à la connexion",
32
+ checking: "Vérification…",
33
+ unavailable: "Indisponible",
34
+ turnOn: "Activer",
35
+ turnOff: "Désactiver",
36
+ setupTitle: "Configurer l'authentification à deux facteurs",
37
+ setupHint: "Scannez le code QR avec votre application d'authentification (Google Authenticator, Authy, etc.)",
38
+ cancel: "Annuler",
39
+ deviceAdded: "Ajouté le {{date}}",
40
+ devicePrimary: "Principal",
41
+ disableTitle: "Désactiver l'authentification à deux facteurs ?",
42
+ disableHint: "Saisissez le code à 6 chiffres de votre application d'authentification pour confirmer. Votre compte sera moins sécurisé.",
43
+ disabling: "Désactivation…",
44
+ disable: "Désactiver la 2FA",
45
+ },
46
+ apiKey: {
47
+ title: "Clé API",
48
+ description: "Votre clé API personnelle pour l'accès programmatique",
49
+ created: "Créée",
50
+ reissued: "Dernière régénération",
51
+ neverReissued: "Jamais régénérée",
52
+ regenerate: "Régénérer la clé API",
53
+ confirmRegenerate: "Cliquez pour confirmer",
54
+ regenerating: "Régénération…",
55
+ regenerated: "Clé API régénérée",
56
+ failedToRegenerate: "Échec de la régénération de la clé API",
57
+ done: "Terminé",
58
+ test: "Tester la clé API",
59
+ testing: "Test en cours…",
60
+ testSuccess: "La clé API est valide",
61
+ testFailed: "Échec du test de la clé API",
62
+ keyRow: "Clé API",
63
+ active: "Active",
64
+ freshKey: "Voici votre nouvelle clé API : copiez-la maintenant. Elle sera masquée lorsque vous quitterez cette page.",
65
+ },
66
+ };
@@ -0,0 +1,66 @@
1
+ import type { SettingsCopy } from '../types';
2
+
3
+ export const it: SettingsCopy = {
4
+ nav: {
5
+ title: "Impostazioni",
6
+ platform: "Piattaforma",
7
+ account: "Account",
8
+ preferences: "Preferenze",
9
+ apiKeys: "Chiavi API",
10
+ apiKeysDescription: "Crea e gestisci le chiavi per l'accesso programmatico.",
11
+ },
12
+ prefs: {
13
+ general: "Generali",
14
+ other: "Altro",
15
+ language: "Lingua",
16
+ timeZone: "Fuso orario",
17
+ theme: "Tema",
18
+ },
19
+ account: {
20
+ dangerZone: "Zona pericolosa",
21
+ deleteAccountDescription: "Elimina definitivamente il tuo account e tutti i dati associati.",
22
+ changeAvatar: "Cambia avatar",
23
+ },
24
+ search: {
25
+ clear: "Cancella ricerca",
26
+ },
27
+ security: {
28
+ title: "Sicurezza",
29
+ twoFactor: "Autenticazione a due fattori",
30
+ on: "Attiva",
31
+ off: "Disattivata · aggiunge un secondo passaggio all'accesso",
32
+ checking: "Verifica in corso…",
33
+ unavailable: "Non disponibile",
34
+ turnOn: "Attiva",
35
+ turnOff: "Disattiva",
36
+ setupTitle: "Configura l'autenticazione a due fattori",
37
+ setupHint: "Scansiona il codice QR con la tua app di autenticazione (Google Authenticator, Authy, ecc.)",
38
+ cancel: "Annulla",
39
+ deviceAdded: "Aggiunto il {{date}}",
40
+ devicePrimary: "Principale",
41
+ disableTitle: "Disattivare l'autenticazione a due fattori?",
42
+ disableHint: "Inserisci il codice a 6 cifre della tua app di autenticazione per confermare. Il tuo account sarà meno sicuro.",
43
+ disabling: "Disattivazione…",
44
+ disable: "Disattiva 2FA",
45
+ },
46
+ apiKey: {
47
+ title: "Chiave API",
48
+ description: "La tua chiave API personale per l'accesso programmatico",
49
+ created: "Creata",
50
+ reissued: "Ultima rigenerazione",
51
+ neverReissued: "Mai rigenerata",
52
+ regenerate: "Rigenera chiave API",
53
+ confirmRegenerate: "Fai clic per confermare",
54
+ regenerating: "Rigenerazione…",
55
+ regenerated: "Chiave API rigenerata",
56
+ failedToRegenerate: "Impossibile rigenerare la chiave API",
57
+ done: "Fatto",
58
+ test: "Verifica chiave API",
59
+ testing: "Verifica in corso…",
60
+ testSuccess: "La chiave API è valida",
61
+ testFailed: "Verifica della chiave API non riuscita",
62
+ keyRow: "Chiave API",
63
+ active: "Attiva",
64
+ freshKey: "Questa è la tua nuova chiave API: copiala ora. Verrà nascosta quando lasci questa pagina.",
65
+ },
66
+ };
@@ -0,0 +1,66 @@
1
+ import type { SettingsCopy } from '../types';
2
+
3
+ export const ja: SettingsCopy = {
4
+ nav: {
5
+ title: "設定",
6
+ platform: "プラットフォーム",
7
+ account: "アカウント",
8
+ preferences: "設定",
9
+ apiKeys: "APIキー",
10
+ apiKeysDescription: "プログラムからアクセスするためのキーを作成・管理します。",
11
+ },
12
+ prefs: {
13
+ general: "一般",
14
+ other: "その他",
15
+ language: "言語",
16
+ timeZone: "タイムゾーン",
17
+ theme: "テーマ",
18
+ },
19
+ account: {
20
+ dangerZone: "危険な操作",
21
+ deleteAccountDescription: "アカウントと関連するすべてのデータを完全に削除します。",
22
+ changeAvatar: "アバターを変更",
23
+ },
24
+ search: {
25
+ clear: "検索をクリア",
26
+ },
27
+ security: {
28
+ title: "セキュリティ",
29
+ twoFactor: "2段階認証",
30
+ on: "オン",
31
+ off: "オフ · ログイン時に2番目のステップを追加します",
32
+ checking: "確認中…",
33
+ unavailable: "利用できません",
34
+ turnOn: "オンにする",
35
+ turnOff: "オフにする",
36
+ setupTitle: "2段階認証を設定",
37
+ setupHint: "認証アプリ(Google Authenticator、Authy など)でQRコードをスキャンしてください",
38
+ cancel: "キャンセル",
39
+ deviceAdded: "{{date}} に追加",
40
+ devicePrimary: "プライマリ",
41
+ disableTitle: "2段階認証を無効にしますか?",
42
+ disableHint: "確認のため、認証アプリの6桁のコードを入力してください。アカウントの安全性が低下します。",
43
+ disabling: "無効化中…",
44
+ disable: "2段階認証を無効にする",
45
+ },
46
+ apiKey: {
47
+ title: "APIキー",
48
+ description: "プログラムからアクセスするための個人用APIキー",
49
+ created: "作成日",
50
+ reissued: "最終再発行",
51
+ neverReissued: "再発行なし",
52
+ regenerate: "APIキーを再発行",
53
+ confirmRegenerate: "クリックして確認",
54
+ regenerating: "再発行中…",
55
+ regenerated: "APIキーを再発行しました",
56
+ failedToRegenerate: "APIキーを再発行できませんでした",
57
+ done: "完了",
58
+ test: "APIキーをテスト",
59
+ testing: "テスト中…",
60
+ testSuccess: "APIキーは有効です",
61
+ testFailed: "APIキーのテストに失敗しました",
62
+ keyRow: "APIキー",
63
+ active: "有効",
64
+ freshKey: "これが新しいAPIキーです。今すぐコピーしてください。このページを離れると非表示になります。",
65
+ },
66
+ };