@brftech/filex-core 0.42.2 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/README.md +14 -2
  2. package/dist/ArchiveViewer-BqU761Wk.js +149 -0
  3. package/dist/ArchiveViewer-BqU761Wk.js.map +1 -0
  4. package/dist/CsvViewer-ByHVK5ga.js +172 -0
  5. package/dist/CsvViewer-ByHVK5ga.js.map +1 -0
  6. package/dist/{DrawioViewer-CC6rJXeP.js → DrawioViewer-Bgrj8-zG.js} +45 -44
  7. package/dist/DrawioViewer-Bgrj8-zG.js.map +1 -0
  8. package/dist/{EpubViewer-CAoTSXTO.js → EpubViewer-DJwUKlHW.js} +50 -50
  9. package/dist/EpubViewer-DJwUKlHW.js.map +1 -0
  10. package/dist/IpynbViewer-Bz0eJ4NS.js +184 -0
  11. package/dist/IpynbViewer-Bz0eJ4NS.js.map +1 -0
  12. package/dist/MermaidViewer-CEDTD_pp.js +136 -0
  13. package/dist/MermaidViewer-CEDTD_pp.js.map +1 -0
  14. package/dist/PsdViewer-CZcxUpZO.js +121 -0
  15. package/dist/PsdViewer-CZcxUpZO.js.map +1 -0
  16. package/dist/TiffViewer-BwI62CbQ.js +141 -0
  17. package/dist/TiffViewer-BwI62CbQ.js.map +1 -0
  18. package/dist/{Viewer3D-CdZeK4j4.js → Viewer3D-DoeZcuMm.js} +16 -16
  19. package/dist/Viewer3D-DoeZcuMm.js.map +1 -0
  20. package/dist/filex-core.js +475 -219
  21. package/dist/filex-core.umd.cjs +165 -108
  22. package/dist/filex-core.umd.cjs.map +1 -1
  23. package/dist/fonts/caveat-latin-ext.woff2 +0 -0
  24. package/dist/fonts/caveat-latin.woff2 +0 -0
  25. package/dist/fonts/dancing-script-latin-ext.woff2 +0 -0
  26. package/dist/fonts/dancing-script-latin.woff2 +0 -0
  27. package/dist/fonts/homemade-apple-latin.woff2 +0 -0
  28. package/dist/fonts/source-serif-4-latin-ext.woff2 +0 -0
  29. package/dist/fonts/source-serif-4-latin.woff2 +0 -0
  30. package/dist/index-DuWnGuv5.js +35901 -0
  31. package/dist/index-DuWnGuv5.js.map +1 -0
  32. package/dist/index.d.ts +5227 -553
  33. package/dist/pdf-CaPYsOUo.js +21302 -0
  34. package/dist/pdf-CaPYsOUo.js.map +1 -0
  35. package/dist/style.css +1 -1
  36. package/package.json +1 -1
  37. package/src/FileExplorer.vue +1055 -253
  38. package/src/assets/fonts/LICENSE-Apache-2.0.txt +202 -0
  39. package/src/assets/fonts/LICENSE-OFL-1.1.txt +93 -0
  40. package/src/assets/fonts/README.md +58 -0
  41. package/src/assets/fonts/caveat-latin-ext.woff2 +0 -0
  42. package/src/assets/fonts/caveat-latin.woff2 +0 -0
  43. package/src/assets/fonts/dancing-script-latin-ext.woff2 +0 -0
  44. package/src/assets/fonts/dancing-script-latin.woff2 +0 -0
  45. package/src/assets/fonts/homemade-apple-latin.woff2 +0 -0
  46. package/src/assets/fonts/source-serif-4-latin-ext.woff2 +0 -0
  47. package/src/assets/fonts/source-serif-4-latin.woff2 +0 -0
  48. package/src/components/AdvancedSearch.vue +49 -0
  49. package/src/components/Breadcrumb.vue +5 -5
  50. package/src/components/ChoiceButtons.vue +152 -0
  51. package/src/components/CommandPalette.vue +5 -5
  52. package/src/components/ConnectionGuideView.vue +1 -1
  53. package/src/components/ConnectionNotice.vue +59 -0
  54. package/src/components/ConnectionsPanel.vue +30 -568
  55. package/src/components/ContextMenu.vue +31 -5
  56. package/src/components/DataTable.vue +1331 -0
  57. package/src/components/FilePane.vue +3 -0
  58. package/src/components/FilterBar.vue +12 -5
  59. package/src/components/GalleryView.vue +50 -2
  60. package/src/components/GridView.vue +51 -3
  61. package/src/components/HomeView.vue +18 -6
  62. package/src/components/InspectorPanel.vue +134 -17
  63. package/src/components/ListView.vue +366 -900
  64. package/src/components/LogoMark.vue +57 -0
  65. package/src/components/NFSExportsPanel.vue +76 -28
  66. package/src/components/OnboardingTour.vue +19 -7
  67. package/src/components/OperationsCenter.vue +77 -1
  68. package/src/components/PendingOpsTray.vue +59 -5
  69. package/src/components/PresenceBar.vue +7 -7
  70. package/src/components/ProductVersion.vue +31 -0
  71. package/src/components/QuickLook.vue +10 -14
  72. package/src/components/RecentlyOpened.vue +31 -15
  73. package/src/components/RecoveryKeyModal.vue +1 -1
  74. package/src/components/RowActions.vue +134 -0
  75. package/src/components/S3KeysPanel.vue +98 -62
  76. package/src/components/SSHKeysPanel.vue +79 -30
  77. package/src/components/SideNav.vue +260 -96
  78. package/src/components/StarButton.vue +1 -0
  79. package/src/components/StorageFields.vue +74 -6
  80. package/src/components/StorageTags.vue +62 -0
  81. package/src/components/TabBar.vue +1 -1
  82. package/src/components/TagKindIcon.vue +56 -0
  83. package/src/components/TagPicker.vue +226 -40
  84. package/src/components/ThemePalette.vue +4 -4
  85. package/src/components/TimeZonePicker.vue +29 -10
  86. package/src/components/TokensPanel.vue +82 -31
  87. package/src/components/Toolbar.vue +28 -6
  88. package/src/components/plugin/PluginConfirmModal.vue +54 -0
  89. package/src/components/plugin/PluginInspectorSection.vue +149 -0
  90. package/src/components/plugin/PluginPageView.vue +339 -0
  91. package/src/components/plugin/PluginViewModal.vue +159 -0
  92. package/src/components/plugin/SurfaceConversation.vue +76 -0
  93. package/src/components/plugin/SurfaceFooterButtons.vue +73 -0
  94. package/src/components/plugin/SurfaceRenderer.vue +299 -0
  95. package/src/components/plugin/SurfaceSections.vue +91 -0
  96. package/src/components/plugin/nodes/PdfFieldEditor.vue +509 -0
  97. package/src/components/plugin/nodes/SurfaceFileChooser.vue +94 -0
  98. package/src/components/plugin/nodes/SurfaceForm.vue +82 -0
  99. package/src/components/plugin/nodes/SurfaceList.vue +127 -0
  100. package/src/components/plugin/nodes/SurfacePdfFields.vue +1285 -0
  101. package/src/components/plugin/nodes/SurfacePeoplePicker.vue +213 -0
  102. package/src/components/plugin/nodes/SurfacePinInput.vue +57 -0
  103. package/src/components/plugin/nodes/SurfacePreview.vue +119 -0
  104. package/src/components/plugin/nodes/SurfaceProgress.vue +48 -0
  105. package/src/components/plugin/nodes/SurfaceSignaturePad.vue +472 -0
  106. package/src/components/plugin/nodes/SurfaceSteps.vue +53 -0
  107. package/src/components/public/PublicLanguagePicker.vue +58 -0
  108. package/src/components/public/PublicLinkPage.vue +286 -0
  109. package/src/components/public/PublicLinkPreview.vue +85 -0
  110. package/src/components/public/PublicPinGate.vue +108 -0
  111. package/src/components/public/PublicRequestBody.vue +204 -0
  112. package/src/components/public/PublicShareBody.vue +188 -0
  113. package/src/components/public/PublicShell.vue +332 -0
  114. package/src/composables/useConnections.ts +8 -2
  115. package/src/composables/useFileApi.ts +183 -44
  116. package/src/composables/useLocale.ts +277 -41
  117. package/src/composables/useNFSExports.ts +8 -10
  118. package/src/composables/useOperations.ts +44 -3
  119. package/src/composables/usePendingOps.ts +59 -8
  120. package/src/composables/usePluginActions.ts +121 -0
  121. package/src/composables/usePluginSurface.ts +223 -0
  122. package/src/composables/usePublicBranding.ts +172 -0
  123. package/src/composables/usePublicLink.ts +573 -0
  124. package/src/composables/usePublicPage.ts +61 -0
  125. package/src/composables/useS3Keys.ts +17 -12
  126. package/src/composables/useSSHKeys.ts +8 -10
  127. package/src/composables/useTokens.ts +8 -12
  128. package/src/composables/useUploadChunked.ts +18 -8
  129. package/src/composables/useViewerFetch.ts +6 -3
  130. package/src/index.ts +404 -8
  131. package/src/lib/actionIcons.ts +46 -1
  132. package/src/lib/advSearch.ts +14 -7
  133. package/src/lib/appLock.ts +130 -0
  134. package/src/lib/connection.ts +110 -0
  135. package/src/lib/destinationTree.ts +19 -3
  136. package/src/lib/direction.ts +353 -0
  137. package/src/lib/dragGhost.ts +6 -0
  138. package/src/lib/dropLimits.ts +69 -0
  139. package/src/lib/errorWords.ts +394 -0
  140. package/src/lib/externalReach.ts +5 -1
  141. package/src/lib/fileFilters.ts +7 -2
  142. package/src/lib/fileIcons.ts +4 -0
  143. package/src/lib/internalPaths.ts +77 -0
  144. package/src/lib/listInput.ts +64 -0
  145. package/src/lib/listing.ts +58 -23
  146. package/src/lib/modalStack.ts +26 -0
  147. package/src/lib/nodeRow.ts +18 -3
  148. package/src/lib/pdfFieldRules.ts +126 -0
  149. package/src/lib/pdfFields.ts +589 -0
  150. package/src/lib/pdfFieldsGeom.ts +203 -0
  151. package/src/lib/pdfjsLoader.ts +51 -0
  152. package/src/lib/personName.ts +47 -0
  153. package/src/lib/pluginApplies.ts +123 -0
  154. package/src/lib/pluginLabel.ts +72 -0
  155. package/src/lib/pluginMenu.ts +253 -0
  156. package/src/lib/pluginPage.ts +58 -0
  157. package/src/lib/plural.ts +181 -0
  158. package/src/lib/popupLayer.ts +103 -0
  159. package/src/lib/prefs.ts +563 -0
  160. package/src/lib/productVersion.ts +35 -0
  161. package/src/lib/publicLayout.ts +39 -0
  162. package/src/lib/serviceGate.ts +104 -0
  163. package/src/lib/shareTtl.ts +25 -11
  164. package/src/lib/signFonts.ts +85 -0
  165. package/src/lib/signaturePad.ts +111 -0
  166. package/src/lib/sortOrder.ts +100 -38
  167. package/src/lib/star.ts +7 -1
  168. package/src/lib/surfaceCell.ts +41 -0
  169. package/src/lib/surfaceConditions.ts +156 -0
  170. package/src/lib/surfaceOpen.ts +106 -0
  171. package/src/lib/surfaceSteps.ts +68 -0
  172. package/src/lib/surfaceValues.ts +191 -0
  173. package/src/lib/symlink.ts +150 -0
  174. package/src/lib/tableColumns.ts +493 -0
  175. package/src/lib/tableEnv.ts +34 -0
  176. package/src/lib/tablePrefs.ts +84 -0
  177. package/src/lib/tags.ts +121 -12
  178. package/src/lib/themes.ts +286 -18
  179. package/src/lib/tour.ts +152 -0
  180. package/src/lib/trashEmpty.ts +111 -0
  181. package/src/lib/trashTimeLeft.ts +23 -0
  182. package/src/lib/uiLocales.ts +460 -0
  183. package/src/lib/viewPrefs.ts +696 -660
  184. package/src/lib/viewPrefsHttp.ts +78 -0
  185. package/src/locales/en.ts +515 -117
  186. package/src/locales/resolve.ts +17 -8
  187. package/src/locales/tr.ts +536 -152
  188. package/src/modals/ConvertModal.vue +62 -11
  189. package/src/modals/DestinationPickerModal.vue +59 -16
  190. package/src/modals/Modal.vue +113 -23
  191. package/src/modals/NewDocumentModal.vue +16 -6
  192. package/src/modals/NewFolderModal.vue +8 -0
  193. package/src/modals/PermissionsModal.vue +272 -163
  194. package/src/modals/PreviewModal.vue +119 -20
  195. package/src/modals/RenameModal.vue +37 -1
  196. package/src/styles/base.css +2890 -260
  197. package/src/styles/sign-fonts.css +118 -0
  198. package/src/styles/variables.css +60 -0
  199. package/src/types/Connections.ts +17 -0
  200. package/src/types/ExplorerConfig.ts +117 -1
  201. package/src/types/FileNode.ts +50 -0
  202. package/src/types/Plugins.ts +494 -0
  203. package/src/types/Public.ts +212 -0
  204. package/src/viewers/ArchiveViewer.vue +93 -48
  205. package/src/viewers/CsvViewer.vue +99 -53
  206. package/src/viewers/DrawioViewer.vue +35 -9
  207. package/src/viewers/EpubViewer.vue +7 -8
  208. package/src/viewers/IpynbViewer.vue +3 -1
  209. package/src/viewers/MermaidViewer.vue +4 -5
  210. package/src/viewers/PdfViewer.vue +8 -17
  211. package/src/viewers/PsdViewer.vue +2 -4
  212. package/src/viewers/TiffViewer.vue +4 -5
  213. package/src/viewers/Viewer3D.vue +1 -1
  214. package/LICENSE +0 -21
  215. package/dist/ArchiveViewer-BUQWLhwX.js +0 -124
  216. package/dist/ArchiveViewer-BUQWLhwX.js.map +0 -1
  217. package/dist/CsvViewer-Bg2_aqzc.js +0 -141
  218. package/dist/CsvViewer-Bg2_aqzc.js.map +0 -1
  219. package/dist/DrawioViewer-CC6rJXeP.js.map +0 -1
  220. package/dist/EpubViewer-CAoTSXTO.js.map +0 -1
  221. package/dist/IpynbViewer-D0GwGpnE.js +0 -184
  222. package/dist/IpynbViewer-D0GwGpnE.js.map +0 -1
  223. package/dist/MermaidViewer-DGwAvRZg.js +0 -137
  224. package/dist/MermaidViewer-DGwAvRZg.js.map +0 -1
  225. package/dist/PsdViewer-DhGweA0m.js +0 -122
  226. package/dist/PsdViewer-DhGweA0m.js.map +0 -1
  227. package/dist/TiffViewer-D0AurvAh.js +0 -142
  228. package/dist/TiffViewer-D0AurvAh.js.map +0 -1
  229. package/dist/Viewer3D-CdZeK4j4.js.map +0 -1
  230. package/dist/index-BArI-B1M.js +0 -26911
  231. package/dist/index-BArI-B1M.js.map +0 -1
  232. package/dist/useViewerFetch-czqbd2Lj.js +0 -25
  233. package/dist/useViewerFetch-czqbd2Lj.js.map +0 -1
  234. package/src/composables/useScrolledX.ts +0 -21
package/src/locales/tr.ts CHANGED
@@ -7,7 +7,7 @@ export const tr: Record<string, string> = {
7
7
  'toolbar.view.list': 'Liste',
8
8
  'toolbar.view.grid': 'Izgara',
9
9
  'toolbar.refresh': 'Yenile',
10
- 'toolbar.go_up': 'Üst Klasör',
10
+ 'toolbar.go_up': 'Üst klasör',
11
11
 
12
12
  'ctx.open': 'Aç',
13
13
  'ctx.preview': 'Önizle',
@@ -15,8 +15,8 @@ export const tr: Record<string, string> = {
15
15
  'ctx.convert': 'Dönüştür',
16
16
  'ctx.rename': 'Yeniden adlandır',
17
17
  'ctx.delete': 'Sil',
18
- 'ctx.delete_perm': 'Kalıcı Olarak Sil',
19
- 'ctx.restore': 'Geri Getir',
18
+ 'ctx.delete_perm': 'Kalıcı olarak sil',
19
+ 'ctx.restore': 'Geri getir',
20
20
  'ctx.share': 'Paylaş',
21
21
  'ctx.move': 'Taşı',
22
22
  'ctx.copy': 'Kopyala',
@@ -38,13 +38,13 @@ export const tr: Record<string, string> = {
38
38
  'keep.strip_settling': '{name} eşitleniyor — son durum kaydediliyor…',
39
39
  'ctx.paste': 'Yapıştır',
40
40
  'ctx.info': 'Bilgi',
41
- 'ctx.duplicate': 'Kopyasını Oluştur',
41
+ 'ctx.duplicate': 'Kopyasını oluştur',
42
42
  'ctx.new_file': 'Yeni dosya',
43
43
 
44
44
  'modal.delete.title': 'Silinsin mi?',
45
45
  'modal.delete.message': '{count} öğe çöpe atılacak.',
46
46
  'modal.delete.message_one': '{count} öğe çöpe atılacak.',
47
- 'modal.delete.confirm': 'Çöpe At',
47
+ 'modal.delete.confirm': 'Çöpe at',
48
48
  'modal.delete.cancel': 'Vazgeç',
49
49
 
50
50
  'modal.rename.title': 'Yeniden adlandır',
@@ -56,7 +56,7 @@ export const tr: Record<string, string> = {
56
56
  'modal.newfolder.create': 'Oluştur',
57
57
  'modal.newfolder.cancel': 'Vazgeç',
58
58
 
59
- 'modal.share.title': 'Paylaşım Linki',
59
+ 'modal.share.title': 'Paylaşım bağlantısı',
60
60
  'modal.share.pin': 'PIN koruması',
61
61
  'modal.share.expires': 'Son kullanma',
62
62
  'modal.share.max_downloads': 'İndirme limiti',
@@ -65,7 +65,7 @@ export const tr: Record<string, string> = {
65
65
  'modal.share.close': 'Kapat',
66
66
  'modal.share.limit_applied': '(sunucu sınırı uygulandı)',
67
67
  'modal.share.copy': 'Kopyala',
68
- 'modal.share.url_copied': 'Link kopyalandı',
68
+ 'modal.share.url_copied': 'Bağlantı kopyalandı',
69
69
  'modal.share.pin_copied': 'PIN kopyalandı',
70
70
  'modal.share.cli_copied': 'CLI komutu kopyalandı',
71
71
 
@@ -89,7 +89,7 @@ export const tr: Record<string, string> = {
89
89
 
90
90
  'col.name': 'Ad',
91
91
  'col.size': 'Boyut',
92
- 'col.modified': 'Tarih',
92
+ 'col.modified': 'Değiştirilme',
93
93
  'col.type': 'Tür',
94
94
 
95
95
  'unit.bytes': 'B',
@@ -111,15 +111,15 @@ export const tr: Record<string, string> = {
111
111
  'ops.done': 'tamamlandı',
112
112
  'ops.error': 'hata',
113
113
 
114
- 'node.trash': 'Çöp Kutusu',
114
+ 'node.trash': 'Çöp kutusu',
115
115
  'node.folder': 'Klasör',
116
116
 
117
117
  // ——— Zengin önizleyici chrome ———
118
118
  'viewer.open_in_new_tab': 'Yeni sekmede aç',
119
119
  'viewer.loading': 'Yükleniyor…',
120
120
  'viewer.failed_to_load': 'Dosya yüklenemedi',
121
- 'viewer.peer_not_installed': 'Bu dosya tipi için opsiyonel kütüphane kurulu değil. Peer dependency yükle veya İndir düğmesini kullan.',
122
- 'viewer.format_unsupported_3d': 'Bu 3B format tarayıcı önizlemesinde desteklenmiyor (model-viewer yalnızca .glb / .gltf / .usdz okur). Lütfen indirip yerel bir araçta açın.',
121
+ 'viewer.peer_not_installed': 'Bu tür bir dosya burada gösterilemiyor. Cihazınızda açmak için indirin.',
122
+ 'viewer.format_unsupported_3d': 'Önizleme yalnızca .glb, .gltf ve .usdz biçimindeki 3B modelleri gösterir. Dosyayı indirip bir 3B programında açın.',
123
123
  'viewer.zoom_in': 'Yakınlaştır',
124
124
  'viewer.zoom_out': 'Uzaklaştır',
125
125
  'viewer.fit_width': 'Sayfa genişliğine sığdır',
@@ -141,7 +141,7 @@ export const tr: Record<string, string> = {
141
141
  'viewer.no_preview': 'Bu dosya tipi için önizleme henüz yok.',
142
142
  'viewer.edit': 'Düzenle',
143
143
  'viewer.close': 'Kapat',
144
- 'presence.expand': 'İsimleri göster',
144
+ 'presence.expand': 'Adları göster',
145
145
  'presence.collapse': 'Küçült',
146
146
  'viewer.save_annotations': 'Açıklamaları kaydet',
147
147
  'viewer.annotations_on': 'Açıklamalar: açık',
@@ -151,11 +151,20 @@ export const tr: Record<string, string> = {
151
151
  'viewer.csv_filter': 'Satır filtrele…',
152
152
  'viewer.epub_prev': 'Önceki',
153
153
  'viewer.epub_next': 'Sonraki',
154
- 'viewer.drawio.disabled': 'diagrams.net editörü bu filex kurulumunda yapılandırılmamış — yönetici FILEX_DRAWIO_URL\'yi ayarlamalı.',
154
+ /* ⚠ Eski cümle her okuyucuya bir ORTAM DEĞİŞKENİ söylüyordu ("yönetici
155
+ FILEX_DRAWIO_URL'yi ayarlamalı"). Yalnızca bir diyagrama bakmak isteyen
156
+ kişiye ne yapabileceği; `_admin` — düzeltebilecek kişiye — nereden
157
+ düzelteceği söylenir. */
158
+ 'viewer.drawio.disabled': 'Diyagramlar burada açılamıyor: bu sunucuda draw.io yok. Başka bir yerde açmak için dosyayı indirin.',
159
+ 'viewer.drawio.disabled_admin': 'Bu sunucuda draw.io kurulu değil. Yönetim panelinde Dış servisler altından kurabilirsiniz.',
160
+ 'viewer.drawio.load_failed': 'Bu diyagram okunamadı. Başka bir yerde açmak için indirin.',
161
+ 'viewer.drawio.save_failed': 'Diyagram kaydedilemedi. Değişiklikleriniz hâlâ düzenleyicide — yeniden deneyin.',
155
162
  'viewer.archive.entries': '{n} dosya',
156
163
  'viewer.archive.entries_one': '{n} dosya',
157
164
  'viewer.archive.empty': 'Arşiv boş.',
158
165
  'viewer.archive.error': 'Arşiv okunamadı.',
166
+ 'viewer.archive.unsupported': 'Bu tür bir arşiv burada listelenemiyor. İçinde ne olduğunu görmek için indirin.',
167
+ 'viewer.archive.too_large': 'Bu arşiv burada listelenemeyecek kadar büyük. İçinde ne olduğunu görmek için indirin.',
159
168
  'viewer.name': 'Ad',
160
169
  'viewer.size': 'Boyut',
161
170
 
@@ -163,8 +172,8 @@ export const tr: Record<string, string> = {
163
172
  'col.sort': 'Sırala',
164
173
  'group.today': 'Bugün',
165
174
  'group.yesterday': 'Dün',
166
- 'group.this_week': 'Bu Hafta',
167
- 'group.this_month': 'Bu Ay',
175
+ 'group.this_week': 'Bu hafta',
176
+ 'group.this_month': 'Bu ay',
168
177
  'group.no_date': 'Tarihsiz',
169
178
  'toolbar.density.compact': 'Sıkışık görünüm',
170
179
  'toolbar.density.comfortable': 'Rahat görünüm',
@@ -178,7 +187,7 @@ export const tr: Record<string, string> = {
178
187
  'palette.hint': '↑↓ gezin · Enter seç · Esc kapat',
179
188
  'cmd.view_toggle': 'Görünümü değiştir (liste ⇄ ızgara)',
180
189
  'cmd.trash': 'Çöp kutusunu aç',
181
- 'shortcuts.title': 'Klavye Kısayolları',
190
+ 'shortcuts.title': 'Klavye kısayolları',
182
191
  'shortcuts.group.nav': 'Gezinme',
183
192
  'shortcuts.group.selection': 'Seçim',
184
193
  'shortcuts.group.file': 'Dosya işlemleri',
@@ -201,12 +210,12 @@ export const tr: Record<string, string> = {
201
210
  // ——— State screens + undo snackbar + connection badge (cila:b) ———
202
211
  'empty.hint': 'Dosyaları buraya sürükleyip bırakın',
203
212
  'empty.upload': 'Dosya yükle',
204
- 'empty.search.title': 'Aramanla eşleşen dosya yok',
213
+ 'empty.search.title': 'Aramanızla eşleşen dosya yok',
205
214
  'empty.search.hint': 'Farklı bir arama terimi deneyin',
206
215
  'empty.trash.title': 'Çöp kutusu boş',
207
216
  'error.title': 'Liste yüklenemedi',
208
217
  'error.retry': 'Yeniden dene',
209
- 'toast.undo': 'Geri Al',
218
+ 'toast.undo': 'Geri al',
210
219
  'toast.undone': 'Geri alındı',
211
220
  'toast.undo_failed': 'Geri alınamadı',
212
221
  'toast.renamed': 'Yeniden adlandırıldı',
@@ -215,6 +224,37 @@ export const tr: Record<string, string> = {
215
224
  /* i18n:hardcoded — FileExplorer.vue'da düz string olarak duran, hiçbir dilin
216
225
  değiştiremediği bildirim metinleri. */
217
226
  'toast.failed': 'İşlem başarısız',
227
+ 'err.status.400': 'Geçersiz istek',
228
+ 'err.status.401': 'Oturum açmanız gerekiyor',
229
+ 'err.status.403': 'Bu işlem için yetkiniz yok',
230
+ 'err.status.404': 'Bulunamadı',
231
+ 'err.status.409': 'Zaten var / çakışma',
232
+ 'err.status.413': 'Dosya çok büyük',
233
+ 'err.status.415': 'Bu dosya türü desteklenmiyor',
234
+ 'err.status.422': 'Geçersiz veri',
235
+ 'err.status.429': 'Çok fazla istek, biraz bekleyin',
236
+ 'err.status.500': 'Sunucu hatası',
237
+ 'err.status.501': 'Bu işlem desteklenmiyor',
238
+ 'err.status.502': 'Bağlı bir servis hata verdi',
239
+ 'err.status.503': 'Servis şu an kullanılamıyor',
240
+ 'err.status.504': 'Bağlı bir servis zamanında yanıt vermedi',
241
+ 'err.status.other': 'Sunucu bu isteği kabul etmedi.',
242
+ 'err.upload_stalled': 'Yükleme ilerlemeyi bıraktı. Yeniden deneyin — kaldığı yerden devam eder.',
243
+ 'err.network': 'Sunucuya ulaşılamadı. Bağlantınızı kontrol edip yeniden deneyin.',
244
+ 'err.read_only': 'Bu depo salt okunur',
245
+ 'err.no_secret_key': 'Bu sunucuda şifreleme anahtarı tanımlı değil, bu yüzden erişim anahtarı verilemiyor. Yöneticinizden tanımlamasını isteyin.',
246
+ 'err.quota': 'Depolama kotanız dolu.',
247
+ 'err.save_failed': 'Değişiklikleriniz kaydedilemedi.',
248
+ 'err.load_failed': 'Bu dosya yüklenemedi.',
249
+ 'err.viewer_failed': 'Bu dosyanın görüntüleyicisi başlatılamadı. Açmak için dosyayı indirin.',
250
+ 'err.detail': 'Ayrıntı',
251
+ 'opc.err.timeout': 'Uygulama çok uzun sürdü ve durduruldu.',
252
+ 'opc.err.out_of_memory': 'Uygulamanın bu dosyada belleği yetmedi.',
253
+ 'opc.err.crashed': 'Uygulama beklenmedik biçimde durdu.',
254
+ 'opc.err.app_removed': 'Bu iş çalışamadan uygulama kaldırıldı.',
255
+ 'opc.err.action_removed': 'Bu eylem artık yok — uygulama güncellendi.',
256
+ 'opc.err.engine_missing': 'Bunun için sunucuda olmayan bir program gerekiyor ({engine}). Yöneticinize başvurun.',
257
+ 'opc.err.engine_missing_admin': 'Bunun için {engine} gerekiyor ve filex\'i çalıştıran sunucuda kurulu değil. Oraya kurup yeniden deneyin.',
218
258
  'toast.copied': 'Kopyalandı',
219
259
  'toast.deleted': 'Silindi',
220
260
  'toast.cut': 'Kesildi',
@@ -229,7 +269,25 @@ export const tr: Record<string, string> = {
229
269
  'toast.trash_retention': 'Çöpteki öğeler saklama süresi sonunda otomatik silinir. Kalıcı silme yönetici panelinden yapılır.',
230
270
  'dropzone.hint': 'Dosyaları buraya bırak',
231
271
  'modal.newfolder.invalid': 'Geçersiz karakter',
232
- 'viewer.office_unconfigured': 'OnlyOffice yapılandırması yok',
272
+ 'names.reserved': '“{name}” adı filex’in kendi kullanımına ayrılmış. Başka bir ad seçin.',
273
+ /* ⚠ Eksik ya da bozuk belge sunucusu kelimelerle söylenir, asla HTTP
274
+ katmanıyla değil (eskiden `Config fetch 503: {"error":"onlyoffice not
275
+ configured"}` yazıyordu). `_admin`, düzeltebilecek kişinin okuduğu —
276
+ nereden düzelteceği; diğer herkes dosyayı yine de nasıl alacağını okur. */
277
+ 'viewer.office_unconfigured':
278
+ 'Ofis belgeleri burada açılamıyor: bu sunucuda ONLYOFFICE belge sunucusu yok. Dosyayı bilgisayarınızda açmak için indirin.',
279
+ 'viewer.office_unconfigured_admin':
280
+ 'Bu sunucuda ONLYOFFICE kurulu değil, bu yüzden ofis belgeleri burada açılamıyor. Yönetim panelinde Dış servisler altından kurabilirsiniz.',
281
+ 'viewer.office_unreachable': 'Belge sunucusu şu anda yanıt vermiyor. Daha sonra yeniden deneyin ya da dosyayı indirin.',
282
+ 'viewer.office_unreachable_admin':
283
+ 'ONLYOFFICE belge sunucusu yanıt vermiyor. Yönetim panelinde Dış servisler altından kontrol edin.',
284
+ 'viewer.office_failed': 'Bu belge ONLYOFFICE ile açılamadı. Bilgisayarınızda açmak için indirin.',
285
+ 'viewer.office_forbidden': 'Bu belgeyi ONLYOFFICE ile açma izniniz yok.',
286
+ /* Gezginin "Aç" girdisi, belge sunucusu yokken — yalnızca yöneticiye
287
+ gösterilir (diğer herkese girdi hiç sunulmaz; lib/serviceGate). */
288
+ 'ctx.needs_onlyoffice': 'ONLYOFFICE kurulu değil — yönetim panelinde Dış servisler altından kurun.',
289
+ 'ctx.needs_drawio': 'draw.io kurulu değil — yönetim panelinde Dış servisler altından kurun.',
290
+ 'ctx.needs_convert': 'Dönüştürücü kurulu değil ya da yanıt vermiyor — yönetim panelinde Dış servisler altından kontrol edin.',
233
291
  'viewer.pdf_inline_failed': 'Tarayıcı PDF\'i inline açamadı.',
234
292
  'viewer.too_large': 'Dosya çok büyük (>1 MB).',
235
293
  'viewer.csv_rows': '{n} satır',
@@ -246,6 +304,7 @@ export const tr: Record<string, string> = {
246
304
  'palette.save': 'Aramayı kaydet',
247
305
  'palette.saved.delete': 'Kayıtlı aramayı sil',
248
306
  'search.in_content': 'İçerikte',
307
+ 'search.truncated': 'Gösterilenden daha fazla sonuç var — aramanızı daraltın',
249
308
 
250
309
  /* === bag:b4 === */
251
310
  'toolbar.more': 'Diğer işlemler',
@@ -281,6 +340,19 @@ export const tr: Record<string, string> = {
281
340
  'tags.add': '+ Etiket ekle',
282
341
  'tags.name': 'Etiket adı',
283
342
  'tags.remove': 'Etiketi kaldır',
343
+
344
+ /* etiket:k2 (v0.43.0) — etiketin iki TÜRÜ. Etiket nerede çiziliyorsa türünü
345
+ simgeyle birlikte sözcükle de söyler: bu sürüme kadar her etiket sessizce
346
+ sunucudaki herkesle paylaşılıyordu. */
347
+ 'tags.kind.label': 'Bu etiketi kim görür',
348
+ 'tags.kind.personal': 'Kişisel',
349
+ 'tags.kind.team': 'Ekip',
350
+ 'tags.kind.personal_help': 'Yalnızca siz görürsünüz',
351
+ 'tags.kind.team_help': 'Bu dosyayı görebilen ekibindeki herkes görür',
352
+ 'tags.kind.team_locked': 'Ekip etiketi eklemek ya da kaldırmak için bu dosyada düzenleme yetkiniz olmalı.',
353
+ 'tags.chip.personal': 'Kişisel etiket “{tag}” — yalnızca siz görürsünüz',
354
+ 'tags.chip.team': 'Ekip etiketi “{tag}” — bu dosyayı görebilen ekibindeki herkes görür',
355
+ 'tags.add_submit': 'Ekle',
284
356
  'inspector.section.versions': 'Sürümler',
285
357
  'inspector.section.permissions': 'İzinler',
286
358
  'inspector.section.shares': 'Paylaşımlar',
@@ -313,12 +385,12 @@ export const tr: Record<string, string> = {
313
385
  'inspector.perm.editor': 'Düzenleyen',
314
386
  'inspector.perm.owner': 'Sahip',
315
387
  'inspector.perm.manage': 'İzinleri yönet',
316
- 'inspector.shares.empty': 'Paylaşım linki yok',
317
- 'inspector.shares.copy': 'Linki kopyala',
388
+ 'inspector.shares.empty': 'Paylaşım bağlantısı yok',
389
+ 'inspector.shares.copy': 'Bağlantıyı kopyala',
318
390
 
319
391
  /* wiring:c1 — tema galerisi */
320
392
  'theme.menu': 'Tema',
321
- 'theme.title': 'Tema Galerisi',
393
+ 'theme.title': 'Tema galerisi',
322
394
  'theme.hint': 'Tema yalnız renk paletini değiştirir; gündüz mü gece mi olduğu yukarıdaki seçim.',
323
395
  'theme.mode.label': 'Görünüm',
324
396
  'theme.mode.light': 'Gündüz',
@@ -328,20 +400,20 @@ export const tr: Record<string, string> = {
328
400
  'theme.close': 'Kapat',
329
401
  'theme.selected': 'Seçili',
330
402
  'theme.name.default': 'Varsayılan',
331
- 'theme.name.night': 'Gece Mavisi',
403
+ 'theme.name.night': 'Gece mavisi',
332
404
  'theme.name.forest': 'Orman',
333
405
  'theme.name.amber': 'Kehribar',
334
406
  'theme.name.lilac': 'Leylak',
335
- 'theme.name.contrast': 'Yüksek Kontrast',
336
- 'theme.name.gray': 'Yumuşak Gri',
337
- 'theme.name.terminal': 'Terminal Yeşili',
407
+ 'theme.name.contrast': 'Yüksek kontrast',
408
+ 'theme.name.gray': 'Yumuşak gri',
409
+ 'theme.name.terminal': 'Terminal yeşili',
338
410
  /* === zaman:z3 — saat dilimi seçici (gömme penceresi + web ayarları) === */
339
411
  'tz.menu': 'Saat dilimi',
340
412
  'tz.title': 'Saat dilimi',
341
413
  'tz.label': 'Tarihleri şu saatle göster',
342
414
  'tz.search': 'Şehir, ülke ya da saat farkı arayın — “İstanbul” veya “GMT+3” deneyin',
343
415
  'tz.default.device': 'Bu cihazın saat dilimini kullan ({zone})',
344
- 'tz.default.account': 'Hesabın saat dilimini kullan ({zone})',
416
+ 'tz.default.account': 'Hesabınızın saat dilimini kullan ({zone})',
345
417
  'tz.default.host': 'Bu sitenin varsayılanını kullan ({zone})',
346
418
  'tz.no_match': '“{query}” ile eşleşen saat dilimi yok. Bir şehir, bir ülke ya da GMT+3 gibi bir fark deneyin.',
347
419
  'tz.more': '{n} kayıt daha var — listeyi daraltmak için yazmayı sürdürün.',
@@ -351,7 +423,7 @@ export const tr: Record<string, string> = {
351
423
  'shortcuts.quicklook': 'Hızlı bakış',
352
424
  'shortcuts.customize': 'Özelleştir',
353
425
  'shortcuts.settings.menu': 'Kısayollar',
354
- 'shortcuts.settings.title': 'Kısayol Ayarları',
426
+ 'shortcuts.settings.title': 'Kısayol ayarları',
355
427
  'shortcuts.settings.hint': 'Bir kısayolu değiştirmek için "Değiştir"e basıp yeni tuş kombinasyonuna basın. Değişiklikler yalnızca bu tarayıcıda saklanır.',
356
428
  'shortcuts.settings.change': 'Değiştir',
357
429
  'shortcuts.settings.capture': 'Tuşlara basın… (Esc iptal)',
@@ -392,6 +464,209 @@ export const tr: Record<string, string> = {
392
464
  'opc.kind.delete': 'Silme',
393
465
  'opc.kind.convert': 'Dönüştürme',
394
466
  'opc.kind.archive': 'Arşiv',
467
+ 'opc.kind.plugin': 'Uygulama',
468
+ 'opc.kind.trash': 'Çöp kutusunu boşaltma',
469
+ 'opc.open': 'Aç',
470
+
471
+ /* Uygulama eklentileri — dosya menüsüne eklenen satırlar ve kuyruğa
472
+ aldıkları işler (docs/APP-PLUGINS-API.md). */
473
+ 'plugin.queued': '{label} kuyruğa alındı',
474
+ 'plugin.done': '{label} tamamlandı',
475
+ 'plugin.failed': '{label} başarısız',
476
+ 'plugin.cancel_failed': 'İş iptal edilemedi',
477
+ 'plugin.not_applicable': 'Bu işlem seçime uygulanamaz',
478
+ 'plugin.read_only': 'Bu depo salt okunur',
479
+ 'plugin.needs_engine': '{name} bu sunucuda kurulu değil — sunucuya kurup filex\'i yeniden başlatın.',
480
+ 'plugin.needs_other': '{name} bu sunucuda kullanılamıyor.',
481
+ 'plugin.confirm.title': 'Onayla',
482
+ 'plugin.confirm.cancel': 'Vazgeç',
483
+ 'plugin.confirm.run': 'Çalıştır',
484
+ 'plugin.view.close': 'Kapat',
485
+ 'plugin.view.busy': 'Çalışıyor…',
486
+ 'plugin.view.unsupported': 'Bu ekran, bu sürümün çizemediği bir bileşen kullanıyor ({type})',
487
+ 'plugin.view.error': 'Uygulama hata döndürdü',
488
+ 'plugin.output_missing': 'Çıktı artık eski yerinde değil',
489
+ /* M2 — surface components (components/plugin/nodes/*) */
490
+ 'plugin.view.loading': 'Yükleniyor…',
491
+ 'plugin.view.preview_failed': 'Önizleme yüklenemedi',
492
+ 'plugin.steps.label': 'Adımlar',
493
+ 'plugin.list.empty': 'Henüz bir şey yok',
494
+ 'plugin.list.actions': 'İşlemler',
495
+ /* The label on a table row's ONE action control (core RowActions.vue).
496
+ The explorer's handle is the ⋮ glyph; a panel row's says what it is.
497
+ Owner, 2026-09-20: "adminde 'Aksiyon' diye yazmalı". */
498
+ 'row.actions': 'Aksiyon',
499
+ 'plugin.people.placeholder': 'Ad veya e-posta',
500
+ 'plugin.people.placeholder_email': 'E-posta adresi',
501
+ 'plugin.people.add': 'Ekle',
502
+ 'plugin.people.remove': '{name} kişisini kaldır',
503
+ 'plugin.people.invalid_email': 'Geçerli bir e-posta adresi girin',
504
+ 'plugin.people.external_off': 'Yalnızca hesabı olan kişiler eklenebilir',
505
+ 'plugin.pin.label': 'PIN',
506
+ 'plugin.file.choose': 'Seç…',
507
+ 'plugin.file.clear': 'Temizle',
508
+ 'plugin.file.none': 'Seçim yok',
509
+ /* M3 — imza yolu: signature-pad + pdf-fields düğümleri ve dış katılımcının
510
+ herkese açık sayfası (views/PublicSurface.vue, usePublicPage). */
511
+ 'plugin.sig.mode_draw': 'Çiz',
512
+ 'plugin.sig.mode_type': 'Yaz',
513
+ 'plugin.sig.mode_upload': 'Yükle',
514
+ 'plugin.sig.draw_hint': 'Parmağınızla ya da fareyle buraya imzalayın',
515
+ 'plugin.sig.type_placeholder': 'Adınızı yazın',
516
+ 'plugin.sig.upload_pick': 'Görsel seç…',
517
+ 'plugin.sig.upload_hint': 'PNG ya da JPEG, en çok {kb} KB',
518
+ 'plugin.sig.upload_too_big': 'Görsel {kb} KB sınırından büyük',
519
+ 'plugin.sig.upload_bad_type': 'Yalnızca PNG ya da JPEG görsel kullanılabilir',
520
+ 'plugin.sig.upload_unreadable': 'Görsel okunamadı',
521
+ 'plugin.sig.clear': 'İmzayı temizle',
522
+ 'plugin.sig.signed': 'İmza alındı',
523
+ 'plugin.pdf.load_failed': 'Belge yüklenemedi',
524
+ 'plugin.pdf.palette': 'Alan türleri',
525
+ 'plugin.pdf.pending': 'Yeri bekleyen kutular',
526
+ 'plugin.pdf.place_box_hint': '“{name}” kutusunun gideceği yere dokunun ya da boyutlandırmak için sürükleyin',
527
+ 'plugin.pdf.all_placed': 'Her kutunun bir yeri var',
528
+ 'plugin.pdf.place_idle': 'Yukarıdaki kutulardan birini seçin, sonra sayfada gideceği yere dokunun.',
529
+ 'plugin.pdf.place_idle_done': 'Kaldırmak ya da kopyalamak için sayfadaki bir kutuya dokunun; taşımak için sürükleyin.',
530
+ 'plugin.pdf.no_boxes': 'Henüz kutu yok. Aşağıdan ekleyin: adını verin, kimin olduğunu söyleyin; yerini bir sonraki adımda belgede seçeceksiniz.',
531
+ 'plugin.pdf.add_box': 'Kutu ekle',
532
+ 'plugin.pdf.unplace': 'Sayfadan kaldır',
533
+ 'plugin.pdf.place_hint': '{type} alanının gideceği yere dokunun ya da boyutlandırmak için sürükleyin',
534
+ 'plugin.pdf.type_signature': 'İmza',
535
+ 'plugin.pdf.type_initials': 'Paraf',
536
+ 'plugin.pdf.type_date': 'Tarih',
537
+ 'plugin.pdf.type_text': 'Metin',
538
+ 'plugin.pdf.type_checkbox': 'Onay kutusu',
539
+ 'plugin.pdf.tap_signature': 'İmzalamak için dokunun',
540
+ 'plugin.pdf.tap_initials': 'Paraflamak için dokunun',
541
+ 'plugin.pdf.tap_date': 'Bugünün tarihi için dokunun',
542
+ 'plugin.pdf.tap_text': 'Metin',
543
+ 'plugin.pdf.tap_checkbox': 'İşaretlemek için dokunun',
544
+ 'plugin.pdf.label': 'Ad',
545
+ 'plugin.pdf.assignee': 'İmzacı',
546
+ 'plugin.pdf.unassigned': 'Herkes',
547
+ 'plugin.pdf.filled_by': 'Dolduran',
548
+ 'plugin.pdf.style': 'Nasıl imzalanır',
549
+ 'plugin.pdf.style_drawn': 'Çizerek',
550
+ 'plugin.pdf.style_typed': 'Yazarak',
551
+ 'plugin.pdf.lines': 'Altına yazılanlar',
552
+ 'plugin.pdf.lines_preview': 'İmzanın altında:',
553
+ 'plugin.pdf.lines_none': 'Bu imzanın altına bir şey yazılmaz.',
554
+ 'plugin.pdf.required': 'Zorunlu',
555
+ 'plugin.pdf.copy_to_page': 'Sayfaya kopyala',
556
+ 'plugin.pdf.copy': 'Kopyala',
557
+ 'plugin.pdf.delete': 'Alanı sil',
558
+ 'plugin.pdf.zoom_in': 'Yakınlaştır',
559
+ 'plugin.pdf.zoom_out': 'Uzaklaştır',
560
+ 'plugin.pdf.zoom_fit': 'Genişliğe sığdır',
561
+ 'plugin.pdf.zoom_fit_page': 'Sayfayı ekrana sığdır',
562
+ 'plugin.pdf.pad_for': '{type} alanınız',
563
+ 'plugin.pdf.pad_done': 'Tamam',
564
+ 'plugin.page.loading': 'Yükleniyor…',
565
+ 'plugin.page.pin_title': 'Bu sayfa korumalı',
566
+ 'plugin.page.pin_hint': 'Devam etmek için size verilen PIN\'i girin',
567
+ 'plugin.page.pin_submit': 'Devam et',
568
+ 'plugin.page.pin_wrong': 'Bu PIN doğru değil',
569
+ 'plugin.page.pin_locked': 'Çok fazla yanlış PIN girildi — birkaç dakika bekleyip yeniden deneyin',
570
+ 'plugin.page.unavailable_title': 'Bu bağlantı kullanılamıyor',
571
+ 'plugin.page.unavailable_text': 'Süresi dolmuş, hakkı tükenmiş ya da geri çekilmiş olabilir. Gönderen kişiden yeni bir bağlantı isteyin.',
572
+ 'plugin.page.accepted_title': 'Alındı, teşekkürler',
573
+ 'plugin.page.accepted_text': 'Yanıtınız kaydedildi. Bu sayfayı kapatabilirsiniz.',
574
+ 'plugin.page.done_title': 'Tamamlandı',
575
+ 'plugin.page.done_text': 'Burada yapılacak başka bir şey kalmadı. Bu sayfayı kapatabilirsiniz.',
576
+ 'plugin.page.error_title': 'Bir sorun oluştu',
577
+ 'plugin.page.retry': 'Yeniden dene',
578
+ 'plugin.page.files': 'Belgeler',
579
+ 'plugin.page.open_file': '{name} dosyasını yeni sekmede aç',
580
+ 'plugin.page.footer': 'filex ile sunuldu',
581
+ /* === v3 — tek public kabuk: paylaşım, dosya isteği ve bir uygulamanın
582
+ sayfası tek sayfanın üç gövdesi. Aşağıdakiler kabuğun kendi sözleri;
583
+ hangi bağlantı açılmış olursa olsun aynı cümleler görünür. === */
584
+ 'public.served_by': '{name} ile paylaşıldı',
585
+ 'public.expires': 'Bağlantı {when} tarihinde çalışmayı bırakıyor',
586
+ 'public.visits_left': '{n} ziyaret kaldı',
587
+ 'public.visits_left_one': '{n} ziyaret kaldı',
588
+ 'public.language_from': '{app} uygulamasından geldi',
589
+ 'public.up': 'Bir üst klasör',
590
+ 'public.download_all': 'Hepsini indir',
591
+ 'public.browse': 'İçine bak',
592
+ 'public.folder_empty': 'Bu klasörde bir şey yok',
593
+ 'public.drop_sub': 'Dosyalarınızı aşağıya bırakın ya da seçin. Bu klasöre yalnızca ekleyebilirsiniz; içinde hâlihazırda ne olduğu size görünmez.',
594
+ 'public.drop_here': 'Dosyaları buraya bırakın',
595
+ 'public.or_choose': 'ya da seçmek için tıklayın',
596
+ 'public.max_size': 'Dosya başına en çok {size}',
597
+ 'public.accepts': 'Kabul edilenler: {list}',
598
+ 'public.files_left': '{n} dosya daha gönderilebilir',
599
+ 'public.files_left_one': '{n} dosya daha gönderilebilir',
600
+ 'public.request_full': 'İstenen her şey ulaştı',
601
+ 'public.upload_done': 'Gönderildi',
602
+ 'public.upload_failed': 'Gönderilemedi',
603
+ 'public.your_name': 'Adınız (isteğe bağlı)',
604
+ 'public.your_name_ph': 'Örn. Ahmet Yılmaz',
605
+ 'public.refused_ext': 'Gönderilmedi — bu bağlantı bu türde dosya kabul etmiyor.',
606
+ 'public.refused_too_large': 'Gönderilmedi — {size} sınırından büyük.',
607
+ 'public.refused_too_many': 'Gönderilmedi — şu an en fazla {count} dosya gönderilebilir.',
608
+ 'public.refused_too_many_one': 'Gönderilmedi — şu an en fazla {count} dosya gönderilebilir.',
609
+ /* === Uygulama eklentileri v2 — `page` görünümü, uygulamanın dosya kilidi,
610
+ işin yazdığı çıktı kipi, imza alanının yazı tipleri ve kuralları. === */
611
+ 'plugin.page_view.back': 'Dosyalara dön',
612
+ 'plugin.page_view.queued_title': 'İş kuyruğa alındı',
613
+ 'plugin.page_view.queued_text': 'filex işi yürütüyor. İlerleyişi işlemler tepsisinde; bittiğinde haber verilecek.',
614
+ 'plugin.page_view.open_ops': 'İşlemler tepsisini aç',
615
+ 'plugin.page_view.done_title': 'Tamamlandı',
616
+ 'plugin.page_view.done_text': 'Burada yapılacak başka bir şey kalmadı. Bu sekmeyi kapatabilirsiniz.',
617
+ 'plugin.page_view.error_title': 'Bu ekran açılamadı',
618
+ 'plugin.page_view.retry': 'Yeniden dene',
619
+ 'plugin.page_view.blocked': 'Yeni sekme engellendi — bu site için açılır pencerelere izin verin, yoksa ekran pencere içinde açılır',
620
+ 'plugin.output.sibling': 'yeni dosya',
621
+ 'plugin.output.version': 'yeni sürüm',
622
+ 'plugin.output.sibling_title': 'Sonuç, aslının yanına yeni bir dosya olarak iner',
623
+ 'plugin.output.version_title': 'Sonuç, dosyanın yerine yeni bir sürümü olarak geçer',
624
+ 'plugin.sign.font_label': 'El yazısı',
625
+ 'plugin.pdf.font': 'Yazı tipi',
626
+ 'plugin.pdf.rule_number': 'Yalnızca sayı',
627
+ 'plugin.pdf.rule_email': 'E-posta adresi',
628
+ 'plugin.pdf.rule_length': '{min} ile {max} karakter arasında',
629
+ 'plugin.pdf.rule_min': 'En az {min} karakter',
630
+ 'plugin.pdf.rule_max': 'En çok {max} karakter',
631
+ 'plugin.pdf.err_number': 'Bir sayı girin',
632
+ 'plugin.pdf.err_email': 'Geçerli bir e-posta adresi girin',
633
+ 'plugin.pdf.err_min': 'Çok kısa — en az {min} karakter',
634
+ 'plugin.pdf.err_max': 'Çok uzun — en çok {max} karakter',
635
+ 'applock.badge': 'Kilitli',
636
+ 'applock.some_app': 'bir uygulama',
637
+ 'applock.held': '{app} bu dosyayı kilitledi',
638
+ 'applock.held_reason': '{app} bu dosyayı kilitledi: {reason}',
639
+ 'applock.until': '— {date} tarihine kadar',
640
+ 'applock.inspector': 'Uygulama kilidi',
641
+ /* issue #34 — sunucunun İZLEMEDİĞİ sembolik bağ (lib/symlink). Rozet satırdaki
642
+ kısa söz; `why` ise arkasındaki cümle — üzerine gelince, ayrıntılar panelinde
643
+ ve biri açmaya kalkıştığında çıkan bildirimde. ⚠ Kırık bağ ile depo dışına
644
+ çıkan bağ AYRI durumlardır ve ayrı okunmalıdır: yalnızca birinin yönetici
645
+ çaresi vardır; silinmiş bir hedef için o çareyi önermek insanı işe yaramayacak
646
+ bir ayar ekranına yollar. */
647
+ 'symlink.badge.outside_root': 'Depo dışında',
648
+ 'symlink.badge.broken': 'Kırık bağ',
649
+ 'symlink.badge.unresolved': 'Uzak bağ',
650
+ 'symlink.badge.unknown': 'Bağlantı',
651
+ 'symlink.why.outside_root':
652
+ 'Hedefi bu deponun dışında kalan bir bağ; bu yüzden açılamıyor. Bir yönetici, deponun ayarlarındaki "Bu klasörün dışına çıkan sembolik bağları izle" seçeneğiyle buna izin verebilir.',
653
+ 'symlink.why.broken':
654
+ 'Hedefi artık var olmayan bir bağ; açılacak bir şey yok. Sunucuda onarılması ya da kaldırılması gerekir — hiçbir ayar silinmiş hedefi geri getirmez.',
655
+ 'symlink.why.unresolved':
656
+ 'Uzak sunucudaki bir bağ. filex hedefinin bu deponun içinde olup olmadığını bilemediği için bağı izlemez ve açamaz.',
657
+ 'symlink.why.unknown':
658
+ 'filex\'in izlemediği bir bağ, bu yüzden açılamıyor. Hedefi ya bu deponun dışında, ya kayıp, ya da filex\'in çözümleyemediği uzak bir sunucuda.',
659
+ 'symlink.inspector': 'Açılamayan bir bağ',
660
+ 'plugin.pdf.rule': 'Kabul ettiği',
661
+ 'plugin.pdf.rule_kind_any': 'Serbest metin',
662
+ 'plugin.pdf.rule_kind_number': 'Yalnızca sayı',
663
+ 'plugin.pdf.rule_kind_email': 'E-posta adresi',
664
+ 'plugin.pdf.rule_min_label': 'En az uzunluk',
665
+ 'plugin.pdf.rule_max_label': 'En çok uzunluk',
666
+ 'plugin.pdf.format': 'Tarih biçimi',
667
+ 'plugin.pdf.date_order': 'Tarih sırası',
668
+ 'plugin.pdf.date_separator': 'Ayraç',
669
+ 'plugin.pdf.date_example': 'Örnek',
395
670
  /* === wiring:c4 — onboarding turu + erişilebilirlik + hata kartı === */
396
671
  'tour.aria': 'Tanıtım turu',
397
672
  'tour.restart': 'Turu tekrar başlat',
@@ -402,32 +677,32 @@ export const tr: Record<string, string> = {
402
677
  'tour.progress': '{n} / {m}',
403
678
  'tour.step.nav.title': 'Depolar ve görünümler',
404
679
  'tour.step.nav.desc':
405
- 'Ana sayfa, Benimle paylaşılanlar, Son kullanılanlar, Yıldızlılar ve Çöp Kutusu hep bu panelde durur; altında da depoların ve bağlantıların. Sol üst köşedeki düğme paneli ince bir şeride indirir ve geri açar.',
680
+ 'Ana sayfa, Benimle paylaşılanlar, Son kullanılanlar, Yıldızlılar ve Çöp kutusu hep bu panelde durur; altında da depolarınız ve bağlantılarınız. Sol üst köşedeki düğme paneli ince bir şeride indirir ve geri açar.',
406
681
  'tour.step.nav.desc_closed':
407
- 'Bu düğme gezinti panelini açar: Ana sayfa, Benimle paylaşılanlar, Son kullanılanlar, Yıldızlılar ve Çöp Kutusu; altında da depoların ve bağlantıların.',
682
+ 'Bu düğme gezinti panelini açar: Ana sayfa, Benimle paylaşılanlar, Son kullanılanlar, Yıldızlılar ve Çöp kutusu; altında da depolarınız ve bağlantılarınız.',
408
683
  'tour.step.new.title': 'Yeni bir şey ekle',
409
684
  'tour.step.new.desc':
410
- 'Yeni olan her şey buradan başlar: bu cihazdan dosya yükleyebilir, klasör oluşturabilir ya da birinden dosya isteyebilirsin. Dosyaları pencereye sürükleyip bırakmak da yükler.',
685
+ 'Yeni olan her şey buradan başlar: bu cihazdan dosya yükleyebilir, klasör oluşturabilir ya da birinden dosya isteyebilirsiniz. Dosyaları pencereye sürükleyip bırakmak da yükler.',
411
686
  'tour.step.new.desc_fab':
412
687
  'Bu düğme bu cihazdan dosya yükler. Dosyaları pencereye sürükleyip bırakmak da çalışır.',
413
688
  'tour.step.search.title': 'Arama',
414
689
  'tour.step.search.desc':
415
- 'Bu alan deponun tamamında ada göre arar; ayraçları ve bir harflik yazım hatasını affeder, yani "fatura 2026" yazdığında fatura_2026.pdf gelir. tag:fatura yazarak etikete göre süzebilirsin. Yanındaki sürgü düğmesi gelişmiş aramayı, {palette} ise komut paletini açar; palet komut da çalıştırır.',
416
- 'tour.step.crumb.title': 'Bulunduğun yer',
690
+ 'Bu alan deponun tamamında ada göre arar; ayraçları ve bir harflik yazım hatasını affeder, yani "fatura 2026" yazdığınızda fatura_2026.pdf gelir. tag:fatura yazarak etikete göre filtreleyebilirsiniz. Yanındaki sürgü düğmesi gelişmiş aramayı, {palette} ise komut paletini açar; palet komut da çalıştırır.',
691
+ 'tour.step.crumb.title': 'Bulunduğunuz yer',
417
692
  'tour.step.crumb.desc':
418
- 'Bu iz, ekrandaki klasörün adresidir. Adımlardan birine tıklayarak üste çıkabilir, sonuncusunun yanındaki oktan içindeki klasörleri görebilirsin.',
693
+ 'Bu iz, ekrandaki klasörün adresidir. Adımlardan birine tıklayarak üste çıkabilir, sonuncusunun yanındaki oktan içindeki klasörleri görebilirsiniz.',
419
694
  'tour.step.filters.title': 'Listeyi daralt',
420
695
  'tour.step.filters.desc':
421
- 'Tür, Kişiler, Değiştirilme ve Boyut bulunduğun klasörü süzer; yanındaki kutu yazdıkça adlara göre eşleşir, satırın sonundaki denetim ise sıralar.',
696
+ 'Tür, Sahibi, Değiştirilme ve Boyut bulunduğunuz klasörü filtreler; yanındaki kutu siz yazdıkça adlara göre eşleşir, satırın sonundaki denetim ise sıralar.',
422
697
  'tour.step.view.title': 'Görünümü değiştir',
423
698
  'tour.step.view.desc':
424
- 'Bu klasörün nasıl çizildiğini değiştirir; seçimin hatırlanır.',
699
+ 'Bu klasörün nasıl çizildiğini değiştirir; seçiminiz hatırlanır.',
425
700
  'tour.step.details.title': 'Ayrıntılar ve paylaşım',
426
701
  'tour.step.details.desc':
427
- 'Bir dosyayı seçip bu paneli açtığında ayrıntılarını, hareketlerini ve paylaşım bağlantılarını görürsün. Tam menü için dosyaya sağ tıkla ya da satırının sonundaki düğmeyi kullan: oradaki "Paylaş / İzinler" ile PIN ve son kullanma süresi verilebilen bir bağlantı oluşturulur.',
702
+ 'Bir dosyayı seçip bu paneli açtığınızda ayrıntılarını, hareketlerini ve paylaşım bağlantılarını görürsünüz. Tam menü için dosyaya sağ tıklayın ya da satırının sonundaki düğmeyi kullanın: oradaki "Paylaş" ile PIN ve son kullanma süresi verilebilen bir bağlantı oluşturulur.',
428
703
  'tour.step.help.title': 'Kısayollar',
429
704
  'tour.step.help.desc':
430
- '{help} tuşu kısayol kartını, {palette} komut paletini açar. Tema ve "Turu tekrar başlat" sağ üstteki "Diğer işlemler" menüsünde; hesabın ve çıkış ise yanındaki avatarın arkasında.',
705
+ '{help} tuşu kısayol kartını, {palette} komut paletini açar. Tema ve "Turu tekrar başlat" sağ üstteki "Diğer işlemler" menüsünde; hesabınız ve oturumu kapatma ise yanındaki avatarın arkasında.',
431
706
  'error.hint': 'Bağlantı ya da sunucu kaynaklı geçici bir sorun olabilir. Yeniden deneyin.',
432
707
  'error.details': 'Teknik ayrıntılar',
433
708
  'col.star': 'Yıldız',
@@ -453,7 +728,7 @@ export const tr: Record<string, string> = {
453
728
  'shortcuts.refresh': 'Listeyi yenile',
454
729
  'shortcuts.download': 'İndir',
455
730
  'shortcuts.preview': 'Önizle',
456
- 'shortcuts.share': 'Paylaş / izinler',
731
+ 'shortcuts.share': 'Paylaş',
457
732
  'shortcuts.tags': 'Etiketler',
458
733
  'shortcuts.convert': 'Dönüştür',
459
734
  'shortcuts.open_tab': 'Yeni sekmede aç',
@@ -478,7 +753,7 @@ export const tr: Record<string, string> = {
478
753
  'dragout.downloading': 'Bırakılan klasöre indiriliyor…',
479
754
  'dragout.not_found': 'Bırakılan yer bulunamadı — dosya bir klasöre değil bir uygulamaya bırakıldıysa indirme yapılamaz',
480
755
  'dragout.done': 'İndirme tamamlandı',
481
- 'dragout.ready': 'Dosyalar hazır — masaüstüne sürükleyebilirsin',
756
+ 'dragout.ready': 'Dosyalar hazır — masaüstüne sürükleyebilirsiniz',
482
757
  'dragout.preparing': 'Sürükleme için hazırlanıyor…',
483
758
  'split.cross_move': 'Depolar farklı — taşıma kuyruğa alındı (baytlar aktarılıp kaynak silinir)',
484
759
  /* === /wiring:d1 === */
@@ -517,7 +792,7 @@ export const tr: Record<string, string> = {
517
792
  'e2e.locked.unlock': 'Kilidi aç',
518
793
  'e2e.locked.busy': 'Doğrulanıyor…',
519
794
  'e2e.unlock.wrong': 'Parola yanlış.',
520
- 'e2e.unlock.marker_missing': 'Şifre dosyası (.filex-e2e.json) okunamadı.',
795
+ 'e2e.unlock.marker_missing': 'Anahtar dosyası (.filex-e2e.json) okunamadı.',
521
796
  /* ikon:emoji — listedeki işaretin erişilebilir adı. Satır eskiden yalnız
522
797
  bir 🔒 basıyordu; onun yerini alan asma kilit kutunun içinde
523
798
  aria-hidden, dolayısıyla adı taşıyan yer bu. */
@@ -573,7 +848,7 @@ export const tr: Record<string, string> = {
573
848
  'e2e.recover.escrow_required': 'Emanet özel anahtarını yapıştırın.',
574
849
  'e2e.recover.wrong_recovery': 'Bu kurtarma anahtarı bu klasörü açmıyor.',
575
850
  'e2e.recover.wrong_escrow':
576
- 'Bu emanet anahtarı bu klasörü açmıyor. Escrow açılmadan önce oluşturulmuş klasörlerin emanet anahtarı yoktur ve sonradan da eklenemez.',
851
+ 'Bu emanet anahtarı bu klasörü açmıyor. Emanet açılmadan önce oluşturulmuş bir klasörün, sahibi izin verene kadar emanet anahtarı yoktur — o zamana kadar parolayı ya da kurtarma anahtarını kullanın.',
577
852
  'e2e.recover.bad_escrow_key': 'Bu okunabilir bir özel anahtar değil (PKCS#8, base64 ya da PEM bekleniyor).',
578
853
  'e2e.recover.notify_failed':
579
854
  'Klasör sahibine bildirim gönderilemedi, bu yüzden kilit açılmadı. Emanet anahtarının kullanımı her zaman duyurulur.',
@@ -620,48 +895,13 @@ export const tr: Record<string, string> = {
620
895
  "Base path" in the admin panel and something else in the desktop
621
896
  app would be the same drift this whole mechanism exists to stop. */
622
897
  'conn.title': 'Depo bağlantıları',
623
- 'conn.subtitle': '{host} sunucusunu bir arka uca bağlayın ya da kendi bilgisayarınızı {host} sunucusuna bağlayın.',
898
+ 'conn.subtitle': '{host} sunucusuna kendi bilgisayarınızdan nasıl erişilir: bağlayın ya da bir istemciyi buraya yönlendirin.',
624
899
  'conn.close': 'Kapat',
625
- 'conn.tab.storages': 'Depolar',
626
- 'conn.tab.connect': 'Nasıl bağlanılır',
627
- 'conn.loading': 'Yükleniyor…',
628
- 'conn.visibleOnly': 'bu depoya göz atabilirsiniz',
629
- 'conn.denied.title': 'Buraya depo ekleyebilen tek kişi yöneticidir',
630
- 'conn.denied.none': 'Hesabınız dosyalara göz atabilir ama bu sunucunun nereye bağlı olduğunu değiştiremez. Depo eklemek ya da düzenlemek için sunucunun yöneticisine başvurun.',
631
- 'conn.denied.anonymous': 'Bu sunucuda oturum açmış değilsiniz.',
632
- 'conn.denied.unreachable': 'Sunucu yanıt vermedi: {error}',
633
- 'conn.denied.guideHint': 'Zaten görebildiğiniz depolara kendi bilgisayarınızdan bağlanmak için yönetici yetkisi gerekmez.',
634
- 'conn.denied.guideCta': 'Nasıl bağlanacağımı göster',
635
- 'conn.list.count': '{n} depo',
636
- 'conn.list.count_one': '{n} depo',
637
- 'conn.list.add': 'Depo ekle',
638
- 'conn.list.empty': 'Henüz yapılandırılmış depo yok. Bir tane ekleyin, dosyalar dosya yöneticisinde görünsün.',
639
- 'conn.list.edit': 'Düzenle',
640
- 'conn.list.remove': 'Kaldır',
641
- 'conn.list.confirm': 'Gerçekten kaldırılsın mı?',
642
- 'conn.list.readOnly': 'salt okunur',
643
- 'conn.list.disabled': 'kapalı',
644
- 'conn.form.newTitle': 'Yeni depo',
645
- 'conn.form.editTitle': '“{name}” düzenleniyor',
646
- 'conn.form.name': 'Görünen isim',
647
- 'conn.form.namePlaceholder': 'fotograflar',
648
- 'conn.form.nameHelp': 'Bu deponun her yerdeki adı: dosya yöneticisinde, yollarda (isim://klasor) ve WebDAV adreslerinde.',
649
- 'conn.form.driver': 'Tür',
650
- 'conn.form.driverLocked': 'Bir deponun türü oluşturulduktan sonra değiştirilemez — yollar zaten ona işaret ediyor.',
651
- 'conn.form.readOnly': 'Salt okunur (bu depoya hiçbir şey yazılamaz)',
652
- 'conn.form.enabled': 'Etkin',
653
- 'conn.form.test': 'Bağlantıyı sına',
654
- 'conn.form.testing': 'Sınanıyor…',
655
- 'conn.form.testOk': 'Bağlandı. Kökte {count} öğe var.',
656
- 'conn.form.testOk_one': 'Bağlandı. Kökte {count} öğe var.',
657
- 'conn.form.testFail': 'Bağlanılamadı: {error}',
658
- 'conn.form.save': 'Kaydet',
659
- 'conn.form.saving': 'Kaydediliyor…',
660
- 'conn.form.cancel': 'Vazgeç',
661
- 'conn.form.nameRequired': 'Depoya bir isim verin.',
662
- 'conn.form.fillRequired': '* ile işaretli alanları doldurun.',
900
+ 'conn.list.disabled': 'Kapalı',
663
901
  'conn.form.required': 'Zorunlu',
664
902
  'conn.form.advanced': 'Gelişmiş ayarlar',
903
+ 'conn.form.yes': 'Evet',
904
+ 'conn.form.no': 'Hayır',
665
905
  'conn.form.noFields': 'Bu sunucu bu sürücü için hiçbir ayar tanımlamadı.',
666
906
  'conn.form.reveal': 'Göster',
667
907
  'conn.form.hide': 'Gizle',
@@ -672,15 +912,15 @@ export const tr: Record<string, string> = {
672
912
  'conn.guide.copied': 'Kopyalandı',
673
913
  'conn.guide.goodToKnow': 'Bilmekte fayda var',
674
914
  'conn.guide.userPlaceholder': 'eposta@ornek.com',
675
- 'conn.guide.secretPlaceholder': 'parolaniz-ya-da-token',
915
+ 'conn.guide.secretPlaceholder': 'parolanız-ya-da-api-anahtarınız',
676
916
  'conn.guide.fact.url': 'Adres',
677
917
  'conn.guide.fact.urlRootHint': 'Görebildiğiniz her depo bu adresin altında bir klasör olarak görünür.',
678
918
  'conn.guide.fact.urlStorageHint': 'Doğrudan “{storage}” deposunu bağlar. Son parçayı silerseniz tüm depoları görürsünüz.',
679
919
  'conn.guide.fact.user': 'Kullanıcı adı',
680
920
  'conn.guide.fact.password': 'Parola',
681
921
  'conn.guide.webdav.summary': 'WebDAV, filex’i bir sürücü gibi bağlar: Windows Gezgini, macOS Finder, Linux, rclone ve Cyberduck bu protokolü konuşur ve yapılan her değişiklik filex’e yansır.',
682
- 'conn.guide.webdav.userHint': 'filex hesabınızın e-posta adresi — görünen adınız değil.',
683
- 'conn.guide.webdav.passwordHint': 'Hesap parolanız ya da bir API token (Ayarlar → API token). İki adımlı doğrulaması açık bir hesap ZORUNLU olarak token kullanır: Basic kimlik doğrulamasında ikinci adım için yer yoktur.',
922
+ 'conn.guide.webdav.userHint': 'Kullanıcı adınız ya da e-postanız — görünen adınız değil.',
923
+ 'conn.guide.webdav.passwordHint': 'Hesap parolanız ya da bir API anahtarı (gezinti panelindeki API anahtarları bölümü). İki adımlı doğrulaması açık bir hesap ZORUNLU olarak API anahtarı kullanır: Basic kimlik doğrulamasında ikinci adım için yer yoktur.',
684
924
  'conn.guide.webdav.win.s1': 'Dosya Gezgini’ni açın, Bu bilgisayar’a sağ tıklayın ve “Ağ sürücüsü bağla…” deyin.',
685
925
  'conn.guide.webdav.win.s2': 'Bir sürücü harfi seçin ve klasör olarak {url} adresini girin.',
686
926
  'conn.guide.webdav.win.s3': '“Farklı kimlik bilgileri kullanarak bağlan” kutusunu işaretleyin ve yukarıdaki kullanıcı adı/parola ile girin.',
@@ -735,7 +975,7 @@ export const tr: Record<string, string> = {
735
975
  'conn.s3keys.revoke': 'İptal et',
736
976
  'conn.s3keys.confirm': 'Emin misiniz?',
737
977
  'conn.s3keys.empty': 'Henüz erişim anahtarı yok.',
738
- 'conn.guide.s3.summary': 'S3 ucu, S3 konuşan her şeyin — yedekleme, senkron araçları, SDK’lar — hedefi olarak filex’i kullanmanızı sağlar; hem de zaten sahip olduğunuz depolarla.',
978
+ 'conn.guide.s3.summary': 'S3 ucu, S3 konuşan her şeyin — yedekleme, eşitleme araçları, SDK’lar — hedefi olarak filex’i kullanmanızı sağlar; hem de zaten sahip olduğunuz depolarla.',
739
979
  'conn.guide.s3.keyPlaceholder': 'yukarıdan bir anahtar oluşturun',
740
980
  'conn.guide.s3.secretPlaceholder': 'anahtarı oluştururken bir kez gösterilir',
741
981
  'conn.guide.s3.fact.endpoint': 'Uç adresi',
@@ -765,7 +1005,7 @@ export const tr: Record<string, string> = {
765
1005
  'conn.guide.s3.mc.useCaption': 'Kullanımı',
766
1006
  'conn.guide.s3.s3fs.credsCaption': 'Kimlik dosyası',
767
1007
  'conn.guide.s3.s3fs.mountCaption': 'Bağlayın',
768
- 'conn.guide.s3.s3fs.note': 's3fs üzerinden bir dosyayı düzenlemek nesnenin tamamını yeniden yazar; silme ise filex çöpüne gider. Paylaşılan bir klasör için iyi, veritabanı için değil.',
1008
+ 'conn.guide.s3.s3fs.note': 's3fs üzerinden bir dosyayı düzenlemek nesnenin tamamını yeniden yazar; silme ise filex çöp kutusuna gider. Paylaşılan bir klasör için iyi, veritabanı için değil.',
769
1009
  'conn.guide.s3.duck.s1': 'Yeni yer imi → Amazon S3.',
770
1010
  'conn.guide.s3.duck.s2': 'Sunucu: {host}.',
771
1011
  'conn.guide.s3.duck.s3': 'Erişim anahtarı kimliği: {key}, gizli anahtar yukarıdaki.',
@@ -774,7 +1014,7 @@ export const tr: Record<string, string> = {
774
1014
  'conn.guide.s3.sdk.note': 'SigV4 konuşan her istemci aynı şekilde çalışır: uç adresi, anahtar, gizli anahtar ve bu kurulumun kendi S3 alan adı yoksa yol tabanlı adresleme.',
775
1015
  'conn.guide.s3.note.buckets': 'Kova = filex deposu. İstemci kovanın İÇİNDE klasör ve nesne oluşturabilir, ama kovanın kendisini oluşturamaz: kova bir sürücü ve bir yol ister, bunu bir S3 isteği ifade edemez.',
776
1016
  'conn.guide.s3.note.permissions': 'Anahtar tam olarak sizin gördüğünüzü görür. Açamayacağınız bir kova "yasak" değil "böyle bir kova yok" der; böylece uç, neyin var olduğunu sızdırmaz.',
777
- 'conn.guide.s3.note.trash': 'Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.',
1017
+ 'conn.guide.s3.note.trash': 'Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.',
778
1018
  'conn.guide.s3.note.mtime': 'Yüklemeler değişiklik zamanını taşır; istemcinin gönderdiği sağlama toplamları (Content-MD5, x-amz-checksum-*) doğrulanır — bozulmuş bir yükleme saklanmaz, reddedilir.',
779
1019
  'conn.guide.s3.note.pathStyle': 'Bu kurulumda S3’e ayrılmış alan adı yok; istemcilere yol tabanlı adresleme söylenmeli. Söylenmezse güncel bir SDK, ne filex’i ne de sebebi anan bir DNS hatasıyla düşer.',
780
1020
  'conn.guide.s3.note.http': 'Bu uç düz http://. İmzalar isteği yine korur ama nesneler açık metin gider. Bir yedeği buraya yöneltmeden önce filex’i TLS arkasına alın.',
@@ -786,7 +1026,7 @@ export const tr: Record<string, string> = {
786
1026
  'conn.sshkeys.paste': '~/.ssh/id_ed25519.pub dosyasının içeriğini yapıştırın',
787
1027
  'conn.sshkeys.name': 'Ad (isteğe bağlı — boşsa anahtarın kendi yorumu kullanılır)',
788
1028
  'conn.sshkeys.add': 'Anahtar ekle',
789
- 'conn.sshkeys.noCopyId': 'ssh-copy-id burada çalışamaz: kabuk üzerinden ~/.ssh/authorized_keys dosyasına ekler, filex’in kabuğu yoktur. Giriş yolu bu kutudur.',
1029
+ 'conn.sshkeys.noCopyId': 'ssh-copy-id burada çalışamaz: kabuk üzerinden ~/.ssh/authorized_keys dosyasına ekler, filex’in kabuğu yoktur. Anahtar eklemenin yolu bu kutudur.',
790
1030
  'conn.sshkeys.col.name': 'Ad',
791
1031
  'conn.sshkeys.col.fingerprint': 'Parmak izi',
792
1032
  'conn.sshkeys.col.added': 'Eklendi',
@@ -797,17 +1037,17 @@ export const tr: Record<string, string> = {
797
1037
  'conn.sshkeys.disable': 'Kapat',
798
1038
  'conn.sshkeys.remove': 'Sil',
799
1039
  'conn.sshkeys.confirm': 'Emin misiniz?',
800
- 'conn.sshkeys.empty': 'Henüz anahtar yok. Anahtarsız istemciler hesap parolanızla giriş yapar.',
1040
+ 'conn.sshkeys.empty': 'Henüz anahtar yok. Anahtarsız istemciler hesap parolanızla oturum açar.',
801
1041
  'conn.guide.sftp.summary': 'SFTP, filex’i SSH konuşan her şeyin erişebileceği hâle getirir: bir yedekleme işi, bir tarayıcı, WinSCP, rclone ya da bağlanmış bir klasör.',
802
1042
  'conn.guide.sftp.fact.host': 'Sunucu',
803
1043
  'conn.guide.sftp.fact.hostHint': 'Web uygulamasıyla aynı makine, kendine ait bir portta.',
804
1044
  'conn.guide.sftp.fact.port': 'Port',
805
1045
  'conn.guide.sftp.fact.portHint': 'Ne 22 ne 443: SFTP ham TCP’dir, web vekilinin içinden geçemez.',
806
- 'conn.guide.sftp.fact.userHint': 'Kısa giriş adınız. Giriş adındaki @ işareti çoğu istemcinin ayar dosyasında tırnaklanmak zorundadır; bu alan tam da onu ortadan kaldırır.',
807
- 'conn.guide.sftp.fact.auth': 'Giriş yöntemi',
1046
+ 'conn.guide.sftp.fact.userHint': 'Kullanıcı adınız. İçinde @ işareti olsaydı çoğu istemcinin ayar dosyasında tırnaklanması gerekirdi; kullanıcı adı tam da bunu ortadan kaldırır.',
1047
+ 'conn.guide.sftp.fact.auth': 'Oturum açma yöntemi',
808
1048
  'conn.guide.sftp.fact.authKey': 'kayıtlı SSH anahtarınız (ya da parolanız)',
809
1049
  'conn.guide.sftp.fact.authPassword': 'hesap parolanız — ya da yukarıdan bir anahtar kaydedin',
810
- 'conn.guide.sftp.fact.authHint': 'API token da parola yerine geçer ve tek başına iptal edilebilir. İki adımlı doğrulaması açık bir hesap anahtar ya da token kullanmalıdır.',
1050
+ 'conn.guide.sftp.fact.authHint': 'API anahtarı da parola yerine geçer ve tek başına iptal edilebilir. İki adımlı doğrulaması açık bir hesap SSH anahtarı ya da API anahtarı kullanmalıdır.',
811
1051
  'conn.guide.sftp.fact.path': 'Yol',
812
1052
  'conn.guide.sftp.fact.pathHint': 'İlk klasör bir depodur; kök, açabildiğiniz depoları listeler.',
813
1053
  'conn.guide.sftp.openssh.connectCaption': 'Bağlan, gönder, al',
@@ -830,8 +1070,8 @@ export const tr: Record<string, string> = {
830
1070
  'conn.guide.sftp.sshfs.note': 'Bağlanmış bir klasörde her kayıt dosyanın tamamını yeniden yazar. Belgeler için iyi; veritabanı ya da yerinde düzenlediğiniz bir video için değil.',
831
1071
  'conn.guide.sftp.note.storages': 'Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.',
832
1072
  'conn.guide.sftp.note.permissions': 'İstemcinizin çizdiği izin bitleri buradaki erişim seviyenizden gelir; yani salt-okunur görünen bir dosya sizin için gerçekten öyledir.',
833
- 'conn.guide.sftp.note.trash': 'Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.',
834
- 'conn.guide.sftp.note.totp': 'Hesabınızda iki adımlı doğrulama açıksa parola burada çalışmaz — SSH’ın kodu soracak bir kanalı yok. Bir anahtar kaydedin ya da parola yerine API token kullanın.',
1073
+ 'conn.guide.sftp.note.trash': 'Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.',
1074
+ 'conn.guide.sftp.note.totp': 'Hesabınızda iki adımlı doğrulama açıksa parola burada çalışmaz — SSH’ın kodu soracak bir kanalı yok. Bir SSH anahtarı kaydedin ya da parola yerine API anahtarı kullanın.',
835
1075
  'conn.guide.sftp.note.disabled': 'Bu sunucuda SFTP ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.',
836
1076
  // ── FTPS ─────────────────────────────────────────────────────────
837
1077
  'conn.guide.ftps.summary': 'FTPS, yalnızca FTP öğrenmiş ekipman için var: tarayıp-klasöre-atan yazıcılar, EDI muhatapları, eski laboratuvar ve endüstri yazılımları. Her zaman TLS üzerinden.',
@@ -842,8 +1082,8 @@ export const tr: Record<string, string> = {
842
1082
  'conn.guide.ftps.fact.mode': 'Şifreleme',
843
1083
  'conn.guide.ftps.fact.modeValue': 'FTPS — açık (explicit) TLS, zorunlu',
844
1084
  'conn.guide.ftps.fact.modeHint': 'Düz FTP, parola okunmadan reddedilir. "Require explicit FTP over TLS" seçin; "plain FTP" ya da "implicit" asla.',
845
- 'conn.guide.ftps.fact.userHint': 'Kısa giriş adınız ya da e-postanız. Parola yerine API token da geçer ve tek başına iptal edilebilir.',
846
- 'conn.guide.ftps.fact.passwordHint': 'Hesap parolanız ya da bir API token. İki adımlı doğrulaması açık hesap token kullanmalıdır — FTP\'nin kodu soracak bir yolu yok.',
1085
+ 'conn.guide.ftps.fact.userHint': 'Kullanıcı adınız ya da e-postanız. Parola yerine bir API anahtarı da kullanılabilir ve tek başına iptal edilebilir.',
1086
+ 'conn.guide.ftps.fact.passwordHint': 'Hesap parolanız ya da bir API anahtarı. İki adımlı doğrulaması açık bir hesap API anahtarı kullanmalıdır — FTP\'nin kodu soracak bir yolu yok.',
847
1087
  'conn.guide.ftps.fact.pasv': 'Pasif portlar',
848
1088
  'conn.guide.ftps.fact.pasvHint': 'Veri bağlantıları buraya düşer. Güvenlik duvarınız bu aralığı kapatıyorsa aktarım iki tarafta da hata vermeden ASILI KALIR — FTP\'nin klasik arızası budur.',
849
1089
  'conn.guide.ftps.filezilla.s1': 'Dosya → Site Yöneticisi → Yeni site, Protokol: FTP.',
@@ -856,18 +1096,18 @@ export const tr: Record<string, string> = {
856
1096
  'conn.guide.ftps.curl.caption': 'Gönder ve al',
857
1097
  'conn.guide.ftps.curl.sslReqd': '--ssl-reqd isteğe bağlı değil: curl\'ün düz metne geri düşmek yerine TLS\'i ZORUNLU kılmasını sağlar. Bu sunucu zaten düz metni reddediyor, ama alışkanlık sizi reddetmeyen sunuculara karşı korur.',
858
1098
  'conn.guide.ftps.lftp.caption': 'Bağlan',
859
- 'conn.guide.ftps.lftp.protectData': 'ssl-protect-data yalnız girişi değil DOSYAYI da şifreler. Olmazsa lftp TLS ile giriş yapar ve dosyayı açık metin gönderir — sahada en sık yapılan FTPS yanlışı budur.',
1099
+ 'conn.guide.ftps.lftp.protectData': 'ssl-protect-data yalnız oturum açmayı değil DOSYAYI da şifreler. Olmazsa lftp TLS ile oturum açar ve dosyayı açık metin gönderir — sahada en sık yapılan FTPS yanlışı budur.',
860
1100
  'conn.guide.ftps.rclone.useCaption': 'Kullanımı',
861
1101
  'conn.guide.ftps.printer.tab': 'Tarayıcı / yazıcı',
862
1102
  'conn.guide.ftps.printer.s1': 'Cihazın tara-ve-FTP\'ye-gönder ayarlarında: sunucu {host}, port {port}.',
863
- 'conn.guide.ftps.printer.s2': 'Kullanıcı: {user}, parola yukarıdaki. Cihaz için kendi parolanız yerine bir API token üretin — başka hiçbir şeyi değiştirmeden iptal edilebilir.',
1103
+ 'conn.guide.ftps.printer.s2': 'Kullanıcı: {user}, parola yukarıdaki. Cihaz için kendi parolanız yerine bir API anahtarı oluşturun — başka hiçbir şeyi değiştirmeden iptal edilebilir.',
864
1104
  'conn.guide.ftps.printer.s3': 'Yol: {path} — ya da önceden oluşturduğunuz bir alt klasör. Cihaz depo oluşturamaz.',
865
1105
  'conn.guide.ftps.printer.s4': '"SSL/TLS" ya da "FTPS explicit" seçeneğini AÇIN ve PASİF modu seçin.',
866
1106
  'conn.guide.ftps.printer.noTLS': 'Tara-ve-gönder yazılımlarının önemli bir kısmı TLS konuşamıyor. Bu sunucu öyle bir cihazla konuşmayacak ve bu bilinçli: alternatifi, belgelerinizin ve parolanızın ofis ağında açık metin dolaşması.',
867
1107
  'conn.guide.ftps.note.tls': 'TLS zorunludur ve kapatan bir düğme yoktur. Düz FTP parolanızı açık metin gönderir, ardından dosyanızı da.',
868
1108
  'conn.guide.ftps.note.passive': 'Yalnızca pasif mod. Aktif modda sunucu istemciyi geri arar; bu NAT arkasında çalışmaz ve çoğu güvenlik duvarı tarafından engellenir.',
869
1109
  'conn.guide.ftps.note.storages': 'Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.',
870
- 'conn.guide.ftps.note.trash': 'Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.',
1110
+ 'conn.guide.ftps.note.trash': 'Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.',
871
1111
  'conn.guide.ftps.note.prefer': 'İstemci SFTP konuşabiliyorsa onu tercih edin: tek bağlantı, tek port, pasif mod sürprizi yok.',
872
1112
  'conn.guide.ftps.note.selfSigned': 'Bu sunucu kendinden imzalı bir sertifika kullanıyor. Kanalı şifreler ama karşı tarafın kim olduğunu kanıtlamaz; çoğu istemci bir kez onay ister. Önemli bir iş için gerçek sertifika koyun.',
873
1113
  'conn.guide.ftps.note.disabled': 'Bu sunucuda FTPS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.',
@@ -928,46 +1168,46 @@ export const tr: Record<string, string> = {
928
1168
  'conn.guide.nfs.note.pathIsSecret': 'Export yolu kimlik bilgisinin tamamıdır. Sızarsa yukarıdaki listeden iptal edin; değiştirilecek başka bir şey yok.',
929
1169
  'conn.guide.nfs.note.noPortmapper': '111 portunda portmapper yok; portu söylenmeyen istemci sunucuyu bulamaz. Buradaki her komutun port= ve mountport= taşımasının sebebi bu.',
930
1170
  'conn.guide.nfs.note.uid': 'İstemcinizin gönderdiği kullanıcı ve grup kimlikleri yok sayılır: bağlantı zaten kime ait olduğunu biliyor. Gördüğünüz izinler filex\'teki erişiminizden gelir.',
931
- 'conn.guide.nfs.note.trash': 'Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.',
1171
+ 'conn.guide.nfs.note.trash': 'Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.',
932
1172
  'conn.guide.nfs.note.revoke': 'İptal anında değil, bir sonraki istekte etkili olur: NFS\'te sonlandırılacak bir oturum yok, bağlantısı açık olan istemci sıradaki işleminde hata alır.',
933
1173
  'conn.guide.nfs.note.disabled': 'Bu sunucuda NFS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.',
934
- 'conn.tokens.title': 'API jetonları',
935
- 'conn.tokens.lead': 'FTPS, WebDAV ve filex mount hesap parolanız yerine bir jetonla giriş yapar. Buradan üretin — tek başına iptal edilebilir, ayrıca iki adımlı doğrulaması açık bir hesap bunlarda parolasını zaten kullanamaz.',
936
- 'conn.tokens.mint': 'Jeton oluştur',
1174
+ 'conn.tokens.title': 'API anahtarları',
1175
+ 'conn.tokens.lead': 'FTPS, WebDAV ve filex mount hesap parolanız yerine bir API anahtarıyla oturum açar. Buradan oluşturun — tek başına iptal edilebilir, ayrıca iki adımlı doğrulaması açık bir hesap bunlarda parolasını zaten kullanamaz.',
1176
+ 'conn.tokens.mint': 'API anahtarı oluştur',
937
1177
  'conn.tokens.once': 'Şimdi kopyalayın — yalnızca bir kez gösterilir. Sunucuda yalnız özeti saklandığı için bir daha gösterilemez.',
938
1178
  'conn.tokens.dismiss': 'Kopyaladım',
939
- 'conn.tokens.cannotMint': 'Bu oturum jeton üretemiyor. Kendi hesabınızla giriş yapıp oluşturun.',
940
- 'conn.tokens.empty': 'Henüz jeton yok.',
1179
+ 'conn.tokens.cannotMint': 'Bu oturum API anahtarı oluşturamıyor. Kendi hesabınızla oturum açıp oluşturun.',
1180
+ 'conn.tokens.empty': 'Henüz API anahtarı yok.',
941
1181
  'conn.tokens.neverUsed': 'hiç',
942
1182
  'conn.tokens.revoke': 'İptal et',
943
- 'conn.tokens.confirm': 'Emin misin?',
1183
+ 'conn.tokens.confirm': 'Emin misiniz?',
944
1184
  'conn.tokens.col.label': 'Ad',
945
- 'conn.tokens.col.scopes': 'Yetkisi',
1185
+ 'conn.tokens.col.scopes': 'İzinler',
946
1186
  'conn.tokens.col.used': 'Son kullanım',
947
- 'conn.tokens.revokeHint': 'İptal, yalnız bir sonraki girişi değil AÇIK bağlantıyı da durdurur: SFTP ya da FTPS oturumu kesilir, bağlı bir sürücü yarım dakika içinde çalışmayı bırakır.',
1187
+ 'conn.tokens.revokeHint': 'İptal, yalnız bir sonraki oturum açmayı değil AÇIK bağlantıyı da durdurur: SFTP ya da FTPS oturumu kesilir, bağlı bir sürücü yarım dakika içinde çalışmayı bırakır.',
948
1188
  'conn.guide.mount.summary': 'filex mount, uzaktaki bir filex sunucusunu bu makinede bir klasöre bağlar — tarayıcının kullandığı aynı HTTPS üzerinden. Buradakilerin her yerden çalışan tek yöntemi: yerel ağ da gerekmez, ek sunucu da, üçüncü parti bir istemci de.',
949
1189
  'conn.guide.mount.fact.url': 'Sunucu adresi',
950
1190
  'conn.guide.mount.fact.urlHint': 'Tarayıcıda kullandığınız adresin aynısı. Başka hiçbir şeye erişilebilir olması gerekmez.',
951
- 'conn.guide.mount.fact.token': 'API jetonu',
952
- 'conn.guide.mount.fact.tokenPlaceholder': 'Jetonlar bölümünden oluşturun',
953
- 'conn.guide.mount.fact.tokenHint': 'Parolanız değil, jeton — tek başına iptal edilebilir, ayrıca 2FA açık bir hesap burada parolasını zaten kullanamaz.',
1191
+ 'conn.guide.mount.fact.token': 'API anahtarı',
1192
+ 'conn.guide.mount.fact.tokenPlaceholder': 'API anahtarları bölümünden oluşturun',
1193
+ 'conn.guide.mount.fact.tokenHint': 'Parolanız değil, bir API anahtarı — tek başına iptal edilebilir, ayrıca 2FA açık bir hesap burada parolasını zaten kullanamaz.',
954
1194
  'conn.guide.mount.fact.remote': 'Neyi bağlayacağınız',
955
1195
  'conn.guide.mount.fact.remoteHint': '--remote vermezseniz her depo bir klasör olarak görünür; tek bir depoyu — ya da onun içindeki bir klasörü — adlandırırsanız yalnızca o bağlanır.',
956
1196
  'conn.guide.mount.linux.mountCaption': 'Bağlayın',
957
1197
  'conn.guide.mount.linux.umountCaption': 'Ayırın',
958
1198
  'conn.guide.mount.linux.umountWarn': 'Süreci öldürerek değil, fusermount ile ayırın. Ayrılmadan ölen bir bağlantı, birileri elle fusermount çalıştırana kadar her ls komutunun asılı kaldığı bir klasör bırakır.',
959
- 'conn.guide.mount.linux.systemdCaption': 'Girişte otomatik bağlansın (systemd kullanıcı birimi)',
1199
+ 'conn.guide.mount.linux.systemdCaption': 'Oturum açılınca otomatik bağlansın (systemd kullanıcı birimi)',
960
1200
  'conn.guide.mount.win.winfsp': "Windows'ta bir kez WinFsp kurulması gerekiyor — ücretsiz ve açık kaynak: https://winfsp.dev. Başka bir şey gerekmiyor, sonrasında yönetici hakkı da istemiyor.",
961
1201
  'conn.guide.mount.win.mountCaption': 'Sürücü olarak bağlayın',
962
1202
  'conn.guide.mount.win.freeLetter': 'BOŞ bir sürücü harfi seçin. Harf bağlama sırasında oluşturulur, var olan bir şeye eklenmez; kullanımdaki bir harfi verirseniz bunu söylemeyen bir hatayla başarısız olur.',
963
1203
  'conn.guide.mount.win.stop': 'O pencerede Ctrl-C ile durdurun. Sürücü kaybolur ve bu makinede hiçbir şey kalmaz.',
964
1204
  'conn.guide.mount.mac.unsupported': "filex mount macOS'ta çalışmıyor. macFUSE gerekiyor; lisansı filex gibi bir programın onu sizin yerinize kurmasına izin vermiyor ve Go bağlaması filex'in bilinçli olarak kullanmadığı bir C derleyicisi istiyor. Komut burada çalışıyormuş gibi görünüp hiçbir şey yapmak yerine açıkça reddediyor.",
965
- 'conn.guide.mount.mac.alternatives': "macOS'ta filex masaüstü uygulamasını klasör senkronuyla kullanın (dosyalar diskte durur) ya da sürücü bağlayabilen bir istemciyle SFTP.",
966
- 'conn.guide.mount.note.notASync': 'Bu bir senkronizasyon değildir. Küçük bir okuma önbelleği dışında bu makineye hiçbir şey kopyalanmaz; yüz bin dosyanın içinden birini gerisini indirmeden açar. Dosyaları çevrimdışıyken istiyorsanız klasör senkronunu kullanın.',
1205
+ 'conn.guide.mount.mac.alternatives': "macOS'ta filex masaüstü uygulamasını klasör eşitlemesiyle kullanın (dosyalar diskte durur) ya da sürücü bağlayabilen bir istemciyle SFTP.",
1206
+ 'conn.guide.mount.note.notASync': 'Bu bir eşitleme değildir. Küçük bir okuma önbelleği dışında bu makineye hiçbir şey kopyalanmaz; yüz bin dosyanın içinden birini gerisini indirmeden açar. Dosyaları çevrimdışıyken istiyorsanız klasör eşitlemesini kullanın.',
967
1207
  'conn.guide.mount.note.reachable': 'Sunucuya, tarayıcının geçtiği hangi vekil ya da tünel varsa oradan ulaşır — çünkü altında aynı API vardır. İzinleriniz, depolarınız ve çok kiracılı bir sunucuda kiracınız da birlikte gelir.',
968
1208
  'conn.guide.mount.note.wholeFileWrites': 'Bağlantı üzerinden yazdığınız dosya, yazılırken değil, program onu kapattığında yüklenir. Çok büyük bir dosyayı yerinde düzenlemek burada yerel diskten yavaştır; içeri ve dışarı kopyalamak değildir.',
969
1209
  'conn.guide.mount.note.trash': 'Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.',
970
- 'conn.guide.mount.note.revoke': 'Bir bağlantıyı durdurmak için jetonu iptal edin. Bağlantı hâlâ takılı olsa bile yarım dakika içinde hizmet vermeyi bırakır.',
1210
+ 'conn.guide.mount.note.revoke': 'Bir bağlantıyı durdurmak için API anahtarını iptal edin. Bağlantı hâlâ takılı olsa bile yarım dakika içinde hizmet vermeyi bırakır.',
971
1211
  'storages.driver.ftp': 'FTP / FTPS',
972
1212
  'storages.driver.local': 'Yerel dosya sistemi',
973
1213
  'storages.driver.s3': 'S3 / Hetzner / MinIO',
@@ -992,22 +1232,22 @@ export const tr: Record<string, string> = {
992
1232
  'storages.fieldHelp.passive': 'Kapatmak aktif moda geçirir; bu, sunucunun bu makineye geri bağlanmasını gerektirir.',
993
1233
  'storages.fieldHelp.path': 'Sunucudaki dizin. Yoksa oluşturulur; filex asla / dizinini mount etmez.',
994
1234
  'storages.fieldHelp.pathStyle': 'AWS dışındaki tüm depolarda açık olmalı. Endpoint girildiyse ve bu alana hiç dokunulmadıysa kendiliğinden açılır.',
995
- 'storages.fieldHelp.prefix': 'Bucket içindeki alt klasör. Zorunlu: filex bucket kökünün sahipliğini asla almaz.',
1235
+ 'storages.fieldHelp.prefix': 'Kova içindeki alt klasör. Zorunlu: filex kova kökünün sahipliğini asla almaz.',
996
1236
  'storages.fieldHelp.region': 'Boş bırakılırsa "auto" kullanılır.',
997
1237
  'storages.fieldHelp.root': 'Arka uçtaki alt klasör. Zorunlu: filex hesabın kökünü asla mount etmez.',
998
1238
  'storages.fieldHelp.sftpAuth': 'Parola ya da özel anahtardan biri zorunludur.',
999
1239
  'storages.fieldHelp.tls': 'Düz FTP kimlik bilgilerini açık metin gönderir — sunucu destekliyorsa açın.',
1000
1240
  'storages.fields.accessKey': 'Access key',
1001
1241
  'storages.fields.basePath': 'Temel yol',
1002
- 'storages.fields.bucket': 'Bucket',
1003
- 'storages.fields.disablePresign': 'İmzalı URL\'leri kapat',
1242
+ 'storages.fields.bucket': 'Kova',
1243
+ 'storages.fields.disablePresign': 'Aktarımları filex üzerinden geçir',
1004
1244
  'storages.fields.endpoint': 'Endpoint',
1005
1245
  'storages.fields.host': 'Sunucu',
1006
1246
  'storages.fields.hostKey': 'Sabitlenmiş sunucu anahtarı',
1007
1247
  'storages.fields.insecureSkipHostKey': 'Sunucu anahtarı doğrulamasını atla (güvensiz)',
1008
1248
  'storages.fields.keyPath': 'Özel anahtar dosyası',
1009
1249
  'storages.fields.knownHosts': 'known_hosts dosyası',
1010
- 'storages.fields.name': 'Görünen isim',
1250
+ 'storages.fields.name': 'Görünen ad',
1011
1251
  'storages.fields.namePlaceholder': 'Kişisel fotoğraflar',
1012
1252
  'storages.fields.passive': 'Pasif mod (PASV)',
1013
1253
  'storages.fields.password': 'Parola',
@@ -1036,7 +1276,9 @@ export const tr: Record<string, string> = {
1036
1276
  'sidenav.recent': 'Son kullanılanlar',
1037
1277
  'sidenav.starred': 'Yıldızlılar',
1038
1278
  'sidenav.shared': 'Benimle paylaşılanlar',
1039
- 'sidenav.trash': 'Çöp Kutusu',
1279
+ // Üstteki satırın aynası ve tam altında durur: gelen ile giden.
1280
+ 'sidenav.myshares': 'Paylaştıklarım',
1281
+ 'sidenav.trash': 'Çöp kutusu',
1040
1282
  'sidenav.collapse': 'Gezintiyi daralt',
1041
1283
  'sidenav.expand': 'Gezintiyi genişlet',
1042
1284
  'sidenav.close': 'Gezintiyi kapat',
@@ -1059,19 +1301,22 @@ export const tr: Record<string, string> = {
1059
1301
  'node.starred': 'Yıldızlılar',
1060
1302
  'node.shared': 'Benimle paylaşılanlar',
1061
1303
  'empty.recent.title': 'Henüz hiçbir şey açılmadı',
1062
- 'empty.recent.hint': 'Açtığın dosyalar burada görünür',
1304
+ 'empty.recent.hint': 'Açtığınız dosyalar burada görünür',
1063
1305
  'empty.starred.title': 'Henüz yıldızlı dosya yok',
1064
- 'empty.starred.hint': 'Bir dosyayı yıldızla, burada bulasın',
1065
- 'empty.shared.title': 'Seninle henüz bir şey paylaşılmadı',
1306
+ 'empty.starred.hint': 'Bir dosyayı yıldızlayın; burada bulursunuz',
1307
+ 'empty.shared.title': 'Sizinle henüz bir şey paylaşılmadı',
1066
1308
  'empty.shared.hint': 'Başkalarının paylaştığı klasör ve dosyalar burada görünür',
1067
1309
  /* etiket:t1 */
1068
1310
  'sidenav.tags': 'Etiketler',
1069
- 'sidenav.tags.empty': 'Henüz etiket yok — bir dosyaya sağ tıklayıp Etiketler’den ekleyebilirsin.',
1311
+ 'sidenav.tags.empty': 'Henüz etiket yok — bir dosyaya sağ tıklayıp Etiketler’den ekleyebilirsiniz.',
1070
1312
  'sidenav.tags.more': '{count} tane daha göster',
1071
1313
  'sidenav.tags.less': 'Daha az göster',
1314
+ 'sidenav.tags.personal': 'Kişisel',
1315
+ 'sidenav.tags.team': 'Ekip',
1072
1316
  'empty.tag.title': '“{tag}” etiketli hiçbir şey yok',
1073
- 'empty.tag.hint': 'Bir dosyaya sağ tıklayıp Etiketler’i seç, burada görünsün',
1317
+ 'empty.tag.hint': 'Bir dosyaya sağ tıklayıp Etiketler’i seçin; dosya burada görünür',
1074
1318
  'sidenav.connections': 'Bağlantılar',
1319
+ 'sidenav.apps': 'Uygulamalar',
1075
1320
  'sidenav.connect': 'Nasıl bağlanılır',
1076
1321
  'sidenav.apikeys': 'API anahtarları',
1077
1322
  'overlay.close': 'Kapat',
@@ -1082,7 +1327,8 @@ export const tr: Record<string, string> = {
1082
1327
  'conn.tokens.expiryNever': 'süresiz',
1083
1328
  'conn.tokens.defaultName': 'API anahtarı {date}',
1084
1329
  'conn.tokens.namePlaceholder': 'Ad — ör. yedekleme betiği',
1085
- 'conn.tokens.capNote': 'Tavan hesabın ve yetkilerin — sahip olduğundan fazlasını istemek reddedilir, verilmez.',
1330
+ 'conn.tokens.capNote': 'Tavan kendi erişiminizdir — sahip olmadığınız bir izin reddedilir, verilmez.',
1331
+ 'conn.tokens.scopesRequired': 'En az bir izin seçin — hiçbir izni olmayan bir API anahtarı verilmez.',
1086
1332
  /* === /gezinti:g1 === */
1087
1333
 
1088
1334
  /* === surucu:d1 — kabuk (GitHub #14); artık `uiProfile: 'drive'` ile
@@ -1103,8 +1349,11 @@ export const tr: Record<string, string> = {
1103
1349
  'newdoc.group.document': 'Belgeler',
1104
1350
  'newdoc.group.text': 'Metin ve kod',
1105
1351
  'newdoc.group.diagram': 'Çizimler',
1106
- 'newdoc.withheld.onlyoffice': 'Ofis belgeleri için bir belge sunucusu (OnlyOffice) gerekir; burada tanımlı değil.',
1107
- 'newdoc.withheld.drawio': 'Çizimler için drawio servisi gerekir; burada tanımlı değil.',
1352
+ /* ⚠ Her servisin tek adı, kendi projesinin kullandığı ad: draw.io
1353
+ ("drawio" ya da "diagrams.net" değil) ve ONLYOFFICE. */
1354
+ 'newdoc.withheld.onlyoffice': 'Ofis belgeleri için bir belge sunucusu (ONLYOFFICE) gerekir; burada kurulu değil.',
1355
+ 'newdoc.withheld.drawio': 'Çizimler için draw.io gerekir; burada kurulu değil.',
1356
+ 'newdoc.withheld_admin': 'Yönetim panelinde Dış servisler altından kurabilirsiniz.',
1108
1357
  'newdoc.empty.title': 'Kullanılabilir belge türü yok',
1109
1358
  'newdoc.empty.body': 'Bu sunucu, bu uygulamanın oluşturabileceği bir tür sunmadı.',
1110
1359
  'newdoc.empty.blocked': 'Bu sunucunun oluşturabildiği her tür, burada tanımlı olmayan bir düzenleyici servisine bağlı.',
@@ -1134,10 +1383,10 @@ export const tr: Record<string, string> = {
1134
1383
  * ayırmanın yoludur. Aşağıda yalnızca başka hiçbir yerde olmayanlar var. */
1135
1384
  'home.title': 'Ana sayfa',
1136
1385
  'home.storages.empty': 'Henüz depo yok',
1137
- 'home.storages.hint': 'Depo, filex’in okuyup yazdığı sürücüdür — depoları yönetici ekler.',
1386
+ 'home.storages.hint': 'Depo, filex’in okuyup yazdığı yerdir — depoları yönetici ekler.',
1138
1387
  'drive.section.folders': 'Klasörler',
1139
1388
  'drive.section.files': 'Dosyalar',
1140
- 'filter.aria': 'Süzgeçler',
1389
+ 'filter.aria': 'Filtreler',
1141
1390
  'filter.type': 'Tür',
1142
1391
  'filter.type.any': 'Her tür',
1143
1392
  'filter.type.folder': 'Klasörler',
@@ -1168,16 +1417,16 @@ export const tr: Record<string, string> = {
1168
1417
  `shortcuts.select_all`, `selection.clear`) — bir komutu yeniden adlandıran
1169
1418
  menü, okuyucuya aynı şeyi iki kez öğretir. */
1170
1419
  'filter.actions': 'Liste işlemleri',
1171
- 'filter.clear': 'Süzgeçleri temizle',
1172
- 'filter.empty.title': 'Bu süzgeçlere uyan bir şey yok',
1173
- 'filter.empty.hint': 'Bir süzgeci kaldır ya da yukarıdaki alandan her yerde ara.',
1420
+ 'filter.clear': 'Filtreleri temizle',
1421
+ 'filter.empty.title': 'Bu filtrelere uyan bir şey yok',
1422
+ 'filter.empty.hint': 'Bir filtreyi kaldırın ya da yukarıdaki alandan her yerde arayın.',
1174
1423
  'filter.count': '{total} öğeden {shown} tanesi',
1175
1424
  'inspector.tab.details': 'Ayrıntılar',
1176
1425
  'inspector.tab.activity': 'Etkinlik',
1177
1426
  'inspector.people': 'Erişimi olan kişiler',
1178
- 'inspector.people.you': 'Sen',
1427
+ 'inspector.people.you': 'Siz',
1179
1428
  'inspector.people.inherited': 'üst klasörden',
1180
- 'inspector.people.empty': 'Yalnızca sen ve aşağıdaki bağlantıya sahip olanlar.',
1429
+ 'inspector.people.empty': 'Yalnızca siz ve aşağıdaki bağlantıya sahip olanlar.',
1181
1430
  'inspector.people.manage': 'Erişimi yönet',
1182
1431
  'inspector.link': 'Paylaşım bağlantısı',
1183
1432
  'inspector.link.none': 'Paylaşılmadı',
@@ -1187,12 +1436,14 @@ export const tr: Record<string, string> = {
1187
1436
  'inspector.activity.hint': 'Sürümler dosya değiştikçe, yorumlar ise insanlar yazdıkça birikir.',
1188
1437
  'inspector.activity.version': '{n}. sürüm kaydedildi',
1189
1438
  'inspector.activity.comment': '{who} yorum yaptı',
1190
- 'inspector.activity.select': 'Etkinliğini görmek için bir dosya ya da klasör seç.',
1439
+ 'inspector.activity.select': 'Etkinliğini görmek için bir dosya ya da klasör seçin.',
1191
1440
  /* === /surucu:d1 === */
1192
1441
  /* i18n:hardcoded — dönüştürme kutusunda hiç anahtar yoktu: her etiket,
1193
1442
  kimsenin geçirmediği isteğe bağlı bir `t` prop'unun arkasındaki düz
1194
1443
  Türkçe metindi. */
1195
1444
  'convert.title': 'Dönüştür',
1445
+ 'convert.legacy_admin':
1446
+ 'Bu, kullanımdan kalkmakta olan eski dönüştürücü. Yerine Dönüştür uygulamasını kurun (Eklentiler → Uygulamalar) — uygulama kurulunca bu giriş kaybolur.',
1196
1447
  'convert.loading': 'Dönüştürücü yükleniyor…',
1197
1448
  'convert.done': 'Dönüştürüldü ve klasöre yüklendi.',
1198
1449
  'convert.close': 'Kapat',
@@ -1202,6 +1453,13 @@ export const tr: Record<string, string> = {
1202
1453
  'convert.unsupported_input': 'Bu dosya tipi için kaynak format bulunamadı.',
1203
1454
  'convert.converting': 'Dönüştürülüyor…',
1204
1455
  'convert.convert': 'Dönüştür',
1456
+ /* Asla HTTP katmanı değil: buradaki bir hata eskiden `503 Service
1457
+ Unavailable — {"error":…}` ya da dönüştürücünün kendi İngilizcesini
1458
+ gösteriyordu. */
1459
+ 'convert.unreachable': 'Dönüştürücü yanıt vermiyor. Daha sonra yeniden deneyin.',
1460
+ 'convert.read_failed': 'Dosya dönüştürmek için okunamadı.',
1461
+ 'convert.failed': 'Dönüştürücü bu dosyayı o biçime çeviremedi.',
1462
+ 'convert.save_failed': 'Dosya dönüştürüldü ama bu klasöre kaydedilemedi.',
1205
1463
  /* === gorunum:v1-chrome — filtre satırındaki ad kutusu === */
1206
1464
  'filter.find': 'Bu klasörde filtrele…',
1207
1465
  /* surucu:d1-scope — satırların bir klasörün içeriği olmadığı yerlerde aynı
@@ -1256,6 +1514,7 @@ export const tr: Record<string, string> = {
1256
1514
  'ftype.log': 'Günlük dosyası',
1257
1515
  'ftype.config': 'Ayar dosyası',
1258
1516
  'ftype.sheet': 'Hesap tablosu',
1517
+ 'ftype.drawio': 'draw.io diyagramı',
1259
1518
  'ftype.figma': 'Figma tasarımı',
1260
1519
  'ftype.design': 'Tasarım dosyası',
1261
1520
  'ftype.image': 'Görsel',
@@ -1302,7 +1561,7 @@ export const tr: Record<string, string> = {
1302
1561
  'advsearch.tags.exclude': 'Şu etiketler hariç',
1303
1562
  'advsearch.tags.exclude_placeholder': 'arşiv',
1304
1563
  'advsearch.tags.hint':
1305
- 'Virgülle ayırın. Etiket daraltır: birden çok etiket hepsini birden taşıyan dosyalar demektir, hiç kullanılmamış bir etiket ise hiçbir şey döndürmez.',
1564
+ 'Virgülle ayırın. Etiket daraltır: birden çok etiket hepsini birden taşıyan dosyalar demektir, hiç kullanılmamış bir etiket ise hiçbir şey döndürmez. Bir ad, o adı taşıyan kişisel etiketinizi de ekibinizin etiketini de bulur.',
1306
1565
  'advsearch.where.label': 'Klasör',
1307
1566
  'advsearch.where.any': 'Bu deponun her yerinde',
1308
1567
  'advsearch.where.here': 'Yalnız {folder} içinde',
@@ -1319,12 +1578,12 @@ export const tr: Record<string, string> = {
1319
1578
  'advsearch.count.counting': 'Sayılıyor…',
1320
1579
  'advsearch.count.result': '{n} eşleşen öğe',
1321
1580
  'advsearch.count.capped': 'Sonuçların ilk sayfasında {n} eşleşen öğe',
1322
- 'advsearch.count.result_one': '1 eşleşen öğe',
1323
- 'advsearch.count.capped_one': 'Sonuçların ilk sayfasında 1 eşleşen öğe',
1581
+ 'advsearch.count.result_one': '{n} eşleşen öğe',
1582
+ 'advsearch.count.capped_one': 'Sonuçların ilk sayfasında {n} eşleşen öğe',
1324
1583
  'advsearch.count.error': 'Sayım çalıştırılamadı.',
1325
1584
  'advsearch.count.cost':
1326
- 'Sayım bu aramayı çalıştırır. Tür, sahip, tarih, boyut ve klasör sunucuda değil, gelen satırlar üzerinde uygulanır.',
1327
- 'advsearch.wire': 'Gönderilen',
1585
+ 'Sayım bu aramayı çalıştırır. Tür, sahip, tarih, boyut ve klasör bulduğu sonuçları daraltır.',
1586
+ 'advsearch.wire': 'Bir dahaki sefere arama kutusuna şunu yazabilirsiniz:',
1328
1587
  'advsearch.reset': 'Sıfırla',
1329
1588
  'advsearch.cancel': 'Vazgeç',
1330
1589
  'advsearch.submit': 'Ara',
@@ -1335,7 +1594,7 @@ export const tr: Record<string, string> = {
1335
1594
  'breadcrumb.subfolders.empty': 'Burada alt klasör yok',
1336
1595
  'header.admin': 'Yönetim paneli',
1337
1596
  'header.settings': 'Ayarlar',
1338
- 'header.signout': 'Çıkış yap',
1597
+ 'header.signout': 'Oturumu kapat',
1339
1598
  'ai.assistant': 'AI asistanı',
1340
1599
  'ai.soon': 'Yakında',
1341
1600
  'ai.assistant.soon': 'AI asistanı — yakında',
@@ -1375,7 +1634,7 @@ export const tr: Record<string, string> = {
1375
1634
  'owner.unknown': 'Bilinmiyor',
1376
1635
  'owner.external': 'Yükleme bağlantısıyla geldi',
1377
1636
  'owner.last_actor': 'Son değiştiren: {who}',
1378
- 'filter.people': 'Kişiler',
1637
+ 'filter.people': 'Sahibi',
1379
1638
  'filter.people.any': 'Herkes',
1380
1639
  'filter.people.me': 'Siz',
1381
1640
  'filter.people.system': 'Sistem',
@@ -1396,11 +1655,15 @@ export const tr: Record<string, string> = {
1396
1655
  'sort.relevance_why':
1397
1656
  'Arama sonuçları eşleşme yakınlığına göre listelenir. Seçtiğiniz sıralama, aramadan çıkınca geri gelir.',
1398
1657
  /* === tablo:t1 — tablonun kendi yapılandırması ==========================
1399
- Sütun genişlikleri ve görünürlüğü EKRANINIZA dair bir tercihtir; bir
1400
- klasörün hangi görünümle açılacağı ise KLASÖRE dair bir olgudur. İkisi de
1401
- buradan ayarlanır; `folder_hint` kuralı tek cümlede, tam da ona şaşıracak
1402
- kişinin okuyabileceği yerde söyler. */
1658
+ v0.43'ten beri bir klasörün görünüşüne dair her şey — görünüm, sıralama VE
1659
+ sütunlar — değiştirildiği klasöre aittir; kimsenin değiştirmediği klasör
1660
+ kişinin varsayılanıyla (ayarlarından), o yoksa kurulumunkiyle açılır.
1661
+ `folder_hint` bu kuralı tek cümlede, tam da ona şaşıracak kişinin
1662
+ okuyabileceği yerde söyler. */
1403
1663
  'col.location': 'Konum',
1664
+ 'col.deleted': 'Silinme',
1665
+ 'col.deleted_from': 'Silindiği yer',
1666
+ 'col.remaining': 'Kalan süre',
1404
1667
  'cols.menu': 'Sütun seçenekleri',
1405
1668
  'cols.title': 'Sütunlar',
1406
1669
  'cols.resize': '{col} sütununu yeniden boyutlandır',
@@ -1409,9 +1672,17 @@ export const tr: Record<string, string> = {
1409
1672
  'cols.reset': 'Sütunları sıfırla',
1410
1673
  'cols.folder_title': 'Klasör görünümü',
1411
1674
  'cols.folder_hint':
1412
- 'Ayarladığınız klasörler kendi görünümünü korur. Son seçiminiz diğer her yerde varsayılan olur.',
1675
+ 'Burada yaptığınız değişiklik bu klasörde kalır. Hiç değiştirmediğiniz klasörler varsayılan görünümünüzle açılır (Ayarlar → Varsayılan klasör görünümü).',
1413
1676
  'cols.forget_folder': 'Bu klasörün görünümünü unut',
1414
- 'cols.apply_all': 'Tüm klasörlere uygula ({count} klasör hatırlanıyor)',
1677
+ 'cols.apply_all': 'Bunu tüm klasörler için varsayılanım yap ({count} klasör hatırlanıyor)',
1678
+ /* === tablo:t3 — TEK TABLO (components/DataTable.vue) ====================
1679
+ Üründeki her tablo bunları konuşur; Türkçe bir sayfada sütun menüsü ya da
1680
+ sayfalayıcı İngilizce kalmasın. */
1681
+ 'table.empty': 'Henüz burada bir şey yok',
1682
+ 'table.prev': 'Önceki sayfa',
1683
+ 'table.next': 'Sonraki sayfa',
1684
+ 'table.sort_paged':
1685
+ 'Bu liste sayfalara bölünmüş. Sıralama yalnızca ekrandaki sayfayı yeniden dizerdi, bu yüzden burada kapalı — listeyi arama ya da filtrelerle daraltın.',
1415
1686
  /* === tablo:t1 — çöp kutusu bilgi şeridi ================================
1416
1687
  ⚠ `retention` yalnızca kurulum bize sayıyı SÖYLEDİĞİNDE kullanılır
1417
1688
  (GET /api/admin/protection). Diğer her durumda `retention_unknown` aynı
@@ -1424,12 +1695,23 @@ export const tr: Record<string, string> = {
1424
1695
  'Çöp kutusundaki öğeler, yöneticinizin belirlediği saklama süresi dolunca kalıcı olarak silinir.',
1425
1696
  'trash.empty_action': 'Çöp kutusunu boşalt',
1426
1697
  'trash.empty_confirm_title': 'Çöp kutusu boşaltılsın mı?',
1427
- 'trash.empty_confirm_body_one': 'Bu işlem 1 öğeyi ({size}) kalıcı olarak siler. Geri alınamaz.',
1698
+ 'trash.empty_confirm_body_one': 'Bu işlem {count} öğeyi ({size}) kalıcı olarak siler. Geri alınamaz.',
1428
1699
  'trash.empty_confirm_body':
1429
1700
  'Bu işlem {count} öğeyi ({size}) kalıcı olarak siler. Geri alınamaz.',
1430
- 'trash.empty_confirm_body_nosize_one': 'Bu işlem 1 öğeyi kalıcı olarak siler. Geri alınamaz.',
1701
+ 'trash.empty_confirm_body_nosize_one': 'Bu işlem {count} öğeyi kalıcı olarak siler. Geri alınamaz.',
1431
1702
  'trash.empty_confirm_body_nosize': 'Bu işlem {count} öğeyi kalıcı olarak siler. Geri alınamaz.',
1432
1703
  'trash.emptied': 'Çöp kutusu boşaltıldı',
1704
+ 'trash.days_remaining': '{n} gün',
1705
+ 'trash.days_remaining_one': '{n} gün',
1706
+ 'trash.days_remaining_due': 'Silinmek üzere',
1707
+ 'trash.emptying': 'Çöp kutusu boşaltılıyor… {done} / {total}',
1708
+ 'trash.empty_busy': 'Çöp kutusu zaten boşaltılıyor.',
1709
+ 'trash.emptied_partly': 'Çöp kutusu boşaltıldı, ama {count} öğe silinemedi — sunucu günlüğüne bakın.',
1710
+ 'trash.emptied_partly_one': 'Çöp kutusu boşaltıldı, ama {count} öğe silinemedi — sunucu günlüğüne bakın.',
1711
+ 'trash.empty_stopped': 'Çöp kutusunu boşaltma durdu: {error}',
1712
+ 'trash.emptying_queued': 'Çöp kutusu boşaltılıyor… başka bir temizliğin bitmesi bekleniyor',
1713
+ 'trash.empty_cancelled': 'Çöp kutusunu boşaltma {count} öğeden sonra durduruldu; kalanlar hâlâ çöp kutusunda.',
1714
+ 'trash.empty_cancelled_one': 'Çöp kutusunu boşaltma {count} öğeden sonra durduruldu; kalanlar hâlâ çöp kutusunda.',
1433
1715
  'empty.trash.hint': 'Sildiğiniz dosyalar önce buraya düşer, böylece geri alabilirsiniz.',
1434
1716
 
1435
1717
  /* tasi:m1 — hedef klasör seçici (modals/DestinationPickerModal.vue) ve
@@ -1440,10 +1722,14 @@ export const tr: Record<string, string> = {
1440
1722
  'destpicker.confirm.move': 'Buraya taşı',
1441
1723
  'destpicker.confirm.copy': 'Buraya kopyala',
1442
1724
  'destpicker.confirm.choose': 'Bu klasörü seç',
1725
+ 'destpicker.title.choose_file': 'Dosya seç',
1726
+ 'destpicker.confirm.choose_file': 'Bu dosyayı seç',
1727
+ 'destpicker.pick_a_file': 'Listeden bir dosya seçin.',
1728
+ 'destpicker.empty_files': 'Bu klasör boş',
1443
1729
  'destpicker.cancel': 'Vazgeç',
1444
1730
  'destpicker.up': 'Bir üst klasör',
1445
1731
  'destpicker.crumbs': 'Konum',
1446
- 'destpicker.drives': 'Sürücüler',
1732
+ 'destpicker.drives': 'Depolar',
1447
1733
  'destpicker.loading': 'Yükleniyor…',
1448
1734
  'destpicker.empty': 'Burada alt klasör yok',
1449
1735
  'destpicker.unreadable': 'Bu klasör açılamıyor.',
@@ -1465,4 +1751,102 @@ export const tr: Record<string, string> = {
1465
1751
  'toast.archive.empty': 'İndirilecek bir şey yok — seçimde okunabilir dosya bulunmuyor.',
1466
1752
  'toast.moved_to': '{name} klasörüne taşındı',
1467
1753
  'toast.copied_to': '{name} klasörüne kopyalama kuyruğa alındı',
1754
+
1755
+ /* ── dil:paket — bkz. en.ts */
1756
+ 'ctx.tags_menu': 'Etiketler…',
1757
+ 'toast.node_id_copied': 'Node id {id} kopyalandı',
1758
+ 'toast.converted_to': 'Dönüştürüldü → {name}',
1759
+ 'toast.read_only_here': 'Burada yazma yetkiniz yok',
1760
+ 'recents.title': 'Son açılanlar',
1761
+ 'recents.refresh': 'Yenile',
1762
+ 'recents.empty': 'Henüz bir şey yok.',
1763
+ 'recents.loading': 'Yükleniyor…',
1764
+ 'recents.close': 'Kapat',
1765
+ 'tags.title': 'Etiketler',
1766
+ 'tags.close': 'Kapat',
1767
+ 'share.ttl.never': 'Bu bağlantının süresi yoktur.',
1768
+ 'share.ttl.until': 'Bu bağlantı {when} tarihine kadar geçerli.',
1769
+ 'share.ttl.ceiling': 'Bağlantılar en fazla {days} gün geçerli olabilir (sunucu ayarı).',
1770
+ 'share.ttl.ceiling_one': 'Bağlantılar en fazla {days} gün geçerli olabilir (sunucu ayarı).',
1771
+ /* ── dil:paket — paylaşım / erişim penceresi (bkz. en.ts) */
1772
+ 'access.ui.level_viewer': 'Görüntüleyen',
1773
+ 'access.ui.level_viewer_desc': 'görüntüle + indir',
1774
+ 'access.ui.level_editor': 'Düzenleyen',
1775
+ 'access.ui.level_editor_desc': 'oku + yaz + sil',
1776
+ 'access.ui.level_owner': 'Sahip',
1777
+ 'access.ui.level_owner_desc': 'düzenle + izin yönet',
1778
+ 'access.ui.never': 'Süresiz',
1779
+ 'access.ui.days': '{days} gün',
1780
+ 'access.ui.days_one': '{days} gün',
1781
+ 'access.ui.unlimited': 'Sınırsız',
1782
+ 'access.ui.downloads': '{count} indirme',
1783
+ 'access.ui.downloads_one': '{count} indirme',
1784
+ 'access.ui.mail_sent': 'E-posta gönderildi ✓ ({sent})',
1785
+ 'access.ui.mail_partial': '{sent} gönderildi, {failed} başarısız',
1786
+ 'access.ui.valid_for': 'Bu bağlantı {days} gün geçerlidir.',
1787
+ 'access.ui.valid_for_one': 'Bu bağlantı {days} gün geçerlidir.',
1788
+ 'access.ui.mail_title_file': '{name} dosyası sizinle paylaşıldı',
1789
+ 'access.ui.mail_title_folder': '{name} klasörü sizinle paylaşıldı',
1790
+ 'access.ui.mail_hello': 'Merhaba,',
1791
+ 'access.ui.mail_shared_file': 'Sizinle bir dosya paylaşıldı:',
1792
+ 'access.ui.mail_shared_folder': 'Sizinle bir klasör paylaşıldı:',
1793
+ 'access.ui.mail_folder': 'Klasör: {name}',
1794
+ 'access.ui.mail_file': 'Dosya: {name}',
1795
+ 'access.ui.mail_size': 'Boyut: {size}',
1796
+ 'access.ui.mail_download_here': 'İndirmek için:',
1797
+ 'access.ui.mail_pin': 'PIN: {pin}',
1798
+ 'access.ui.drop_title': '{folder} adlı klasöre dosya eklemeniz istendi',
1799
+ 'access.ui.drop_invited': 'Dosya yüklemeniz istendi.',
1800
+ 'access.ui.drop_limit': 'Sınır: en fazla {files} dosya, dosya başına {mb} MB.',
1801
+ 'access.ui.drop_types': 'İzinli türler: {types}',
1802
+ 'access.ui.drop_types_all': 'İzinli türler: tüm türler',
1803
+ 'access.ui.drop_upload_here': 'Dosyalarınızı buradan yükleyebilirsiniz:',
1804
+ 'access.ui.inherited_from': 'Üst klasörden gelir',
1805
+ 'access.ui.access_granted': 'Yetki verildi.',
1806
+ 'access.ui.enter_a_valid_email': 'Geçerli bir e-posta girin.',
1807
+ 'access.ui.user_created_invite_emailed': 'Kullanıcı açıldı, davet e-postası gönderildi.',
1808
+ 'access.ui.user_created_share_the_temp_password': 'Kullanıcı açıldı. Geçici parolayı iletin.',
1809
+ 'access.ui.smtp_not_set_up_verified_share_the_link': 'SMTP ayarlı/doğrulanmış değil — bağlantıyı elle iletin.',
1810
+ 'access.ui.send_failed_temporary_please_retry': 'Gönderilemedi (geçici hata) — tekrar deneyin.',
1811
+ 'access.ui.server_limit_applied': '(sunucu sınırı uygulandı)',
1812
+ 'access.ui.protect_with_a_pin': 'PIN ile koru',
1813
+ 'access.ui.expiry': 'Süre',
1814
+ 'access.ui.download_limit': 'İndirme limiti',
1815
+ 'access.ui.create_link': 'Bağlantı oluştur',
1816
+ 'access.ui.replace_link': 'Bağlantıyı bu ayarlarla yenile',
1817
+ 'access.ui.replace_link_hint': 'Adres değişir: şu anki bağlantı çalışmayı bırakır.',
1818
+ 'access.ui.create_then_send': 'Bir bağlantı oluşturun, ardından {email} adresine gönderin.',
1819
+ 'access.ui.command_line': 'Komut satırı',
1820
+ 'access.ui.share': 'Paylaş',
1821
+ 'access.ui.existing_links': 'Mevcut bağlantılar',
1822
+ 'access.ui.rbac_off_here': 'Bu depoda öğe bazlı erişim denetimi kapalı — herkes depoyu rolüne göre açar, burada eklenen kişiler bir şey değiştirmez. Yönetim panelinde Depolar altından (bu depo → Öğe bazlı erişim denetimi) açın.',
1823
+ 'access.ui.other_links': 'Diğer bağlantılar',
1824
+ 'access.ui.revoke': 'İptal',
1825
+ 'access.ui.loading': 'Yükleniyor…',
1826
+ 'access.ui.name_or_email': 'Ad ya da e-posta',
1827
+ 'access.ui.add': 'Ekle',
1828
+ 'access.ui.no_account_for_this_email_what_next': 'Bu e-postada hesap yok. Ne yapmak istersiniz?',
1829
+ 'access.ui.user': 'Kullanıcı',
1830
+ 'access.ui.viewer': 'Görüntüleyen',
1831
+ 'access.ui.create_user_grant': 'Kullanıcı oluştur + yetki ver',
1832
+ 'access.ui.just_send_a_share_link': 'Yalnızca paylaşım bağlantısı gönder →',
1833
+ 'access.ui.temp_password': 'Geçici parola:',
1834
+ 'access.ui.people_with_access': 'Erişimi olanlar',
1835
+ 'access.ui.not_shared_with_anyone_yet': 'Henüz kimseyle paylaşılmadı.',
1836
+ 'access.ui.remove': 'Kaldır',
1837
+ 'access.ui.a_public_link_that_lets_anyone_upload_fi': 'Bu klasöre herkesin dosya YÜKLEYEBİLECEĞİ herkese açık bir bağlantı. Yükleyenler klasördeki mevcut dosyaları göremez.',
1838
+ 'access.ui.hide_upload_limits': 'Yükleme sınırlarını gizle',
1839
+ 'access.ui.upload_limits': 'Yükleme sınırları',
1840
+ 'access.ui.max_files': 'En fazla dosya',
1841
+ 'access.ui.mb_file': 'Dosya başı MB',
1842
+ 'access.ui.allowed_types': 'İzinli türler',
1843
+ 'access.ui.all_e_g_pdf_jpg': 'hepsi (örn. pdf, jpg)',
1844
+ 'access.ui.ask_uploader_name': 'Yükleyenin adını sor',
1845
+ 'access.ui.emails_comma_separated': 'e-posta(lar) — virgülle ayırın',
1846
+ 'access.ui.send': 'Gönder',
1847
+ 'access.ui.mail_not_set_up': 'E-posta kurulu değil — yönetim panelinde Ayarlar altından (E-posta / SMTP) kurun.',
1848
+ /* ── dil:paket — İngilizce sabit yazılmış erişilebilir adlar */
1849
+ 'breadcrumb.aria': 'Konum yolu',
1850
+ 'e2e.recovery_key_aria': 'Kurtarma anahtarı',
1851
+ 'modal.close': 'Kapat',
1468
1852
  };