@tracearr/translations 2.2.4-beta.2 → 2.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/README.md +1 -1
  2. package/dist/config.d.ts +1160 -64
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.mobile.d.ts +1160 -64
  5. package/dist/config.mobile.d.ts.map +1 -1
  6. package/dist/locales/af-ZA/common.json +281 -280
  7. package/dist/locales/af-ZA/notifications.json +238 -218
  8. package/dist/locales/af-ZA/pages.json +1726 -1646
  9. package/dist/locales/af-ZA/settings.json +888 -440
  10. package/dist/locales/ar-SA/common.json +281 -280
  11. package/dist/locales/ar-SA/notifications.json +242 -222
  12. package/dist/locales/ar-SA/pages.json +1684 -1604
  13. package/dist/locales/ar-SA/settings.json +889 -441
  14. package/dist/locales/ca-ES/common.json +281 -280
  15. package/dist/locales/ca-ES/notifications.json +238 -218
  16. package/dist/locales/ca-ES/pages.json +1682 -1602
  17. package/dist/locales/ca-ES/settings.json +888 -440
  18. package/dist/locales/cs-CZ/common.json +281 -280
  19. package/dist/locales/cs-CZ/notifications.json +242 -222
  20. package/dist/locales/cs-CZ/pages.json +1688 -1608
  21. package/dist/locales/cs-CZ/settings.json +889 -441
  22. package/dist/locales/da-DK/common.json +281 -280
  23. package/dist/locales/da-DK/notifications.json +242 -222
  24. package/dist/locales/da-DK/pages.json +1684 -1604
  25. package/dist/locales/da-DK/settings.json +889 -441
  26. package/dist/locales/de-DE/common.json +281 -280
  27. package/dist/locales/de-DE/notifications.json +242 -222
  28. package/dist/locales/de-DE/pages.json +1690 -1610
  29. package/dist/locales/de-DE/settings.json +889 -441
  30. package/dist/locales/el-GR/common.json +281 -280
  31. package/dist/locales/el-GR/notifications.json +242 -222
  32. package/dist/locales/el-GR/pages.json +1684 -1604
  33. package/dist/locales/el-GR/settings.json +889 -441
  34. package/dist/locales/en/notifications.json +26 -6
  35. package/dist/locales/en/pages.json +92 -12
  36. package/dist/locales/en/settings.json +474 -26
  37. package/dist/locales/en-US/common.json +281 -280
  38. package/dist/locales/en-US/notifications.json +242 -222
  39. package/dist/locales/en-US/pages.json +1774 -1694
  40. package/dist/locales/en-US/settings.json +898 -450
  41. package/dist/locales/es-ES/common.json +281 -280
  42. package/dist/locales/es-ES/notifications.json +242 -222
  43. package/dist/locales/es-ES/pages.json +1689 -1609
  44. package/dist/locales/es-ES/settings.json +889 -441
  45. package/dist/locales/fi-FI/common.json +281 -280
  46. package/dist/locales/fi-FI/notifications.json +242 -222
  47. package/dist/locales/fi-FI/pages.json +1684 -1604
  48. package/dist/locales/fi-FI/settings.json +889 -441
  49. package/dist/locales/fr-FR/notifications.json +242 -222
  50. package/dist/locales/fr-FR/pages.json +1698 -1618
  51. package/dist/locales/fr-FR/settings.json +898 -450
  52. package/dist/locales/he-IL/common.json +281 -280
  53. package/dist/locales/he-IL/notifications.json +238 -218
  54. package/dist/locales/he-IL/pages.json +1726 -1646
  55. package/dist/locales/he-IL/settings.json +888 -440
  56. package/dist/locales/hu-HU/common.json +281 -280
  57. package/dist/locales/hu-HU/notifications.json +238 -218
  58. package/dist/locales/hu-HU/pages.json +1726 -1646
  59. package/dist/locales/hu-HU/settings.json +888 -440
  60. package/dist/locales/it-IT/common.json +281 -280
  61. package/dist/locales/it-IT/notifications.json +242 -222
  62. package/dist/locales/it-IT/pages.json +1684 -1604
  63. package/dist/locales/it-IT/settings.json +889 -441
  64. package/dist/locales/ja-JP/common.json +281 -280
  65. package/dist/locales/ja-JP/notifications.json +242 -222
  66. package/dist/locales/ja-JP/pages.json +1684 -1604
  67. package/dist/locales/ja-JP/settings.json +889 -441
  68. package/dist/locales/ko-KR/common.json +281 -281
  69. package/dist/locales/ko-KR/notifications.json +242 -222
  70. package/dist/locales/ko-KR/pages.json +1746 -1666
  71. package/dist/locales/ko-KR/settings.json +898 -450
  72. package/dist/locales/nl-NL/common.json +281 -280
  73. package/dist/locales/nl-NL/notifications.json +242 -222
  74. package/dist/locales/nl-NL/pages.json +1699 -1619
  75. package/dist/locales/nl-NL/settings.json +891 -443
  76. package/dist/locales/no-NO/common.json +281 -280
  77. package/dist/locales/no-NO/notifications.json +242 -222
  78. package/dist/locales/no-NO/pages.json +1684 -1604
  79. package/dist/locales/no-NO/settings.json +889 -441
  80. package/dist/locales/pl-PL/common.json +281 -280
  81. package/dist/locales/pl-PL/notifications.json +242 -222
  82. package/dist/locales/pl-PL/pages.json +1684 -1604
  83. package/dist/locales/pl-PL/settings.json +889 -441
  84. package/dist/locales/pt-BR/common.json +281 -280
  85. package/dist/locales/pt-BR/notifications.json +242 -222
  86. package/dist/locales/pt-BR/pages.json +1725 -1645
  87. package/dist/locales/pt-BR/settings.json +889 -441
  88. package/dist/locales/pt-PT/common.json +281 -280
  89. package/dist/locales/pt-PT/notifications.json +242 -222
  90. package/dist/locales/pt-PT/pages.json +1684 -1604
  91. package/dist/locales/pt-PT/settings.json +889 -441
  92. package/dist/locales/ro-RO/common.json +281 -280
  93. package/dist/locales/ro-RO/notifications.json +242 -222
  94. package/dist/locales/ro-RO/pages.json +1684 -1604
  95. package/dist/locales/ro-RO/settings.json +889 -441
  96. package/dist/locales/ru-RU/common.json +281 -280
  97. package/dist/locales/ru-RU/notifications.json +242 -222
  98. package/dist/locales/ru-RU/pages.json +1684 -1604
  99. package/dist/locales/ru-RU/settings.json +889 -441
  100. package/dist/locales/sr-SP/common.json +281 -280
  101. package/dist/locales/sr-SP/notifications.json +238 -218
  102. package/dist/locales/sr-SP/pages.json +1726 -1646
  103. package/dist/locales/sr-SP/settings.json +888 -440
  104. package/dist/locales/sv-SE/common.json +281 -280
  105. package/dist/locales/sv-SE/notifications.json +242 -222
  106. package/dist/locales/sv-SE/pages.json +1684 -1604
  107. package/dist/locales/sv-SE/settings.json +889 -441
  108. package/dist/locales/tr-TR/common.json +281 -280
  109. package/dist/locales/tr-TR/notifications.json +238 -218
  110. package/dist/locales/tr-TR/pages.json +1726 -1646
  111. package/dist/locales/tr-TR/settings.json +888 -440
  112. package/dist/locales/uk-UA/common.json +281 -280
  113. package/dist/locales/uk-UA/notifications.json +242 -222
  114. package/dist/locales/uk-UA/pages.json +1684 -1604
  115. package/dist/locales/uk-UA/settings.json +889 -441
  116. package/dist/locales/vi-VN/common.json +281 -280
  117. package/dist/locales/vi-VN/notifications.json +238 -218
  118. package/dist/locales/vi-VN/pages.json +1726 -1646
  119. package/dist/locales/vi-VN/settings.json +888 -440
  120. package/dist/locales/zh-CN/common.json +281 -280
  121. package/dist/locales/zh-CN/notifications.json +242 -222
  122. package/dist/locales/zh-CN/pages.json +1695 -1615
  123. package/dist/locales/zh-CN/settings.json +898 -450
  124. package/dist/locales/zh-TW/common.json +281 -280
  125. package/dist/locales/zh-TW/notifications.json +242 -222
  126. package/dist/locales/zh-TW/pages.json +1804 -1724
  127. package/dist/locales/zh-TW/settings.json +888 -440
  128. package/package.json +1 -1
  129. package/src/locales/af-ZA/common.json +281 -280
  130. package/src/locales/af-ZA/notifications.json +238 -218
  131. package/src/locales/af-ZA/pages.json +1726 -1646
  132. package/src/locales/af-ZA/settings.json +888 -440
  133. package/src/locales/ar-SA/common.json +281 -280
  134. package/src/locales/ar-SA/notifications.json +242 -222
  135. package/src/locales/ar-SA/pages.json +1684 -1604
  136. package/src/locales/ar-SA/settings.json +889 -441
  137. package/src/locales/ca-ES/common.json +281 -280
  138. package/src/locales/ca-ES/notifications.json +238 -218
  139. package/src/locales/ca-ES/pages.json +1682 -1602
  140. package/src/locales/ca-ES/settings.json +888 -440
  141. package/src/locales/cs-CZ/common.json +281 -280
  142. package/src/locales/cs-CZ/notifications.json +242 -222
  143. package/src/locales/cs-CZ/pages.json +1688 -1608
  144. package/src/locales/cs-CZ/settings.json +889 -441
  145. package/src/locales/da-DK/common.json +281 -280
  146. package/src/locales/da-DK/notifications.json +242 -222
  147. package/src/locales/da-DK/pages.json +1684 -1604
  148. package/src/locales/da-DK/settings.json +889 -441
  149. package/src/locales/de-DE/common.json +281 -280
  150. package/src/locales/de-DE/notifications.json +242 -222
  151. package/src/locales/de-DE/pages.json +1690 -1610
  152. package/src/locales/de-DE/settings.json +889 -441
  153. package/src/locales/el-GR/common.json +281 -280
  154. package/src/locales/el-GR/notifications.json +242 -222
  155. package/src/locales/el-GR/pages.json +1684 -1604
  156. package/src/locales/el-GR/settings.json +889 -441
  157. package/src/locales/en/notifications.json +26 -6
  158. package/src/locales/en/pages.json +92 -12
  159. package/src/locales/en/settings.json +474 -26
  160. package/src/locales/en-US/common.json +281 -280
  161. package/src/locales/en-US/notifications.json +242 -222
  162. package/src/locales/en-US/pages.json +1774 -1694
  163. package/src/locales/en-US/settings.json +898 -450
  164. package/src/locales/es-ES/common.json +281 -280
  165. package/src/locales/es-ES/notifications.json +242 -222
  166. package/src/locales/es-ES/pages.json +1689 -1609
  167. package/src/locales/es-ES/settings.json +889 -441
  168. package/src/locales/fi-FI/common.json +281 -280
  169. package/src/locales/fi-FI/notifications.json +242 -222
  170. package/src/locales/fi-FI/pages.json +1684 -1604
  171. package/src/locales/fi-FI/settings.json +889 -441
  172. package/src/locales/fr-FR/notifications.json +242 -222
  173. package/src/locales/fr-FR/pages.json +1698 -1618
  174. package/src/locales/fr-FR/settings.json +898 -450
  175. package/src/locales/he-IL/common.json +281 -280
  176. package/src/locales/he-IL/notifications.json +238 -218
  177. package/src/locales/he-IL/pages.json +1726 -1646
  178. package/src/locales/he-IL/settings.json +888 -440
  179. package/src/locales/hu-HU/common.json +281 -280
  180. package/src/locales/hu-HU/notifications.json +238 -218
  181. package/src/locales/hu-HU/pages.json +1726 -1646
  182. package/src/locales/hu-HU/settings.json +888 -440
  183. package/src/locales/it-IT/common.json +281 -280
  184. package/src/locales/it-IT/notifications.json +242 -222
  185. package/src/locales/it-IT/pages.json +1684 -1604
  186. package/src/locales/it-IT/settings.json +889 -441
  187. package/src/locales/ja-JP/common.json +281 -280
  188. package/src/locales/ja-JP/notifications.json +242 -222
  189. package/src/locales/ja-JP/pages.json +1684 -1604
  190. package/src/locales/ja-JP/settings.json +889 -441
  191. package/src/locales/ko-KR/common.json +281 -281
  192. package/src/locales/ko-KR/notifications.json +242 -222
  193. package/src/locales/ko-KR/pages.json +1746 -1666
  194. package/src/locales/ko-KR/settings.json +898 -450
  195. package/src/locales/nl-NL/common.json +281 -280
  196. package/src/locales/nl-NL/notifications.json +242 -222
  197. package/src/locales/nl-NL/pages.json +1699 -1619
  198. package/src/locales/nl-NL/settings.json +891 -443
  199. package/src/locales/no-NO/common.json +281 -280
  200. package/src/locales/no-NO/notifications.json +242 -222
  201. package/src/locales/no-NO/pages.json +1684 -1604
  202. package/src/locales/no-NO/settings.json +889 -441
  203. package/src/locales/pl-PL/common.json +281 -280
  204. package/src/locales/pl-PL/notifications.json +242 -222
  205. package/src/locales/pl-PL/pages.json +1684 -1604
  206. package/src/locales/pl-PL/settings.json +889 -441
  207. package/src/locales/pt-BR/common.json +281 -280
  208. package/src/locales/pt-BR/notifications.json +242 -222
  209. package/src/locales/pt-BR/pages.json +1725 -1645
  210. package/src/locales/pt-BR/settings.json +889 -441
  211. package/src/locales/pt-PT/common.json +281 -280
  212. package/src/locales/pt-PT/notifications.json +242 -222
  213. package/src/locales/pt-PT/pages.json +1684 -1604
  214. package/src/locales/pt-PT/settings.json +889 -441
  215. package/src/locales/ro-RO/common.json +281 -280
  216. package/src/locales/ro-RO/notifications.json +242 -222
  217. package/src/locales/ro-RO/pages.json +1684 -1604
  218. package/src/locales/ro-RO/settings.json +889 -441
  219. package/src/locales/ru-RU/common.json +281 -280
  220. package/src/locales/ru-RU/notifications.json +242 -222
  221. package/src/locales/ru-RU/pages.json +1684 -1604
  222. package/src/locales/ru-RU/settings.json +889 -441
  223. package/src/locales/sr-SP/common.json +281 -280
  224. package/src/locales/sr-SP/notifications.json +238 -218
  225. package/src/locales/sr-SP/pages.json +1726 -1646
  226. package/src/locales/sr-SP/settings.json +888 -440
  227. package/src/locales/sv-SE/common.json +281 -280
  228. package/src/locales/sv-SE/notifications.json +242 -222
  229. package/src/locales/sv-SE/pages.json +1684 -1604
  230. package/src/locales/sv-SE/settings.json +889 -441
  231. package/src/locales/tr-TR/common.json +281 -280
  232. package/src/locales/tr-TR/notifications.json +238 -218
  233. package/src/locales/tr-TR/pages.json +1726 -1646
  234. package/src/locales/tr-TR/settings.json +888 -440
  235. package/src/locales/uk-UA/common.json +281 -280
  236. package/src/locales/uk-UA/notifications.json +242 -222
  237. package/src/locales/uk-UA/pages.json +1684 -1604
  238. package/src/locales/uk-UA/settings.json +889 -441
  239. package/src/locales/vi-VN/common.json +281 -280
  240. package/src/locales/vi-VN/notifications.json +238 -218
  241. package/src/locales/vi-VN/pages.json +1726 -1646
  242. package/src/locales/vi-VN/settings.json +888 -440
  243. package/src/locales/zh-CN/common.json +281 -280
  244. package/src/locales/zh-CN/notifications.json +242 -222
  245. package/src/locales/zh-CN/pages.json +1695 -1615
  246. package/src/locales/zh-CN/settings.json +898 -450
  247. package/src/locales/zh-TW/common.json +281 -280
  248. package/src/locales/zh-TW/notifications.json +242 -222
  249. package/src/locales/zh-TW/pages.json +1804 -1724
  250. package/src/locales/zh-TW/settings.json +888 -440
@@ -1,504 +1,952 @@
1
1
  {
2
- "title": "Settings",
3
- "tabs": {
4
- "general": "General",
5
- "servers": "Servers",
6
- "notifications": "Notifications",
7
- "mobile": "Mobile App",
8
- "tailscale": "Tailscale",
9
- "import": "Import",
10
- "advanced": "Advanced",
11
- "jobs": "Jobs",
12
- "accessControl": "Access Control",
13
- "backup": "Backup"
2
+ "accessControl": {
3
+ "allowGuestAccess": "Allow Guest Access",
4
+ "allowGuestAccessDesc": "",
5
+ "description": "Configure who can access Tracearr",
6
+ "singleOwnerNote": "Note: When guest access is disabled, only the server owner can sign in. All other users will see an \"Access Denied\" message.",
7
+ "title": "Access Control"
8
+ },
9
+ "account": {
10
+ "createAccount": "Create Account",
11
+ "createYourAccount": "Create your account to get started",
12
+ "displayName": "Display Name",
13
+ "email": "Email",
14
+ "password": "Password",
15
+ "signInToAccount": "Sign in to your account",
16
+ "useLocalAccount": "Use local account instead"
17
+ },
18
+ "advanced": {
19
+ "connectionScenarios": "Connection Scenarios",
20
+ "externalUrl": "External URL",
21
+ "reverseProxy": "Reverse Proxy",
22
+ "title": "Advanced Settings",
23
+ "trustProxy": "Trust Proxy Headers"
24
+ },
25
+ "backup": {
26
+ "actions": "Actions",
27
+ "backToBackups": "Back to Backups",
28
+ "backupHistory": "Backup History",
29
+ "createBackup": "Create Backup",
30
+ "creating": "Creating backup...",
31
+ "databaseSize": "Current database size: {{size}}",
32
+ "date": "Date",
33
+ "dayFri": "Friday",
34
+ "dayMon": "Monday",
35
+ "daySat": "Saturday",
36
+ "daySun": "Sunday",
37
+ "dayThu": "Thursday",
38
+ "dayTue": "Tuesday",
39
+ "dayWed": "Wednesday",
40
+ "deleteConfirmDescription": "Are you sure you want to delete this backup? This cannot be undone.",
41
+ "deleteConfirmTitle": "Delete Backup",
42
+ "description": "Backup and restore your Tracearr data",
43
+ "download": "",
44
+ "freeSpace": "Backup directory free space: {{size}}",
45
+ "lowDiskSpace": "Low disk space — backups and restores require at least twice the database size in free space.",
46
+ "noBackups": "No backups yet. Create your first backup above.",
47
+ "restore": {
48
+ "automations": "Automations",
49
+ "cannotRestore": "Restore requires PostgreSQL superuser privileges. Please ensure your database user has superuser privileges and try again.",
50
+ "complete": "Restore completed successfully. The page will refresh shortly.",
51
+ "confirm": "Start Restore",
52
+ "confirmLabel": "I understand this will replace all data",
53
+ "databaseSize": "Database Size",
54
+ "failed": "Restore failed",
55
+ "libraryItems": "Library Items",
56
+ "pgVersionMismatch": "Backup was created on PostgreSQL {{backupVersion}} but this server runs PostgreSQL {{serverVersion}}. Restoring a dump from a newer PostgreSQL version is not supported.",
57
+ "selectedBackup": "Selected Backup",
58
+ "servers": "Servers",
59
+ "sessions": "Sessions",
60
+ "tables": "Tables",
61
+ "title": "Restore Backup",
62
+ "tsVersionMismatch": "Backup was created with TimescaleDB {{backupVersion}} but this server only supports up to TimescaleDB {{serverVersion}}.",
63
+ "users": "Users",
64
+ "warning": "Restoring will replace all existing data. You will need to re-login after the restore completes."
65
+ },
66
+ "restoreAction": "Restore",
67
+ "retentionCount": "Keep Last",
68
+ "retentionSuffix": "scheduled backups",
69
+ "rowActions": "",
70
+ "schedule": "Scheduled Backups",
71
+ "scheduleDaily": "Daily",
72
+ "scheduleDayOfMonth": "Day of Month",
73
+ "scheduleDayOfMonthHint": "On months with fewer days, the backup runs on the last day.",
74
+ "scheduleDayOfWeek": "Day of Week",
75
+ "scheduleDisabled": "Disabled",
76
+ "scheduleHour": "",
77
+ "scheduleMinute": "",
78
+ "scheduleMonthly": "Monthly",
79
+ "scheduleTime": "Time ({{timezone}})",
80
+ "scheduleType": "Schedule",
81
+ "scheduleWeekly": "Weekly",
82
+ "size": "Size",
83
+ "title": "Backup",
84
+ "toast": {
85
+ "backupCreateFailed": "Failed to create backup",
86
+ "backupCreated": "Backup created successfully",
87
+ "backupDeleteFailed": "Failed to delete backup",
88
+ "backupDeleted": "Backup deleted",
89
+ "backupUploadFailed": "Failed to upload backup",
90
+ "backupUploaded": "Backup uploaded successfully",
91
+ "restoreStartFailed": "Failed to start restore",
92
+ "restoreStarted": "Restore started",
93
+ "scheduleError": "Failed to save backup schedule",
94
+ "scheduleSaved": "Backup schedule saved"
95
+ },
96
+ "type": "Type",
97
+ "typeManual": "Manual",
98
+ "typeScheduled": "Scheduled",
99
+ "typeUploaded": "Uploaded",
100
+ "uploadBackup": "Upload Backup",
101
+ "uploading": "Uploading...",
102
+ "version": "Version"
103
+ },
104
+ "email": {
105
+ "branding": {
106
+ "accent": "",
107
+ "accentPicker": "",
108
+ "description": "",
109
+ "footerText": "",
110
+ "footerTextHelp": "",
111
+ "logo": {
112
+ "label": "",
113
+ "none": "",
114
+ "tracearr": "",
115
+ "url": ""
116
+ },
117
+ "logoUrl": "",
118
+ "mailto": "",
119
+ "mailtoHelp": "",
120
+ "postalAddress": "",
121
+ "postalAddressHelp": "",
122
+ "save": "",
123
+ "saving": "",
124
+ "title": ""
125
+ },
126
+ "ownerOnly": "",
127
+ "suppressions": {
128
+ "add": "",
129
+ "addConfirm": "",
130
+ "addDescription": "",
131
+ "addTitle": "",
132
+ "address": "",
133
+ "empty": "",
134
+ "emptyDescription": "",
135
+ "globalNote": "",
136
+ "openSource": "",
137
+ "reason": {
138
+ "manual": "",
139
+ "unsubscribed": ""
140
+ },
141
+ "remove": "",
142
+ "removeDescription": "",
143
+ "removeTitle": "",
144
+ "title": ""
145
+ }
14
146
  },
15
147
  "general": {
16
- "title": "General Settings",
17
- "unitSystem": "Unit System",
18
- "metric": "Metric (km, km/h)",
19
- "imperial": "Imperial (mi, mph)",
20
- "timezone": "Timezone",
21
- "primaryAuth": "Primary Authentication Method",
22
- "localAccount": "Local Account",
23
- "plexAccount": "Plex Account",
24
- "language": "Language",
25
- "languageDescription": "Choose your preferred display language.",
26
- "helpTranslate": "Help translate Tracearr",
27
- "timeFormat": "Time Format",
28
- "timeFormatDescription": "Choose how times are displayed.",
29
- "timeFormat12h": "12-hour (1:30 PM)",
30
- "timeFormat24h": "24-hour (13:30)",
31
- "appearance": "Appearance",
32
- "appearanceDesc": "Customize the look and feel of Tracearr",
33
- "theme": "Theme",
34
148
  "accentColor": "Accent Color",
35
- "default": "(default)",
36
- "cyanDefault": "* Cyan is the default accent color",
37
- "themeLight": "Light",
38
- "themeDark": "Dark",
39
- "themeSystem": "System",
149
+ "apiDocs": "API Docs",
150
+ "apiKeyDesc": "Access the Tracearr API for third-party integrations like Homarr, Home Assistant, etc.",
151
+ "apiKeyReadAccess": "Your API key grants full read access to your Tracearr data.",
152
+ "apiRateLimit": "API Rate Limit",
153
+ "apiRateLimitDesc": "Maximum public API requests per minute per key. Restart required to apply.",
154
+ "apiRateLimitSuffix": "/min",
40
155
  "application": "Application",
41
156
  "applicationDesc": "Configure basic application settings",
42
- "unitSystemDesc": "",
43
- "sessionSync": "Session Sync",
44
- "sessionSyncDesc": "",
45
- "syncInterval": "Sync Interval",
46
- "syncIntervalDesc": "",
47
- "syncIntervalSuffix": "sec",
48
- "plexSseNote": "Plex uses Server-Sent Events (SSE) for near-instant updates — no polling needed.",
49
- "jellyfinPollingNote": "Jellyfin/Emby are polled at the interval above.",
157
+ "copyToClipboard": "Copy to clipboard",
158
+ "cyanDefault": "* Cyan is the default accent color",
159
+ "default": "(default)",
160
+ "detect": "Detect",
50
161
  "enhancedGeoIP": "Enhanced GeoIP Lookup",
51
162
  "enhancedGeoIPDesc": "Use Plex's GeoIP service for more accurate location data. When enabled, IP addresses are sent to plex.tv for lookup. Local MaxMind database is used as fallback.",
52
163
  "externalAccess": "External Access",
53
164
  "externalAccessDesc": "Configure how external devices (like mobile apps) connect to your server",
54
165
  "externalUrl": "External URL",
55
- "externalUrlPlaceholder": "https://tracearr.example.com",
56
166
  "externalUrlDesc": "The URL that external devices should use to reach this server. Used for QR codes and mobile app pairing.",
57
- "detect": "Detect",
58
- "localhostWarning": "Localhost URLs won't work for external devices. Use your LAN IP or a domain name.",
167
+ "externalUrlPlaceholder": "https://tracearr.example.com",
168
+ "generateApiKeyPrompt": "Generate an API key to enable external integrations.",
169
+ "generateKey": "Generate Key",
170
+ "helpTranslate": "Help translate Tracearr",
171
+ "imageCache": {
172
+ "ceiling": "Ceiling",
173
+ "description": "One copy of each poster, kept on disk until the poster changes. Nothing here is evicted to make room; when the disk runs low the cache stops growing and says so.",
174
+ "diskLimited": "Disk-limited since {{since}}: about {{shortfall}} of posters are not cached.",
175
+ "files": "Files",
176
+ "floor": "Keeps free",
177
+ "free": "Free disk",
178
+ "freeOf": "of {{total}}",
179
+ "lastSweep": "Last sweep",
180
+ "loadError": "Could not load the cache status.",
181
+ "need": "Estimated need",
182
+ "needHint": "{{count}} posters × 18 KB",
183
+ "never": "not yet",
184
+ "size": "On disk",
185
+ "title": "Poster cache"
186
+ },
187
+ "imperial": "Imperial (mi, mph)",
59
188
  "iosHttpWarning": "iOS requires HTTPS for external connections. Set up a reverse proxy with SSL.",
60
- "apiKeyDesc": "Access the Tracearr API for third-party integrations like Homarr, Home Assistant, etc.",
61
- "apiDocs": "API Docs",
189
+ "jellyfinPollingNote": "Jellyfin/Emby are polled at the interval above.",
190
+ "language": "Language",
191
+ "languageDescription": "Choose your preferred display language.",
192
+ "localAccount": "Local Account",
193
+ "localhostWarning": "Localhost URLs won't work for external devices. Use your LAN IP or a domain name.",
194
+ "metric": "Metric (km, km/h)",
62
195
  "noApiKeyGenerated": "No API key generated",
63
- "copyToClipboard": "Copy to clipboard",
64
- "apiKeyReadAccess": "Your API key grants full read access to your Tracearr data.",
65
- "generateApiKeyPrompt": "Generate an API key to enable external integrations.",
196
+ "plexAccount": "Plex Account",
197
+ "plexSseNote": "Plex uses Server-Sent Events (SSE) for near-instant updates — no polling needed.",
198
+ "primaryAuth": "Primary Authentication Method",
199
+ "publicApiSettings": "Public API",
200
+ "publicApiSettingsDesc": "Configure watch-completion thresholds and request limits for the public API",
66
201
  "regenerate": "Regenerate",
67
- "generateKey": "Generate Key",
68
202
  "regenerateApiKey": "Regenerate API Key?",
69
203
  "regenerateApiKeyDesc": "This will invalidate your current API key. Any integrations using the old key will stop working.",
70
- "publicApiSettings": "Public API",
71
- "publicApiSettingsDesc": "Configure watch-completion thresholds and request limits for the public API",
72
- "watchedThresholdMovie": "Movie Watched Threshold",
73
- "watchedThresholdMovieDesc": "",
74
- "watchedThresholdTv": "TV Episode Watched Threshold",
75
- "watchedThresholdTvDesc": "",
76
- "watchedThresholdMusic": "Track Watched Threshold",
77
- "watchedThresholdMusicDesc": "",
78
- "watchedThresholdSuffix": "%",
79
- "apiRateLimit": "API Rate Limit",
80
- "apiRateLimitDesc": "Maximum public API requests per minute per key. Restart required to apply.",
81
- "apiRateLimitSuffix": "/min",
204
+ "sessionSync": "Session Sync",
205
+ "sessionSyncDesc": "",
206
+ "syncInterval": "Sync Interval",
207
+ "syncIntervalDesc": "",
208
+ "syncIntervalSuffix": "sec",
209
+ "theme": "Theme",
210
+ "themeDark": "Dark",
211
+ "themeLight": "Light",
212
+ "themeSystem": "System",
213
+ "timeFormat": "Time Format",
214
+ "timeFormat12h": "12-hour (1:30 PM)",
215
+ "timeFormat24h": "24-hour (13:30)",
216
+ "timeFormatDescription": "Choose how times are displayed.",
217
+ "timezone": "Timezone",
218
+ "title": "General Settings",
219
+ "unitSystem": "Unit System",
220
+ "unitSystemDesc": "",
82
221
  "updateChecks": {
83
- "title": "Update checks",
84
222
  "description": "Tracearr looks for new releases every six hours. Notifications come from whatever automation listens for the update triggers.",
85
223
  "plugin": "Realtime plugin",
86
224
  "pluginDesc": "Check for new releases of the Tracearr plugin your Jellyfin and Emby servers stream events through.",
87
225
  "server": "Media servers",
88
- "serverDesc": "Compare what each Plex, Jellyfin and Emby server runs with the newest release its makers publish."
226
+ "serverDesc": "Compare what each Plex, Jellyfin and Emby server runs with the newest release its makers publish.",
227
+ "title": "Update checks"
89
228
  },
90
- "imageCache": {
91
- "title": "Poster cache",
92
- "description": "One copy of each poster, kept on disk until the poster changes. Nothing here is evicted to make room; when the disk runs low the cache stops growing and says so.",
93
- "size": "On disk",
94
- "files": "Files",
95
- "need": "Estimated need",
96
- "needHint": "{{count}} posters × 18 KB",
97
- "free": "Free disk",
98
- "freeOf": "of {{total}}",
99
- "floor": "Keeps free",
100
- "ceiling": "Ceiling",
101
- "lastSweep": "Last sweep",
102
- "never": "not yet",
103
- "diskLimited": "Disk-limited since {{since}}: about {{shortfall}} of posters are not cached.",
104
- "loadError": "Could not load the cache status."
105
- }
229
+ "watchedThresholdMovie": "Movie Watched Threshold",
230
+ "watchedThresholdMovieDesc": "",
231
+ "watchedThresholdMusic": "Track Watched Threshold",
232
+ "watchedThresholdMusicDesc": "",
233
+ "watchedThresholdSuffix": "%",
234
+ "watchedThresholdTv": "TV Episode Watched Threshold",
235
+ "watchedThresholdTvDesc": ""
106
236
  },
107
- "servers": {
108
- "title": "Connected Servers",
109
- "addServer": "Add Server",
110
- "serverName": "Server Name",
111
- "serverUrl": "Server URL",
112
- "syncInterval": "Sync Interval",
113
- "testConnection": "Test Connection",
114
- "connectionSuccess": "Connection successful",
115
- "connectionFailed": "Connection failed",
116
- "noServersConnected": "No servers connected",
117
- "noServersConnectedHint": "Click \"Add Server\" to connect a Jellyfin or Emby server",
118
- "serverType": "Server Type",
119
- "loadingAccounts": "Loading linked Plex accounts...",
120
- "noPlexAccountsLinked": "No Plex Accounts Linked",
121
- "noPlexAccountsLinkedHint": "Link a Plex account above, then come back to add a server.",
122
- "selectPlexAccount": "Select Plex Account",
123
- "chooseAccount": "Choose an account...",
124
- "selectAccountHelp": "Select which Plex account to discover servers from.",
125
- "allServersConnected": "All Servers Connected",
126
- "allServersConnectedDesc": "All servers from this account are already connected.",
127
- "serverUrlPlaceholder": "http://192.168.1.100:8096",
128
- "serverUrlHelp": "Direct URL to your Jellyfin or Emby server. Use IP:port for best reliability.",
129
- "serverNamePlaceholder": "My Media Server",
130
- "apiKeyPlaceholder": "Enter your API key",
131
- "apiKeyHelp": "Found in your media server's dashboard under API Keys or Advanced settings.",
132
- "connecting": "Connecting...",
133
- "connectServer": "Connect Server",
134
- "removeServer": "Remove Server",
135
- "removeServerConfirm": "Are you sure you want to remove this server? All associated session data will be retained, but you won't be able to monitor new sessions from this server.",
136
- "editServer": "Edit Server",
137
- "editServerDesc": "Update the server name or connection URL.",
138
- "serverColor": "Server Color",
139
- "serverColorDesc": "Used for visual attribution in multi-server view",
140
- "updating": "Updating...",
141
- "allFieldsRequired": "All fields are required",
142
- "addServerDialogDescPlex": "Select a Plex server from your linked account.",
143
- "addServerDialogDescOther": "Connect a Jellyfin or Emby server.",
144
- "description": "Manage your connected Plex, Jellyfin, and Emby servers",
145
- "discoveringServers": "Discovering available Plex servers...",
237
+ "import": {
238
+ "apiKeyHelp": "Found in Tautulli Settings → Web Interface → API Key.",
239
+ "apiKeyPlaceholder": "Your Tautulli API key",
240
+ "checkPlugin": "Check Plugin",
241
+ "checkingPlugin": "Checking...",
242
+ "connectToTautulli": "Connect to Tautulli",
243
+ "connectedFound": "Connected! Found {{users}} users and {{records}} history records.",
244
+ "duplicates": "{{count}} duplicates skipped",
245
+ "enrichMetadata": "Enrich with media metadata (recommended)",
246
+ "enrichMetadataHelp": "Fetches additional metadata from your media server for imported sessions.",
247
+ "enriched": "Enriched",
248
+ "errors": "Errors",
249
+ "exportBackupHelp": "In Jellystat, go to Settings → Backup → Activity Backup to export your data.",
250
+ "exportBackupHint": "Export an Activity Backup from Jellystat",
251
+ "howItWorks": "How the import works",
252
+ "howItWorksDesc": "Tracearr will import all historical watch data from your source. This may take a while depending on the size of your library.",
253
+ "importComplete": "Import Complete",
254
+ "importFailed": "Import Failed",
255
+ "importFullRange": "Import full history",
256
+ "importFullRangeHelp": "By default only history older than Tracearr's earliest tracked session for this server is imported, so sessions Tracearr already recorded are never duplicated. Enable this to import the plugin's entire history regardless of overlap, if your Tracearr history has gaps. Exact duplicates are still skipped.",
257
+ "importHistory": "Import History",
258
+ "importInProgressGeneric": "Import in progress...",
259
+ "importInProgressPercent": "Import in progress ({{percent}}% complete)...",
260
+ "importOptions": "Import Options",
261
+ "importProgress": "Import Progress",
262
+ "imported": "Imported",
263
+ "importing": "Importing...",
264
+ "includeStreamDetails": "Include detailed stream data (codecs, bitrate, resolution)",
265
+ "includeStreamDetailsHelp": "Imports additional stream information. May increase import time significantly.",
266
+ "jellyfinEmby": "Jellyfin/Emby (Jellystat)",
267
+ "jellystat": "Import from Jellystat",
268
+ "noServers": "No Servers Connected",
269
+ "noServersHint": "You need at least one connected server to import data.",
270
+ "overlapSkipped": "{{count}} skipped as overlap",
271
+ "overwriteFriendlyNames": "Overwrite existing friendly names with Tautulli names",
272
+ "overwriteFriendlyNamesHelp": "Existing identity names in Tracearr will be replaced with the friendly names from Tautulli.",
273
+ "page": "Page",
274
+ "playbackReporting": "Playback Reporting Plugin",
275
+ "playbackReportingDesc": "Import history directly from the Playback Reporting plugin installed on your Jellyfin or Emby server. No file export needed.",
276
+ "pleaseEnterDetails": "Please enter Tautulli URL and API key",
277
+ "pleaseSelectJsonFile": "Please select a JSON file",
278
+ "plex": "Plex (Tautulli)",
279
+ "pluginFound": "Plugin found: {{records}} records from {{oldestDate}} to {{newestDate}}",
280
+ "pluginNotInstalled": "The Playback Reporting plugin is not installed on this server, or Tracearr cannot reach it. Install it from the server's plugin catalog to start recording history, or use the Jellystat import below.",
281
+ "processed": "Processed",
282
+ "recordsMayBeSkipped": "Records may be skipped if:",
283
+ "selectJellyfinServer": "Select a Jellyfin or Emby server",
284
+ "selectPlexServer": "Select a Plex server",
285
+ "selectTargetServer": "Select Target Server",
286
+ "serverTimezone": "Server Timezone",
287
+ "serverTimezoneHelp": "Must match the timezone configured on your media server host, not your browser's timezone. Playback Reporting timestamps are stored in local server time.",
288
+ "skipDuplicate": "Duplicate session — The session was already imported previously.",
289
+ "skipDuplicatePlugin": "Duplicate record - already imported directly or arrived earlier via a Jellystat import of the same plugin data.",
290
+ "skipInProgress": "In-progress session — Active/incomplete sessions without a reference ID are skipped.",
291
+ "skipOverlap": "Overlapping record - the timestamp falls inside the period Tracearr already tracks for this server. Enable full-range import to include it.",
292
+ "skipSyncHint": "If many records are skipped, ensure you've synced your server recently in Settings → Servers.",
293
+ "skipUserNotFoundJellyfin": "User not found — The Jellyfin/Emby user doesn't exist in Tracearr. Sync your server first to add all users.",
294
+ "skipUserNotFoundPlex": "User not found — The Plex user doesn't exist in Tracearr. Sync your server first to add all users.",
295
+ "skipped": "Skipped",
296
+ "startImport": "Start Import",
297
+ "startingImport": "Starting import...",
298
+ "step1": "1",
299
+ "step2": "2",
300
+ "targetServer": "Target Server",
301
+ "tautulli": "Import from Tautulli",
302
+ "tautulliUrl": "Tautulli URL",
303
+ "tautulliUrlHelp": "The URL of your Tautulli instance.",
304
+ "tautulliUrlPlaceholder": "http://localhost:8181",
305
+ "testing": "Testing...",
306
+ "testingConnection": "Testing connection...",
307
+ "title": "Import Data",
308
+ "updateExistingRecords": "Update existing records with stream details",
309
+ "updateExistingRecordsHelp": "Previously imported records will be updated with stream quality data.",
310
+ "uploadJellystatBackup": "Upload Jellystat Backup",
311
+ "uploadingBackup": "Uploading backup file..."
312
+ },
313
+ "ipWarning": {
314
+ "acknowledge": "Got it",
315
+ "message": "All users appear to be using the same IP address or local network IPs. This may affect rule-based logic for location or IP addresses."
316
+ },
317
+ "jobs": {
318
+ "backfill": "Backfill",
319
+ "cleanup": "Cleanup",
320
+ "delayed": "delayed",
321
+ "description": "",
322
+ "errors": "errors",
323
+ "jobHistory": "Job History",
324
+ "jobHistoryDesc": "Recent maintenance job executions",
325
+ "lastJobCompleted": "Last job completed successfully",
326
+ "lastJobFailed": "Last job failed",
327
+ "mayTakeAWhile": "This may take a while",
328
+ "mayTakeAWhileDesc": "This job may take several minutes to complete depending on the size of your library.",
329
+ "normalization": "Normalization",
330
+ "processed": "processed",
331
+ "queued": "queued",
332
+ "runConfirm": "Run {{name}}?",
333
+ "runJob": "Run Job",
334
+ "running": "running",
335
+ "runningState": "Running",
336
+ "startJob": "Start Job",
337
+ "title": "Maintenance Jobs",
338
+ "unchanged": "unchanged",
339
+ "updated": "updated",
340
+ "waiting": "Waiting"
341
+ },
342
+ "mobile": {
343
+ "addDevice": "Add Device",
344
+ "connectedOn": "",
345
+ "copyToken": "Copy token",
346
+ "deviceName": "Device name",
347
+ "deviceNamePlaceholder": "e.g. iPhone 15",
348
+ "devicesConnected": "{{current}} of {{max}} devices connected",
349
+ "disable": "Disable",
350
+ "disableMobileAccess": "Disable Mobile Access",
351
+ "disableMobileAccessConfirm": "This will disconnect all mobile devices and revoke all sessions. You can re-enable mobile access later.",
352
+ "done": "Done",
353
+ "downloadOnAppStore": "Download on the App Store",
354
+ "enableMobileAccess": "Enable Mobile Access",
355
+ "enabling": "Enabling...",
356
+ "expiresIn": "Expires in {{time}}",
357
+ "externalUrlBanner": "Using a reverse proxy or accessing remotely? Set your",
358
+ "externalUrlBannerLink": "External URL",
359
+ "externalUrlBannerSuffix": "so the mobile app can connect to your server.",
360
+ "externalUrlRequired": "An external URL must be configured in General Settings for mobile pairing to work.",
361
+ "failedToGenerateToken": "Failed to Generate Token",
362
+ "generateToken": "Generate Pair Token",
363
+ "getOnGooglePlay": "Get it on Google Play",
364
+ "lastSeen": "",
365
+ "mobileAccessDisabled": "Mobile Access Disabled",
366
+ "mobileAccessDisabledDesc": "Enable mobile access to allow the Tracearr mobile app to connect to your server.",
367
+ "noDevices": "No devices connected",
368
+ "noDevicesDesc": "",
369
+ "oneTimePairToken": "One-Time Pair Token",
370
+ "pairDevice": "Pair Device",
371
+ "pairNewDevice": "Pair New Device",
372
+ "pairNewDeviceDesc": "Scan the QR code with the Tracearr mobile app, or enter the token manually.",
373
+ "pendingTokens": "{{count}} pending pair tokens",
374
+ "removeDevice": "Remove Device",
375
+ "removeDeviceConfirm": "Are you sure you want to remove {{deviceName}}? This device will need to pair again to reconnect.",
376
+ "renameDevice": "Rename Device",
377
+ "renameDeviceDesc": "Enter a name to identify this device in the list.",
378
+ "revokeAll": "Revoke All Sessions",
379
+ "revokeAllConfirm": "This will disconnect all mobile devices. They will need to pair again to reconnect.",
380
+ "revokeAllSessions": "Revoke All",
381
+ "scanQrCode": "Scan QR Code",
382
+ "title": "Mobile App",
383
+ "tokenExpires": "Token expires in {{time}}",
384
+ "tokenExpiryNote": "This token expires in 5 minutes and can only be used once."
385
+ },
386
+ "nav": {
387
+ "descriptions": {
388
+ "api": "",
389
+ "appearance": "",
390
+ "backup": "",
391
+ "behavior": "",
392
+ "connections": "",
393
+ "destinations": "",
394
+ "email": "",
395
+ "guest": "",
396
+ "import": "",
397
+ "jobs": "",
398
+ "locale": "",
399
+ "mobile": "",
400
+ "newsletters": "",
401
+ "plexAccounts": "",
402
+ "posters": "",
403
+ "remote": ""
404
+ },
405
+ "groups": {
406
+ "access": "",
407
+ "data": "",
408
+ "general": "",
409
+ "notifications": "",
410
+ "servers": ""
411
+ },
412
+ "itemLabel": "",
413
+ "label": "",
414
+ "sections": {
415
+ "api": "",
416
+ "appearance": "",
417
+ "backup": "",
418
+ "behavior": "",
419
+ "connections": "",
420
+ "destinations": "",
421
+ "email": "",
422
+ "guest": "",
423
+ "import": "",
424
+ "jobs": "",
425
+ "locale": "",
426
+ "mobile": "",
427
+ "newsletters": "",
428
+ "plexAccounts": "",
429
+ "posters": "",
430
+ "remote": ""
431
+ },
432
+ "selectLabel": ""
433
+ },
434
+ "newsletters": {
435
+ "addEmailDestination": "",
436
+ "copyOf": "",
437
+ "counts": {
438
+ "albums_one": "",
439
+ "albums_other": "",
440
+ "movies_one": "",
441
+ "movies_other": "",
442
+ "shows_one": "",
443
+ "shows_other": "",
444
+ "watched_one": "",
445
+ "watched_other": ""
446
+ },
447
+ "deleteDescription": "",
448
+ "deleteTitle": "",
449
+ "duplicate": "",
450
+ "editor": {
451
+ "actions": {
452
+ "more": "",
453
+ "preview": "",
454
+ "send": "",
455
+ "sendHint": "",
456
+ "test": "",
457
+ "testHint": ""
458
+ },
459
+ "allLibraries": "",
460
+ "allServers": "",
461
+ "basics": "",
462
+ "clear": "",
463
+ "content": "",
464
+ "cron": "",
465
+ "cronHint": "",
466
+ "dayOfMonth": "",
467
+ "dayOfMonthHelp": "",
468
+ "dayOfWeek": "",
469
+ "days": "",
470
+ "delivery": {
471
+ "destination": "",
472
+ "destinationHelp": "",
473
+ "hostedNeedsUrl": "",
474
+ "imageMode": "",
475
+ "modeHelp": {
476
+ "hosted": "",
477
+ "inline": "",
478
+ "none": ""
479
+ },
480
+ "modePreviewHint": "",
481
+ "modes": {
482
+ "hosted": "",
483
+ "inline": "",
484
+ "none": ""
485
+ },
486
+ "noDestination": "",
487
+ "pickDestination": "",
488
+ "skipWhenEmpty": "",
489
+ "skipWhenEmptyHelp": "",
490
+ "title": ""
491
+ },
492
+ "dstNote": "",
493
+ "enabledHelp": "",
494
+ "fixFirst": "",
495
+ "headerSummary": "",
496
+ "historyNeedsSave": "",
497
+ "intro": "",
498
+ "introPlaceholder": "",
499
+ "kinds": {
500
+ "cron": "",
501
+ "daily": "",
502
+ "monthly": "",
503
+ "weekly": ""
504
+ },
505
+ "libraries": "",
506
+ "librariesHelp": "",
507
+ "librariesSelected": "",
508
+ "links": {
509
+ "tracearr": "",
510
+ "tracearrNote": ""
511
+ },
512
+ "message": "",
513
+ "name": "",
514
+ "nameHelp": "",
515
+ "newTitle": "",
516
+ "nextRun": "",
517
+ "nextRunPending": "",
518
+ "noLibraries": "",
519
+ "noServers": "",
520
+ "notFound": "",
521
+ "outro": "",
522
+ "outroPlaceholder": "",
523
+ "placeholders": {
524
+ "end_date": "",
525
+ "item_count": "",
526
+ "server_name": "",
527
+ "start_date": ""
528
+ },
529
+ "preview": {
530
+ "countsListed": {
531
+ "albums": "",
532
+ "movies": "",
533
+ "shows": ""
534
+ },
535
+ "draft": "",
536
+ "images": "",
537
+ "imagesBlocked": "",
538
+ "imagesBlockedNote": "",
539
+ "imagesOn": "",
540
+ "linksNote": "",
541
+ "recipients": "",
542
+ "subjectLabel": "",
543
+ "title": "",
544
+ "variantTab": "",
545
+ "variants": "",
546
+ "width": "",
547
+ "widths": {
548
+ "desktop": "",
549
+ "phone": ""
550
+ },
551
+ "window": "",
552
+ "windowSince": ""
553
+ },
554
+ "previewVariant_one": "",
555
+ "previewVariant_other": "",
556
+ "readiness": {
557
+ "destination": "",
558
+ "destinationError": "",
559
+ "destinationFail": "",
560
+ "destinationUnknown": "",
561
+ "dns": "",
562
+ "dnsLink": "",
563
+ "emptyVariant": "",
564
+ "externalUrl": "",
565
+ "externalUrlFail": "",
566
+ "externalUrlNotHttps": "",
567
+ "fixDestination": "",
568
+ "fixExternalUrl": "",
569
+ "fixRecipients": "",
570
+ "fromDomain": "",
571
+ "fromDomainFail": "",
572
+ "fromDomainUnknown": "",
573
+ "intro": "",
574
+ "noPublicUrl": "",
575
+ "privatePublicUrl": "",
576
+ "recipientsFail": "",
577
+ "recipientsLoadFailed": "",
578
+ "recipientsUnknown": "",
579
+ "recipients_one": "",
580
+ "recipients_other": "",
581
+ "serverSettingsLink": "",
582
+ "staleScope": "",
583
+ "title": "",
584
+ "variantsLoadFailed": ""
585
+ },
586
+ "recipients": {
587
+ "account": "",
588
+ "addAddress": "",
589
+ "addressLabel": "",
590
+ "badAddress": "",
591
+ "contactEmailFor": "",
592
+ "emptyDescription": "",
593
+ "emptyTitle": "",
594
+ "exclude": "",
595
+ "excludeAction": "",
596
+ "excludedAfterSave": "",
597
+ "excludedCount": "",
598
+ "excludedHelp": "",
599
+ "extraAddress": "",
600
+ "extraAddresses": "",
601
+ "extraAddressesHelp": "",
602
+ "groupsNote": "",
603
+ "include": "",
604
+ "includeAction": "",
605
+ "includedAfterSave": "",
606
+ "loadFailed": "",
607
+ "members": "",
608
+ "membersHelp": "",
609
+ "membersOff": "",
610
+ "membersOffSuppressed": "",
611
+ "nameLabel": "",
612
+ "namePlaceholder": "",
613
+ "noAddress": "",
614
+ "noAddressHelp": "",
615
+ "openUserPage": "",
616
+ "ownerNote": "",
617
+ "reasons": {
618
+ "banned": "",
619
+ "pending": ""
620
+ },
621
+ "removeAddress": "",
622
+ "saveEmail": "",
623
+ "saveFirst": "",
624
+ "saveFirstHelp": "",
625
+ "staleScope": "",
626
+ "suppressed": "",
627
+ "suppressedHeading": "",
628
+ "suppressedHelp": "",
629
+ "title": "",
630
+ "unknownMember": "",
631
+ "willReceive": ""
632
+ },
633
+ "removeLibrary": "",
634
+ "save": "",
635
+ "saving": "",
636
+ "schedule": "",
637
+ "scheduleKind": "",
638
+ "searchLibraries": "",
639
+ "searchServers": "",
640
+ "sections": {
641
+ "description": "",
642
+ "labels": {
643
+ "mostWatched": "",
644
+ "movies": "",
645
+ "music": "",
646
+ "seasons": "",
647
+ "shows": ""
648
+ },
649
+ "legend": "",
650
+ "mostWatched": "",
651
+ "mostWatchedHelp": "",
652
+ "movies": "",
653
+ "music": "",
654
+ "musicHelp": "",
655
+ "shows": "",
656
+ "the": "",
657
+ "units": {
658
+ "albums": "",
659
+ "mostPlayed": "",
660
+ "movies": "",
661
+ "seasonsEach": "",
662
+ "shows": ""
663
+ },
664
+ "upTo": ""
665
+ },
666
+ "send": {
667
+ "confirm": "",
668
+ "nobody": "",
669
+ "previewing": "",
670
+ "sending": "",
671
+ "summary": "",
672
+ "title": "",
673
+ "trimmed_one": "",
674
+ "trimmed_other": ""
675
+ },
676
+ "sendNeedsSave": "",
677
+ "senderName": "",
678
+ "senderNameHelp": "",
679
+ "senderNameRequiredMulti": "",
680
+ "servers": "",
681
+ "serversHelp": "",
682
+ "serversSelected": "",
683
+ "subject": "",
684
+ "subjectHelp": "",
685
+ "tabs": {
686
+ "edit": "",
687
+ "history": ""
688
+ },
689
+ "test": {
690
+ "address": "",
691
+ "description": "",
692
+ "send": "",
693
+ "title": "",
694
+ "variant": ""
695
+ },
696
+ "time": "",
697
+ "timezone": "",
698
+ "timezoneHelp": "",
699
+ "turnOnNow": "",
700
+ "unknownLibrary": "",
701
+ "unsaved": "",
702
+ "variantHeading": "",
703
+ "variantsNote": "",
704
+ "windowHelp": {
705
+ "fixed": "",
706
+ "since_last_send": ""
707
+ },
708
+ "windowKind": "",
709
+ "windowMax": "",
710
+ "windowSentence": {
711
+ "fallback": "",
712
+ "fallbackLabel": "",
713
+ "fixed": "",
714
+ "fixedAfter": "",
715
+ "fixedLabel": ""
716
+ },
717
+ "windows": {
718
+ "fixed": "",
719
+ "since_last_send": ""
720
+ }
721
+ },
722
+ "empty": "",
723
+ "emptyDescription": "",
724
+ "enabled": "",
725
+ "history": {
726
+ "attempts": "",
727
+ "empty": "",
728
+ "emptyDescription": "",
729
+ "finished": "",
730
+ "loadFailed": "",
731
+ "open": "",
732
+ "openSnapshot": "",
733
+ "openVariantSnapshot": "",
734
+ "page": "",
735
+ "pruned": "",
736
+ "recipients": "",
737
+ "recipientsEmpty": "",
738
+ "retryFailed": "",
739
+ "sendTitle": "",
740
+ "snapshotTitle": "",
741
+ "status": {
742
+ "failed": "",
743
+ "queued": "",
744
+ "sent": "",
745
+ "suppressed": "",
746
+ "unknown": ""
747
+ },
748
+ "trigger": {
749
+ "manual": "",
750
+ "schedule": "",
751
+ "test": ""
752
+ },
753
+ "unknownHelp": "",
754
+ "variant": "",
755
+ "variantEmpty": "",
756
+ "window": ""
757
+ },
758
+ "lastSend": "",
759
+ "neverSent": "",
760
+ "new": "",
761
+ "nextRun": "",
762
+ "noDestinationDescription": "",
763
+ "noDestinationHint": "",
764
+ "noDestinationTitle": "",
765
+ "noNextRun": "",
766
+ "outcome": {
767
+ "failed": "",
768
+ "partial": "",
769
+ "rendering": "",
770
+ "sending": "",
771
+ "sent": "",
772
+ "skipped_empty": ""
773
+ },
774
+ "ownerOnly": "",
775
+ "richText": {
776
+ "bold": "",
777
+ "bulletList": "",
778
+ "counter": "",
779
+ "italic": "",
780
+ "link": "",
781
+ "linkApply": "",
782
+ "linkHref": ""
783
+ },
784
+ "rowActions": "",
785
+ "schedule": {
786
+ "cron": "",
787
+ "daily": "",
788
+ "inZone": "",
789
+ "monthly": "",
790
+ "weekly": ""
791
+ },
792
+ "sendNow": ""
793
+ },
794
+ "plex": {
795
+ "chooseServer": "Choose which Plex Media Server to monitor",
796
+ "selectServer": "Select Server",
797
+ "signInWithPlex": "Sign in with Plex",
798
+ "signUpWithPlex": "Sign up with Plex"
799
+ },
800
+ "serverHealth": {
801
+ "multipleUnreachable": "{{count}} servers unreachable: {{serverNames}}",
802
+ "unreachable": "{{serverName}} is unreachable"
803
+ },
804
+ "servers": {
805
+ "addServer": "Add Server",
806
+ "addServerDialogDescOther": "Connect a Jellyfin or Emby server.",
807
+ "addServerDialogDescPlex": "Select a Plex server from your linked account.",
808
+ "added": "Added {{date}}",
809
+ "allFieldsRequired": "All fields are required",
810
+ "allServersConnected": "All Servers Connected",
811
+ "allServersConnectedDesc": "All servers from this account are already connected.",
812
+ "apiKeyHelp": "Found in your media server's dashboard under API Keys or Advanced settings.",
813
+ "apiKeyHelpEmby": "Find this in Emby Server → API Keys",
814
+ "apiKeyHelpJellyfin": "Find this in Jellyfin Dashboard → API Keys",
815
+ "apiKeyPlaceholder": "Enter your API key",
816
+ "checkingConnection": "Checking connection…",
817
+ "chooseAccount": "Choose an account...",
818
+ "connectServer": "Connect Server",
819
+ "connecting": "Connecting...",
820
+ "connectionFailed": "Connection failed",
821
+ "connectionSuccess": "Connection successful",
822
+ "description": "Manage your connected Plex, Jellyfin, and Emby servers",
146
823
  "discoveringConnections": "Discovering connections...",
824
+ "discoveringServers": "Discovering available Plex servers...",
825
+ "editServer": "Edit Server",
826
+ "editServerDesc": "Update the server name or connection URL.",
827
+ "loadingAccounts": "Loading linked Plex accounts...",
828
+ "noPlexAccountsLinked": "No Plex Accounts Linked",
829
+ "noPlexAccountsLinkedHint": "Link a Plex account above, then come back to add a server.",
830
+ "noServersConnected": "No servers connected",
831
+ "noServersConnectedHint": "Click \"Add Server\" to connect a Jellyfin or Emby server",
147
832
  "plexAccount": "Plex Account",
148
- "serverUrlHelpJellyfin": "The URL where your Jellyfin server is accessible",
149
- "serverUrlHelpEmby": "The URL where your Emby server is accessible",
150
- "apiKeyHelpJellyfin": "Find this in Jellyfin Dashboard → API Keys",
151
- "apiKeyHelpEmby": "Find this in Emby Server → API Keys",
152
833
  "plexServerPlaceholder": "My Plex Server",
153
834
  "plexServerUrlPlaceholder": "http://192.168.1.100:32400",
154
- "updateHint": "Or click Update below to save only the name change.",
155
- "added": "Added {{date}}",
156
- "realtimeActive": "Real-time updates active",
157
- "pollingMode": "Polling",
158
- "setupRealtime": "Set up real-time updates",
159
- "realtimeError": "Real-time error",
160
- "checkingConnection": "Checking connection…",
161
- "pluginVersion": "plugin v{{version}}",
162
835
  "pluginUpdateAvailable": "Plugin update available",
836
+ "pluginVersion": "plugin v{{version}}",
837
+ "pollingMode": "Polling",
838
+ "posterSource": {
839
+ "automatic": "Automatic (most recent)",
840
+ "description": "When a title is on more than one server, use this server's poster. If it doesn't have one, we'll fall back to the most recently added copy.",
841
+ "emptyHint": "Add a server to choose a preferred poster source.",
842
+ "label": "Preferred Poster Source",
843
+ "ownerOnly": "",
844
+ "title": "Poster Preferences",
845
+ "titleDesc": "Choose which server's poster is shown when a title exists on more than one server"
846
+ },
847
+ "publicUrl": "",
848
+ "publicUrlHint": "",
849
+ "realtimeActive": "Real-time updates active",
163
850
  "realtimeDialog": {
164
- "title": "Enable real-time updates",
165
- "updateTitle": "Update the Tracearr SSE plugin",
166
- "jellyfinDescription": "Install the Tracearr SSE plugin to get instant session updates without waiting for the next poll.",
167
- "embyDescription": "Install the Tracearr SSE plugin to get instant session updates without waiting for the next poll.",
168
- "jellyfinUpdateDescription": "A newer plugin release is available. Open your Jellyfin dashboard, go to Plugins, Catalog, and update Tracearr SSE, then restart Jellyfin.",
169
- "embyUpdateDescription": "A newer plugin release is available. Download the latest release zip, replace the plugin DLL in your Emby plugins folder, and restart Emby.",
170
- "repositoryUrl": "Repository URL",
171
- "copyUrl": "Copy URL",
172
- "jellyfinRepoUrl": "https://raw.githubusercontent.com/Tracearr/Media-Server-SSE/main/manifest.json",
173
- "embyReleasesUrl": "https://github.com/Tracearr/Media-Server-SSE/releases",
174
- "openReleases": "Open releases page",
175
851
  "autoDetectNote": "Restart Jellyfin or Emby after installing the plugin; the restart is required. Tracearr itself needs no restart and picks the plugin up automatically.",
176
852
  "close": "Close",
853
+ "copyUrl": "Copy URL",
854
+ "embyDescription": "Install the Tracearr SSE plugin to get instant session updates without waiting for the next poll.",
855
+ "embyReleasesUrl": "https://github.com/Tracearr/Media-Server-SSE/releases",
856
+ "embyUpdateDescription": "A newer plugin release is available. Download the latest release zip, replace the plugin DLL in your Emby plugins folder, and restart Emby.",
177
857
  "issueBlocked": "The server reports the plugin as installed and active, but Tracearr gets a 404 from its endpoint. A reverse proxy blocking the path is the usual cause.",
858
+ "issueMalfunctioned": "The server reports the plugin failed to load. Updating the plugin or the media server usually clears this.",
178
859
  "issueRestartRequired": "The plugin is installed, but the media server needs a restart before it activates.",
179
- "issueMalfunctioned": "The server reports the plugin failed to load. Updating the plugin or the media server usually clears this."
180
- },
181
- "posterSource": {
182
- "title": "Poster Preferences",
183
- "titleDesc": "Choose which server's poster is shown when a title exists on more than one server",
184
- "label": "Preferred Poster Source",
185
- "description": "When a title is on more than one server, use this server's poster. If it doesn't have one, we'll fall back to the most recently added copy.",
186
- "automatic": "Automatic (most recent)",
187
- "emptyHint": "Add a server to choose a preferred poster source."
860
+ "jellyfinDescription": "Install the Tracearr SSE plugin to get instant session updates without waiting for the next poll.",
861
+ "jellyfinRepoUrl": "https://raw.githubusercontent.com/Tracearr/Media-Server-SSE/main/manifest.json",
862
+ "jellyfinUpdateDescription": "A newer plugin release is available. Open your Jellyfin dashboard, go to Plugins, Catalog, and update Tracearr SSE, then restart Jellyfin.",
863
+ "openReleases": "Open releases page",
864
+ "repositoryUrl": "Repository URL",
865
+ "title": "Enable real-time updates",
866
+ "updateTitle": "Update the Tracearr SSE plugin"
188
867
  },
189
- "version": {
190
- "installed": "Version {{version}}",
191
- "upToDate": "up to date",
192
- "updateAvailable": "update {{version}} available"
193
- }
194
- },
195
- "mobile": {
196
- "title": "Mobile App",
197
- "pairDevice": "Pair Device",
198
- "connectedDevices": "Connected Devices",
199
- "generateToken": "Generate Pair Token",
200
- "scanQrCode": "Scan QR Code",
201
- "tokenExpires": "Token expires in {{time}}",
202
- "noDevices": "No devices connected",
203
- "revokeAll": "Revoke All Sessions",
204
- "getTheApp": "Get the App",
205
- "getTheAppDesc": "Download the Tracearr mobile app for iOS or Android",
206
- "getOnGooglePlay": "Get it on Google Play",
207
- "downloadOnAppStore": "Download on the App Store",
208
- "pairYourDevice": "Pair Your Device",
209
- "pairYourDeviceDesc": "",
210
- "externalUrlRequired": "An external URL must be configured in General Settings for mobile pairing to work.",
211
- "mobileAccessDisabled": "Mobile Access Disabled",
212
- "mobileAccessDisabledDesc": "Enable mobile access to allow the Tracearr mobile app to connect to your server.",
213
- "enableMobileAccess": "Enable Mobile Access",
214
- "enabling": "Enabling...",
215
- "devicesConnected": "{{current}} of {{max}} devices connected",
216
- "pendingTokens": "{{count}} pending pair tokens",
217
- "addDevice": "Add Device",
218
- "disableMobileAccess": "Disable Mobile Access",
219
- "connectedDevicesDesc": "{{count}} devices paired to your server",
220
- "revokeAllSessions": "Revoke All",
221
- "pairNewDevice": "Pair New Device",
222
- "pairNewDeviceDesc": "Scan the QR code with the Tracearr mobile app, or enter the token manually.",
223
- "expiresIn": "Expires in {{time}}",
224
- "oneTimePairToken": "One-Time Pair Token",
225
- "copyToken": "Copy token",
226
- "tokenExpiryNote": "This token expires in 5 minutes and can only be used once.",
227
- "done": "Done",
228
- "disableMobileAccessConfirm": "This will disconnect all mobile devices and revoke all sessions. You can re-enable mobile access later.",
229
- "disable": "Disable",
230
- "revokeAllConfirm": "This will disconnect all mobile devices. They will need to pair again to reconnect.",
231
- "renameDevice": "Rename Device",
232
- "renameDeviceDesc": "Enter a name to identify this device in the list.",
233
- "deviceName": "Device name",
234
- "deviceNamePlaceholder": "e.g. iPhone 15",
235
- "removeDevice": "Remove Device",
236
- "failedToGenerateToken": "Failed to Generate Token",
237
- "removeDeviceConfirm": "Are you sure you want to remove {{deviceName}}? This device will need to pair again to reconnect.",
238
- "externalUrlBanner": "Using a reverse proxy or accessing remotely? Set your",
239
- "externalUrlBannerLink": "External URL",
240
- "externalUrlBannerSuffix": "so the mobile app can connect to your server."
868
+ "realtimeError": "Real-time error",
869
+ "removeServer": "Remove Server",
870
+ "removeServerConfirm": "Are you sure you want to remove this server? All associated session data will be retained, but you won't be able to monitor new sessions from this server.",
871
+ "reorder": "",
872
+ "selectAccountHelp": "Select which Plex account to discover servers from.",
873
+ "selectPlexAccount": "Select Plex Account",
874
+ "serverColor": "Server Color",
875
+ "serverColorDesc": "Used for visual attribution in multi-server view",
876
+ "serverName": "Server Name",
877
+ "serverNamePlaceholder": "My Media Server",
878
+ "serverType": "Server Type",
879
+ "serverUrl": "Server URL",
880
+ "serverUrlHelp": "Direct URL to your Jellyfin or Emby server. Use IP:port for best reliability.",
881
+ "serverUrlHelpEmby": "The URL where your Emby server is accessible",
882
+ "serverUrlHelpJellyfin": "The URL where your Jellyfin server is accessible",
883
+ "serverUrlPlaceholder": "http://192.168.1.100:8096",
884
+ "setupRealtime": "Set up real-time updates",
885
+ "syncInterval": "Sync Interval",
886
+ "testConnection": "Test Connection",
887
+ "title": "Connected Servers",
888
+ "updateHint": "Or click Update below to save only the name change.",
889
+ "updating": "Updating...",
890
+ "version": {
891
+ "installed": "Version {{version}}",
892
+ "upToDate": "up to date",
893
+ "updateAvailable": "update {{version}} available"
894
+ }
895
+ },
896
+ "shared": {
897
+ "timezone": {
898
+ "empty": "",
899
+ "other": "",
900
+ "placeholder": "",
901
+ "search": ""
902
+ }
241
903
  },
242
904
  "tailscale": {
243
- "title": "Tailscale VPN",
244
- "description": "",
245
- "notAvailable": "Tailscale binary not found. This feature is only available when running the official Docker image.",
246
- "disabledDescription": "Enable Tailscale to put Tracearr on your private tailnet. No port forwarding or reverse proxy required.",
247
- "hostnameLabel": "Device Hostname",
248
- "hostnameHint": "Optional custom name for this device on your tailnet. Letters, numbers, and hyphens only.",
249
- "enable": "Enable Tailscale",
250
- "disable": "Disable Tailscale",
251
- "starting": "Starting Tailscale...",
252
- "stopping": "Stopping Tailscale...",
253
- "awaitingAuth": "Waiting for authorization...",
254
905
  "authorize": "Authorize in Tailscale",
906
+ "awaitingAuth": "Waiting for authorization...",
255
907
  "connected": "Tailscale is connected. Your Tracearr instance is available on the tailnet.",
256
- "hostname": "Hostname",
908
+ "description": "",
909
+ "disable": "Disable Tailscale",
910
+ "disableConfirmDescription": "This will disconnect Tracearr from your tailnet. You can re-enable without re-authorizing.",
911
+ "disableConfirmTitle": "Disable Tailscale?",
912
+ "disabledDescription": "Enable Tailscale to put Tracearr on your private tailnet. No port forwarding or reverse proxy required.",
257
913
  "dnsName": "DNS Name",
258
- "tailnetUrl": "URL",
259
- "showLogs": "Show Logs",
260
- "hideLogs": "Hide Logs",
261
- "noLogs": "No log output available.",
914
+ "enable": "Enable Tailscale",
262
915
  "exitNodeNone": "None",
263
916
  "exitNodeOffline": "(offline)",
264
- "unknownError": "An unknown error occurred.",
265
- "disableConfirmTitle": "Disable Tailscale?",
266
- "disableConfirmDescription": "This will disconnect Tracearr from your tailnet. You can re-enable without re-authorizing.",
267
- "resetConfirmTitle": "Reset Tailscale?",
917
+ "hideLogs": "Hide Logs",
918
+ "hostname": "Hostname",
919
+ "hostnameHint": "Optional custom name for this device on your tailnet. Letters, numbers, and hyphens only.",
920
+ "hostnameLabel": "Device Hostname",
921
+ "noLogs": "No log output available.",
922
+ "notAvailable": "Tailscale binary not found. This feature is only available when running the official Docker image.",
268
923
  "resetConfirmDescription": "This will disconnect Tracearr from your tailnet and remove the device identity. You will need to re-authorize if you enable it again.",
924
+ "resetConfirmTitle": "Reset Tailscale?",
925
+ "showLogs": "Show Logs",
926
+ "starting": "Starting Tailscale...",
927
+ "stopping": "Stopping Tailscale...",
928
+ "tailnetUrl": "URL",
929
+ "title": "Tailscale VPN",
269
930
  "toast": {
931
+ "disableFailed": "Failed to disable Tailscale",
270
932
  "disabled": "Tailscale has been disabled.",
271
933
  "enableFailed": "Failed to enable Tailscale",
272
- "disableFailed": "Failed to disable Tailscale",
273
- "reset": "Tailscale has been reset.",
274
- "resetFailed": "Failed to reset Tailscale",
934
+ "exitNodeFailed": "Failed to set exit node",
275
935
  "exitNodeSet": "Exit node updated.",
276
- "exitNodeFailed": "Failed to set exit node"
277
- }
278
- },
279
- "jobs": {
280
- "title": "Maintenance Jobs",
281
- "description": "",
282
- "normalization": "Normalization",
283
- "backfill": "Backfill",
284
- "cleanup": "Cleanup",
285
- "running": "running",
286
- "queued": "queued",
287
- "delayed": "delayed",
288
- "waiting": "Waiting",
289
- "runningState": "Running",
290
- "runJob": "Run Job",
291
- "processed": "processed",
292
- "updated": "updated",
293
- "unchanged": "unchanged",
294
- "errors": "errors",
295
- "lastJobCompleted": "Last job completed successfully",
296
- "lastJobFailed": "Last job failed",
297
- "jobHistory": "Job History",
298
- "jobHistoryDesc": "Recent maintenance job executions",
299
- "runConfirm": "Run {{name}}?",
300
- "mayTakeAWhile": "This may take a while",
301
- "mayTakeAWhileDesc": "This job may take several minutes to complete depending on the size of your library.",
302
- "startJob": "Start Job"
303
- },
304
- "advanced": {
305
- "title": "Advanced Settings",
306
- "externalUrl": "External URL",
307
- "trustProxy": "Trust Proxy Headers",
308
- "reverseProxy": "Reverse Proxy",
309
- "connectionScenarios": "Connection Scenarios"
310
- },
311
- "accessControl": {
312
- "title": "Access Control",
313
- "description": "Configure who can access Tracearr",
314
- "allowGuestAccess": "Allow Guest Access",
315
- "allowGuestAccessDesc": "",
316
- "singleOwnerNote": "Note: When guest access is disabled, only the server owner can sign in. All other users will see an \"Access Denied\" message."
317
- },
318
- "import": {
319
- "title": "Import Data",
320
- "jellystat": "Import from Jellystat",
321
- "tautulli": "Import from Tautulli",
322
- "importProgress": "Import Progress",
323
- "importComplete": "Import Complete",
324
- "importFailed": "Import Failed",
325
- "processed": "Processed",
326
- "page": "Page",
327
- "imported": "Imported",
328
- "skipped": "Skipped",
329
- "enriched": "Enriched",
330
- "errors": "Errors",
331
- "noServers": "No Servers Connected",
332
- "noServersHint": "You need at least one connected server to import data.",
333
- "tautulliUrl": "Tautulli URL",
334
- "tautulliUrlPlaceholder": "http://localhost:8181",
335
- "tautulliUrlHelp": "The URL of your Tautulli instance.",
336
- "apiKeyHelp": "Found in Tautulli Settings → Web Interface → API Key.",
337
- "testing": "Testing...",
338
- "connectToTautulli": "Connect to Tautulli",
339
- "importHistory": "Import History",
340
- "targetServer": "Target Server",
341
- "selectPlexServer": "Select a Plex server",
342
- "overwriteFriendlyNames": "Overwrite existing friendly names with Tautulli names",
343
- "overwriteFriendlyNamesHelp": "Existing identity names in Tracearr will be replaced with the friendly names from Tautulli.",
344
- "includeStreamDetails": "Include detailed stream data (codecs, bitrate, resolution)",
345
- "includeStreamDetailsHelp": "Imports additional stream information. May increase import time significantly.",
346
- "importing": "Importing...",
347
- "startImport": "Start Import",
348
- "howItWorks": "How the import works",
349
- "howItWorksDesc": "Tracearr will import all historical watch data from your source. This may take a while depending on the size of your library.",
350
- "recordsMayBeSkipped": "Records may be skipped if:",
351
- "selectTargetServer": "Select Target Server",
352
- "selectJellyfinServer": "Select a Jellyfin or Emby server",
353
- "uploadJellystatBackup": "Upload Jellystat Backup",
354
- "exportBackupHint": "Export an Activity Backup from Jellystat",
355
- "exportBackupHelp": "In Jellystat, go to Settings → Backup → Activity Backup to export your data.",
356
- "importOptions": "Import Options",
357
- "enrichMetadata": "Enrich with media metadata (recommended)",
358
- "enrichMetadataHelp": "Fetches additional metadata from your media server for imported sessions.",
359
- "updateExistingRecords": "Update existing records with stream details",
360
- "updateExistingRecordsHelp": "Previously imported records will be updated with stream quality data.",
361
- "pleaseEnterDetails": "Please enter Tautulli URL and API key",
362
- "testingConnection": "Testing connection...",
363
- "pleaseSelectJsonFile": "Please select a JSON file",
364
- "uploadingBackup": "Uploading backup file...",
365
- "importHistoryDesc": "Import historical watch data from external sources",
366
- "plex": "Plex (Tautulli)",
367
- "jellyfinEmby": "Jellyfin/Emby (Jellystat)",
368
- "step1": "1",
369
- "step2": "2",
370
- "apiKeyPlaceholder": "Your Tautulli API key",
371
- "skipUserNotFoundPlex": "User not found — The Plex user doesn't exist in Tracearr. Sync your server first to add all users.",
372
- "skipDuplicate": "Duplicate session — The session was already imported previously.",
373
- "skipInProgress": "In-progress session — Active/incomplete sessions without a reference ID are skipped.",
374
- "skipUserNotFoundJellyfin": "User not found — The Jellyfin/Emby user doesn't exist in Tracearr. Sync your server first to add all users.",
375
- "skipSyncHint": "If many records are skipped, ensure you've synced your server recently in Settings → Servers.",
376
- "importInProgressPercent": "Import in progress ({{percent}}% complete)...",
377
- "importInProgressGeneric": "Import in progress...",
378
- "startingImport": "Starting import...",
379
- "connectedFound": "Connected! Found {{users}} users and {{records}} history records.",
380
- "playbackReporting": "Playback Reporting Plugin",
381
- "playbackReportingDesc": "Import history directly from the Playback Reporting plugin installed on your Jellyfin or Emby server. No file export needed.",
382
- "checkPlugin": "Check Plugin",
383
- "checkingPlugin": "Checking...",
384
- "pluginFound": "Plugin found: {{records}} records from {{oldestDate}} to {{newestDate}}",
385
- "pluginNotInstalled": "The Playback Reporting plugin is not installed on this server, or Tracearr cannot reach it. Install it from the server's plugin catalog to start recording history, or use the Jellystat import below.",
386
- "serverTimezone": "Server Timezone",
387
- "serverTimezoneHelp": "Must match the timezone configured on your media server host, not your browser's timezone. Playback Reporting timestamps are stored in local server time.",
388
- "importFullRange": "Import full history",
389
- "importFullRangeHelp": "By default only history older than Tracearr's earliest tracked session for this server is imported, so sessions Tracearr already recorded are never duplicated. Enable this to import the plugin's entire history regardless of overlap, if your Tracearr history has gaps. Exact duplicates are still skipped.",
390
- "overlapSkipped": "{{count}} skipped as overlap",
391
- "duplicates": "{{count}} duplicates skipped",
392
- "skipOverlap": "Overlapping record - the timestamp falls inside the period Tracearr already tracks for this server. Enable full-range import to include it.",
393
- "skipDuplicatePlugin": "Duplicate record - already imported directly or arrived earlier via a Jellystat import of the same plugin data."
394
- },
395
- "plex": {
396
- "signInWithPlex": "Sign in with Plex",
397
- "signUpWithPlex": "Sign up with Plex",
398
- "selectServer": "Select Server",
399
- "chooseServer": "Choose which Plex Media Server to monitor"
400
- },
401
- "account": {
402
- "createAccount": "Create Account",
403
- "email": "Email",
404
- "password": "Password",
405
- "displayName": "Display Name",
406
- "createYourAccount": "Create your account to get started",
407
- "signInToAccount": "Sign in to your account",
408
- "useLocalAccount": "Use local account instead"
936
+ "reset": "Tailscale has been reset.",
937
+ "resetFailed": "Failed to reset Tailscale"
938
+ },
939
+ "unknownError": "An unknown error occurred."
409
940
  },
941
+ "title": "Settings",
410
942
  "update": {
411
- "title": "Update Available",
412
- "releaseNotes": "Release Notes",
413
- "updateCommand": "Update Command",
414
- "pullInstructions": "After pulling, restart your container to apply the update.",
415
- "stableRelease": "Stable Release",
416
943
  "betaUpdate": "Beta Update",
417
944
  "newVersion": "New Version",
945
+ "pullInstructions": "After pulling, restart your container to apply the update.",
946
+ "releaseNotes": "Release Notes",
947
+ "stableRelease": "Stable Release",
948
+ "title": "Update Available",
949
+ "updateCommand": "Update Command",
418
950
  "versionAvailable": "{{version}} available"
419
- },
420
- "serverHealth": {
421
- "unreachable": "{{serverName}} is unreachable",
422
- "multipleUnreachable": "{{count}} servers unreachable: {{serverNames}}"
423
- },
424
- "ipWarning": {
425
- "message": "All users appear to be using the same IP address or local network IPs. This may affect rule-based logic for location or IP addresses.",
426
- "acknowledge": "Got it"
427
- },
428
- "backup": {
429
- "title": "Backup",
430
- "backToBackups": "Back to Backups",
431
- "description": "Backup and restore your Tracearr data",
432
- "createBackup": "Create Backup",
433
- "creating": "Creating backup...",
434
- "uploadBackup": "Upload Backup",
435
- "uploading": "Uploading...",
436
- "databaseSize": "Current database size: {{size}}",
437
- "freeSpace": "Backup directory free space: {{size}}",
438
- "lowDiskSpace": "Low disk space — backups and restores require at least twice the database size in free space.",
439
- "backupHistory": "Backup History",
440
- "noBackups": "No backups yet. Create your first backup above.",
441
- "filename": "Filename",
442
- "size": "Size",
443
- "date": "Date",
444
- "type": "Type",
445
- "version": "Version",
446
- "actions": "Actions",
447
- "typeManual": "Manual",
448
- "typeScheduled": "Scheduled",
449
- "typeUploaded": "Uploaded",
450
- "restoreAction": "Restore",
451
- "deleteConfirmTitle": "Delete Backup",
452
- "deleteConfirmDescription": "Are you sure you want to delete this backup? This cannot be undone.",
453
- "schedule": "Scheduled Backups",
454
- "scheduleType": "Schedule",
455
- "scheduleDisabled": "Disabled",
456
- "scheduleDaily": "Daily",
457
- "scheduleWeekly": "Weekly",
458
- "scheduleMonthly": "Monthly",
459
- "scheduleTime": "Time ({{timezone}})",
460
- "scheduleDayOfWeek": "Day of Week",
461
- "scheduleDayOfMonth": "Day of Month",
462
- "scheduleDayOfMonthHint": "On months with fewer days, the backup runs on the last day.",
463
- "retentionCount": "Keep Last",
464
- "retentionSuffix": "scheduled backups",
465
- "daySun": "Sunday",
466
- "dayMon": "Monday",
467
- "dayTue": "Tuesday",
468
- "dayWed": "Wednesday",
469
- "dayThu": "Thursday",
470
- "dayFri": "Friday",
471
- "daySat": "Saturday",
472
- "restore": {
473
- "title": "Restore Backup",
474
- "selectedBackup": "Selected Backup",
475
- "databaseSize": "Database Size",
476
- "sessions": "Sessions",
477
- "users": "Users",
478
- "servers": "Servers",
479
- "automations": "Automations",
480
- "libraryItems": "Library Items",
481
- "tables": "Tables",
482
- "warning": "Restoring will replace all existing data. You will need to re-login after the restore completes.",
483
- "confirmLabel": "I understand this will replace all data",
484
- "confirm": "Start Restore",
485
- "complete": "Restore completed successfully. The page will refresh shortly.",
486
- "failed": "Restore failed",
487
- "cannotRestore": "Restore requires PostgreSQL superuser privileges. Please ensure your database user has superuser privileges and try again.",
488
- "pgVersionMismatch": "Backup was created on PostgreSQL {{backupVersion}} but this server runs PostgreSQL {{serverVersion}}. Restoring a dump from a newer PostgreSQL version is not supported.",
489
- "tsVersionMismatch": "Backup was created with TimescaleDB {{backupVersion}} but this server only supports up to TimescaleDB {{serverVersion}}."
490
- },
491
- "toast": {
492
- "backupCreated": "Backup created successfully",
493
- "backupCreateFailed": "Failed to create backup",
494
- "backupUploaded": "Backup uploaded successfully",
495
- "backupUploadFailed": "Failed to upload backup",
496
- "backupDeleted": "Backup deleted",
497
- "backupDeleteFailed": "Failed to delete backup",
498
- "restoreStarted": "Restore started",
499
- "restoreStartFailed": "Failed to start restore",
500
- "scheduleSaved": "Backup schedule saved",
501
- "scheduleError": "Failed to save backup schedule"
502
- }
503
951
  }
504
952
  }