@object-ui/i18n 13.2.0 → 14.1.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,147 @@
1
1
  # @object-ui/i18n
2
2
 
3
+ ## 14.1.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 82441e4: feat(console-ai): proactive AI usage indicator in the ChatDock (ADR-0057 #8)
8
+
9
+ Surfaces remaining AI headroom **before** a send hits the 429 wall, instead of
10
+ only learning the limit reactively.
11
+
12
+ - **AiUsageIndicator** — two meters (build + dataChat) as small progress rings in
13
+ the ChatDock header (desktop rail + mobile sheet). Near-full → an amber
14
+ "running low" hint and a popover with "resets tonight / next cycle" plus the
15
+ upgrade / top-up CTA (reusing the 429 deep-link). D5-safe: fractions and
16
+ qualitative words only, never a token number. Hides itself when the usage
17
+ endpoint is absent (older backend / OSS / no seat).
18
+ - **useAiUsage** — fetches the D5-safe per-meter fractions; refetches on the chat
19
+ engine's post-turn / 429 nudge and on tab re-focus; fails soft to nothing.
20
+ - **useObjectChat** emits `AI_USAGE_REFRESH_EVENT` on a rejected send (429) and on
21
+ the turn-finish edge so the ring updates right after the user's action.
22
+ - i18n: `console.ai.usage.*` in en + zh-CN.
23
+
24
+ Consumes the cloud `GET /api/v1/ai/usage` endpoint (objectstack-ai/cloud#824).
25
+
26
+ - 2efa9fd: Detail-page UX follow-ups from the ADR-0085 PR4 real-backend browser pass (framework#2548):
27
+
28
+ - **Highlight strip no longer repeats the record title.** A declared
29
+ `highlightFields` list containing the title field rendered it as the first
30
+ chip — truncated — directly under the identical page H1. `deriveHighlightFields`
31
+ now resolves the title (`primaryField` / `nameField` / deprecated
32
+ `displayNameField`, else the conventional display-field names) via the new
33
+ exported `resolveTitleField` and filters it from declared lists before the
34
+ 4-chip cap, matching what the heuristic branch always did. app-shell's
35
+ `RecordDetailView` synthParts (which pre-computes the list and bypasses the
36
+ derivation) applies the same filter.
37
+ - **Per-field currency reaches the renderers.** The spec channel
38
+ (`currencyConfig.defaultCurrency`) was dropped by the highlight-strip and
39
+ detail-section field enrichment, so a spec-authored currency field could
40
+ never show its symbol ("25,000,000" instead of "$25,000,000");
41
+ `resolveFieldCurrency` reads it second after the designer-only bare
42
+ `currency` key.
43
+ - **app-shell approvals fetches send the Bearer token.** The header badge
44
+ poll, home-inbox count, and record-page approvals panel were cookie-only
45
+ (new shared `bearerAuthHeaders()` util) — same split-origin failure mode as
46
+ the console `approvalsApi` fix below.
47
+ - **`fieldGroups[].icon` / `description` reach detail pages.** The shared
48
+ derivation (ADR-0085 §5) already passed them through; the detail synth
49
+ dropped them. Sections now carry both, and `DetailSection` renders a real
50
+ Lucide icon for identifier-shaped names (emoji/text values keep the
51
+ historical text rendering).
52
+ - **Record meta footer stops dangling without an actor.** Seeded/system rows
53
+ with `created_by: null` rendered "Created by · 10m ago"; the footer now
54
+ falls back to actor-less labels ("Created / Updated"), with new i18n keys in
55
+ all six locales (and the zh `createdBy`/`updatedBy` mistranslation fixed:
56
+ 创建人/更新人, not 创建于/更新于).
57
+ - **Select badges ellipsize instead of clipping mid-glyph.** In bounded
58
+ containers (highlight-strip columns, grid cells) an overlong option label
59
+ used to be cut at the container edge ("Technolog…"); badges now shrink with
60
+ an inner truncate and expose the full label as a hover title. The highlight
61
+ strip's hover title also prefers the option label over the raw stored value.
62
+
63
+ Console app (unversioned): `approvalsApi` now sends the stored Bearer token
64
+ like every other console call — cookie-only auth silently lost the approvals
65
+ surface on split-origin deployments where the SameSite cookie doesn't flow.
66
+
67
+ - e628d1f: Dashboard-level filters follow-ups (#2578, framework#2501):
68
+
69
+ - **i18n**: the `DashboardFilterBar` strings now ship as real locale entries —
70
+ `dashboard.filters.*` (bar label, "All time", "Custom…", "All", "Reset",
71
+ and the 13 date-range preset labels) added to `en` and `zh`. Previously the
72
+ bar always rendered the `useSafeTranslate` English fallbacks.
73
+ - **types**: `GlobalFilterSchema.name` and `DashboardWidgetSchema.filterBindings`
74
+ landed in `@objectstack/spec` (framework#2501), so the local type
75
+ annotations flip from "Pending alignment" to "Aligned" — no shape changes.
76
+
77
+ Also adds five schema-catalog examples (`plugin-dashboard/filtered-dashboard-*`:
78
+ dynamic `optionsFrom` options, text/number/lookup filter types, dataset +
79
+ inline widget mix, `targetWidgets` allow-list, date presets + custom range)
80
+ and a new "Dashboard-Level Filters" guide page covering the full tutorial,
81
+ `page.*` expression usage, and known limitations with workarounds.
82
+
83
+ - 23d65c3: fix(i18n): `createSafeTranslation` / `useSafeTranslate` no longer wrap the
84
+ translation hook in try/catch — the last known rules-of-hooks violation of
85
+ the class fixed in objectui#2595/#2596 (a throw after the hook ran would
86
+ desync hook order on the next render; the factory closure just escaped the
87
+ static lint). `useObjectTranslation` is provider-safe, and the actual
88
+ fallback behavior is unchanged: the testKey probe (createSafeTranslation)
89
+ and per-key `t(key) === key` detection (useSafeTranslate) still return the
90
+ English defaults when translations aren't configured. The fallback `t` is
91
+ now a stable per-factory reference, so downstream memo deps stop
92
+ invalidating every render in the no-translations case.
93
+
94
+ ## 14.0.0
95
+
96
+ ### Patch Changes
97
+
98
+ - c70bca7: fix(console-ai): Live Canvas is a full-screen, opt-in preview on mobile — not a broken split (#2481)
99
+
100
+ On a phone the beside-chat Live Canvas split overflowed the viewport (the chat
101
+ column's fixed min-width plus the preview exceeded the screen, and the resize
102
+ handle is desktop-only, so it was stuck clipped). Under `md` the canvas is now:
103
+
104
+ - **Full-width chat, no split** — the build streams in the chat as before.
105
+ - **Opt-in + full-screen** — when the preview is available a floating "Preview
106
+ app" pill appears; tapping it (or a Preview button on a draft card) takes the
107
+ canvas full-screen over the chat. Closing returns to the chat with the
108
+ preview one tap away. The auto-drafted canvas never covers the streaming
109
+ chat unprompted.
110
+
111
+ Desktop is unchanged (the resizable beside-chat split). Adds the
112
+ `console.ai.previewApp` string (en/zh).
113
+
114
+ - 05e56ca: 导出/导入模板的下载文件名与内容本地化。
115
+
116
+ **导出文件名**:CSV/Excel/JSON 导出下载不再是 `<对象名>.<扩展名>`(如 `contracts.csv`),改为「对象显示名-视图名-时间戳.扩展名」(如 `任务-In Progress-20260714-153045.xlsx`);`exportOptions.fileNamePrefix` 配置仍优先(且作为完整前缀,不再追加视图名)。视图名与对象名重复时自动省略;`@object-ui/core` 新增 `buildExportFileName(ext, { prefix, label, objectName, viewLabel }, now?)` 与 `sanitizeFileNameBase(raw)`,ObjectGrid 与 ListView 的所有导出路径(服务端流式与前端兜底)统一走它。app-shell/plugin-view 的 ObjectView 现将当前视图的显示标签写进传给 ListView 的 schema(`label`),使导出文件名能区分同一对象的不同保存视图。
117
+
118
+ **导入模板**:「下载模板」修复两处英文漏出——示例行的 select/多选取值改为优先取选项**显示标签**(如 `准备中`)而非 ASCII slug(`prepare`,服务端导入两者都接受);模板文件名本地化为 `{{object}}-导入模板.csv`(新增 i18n key `grid.import.templateFileName`,英文回退 `{{object}}-import-template.csv`)。
119
+
120
+ - 5971cc4: i18n: translate the Profile page, honor inline i18n label objects under bare
121
+ base-language codes, and localize managed-by badges / record quick actions.
122
+
123
+ - `pickLocalized` now upgrades a bare base language (`zh`) to any
124
+ region-qualified key sharing the base (`zh-CN`) — runtime language is
125
+ normalized to the base code while metadata authors write full BCP-47 tags,
126
+ so inline `{ en, 'zh-CN', ... }` label objects previously fell back to
127
+ English.
128
+ - ProfilePage (`account:profile_card` / `/system/profile`): every hardcoded
129
+ string — page title/subtitle, avatar Upload/Replace/Remove, Personal
130
+ Information card, Change/Set Password card — now goes through
131
+ `useObjectTranslation()` with `profile.*` keys (new namespace in all ten
132
+ locale bundles); the lazy-load fallback reuses `common.loading`.
133
+ - `ManagedByBadge` chips/tooltips (Config/System/Append-only/Identity) now
134
+ resolve through new `managedByBadge.*` keys with `{{provider}}`
135
+ interpolation.
136
+ - `record:quick_actions` resolves action labels via the
137
+ `objects.{object}._actions.{action}.label` convention plus `pickLocalized`,
138
+ so object action buttons (Change Password, Enable 2FA, …) localize.
139
+ - `record:details` / `record:related_list` / `record:alert` / `ObjectTree`
140
+ pass inline label objects through `pickLocalized`.
141
+ - Locale bundles: added `managedByBadge` namespace to all ten locales and
142
+ backfilled `list.inlineEditShort` / `inlineEditLabel` /
143
+ `recordEditingTitle` for ja/es/ko/de/fr/pt/ru/ar.
144
+
3
145
  ## 13.2.0
4
146
 
5
147
  ### Patch Changes
@@ -105,6 +105,9 @@ declare const ar: {
105
105
  deleteSuccess: string;
106
106
  };
107
107
  fields: {
108
+ relativeDate: {
109
+ overdue: string;
110
+ };
108
111
  richText: {
109
112
  format: string;
110
113
  basicEditorHint: string;
@@ -280,6 +283,31 @@ declare const ar: {
280
283
  addGroup: string;
281
284
  collapsedByDefault: string;
282
285
  removeGroup: string;
286
+ inlineEditShort: string;
287
+ inlineEditLabel: string;
288
+ recordEditingTitle: string;
289
+ };
290
+ managedByBadge: {
291
+ config: {
292
+ short: string;
293
+ title: string;
294
+ body: string;
295
+ };
296
+ system: {
297
+ short: string;
298
+ title: string;
299
+ body: string;
300
+ };
301
+ appendOnly: {
302
+ short: string;
303
+ title: string;
304
+ body: string;
305
+ };
306
+ betterAuth: {
307
+ short: string;
308
+ title: string;
309
+ body: string;
310
+ };
283
311
  };
284
312
  kanban: {
285
313
  addCard: string;
@@ -1222,6 +1250,43 @@ declare const ar: {
1222
1250
  tenantHostHint: string;
1223
1251
  };
1224
1252
  };
1253
+ profile: {
1254
+ title: string;
1255
+ subtitle: string;
1256
+ saving: string;
1257
+ avatar: {
1258
+ upload: string;
1259
+ replace: string;
1260
+ remove: string;
1261
+ };
1262
+ info: {
1263
+ title: string;
1264
+ description: string;
1265
+ saved: string;
1266
+ name: string;
1267
+ email: string;
1268
+ emailImmutable: string;
1269
+ role: string;
1270
+ save: string;
1271
+ };
1272
+ password: {
1273
+ changeTitle: string;
1274
+ setTitle: string;
1275
+ changeDescription: string;
1276
+ setDescription: string;
1277
+ current: string;
1278
+ new: string;
1279
+ password: string;
1280
+ confirm: string;
1281
+ tooShort: string;
1282
+ mismatch: string;
1283
+ enterCurrent: string;
1284
+ changed: string;
1285
+ localSet: string;
1286
+ changeAction: string;
1287
+ setAction: string;
1288
+ };
1289
+ };
1225
1290
  errors: {
1226
1291
  networkError: string;
1227
1292
  serverError: string;
@@ -105,6 +105,9 @@ const ar = {
105
105
  deleteSuccess: "تم حذف {{object}}",
106
106
  },
107
107
  fields: {
108
+ relativeDate: {
109
+ overdue: "متأخر {{count}} يوم",
110
+ },
108
111
  richText: {
109
112
  format: "التنسيق: {{format}}",
110
113
  basicEditorHint: "محرر النص الغني (أساسي)",
@@ -280,6 +283,31 @@ const ar = {
280
283
  addGroup: "إضافة حقل مجموعة",
281
284
  collapsedByDefault: "مطوي افتراضياً",
282
285
  removeGroup: "إزالة",
286
+ inlineEditShort: "تحرير مضمّن",
287
+ inlineEditLabel: "حرّر السجلات مباشرة (انقر خلية للتحرير)",
288
+ recordEditingTitle: "تحرير السجلات",
289
+ },
290
+ managedByBadge: {
291
+ config: {
292
+ short: "إعدادات المسؤول",
293
+ title: "تكوين المسؤول",
294
+ body: "تحدد هذه الصفوف سلوك المنصة أثناء التشغيل. أنشئها هنا؛ وتُخزَّن بيانات التشغيل الناتجة في جدول منفصل.",
295
+ },
296
+ system: {
297
+ short: "يديره النظام",
298
+ title: "تديره المنصة",
299
+ body: "تُنشأ الصفوف تلقائيًا عند تشغيل الإجراءات على السجل المصدر. القائمة أدناه واجهة مراقبة للقراءة فقط — وتوجد إجراءات مستوى الصف (اعتماد، استرجاع، إعادة إرسال، …) على كل صف.",
300
+ },
301
+ appendOnly: {
302
+ short: "للقراءة فقط · سجل التدقيق",
303
+ title: "سجل تاريخي للقراءة فقط",
304
+ body: "سجل تدقيق غير قابل للتغيير. لا يمكن إنشاء الصفوف أو تعديلها أو حذفها من الواجهة — تكتبها المنصة عند وقوع الأحداث. استخدم التصدير للتنزيل لمراجعة الامتثال.",
305
+ },
306
+ betterAuth: {
307
+ short: "الهوية",
308
+ title: "يديره مزوّد الهوية",
309
+ body: "مخطط هذا الكائن مملوك لـ {{provider}}. التعديلات المباشرة تتجاوز تجزئة كلمات المرور والتحقق من الجلسات وفحوصات المصادقة الثنائية وخطافات التدقيق. أدر هذه السجلات عبر تدفقات تسجيل الدخول والدعوة والأمان لدى مزوّد المصادقة.",
310
+ },
283
311
  },
284
312
  kanban: {
285
313
  addCard: "إضافة بطاقة",
@@ -1222,6 +1250,43 @@ const ar = {
1222
1250
  tenantHostHint: "تسجل الدخول إلى مساحة العمل هذه",
1223
1251
  },
1224
1252
  },
1253
+ profile: {
1254
+ title: "الملف الشخصي",
1255
+ subtitle: "إدارة إعدادات حسابك",
1256
+ saving: "جارٍ الحفظ…",
1257
+ avatar: {
1258
+ upload: "رفع",
1259
+ replace: "استبدال",
1260
+ remove: "إزالة",
1261
+ },
1262
+ info: {
1263
+ title: "المعلومات الشخصية",
1264
+ description: "قم بتحديث اسمك وعرض تفاصيل حسابك",
1265
+ saved: "تم تحديث الملف الشخصي بنجاح.",
1266
+ name: "الاسم",
1267
+ email: "البريد الإلكتروني",
1268
+ emailImmutable: "لا يمكن تغيير البريد الإلكتروني.",
1269
+ role: "الدور",
1270
+ save: "حفظ التغييرات",
1271
+ },
1272
+ password: {
1273
+ changeTitle: "تغيير كلمة المرور",
1274
+ setTitle: "تعيين كلمة مرور محلية",
1275
+ changeDescription: "قم بتحديث كلمة المرور التي تستخدمها لتسجيل الدخول إلى هذه البيئة.",
1276
+ setDescription: "لقد سجّلت الدخول عبر تسجيل الدخول الموحّد. عيّن كلمة مرور محلية لتتمكن أيضاً من تسجيل الدخول بالبريد الإلكتروني وكلمة المرور في هذه البيئة.",
1277
+ current: "كلمة المرور الحالية",
1278
+ new: "كلمة المرور الجديدة",
1279
+ password: "كلمة المرور",
1280
+ confirm: "تأكيد كلمة المرور",
1281
+ tooShort: "يجب أن تتكون كلمة المرور من 8 أحرف على الأقل",
1282
+ mismatch: "كلمتا المرور غير متطابقتين",
1283
+ enterCurrent: "أدخل كلمة المرور الحالية",
1284
+ changed: "تم تغيير كلمة المرور.",
1285
+ localSet: "تم تعيين كلمة المرور المحلية. يمكنك الآن تسجيل الدخول بالبريد الإلكتروني وكلمة المرور في هذه البيئة.",
1286
+ changeAction: "تغيير كلمة المرور",
1287
+ setAction: "تعيين كلمة المرور",
1288
+ },
1289
+ },
1225
1290
  errors: {
1226
1291
  networkError: "خطأ في الشبكة. يرجى التحقق من اتصالك.",
1227
1292
  serverError: "خطأ في الخادم. يرجى المحاولة مرة أخرى لاحقاً.",
@@ -105,6 +105,9 @@ declare const de: {
105
105
  deleteSuccess: string;
106
106
  };
107
107
  fields: {
108
+ relativeDate: {
109
+ overdue: string;
110
+ };
108
111
  richText: {
109
112
  format: string;
110
113
  basicEditorHint: string;
@@ -280,6 +283,31 @@ declare const de: {
280
283
  addGroup: string;
281
284
  collapsedByDefault: string;
282
285
  removeGroup: string;
286
+ inlineEditShort: string;
287
+ inlineEditLabel: string;
288
+ recordEditingTitle: string;
289
+ };
290
+ managedByBadge: {
291
+ config: {
292
+ short: string;
293
+ title: string;
294
+ body: string;
295
+ };
296
+ system: {
297
+ short: string;
298
+ title: string;
299
+ body: string;
300
+ };
301
+ appendOnly: {
302
+ short: string;
303
+ title: string;
304
+ body: string;
305
+ };
306
+ betterAuth: {
307
+ short: string;
308
+ title: string;
309
+ body: string;
310
+ };
283
311
  };
284
312
  kanban: {
285
313
  addCard: string;
@@ -485,6 +513,8 @@ declare const de: {
485
513
  highlightFields: string;
486
514
  createdBy: string;
487
515
  updatedBy: string;
516
+ created: string;
517
+ updated: string;
488
518
  showEmptyRelated_one: string;
489
519
  showEmptyRelated_other: string;
490
520
  copyEmail: string;
@@ -1222,6 +1252,43 @@ declare const de: {
1222
1252
  tenantHostHint: string;
1223
1253
  };
1224
1254
  };
1255
+ profile: {
1256
+ title: string;
1257
+ subtitle: string;
1258
+ saving: string;
1259
+ avatar: {
1260
+ upload: string;
1261
+ replace: string;
1262
+ remove: string;
1263
+ };
1264
+ info: {
1265
+ title: string;
1266
+ description: string;
1267
+ saved: string;
1268
+ name: string;
1269
+ email: string;
1270
+ emailImmutable: string;
1271
+ role: string;
1272
+ save: string;
1273
+ };
1274
+ password: {
1275
+ changeTitle: string;
1276
+ setTitle: string;
1277
+ changeDescription: string;
1278
+ setDescription: string;
1279
+ current: string;
1280
+ new: string;
1281
+ password: string;
1282
+ confirm: string;
1283
+ tooShort: string;
1284
+ mismatch: string;
1285
+ enterCurrent: string;
1286
+ changed: string;
1287
+ localSet: string;
1288
+ changeAction: string;
1289
+ setAction: string;
1290
+ };
1291
+ };
1225
1292
  errors: {
1226
1293
  networkError: string;
1227
1294
  serverError: string;
@@ -105,6 +105,9 @@ const de = {
105
105
  deleteSuccess: "{{object}} erfolgreich gelöscht",
106
106
  },
107
107
  fields: {
108
+ relativeDate: {
109
+ overdue: "{{count}} T. überfällig",
110
+ },
108
111
  richText: {
109
112
  format: "Format: {{format}}",
110
113
  basicEditorHint: "Rich-Text-Editor (einfach)",
@@ -280,6 +283,31 @@ const de = {
280
283
  addGroup: "Gruppenfeld hinzufügen",
281
284
  collapsedByDefault: "Standardmäßig eingeklappt",
282
285
  removeGroup: "Entfernen",
286
+ inlineEditShort: "Inline bearbeiten",
287
+ inlineEditLabel: "Datensätze inline bearbeiten (Zelle anklicken zum Bearbeiten)",
288
+ recordEditingTitle: "Datensatzbearbeitung",
289
+ },
290
+ managedByBadge: {
291
+ config: {
292
+ short: "Admin-Konfiguration",
293
+ title: "Administrator-Konfiguration",
294
+ body: "Diese Zeilen definieren das Laufzeitverhalten der Plattform. Erstellen Sie sie hier; die erzeugten Laufzeitdaten liegen in einer separaten Tabelle.",
295
+ },
296
+ system: {
297
+ short: "Systemverwaltet",
298
+ title: "Von der Plattform verwaltet",
299
+ body: "Zeilen werden automatisch erstellt, wenn Aktionen auf dem Quelldatensatz ausgeführt werden. Die Liste ist eine schreibgeschützte Überwachungsansicht – Aktionen auf Zeilenebene (Genehmigen, Zurückrufen, Erneut senden, …) befinden sich an jeder Zeile.",
300
+ },
301
+ appendOnly: {
302
+ short: "Schreibgeschützt · Audit-Log",
303
+ title: "Schreibgeschützter Verlauf",
304
+ body: "Unveränderliches Audit-Log. Zeilen können in der UI nicht erstellt, bearbeitet oder gelöscht werden – die Plattform schreibt sie bei Ereignissen. Nutzen Sie Export für Compliance-Prüfungen.",
305
+ },
306
+ betterAuth: {
307
+ short: "Identität",
308
+ title: "Vom Identitätsanbieter verwaltet",
309
+ body: "Das Schema dieses Objekts gehört {{provider}}. Direkte Änderungen umgehen Passwort-Hashing, Sitzungsvalidierung, Zwei-Faktor-Prüfungen und Audit-Hooks. Verwalten Sie diese Datensätze über die Anmelde-, Einladungs- und Sicherheitsabläufe Ihres Authentifizierungsanbieters.",
310
+ },
283
311
  },
284
312
  kanban: {
285
313
  addCard: "Karte hinzufügen",
@@ -485,6 +513,8 @@ const de = {
485
513
  highlightFields: "Schlüsselfelder",
486
514
  createdBy: "Erstellt von",
487
515
  updatedBy: "Aktualisiert von",
516
+ created: "Erstellt",
517
+ updated: "Aktualisiert",
488
518
  showEmptyRelated_one: "+ {{count}} leer",
489
519
  showEmptyRelated_other: "+ {{count}} leer",
490
520
  copyEmail: "E-Mail kopieren",
@@ -1222,6 +1252,43 @@ const de = {
1222
1252
  tenantHostHint: "Sie melden sich bei diesem Arbeitsbereich an",
1223
1253
  },
1224
1254
  },
1255
+ profile: {
1256
+ title: "Profil",
1257
+ subtitle: "Verwalten Sie Ihre Kontoeinstellungen",
1258
+ saving: "Speichern…",
1259
+ avatar: {
1260
+ upload: "Hochladen",
1261
+ replace: "Ersetzen",
1262
+ remove: "Entfernen",
1263
+ },
1264
+ info: {
1265
+ title: "Persönliche Informationen",
1266
+ description: "Aktualisieren Sie Ihren Namen und sehen Sie Ihre Kontodetails ein",
1267
+ saved: "Profil erfolgreich aktualisiert.",
1268
+ name: "Name",
1269
+ email: "E-Mail",
1270
+ emailImmutable: "Die E-Mail-Adresse kann nicht geändert werden.",
1271
+ role: "Rolle",
1272
+ save: "Änderungen speichern",
1273
+ },
1274
+ password: {
1275
+ changeTitle: "Passwort ändern",
1276
+ setTitle: "Lokales Passwort festlegen",
1277
+ changeDescription: "Aktualisieren Sie das Passwort, mit dem Sie sich in dieser Umgebung anmelden.",
1278
+ setDescription: "Sie haben sich per Single Sign-On angemeldet. Legen Sie ein lokales Passwort fest, um sich in dieser Umgebung auch mit E-Mail und Passwort anmelden zu können.",
1279
+ current: "Aktuelles Passwort",
1280
+ new: "Neues Passwort",
1281
+ password: "Passwort",
1282
+ confirm: "Passwort bestätigen",
1283
+ tooShort: "Das Passwort muss mindestens 8 Zeichen lang sein",
1284
+ mismatch: "Die Passwörter stimmen nicht überein",
1285
+ enterCurrent: "Geben Sie Ihr aktuelles Passwort ein",
1286
+ changed: "Passwort geändert.",
1287
+ localSet: "Lokales Passwort festgelegt. Sie können sich in dieser Umgebung jetzt auch mit E-Mail und Passwort anmelden.",
1288
+ changeAction: "Passwort ändern",
1289
+ setAction: "Passwort festlegen",
1290
+ },
1291
+ },
1225
1292
  errors: {
1226
1293
  networkError: "Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung.",
1227
1294
  serverError: "Serverfehler. Bitte versuchen Sie es später erneut.",