@maudecode/kanvil 0.5.0 → 0.6.1

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 (133) hide show
  1. package/apps/server/dist/{auth-Cs_whzgk.mjs → auth-CFjetlB4.mjs} +63 -15
  2. package/apps/server/dist/client.mjs +10 -9
  3. package/apps/server/dist/{config-DKuNQY5b.mjs → config-BQw6mPzE.mjs} +1 -1
  4. package/apps/server/dist/index.mjs +10 -5
  5. package/apps/server/dist/migrate.mjs +1 -1
  6. package/apps/server/dist/recover.mjs +3 -3
  7. package/apps/server/dist/{src-DptOUNRd.mjs → src-BaTNDJB7.mjs} +93 -5
  8. package/apps/server/drizzle/0039_intake_credential.sql +2 -0
  9. package/apps/server/drizzle/meta/0039_snapshot.json +7020 -0
  10. package/apps/server/drizzle/meta/_journal.json +7 -0
  11. package/apps/web/dist/assets/{CompositeItem-CXqewtEL.js → CompositeItem-Dotj8JZL.js} +1 -1
  12. package/apps/web/dist/assets/{Trans-B1rRlWca.js → Trans-CE4EAAY1.js} +1 -1
  13. package/apps/web/dist/assets/admin-settings-CO7nnD9T.js +1 -0
  14. package/apps/web/dist/assets/{archive-restore-76sStk8K.js → archive-restore-BMtgjFUu.js} +1 -1
  15. package/apps/web/dist/assets/az-AZ-R8_HFWJr.js +1 -0
  16. package/apps/web/dist/assets/{az-B7OgHoaE.js → az-B-DxMc__.js} +1 -1
  17. package/apps/web/dist/assets/configuration-Bnt72HRu.js +1 -0
  18. package/apps/web/dist/assets/{corner-left-up-PD-73Nae.js → corner-left-up-O4OsTW-L.js} +1 -1
  19. package/apps/web/dist/assets/{de-B-bv38Q0.js → de-Btbkq-aX.js} +1 -1
  20. package/apps/web/dist/assets/de-DE-BHgMj19Y.js +1 -0
  21. package/apps/web/dist/assets/default-DqsN66dq.js +56 -0
  22. package/apps/web/dist/assets/delivery-settings-Cji0N0m0.js +1 -0
  23. package/apps/web/dist/assets/{el-BQHQHQgX.js → el-DBVEX16k.js} +1 -1
  24. package/apps/web/dist/assets/el-GR-CQFGM5Sr.js +1 -0
  25. package/apps/web/dist/assets/{ellipsis-GF1HwTDb.js → ellipsis-CvEPDi9V.js} +1 -1
  26. package/apps/web/dist/assets/{es-f5Xr8ldr.js → es-CMJoxZBk.js} +1 -1
  27. package/apps/web/dist/assets/es-ES-DZkcRVA4.js +1 -0
  28. package/apps/web/dist/assets/{forms-BlEL8C_P.js → forms-DbfnnPg_.js} +1 -1
  29. package/apps/web/dist/assets/fr-FR-CRPAezXU.js +1 -0
  30. package/apps/web/dist/assets/{fr-DSR0htnl.js → fr-OyEmYoRn.js} +1 -1
  31. package/apps/web/dist/assets/{hi-BaAJEWuW.js → hi-CIgXSseB.js} +1 -1
  32. package/apps/web/dist/assets/hi-IN-2YFE4UQk.js +1 -0
  33. package/apps/web/dist/assets/{highlight-DXT2xgt8.js → highlight-B4K3yEEh.js} +1 -1
  34. package/apps/web/dist/assets/id-ID-B-J0_QIW.js +1 -0
  35. package/apps/web/dist/assets/{id-kxogWcip.js → id-WV2oSAPB.js} +1 -1
  36. package/apps/web/dist/assets/index-BAnwOrh1.css +2 -0
  37. package/apps/web/dist/assets/index-nltuyQtq.js +17 -0
  38. package/apps/web/dist/assets/invitations-BTB8f2Xl.js +1 -0
  39. package/apps/web/dist/assets/{it-C_qk40U6.js → it-BWSrRqus.js} +1 -1
  40. package/apps/web/dist/assets/it-IT-CJ0HYggO.js +1 -0
  41. package/apps/web/dist/assets/item-HmFuRZet.js +1 -0
  42. package/apps/web/dist/assets/{ja-Dn5h64V9.js → ja-BtOHWvUJ.js} +1 -1
  43. package/apps/web/dist/assets/ja-JP-DDQS7D7b.js +1 -0
  44. package/apps/web/dist/assets/{ko-CjaoEPuG.js → ko-DAryK0HN.js} +1 -1
  45. package/apps/web/dist/assets/ko-KR-CkpoewEa.js +1 -0
  46. package/apps/web/dist/assets/label-settings-ssfEX2uR.js +1 -0
  47. package/apps/web/dist/assets/{markdown-blocks-BQLO-H_7.js → markdown-blocks-B1kO6iku.js} +1 -1
  48. package/apps/web/dist/assets/member-directory-BA4ZT1qU.js +1 -0
  49. package/apps/web/dist/assets/{mk-jLeGD50T.js → mk-DBbiGUk5.js} +1 -1
  50. package/apps/web/dist/assets/mk-MK-C0RhS6XR.js +1 -0
  51. package/apps/web/dist/assets/{nl-AVtC5ygT.js → nl-D4V-8WdF.js} +1 -1
  52. package/apps/web/dist/assets/nl-NL-BSKqlzcL.js +1 -0
  53. package/apps/web/dist/assets/{pl-Dup1h_Y1.js → pl-C--QrxO0.js} +1 -1
  54. package/apps/web/dist/assets/pl-PL-CHz38SiU.js +1 -0
  55. package/apps/web/dist/assets/project-lifecycle-COZb9FqM.js +1 -0
  56. package/apps/web/dist/assets/project-settings-DwmTm9KA.js +1 -0
  57. package/apps/web/dist/assets/pt-BR-BotWHRiO.js +1 -0
  58. package/apps/web/dist/assets/{pt-BR-Cm04EWM-.js → pt-BR-DvFVKpmO.js} +1 -1
  59. package/apps/web/dist/assets/{public-project-BivDjU_a.js → public-project-B3hEkeCF.js} +1 -1
  60. package/apps/web/dist/assets/{rotate-ccw-CSaKhZYt.js → rotate-ccw-CB36Zu3L.js} +1 -1
  61. package/apps/web/dist/assets/ru-RU-DtOwNna6.js +1 -0
  62. package/apps/web/dist/assets/{ru-IeycXsyE.js → ru-UmbPUOka.js} +1 -1
  63. package/apps/web/dist/assets/search-Cvetr1OK.js +85 -0
  64. package/apps/web/dist/assets/{send-BLMZ8gQ0.js → send-CJDct4Oj.js} +1 -1
  65. package/apps/web/dist/assets/settings-3IXm9lJ-.js +1 -0
  66. package/apps/web/dist/assets/{sliders-horizontal-Db6kRvuw.js → sliders-horizontal-dmqWngxy.js} +1 -1
  67. package/apps/web/dist/assets/switch-BtScTpP9.js +1 -0
  68. package/apps/web/dist/assets/{table-UJp5S9yy.js → table-byFokzo-.js} +1 -1
  69. package/apps/web/dist/assets/ticket-detail-C3YA3Hzc.js +2 -0
  70. package/apps/web/dist/assets/ticket-editor-CZnZQMG1.js +2 -0
  71. package/apps/web/dist/assets/ticket-list-BXUorfmj.js +6 -0
  72. package/apps/web/dist/assets/ticket-list-controls-BxGKCZMo.js +1 -0
  73. package/apps/web/dist/assets/{tr-DtT_dKUK.js → tr-CNpgQ4ka.js} +1 -1
  74. package/apps/web/dist/assets/tr-TR-CdG2alU2.js +1 -0
  75. package/apps/web/dist/assets/{uk-CsbeHSS6.js → uk-MQoTXdpk.js} +1 -1
  76. package/apps/web/dist/assets/uk-UA-Ceu5gorw.js +1 -0
  77. package/apps/web/dist/assets/{upload-DUEg04Nj.js → upload-D1x_ib3B.js} +1 -1
  78. package/apps/web/dist/assets/useQueries-BnlNCoy4.js +1 -0
  79. package/apps/web/dist/assets/{vi-rkf1BOLx.js → vi-CEw4gTWc.js} +1 -1
  80. package/apps/web/dist/assets/vi-VN-CxshgV4W.js +1 -0
  81. package/apps/web/dist/assets/visual-editor-CpdMRn3e.js +208 -0
  82. package/apps/web/dist/assets/workspace-settings-BickBtZx.js +1 -0
  83. package/apps/web/dist/assets/{zh-CN-Xo-QId5w.js → zh-CN-ChzoXkfr.js} +1 -1
  84. package/apps/web/dist/assets/zh-CN-D7Yrjhd3.js +1 -0
  85. package/apps/web/dist/assets/zh-TW-DyF38kqx.js +1 -0
  86. package/apps/web/dist/assets/{zh-TW-DEnTqjbn.js → zh-TW-bWBKARrK.js} +1 -1
  87. package/apps/web/dist/index.html +9 -9
  88. package/docs/api.md +5 -3
  89. package/docs/cli.md +1 -1
  90. package/docs/mobile.md +67 -4
  91. package/docs/releasing.md +6 -4
  92. package/package.json +1 -1
  93. package/apps/web/dist/assets/admin-settings-DE3MfBFE.js +0 -1
  94. package/apps/web/dist/assets/az-AZ-bFxpMMZN.js +0 -1
  95. package/apps/web/dist/assets/de-DE-BeXI30Ll.js +0 -1
  96. package/apps/web/dist/assets/default-bQFGTwIp.js +0 -56
  97. package/apps/web/dist/assets/delivery-settings-BvMeOsCS.js +0 -1
  98. package/apps/web/dist/assets/el-GR-SgRHlWhY.js +0 -1
  99. package/apps/web/dist/assets/es-ES-BF1J5vap.js +0 -1
  100. package/apps/web/dist/assets/fr-FR-D_sldwf6.js +0 -1
  101. package/apps/web/dist/assets/hi-IN-CfOw4TWf.js +0 -1
  102. package/apps/web/dist/assets/id-ID-CLKtHO7Q.js +0 -1
  103. package/apps/web/dist/assets/index-CYVrs22O.js +0 -17
  104. package/apps/web/dist/assets/index-DyQNFS69.css +0 -2
  105. package/apps/web/dist/assets/invitations-BPik3J_G.js +0 -1
  106. package/apps/web/dist/assets/it-IT-eVZNW5qX.js +0 -1
  107. package/apps/web/dist/assets/item-TCHuZNK6.js +0 -1
  108. package/apps/web/dist/assets/ja-JP-D96njn-P.js +0 -1
  109. package/apps/web/dist/assets/ko-KR-Bash_ieA.js +0 -1
  110. package/apps/web/dist/assets/label-settings-DZTorNDm.js +0 -1
  111. package/apps/web/dist/assets/member-directory-Dx_jQYfI.js +0 -1
  112. package/apps/web/dist/assets/mk-MK-BWQWGIRx.js +0 -1
  113. package/apps/web/dist/assets/nl-NL-D1tvo0Gd.js +0 -1
  114. package/apps/web/dist/assets/pl-PL-DNgGUEcQ.js +0 -1
  115. package/apps/web/dist/assets/project-lifecycle-n1ZZbYfu.js +0 -1
  116. package/apps/web/dist/assets/project-settings-B_Ih5kiz.js +0 -1
  117. package/apps/web/dist/assets/pt-BR-CZsUZQ6P.js +0 -1
  118. package/apps/web/dist/assets/ru-RU-4ew92YE_.js +0 -1
  119. package/apps/web/dist/assets/search-Ble6WSEU.js +0 -85
  120. package/apps/web/dist/assets/settings-CH48qQK2.js +0 -1
  121. package/apps/web/dist/assets/switch-BeX-0Fwq.js +0 -1
  122. package/apps/web/dist/assets/ticket-detail-C24opfNW.js +0 -2
  123. package/apps/web/dist/assets/ticket-editor--d_bG9C1.js +0 -2
  124. package/apps/web/dist/assets/ticket-list-DRbZWYHf.js +0 -5
  125. package/apps/web/dist/assets/ticket-list-controls-fYBottFC.js +0 -1
  126. package/apps/web/dist/assets/tr-TR-CM381XCw.js +0 -1
  127. package/apps/web/dist/assets/uk-UA-AeOiWCVo.js +0 -1
  128. package/apps/web/dist/assets/useQueries-5lW2C5Sb.js +0 -1
  129. package/apps/web/dist/assets/vi-VN-td08xXv9.js +0 -1
  130. package/apps/web/dist/assets/visual-editor-DkFLjouD.js +0 -208
  131. package/apps/web/dist/assets/workspace-settings-Bcsp-VoJ.js +0 -1
  132. package/apps/web/dist/assets/zh-CN-D3dhEYLS.js +0 -1
  133. package/apps/web/dist/assets/zh-TW-CfhOEFo8.js +0 -1
package/docs/mobile.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Native app
2
2
 
3
- Kanvil uses Expo SDK 57 with its compatible React Native and React versions. Web and native use the same contracts, ticket defaults, draft format, API client, and realtime recovery. Controls and navigation use their platform's renderer; the web DOM controls cannot provide native inputs, navigation, or document pickers.
3
+ Kanvil uses Expo SDK 58 with its compatible React Native and React versions. Web and native use the same contracts, ticket defaults, draft format, API client, settings catalogs, themes, Markdown editing commands, schedule calculations, and realtime recovery. Controls and navigation use their platform's renderer; the web DOM controls cannot provide native inputs, navigation, or document pickers.
4
4
 
5
5
  ## Development
6
6
 
@@ -15,11 +15,25 @@ pnpm --filter @kanvil/mobile android
15
15
 
16
16
  Enter your server's origin in the app. An iOS simulator can reach the host through `http://localhost:5180`; a phone needs your reachable HTTPS address. Release builds require HTTPS. Local development allows HTTP. The server must expose its auth and API endpoints at the origin's root.
17
17
 
18
- Native projects are generated from `app.config.ts` and its Expo plugins. Keep `ios/` and `android/` untracked. Expo's `enableSceneSupport` option is enabled for SDK 57 builds using Xcode 27; this uses Expo's scene lifecycle implementation. See the [Expo lifecycle guide](https://github.com/expo/fyi/blob/main/ios-scene-lifecycle.md).
18
+ Native projects are generated from `app.config.ts` and its Expo plugins. Keep `ios/` and `android/` untracked. SDK 58 enables Expo's scene lifecycle by default. Use Xcode 27.1 or newer for iPhone Duo support; see [Expo's Duo guidance](https://expo.dev/blog/supporting-iphone-duo).
19
+
20
+ ## Navigation and capabilities
21
+
22
+ Projects, My work, Inbox, Search, and Settings use the native tab controller, with a browsing stack under each tab so navigation remains reachable inside projects and tickets. A searchable workspace/project picker is available in every browsing header. Project switching replaces the current project destination and restores its filters, search, layout, calendar anchor, selected ticket, and list position for the current account. Workspace switching leaves old project routes. Workspace selection and page actions use native navigation-bar items and menus on iOS, allowing UIKit to place them in the Duo rail. Android renders the same action descriptions through shared header controls and sheets. Pickers and form sheets use a full-screen native stack presentation, with Cancel/Close and the primary action in native bars. The presenting screen completes its return transition before the temporary navigator is removed, preserving touches through repeated and nested sheets. Sheet actions that open a ticket editor wait for that native dismissal before presenting its modal. The signed-out surface paints the entire window, including the rail's safe area.
23
+
24
+ Ticket lists provide workflow sections, filters, saved views, planning, bulk edits, and List/Board/Calendar/Timeline layouts. List and Board previews and calendar details use one adaptive pane layout. UIKit's active reserved-region measurements place panes on either side of the fold on iOS 27.1+; Android fold geometry comes from the same provider. Other devices split when both minimum pane sizes fit. Both React Native panes stay mounted, preserving scroll positions and form state when folding. Compact layouts show the active pane. Forms, pickers, and ordinary lists stay on one usable facet while the fold is active. Safe areas are measured inside the native screen and consumed once at the shared content boundary; modal windows start fresh inset ownership. The alpha Screens split controller is unsuitable here because it cannot be nested in another navigator and cannot customize its column headers; see [Expo's limitations](https://docs.expo.dev/versions/latest/sdk/router/split-view/#known-limitations).
25
+
26
+ Secondary scope and active-query summaries belong to scrolling content. Views, filters and creation use native bar items. Single-scroller iOS screens and wide ticket lists extend under translucent system bars with native soft scroll edges; Board, Calendar, and image backgrounds retain explicit safe inset handling where native edge attachment is ambiguous. Compact native titles use semantic foreground colour and system typography. Settings and forms use inset grouped sections; document and collection screens stay plain. Horizontal safe areas and fold exclusion remain owned by the shared content boundary.
27
+
28
+ Project directories show identity and counts; project information remains available through the project settings action or a long press. Ticket rows wrap their full titles and use a measured line of metadata, label dots and scope text, with filled tags and every property available in detail. Search comments have a short excerpt and a readable preview; role permissions expand in place.
29
+
30
+ Native settings expose account/profile security, appearance and custom themes, API credentials, notification rules and delivery channels, workspace membership/roles/labels, project workflow/custom fields/access/lifecycle, tracker imports, repositories, and calendar feeds. Instance administrators also have user, workspace, storage, search, event-broker, and authentication settings. The server remains responsible for permissions, validation, version checks, and destructive-operation blockers.
31
+
32
+ The pinned Screens patch sizes the tabs controller to its measured host before window attachment, so UIKit constructs its bars for the active display on an unfolded cold launch. It preserves equal native bar-item configurations and commits changed arrays through UIKit's animated setters. Item identifiers and grouping stay stable while searching; the active primary action has higher visibility than menus and the project picker. UIKit owns push/pop motion; native tabs use a short opacity transition through the public tab-controller animation delegate. Both tab and in-page changes honor Reduce Motion. The classic screen explicitly associates its measured content scroll view using `setContentScrollView:forEdge:` and refreshes edge settings after layout, including split-pane changes. Shared List/Scroll layout callbacks request soft edges after their actual scroll view exists. Screen preserves its native stacking context so Fabric cannot hoist a background leaf ahead of the scroll-content chain.
19
33
 
20
34
  ## Sessions and cached data
21
35
 
22
- Better Auth's Expo plugin stores session cookies and its session cache in SecureStore, with a separate namespace for each normalized server origin. Ticket caches and drafts use AsyncStorage, scoped to both that origin and account. Mutation state is never persisted for later automatic submission. Failed offline writes remain drafts and must be explicitly saved again.
36
+ Better Auth's Expo plugin stores session cookies and its session cache in SecureStore, with a separate namespace for each normalized server origin. Ticket caches and drafts use AsyncStorage, scoped to both that origin and account. Successful reads remain cached after network or server failures; explicit client-side API rejections such as revoked access are excluded from persistence. Mutation state is never persisted for later automatic submission. Failed offline writes remain drafts and must be explicitly saved again.
23
37
 
24
38
  Local login and explicitly linked OIDC accounts use the same project permissions. PocketID redirects to the server's `/api/auth/callback/oidc`; the Expo integration completes the return to `kanvil://auth/callback`. Ticket links use `kanvil://projects/<projectId>/tickets/<ticketId>`.
25
39
 
@@ -33,8 +47,32 @@ Settings has a global push preference and an action to enable or disable this de
33
47
 
34
48
  Outbox commits, receipt processing, retry/restart behavior, membership revocation during delivery, account changes on a shared device, and session revocation are tested with an isolated transport. Native Inbox/push preference changes were checked against a second HTTP client on the iOS simulator. Real APNs/FCM delivery and notification-tap routing have not been validated; they need signing/push configuration and an authorized notification source. The unconfigured simulator rejected an injected notification with `UNErrorDomain 2003: Source is not authorized`.
35
49
 
50
+ Local search in Projects, My work, and project tickets opens on demand from their native options/Views menu, using a stacked search field that collapses with scrolling on iOS. Closing the native search field or dismissing its keyboard retains the query; the removable search row clears it. Platforms that expose a search Cancel callback also clear the query on Cancel. Compact ticket detail hides list search and restores it on Back. The dedicated Search tab keeps its native stacked input available; result-type filters use a native menu. Workspace roots show the workspace name as a picker action; Search keeps its result-type choice on that same strip. The picker changes workspace in place; selecting the current project dismisses it without resetting the active screen.
51
+
52
+ Ticket-list status headers expand and collapse their rows, pin below the native bar while scrolling, and are pushed away by the next section. Counts include every matching ticket. Normal disclosure choices are retained by project and collection; search starts with matching sections expanded and keeps temporary choices until the query changes. Clearing search restores normal disclosure choices. Views uses one native grouped menu for layouts, All tickets/Planning, saved views, section controls, and explicit selection. The native Views action contains the same layout palette, symbols and filter controls. Active queries and filter counts also appear on its badge. Saved views have a searchable management sheet. Active filter clauses combine property, operator, and values; Add filter reveals further properties. Planning always uses a Planned/Archived list. Ticket rows use the same canonical status, priority, kind, and difficulty symbols as web, alongside assignment, dates, colored labels, and scopes. My work groups by due window or project; Calendar shows work density and a day agenda, and Timeline keeps ticket identity beside the chart. Rows wrap full titles, flow labels and scopes together in measured previews, and distinguish the open split-view ticket from bulk selection. Native Markdown inputs put formatting above the keyboard on iOS; Android retains its inline toolbar. Profile-name saves use the native header while other account operations retain their independent transaction boundaries. Cached revalidation leaves the pull-to-refresh indicator idle; a user pull owns its visible lifecycle. The native tab controller disables automatic minimization, and connection status stays inside screen content rather than resizing the navigator. Empty results, loading additional batches, and failed reads have separate states.
53
+
54
+ The composer puts the title, compact property choices, and description first. Finite property choices use anchored native menus; searchable and multiple choices use sheets. Markdown uses a native Write/Preview segment and a continuous formatting strip; acceptance criteria and advanced properties expand in place. Closing retains the visible local draft; Discard explicitly removes it. Detail reuses those property values for quick edits, and comments compose in a sheet with native submission. Settings titles identify the current section, with color previews and compact reorder actions. Account, workspace, project and administrator sections are direct rows on the main Settings page in compact layouts; the rail does not hide them in a section menu. Choosing a project there reveals its section rows in place.
55
+
56
+ Native rail actions have semantic symbols and stable identifiers. Create is high priority in an unselected project list, Edit in visible detail, Done and Fields during selection, and Save in editors. Views has default priority, secondary ticket/settings menus low priority; list controls disappear in compact detail and selection. Search lowers secondary browsing priorities while typing. UIKit owns the actual overflow decision; priority is a preference, not a fixed rail width or guaranteed pin. Application menus avoid the system overflow ellipsis.
57
+
58
+ The native-stack type patch permits explicitly clearing `headerSearchBarOptions`, matching its existing runtime nullish check. This removes list search from compact detail and selection mode without replacing the system bar.
59
+
60
+ Settings navigation uses a flat sidebar with rounded, tinted selections and semantic foreground text. Each section has its own native route identity, scoped to its workspace or project where applicable, so changing sections cannot transfer scroll momentum or form state. Returning to a section restores its own mounted page. Shared rows use inset rounded feedback for browsing, choice sheets, and project pickers; selected rows keep their accessible state and checkmarks. Grouped forms remain separate from navigation, and row text continues to wrap.
61
+
62
+ Wide split layouts keep their translucent native bar at a stable height while either pane scrolls. The Screens/native-stack patch exposes UIKit's iOS 27 minimization policy separately from translucency; compact routes and standalone detail pages retain automatic minimization. The signed-binary gate verifies this native override alongside the tab sizing fix. All flat split layouts share an adjustable divider and saved sidebar width, constrained to keep both panes usable; a measured physical fold fixes the divider instead. Ticket and Settings sidebars share the semantic sidebar background and rounded, tinted active rows. A collapsed or sole collection uses the normal screen surface, matching the exposed canvas beneath the native rail; the sidebar palette applies only beside a visible secondary pane. Both expose the same native sidebar toggle. Board uses the available width before a ticket is selected and keeps active query/filter and read-error summaries visible after loading.
63
+
64
+ Wide search opens inside the native bar without hiding it or stacking an extra row over both panes. Split-browsing scrollers keep the same inset owner across folding and presentations. They use measured bar clearance instead of inheriting automatic inset changes from another scroller or a search/sheet presentation. Non-minimizing native screens report the current public bar frame, so rotation updates the measurement without frozen or device-specific padding. In-place split browsers reserve horizontal gestures for their content and divider; native Back gestures remain available on standalone ticket routes and compact Settings pages. Compact split detail returns through its native list Back action.
65
+
66
+ Native bars stay transparent with their soft scroll edges. A project's name is a labeled system bar button that opens the existing project picker, replacing the duplicate fixed project title. Other translucent native titles use the existing titleView slot with a content-sized regular UIGlassEffect, semantic text attributes and Dynamic Type. Its label is an accessibility heading; its intrinsic size follows the title. No scrolling pixels, viewport layers or full-width header backgrounds are masked. Sticky headings retain their owning pane surface and next-section push-off. The resize target remains the 44-point grip, with the rest of the divider passing touches through.
67
+
68
+ On iOS 27.1+, native vertical-bar compression prefers action items, compressing integrated tabs before actions when space is constrained. UIKit still owns tab expansion; this is not a permanently minimized tab policy. Split detail keeps its ticket actions to sidebar, Edit and List options, alongside the project picker. Expanded native tabs otherwise overlap lower controls despite visibility priorities. List options places checked ordering criteria and direction first, with Views and secondary creation/ticket actions in the same native menu. Browsing without detail retains direct New ticket. Common and currently selected criteria appear first; the remaining contract-defined criteria stay under More. Ordering uses the same filter callback and saved-view reset as the Filters sheet. The project button has a disclosure chevron; directory and Search rows navigate without selection checks, which belong only to the picker.
69
+
70
+ The root-scroll collector stops at nested scroll views and child screens, keeping system edge configuration scoped to the owning screen. No per-scroll-view opacity mask or bounds observer remains to carry into a recycled Timeline chart or code pane.
71
+
36
72
  ## Checks
37
73
 
74
+ The native sidebar button hides or restores the ticket list while keeping its scroll position and the open ticket's drafts mounted. The choice is retained per project during the account session. The native workspace/project picker replaces the project-level Back button; Back from compact ticket detail still returns to its list. Settings keeps one persistent category list outside its native detail stack on wide and book layouts. Each column scrolls independently; category selection replaces the visible detail without a slide, including the first selection, and retains the list position. Compact displays use the same detail stack at full width. Standalone reading and editing screens prefer the right-hand facet while a fold is active, falling back only when it is too constrained.
75
+
38
76
  ```sh
39
77
  pnpm --filter @kanvil/mobile typecheck
40
78
  pnpm --filter @kanvil/mobile exec expo install --check
@@ -45,6 +83,8 @@ Export checks both iOS and Android JavaScript bundles. It does not replace nativ
45
83
 
46
84
  Initial simulator validation includes native owner/project/ticket creation, Markdown rendering, authenticated realtime, deep links, session restoration, persisted drafts across termination, and a concurrent server update preventing an overwrite. Switching between cached ticket deep links kept each comment draft with its original ticket.
47
85
 
86
+ The navigation overhaul was compiled with Xcode 27.1 and exercised against the disposable HTTPS fixture on iPhone Duo (iOS 27.1) and a standard iPhone (iOS 27.0). Checks included native tabs and bar menus, workspace switching, project creation, list/detail collapse, Calendar and Timeline with scheduled data, an unsaved edit retained across folding and then saved into both panes, sign-out/in, and consecutive project-settings saves verified against the server's version. Login background samples match the rail in both appearances on the open and closed Duo. Web regression tests and desktop/390px visual checks cover the extracted shared code. These simulator checks do not establish physical-Duo behavior or real push delivery.
87
+
48
88
  An ad-hoc-signed iOS Release app was also compiled with Xcode 27.1 and run on iOS 27 with Metro stopped. It rejected HTTP, signed in through a verified HTTPS fixture, showed complete parent/child/relationship titles, explicitly linked PocketID, and signed out/in through the system browser to the same workspace. The provider used its login-code flow after a virtual passkey enrollment. Local password login remained available. Cached reading and cold startup after the backend stopped were checked separately.
49
89
 
50
90
  The Android arm64 Release APK compiled in GitHub Actions and passed signature and embedded-JavaScript verification. Android JavaScript exports also pass. The development host has no Android SDK, and Android device execution has not been performed. Physical-device passkeys, distribution signing, and store publication remain separate validation. See the [verification record](verification.md).
@@ -62,7 +102,28 @@ pnpm --filter @kanvil/mobile exec expo run:ios --configuration Release
62
102
 
63
103
  A Release app requires HTTPS and includes its JavaScript bundle, so Metro is unnecessary. Keep simulator ad-hoc signing enabled; removing signing also removes the entitlements SecureStore needs. For an isolated simulator backend using HTTPS, run `pnpm native:auth-fixture --https --simulator <udid>` and connect to `https://localhost:5188`. Only this test process and selected simulator trust the temporary certificate.
64
104
 
65
- Increment `ios.buildNumber` and `android.versionCode` in `app.config.ts` for subsequent distributed builds. Keep signing material outside the repository. Building a simulator app or preview APK does not publish to an app store or install on a physical device.
105
+ Tagged releases publish iOS to TestFlight after CI passes, using the tag's version and a build number above every uploaded build for that version. See [releases](releasing.md). Local and EAS builds retain the versions in `app.config.ts`; increment `ios.buildNumber` and `android.versionCode` for subsequent builds distributed through those paths. Keep signing material outside the repository. Building a simulator app or preview APK does not publish to an app store or install on a physical device.
106
+
107
+ After changing a native dependency patch, regenerate the native project and reinstall Pods. CocoaPods can retain a path to an older pnpm patch directory even when the dependency version is unchanged. A JavaScript export or incremental archive does not establish which native implementation was linked. Verify the archived executable before exporting, and repeat against the executable extracted from the final IPA:
108
+
109
+ ```sh
110
+ node scripts/verify-ios-tabs.ts /path/to/Kanvil.xcarchive/Products/Applications/Kanvil.app/Kanvil
111
+ ```
112
+
113
+ This macOS build check uses Xcode's disassembler to require the tab host's compiled sizing call before controller attachment. It rejects a stale binary without that fix. It does not establish physical-device startup behavior.
114
+
115
+ ## Local startup diagnostics
116
+
117
+ For a native startup failure that cannot be reproduced on the available simulator, make an explicit diagnostic candidate with `EXPO_PUBLIC_STARTUP_DIAGNOSTICS=1` set during prebuild, JavaScript export, and native compilation:
118
+
119
+ ```sh
120
+ EXPO_PUBLIC_STARTUP_DIAGNOSTICS=1 pnpm --filter @kanvil/mobile exec expo prebuild --platform ios
121
+ EXPO_PUBLIC_STARTUP_DIAGNOSTICS=1 pnpm --filter @kanvil/mobile exec expo run:ios --configuration Release
122
+ ```
123
+
124
+ The config plugin starts the recorder before JavaScript. It records app-owned window/scene geometry, loaded controller and native-bar geometry, item counts, OS/build versions, and lifecycle events. It avoids loading controller views and never reads labels, titles, ticket text, URLs, credentials, or account identifiers. Sampling is bounded after startup/activation, and unchanged samples are omitted. The atomically replaced `kanvil-native-startup.json` file in the app cache is capped at 1 MiB and retained across process launches so cold and foreground-return states can be compared.
125
+
126
+ Only diagnostic candidates expose Settings → Share in the server section. After reproducing the failure, background and return if needed to restore navigation, then share that JSON file. Sharing is manual; the recorder has no network transport. Rebuild without the variable to disable recording and remove the export action. Simulator results remain separate from physical-device confirmation, and the simulator OS must match the affected device before claiming a reproduction.
66
127
 
67
128
  ## Native OIDC fixture
68
129
 
@@ -75,3 +136,5 @@ pnpm native:auth-fixture --simulator <booted-simulator-udid>
75
136
  This generates a private temporary certificate, trusts its public certificate in the selected simulator, starts PocketID at `https://localhost:51411`, and runs an isolated Kanvil backend on port 5188. The backend trusts the certificate through its own `NODE_EXTRA_CA_CERTS` setting. Certificate trust is scoped to that simulator and test process. Stop the fixture with Ctrl-C to remove its container, database, and temporary private key. The simulator's temporary trust entry expires with the test certificate.
76
137
 
77
138
  The fixture uses its own fixed test-only API key and accepts no real PocketID URL or credentials. It is exclusive with `pnpm test:oidc`, which uses the same loopback provider port. Native builds and Metro are started separately using the development commands above.
139
+
140
+ Workspace access is explicit in browsing headers, including ticket and Settings panes. The shared scope button names the active workspace and project and opens the combined picker with workspace choices already visible. Workspace scope rows open workspace choices directly. Selecting the current workspace does not reset the current project or detail; selecting another workspace leaves old scoped routes before selecting the new scope.
package/docs/releasing.md CHANGED
@@ -2,20 +2,22 @@
2
2
 
3
3
  PRs and `main` pushes run `.github/workflows/ci.yml`. `main` pushes also publish an [experimental build](#experimental-builds). Independent suites and browser/native/Docker matrices run in parallel; only jobs consuming build artifacts wait for the build. The always-running `Checks` status requires every suite to succeed. Releases start on a `vX.Y.Z` tag and reuse that workflow against the tagged commit. Publishing jobs have registry write permissions; PR checks have read-only repository access.
4
4
 
5
- The public npm application package is `@maudecode/kanvil`; the workspace root and internal packages remain private. The release tag supplies the version for both npm and Docker: `v1.2.3` publishes `@maudecode/kanvil@1.2.3` and `ghcr.io/maudecode/kanvil:1.2.3`. The server build embeds that same version for Administration, public instance info, OpenAPI, and MCP. Installed artifacts need no Git checkout or release environment variables. No `package.json` version bump is needed. PR and local builds use the development version in `package.json`; custom Docker builds pass `--build-arg KANVIL_VERSION=X.Y.Z` to stamp the server and image label together. Native mobile app/store versions remain separate.
5
+ The public npm application package is `@maudecode/kanvil`; the workspace root and internal packages remain private. The release tag supplies the version for npm, Docker, and iOS: `v1.2.3` publishes `@maudecode/kanvil@1.2.3`, `ghcr.io/maudecode/kanvil:1.2.3`, and Kanvil 1.2.3 on TestFlight. The server build embeds that same version for Administration, public instance info, OpenAPI, and MCP. Installed artifacts need no Git checkout or release environment variables. No `package.json` version bump is needed. PR and local builds use the development version in `package.json`; custom Docker builds pass `--build-arg KANVIL_VERSION=X.Y.Z` to stamp the server and image label together.
6
6
 
7
7
  ## Publish a version
8
8
 
9
9
  1. Merge the intended changes to `main` through a reviewed PR with green `Checks`.
10
10
  2. Fetch `main`, inspect the intended commit, then create and push an annotated tag: `git tag -a vX.Y.Z COMMIT -m "Kanvil X.Y.Z"` and `git push origin vX.Y.Z`. Repository release-tag rules apply. Creating the tag authorizes public publication.
11
11
  3. Check the `Release` run. It rejects malformed or prerelease tags, `v0.0.0`, and commits outside `main` history. The full CI workflow must pass on that commit.
12
- 4. Verify `npm view @maudecode/kanvil@X.Y.Z dist.integrity` and `docker buildx imagetools inspect ghcr.io/maudecode/kanvil:X.Y.Z`. The image includes Linux amd64 and arm64. Confirm anonymous Docker pulls work, and check the GitHub Release for the tag and its automatically generated notes.
12
+ 4. Verify `npm view @maudecode/kanvil@X.Y.Z dist.integrity` and `docker buildx imagetools inspect ghcr.io/maudecode/kanvil:X.Y.Z`. The image includes Linux amd64 and arm64. Confirm anonymous Docker pulls work, check the TestFlight job's summary for the exact iOS version/build in Apple's `VALID` state, and check the GitHub Release for the tag and its automatically generated notes.
13
13
 
14
14
  The workflow publishes the exact npm tarball installed by CI to the `latest` dist-tag, while separate amd64/arm64 publishers push the exact image archives tested by CI. Docker builds and restoration tests run on matching native runners; release publishing does not rebuild or emulate either image. A final Docker manifest job joins those immutable digests under `ghcr.io/maudecode/kanvil:X.Y.Z` and `:latest`. Stable and experimental builds share this publisher, `.github/workflows/publish-images.yml`. Stable releases only; prerelease versions are rejected. Do not tag an older version to move `latest` backward.
15
15
 
16
- If either registry publication fails, rerun the failed release jobs. npm and Docker publication are independent after validation. The npm step accepts an existing version only when its SHA-512 integrity matches the tested tarball; different bytes fail and require a new version. Registry publication is not atomic across npm and GHCR. Never move a published tag or reuse a version for changed bytes. Avoid rerunning an old release after a newer release, since Docker's `latest` tag would move backward.
16
+ If a publisher fails, rerun the failed release jobs. npm, Docker, and iOS publication are independent after validation. The npm step accepts an existing version only when its SHA-512 integrity matches the tested tarball; different bytes fail and require a new version. Publication is not atomic across npm, GHCR, and Apple. An iOS rerun selects a fresh build number for the same version. Never move a published tag or reuse a version for changed bytes. Avoid rerunning an old release after a newer release, since Docker's `latest` tag would move backward.
17
17
 
18
- After npm publication and the Docker manifest job both succeed, the workflow creates a GitHub Release for the existing tag with an automatically generated title and release notes. Only this final job has repository contents write permission. Reruns preserve an existing release and its notes.
18
+ After npm publication, the Docker manifest job, and Apple processing all succeed, the workflow creates a GitHub Release for the existing tag with an automatically generated title and release notes. Only this final job has repository contents write permission. Reruns preserve an existing release and its notes.
19
+
20
+ The iOS publisher uses `.github/workflows/testflight.yml`, an ephemeral hosted Xcode 27 runner, and the `testflight` environment restricted to `v*` tags. That environment needs `APPLE_DEVELOPMENT_TEAM_ID`, `APP_STORE_CONNECT_KEY_ID`, `APP_STORE_CONNECT_ISSUER_ID`, `APP_STORE_CONNECT_PRIVATE_KEY`, `IOS_DISTRIBUTION_CERTIFICATE_P12_BASE64`, and `IOS_DISTRIBUTION_CERTIFICATE_PASSWORD`. The Apple account must contain the `dev.kil.kanvil` app record and an active App Store profile matching the certificate. Configure its TestFlight information and an internal testing group with automatic build distribution in App Store Connect. The publisher generates Expo's native project, archives and verifies its embedded bundle and native fixes, exports a signed IPA, uploads it, and verifies the exact unexpired iOS build after processing. It retains no public IPA artifact. Android store publishing remains separate.
19
21
 
20
22
  ## Experimental builds
21
23
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maudecode/kanvil",
3
- "version": "0.5.0",
3
+ "version": "0.6.1",
4
4
  "description": "Open-source, self-hosted ticketing for agents and people.",
5
5
  "license": "MIT",
6
6
  "engines": {
@@ -1 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{An as t,Cn as n,Dn as r,G as i,Mn as a,Nn as o,On as s,Rt as c,Sn as l,W as u,_n as d,an as f,bn as p,bt as m,gn as h,it as g,mn as _,mt as v,r as y,wn as b,xn as x,yn as ee,zt as S}from"./default-bQFGTwIp.js";import{B as te,G as C,Ga as w,Hi as T,J as E,Ji as D,K as O,Oa as k,Pt as A,Q as ne,U as j,Ui as M,V as N,X as P,Y as F,Yi as re,Zi as ie,aa as ae,at as I,cr as L,di as R,ia as oe,it as z,nt as se,ot as ce,po as le,q as B,qa as V,ra as ue,rt as de,tt as fe,vt as H,wo as U}from"./search-Ble6WSEU.js";import{g as pe}from"./item-TCHuZNK6.js";import{l as me,r as he}from"./project-lifecycle-n1ZZbYfu.js";import{r as ge}from"./CompositeItem-CXqewtEL.js";import{t as _e}from"./ellipsis-GF1HwTDb.js";import{t as ve}from"./invitations-BPik3J_G.js";import{t as W}from"./forms-BlEL8C_P.js";import{A as ye,D as be,E as xe,Ht as G,M as Se,O as Ce,T as we,an as Te,fn as Ee,hn as De,i as K,k as Oe,n as q,r as ke}from"./index-CYVrs22O.js";import{t as Ae}from"./switch-BeX-0Fwq.js";import{a as je,i as J,n as Me,o as Y,r as X,t as Ne}from"./table-UJp5S9yy.js";import{t as Pe}from"./member-directory-Dx_jQYfI.js";var Fe={name:`user-plus`,size:24,node:[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}],[`line`,{x1:`19`,x2:`19`,y1:`8`,y2:`14`,key:`1bvyxn`}],[`line`,{x1:`22`,x2:`16`,y1:`11`,y2:`11`,key:`1shjgl`}]]};Fe.node;var Ie=w(Fe),Z=e(o(),1),Q=y(),Le={get local(){return _(`admin.instance.provider.local`)},get s3(){return _(`admin.instance.provider.s3`)},get postgres(){return _(`admin.instance.provider.postgres`)},get elasticsearch(){return _(`admin.instance.provider.elasticsearch`)},rabbitmq:`RabbitMQ`};function Re({data:e,section:t,onConfigure:n}){if(t===`general`)return(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(z,{title:_(`admin.instance.heading`),action:(0,Q.jsx)(E,{label:_(`admin.instance.edit`),onClick:n,children:(0,Q.jsx)(ge,{})})}),(0,Q.jsx)(q,{title:_(`admin.instance.name`),description:e.name}),(0,Q.jsx)(q,{title:_(`admin.instance.description`),description:e.description||_(`admin.instance.noDescription`)}),(0,Q.jsx)(q,{title:_(`admin.instance.version`),children:(0,Q.jsx)(`code`,{children:e.deployment.version})}),(0,Q.jsx)(q,{title:_(`admin.instance.publicUrl`),children:(0,Q.jsx)(j,{label:_(`admin.instance.publicUrl`),value:e.deployment.url,inline:!0})})]});let r=t===`storage`?e.storage:t===`search`?e.search:e.broker,i=_(t===`storage`?`admin.instance.section.storage`:t===`search`?`admin.instance.section.search`:`admin.instance.section.events`),a=r.source===`deployment`;return(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(z,{title:i,action:(0,Q.jsx)(E,{label:_(a?`admin.instance.viewConfiguration`:`admin.instance.configure.${t}`),onClick:n,children:(0,Q.jsx)(Te,{})})}),(0,Q.jsx)(q,{title:_(`admin.instance.providerTitle`),description:Le[r.provider],children:(0,Q.jsx)(H,{variant:`secondary`,children:_(a?`admin.instance.deploymentManaged`:`admin.instance.instanceManaged`)})}),(0,Q.jsx)(q,{title:_(t===`storage`?`admin.instance.transfers`:t===`search`?`admin.instance.indexStatus`:`admin.instance.connection`),description:t===`storage`?e.storage.provider===`s3`?_(`admin.instance.transfersS3`):_(`admin.instance.transfersLocal`):t===`search`?r.status===`builtin`?_(`admin.instance.searchBuiltIn`):_(`admin.instance.searchIndexed`):_(`admin.instance.eventsConnection`),children:(0,Q.jsx)(H,{variant:r.status===`unavailable`?`destructive`:`outline`,children:r.status===`builtin`?_(`admin.instance.builtIn`):r.status===`ready`?_(t===`events`?`admin.instance.connected`:`admin.instance.upToDate`):_(`admin.instance.status.${r.status}`)})}),t===`storage`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(q,{title:_(`admin.instance.pendingTransfers`),description:e.storage.pending?_(`admin.instance.pendingRemain`):_(`admin.instance.noPending`),children:e.storage.pending}),e.storage.settings&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(q,{title:_(`admin.instance.bucket`),description:e.storage.settings.bucket}),(0,Q.jsx)(j,{label:_(`admin.instance.storageEndpoint`),value:e.storage.settings.endpoint||`Amazon S3`})]}),(0,Q.jsx)(q,{title:_(`admin.instance.backup`),description:e.locations.length?_(`admin.instance.backupBuckets`):_(`admin.instance.backupDatabase`)})]}),t===`search`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(q,{title:_(`admin.instance.fallback`),description:_(`admin.instance.fallbackDescription`)}),e.search.settings&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(j,{label:_(`admin.instance.searchEndpoint`),value:e.search.settings.url}),(0,Q.jsx)(q,{title:_(`admin.instance.index`),description:e.search.settings.index})]})]}),t===`events`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(q,{title:_(`admin.instance.delivery`),description:_(`admin.instance.deliveryDescription`)}),e.broker.settings&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(j,{label:_(`admin.instance.brokerEndpoint`),value:e.broker.settings.endpoint}),(0,Q.jsx)(q,{title:_(`admin.instance.exchange`),description:e.broker.settings.exchange})]})]}),(0,Q.jsx)(O,{error:r.error?Error(r.error):void 0})]})}var ze=g.pick({name:!0,email:!0,image:!0}).extend({id:t(),role:t().nullable(),banned:b(),createdAt:x()}),Be=s({q:t().trim().max(200).default(``),role:l([`all`,`user`,`admin`]).default(`all`),status:l([`all`,`active`,`disabled`]).default(`all`),limit:p().int().min(1).max(100).default(25),offset:p().int().min(0).default(0)}),Ve=s({users:n(ze),total:r().int().nonnegative()}),He=ze.extend({workspaces:n(s({id:a(),name:t(),role:l(S)})),projects:n(s({id:a(),name:t(),role:l(S)})),providers:n(t()),sessionCount:r().int().nonnegative()});s({password:t().min(12).max(128)}).strict(),Be.pick({q:!0,limit:!0,offset:!0});var Ue=s({workspaces:n(s({id:a(),name:t(),slug:t(),ownerId:t().nullable().default(null),createdAt:x(),memberCount:r().int().nonnegative(),projectCount:r().int().nonnegative(),administrators:n(ze.pick({id:!0,name:!0,email:!0,image:!0}))})),total:r().int().nonnegative()});function $({children:e,badge:t}){return(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-4 border-b py-3`,children:[e,(0,Q.jsx)(H,{variant:`outline`,children:t})]})}function We({userId:e,onClose:t,onChanged:n}){let{shown:r,settled:i}=we(e,e=>e),[a,o]=(0,Z.useState)(!1);return(0,Q.jsx)(xe,{open:!!e,onOpenChange:e=>{!e&&!a&&t()},onOpenChangeComplete:i,children:(0,Q.jsx)(be,{className:`w-full! sm:max-w-lg!`,children:r&&(0,Q.jsx)(Ge,{userId:r,pending:a,setPending:o,onClose:t,onChanged:n},r)})})}function Ge({userId:e,pending:t,setPending:n,onClose:r,onChanged:a}){let o=D(),[s,l]=(0,Z.useState)(null),[d,f]=(0,Z.useState)(),p=ue(),m=ie(`set_workspace_member`),h=V({queryKey:[`kanvil`,`user`,e],queryFn:()=>T.request(`/api/v1/admin/users/${encodeURIComponent(e)}`,He)}),g=h.data;async function y(e,t){n(!0),f(void 0);try{let n=await e();if(n&&typeof n==`object`&&`error`in n&&n.error){let e=n.error;throw Error(typeof e==`object`&&`message`in e?String(e.message):_(`admin.account.updateFailed`))}await a(),l(null),k.success(t)}catch(e){throw f(e),e}finally{n(!1)}}return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(Oe,{className:`shrink-0 border-b pr-14`,children:[(0,Q.jsx)(ye,{className:`mb-0`,children:g?.name??_(`admin.account.details`)}),(0,Q.jsx)(Ce,{className:`break-all`,children:g?.email})]}),(0,Q.jsxs)(`div`,{className:`@container min-h-0 overflow-y-auto px-6 pb-8`,children:[(0,Q.jsx)(O,{error:h.error??(s?void 0:d)}),h.isPending?(0,Q.jsx)(P,{}):g&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`mb-7 flex flex-wrap items-center gap-4`,children:[(0,Q.jsx)(oe,{name:g.name,image:g.image,className:`size-16 text-xl`}),(0,Q.jsxs)(`div`,{className:`min-w-40 flex-1`,children:[(0,Q.jsx)(H,{variant:g.banned?`destructive`:`secondary`,children:g.banned?_(`admin.users.disabled`):_(`admin.users.active`)}),(0,Q.jsx)(`p`,{className:`mt-2 mb-0 text-xs text-muted-foreground`,children:_(`admin.account.joined`,{date:u(g.createdAt)})})]}),(0,Q.jsxs)(R,{className:`ml-auto`,onClick:()=>{f(void 0),l(`profile`)},children:[(0,Q.jsx)(ge,{}),_(`admin.account.edit`)]})]}),(0,Q.jsx)(q,{title:_(`admin.account.instanceRole`),description:i(g.role)?_(`admin.account.adminDescription`):_(`admin.account.userDescription`),children:(0,Q.jsx)(R,{onClick:()=>{f(void 0),l(`role`)},children:_(`admin.account.changeRole`)})}),(0,Q.jsx)(q,{title:_(`admin.account.signInMethods`),description:me(g.providers),children:(0,Q.jsxs)(R,{onClick:()=>{f(void 0),l(`password`)},children:[(0,Q.jsx)(Ee,{}),_(`admin.account.setPassword`)]})}),(0,Q.jsx)(q,{title:_(`admin.account.activeSessions`),description:_(`admin.account.sessions`,{count:g.sessionCount}),children:(0,Q.jsx)(N,{label:_(`admin.account.revokeSessions`),description:_(`admin.account.revokeConfirm`,{name:g.name}),onConfirm:()=>y(()=>M.admin.revokeUserSessions({userId:g.id}),_(`admin.account.sessionsRevoked`))})}),g.id!==o.id&&(0,Q.jsx)(q,{title:_(`admin.account.access`),description:g.banned?_(`admin.account.accessDisabled`):_(`admin.account.accessPreserved`),children:(0,Q.jsx)(N,{label:g.banned?_(`admin.account.enable`):_(`admin.account.disable`),danger:!g.banned,description:g.banned?_(`admin.account.enableConfirm`,{name:g.name}):_(`admin.account.disableConfirm`,{name:g.name}),onConfirm:()=>y(()=>g.banned?M.admin.unbanUser({userId:g.id}):M.admin.banUser({userId:g.id,banReason:`Disabled by an instance administrator`}),g.banned?_(`admin.account.enabled`):_(`admin.account.disabledToast`))})}),g.id!==o.id&&(0,Q.jsx)(he,{account:g,onDeleted:async()=>{r(),await a()}}),(0,Q.jsxs)(`section`,{className:`pt-7`,children:[(0,Q.jsxs)(`div`,{className:`mb-3 flex items-center justify-between gap-3`,children:[(0,Q.jsx)(`h3`,{className:`mb-0`,children:_(`admin.account.workspaces`)}),(0,Q.jsxs)(R,{size:`sm`,onClick:()=>{f(void 0),l(`workspace`)},children:[(0,Q.jsx)(pe,{}),_(`admin.account.addToWorkspace`)]})]}),g.workspaces.length?g.workspaces.map(e=>(0,Q.jsx)($,{badge:c[e.role],children:(0,Q.jsx)(G,{to:`/workspaces/$workspaceId/settings`,params:{workspaceId:e.id},search:{section:`members`},onClick:r,className:`text-primary`,dir:`auto`,children:e.name})},e.id)):(0,Q.jsx)(C,{title:_(`admin.account.noWorkspaces`),className:`py-5`})]}),!!g.projects.length&&(0,Q.jsxs)(`section`,{className:`pt-7`,children:[(0,Q.jsx)(`h3`,{children:_(`admin.account.projectAccess`)}),g.projects.map(e=>(0,Q.jsx)($,{badge:c[e.role],children:(0,Q.jsx)(G,{to:`/projects/$projectId/settings`,params:{projectId:e.id},search:{section:`members`},onClick:r,className:`text-primary`,dir:`auto`,children:e.name})},e.id))]})]})]}),g&&(0,Q.jsx)(ne,{title:_(s===`profile`?`admin.account.edit`:s===`role`?`admin.account.changeRoleTitle`:s===`workspace`?`admin.account.addToWorkspace`:`admin.account.setPassword`),open:!!s,onOpenChange:e=>{e||l(null)},busy:t,children:(0,Q.jsxs)(`form`,{onSubmit:e=>{e.preventDefault();let t=new FormData(e.currentTarget),n,r;if(s===`profile`)n=()=>M.admin.updateUser({userId:g.id,data:{name:W(t,`name`),email:W(t,`email`)}}),r=_(`admin.account.updated`);else if(s===`role`)n=()=>M.admin.setRole({userId:g.id,role:t.get(`role`)===`admin`?`admin`:`user`}),r=_(`admin.account.roleUpdated`);else if(s===`workspace`)n=()=>m.mutateAsync({workspaceId:W(t,`workspace`),email:g.email,role:W(t,`role`)===`reader`?`reader`:W(t,`role`)===`admin`?`admin`:`writer`}),r=_(`admin.account.workspaceAdded`);else{let e=W(t,`password`);if(e!==W(t,`confirm`)){f(Error(_(`admin.account.passwordMismatch`)));return}n=()=>T.request(`/api/v1/admin/users/${encodeURIComponent(g.id)}/password`,v,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({password:e})}),r=_(`admin.account.passwordSet`)}y(n,r).catch(()=>{})},children:[s===`profile`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(F,{label:_(`admin.account.name`),name:`name`,defaultValue:g.name,required:!0,maxLength:120,autoFocus:!0}),(0,Q.jsx)(F,{label:_(`admin.account.email`),name:`email`,type:`email`,defaultValue:g.email,required:!0})]}):s===`role`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(I,{label:_(`admin.account.instanceRole`),name:`role`,defaultValue:i(g.role)?`admin`:`user`,children:[(0,Q.jsx)(A,{value:`user`,children:_(`admin.account.user`)}),(0,Q.jsx)(A,{value:`admin`,children:_(`admin.account.administrator`)})]}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:_(`admin.account.adminsNote`)})]}):s===`workspace`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(I,{label:_(`admin.account.workspace`),name:`workspace`,required:!0,children:p.data?.filter(e=>!g.workspaces.some(t=>t.id===e.id)).map(e=>(0,Q.jsx)(A,{value:e.id,children:e.name},e.id))}),(0,Q.jsxs)(I,{label:_(`admin.account.workspaceRole`),name:`role`,defaultValue:`writer`,children:[(0,Q.jsx)(A,{value:`reader`,children:c.reader}),(0,Q.jsx)(A,{value:`writer`,children:c.writer}),(0,Q.jsx)(A,{value:`admin`,children:c.admin})]})]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(F,{label:_(`admin.account.newPassword`),name:`password`,type:`password`,autoComplete:`new-password`,required:!0,minLength:12,maxLength:128}),(0,Q.jsx)(F,{label:_(`admin.account.confirmPassword`),name:`confirm`,type:`password`,autoComplete:`new-password`,required:!0,minLength:12,maxLength:128}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:_(`admin.account.passwordNote`)})]}),(0,Q.jsx)(B,{error:d,pending:t,submitLabel:_(`admin.account.save`),pendingLabel:_(`common.state.saving`),onCancel:()=>l(null)})]},s)})]})}function Ke({onCreated:e,onCancel:t,pending:n,setPending:r}){let i=U(),[a,o]=(0,Z.useState)();async function s(t){t.preventDefault();let n=t.currentTarget,a=new FormData(n);r(!0),o(void 0);try{let t=await M.admin.createUser({name:W(a,`name`),email:W(a,`email`),password:W(a,`password`),role:a.get(`role`)===`admin`?`admin`:`user`});if(t.error)throw Error(t.error.message);await i.invalidateQueries({queryKey:[`kanvil`,`users`]}),e(t.data.user.id,t.data.user.email)}catch(e){o(e)}finally{r(!1)}}return(0,Q.jsx)(`section`,{children:(0,Q.jsxs)(`form`,{onSubmit:e=>{s(e)},children:[(0,Q.jsx)(F,{label:_(`admin.users.name`),name:`name`,required:!0,maxLength:120,autoFocus:!0}),(0,Q.jsx)(F,{label:_(`admin.users.email`),name:`email`,type:`email`,required:!0,autoComplete:`off`}),(0,Q.jsx)(F,{label:_(`admin.users.initialPassword`),name:`password`,type:`password`,autoComplete:`new-password`,minLength:12,maxLength:128,required:!0}),(0,Q.jsxs)(I,{label:_(`admin.users.instanceRole`),name:`role`,children:[(0,Q.jsx)(A,{value:`user`,children:_(`admin.users.user`)}),(0,Q.jsx)(A,{value:`admin`,children:_(`admin.users.administrator`)})]}),(0,Q.jsx)(B,{error:a,pending:n,submitLabel:_(`admin.users.create`),pendingLabel:_(`admin.users.creating`),onCancel:t})]})})}function qe(){let e=U(),t=M.useSession(),[n,r]=(0,Z.useState)(!1),[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)(``),[l,u]=(0,Z.useState)(`all`),[d,f]=(0,Z.useState)(`all`),[p,m]=(0,Z.useState)(0),[h,g]=(0,Z.useState)(null),v=V({queryKey:[`kanvil`,`users`,s,l,d,p],queryFn:()=>T.request(`/api/v1/admin/users?${new URLSearchParams({q:s,role:l,status:d,offset:String(p),limit:`25`})}`,Ve),placeholderData:le});async function y(){await Promise.all([e.invalidateQueries({queryKey:[`kanvil`]}),t.refetch()])}return(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(z,{title:_(`admin.users.title`),action:(0,Q.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center justify-end gap-2`,children:[(0,Q.jsx)(de,{label:_(`admin.users.search`),placeholder:_(`admin.users.searchPlaceholder`),value:s,onChange:e=>{c(e),m(0)}}),(0,Q.jsx)(E,{label:_(`admin.users.new`),variant:`default`,onClick:()=>r(!0),children:(0,Q.jsx)(Ie,{})})]})}),(0,Q.jsxs)(`div`,{className:`mb-5 flex flex-wrap items-center gap-2`,children:[(0,Q.jsxs)(I,{label:_(`admin.users.roleFilter`),labelHidden:!0,className:`mb-0 w-40`,value:l,onValueChange:e=>{e&&u(e),m(0)},children:[(0,Q.jsx)(A,{value:`all`,children:_(`admin.users.allRoles`)}),(0,Q.jsx)(A,{value:`admin`,children:_(`admin.users.administrators`)}),(0,Q.jsx)(A,{value:`user`,children:_(`admin.users.users`)})]}),(0,Q.jsxs)(I,{label:_(`admin.users.statusFilter`),labelHidden:!0,className:`mb-0 w-40`,value:d,onValueChange:e=>{e&&f(e),m(0)},children:[(0,Q.jsx)(A,{value:`all`,children:_(`admin.users.allAccounts`)}),(0,Q.jsx)(A,{value:`active`,children:_(`admin.users.active`)}),(0,Q.jsx)(A,{value:`disabled`,children:_(`admin.users.disabled`)})]})]}),(0,Q.jsx)(O,{error:v.error}),v.isPending?(0,Q.jsx)(P,{}):v.data?.users.length?(0,Q.jsx)(`div`,{"aria-busy":v.isFetching,children:(0,Q.jsxs)(Ne,{mobileLayout:`rows`,"aria-label":_(`admin.users.title`),children:[(0,Q.jsx)(je,{children:(0,Q.jsxs)(Y,{children:[(0,Q.jsx)(J,{children:_(`admin.users.user`)}),(0,Q.jsx)(J,{children:_(`admin.users.role`)}),(0,Q.jsx)(J,{children:_(`admin.users.status`)}),(0,Q.jsx)(J,{children:_(`admin.users.joined`)}),(0,Q.jsx)(J,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:_(`admin.users.actions`)})})]})}),(0,Q.jsx)(Me,{children:v.data.users.map(e=>(0,Q.jsx)(Se,{name:e.name,email:e.email,onOpen:()=>g(e.id),children:(0,Q.jsxs)(Y,{children:[(0,Q.jsx)(X,{className:`whitespace-normal`,children:(0,Q.jsx)(R,{variant:`ghost`,className:`h-auto max-w-full justify-start p-0 text-left hover:bg-transparent`,onClick:()=>g(e.id),children:(0,Q.jsx)(ae,{name:e.name,email:e.email,image:e.image})})}),(0,Q.jsx)(X,{"data-label":_(`admin.users.role`),children:(0,Q.jsx)(H,{variant:`secondary`,children:i(e.role)?_(`admin.users.administrator`):_(`admin.users.user`)})}),(0,Q.jsx)(X,{"data-label":_(`admin.users.status`),children:(0,Q.jsx)(H,{variant:e.banned?`destructive`:`outline`,children:e.banned?_(`admin.users.disabled`):_(`admin.users.active`)})}),(0,Q.jsx)(X,{"data-label":_(`admin.users.joined`),className:`text-xs text-muted-foreground`,children:(0,Q.jsx)(se,{value:e.createdAt})}),(0,Q.jsx)(X,{children:(0,Q.jsx)(R,{variant:`ghost`,size:`icon`,"aria-label":_(`admin.users.manage`,{name:e.name}),onClick:()=>g(e.id),children:(0,Q.jsx)(_e,{})})})]})},e.id))})]})}):(0,Q.jsx)(C,{title:_(s||l!==`all`||d!==`all`?`admin.users.noMatches`:`admin.users.empty`),className:`py-12`}),(0,Q.jsx)(fe,{noun:_(`admin.users.pagerNoun`),offset:p,total:v.data?.total??0,size:25,onChange:m}),(0,Q.jsx)(ne,{title:_(`admin.users.create`),open:n,onOpenChange:r,busy:a,children:(0,Q.jsx)(Ke,{pending:a,setPending:o,onCancel:()=>r(!1),onCreated:(e,t)=>{r(!1),c(``),u(`all`),f(`all`),m(0),g(e),k.success(_(`admin.users.created`,{email:t}))}})}),(0,Q.jsx)(We,{userId:h,onClose:()=>g(null),onChanged:y})]})}var Je=25;function Ye(){let[e,t]=(0,Z.useState)(``),[n,r]=(0,Z.useState)(0),[i,a]=(0,Z.useState)(null),o=V({queryKey:[`kanvil`,`admin-workspaces`,e,n],queryFn:()=>T.request(`/api/v1/admin/workspaces?${new URLSearchParams({q:e,offset:String(n),limit:String(Je)})}`,Ue),placeholderData:le});return(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(z,{title:_(`settings.workspaces.title`),action:(0,Q.jsx)(`div`,{className:`flex min-w-0 flex-1 items-center justify-end gap-2`,children:(0,Q.jsx)(de,{label:_(`settings.workspaces.search`),placeholder:_(`settings.workspaces.searchPlaceholder`),value:e,onChange:e=>{t(e),r(0)}})})}),(0,Q.jsx)(O,{error:o.error}),o.isPending?(0,Q.jsx)(P,{}):o.data?.workspaces.length?(0,Q.jsx)(`div`,{"aria-busy":o.isFetching,children:(0,Q.jsxs)(Ne,{mobileLayout:`rows`,"aria-label":_(`settings.workspaces.title`),children:[(0,Q.jsx)(je,{children:(0,Q.jsxs)(Y,{children:[(0,Q.jsx)(J,{children:_(`settings.workspaces.workspace`)}),(0,Q.jsx)(J,{children:_(`settings.workspaces.administrators`)}),(0,Q.jsx)(J,{children:_(`settings.workspaces.members`)}),(0,Q.jsx)(J,{children:_(`settings.workspaces.projects`)}),(0,Q.jsx)(J,{children:_(`settings.workspaces.created`)}),(0,Q.jsx)(J,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:_(`settings.workspaces.actions`)})})]})}),(0,Q.jsx)(Me,{children:o.data.workspaces.map(e=>(0,Q.jsxs)(Y,{children:[(0,Q.jsx)(X,{className:`whitespace-normal`,children:(0,Q.jsxs)(R,{variant:`ghost`,className:`h-auto max-w-full flex-col items-start gap-0.5 p-0 text-left hover:bg-transparent`,onClick:()=>a(e),children:[(0,Q.jsx)(`span`,{dir:`auto`,className:`font-medium wrap-anywhere whitespace-normal`,children:e.name}),(0,Q.jsx)(`span`,{className:`font-mono text-xs font-normal text-muted-foreground`,children:e.slug})]})}),(0,Q.jsx)(X,{"data-label":_(`settings.workspaces.administrators`),className:`text-xs wrap-anywhere whitespace-normal`,children:e.administrators.length?f(e.administrators.map(e=>e.name)):(0,Q.jsx)(H,{variant:`destructive`,children:_(`settings.workspaces.noAdministrator`)})}),(0,Q.jsx)(X,{"data-label":_(`settings.workspaces.members`),className:`tabular-nums`,children:e.memberCount}),(0,Q.jsx)(X,{"data-label":_(`settings.workspaces.projects`),className:`tabular-nums`,children:e.projectCount}),(0,Q.jsx)(X,{"data-label":_(`settings.workspaces.created`),className:`text-xs text-muted-foreground`,children:(0,Q.jsx)(se,{value:e.createdAt})}),(0,Q.jsx)(X,{children:(0,Q.jsx)(R,{variant:`ghost`,size:`icon`,"aria-label":_(`settings.workspaces.manage`,{name:e.name}),onClick:()=>a(e),children:(0,Q.jsx)(_e,{})})})]},e.id))})]})}):(0,Q.jsx)(C,{title:_(e?`settings.workspaces.noMatches`:`settings.workspaces.empty`),className:`py-12`}),(0,Q.jsx)(fe,{noun:_(`settings.workspaces.pagerNoun`),offset:n,total:o.data?.total??0,size:Je,onChange:r}),(0,Q.jsx)(Xe,{workspace:i,onClose:()=>a(null)})]})}function Xe({workspace:e,onClose:t}){let{shown:n,settled:r}=we(e,e=>e.id),i=n?.id??``,a=V({...T.query(`list_workspace_members`,{workspaceId:i}),enabled:!!n}),o=V({...T.query(`list_projects`,{workspaceId:i,archived:`include`}),enabled:!!n}),s=V({...T.query(`list_workspace_roles`,{workspaceId:i}),enabled:!!n}),c=ie(`set_workspace_member`);return(0,Q.jsx)(xe,{open:!!e,onOpenChange:e=>{!e&&!c.isPending&&t()},onOpenChangeComplete:r,children:(0,Q.jsxs)(be,{className:`w-full! sm:max-w-lg!`,children:[(0,Q.jsxs)(Oe,{className:`shrink-0 border-b pr-14`,children:[(0,Q.jsx)(ye,{className:`mb-0`,children:n?.name??_(`settings.workspaces.workspace`)}),(0,Q.jsx)(Ce,{className:`font-mono`,children:n?.slug})]}),(0,Q.jsxs)(`div`,{className:`@container min-h-0 overflow-y-auto px-6 pb-8`,children:[(0,Q.jsx)(Pe,{people:a.data??[],pending:c.isPending,loading:a.isPending,error:a.error,canAdmin:!0,ownerId:n?.ownerId,scope:`workspace`,roles:s.data,authority:{admin:!0,capabilities:m},onChange:(e,t)=>c.mutateAsync({workspaceId:i,email:e,role:t})}),n&&(0,Q.jsx)(ve,{workspaceId:n.id}),(0,Q.jsxs)(`section`,{className:`pt-7`,children:[(0,Q.jsx)(`h3`,{children:_(`settings.workspaces.projects`)}),(0,Q.jsx)(O,{error:o.error}),o.isPending?(0,Q.jsx)(P,{}):o.data?.length?o.data.map(e=>(0,Q.jsx)($,{badge:e.visibility===`private`?_(`settings.workspaces.private`):_(`settings.members.workspaceAccess`),children:(0,Q.jsx)(G,{to:`/projects/$projectId/settings`,params:{projectId:e.id},search:{section:`members`},onClick:t,className:`text-primary`,children:e.name})},e.id)):(0,Q.jsx)(C,{title:_(`settings.workspaces.noProjects`),className:`py-5`})]})]},n?.id)]})})}var Ze={queryKey:[`kanvil`,`instance`],queryFn:()=>T.request(`/api/v1/admin/instance`,h)};function Qe({section:e}){let t=V({...Ze,refetchOnMount:`always`,refetchInterval:[`search`,`storage`,`events`].includes(e)?5e3:!1});return t.data&&t.isFetchedAfterMount?(0,Q.jsx)(et,{data:t.data,section:e},e):t.isPending||t.isFetching?(0,Q.jsx)(P,{}):(0,Q.jsx)(O,{error:t.error})}function $e(e){return{expectedVersion:e.version,authentication:e.authentication,name:e.name,description:e.description,storageProvider:e.storage.provider,s3:{endpoint:``,region:`us-east-1`,bucket:``,prefix:`kanvil/`,forcePathStyle:!0,accessKeyId:``,...e.storage.settings,secretAccessKey:``},brokerProvider:e.broker.provider,rabbit:{url:``,exchange:e.broker.settings?.exchange??`kanvil.events`},searchProvider:e.search.provider,elastic:{url:``,index:`kanvil-${e.id}`,username:``,...e.search.settings,auth:e.search.settings?.auth??`none`,apiKey:``,password:``}}}function et({data:e,section:t}){let n=U(),i=re(),[a,o]=(0,Z.useState)(()=>$e(e)),[c,l]=(0,Z.useState)(!1),[u,p]=(0,Z.useState)(),[m,h]=(0,Z.useState)(``),[g,y]=(0,Z.useState)(!1),b=e.storage.source===`deployment`,x=e.search.source===`deployment`,S=e.broker.source===`deployment`,C=t===`storage`?b:t===`search`?x:t===`events`&&S,w=e=>o(t=>({...t,s3:{...t.s3,...e}})),E=e=>o(t=>({...t,elastic:{...t.elastic,...e}}));async function D(e,t,n=!1){p(void 0),h(``),l(!0);try{await e(),n?k.success(t,{id:`instance-settings`}):h(t)}catch(e){p(e)}finally{l(!1)}}async function M(){let e=d.parse({expectedVersion:a.expectedVersion,...t===`authentication`?{authentication:a.authentication}:{},name:a.name,description:a.description,storage:a.storageProvider===`s3`?{provider:`s3`,...a.s3}:{provider:`local`},broker:a.brokerProvider===`rabbitmq`?{provider:`rabbitmq`,...a.rabbit,url:a.rabbit.url||void 0}:{provider:`postgres`},search:a.searchProvider===`elasticsearch`?{provider:`elasticsearch`,...a.elastic}:{provider:`postgres`}});await T.request(`/api/v1/admin/instance`,v,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}),o(e=>({...e,expectedVersion:e.expectedVersion+1,s3:{...e.s3,secretAccessKey:``},elastic:{...e.elastic,apiKey:``,password:``},rabbit:{...e.rabbit,url:``}})),await n.invalidateQueries({queryKey:[`kanvil`,`instance`]}),await n.invalidateQueries({queryKey:[`info`]}),y(!1)}return(0,Q.jsxs)(ke,{title:_(`admin.instance.title`),section:t,children:[[`general`,`storage`,`search`,`events`].map(t=>(0,Q.jsx)(K,{value:t,children:(0,Q.jsx)(Re,{data:e,section:t,onConfigure:()=>{o($e(e)),p(void 0),h(``),y(!0)}})},t)),!g&&t!==`authentication`&&(0,Q.jsx)(O,{error:u}),(0,Q.jsx)(ne,{title:_(t===`general`?`admin.instance.edit`:t===`storage`?`admin.configure.storageTitle`:t===`search`?`admin.configure.searchTitle`:`admin.configure.eventsTitle`),open:g,onOpenChange:y,busy:c,children:(0,Q.jsxs)(`form`,{className:`[&_section]:py-0 [&>[data-slot=field-set]>section:first-child]:pt-0`,onSubmit:e=>{e.preventDefault(),C||D(M,_(`admin.configure.saved`),!0)},children:[(0,Q.jsxs)(L,{disabled:c,className:`gap-0`,children:[t===`general`&&(0,Q.jsx)(Q.Fragment,{children:(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(`h2`,{children:_(`admin.instance.heading`)}),(0,Q.jsx)(F,{label:_(`admin.configure.instanceName`),required:!0,maxLength:100,value:a.name,onChange:e=>o({...a,name:e.target.value})}),(0,Q.jsx)(ce,{label:_(`admin.configure.instanceDescription`),maxLength:500,value:a.description,onChange:e=>o({...a,description:e.target.value})}),(0,Q.jsx)(j,{label:_(`admin.instance.publicUrl`),value:e.deployment.url}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:_(`admin.configure.publicUrlSource`)})]})}),t===`storage`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`section`,{children:[(0,Q.jsxs)(`div`,{className:`mb-5 flex items-center gap-3`,children:[(0,Q.jsx)(`h2`,{className:`mb-0`,children:_(`admin.instance.section.storage`)}),(0,Q.jsx)(H,{variant:`secondary`,children:_(b?`admin.instance.deploymentManaged`:`admin.instance.instanceManaged`)})]}),(0,Q.jsx)(`p`,{children:_(`admin.configure.storageIntro`)}),(0,Q.jsxs)(I,{label:_(`admin.configure.storageProvider`),disabled:b,value:a.storageProvider,onValueChange:e=>o({...a,storageProvider:e===`s3`?`s3`:`local`}),children:[(0,Q.jsx)(A,{value:`local`,children:_(`admin.instance.provider.local`)}),(0,Q.jsx)(A,{value:`s3`,children:_(`admin.instance.provider.s3`)})]}),a.storageProvider===`local`?(0,Q.jsx)(`p`,{children:_(`admin.configure.localDescription`)}):(0,Q.jsxs)(L,{disabled:b,className:`gap-0`,children:[(0,Q.jsx)(F,{label:_(`admin.configure.s3Endpoint`),type:`url`,placeholder:`https://s3.example.com`,value:a.s3.endpoint,onChange:e=>w({endpoint:e.target.value})}),(0,Q.jsx)(`p`,{className:`-mt-2 text-xs`,children:_(`admin.configure.s3EndpointHint`)}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 gap-x-5 sm:grid-cols-2`,children:[(0,Q.jsx)(F,{label:_(`admin.instance.bucket`),value:a.s3.bucket,required:!0,onChange:e=>w({bucket:e.target.value})}),(0,Q.jsx)(F,{label:_(`admin.configure.region`),value:a.s3.region,required:!0,onChange:e=>w({region:e.target.value})})]}),(0,Q.jsx)(F,{label:_(`admin.configure.prefix`),value:a.s3.prefix,onChange:e=>w({prefix:e.target.value})}),(0,Q.jsx)(F,{label:_(`admin.configure.accessKeyId`),autoComplete:`off`,value:a.s3.accessKeyId,onChange:e=>w({accessKeyId:e.target.value})}),(0,Q.jsx)(F,{label:_(`admin.configure.secretAccessKey`),type:`password`,autoComplete:`new-password`,value:a.s3.secretAccessKey,placeholder:e.storage.secretConfigured?_(`admin.configure.savedSecret`):_(`admin.configure.deploymentCredentials`),onChange:e=>w({secretAccessKey:e.target.value})}),(0,Q.jsx)(te,{label:_(`admin.configure.pathStyle`),checked:a.s3.forcePathStyle,onCheckedChange:e=>w({forcePathStyle:e})})]}),a.storageProvider===`s3`&&(0,Q.jsx)(R,{disabled:c,onClick:()=>{D(()=>T.request(`/api/v1/admin/storage/test`,v,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(a.s3)}),_(`admin.configure.storageVerified`))},children:_(`admin.configure.testStorage`)}),(0,Q.jsx)(`p`,{className:`mt-4 text-xs`,role:`status`,children:e.storage.pending?_(`admin.configure.filesWaiting`,{count:e.storage.pending}):_(`admin.configure.transfersComplete`)}),e.storage.error&&(0,Q.jsx)(O,{error:Error(e.storage.error)}),b&&(0,Q.jsx)(`p`,{className:`mt-4 text-xs`,children:_(`admin.configure.storageDeployment`)})]}),e.locations.length>0&&(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(`h2`,{children:_(`admin.configure.locations`)}),e.locations.map(e=>(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 border-b py-2.5 text-xs wrap-anywhere [&>:first-child]:min-w-24 [&>:first-child]:flex-1`,children:[(0,Q.jsxs)(`span`,{className:`grid gap-1`,children:[(0,Q.jsx)(`strong`,{children:e.bucket}),(0,Q.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.endpoint||`Amazon S3`,` / `,e.prefix]})]}),(0,Q.jsx)(`span`,{children:_(`admin.configure.locationFiles`,{count:e.objects})})]},e.id)),(0,Q.jsx)(`div`,{className:`mt-4`,children:(0,Q.jsx)(N,{label:_(`admin.configure.cleanUp`),description:_(`admin.configure.cleanUpConfirm`),onConfirm:async()=>{await T.request(`/api/v1/admin/storage/cleanup`,s({removed:r()}),{method:`POST`}),await n.invalidateQueries({queryKey:[`kanvil`,`instance`]})}})}),(0,Q.jsx)(`p`,{className:`mt-3 text-xs`,children:_(`admin.configure.cleanUpNote`)})]})]}),t===`search`&&(0,Q.jsx)(Q.Fragment,{children:(0,Q.jsxs)(`section`,{children:[(0,Q.jsxs)(`div`,{className:`mb-5 flex items-center gap-3`,children:[(0,Q.jsx)(`h2`,{className:`mb-0`,children:_(`admin.instance.section.search`)}),(0,Q.jsx)(H,{variant:`secondary`,children:e.search.status===`builtin`?`PostgreSQL`:_(`admin.instance.status.${e.search.status}`)})]}),(0,Q.jsxs)(I,{label:_(`admin.configure.searchProvider`),disabled:x,value:a.searchProvider,onValueChange:e=>o({...a,searchProvider:e===`elasticsearch`?`elasticsearch`:`postgres`}),children:[(0,Q.jsx)(A,{value:`postgres`,children:_(`admin.configure.searchBuiltIn`)}),(0,Q.jsx)(A,{value:`elasticsearch`,children:_(`admin.instance.provider.elasticsearch`)})]}),a.searchProvider===`elasticsearch`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(L,{disabled:x,className:`gap-0`,children:[(0,Q.jsx)(F,{label:_(`admin.instance.searchEndpoint`),type:`url`,required:!0,value:a.elastic.url,onChange:e=>E({url:e.target.value})}),(0,Q.jsx)(F,{label:_(`admin.configure.indexName`),required:!0,value:a.elastic.index,onChange:e=>E({index:e.target.value})}),(0,Q.jsxs)(I,{label:_(`admin.configure.searchAuthentication`),value:a.elastic.auth,onValueChange:e=>E({auth:ee.parse(e)}),children:[(0,Q.jsx)(A,{value:`none`,children:_(`admin.configure.noAuthentication`)}),(0,Q.jsx)(A,{value:`apiKey`,children:_(`admin.configure.apiKey`)}),(0,Q.jsx)(A,{value:`basic`,children:_(`admin.configure.basic`)})]}),a.elastic.auth===`apiKey`&&(0,Q.jsx)(F,{label:_(`admin.configure.searchApiKey`),type:`password`,autoComplete:`new-password`,placeholder:e.search.secretConfigured?_(`admin.configure.savedSecret`):_(`admin.configure.optional`),value:a.elastic.apiKey,onChange:e=>E({apiKey:e.target.value})}),a.elastic.auth===`basic`&&(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 gap-x-5 sm:grid-cols-2`,children:[(0,Q.jsx)(F,{label:_(`admin.configure.searchUsername`),autoComplete:`off`,value:a.elastic.username,onChange:e=>E({username:e.target.value})}),(0,Q.jsx)(F,{label:_(`admin.configure.searchPassword`),type:`password`,autoComplete:`new-password`,value:a.elastic.password,onChange:e=>E({password:e.target.value})})]})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(R,{onClick:()=>{D(()=>T.request(`/api/v1/admin/search/test`,v,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(a.elastic)}),_(`admin.configure.searchVerified`))},children:_(`admin.configure.testSearch`)}),e.search.provider===`elasticsearch`&&(0,Q.jsx)(R,{onClick:()=>{D(()=>T.request(`/api/v1/admin/search/reindex`,v,{method:`POST`}),_(`admin.configure.rebuildQueued`))},children:_(`admin.configure.rebuild`)})]})]}),(0,Q.jsx)(`p`,{className:`mt-5`,children:_(`admin.configure.searchNote`)}),e.search.error&&(0,Q.jsx)(O,{error:Error(e.search.error)})]})}),t===`events`&&(0,Q.jsx)(Q.Fragment,{children:(0,Q.jsxs)(`section`,{children:[(0,Q.jsxs)(`div`,{className:`mb-5 flex items-center gap-3`,children:[(0,Q.jsx)(`h2`,{className:`mb-0`,children:_(`admin.instance.section.events`)}),(0,Q.jsx)(H,{variant:`secondary`,children:e.broker.status===`builtin`?`PostgreSQL`:_(`admin.instance.status.${e.broker.status}`)})]}),(0,Q.jsxs)(I,{label:_(`admin.configure.brokerProvider`),disabled:S,value:a.brokerProvider,onValueChange:e=>o({...a,brokerProvider:e===`rabbitmq`?`rabbitmq`:`postgres`}),children:[(0,Q.jsx)(A,{value:`postgres`,children:_(`admin.configure.brokerBuiltIn`)}),(0,Q.jsx)(A,{value:`rabbitmq`,children:`RabbitMQ`})]}),a.brokerProvider===`rabbitmq`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(L,{disabled:S,className:`gap-0`,children:[(0,Q.jsx)(F,{label:_(`admin.configure.rabbitUrl`),type:`password`,autoComplete:`new-password`,value:a.rabbit.url,placeholder:e.broker.secretConfigured?_(`admin.configure.savedSecret`):`amqps://user:password@host/vhost`,onChange:e=>o({...a,rabbit:{...a.rabbit,url:e.target.value}})}),e.broker.settings&&(0,Q.jsx)(j,{label:_(`admin.configure.savedBrokerEndpoint`),value:e.broker.settings.endpoint}),(0,Q.jsx)(F,{label:_(`admin.configure.rabbitExchange`),required:!0,value:a.rabbit.exchange,onChange:e=>o({...a,rabbit:{...a.rabbit,exchange:e.target.value}})})]}),(0,Q.jsx)(R,{onClick:()=>{D(()=>T.request(`/api/v1/admin/broker/test`,v,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...a.rabbit,url:a.rabbit.url||void 0})}),_(`admin.configure.brokerVerified`))},children:_(`admin.configure.testBroker`)})]}),(0,Q.jsx)(`p`,{className:`mt-5`,children:_(`admin.configure.brokerNote`)}),S&&(0,Q.jsx)(`p`,{className:`mt-4 text-xs`,children:_(`admin.configure.brokerDeployment`)}),e.broker.error&&(0,Q.jsx)(O,{error:Error(e.broker.error)})]})})]}),[`general`,`storage`,`search`,`events`].includes(t)&&(0,Q.jsxs)(`div`,{className:`sticky bottom-0 mt-6 flex flex-wrap items-center gap-3 border-t bg-background/95 py-4 backdrop-blur`,children:[(0,Q.jsx)(R,{disabled:c,onClick:()=>y(!1),children:_(C?`common.action.done`:`common.action.cancel`)}),!C&&(0,Q.jsx)(R,{variant:`default`,type:`submit`,disabled:c,children:_(c?`common.state.saving`:`admin.configure.save`)}),m&&(0,Q.jsx)(`span`,{role:`status`,className:`text-sm text-muted-foreground`,children:m}),(0,Q.jsx)(O,{error:u})]})]})}),(0,Q.jsx)(K,{value:`users`,children:(0,Q.jsx)(qe,{})}),(0,Q.jsx)(K,{value:`workspaces`,children:(0,Q.jsx)(Ye,{})}),(0,Q.jsx)(K,{value:`authentication`,children:(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(z,{title:_(`admin.authentication.title`)}),(0,Q.jsxs)(`form`,{className:`mb-6`,onSubmit:e=>{e.preventDefault(),D(M,_(`admin.authentication.saved`),!0)},children:[(0,Q.jsx)(q,{title:_(`admin.authentication.emailPassword`),description:_(`admin.authentication.emailPasswordDescription`),children:(0,Q.jsx)(Ae,{"aria-label":_(`admin.authentication.emailPassword`),checked:a.authentication.emailPasswordEnabled,disabled:c,onCheckedChange:e=>o(t=>({...t,authentication:{...t.authentication,emailPasswordEnabled:e}}))})}),(0,Q.jsx)(q,{title:_(`admin.authentication.ssoProvision`),description:_(`admin.authentication.ssoProvisionDescription`),children:(0,Q.jsx)(Ae,{"aria-label":_(`admin.authentication.ssoProvision`),checked:a.authentication.ssoAutoProvision,disabled:c,onCheckedChange:e=>o(t=>({...t,authentication:{...t.authentication,ssoAutoProvision:e}}))})}),(0,Q.jsx)(q,{title:_(`admin.authentication.registration`),children:_(`admin.authentication.registrationClosed`)}),(0,Q.jsx)(q,{title:_(`admin.authentication.identityProvider`),children:e.deployment.oidc?.name??_(`admin.authentication.notConfigured`)}),(0,Q.jsx)(q,{title:_(`admin.authentication.linkedProviders`),description:_(`admin.authentication.linkedProvidersDescription`),children:f(i.data?.providers.filter(e=>e.id!==`oidc`).map(e=>e.name)??[])||_(`admin.authentication.notConfigured`)}),(0,Q.jsx)(B,{layout:`inline`,error:u,pending:c,submitLabel:_(`admin.authentication.save`),pendingLabel:_(`common.state.saving`),submitDisabled:a.authentication.emailPasswordEnabled===e.authentication.emailPasswordEnabled&&a.authentication.ssoAutoProvision===e.authentication.ssoAutoProvision})]}),e.deployment.oidc&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(j,{label:_(`admin.authentication.discoveryUrl`),value:e.deployment.oidc.discoveryUrl}),(0,Q.jsx)(j,{label:_(`admin.authentication.clientId`),value:e.deployment.oidc.clientId})]}),(0,Q.jsx)(`p`,{children:_(`admin.authentication.oidcSetup`)}),(0,Q.jsx)(`h3`,{children:_(`admin.authentication.consumers`)}),(0,Q.jsx)(j,{label:`HTTP API`,value:`${e.deployment.url}/api/v1`}),(0,Q.jsx)(j,{label:_(`admin.authentication.mcpEndpoint`),value:`${e.deployment.url}/mcp`}),(0,Q.jsx)(j,{label:_(`admin.authentication.eventFeed`),value:`${e.deployment.url}/api/v1/events`}),(0,Q.jsxs)(`a`,{className:`inline-flex items-center gap-2 text-primary`,href:`/api/openapi.json`,target:`_blank`,rel:`noreferrer`,children:[_(`admin.authentication.openApi`),(0,Q.jsx)(De,{className:`size-4`})]})]})})]})}export{Qe as AdminSettings};
@@ -1 +0,0 @@
1
- var e={common:{status:{backlog:`Gözləmə siyahısı`,todo:`Ediləcək`,in_progress:`İcrada`,in_review:`Yoxlamada`,done:`Hazırdır`,cancelled:`Ləğv edilib`},priority:{urgent:`Təcili`,high:`Yüksək`,medium:`Orta`,low:`Aşağı`,none:`Prioritet yoxdur`},kind:{feature:`Funksiya`,bug:`Xəta`,chore:`Rutin iş`,research:`Araşdırma`,documentation:`Sənədləşmə`},difficulty:{low:`Aşağı`,med:`Orta`,high:`Yüksək`,none:`Çətinlik yoxdur`},role:{reader:`Yalnız oxuma`,writer:`Redaktə edə bilər`,admin:`Administrator`},permission:{ticket:{write:{label:`Tiketləri redaktə etmək`,description:`Tiketləri yaratmaq, redaktə etmək, köçürmək, götürmək və şərh yazmaq; layihə yaratmaq`},delete:{label:`Tiketləri silmək`,description:`Tiketləri həmişəlik silmək`}},project:{manage:{label:`Layihələri idarə etmək`,description:`Layihə məlumatları, iş axını, etiketlər, sahələr, inteqrasiyalar və həyat dövrü`}},member:{manage:{label:`Üzvləri idarə etmək`,description:`Üzvləri əlavə etmək, dəyişmək və çıxarmaq`}},invitation:{manage:{label:`Dəvətləri idarə etmək`,description:`İnsanları e-poçtla dəvət etmək`}},sharing:{manage:{label:`Paylaşımı idarə etmək`,description:`İctimai yalnız oxuma keçidləri və təqvim lentləri`}},workspace:{manage:{label:`İş sahəsini idarə etmək`,description:`İş sahəsi məlumatları, ümumi etiketlər və rollar`}}},customFieldType:{text:`Mətn`,number:`Rəqəm`,date:`Tarix`,checkbox:`Qeyd qutusu`,select:`Seçim`,multiselect:`Çoxlu seçim`},customField:{removedOption:`Silinmiş seçim`,checked:`Bəli`},filterField:{status:`Status`,priority:`Prioritet`,kind:`Növ`,difficulty:`Çətinlik`,label:`Etiket`,assigneeId:`İcraçı`,customField:`Sahə`},sort:{priority:`Prioritet`,updated:`Son yenilənənlər`,created:`Son yaradılanlar`,title:`Başlıq`,labels:`Etiketlər`,due:`Son tarix`,start:`Başlama tarixi`,number:`Tiket nömrəsi`,status:`Status`,difficulty:`Çətinlik`,kind:`Növ`,assignee:`İcraçı`,manual:`Əl ilə`},due:{overdue:`Gecikmiş`,today:`Bu gün bitir`,week:`Bu həftə bitir`,scheduled:`Son tarixi var`,none:`Son tarix yoxdur`},relation:{blocks:{outgoing:`Bloklayır`,incoming:`Tərəfindən bloklanır`},related:{outgoing:`Əlaqəlidir`,incoming:`Əlaqəlidir`},duplicate:{outgoing:`Təkrarlayır`,incoming:`Tərəfindən təkrarlanır`},causes:{outgoing:`Səbəb olur`,incoming:`Səbəbi`},clones:{outgoing:`Klonlayır`,incoming:`Tərəfindən klonlanır`},implements:{outgoing:`Həyata keçirir`,incoming:`Tərəfindən həyata keçirilir`},reviews:{outgoing:`Yoxlayır`,incoming:`Tərəfindən yoxlanılır`}},remoteKind:{branch:`Budaq`,pull_request:`Pull request`,issue:`Məsələ`},notificationCategory:{assignment:`Təyinatlar`,status:`Status dəyişiklikləri`,comment:`Şərhlər`,mention:`İstinadlar`,update:`Digər yeniliklər`,due_soon:`Müddəti yaxınlaşır`,overdue:`Gecikmiş`},destinationEvent:{created:`Yeni tiketlər`},deliveryKind:{email:`E-poçt`,webhook:`Webhook`},change:{pull_request:{name:`Pull request`,opened:`Pull request açıldı`,draft:`Qaralama pull request`,merged:`Pull request birləşdirildi`,closed:`Pull request birləşdirilmədən bağlandı`},merge_request:{name:`Merge request`,opened:`Merge request açıldı`,draft:`Qaralama merge request`,merged:`Merge request birləşdirildi`,closed:`Merge request birləşdirilmədən bağlandı`},branchCreated:`Budaq yaradıldı`},issueLinkState:{active:`Sinxronlaşdırılır`,paused:`Dayandırılıb`,review:`Yoxlama tələb olunur`,creating:`Məsələ yaradılır`,unknown:`Yaradılma təsdiqlənməyib`},importStatus:{previewed:`İdxala hazırdır`,running:`İdxal edilir`,completed:`İdxal edildi`,failed:`Uğursuz oldu`,cancelled:`Ləğv edildi`},importProvider:{linear:{project:`Komanda`,setup:`Linear-da Settings › Security & access bölməsində şəxsi API açarı yaradın; oxuma icazəsi kifayətdir.`},jira:{project:`Layihə`,setup:`Jira Cloud hesabınızın e-poçtu və id.atlassian.com-dan alınan API tokeni ilə daxil olur; Data Center və Server şəxsi giriş tokenindən istifadə edir. Layihəyə baxış icazəsi kifayətdir.`},trello:{project:`Lövhə`,setup:`trello.com/power-ups/admin ünvanında idarə etdiyiniz Power-Up-ın API açarından və onun üçün yaradılmış tokendən istifadə edin; oxuma icazəsi kifayətdir.`},plane:{project:`Layihə`,setup:`Plane-də Profile settings › Personal access tokens bölməsində şəxsi giriş tokeni yaradın. Plane Cloud API ünvanı: https://api.plane.so; iş sahəsinin URL açarı onun veb ünvanının ilk hissəsidir.`},planka:{project:`Lövhə`,setup:`Lövhəni aça bilən PLANKA hesabı ilə daxil olun; Kanvil-in açdığı sessiya oxuma bitəndə başa çatır. PLANKA 2 administratorları bunun əvəzinə API açarları verə bilər.`},kaneo:{project:`Layihə`,setup:`Kaneo-da Settings › Account › Developer bölməsində API açarı yaradın.`}},plankaSignIn:{password:`İstifadəçi adı və şifrə`,api_key:`API açarı`},jiraEdition:{cloud:`Cloud`,data_center:`Data Center və ya Server`},event:{time_entry:{created:`Vaxt qeydi yaradıldı`,updated:`Vaxt qeydi yeniləndi`,deleted:`Vaxt qeydi silindi`},label:{created:`Etiket yaradıldı`,updated:`Etiket yeniləndi`,deleted:`Etiket silindi`},workflow:{created:`İş axını vəziyyəti əlavə edildi`,updated:`İş axını vəziyyəti dəyişdirildi`,deleted:`İş axını vəziyyəti silindi`},custom_field:{created:`Sahə yaradıldı`,updated:`Sahə yeniləndi`,deleted:`Sahə silindi`},ticket:{created:`Tiket yaradıldı`,updated:`Tiket yeniləndi`,deleted:`Tiket silindi`,moved:`Başqa layihədən köçürüldü`,moved_away:`Başqa layihəyə köçürüldü`,due_soon:`Müddəti yaxınlaşır`,overdue:`Gecikmiş`,claimed:`İş götürüldü`},claim:{renewed:`Götürmə yeniləndi`,released:`Götürmə buraxıldı`,recovered:`Götürmə bərpa edildi`},comment:{created:`Şərh əlavə edildi`,updated:`Şərh redaktə edildi`,deleted:`Şərh silindi`},relation:{added:`Əlaqə əlavə edildi`,removed:`Əlaqə silindi`},attachment:{created:`Fayl qoşuldu`,deleted:`Fayl silindi`},evidence:{added:`Sübut qoşuldu`},resource:{added:`Keçid əlavə edildi`,updated:`Keçid redaktə edildi`,removed:`Keçid silindi`},calendar_feed:{created:`Təqvim lenti yaradıldı`,revoked:`Təqvim lenti ləğv edildi`},project:{created:`Layihə yaradıldı`,updated:`Layihə yeniləndi`,archived:`Layihə arxivləşdirildi`,restored:`Layihə bərpa edildi`,transferred:`Layihə başqa iş sahəsinə köçürüldü`,deleted:`Layihə silindi`},membership:{updated:`Layihəyə giriş dəyişdirildi`},workspace:{owner_changed:`İş sahəsinin sahibi dəyişdirildi`},role:{created:`Rol yaradıldı`,updated:`Rol dəyişdirildi`,deleted:`Rol silindi`},invitation:{updated:`Dəvət dəyişdirildi`},destination:{created:`Təyinat əlavə edildi`,updated:`Təyinat dəyişdirildi`,deleted:`Təyinat silindi`},repository:{connected:`Repozitori qoşuldu`,updated:`Repozitori bağlantısı dəyişdirildi`,disconnected:`Repozitori ayrıldı`,received:`Repozitori webhooku alındı`},issue_link:{updated:`Məsələ sinxronizasiyası dəyişdirildi`}},error:{network:`Kanvil ilə əlaqə qurulmadı. Bağlantınızı yoxlayıb yenidən cəhd edin.`,fallback:`Sorğu tamamlana bilmədi`,input:`Daxil edilən məlumat`,code:{unauthorized:`Davam etmək üçün daxil olun.`,session_required:`Bu əməliyyat üçün daxil olmuş hesabdan istifadə edin.`,account_disabled:`Bu hesab deaktiv edilib.`,forbidden:`Bunu etməyə icazəniz yoxdur.`,insufficient_scope:`Bu giriş məlumatı bu əməliyyata icazə vermir.`,workspace_scope_required:`Bu əməliyyat üçün iş sahəsinə girişi olan hesabdan istifadə edin.`,invalid_origin:`Bu mənbəyə icazə verilmir.`,not_found:`Bu element tapılmadı və ya ona baxmaq icazəniz yoxdur.`,version_conflict:`Yükləndikdən sonra dəyişdirilib. Yenidən yükləyib təkrar cəhd edin.`,time_entry_conflict:`Bu istifadəçinin tapşırıqda artıq davam edən vaxt qeydi var.`,claim_conflict:`Bu tiket başqa işçidədir.`,idempotency_conflict:`Bu sorğu artıq başqa dəyişiklik üçün istifadə edilib.`,project_archived:`Dəyişməzdən əvvəl arxivləşdirilmiş layihəni bərpa edin.`,rate_limited:`Qısa müddətdə həddən artıq dəyişiklik. Gözləyib yenidən cəhd edin.`,snapshot_required:`Canlı lent geri qaldı. Davam etmək üçün yenidən yükləyin.`,request_failed:`Sorğu tamamlana bilmədi`}},action:{add:`Əlavə et`,apply:`Tətbiq et`,back:`Geri`,cancel:`Ləğv et`,clear:`Təmizlə`,close:`Bağla`,confirm:`Təsdiqlə`,continue:`Davam et`,copy:`Kopyala`,create:`Yarat`,delete:`Sil`,done:`Hazır`,edit:`Redaktə et`,open:`Aç`,remove:`Çıxar`,rename:`Adını dəyiş`,reset:`Sıfırla`,retry:`Yenidən cəhd et`,save:`Yadda saxla`,search:`Axtar`},state:{copied:`Kopyalandı`,loading:`Yüklənir…`,saved:`Yadda saxlanıldı`,saving:`Yadda saxlanılır…`,none:`Yoxdur`,unassigned:`Təyin edilməyib`},evidenceKind:{pull_request:`Pull request`,test:`Test`,review:`Yoxlama`,deployment:`Yerləşdirmə`,device:`Cihaz`,other:`Digər`},evidenceOutcome:{reported:`Bildirilib`,pending:`Gözləyir`,passed:`Uğurlu`,failed:`Uğursuz`},readinessReason:{project_archived:`Layihə arxivləşdirilib`,not_open:`Tiket “Ediləcək” vəziyyətində olmalı və arxivdə olmamalıdır`,not_enabled:`Agent işi aktivləşdirilməyib`,missing_description:`Təsvir əlavə edin`,missing_acceptance_criteria:`Qəbul meyarları əlavə edin`,missing_difficulty:`Çətinlik seçin`,duplicate:`Bu tiket təkrar kimi qeyd edilib`,claim_recovery_required:`Sahibliyi bərpa etməzdən əvvəl əvvəlki işçinin dayandığını təsdiqləyin`,claimed:`{{worker}} tərəfindən götürülüb`,dependency:`{{key}} tamamlanmayıb`},person:{deleted:`Silinmiş hesab`,former:`Keçmiş üzv`},signIn:{codeTitle:`Kodla daxil ol`,resetTitle:`Şifrəni sıfırla`,codeSent:`{{email}} ünvanının hesabı varsa, kod göndərilir. Kodun müddəti 10 dəqiqəyə bitir.`,code:`Kod`,newPassword:`Yeni şifrə`,sendCode:`Kodu e-poçtla göndər`,back:`Daxil olmaya qayıt`,resend:`Kodu yenidən göndər`,resent:`Kod yenidən göndərildi`,emailCode:`Daxil olma kodunu e-poçtla göndər`,forgot:`Şifrəni unutmusunuz?`,resetDone:`Şifrə sıfırlandı. Yeni şifrə ilə daxil olun.`,resetDoneTitle:`Şifrə sıfırlandı`,resetDoneBody:`Yeni şifrə ilə daxil olun.`,invalidCode:`Bu kod yanlışdır, artıq istifadə olunub və ya müddəti bitib. Etibarlı kod almaq üçün yenidən göndərin.`,localPassword:`Yerli şifrə`},language:{label:`Dil`,system:`Sistem standartı`}},shell:{ui:{showValue:`{{label, lowercase}} göstər`,hideValue:`{{label, lowercase}} gizlət`,previousPage:`Əvvəlki {{noun}}`,nextPage:`Növbəti {{noun}}`,pageRange:`{{from}}–{{to}} / {{total}}`,priority:`Prioritet: {{label}}`,working:`İcra olunur…`,searchPlaceholder:`Axtar…`,clearValue:`{{label, lowercase}} təmizlə`,copyValue:`{{label, lowercase}} kopyala`,copied:`{{value}} kopyalandı`},documentTitle:`{{name}} · Kanvil`,openKanvil:`Kanvil-i aç`,page:{home:`Əsas səhifə`,myWork:`Mənim işlərim`,inbox:`Gələnlər`,search:`Axtarış`,settings:`Parametrlər`,planning:`Planlaşdırma`,ticket:`Tiket`,tickets:`Tiketlər`,projects:`Layihələr`},connection:{restored:`Bağlantı bərpa edildi`,lost:`Bağlantı kəsildi`,reconnecting:`Yenidən qoşulur…`,reload:`Yenidən yüklə`,signIn:`Yenidən qoşulmaq üçün daxil olun`},app:{skipToContent:`Məzmuna keç`,assigned:`Sizə təyin edilənlər`,openCount_one:`{{count, number}} açıq`,openCount_other:`{{count, number}} açıq`,noAssigned:`Sizə təyin edilmiş açıq tiket yoxdur`,allInMyWork_one:`“Mənim işlərim”də hamısı ({{count, number}})`,allInMyWork_other:`“Mənim işlərim”də hamısı ({{count, number}})`,openMyWork:`“Mənim işlərim”i aç`,recentActivity:`Son fəaliyyət`,noActivity:`Hələ fəaliyyət yoxdur`,searchProjects:`Layihələrdə axtar`,projectCount_one:`{{count, number}} layihə`,projectCount_other:`{{count, number}} layihə`,noMatchingProjects:`Uyğun layihə yoxdur`,clearSearch:`Axtarışı təmizlə`,noWorkspaces:`Hələ iş sahəsi yoxdur`,noActiveProjects:`Aktiv layihə yoxdur`,noProjects:`Hələ layihə yoxdur`,archivedProjects:`Arxivləşdirilmiş layihələr`,archived:`Arxivləşdirilib`,noOpenTickets:`Açıq tiket yoxdur`,overdueCount_one:`{{count, number}} gecikmiş`,overdueCount_other:`{{count, number}} gecikmiş`,percentDone:`{{percent}} hazırdır`,nextDue:`növbəti son tarix <time/>`,projectSettingsFor:`{{name}} layihəsinin parametrləri`,pageNotFound:`Səhifə tapılmadı`,openHome:`Əsas səhifəni aç`,tryAgain:`Yenidən cəhd edin`,adminRequired:`Nüsxə administratoru girişi tələb olunur`,projectNotFound:`Layihə tapılmadı`,noWorkspaceSelected:`İş sahəsi seçilməyib`},auth:{signIn:`Daxil ol`,createOwner:`Sahib hesabınızı yaradın`,ownerHint:`İlk hesab bu nüsxəni idarə edir.`,invitedHint:`Dəvəti qəbul etmək üçün dəvət edilmiş e-poçt ünvanı ilə daxil olun.`,signInWith:`{{provider}} ilə daxil ol`,useEmail:`E-poçt və şifrədən istifadə et`,or:`və ya`,name:`Ad`,setupToken:`Quraşdırma tokeni`,setupTokenHint:`Nüsxə konfiqurasiyanızdakı KANVIL_SETUP_TOKEN dəyərindən istifadə edin.`,email:`E-poçt`,password:`Şifrə`,signingIn:`Daxil olunur…`,createAccount:`Hesab yarat`,consent:{expired:`Avtorizasiya sorğusunun müddəti bitib. Klientinizi yenidən qoşun.`,title:`{{client}} üçün icazə ver`,titleUnnamed:`Klientə icazə ver`,subtitle:`Bu klient hesabınız adından giriş istəyir. Layihə icazələri yenə də tətbiq olunur.`,deny:`Rədd et`,allow:`Girişə icazə ver`},invitation:{unavailable:`Dəvət əlçatan deyil`,join:`{{workspace}} iş sahəsinə qoşul`,invited:`Dəvət edilən`,from:`Göndərən`,access:`Giriş`,removedProjects:`Silinmiş layihələr`,wholeWorkspace:`Bütün iş sahəsi`,expires:`Bitmə tarixi`,expired:`Bu dəvətin müddəti bitib. İş sahəsi administratorundan yeni dəvət istəyin.`,revoked:`Bu dəvət ləğv edilib. İş sahəsi administratorundan yeni dəvət istəyin.`,accepted:`Bu dəvət artıq qəbul edilib. İş sahəsi administratorundan yeni dəvət istəyin.`,wrongAccount:`<account>{{current}}</account> kimi daxil olmusunuz. Qəbul etmək üçün {{invited}} kimi daxil olun.`,signOut:`Çıxış et`,joined:`{{workspace}} iş sahəsinə qoşuldunuz`,accept:`Dəvəti qəbul et`},callback:{cancelled:`Daxil olma ləğv edildi. Hazır olduqda yenidən cəhd edin.`,linkedElsewhere:`Bu identiklik artıq başqa Kanvil hesabına bağlanıb. Başqa identiklikdən istifadə edin və ya administratorunuzla əlaqə saxlayın.`,notLinked:`Bu identiklik heç bir Kanvil hesabına bağlanmayıb. Yerli hesabınızla daxil olub onu Parametrlərdə bağlayın.`,expired:`Daxil olma sorğusunun müddəti bitib və ya təsdiqlənə bilmədi. Bu ekrandan yenidən cəhd edin.`,emailMismatch:`İdentiklik provayderinin e-poçtu bağlana bilmədi. Administratorunuzla əlaqə saxlayın.`,failed:`Daxil olmaq mümkün olmadı. Yenidən cəhd edin və ya administratorunuzla əlaqə saxlayın.`}},you:`Siz`,inbox:{markAllRead:`Hamısını oxunmuş kimi qeyd et`,clearRead:`Oxunmuşları təmizlə`,cleared_one:`{{count, number}} oxunmuş bildiriş təmizləndi`,cleared_other:`{{count, number}} oxunmuş bildiriş təmizləndi`,unread:`Oxunmamış`,mentions:`İstinadlar`,all:`Bütün bildirişlər`,noUnread:`Oxunmamış bildiriş yoxdur`,noMentions:`İstinad yoxdur`,noNotifications:`Bildiriş yoxdur`,markUnread:`Oxunmamış kimi qeyd et`,markRead:`Oxunmuş kimi qeyd et`,dismiss:`Rədd et`},search:{field:`İş sahəsində axtar`,placeholder:`Tiketlər, layihələr, şərhlər, fəaliyyət üzrə axtar…`,tab:{all:`Hamısı`,project:`Layihələr`,ticket:`Tiketlər`,comment:`Şərhlər`,activity:`Fəaliyyət`},indexing:`Xarici axtarış yenilənir, ona görə tiket nəticələri PostgreSQL-dən gəlir.`,empty:`Tiketlər, layihələr, şərhlər və fəaliyyət üzrə axtarın`,noResults:`“{{query}}” üçün nəticə yoxdur`,results:`Axtarış nəticələri`,pages:`Axtarış səhifələri`,previous:`Əvvəlki`,next:`Növbəti`,type:{project:`Layihə`,ticket:`Tiket`,comment:`Şərh`,activity:`Fəaliyyət`}},column:{key:`Tiket`,labels:`Etiketlər`,scopes:`Əhatələr`,status:`Status`,priority:`Prioritet`,difficulty:`Çətinlik`,kind:`Növ`,assigneeId:`İcraçı`,startAt:`Başlama`,dueAt:`Son tarix`,createdAt:`Yaradılıb`,updatedAt:`Yenilənib`},public:{notShared:`Bu layihə paylaşılmayıb`,notSharedHint:`Keçid söndürülüb və ya heç vaxt mövcud olmayıb. Üzvlər oxumaq üçün daxil ola bilər.`,noTickets:`Tiket yoxdur`,ticketUnavailable:`Tiket əlçatan deyil`,backToTickets:`Tiketlərə qayıt`,description:`Təsvir`,noDescription:`_Təsvir yoxdur_`,acceptanceCriteria:`Qəbul meyarları`,noAcceptanceCriteria:`_Qəbul meyarları yoxdur_`,ticketProperties:`Tiket xüsusiyyətləri`,properties:`Xüsusiyyətlər`,status:`Status`,priority:`Prioritet`,kind:`Növ`,difficulty:`Çətinlik`,startDate:`Başlama tarixi`,dueDate:`Son tarix`,labels:`Etiketlər`,scopes:`Əhatələr`,created:`Yaradılıb`,updated:`Yenilənib`,relationships:`Əlaqələr`,parent:`Valideyn`,child:`Alt tiket`},sidebar:{workspace:`İş sahəsi`,unread_one:`{{count, number}} oxunmamış`,unread_other:`{{count, number}} oxunmamış`,userSettings:`İstifadəçi parametrləri`,administration:`İdarəetmə`,signOut:`Çıxış et`,projectSettings:`Layihə parametrləri`},workspace:{new:`Yeni iş sahəsi`,name:`İş sahəsinin adı`,key:`İş sahəsinin açarı`,create:`İş sahəsi yarat`,workspaces:`İş sahələri`,switch:`İş sahəsini dəyiş`,settings:`İş sahəsi parametrləri`},palette:{open:`Keç…`,title:`Keç`,description:`Layihə, tiket, səhifə və ya əməliyyat tapın`,placeholder:`Tiketlər, layihələr, səhifələr, əməliyyatlar üzrə axtar…`,searching:`Axtarılır…`,noResults:`Nəticə yoxdur`,jumpTo:`Keç`,openKey:`{{project}} layihəsində {{key}} aç`,resultsIn:`{{workspace}} üzrə nəticələr`,results:`Nəticələr`,seeAll_one:`Bütün {{count, number}} nəticəyə bax`,seeAll_other:`Bütün {{count, number}} nəticəyə bax`,actions:`Əməliyyatlar`,pages:`Səhifələr`,newTicketIn:`{{project}} layihəsində yeni tiket`,myTicketsIn:`{{project}} layihəsində mənim tiketlərim`,lightMode:`İşıqlı rejimə keç`,darkMode:`Qaranlıq rejimə keç`,keywords:{jump:`{{query}} keç aç jump open`,allResults:`bütün nəticələr {{query}}`,newTicket:`yeni tiket yarat`,myTickets:`mənim tiketlərim mənə təyin edilən`,lightMode:`işıqlı rejimə keç tema görünüş`,darkMode:`qaranlıq rejimə keç tema görünüş`,help:`klaviatura qısayolları kömək`,home:`əsas səhifə icmal bütün layihələr`,myWork:`mənim işlərim təyin edilmiş tiketlər`,search:`axtarış şərhlər fəaliyyət layihələr tiketlər`,inbox:`gələnlər bildirişlər`,settings:`parametrlər {{scope}} {{label}}`}},actionCategory:{general:`Ümumi`,ticketList:`Tiket siyahısı`,inbox:`Gələnlər`,ticket:`Tiket`,search:`Axtarış`,markdown:`Markdown`},action:{palette:`İstənilən yerə keç`,help:`Klaviatura qısayolları`,sidebar:`Yan paneli aç/bağla`,newTicket:`Yeni tiket`,search:`Tiketlərdə axtar`,highlight:`Növbəti və ya əvvəlki tiketi vurğula`,open:`Vurğulanmış tiketi aç`,preview:`Vurğulanmış tiketə siyahının yanında bax`,select:`Vurğulanmış tiketi seç`,properties:`Vurğulanmış tiketin statusunu, prioritetini və ya icraçısını təyin et`,inboxHighlight:`Növbəti və ya əvvəlki bildirişi vurğula`,inboxOpen:`Vurğulanmış bildirişin tiketini Gələnlərin yanında oxu`,inboxRead:`Vurğulanmış bildirişi oxunmuş və ya oxunmamış kimi qeyd et`,inboxDismiss:`Vurğulanmış bildirişi rədd et`,step:`Növbəti və ya əvvəlki tiketi aç`,edit:`Tiketi redaktə et`,save:`Tiketi və ya şərhi yadda saxla`,results:`Axtarış nəticələri arasında hərəkət et`,insertBlock:`Vizual redaktorda cədvəl, diaqram, fayl və ya başqa blok daxil et`},move:{top:{label:`Vurğulanmış tiketi ən yuxarı köçür`,menu:`Ən yuxarı köçür`},up:{label:`Vurğulanmış tiketi yuxarı köçür`,menu:`Yuxarı köçür`},down:{label:`Vurğulanmış tiketi aşağı köçür`,menu:`Aşağı köçür`},bottom:{label:`Vurğulanmış tiketi ən aşağı köçür`,menu:`Ən aşağı köçür`},previous:{label:`Vurğulanmış tiketi əvvəlki statusa köçür`,menu:`Əvvəlki statusa köçür`},next:{label:`Vurğulanmış tiketi növbəti statusa köçür`,menu:`Növbəti statusa köçür`}},copy:{link:{label:`Keçidi kopyala`,copied:`Tiket keçidi`},keyAndTitle:{label:`Açarı və başlığı kopyala`,copied:`Tiket`},title:{label:`Başlığı kopyala`,copied:`Başlıq`},markdown:{label:`Markdown kimi kopyala`,copied:`Markdown`},branch:{label:`Budaq adını kopyala`,copied:`Budaq adı`}},settingsNav:{account:`Hesab`,settings:`Parametrlər`,workspace:`İş sahəsi`,workspaceSettings:`İş sahəsi parametrləri`,projects:`Layihələr`,projectSettings:`Layihə parametrləri`,administration:`İdarəetmə`,section:{profile:`Profil və təhlükəsizlik`,appearance:`Görünüş`,preferences:`Seçimlər`,credentials:`API açarları`,notifications:`Bildirişlər`,general:`Ümumi`,members:`Üzvlər`,roles:`Rollar`,labels:`Etiketlər`,workflow:`İş axını`,fields:`Sahələr`,integrations:`İnteqrasiyalar`,calendar:`Təqvim lentləri`,storage:`Fayl yaddaşı`,search:`Axtarış`,events:`Hadisə çatdırılması`,users:`İstifadəçilər`,workspaces:`İş sahələri`,authentication:`Autentifikasiya`}},browser:{copyFailed:`Kopyalamaq alınmadı. Mətni seçib əl ilə kopyalayın.`,readFailed:`Fayl oxuna bilmədi`,encodeFailed:`Fayl kodlaşdırıla bilmədi`,imageTooBig:`10 MB-dan kiçik şəkil seçin.`,cannotResize:`Bu brauzer şəklin ölçüsünü dəyişə bilmir.`,prepareFailed:`Şəkil hazırlana bilmədi.`,stillTooLarge:`Ölçü dəyişdikdən sonra da bu şəkil çox böyükdür. Daha sadə şəkil seçin.`},primitive:{close:`Bağla`,more:`Daha çox`,breadcrumb:`naviqasiya zənciri`,sidebar:`Yan panel`,sidebarDescription:`Mobil yan paneli göstərir.`,toggleSidebar:`Yan paneli aç/bağla`,resizeSidebar:`Yan panelin ölçüsünü dəyiş`,expandSidebar:`Yan paneli genişləndir`,commandTitle:`Əmr paneli`,commandDescription:`İcra etmək üçün əmr axtarın…`}},ticket:{list:{selectSection:`{{section}} tiketlərini seç`,expandSection:`{{section}} tiketlərini genişləndir`,collapseSection:`{{section}} tiketlərini yığ`,sectionTickets:`{{section}} tiketləri`,later:`Sonra`,selectAll:`Göstərilən bütün tiketləri seç`,selectTicket:`{{key}} seç`,title:`Başlıq`,all:`Hamısı`,planned:`Planlaşdırılmış`,archived:`Arxivləşdirilmiş`,allTickets:`Bütün tiketlər`,customView:`Fərdi görünüş`,sectionCount:`{{n, number}} {{section}}`,planning:`{{project}} planlaşdırması`,collection:`{{source}} ({{sections}})`,moved:`{{key}} köçürüldü`,movedTo:`{{key}} {{status}} statusuna köçürüldü`,movedAbove:`{{key}} {{neighbor}} üzərinə köçürüldü`,movedBelow:`{{key}} {{neighbor}} altına köçürüldü`,movedToAbove:`{{key}} {{status}} statusuna, {{neighbor}} üzərinə köçürüldü`,movedToBelow:`{{key}} {{status}} statusuna, {{neighbor}} altına köçürüldü`,emptyFiltered:`Uyğun tiket yoxdur`,emptyPlanning:`Planlaşdırılmış və ya arxivləşdirilmiş heç nə yoxdur`,emptyProject:`Hələ tiket yoxdur`,emptyWork:`Sizə təyin edilmiş açıq tiket yoxdur`,createFirst:`İlk tiketi yarat`,activeWork:`Aktiv iş`,views:`Tiket görünüşləri`,saveCurrentView:`Cari görünüşü yadda saxla`,deleteView:`{{name}} görünüşünü sil`,deleteViewConfirm:`{{name}} yadda saxlanılmış görünüşlərdən silinsin? Tiketlər dəyişməz qalır.`,planningLink:`Planlaşdırma`,newTicketShortcut:`Yeni tiket ({{shortcut}})`,saveView:`Görünüşü yadda saxla`,viewSaved:`Görünüş yadda saxlanıldı`,viewName:`Görünüşün adı`,retry:`Tiketləri yenidən yüklə`,board:`Tiket lövhəsi`,tickets:`Tiketlər`,resizeColumn:`{{column}} sütununun ölçüsünü dəyiş`,count_one:`{{count, number}} tiket`,count_other:`{{count, number}} tiket`,scheduledCount_one:`{{count, number}} planlaşdırılmış tiket`,scheduledCount_other:`{{count, number}} planlaşdırılmış tiket`},move:{destination:`Təyinat`,projectPlaceholder:`Layihəyə köçür…`,blockers:`Köçürməzdən əvvəl həll edin`,submit:`Tiketi köçür`,pending:`Köçürülür…`},picker:{placeholder:`Tiket seçin`,loading:`Tiket yüklənir…`,searchLabel:`{{label, lowercase}} axtar`,searchPlaceholder:`Başlıq və ya açar üzrə axtar…`,noParent:`Valideyn yoxdur`,searching:`Axtarılır…`,empty:`Tiket tapılmadı`},property:{status:`Status`,priority:`Prioritet`,kind:`Növ`,difficulty:`Çətinlik`,assignee:`İcraçı`,you:`{{name}} (siz)`,assignTo:`Təyin et…`,set:`{{label, lowercase}} təyin et…`,search:`{{label, lowercase}} axtar`,noMatches:`Uyğunluq yoxdur`},field:{mixed:`Qarışıq`,unchecked:`Xeyr`,noValue:`Dəyər yoxdur`},project:{label:`Layihə`,placeholder:`Layihədə yarat…`,search:`Layihələrdə axtar`},tags:{labels:`Etiketlər`,scopes:`Əhatələr`,summary:`{{label}}: {{tags}}`,edit:`{{label, lowercase}} redaktə et`,editValues:`{{label, lowercase}} redaktə et: {{tags}}`,editMixed:`{{label, lowercase}} redaktə et: qarışıq`,mixed:`Qarışıq {{label, lowercase}}`,none:`{{label}} yoxdur`,mixedNote:`Seçilmiş tiketlərin {{label, lowercase}} fərqlidir.`,clear:`{{label, lowercase}} təmizlə`,replace:`{{label, lowercase}} əvəz et`},tagInput:{remove:`{{label, lowercase}} {{tag}} çıxar`,addAnother:`Daha birini əlavə et…`,add:`{{label, lowercase}} əlavə et…`,choose:`{{label, lowercase}} seç`,chooseLabels:`Etiketləri seç`,searchPlaceholder:`Etiketlərdə axtar…`,searchLabel:`Layihə etiketlərində axtar`,empty:`Uyğun etiket yoxdur`},link:{previewUnavailable:`Önizləmə əlçatan deyil`},userPicker:{label:`Hesab`,placeholder:`Hesab seçin`,searchPlaceholder:`Ad və ya e-poçt üzrə axtar…`,searchLabel:`Hesablarda axtar`,useEmail:`{{email}} istifadə et`,emptyAnyAccount:`Üzv axtarın və ya mövcud hesabın e-poçtunu daxil edin.`,empty:`Uyğun üzv yoxdur`},date:{placeholder:`Tarix seçin`,clear:`{{label, lowercase}} təmizlə`,start:`Başlama tarixi`,startShort:`Başlama`,noStart:`Başlama tarixi yoxdur`,due:`Son tarix`,dueShort:`Son tarix`,noDue:`Son tarix yoxdur`},filter:{me:`Mən`,searchTickets:`Tiketlərdə axtar`,searchTicketsPlaceholder:`Tiketlərdə axtar…`,filters:`Filtrlər`,filtersActive:`Filtrlər ({{active, number}})`,due:`Son tarix`,anyDue:`İstənilən son tarix`,archived:`Arxivləşdirilmiş`,hideArchived:`Arxivləşdirilmişləri gizlət`,includeArchived:`Arxivləşdirilmişləri daxil et`,archivedOnly:`Yalnız arxivləşdirilmiş`,includingArchived:`Arxivləşdirilmişlər daxil`,reset:`Filtrləri sıfırla`,clear:`Filtrləri təmizlə`,active:`Aktiv tiket filtrləri`,searchChip:`Axtarış: {{query}}`,chipAny:`{{field}}:`,chipNone:`{{field}} deyil:`,notValues:`{{values}} deyil`,match:`{{label}} uyğunluğu`,is:`Bərabərdir`,isNot:`Bərabər deyil`,searchPlaceholder:`{{search}}…`,anyValue:{status:`Bütün statuslar`,priority:`Bütün prioritetlər`,kind:`Bütün növlər`,difficulty:`Bütün çətinliklər`,label:`Bütün etiketlər`,assigneeId:`İstənilən şəxs`,customField:`İstənilən sahə dəyəri`},searchValues:{status:`Statuslarda axtar`,priority:`Prioritetlərdə axtar`,kind:`Növlərdə axtar`,difficulty:`Çətinliklərdə axtar`,label:`Etiketlərdə axtar`,assigneeId:`Şəxslərdə axtar`,customField:`Sahələrdə axtar`}},display:{title:`Görünüş`,orderBy:`Sıralama`,direction:`İstiqamət`,ascending:`Artan`,descending:`Azalan`,reset:`Görünüşü sıfırla`,groupBy:`Qruplaşdırma`,dueDate:`Son tarix`,layout:`Tərtibat`,list:`Siyahı`,board:`Lövhə`,backgrounds:`Layihə fonları`,show:`Göstər`,hide:`Gizlət`,rowSpacing:`Sətir aralığı`,compact:`Sıx`,comfortable:`Rahat`,labelDisplay:`Etiket görünüşü`,compactPreview:`Yığcam önizləmə`,allLabels:`Bütün etiketlər`,properties:`Xüsusiyyətlər`},selection:{region:`Seçilmiş tiketlər`,clear:`Seçimi təmizlə`,selected_one:`{{count, number}} seçilib`,selected_other:`{{count, number}} seçilib`,selectedOf_one:`{{count, number}} / {{total}}<wide> seçilib</wide>`,selectedOf_other:`{{count, number}} / {{total}}<wide> seçilib</wide>`,applied_one:`{{label}} {{count, number}} tiketə tətbiq edildi`,applied_other:`{{label}} {{count, number}} tiketə tətbiq edildi`,partlyApplied_one:`{{count, number}} tiketdən {{done, number}} tiketə tətbiq edildi`,partlyApplied_other:`{{count, number}} tiketdən {{done, number}} tiketə tətbiq edildi`,mixedDue:`Qarışıq son tarixlər`,fields:`Sahələr`,more:`Digər əməliyyatlar`,moveTo:`{{status}} statusuna köçür`,restoreChange:`Bərpa`,restore:`Seçilənləri bərpa et`,archive:`Seçilənləri arxivləşdir`,delete:`Seçilənləri sil`,deleteLimit:`Bir dəfəyə ən çox {{limit, number}} sil`,archiveConfirm_one:`{{collection}} mənbəyindən {{count, number}} tiket arxivləşdirilsin?`,archiveConfirm_other:`{{collection}} mənbəyindən {{count, number}} tiket arxivləşdirilsin?`,deleteConfirm_one:`{{collection}} mənbəyindən {{count, number}} tiket şərhləri, əlaqələri və qoşmaları ilə birlikdə həmişəlik silinsin? Seçimdən kənar alt tiketlər valideynini itirəcək.`,deleteConfirm_other:`{{collection}} mənbəyindən {{count, number}} tiket şərhləri, əlaqələri və qoşmaları ilə birlikdə həmişəlik silinsin? Seçimdən kənar alt tiketlər valideynini itirəcək.`,deleted_one:`{{count, number}} tiket silindi`,deleted_other:`{{count, number}} tiket silindi`},menu:{copied:`{{label}} kopyalandı`,open:`Tiketi aç`,preview:`Önizləmə`,newTab:`Yeni tabda aç`,edit:`Tiketi redaktə et`,editTitle:`{{key}} redaktə et`,duplicate:`Tiketin surətini çıxar`,created:`{{key}} yaradıldı`,move:`Köçür`,moveToProject:`Layihəyə köçür…`,moveTitle:`{{key}} köçür`,moved:`{{key}} olaraq köçürüldü`,follow:`Tiketi izlə`,unfollow:`Tiketi izləməyi dayandır`,archive:`Tiketi arxivləşdir`,unarchive:`Tiketi arxivdən çıxar`,delete:`Tiketi sil`,deleteConfirm:`{{key}}, onun şərhləri, əlaqələri və qoşmaları həmişəlik silinsin?`,openProject:`Layihəni aç`,projectLink:`Layihə keçidi`,copyLink:`Keçidi kopyala`,newTicket:`Yeni tiket`,projectSettings:`Layihə parametrləri`,manageAccount:`Hesabı idarə et`,email:`E-poçt`,copyEmail:`E-poçtu kopyala`},schedule:{range:`{{from}} – {{to}}`,calendar:`Təqvim`,timeline:`Zaman xətti`,today:`Bu gün`,previousMonth:`Əvvəlki ay`,nextMonth:`Növbəti ay`,previousWeeks:`Əvvəlki iki həftə`,nextWeeks:`Növbəti iki həftə`,emptyWeeks:`Bu həftələrdə planlaşdırılmış heç nə yoxdur`,monthTickets:`{{title}} tiketləri`,showDay_one:`{{day}} tarixindəki bütün {{count, number}} tiketi göstər`,showDay_other:`{{day}} tarixindəki bütün {{count, number}} tiketi göstər`,more_one:`daha {{count, number}}`,more_other:`daha {{count, number}}`,ticketColumn:`Tiket`,scheduledTickets:`Planlaşdırılmış tiketlər`},copy:{description:`Təsvir`,acceptanceCriteria:`Qəbul meyarları`}},detail:{field:{title:`Başlıq`,description:`Təsvir`,acceptanceCriteria:`Qəbul meyarları`,parent:`Valideyn`,parentTicket:`Valideyn tiket`,labels:`Etiketlər`,scopes:`Əhatələr`,holdReason:`Gözləmə səbəbi`,url:`URL`},page:{preview:`Tiket önizləməsi`,unavailable:`Tiket əlçatan deyil`,noProject:`Keçiddə tiketin layihəsi göstərilməyib.`,gone:`Bu tiket silinib və ya artıq ona girişiniz yoxdur.`,closePreview:`Önizləməni bağla`,openFullPage:`Tam səhifədə aç`,backToTickets:`Tiketlərə qayıt`,tickets:`Tiketlər`,previousTicket:`Əvvəlki tiket`,previousTicketShortcut:`Əvvəlki tiket (K)`,nextTicket:`Növbəti tiket`,nextTicketShortcut:`Növbəti tiket (J)`,position:`{{position, number}} / {{total, number}}`,subscribe:`Abunə ol`,unsubscribe:`Abunəlikdən çıx`,subscribed:`Yeniliklərə abunə oldunuz`,unsubscribed:`Abunəlik ləğv edildi`,archive:`Tiketi arxivləşdir`,unarchive:`Tiketi arxivdən çıxar`,archivedToast:`Tiket arxivləşdirildi`,unarchivedToast:`Tiket arxivdən çıxarıldı`,archived:`Arxivləşdirilib`,edit:`Tiketi redaktə et`,editShortcut:`Tiketi redaktə et (E)`,editTitle:`{{key}} redaktə et`,actions:`Tiket əməliyyatları`,copyKey:`Tiket açarını kopyala`,keyCopied:`{{key}} kopyalandı`,noDescription:`_Təsvir yoxdur_`,noAcceptanceCriteria:`_Qəbul meyarları yoxdur_`,coordination:`Tiket koordinasiyası`,properties:`Xüsusiyyətlər`,created:`Yaradılıb`,updated:`Yenilənib`},section:{discussion:`Müzakirə`,evidence:`Sübutlar`,activity:`Fəaliyyət`},readiness:{heading:`Agent hazırlığı`,ready:`Götürməyə hazırdır`,notReady:`Götürməyə hazır deyil`,hold:`Gözləmə: {{reason}}`,claimedUntil:`{{date}} tarixinədək <strong>{{worker}}</strong> tərəfindən götürülüb.`},claim:{release:`Götürməmi burax`,releaseDescription:`İşçiniz yazmağı dayandırdıqdan sonra sahiblik buraxılsın?`,recover:`Müddəti bitmiş götürməni bərpa et`,recoverHelp:`Əvvəlcə işçinin dayandığını təsdiqləyin.`,reason:`Bərpa səbəbi`,confirmed:`İşçinin dayandığını təsdiqləmişəm`,submit:`Sahibliyi bərpa et`},editor:{storageUnavailable:`Bu brauzer qaralamanızı yadda saxlaya bilmir. Yadda saxlayana qədər redaktoru açıq saxlayın.`,saved:`{{key}} yadda saxlanıldı`,created:`{{key}} yaradıldı`,properties:`Tiket xüsusiyyətləri`,readyForAgents:`Agentlər üçün hazırdır`,readyForAgentsHelp:`Tələblər, bloklayıcılar və sahiblik imkan verdikdə agentlər bu tiketi götürə bilər`,agents:`Agentlər`,notReady:`Hazır deyil`,moreProperties:`Daha çox xüsusiyyət`,holdPlaceholder:`İş niyə gözləməlidir?`,claimsNote:`Götürmələr yenə də tələblərdən, bloklayıcılardan və cari sahiblikdən asılıdır.`,restoreSize:`Redaktorun ölçüsünü bərpa et`,expand:`Redaktoru genişləndir`,staleTitle:`Bu tiket dəyişib.`,staleDescription:`Qaralamanız hələ {{version}} versiyasından istifadə edir; yadda saxlamaq üçün cari versiya tələb olunacaq.`,discardAndReload:`Qaralamanı at və yenidən yüklə`,titlePlaceholder:`Tiket başlığı`,descriptionPlaceholder:`Kontekst, tələblər və ya təkrarlama addımları əlavə edin…`,criteriaPlaceholder:`- [ ] Bunun tamamlandığını nə göstərəcək?`,removeCriteria:`Qəbul meyarlarını sil`,addCriteria:`Qəbul meyarları əlavə et`,savedLocally:`Qaralama bu cihazda yadda saxlanıldı`,notSavedLocally:`Qaralama yadda saxlanıla bilmədi`,discardDraft:`Qaralamanı at`,createMore:`Daha çox yarat`,save:`Tiketi yadda saxla`,create:`Tiket yarat`},resource:{removeConfirm:`{{name}} silinsin?`,uploading:`Yüklənir…`},attachment:{heading:`Qoşmalar`,tooLarge:`Hər biri 10 MB-dan böyük olmayan fayllar seçin.`,attached_one:`Fayl qoşuldu`,attached_other:`{{count, number}} fayl qoşuldu`,attach:`Fayl qoş`,emptyWritable:`Qoşma yoxdur. Faylları bura atın.`,empty:`Qoşma yoxdur`,remove:`Qoşmanı sil`,fileInput:`Fayl (10 MB-a qədər)`},evidence:{description:`Bu tiket üzərində işləyən insanların və inteqrasiyaların bildirdiyi keçidlər və nəticələr.`,add:`Sübut əlavə et`,empty:`Qoşulmuş sübut yoxdur`,added:`Sübut əlavə edildi`,kindLabel:`Növ`,outcomeLabel:`Bildirilən nəticə`,commit:`Commit (tam hash)`,note:`Qeyd`},link:{heading:`Keçidlər`,add:`Keçid əlavə et`,edit:`Keçidi redaktə et`,save:`Keçidi yadda saxla`,remove:`Keçidi sil`,empty:`Keçid yoxdur`,stateUnknown:`Vəziyyət naməlumdur`,remote:`{{kind}} · {{state}}`,remoteState:{open:`Açıq`,closed:`Bağlı`,merged:`Birləşdirilib`,draft:`Qaralama`,active:`Aktiv`,deleted:`Silinib`}},activity:{previous:`Əvvəlki fəaliyyət`,next:`Növbəti fəaliyyət`},relations:{heading:`Əlaqələr`,add:`Əlaqə əlavə et`,linkExisting:`Mövcud tiketi bağla`,newChild:`Yeni alt tiket`,newChildTitle:`{{key}} üçün yeni alt tiket`,children:`Alt tiketlər <count>{{done, number}}/{{total, number}}</count>`,previousChildren:`Əvvəlki alt tiketlər`,nextChildren:`Növbəti alt tiketlər`,empty:`Əlaqə yoxdur`,type:`Əlaqə`,ticket:`Tiket`,statusOf:`{{key}} statusu`,assigneeOf:`{{key}} icraçısı`,remove:{blocks:`“Bloklayır” əlaqəsini sil`,related:`“Əlaqəlidir” əlaqəsini sil`,duplicate:`“Təkrarlayır” əlaqəsini sil`,causes:`“Səbəb olur” əlaqəsini sil`,clones:`“Klonlayır” əlaqəsini sil`,implements:`“Həyata keçirir” əlaqəsini sil`,reviews:`“Yoxlayır” əlaqəsini sil`}},discussion:{empty:`Hələ şərh yoxdur`,previous:`Əvvəlki şərhlər`,next:`Növbəti şərhlər`,comment:`Şərh yaz`,placeholder:`Şərh yazın…`,posting:`Göndərilir…`,edited:`Redaktə edilib`,edit:`Şərhi redaktə et`,delete:`Şərhi sil`,deleteConfirm:`Bu şərh həmişəlik silinsin?`},markdown:{format:{heading:`Başlıq`,bold:`Qalın`,italic:`Kursiv`,link:`Keçid`,linkHelp:`Seçilmiş mətnə keçid əlavə et`,bullets:`Markerli siyahı`,numbers:`Nömrəli siyahı`,tasks:`Yoxlama siyahısı`,code:`Kod bloku`},formatting:`{{label}} formatlaşdırması`,editor:`{{label}} redaktoru`,insertFile:`Fayl daxil et`,insertFileInto:`{{label}} sahəsinə fayl daxil et`,write:`Yaz`,visual:`Vizual`,preview:`Önizləmə`,unsupported:`Bu mətndə vizual redaktorun saxlaya bilmədiyi Markdown var, məsələn, HTML və ya haşiyələr.`,nothingToPreview:`Önizləmək üçün heç nə yoxdur`,mention:`Üzvü qeyd et`,insertBlock:`Blok daxil et`,block:{quote:`Sitat`,table:`Cədvəl`,diagram:`Diaqram`,divider:`Ayırıcı`,file:`Fayl`},table:{addRow:`Sətir əlavə et`,addColumn:`Sütun əlavə et`,deleteRow:`Sətri sil`,deleteColumn:`Sütunu sil`,deleteTable:`Cədvəli sil`},linkAddress:`Keçid ünvanı`,diagram:`Diaqram`,diagramFailed:`Bu diaqram çəkilə bilmədi: {{error}}`,diagramSource:`Diaqram mənbəyi`}},settings:{account:{title:`Parametrlər`,security:`Daxil olma və təhlükəsizlik`,localPassword:`Yerli şifrə`,localPasswordDescription:`Şifrəni dəyişmək digər seanslarınızdan çıxış edir.`,changePassword:`Şifrəni dəyiş`,oidcLinked:`Eyni hesaba daxil olmaq üçün bu identiklik provayderindən istifadə edin.`,oidcUnlinked:`Bu provayder vasitəsilə daxil olmazdan əvvəl hesabınızı bağlayın.`,linked:`Bağlanıb`,link:`{{name}} bağla`,currentPassword:`Cari şifrə`,newPassword:`Yeni şifrə`,confirmPassword:`Yeni şifrəni təsdiqləyin`,passwordMismatch:`Yeni şifrələr uyğun gəlmir.`,passwordUpdated:`Şifrə yeniləndi. Digər seanslardan çıxış edildi.`},preferences:{behavior:`Davranış`,languageDescription:`Bu brauzerdə, o cümlədən daxil olma səhifəsində tətbiq olunur.`,weekStart:`Həftənin başlanğıcı`,weekStartDescription:`Bütün tarix seçicilərinə tətbiq olunur.`,weekStartLanguage:`Dil standartı`,sidebar:`Açılışda yan panel`,sidebarDescription:`Kanvil növbəti dəfə açılanda qüvvəyə minir.`,sidebarLast:`Son vəziyyətdə`,sidebarExpanded:`Genişləndirilmiş`,sidebarCollapsed:`Yığılmış`,ticketLists:`Tiket siyahıları`,reset:`Seçimləri sıfırla`,resetDescription:`Bu brauzerdə bu seçimləri standart dəyərlərə qaytarır.`,resetDone:`Seçimlər sıfırlandı`},notifications:{title:`Bildirişlər`,inbox:`Gələnlər`,inboxDescription:`İzlədiyiniz tiketlərin yenilikləri Kanvil-də görünür.`,inboxSwitch:`Abunə olunmuş tiket yenilikləri Gələnlərdə`,push:`Push bildirişləri`,pushDescription:`Qeydiyyatdan keçirdiyiniz cihazlara yenilikləri göndərin.`,pushUnavailable:`Bu nüsxədə push çatdırılması aktiv deyil.`,pushSwitch:`Qeydiyyatlı cihazlarda push bildirişləri`,categories:`Kateqoriyalar`,categorySwitch:`{{label}} bildirişləri`,reminder:`Müddət yaxınlaşma xatırlatması`,reminderDescription:`İzlənilən tiketin son tarixindən nə qədər əvvəl.`,reminderUnit:`Xatırlatma vahidi`,reminderAmount:`Xatırlatma miqdarı`,unit:{minutes:`Dəqiqə`,hours:`Saat`,days:`Gün`,weeks:`Həftə`}},layout:{nav:`Parametrlər`,section:`Parametrlər bölməsi`,nested:`{{parent}} · {{child}}`,name:`Ad`,description:`Təsvir`,descriptionPlaceholder:`Təsvir əlavə edin`,noDescription:`Təsvir yoxdur`,stale:`Bu başqa yerdə dəyişdirilib. Ləğv edib yenidən başlayın.`},profile:{title:`Profil`,displayName:`Görünən ad`,edit:`Profili redaktə et`,changePhoto:`Şəkli dəyiş`,removePhoto:`Şəkli sil`,photoFile:`Profil şəkli faylı`,photoUpdated:`Şəkil yeniləndi`,photoRemoved:`Şəkil silindi`,saved:`Profil yadda saxlanıldı`},credentials:{global:`Qlobal`,globalDescription:`Hesabınızın indi və gələcəkdə giriş əldə etdiyi bütün layihələrə və iş məkanlarına giriş.`,title:`API açarları`,description:`Skriptləri, inteqrasiyaları və agentləri ləğv edə biləcəyiniz girişlə qoşun.`,create:`API açarı yarat`,creating:`Yaradılır…`,created:`API açarı yaradıldı`,name:`Ad`,access:`Giriş`,projects:`Layihələr`,expires:`Bitmə tarixi`,actions:`Əməliyyatlar`,unavailableProject:`Əlçatan olmayan layihə`,untitled:`Adsız açar`,expired:`Müddəti bitib`,disabled:`Deaktiv`,custom:`Fərdi`,noProjects:`Layihəyə giriş yoxdur`,never:`Heç vaxt`,revoke:`API açarını ləğv et`,revokeNamed:`{{name}} ləğv edilsin? Ondan istifadə edən bağlantılar dərhal girişini itirəcək.`,revokeUnnamed:`Bu API açarı ləğv edilsin? Ondan istifadə edən bağlantılar dərhal girişini itirəcək.`,empty:`API açarı yoxdur`,emptyDescription:`Skript, inteqrasiya və ya agentin layihələrinizə girişi lazım olduqda açar yaradın.`,copyNow:`Bu açarı indi kopyalayın. Onu bir daha görə bilməyəcəksiniz.`,newKey:`Yeni API açarı`,copy:`API açarını kopyala`,noProjectTitle:`Əvvəlcə layihə seçin`,noProjectDescription:`API açarlarının ən azı bir layihəyə girişi olmalıdır.`,goToProjects:`Layihələrə keç`,keyName:`Açarın adı`,keyNamePlaceholder:`məs. Buraxılış avtomatlaşdırması`,projectAccess:`Layihəyə giriş`,findProject:`Layihə tap`,projectDescription:`{{key}} · {{workspace}}`,workspace:`İş sahəsi`,noMatches:`Uyğun layihə yoxdur`,roleLimit:`Mövcud layihə rolunuz bu açarın imkanlarını yenə də məhdudlaşdırır.`,accessLevel:`Giriş səviyyəsi`,preset:{read:`Yalnız oxuma`,write:`Oxuma və yazma`,automation:`Oxuma, yazma və iş götürmə`,custom:`Fərdi icazələr`},permission:{intake:{name:`Hesabat göndər`,description:`Yalnız karantində biletlər yaradır. Biletləri oxuya və ya redaktə edə bilməz. Tək istifadə edin.`},read:{name:`Tiketləri oxumaq`,description:`Layihələrə, tiketlərə, şərhlərə və qoşmalara baxmaq.`},write:{name:`Tiketləri redaktə etmək`,description:`Tiketləri, şərhləri və qoşmaları yaratmaq və yeniləmək.`},claim:{name:`İş götürmək`,description:`Tiket sahibliyini götürmək, yeniləmək və buraxmaq.`},admin:{name:`Layihələri və iş məkanlarını idarə et`,description:`Rolunuzun icazə verdiyi layihə və iş məkanı parametrlərini və üzvlükləri dəyişin.`}},expiry:{7:`7 gün`,30:`30 gün`,90:`90 gün`,365:`1 il`,custom:`Fərdi tarix`,never:`Müddətsiz`},expiresOn:`Bitmə tarixi`,neverDescription:`Açar siz onu silənə qədər işləyir.`},calendarFeeds:{title:`Təqvim lentləri`,new:`Yeni təqvim lenti`,created:`Təqvim lenti yaradıldı`,create:`Lent yarat`,adminOnly:`Təqvim lentlərini layihə administratorları paylaşır və ləğv edir.`,labels:`Etiketlər`,everyLabel:`Bütün etiketlər`,stopped:`· Dayandırılıb: yaradanın artıq girişi yoxdur`,revoke:`{{name}} ləğv et`,revokeDescription:`{{name}} lentinə abunə olan təqvimlər dərhal yenilənməyi dayandırır. Tiketlər dəyişməz qalır.`,revoked:`Təqvim lenti ləğv edildi`,empty:`Təqvim lenti yoxdur`,copyNow:`Bu keçidi indi təqvim tətbiqinə kopyalayın. O, yalnız bir dəfə göstərilir və ona sahib olan hər kəs paylaşılan tiketləri oxuya bilər.`,link:`Lent keçidi`,name:`Lentin adı`,onlyLabels:`Yalnız bu etiketləri olan tiketlər`,explanation:`Lent başlama və ya son tarixi olan açıq, arxivləşdirilməmiş tiketləri {{zone}} saat qurşağında bütün günlük hadisələr kimi göstərir. Keçidə sahib olan hər kəs onların açarlarını, başlıqlarını, statuslarını, prioritetlərini və tarixlərini görür.`},project:{title:`Layihə parametrləri`,edit:`Layihəni redaktə et`,copyPrefix:`Tiket prefiksini kopyala`,saved:`Layihə yadda saxlanıldı`,noOpenTickets:`Açıq tiket yoxdur`,openTickets_one:`{{count, number}} açıq tiket`,openTickets_other:`{{count, number}} açıq tiket`,overdueTickets_one:`· {{count, number}} gecikmiş`,overdueTickets_other:`· {{count, number}} gecikmiş`,created:`· Yaradılıb: <time/>`,access:`Layihəyə giriş`,accessWorkspace:`İş sahəsi üzvləri girişi iş sahəsindəki rollarından alır.`,accessPrivate:`Bu layihəni yalnız əlavə etdiyiniz üzvlər və iş sahəsi administratorları görə bilər.`,accessUpdated:`Layihəyə giriş yeniləndi`,visibility:{workspace:`İş sahəsindəki hər kəs`,private:`Yalnız layihə üzvləri`},workspace:`İş sahəsi`,workspaceSettings:`İş sahəsi parametrləri`,prefix:`Tiket prefiksi`,prefixDescription:`Dəyişiklikdən sonra əvvəlki prefikslər və tiket açarları işləməyə davam edir.`,changePrefix:`Prefiksi dəyiş`,changePrefixTitle:`Tiket prefiksini dəyiş`,changePrefixDescription:`{{name}} layihəsindəki hər tiket yeni prefiksi alır və nömrəsini saxlayır.`,changing:`Dəyişdirilir…`,prefixChanged:`Tiketlər indi {{key}} istifadə edir`,publicLink:`İctimai keçid`,publicDisclosure:`Keçidə sahib olan hər kəs bu layihədəki hər arxivləşdirilməmiş tiketin başlığını, təsvirini, qəbul meyarlarını, statusunu, prioritetini, növünü, çətinliyini, etiketlərini, əhatələrini, tarixlərini və digər tiketlərə keçidlərini oxuya bilər. İnsanlar, şərhlər, fəaliyyət, qoşmalar, sübutlar və götürmələr gizli qalır.`,publicOn:`İctimai keçid aktivdir`,publicOff:`İctimai keçid deaktivdir`,off:`Deaktiv`,copyPublicLink:`İctimai keçidi kopyala`,openPublic:`İctimai görünüşü aç`,stopSharing:`Paylaşımı dayandır`,share:`İctimai paylaş`,background:`Fon`,backgroundDescription:`Bu layihənin tiket siyahısı və lövhəsinin arxasında göstərilir.`,backgroundUpdated:`Fon yeniləndi`,backgroundRemoved:`Fon silindi`,currentBackground:`Cari fon`,uploading:`Yüklənir…`,replace:`Əvəz et`,upload:`Şəkil yüklə`,backgroundFile:`Layihə fonu faylı`},tickets_one:`{{count, number}} tiket`,tickets_other:`{{count, number}} tiket`,moveUp:`{{name}} yuxarı köçür`,moveDown:`{{name}} aşağı köçür`,workflow:{title:`İş axını`,new:`Yeni vəziyyət`,edit:`Vəziyyəti redaktə et`,editNamed:`{{name}} vəziyyətini redaktə et`,deleteNamed:`{{name}} vəziyyətini sil`,onlyState:`{{name}} yeganə “{{category}}” vəziyyətidir`,saved:`Vəziyyət yadda saxlanıldı`,name:`Vəziyyətin adı`,category:`Kateqoriya`,color:`Vəziyyətin rəngi`,categoryChange:`Onun tiketlərinin statusu {{status}} olaraq dəyişir.`,save:`Vəziyyəti yadda saxla`,delete:`Vəziyyəti sil`,deleteTitle:`{{name}} sil`,deleted:`Vəziyyət silindi`,reassign_one:`{{count, number}} tiketi buraya köçür:`,reassign_other:`{{count, number}} tiketi buraya köçür:`},labels:{title:`Etiketlər`,search:`Etiketlərdə axtar`,new:`Yeni etiket`,edit:`Etiketi redaktə et`,workspace:`İş sahəsi`,editNamed:`{{name}} etiketini redaktə et`,deleteNamed:`{{name}} etiketini sil`,deleteUsed_one:`{{name}} arxivləşdirilmişlər daxil {{count, number}} tiketdən çıxarılsın? Bu etiketdən istifadə edən yadda saxlanılmış görünüşlərin etiket filtri silinəcək.`,deleteUsed_other:`{{name}} arxivləşdirilmişlər daxil {{count, number}} tiketdən çıxarılsın? Bu etiketdən istifadə edən yadda saxlanılmış görünüşlərin etiket filtri silinəcək.`,deleteUsedShared_one:`{{name}} bütün layihələrdə arxivləşdirilmişlər daxil {{count, number}} tiketdən çıxarılsın? Bu etiketdən istifadə edən yadda saxlanılmış görünüşlərin etiket filtri silinəcək.`,deleteUsedShared_other:`{{name}} bütün layihələrdə arxivləşdirilmişlər daxil {{count, number}} tiketdən çıxarılsın? Bu etiketdən istifadə edən yadda saxlanılmış görünüşlərin etiket filtri silinəcək.`,deleteUnused:`İstifadə olunmayan {{name}} etiketi silinsin? Ondan istifadə edən yadda saxlanılmış görünüşlərin etiket filtri silinəcək.`,deleted:`Etiket silindi`,noMatches:`Uyğun etiket yoxdur`,empty:`Hələ etiket yoxdur`,saved:`Etiket yadda saxlanıldı`,name:`Etiketin adı`,color:`Etiketin rəngi`,rename:`Adı dəyişdirmək bu etiketi tiketlərdə və yadda saxlanılmış görünüşlərdə yeniləyir.`,renameShared:`Adı dəyişdirmək bu etiketi bütün layihələrdə tiketlərdə və yadda saxlanılmış görünüşlərdə yeniləyir.`,adopt:`Layihə etiketlərini mənimsə`,adoptDescription:`{{projects}} layihələrində müəyyən edilib. Onların tiketləri etiketi saxlayır və bu rəngi alır.`,save:`Etiketi yadda saxla`},fields:{title:`Sahələr`,new:`Yeni sahə`,edit:`Sahəni redaktə et`,editNamed:`{{name}} sahəsini redaktə et`,deleteNamed:`{{name}} sahəsini sil`,deleteUsed_one:`{{name}} silinsin və onun dəyərləri arxivləşdirilmişlər daxil {{count, number}} tiketdən çıxarılsın? Yadda saxlanılmış görünüşlər bu sahə üzrə filtrlərini itirəcək.`,deleteUsed_other:`{{name}} silinsin və onun dəyərləri arxivləşdirilmişlər daxil {{count, number}} tiketdən çıxarılsın? Yadda saxlanılmış görünüşlər bu sahə üzrə filtrlərini itirəcək.`,deleteUnused:`İstifadə olunmayan {{name}} sahəsi silinsin? Yadda saxlanılmış görünüşlər bu sahə üzrə filtrlərini itirəcək.`,deleted:`Sahə silindi`,empty:`Hələ sahə yoxdur`,saved:`Sahə yadda saxlanıldı`,required:`Məcburi`,requiredDescription:`Yeni tiketlər üçün dəyər tələb olunur.`,defaultValue:`Standart: {{value}}`,default:`Standart`,name:`Sahənin adı`,type:`Tip`,options:`Seçimlər`,option:`Seçim {{number}}`,optionInline:`seçim {{number}}`,optionColor:`{{name}} rəngi`,removeOption:`{{name}} sil`,addOption:`Seçim əlavə et`,reassign:`{{name}} olan tiketlər`,clearValue:`Dəyəri təmizlə`,moveTo:`{{name}} seçiminə köçür`,save:`Sahəni yadda saxla`},lifecycle:{archivedToast:`Layihə arxivləşdirildi`,restoredToast:`Layihə bərpa edildi`,archivedNotice:`Arxivləşdirilib: <time/> · yalnız oxuma`,restore:`Bərpa et`,archive:`Arxivləşdir`,archivedDescription:`Arxivləşdirilib: <time/>. Onun tiketləri yalnız oxunur və siyahılarda, axtarışda, “Mənim işlərim”də, təqvim lentlərində və agent növbələrində görünmür.`,archiveDescription:`Layihəni siyahılardan, axtarışdan, “Mənim işlərim”dən, təqvim lentlərindən və agent növbələrindən gizlədir və tiketlərini yalnız oxunan edir. Tarixçə saxlanılır.`,archiveProject:`Layihəni arxivləşdir`,archiveConfirm:`{{name}} bərpa edilənə qədər layihə siyahılarından və agent növbələrindən çıxarılır. Götürülmüş tiketlər əvvəlcə buraxılmalıdır.`,blocker:`{{message}}: {{tickets}}`,row:{tickets:`Tiketlər`,losesAccess:`Girişini itirir`,gainsAccess:`Giriş əldə edir`,labelsCopied:`Kopyalanan etiketlər`,labelsMerged:`Birləşdirilən etiketlər`,followsRemoved:`Silinən izləmələr`,invitations:`Dəvətlər`,comments:`Şərhlər`,files:`Fayllar`,kept:`Saxlanılır`,projects:`Layihələr`,members:`Üzvlər`,sharedLabels:`Ümumi etiketlər`,signIn:`Daxil olma`,sessions:`Seanslar`,credentials:`Giriş məlumatları`,devices:`Cihazlar`,access:`Giriş`,claims:`Götürmələr`,imports:`İdxallar`,profile:`Profil`},transferTickets_one:`{{count, number}}, açarları və keçidləri saxlanılmaqla`,transferTickets_other:`{{count, number}}, açarları və keçidləri saxlanılmaqla`,noOne:`Heç kim`,transferInvitations_one:`{{count, number}} gözləyən dəvətdən layihə çıxarılır`,transferInvitations_other:`{{count, number}} gözləyən dəvətdən layihə çıxarılır`,files_one:`{{count, number}} · {{size}}`,files_other:`{{count, number}} · {{size}}`,keptProject_one:`{{count, number}} fəaliyyət qeydi və {{key}} prefiksi`,keptProject_other:`{{count, number}} fəaliyyət qeydi və {{key}} prefiksi`,keptWorkspace_one:`{{count, number}} fəaliyyət qeydi və {{slug}} URL açarı`,keptWorkspace_other:`{{count, number}} fəaliyyət qeydi və {{slug}} URL açarı`,archivedProject:`arxivləşdirilib`,membersLoseAccess_one:`{{count, number}} nəfər girişini itirir; hesabı qalır`,membersLoseAccess_other:`{{count, number}} nəfər girişini itirir; hesabları qalır`,pendingInvitations_one:`{{count, number}} gözləyir`,pendingInvitations_other:`{{count, number}} gözləyir`,move:`Köçür`,moveTitle:`{{name}} köçür`,moved:`{{name}} iş sahəsinə köçürüldü`,movedUnnamed:`İş sahəsinə köçürüldü`,destination:`Təyinat iş sahəsi`,moveProject:`Layihəni köçür`,moving:`Köçürülür…`,export:`İxrac`,exportDescription:`Tiketlər iş axını, sahələr, etiketlər, əlaqələr, şərhlər, sübutlar və keçidlərlə birlikdə versiyalı JSON kimi. Qoşmalar və fəaliyyət tarixçəsi burada qalır.`,exporting:`İxrac edilir…`,exportJson:`JSON ixrac et`,delete:`Sil`,deleteTitle:`{{name}} sil`,deleted:`{{name}} silindi`,typeToConfirm:`Təsdiqləmək üçün {{value}} yazın`,deleting:`Silinir…`,deleteProject:`Layihəni sil`,deleteProjectDescription:`Tiketləri, şərhləri və faylları həmişəlik silir. Fəaliyyət tarixçəsi qalır və {{key}} bir daha istifadə edilmir.`,signInAgain:`Yenidən daxil ol`,deleteWorkspace:`İş sahəsini sil`,deleteWorkspaceDescription:`İş sahəsindəki bütün layihələri tiketləri, şərhləri və faylları ilə birlikdə həmişəlik silir və üzvlərini çıxarır. Hesablar və fəaliyyət tarixçəsi qalır.`,noSignInMethods:`Bağlanmış daxil olma üsulu yoxdur`,sessions_one:`{{count, number}} seansdan çıxış edildi`,sessions_other:`{{count, number}} seansdan çıxış edildi`,credentials_one:`{{count, number}} API açarı və ya tətbiq bağlantısı ləğv edildi`,credentials_other:`{{count, number}} API açarı və ya tətbiq bağlantısı ləğv edildi`,devices_one:`{{count, number}} cihaz və ya bildiriş kanalı silindi`,devices_other:`{{count, number}} cihaz və ya bildiriş kanalı silindi`,workspaceCount_one:`{{count, number}} iş sahəsi`,workspaceCount_other:`{{count, number}} iş sahəsi`,directProjectCount_one:`{{count, number}} birbaşa layihə`,directProjectCount_other:`{{count, number}} birbaşa layihə`,accessWorkspaces:`{{workspaces}} silindi`,accessBoth:`{{workspaces}} və {{projects}} silindi`,claims_one:`{{count, number}} götürmə buraxıldı`,claims_other:`{{count, number}} götürmə buraxıldı`,imports_one:`{{count, number}} idxal ləğv edildi`,imports_other:`{{count, number}} idxal ləğv edildi`,profileErased:`Ad, e-poçt və şəkil silindi`,commentCount_one:`{{count, number}} şərh`,commentCount_other:`{{count, number}} şərh`,activityCount_one:`{{count, number}} fəaliyyət qeydi`,activityCount_other:`{{count, number}} fəaliyyət qeydi`,keptAccount:`{{tickets}}, {{comments}} və {{events}} “{{name}}” kimi göstərilir`,deleteAccount:`Hesabı sil`,deleteOwnAccount:`Daxil olma məlumatlarınızı, seanslarınızı, açarlarınızı, cihazlarınızı, üzvlüklərinizi və şəxsi məlumatlarınızı həmişəlik silir. Tiketlər, şərhlər və fəaliyyət qalır və “{{name}}” kimi göstərilir.`,deleteOtherAccount:`Bu hesabın daxil olma məlumatlarını, seanslarını, açarlarını, cihazlarını, üzvlüklərini və şəxsi məlumatlarını həmişəlik silir. Tiketlər, şərhlər və fəaliyyət qalır və “{{name}}” kimi göstərilir.`},icon:{change:`İkonu dəyiş`,title:`Layihə ikonu`,library:`İkon kitabxanası`,upload:`Şəkil yüklə`,search:`İkonlarda axtar`,searchPlaceholder:`İkonlarda axtar…`,color:`İkonun rəngi`,choose:`{{name}} seç`,noMatches:`Uyğun ikon yoxdur`,showMore:`Daha çox ikon göstər`,uploading:`Yüklənir…`,chooseImage:`Şəkil seç`,formats:`PNG, JPEG və ya WebP · 10 MB-a qədər`,file:`Layihə ikonu faylı`,reset:`İkonu sıfırla`},createProject:{title:`Yeni layihə`,inWorkspace:`{{name}} iş sahəsində`,everyoneLabel:`Bu iş sahəsindəki hər kəs`,name:`Layihənin adı`,namePlaceholder:`Mobil tətbiq`,create:`Layihə yarat`},workspace:{title:`İş sahəsi parametrləri`,owner:`Sahib`,noOwner:`Sahib yoxdur. Nüsxə administratoru təyin edə bilər.`,transfer:`Sahibliyi ötür`,transferring:`Ötürülür…`,transferred:`{{workspace}} artıq {{name}} istifadəçisinə məxsusdur`,newOwner:`Yeni sahib`,noEligible:`Sahiblik aktiv iş sahəsi administratoruna keçir. Əvvəlcə başqa bir üzvü administrator edin.`,chosenCan:`Bundan sonra {{name}} iş sahəsini ötürə və ya silə bilər.`,newOwnerCan:`Yeni sahib iş sahəsini ötürə və ya silə bilər.`,ownerStays:`{{name}} administrator olaraq qalır.`,unavailable:`İş sahəsi əlçatan deyil`,backToProjects:`Layihələrə qayıt`,name:`İş sahəsinin adı`,edit:`İş sahəsini redaktə et`,copyKey:`İş sahəsinin açarını kopyala`,saved:`İş sahəsi yadda saxlanıldı`,projects:`Layihələr`,projectCount_one:`Bu iş sahəsində girişiniz olan {{count, number}} layihə.`,projectCount_other:`Bu iş sahəsində girişiniz olan {{count, number}} layihə.`,viewProjects:`Layihələrə bax`,members:`Üzvlər`,membersDescription:`İş sahəsi rolları iş sahəsi girişindən istifadə edən layihələrə tətbiq olunur.`,manageMembers:`Üzvləri idarə et`},members:{title:`Üzvlər`,customRole:`Fərdi rol`,search:`Üzvlərdə axtar`,searchPlaceholder:`Ad və ya e-poçt…`,add:`Üzv əlavə et`,added:`Üzv əlavə edildi`,workspaceAccess:`İş sahəsi girişi`,owner:`Sahib`,roleFor:`{{name}} üçün rol`,useWorkspaceAccess:`İş sahəsi girişindən istifadə et`,remove:`Üzvü çıxar`,removeFromWorkspace:`{{name}} bu iş sahəsindən və onun bütün layihələrindən çıxarılsın?`,restoreAccess:`{{name}} üçün {{role}} iş sahəsi girişi bərpa edilsin?`,removeFromProject:`{{name}} üçün layihə girişi silinsin?`,noMatches:`Uyğun üzv yoxdur`,empty:`Üzv yoxdur`,projectRole:`Layihə rolu`,workspaceRole:`İş sahəsi rolu`},invitations:{title:`Dəvətlər`,invite:`E-poçtla dəvət et`,removedProjects:`Silinmiş layihələr`,wholeWorkspace:`Bütün iş sahəsi`,selectedProjects:`Seçilmiş layihələr`,expired:`Müddəti bitib`,expires:`Bitir: <time/>`,resend:`Dəvəti {{email}} ünvanına yenidən göndər`,revoke:`Dəvəti ləğv et`,revokeDescription:`{{email}} ünvanına göndərilən keçid işləməyi dayandıracaq.`,revoked:`Dəvət ləğv edildi`,empty:`Gözləyən dəvət yoxdur`,email:`E-poçt`,role:`Rol`,access:`Giriş`,projects:`Layihələr`,noProjects:`Bu iş sahəsində layihə yoxdur.`,linkExpires:`Keçidin bitmə müddəti`,inDays_one:`{{count, number}} gün sonra`,inDays_other:`{{count, number}} gün sonra`,submit:`Dəvət et`,link:`Dəvət keçidi`,copyLink:`Dəvət keçidini kopyala`,emailed:`{{email}} ünvanına göndərildi. Keçid həmin ünvan üçün bir dəfə işləyir.`,notEmailed:`Bu nüsxədə e-poçt konfiqurasiya edilməyib. Bu keçidi {{email}} ünvanına göndərin; o, həmin ünvan üçün bir dəfə işləyir.`,notEmailedUnknown:`Bu nüsxədə e-poçt konfiqurasiya edilməyib. Bu keçidi alıcıya göndərin; o, həmin ünvan üçün bir dəfə işləyir.`},workspaces:{title:`İş sahələri`,search:`İş sahələrində axtar`,searchPlaceholder:`Ad və ya URL açarı…`,noMatches:`Uyğun iş sahəsi yoxdur`,empty:`İş sahəsi yoxdur`,workspace:`İş sahəsi`,administrators:`Administratorlar`,members:`Üzvlər`,projects:`Layihələr`,created:`Yaradılıb`,actions:`Əməliyyatlar`,noAdministrator:`Administrator yoxdur`,manage:`{{name}} idarə et`,pagerNoun:`iş sahələri`,private:`Gizli`,noProjects:`Layihə yoxdur`},roles:{title:`Rollar`,new:`Yeni rol`,edit:`Rolu redaktə et`,builtIn:`Daxili`,readOnly:`Oxumadan başqa əməliyyat yoxdur`,memberships_one:`{{count, number}} üzvlük`,memberships_other:`{{count, number}} üzvlük`,editNamed:`{{name}} rolunu redaktə et`,deleteNamed:`{{name}} rolunu sil`,deleteUnused:`İstifadə olunmayan {{name}} rolu silinsin?`,deleted:`Rol silindi`,empty:`Rol yoxdur`,saved:`Rol yadda saxlanıldı`,name:`Rolun adı`,actions:`Əməliyyatlar`,everyoneReads:`Hər üzv çatdığı layihələri oxuya bilər.`,changesApply_one:`Dəyişikliklər bu rola malik {{count, number}} üzvlüyə dərhal tətbiq olunur.`,changesApply_other:`Dəyişikliklər bu rola malik {{count, number}} üzvlüyə dərhal tətbiq olunur.`,save:`Rolu yadda saxla`,delete:`Rolu sil`,reassignDescription_one:`{{count, number}} üzvlük {{name}} roluna malikdir. Keçəcəkləri rolu seçin.`,reassignDescription_other:`{{count, number}} üzvlük {{name}} roluna malikdir. Keçəcəkləri rolu seçin.`,moveTo:`Üzvləri bu rola köçür`},theme:{mode:{light:`İşıqlı`,dark:`Qaranlıq`,system:`Sistem`},aligned:`Uyğunlaşdırılıb`,hexColor:`Altırəqəmli hex rəngindən istifadə edin`,contrast:{light:`İşıqlı temanın mətn kontrastını ən azı 4.5:1-ə qədər artırın.`,dark:`Qaranlıq temanın mətn kontrastını ən azı 4.5:1-ə qədər artırın.`},fileTooLarge:`Tema faylları 100 KB-dan kiçik olmalıdır.`,tooMany:`Ən çox 50 fərdi tema saxlayın.`},appearance:{colorScheme:`Rəng sxemi`,theme:`Tema`,themes:`Temalar`,colorTheme:`Rəng teması`,search:`Temalarda axtar`,searchPlaceholder:`Temalarda axtar…`,create:`Tema yarat`,add:`Tema əlavə et`,importFile:`Tema faylını idxal et`,useMode:{light:`{{name}} işıqlı rejimindən istifadə et`,dark:`{{name}} qaranlıq rejimindən istifadə et`},modeOnly:{light:`Yalnız işıqlı rejim üçün istifadə et`,dark:`Yalnız qaranlıq rejim üçün istifadə et`},copyName:`{{name}} surəti`,duplicate:`{{name}} surətini çıxar`,edit:`{{name}} redaktə et`,export:`{{name}} ixrac et`,delete:`{{name}} sil`,deleteDescription:`{{name}} bu brauzerdən silinsin? Ondan istifadə edən işıqlı və ya qaranlıq görünüşlər əsas temanıza qayıdacaq.`,noMatches:`Uyğun tema yoxdur`,customTheme:`Fərdi tema`,name:`Temanın adı`,paletteColor:`{{mode}}: {{color, lowercase}}`,color:{background:`Fon`,foreground:`Mətn`,sidebar:`Yan panel`,primary:`Vurğu`,primaryForeground:`Vurğu mətni`},save:`Temanı yadda saxla`},color:{swatch:`{{color}} {{label, lowercase}}`,removeCustom:`{{hex}} fərdi rənglərdən sil`,custom:`Fərdi rəng`,default:`standart`,red:`qırmızı`,orange:`narıncı`,amber:`kəhrəba`,yellow:`sarı`,lime:`laym`,green:`yaşıl`,emerald:`zümrüd`,teal:`firuzəyi-yaşıl`,cyan:`mavi-yaşıl`,sky:`səma mavisi`,blue:`göy`,indigo:`indiqo`,violet:`bənövşəyi`,purple:`tünd bənövşəyi`,fuchsia:`fuksiya`,pink:`çəhrayı`,rose:`qızılgül`,gray:`boz`}},admin:{instance:{title:`İdarəetmə`,heading:`Nüsxə`,edit:`Nüsxəni redaktə et`,name:`Ad`,description:`Təsvir`,noDescription:`Təsvir yoxdur`,version:`Tətbiq versiyası`,publicUrl:`İctimai URL`,provider:{local:`Yerli PostgreSQL yaddaşı`,s3:`S3-uyğun obyekt yaddaşı`,postgres:`Daxili PostgreSQL`,elasticsearch:`Elasticsearch-uyğun axtarış`},section:{storage:`Fayl yaddaşı`,search:`Tiket axtarışı`,events:`Hadisə çatdırılması`},viewConfiguration:`Konfiqurasiyaya bax`,configure:{storage:`Yaddaşı konfiqurasiya et`,search:`Axtarışı konfiqurasiya et`,events:`Hadisə çatdırılmasını konfiqurasiya et`},providerTitle:`Provayder`,deploymentManaged:`Yerləşdirmə tərəfindən idarə olunur`,instanceManaged:`Nüsxə tərəfindən idarə olunur`,transfers:`Ötürmələr`,indexStatus:`İndeks statusu`,connection:`Bağlantı`,transfersS3:`Fayllar yerli olaraq yadda saxlanıldıqdan sonra obyekt yaddaşına köçürülür.`,transfersLocal:`Yeni fayllar PostgreSQL-də saxlanılır.`,searchBuiltIn:`Axtarış birbaşa PostgreSQL-də icra olunur.`,searchIndexed:`Tiket dəyişiklikləri arxa planda indeksləşdirilir.`,eventsConnection:`Bildirişlər istehlakçıları oyadır; PostgreSQL təkrar oxutma tarixçəsini saxlayır.`,builtIn:`Daxili`,connected:`Qoşulub`,upToDate:`Aktualdır`,status:{ready:`hazırdır`,transferring:`ötürülür`,indexing:`indeksləşdirilir`,connecting:`qoşulur`,unavailable:`əlçatan deyil`},pendingTransfers:`Gözləyən ötürmələr`,pendingRemain:`Ötürmə tamamlanana qədər bu fayllar PostgreSQL-dən əlçatan qalır.`,noPending:`Ötürülməyi gözləyən fayl yoxdur.`,bucket:`Bucket`,storageEndpoint:`Yaddaş ünvanı`,backup:`Ehtiyat nüsxə`,backupBuckets:`PostgreSQL-in və istinad edilən hər obyekt yaddaşı bucket-inin ehtiyat nüsxəsini çıxarın.`,backupDatabase:`Fayl baytları PostgreSQL ehtiyat nüsxənizə daxildir.`,fallback:`Ehtiyat variant`,fallbackDescription:`Xarici indeks geri qaldıqda və ya oflayn olduqda PostgreSQL axtarışı əlçatandır.`,searchEndpoint:`Axtarış ünvanı`,index:`İndeks`,delivery:`Çatdırılma`,deliveryDescription:`Davamlı hadisələr və təkrar oxutma PostgreSQL-də qalır. İstəyə bağlı broker oyanma siqnallarını paylayır.`,brokerEndpoint:`Broker ünvanı`,exchange:`Exchange`},configure:{storageTitle:`Fayl yaddaşını konfiqurasiya et`,searchTitle:`Tiket axtarışını konfiqurasiya et`,eventsTitle:`Hadisə çatdırılmasını konfiqurasiya et`,saved:`Nüsxə parametrləri yadda saxlanıldı`,instanceName:`Nüsxənin adı`,instanceDescription:`Nüsxənin təsviri`,publicUrlSource:`İctimai URL yerləşdirmənizdəki KANVIL_URL ilə təyin edilir.`,storageIntro:`Qoşmalar və profil şəkilləri bu provayderdən istifadə edir. Mövcud fayllar ilkin saxlanma yerində qalır.`,storageProvider:`Yaddaş provayderi`,localDescription:`Fayl baytları yerli verilənlər bazasında saxlanılır və PostgreSQL ehtiyat nüsxələrinə daxil edilir.`,s3Endpoint:`S3 ünvanı`,s3EndpointHint:`Amazon S3 üçün ünvanı boş saxlayın.`,region:`Region`,prefix:`Obyekt açarı prefiksi`,accessKeyId:`Giriş açarı ID-si`,secretAccessKey:`Gizli giriş açarı`,savedSecret:`Yadda saxlanılıb. Saxlamaq üçün boş buraxın.`,deploymentCredentials:`Göstərilmədikdə yerləşdirmənin giriş məlumatları`,pathStyle:`Yol üslublu bucket URL-lərindən istifadə et`,storageVerified:`Yaddaş bağlantısı təsdiqləndi`,testStorage:`Yaddaş bağlantısını yoxla`,filesWaiting_one:`{{count, number}} fayl ötürülməyi gözləyir. Gözləyən fayllar PostgreSQL-dən oxuna bilir.`,filesWaiting_other:`{{count, number}} fayl ötürülməyi gözləyir. Gözləyən fayllar PostgreSQL-dən oxuna bilir.`,transfersComplete:`Bütün fayl ötürmələri tamamlandı.`,storageDeployment:`Yaddaş KANVIL_STORAGE_PROVIDER və S3_* yerləşdirmə dəyişənləri ilə konfiqurasiya edilir.`,locations:`Mövcud saxlanma yerləri`,locationFiles_one:`{{count, number}} fayl`,locationFiles_other:`{{count, number}} fayl`,cleanUp:`İstifadə olunmayan faylları təmizlə`,cleanUpConfirm:`İstinad edilməyən fayllar və bir gündən köhnə uğursuz yükləmələr silinsin? Tiketlərə və ya profillərə qoşulmuş fayllar saxlanılır.`,cleanUpNote:`Təmizləmə həm də avtomatik işləyir. S3 obyektləri üçün verilənlər bazasının ehtiyat nüsxəsi ilə yanaşı bucket-in ehtiyat nüsxəsi lazımdır.`,searchProvider:`Axtarış provayderi`,searchBuiltIn:`Daxili PostgreSQL axtarışı`,indexName:`Kanvil indeksinin adı`,searchAuthentication:`Axtarış autentifikasiyası`,noAuthentication:`Autentifikasiya yoxdur`,apiKey:`API açarı`,basic:`İstifadəçi adı və şifrə`,searchApiKey:`Axtarış API açarı`,optional:`İstəyə bağlı`,searchUsername:`Axtarış istifadəçi adı`,searchPassword:`Axtarış şifrəsi`,searchVerified:`Axtarış bağlantısı təsdiqləndi`,testSearch:`Axtarış bağlantısını yoxla`,rebuildQueued:`Axtarışın yenidən qurulması növbəyə qoyuldu`,rebuild:`İndeksi yenidən qur`,searchNote:`İcazələr və filtrlər üçün PostgreSQL əsas mənbə olaraq qalır. Xarici indeks yenilənərkən və ya əlçatan olmadıqda axtarış PostgreSQL-ə keçir.`,brokerProvider:`Hadisə çatdırılması provayderi`,brokerBuiltIn:`Daxili PostgreSQL bildirişləri`,rabbitUrl:`RabbitMQ bağlantı URL-i`,savedBrokerEndpoint:`Yadda saxlanılmış broker ünvanı`,rabbitExchange:`RabbitMQ exchange`,brokerVerified:`RabbitMQ çatdırılması təsdiqləndi`,testBroker:`Broker bağlantısını yoxla`,brokerNote:`RabbitMQ təsdiqlənmiş hadisə oyanma siqnallarını Kanvil nüsxələrinə paylayır və arxa plan işçilərini oyadır. PostgreSQL davamlı hadisələri və gözləyən işləri saxlayır, broker əlçatan olmadıqda oyanma siqnallarını özü çatdırır.`,brokerDeployment:`Hadisə çatdırılması KANVIL_BROKER_PROVIDER və RABBITMQ_* yerləşdirmə dəyişənləri ilə konfiqurasiya edilir.`,save:`Nüsxə parametrlərini yadda saxla`},authentication:{title:`Autentifikasiya`,saved:`Autentifikasiya yadda saxlanıldı`,emailPassword:`E-poçt və şifrə ilə daxil olma`,emailPasswordDescription:`E-poçtla göndərilən daxil olma kodlarını və şifrə sıfırlamanı əhatə edir.`,ssoProvision:`SSO-dan istifadəçiləri avtomatik yarat`,ssoProvisionDescription:`Yeni SSO istifadəçilərinin dəvət edilənə qədər iş sahəsinə və ya layihəyə girişi olmur.`,registration:`İctimai e-poçt qeydiyyatı`,registrationClosed:`Bağlı`,identityProvider:`İdentiklik provayderi`,notConfigured:`Konfiqurasiya edilməyib`,linkedProviders:`Bağlı hesab provayderləri`,linkedProvidersDescription:`Yalnız onları bağlamış hesablarla daxil olmağa imkan verir; heç vaxt hesab yaratmır.`,save:`Autentifikasiyanı yadda saxla`,discoveryUrl:`OIDC kəşf URL-i`,clientId:`OIDC klient ID-si`,oidcSetup:`Yerləşdirmənizdə OIDC_DISCOVERY_URL, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET və OIDC_NAME dəyərlərini və ya GITHUB_, GOOGLE_ ya da DISCORD_ üçün CLIENT_ID və CLIENT_SECRET cütünü konfiqurasiya edin, sonra Kanvil-i yenidən başladın. Provayder sirləri heç vaxt brauzerə qaytarılmır.`,consumers:`İstehlakçı interfeysləri`,mcpEndpoint:`MCP ünvanı`,eventFeed:`Real vaxt hadisə lenti`,openApi:`Open API spesifikasiyası`},users:{title:`İstifadəçilər`,search:`İstifadəçilərdə axtar`,searchPlaceholder:`Ad və ya e-poçt…`,new:`Yeni istifadəçi`,roleFilter:`Nüsxə rolu filtri`,allRoles:`Bütün rollar`,administrators:`Administratorlar`,users:`İstifadəçilər`,statusFilter:`Hesab statusu filtri`,allAccounts:`Bütün hesablar`,active:`Aktiv`,disabled:`Deaktiv`,noMatches:`Uyğun istifadəçi yoxdur`,empty:`İstifadəçi yoxdur`,user:`İstifadəçi`,role:`Rol`,status:`Status`,joined:`Qoşulub`,actions:`Əməliyyatlar`,administrator:`Administrator`,manage:`{{name}} idarə et`,pagerNoun:`istifadəçilər`,create:`Hesab yarat`,creating:`Yaradılır…`,created:`{{email}} yaradıldı`,name:`Ad`,email:`E-poçt`,initialPassword:`İlkin şifrə`,instanceRole:`Nüsxə rolu`},account:{details:`Hesab məlumatları`,joined:`Qoşulub: {{date}}`,edit:`Hesabı redaktə et`,instanceRole:`Nüsxə rolu`,adminDescription:`Bütün iş sahələrini, hesabları və yerləşdirmə parametrlərini idarə edə bilər.`,userDescription:`Girişi iş sahəsi və layihə rolları müəyyən edir.`,changeRole:`Rolu dəyiş`,changeRoleTitle:`Nüsxə rolunu dəyiş`,signInMethods:`Daxil olma üsulları`,setPassword:`Yerli şifrə təyin et`,activeSessions:`Aktiv seanslar`,sessions_one:`{{count, number}} seans`,sessions_other:`{{count, number}} seans`,revokeSessions:`Seansları ləğv et`,revokeConfirm:`{{name}} bütün cihazlardan çıxarılsın? API açarları aktiv qalır.`,sessionsRevoked:`Seanslar ləğv edildi`,access:`Hesaba giriş`,accessDisabled:`Daxil olma və API girişi deaktiv edilib.`,accessPreserved:`Hesabın deaktiv edilməsi tiketləri və fəaliyyət tarixçəsini saxlayır.`,enable:`Hesabı aktivləşdir`,disable:`Hesabı deaktiv et`,enableConfirm:`{{name}} üçün daxil olma bərpa edilsin?`,disableConfirm:`{{name}} üçün daxil olma və API girişi deaktiv edilsin və seansları ləğv edilsin?`,enabled:`Hesab aktivləşdirildi`,disabledToast:`Hesab deaktiv edildi`,updateFailed:`Hesab yenilənə bilmədi`,workspaces:`İş sahələri`,addToWorkspace:`İş sahəsinə əlavə et`,noWorkspaces:`İş sahəsi üzvlüyü yoxdur`,projectAccess:`Birbaşa layihə girişi`,updated:`Hesab yeniləndi`,roleUpdated:`Nüsxə rolu yeniləndi`,workspaceAdded:`İş sahəsi girişi əlavə edildi`,passwordMismatch:`Yeni şifrələr uyğun gəlmir.`,passwordSet:`Yerli şifrə təyin edildi və seanslar ləğv edildi`,name:`Ad`,email:`E-poçt`,user:`İstifadəçi`,administrator:`Administrator`,adminsNote:`Administratorlar bütün iş sahələrini, istifadəçiləri və nüsxə parametrlərini idarə edə bilər.`,workspace:`İş sahəsi`,workspaceRole:`İş sahəsi rolu`,newPassword:`Yeni şifrə`,confirmPassword:`Yeni şifrəni təsdiqləyin`,passwordNote:`Bu, yerli şifrə təyin edir və istifadəçini bütün cihazlardan çıxarır.`,save:`Dəyişiklikləri yadda saxla`},delivery:{field:{address:`E-poçt ünvanı`,server:`Server`,topic:`Mövzu`,accessToken:`Giriş tokeni`,applicationToken:`Tətbiq tokeni`,endpointUrl:`Ünvan URL-i`,signingSecret:`İmzalama sirri`,incomingWebhookUrl:`Daxil olan webhook URL-i`,webhookUrl:`Webhook URL-i`,channel:`Kanal`,botToken:`Bot tokeni`,chatId:`Çat ID-si`,chatIdPlaceholder:`-1001234567890 və ya @channel`,topicId:`Mövzu ID-si`,optional:`{{label}} (istəyə bağlı)`,removeSaved:`Yadda saxlanılmış {{label, lowercase}} sil`,savedSecret:`Yadda saxlanılıb · saxlamaq üçün boş buraxın`},failure:{blockedAddress:`Bu ünvana icazə verilmir`,redirectBlocked:`Ünvan yönləndirmə etdi`,dnsError:`Host tapılmadı`,networkError:`Qoşulmaq mümkün olmadı`,timeout:`Vaxt bitdi`,invalidEndpoint:`Yanlış ünvan`,emailUnavailable:`Bu serverdə e-poçt konfiqurasiya edilməyib`,smtpError:`Poçt serveri əlçatan deyil`,accessRevoked:`Onu qoşan administrator girişini itirib; yenidən qoşun`,repositoryMismatch:`Çatdırılma başqa repozitoridən gəldi`,http:`HTTP {{status}} ilə rədd edildi`,smtp:`Poçt serveri {{code}} cavabını verdi`},health:{delivery:{done:`Çatdırıldı: <time/>`,pending:`Göndərilir…`,none:`Hələ heç nə göndərilməyib`,failed:`{{reason}}`},access:{done:`Giriş yoxlanıldı: <time/>`,pending:`Giriş yoxlanılır…`,none:`Giriş yoxlanılmayıb`,failed:`Giriş yoxlaması: {{reason}}`},retrying:`yenidən cəhd edilir`},paused:`Dayandırılıb`,failing:`Uğursuz olur`,sendTest:`{{name}} üçün test göndər`,testQueued:`Test növbəyə qoyuldu`,resume:`{{name}} davam etdir`,pause:`{{name}} dayandır`,edit:`{{name}} redaktə et`,disconnect:`{{name}} ayır`,disconnected:`{{name}} ayrıldı`,name:`Ad`,type:`Tip`,channels:`Kanallar`,addChannel:`Kanal əlavə et`,noChannels:`Kanal yoxdur`,editChannel:`Kanalı redaktə et`,channelSaved:`Kanal yadda saxlanıldı`,channelRemoval:`{{name}} ayrılsın? Onun parametrləri və növbədəki bildirişləri silinəcək.`,sendFrom:`Bildirişləri buradan göndər`,routeOff:`Heç nə`,routeAll:`Bütün layihələr`,routeSelected:`Seçilmiş layihələr`,saveChannel:`Kanalı yadda saxla`,adminsOnly:`İnteqrasiyaları layihə administratorları idarə edir`,destinations:`Təyinatlar`,addDestination:`Təyinat əlavə et`,noDestinations:`Təyinat yoxdur`,editDestination:`Təyinatı redaktə et`,destinationSaved:`Təyinat yadda saxlanıldı`,destinationRemoval:`{{name}} ayrılsın? Onun parametrləri və növbədəki mesajları silinəcək.`,send:`Göndər`,saveDestination:`Təyinatı yadda saxla`},repository:{setup:{github:`Tokenin repozitoriyə oxuma girişi, şərh yazmaq və ya məsələləri sinxronlaşdırmaq üçün isə issue və pull request yazma girişi olmalıdır. Bu repozitorinin sətrindən kopyalanan URL, application/json məzmun tipi, bu sirr və Branch or tag creation, Branch or tag deletion, Issues, Issue comments və Pull requests hadisələri ilə GitHub webhooku əlavə edin.`,gitea:`Tokenə read:repository əhatəsi, şərh yazmaq və ya məsələləri sinxronlaşdırmaq üçün isə write:issue lazımdır. Bu repozitorinin sətrindən kopyalanan URL, application/json məzmun tipi, bu sirr və Create, Delete, Issues, Issue Label, Issue Comment və Pull Request hadisələri ilə Gitea webhooku əlavə edin.`,gitlab:`Tokenə read_api əhatəsi, şərh yazmaq və ya məsələləri sinxronlaşdırmaq üçün isə api lazımdır. Bu repozitorinin sətrindən kopyalanan URL, bu gizli token və Push, Issues, Comments və Merge request hadisələri ilə GitLab webhooku əlavə edin.`},noWebhook:`Webhook alınmayıb`,webhookReceived:`Webhook alındı: <time/>`,saved:`Repozitori yadda saxlanıldı`,title:`Repozitorilər`,connect:`Repozitori qoş`,empty:`Repozitori yoxdur`,checkAccess:`{{repository}} girişini yoxla`,accessQueued:`Giriş yoxlaması növbəyə qoyuldu`,copyWebhook:`{{repository}} üçün webhook URL-ini kopyala`,issueSync:`{{repository}} üçün məsələ sinxronizasiyası`,removal:`{{repository}} ayrılsın? Onun webhooku dərhal işləməyi dayandırır. Onun əlavə etdiyi keçidlər tiketlərdə qalır.`,edit:`Repozitorini redaktə et`,host:`Host`,serverUrl:`Server URL-i`,serverUrlOptional:`Server URL-i (istəyə bağlı)`,repository:`{{host}} repozitorisi`,nestedPlaceholder:`group/project`,placeholder:`owner/repository`,accessToken:`Giriş tokeni`,webhookSecret:`Webhook sirri`,savedSecret:`Yadda saxlanılıb · saxlamaq üçün boş buraxın`,commentOnLink:{pull_request:`Yeni bağlanmış məsələlərə və pull request-lərə şərh yaz`,merge_request:`Yeni bağlanmış məsələlərə və merge request-lərə şərh yaz`},moveTickets:`Bağlı tiketləri köçür`,noMove:`Köçürmə yoxdur`,save:`Repozitorini yadda saxla`},issueSync:{reason:{labels:`Onun sinxronizasiya etiketləri dəyişdi`,conflict:`Hər iki tərəfdə dəyişdirilib`,changedWhilePaused:`Repozitori dayandırılmış ikən məsələ dəyişdi`,unverified:`Hostun cavabı dəyişikliyi təsdiqləmədi`,claimConflict:`Tiket götürülüb`,invalidContent:`Məsələ tiketin icazə verdiyindən uzundur`},issuesSyncing_one:`{{count, number}} məsələ sinxronlaşdırılır`,issuesSyncing_other:`{{count, number}} məsələ sinxronlaşdırılır`,linksStopped_one:`{{count, number}} bağlantı dayandı`,linksStopped_other:`{{count, number}} bağlantı dayandı`,match:`Uyğunluq`,matchAny:`Bu etiketlərdən hər hansı biri`,matchAll:`Bu etiketlərin hamısı`,preview:{matching:`Sinxronizasiyanı davam etdir`,export:`Yaradılacaq yeni məsələlər`,pause:`Dayandırılacaq bağlantılar`,review:`Yoxlanılacaq bağlantılar`},applied:`Məsələ sinxronizasiyası tətbiq edildi`,title:`Məsələ sinxronizasiyası · {{repository}}`,outbound:`Kanvil → {{host}}`,exportTickets:`Tiketləri məsələ kimi ixrac et`,exportDescription:`Açıq tiketlər üçün yeni məsələ yaradılır; başlıq, təsvir, vəziyyət və yeni şərhlər uyğun saxlanılır.`,ticketLabels:`Yalnız bu etiketləri olan tiketlər`,everyTicket:`Bütün açıq tiketlər`,inbound:`{{host}} → Kanvil`,importIssues:`Məsələləri tiket kimi idxal et`,importDescription:`Açıq məsələlər {{host}} onları növbəti dəfə bildirəndə idxal edilir.`,issueLabels:`Yalnız bu etiketləri olan məsələlər`,everyIssue:`Bütün açıq məsələlər`,previewLabel:`Önizləmə`,previewAction:`Önizlə`,stopped:`Dayanmış bağlantılar · {{repository}}`,review:`Yoxla`,linkRemoved:`Bağlantı silindi`,resumed:`Sinxronizasiya bərpa edildi`,open:`Açıq`,closed:`Bağlı`,reviewTitle:`{{key}} yoxla`,mayExist:`{{host}}-da bu məsələ artıq ola bilər; yenidən yaratmazdan əvvəl yoxlayın.`,comparison:`Müqayisə`,field:{title:`başlıq`,description:`təsvir`,state:`vəziyyət`},notReported:`Bildirilməyib`,unlink:`Bağlantını kəs`,keepHost:`{{host}} versiyasını saxla`,keepKanvil:`Kanvil versiyasını saxla`,createAgain:`Məsələni yenidən yarat`,unlinkTicket:`{{key}} bağlantısını kəs`,unlinkConfirm:`{{key}} sinxronizasiyası dayandırılsın? Tiket də, məsələ də qalır.`},import:{count:{tickets:`Tiketlər`,workflow:`İş axını vəziyyətləri`,fields:`Fərdi sahələr`,labels:`Etiketlər`,relations:`Əlaqələr`,comments:`Şərhlər`,evidence:`Sübutlar`,links:`Keçidlər`},notExport:`Bu fayl Kanvil tiket ixracı deyil.`,progress_one:`{{status}} · {{count, number}} qeyddən {{done, number}}`,progress_other:`{{status}} · {{count, number}} qeyddən {{done, number}}`,progressFailed_one:`{{status}} · {{count, number}} qeyddən {{done, number}} · {{failed, number}} uğursuz`,progressFailed_other:`{{status}} · {{count, number}} qeyddən {{done, number}} · {{failed, number}} uğursuz`,title:`İdxal`,description:`Kanvil tiket ixracından və ya başqa izləmə sistemindən layihə yaradır: Linear, Jira, Trello, Plane, PLANKA və ya Kaneo.`,action:`Layihəni idxal et`,detailsOf:`{{name}} məlumatları`,details:`Məlumatlar`,exportFile:`Kanvil ixrac faylı`,source:`Mənbə`,file:`İxrac faylı`,jiraEdition:`Jira versiyası`,siteUrl:`Sayt URL-i`,accountEmail:`Hesab e-poçtu`,apiKey:`API açarı`,apiToken:`API tokeni`,personalToken:`Şəxsi giriş tokeni`,token:`Token`,apiUrl:`API URL-i`,workspaceSlug:`İş sahəsinin URL açarı`,signInWith:`Giriş üsulu`,username:`İstifadəçi adı və ya e-poçt`,password:`Şifrə`,checkConnection:`Bağlantı məlumatlarını yoxlayın`,noProjects:`Bu giriş məlumatları heç bir {{label, lowercase}} oxuya bilmir.`,includeComments:`Şərhləri daxil et`,projectName:`Layihənin adı`,start:`İdxal et`,connect:`Qoş`,preview:`Önizlə`,starting:`Başladılır…`,connecting:`Qoşulur…`,checking:`Yoxlanılır…`,matched:`Uyğunlaşdırılmış şəxslər`,unmatched:`Uyğunlaşdırılmamış şəxslər`,previewLabel:`İdxal önizləməsi`,errorPrefix:`Xəta: `,notePrefix:`Qeyd: `,progressLabel:`İdxal gedişatı`,notImported:`İdxal edilməyən qeydlər`,stop:`İdxalı dayandır`,openProject:`Layihəni aç`}},native:{labelValue:`{{label}}: {{value}}`,ui:{dismiss:`Bağla`,loading:`Yüklənir`},server:{url:`Server URL-i`,connect:`Qoş`,change:`Serveri dəyiş`,invalidOrigin:`Kanvil serverinizin yol və ya giriş məlumatları olmadan HTTP və ya HTTPS mənbəyindən istifadə edin.`,httpsRequired:`Kanvil serverinizə qoşulmaq üçün HTTPS-dən istifadə edin.`},login:{setupTitle:`Sahib hesabınızı yaradın`,signIn:`Daxil ol`,signingIn:`Daxil olunur…`,createAccount:`Hesab yarat`,signInWith:`{{provider}} ilə daxil ol`,name:`Ad`,setupToken:`Quraşdırma tokeni`,email:`E-poçt`,password:`Şifrə`},connection:{connecting:`qoşulur`,connected:`● Canlı`,offline:`Oflayn · keşlənmiş məlumat`,closed:`bağlıdır`,signedOut:`Yenidən qoşulmaq üçün daxil olun`},screen:{projects:`Layihələr`,inbox:`Gələnlər`,settings:`Parametrlər`,tickets:`Tiketlər`,ticket:`Tiket`,newTicket:`Yeni tiket`,editTicket:`Tiketi redaktə et`},projects:{empty:`Hələ layihə yoxdur`,new:`Yeni layihə`,name:`Layihənin adı`,prefix:`Tiket prefiksi`,description:`Təsvir`,create:`Layihə yarat`},tickets:{search:`Tiketlərdə axtar`,searchPlaceholder:`Başlıq, təsvir və ya açar`,allStatuses:`Bütün statuslar`,empty:`Uyğun tiket yoxdur`,count:`{{shown}} / {{total}}`},ticket:{priority:`Prioritet: {{priority}}`,noDifficulty:`Çətinlik göstərilməyib`,version:`v{{version}}`,starts:`Başlayır: {{date}}`,due:`Son tarix: {{date}}`},editor:{stale:`Bu tiket dəyişib. Yadda saxlanılmış qaralamanız hələ {{version}} versiyasından istifadə edir.`,discardDraft:`Qaralamanı at və yenidən yüklə`,title:`Başlıq`,noDifficulty:`Göstərilməyib`,labels:`Etiketlər (vergüllə ayrılmış)`,scopes:`Əhatələr (vergüllə ayrılmış)`,editMarkdown:`Markdown-u redaktə et`,previewMarkdown:`Markdown önizləməsi`,description:`Təsvir (Markdown)`,acceptanceCriteria:`Qəbul meyarları (Markdown)`,parent:`Valideyn tiketin ID-si`,automationReady:`Tələblər və asılılıqlar imkan verdikdə agentlər üçün hazırdır`,holdReason:`Gözləmə səbəbi`,draftSaved:`Qaralama bu cihazda yadda saxlanıldı`,save:`Tiketi yadda saxla`},detail:{archived:`Arxivləşdirilib`,subscribe:`Abunə ol`,unsubscribe:`Abunəlikdən çıx`,share:`Paylaş`,description:`Təsvir`,noDescription:`_Təsvir yoxdur_`,acceptanceCriteria:`Qəbul meyarları`,noAcceptanceCriteria:`_Qəbul meyarları yoxdur_`,fields:`Sahələr`,archive:{action:`Tiketi arxivləşdir`,title:`Tiket arxivləşdirilsin?`,message:`Bu tiket aktiv siyahılardan və agentlər üçün uyğunluqdan çıxarılsın?`},unarchive:{action:`Tiketi arxivdən çıxar`,title:`Tiket arxivdən çıxarılsın?`,message:`Bu tiket aktiv siyahılara qaytarılsın?`}},readiness:{title:`Agent hazırlığı`,ready:`Götürməyə hazırdır`,notReady:`Götürməyə hazır deyil`,hold:`Gözləmə: {{reason}}`,claimed:`{{time}} vaxtınadək {{worker}} tərəfindən götürülüb.`,release:{action:`Götürməmi burax`,title:`Götürmə buraxılsın?`,message:`Sahibliyi buraxmazdan əvvəl işçinizi dayandırın.`,confirm:`Burax`},recover:{action:`Müddəti bitmiş götürməni bərpa et`,explanation:`Əvvəlcə işçinin dayandığını təsdiqləyin.`,reason:`Bərpa səbəbi`,confirm:`İşçi dayandı · bərpa et`}},relations:{title:`Əlaqələr`,parent:`Valideyn · {{key}} · {{title}}`,openParent:`Valideyn tiketi aç`,children:`Alt tiketlər`,previousChildren:`Əvvəlki alt tiketlər`,nextChildren:`Növbəti alt tiketlər`,remove:`Əlaqəni sil`,removeTitle:`Əlaqə silinsin?`,add:`Əlaqə əlavə et`,find:`Tiket tap`,type:`Əlaqə`,ticket:`Tiket`,choose:`Tiket seçin`},discussion:{title:`Müzakirə`,previous:`Əvvəlki şərhlər`,next:`Növbəti şərhlər`,field:`Şərh (Markdown)`,submit:`Şərh yaz`,you:`Siz`,edit:`Şərhi redaktə et`,editField:`Şərh`,delete:`Şərhi sil`,deleteTitle:`Şərh silinsin?`,deleteMessage:`Bu şərh həmişəlik silinsin?`,save:`Şərhi yadda saxla`},attachments:{title:`Qoşmalar`,item:`{{name}} · {{size}} kB`,remove:`{{name}} sil`,removeTitle:`Qoşma silinsin?`,working:`İcra olunur…`,add:`Qoşma əlavə et`,tooLarge:`10 MB-dan böyük olmayan fayl seçin.`,sharingUnavailable:`Bu cihazda fayl paylaşımı əlçatan deyil.`},evidence:{title:`Sübutlar`,explanation:`Nəticələri onları təqdim edən hesablar bildirir.`,add:`Sübut əlavə et`,name:`Başlıq`,url:`URL`,outcome:`Bildirilən nəticə`,commit:`Commit (tam hash)`,note:`Qeyd`,save:`Sübutu yadda saxla`},activity:{title:`Fəaliyyət`,previous:`Əvvəlki fəaliyyət`,next:`Növbəti fəaliyyət`},inbox:{markAllRead:`Hamısını oxunmuş kimi qeyd et`,empty:`Bildiriş yoxdur`},notifications:{title:`Bildirişlər`,inApp:`Abunə olunmuş tiket yenilikləri Gələnlərdə`,push:`Push bildirişləri`,enableDevice:`Bu cihazda push-u aktivləşdir`,disableDevice:`Bu cihazda push-u deaktiv et`,unconfigured:`Bu quraşdırma push üçün Expo layihə ID-si və imzalama konfiqurasiyası tələb edir.`,noProjectId:`Bu quraşdırma push bildirişləri üçün Expo layihə ID-si tələb edir.`,permissionDenied:`Push-u aktivləşdirmək üçün cihaz parametrlərində bildirişlərə icazə verin.`,channel:`Tiket yenilikləri`},settings:{password:{title:`Yerli şifrə`,current:`Cari şifrə`,new:`Yeni şifrə`,change:`Şifrəni dəyiş`,updated:`Şifrə yeniləndi; digər seanslar ləğv edildi`},oidc:{linked:`Hesab bağlandı`,explanation:`Bu provayderlə daxil olmazdan əvvəl bu hesabı bağlayın.`,link:`{{provider}} bağla`},signOut:{action:`Çıxış et`,title:`Çıxış edilsin?`,message:`Bu hesabın keşlənmiş tiketləri və qaralamaları bu cihazdan silinəcək.`},changeServer:{title:`Server dəyişdirilsin?`,message:`Çıxış edilsin və bu hesabın yerli keşi və qaralamaları təmizlənsin?`}}}};export{e as default};