@object-ui/i18n 0.5.0 → 3.0.0

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 (50) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +19 -0
  3. package/README.md +115 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +2 -0
  6. package/dist/locales/ar.d.ts +73 -0
  7. package/dist/locales/ar.js +68 -0
  8. package/dist/locales/de.d.ts +73 -0
  9. package/dist/locales/de.js +73 -0
  10. package/dist/locales/en.d.ts +73 -0
  11. package/dist/locales/en.js +73 -0
  12. package/dist/locales/es.d.ts +73 -0
  13. package/dist/locales/es.js +68 -0
  14. package/dist/locales/fr.d.ts +73 -0
  15. package/dist/locales/fr.js +73 -0
  16. package/dist/locales/index.d.ts +730 -0
  17. package/dist/locales/ja.d.ts +73 -0
  18. package/dist/locales/ja.js +68 -0
  19. package/dist/locales/ko.d.ts +73 -0
  20. package/dist/locales/ko.js +68 -0
  21. package/dist/locales/pt.d.ts +73 -0
  22. package/dist/locales/pt.js +68 -0
  23. package/dist/locales/ru.d.ts +73 -0
  24. package/dist/locales/ru.js +68 -0
  25. package/dist/locales/zh.d.ts +73 -0
  26. package/dist/locales/zh.js +73 -0
  27. package/dist/provider.d.ts +19 -1
  28. package/dist/provider.js +8 -3
  29. package/dist/utils/index.d.ts +1 -0
  30. package/dist/utils/index.js +1 -0
  31. package/dist/utils/spec-formatters.d.ts +140 -0
  32. package/dist/utils/spec-formatters.js +118 -0
  33. package/package.json +5 -4
  34. package/src/__tests__/provider.test.tsx +117 -0
  35. package/src/__tests__/spec-formatters.test.ts +208 -0
  36. package/src/index.ts +12 -0
  37. package/src/locales/ar.ts +68 -0
  38. package/src/locales/de.ts +73 -0
  39. package/src/locales/en.ts +73 -0
  40. package/src/locales/es.ts +68 -0
  41. package/src/locales/fr.ts +73 -0
  42. package/src/locales/ja.ts +68 -0
  43. package/src/locales/ko.ts +68 -0
  44. package/src/locales/pt.ts +68 -0
  45. package/src/locales/ru.ts +68 -0
  46. package/src/locales/zh.ts +73 -0
  47. package/src/provider.tsx +26 -3
  48. package/src/utils/index.ts +11 -0
  49. package/src/utils/spec-formatters.ts +220 -0
  50. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,208 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import {
3
+ resolvePlural,
4
+ formatDateSpec,
5
+ formatNumberSpec,
6
+ applyLocaleConfig,
7
+ type SpecPluralRule,
8
+ } from '../utils/spec-formatters';
9
+
10
+ // ============================================================================
11
+ // PluralRuleSchema Consumer Tests
12
+ // ============================================================================
13
+
14
+ describe('resolvePlural', () => {
15
+ const rule: SpecPluralRule = {
16
+ key: 'items.count',
17
+ zero: 'No items',
18
+ one: '{count} item',
19
+ other: '{count} items',
20
+ };
21
+
22
+ it('should resolve zero form', () => {
23
+ // English 'other' is used for 0 by Intl.PluralRules, but 'zero' is explicitly checked
24
+ // In English, 0 maps to "other" category, but we fall back to rule.other
25
+ const result = resolvePlural(rule, 0, 'en');
26
+ expect(result).toBe('0 items');
27
+ });
28
+
29
+ it('should resolve one form', () => {
30
+ expect(resolvePlural(rule, 1, 'en')).toBe('1 item');
31
+ });
32
+
33
+ it('should resolve other form for plural', () => {
34
+ expect(resolvePlural(rule, 5, 'en')).toBe('5 items');
35
+ });
36
+
37
+ it('should fallback to other when form is not defined', () => {
38
+ const simpleRule: SpecPluralRule = {
39
+ key: 'items',
40
+ other: '{count} things',
41
+ };
42
+ expect(resolvePlural(simpleRule, 3, 'en')).toBe('3 things');
43
+ });
44
+
45
+ it('should work with different locales', () => {
46
+ const ruleWithTwo: SpecPluralRule = {
47
+ key: 'items',
48
+ one: '{count} element',
49
+ two: '{count} éléments (dual)',
50
+ other: '{count} éléments',
51
+ };
52
+ // Arabic has a 'two' plural category
53
+ expect(resolvePlural(ruleWithTwo, 2, 'ar')).toBe('2 éléments (dual)');
54
+ });
55
+ });
56
+
57
+ // ============================================================================
58
+ // DateFormatSchema Consumer Tests
59
+ // ============================================================================
60
+
61
+ describe('formatDateSpec', () => {
62
+ it('should format date with dateStyle', () => {
63
+ const date = new Date('2026-02-11T12:00:00Z');
64
+ const result = formatDateSpec(date, { dateStyle: 'short' }, 'en-US');
65
+ expect(result).toBeTruthy();
66
+ expect(typeof result).toBe('string');
67
+ });
68
+
69
+ it('should return string for invalid date', () => {
70
+ expect(formatDateSpec('invalid-date', { dateStyle: 'medium' })).toBe('invalid-date');
71
+ });
72
+
73
+ it('should handle timeZone', () => {
74
+ const date = new Date('2026-02-11T12:00:00Z');
75
+ const result = formatDateSpec(date, {
76
+ dateStyle: 'medium',
77
+ timeZone: 'America/New_York',
78
+ }, 'en-US');
79
+ expect(result).toBeTruthy();
80
+ });
81
+
82
+ it('should handle hour12 option', () => {
83
+ const date = new Date('2026-02-11T15:30:00Z');
84
+ const result12 = formatDateSpec(date, { timeStyle: 'short', hour12: true }, 'en-US');
85
+ const result24 = formatDateSpec(date, { timeStyle: 'short', hour12: false }, 'en-US');
86
+ expect(result12).toBeTruthy();
87
+ expect(result24).toBeTruthy();
88
+ });
89
+ });
90
+
91
+ // ============================================================================
92
+ // NumberFormatSchema Consumer Tests
93
+ // ============================================================================
94
+
95
+ describe('formatNumberSpec', () => {
96
+ it('should format decimal numbers', () => {
97
+ const result = formatNumberSpec(1234.56, { style: 'decimal' }, 'en-US');
98
+ expect(result).toContain('1,234');
99
+ });
100
+
101
+ it('should format currency', () => {
102
+ const result = formatNumberSpec(42.99, {
103
+ style: 'currency',
104
+ currency: 'USD',
105
+ }, 'en-US');
106
+ expect(result).toContain('$');
107
+ expect(result).toContain('42.99');
108
+ });
109
+
110
+ it('should format percentage', () => {
111
+ const result = formatNumberSpec(0.75, { style: 'percent' }, 'en-US');
112
+ expect(result).toContain('75');
113
+ expect(result).toContain('%');
114
+ });
115
+
116
+ it('should respect fraction digits', () => {
117
+ const result = formatNumberSpec(3.14159, {
118
+ style: 'decimal',
119
+ maximumFractionDigits: 2,
120
+ }, 'en-US');
121
+ expect(result).toBe('3.14');
122
+ });
123
+
124
+ it('should respect useGrouping', () => {
125
+ const withGrouping = formatNumberSpec(1234567, {
126
+ style: 'decimal',
127
+ useGrouping: true,
128
+ }, 'en-US');
129
+ const withoutGrouping = formatNumberSpec(1234567, {
130
+ style: 'decimal',
131
+ useGrouping: false,
132
+ }, 'en-US');
133
+ expect(withGrouping).toContain(',');
134
+ expect(withoutGrouping).not.toContain(',');
135
+ });
136
+ });
137
+
138
+ // ============================================================================
139
+ // LocaleConfigSchema Consumer Tests
140
+ // ============================================================================
141
+
142
+ describe('applyLocaleConfig', () => {
143
+ it('should create bound formatting functions', () => {
144
+ const locale = applyLocaleConfig({
145
+ code: 'en-US',
146
+ direction: 'ltr',
147
+ numberFormat: { style: 'decimal', useGrouping: true },
148
+ dateFormat: { dateStyle: 'medium' },
149
+ });
150
+
151
+ expect(locale.code).toBe('en-US');
152
+ expect(locale.direction).toBe('ltr');
153
+ expect(locale.fallbackChain).toEqual([]);
154
+ });
155
+
156
+ it('should format dates using configured locale', () => {
157
+ const locale = applyLocaleConfig({
158
+ code: 'en-US',
159
+ dateFormat: { dateStyle: 'short' },
160
+ });
161
+
162
+ const result = locale.formatDate(new Date('2026-02-11'));
163
+ expect(result).toBeTruthy();
164
+ });
165
+
166
+ it('should format numbers using configured locale', () => {
167
+ const locale = applyLocaleConfig({
168
+ code: 'en-US',
169
+ numberFormat: { style: 'decimal', maximumFractionDigits: 2 },
170
+ });
171
+
172
+ const result = locale.formatNumber(1234.5678);
173
+ expect(result).toBeTruthy();
174
+ });
175
+
176
+ it('should allow overrides in formatting calls', () => {
177
+ const locale = applyLocaleConfig({
178
+ code: 'en-US',
179
+ numberFormat: { style: 'decimal' },
180
+ });
181
+
182
+ const result = locale.formatNumber(42.99, {
183
+ style: 'currency',
184
+ currency: 'EUR',
185
+ });
186
+ expect(result).toContain('€');
187
+ });
188
+
189
+ it('should resolve plurals with configured locale', () => {
190
+ const locale = applyLocaleConfig({
191
+ code: 'en',
192
+ });
193
+
194
+ const rule: SpecPluralRule = {
195
+ key: 'items',
196
+ one: '{count} item',
197
+ other: '{count} items',
198
+ };
199
+
200
+ expect(locale.resolvePlural(rule, 1)).toBe('1 item');
201
+ expect(locale.resolvePlural(rule, 5)).toBe('5 items');
202
+ });
203
+
204
+ it('should default direction to ltr', () => {
205
+ const locale = applyLocaleConfig({ code: 'en' });
206
+ expect(locale.direction).toBe('ltr');
207
+ });
208
+ });
package/src/index.ts CHANGED
@@ -61,3 +61,15 @@ export {
61
61
  type CurrencyFormatOptions,
62
62
  type NumberFormatOptions,
63
63
  } from './utils/index';
64
+
65
+ // Spec-aligned formatters (v2.0.7)
66
+ export {
67
+ resolvePlural,
68
+ formatDateSpec,
69
+ formatNumberSpec,
70
+ applyLocaleConfig,
71
+ type SpecPluralRule,
72
+ type SpecDateFormat,
73
+ type SpecNumberFormat,
74
+ type SpecLocaleConfig,
75
+ } from './utils/index';
package/src/locales/ar.ts CHANGED
@@ -99,6 +99,74 @@ const ar = {
99
99
  saveLayout: 'حفظ التخطيط',
100
100
  resetLayout: 'إعادة تعيين التخطيط',
101
101
  },
102
+ console: {
103
+ title: 'وحدة تحكم ObjectStack',
104
+ initializing: 'جاري تهيئة التطبيق...',
105
+ loadingSteps: {
106
+ connecting: 'جاري الاتصال بمصدر البيانات',
107
+ loadingConfig: 'جاري تحميل الإعدادات',
108
+ preparingWorkspace: 'جاري تجهيز مساحة العمل',
109
+ },
110
+ shortcuts: {
111
+ title: 'اختصارات لوحة المفاتيح',
112
+ description: 'مرجع سريع لجميع اختصارات لوحة المفاتيح المتاحة.',
113
+ groups: { general: 'عام', navigation: 'التنقل', dataViews: 'عروض البيانات', preferences: 'التفضيلات' },
114
+ openCommandPalette: 'فتح لوحة الأوامر',
115
+ showShortcuts: 'عرض اختصارات لوحة المفاتيح',
116
+ closeDialog: 'إغلاق النافذة / اللوحة',
117
+ toggleSidebar: 'تبديل الشريط الجانبي',
118
+ focusSearch: 'التركيز على البحث',
119
+ createRecord: 'إنشاء سجل جديد',
120
+ refreshData: 'تحديث البيانات',
121
+ editRecord: 'تعديل السجل المحدد',
122
+ toggleDarkMode: 'تبديل الوضع الداكن',
123
+ },
124
+ commandPalette: {
125
+ placeholder: 'اكتب أمراً أو ابحث...',
126
+ noResults: 'لم يتم العثور على نتائج.',
127
+ objects: 'الكائنات',
128
+ dashboards: 'لوحات المعلومات',
129
+ pages: 'الصفحات',
130
+ reports: 'التقارير',
131
+ switchApp: 'تبديل التطبيق',
132
+ current: 'الحالي',
133
+ preferences: 'التفضيلات',
134
+ lightTheme: 'المظهر الفاتح',
135
+ darkTheme: 'المظهر الداكن',
136
+ systemTheme: 'مظهر النظام',
137
+ actions: 'الإجراءات',
138
+ openFullSearch: 'فتح صفحة البحث الكاملة',
139
+ },
140
+ errors: {
141
+ somethingWentWrong: 'حدث خطأ ما',
142
+ unexpectedError: 'حدث خطأ غير متوقع أثناء عرض هذا المحتوى.',
143
+ tryAgain: 'إعادة المحاولة',
144
+ goHome: 'العودة للرئيسية',
145
+ errorDetails: 'تفاصيل الخطأ (وضع التطوير فقط)',
146
+ },
147
+ theme: {
148
+ toggle: 'تبديل المظهر',
149
+ light: 'فاتح',
150
+ dark: 'داكن',
151
+ system: 'النظام',
152
+ },
153
+ objectView: {
154
+ objectNotFound: 'الكائن غير موجود',
155
+ objectNotFoundDescription: 'الكائن "{{objectName}}" غير موجود في الإعدادات الحالية.',
156
+ objectNotFoundHint: 'تحقق من إعدادات التنقل في تطبيقك أو اختر كائنًا آخر من الشريط الجانبي.',
157
+ allRecords: 'جميع السجلات',
158
+ exitDesignMode: 'الخروج من وضع التصميم',
159
+ enterDesignMode: 'الدخول إلى وضع التصميم',
160
+ metadataInspector: 'مفتش البيانات الوصفية',
161
+ editView: 'تعديل العرض',
162
+ addView: 'إضافة عرض',
163
+ designTools: 'أدوات التصميم',
164
+ new: 'جديد',
165
+ },
166
+ localeSwitcher: {
167
+ label: 'اللغة',
168
+ },
169
+ },
102
170
  errors: {
103
171
  networkError: 'خطأ في الشبكة. يرجى التحقق من اتصالك.',
104
172
  serverError: 'خطأ في الخادم. يرجى المحاولة مرة أخرى لاحقاً.',
package/src/locales/de.ts CHANGED
@@ -98,6 +98,79 @@ const de = {
98
98
  saveLayout: 'Layout speichern',
99
99
  resetLayout: 'Layout zurücksetzen',
100
100
  },
101
+ console: {
102
+ title: 'ObjectStack Konsole',
103
+ initializing: 'Anwendung wird initialisiert...',
104
+ loadingSteps: {
105
+ connecting: 'Verbindung zur Datenquelle herstellen',
106
+ loadingConfig: 'Konfiguration laden',
107
+ preparingWorkspace: 'Arbeitsbereich vorbereiten',
108
+ },
109
+ shortcuts: {
110
+ title: 'Tastenkürzel',
111
+ description: 'Kurzreferenz für alle verfügbaren Tastenkürzel.',
112
+ groups: {
113
+ general: 'Allgemein',
114
+ navigation: 'Navigation',
115
+ dataViews: 'Datenansichten',
116
+ preferences: 'Einstellungen',
117
+ },
118
+ openCommandPalette: 'Befehlspalette öffnen',
119
+ showShortcuts: 'Tastenkürzel anzeigen',
120
+ closeDialog: 'Dialog / Panel schließen',
121
+ toggleSidebar: 'Seitenleiste umschalten',
122
+ focusSearch: 'Suche fokussieren',
123
+ createRecord: 'Neuen Datensatz erstellen',
124
+ refreshData: 'Daten aktualisieren',
125
+ editRecord: 'Ausgewählten Datensatz bearbeiten',
126
+ toggleDarkMode: 'Dunkelmodus umschalten',
127
+ },
128
+ commandPalette: {
129
+ placeholder: 'Befehl eingeben oder suchen...',
130
+ noResults: 'Keine Ergebnisse gefunden.',
131
+ objects: 'Objekte',
132
+ dashboards: 'Dashboards',
133
+ pages: 'Seiten',
134
+ reports: 'Berichte',
135
+ switchApp: 'App wechseln',
136
+ current: 'Aktuell',
137
+ preferences: 'Einstellungen',
138
+ lightTheme: 'Helles Design',
139
+ darkTheme: 'Dunkles Design',
140
+ systemTheme: 'Systemdesign',
141
+ actions: 'Aktionen',
142
+ openFullSearch: 'Vollständige Suchseite öffnen',
143
+ },
144
+ errors: {
145
+ somethingWentWrong: 'Etwas ist schiefgelaufen',
146
+ unexpectedError: 'Beim Rendern dieser Ansicht ist ein unerwarteter Fehler aufgetreten.',
147
+ tryAgain: 'Erneut versuchen',
148
+ goHome: 'Zur Startseite',
149
+ errorDetails: 'Fehlerdetails (nur Entwicklung)',
150
+ },
151
+ theme: {
152
+ toggle: 'Design umschalten',
153
+ light: 'Hell',
154
+ dark: 'Dunkel',
155
+ system: 'System',
156
+ },
157
+ objectView: {
158
+ objectNotFound: 'Objekt nicht gefunden',
159
+ objectNotFoundDescription: 'Das Objekt „{{objectName}}" existiert in der aktuellen Konfiguration nicht.',
160
+ objectNotFoundHint: 'Überprüfen Sie Ihre App-Navigationseinstellungen oder wählen Sie ein anderes Objekt aus der Seitenleiste.',
161
+ allRecords: 'Alle Datensätze',
162
+ exitDesignMode: 'Designmodus beenden',
163
+ enterDesignMode: 'Designmodus starten',
164
+ metadataInspector: 'Metadaten-Inspektor',
165
+ editView: 'Ansicht bearbeiten',
166
+ addView: 'Ansicht hinzufügen',
167
+ designTools: 'Design-Werkzeuge',
168
+ new: 'Neu',
169
+ },
170
+ localeSwitcher: {
171
+ label: 'Sprache',
172
+ },
173
+ },
101
174
  errors: {
102
175
  networkError: 'Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung.',
103
176
  serverError: 'Serverfehler. Bitte versuchen Sie es später erneut.',
package/src/locales/en.ts CHANGED
@@ -98,6 +98,79 @@ const en = {
98
98
  saveLayout: 'Save layout',
99
99
  resetLayout: 'Reset layout',
100
100
  },
101
+ console: {
102
+ title: 'ObjectStack Console',
103
+ initializing: 'Initializing application...',
104
+ loadingSteps: {
105
+ connecting: 'Connecting to data source',
106
+ loadingConfig: 'Loading configuration',
107
+ preparingWorkspace: 'Preparing workspace',
108
+ },
109
+ shortcuts: {
110
+ title: 'Keyboard Shortcuts',
111
+ description: 'Quick reference for all available keyboard shortcuts.',
112
+ groups: {
113
+ general: 'General',
114
+ navigation: 'Navigation',
115
+ dataViews: 'Data Views',
116
+ preferences: 'Preferences',
117
+ },
118
+ openCommandPalette: 'Open command palette',
119
+ showShortcuts: 'Show keyboard shortcuts',
120
+ closeDialog: 'Close dialog / panel',
121
+ toggleSidebar: 'Toggle sidebar',
122
+ focusSearch: 'Focus search',
123
+ createRecord: 'Create new record',
124
+ refreshData: 'Refresh data',
125
+ editRecord: 'Edit selected record',
126
+ toggleDarkMode: 'Toggle dark mode',
127
+ },
128
+ commandPalette: {
129
+ placeholder: 'Type a command or search...',
130
+ noResults: 'No results found.',
131
+ objects: 'Objects',
132
+ dashboards: 'Dashboards',
133
+ pages: 'Pages',
134
+ reports: 'Reports',
135
+ switchApp: 'Switch App',
136
+ current: 'Current',
137
+ preferences: 'Preferences',
138
+ lightTheme: 'Light Theme',
139
+ darkTheme: 'Dark Theme',
140
+ systemTheme: 'System Theme',
141
+ actions: 'Actions',
142
+ openFullSearch: 'Open Full Search Page',
143
+ },
144
+ errors: {
145
+ somethingWentWrong: 'Something went wrong',
146
+ unexpectedError: 'An unexpected error occurred while rendering this view.',
147
+ tryAgain: 'Try Again',
148
+ goHome: 'Go Home',
149
+ errorDetails: 'Error Details (dev only)',
150
+ },
151
+ theme: {
152
+ toggle: 'Toggle theme',
153
+ light: 'Light',
154
+ dark: 'Dark',
155
+ system: 'System',
156
+ },
157
+ objectView: {
158
+ objectNotFound: 'Object Not Found',
159
+ objectNotFoundDescription: 'The object "{{objectName}}" does not exist in the current configuration.',
160
+ objectNotFoundHint: 'Check your app navigation settings or select a different object from the sidebar.',
161
+ allRecords: 'All Records',
162
+ exitDesignMode: 'Exit Design Mode',
163
+ enterDesignMode: 'Enter Design Mode',
164
+ metadataInspector: 'Metadata Inspector',
165
+ editView: 'Edit View',
166
+ addView: 'Add View',
167
+ designTools: 'Design tools',
168
+ new: 'New',
169
+ },
170
+ localeSwitcher: {
171
+ label: 'Language',
172
+ },
173
+ },
101
174
  errors: {
102
175
  networkError: 'Network error. Please check your connection.',
103
176
  serverError: 'Server error. Please try again later.',
package/src/locales/es.ts CHANGED
@@ -98,6 +98,74 @@ const es = {
98
98
  saveLayout: 'Guardar diseño',
99
99
  resetLayout: 'Restablecer diseño',
100
100
  },
101
+ console: {
102
+ title: 'Consola ObjectStack',
103
+ initializing: 'Inicializando aplicación...',
104
+ loadingSteps: {
105
+ connecting: 'Conectando a la fuente de datos',
106
+ loadingConfig: 'Cargando configuración',
107
+ preparingWorkspace: 'Preparando espacio de trabajo',
108
+ },
109
+ shortcuts: {
110
+ title: 'Atajos de teclado',
111
+ description: 'Referencia rápida de todos los atajos de teclado disponibles.',
112
+ groups: { general: 'General', navigation: 'Navegación', dataViews: 'Vistas de datos', preferences: 'Preferencias' },
113
+ openCommandPalette: 'Abrir paleta de comandos',
114
+ showShortcuts: 'Mostrar atajos de teclado',
115
+ closeDialog: 'Cerrar diálogo / panel',
116
+ toggleSidebar: 'Alternar barra lateral',
117
+ focusSearch: 'Enfocar búsqueda',
118
+ createRecord: 'Crear nuevo registro',
119
+ refreshData: 'Actualizar datos',
120
+ editRecord: 'Editar registro seleccionado',
121
+ toggleDarkMode: 'Alternar modo oscuro',
122
+ },
123
+ commandPalette: {
124
+ placeholder: 'Escriba un comando o busque...',
125
+ noResults: 'No se encontraron resultados.',
126
+ objects: 'Objetos',
127
+ dashboards: 'Paneles',
128
+ pages: 'Páginas',
129
+ reports: 'Informes',
130
+ switchApp: 'Cambiar aplicación',
131
+ current: 'Actual',
132
+ preferences: 'Preferencias',
133
+ lightTheme: 'Tema claro',
134
+ darkTheme: 'Tema oscuro',
135
+ systemTheme: 'Tema del sistema',
136
+ actions: 'Acciones',
137
+ openFullSearch: 'Abrir página de búsqueda completa',
138
+ },
139
+ errors: {
140
+ somethingWentWrong: 'Algo salió mal',
141
+ unexpectedError: 'Ocurrió un error inesperado al renderizar esta vista.',
142
+ tryAgain: 'Intentar de nuevo',
143
+ goHome: 'Ir al inicio',
144
+ errorDetails: 'Detalles del error (solo desarrollo)',
145
+ },
146
+ theme: {
147
+ toggle: 'Cambiar tema',
148
+ light: 'Claro',
149
+ dark: 'Oscuro',
150
+ system: 'Sistema',
151
+ },
152
+ objectView: {
153
+ objectNotFound: 'Objeto no encontrado',
154
+ objectNotFoundDescription: 'El objeto "{{objectName}}" no existe en la configuración actual.',
155
+ objectNotFoundHint: 'Verifique la configuración de navegación de su aplicación o seleccione un objeto diferente en la barra lateral.',
156
+ allRecords: 'Todos los registros',
157
+ exitDesignMode: 'Salir del modo de diseño',
158
+ enterDesignMode: 'Entrar en modo de diseño',
159
+ metadataInspector: 'Inspector de metadatos',
160
+ editView: 'Editar vista',
161
+ addView: 'Agregar vista',
162
+ designTools: 'Herramientas de diseño',
163
+ new: 'Nuevo',
164
+ },
165
+ localeSwitcher: {
166
+ label: 'Idioma',
167
+ },
168
+ },
101
169
  errors: {
102
170
  networkError: 'Error de red. Por favor, compruebe su conexión.',
103
171
  serverError: 'Error del servidor. Por favor, inténtelo de nuevo más tarde.',
package/src/locales/fr.ts CHANGED
@@ -98,6 +98,79 @@ const fr = {
98
98
  saveLayout: 'Enregistrer la mise en page',
99
99
  resetLayout: 'Réinitialiser la mise en page',
100
100
  },
101
+ console: {
102
+ title: 'Console ObjectStack',
103
+ initializing: "Initialisation de l'application...",
104
+ loadingSteps: {
105
+ connecting: 'Connexion à la source de données',
106
+ loadingConfig: 'Chargement de la configuration',
107
+ preparingWorkspace: "Préparation de l'espace de travail",
108
+ },
109
+ shortcuts: {
110
+ title: 'Raccourcis clavier',
111
+ description: 'Référence rapide de tous les raccourcis clavier disponibles.',
112
+ groups: {
113
+ general: 'Général',
114
+ navigation: 'Navigation',
115
+ dataViews: 'Vues de données',
116
+ preferences: 'Préférences',
117
+ },
118
+ openCommandPalette: 'Ouvrir la palette de commandes',
119
+ showShortcuts: 'Afficher les raccourcis clavier',
120
+ closeDialog: 'Fermer le dialogue / panneau',
121
+ toggleSidebar: 'Basculer la barre latérale',
122
+ focusSearch: 'Focus sur la recherche',
123
+ createRecord: 'Créer un nouvel enregistrement',
124
+ refreshData: 'Actualiser les données',
125
+ editRecord: "Modifier l'enregistrement sélectionné",
126
+ toggleDarkMode: 'Basculer le mode sombre',
127
+ },
128
+ commandPalette: {
129
+ placeholder: 'Tapez une commande ou recherchez...',
130
+ noResults: 'Aucun résultat trouvé.',
131
+ objects: 'Objets',
132
+ dashboards: 'Tableaux de bord',
133
+ pages: 'Pages',
134
+ reports: 'Rapports',
135
+ switchApp: "Changer d'application",
136
+ current: 'Actuel',
137
+ preferences: 'Préférences',
138
+ lightTheme: 'Thème clair',
139
+ darkTheme: 'Thème sombre',
140
+ systemTheme: 'Thème système',
141
+ actions: 'Actions',
142
+ openFullSearch: 'Ouvrir la page de recherche complète',
143
+ },
144
+ errors: {
145
+ somethingWentWrong: "Quelque chose s'est mal passé",
146
+ unexpectedError: 'Une erreur inattendue est survenue lors du rendu de cette vue.',
147
+ tryAgain: 'Réessayer',
148
+ goHome: "Retour à l'accueil",
149
+ errorDetails: 'Détails de l\'erreur (développement uniquement)',
150
+ },
151
+ theme: {
152
+ toggle: 'Changer de thème',
153
+ light: 'Clair',
154
+ dark: 'Sombre',
155
+ system: 'Système',
156
+ },
157
+ objectView: {
158
+ objectNotFound: 'Objet introuvable',
159
+ objectNotFoundDescription: 'L\'objet « {{objectName}} » n\'existe pas dans la configuration actuelle.',
160
+ objectNotFoundHint: 'Vérifiez les paramètres de navigation de votre application ou sélectionnez un autre objet dans la barre latérale.',
161
+ allRecords: 'Tous les enregistrements',
162
+ exitDesignMode: 'Quitter le mode conception',
163
+ enterDesignMode: 'Entrer en mode conception',
164
+ metadataInspector: 'Inspecteur de métadonnées',
165
+ editView: 'Modifier la vue',
166
+ addView: 'Ajouter une vue',
167
+ designTools: 'Outils de conception',
168
+ new: 'Nouveau',
169
+ },
170
+ localeSwitcher: {
171
+ label: 'Langue',
172
+ },
173
+ },
101
174
  errors: {
102
175
  networkError: 'Erreur réseau. Veuillez vérifier votre connexion.',
103
176
  serverError: 'Erreur serveur. Veuillez réessayer plus tard.',