@nar-bus/ui-kit 1.32.0 → 1.33.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 (63) hide show
  1. package/dist/atoms/Input.d.ts.map +1 -1
  2. package/dist/atoms/Select.d.ts +8 -0
  3. package/dist/atoms/Select.d.ts.map +1 -1
  4. package/dist/atoms/SelectableCard.d.ts +38 -2
  5. package/dist/atoms/SelectableCard.d.ts.map +1 -1
  6. package/dist/atoms/Tooltip.d.ts +15 -1
  7. package/dist/atoms/Tooltip.d.ts.map +1 -1
  8. package/dist/atoms/index.d.ts +1 -1
  9. package/dist/atoms/index.d.ts.map +1 -1
  10. package/dist/hooks/useSelectListbox.d.ts.map +1 -1
  11. package/dist/i18n/en.json.d.ts +26 -4
  12. package/dist/i18n/resources.d.ts +44 -0
  13. package/dist/i18n/resources.d.ts.map +1 -1
  14. package/dist/i18n/resources.js +1 -1
  15. package/dist/i18n/tr.json.d.ts +26 -4
  16. package/dist/index.d.ts +8 -4
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +5012 -4289
  19. package/dist/molecules/Combobox.d.ts +78 -1
  20. package/dist/molecules/Combobox.d.ts.map +1 -1
  21. package/dist/molecules/ConfirmDialog.d.ts.map +1 -1
  22. package/dist/molecules/DatePicker.d.ts +10 -1
  23. package/dist/molecules/DatePicker.d.ts.map +1 -1
  24. package/dist/molecules/DateRangePicker.d.ts +11 -1
  25. package/dist/molecules/DateRangePicker.d.ts.map +1 -1
  26. package/dist/molecules/DateTimeInput.d.ts +14 -1
  27. package/dist/molecules/DateTimeInput.d.ts.map +1 -1
  28. package/dist/molecules/KpiCard.d.ts +18 -1
  29. package/dist/molecules/KpiCard.d.ts.map +1 -1
  30. package/dist/molecules/SearchInput.d.ts +37 -2
  31. package/dist/molecules/SearchInput.d.ts.map +1 -1
  32. package/dist/molecules/comboboxKeyboard.d.ts +7 -1
  33. package/dist/molecules/comboboxKeyboard.d.ts.map +1 -1
  34. package/dist/molecules/comboboxPanel.d.ts +86 -0
  35. package/dist/molecules/comboboxPanel.d.ts.map +1 -0
  36. package/dist/organisms/DataTable/DataTableSelection.d.ts +35 -0
  37. package/dist/organisms/DataTable/DataTableSelection.d.ts.map +1 -0
  38. package/dist/organisms/DataTable/RowActionsCell.d.ts +19 -1
  39. package/dist/organisms/DataTable/RowActionsCell.d.ts.map +1 -1
  40. package/dist/organisms/DataTable.d.ts +27 -5
  41. package/dist/organisms/DataTable.d.ts.map +1 -1
  42. package/dist/organisms/Dialog.d.ts.map +1 -1
  43. package/dist/organisms/FilterPanel.d.ts +46 -0
  44. package/dist/organisms/FilterPanel.d.ts.map +1 -1
  45. package/dist/organisms/Pagination.d.ts.map +1 -1
  46. package/dist/organisms/Popover.d.ts +55 -1
  47. package/dist/organisms/Popover.d.ts.map +1 -1
  48. package/dist/organisms/Sheet.d.ts.map +1 -1
  49. package/dist/organisms/Toast.d.ts +6 -0
  50. package/dist/organisms/Toast.d.ts.map +1 -1
  51. package/dist/organisms/index.d.ts +3 -3
  52. package/dist/organisms/index.d.ts.map +1 -1
  53. package/dist/resources-B3pLCPDz.js +86 -0
  54. package/dist/templates/ReportLayout.d.ts +22 -1
  55. package/dist/templates/ReportLayout.d.ts.map +1 -1
  56. package/dist/theme.css +1 -1
  57. package/dist/ui-kit.css +1 -1
  58. package/dist/utils/index.d.ts +1 -1
  59. package/dist/utils/index.d.ts.map +1 -1
  60. package/dist/utils/overlayStack.d.ts +68 -31
  61. package/dist/utils/overlayStack.d.ts.map +1 -1
  62. package/package.json +1 -1
  63. package/dist/resources-CMxZ3N09.js +0 -86
@@ -1,7 +1,7 @@
1
1
  export { cn } from './cn';
2
2
  export { searchFold, matchesSearch } from './searchFold';
3
3
  export { FOCUSABLE_SELECTOR, getFocusables, trapFocus } from './focusTrap';
4
- export { registerOverlay, isTopmostOverlay } from './overlayStack';
4
+ export { registerOverlay, isTopmostOverlay, OverlayHost, type RegisterOverlayOptions, type OverlayHostProps } from './overlayStack';
5
5
  export { lockBodyScroll } from './scrollLock';
6
6
  export { formatDate, formatDateTime, formatDateTimeWithSeconds, formatNumber, formatDecimal, formatSlug, formatRelativeTime, formatPercentage, formatDuration, } from './formatters';
7
7
  export { diffLines, diffJson, lineDiffStats, stableStringify, escapeJsonPointerToken, type LineDiffEntry, type LineDiffOp, type LineDiffStats, type DiffLinesOptions, type JsonChange, type JsonChangeKind, type DiffJsonOptions, type JsonArrayKey, type StableStringifyOptions, } from './jsonDiff';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,UAAU,EACV,cAAc,EACd,yBAAyB,EACzB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,sBAAsB,GAC5B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpI,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,UAAU,EACV,cAAc,EACd,yBAAyB,EACzB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,sBAAsB,GAC5B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC"}
@@ -1,41 +1,78 @@
1
+ import { ReactElement, ReactNode, RefObject } from 'react';
1
2
  /**
2
- * overlayStack.ts — which modal surface currently owns the keyboard.
3
- *
4
- * Every modal organism here (Sheet, Dialog, ConfirmDialog) listens for keydown on
5
- * `document`, so when one is raised BY another — `OrderCreateSheet`'s discard guard
6
- * opening a ConfirmDialog over its own Sheet — both handlers see the same key. Left
7
- * alone, Escape dismisses two layers at once and the lower surface's `trapFocus`
8
- * drags focus out of the upper one (`focusTrap.ts`'s FIX-466 clause pulls focus back
9
- * in whenever the active element sits outside its container).
10
- *
11
- * WHY A STACK AND NOT `event.target.closest('[role=dialog]')`:
12
- * that was the first attempt, and it has a real race. A modal moves initial focus on
13
- * a `setTimeout(0)` (deferred so the portal paints first), so between "ConfirmDialog
14
- * opened" and "focus arrived in it" the event target is still the Sheet underneath —
15
- * and in that window BOTH handlers ran. Reproduced: one Escape produced
16
- * `onCancel: 1` AND `onClose("escape")`. Ownership therefore cannot be derived from
17
- * where focus happens to be; it has to be registered explicitly.
18
- *
19
- * Registration order IS stacking order: each surface registers from its `[open]`
20
- * effect, so the most recently opened one is last and owns the keyboard until it
21
- * unregisters. Non-modal anchored panels (Select/Combobox/DatePicker — `listbox`
22
- * and `combobox` roles) deliberately do NOT register: they are not modal layers, so
23
- * the Sheet keeps owning Tab while one is open and FIX-466's portaled-focusable
24
- * wrap still applies.
25
- *
26
- * BEHAVIOUR NOTE: with two modals open at once, Escape now dismisses only the
27
- * topmost. Previously both closed on a single press. (NB-SHEET-DISMISS-01)
3
+ * The lowest z-index Sheet (backdrop) and Dialog (root) paint at — also assumed for
4
+ * a surface registered through the public `registerOverlay` (ui-shared's fullscreen
5
+ * DashboardWidget is 9998 too).
6
+ */
7
+ export declare const MODAL_BASE_Z_INDEX = 9998;
8
+ export interface RegisterOverlayOptions {
9
+ /**
10
+ * NB-POPOVER-LAYER-01 — `false` registers a non-modal anchored panel (Popover):
11
+ * it takes Escape while it is the topmost entry, and Tab only while focus is
12
+ * inside it. @default true
13
+ */
14
+ modal?: boolean;
15
+ }
16
+ /** Package-internal registration options (HIERARCHY / COVERED above). */
17
+ export interface OverlayEntryOptions extends RegisterOverlayOptions {
18
+ /** An element inside the surface this one was opened from (a Popover's trigger). */
19
+ anchor?: Element | null;
20
+ /** The lowest z-index the surface paints at. @default MODAL_BASE_Z_INDEX */
21
+ zIndex?: number;
22
+ }
23
+ /**
24
+ * KAUDIT-1021b R1-F05 — the surface the overlays rendered inside it were opened from, for
25
+ * those whose DOM does not sit inside it (a modal portals to <body>): Sheet and
26
+ * Dialog provide their surface, Popover its panel; a modal reads it as its `anchor`.
27
+ */
28
+ export declare const OverlayHostContext: import('react').Context<RefObject<HTMLElement | null> | null>;
29
+ export interface OverlayHostProps {
30
+ /**
31
+ * The overlay surface the children are rendered in — the element given to
32
+ * `registerOverlay`. `null` / absent passes the enclosing host through unchanged,
33
+ * so a wrapper that is a host only some of the time (a widget while it is
34
+ * fullscreen) can stay in the tree and keep its children mounted.
35
+ */
36
+ surfaceRef?: RefObject<HTMLElement | null> | null;
37
+ children?: ReactNode;
38
+ }
39
+ /**
40
+ * KAUDIT-1021b R3-F08 — marks `surfaceRef` as the overlay the children were opened
41
+ * from, for a modal surface built outside ui-kit (registered with `registerOverlay`).
42
+ * A Dialog / Sheet / ConfirmDialog rendered inside then sits above that surface in
43
+ * the overlay stack even when both open in the same commit (its effect runs first),
44
+ * exactly as inside ui-kit's own Sheet / Dialog / Popover. Renders no DOM.
45
+ */
46
+ export declare function OverlayHost({ surfaceRef, children }: OverlayHostProps): ReactElement;
47
+ /**
48
+ * Package-internal `registerOverlay` that also takes `anchor` / `zIndex`
49
+ * (HIERARCHY / COVERED). Returns the matching unregister — call it from the same
50
+ * effect's cleanup.
51
+ */
52
+ export declare function registerOverlayEntry(el: HTMLElement | null, options?: OverlayEntryOptions): () => void;
53
+ /**
54
+ * Registers `el` as an overlay (a modal surface unless `options.modal === false`)
55
+ * on top of the stack — below only the entries opened from inside it that
56
+ * registered first (HIERARCHY). Returns the matching unregister — call it from the
57
+ * same effect's cleanup.
28
58
  */
59
+ export declare function registerOverlay(el: HTMLElement | null, options?: RegisterOverlayOptions): () => void;
60
+ /** Calls `listener` after every registration / unregistration (package-internal). */
61
+ export declare function subscribeOverlayStack(listener: () => void): () => void;
29
62
  /**
30
- * Registers `el` as the topmost modal surface. Returns the matching unregister —
31
- * call it from the same effect's cleanup.
63
+ * KAUDIT-1021b R1-F01 — whether a modal entry above `el` paints below `zIndex` (the tier
64
+ * `el` paints at), so `el` would show through over it (package-internal). False
65
+ * when `el` is not registered.
32
66
  */
33
- export declare function registerOverlay(el: HTMLElement | null): () => void;
67
+ export declare function isOverlayCovered(el: HTMLElement | null, zIndex: number): boolean;
34
68
  /**
35
- * Whether `el` is the modal surface that should handle a keyboard event right now.
69
+ * Whether `el` is the overlay that should handle a keyboard event right now.
70
+ * Pass the event (NB-POPOVER-LAYER-01): an open Popover then owns Escape, and Tab
71
+ * while focus is inside it. Without the event a non-modal entry counts only while
72
+ * it holds focus.
36
73
  *
37
74
  * An empty stack means nothing has registered — the caller handles the key, which
38
75
  * keeps every pre-existing single-overlay case behaving exactly as before.
39
76
  */
40
- export declare function isTopmostOverlay(el: HTMLElement | null): boolean;
77
+ export declare function isTopmostOverlay(el: HTMLElement | null, event?: KeyboardEvent): boolean;
41
78
  //# sourceMappingURL=overlayStack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlayStack.d.ts","sourceRoot":"","sources":["../../src/utils/overlayStack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,IAAI,CAUlE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAGhE"}
1
+ {"version":3,"file":"overlayStack.d.ts","sourceRoot":"","sources":["../../src/utils/overlayStack.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA0FpH;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,yEAAyE;AACzE,MAAM,WAAW,mBAAoB,SAAQ,sBAAsB;IACjE,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,+DAA4D,CAAC;AAE5F,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAGpF;AAwBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,WAAW,GAAG,IAAI,EACtB,OAAO,GAAE,mBAAwB,GAChC,MAAM,IAAI,CAmBZ;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,WAAW,GAAG,IAAI,EACtB,OAAO,GAAE,sBAA2B,GACnC,MAAM,IAAI,CAEZ;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKtE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAOhF;AAaD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,OAAO,CAGvF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nar-bus/ui-kit",
3
- "version": "1.32.0",
3
+ "version": "1.33.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -1,86 +0,0 @@
1
- const l = { ara: "Ara...", filtre: "Filtre", kaydet: "Kaydet", iptal: "İptal", sil: "Sil", duzenle: "Düzenle", ekle: "Ekle", kapat: "Kapat", daha_fazla: "Daha fazla", temizle: "Temizle", tamam: "Tamam", geri: "Geri", ileri: "İleri", devam: "Devam", calistir: "Çalıştır", onayla: "Onayla", gonder: "Gönder", yukle: "Yükle", indir: "İndir", kopyala: "Kopyala", kopyalandi: "Kopyalandı", yapistir: "Yapıştır", sec: "Seç", vazgec: "Vazgeç", detay: "Detay", detaya_git: "Detaya Git", yenile: "Yenile", disa_aktar: "Dışa Aktar", evet: "Evet", hayir: "Hayır", tumu: "Tümü", yok: "Yok", olustur: '"{{value}}" oluştur', modem: "Modem", meter: "Sayaç", error: "Bir hata oluştu", retry: "Yeniden dene", cancel: "İptal", loading: "Yükleniyor...", kaldir: "Kaldır", yukleniyor: "Yükleniyor", previousMonth: "Önceki ay", nextMonth: "Sonraki ay", yes: "Evet", no: "Hayır", duration: { month: "{{n}} ay", day: "{{n}} gün", hour: "{{n}} sa", minute: "{{n}} dk" } }, s = { sayfa: "Sayfa", toplam: "Toplam", secili: "Seçili", kayit_bulunamadi: "Kayıt bulunamadı", siralama: "Sıralama", filtrele: "Filtrele", tumunu_sec: "Tümünü Seç", secimi_kaldir: "Seçimi Kaldır", satirlar: "satır", sayfa_basina: "sayfa başına", eylemler: "Eylemler" }, d = { zorunlu_alan: "Bu alan zorunludur", gecersiz_deger: "Geçersiz değer", min_karakter: "En az {{min}} karakter olmalıdır", max_karakter: "En fazla {{max}} karakter olmalıdır", email_gecersiz: "Geçerli bir e-posta adresi giriniz", sayi_gecersiz: "Geçerli bir sayı giriniz" }, m = { emin_misiniz: "Emin misiniz?", bu_islem_geri_alinamaz: "Bu işlem geri alınamaz.", onay: "Onayla", vazgec: "Vazgeç", silme_onay: "Bu kaydı silmek istediğinize emin misiniz?", silme_baslik: "Kaydı Sil", entity_silme_onay: "kalıcı olarak silinecek. Bu işlem geri alınamaz.", kaydedilmemis_baslik: "Kaydedilmemiş değişiklikler", kaydedilmemis_aciklama: "Girdiğiniz bilgiler kaybolacak. Kapatmak istediğinize emin misiniz?", kaydetmeden_kapat: "Kaydetmeden kapat" }, u = { detail: "Komut Detayı", statusTimeline: "Durum Akışı", reasonTitle: { FAILED: "Başarısızlık nedeni", TIMEOUT: "Zaman aşımı nedeni", CANCELLED: "İptal nedeni", RETRY: "Tekrar deneme nedeni", COMPLETED: "Tamamlanma notu" }, target: "Hedef", traffic: "Trafik Bilgisi", createdAt: "Oluşturulma", sentAt: "Gönderilme", completedAt: "Tamamlanma", duration: "Süre", retryCount: "Deneme Sayısı", params: "Parametreler", modemResponse: "İş Emri İçeriği", responseLoadError: "Cevap yüklenemedi", retry: "Tekrar Dene", cancel: "İptal Et", apnConfig: "APN Ayarı", astroClose: "Kapat (HH:DD)", astroDay: "Gün", astroIoInterface: "IO Arayüz ID", astroLat: "Enlem", astroLoadingModem: "Modem detayları yükleniyor...", astroLocation: "Konum", astroLocationMissing: "Modem konumu tanımsız — Lokasyon ekrandan bağlayın", astroLon: "Boylam", astroModemLoadError: "Modem detayları alınamadı — sayfayı yenileyin", astroOpen: "Aç (HH:DD)", astroSchedule: "Günlük Program (HH/DD)", astroStartDate: "Başlangıç Tarihi", calendarEmptyRegistry: "Kayıtlı takvim bulunamadı — önce Takvim oluşturun.", calendarSelectAtLeastOne: "En az bir takvim seçmelisiniz.", calendarSelection: "Takvim Seçimi", closeRelayOffset: "Gün Batımı Ofset (dk)", create: "İş Emri Oluştur", dateValidation: "Başlangıç tarihi bitiş tarihinden önce olmalıdır", daylightActive: "Aktif", daylightEnabled: "İleri/Geri Saat", daylightPassive: "Pasif", directiveAll: "Tümü", directiveLoadError: "Direktif listesi yüklenemedi. Sayfayı yenileyip tekrar deneyin.", directiveName: "Direktif", directiveNone: "Tanımlı direktif yok.", directivesSelected: "{{count}} direktif seçildi", endDate: "Bitiş", energyOff: "Enerji Kes", energyOn: "Enerji Aç", energyState: "Enerji Durumu", firmwareLoadError: "Firmware listesi yüklenemedi. Sayfayı yenileyip tekrar deneyin.", firmwareNoModel: "Ünitenin marka/model bilgisi yok; uygun firmware paketi listelenemiyor.", firmwareNone: "Bu ünitenin marka/modeline uygun firmware paketi yok.", firmwareVersion: "Firmware Versiyonu", noParams: "Bu komut parametre gerektirmez. Doğrudan gönderilebilir.", ntpConfig: "NTP Ayarı", obisCodes: "OBIS Kodları", obisEmpty: "En az 1 OBIS kodu ekleyin", openRelayOffset: "Gün Doğumu Ofset (dk)", priority: { bulk: "Toplu", label: "Öncelik", normal: "Normal", urgent: "Acil" }, readDataLifeSpan: "Veri Ömrü (gün)", readingType: "Okuma Tipi", readingValue: "Değer", relayAdd: "Röle Ekle", relayAll: "Tümü", relayLoadError: "Röle listesi yüklenemedi. Sayfayı yenileyip tekrar deneyin.", relayNo: "Röle Seçimi", relayRemove: "{{name}} satırını kaldır", relaySelect: "Röle", relayStatus: "Durum", respondedAt: "Yanıt Alındı", responseEmpty: "İş emri içeriği henüz hazır değil", responseFunction: "Fonksiyon", responsePackageNo: "Paket No", responseStreaming: "Streaming", retryInterval: "Tekrar Aralığı (dk)", savedScripts: "Kayıtlı Scriptler", scriptContent: "JSON İçerik", scriptName: "Script Adı", scriptNamePlaceholder: "Kayıt için isim...", searchType: "Tip ara...", selectConfig: "Seçin...", selectEnergyState: "Seçin...", selectDirective: "Seçin...", selectFirmware: "Seçin...", selectMeter: "Sayaç seçin...", selectModem: "Modem seçin...", selectRelay: "Seçin...", selectTypeHint: "Sol menüden bir işlem tipi seçin", serverConfig: "Sunucu Ayarı", startDate: "Başlangıç", submit: "İş Emri Oluştur", targetMeter: "Hedef Sayaç", targetModem: "Hedef Haberleşme Ünitesi", threshold: "Eşik Değer (Watt)", whitelistEmpty: "Whitelist kayıt bulunamadı — önce Whitelist Konfigürasyonu oluşturun.", whitelistEntries: "Whitelist Girişleri", whitelistOperation: "İşlem", operation_add: "Ekle", operation_remove: "Kaldır", preset_1h: "Son 1 saat", preset_6h: "Son 6 saat", preset_24h: "Son 24 saat", preset_7d: "Son 7 gün", preset_30d: "Son 30 gün", readingType_lastHours: "Son Saatler", readingType_lastDays: "Son Günler", readingType_lastMonths: "Son Aylar", readingType_between: "Tarih Aralığı", readingType_dayCompletion: "Gün Tamamlama", type: { METER_READOUT_LONG: "Uzun Okuma", METER_READOUT_SHORT: "Kısa Okuma", METER_LOAD_PROFILE: "Yük Profili", METER_READOUT_HISTORY: "Geçmiş Veriler", METER_READOUT_WARNING: "Uyarılar", METER_READOUT_OUTAGE: "Kesintiler", METER_OBIS_READ: "OBIS Okuma", METER_DIRECTIVE_QUERY: "Direktif Okuma", METER_PING_QUERY: "Ping Kontrol", METER_EVENT_LOG: "Olay Kayıt", METER_TIME_SYNC: "Zaman Senkron", METER_CONN_DISCONN_QUERY: "Enerji Sorgulama", METER_CONN_DISCONN_CHANGE: "Enerji Aç/Kapat", METER_LOAD_LIMIT: "Yük Sınırlama", METER_DAY_LIGHT_CHANGE: "İleri/Geri Saat", METER_CONFIG_QUERY: "Konfigürasyon Sorgulama", GATEWAY_RESET: "Ünite Reset", GATEWAY_TIME_SYNC: "Zaman Güncelleme", GATEWAY_FIRMWARE_UPDATE: "Firmware Güncelleme", GATEWAY_ASTRO_CONFIG: "Astro Konfigürasyonu", GATEWAY_METER_CONFIG: "Sayaç Konfigürasyonu", GATEWAY_SERVER_CONFIG: "Sunucu Ayarları", GATEWAY_NTP_CONFIG: "NTP Konfigürasyonu", GATEWAY_APN_CONFIG: "APN Konfigürasyonu", GATEWAY_CUSTOM_CONFIG: "Özel Ayarlar", GATEWAY_CONFIG_QUERY: "Konfig Sorgulama", GATEWAY_RELAY_QUERY: "Röle Sorgulama", GATEWAY_RELAY_CHANGE: "Röle Değiştirme", GATEWAY_CALENDAR_QUERY: "Takvim Sorgulama", GATEWAY_CALENDAR_CHANGE: "Takvim Güncelleme", GATEWAY_DIRECTIVE_QUERY: "Yönerge Sorgulama", GATEWAY_DIRECTIVE_CHANGE: "Yönerge Güncelleme", GATEWAY_EVENT_LOG: "Log Sorgulama", GATEWAY_ALARM: "Alarm Sorgulama", GATEWAY_SCRIPT_EXECUTION: "Script Çalıştır", GATEWAY_DIRECTIVE_EXECUTE: "Direktif Çalıştır" }, category: { METER_READOUT: "Sayaç Okuma", METER_UPDATE: "Sayaç Güncelleme", GATEWAY_SETTINGS: "Ünite Ayarları", OTHER: "Diğer" }, createBulk: "Toplu İş Emri Oluştur", submitBulk: "Toplu İş Emri Oluştur", directiveNamePlural: "Yönergeler", searchDirective: "Direktif ara ve seç...", durationMinutes: "Süre (dakika)", calendarUpdateInfo: "{{count}} takvim seçildi. Adım 1: mevcut takvimler silinir. Adım 2: seçilen takvimler eklenir.", directivesSelected_one: "{{count}} direktif seçildi", directivesSelected_other: "{{count}} direktif seçildi", bulkHeaderMeters: "{{count}} sayaç seçili — hepsi için aynı iş emri oluşturulacak", bulkHeaderModems: "{{count}} modem seçili — hepsi için aynı iş emri oluşturulacak", meterNumbered: "Sayaç #{{id}}", calendarUpdateInfo_one: "{{count}} takvim seçildi. Adım 1: mevcut takvimler silinir. Adım 2: seçilen takvimler eklenir.", calendarUpdateInfo_other: "{{count}} takvim seçildi. Adım 1: mevcut takvimler silinir. Adım 2: seçilen takvimler eklenir.", directiveParamsHint: "Yalnız yönergenin kullandığı alanları doldurun.", targetMeterLoadError: "Sayaç listesi yüklenemedi. Sayfayı yenileyip tekrar deneyin.", targetMeterNoneBonded: "Bu üniteye bağlı sayaç yok.", obisAdd: "OBIS kodu ekle", obisRemove: "{{code}} kodunu kaldır", firmwareBulkNoModel: "Seçimde marka/model bilgisi olmayan ünite var; firmware paketi listelenemiyor.", firmwareBulkMultiBrand: "Seçimde birden fazla marka var; ortak firmware paketi listelenemiyor.", firmwareBulkMixedModels: "Seçilen üniteler farklı modellerde; yalnız markanın bütün modellerine tanımlı paketler listeleniyor.", firmwareBulkMixedModelsNone: "Seçilen üniteler farklı modellerde ve markanın bütün modellerine tanımlı firmware paketi yok.", firmwareBulkNone: "Seçilen ünitelerin marka/modeline uygun firmware paketi yok.", configLoadError: "Liste yüklenemedi. Sayfayı yenileyip tekrar deneyin.", apnConfigNone: "Tanımlı APN ayarı yok.", serverConfigNone: "Tanımlı sunucu ayarı yok.", ntpConfigNone: "Tanımlı NTP ayarı yok.", firmwareTruncated: "Firmware listesi sunucu sınırına ulaştı; bazı paketler listede olmayabilir.", configIncomplete: "Liste çok uzun; tamamı gösterilemiyor." }, y = { window: { "1h": "1s", "24h": "24s", "7d": "7g", "30d": "30g", aria: "Zaman penceresi" }, gauge: { aria: "Sağlık skoru göstergesi", details: "Skor detayı", computing: "Hesaplanıyor...", no_data: "Aktif veri yok", error: "Veri çekilemedi", band: { critical: "KRİTİK", warning: "UYARI", healthy: "SAĞLIKLI", excellent: "MÜKEMMEL" } }, dataPerf: { no_errors: "Hata yok", top_error_codes: "Sık Hata Kodları", error_code_row_aria: "{{code}} hata kodu detayını görüntüle" } }, c = { apr: "Nisan", aug: "Ağustos", dec: "Aralık", feb: "Şubat", jan: "Ocak", jul: "Temmuz", jun: "Haziran", mar: "Mart", may: "Mayıs", nov: "Kasım", oct: "Ekim", sep: "Eylül", short: { jan: "Oca", feb: "Şub", mar: "Mar", apr: "Nis", may: "May", jun: "Haz", jul: "Tem", aug: "Ağu", sep: "Eyl", oct: "Eki", nov: "Kas", dec: "Ara" } }, _ = { fri: "Cum", mon: "Pzt", sat: "Cmt", sun: "Paz", thu: "Per", tue: "Sal", wed: "Çar", long: { mon: "Pazartesi", tue: "Salı", wed: "Çarşamba", thu: "Perşembe", fri: "Cuma", sat: "Cumartesi", sun: "Pazar" } }, k = { dayOfMonth: "Gün", dayOfWeek: "Hafta Günü", expression: "İfade", hour: "Saat", minute: "Dakika", month: "Ay", second: "Saniye", opt: { every_second: "Her saniye", every_5s: "Her 5 sn", every_10s: "Her 10 sn", every_15s: "Her 15 sn", every_30s: "Her 30 sn", every_minute: "Her dakika", every_5m: "Her 5 dk", every_10m: "Her 10 dk", every_15m: "Her 15 dk", every_30m: "Her 30 dk", every_hour: "Her saat", every_2h: "Her 2 saat", every_4h: "Her 4 saat", every_6h: "Her 6 saat", every_12h: "Her 12 saat", every_day: "Her gün", every_month: "Her ay", weekdays: "Hafta içi", weekend: "Hafta sonu", last_day: "Son gün" }, desc: { every_minute: "Her dakika", every_n_minutes: "Her {{n}} dakikada", hourly_at_minute: "Her saat {{minute}}. dakikada", every_n_hours_at_minute: "Her {{n}} saatte, {{minute}}. dakikada", at_time: "Saat {{time}}'de", on_day_of_month: "ayın {{day}}. günü", last_day_of_month: "ayın son günü", day_or: "{{dom}} VEYA {{dow}}", every_second: "Her saniye", every_n_seconds: "Her {{n}} saniyede", at_second: "Her dakikanın {{second}}. saniyesinde", and_every_second: "her saniye", and_every_n_seconds: "her {{n}} saniyede", and_at_second: "{{second}}. saniyede", last_weekday_of_month: "ayın son iş günü", days_before_last_day: "ayın son gününden {{n}} gün önce", nearest_weekday: "ayın {{day}}. gününe en yakın iş günü", last_dow_of_month: "ayın son {{dow}} günü", nth_dow_of_month: "ayın {{n}}. {{dow}} günü", dow: { mon: "Pazartesi", tue: "Salı", wed: "Çarşamba", thu: "Perşembe", fri: "Cuma", sat: "Cumartesi", sun: "Pazar", weekdays: "hafta içi", weekend: "hafta sonu" } }, day_or_title: "Gün ve Hafta Günü birlikte seçili", day_or_body: "Program bu ikisinin kesişiminde değil, herhangi birinde çalışır: seçtiğiniz ayın günü VEYA seçtiğiniz hafta günü. Yalnızca birini istiyorsanız diğerini “Her gün” yapın.", day_exclusive_hint: "Ayın günü ile hafta günü birlikte kullanılamaz — birini seçince diğeri “Her gün” olur.", day_conflict: "Ayın günü ile hafta günü birlikte planlanamaz — yalnızca birini seçin.", invalid: "Geçersiz ifade", invalid_quartz_day: "Geçersiz ifade — ayın günü ile hafta gününden yalnızca biri “?” olmalı." }, g = { empty: "Henüz olay yok", emptyDescription: "Bu modem için henüz bir olay kaydedilmemiş.", filterSource: "Kaynak", filterType: "Olay Tipi", sourceSystem: "Sistem", sourceUser: "Kullanıcı", emptyRecords: "Henüz kayıt yok", event: { ORDER: "Komut", HEARTBEAT: "Heartbeat", ALARM: "Alarm", CONFIG: "Konfigürasyon", CONNECTION: "Bağlantı", POWER: "Enerji", LIFECYCLE: "Yaşam Döngüsü" }, source: { USER: "Kullanıcı", SYSTEM: "Sistem" } }, p = { connecting: "Bağlanıyor...", selectModem: "Canlı izleme için modem seçin", title: "Canlı İzleme", waiting: "Olay bekleniyor...", metric: { throughput: "msg/s", onlineModems: "Çevrimiçi", outages: "Kesinti", dlqCount: "DLQ" } }, h = { empty: "Bildirim yok", markAllRead: "Tümünü oku", title: "Bildirimler", viewAll: "Tüm bildirimleri gör" }, f = { groupCount: "{{count}} grup", placeholder: "Harita yükleniyor...", groupCount_one: "{{count}} grup", groupCount_other: "{{count}} grup" }, E = { karanlik_mod: "Karanlık Mod", aydinlik_mod: "Aydınlık Mod", tema_degistir: "Tema Değiştir" }, S = { bugun: "Bugün", dun: "Dün", bu_hafta: "Bu Hafta", bu_ay: "Bu Ay", gecen_ay: "Geçen Ay", son_7_gun: "Son 7 Gün", son_30_gun: "Son 30 Gün", son_90_gun: "Son 90 Gün", bu_yil: "Bu Yıl", gecen_yil: "Geçen Yıl", baslangic: "Başlangıç", bitis: "Bitiş", tarih_sec: "Tarih Seçiniz", saat: "Saat", baslangic_saati: "Başlangıç saati", bitis_saati: "Bitiş saati", hazir_araliklar: "Hazır Aralıklar" }, T = { onceki_sayfa: "Önceki Sayfa", sonraki_sayfa: "Sonraki Sayfa", previous_page: "Önceki sayfa", next_page: "Sonraki sayfa", sayfa_x_y: "Sayfa {{current}} / {{total}}", kayit_gosteriliyor: "{{from}}-{{to}} / {{total}} kayıt gösteriliyor", ilk_sayfa: "İlk Sayfa", son_sayfa: "Son Sayfa" }, A = { kayit_bulunamadi: "Kayıt bulunamadı", henuz_veri_yok: "Henüz veri yok", sonuc_bulunamadi: "Aradığınız kriterlere uygun sonuç bulunamadı" }, b = { basarili: "Başarılı", hata: "Hata", uyari: "Uyarı", bilgi: "Bilgi", yukleniyor: "Yükleniyor...", kaydediliyor: "Kaydediliyor...", siliniyor: "Siliniyor..." }, v = { status_pending: "Bekliyor", status_valid: "Geçerli", status_invalid: "Geçersiz" }, N = { filtre_uygula: "Filtreyi Uygula", filtreleri_temizle: "Filtreleri Temizle", aktif_filtre: "{{count}} aktif filtre", yes: "Evet", no: "Hayır", op_contains: "İçerir", op_equals: "Eşittir", op_not_equals: "Eşit Değil", op_starts_with: "Başlar", op_ends_with: "Biter", op_greater: "Büyüktür", op_less: "Küçüktür", op_greater_eq: "Büyük Eşit", op_less_eq: "Küçük Eşit", op_is_empty: "Boş", op_is_not_empty: "Boş Değil", op_between: "Arasında", operator_sec: "Operatör seçin", secili: "Seçili" }, R = { ham_json: "Ham JSON", form_gorunumu: "Form Görünümü", formatla: "Formatla", gecersiz_json: "Geçersiz JSON formatı", kopyalandi: "Kopyalandı!", kopyala: "Kopyala", icerik: "JSON içeriği", duzenle: "Düzenle", goruntule: "Görüntüle", sozdizimi_hatasi: "Geçersiz JSON — satır {{line}}, sütun {{column}}", sorunlar: "Sorunlar ({{count}})", satir: "Satır {{line}}", konumsuz: "Genel", yaklasik_konum: "Bu yol belgede yok; en yakın üst öğe işaretlendi", ic_ice_deger: "İç içe değer — Ham JSON sekmesinde düzenleyin" }, O = { bold: "Kalın", italic: "İtalik", strike: "Üstü çizili", h2: "Başlık 2", h3: "Başlık 3", bulletList: "Madde işaretli liste", orderedList: "Numaralı liste", link: "Bağlantı", unlink: "Bağlantıyı kaldır", blockquote: "Alıntı", code: "Kod", undo: "Geri al", redo: "Yinele", linkUrl: "https://…", linkApply: "Bağlantıyı uygula", linkCancel: "İptal", toolbar: "Biçimlendirme", editor: "Zengin metin editörü", linkInput: "Bağlantı adresi" }, C = { webglTitle: "WebGL kullanılamıyor", webglBody: "Bu harita yüzeyi render için WebGL gerektirir. Lütfen farklı bir tarayıcı deneyin veya yöneticinizle iletişime geçin.", layerControl: "Harita katmanları" }, D = { sifreyi_goster: "Şifreyi göster", sifreyi_gizle: "Şifreyi gizle", onceki_ay: "Önceki ay", sonraki_ay: "Sonraki ay", filtreyi_kaldir: "{{name}} filtresini kaldır", kopyala: "Kopyala", panel: "Panel", iletisim_kutusu: "İletişim kutusu", kaldir: "{{label}} seçimini kaldır", secili_sayisi: "{{count}} seçili", alani_temizle: "{{label}} alanını temizle", filtrele: "Seçenekleri filtrele", filtreler: "Filtreler", breadcrumb: "Yol haritası", pagination: "Sayfalama", detay_sayfasi: "Detay sayfası", filtreler_kenar: "Filtre kenar çubuğu", giris: "Giriş", rapor_kriterleri: "Rapor kriterleri", tam_ekran: "Tam ekran", tam_ekrandan_cik: "Tam ekrandan çık" }, L = { lifecycle: { ACTIVE: "Aktif", INACTIVE: "Pasif", MAINTENANCE: "Bakımda", FAULTY: "Arızalı", DEFINED: "Tanımlama", INSTALLING: "Kurulum", SCRAPPED: "Hurda", UNKNOWN: "Bilinmiyor" }, network: { CONNECTED: "Çevrimiçi", DISCONNECTED: "Çevrimdışı", UNKNOWN: "Bilinmiyor" }, power: { ON: "Enerjili", OFF: "Enerji Yok", UNKNOWN: "Bilinmiyor" }, disconnection: { ON: "Enerji Var", OFF: "Enerji Yok", UNKNOWN: "Bilinmiyor", OPENING: "Açılıyor", CLOSING: "Kapanıyor" } }, w = { hero: { live: "CANLI", fleetOnline: "AKTİF SAYAÇLAR", online: "aktif", vs1h: "vs 1s", fleet: { online: "AKTİF", offline: "PASİF", unknown: "ENERJİSİZ" }, readingSla24h: "OKUMA SLA · 24S", target: "hedef", activeOutages: "AKTİF KESİNTİLER", affectedMeters: "etkilenen sayaç", alarm: { crit: "KRİTİK", warn: "UYARI", viewDetails: "{{slug}} detaylarını görüntüle" }, tape: { ariaLabel: "Son sistem olayları" }, tapePrefix: "BANT", fleetActive: "Aktif Haberleşme Ünitesi · 24s", fleetTotal: "/ {{total}}", fleetOnlinePct: "%{{pct}}", fleetDeltaHourly: "+{{delta}} ↑ 1s", slaToday: "Okuma Oranı · Bugün", slaTargetCaption: "Hedef %{{target}}", outagesAffected: "{{count}} sayaç", outagesWorstRegion: "En kötü bölge: {{region}}", outagesWorstRegionLabel: "En kötü bölge:", ticker: { throughput: "İŞLEM/s", online: "ÇEVRİMİÇİ", outages: "KESİNTİ", dlq: "DLQ", parseRate: "ÇÖZÜM/s", queue: "KUYRUK" } }, zoneA: { mapTitle: "Coğrafi Komuta", mapSubtitle: "Türkiye · 81 il", mapLoading: "Yükleniyor...", popupLabels: { outage: "Kesinti", rssi: "RSSI", sla: "SLA %", simOperator: "SIM Op", reason: "Sebep" }, layerButton: { kesinti: "Kesinti", sinyal: "Sinyal", sim: "SIM Op", sla: "Okuma Oranı" }, layerHint: { outage: "kesinti yoğunluğu", rssi: "RSSI medyan", sim: "en iyi operatör", sla: "okuma yüzdesi" }, legend: { label: "Açıklama", noData: "Veri yok" }, popup: { dataMissing: "Veri bekleniyor (STORY-218)" }, panelHeader: { eyebrow: "BÖLGE", modemSuffix: "haberleşme ünitesi", meterSuffix: "sayaç", noDataCaption: "Veri bekleniyor — STORY-218 sonrası aktif" }, panelBody: { noDataPlaceholder: "Bu il için henüz veri yok." }, panelFooter: { bestSim: "{{operator}} en iyi — RSSI {{rssi}} dBm", bestSimNoSignal: "{{operator}} en iyi — RSSI veri yok", noWinner: "En iyi operatör verisi yok", cta: "Rapor Aç →" }, noValue: "—", kesinti: { activeLabel: "Aktif Kesinti", affectedSuffix: "etk.", affectedNoData: "etkilenen sayaç verisi yok", longestLabel: "En Uzun Kesinti", noOutage: "kesinti yok", trendTitle: "Kesinti Trend · 7 Gün", legendCount: "Adet", legendDuration: "Süre (dk)", activeListTitle: "Aktif En Uzun Kesintiler", emptyList: "{{province}} bölgesinde aktif kesinti yok.", trendSummary: "{{maxCount}} max adet, {{maxMinutes}} dk max süre." }, sinyal: { title: "SIM Operatör · Medyan Sinyal (dBm) · {{province}}", noData: "Sinyal verisi yok", footer: "Sinyal tab seçili — detaylı bölge RSSI dağılımı yakında" }, sim: { title: "En İyi SIM Operatör · {{province}}", noData: "SIM operatör verisi yok" }, sla: { todayLabel: "Okuma Oranı · 24s", targetCaption: "hedef %99,0", missingLabel: "Eksik Okuma", meterSuffix: "sayaç", noData: "Okuma oranı verisi yok", footer: "Okuma Oranı tab seçili — sayaç bazlı kırılım yakında", rateAria: "Okuma oranı: yüzde {{value}}", missingAria: "Eksik okuma: {{value}} sayaç" }, outageReason: { POWER_LOSS: "Güç Kaybı", NETWORK_OUTAGE: "Şebeke Kesintisi", HARDWARE_FAILURE: "Donanım Arızası", HIGH_TEMP: "Yüksek Sıcaklık", CONNECTION_LOST: "Bağlantı Kopması", noOutage: "Kesinti yok", noData: "Sebep bilinmiyor" }, webglFallback: { title: "Tarayıcınız WebGL desteklemiyor", body: "Coğrafi komuta yüzeyi 81-il çoklu-katman harita render etmek için WebGL gerektirir. Lütfen yöneticinizle iletişime geçin." } }, zones: { zoneAPlaceholder: "Zone A — Çok Katmanlı Harita (STORY-217)", pipelineFunnel: { title: "Veri Hattı · msg/s", empty: "Veri akışı bekleniyor", stage: { kalpAtisi: "Kalp Atışı", hamVeri: "Ham Veri", cozumleyici: "Çözümleyici", clickHouse: "ClickHouse" } }, parseErrors: { title: "Çözümleme Hataları", centerCaption: "HATA", empty: "Hata yok", ariaLabel: "Toplam {{count}} çözümleme hatası" }, simRanking: { title: "SIM Operatör TR · Çevrimiçi %", empty: "Operatör verisi yok" }, integrationHealth: { title: "Entegrasyon · Nabız", empty: "Servis verisi yok", status: { ok: "Sağlıklı", warn: "Uyarı", crit: "Kritik" }, metric: { unreachable: "erişilemiyor", connections: "{{value}} bağlı", brokers: "{{value}} broker", dlq_messages: "{{value}} mesaj", active_streams: "{{value}} aktif" } }, slaTopBottom: { title: "SLA · En Düşük 4 / En Yüksek 4", lowLabel: "▼ Düşük", highLabel: "▲ Yüksek", empty: "Veri yok" }, outageTrend24h: { title: "Kesinti · 24s Trend", hint: "bölgeye göre", empty: "Kesinti yok", regions: { marmara: "Marmara", ic: "İç Anadolu", karadeniz: "Karadeniz", ege: "Ege", akdeniz: "Akdeniz", diger: "Diğer" } }, calendarRings: { title: "Takvim · İlerleme", empty: "Veri yok" } } }, M = { serial: "Seri Numarası", protocol: "Protokol", port: "Port", protocolDefaultPort: "Protokol varsayılan portu", reportedPort: "Cihazın bildirdiği port", firmware: "Firmware", type: "Tip", modem: "Modem", location: "Konum", lastReading: "son okuma", lastCommunication: "Son İletişim", monthlySuccessRate: "Aylık başarı oranı", quickStatus: "Hızlı durum", meterCount: "Sayaç", activeAlarms: "Aktif Alarm", activeOrders: "Aktif İş Emri", orderSuitability: { title: "Emir işleme", accessYes: "Erişim Var", accessNo: "Erişim Yok", tiers: "Bekleyen emir — Acil {{urgent}} · Normal {{normal}} · Toplu {{bulk}}", status: { SUITABLE: "Uygun", NO_ORDERS: "Bekleyen Emir Yok", NOT_SUITABLE: "Uygun Değil", UNKNOWN: "Belirsiz" }, hint: { SUITABLE: "Emir işlemeye engel yok. Erişim durumu ayrıca gösterilir.", NO_ORDERS: "Emir işlemeye engel yok, bekleyen emir de yok.", NOT_SUITABLE: "Emir işlemeye engel var.", UNKNOWN: "Ünitenin durum veya iletişim tipi bilinmediği için değerlendirilemedi." }, reason: { PROTOCOL_MISSING: "Haberleşme ünitesinde protokol tanımlı değil; emirler gönderilemez.", IP_INVALID: "TCP ünitenin IP adresi yok ya da geçersiz; bağlantı kurulamaz.", PORT_INVALID: "TCP ünitenin portu geçersiz (1–65535 dışında).", POWER_OUTAGE: "Ünitede aktif enerji kesintisi var; emirler kesinti bitene kadar reddedilir.", NOT_INSTALLED: 'Ünite sahada kurulu değil; yalnız "Sahada Kurulu" ünitelere emir oluşturulur.' } }, uptime: "Uptime", signal: "Sinyal", readingRate: "Okuma Oranı", calendar: { title: "Okuma takvimi", prevMonth: "Önceki ay", nextMonth: "Sonraki ay", months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"], dayLabels: ["P", "S", "Ç", "P", "C", "C", "P"], status: { ok: "Okundu", warn: "Eksik okuma", crit: "Okuma hatası", noData: "Veri yok" }, legend: { ok: "Tam", warn: "Eksik", crit: "Hata", noData: "Veri yok" }, cellAria: "{{date}} — {{status}}, {{count}}/{{expected}} okuma" } }, z = { kirmizi: "Kırmızı", turuncu: "Turuncu", sari: "Sarı", yesil: "Yeşil", mavi: "Mavi", mor: "Mor", indigo: "İndigo", pembe: "Pembe" }, I = { day: "Gün", total: "Toplam", legend_low: "Az", legend_high: "Çok" }, G = { tabs_aria: "Detay sekmeleri" }, P = { topology: { erp_sub: "Kurumsal", epias_sub: "Enerji Piyasası", mobile_label: "Mobil", mobile_sub: "Müşteri App", meters_stat: "5M Sayaç · 220 GB/gün · 99% SLA", modem_label: "1M Modem" } }, H = { once: "Önce", sonra: "Sonra", eklendi: "eklendi", silindi: "silindi", eklenen_satir: "Eklenen satır: {{count}}", silinen_satir: "Silinen satır: {{count}}", gorunum: "Fark görünümü", birlesik: "Birleşik", yan_yana: "Yan yana", alanlar: "Alanlar ({{count}})", fark_yok: "Fark yok — iki belge aynı.", fark: "Satır farkı", degismeyen_satirlar: "⋯ Değişmeyen {{count}} satır — göster", tur_added: "Eklendi", tur_removed: "Silindi", tur_changed: "Değişti" }, B = { zorunlu: "Bu alan zorunlu", desen_uyumsuz: "Biçim uygun değil ({{pattern}})", varsayilan: "Varsayılan: {{value}}", desen_ipucu: "Biçim uygun değil: {{hint}}" }, Y = { anahtar: "Anahtar", deger: "Değer", islemler: "İşlemler", anahtar_zorunlu: "Anahtar zorunlu", anahtar_tekrar: "Bu anahtar birden fazla satırda var", anahtar_desen: "Anahtar biçimi uygun değil ({{pattern}})", deger_zorunlu: "Değer zorunlu", deger_kisa: "Değer çok kısa (en az {{count}} karakter)", deger_uzun: "Değer çok uzun (en çok {{count}} karakter)", satiri_sil: "{{key}} satırını sil", ekle: "Satır ekle", bos: "Kayıt yok.", anahtar_desen_ipucu: "Anahtar biçimi uygun değil: {{hint}}" }, U = { disa_aktar: "Dışa Aktar", format_sec: "Dosya biçimi seçin", format_xlsx: "Excel (XLSX)", format_csv: "CSV", format_pdf: "PDF", pdf_limit: "En fazla {{limit}} satır", hazirlaniyor: "Hazırlanıyor…", hazirlaniyor_yuzde: "Hazırlanıyor… {{progress}}", indirme_basladi: "İndirme başlatıldı. Dosya inmezse İndirme Geçmişi'nden tekrar deneyin.", arka_planda: "Dosya hazırlanmaya devam ediyor. Hazır olunca İndirme Geçmişi'nden indirebilirsiniz.", indirme_basarisiz: "Dosya indirilemedi. Biraz sonra İndirme Geçmişi'nden tekrar deneyin.", gecmisi_ac: "İndirme Geçmişi'ni aç", gecmis_indirme_basladi: "İndirme başlatıldı. Dosya inmezse tekrar deneyin.", gecmis_indirme_basarisiz: "Dosya indirilemedi. Biraz sonra tekrar deneyin.", iptal_edildi: "Dışa aktarma iptal edildi.", status_queued: "Sırada", status_running: "Hazırlanıyor", status_completed: "Tamamlandı", status_failed: "Başarısız", status_cancelled: "İptal Edildi", status_expired: "Süresi Doldu", iptal_istendi: "İptal istendi", kolon_rapor: "Rapor Adı", kolon_olusturan: "Oluşturan", kolon_talep: "Talep Tarihi", kolon_bitis: "Bitiş Tarihi", kolon_durum: "Durum", kolon_ilerleme: "İlerleme", kolon_kayit: "Kayıt", kolon_boyut: "Boyut", kolon_hata: "Hata", kolon_islemler: "İşlemler", indir: "İndir", indir_aria: "{{name}} dosyasını indir", iptal_et: "İptal Et", iptal_aria: "{{name}} dışa aktarmasını iptal et", adsiz: "Adsız dışa aktarma", bos_baslik: "Dışa aktarma bulunamadı", bos_aciklama: "Henüz dışa aktarma yapılmamış.", liste_hata: "İndirme geçmişi yüklenemedi.", hata_satiri: "Kod: {{code}}, Hata: {{message}}", hata_export_001: "Dışa aktarma bulunamadı.", hata_export_002: "Dosyanın süresi dolmuş, artık indirilemiyor.", hata_export_003: "Aynı rapor için aynı kriterler ile devam eden işleminiz bulunmaktadır. Lütfen İndirme Geçmişi'ni kontrol ediniz.", hata_export_004: "Aynı anda en fazla {{limit}} dışa aktarma çalıştırabilirsiniz. Birinin bitmesini bekleyin.", hata_export_005: "Sistem şu anda yoğun. Lütfen biraz sonra tekrar deneyin.", hata_export_006: "Bu liste dışa aktarılamıyor.", hata_export_007: "Dışa aktarılacak kayıt bulunamadı.", hata_export_008: "Dışa aktarma süre sınırını ya da deneme hakkını aştı.", hata_export_009: "Bu verilere erişim yetkiniz olmadığı için dışa aktarma durduruldu.", hata_export_010: "Dosya deposuna ulaşılamadı. Lütfen tekrar deneyin.", hata_export_011: "Bu işlem dışa aktarmanın şu anki durumunda yapılamaz.", hata_export_012: "Liste servisi beklenmeyen bir yanıt verdi; dışa aktarma tamamlanamadı.", hata_export_013: "Dışa aktarma kolonları geçersiz.", hata_export_014: "PDF en fazla {{limit}} satır alabilir. Excel ya da CSV seçin.", hata_dogrulama: "Dışa aktarma isteği geçersiz.", hata_yetki: "Tüm kullanıcıların dışa aktarmalarını görme yetkiniz yok.", hata_genel: "Dışa aktarma başarısız oldu." }, r = {
2
- common: l,
3
- table: s,
4
- form: d,
5
- dialog: m,
6
- order: u,
7
- monitoring: y,
8
- months: c,
9
- weekDays: _,
10
- cron: k,
11
- timeline: g,
12
- live: p,
13
- notifications: h,
14
- map: f,
15
- theme: E,
16
- date: S,
17
- pagination: T,
18
- empty: A,
19
- status: b,
20
- editablegrid: v,
21
- filter: N,
22
- json_editor: R,
23
- rich_text_editor: O,
24
- map_shell: C,
25
- aria: D,
26
- detail_status: L,
27
- dashboard: w,
28
- detail_hero: M,
29
- color: z,
30
- grid: I,
31
- detail: G,
32
- auth: P,
33
- json_diff: H,
34
- parameter_form: B,
35
- key_value_editor: Y,
36
- export_job: U
37
- }, x = { ara: "Search...", filtre: "Filter", kaydet: "Save", iptal: "Cancel", sil: "Delete", duzenle: "Edit", ekle: "Add", kapat: "Close", daha_fazla: "More", temizle: "Clear", tamam: "OK", geri: "Back", ileri: "Next", devam: "Continue", calistir: "Execute", onayla: "Confirm", gonder: "Send", yukle: "Upload", indir: "Download", kopyala: "Copy", kopyalandi: "Copied", yapistir: "Paste", sec: "Select", vazgec: "Cancel", detay: "Detail", detaya_git: "Go to Detail", yenile: "Refresh", disa_aktar: "Export", evet: "Yes", hayir: "No", tumu: "All", yok: "None", olustur: 'Create "{{value}}"', modem: "Modem", meter: "Meter", error: "An error occurred", retry: "Retry", cancel: "Cancel", loading: "Loading...", kaldir: "Remove", yukleniyor: "Loading", previousMonth: "Previous month", nextMonth: "Next month", yes: "Yes", no: "No", duration: { month: "{{n}} mo", day: "{{n}} d", hour: "{{n}} h", minute: "{{n}} min" } }, W = { sayfa: "Page", toplam: "Total", secili: "Selected", kayit_bulunamadi: "No records found", siralama: "Sort", filtrele: "Filter", tumunu_sec: "Select All", secimi_kaldir: "Deselect All", satirlar: "rows", sayfa_basina: "per page", eylemler: "Actions" }, K = { zorunlu_alan: "This field is required", gecersiz_deger: "Invalid value", min_karakter: "Must be at least {{min}} characters", max_karakter: "Must be at most {{max}} characters", email_gecersiz: "Please enter a valid email address", sayi_gecersiz: "Please enter a valid number" }, F = { emin_misiniz: "Are you sure?", bu_islem_geri_alinamaz: "This action cannot be undone.", onay: "Confirm", vazgec: "Cancel", silme_onay: "Are you sure you want to delete this record?", silme_baslik: "Delete Record", entity_silme_onay: "will be permanently deleted. This action cannot be undone.", kaydedilmemis_baslik: "Unsaved changes", kaydedilmemis_aciklama: "The information you entered will be lost. Are you sure you want to close?", kaydetmeden_kapat: "Close without saving" }, V = { detail: "Order Detail", statusTimeline: "Status Flow", reasonTitle: { FAILED: "Failure reason", TIMEOUT: "Timeout reason", CANCELLED: "Cancellation reason", RETRY: "Retry reason", COMPLETED: "Completion note" }, target: "Target", traffic: "Traffic Info", createdAt: "Created", sentAt: "Sent", completedAt: "Completed", duration: "Duration", retryCount: "Retry Count", params: "Parameters", modemResponse: "Order Content", responseLoadError: "Could not load the response", retry: "Retry", cancel: "Cancel", apnConfig: "APN Configuration", astroClose: "Close (HH:MM)", astroDay: "Day", astroIoInterface: "IO Interface ID", astroLat: "Latitude", astroLoadingModem: "Loading modem details...", astroLocation: "Location", astroLocationMissing: "Modem location is not set — assign it from the Location screen", astroLon: "Longitude", astroModemLoadError: "Could not load modem details — refresh the page", astroOpen: "Open (HH:MM)", astroSchedule: "Daily Schedule (HH/MM)", astroStartDate: "Start Date", calendarEmptyRegistry: "No saved calendars found — create a Calendar first.", calendarSelectAtLeastOne: "You must select at least one calendar.", calendarSelection: "Calendar Selection", closeRelayOffset: "Sunset Offset (min)", create: "Create Work Order", dateValidation: "Start date must be before the end date", daylightActive: "Active", daylightEnabled: "Daylight Saving Time", daylightPassive: "Passive", directiveAll: "All", directiveLoadError: "Could not load the directive list. Refresh the page and try again.", directiveName: "Directive", directiveNone: "No directives are defined.", directivesSelected: "{{count}} directives selected", endDate: "End", energyOff: "Disconnect Energy", energyOn: "Connect Energy", energyState: "Energy State", firmwareLoadError: "Could not load the firmware list. Refresh the page and try again.", firmwareNoModel: "The unit has no brand/model, so no matching firmware package can be listed.", firmwareNone: "No firmware package matches this unit's brand and model.", firmwareVersion: "Firmware Version", noParams: "This command takes no parameters. It can be sent directly.", ntpConfig: "NTP Configuration", obisCodes: "OBIS Codes", obisEmpty: "Add at least 1 OBIS code", openRelayOffset: "Sunrise Offset (min)", priority: { bulk: "Bulk", label: "Priority", normal: "Normal", urgent: "Urgent" }, readDataLifeSpan: "Data Lifespan (days)", readingType: "Reading Type", readingValue: "Value", relayAdd: "Add relay", relayAll: "All", relayLoadError: "Could not load the relay list. Refresh the page and try again.", relayNo: "Relay Selection", relayRemove: "Remove {{name}} row", relaySelect: "Relay", relayStatus: "Status", respondedAt: "Responded", responseEmpty: "Work order content is not ready yet", responseFunction: "Function", responsePackageNo: "Package No", responseStreaming: "Streaming", retryInterval: "Retry Interval (min)", savedScripts: "Saved Scripts", scriptContent: "JSON Content", scriptName: "Script Name", scriptNamePlaceholder: "Name to save as...", searchType: "Search type...", selectConfig: "Select...", selectEnergyState: "Select...", selectDirective: "Select...", selectFirmware: "Select...", selectMeter: "Select a meter...", selectModem: "Select a modem...", selectRelay: "Select...", selectTypeHint: "Select an operation type from the left menu", serverConfig: "Server Configuration", startDate: "Start", submit: "Create Work Order", targetMeter: "Target Meter", targetModem: "Target Communication Unit", threshold: "Threshold (Watt)", whitelistEmpty: "No whitelist records found — create a Whitelist Configuration first.", whitelistEntries: "Whitelist Entries", whitelistOperation: "Operation", operation_add: "Add", operation_remove: "Remove", preset_1h: "Last 1 hour", preset_6h: "Last 6 hours", preset_24h: "Last 24 hours", preset_7d: "Last 7 days", preset_30d: "Last 30 days", readingType_lastHours: "Last Hours", readingType_lastDays: "Last Days", readingType_lastMonths: "Last Months", readingType_between: "Date Range", readingType_dayCompletion: "Day Completion", type: { METER_READOUT_LONG: "Long Readout", METER_READOUT_SHORT: "Short Readout", METER_LOAD_PROFILE: "Load Profile", METER_READOUT_HISTORY: "Historical Data", METER_READOUT_WARNING: "Warnings", METER_READOUT_OUTAGE: "Outages", METER_OBIS_READ: "OBIS Read", METER_DIRECTIVE_QUERY: "Directive Read", METER_PING_QUERY: "Ping Check", METER_EVENT_LOG: "Event Log", METER_TIME_SYNC: "Time Sync", METER_CONN_DISCONN_QUERY: "Energy Status Query", METER_CONN_DISCONN_CHANGE: "Connect/Disconnect Energy", METER_LOAD_LIMIT: "Load Limit", METER_DAY_LIGHT_CHANGE: "Daylight Saving Time", METER_CONFIG_QUERY: "Configuration Query", GATEWAY_RESET: "Unit Reset", GATEWAY_TIME_SYNC: "Communication Unit Time Sync", GATEWAY_FIRMWARE_UPDATE: "Firmware Update", GATEWAY_ASTRO_CONFIG: "Astro Configuration", GATEWAY_METER_CONFIG: "Meter Configuration", GATEWAY_SERVER_CONFIG: "Server Settings", GATEWAY_NTP_CONFIG: "NTP Configuration", GATEWAY_APN_CONFIG: "APN Configuration", GATEWAY_CUSTOM_CONFIG: "Custom Settings", GATEWAY_CONFIG_QUERY: "Config Query", GATEWAY_RELAY_QUERY: "Relay Query", GATEWAY_RELAY_CHANGE: "Relay Change", GATEWAY_CALENDAR_QUERY: "Calendar Query", GATEWAY_CALENDAR_CHANGE: "Calendar Update", GATEWAY_DIRECTIVE_QUERY: "Directive Query", GATEWAY_DIRECTIVE_CHANGE: "Directive Update", GATEWAY_EVENT_LOG: "Log Query", GATEWAY_ALARM: "Alarm Query", GATEWAY_SCRIPT_EXECUTION: "Run Script", GATEWAY_DIRECTIVE_EXECUTE: "Run Directive" }, category: { METER_READOUT: "Meter Readout", METER_UPDATE: "Meter Update", GATEWAY_SETTINGS: "Unit Settings", OTHER: "Other" }, createBulk: "Create Bulk Work Order", submitBulk: "Create Bulk Work Order", directiveNamePlural: "Directives", searchDirective: "Search and select a directive...", durationMinutes: "Duration (minutes)", directivesSelected_one: "{{count}} directive selected", directivesSelected_other: "{{count}} directives selected", calendarUpdateInfo: "{{count}} calendar(s) selected. Step 1: existing calendars are removed. Step 2: the selected calendars are added.", bulkHeaderMeters: "{{count}} meters selected — the same work order will be created for all of them", bulkHeaderModems: "{{count}} modems selected — the same work order will be created for all of them", meterNumbered: "Meter #{{id}}", calendarUpdateInfo_one: "{{count}} calendar selected. Step 1: existing calendars are removed. Step 2: the selected calendars are added.", calendarUpdateInfo_other: "{{count}} calendars selected. Step 1: existing calendars are removed. Step 2: the selected calendars are added.", directiveParamsHint: "Fill in only the fields the directive uses.", targetMeterLoadError: "Could not load the meter list. Refresh the page and try again.", targetMeterNoneBonded: "No meter is connected to this unit.", obisAdd: "Add OBIS code", obisRemove: "Remove {{code}}", firmwareBulkNoModel: "Some selected units have no brand/model, so no firmware package can be listed.", firmwareBulkMultiBrand: "The selection contains more than one brand, so no common firmware package can be listed.", firmwareBulkMixedModels: "The selected units are of different models; only packages defined for every model of the brand are listed.", firmwareBulkMixedModelsNone: "The selected units are of different models and no firmware package is defined for every model of the brand.", firmwareBulkNone: "No firmware package matches the selected units' brand and model.", configLoadError: "Could not load the list. Refresh the page and try again.", apnConfigNone: "No APN configuration is defined.", serverConfigNone: "No server configuration is defined.", ntpConfigNone: "No NTP configuration is defined.", firmwareTruncated: "The firmware list reached the server's limit; some packages may be missing from it.", configIncomplete: "The list is too long to show in full." }, j = { window: { "1h": "1h", "24h": "24h", "7d": "7d", "30d": "30d", aria: "Time window" }, gauge: { aria: "Health score gauge", details: "Score details", computing: "Computing...", no_data: "No active data", error: "Failed to fetch data", band: { critical: "CRITICAL", warning: "WARNING", healthy: "HEALTHY", excellent: "EXCELLENT" } }, dataPerf: { no_errors: "No errors", top_error_codes: "Top Error Codes", error_code_row_aria: "View details for {{code}} error code" } }, q = { apr: "April", aug: "August", dec: "December", feb: "February", jan: "January", jul: "July", jun: "June", mar: "March", may: "May", nov: "November", oct: "October", sep: "September", short: { jan: "Jan", feb: "Feb", mar: "Mar", apr: "Apr", may: "May", jun: "Jun", jul: "Jul", aug: "Aug", sep: "Sep", oct: "Oct", nov: "Nov", dec: "Dec" } }, $ = { fri: "Fri", mon: "Mon", sat: "Sat", sun: "Sun", thu: "Thu", tue: "Tue", wed: "Wed", long: { mon: "Monday", tue: "Tuesday", wed: "Wednesday", thu: "Thursday", fri: "Friday", sat: "Saturday", sun: "Sunday" } }, Q = { dayOfMonth: "Day of Month", dayOfWeek: "Day of Week", expression: "Expression", hour: "Hour", minute: "Minute", month: "Month", second: "Second", opt: { every_second: "Every second", every_5s: "Every 5 sec", every_10s: "Every 10 sec", every_15s: "Every 15 sec", every_30s: "Every 30 sec", every_minute: "Every minute", every_5m: "Every 5 min", every_10m: "Every 10 min", every_15m: "Every 15 min", every_30m: "Every 30 min", every_hour: "Every hour", every_2h: "Every 2 hours", every_4h: "Every 4 hours", every_6h: "Every 6 hours", every_12h: "Every 12 hours", every_day: "Every day", every_month: "Every month", weekdays: "Weekdays", weekend: "Weekend", last_day: "Last day" }, desc: { every_minute: "Every minute", every_n_minutes: "Every {{n}} minutes", hourly_at_minute: "Hourly at minute {{minute}}", every_n_hours_at_minute: "Every {{n}} hours at minute {{minute}}", at_time: "At {{time}}", on_day_of_month: "on day {{day}} of the month", last_day_of_month: "on the last day of the month", day_or: "{{dom}} OR {{dow}}", every_second: "Every second", every_n_seconds: "Every {{n}} seconds", at_second: "Every minute at second {{second}}", and_every_second: "every second", and_every_n_seconds: "every {{n}} seconds", and_at_second: "at second {{second}}", last_weekday_of_month: "on the last weekday of the month", days_before_last_day: "{{n}} days before the last day of the month", nearest_weekday: "on the weekday nearest day {{day}} of the month", last_dow_of_month: "on the last {{dow}} of the month", nth_dow_of_month: "on {{dow}} #{{n}} of the month", dow: { mon: "on Monday", tue: "on Tuesday", wed: "on Wednesday", thu: "on Thursday", fri: "on Friday", sat: "on Saturday", sun: "on Sunday", weekdays: "on weekdays", weekend: "on weekends" } }, day_or_title: "Day of Month and Day of Week are both set", day_or_body: "The schedule runs on EITHER of them, not on their intersection: the day of month you picked OR the weekday you picked. To use only one, set the other back to “Every day”.", day_exclusive_hint: "Day of month and day of week cannot be combined — picking one resets the other to “Every day”.", day_conflict: "Day of month and day of week cannot both be scheduled — pick only one.", invalid: "Invalid expression", invalid_quartz_day: "Invalid expression — exactly one of day of month and day of week must be “?”." }, J = { empty: "No events yet", emptyDescription: "No events have been recorded for this modem yet.", filterSource: "Source", filterType: "Event Type", sourceSystem: "System", sourceUser: "User", emptyRecords: "No records yet", event: { ORDER: "Command", HEARTBEAT: "Heartbeat", ALARM: "Alarm", CONFIG: "Configuration", CONNECTION: "Connection", POWER: "Power", LIFECYCLE: "Lifecycle" }, source: { USER: "User", SYSTEM: "System" } }, X = { connecting: "Connecting...", selectModem: "Select a modem for live monitoring", title: "Live Monitoring", waiting: "Waiting for events...", metric: { throughput: "msg/s", onlineModems: "Online", outages: "Outages", dlqCount: "DLQ" } }, Z = { empty: "No notifications", markAllRead: "Mark all as read", title: "Notifications", viewAll: "View all notifications" }, ee = { groupCount: "{{count}} groups", placeholder: "Loading map...", groupCount_one: "{{count}} group", groupCount_other: "{{count}} groups" }, ae = { karanlik_mod: "Dark Mode", aydinlik_mod: "Light Mode", tema_degistir: "Toggle Theme" }, ie = { bugun: "Today", dun: "Yesterday", bu_hafta: "This Week", bu_ay: "This Month", gecen_ay: "Last Month", son_7_gun: "Last 7 Days", son_30_gun: "Last 30 Days", son_90_gun: "Last 90 Days", bu_yil: "This Year", gecen_yil: "Last Year", baslangic: "Start", bitis: "End", tarih_sec: "Select Date", saat: "Time", baslangic_saati: "Start time", bitis_saati: "End time", hazir_araliklar: "Quick Ranges" }, te = { onceki_sayfa: "Previous Page", sonraki_sayfa: "Next Page", previous_page: "Previous page", next_page: "Next page", sayfa_x_y: "Page {{current}} / {{total}}", kayit_gosteriliyor: "Showing {{from}}-{{to}} of {{total}} records", ilk_sayfa: "First Page", son_sayfa: "Last Page" }, re = { kayit_bulunamadi: "No records found", henuz_veri_yok: "No data yet", sonuc_bulunamadi: "No results matching your criteria" }, ne = { basarili: "Success", hata: "Error", uyari: "Warning", bilgi: "Info", yukleniyor: "Loading...", kaydediliyor: "Saving...", siliniyor: "Deleting..." }, oe = { status_pending: "Pending", status_valid: "Valid", status_invalid: "Invalid" }, le = { filtre_uygula: "Apply Filter", filtreleri_temizle: "Clear Filters", aktif_filtre: "{{count}} active filter(s)", yes: "Yes", no: "No", op_contains: "Contains", op_equals: "Equals", op_not_equals: "Not Equals", op_starts_with: "Starts With", op_ends_with: "Ends With", op_greater: "Greater Than", op_less: "Less Than", op_greater_eq: "Greater or Equal", op_less_eq: "Less or Equal", op_is_empty: "Is Empty", op_is_not_empty: "Is Not Empty", op_between: "Between", operator_sec: "Select operator", secili: "Selected" }, se = { ham_json: "Raw JSON", form_gorunumu: "Form View", formatla: "Format", gecersiz_json: "Invalid JSON format", kopyalandi: "Copied!", kopyala: "Copy", icerik: "JSON content", duzenle: "Edit", goruntule: "View", sozdizimi_hatasi: "Invalid JSON — line {{line}}, column {{column}}", sorunlar: "Problems ({{count}})", satir: "Line {{line}}", konumsuz: "General", yaklasik_konum: "This path is not in the document; its nearest parent is marked", ic_ice_deger: "Nested value — edit it in the Raw JSON tab" }, de = { bold: "Bold", italic: "Italic", strike: "Strikethrough", h2: "Heading 2", h3: "Heading 3", bulletList: "Bullet list", orderedList: "Numbered list", link: "Link", unlink: "Remove link", blockquote: "Quote", code: "Code", undo: "Undo", redo: "Redo", linkUrl: "https://…", linkApply: "Apply link", linkCancel: "Cancel", toolbar: "Formatting", editor: "Rich text editor", linkInput: "Link URL" }, me = { webglTitle: "WebGL is not available", webglBody: "This map surface needs WebGL to render. Please try a different browser or contact your administrator.", layerControl: "Map layers" }, ue = { sifreyi_goster: "Show password", sifreyi_gizle: "Hide password", onceki_ay: "Previous month", sonraki_ay: "Next month", filtreyi_kaldir: "Remove {{name}} filter", kopyala: "Copy", panel: "Panel", iletisim_kutusu: "Dialog", kaldir: "Remove {{label}}", secili_sayisi: "{{count}} selected", alani_temizle: "Clear {{label}}", filtrele: "Filter options", filtreler: "Filters", breadcrumb: "Breadcrumb", pagination: "Pagination", detay_sayfasi: "Detail page", filtreler_kenar: "Filter sidebar", giris: "Sign in", rapor_kriterleri: "Report criteria", tam_ekran: "Fullscreen", tam_ekrandan_cik: "Exit fullscreen" }, ye = { lifecycle: { ACTIVE: "Active", INACTIVE: "Inactive", MAINTENANCE: "Maintenance", FAULTY: "Faulty", DEFINED: "Defined", INSTALLING: "Installation", SCRAPPED: "Scrapped", UNKNOWN: "Unknown" }, network: { CONNECTED: "Online", DISCONNECTED: "Offline", UNKNOWN: "Unknown" }, power: { ON: "Energized", OFF: "No Energy", UNKNOWN: "Unknown" }, disconnection: { ON: "Power OK", OFF: "No Power", UNKNOWN: "Unknown", OPENING: "Opening", CLOSING: "Closing" } }, ce = { hero: { live: "LIVE", fleetOnline: "FLEET ONLINE", online: "online", vs1h: "vs 1h", fleet: { online: "ONLINE", offline: "OFF", unknown: "UNK" }, readingSla24h: "READING SLA · 24h", target: "target", activeOutages: "ACTIVE OUTAGES", affectedMeters: "meters affected", alarm: { crit: "CRIT", warn: "WARN", viewDetails: "View {{slug}} details" }, tape: { ariaLabel: "Recent system events" }, tapePrefix: "TAPE", fleetActive: "Active Comm. Units · 24h", fleetTotal: "/ {{total}}", fleetOnlinePct: "{{pct}}%", fleetDeltaHourly: "+{{delta}} ↑ 1h", slaToday: "Read Rate · Today", slaTargetCaption: "Target {{target}}%", outagesAffected: "{{count}} meters", outagesWorstRegion: "Worst region: {{region}}", outagesWorstRegionLabel: "Worst region:", ticker: { throughput: "OPS/s", online: "ONLINE", outages: "OUTAGE", dlq: "DLQ", parseRate: "PARSE/s", queue: "QUEUE" } }, zoneA: { mapTitle: "Geographic Command", mapSubtitle: "Turkey · 81 provinces", mapLoading: "Loading...", popupLabels: { outage: "Outage", rssi: "RSSI", sla: "SLA %", simOperator: "SIM Op", reason: "Reason" }, layerButton: { kesinti: "Outage", sinyal: "Signal", sim: "SIM Op", sla: "Reading SLA" }, layerHint: { outage: "outage density", rssi: "RSSI median", sim: "best operator", sla: "reading percent" }, legend: { label: "Legend", noData: "No data" }, popup: { dataMissing: "Awaiting data (STORY-218)" }, panelHeader: { eyebrow: "REGION", modemSuffix: "communication unit", meterSuffix: "meter", noDataCaption: "Awaiting data — active after STORY-218" }, panelBody: { noDataPlaceholder: "No data for this province yet." }, panelFooter: { bestSim: "{{operator}} best — RSSI {{rssi}} dBm", bestSimNoSignal: "{{operator}} best — RSSI no data", noWinner: "No best-operator data", cta: "Open Report →" }, noValue: "—", kesinti: { activeLabel: "Active Outages", affectedSuffix: "affected", affectedNoData: "no affected-meter data", longestLabel: "Longest Outage", noOutage: "no outage", trendTitle: "Outage Trend · 7 Days", legendCount: "Count", legendDuration: "Duration (min)", activeListTitle: "Top Active Outages", emptyList: "No active outages in {{province}}.", trendSummary: "Maximum count: {{maxCount}}; maximum duration: {{maxMinutes}} min." }, sinyal: { title: "SIM Operator · Median Signal (dBm) · {{province}}", noData: "No signal data", footer: "Signal tab selected — detailed regional RSSI breakdown coming soon" }, sim: { title: "Best SIM Operator · {{province}}", noData: "No SIM operator data" }, sla: { todayLabel: "Reading SLA · 24h", targetCaption: "target 99.0%", missingLabel: "Missing Reads", meterSuffix: "meter", noData: "No reading-rate data", footer: "Reading SLA tab selected — meter-level breakdown coming soon", rateAria: "Reading rate: {{value}} percent", missingAria: "Missing reads: {{value}} meters" }, outageReason: { POWER_LOSS: "Power Loss", NETWORK_OUTAGE: "Network Outage", HARDWARE_FAILURE: "Hardware Failure", HIGH_TEMP: "High Temperature", CONNECTION_LOST: "Connection Lost", noOutage: "No outage", noData: "Reason unknown" }, webglFallback: { title: "Your browser does not support WebGL", body: "The geographic command surface requires WebGL to render the 81-province multi-layer map. Please contact your administrator." } }, zones: { zoneAPlaceholder: "Zone A — Multi-Layer Map (STORY-217)", pipelineFunnel: { title: "Pipeline · msg/s", empty: "Waiting for data flow", stage: { kalpAtisi: "Heartbeat", hamVeri: "Raw Data", cozumleyici: "Parser", clickHouse: "ClickHouse" } }, parseErrors: { title: "Parse Errors", centerCaption: "ERRORS", empty: "No errors", ariaLabel: "Total {{count}} parse errors" }, simRanking: { title: "SIM Operator TR · Online %", empty: "No operator data" }, integrationHealth: { title: "Integration · Pulse", empty: "No service data", status: { ok: "Healthy", warn: "Warning", crit: "Critical" }, metric: { unreachable: "unreachable", connections: "{{value}} connected", brokers: "{{value}} brokers", dlq_messages: "{{value}} messages", active_streams: "{{value}} active" } }, slaTopBottom: { title: "SLA · Lowest 4 / Highest 4", lowLabel: "▼ Low", highLabel: "▲ High", empty: "No data" }, outageTrend24h: { title: "Outage · 24h Trend", hint: "by region", empty: "No outages", regions: { marmara: "Marmara", ic: "Central Anatolia", karadeniz: "Black Sea", ege: "Aegean", akdeniz: "Mediterranean", diger: "Other" } }, calendarRings: { title: "Calendar · Progress", empty: "No data" } } }, _e = { serial: "Serial Number", protocol: "Protocol", port: "Port", protocolDefaultPort: "Protocol default port", reportedPort: "Port reported by device", firmware: "Firmware", type: "Type", modem: "Modem", location: "Location", lastReading: "last reading", lastCommunication: "Last communication", monthlySuccessRate: "Monthly success rate", quickStatus: "Quick status", meterCount: "Meters", activeAlarms: "Active Alarms", activeOrders: "Active Orders", orderSuitability: { title: "Order processing", accessYes: "Reachable", accessNo: "Unreachable", tiers: "Waiting orders — Urgent {{urgent}} · Normal {{normal}} · Bulk {{bulk}}", status: { SUITABLE: "Suitable", NO_ORDERS: "No Waiting Orders", NOT_SUITABLE: "Not Suitable", UNKNOWN: "Unknown" }, hint: { SUITABLE: "Nothing blocks order processing. Reachability is shown separately.", NO_ORDERS: "Nothing blocks order processing, and no orders are waiting.", NOT_SUITABLE: "Something blocks order processing.", UNKNOWN: "Could not be judged: the unit's status or transport type is unknown." }, reason: { PROTOCOL_MISSING: "No protocol is defined on the unit; orders cannot be sent.", IP_INVALID: "The TCP unit has no or an invalid IP address; no connection can be made.", PORT_INVALID: "The TCP unit's port is invalid (outside 1–65535).", POWER_OUTAGE: "The unit has an active power outage; orders are rejected until it ends.", NOT_INSTALLED: "The unit is not installed; orders are only created for installed units." } }, uptime: "Uptime", signal: "Signal", readingRate: "Reading Rate", calendar: { title: "Reading calendar", prevMonth: "Previous month", nextMonth: "Next month", months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], dayLabels: ["M", "T", "W", "T", "F", "S", "S"], status: { ok: "Read", warn: "Missing reading", crit: "Reading error", noData: "No data" }, legend: { ok: "Full", warn: "Missing", crit: "Error", noData: "No data" }, cellAria: "{{date}} — {{status}}, {{count}}/{{expected}} readings" } }, ke = { kirmizi: "Red", turuncu: "Orange", sari: "Yellow", yesil: "Green", mavi: "Blue", mor: "Purple", indigo: "Indigo", pembe: "Pink" }, ge = { day: "Day", total: "Total", legend_low: "Low", legend_high: "High" }, pe = { tabs_aria: "Detail tabs" }, he = { topology: { erp_sub: "Enterprise", epias_sub: "Energy Market", mobile_label: "Mobile", mobile_sub: "Customer App", meters_stat: "5M Meters · 220 GB/day · 99% SLA", modem_label: "1M Modems" } }, fe = { once: "Before", sonra: "After", eklendi: "added", silindi: "removed", eklenen_satir: "Lines added: {{count}}", silinen_satir: "Lines removed: {{count}}", gorunum: "Diff view", birlesik: "Unified", yan_yana: "Side by side", alanlar: "Fields ({{count}})", fark_yok: "No differences — the documents are equal.", fark: "Line diff", degismeyen_satirlar: "⋯ Unchanged lines: {{count}} — show", tur_added: "Added", tur_removed: "Removed", tur_changed: "Changed" }, Ee = { zorunlu: "This field is required", desen_uyumsuz: "Invalid format ({{pattern}})", varsayilan: "Default: {{value}}", desen_ipucu: "Invalid format: {{hint}}" }, Se = { anahtar: "Key", deger: "Value", islemler: "Actions", anahtar_zorunlu: "Key is required", anahtar_tekrar: "This key is on more than one row", anahtar_desen: "Invalid key format ({{pattern}})", deger_zorunlu: "Value is required", deger_kisa: "Value is too short (minimum {{count}})", deger_uzun: "Value is too long (maximum {{count}})", satiri_sil: "Remove row {{key}}", ekle: "Add row", bos: "No entries.", anahtar_desen_ipucu: "Invalid key format: {{hint}}" }, Te = { disa_aktar: "Export", format_sec: "Choose a file format", format_xlsx: "Excel (XLSX)", format_csv: "CSV", format_pdf: "PDF", pdf_limit: "Up to {{limit}} rows", hazirlaniyor: "Preparing…", hazirlaniyor_yuzde: "Preparing… {{progress}}", indirme_basladi: "Download started. If the file does not arrive, download it again from Download History.", arka_planda: "The file is still being prepared. Download it from Download History when it is ready.", indirme_basarisiz: "The file could not be downloaded. Try again from Download History in a moment.", gecmisi_ac: "Open Download History", gecmis_indirme_basladi: "Download started. If the file does not arrive, try again.", gecmis_indirme_basarisiz: "The file could not be downloaded. Try again in a moment.", iptal_edildi: "The export was cancelled.", status_queued: "Queued", status_running: "Running", status_completed: "Completed", status_failed: "Failed", status_cancelled: "Cancelled", status_expired: "Expired", iptal_istendi: "Cancel requested", kolon_rapor: "Report", kolon_olusturan: "Created by", kolon_talep: "Requested", kolon_bitis: "Finished", kolon_durum: "Status", kolon_ilerleme: "Progress", kolon_kayit: "Rows", kolon_boyut: "Size", kolon_hata: "Error", kolon_islemler: "Actions", indir: "Download", indir_aria: "Download {{name}}", iptal_et: "Cancel", iptal_aria: "Cancel export {{name}}", adsiz: "Untitled export", bos_baslik: "No exports", bos_aciklama: "No export has been started yet.", liste_hata: "Could not load the download history.", hata_satiri: "Code: {{code}}, Error: {{message}}", hata_export_001: "Export not found.", hata_export_002: "The file has expired and can no longer be downloaded.", hata_export_003: "An identical export is already in progress. Please check Download History.", hata_export_004: "You can run at most {{limit}} exports at a time. Wait for one to finish.", hata_export_005: "The system is busy. Please try again shortly.", hata_export_006: "This list cannot be exported.", hata_export_007: "There were no rows to export.", hata_export_008: "The export ran out of time or retries.", hata_export_009: "The export stopped because you no longer have access to this data.", hata_export_010: "File storage is unavailable. Please try again.", hata_export_011: "This is not possible in the export's current state.", hata_export_012: "The list service answered unexpectedly; the export could not finish.", hata_export_013: "The export columns are invalid.", hata_export_014: "PDF is limited to {{limit}} rows. Choose Excel or CSV.", hata_dogrulama: "The export request is invalid.", hata_yetki: "You are not allowed to see everyone's exports.", hata_genel: "The export failed." }, n = {
38
- common: x,
39
- table: W,
40
- form: K,
41
- dialog: F,
42
- order: V,
43
- monitoring: j,
44
- months: q,
45
- weekDays: $,
46
- cron: Q,
47
- timeline: J,
48
- live: X,
49
- notifications: Z,
50
- map: ee,
51
- theme: ae,
52
- date: ie,
53
- pagination: te,
54
- empty: re,
55
- status: ne,
56
- editablegrid: oe,
57
- filter: le,
58
- json_editor: se,
59
- rich_text_editor: de,
60
- map_shell: me,
61
- aria: ue,
62
- detail_status: ye,
63
- dashboard: ce,
64
- detail_hero: _e,
65
- color: ke,
66
- grid: ge,
67
- detail: pe,
68
- auth: he,
69
- json_diff: fe,
70
- parameter_form: Ee,
71
- key_value_editor: Se,
72
- export_job: Te
73
- }, Ae = {
74
- tr: { common: r },
75
- en: { common: n }
76
- };
77
- function be(e, o = {}) {
78
- const { namespace: a = "common", overwrite: i = !1, deep: t = !0 } = o;
79
- return e.addResourceBundle("tr", a, r, t, i), e.addResourceBundle("en", a, n, t, i), e;
80
- }
81
- export {
82
- n as e,
83
- be as r,
84
- r as t,
85
- Ae as u
86
- };