@roastcodes/ttdash 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +294 -0
- package/dist/assets/AutoImportModal-Dig6ASar.js +2 -0
- package/dist/assets/CustomTooltip-CPg9_T3c.js +1 -0
- package/dist/assets/DrillDownModal-C7O3X6oj.js +1 -0
- package/dist/assets/button-D7Ib8H7t.js +1 -0
- package/dist/assets/charts-vendor-CiBqdKXh.js +36 -0
- package/dist/assets/dialog-Cn1m7WhC.js +1 -0
- package/dist/assets/icons-vendor-DFoaijFJ.js +1 -0
- package/dist/assets/index-DWoj-vpZ.css +2 -0
- package/dist/assets/index-I9xzoyFJ.js +4 -0
- package/dist/assets/motion-vendor-BXI2L__C.js +1 -0
- package/dist/assets/react-vendor-0R1rd57Z.js +9 -0
- package/dist/assets/rolldown-runtime-COnpUsM8.js +1 -0
- package/dist/assets/ui-vendor-BGjRFQGY.js +45 -0
- package/dist/favicon.png +0 -0
- package/dist/favicon.svg +1 -0
- package/dist/index.html +26 -0
- package/package.json +95 -0
- package/server/report/charts.js +152 -0
- package/server/report/i18n.js +36 -0
- package/server/report/index.js +326 -0
- package/server/report/utils.js +674 -0
- package/server.js +1895 -0
- package/src/locales/de/common.json +996 -0
- package/src/locales/en/common.json +996 -0
- package/usage-normalizer.js +152 -0
|
@@ -0,0 +1,996 @@
|
|
|
1
|
+
{
|
|
2
|
+
"app": {
|
|
3
|
+
"name": "TTDash",
|
|
4
|
+
"language": "Language",
|
|
5
|
+
"languages": {
|
|
6
|
+
"de": "German",
|
|
7
|
+
"en": "English"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"header": {
|
|
11
|
+
"import": "Import",
|
|
12
|
+
"upload": "Upload",
|
|
13
|
+
"limits": "Limits",
|
|
14
|
+
"settings": "Settings",
|
|
15
|
+
"report": "Report",
|
|
16
|
+
"csv": "CSV",
|
|
17
|
+
"delete": "Delete",
|
|
18
|
+
"help": "Help & shortcuts",
|
|
19
|
+
"loaded": "Loaded",
|
|
20
|
+
"loadedAt": "Last loaded: {{time}}",
|
|
21
|
+
"autoLoadActive": "Auto-load on start",
|
|
22
|
+
"autoLoadAt": "Automatically loaded on start: {{time}}"
|
|
23
|
+
},
|
|
24
|
+
"emptyState": {
|
|
25
|
+
"description": "Upload a `toktrack` or legacy JSON file, or start local auto-import with local `toktrack`, `bunx toktrack daily --json`, or `npx --yes toktrack daily --json`.",
|
|
26
|
+
"autoImport": "Auto import",
|
|
27
|
+
"uploadFile": "Upload file",
|
|
28
|
+
"openSettings": "Settings & backups",
|
|
29
|
+
"or": "or"
|
|
30
|
+
},
|
|
31
|
+
"viewModes": {
|
|
32
|
+
"daily": "Daily view",
|
|
33
|
+
"monthly": "Monthly view",
|
|
34
|
+
"yearly": "Yearly view"
|
|
35
|
+
},
|
|
36
|
+
"periods": {
|
|
37
|
+
"day": "day",
|
|
38
|
+
"days": "days",
|
|
39
|
+
"month": "month",
|
|
40
|
+
"months": "months",
|
|
41
|
+
"year": "year",
|
|
42
|
+
"years": "years",
|
|
43
|
+
"unitDay": "day",
|
|
44
|
+
"unitMonth": "mo.",
|
|
45
|
+
"unitYear": "year"
|
|
46
|
+
},
|
|
47
|
+
"common": {
|
|
48
|
+
"all": "All",
|
|
49
|
+
"none": "None",
|
|
50
|
+
"reset": "Reset",
|
|
51
|
+
"notAvailable": "n/a",
|
|
52
|
+
"noData": "No data",
|
|
53
|
+
"generated": "Generated",
|
|
54
|
+
"view": "View",
|
|
55
|
+
"dateRange": "Date range",
|
|
56
|
+
"month": "Month",
|
|
57
|
+
"provider": "Provider",
|
|
58
|
+
"providers": "Providers",
|
|
59
|
+
"model": "Model",
|
|
60
|
+
"models": "Models",
|
|
61
|
+
"cost": "Cost",
|
|
62
|
+
"costs": "Costs",
|
|
63
|
+
"tokens": "Tokens",
|
|
64
|
+
"requests": "Requests",
|
|
65
|
+
"today": "Today",
|
|
66
|
+
"currentMonth": "Month",
|
|
67
|
+
"yes": "Yes",
|
|
68
|
+
"no": "No",
|
|
69
|
+
"enabled": "Enabled",
|
|
70
|
+
"disabled": "Disabled",
|
|
71
|
+
"visible": "Visible",
|
|
72
|
+
"hidden": "Hidden",
|
|
73
|
+
"open": "Open",
|
|
74
|
+
"close": "Close",
|
|
75
|
+
"startDate": "Start date",
|
|
76
|
+
"endDate": "End date",
|
|
77
|
+
"selectedProviders": "Selected providers",
|
|
78
|
+
"selectedModels": "Selected models",
|
|
79
|
+
"allProviders": "All providers",
|
|
80
|
+
"allModels": "All models",
|
|
81
|
+
"allMonths": "All months",
|
|
82
|
+
"noFilter": "No filter",
|
|
83
|
+
"focusMonth": "Focus month",
|
|
84
|
+
"showInfo": "Show info",
|
|
85
|
+
"expand": "Expand",
|
|
86
|
+
"input": "Input",
|
|
87
|
+
"output": "Output",
|
|
88
|
+
"cacheWrite": "Cache write",
|
|
89
|
+
"cacheRead": "Cache read",
|
|
90
|
+
"thinking": "Thinking",
|
|
91
|
+
"requestsShort": "Req",
|
|
92
|
+
"request": "Request",
|
|
93
|
+
"share": "Share",
|
|
94
|
+
"top": "Top"
|
|
95
|
+
},
|
|
96
|
+
"filterBar": {
|
|
97
|
+
"status": "Filter status",
|
|
98
|
+
"providersActive": "{{count}} providers active",
|
|
99
|
+
"modelsActive": "{{count}} models active",
|
|
100
|
+
"dateFilterActive": "Date filter active",
|
|
101
|
+
"presets": {
|
|
102
|
+
"7d": "7D",
|
|
103
|
+
"30d": "30D",
|
|
104
|
+
"month": "Month",
|
|
105
|
+
"year": "Year",
|
|
106
|
+
"all": "All"
|
|
107
|
+
},
|
|
108
|
+
"until": "to",
|
|
109
|
+
"resetDateRange": "Reset date range",
|
|
110
|
+
"resetAll": "Reset all",
|
|
111
|
+
"providers": "Providers",
|
|
112
|
+
"models": "Models",
|
|
113
|
+
"resetModels": "Reset models"
|
|
114
|
+
},
|
|
115
|
+
"dashboard": {
|
|
116
|
+
"insights": {
|
|
117
|
+
"title": "Insights",
|
|
118
|
+
"badge": "Condensed signals",
|
|
119
|
+
"description": "Focused signals from cost, model, and request data",
|
|
120
|
+
"quickRead": "Quick read"
|
|
121
|
+
},
|
|
122
|
+
"metrics": {
|
|
123
|
+
"title": "Metrics",
|
|
124
|
+
"badge": "10 metrics",
|
|
125
|
+
"description": "Core KPIs at a glance"
|
|
126
|
+
},
|
|
127
|
+
"activity": {
|
|
128
|
+
"title": "Activity",
|
|
129
|
+
"dailyDescription": "Daily usage overview",
|
|
130
|
+
"monthlyDescription": "Monthly usage overview",
|
|
131
|
+
"yearlyDescription": "Yearly usage overview"
|
|
132
|
+
},
|
|
133
|
+
"forecastCache": {
|
|
134
|
+
"title": "Forecast & Cache",
|
|
135
|
+
"description": "Cost forecast and cache efficiency"
|
|
136
|
+
},
|
|
137
|
+
"costAnalysis": {
|
|
138
|
+
"title": "Cost analysis",
|
|
139
|
+
"description": "Detailed cost breakdown"
|
|
140
|
+
},
|
|
141
|
+
"tokenAnalysis": {
|
|
142
|
+
"title": "Token analysis",
|
|
143
|
+
"description": "Usage by token type"
|
|
144
|
+
},
|
|
145
|
+
"requestAnalysis": {
|
|
146
|
+
"title": "Request analysis",
|
|
147
|
+
"description": "Requests overall, by model, and over time"
|
|
148
|
+
},
|
|
149
|
+
"advancedAnalysis": {
|
|
150
|
+
"title": "Distributions & Risk",
|
|
151
|
+
"description": "Additional signals for spread, correlation, and dependencies"
|
|
152
|
+
},
|
|
153
|
+
"comparisons": {
|
|
154
|
+
"title": "Comparisons & Anomalies",
|
|
155
|
+
"description": "Period comparison and outliers"
|
|
156
|
+
},
|
|
157
|
+
"tables": {
|
|
158
|
+
"title": "Tables",
|
|
159
|
+
"description": "Detailed breakdowns"
|
|
160
|
+
},
|
|
161
|
+
"cards": {
|
|
162
|
+
"periodComparison": "Period comparison",
|
|
163
|
+
"anomalyDetection": "Anomaly detection",
|
|
164
|
+
"costForecast": "Cost forecast",
|
|
165
|
+
"cacheRoi": "Cache ROI"
|
|
166
|
+
},
|
|
167
|
+
"stats": {
|
|
168
|
+
"cacheHitRate": "Cache hit rate",
|
|
169
|
+
"totalTokens": "Total tokens",
|
|
170
|
+
"cacheRead": "Cache read",
|
|
171
|
+
"dataPoints": "Data points",
|
|
172
|
+
"avgCostPerUnit": "Avg cost/{{unit}}",
|
|
173
|
+
"total": "Total",
|
|
174
|
+
"avgPerUnit": "Avg / {{unit}}"
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"metricCards": {
|
|
178
|
+
"primary": {
|
|
179
|
+
"totalCost": "Total cost",
|
|
180
|
+
"totalTokens": "Total tokens",
|
|
181
|
+
"activeDays": "Active days",
|
|
182
|
+
"topModel": "Top model",
|
|
183
|
+
"cacheHitRate": "Cache hit rate",
|
|
184
|
+
"costPerMillion": "$/1M tokens",
|
|
185
|
+
"requests": "Requests",
|
|
186
|
+
"thinking": "Thinking",
|
|
187
|
+
"avgPerPeriod": "{{value}}/{{unit}} avg",
|
|
188
|
+
"tokensPerRequestAvg": "{{value}} average per request",
|
|
189
|
+
"coverageOfDays": "{{coverage}} coverage across {{days}} days",
|
|
190
|
+
"providersActive": "{{count}} providers active",
|
|
191
|
+
"share": "{{value}} share",
|
|
192
|
+
"requestLead": "Req lead: {{value}}",
|
|
193
|
+
"allTokensViaCacheRead": "{{value}} of all tokens via cache read",
|
|
194
|
+
"requestCountersMissing": "No request counters in the dataset",
|
|
195
|
+
"thinkingShareOfVolume": "{{value}} of total token volume",
|
|
196
|
+
"requestsSubtitle": "Avg {{requests}} / {{unit}} · {{cost}} / req · σ {{volatility}}",
|
|
197
|
+
"thinkingSubtitle": "{{share}} share · {{tokens}} / request"
|
|
198
|
+
},
|
|
199
|
+
"secondary": {
|
|
200
|
+
"mostExpensiveDay": "Most expensive day",
|
|
201
|
+
"mostExpensiveMonth": "Most expensive month",
|
|
202
|
+
"mostExpensiveYear": "Most expensive year",
|
|
203
|
+
"dominantProvider": "Dominant provider",
|
|
204
|
+
"peak7Days": "Peak 7 days",
|
|
205
|
+
"avgCostPerUnit": "Avg cost/{{unit}}",
|
|
206
|
+
"spread": "Spread: {{value}}",
|
|
207
|
+
"medianPerUnit": "Median/{{unit}}",
|
|
208
|
+
"vsAverage": "{{direction}}{{value}}% vs avg",
|
|
209
|
+
"medianInfo": "The median shows the typical value and is less sensitive to outliers than the average.",
|
|
210
|
+
"requestLeader": "{{model}} · {{requests}} req",
|
|
211
|
+
"dominantProviderSubtitle": "{{share}} share · {{cost}}{{requestLeader}}"
|
|
212
|
+
},
|
|
213
|
+
"today": {
|
|
214
|
+
"title": "Today — {{date}}",
|
|
215
|
+
"description": "KPIs for the current day",
|
|
216
|
+
"costToday": "Cost today",
|
|
217
|
+
"tokensToday": "Tokens today",
|
|
218
|
+
"models": "Models",
|
|
219
|
+
"costPerMillion": "$/1M tokens",
|
|
220
|
+
"cacheHitRate": "Cache hit rate",
|
|
221
|
+
"requests": "Requests",
|
|
222
|
+
"thinking": "Thinking",
|
|
223
|
+
"vsAverageShort": "vs avg",
|
|
224
|
+
"overallAverage": "Overall avg: {{value}}",
|
|
225
|
+
"cacheShare": "{{value}} cache share",
|
|
226
|
+
"requestsToday": "Requests today",
|
|
227
|
+
"avgPerDay": "Avg {{value}}/day",
|
|
228
|
+
"ioRatio": "I/O ratio: {{value}}:1",
|
|
229
|
+
"topModel": "Top: {{value}}",
|
|
230
|
+
"requestsSubtitle": "{{value}} / model · {{cost}}/req",
|
|
231
|
+
"requestCountersMissing": "No request counters",
|
|
232
|
+
"thinkingSubtitle": "{{value}} share"
|
|
233
|
+
},
|
|
234
|
+
"month": {
|
|
235
|
+
"title": "Month — {{date}}",
|
|
236
|
+
"badge": "{{count}} days",
|
|
237
|
+
"description": "KPIs for the current month",
|
|
238
|
+
"costMonth": "Month cost",
|
|
239
|
+
"tokensMonth": "Month tokens",
|
|
240
|
+
"activeDays": "Active days",
|
|
241
|
+
"models": "Models",
|
|
242
|
+
"costPerMillion": "$/1M tokens",
|
|
243
|
+
"cacheHitRate": "Cache hit rate",
|
|
244
|
+
"requests": "Requests",
|
|
245
|
+
"thinking": "Thinking",
|
|
246
|
+
"vsPreviousMonth": "vs previous month",
|
|
247
|
+
"coverage": "{{value}} coverage",
|
|
248
|
+
"requestsInMonth": "Requests this month",
|
|
249
|
+
"avgPerDay": "Avg {{value}}/day",
|
|
250
|
+
"ioRatio": "I/O ratio: {{value}}:1",
|
|
251
|
+
"topModel": "Top: {{value}}",
|
|
252
|
+
"cacheMix": "In: {{input}} / Out: {{output}}",
|
|
253
|
+
"requestsSubtitle": "Avg {{value}}/day · {{cost}}/req",
|
|
254
|
+
"requestCountersMissing": "No request counters",
|
|
255
|
+
"thinkingSubtitle": "{{value}} share"
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
"insights": {
|
|
259
|
+
"concentration": {
|
|
260
|
+
"title": "Cost concentration",
|
|
261
|
+
"summary": "{{provider}} is currently the dominant provider in the selected slice, while {{model}} is the strongest single lever.",
|
|
262
|
+
"fallback": "No stable provider distribution is available yet.",
|
|
263
|
+
"topProvider": "Top provider",
|
|
264
|
+
"topModel": "Top model",
|
|
265
|
+
"topModelShare": "Top model share",
|
|
266
|
+
"topThreeModels": "Top 3 models"
|
|
267
|
+
},
|
|
268
|
+
"requestEconomy": {
|
|
269
|
+
"title": "Request economy",
|
|
270
|
+
"valueLabel": "Avg cost per request",
|
|
271
|
+
"summary": "Each request costs {{cost}} on average and processes {{tokens}}. {{leader}}",
|
|
272
|
+
"leader": "{{model}} currently leads on request volume.",
|
|
273
|
+
"fallback": "The loaded dataset does not contain reliable request counters. Request economy is therefore unavailable.",
|
|
274
|
+
"avgRequests": "Avg req/{{unit}}",
|
|
275
|
+
"avgTokensPerRequest": "Avg tokens/req",
|
|
276
|
+
"costPerMillion": "$/1M tokens",
|
|
277
|
+
"totalRequests": "Total requests"
|
|
278
|
+
},
|
|
279
|
+
"usagePatterns": {
|
|
280
|
+
"title": "Usage patterns",
|
|
281
|
+
"summaryWithCoverage": "{{activeDays}} of {{totalDays}} calendar days contain activity in the filtered range. Requests vary by {{volatility}}.",
|
|
282
|
+
"summaryWithoutCoverage": "{{activeDays}} active {{unit}} in the selected slice.",
|
|
283
|
+
"avgModels": "Avg models/entry",
|
|
284
|
+
"providersActive": "Providers active",
|
|
285
|
+
"weekendShare": "Weekend share",
|
|
286
|
+
"thinkingShare": "Thinking share"
|
|
287
|
+
},
|
|
288
|
+
"peakWindow": {
|
|
289
|
+
"title": "Peak window",
|
|
290
|
+
"summary": "Strongest 7-day phase from {{start}} to {{end}}.",
|
|
291
|
+
"fallback": "No 7-day window is available, so the focus falls back to the most expensive single point.",
|
|
292
|
+
"peakDay": "Peak day",
|
|
293
|
+
"avgPerUnit": "Avg/{{unit}}",
|
|
294
|
+
"peak7DayAverage": "Peak 7D avg/day",
|
|
295
|
+
"signal": "Signal",
|
|
296
|
+
"signalStrong": "highly concentrated",
|
|
297
|
+
"signalModerate": "moderately concentrated",
|
|
298
|
+
"signalWide": "broadly distributed"
|
|
299
|
+
},
|
|
300
|
+
"quickRead": {
|
|
301
|
+
"summary": "{{provider}} accounts for {{providerShare}} of cost, while the top 3 models concentrate {{topThreeShare}}. {{requestLeader}}",
|
|
302
|
+
"requestLeader": "{{requestModel}} leads on requests, while {{tokenModel}} leads on token volume.",
|
|
303
|
+
"fallback": "There is not enough data in the current filter slice for a stable summary yet."
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
"charts": {
|
|
307
|
+
"costOverTime": {
|
|
308
|
+
"title": "Cost over time + 7-day avg",
|
|
309
|
+
"subtitle": "Daily cost with 7-day moving average",
|
|
310
|
+
"summary": "Latest {{latest}} · Peak {{peak}} on {{date}}",
|
|
311
|
+
"cost": "Cost",
|
|
312
|
+
"movingAverage": "7-day avg"
|
|
313
|
+
},
|
|
314
|
+
"costByModel": {
|
|
315
|
+
"title": "Cost by model",
|
|
316
|
+
"subtitle": "Cost distribution by model",
|
|
317
|
+
"total": "Total"
|
|
318
|
+
},
|
|
319
|
+
"costByModelOverTime": {
|
|
320
|
+
"title": "Cost by model over time",
|
|
321
|
+
"subtitle": "Per model over time",
|
|
322
|
+
"topDriver": "Top driver: {{model}} · {{total}} cumulative",
|
|
323
|
+
"movingAverageHeading": "7-day average by model",
|
|
324
|
+
"movingAverageSuffix": "avg"
|
|
325
|
+
},
|
|
326
|
+
"cumulativeCost": {
|
|
327
|
+
"title": "Cumulative cost",
|
|
328
|
+
"total": "Total: {{value}}",
|
|
329
|
+
"cumulative": "Cumulative",
|
|
330
|
+
"projection": "Projection"
|
|
331
|
+
},
|
|
332
|
+
"tokensOverTime": {
|
|
333
|
+
"title": "Tokens over time",
|
|
334
|
+
"subtitle": "All token types with 7-day avg",
|
|
335
|
+
"allTypes": "Total tokens (all types)",
|
|
336
|
+
"totalTokens": "Total tokens",
|
|
337
|
+
"movingAverage": "7-day avg",
|
|
338
|
+
"cacheTokens": "Cache tokens",
|
|
339
|
+
"inputOutputTokens": "Input / Output tokens",
|
|
340
|
+
"thinkingTokens": "Thinking tokens",
|
|
341
|
+
"averageSuffix": "avg"
|
|
342
|
+
},
|
|
343
|
+
"requestsOverTime": {
|
|
344
|
+
"title": "Requests over time",
|
|
345
|
+
"subtitle": "Requests overall, by model, and with 7-day avg",
|
|
346
|
+
"summary": "Total {{total}} · Peak {{peak}} on {{date}}",
|
|
347
|
+
"averagePerUnit": "Avg / {{unit}}",
|
|
348
|
+
"trend": "Trend avg",
|
|
349
|
+
"movingAverage": "7-day avg",
|
|
350
|
+
"trendHeading": "Moving average by model",
|
|
351
|
+
"movingAverageHeading": "7-day average by model",
|
|
352
|
+
"totalMovingAverage": "Total {{label}}",
|
|
353
|
+
"requestsByModelTotal": "Requests by model total",
|
|
354
|
+
"requestsInRange": "Requests in the selected range",
|
|
355
|
+
"total": "Total",
|
|
356
|
+
"topModel": "Top model",
|
|
357
|
+
"topShare": "Top share",
|
|
358
|
+
"totalRequestsSeries": "Total requests"
|
|
359
|
+
},
|
|
360
|
+
"requestCacheHitRate": {
|
|
361
|
+
"title": "Cache hit rate by model",
|
|
362
|
+
"subtitle": "Total {{total}} · 7-day avg {{trailing}}",
|
|
363
|
+
"totalRate": "Total",
|
|
364
|
+
"trailing7Rate": "7-day avg",
|
|
365
|
+
"trendRate": "Trend avg",
|
|
366
|
+
"topModel": "Top model",
|
|
367
|
+
"models": "Models",
|
|
368
|
+
"total": "Total",
|
|
369
|
+
"timelineHeading": "Cache hit rate over time / {{unit}}",
|
|
370
|
+
"modelBreakdownHeading": "Current model snapshot"
|
|
371
|
+
},
|
|
372
|
+
"heatmap": {
|
|
373
|
+
"costTitle": "Cost heatmap",
|
|
374
|
+
"requestsTitle": "Request heatmap",
|
|
375
|
+
"tokensTitle": "Token heatmap",
|
|
376
|
+
"costEmpty": "Cost heatmap is only available in daily view",
|
|
377
|
+
"requestsEmpty": "Request heatmap is only available in daily view",
|
|
378
|
+
"tokensEmpty": "Token heatmap is only available in daily view",
|
|
379
|
+
"switchToDaily": "Switch to daily view for the calendar heatmap",
|
|
380
|
+
"less": "Less",
|
|
381
|
+
"more": "More"
|
|
382
|
+
},
|
|
383
|
+
"tokenTypes": {
|
|
384
|
+
"title": "Token types",
|
|
385
|
+
"subtitle": "Distribution of token types",
|
|
386
|
+
"total": "Total"
|
|
387
|
+
},
|
|
388
|
+
"modelMix": {
|
|
389
|
+
"title": "Model mix",
|
|
390
|
+
"subtitle": "Cost share by model over time"
|
|
391
|
+
},
|
|
392
|
+
"distribution": {
|
|
393
|
+
"title": "Distributions",
|
|
394
|
+
"requiresData": "At least 2 data points are required in the current filter for distributions.",
|
|
395
|
+
"costPerPeriod": "Cost per {{period}}",
|
|
396
|
+
"requestsPerPeriod": "Requests per {{period}}",
|
|
397
|
+
"tokensPerRequest": "Tokens per request",
|
|
398
|
+
"interval": "Interval",
|
|
399
|
+
"dataPoints": "Data points",
|
|
400
|
+
"buckets": "Buckets"
|
|
401
|
+
},
|
|
402
|
+
"correlation": {
|
|
403
|
+
"title": "Correlations",
|
|
404
|
+
"requiresData": "At least 2 data points are required in the current filter for correlations.",
|
|
405
|
+
"points": "{{count}} points",
|
|
406
|
+
"requestsVsCost": "Requests vs. cost",
|
|
407
|
+
"cacheVsCostPerRequest": "Cache rate vs. $/req",
|
|
408
|
+
"requestsAxis": "Requests",
|
|
409
|
+
"requestsLabel": "Requests",
|
|
410
|
+
"tokensLabel": "Tokens",
|
|
411
|
+
"costPerRequestAxis": "$/Req",
|
|
412
|
+
"cost": "Cost",
|
|
413
|
+
"costPerRequest": "Cost / req",
|
|
414
|
+
"cacheRate": "Cache rate",
|
|
415
|
+
"strongRequestCost": "Strong relationship: more requests visibly drive cost.",
|
|
416
|
+
"mediumRequestCost": "Moderate relationship between load and cost.",
|
|
417
|
+
"weakRequestCost": "Weak relationship: cost is driven more by model mix and token load.",
|
|
418
|
+
"negativeCache": "Negative relationship: higher cache rate tends to reduce cost per request.",
|
|
419
|
+
"neutralCache": "Little linear effect: cache helps, but is not the only driver.",
|
|
420
|
+
"positiveCache": "Positive relationship: high cache rates do not automatically coincide with lower cost per request here."
|
|
421
|
+
},
|
|
422
|
+
"costByWeekday": {
|
|
423
|
+
"title": "Cost by weekday",
|
|
424
|
+
"subtitle": "Peak: {{peak}} · Low: {{low}} · Weekend {{share}}",
|
|
425
|
+
"averageCost": "Avg cost"
|
|
426
|
+
},
|
|
427
|
+
"tokenEfficiency": {
|
|
428
|
+
"title": "Token efficiency ($/1M)",
|
|
429
|
+
"subtitle": "Avg {{value}}/1M tokens",
|
|
430
|
+
"series": "$/1M tokens",
|
|
431
|
+
"movingAverage": "7D avg"
|
|
432
|
+
}
|
|
433
|
+
},
|
|
434
|
+
"risk": {
|
|
435
|
+
"title": "Concentration risk",
|
|
436
|
+
"modelDependency": "Model dependency",
|
|
437
|
+
"providerDependency": "Provider dependency",
|
|
438
|
+
"high": "high",
|
|
439
|
+
"medium": "medium",
|
|
440
|
+
"low": "low",
|
|
441
|
+
"modelHint": "HHI {{value}} · Higher values indicate a few dominant models.",
|
|
442
|
+
"providerHint": "HHI {{value}} · Shows dependency on individual providers."
|
|
443
|
+
},
|
|
444
|
+
"requestQuality": {
|
|
445
|
+
"title": "Request quality",
|
|
446
|
+
"tokensPerRequest": "Tokens / request",
|
|
447
|
+
"costPerRequest": "Cost / request",
|
|
448
|
+
"cachePerRequest": "Cache / request",
|
|
449
|
+
"thinkingPerRequest": "Thinking / request",
|
|
450
|
+
"tokensHint": "Average token load per request",
|
|
451
|
+
"costHint": "Direct cost per request",
|
|
452
|
+
"cacheHint": "Read cache tokens per request",
|
|
453
|
+
"thinkingHint": "Thinking tokens per request",
|
|
454
|
+
"requestDensity": "Request density",
|
|
455
|
+
"averagePerActiveUnit": "Avg per active {{unit}}",
|
|
456
|
+
"cacheHitRate": "Cache hit rate",
|
|
457
|
+
"cacheHitHint": "Direct cache-read relative to all tokens",
|
|
458
|
+
"inputOutput": "Input / Output",
|
|
459
|
+
"inputOutputHint": "Drift between incoming and generated tokens",
|
|
460
|
+
"topRequestModel": "Top request model",
|
|
461
|
+
"noRequestLeader": "No request leader"
|
|
462
|
+
},
|
|
463
|
+
"forecast": {
|
|
464
|
+
"noData": "No data available",
|
|
465
|
+
"noForecast": "No forecast available",
|
|
466
|
+
"requiresTwoDays": "At least 2 days with data are required",
|
|
467
|
+
"avgMonthlyCost": "Avg monthly cost",
|
|
468
|
+
"avgYearlyCost": "Avg yearly cost",
|
|
469
|
+
"totalOverPeriods": "Total: {{total}} over {{count}} {{unit}}",
|
|
470
|
+
"monthEndForecast": "Month-end forecast",
|
|
471
|
+
"low": "low",
|
|
472
|
+
"medium": "medium",
|
|
473
|
+
"high": "high",
|
|
474
|
+
"soFar": "So far: {{value}}",
|
|
475
|
+
"remainingDays": "Days remaining: {{count}}",
|
|
476
|
+
"projectedPerDay": "Forecast {{value}}/day",
|
|
477
|
+
"vsLastWeek": "vs last week",
|
|
478
|
+
"chartTitle": "Current month cost forecast",
|
|
479
|
+
"chartSubtitle": "Month-end forecast based on smoothed calendar-day cost",
|
|
480
|
+
"lowerBound": "Lower bound",
|
|
481
|
+
"uncertaintyBand": "Uncertainty band",
|
|
482
|
+
"actualCost": "Actual cost",
|
|
483
|
+
"projection": "Forecast"
|
|
484
|
+
},
|
|
485
|
+
"cacheRoi": {
|
|
486
|
+
"title": "Cache savings (ROI)",
|
|
487
|
+
"noData": "No data available",
|
|
488
|
+
"heuristicFallback": "For {{count}} {{modelsLabel}} without a configured price table, the ROI estimate uses a heuristic fallback.",
|
|
489
|
+
"model": "model",
|
|
490
|
+
"models": "models",
|
|
491
|
+
"withoutCache": "Without cache",
|
|
492
|
+
"withCache": "With cache",
|
|
493
|
+
"withCacheActual": "With cache (actual)",
|
|
494
|
+
"savings": "Savings",
|
|
495
|
+
"avgCostPerUnit": "Avg cost/{{unit}}",
|
|
496
|
+
"paid": "Paid",
|
|
497
|
+
"saved": "Saved"
|
|
498
|
+
},
|
|
499
|
+
"comparison": {
|
|
500
|
+
"title": "Period comparison",
|
|
501
|
+
"notEnoughData": "Not enough data for a comparison",
|
|
502
|
+
"requiresDays": "At least 7 days required (currently: {{count}})",
|
|
503
|
+
"thisWeek": "This week",
|
|
504
|
+
"lastWeek": "Last week",
|
|
505
|
+
"thisMonth": "This month",
|
|
506
|
+
"lastMonth": "Last month",
|
|
507
|
+
"week": "Week",
|
|
508
|
+
"month": "Month",
|
|
509
|
+
"metric": "Metric",
|
|
510
|
+
"delta": "Delta",
|
|
511
|
+
"cost": "Cost",
|
|
512
|
+
"tokens": "Tokens",
|
|
513
|
+
"avgPerDay": "Avg/day",
|
|
514
|
+
"cacheRate": "Cache rate",
|
|
515
|
+
"days": "Days"
|
|
516
|
+
},
|
|
517
|
+
"anomaly": {
|
|
518
|
+
"title": "Unusual {{period}}",
|
|
519
|
+
"none": "No anomalies detected",
|
|
520
|
+
"withinStdDev": "All costs are within 2 standard deviations",
|
|
521
|
+
"description": "{{period}} with cost >2 standard deviations from the mean ({{mean}} +/- {{stdDev}})",
|
|
522
|
+
"critical": "critical"
|
|
523
|
+
},
|
|
524
|
+
"tables": {
|
|
525
|
+
"modelEfficiency": {
|
|
526
|
+
"title": "Model efficiency",
|
|
527
|
+
"count": "{{count}} models",
|
|
528
|
+
"topModel": "Top model",
|
|
529
|
+
"mostEfficient": "Most efficient model",
|
|
530
|
+
"totalRequests": "Total requests",
|
|
531
|
+
"topModelTokens": "Top model tokens",
|
|
532
|
+
"share": "{{value}} share",
|
|
533
|
+
"perModel": "{{value}} / model",
|
|
534
|
+
"more": "+{{count}} more",
|
|
535
|
+
"model": "Model",
|
|
536
|
+
"cost": "Cost",
|
|
537
|
+
"tokens": "Tokens",
|
|
538
|
+
"shareShort": "Share",
|
|
539
|
+
"req": "Req",
|
|
540
|
+
"reqShare": "Req %",
|
|
541
|
+
"costPerReq": "$ / Req",
|
|
542
|
+
"tokensPerReq": "Tokens / Req",
|
|
543
|
+
"cacheShare": "Cache %",
|
|
544
|
+
"thinkingShare": "Think %",
|
|
545
|
+
"avgPerUnit": "Avg/{{unit}}"
|
|
546
|
+
},
|
|
547
|
+
"providerEfficiency": {
|
|
548
|
+
"title": "Provider efficiency",
|
|
549
|
+
"count": "{{count}} providers",
|
|
550
|
+
"leadProvider": "Lead provider",
|
|
551
|
+
"mostEfficient": "Most efficient provider",
|
|
552
|
+
"totalRequests": "Total requests",
|
|
553
|
+
"share": "{{value}} share",
|
|
554
|
+
"perProvider": "{{value}} / provider",
|
|
555
|
+
"avgPerUnit": "Avg/{{unit}}",
|
|
556
|
+
"provider": "Provider",
|
|
557
|
+
"cost": "Cost",
|
|
558
|
+
"shareShort": "Share",
|
|
559
|
+
"req": "Req",
|
|
560
|
+
"tokens": "Tokens",
|
|
561
|
+
"costPerReq": "$ / Req",
|
|
562
|
+
"costPerMillion": "$/1M",
|
|
563
|
+
"cacheShare": "Cache %"
|
|
564
|
+
},
|
|
565
|
+
"recentDays": {
|
|
566
|
+
"daysDetail": "Recent days in detail",
|
|
567
|
+
"monthsDetail": "Months in detail",
|
|
568
|
+
"yearsDetail": "Years in detail",
|
|
569
|
+
"showing": "Showing {{shown}} of {{total}} {{unit}}",
|
|
570
|
+
"showLess": "Show less",
|
|
571
|
+
"showAll": "Show all",
|
|
572
|
+
"totalCost": "Total cost",
|
|
573
|
+
"totalTokens": "Total tokens",
|
|
574
|
+
"requests": "Requests",
|
|
575
|
+
"cacheReadShare": "Cache read share",
|
|
576
|
+
"peak": "Peak",
|
|
577
|
+
"previousDay": "Previous day",
|
|
578
|
+
"avg7d": "7D avg",
|
|
579
|
+
"reqAvg": "Req avg",
|
|
580
|
+
"date": "Date",
|
|
581
|
+
"cost": "Cost",
|
|
582
|
+
"tokens": "Tokens",
|
|
583
|
+
"models": "Models"
|
|
584
|
+
}
|
|
585
|
+
},
|
|
586
|
+
"helpPanel": {
|
|
587
|
+
"chartsAndFeatures": "Charts & features",
|
|
588
|
+
"metricLabels": {
|
|
589
|
+
"totalCost": "Total cost",
|
|
590
|
+
"totalTokens": "Total tokens",
|
|
591
|
+
"activeDays": "Active days",
|
|
592
|
+
"topModel": "Top model",
|
|
593
|
+
"cacheHitRate": "Cache hit rate",
|
|
594
|
+
"costPerMillion": "Cost / 1M tokens",
|
|
595
|
+
"mostExpensiveDay": "Most expensive day",
|
|
596
|
+
"cheapestDay": "Cheapest day",
|
|
597
|
+
"avgCostPerDay": "Avg cost / day",
|
|
598
|
+
"outputTokens": "Output tokens"
|
|
599
|
+
},
|
|
600
|
+
"chartLabels": {
|
|
601
|
+
"costOverTime": "Cost over time",
|
|
602
|
+
"costByModel": "Cost by model",
|
|
603
|
+
"costByModelOverTime": "Cost by model over time",
|
|
604
|
+
"cumulativeCost": "Cumulative cost",
|
|
605
|
+
"costByWeekday": "Cost by weekday",
|
|
606
|
+
"tokensOverTime": "Tokens over time",
|
|
607
|
+
"requestsOverTime": "Requests over time",
|
|
608
|
+
"requestCacheHitRate": "Cache hit rate by model",
|
|
609
|
+
"tokenTypes": "Token types",
|
|
610
|
+
"tokenEfficiency": "Token efficiency",
|
|
611
|
+
"modelMix": "Model mix",
|
|
612
|
+
"distributionAnalysis": "Distributions",
|
|
613
|
+
"correlationAnalysis": "Correlations",
|
|
614
|
+
"heatmap": "Cost heatmap",
|
|
615
|
+
"requestHeatmap": "Request heatmap",
|
|
616
|
+
"tokenHeatmap": "Token heatmap",
|
|
617
|
+
"forecast": "Forecast",
|
|
618
|
+
"cacheROI": "Cache ROI",
|
|
619
|
+
"periodComparison": "Period comparison",
|
|
620
|
+
"anomalyDetection": "Anomaly detection"
|
|
621
|
+
},
|
|
622
|
+
"sectionLabels": {
|
|
623
|
+
"insights": "Insights",
|
|
624
|
+
"metrics": "Metrics",
|
|
625
|
+
"today": "Today",
|
|
626
|
+
"currentMonth": "Month",
|
|
627
|
+
"activity": "Activity",
|
|
628
|
+
"forecastCache": "Forecast & Cache",
|
|
629
|
+
"costAnalysis": "Cost analysis",
|
|
630
|
+
"tokenAnalysis": "Token analysis",
|
|
631
|
+
"requestAnalysis": "Request analysis",
|
|
632
|
+
"advancedAnalysis": "Distributions & Risk",
|
|
633
|
+
"comparisons": "Comparisons & Anomalies",
|
|
634
|
+
"tables": "Tables",
|
|
635
|
+
"limits": "Limits & Subscriptions"
|
|
636
|
+
},
|
|
637
|
+
"featureLabels": {
|
|
638
|
+
"requestQuality": "Request quality",
|
|
639
|
+
"providerLimits": "Limits & Subscriptions",
|
|
640
|
+
"concentrationRisk": "Concentration risk",
|
|
641
|
+
"providerEfficiency": "Provider efficiency",
|
|
642
|
+
"modelEfficiency": "Model efficiency",
|
|
643
|
+
"recentDays": "Periods in detail"
|
|
644
|
+
}
|
|
645
|
+
},
|
|
646
|
+
"autoImportModal": {
|
|
647
|
+
"title": "Toktrack auto import",
|
|
648
|
+
"description": "Automatically imports local usage data via local `toktrack`, `bunx`, or `npm exec` and stores it only on this device.",
|
|
649
|
+
"connecting": "Connecting...",
|
|
650
|
+
"checkingTool": "Checking {{tool}}...",
|
|
651
|
+
"toolFound": "{{tool}} found ({{method}}, v{{version}})",
|
|
652
|
+
"toolNotFound": "{{tool}} not found",
|
|
653
|
+
"importedDays": "{{days}} days imported ({{cost}} USD)",
|
|
654
|
+
"checkingPrerequisites": "Checking prerequisites...",
|
|
655
|
+
"importingData": "Importing data...",
|
|
656
|
+
"startingLocalImport": "Starting local toktrack import...",
|
|
657
|
+
"loadingUsageData": "Loading usage data via {{command}}...",
|
|
658
|
+
"processingUsageData": "Processing usage data... ({{seconds}}s)",
|
|
659
|
+
"serverConnectionLost": "Lost connection to server.",
|
|
660
|
+
"autoImportRunning": "An auto import is already running. Please wait.",
|
|
661
|
+
"noRunnerFound": "No local toktrack, Bun, or npm exec found.",
|
|
662
|
+
"errorPrefix": "Error: {{message}}",
|
|
663
|
+
"loadedDays": "{{days}} days loaded ({{cost}} USD)",
|
|
664
|
+
"errorOccurred": "An error occurred",
|
|
665
|
+
"close": "Close"
|
|
666
|
+
},
|
|
667
|
+
"commandPalette": {
|
|
668
|
+
"title": "Command palette",
|
|
669
|
+
"description": "Keyboard-driven command menu for navigation and actions in the ttdash dashboard.",
|
|
670
|
+
"placeholder": "Search commands...",
|
|
671
|
+
"empty": "No command found.",
|
|
672
|
+
"groups": {
|
|
673
|
+
"actions": "Actions",
|
|
674
|
+
"filters": "Filters & View",
|
|
675
|
+
"navigation": "Navigation",
|
|
676
|
+
"view": "View",
|
|
677
|
+
"language": "Language",
|
|
678
|
+
"help": "Help",
|
|
679
|
+
"providers": "Providers",
|
|
680
|
+
"models": "Models"
|
|
681
|
+
},
|
|
682
|
+
"commands": {
|
|
683
|
+
"autoImport": {
|
|
684
|
+
"label": "Start auto import",
|
|
685
|
+
"description": "Run local toktrack import"
|
|
686
|
+
},
|
|
687
|
+
"openSettings": {
|
|
688
|
+
"label": "Open settings",
|
|
689
|
+
"description": "Manage backups, app options, and provider limits"
|
|
690
|
+
},
|
|
691
|
+
"exportCsv": {
|
|
692
|
+
"label": "Export CSV",
|
|
693
|
+
"description": "Export currently filtered data"
|
|
694
|
+
},
|
|
695
|
+
"generateReport": {
|
|
696
|
+
"label": "Generate PDF report",
|
|
697
|
+
"labelLoading": "Generating PDF report",
|
|
698
|
+
"description": "Export currently filtered data as PDF"
|
|
699
|
+
},
|
|
700
|
+
"upload": {
|
|
701
|
+
"label": "Upload JSON",
|
|
702
|
+
"description": "Import toktrack or legacy JSON"
|
|
703
|
+
},
|
|
704
|
+
"delete": {
|
|
705
|
+
"label": "Delete data",
|
|
706
|
+
"description": "Remove local dataset"
|
|
707
|
+
},
|
|
708
|
+
"viewDaily": {
|
|
709
|
+
"label": "Switch to daily view",
|
|
710
|
+
"description": "Show data per day"
|
|
711
|
+
},
|
|
712
|
+
"viewMonthly": {
|
|
713
|
+
"label": "Switch to monthly view",
|
|
714
|
+
"description": "Show data per month"
|
|
715
|
+
},
|
|
716
|
+
"viewYearly": {
|
|
717
|
+
"label": "Switch to yearly view",
|
|
718
|
+
"description": "Show data per year"
|
|
719
|
+
},
|
|
720
|
+
"preset7d": {
|
|
721
|
+
"label": "Range: last 7 days",
|
|
722
|
+
"description": "Sets the date filter to 7 days"
|
|
723
|
+
},
|
|
724
|
+
"preset30d": {
|
|
725
|
+
"label": "Range: last 30 days",
|
|
726
|
+
"description": "Sets the date filter to 30 days"
|
|
727
|
+
},
|
|
728
|
+
"presetMonth": {
|
|
729
|
+
"label": "Range: current month",
|
|
730
|
+
"description": "Sets the date filter to the current month"
|
|
731
|
+
},
|
|
732
|
+
"presetYear": {
|
|
733
|
+
"label": "Range: current year",
|
|
734
|
+
"description": "Sets the date filter to the current year"
|
|
735
|
+
},
|
|
736
|
+
"presetAll": {
|
|
737
|
+
"label": "Range: all data",
|
|
738
|
+
"description": "Clears preset date filters"
|
|
739
|
+
},
|
|
740
|
+
"clearProviders": {
|
|
741
|
+
"label": "Reset provider filter",
|
|
742
|
+
"description": "Remove all active provider filters"
|
|
743
|
+
},
|
|
744
|
+
"clearModels": {
|
|
745
|
+
"label": "Reset model filter",
|
|
746
|
+
"description": "Remove all active model filters"
|
|
747
|
+
},
|
|
748
|
+
"clearDates": {
|
|
749
|
+
"label": "Reset date filter",
|
|
750
|
+
"description": "Remove start and end date"
|
|
751
|
+
},
|
|
752
|
+
"resetAll": {
|
|
753
|
+
"label": "Reset all filters",
|
|
754
|
+
"description": "Restore the default dashboard filter state"
|
|
755
|
+
},
|
|
756
|
+
"scrollTop": {
|
|
757
|
+
"label": "Scroll to top",
|
|
758
|
+
"description": "Jump to the top of the page"
|
|
759
|
+
},
|
|
760
|
+
"scrollBottom": {
|
|
761
|
+
"label": "Scroll to bottom",
|
|
762
|
+
"description": "Jump to the bottom of the page"
|
|
763
|
+
},
|
|
764
|
+
"filters": {
|
|
765
|
+
"label": "Go to filters",
|
|
766
|
+
"description": "Jump to the filter bar"
|
|
767
|
+
},
|
|
768
|
+
"goToSection": {
|
|
769
|
+
"label": "Go to {{section}}",
|
|
770
|
+
"description": "Jump to the {{section}} section"
|
|
771
|
+
},
|
|
772
|
+
"insights": {
|
|
773
|
+
"label": "Go to insights",
|
|
774
|
+
"description": "Jump to the executive summary"
|
|
775
|
+
},
|
|
776
|
+
"metrics": {
|
|
777
|
+
"label": "Go to metrics",
|
|
778
|
+
"description": "Jump to KPI cards"
|
|
779
|
+
},
|
|
780
|
+
"today": {
|
|
781
|
+
"label": "Go to today",
|
|
782
|
+
"description": "Jump to the current day KPIs"
|
|
783
|
+
},
|
|
784
|
+
"month": {
|
|
785
|
+
"label": "Go to month",
|
|
786
|
+
"description": "Jump to the current month KPIs"
|
|
787
|
+
},
|
|
788
|
+
"activity": {
|
|
789
|
+
"label": "Go to activity",
|
|
790
|
+
"description": "Jump to the activity heatmap"
|
|
791
|
+
},
|
|
792
|
+
"forecastCache": {
|
|
793
|
+
"label": "Go to forecast & cache",
|
|
794
|
+
"description": "Jump to forecast and cache ROI"
|
|
795
|
+
},
|
|
796
|
+
"limits": {
|
|
797
|
+
"label": "Go to Limits & Subscriptions",
|
|
798
|
+
"description": "Jump to the limits section"
|
|
799
|
+
},
|
|
800
|
+
"charts": {
|
|
801
|
+
"label": "Go to cost analysis",
|
|
802
|
+
"description": "Jump to cost charts"
|
|
803
|
+
},
|
|
804
|
+
"tokenAnalysis": {
|
|
805
|
+
"label": "Go to token analysis",
|
|
806
|
+
"description": "Jump to token charts and distributions"
|
|
807
|
+
},
|
|
808
|
+
"requestAnalysis": {
|
|
809
|
+
"label": "Go to request analysis",
|
|
810
|
+
"description": "Jump to requests over time and request distribution"
|
|
811
|
+
},
|
|
812
|
+
"comparisons": {
|
|
813
|
+
"label": "Go to comparisons & anomalies",
|
|
814
|
+
"description": "Jump to period comparison and unusual activity"
|
|
815
|
+
},
|
|
816
|
+
"tables": {
|
|
817
|
+
"label": "Go to tables",
|
|
818
|
+
"description": "Jump to detailed tables"
|
|
819
|
+
},
|
|
820
|
+
"themeLight": {
|
|
821
|
+
"label": "Enable light mode",
|
|
822
|
+
"description": "Switch between light and dark theme"
|
|
823
|
+
},
|
|
824
|
+
"themeDark": {
|
|
825
|
+
"label": "Enable dark mode",
|
|
826
|
+
"description": "Switch between light and dark theme"
|
|
827
|
+
},
|
|
828
|
+
"languageGerman": {
|
|
829
|
+
"label": "Switch to German",
|
|
830
|
+
"description": "Change the dashboard language to German"
|
|
831
|
+
},
|
|
832
|
+
"languageEnglish": {
|
|
833
|
+
"label": "Switch to English",
|
|
834
|
+
"description": "Change the dashboard language to English"
|
|
835
|
+
},
|
|
836
|
+
"help": {
|
|
837
|
+
"label": "Open help & shortcuts",
|
|
838
|
+
"description": "Open the help overview"
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
},
|
|
842
|
+
"settings": {
|
|
843
|
+
"modal": {
|
|
844
|
+
"title": "Settings",
|
|
845
|
+
"description": "Manage app backups, stored data, and provider limits in one place.",
|
|
846
|
+
"dataStatus": "Data status",
|
|
847
|
+
"lastLoaded": "Last loaded",
|
|
848
|
+
"loadedVia": "Loaded via",
|
|
849
|
+
"cliAutoLoad": "CLI auto-load",
|
|
850
|
+
"defaultFiltersTitle": "Default dashboard filters",
|
|
851
|
+
"defaultFiltersDescription": "Choose the filter state that should be applied when the dashboard opens or when filters are reset.",
|
|
852
|
+
"defaultViewMode": "Default view mode",
|
|
853
|
+
"defaultDateRange": "Default date range",
|
|
854
|
+
"filterProviders": "Default provider filter",
|
|
855
|
+
"filterModels": "Default model filter",
|
|
856
|
+
"noModels": "No models found in the loaded report.",
|
|
857
|
+
"sectionVisibilityTitle": "Visible dashboard sections",
|
|
858
|
+
"sectionVisibilityDescription": "Control which sections are rendered in the dashboard and adjust their order.",
|
|
859
|
+
"sectionOrderHint": "Drag sections to reorder them. The current order is the default dashboard layout.",
|
|
860
|
+
"positionLabel": "Position {{position}} of {{total}}",
|
|
861
|
+
"moveSectionUp": "Move {{section}} up",
|
|
862
|
+
"moveSectionDown": "Move {{section}} down",
|
|
863
|
+
"settingsBackupTitle": "Back up settings",
|
|
864
|
+
"settingsBackupDescription": "Export and import language, theme, limits, and stored load metadata as a versioned backup.",
|
|
865
|
+
"dataBackupTitle": "Back up data",
|
|
866
|
+
"dataBackupDescription": "Export the locally stored usage state as a backup and import backups conservatively.",
|
|
867
|
+
"dataImportPolicy": "Data import only adds missing days. Existing days with different values stay local and are reported as conflicts.",
|
|
868
|
+
"dataImportReplaceHint": "If you want to fully replace the dataset, keep using the regular JSON upload in the header.",
|
|
869
|
+
"providerLimitsTitle": "Provider limits",
|
|
870
|
+
"providerLimitsDescription": "Define subscription and monthly limit per provider. Only providers from the currently loaded report can be edited.",
|
|
871
|
+
"noProviders": "No providers found in the loaded report.",
|
|
872
|
+
"exportSettings": "Export settings",
|
|
873
|
+
"importSettings": "Import settings",
|
|
874
|
+
"exportData": "Export data",
|
|
875
|
+
"importData": "Import data",
|
|
876
|
+
"close": "Close",
|
|
877
|
+
"save": "Save",
|
|
878
|
+
"viewModes": {
|
|
879
|
+
"daily": "Daily",
|
|
880
|
+
"monthly": "Monthly",
|
|
881
|
+
"yearly": "Yearly"
|
|
882
|
+
},
|
|
883
|
+
"datePresets": {
|
|
884
|
+
"all": "All data",
|
|
885
|
+
"7d": "Last 7 days",
|
|
886
|
+
"30d": "Last 30 days",
|
|
887
|
+
"month": "Current month",
|
|
888
|
+
"year": "Current year"
|
|
889
|
+
},
|
|
890
|
+
"sources": {
|
|
891
|
+
"file": "File upload",
|
|
892
|
+
"auto-import": "Auto import",
|
|
893
|
+
"cli-auto-load": "CLI auto-load",
|
|
894
|
+
"unknown": "Unknown"
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
},
|
|
898
|
+
"limits": {
|
|
899
|
+
"sectionTitle": "Limits & Subscriptions",
|
|
900
|
+
"sectionDescription": "Budget risk separated from subscription impact in the current filter context",
|
|
901
|
+
"providersBadge": "{{count}} providers",
|
|
902
|
+
"warningBanner": "{{count}} providers have reached or exceeded their monthly limit in the current slice.",
|
|
903
|
+
"cards": {
|
|
904
|
+
"atLimit": "Providers at limit",
|
|
905
|
+
"nearLimit": "Near limit",
|
|
906
|
+
"subscriptionVolume": "Subscription volume",
|
|
907
|
+
"subscriptionValue": "Subscription value",
|
|
908
|
+
"nearLimitHint": "from 80% utilization",
|
|
909
|
+
"subscriptionVolumeHint": "fixed cost / month",
|
|
910
|
+
"subscriptionValueHint": "usage above subscription",
|
|
911
|
+
"noMonth": "No month"
|
|
912
|
+
},
|
|
913
|
+
"statuses": {
|
|
914
|
+
"limitExceeded": "Limit exceeded",
|
|
915
|
+
"budgetTight": "Budget tight",
|
|
916
|
+
"budgetStable": "Budget stable",
|
|
917
|
+
"noLimit": "No limit set",
|
|
918
|
+
"noSubscription": "No subscription",
|
|
919
|
+
"subscriptionPaysOff": "Subscription pays off",
|
|
920
|
+
"belowSubscription": "Still below subscription"
|
|
921
|
+
},
|
|
922
|
+
"tracks": {
|
|
923
|
+
"budgetTitle": "Budget status by provider",
|
|
924
|
+
"budgetSubtitle": "Each track shows the remaining distance to the limit or the already incurred overrun for each provider",
|
|
925
|
+
"budgetNoMonth": "No month in the current slice",
|
|
926
|
+
"subscriptionTitle": "Subscription status by provider",
|
|
927
|
+
"subscriptionSubtitle": "Each track shows the remaining distance to break-even or the already realized value for each provider",
|
|
928
|
+
"subscriptionNoMonth": "No month in the current slice",
|
|
929
|
+
"portfolioTitle": "Portfolio trend",
|
|
930
|
+
"portfolioSubtitle": "Monthly trend of usage, configured limits, and subscription impact",
|
|
931
|
+
"usage": "Usage",
|
|
932
|
+
"limit": "Limit",
|
|
933
|
+
"subscription": "Subscription",
|
|
934
|
+
"breakEven": "Break-even",
|
|
935
|
+
"currentlyUsed": "Currently used",
|
|
936
|
+
"remainingToLimit": "Remaining to limit",
|
|
937
|
+
"alreadyOverLimit": "Already over",
|
|
938
|
+
"remainingToBreakEven": "Remaining to break-even",
|
|
939
|
+
"alreadyAboveBreakEven": "Already above",
|
|
940
|
+
"usageFocusMonth": "Focus month cost",
|
|
941
|
+
"limitSubscription": "Limit / Subscription",
|
|
942
|
+
"budgetRisk": "Budget risk",
|
|
943
|
+
"subscriptionEffect": "Subscription effect",
|
|
944
|
+
"stillToLimit": "{{value}} remaining to limit",
|
|
945
|
+
"alreadyAboveLimit": "{{value}} above limit",
|
|
946
|
+
"stillToBreakEven": "{{value}} remaining to break-even",
|
|
947
|
+
"alreadyAboveBreakEvenText": "{{value}} above break-even",
|
|
948
|
+
"noSubscriptionSet": "No subscription set"
|
|
949
|
+
},
|
|
950
|
+
"modal": {
|
|
951
|
+
"title": "Provider limits",
|
|
952
|
+
"description": "Define subscription and monthly limit per provider. Only providers from the currently loaded report can be edited. A limit of 0 means no limit.",
|
|
953
|
+
"dataStatus": "Data status",
|
|
954
|
+
"lastLoaded": "Last loaded",
|
|
955
|
+
"loadedVia": "Loaded via",
|
|
956
|
+
"cliAutoLoad": "CLI auto-load",
|
|
957
|
+
"noProviders": "No providers found in the loaded report.",
|
|
958
|
+
"hasSubscription": "Subscription enabled",
|
|
959
|
+
"subscriptionPerMonth": "Subscription $/month",
|
|
960
|
+
"monthlyLimit": "Monthly limit $",
|
|
961
|
+
"close": "Close",
|
|
962
|
+
"save": "Save",
|
|
963
|
+
"sources": {
|
|
964
|
+
"file": "File upload",
|
|
965
|
+
"auto-import": "Auto import",
|
|
966
|
+
"cli-auto-load": "CLI auto-load",
|
|
967
|
+
"unknown": "Unknown"
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
},
|
|
971
|
+
"report": {
|
|
972
|
+
"title": "TTDash Report"
|
|
973
|
+
},
|
|
974
|
+
"api": {
|
|
975
|
+
"fetchUsageFailed": "Failed to load data",
|
|
976
|
+
"uploadFailed": "Upload failed",
|
|
977
|
+
"deleteFailed": "Delete failed",
|
|
978
|
+
"importUsageFailed": "Data import failed",
|
|
979
|
+
"importSettingsFailed": "Settings import failed",
|
|
980
|
+
"pdfFailed": "PDF generation failed"
|
|
981
|
+
},
|
|
982
|
+
"toasts": {
|
|
983
|
+
"fileLoaded": "File {{name}} loaded successfully",
|
|
984
|
+
"fileReadFailed": "Could not read file",
|
|
985
|
+
"dataDeleted": "Data deleted",
|
|
986
|
+
"csvExported": "CSV exported",
|
|
987
|
+
"dataImported": "Data imported successfully",
|
|
988
|
+
"settingsExported": "Settings backup exported",
|
|
989
|
+
"dataExported": "Data backup exported",
|
|
990
|
+
"noDataToExport": "No data available to export",
|
|
991
|
+
"settingsImported": "Imported settings from {{name}}",
|
|
992
|
+
"settingsSaved": "Settings saved",
|
|
993
|
+
"dataBackupImported": "Backup imported: added {{added}} new days, skipped {{unchanged}} identical days",
|
|
994
|
+
"dataBackupImportedWithConflicts": "Backup imported: added {{added}} new days, kept {{conflicts}} conflicting days local"
|
|
995
|
+
}
|
|
996
|
+
}
|