@roastcodes/ttdash 6.2.1 → 6.2.3

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 (81) hide show
  1. package/dist/assets/AnimatedBarFill-DFAXO-3i.js +1 -0
  2. package/dist/assets/{AnomalyDetection-BdGl1xvC.js → AnomalyDetection-DKM--5-J.js} +1 -1
  3. package/dist/assets/{AutoImportModal-bokip1Pn.js → AutoImportModal-Cqefa6n_.js} +1 -1
  4. package/dist/assets/CacheROI-BLADEjtP.js +1 -0
  5. package/dist/assets/ChartCard-DxxB4rGm.js +2 -0
  6. package/dist/assets/ChartLegend-Vpk95i3r.js +1 -0
  7. package/dist/assets/CorrelationAnalysis-CI9eGa8R.js +1 -0
  8. package/dist/assets/CostByModelOverTime-BDvnsdLO.js +1 -0
  9. package/dist/assets/{CostByWeekday-X20qjGNA.js → CostByWeekday-BPU1qW5f.js} +1 -1
  10. package/dist/assets/CostForecast-fwd7SRIn.js +1 -0
  11. package/dist/assets/CumulativeCost-CwiklwFD.js +1 -0
  12. package/dist/assets/{CustomTooltip-CBVU1pyK.js → CustomTooltip-CfoUDPbT.js} +1 -1
  13. package/dist/assets/DistributionAnalysis-B8pjQMNj.js +1 -0
  14. package/dist/assets/{DrillDownModal-BXf7B9B8.js → DrillDownModal-kczVCwfa.js} +1 -1
  15. package/dist/assets/{HelpPanel-HNxQElT5.js → HelpPanel-D4zNwrI2.js} +1 -1
  16. package/dist/assets/{InfoButton-CTgLGzb9.js → InfoButton-BGjUQfHz.js} +1 -1
  17. package/dist/assets/InfoHeading-BxLyydv8.js +1 -0
  18. package/dist/assets/{MetricCard-Drluz0b9.js → MetricCard-r_uhdKDU.js} +1 -1
  19. package/dist/assets/{ModelEfficiency-CZ4ZzDtA.js → ModelEfficiency-Di3fDAn7.js} +1 -1
  20. package/dist/assets/{ModelMix-TDHxSk5H.js → ModelMix-BgCzWf9V.js} +1 -1
  21. package/dist/assets/{PeriodComparison-B9WuoaCr.js → PeriodComparison-BIoF7n2v.js} +1 -1
  22. package/dist/assets/{ProviderEfficiency-DpDIYr_l.js → ProviderEfficiency-BFUYfBkW.js} +1 -1
  23. package/dist/assets/ProviderLimitsSection-BxaczEFO.js +1 -0
  24. package/dist/assets/RecentDays-Bac6HOtv.js +1 -0
  25. package/dist/assets/RequestCacheHitRateByModel-DD2j4dXY.js +1 -0
  26. package/dist/assets/RequestQuality-CUy5BQzj.js +1 -0
  27. package/dist/assets/RequestsOverTime-Bv3riiRF.js +1 -0
  28. package/dist/assets/SettingsModal-4uENZ87D.js +1 -0
  29. package/dist/assets/TokenEfficiency-6dfn-4_1.js +1 -0
  30. package/dist/assets/TokenTypes-Dx67irJb.js +1 -0
  31. package/dist/assets/TokensOverTime-C1858Oi-.js +1 -0
  32. package/dist/assets/{app-settings-C3i52ycx.js → app-settings-BInClAwB.js} +1 -1
  33. package/dist/assets/button-CRvPoJg9.js +1 -0
  34. package/dist/assets/card-B4CVYJDH.js +1 -0
  35. package/dist/assets/chart-theme-BdE8bEiN.js +1 -0
  36. package/dist/assets/{constants-jyhBMReu.js → constants-BDzjWFuU.js} +1 -1
  37. package/dist/assets/{dialog-C0AeNKs8.js → dialog-Djogwk0C.js} +1 -1
  38. package/dist/assets/{formatted-value-rO0EpKbc.js → formatted-value-CpLoDrYF.js} +1 -1
  39. package/dist/assets/{formatters-yKppUXb3.js → formatters-C7EouP6y.js} +1 -1
  40. package/dist/assets/help-content-B2N8SHIE.js +1 -0
  41. package/dist/assets/i18n-BS3-GJaA.js +1 -0
  42. package/dist/assets/index-8kk0H-lQ.css +2 -0
  43. package/dist/assets/index-C59tb1_V.js +3 -0
  44. package/dist/assets/motion-vendor-BNVN-Ktr.js +9 -0
  45. package/dist/assets/{section-header-DbV45zH5.js → section-header-Dz0QIE6e.js} +1 -1
  46. package/dist/assets/{ui-vendor-BolBXLiD.js → ui-vendor-C_SJC6eX.js} +1 -1
  47. package/dist/assets/useTranslation-0ThAx3Gl.js +1 -0
  48. package/dist/index.html +25 -24
  49. package/package.json +1 -1
  50. package/server.js +7 -0
  51. package/src/locales/de/common.json +10 -0
  52. package/src/locales/en/common.json +10 -0
  53. package/dist/assets/CacheROI-IyVKLGZu.js +0 -1
  54. package/dist/assets/ChartCard-CBUnItl-.js +0 -2
  55. package/dist/assets/ChartLegend-B64cJdDI.js +0 -1
  56. package/dist/assets/CorrelationAnalysis-Dnd0YUCO.js +0 -1
  57. package/dist/assets/CostByModelOverTime-C10Hr2xR.js +0 -1
  58. package/dist/assets/CostForecast-C--EIZ4B.js +0 -1
  59. package/dist/assets/CumulativeCost-D9v6GDcr.js +0 -1
  60. package/dist/assets/DistributionAnalysis-Cdly0pAu.js +0 -1
  61. package/dist/assets/InfoHeading-oi90uCR7.js +0 -1
  62. package/dist/assets/ProviderLimitsSection-CSuisho_.js +0 -1
  63. package/dist/assets/RecentDays-Cz4Yd_-Q.js +0 -1
  64. package/dist/assets/RequestCacheHitRateByModel-5bkvg7Hx.js +0 -1
  65. package/dist/assets/RequestQuality-iUIOJrpr.js +0 -1
  66. package/dist/assets/RequestsOverTime-D10OssgN.js +0 -1
  67. package/dist/assets/SettingsModal-D9-T5heB.js +0 -1
  68. package/dist/assets/TokenEfficiency-CGeyr8Zq.js +0 -1
  69. package/dist/assets/TokenTypes-BiRBF9VP.js +0 -1
  70. package/dist/assets/TokensOverTime-DeT3D-aC.js +0 -1
  71. package/dist/assets/button-D--hHeVj.js +0 -1
  72. package/dist/assets/card-h-Z9EWBl.js +0 -1
  73. package/dist/assets/chart-theme-D5iCFDJg.js +0 -1
  74. package/dist/assets/help-content-Bt5KCpWS.js +0 -1
  75. package/dist/assets/i18n-C88wS2Uy.js +0 -1
  76. package/dist/assets/index-DjMakAzD.js +0 -3
  77. package/dist/assets/index-DuoM1Ukq.css +0 -2
  78. package/dist/assets/motion-vendor-vKc6gXHZ.js +0 -1
  79. package/dist/assets/useTranslation-BSl7t2D6.js +0 -1
  80. /package/dist/assets/{calculations-GOdNqKo6.js → calculations-BJw_4KdI.js} +0 -0
  81. /package/dist/assets/{provider-limits-5e1fUwPl.js → provider-limits-BgKrr7k7.js} +0 -0
@@ -1 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-COnpUsM8.js";import{b as t,c as n,f as r,l as i,m as a,p as o,t as s,v as c,w as l}from"./charts-vendor-CiBqdKXh.js";import{a as u}from"./motion-vendor-vKc6gXHZ.js";import{t as d}from"./useTranslation-BSl7t2D6.js";import{a as f,d as p}from"./formatters-yKppUXb3.js";import{t as m}from"./formatted-value-rO0EpKbc.js";import{t as h}from"./help-content-Bt5KCpWS.js";import{n as g,r as _,t as v}from"./ChartCard-CBUnItl-.js";import{t as y}from"./CustomTooltip-CBVU1pyK.js";import{n as b,r as x,t as S}from"./chart-theme-D5iCFDJg.js";var C=e(l()),w=u();function T({data:e,onClickDay:l}){let{t:u}=d(),T=(0,C.useId)(),E=e=>`${T}-${e}`.replace(/:/g,``),D=(0,C.useMemo)(()=>{let t=0,n=0,r=0,i=0,a=0;for(let o of e)t+=o[`Cache Read`],n+=o[`Cache Write`],r+=o.Input,i+=o.Output,a+=o.Thinking;return{cacheRead:t,cacheWrite:n,input:r,output:i,thinking:a,total:t+n+r+i+a}},[e]),O=(0,C.useMemo)(()=>e.map((t,n)=>({date:t.date,total:t.Input+t.Output+t[`Cache Write`]+t[`Cache Read`]+t.Thinking,totalPrev:(()=>{let t=n>0?e[n-1]:void 0;return t?t.Input+t.Output+t[`Cache Write`]+t[`Cache Read`]+t.Thinking:void 0})(),tokenMA7:t.tokenMA7})),[e]),k=e=>{let t=e;t?.activePayload?.[0]?.payload?.date&&l&&l(t.activePayload[0].payload.date)},A=(0,w.jsx)(v,{children:e=>(0,w.jsxs)(`div`,{className:`mt-4`,children:[(0,w.jsx)(`div`,{className:`mb-1 text-[10px] tracking-wider text-muted-foreground uppercase`,children:u(`charts.tokensOverTime.allTypes`)}),(0,w.jsx)(_,{variant:`line`,children:(0,w.jsx)(t,{width:`100%`,height:180,children:(0,w.jsxs)(s,{data:O,margin:x,children:[(0,w.jsx)(`defs`,{children:(0,w.jsxs)(`linearGradient`,{id:E(`total`),x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,w.jsx)(`stop`,{offset:`0%`,stopColor:b.cost,stopOpacity:.25}),(0,w.jsx)(`stop`,{offset:`100%`,stopColor:b.cost,stopOpacity:0})]})}),(0,w.jsx)(a,{strokeDasharray:`3 3`,stroke:b.grid,opacity:.3}),(0,w.jsx)(i,{dataKey:`date`,tickFormatter:f,stroke:b.axis,fontSize:10,tickLine:!1}),(0,w.jsx)(n,{tickFormatter:p,stroke:b.axis,fontSize:10,tickLine:!1,axisLine:!1,width:55}),(0,w.jsx)(c,{content:(0,w.jsx)(y,{formatter:p}),cursor:{fill:`hsl(var(--muted))`,opacity:.15}}),(0,w.jsx)(r,{type:`monotone`,dataKey:`total`,stroke:b.cost,fill:`url(#${E(`total`)})`,strokeWidth:1.5,name:u(`charts.tokensOverTime.totalTokens`),isAnimationActive:e,animationDuration:S.duration}),(0,w.jsx)(o,{type:`monotone`,dataKey:`tokenMA7`,stroke:b.ma7,strokeWidth:2,strokeDasharray:`5 5`,dot:!1,connectNulls:!0,name:u(`charts.tokensOverTime.movingAverage`),isAnimationActive:e,animationBegin:S.stagger,animationDuration:S.slowDuration})]})})})]})});return(0,w.jsxs)(g,{title:u(`charts.tokensOverTime.title`),subtitle:u(`charts.tokensOverTime.subtitle`),info:h.tokensOverTime,summary:(0,w.jsx)(m,{value:D.total,type:`tokens`}),className:`lg:col-span-2`,chartData:e,valueKey:`Cache Read`,valueFormatter:p,expandedExtra:A,children:[(0,w.jsx)(`div`,{className:`mb-3 grid grid-cols-2 gap-2 text-center md:grid-cols-5`,children:[{label:`Cache Read`,value:D.cacheRead,color:b.cacheRead},{label:`Cache Write`,value:D.cacheWrite,color:b.cacheWrite},{label:`Output`,value:D.output,color:b.output},{label:`Input`,value:D.input,color:b.input},{label:`Thinking`,value:D.thinking,color:b.cost}].map(e=>(0,w.jsxs)(`div`,{className:`rounded-lg bg-muted/20 p-1.5`,children:[(0,w.jsx)(`div`,{className:`text-[9px] tracking-wider text-muted-foreground uppercase`,children:e.label}),(0,w.jsx)(`div`,{className:`font-mono text-xs font-semibold`,style:{color:e.color},children:p(e.value)}),(0,w.jsx)(`div`,{className:`font-mono text-[9px] text-muted-foreground/60`,children:D.total>0?`${(e.value/D.total*100).toFixed(1)}%`:`–`})]},e.label))}),(0,w.jsxs)(`div`,{className:`mb-2`,children:[(0,w.jsx)(`div`,{className:`mb-1 text-[10px] tracking-wider text-muted-foreground uppercase`,children:u(`charts.tokensOverTime.cacheTokens`)}),(0,w.jsx)(v,{children:l=>(0,w.jsx)(_,{variant:`line`,children:(0,w.jsx)(t,{width:`100%`,height:150,children:(0,w.jsxs)(s,{data:e,margin:{...x,bottom:0},onClick:k,children:[(0,w.jsxs)(`defs`,{children:[(0,w.jsxs)(`linearGradient`,{id:E(`cacheRead`),x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,w.jsx)(`stop`,{offset:`0%`,stopColor:b.cacheRead,stopOpacity:.25}),(0,w.jsx)(`stop`,{offset:`100%`,stopColor:b.cacheRead,stopOpacity:0})]}),(0,w.jsxs)(`linearGradient`,{id:E(`cacheWrite`),x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,w.jsx)(`stop`,{offset:`0%`,stopColor:b.cacheWrite,stopOpacity:.25}),(0,w.jsx)(`stop`,{offset:`100%`,stopColor:b.cacheWrite,stopOpacity:0})]})]}),(0,w.jsx)(a,{strokeDasharray:`3 3`,stroke:b.grid,opacity:.3}),(0,w.jsx)(i,{dataKey:`date`,tickFormatter:f,stroke:b.axis,fontSize:10,tickLine:!1,hide:!0}),(0,w.jsx)(n,{tickFormatter:p,stroke:b.axis,fontSize:10,tickLine:!1,axisLine:!1,width:55}),(0,w.jsx)(c,{content:(0,w.jsx)(y,{formatter:p}),cursor:{fill:`hsl(var(--muted))`,opacity:.15}}),(0,w.jsx)(r,{type:`monotone`,dataKey:`Cache Read`,stroke:b.cacheRead,fill:`url(#${E(`cacheRead`)})`,strokeWidth:1.5,name:`Cache Read`,isAnimationActive:l,animationDuration:S.duration}),(0,w.jsx)(r,{type:`monotone`,dataKey:`Cache Write`,stroke:b.cacheWrite,fill:`url(#${E(`cacheWrite`)})`,strokeWidth:1.5,name:`Cache Write`,isAnimationActive:l,animationDuration:S.duration}),(0,w.jsx)(o,{type:`monotone`,dataKey:`cacheReadMA7`,stroke:b.cacheRead,strokeWidth:2,strokeDasharray:`5 5`,dot:!1,connectNulls:!0,name:`Cache Read ${u(`charts.tokensOverTime.averageSuffix`)}`,isAnimationActive:l,animationBegin:S.stagger,animationDuration:S.slowDuration}),(0,w.jsx)(o,{type:`monotone`,dataKey:`cacheWriteMA7`,stroke:b.cacheWrite,strokeWidth:2,strokeDasharray:`5 5`,dot:!1,connectNulls:!0,name:`Cache Write ${u(`charts.tokensOverTime.averageSuffix`)}`,isAnimationActive:l,animationBegin:S.stagger*2,animationDuration:S.slowDuration})]})})})})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`div`,{className:`mb-1 text-[10px] tracking-wider text-muted-foreground uppercase`,children:u(`charts.tokensOverTime.inputOutputTokens`)}),(0,w.jsx)(v,{children:l=>(0,w.jsx)(_,{variant:`line`,children:(0,w.jsx)(t,{width:`100%`,height:150,children:(0,w.jsxs)(s,{data:e,margin:x,onClick:k,children:[(0,w.jsxs)(`defs`,{children:[(0,w.jsxs)(`linearGradient`,{id:E(`output`),x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,w.jsx)(`stop`,{offset:`0%`,stopColor:b.output,stopOpacity:.25}),(0,w.jsx)(`stop`,{offset:`100%`,stopColor:b.output,stopOpacity:0})]}),(0,w.jsxs)(`linearGradient`,{id:E(`input`),x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,w.jsx)(`stop`,{offset:`0%`,stopColor:b.input,stopOpacity:.25}),(0,w.jsx)(`stop`,{offset:`100%`,stopColor:b.input,stopOpacity:0})]})]}),(0,w.jsx)(a,{strokeDasharray:`3 3`,stroke:b.grid,opacity:.3}),(0,w.jsx)(i,{dataKey:`date`,tickFormatter:f,stroke:b.axis,fontSize:10,tickLine:!1}),(0,w.jsx)(n,{tickFormatter:p,stroke:b.axis,fontSize:10,tickLine:!1,axisLine:!1,width:55}),(0,w.jsx)(c,{content:(0,w.jsx)(y,{formatter:p}),cursor:{fill:`hsl(var(--muted))`,opacity:.15}}),(0,w.jsx)(r,{type:`monotone`,dataKey:`Output`,stroke:b.output,fill:`url(#${E(`output`)})`,strokeWidth:1.5,name:`Output`,isAnimationActive:l,animationDuration:S.duration}),(0,w.jsx)(r,{type:`monotone`,dataKey:`Input`,stroke:b.input,fill:`url(#${E(`input`)})`,strokeWidth:1.5,name:`Input`,isAnimationActive:l,animationDuration:S.duration}),(0,w.jsx)(o,{type:`monotone`,dataKey:`outputMA7`,stroke:b.output,strokeWidth:2,strokeDasharray:`5 5`,dot:!1,connectNulls:!0,name:`Output ${u(`charts.tokensOverTime.averageSuffix`)}`,isAnimationActive:l,animationBegin:S.stagger,animationDuration:S.slowDuration}),(0,w.jsx)(o,{type:`monotone`,dataKey:`inputMA7`,stroke:b.input,strokeWidth:2,strokeDasharray:`5 5`,dot:!1,connectNulls:!0,name:`Input ${u(`charts.tokensOverTime.averageSuffix`)}`,isAnimationActive:l,animationBegin:S.stagger*2,animationDuration:S.slowDuration})]})})})})]}),(0,w.jsxs)(`div`,{className:`mt-3`,children:[(0,w.jsx)(`div`,{className:`mb-1 text-[10px] tracking-wider text-muted-foreground uppercase`,children:u(`charts.tokensOverTime.thinkingTokens`)}),(0,w.jsx)(v,{children:l=>(0,w.jsx)(_,{variant:`line`,children:(0,w.jsx)(t,{width:`100%`,height:110,children:(0,w.jsxs)(s,{data:e,margin:x,onClick:k,children:[(0,w.jsx)(`defs`,{children:(0,w.jsxs)(`linearGradient`,{id:E(`thinking`),x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,w.jsx)(`stop`,{offset:`0%`,stopColor:b.cost,stopOpacity:.25}),(0,w.jsx)(`stop`,{offset:`100%`,stopColor:b.cost,stopOpacity:0})]})}),(0,w.jsx)(a,{strokeDasharray:`3 3`,stroke:b.grid,opacity:.3}),(0,w.jsx)(i,{dataKey:`date`,tickFormatter:f,stroke:b.axis,fontSize:10,tickLine:!1,hide:!0}),(0,w.jsx)(n,{tickFormatter:p,stroke:b.axis,fontSize:10,tickLine:!1,axisLine:!1,width:55}),(0,w.jsx)(c,{content:(0,w.jsx)(y,{formatter:p}),cursor:{fill:`hsl(var(--muted))`,opacity:.15}}),(0,w.jsx)(r,{type:`monotone`,dataKey:`Thinking`,stroke:b.cost,fill:`url(#${E(`thinking`)})`,strokeWidth:1.5,name:`Thinking`,isAnimationActive:l,animationDuration:S.duration}),(0,w.jsx)(o,{type:`monotone`,dataKey:`thinkingMA7`,stroke:b.cost,strokeWidth:2,strokeDasharray:`5 5`,dot:!1,connectNulls:!0,name:`Thinking ${u(`charts.tokensOverTime.averageSuffix`)}`,isAnimationActive:l,animationBegin:S.stagger,animationDuration:S.slowDuration})]})})})})]})]})}export{T as TokensOverTime};
@@ -1 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-COnpUsM8.js";import{S as t,w as n}from"./charts-vendor-CiBqdKXh.js";import{a as r}from"./motion-vendor-vKc6gXHZ.js";import{y as i}from"./ui-vendor-BolBXLiD.js";import{a}from"./useTranslation-BSl7t2D6.js";var o=e(n()),s=e=>typeof e==`boolean`?`${e}`:e===0?`0`:e,c=t,l=(e,t)=>n=>{if(t?.variants==null)return c(e,n?.class,n?.className);let{variants:r,defaultVariants:i}=t,a=Object.keys(r).map(e=>{let t=n?.[e],a=i?.[e];if(t===null)return null;let o=s(t)||s(a);return r[e][o]}),o=n&&Object.entries(n).reduce((e,t)=>{let[n,r]=t;return r===void 0||(e[n]=r),e},{});return c(e,a,t?.compoundVariants?.reduce((e,t)=>{let{class:n,className:r,...a}=t;return Object.entries(a).every(e=>{let[t,n]=e;return Array.isArray(n)?n.includes({...i,...o}[t]):{...i,...o}[t]===n})?[...e,n,r]:e},[]),n?.class,n?.className)},u=r(),d=l(`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 cursor-pointer`,{variants:{variant:{default:`bg-primary text-primary-foreground hover:bg-primary/90`,destructive:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,outline:`border border-border bg-transparent hover:bg-accent hover:text-accent-foreground`,secondary:`bg-secondary text-secondary-foreground hover:bg-secondary/80`,ghost:`hover:bg-accent hover:text-accent-foreground`,link:`text-primary underline-offset-4 hover:underline`},size:{default:`h-9 px-4 py-2`,sm:`h-8 rounded-md px-3 text-xs`,lg:`h-10 rounded-md px-8`,icon:`h-9 w-9`}},defaultVariants:{variant:`default`,size:`default`}}),f=o.forwardRef(({className:e,variant:t,size:n,asChild:r=!1,...o},s)=>(0,u.jsx)(r?i:`button`,{className:a(d({variant:t,size:n,className:e})),ref:s,...o}));f.displayName=`Button`;export{f as t};
@@ -1 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-COnpUsM8.js";import{w as t}from"./charts-vendor-CiBqdKXh.js";import{a as n,r}from"./motion-vendor-vKc6gXHZ.js";import{a as i,i as a}from"./useTranslation-BSl7t2D6.js";var o=e(t()),s=n(),c=o.forwardRef(({className:e,...t},n)=>{let o=a()?{initial:!1,animate:{opacity:1,y:0},transition:{duration:0}}:{initial:{opacity:0,y:14},whileInView:{opacity:1,y:0},viewport:{once:!0,amount:.15},transition:{duration:.35,ease:`easeOut`}};return(0,s.jsx)(r.div,{ref:n,...t,...o,className:i(`relative rounded-xl border border-border/50 bg-card/80 text-card-foreground shadow-[var(--shadow-card)] backdrop-blur-xl transition-all duration-300 hover:border-border/80 hover:shadow-[var(--shadow-card-hover)] motion-reduce:transition-none`,e)})});c.displayName=`Card`;var l=o.forwardRef(({className:e,...t},n)=>(0,s.jsx)(`div`,{ref:n,className:i(`flex flex-col space-y-1.5 p-4`,e),...t}));l.displayName=`CardHeader`;var u=o.forwardRef(({children:e,className:t,...n},r)=>(0,s.jsx)(`h3`,{ref:r,className:i(`leading-none font-semibold tracking-tight`,t),...n,children:e}));u.displayName=`CardTitle`;var d=o.forwardRef(({className:e,...t},n)=>(0,s.jsx)(`div`,{ref:n,className:i(`p-4 pt-0`,e),...t}));d.displayName=`CardContent`;var f=o.forwardRef(({className:e,...t},n)=>(0,s.jsx)(`p`,{ref:n,className:i(`text-xs text-muted-foreground`,e),...t}));f.displayName=`CardDescription`;export{u as a,l as i,d as n,f as r,c as t};
@@ -1 +0,0 @@
1
- var e={cost:`hsl(var(--chart-1))`,ma7:`hsl(var(--chart-2))`,cumulative:`hsl(var(--chart-3))`,input:`hsl(var(--chart-5))`,output:`hsl(var(--chart-4))`,cacheWrite:`hsl(var(--chart-2))`,cacheRead:`hsl(var(--chart-3))`,grid:`hsl(var(--border))`,axis:`hsl(var(--muted-foreground))`,tooltipBg:`hsl(var(--popover))`,tooltipBorder:`hsl(var(--border))`},t={top:5,right:10,left:10,bottom:5},n={duration:800,easing:`ease-out`,stagger:140,slowDuration:1200};export{e as n,t as r,n as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./i18n-C88wS2Uy.js";var t={de:{keyboardShortcuts:[{keys:`⌘ K`,description:`Command Palette öffnen`},{keys:`ESC`,description:`Dialog / Zoom schliessen`}],metric:{totalCost:`Zeigt die Gesamtkosten aller API-Aufrufe im gewählten Zeitraum. Die Berechnung basiert auf den hinterlegten Token-Preisen pro Modell.`,totalTokens:`Zeigt die Summe aller verarbeiteten Tokens aus Input, Output und Cache. Ein Token entspricht grob vier Zeichen Text.`,activeDays:`Zeigt, an wie vielen Tagen im gewählten Zeitraum mindestens ein API-Aufruf vorhanden war.`,topModel:`Zeigt das Modell mit den höchsten Gesamtkosten im aktuellen Ausschnitt.`,cacheHitRate:`Zeigt den Anteil der Tokens, die aus dem Cache gelesen wurden. Höhere Werte sprechen meist für bessere Kosteneffizienz.`,costPerMillion:`Zeigt die durchschnittlichen Kosten pro 1 Million verarbeiteter Tokens. Niedrigere Werte sprechen für effizientere Nutzung.`,mostExpensiveDay:`Zeigt den Zeitraumspunkt mit den höchsten API-Kosten im aktuellen Ausschnitt.`,cheapestDay:`Zeigt den Zeitraumspunkt mit den niedrigsten API-Kosten im aktuellen Ausschnitt.`,avgCostPerDay:`Zeigt die durchschnittlichen Kosten pro aktivem Zeitraumspunkt.`,outputTokens:`Zeigt die Menge der generierten Output-Tokens. Diese sind meist teurer als reine Input-Tokens.`},chart:{costOverTime:`Zeigt die API-Kosten im Zeitverlauf zusammen mit einem gleitenden 7-Tage-Durchschnitt. Klick auf einen Punkt öffnet den Drilldown.`,costByModel:`Zeigt die Kostenverteilung nach Modell als Donut. So wird sichtbar, welche Modelle den grössten Kostenanteil tragen.`,costByModelOverTime:`Zeigt, wie sich die Kosten je Modell über die Zeit entwickeln. Gut geeignet, um Treiber und Verschiebungen im Modellmix zu erkennen.`,cumulativeCost:`Zeigt die kumulierten Gesamtkosten über den gewählten Zeitraum. Falls möglich, wird zusätzlich die Monatsend-Projektion eingeblendet.`,costByWeekday:`Zeigt die durchschnittlichen Kosten pro Wochentag. So werden wiederkehrende Lastmuster über die Woche sichtbar.`,tokensOverTime:`Zeigt den Token-Verbrauch über die Zeit, getrennt nach Input, Output, Cache Write, Cache Read und Thinking.`,requestsOverTime:`Zeigt Anfragen im Zeitverlauf mit Gesamtlinie, Modelllinien und Trendlinie. Klick auf einen Punkt öffnet den Drilldown.`,requestCacheHitRate:`Zeigt die Cache-Hit-Rate pro Modell zusammen mit dem gefilterten Gesamtwert und dem gleitenden 7-Tage-Durchschnitt auf Basis des gewählten Tagesbereichs.`,tokenTypes:`Zeigt die Verteilung der Token-Typen als Donut. So wird sichtbar, welcher Anteil auf Input, Output, Cache oder Thinking entfällt.`,tokenEfficiency:`Zeigt die Kosten pro 1 Million Tokens im Zeitverlauf. So lässt sich erkennen, ob Modellmix und Cache-Nutzung effizienter oder teurer werden.`,modelMix:`Zeigt den prozentualen Kostenanteil der Modelle je Zeitraumspunkt. So werden Modellwechsel und Konzentration sichtbar.`,distributionAnalysis:`Zeigt Histogramme für Kosten, Anfragen und Tokens pro Anfrage. So wird die Streuung sichtbar, nicht nur der Durchschnitt.`,correlationAnalysis:`Zeigt Punktdiagramme für mögliche Zusammenhänge, etwa Anfragen zu Kosten oder Cache-Rate zu Kosten pro Anfrage. Die Korrelation ist ein Signal, aber kein Beweis für Kausalität.`,heatmap:`Zeigt eine Kalender-Heatmap der täglichen Kosten. Dunklere Felder stehen für höhere Werte.`,requestHeatmap:`Zeigt eine Kalender-Heatmap der Anfragen pro Tag. So werden Lastmuster unabhängig von Kosten sichtbar.`,tokenHeatmap:`Zeigt eine Kalender-Heatmap des Tokenvolumens pro Tag. So lassen sich volumenstarke und kostenstarke Tage besser unterscheiden.`,forecast:`Zeigt die Kostenprognose für den laufenden Monat auf Basis geglätteter Kalendertageskosten. Ergänzt wird sie durch Trend und Unsicherheitsband.`,cacheROI:`Zeigt den Effekt der Cache-Nutzung, indem hypothetische Kosten ohne Cache mit den tatsächlichen Kosten verglichen werden.`,providerLimitProgress:`Zeigt pro Anbieter, wie stark das konfigurierte Monatslimit bereits verbraucht ist. Überschreitungen werden separat markiert.`,providerSubscriptionMix:`Vergleicht pro Anbieter die fixen Abo-Kosten mit den variablen API-Kosten und blendet optional das gesetzte Monatslimit ein.`,providerLimitTimeline:`Zeigt im Monatsverlauf die Summe der aktuellen Anbieterkosten gegen die Summe aller konfigurierten Limits. So werden Engpässe früh sichtbar.`,periodComparison:`Zeigt den Vergleich zweier Zeiträume, etwa Woche gegen Vorwoche oder Monat gegen Vormonat, anhand zentraler Kennzahlen.`,anomalyDetection:`Zeigt auffällige Zeitraumspunkte mit ungewöhnlich hohen oder niedrigen Kosten. Grundlage ist die Abweichung vom Mittelwert in Standardabweichungen.`},section:{insights:`Zeigt verdichtete Aussagen zu Konzentration, Anfrage-Ökonomie, Nutzungsmuster und Peak-Fenstern. Diese Sektion ist als schneller Einstieg vor dem Detailblick gedacht.`,metrics:`Zeigt die wichtigsten Kennzahlen auf einen Blick. Hover über abgekürzte Werte zeigt den exakten Zahlenwert.`,today:`Zeigt die KPIs des aktuellen Tages im Datensatz. So wird sichtbar, wie stark der Tageswert vom Zeitraumdurchschnitt abweicht.`,currentMonth:`Zeigt die KPIs des laufenden Monats. So werden Fortschritt, Abdeckung und der Vergleich mit dem Vormonat sichtbar.`,activity:`Zeigt Kalenderansichten für Kosten, Anfragen und Tokens. So werden Lastspitzen, Lücken und saisonale Muster sichtbar.`,forecastCache:`Zeigt Monatsprognose, Cache-Ersparnis und operative Anfragequalität in einem Block. So entsteht ein gemeinsamer Blick auf Ausblick und Effizienz.`,limits:`Zeigt pro Anbieter konfigurierte Abos und Monatslimits. Die Sektion macht sichtbar, wie weit Kostenbudgets im aktuellen Ausschnitt ausgereizt sind.`,costAnalysis:`Zeigt Kostenverlauf und Kostenverteilung nach Modell. So wird sichtbar, wo Geld ausgegeben wurde und welche Modelle die Haupttreiber sind.`,tokenAnalysis:`Zeigt Tokenvolumen, Token-Typen, Wochentagsmuster und Effizienz. So lässt sich besser einordnen, ob Kosten eher aus Menge oder Preisniveau entstehen.`,requestAnalysis:`Zeigt Anfragen gesamt, nach Modell und im Verlauf. Im Zoom kommen zusätzliche Trends und Verteilungen hinzu.`,advancedAnalysis:`Zeigt Verteilungen, Korrelationen und Konzentrationsrisiken. So wird sichtbar, wie stabil, konzentriert oder ungewöhnlich die Nutzung ist.`,comparisons:`Zeigt Veränderungen zwischen Perioden und markiert Ausreisser. So lassen sich Verschiebungen schneller einordnen.`,tables:`Zeigt detaillierte Tabellen mit Sortierung und Drilldown. So lassen sich einzelne Modelle, Anbieter und Tage gezielt prüfen.`},feature:{requestQuality:`Zeigt verdichtete Anfragesignale wie Tokens pro Anfrage, Kosten pro Anfrage sowie Cache- und Thinking-Anteil. So lässt sich die operative Anfragequalität schneller einordnen.`,providerLimits:`Hier werden fixe Abo-Kosten und variable Monatslimits pro Anbieter gepflegt. Die Eingaben bleiben lokal im Browser gespeichert und gelten nur für Anbieter, die im geladenen Report vorkommen.`,concentrationRisk:`Zeigt die Abhängigkeit von einzelnen Modellen und Anbietern. Hohe Werte bedeuten, dass wenige Akteure einen grossen Teil der Kosten tragen.`,providerEfficiency:`Zeigt den Vergleich der Anbieter nach Kosten, Anfragen, Tokens und Effizienzkennzahlen wie Kosten pro Anfrage oder Kosten pro 1 Mio. Tokens.`,modelEfficiency:`Zeigt den Vergleich der Modelle nach Kosten, Volumen und Effizienz. So lassen sich teure oder ineffiziente Kandidaten schnell erkennen.`,recentDays:`Zeigt die Detailtabelle pro Tag, Monat oder Jahr mit Drilldown und Benchmarks gegen Vortag und 7-Tage-Mittel.`}},en:{keyboardShortcuts:[{keys:`⌘ K`,description:`Open command palette`},{keys:`ESC`,description:`Close dialog / zoom view`}],metric:{totalCost:`Shows total API cost across the selected range. The calculation is based on configured per-model token prices.`,totalTokens:`Shows the sum of all processed tokens across input, output, and cache. One token is roughly four text characters.`,activeDays:`Shows how many days in the selected range contain at least one API call.`,topModel:`Shows the model with the highest total cost in the current slice.`,cacheHitRate:`Shows the share of tokens served from cache. Higher values usually indicate better cost efficiency.`,costPerMillion:`Shows average cost per 1 million processed tokens. Lower values indicate more efficient usage.`,mostExpensiveDay:`Shows the period point with the highest API cost in the current slice.`,cheapestDay:`Shows the period point with the lowest API cost in the current slice.`,avgCostPerDay:`Shows the average cost per active period point.`,outputTokens:`Shows the volume of generated output tokens. These are usually more expensive than pure input tokens.`},chart:{costOverTime:`Shows API cost over time together with a rolling 7-day average. Clicking a point opens the drilldown.`,costByModel:`Shows cost distribution by model as a donut chart. This makes the main cost drivers visible.`,costByModelOverTime:`Shows how cost per model evolves over time. Useful for spotting shifts in the model mix.`,cumulativeCost:`Shows cumulative total cost over the selected range. When possible, a month-end projection is added.`,costByWeekday:`Shows average cost by weekday, making recurring weekly load patterns visible.`,tokensOverTime:`Shows token usage over time split by input, output, cache write, cache read, and thinking.`,requestsOverTime:`Shows requests over time with total line, per-model lines, and a trend line. Clicking a point opens the drilldown.`,requestCacheHitRate:`Shows cache hit rate per model together with the filtered overall total and the trailing 7-day average based on the selected daily range.`,tokenTypes:`Shows the distribution of token types as a donut chart so input, output, cache, and thinking shares become visible.`,tokenEfficiency:`Shows cost per 1 million tokens over time. This helps spot whether model mix and cache usage are becoming more or less efficient.`,modelMix:`Shows the percentage cost share of models at each period point. This makes model shifts and concentration visible.`,distributionAnalysis:`Shows histograms for costs, requests, and tokens per request. This highlights spread, not just averages.`,correlationAnalysis:`Shows scatter plots for potential relationships such as requests to cost or cache rate to cost per request. Correlation is a signal, not proof of causality.`,heatmap:`Shows a calendar heatmap of daily cost. Darker cells indicate higher values.`,requestHeatmap:`Shows a calendar heatmap of requests per day. This reveals load patterns independently of cost.`,tokenHeatmap:`Shows a calendar heatmap of token volume per day. This helps distinguish high-volume days from high-cost days.`,forecast:`Shows cost forecast for the current month based on smoothed calendar-day costs, complemented by trend and uncertainty band.`,cacheROI:`Shows the impact of cache usage by comparing hypothetical no-cache costs with actual costs.`,providerLimitProgress:`Shows how much of each configured monthly provider limit has already been used. Overruns are marked separately.`,providerSubscriptionMix:`Compares fixed subscription cost with variable API cost per provider and can optionally include the configured monthly limit.`,providerLimitTimeline:`Shows monthly provider cost against total configured limits over time so bottlenecks become visible early.`,periodComparison:`Shows the comparison of two periods, such as week-over-week or month-over-month, using central metrics.`,anomalyDetection:`Shows unusual period points with unusually high or low cost based on deviation from the mean in standard deviations.`},section:{insights:`Shows condensed statements about concentration, request economics, usage patterns, and peak windows. This section is meant as a fast entry point before deeper analysis.`,metrics:`Shows the most important KPIs at a glance. Hover abbreviated values to see exact numbers.`,today:`Shows the KPIs of the current day in the dataset. This makes it easy to compare the day against the period average.`,currentMonth:`Shows the KPIs of the current month, including progress, coverage, and comparison to the previous month.`,activity:`Shows calendar views for cost, requests, and tokens, making spikes, gaps, and seasonal patterns visible.`,forecastCache:`Shows month forecast, cache savings, and operational request quality in one block for a combined outlook on efficiency.`,limits:`Shows configured subscriptions and monthly limits per provider. This section makes it visible how far budgets are stretched in the current slice.`,costAnalysis:`Shows cost trend and cost distribution by model so it is clear where spend happened and which models dominate.`,tokenAnalysis:`Shows token volume, token types, weekday patterns, and efficiency so you can judge whether cost comes from volume or pricing level.`,requestAnalysis:`Shows requests overall, by model, and over time. The expanded views add extra trends and distributions.`,advancedAnalysis:`Shows distributions, correlations, and concentration risk so usage stability, concentration, and unusual behavior become visible.`,comparisons:`Shows changes between periods and marks outliers so shifts can be understood faster.`,tables:`Shows detailed tables with sorting and drilldown so individual models, providers, and days can be inspected directly.`},feature:{requestQuality:`Shows condensed request signals such as tokens per request, cost per request, and cache and thinking shares. This helps assess operational request quality faster.`,providerLimits:`This is where fixed subscription cost and variable monthly limits are maintained per provider. Values are stored in the local app settings and only apply to providers present in the loaded report.`,concentrationRisk:`Shows dependency on individual models and providers. Higher values mean that a small number of actors carries a large share of cost.`,providerEfficiency:`Shows the provider comparison by cost, requests, tokens, and efficiency metrics such as $/req or $/1M tokens.`,modelEfficiency:`Shows the model comparison by cost, volume, and efficiency so expensive or inefficient candidates are easy to spot.`,recentDays:`Shows the detailed table per day, month, or year with drilldown and benchmarks against the previous day and 7-day average.`}}};function n(){return t[e()]}function r(e){return new Proxy({},{get:(t,n)=>{let r=e();if(Object.prototype.hasOwnProperty.call(r,n))return Reflect.get(r,n)},has:(t,n)=>{let r=e();return Object.prototype.hasOwnProperty.call(r,n)},ownKeys:()=>Reflect.ownKeys(e()),getOwnPropertyDescriptor:(t,n)=>{let r=e();if(Object.prototype.hasOwnProperty.call(r,n))return{value:Reflect.get(r,n),enumerable:!0,configurable:!0}}})}function i(){return n().keyboardShortcuts}var a=r(()=>n().metric),o=r(()=>n().chart),s=r(()=>n().section),c=r(()=>n().feature);export{i as a,s as i,c as n,a as r,o as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./useTranslation-BSl7t2D6.js";var t=e=>typeof e==`string`,n=()=>{let e,t,n=new Promise((n,r)=>{e=n,t=r});return n.resolve=e,n.reject=t,n},r=e=>e==null?``:String(e),i=(e,t,n)=>{e.forEach(e=>{t[e]&&(n[e]=t[e])})},a=/###/g,o=e=>e&&e.includes(`###`)?e.replace(a,`.`):e,s=e=>!e||t(e),c=(e,n,r)=>{let i=t(n)?n.split(`.`):n,a=0;for(;a<i.length-1;){if(s(e))return{};let t=o(i[a]);!e[t]&&r&&(e[t]=new r),e=Object.prototype.hasOwnProperty.call(e,t)?e[t]:{},++a}return s(e)?{}:{obj:e,k:o(i[a])}},l=(e,t,n)=>{let{obj:r,k:i}=c(e,t,Object);if(r!==void 0||t.length===1){r[i]=n;return}let a=t[t.length-1],o=t.slice(0,t.length-1),s=c(e,o,Object);for(;s.obj===void 0&&o.length;)a=`${o[o.length-1]}.${a}`,o=o.slice(0,o.length-1),s=c(e,o,Object),s?.obj&&s.obj[`${s.k}.${a}`]!==void 0&&(s.obj=void 0);s.obj[`${s.k}.${a}`]=n},u=(e,t,n,r)=>{let{obj:i,k:a}=c(e,t,Object);i[a]=i[a]||[],i[a].push(n)},d=(e,t)=>{let{obj:n,k:r}=c(e,t);if(n&&Object.prototype.hasOwnProperty.call(n,r))return n[r]},f=(e,t,n)=>{let r=d(e,n);return r===void 0?d(t,n):r},p=(e,n,r)=>{for(let i in n)i!==`__proto__`&&i!==`constructor`&&(i in e?t(e[i])||e[i]instanceof String||t(n[i])||n[i]instanceof String?r&&(e[i]=n[i]):p(e[i],n[i],r):e[i]=n[i]);return e},m=e=>e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,`\\$&`),h={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`,"/":`&#x2F;`},g=e=>t(e)?e.replace(/[&<>"'\/]/g,e=>h[e]):e,_=class{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){let t=this.regExpMap.get(e);if(t!==void 0)return t;let n=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,n),this.regExpQueue.push(e),n}},v=[` `,`,`,`?`,`!`,`;`],y=new _(20),b=(e,t,n)=>{t||=``,n||=``;let r=v.filter(e=>!t.includes(e)&&!n.includes(e));if(r.length===0)return!0;let i=y.getRegExp(`(${r.map(e=>e===`?`?`\\?`:e).join(`|`)})`),a=!i.test(e);if(!a){let t=e.indexOf(n);t>0&&!i.test(e.substring(0,t))&&(a=!0)}return a},x=(e,t,n=`.`)=>{if(!e)return;if(e[t])return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;let r=t.split(n),i=e;for(let e=0;e<r.length;){if(!i||typeof i!=`object`)return;let t,a=``;for(let o=e;o<r.length;++o)if(o!==e&&(a+=n),a+=r[o],t=i[a],t!==void 0){if([`string`,`number`,`boolean`].includes(typeof t)&&o<r.length-1)continue;e+=o-e+1;break}i=t}return i},S=e=>e?.replace(/_/g,`-`),C={type:`logger`,log(e){this.output(`log`,e)},warn(e){this.output(`warn`,e)},error(e){this.output(`error`,e)},output(e,t){console?.[e]?.apply?.(console,t)}},w=new class e{constructor(e,t={}){this.init(e,t)}init(e,t={}){this.prefix=t.prefix||`i18next:`,this.logger=e||C,this.options=t,this.debug=t.debug}log(...e){return this.forward(e,`log`,``,!0)}warn(...e){return this.forward(e,`warn`,``,!0)}error(...e){return this.forward(e,`error`,``)}deprecate(...e){return this.forward(e,`warn`,`WARNING DEPRECATED: `,!0)}forward(e,n,r,i){return i&&!this.debug?null:(t(e[0])&&(e[0]=`${r}${this.prefix} ${e[0]}`),this.logger[n](e))}create(t){return new e(this.logger,{prefix:`${this.prefix}:${t}:`,...this.options})}clone(t){return t||=this.options,t.prefix=t.prefix||this.prefix,new e(this.logger,t)}},T=class{constructor(){this.observers={}}on(e,t){return e.split(` `).forEach(e=>{this.observers[e]||(this.observers[e]=new Map);let n=this.observers[e].get(t)||0;this.observers[e].set(t,n+1)}),this}off(e,t){if(this.observers[e]){if(!t){delete this.observers[e];return}this.observers[e].delete(t)}}once(e,t){let n=(...r)=>{t(...r),this.off(e,n)};return this.on(e,n),this}emit(e,...t){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([e,n])=>{for(let r=0;r<n;r++)e(...t)}),this.observers[`*`]&&Array.from(this.observers[`*`].entries()).forEach(([n,r])=>{for(let i=0;i<r;i++)n(e,...t)})}},E=class extends T{constructor(e,t={ns:[`translation`],defaultNS:`translation`}){super(),this.data=e||{},this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator=`.`),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(e){this.options.ns.includes(e)||this.options.ns.push(e)}removeNamespaces(e){let t=this.options.ns.indexOf(e);t>-1&&this.options.ns.splice(t,1)}getResource(e,n,r,i={}){let a=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,o=i.ignoreJSONStructure===void 0?this.options.ignoreJSONStructure:i.ignoreJSONStructure,s;e.includes(`.`)?s=e.split(`.`):(s=[e,n],r&&(Array.isArray(r)?s.push(...r):t(r)&&a?s.push(...r.split(a)):s.push(r)));let c=d(this.data,s);return!c&&!n&&!r&&e.includes(`.`)&&(e=s[0],n=s[1],r=s.slice(2).join(`.`)),c||!o||!t(r)?c:x(this.data?.[e]?.[n],r,a)}addResource(e,t,n,r,i={silent:!1}){let a=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,o=[e,t];n&&(o=o.concat(a?n.split(a):n)),e.includes(`.`)&&(o=e.split(`.`),r=t,t=o[1]),this.addNamespaces(t),l(this.data,o,r),i.silent||this.emit(`added`,e,t,n,r)}addResources(e,n,r,i={silent:!1}){for(let i in r)(t(r[i])||Array.isArray(r[i]))&&this.addResource(e,n,i,r[i],{silent:!0});i.silent||this.emit(`added`,e,n,r)}addResourceBundle(e,t,n,r,i,a={silent:!1,skipCopy:!1}){let o=[e,t];e.includes(`.`)&&(o=e.split(`.`),r=n,n=t,t=o[1]),this.addNamespaces(t);let s=d(this.data,o)||{};a.skipCopy||(n=JSON.parse(JSON.stringify(n))),r?p(s,n,i):s={...s,...n},l(this.data,o,s),a.silent||this.emit(`added`,e,t,n)}removeResourceBundle(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit(`removed`,e,t)}hasResourceBundle(e,t){return this.getResource(e,t)!==void 0}getResourceBundle(e,t){return t||=this.options.defaultNS,this.getResource(e,t)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){let t=this.getDataByLanguage(e);return!!(t&&Object.keys(t)||[]).find(e=>t[e]&&Object.keys(t[e]).length>0)}toJSON(){return this.data}},D={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,n,r,i){return e.forEach(e=>{t=this.processors[e]?.process(t,n,r,i)??t}),t}},O=Symbol(`i18next/PATH_KEY`);function k(){let e=[],t=Object.create(null),n;return t.get=(r,i)=>(n?.revoke?.(),i===O?e:(e.push(i),n=Proxy.revocable(r,t),n.proxy)),Proxy.revocable(Object.create(null),t).proxy}function A(e,t){let{[O]:n}=e(k()),r=t?.keySeparator??`.`,i=t?.nsSeparator??`:`;if(n.length>1&&i){let e=t?.ns,a=Array.isArray(e)?e:null;if(a&&a.length>1&&a.slice(1).includes(n[0]))return`${n[0]}${i}${n.slice(1).join(r)}`}return n.join(r)}var j=e=>!t(e)&&typeof e!=`boolean`&&typeof e!=`number`,M=class e extends T{constructor(e,t={}){super(),i([`resourceStore`,`languageUtils`,`pluralResolver`,`interpolator`,`backendConnector`,`i18nFormat`,`utils`],e,this),this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator=`.`),this.logger=w.create(`translator`),this.checkedLoadedFor={}}changeLanguage(e){e&&(this.language=e)}exists(e,t={interpolation:{}}){let n={...t};if(e==null)return!1;let r=this.resolve(e,n);if(r?.res===void 0)return!1;let i=j(r.res);return!(n.returnObjects===!1&&i)}extractFromKey(e,n){let r=n.nsSeparator===void 0?this.options.nsSeparator:n.nsSeparator;r===void 0&&(r=`:`);let i=n.keySeparator===void 0?this.options.keySeparator:n.keySeparator,a=n.ns||this.options.defaultNS||[],o=r&&e.includes(r),s=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!b(e,r,i);if(o&&!s){let n=e.match(this.interpolator.nestingRegexp);if(n&&n.length>0)return{key:e,namespaces:t(a)?[a]:a};let o=e.split(r);(r!==i||r===i&&this.options.ns.includes(o[0]))&&(a=o.shift()),e=o.join(i)}return{key:e,namespaces:t(a)?[a]:a}}translate(n,r,i){let a=typeof r==`object`?{...r}:r;if(typeof a!=`object`&&this.options.overloadTranslationOptionHandler&&(a=this.options.overloadTranslationOptionHandler(arguments)),typeof a==`object`&&(a={...a}),a||={},n==null)return``;typeof n==`function`&&(n=A(n,{...this.options,...a})),Array.isArray(n)||(n=[String(n)]),n=n.map(e=>typeof e==`function`?A(e,{...this.options,...a}):String(e));let o=a.returnDetails===void 0?this.options.returnDetails:a.returnDetails,s=a.keySeparator===void 0?this.options.keySeparator:a.keySeparator,{key:c,namespaces:l}=this.extractFromKey(n[n.length-1],a),u=l[l.length-1],d=a.nsSeparator===void 0?this.options.nsSeparator:a.nsSeparator;d===void 0&&(d=`:`);let f=a.lng||this.language,p=a.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(f?.toLowerCase()===`cimode`)return p?o?{res:`${u}${d}${c}`,usedKey:c,exactUsedKey:c,usedLng:f,usedNS:u,usedParams:this.getUsedParamsDetails(a)}:`${u}${d}${c}`:o?{res:c,usedKey:c,exactUsedKey:c,usedLng:f,usedNS:u,usedParams:this.getUsedParamsDetails(a)}:c;let m=this.resolve(n,a),h=m?.res,g=m?.usedKey||c,_=m?.exactUsedKey||c,v=[`[object Number]`,`[object Function]`,`[object RegExp]`],y=a.joinArrays===void 0?this.options.joinArrays:a.joinArrays,b=!this.i18nFormat||this.i18nFormat.handleAsObject,x=a.count!==void 0&&!t(a.count),S=e.hasDefaultValue(a),C=x?this.pluralResolver.getSuffix(f,a.count,a):``,w=a.ordinal&&x?this.pluralResolver.getSuffix(f,a.count,{ordinal:!1}):``,T=x&&!a.ordinal&&a.count===0,E=T&&a[`defaultValue${this.options.pluralSeparator}zero`]||a[`defaultValue${C}`]||a[`defaultValue${w}`]||a.defaultValue,D=h;b&&!h&&S&&(D=E);let O=j(D),k=Object.prototype.toString.apply(D);if(b&&D&&O&&!v.includes(k)&&!(t(y)&&Array.isArray(D))){if(!a.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn(`accessing an object - but returnObjects options is not enabled!`);let e=this.options.returnedObjectHandler?this.options.returnedObjectHandler(g,D,{...a,ns:l}):`key '${c} (${this.language})' returned an object instead of string.`;return o?(m.res=e,m.usedParams=this.getUsedParamsDetails(a),m):e}if(s){let e=Array.isArray(D),t=e?[]:{},n=e?_:g;for(let e in D)if(Object.prototype.hasOwnProperty.call(D,e)){let r=`${n}${s}${e}`;S&&!h?t[e]=this.translate(r,{...a,defaultValue:j(E)?E[e]:void 0,joinArrays:!1,ns:l}):t[e]=this.translate(r,{...a,joinArrays:!1,ns:l}),t[e]===r&&(t[e]=D[e])}h=t}}else if(b&&t(y)&&Array.isArray(h))h=h.join(y),h&&=this.extendTranslation(h,n,a,i);else{let e=!1,t=!1;!this.isValidLookup(h)&&S&&(e=!0,h=E),this.isValidLookup(h)||(t=!0,h=c);let r=(a.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&t?void 0:h,o=S&&E!==h&&this.options.updateMissing;if(t||e||o){if(this.logger.log(o?`updateKey`:`missingKey`,f,u,c,o?E:h),s){let e=this.resolve(c,{...a,keySeparator:!1});e&&e.res&&this.logger.warn(`Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.`)}let e=[],t=this.languageUtils.getFallbackCodes(this.options.fallbackLng,a.lng||this.language);if(this.options.saveMissingTo===`fallback`&&t&&t[0])for(let n=0;n<t.length;n++)e.push(t[n]);else this.options.saveMissingTo===`all`?e=this.languageUtils.toResolveHierarchy(a.lng||this.language):e.push(a.lng||this.language);let n=(e,t,n)=>{let i=S&&n!==h?n:r;this.options.missingKeyHandler?this.options.missingKeyHandler(e,u,t,i,o,a):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(e,u,t,i,o,a),this.emit(`missingKey`,e,u,t,h)};this.options.saveMissing&&(this.options.saveMissingPlurals&&x?e.forEach(e=>{let t=this.pluralResolver.getSuffixes(e,a);T&&a[`defaultValue${this.options.pluralSeparator}zero`]&&!t.includes(`${this.options.pluralSeparator}zero`)&&t.push(`${this.options.pluralSeparator}zero`),t.forEach(t=>{n([e],c+t,a[`defaultValue${t}`]||E)})}):n(e,c,E))}h=this.extendTranslation(h,n,a,m,i),t&&h===c&&this.options.appendNamespaceToMissingKey&&(h=`${u}${d}${c}`),(t||e)&&this.options.parseMissingKeyHandler&&(h=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${u}${d}${c}`:c,e?h:void 0,a))}return o?(m.res=h,m.usedParams=this.getUsedParamsDetails(a),m):h}extendTranslation(e,n,r,i,a){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...r},r.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!r.skipInterpolation){r.interpolation&&this.interpolator.init({...r,interpolation:{...this.options.interpolation,...r.interpolation}});let o=t(e)&&(r?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:r.interpolation.skipOnVariables),s;if(o){let t=e.match(this.interpolator.nestingRegexp);s=t&&t.length}let c=r.replace&&!t(r.replace)?r.replace:r;if(this.options.interpolation.defaultVariables&&(c={...this.options.interpolation.defaultVariables,...c}),e=this.interpolator.interpolate(e,c,r.lng||this.language||i.usedLng,r),o){let t=e.match(this.interpolator.nestingRegexp),n=t&&t.length;s<n&&(r.nest=!1)}!r.lng&&i&&i.res&&(r.lng=this.language||i.usedLng),r.nest!==!1&&(e=this.interpolator.nest(e,(...e)=>a?.[0]===e[0]&&!r.context?(this.logger.warn(`It seems you are nesting recursively key: ${e[0]} in key: ${n[0]}`),null):this.translate(...e,n),r)),r.interpolation&&this.interpolator.reset()}let o=r.postProcess||this.options.postProcess,s=t(o)?[o]:o;return e!=null&&s?.length&&r.applyPostProcessor!==!1&&(e=D.handle(s,e,n,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...i,usedParams:this.getUsedParamsDetails(r)},...r}:r,this)),e}resolve(e,n={}){let r,i,a,o,s;return t(e)&&(e=[e]),Array.isArray(e)&&(e=e.map(e=>typeof e==`function`?A(e,{...this.options,...n}):e)),e.forEach(e=>{if(this.isValidLookup(r))return;let c=this.extractFromKey(e,n),l=c.key;i=l;let u=c.namespaces;this.options.fallbackNS&&(u=u.concat(this.options.fallbackNS));let d=n.count!==void 0&&!t(n.count),f=d&&!n.ordinal&&n.count===0,p=n.context!==void 0&&(t(n.context)||typeof n.context==`number`)&&n.context!==``,m=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);u.forEach(e=>{this.isValidLookup(r)||(s=e,!this.checkedLoadedFor[`${m[0]}-${e}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(s)&&(this.checkedLoadedFor[`${m[0]}-${e}`]=!0,this.logger.warn(`key "${i}" for languages "${m.join(`, `)}" won't get resolved as namespace "${s}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`)),m.forEach(t=>{if(this.isValidLookup(r))return;o=t;let i=[l];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(i,l,t,e,n);else{let e;d&&(e=this.pluralResolver.getSuffix(t,n.count,n));let r=`${this.options.pluralSeparator}zero`,a=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(d&&(n.ordinal&&e.startsWith(a)&&i.push(l+e.replace(a,this.options.pluralSeparator)),i.push(l+e),f&&i.push(l+r)),p){let t=`${l}${this.options.contextSeparator||`_`}${n.context}`;i.push(t),d&&(n.ordinal&&e.startsWith(a)&&i.push(t+e.replace(a,this.options.pluralSeparator)),i.push(t+e),f&&i.push(t+r))}}let s;for(;s=i.pop();)this.isValidLookup(r)||(a=s,r=this.getResource(t,e,s,n))}))})}),{res:r,usedKey:i,exactUsedKey:a,usedLng:o,usedNS:s}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e===``)}getResource(e,t,n,r={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,t,n,r):this.resourceStore.getResource(e,t,n,r)}getUsedParamsDetails(e={}){let n=[`defaultValue`,`ordinal`,`context`,`replace`,`lng`,`lngs`,`fallbackLng`,`ns`,`keySeparator`,`nsSeparator`,`returnObjects`,`returnDetails`,`joinArrays`,`postProcess`,`interpolation`],r=e.replace&&!t(e.replace),i=r?e.replace:e;if(r&&e.count!==void 0&&(i.count=e.count),this.options.interpolation.defaultVariables&&(i={...this.options.interpolation.defaultVariables,...i}),!r){i={...i};for(let e of n)delete i[e]}return i}static hasDefaultValue(e){for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)&&t.startsWith(`defaultValue`)&&e[t]!==void 0)return!0;return!1}},N=class{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=w.create(`languageUtils`)}getScriptPartFromCode(e){if(e=S(e),!e||!e.includes(`-`))return null;let t=e.split(`-`);return t.length===2||(t.pop(),t[t.length-1].toLowerCase()===`x`)?null:this.formatLanguageCode(t.join(`-`))}getLanguagePartFromCode(e){if(e=S(e),!e||!e.includes(`-`))return e;let t=e.split(`-`);return this.formatLanguageCode(t[0])}formatLanguageCode(e){if(t(e)&&e.includes(`-`)){let t;try{t=Intl.getCanonicalLocales(e)[0]}catch{}return t&&this.options.lowerCaseLng&&(t=t.toLowerCase()),t||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load===`languageOnly`||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.includes(e)}getBestMatchFromCodes(e){if(!e)return null;let t;return e.forEach(e=>{if(t)return;let n=this.formatLanguageCode(e);(!this.options.supportedLngs||this.isSupportedCode(n))&&(t=n)}),!t&&this.options.supportedLngs&&e.forEach(e=>{if(t)return;let n=this.getScriptPartFromCode(e);if(this.isSupportedCode(n))return t=n;let r=this.getLanguagePartFromCode(e);if(this.isSupportedCode(r))return t=r;t=this.options.supportedLngs.find(e=>e===r?!0:!e.includes(`-`)&&!r.includes(`-`)?!1:!!(e.includes(`-`)&&!r.includes(`-`)&&e.slice(0,e.indexOf(`-`))===r||e.startsWith(r)&&r.length>1))}),t||=this.getFallbackCodes(this.options.fallbackLng)[0],t}getFallbackCodes(e,n){if(!e)return[];if(typeof e==`function`&&(e=e(n)),t(e)&&(e=[e]),Array.isArray(e))return e;if(!n)return e.default||[];let r=e[n];return r||=e[this.getScriptPartFromCode(n)],r||=e[this.formatLanguageCode(n)],r||=e[this.getLanguagePartFromCode(n)],r||=e.default,r||[]}toResolveHierarchy(e,n){let r=this.getFallbackCodes((n===!1?[]:n)||this.options.fallbackLng||[],e),i=[],a=e=>{e&&(this.isSupportedCode(e)?i.push(e):this.logger.warn(`rejecting language code not found in supportedLngs: ${e}`))};return t(e)&&(e.includes(`-`)||e.includes(`_`))?(this.options.load!==`languageOnly`&&a(this.formatLanguageCode(e)),this.options.load!==`languageOnly`&&this.options.load!==`currentOnly`&&a(this.getScriptPartFromCode(e)),this.options.load!==`currentOnly`&&a(this.getLanguagePartFromCode(e))):t(e)&&a(this.formatLanguageCode(e)),r.forEach(e=>{i.includes(e)||a(this.formatLanguageCode(e))}),i}},P={zero:0,one:1,two:2,few:3,many:4,other:5},F={select:e=>e===1?`one`:`other`,resolvedOptions:()=>({pluralCategories:[`one`,`other`]})},I=class{constructor(e,t={}){this.languageUtils=e,this.options=t,this.logger=w.create(`pluralResolver`),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(e,t={}){let n=S(e===`dev`?`en`:e),r=t.ordinal?`ordinal`:`cardinal`,i=JSON.stringify({cleanedCode:n,type:r});if(i in this.pluralRulesCache)return this.pluralRulesCache[i];let a;try{a=new Intl.PluralRules(n,{type:r})}catch{if(typeof Intl>`u`)return this.logger.error(`No Intl support, please use an Intl polyfill!`),F;if(!e.match(/-|_/))return F;let n=this.languageUtils.getLanguagePartFromCode(e);a=this.getRule(n,t)}return this.pluralRulesCache[i]=a,a}needsPlural(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,t,n={}){return this.getSuffixes(e,n).map(e=>`${t}${e}`)}getSuffixes(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?n.resolvedOptions().pluralCategories.sort((e,t)=>P[e]-P[t]).map(e=>`${this.options.prepend}${t.ordinal?`ordinal${this.options.prepend}`:``}${e}`):[]}getSuffix(e,t,n={}){let r=this.getRule(e,n);return r?`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:``}${r.select(t)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix(`dev`,t,n))}},L=(e,n,r,i=`.`,a=!0)=>{let o=f(e,n,r);return!o&&a&&t(r)&&(o=x(e,r,i),o===void 0&&(o=x(n,r,i))),o},R=e=>e.replace(/\$/g,`$$$$`),z=class{constructor(e={}){this.logger=w.create(`interpolator`),this.options=e,this.format=e?.interpolation?.format||(e=>e),this.init(e)}init(e={}){e.interpolation||={escapeValue:!0};let{escape:t,escapeValue:n,useRawValueToEscape:r,prefix:i,prefixEscaped:a,suffix:o,suffixEscaped:s,formatSeparator:c,unescapeSuffix:l,unescapePrefix:u,nestingPrefix:d,nestingPrefixEscaped:f,nestingSuffix:p,nestingSuffixEscaped:h,nestingOptionsSeparator:_,maxReplaces:v,alwaysFormat:y}=e.interpolation;this.escape=t===void 0?g:t,this.escapeValue=n===void 0?!0:n,this.useRawValueToEscape=r===void 0?!1:r,this.prefix=i?m(i):a||`{{`,this.suffix=o?m(o):s||`}}`,this.formatSeparator=c||`,`,this.unescapePrefix=l?``:u||`-`,this.unescapeSuffix=this.unescapePrefix?``:l||``,this.nestingPrefix=d?m(d):f||m(`$t(`),this.nestingSuffix=p?m(p):h||m(`)`),this.nestingOptionsSeparator=_||`,`,this.maxReplaces=v||1e3,this.alwaysFormat=y===void 0?!1:y,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){let e=(e,t)=>e?.source===t?(e.lastIndex=0,e):new RegExp(t,`g`);this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,n,i,a){let o,s,c,l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},u=e=>{if(!e.includes(this.formatSeparator)){let t=L(n,l,e,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(t,void 0,i,{...a,...n,interpolationkey:e}):t}let t=e.split(this.formatSeparator),r=t.shift().trim(),o=t.join(this.formatSeparator).trim();return this.format(L(n,l,r,this.options.keySeparator,this.options.ignoreJSONStructure),o,i,{...a,...n,interpolationkey:r})};this.resetRegExp();let d=a?.missingInterpolationHandler||this.options.missingInterpolationHandler,f=a?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:a.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:e=>R(e)},{regex:this.regexp,safeValue:e=>this.escapeValue?R(this.escape(e)):R(e)}].forEach(n=>{for(c=0;o=n.regex.exec(e);){let i=o[1].trim();if(s=u(i),s===void 0)if(typeof d==`function`){let n=d(e,o,a);s=t(n)?n:``}else if(a&&Object.prototype.hasOwnProperty.call(a,i))s=``;else if(f){s=o[0];continue}else this.logger.warn(`missed to pass in variable ${i} for interpolating ${e}`),s=``;else !t(s)&&!this.useRawValueToEscape&&(s=r(s));let l=n.safeValue(s);if(e=e.replace(o[0],l),f?(n.regex.lastIndex+=s.length,n.regex.lastIndex-=o[0].length):n.regex.lastIndex=0,c++,c>=this.maxReplaces)break}}),e}nest(e,n,i={}){let a,o,s,c=(e,t)=>{let n=this.nestingOptionsSeparator;if(!e.includes(n))return e;let r=e.split(RegExp(`${m(n)}[ ]*{`)),i=`{${r[1]}`;e=r[0],i=this.interpolate(i,s);let a=i.match(/'/g),o=i.match(/"/g);((a?.length??0)%2==0&&!o||(o?.length??0)%2!=0)&&(i=i.replace(/'/g,`"`));try{s=JSON.parse(i),t&&(s={...t,...s})}catch(t){return this.logger.warn(`failed parsing options string in nesting for key ${e}`,t),`${e}${n}${i}`}return s.defaultValue&&s.defaultValue.includes(this.prefix)&&delete s.defaultValue,e};for(;a=this.nestingRegexp.exec(e);){let l=[];s={...i},s=s.replace&&!t(s.replace)?s.replace:s,s.applyPostProcessor=!1,delete s.defaultValue;let u=/{.*}/.test(a[1])?a[1].lastIndexOf(`}`)+1:a[1].indexOf(this.formatSeparator);if(u!==-1&&(l=a[1].slice(u).split(this.formatSeparator).map(e=>e.trim()).filter(Boolean),a[1]=a[1].slice(0,u)),o=n(c.call(this,a[1].trim(),s),s),o&&a[0]===e&&!t(o))return o;t(o)||(o=r(o)),o||=(this.logger.warn(`missed to resolve ${a[1]} for nesting ${e}`),``),l.length&&(o=l.reduce((e,t)=>this.format(e,t,i.lng,{...i,interpolationkey:a[1].trim()}),o.trim())),e=e.replace(a[0],o),this.regexp.lastIndex=0}return e}},B=e=>{let t=e.toLowerCase().trim(),n={};if(e.includes(`(`)){let r=e.split(`(`);t=r[0].toLowerCase().trim();let i=r[1].slice(0,-1);t===`currency`&&!i.includes(`:`)?n.currency||=i.trim():t===`relativetime`&&!i.includes(`:`)?n.range||=i.trim():i.split(`;`).forEach(e=>{if(e){let[t,...r]=e.split(`:`),i=r.join(`:`).trim().replace(/^'+|'+$/g,``),a=t.trim();n[a]||(n[a]=i),i===`false`&&(n[a]=!1),i===`true`&&(n[a]=!0),isNaN(i)||(n[a]=parseInt(i,10))}})}return{formatName:t,formatOptions:n}},V=e=>{let t={};return(n,r,i)=>{let a=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(a={...a,[i.interpolationkey]:void 0});let o=r+JSON.stringify(a),s=t[o];return s||(s=e(S(r),i),t[o]=s),s(n)}},H=e=>(t,n,r)=>e(S(n),r)(t),U=class{constructor(e={}){this.logger=w.create(`formatter`),this.options=e,this.init(e)}init(e,t={interpolation:{}}){this.formatSeparator=t.interpolation.formatSeparator||`,`;let n=t.cacheInBuiltFormats?V:H;this.formats={number:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t});return e=>n.format(e)}),currency:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t,style:`currency`});return e=>n.format(e)}),datetime:n((e,t)=>{let n=new Intl.DateTimeFormat(e,{...t});return e=>n.format(e)}),relativetime:n((e,t)=>{let n=new Intl.RelativeTimeFormat(e,{...t});return e=>n.format(e,t.range||`day`)}),list:n((e,t)=>{let n=new Intl.ListFormat(e,{...t});return e=>n.format(e)})}}add(e,t){this.formats[e.toLowerCase().trim()]=t}addCached(e,t){this.formats[e.toLowerCase().trim()]=V(t)}format(e,t,n,r={}){if(!t||e==null)return e;let i=t.split(this.formatSeparator);if(i.length>1&&i[0].indexOf(`(`)>1&&!i[0].includes(`)`)&&i.find(e=>e.includes(`)`))){let e=i.findIndex(e=>e.includes(`)`));i[0]=[i[0],...i.splice(1,e)].join(this.formatSeparator)}return i.reduce((e,t)=>{let{formatName:i,formatOptions:a}=B(t);if(this.formats[i]){let t=e;try{let o=r?.formatParams?.[r.interpolationkey]||{},s=o.locale||o.lng||r.locale||r.lng||n;t=this.formats[i](e,s,{...a,...r,...o})}catch(e){this.logger.warn(e)}return t}else this.logger.warn(`there was no format function for ${i}`);return e},e)}},W=(e,t)=>{e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)},G=class extends T{constructor(e,t,n,r={}){super(),this.backend=e,this.store=t,this.services=n,this.languageUtils=n.languageUtils,this.options=r,this.logger=w.create(`backendConnector`),this.waitingReads=[],this.maxParallelReads=r.maxParallelReads||10,this.readingCalls=0,this.maxRetries=r.maxRetries>=0?r.maxRetries:5,this.retryTimeout=r.retryTimeout>=1?r.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(n,r.backend,r)}queueLoad(e,t,n,r){let i={},a={},o={},s={};return e.forEach(e=>{let r=!0;t.forEach(t=>{let o=`${e}|${t}`;!n.reload&&this.store.hasResourceBundle(e,t)?this.state[o]=2:this.state[o]<0||(this.state[o]===1?a[o]===void 0&&(a[o]=!0):(this.state[o]=1,r=!1,a[o]===void 0&&(a[o]=!0),i[o]===void 0&&(i[o]=!0),s[t]===void 0&&(s[t]=!0)))}),r||(o[e]=!0)}),(Object.keys(i).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:r}),{toLoad:Object.keys(i),pending:Object.keys(a),toLoadLanguages:Object.keys(o),toLoadNamespaces:Object.keys(s)}}loaded(e,t,n){let r=e.split(`|`),i=r[0],a=r[1];t&&this.emit(`failedLoading`,i,a,t),!t&&n&&this.store.addResourceBundle(i,a,n,void 0,void 0,{skipCopy:!0}),this.state[e]=t?-1:2,t&&n&&(this.state[e]=0);let o={};this.queue.forEach(n=>{u(n.loaded,[i],a),W(n,e),t&&n.errors.push(t),n.pendingCount===0&&!n.done&&(Object.keys(n.loaded).forEach(e=>{o[e]||(o[e]={});let t=n.loaded[e];t.length&&t.forEach(t=>{o[e][t]===void 0&&(o[e][t]=!0)})}),n.done=!0,n.errors.length?n.callback(n.errors):n.callback())}),this.emit(`loaded`,o),this.queue=this.queue.filter(e=>!e.done)}read(e,t,n,r=0,i=this.retryTimeout,a){if(!e.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:t,fcName:n,tried:r,wait:i,callback:a});return}this.readingCalls++;let o=(o,s)=>{if(this.readingCalls--,this.waitingReads.length>0){let e=this.waitingReads.shift();this.read(e.lng,e.ns,e.fcName,e.tried,e.wait,e.callback)}if(o&&s&&r<this.maxRetries){setTimeout(()=>{this.read(e,t,n,r+1,i*2,a)},i);return}a(o,s)},s=this.backend[n].bind(this.backend);if(s.length===2){try{let n=s(e,t);n&&typeof n.then==`function`?n.then(e=>o(null,e)).catch(o):o(null,n)}catch(e){o(e)}return}return s(e,t,o)}prepareLoading(e,n,r={},i){if(!this.backend)return this.logger.warn(`No backend was added via i18next.use. Will not load resources.`),i&&i();t(e)&&(e=this.languageUtils.toResolveHierarchy(e)),t(n)&&(n=[n]);let a=this.queueLoad(e,n,r,i);if(!a.toLoad.length)return a.pending.length||i(),null;a.toLoad.forEach(e=>{this.loadOne(e)})}load(e,t,n){this.prepareLoading(e,t,{},n)}reload(e,t,n){this.prepareLoading(e,t,{reload:!0},n)}loadOne(e,t=``){let n=e.split(`|`),r=n[0],i=n[1];this.read(r,i,`read`,void 0,void 0,(n,a)=>{n&&this.logger.warn(`${t}loading namespace ${i} for language ${r} failed`,n),!n&&a&&this.logger.log(`${t}loaded namespace ${i} for language ${r}`,a),this.loaded(e,n,a)})}saveMissing(e,t,n,r,i,a={},o=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(t)){this.logger.warn(`did not save key "${n}" as the namespace "${t}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`);return}if(!(n==null||n===``)){if(this.backend?.create){let s={...a,isUpdate:i},c=this.backend.create.bind(this.backend);if(c.length<6)try{let i;i=c.length===5?c(e,t,n,r,s):c(e,t,n,r),i&&typeof i.then==`function`?i.then(e=>o(null,e)).catch(o):o(null,i)}catch(e){o(e)}else c(e,t,n,r,o,s)}!e||!e[0]||this.store.addResource(e[0],t,n,r)}}},K=()=>({debug:!1,initAsync:!0,ns:[`translation`],defaultNS:[`translation`],fallbackLng:[`dev`],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:`all`,preload:!1,keySeparator:`.`,nsSeparator:`:`,pluralSeparator:`_`,contextSeparator:`_`,partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:`fallback`,saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:e=>{let n={};if(typeof e[1]==`object`&&(n=e[1]),t(e[1])&&(n.defaultValue=e[1]),t(e[2])&&(n.tDescription=e[2]),typeof e[2]==`object`||typeof e[3]==`object`){let t=e[3]||e[2];Object.keys(t).forEach(e=>{n[e]=t[e]})}return n},interpolation:{escapeValue:!0,prefix:`{{`,suffix:`}}`,formatSeparator:`,`,unescapePrefix:`-`,nestingPrefix:`$t(`,nestingSuffix:`)`,nestingOptionsSeparator:`,`,maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),q=e=>(t(e.ns)&&(e.ns=[e.ns]),t(e.fallbackLng)&&(e.fallbackLng=[e.fallbackLng]),t(e.fallbackNS)&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&!e.supportedLngs.includes(`cimode`)&&(e.supportedLngs=e.supportedLngs.concat([`cimode`])),e),J=()=>{},Y=e=>{Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(t=>{typeof e[t]==`function`&&(e[t]=e[t].bind(e))})},X=class e extends T{constructor(e={},t){if(super(),this.options=q(e),this.services={},this.logger=w,this.modules={external:[]},Y(this),t&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,t),this;setTimeout(()=>{this.init(e,t)},0)}}init(e={},r){this.isInitializing=!0,typeof e==`function`&&(r=e,e={}),e.defaultNS==null&&e.ns&&(t(e.ns)?e.defaultNS=e.ns:e.ns.includes(`translation`)||(e.defaultNS=e.ns[0]));let i=K();this.options={...i,...this.options,...q(e)},this.options.interpolation={...i.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator),typeof this.options.overloadTranslationOptionHandler!=`function`&&(this.options.overloadTranslationOptionHandler=i.overloadTranslationOptionHandler);let a=e=>e?typeof e==`function`?new e:e:null;if(!this.options.isClone){this.modules.logger?w.init(a(this.modules.logger),this.options):w.init(null,this.options);let e;e=this.modules.formatter?this.modules.formatter:U;let t=new N(this.options);this.store=new E(this.options.resources,this.options);let n=this.services;n.logger=w,n.resourceStore=this.store,n.languageUtils=t,n.pluralResolver=new I(t,{prepend:this.options.pluralSeparator}),e&&(n.formatter=a(e),n.formatter.init&&n.formatter.init(n,this.options),this.options.interpolation.format=n.formatter.format.bind(n.formatter)),n.interpolator=new z(this.options),n.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},n.backendConnector=new G(a(this.modules.backend),n.resourceStore,n,this.options),n.backendConnector.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.languageDetector&&(n.languageDetector=a(this.modules.languageDetector),n.languageDetector.init&&n.languageDetector.init(n,this.options.detection,this.options)),this.modules.i18nFormat&&(n.i18nFormat=a(this.modules.i18nFormat),n.i18nFormat.init&&n.i18nFormat.init(this)),this.translator=new M(this.services,this.options),this.translator.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.external.forEach(e=>{e.init&&e.init(this)})}if(this.format=this.options.interpolation.format,r||=J,this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){let e=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);e.length>0&&e[0]!==`dev`&&(this.options.lng=e[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn(`init: no languageDetector is used and no lng is defined`),[`getResource`,`hasResourceBundle`,`getResourceBundle`,`getDataByLanguage`].forEach(e=>{this[e]=(...t)=>this.store[e](...t)}),[`addResource`,`addResources`,`addResourceBundle`,`removeResourceBundle`].forEach(e=>{this[e]=(...t)=>(this.store[e](...t),this)});let o=n(),s=()=>{let e=(e,t)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn(`init: i18next is already initialized. You should call init just once!`),this.isInitialized=!0,this.options.isClone||this.logger.log(`initialized`,this.options),this.emit(`initialized`,this.options),o.resolve(t),r(e,t)};if(this.languages&&!this.isInitialized)return e(null,this.t.bind(this));this.changeLanguage(this.options.lng,e)};return this.options.resources||!this.options.initAsync?s():setTimeout(s,0),o}loadResources(e,n=J){let r=n,i=t(e)?e:this.language;if(typeof e==`function`&&(r=e),!this.options.resources||this.options.partialBundledLanguages){if(i?.toLowerCase()===`cimode`&&(!this.options.preload||this.options.preload.length===0))return r();let e=[],t=t=>{t&&t!==`cimode`&&this.services.languageUtils.toResolveHierarchy(t).forEach(t=>{t!==`cimode`&&(e.includes(t)||e.push(t))})};i?t(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(e=>t(e)),this.options.preload?.forEach?.(e=>t(e)),this.services.backendConnector.load(e,this.options.ns,e=>{!e&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),r(e)})}else r(null)}reloadResources(e,t,r){let i=n();return typeof e==`function`&&(r=e,e=void 0),typeof t==`function`&&(r=t,t=void 0),e||=this.languages,t||=this.options.ns,r||=J,this.services.backendConnector.reload(e,t,e=>{i.resolve(),r(e)}),i}use(e){if(!e)throw Error(`You are passing an undefined module! Please check the object you are passing to i18next.use()`);if(!e.type)throw Error(`You are passing a wrong module! Please check the object you are passing to i18next.use()`);return e.type===`backend`&&(this.modules.backend=e),(e.type===`logger`||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type===`languageDetector`&&(this.modules.languageDetector=e),e.type===`i18nFormat`&&(this.modules.i18nFormat=e),e.type===`postProcessor`&&D.addPostProcessor(e),e.type===`formatter`&&(this.modules.formatter=e),e.type===`3rdParty`&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&![`cimode`,`dev`].includes(e)){for(let e=0;e<this.languages.length;e++){let t=this.languages[e];if(![`cimode`,`dev`].includes(t)&&this.store.hasLanguageSomeTranslations(t)){this.resolvedLanguage=t;break}}!this.resolvedLanguage&&!this.languages.includes(e)&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,r){this.isLanguageChangingTo=e;let i=n();this.emit(`languageChanging`,e);let a=e=>{this.language=e,this.languages=this.services.languageUtils.toResolveHierarchy(e),this.resolvedLanguage=void 0,this.setResolvedLanguage(e)},o=(t,n)=>{n?this.isLanguageChangingTo===e&&(a(n),this.translator.changeLanguage(n),this.isLanguageChangingTo=void 0,this.emit(`languageChanged`,n),this.logger.log(`languageChanged`,n)):this.isLanguageChangingTo=void 0,i.resolve((...e)=>this.t(...e)),r&&r(t,(...e)=>this.t(...e))},s=n=>{!e&&!n&&this.services.languageDetector&&(n=[]);let r=t(n)?n:n&&n[0],i=this.store.hasLanguageSomeTranslations(r)?r:this.services.languageUtils.getBestMatchFromCodes(t(n)?[n]:n);i&&(this.language||a(i),this.translator.language||this.translator.changeLanguage(i),this.services.languageDetector?.cacheUserLanguage?.(i)),this.loadResources(i,e=>{o(e,i)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?s(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(s):this.services.languageDetector.detect(s):s(e),i}getFixedT(e,n,r){let i=(e,t,...n)=>{let a;a=typeof t==`object`?{...t}:this.options.overloadTranslationOptionHandler([e,t].concat(n)),a.lng=a.lng||i.lng,a.lngs=a.lngs||i.lngs,a.ns=a.ns||i.ns,a.keyPrefix!==``&&(a.keyPrefix=a.keyPrefix||r||i.keyPrefix);let o={...this.options,...a};typeof a.keyPrefix==`function`&&(a.keyPrefix=A(a.keyPrefix,o));let s=this.options.keySeparator||`.`,c;return a.keyPrefix&&Array.isArray(e)?c=e.map(e=>(typeof e==`function`&&(e=A(e,o)),`${a.keyPrefix}${s}${e}`)):(typeof e==`function`&&(e=A(e,o)),c=a.keyPrefix?`${a.keyPrefix}${s}${e}`:e),this.t(c,a)};return t(e)?i.lng=e:i.lngs=e,i.ns=n,i.keyPrefix=r,i}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,t={}){if(!this.isInitialized)return this.logger.warn(`hasLoadedNamespace: i18next was not initialized`,this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn(`hasLoadedNamespace: i18n.languages were undefined or empty`,this.languages),!1;let n=t.lng||this.resolvedLanguage||this.languages[0],r=this.options?this.options.fallbackLng:!1,i=this.languages[this.languages.length-1];if(n.toLowerCase()===`cimode`)return!0;let a=(e,t)=>{let n=this.services.backendConnector.state[`${e}|${t}`];return n===-1||n===0||n===2};if(t.precheck){let e=t.precheck(this,a);if(e!==void 0)return e}return!!(this.hasResourceBundle(n,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(n,e)&&(!r||a(i,e)))}loadNamespaces(e,r){let i=n();return this.options.ns?(t(e)&&(e=[e]),e.forEach(e=>{this.options.ns.includes(e)||this.options.ns.push(e)}),this.loadResources(e=>{i.resolve(),r&&r(e)}),i):(r&&r(),Promise.resolve())}loadLanguages(e,r){let i=n();t(e)&&(e=[e]);let a=this.options.preload||[],o=e.filter(e=>!a.includes(e)&&this.services.languageUtils.isSupportedCode(e));return o.length?(this.options.preload=a.concat(o),this.loadResources(e=>{i.resolve(),r&&r(e)}),i):(r&&r(),Promise.resolve())}dir(e){if(e||=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language),!e)return`rtl`;try{let t=new Intl.Locale(e);if(t&&t.getTextInfo){let e=t.getTextInfo();if(e&&e.direction)return e.direction}}catch{}let t=`ar.shu.sqr.ssh.xaa.yhd.yud.aao.abh.abv.acm.acq.acw.acx.acy.adf.ads.aeb.aec.afb.ajp.apc.apd.arb.arq.ars.ary.arz.auz.avl.ayh.ayl.ayn.ayp.bbz.pga.he.iw.ps.pbt.pbu.pst.prp.prd.ug.ur.ydd.yds.yih.ji.yi.hbo.men.xmn.fa.jpr.peo.pes.prs.dv.sam.ckb`.split(`.`),n=this.services?.languageUtils||new N(K());return e.toLowerCase().indexOf(`-latn`)>1?`ltr`:t.includes(n.getLanguagePartFromCode(e))||e.toLowerCase().indexOf(`-arab`)>1?`rtl`:`ltr`}static createInstance(t={},n){let r=new e(t,n);return r.createInstance=e.createInstance,r}cloneInstance(t={},n=J){let r=t.forkResourceStore;r&&delete t.forkResourceStore;let i={...this.options,...t,isClone:!0},a=new e(i);if((t.debug!==void 0||t.prefix!==void 0)&&(a.logger=a.logger.clone(t)),[`store`,`services`,`language`].forEach(e=>{a[e]=this[e]}),a.services={...this.services},a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},r&&(a.store=new E(Object.keys(this.store.data).reduce((e,t)=>(e[t]={...this.store.data[t]},e[t]=Object.keys(e[t]).reduce((n,r)=>(n[r]={...e[t][r]},n),e[t]),e),{}),i),a.services.resourceStore=a.store),t.interpolation){let e={...K().interpolation,...this.options.interpolation,...t.interpolation},n={...i,interpolation:e};a.services.interpolator=new z(n)}return a.translator=new M(a.services,i),a.translator.on(`*`,(e,...t)=>{a.emit(e,...t)}),a.init(i,n),a.translator.options=i,a.translator.backendConnector.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}.createInstance();X.createInstance,X.dir,X.init,X.loadResources,X.reloadResources,X.use,X.changeLanguage,X.getFixedT,X.t,X.exists,X.setDefaultNamespace,X.hasLoadedNamespace,X.loadNamespaces,X.loadLanguages;var Z={app:{name:`TTDash`,language:`Sprache`,languages:{de:`Deutsch`,en:`Englisch`}},header:{import:`Import`,upload:`Upload`,limits:`Limits`,settings:`Einstellungen`,report:`Report`,csv:`CSV`,delete:`Löschen`,help:`Hilfe & Tastenkürzel`,loaded:`Geladen`,loadedAt:`Zuletzt geladen: {{time}}`,autoLoadActive:`Auto-Load beim Start`,autoLoadAt:`Beim Start automatisch geladen: {{time}}`,versionLinkTitle:`TTDash v{{version}} auf npm öffnen`,streak:`{{count}} Tage in Folge`},emptyState:{description:"Lade ein `toktrack`- oder Legacy-JSON hoch oder starte den lokalen Auto-Import mit lokalem `toktrack`, `bunx toktrack daily --json` oder `npx --yes toktrack daily --json`.",autoImport:`Auto-Import`,uploadFile:`Datei hochladen`,openSettings:`Einstellungen & Backups`,or:`oder`},loadError:{title:`Lokaler App-Zustand konnte nicht geladen werden`,settingsDescription:`Die lokalen Einstellungen konnten nicht geladen werden. Setze sie zurück oder lade den Zustand erneut.`,usageDescription:`Die gespeicherten Nutzungsdaten konnten nicht geladen werden. Entferne die defekten Daten oder lade den Zustand erneut.`,multipleDescription:`TTDash hat Probleme sowohl in den lokalen Einstellungen als auch in den gespeicherten Nutzungsdaten gefunden. Setze die betroffenen Daten zurück und lade den Zustand erneut.`,details:`Details`,retry:`Erneut laden`,resetSettings:`Einstellungen zurücksetzen`,deleteData:`Gespeicherte Daten löschen`,settingsCorrupted:`Die lokale Einstellungsdatei ist unlesbar oder beschädigt.`,usageCorrupted:`Die lokale Nutzungsdatei ist unlesbar oder beschädigt.`},viewModes:{daily:`Tagesansicht`,monthly:`Monatsansicht`,yearly:`Jahresansicht`},periods:{day:`Tag`,days:`Tage`,month:`Monat`,months:`Monate`,year:`Jahr`,years:`Jahre`,unitDay:`Tag`,unitMonth:`Mt.`,unitYear:`Jahr`},common:{all:`Alle`,none:`Keine`,reset:`Reset`,notAvailable:`n/v`,noData:`Keine Daten`,generated:`Generiert`,view:`Ansicht`,dateRange:`Zeitraum`,month:`Monat`,provider:`Anbieter`,providers:`Anbieter`,model:`Modell`,models:`Modelle`,cost:`Kosten`,costs:`Kosten`,tokens:`Tokens`,requests:`Anfragen`,today:`Heute`,currentMonth:`Monat`,yes:`Ja`,no:`Nein`,enabled:`Aktiv`,disabled:`Inaktiv`,visible:`Sichtbar`,hidden:`Versteckt`,open:`Öffnen`,close:`Schliessen`,previousMonth:`Vorheriger Monat`,nextMonth:`Nächster Monat`,startDate:`Startdatum`,endDate:`Enddatum`,selectedProviders:`Ausgewählte Anbieter`,selectedModels:`Ausgewählte Modelle`,allProviders:`Alle Anbieter`,allModels:`Alle Modelle`,allMonths:`Alle Monate`,noFilter:`Kein Filter`,focusMonth:`Fokusmonat`,showInfo:`Info anzeigen`,expand:`Vergrössern`,expandWithTitle:`{{title}} vergrössern`,expandedCardDescription:`Erweiterte Kartenansicht mit zusätzlichen Kennzahlen und vollständigem Inhalt.`,input:`Input`,output:`Output`,cacheWrite:`Cache Write`,cacheRead:`Cache Read`,thinking:`Thinking`,requestsShort:`Anf.`,request:`Anfrage`,share:`Anteil`,top:`Top`},filterBar:{status:`Filterstatus`,viewModeLabel:`Ansichtsmodus`,focusMonthLabel:`Fokusmonat`,providersActive:`{{count}} Anbieter aktiv`,modelsActive:`{{count}} Modelle aktiv`,dateFilterActive:`Datumsfilter aktiv`,clearDate:`{{label}} zurücksetzen`,presets:{"7d":`7T`,"30d":`30T`,month:`Monat`,year:`Jahr`,all:`Alle`},until:`bis`,resetDateRange:`Zeitraum zurücksetzen`,resetAll:`Alles zurücksetzen`,providers:`Anbieter`,models:`Modelle`,resetModels:`Modelle zurücksetzen`},dashboard:{insights:{title:`Einblicke`,badge:`Verdichtete Signale`,description:`Konzentrierte Aussagen aus Kosten-, Modell- und Anfragedaten`,quickRead:`Kurzfazit`},metrics:{title:`Metriken`,badge:`10 Kennzahlen`,description:`Wichtigste KPIs im Überblick`},activity:{title:`Aktivität`,dailyDescription:`Tägliche Nutzungsübersicht`,monthlyDescription:`Monatliche Nutzungsübersicht`,yearlyDescription:`Jährliche Nutzungsübersicht`},forecastCache:{title:`Prognose & Cache`,description:`Kostenprognose und Cache-Effizienz`},costAnalysis:{title:`Kostenanalyse`,description:`Detaillierte Kostenaufschlüsselung`},tokenAnalysis:{title:`Token-Analyse`,description:`Verbrauch nach Token-Typ`},requestAnalysis:{title:`Anfragen-Analyse`,description:`Anfragen gesamt, pro Modell und im Verlauf`},advancedAnalysis:{title:`Verteilungen & Risiko`,description:`Zusätzliche Signale zu Streuung, Korrelation und Abhängigkeiten`},comparisons:{title:`Vergleiche & Anomalien`,description:`Periodenvergleich und Ausreisser`},tables:{title:`Tabellen`,description:`Detaillierte Aufschlüsselungen`},lazySectionError:{title:`Sektion nicht verfügbar`,description:`Diese Dashboard-Sektion konnte gerade nicht geladen werden.`},cards:{periodComparison:`Periodenvergleich`,anomalyDetection:`Anomalie-Erkennung`,costForecast:`Kostenprognose`,cacheRoi:`Cache ROI`},stats:{min:`Min`,max:`Max`,avg:`Ø`,cacheHitRate:`Cache-Hit-Rate`,totalTokens:`Gesamt-Tokens`,cacheRead:`Cache Read`,dataPoints:`Datenpunkte`,avgCostPerUnit:`Ø Kosten/{{unit}}`,total:`Gesamt`,avgPerUnit:`Ø / {{unit}}`}},metricCards:{primary:{totalCost:`Gesamtkosten`,totalTokens:`Gesamt-Tokens`,activeDays:`Aktive Tage`,topModel:`Top Modell`,cacheHitRate:`Cache-Hit-Rate`,costPerMillion:`$/1M Tokens`,requests:`Anfragen`,thinking:`Thinking`,avgPerPeriod:`{{value}}/{{unit}} im Mittel`,tokensPerRequestAvg:`{{value}} pro Anfrage im Mittel`,coverageOfDays:`{{coverage}} Abdeckung von {{days}} Tagen`,providersActive:`{{count}} Anbieter aktiv`,share:`{{value}} Anteil`,requestLead:`Führend bei Anfragen: {{value}}`,allTokensViaCacheRead:`{{value}} aller Tokens via Cache Read`,requestCountersMissing:`Keine Anfragezähler im Datensatz`,thinkingShareOfVolume:`{{value}} des gesamten Tokenvolumens`,totalCostSubtitle:`Ø {{average}}/{{unit}} · {{costPerRequest}} pro Anfrage`,totalTokensSubtitle:`{{tokensPerRequest}} pro Anfrage`,totalTokensSubtitleWithRatio:`Input/Output-Verhältnis {{ratio}}:1 · {{tokensPerRequest}} pro Anfrage`,requestsSubtitle:`Ø {{requests}} / {{unit}} · {{cost}} pro Anfrage · σ {{volatility}}`,thinkingSubtitle:`{{share}} Anteil · {{tokens}} pro Anfrage`},secondary:{mostExpensiveDay:`Teuerster Tag`,mostExpensiveMonth:`Teuerster Monat`,mostExpensiveYear:`Teuerstes Jahr`,dominantProvider:`Dominanter Anbieter`,peak7Days:`Peak 7 Tage`,avgCostPerUnit:`Ø Kosten/{{unit}}`,spread:`Spanne: {{value}}`,medianPerUnit:`Median/{{unit}}`,vsAverage:`{{direction}}{{value}}% vs. Ø`,vsAverageWithVolatility:`{{direction}}{{value}}% vs. Ø · σ Anf. {{volatility}}`,medianInfo:`Der Median zeigt den typischen Wert und ist weniger anfällig für Ausreisser als der Durchschnitt.`,requestLeader:`{{model}} · {{requests}} Anfragen`,dominantProviderSubtitle:`{{share}} Anteil · {{cost}}{{requestLeader}}`},today:{title:`Heute — {{date}}`,description:`KPIs des aktuellen Tages`,costToday:`Kosten heute`,tokensToday:`Tokens heute`,models:`Modelle`,costPerMillion:`$/1M Tokens`,cacheHitRate:`Cache-Hit-Rate`,requests:`Anfragen`,thinking:`Thinking`,vsAverageShort:`vs. Ø`,overallAverage:`Gesamt-Ø: {{value}}`,cacheShare:`{{value}} Cache-Anteil`,requestsToday:`Anfragen heute`,avgPerDay:`Ø {{value}}/Tag`,ioRatio:`Input/Output-Verhältnis: {{value}}:1`,topModel:`Top: {{value}}`,requestsSubtitle:`{{value}} / Modell · {{cost}} pro Anfrage`,tokensInsight:`{{value}} pro Anfrage`,requestsInsight:`{{value}} pro Anfrage`,requestCountersMissing:`Keine Anfragezähler`,thinkingSubtitle:`{{value}} Anteil`},month:{title:`Monat — {{date}}`,badge:`{{count}} Tage`,description:`KPIs des laufenden Monats`,costMonth:`Kosten Monat`,tokensMonth:`Tokens Monat`,activeDays:`Aktive Tage`,models:`Modelle`,costPerMillion:`$/1M Tokens`,cacheHitRate:`Cache-Hit-Rate`,requests:`Anfragen`,thinking:`Thinking`,vsPreviousMonth:`vs. Vormonat`,coverage:`{{value}} Abdeckung`,requestsInMonth:`Anfragen im Monat`,avgPerDay:`Ø {{value}}/Tag`,ioRatio:`Input/Output-Verhältnis: {{value}}:1`,topModel:`Top: {{value}}`,cacheMix:`In: {{input}} / Out: {{output}}`,costPerRequest:`{{value}} pro Anfrage`,requestsSubtitle:`Ø {{value}}/Tag · {{cost}} pro Anfrage`,requestCountersMissing:`Keine Anfragezähler`,thinkingSubtitle:`{{value}} Anteil`}},insights:{concentration:{title:`Kostenkonzentration`,summary:`{{provider}} ist aktuell der dominante Anbieter im gewählten Ausschnitt, während {{model}} den grössten Einzelhebel setzt.`,fallback:`Noch keine stabile Anbieter-Verteilung verfügbar.`,topProvider:`Top Anbieter`,topModel:`Top Modell`,topModelShare:`Top Modell Anteil`,topThreeModels:`Top 3 Modelle`},requestEconomy:{title:`Anfrage-Ökonomie`,valueLabel:`Ø Kosten pro Anfrage`,summary:`Jede Anfrage kostet im Mittel {{cost}} und verarbeitet {{tokens}}. {{leader}}`,leader:`{{model}} führt aktuell beim Anfragevolumen.`,fallback:`Der geladene Datensatz enthält keine verlässlichen Anfragezähler. Anfrage-Ökonomie ist deshalb nicht verfügbar.`,avgRequests:`Ø Anfragen/{{unit}}`,avgTokensPerRequest:`Ø Tokens / Anfrage`,costPerMillion:`$/1M Tokens`,totalRequests:`Gesamt-Anfragen`},usagePatterns:{title:`Nutzungsmuster`,summaryWithCoverage:`{{activeDays}} von {{totalDays}} Kalendertagen enthalten Aktivität im gefilterten Zeitraum. Die Anfragen schwanken dabei um {{volatility}}.`,summaryWithoutCoverage:`{{activeDays}} aktive {{unit}} im gewählten Ausschnitt.`,avgModels:`Ø Modelle/Eintrag`,providersActive:`Anbieter aktiv`,weekendShare:`Wochenend-Anteil`,thinkingShare:`Thinking Anteil`},peakWindow:{title:`Peak-Fenster`,summary:`Stärkste 7-Tage-Phase von {{start}} bis {{end}}`,fallback:`Kein 7-Tage-Fenster verfügbar, daher Fokus auf den teuersten Einzelwert.`,peakDay:`Peak Tag`,avgPerUnit:`Ø/{{unit}}`,peak7DayAverage:`Peak 7T Ø/Tag`,signal:`Signal`,signalStrong:`stark konzentriert`,signalModerate:`moderat konzentriert`,signalWide:`breit verteilt`},quickRead:{summary:`{{provider}} trägt {{providerShare}} der Kosten, während die Top-3-Modelle {{topThreeShare}} bündeln. {{requestLeader}}`,requestLeader:`{{requestModel}} führt bei den Anfragen, {{tokenModel}} beim Tokenvolumen.`,fallback:`Für den aktuellen Filterausschnitt sind noch nicht genug Daten für eine stabile Zusammenfassung vorhanden.`}},charts:{costOverTime:{title:`Kosten im Zeitverlauf + 7-Tage Ø`,subtitle:`Tageskosten mit 7-Tage gleitendem Durchschnitt`,summary:`Letzter Wert {{latest}} · Peak {{peak}} am {{date}}`,cost:`Kosten`,movingAverage:`7-Tage Ø`},costByModel:{title:`Kosten nach Modell`,subtitle:`Kostenverteilung nach Modell`,total:`Gesamt`,otherModels:`Weitere Modelle`},costByModelOverTime:{title:`Kosten nach Modell im Zeitverlauf`,subtitle:`Pro Modell über die Zeit`,topDriver:`Top Treiber: {{model}} · {{total}} kumuliert`,movingAverageHeading:`7-Tage Durchschnitt pro Modell`,movingAverageSuffix:`Ø`},cumulativeCost:{title:`Kumulative Kosten`,total:`Gesamt: {{value}}`,cumulative:`Kumulativ`,projection:`Projektion`},tokensOverTime:{title:`Tokens im Zeitverlauf`,subtitle:`Alle Token-Typen mit 7-Tage Ø`,allTypes:`Gesamt-Tokens (alle Typen)`,totalTokens:`Gesamt-Tokens`,movingAverage:`7-Tage Ø`,cacheTokens:`Cache Tokens`,inputOutputTokens:`Input / Output Tokens`,thinkingTokens:`Thinking Tokens`,averageSuffix:`Ø`},requestsOverTime:{title:`Anfragen im Zeitverlauf`,subtitle:`Anfragen gesamt, nach Modell und mit 7-Tage-Ø`,summary:`Gesamt {{total}} · Peak {{peak}} am {{date}}`,averagePerUnit:`Ø / {{unit}}`,trend:`Trend Ø`,movingAverage:`7-Tage Ø`,trendHeading:`Gleitender Durchschnitt pro Modell`,movingAverageHeading:`7-Tage Durchschnitt pro Modell`,totalMovingAverage:`Gesamt {{label}}`,requestsByModelTotal:`Anfragen nach Modell gesamt`,requestsInRange:`Anfragen im gewählten Zeitraum`,total:`Gesamt`,topModel:`Top Modell`,topShare:`Top Share`,totalRequestsSeries:`Gesamt-Anfragen`},requestCacheHitRate:{title:`Cache-Hit-Rate nach Modell`,subtitle:`Gesamt {{total}} · 7-Tage-Ø {{trailing}}`,totalRate:`Gesamt`,trailing7Rate:`7-Tage-Ø`,trendRate:`Trend-Ø`,topModel:`Top Modell`,models:`Modelle`,total:`Gesamt`,timelineHeading:`Cache-Hit-Rate im Zeitverlauf / {{unit}}`,modelBreakdownHeading:`Aktueller Modell-Snapshot`},heatmap:{costTitle:`Kosten-Heatmap`,requestsTitle:`Anfragen-Heatmap`,tokensTitle:`Token-Heatmap`,cellLabel:`{{date}}: {{value}}`,costEmpty:`Kosten-Heatmap nur in der Tagesansicht verfügbar`,requestsEmpty:`Anfragen-Heatmap nur in der Tagesansicht verfügbar`,tokensEmpty:`Token-Heatmap nur in der Tagesansicht verfügbar`,switchToDaily:`Wechsle zur Tagesansicht für die Kalender-Heatmap`,less:`Weniger`,more:`Mehr`},tokenTypes:{title:`Token-Typen`,subtitle:`Verteilung der Token-Typen`,total:`Gesamt`},modelMix:{title:`Modell-Mix`,subtitle:`Kostenanteil pro Modell über die Zeit`},distribution:{title:`Verteilungen`,requiresData:`Für Verteilungen werden mindestens 2 Datenpunkte im aktuellen Filter benötigt.`,costPerPeriod:`Kosten je {{period}}`,requestsPerPeriod:`Anfragen je {{period}}`,tokensPerRequest:`Tokens pro Anfrage`,interval:`Intervall`,dataPoints:`Datenpunkte`,buckets:`Buckets`},correlation:{title:`Korrelationen`,requiresData:`Für Korrelationen werden mindestens 2 Datenpunkte im aktuellen Filter benötigt.`,points:`{{count}} Punkte`,requestsVsCost:`Anfragen vs. Kosten`,cacheVsCostPerRequest:`Cache-Rate vs. Kosten / Anfrage`,requestsAxis:`Anfragen`,requestsLabel:`Anfragen`,tokensLabel:`Tokens`,costPerRequestAxis:`Kosten / Anfrage`,cost:`Kosten`,costPerRequest:`Kosten / Anfrage`,cacheRate:`Cache-Rate`,strongRequestCost:`Starker Zusammenhang: Mehr Anfragen treiben die Kosten sichtbar.`,mediumRequestCost:`Moderater Zusammenhang zwischen Last und Kosten.`,weakRequestCost:`Schwacher Zusammenhang: Kosten werden stärker von Modellmix und Tokenlast geprägt.`,negativeCache:`Negativer Zusammenhang: Höhere Cache-Rate senkt tendenziell die Kosten pro Anfrage.`,neutralCache:`Kaum linearer Effekt: Cache wirkt, aber nicht allein entscheidend.`,positiveCache:`Positiver Zusammenhang: Hohe Cache-Raten fallen hier nicht automatisch mit niedrigen Kosten pro Anfrage zusammen.`},costByWeekday:{title:`Kosten nach Wochentag`,subtitle:`Peak: {{peak}} · Low: {{low}} · Wochenende {{share}}`,averageCost:`Ø Kosten`},tokenEfficiency:{title:`Token-Effizienz ($/1M)`,subtitle:`Ø {{value}}/1M Tokens`,series:`$/1M Tokens`,movingAverage:`7T-Ø`}},risk:{title:`Konzentrationsrisiko`,modelDependency:`Modell-Abhängigkeit`,providerDependency:`Provider-Abhängigkeit`,high:`hoch`,medium:`mittel`,low:`niedrig`,modelHint:`HHI {{value}} · Hohe Werte sprechen für wenige dominante Modelle.`,providerHint:`HHI {{value}} · Zeigt die Abhängigkeit von einzelnen Anbietern.`},requestQuality:{title:`Anfragequalität`,tokensPerRequest:`Tokens / Anfrage`,costPerRequest:`Kosten / Anfrage`,cachePerRequest:`Cache / Anfrage`,thinkingPerRequest:`Thinking / Anfrage`,tokensHint:`Durchschnittliche Tokenlast pro Anfrage`,costHint:`Direkte Kosten pro Anfrage`,cacheHint:`Gelesene Cache-Tokens pro Anfrage`,thinkingHint:`Thinking-Tokens pro Anfrage`,requestDensity:`Anfragedichte`,averagePerActiveUnit:`Ø pro aktivem {{unit}}`,cacheHitRate:`Cache-Hit-Rate`,cacheHitHint:`Direkt aus Cache-Read relativ zu allen Tokens`,inputOutput:`Input / Output`,inputOutputHint:`Drift zwischen eingehenden und erzeugten Tokens`,topRequestModel:`Top-Anfragemodell`,noRequestLeader:`Kein führendes Anfragemodell`},forecast:{noData:`Keine Daten verfügbar`,noForecast:`Keine Prognose verfügbar`,requiresTwoDays:`Mindestens 2 Tage mit Daten benötigt`,avgMonthlyCost:`Ø Monatskosten`,avgYearlyCost:`Ø Jahreskosten`,totalOverPeriods:`Gesamt: {{total}} über {{count}} {{unit}}`,monthEndForecast:`Prognose Monatsende`,low:`niedrig`,medium:`mittel`,high:`hoch`,soFar:`Bisher: {{value}}`,remainingDays:`Resttage: {{count}}`,projectedPerDay:`Prognose {{value}}/Tag`,vsLastWeek:`vs. Vorwoche`,chartTitle:`Kostenprognose aktueller Monat`,chartSubtitle:`Monatsend-Prognose auf Basis geglätteter Kalender-Tageskosten`,lowerBound:`Untere Spanne`,uncertaintyBand:`Unsicherheitsband`,actualCost:`Ist-Kosten`,projection:`Prognose`},cacheRoi:{title:`Cache-Ersparnis (ROI)`,noData:`Keine Daten verfügbar`,heuristicFallback:`Für {{count}} {{modelsLabel}} ohne hinterlegte Preistabelle nutzt die ROI-Schätzung einen Heuristik-Fallback.`,model:`Modell`,models:`Modelle`,withoutCache:`Ohne Cache`,withCache:`Mit Cache`,withCacheActual:`Mit Cache (tatsächlich)`,savings:`Ersparnis`,avgCostPerUnit:`Ø Kosten/{{unit}}`,paid:`Bezahlt`,saved:`Gespart`},comparison:{title:`Perioden-Vergleich`,notEnoughData:`Nicht genügend Daten für einen Vergleich`,requiresDays:`Mindestens 7 Tage benötigt (aktuell: {{count}})`,thisWeek:`Diese Woche`,lastWeek:`Letzte Woche`,thisMonth:`Dieser Monat`,lastMonth:`Letzter Monat`,week:`Woche`,month:`Monat`,metric:`Metrik`,delta:`Delta`,cost:`Kosten`,tokens:`Tokens`,avgPerDay:`Ø/Tag`,cacheRate:`Cache-Rate`,days:`Tage`},anomaly:{title:`Auffällige {{period}}`,none:`Keine Anomalien erkannt`,withinStdDev:`Alle Kosten liegen innerhalb von 2 Standardabweichungen`,description:`{{period}} mit Kosten >2 Standardabweichungen vom Mittelwert ({{mean}} ± {{stdDev}})`,critical:`kritisch`},tables:{modelEfficiency:{title:`Modell-Effizienz`,count:`{{count}} Modelle`,topModel:`Top Modell`,mostEfficient:`Effizientestes Modell`,totalRequests:`Gesamt-Anfragen`,topModelTokens:`Top Modell Tokens`,share:`{{value}} Anteil`,perModel:`{{value}} / Modell`,more:`+{{count}} weitere`,model:`Modell`,cost:`Kosten`,tokens:`Tokens`,shareShort:`Anteil`,req:`Anfragen`,reqShare:`Anfragen %`,costPerReq:`Kosten / Anfrage`,tokensPerReq:`Tokens / Anfrage`,cacheShare:`Cache %`,thinkingShare:`Think %`,avgPerUnit:`Ø/{{unit}}`},providerEfficiency:{title:`Anbieter-Effizienz`,count:`{{count}} Anbieter`,leadProvider:`Führender Anbieter`,mostEfficient:`Effizientester Anbieter`,totalRequests:`Gesamt-Anfragen`,share:`{{value}} Anteil`,perProvider:`{{value}} / Anbieter`,avgPerUnit:`Ø/{{unit}}`,provider:`Anbieter`,cost:`Kosten`,shareShort:`Anteil`,req:`Anfragen`,tokens:`Tokens`,costPerReq:`Kosten / Anfrage`,costPerMillion:`$/1M`,cacheShare:`Cache %`},recentDays:{daysDetail:`Letzte Tage im Detail`,monthsDetail:`Monate im Detail`,yearsDetail:`Jahre im Detail`,showing:`Zeige {{shown}} von {{total}} {{unit}}`,showLess:`Weniger anzeigen`,showAll:`Alle anzeigen`,totalCost:`Gesamtkosten`,totalTokens:`Gesamt-Tokens`,requests:`Anfragen`,cacheReadShare:`Cache Read Anteil`,peak:`Peak`,previousDay:`Vortag`,avg7d:`7T-Ø`,reqAvg:`Anfragen-Ø`,date:`Datum`,cost:`Kosten`,tokens:`Tokens`,models:`Modelle`}},helpPanel:{projectLinks:{title:`Projekt-Links`,description:`Öffne das veröffentlichte npm-Paket für v{{version}}, das GitHub-Repository oder den Issue-Tracker.`,npm:`npm`,github:`GitHub`,issues:`GitHub Issues`},chartsAndFeatures:`Charts`,dashboardSectionsTitle:`Dashboard-Sektionen`,featuresTitle:`Features`,tablesTitle:`Tabellen`,metricLabels:{totalCost:`Gesamtkosten`,totalTokens:`Tokens gesamt`,activeDays:`Aktive Tage`,topModel:`Top-Modell`,cacheHitRate:`Cache-Hit-Rate`,costPerMillion:`Kosten / 1M Tokens`,mostExpensiveDay:`Teuerster Tag`,cheapestDay:`Günstigster Tag`,avgCostPerDay:`Ø Kosten / Tag`,outputTokens:`Output-Tokens`},chartLabels:{costOverTime:`Kosten über Zeit`,costByModel:`Kosten nach Modell`,costByModelOverTime:`Kosten/Modell über Zeit`,cumulativeCost:`Kumulative Kosten`,costByWeekday:`Kosten nach Wochentag`,tokensOverTime:`Tokens über Zeit`,requestsOverTime:`Anfragen im Zeitverlauf`,requestCacheHitRate:`Cache-Hit-Rate nach Modell`,tokenTypes:`Token-Typen`,tokenEfficiency:`Token-Effizienz`,modelMix:`Modell-Mix`,distributionAnalysis:`Verteilungen`,correlationAnalysis:`Korrelationen`,heatmap:`Kosten-Heatmap`,requestHeatmap:`Anfragen-Heatmap`,tokenHeatmap:`Token-Heatmap`,forecast:`Prognose`,cacheROI:`Cache-ROI`,providerLimitProgress:`Anbieter-Limit-Auslastung`,providerSubscriptionMix:`Anbieter-Abos vs. API-Kosten`,providerLimitTimeline:`Anbieterlimits im Zeitverlauf`,periodComparison:`Periodenvergleich`,anomalyDetection:`Anomalie-Erkennung`,cellLabel:`{{date}}: {{value}}`},sectionLabels:{insights:`Einblicke`,metrics:`Metriken`,today:`Heute`,currentMonth:`Monat`,activity:`Aktivität`,forecastCache:`Prognose & Cache`,costAnalysis:`Kostenanalyse`,tokenAnalysis:`Token-Analyse`,requestAnalysis:`Anfragen-Analyse`,advancedAnalysis:`Verteilungen & Risiko`,comparisons:`Vergleiche & Anomalien`,tables:`Tabellen`,limits:`Limits & Abonnements`},featureLabels:{requestQuality:`Anfragequalität`,providerLimits:`Anbieterlimits`,concentrationRisk:`Konzentrationsrisiko`,providerEfficiency:`Anbieter-Effizienz`,modelEfficiency:`Modell-Effizienz`,recentDays:`Zeiträume im Detail`}},autoImportModal:{title:`Toktrack Auto-Import`,description:"Importiert lokale Nutzungsdaten automatisch via lokalem `toktrack`, `bunx` oder `npm exec` und speichert sie nur auf diesem Gerät.",connecting:`Verbinde...`,checkingTool:`Prüfe {{tool}}...`,toolFound:`{{tool}} gefunden ({{method}}, v{{version}})`,toolNotFound:`{{tool}} nicht gefunden`,importedDays:`{{days}} Tage importiert ({{cost}} USD)`,checkingPrerequisites:`Prüfe Voraussetzungen...`,importingData:`Importiere Daten...`,startingLocalImport:`Starte lokalen toktrack-Import...`,loadingUsageData:`Lade Nutzungsdaten via {{command}}...`,processingUsageData:`Verarbeite Nutzungsdaten... ({{seconds}}s)`,serverConnectionLost:`Verbindung zum Server verloren.`,autoImportRunning:`Ein Auto-Import läuft bereits. Bitte warten.`,noRunnerFound:`Kein lokales toktrack, Bun oder npm exec gefunden.`,errorPrefix:`Fehler: {{message}}`,loadedDays:`{{days}} Tage geladen ({{cost}} USD)`,errorOccurred:`Fehler aufgetreten`,close:`Schliessen`},commandPalette:{title:`Command Palette`,description:`Tastaturgesteuerte Befehlsauswahl für Navigation und Aktionen im ttdash Dashboard.`,placeholder:`Befehl suchen...`,empty:`Kein Befehl gefunden.`,groups:{actions:`Aktionen`,filters:`Filter & Ansicht`,navigation:`Navigation`,view:`Ansicht`,language:`Sprache`,help:`Hilfe`,providers:`Anbieter`,models:`Modelle`},commands:{autoImport:{label:`Auto-Import starten`,description:`Lokalen toktrack Import ausführen`},openSettings:{label:`Einstellungen öffnen`,description:`Backups, App-Optionen und Anbieterlimits verwalten`},exportCsv:{label:`CSV exportieren`,description:`Aktuell gefilterte Daten exportieren`},generateReport:{label:`PDF-Report generieren`,labelLoading:`PDF-Report wird generiert`,description:`Aktuell gefilterte Daten als PDF exportieren`},upload:{label:`JSON hochladen`,description:`toktrack oder Legacy JSON importieren`},delete:{label:`Daten löschen`,description:`Lokalen Datensatz entfernen`},viewDaily:{label:`Zur Tagesansicht wechseln`,description:`Daten pro Tag anzeigen`},viewMonthly:{label:`Zur Monatsansicht wechseln`,description:`Daten pro Monat anzeigen`},viewYearly:{label:`Zur Jahresansicht wechseln`,description:`Daten pro Jahr anzeigen`},preset7d:{label:`Zeitraum: letzte 7 Tage`,description:`Setzt den Datumsfilter auf 7 Tage`},preset30d:{label:`Zeitraum: letzte 30 Tage`,description:`Setzt den Datumsfilter auf 30 Tage`},presetMonth:{label:`Zeitraum: aktueller Monat`,description:`Setzt den Datumsfilter auf den laufenden Monat`},presetYear:{label:`Zeitraum: aktuelles Jahr`,description:`Setzt den Datumsfilter auf das laufende Jahr`},presetAll:{label:`Zeitraum: alle Daten`,description:`Entfernt Preset-Zeitraumfilter`},clearProviders:{label:`Anbieterfilter zurücksetzen`,description:`Alle aktiven Anbieterfilter entfernen`},clearModels:{label:`Modellfilter zurücksetzen`,description:`Alle aktiven Modellfilter entfernen`},clearDates:{label:`Datumsfilter zurücksetzen`,description:`Start- und Enddatum entfernen`},resetAll:{label:`Alle Filter zurücksetzen`,description:`Den Standardzustand der Dashboard-Filter wiederherstellen`},scrollTop:{label:`Nach oben scrollen`,description:`Zum Seitenanfang springen`},scrollBottom:{label:`Nach unten scrollen`,description:`Zum Seitenende springen`},filters:{label:`Zu Filtern`,description:`Springt zur Filterleiste`},goToSection:{label:`Zu {{section}}`,description:`Springt zur Sektion {{section}}`},insights:{label:`Zu Einblicke`,description:`Springt zur Executive Summary`},metrics:{label:`Zu Metriken`,description:`Springt zu den KPI-Karten`},today:{label:`Zu Heute`,description:`Springt zu den KPIs des aktuellen Tages`},month:{label:`Zu Monat`,description:`Springt zu den KPIs des aktuellen Monats`},activity:{label:`Zu Aktivität`,description:`Springt zur Aktivitäts-Heatmap`},forecastCache:{label:`Zu Prognose & Cache`,description:`Springt zu Forecast und Cache ROI`},limits:{label:`Zu Limits & Abonnements`,description:`Springt zur Limits-Sektion`},charts:{label:`Zu Kostenanalyse`,description:`Springt zu den Kostencharts`},tokenAnalysis:{label:`Zu Token-Analyse`,description:`Springt zu Token-Charts und Verteilungen`},requestAnalysis:{label:`Zu Anfragen-Analyse`,description:`Springt zu Anfragen im Zeitverlauf und zur Anfragen-Verteilung`},comparisons:{label:`Zu Vergleiche & Anomalien`,description:`Springt zu Periodenvergleich und Auffälligkeiten`},tables:{label:`Zu Tabellen`,description:`Springt zu den Detailtabellen`},themeLight:{label:`Light Mode aktivieren`,description:`Zwischen hellem und dunklem Theme wechseln`},themeDark:{label:`Dark Mode aktivieren`,description:`Zwischen hellem und dunklem Theme wechseln`},languageGerman:{label:`Auf Deutsch wechseln`,description:`Die Dashboard-Sprache auf Deutsch umstellen`},languageEnglish:{label:`Auf Englisch wechseln`,description:`Die Dashboard-Sprache auf Englisch umstellen`},help:{label:`Hilfe & Tastenkürzel öffnen`,description:`Öffnet die Hilfeübersicht`}}},settings:{modal:{title:`Einstellungen`,description:`Verwalte App-Backups, gespeicherte Daten und Anbieterlimits an einem Ort.`,languageTitle:`Dashboard-Sprache`,languageDescription:`Lege fest, welche Sprache im Dashboard, in Dialogen und in Reports verwendet wird.`,dataStatus:`Datenstatus`,lastLoaded:`Zuletzt geladen`,loadedVia:`Geladen über`,cliAutoLoad:`CLI Auto-Load`,defaultFiltersTitle:`Standardfilter fürs Dashboard`,defaultFiltersDescription:`Lege den Filterzustand fest, der beim Öffnen des Dashboards und beim Zurücksetzen verwendet wird.`,defaultViewMode:`Standardansicht`,defaultDateRange:`Standardzeitraum`,filterProviders:`Standard-Anbieterfilter`,filterModels:`Standard-Modellfilter`,noModels:`Keine Modelle im geladenen Report gefunden.`,sectionVisibilityTitle:`Sichtbare Dashboard-Sektionen`,sectionVisibilityDescription:`Steuere, welche Sektionen im Dashboard gerendert werden und in welcher Reihenfolge sie erscheinen.`,sectionOrderHint:`Ziehe die Sektionen per Drag and Drop in die gewünschte Reihenfolge. Die aktuelle Reihenfolge ist das Standardlayout.`,positionLabel:`Position {{position}} von {{total}}`,moveSectionUp:`{{section}} nach oben verschieben`,moveSectionDown:`{{section}} nach unten verschieben`,settingsBackupTitle:`Einstellungen sichern`,settingsBackupDescription:`Exportiert und importiert Sprache, Theme, Limits und die gespeicherten Lade-Metadaten als versioniertes Backup.`,dataBackupTitle:`Daten sichern`,dataBackupDescription:`Exportiert den lokal gespeicherten Nutzungsstand als Backup und importiert Backups konservativ zurück.`,dataImportPolicy:`Beim Datenimport werden nur fehlende Tage ergänzt. Bestehende Tage mit abweichenden Werten bleiben lokal erhalten und werden als Konflikt gemeldet.`,dataImportReplaceHint:`Wenn du einen Datensatz vollständig ersetzen willst, nutze weiter den normalen JSON-Upload im Header.`,providerLimitsTitle:`Anbieterlimits`,providerLimitsDescription:`Definiere Abo und Monatslimit pro Anbieter. Nur Anbieter aus dem aktuell geladenen Report sind editierbar.`,noProviders:`Keine Anbieter im geladenen Report gefunden.`,exportSettings:`Einstellungen exportieren`,importSettings:`Einstellungen importieren`,exportData:`Daten exportieren`,importData:`Daten importieren`,close:`Schliessen`,save:`Speichern`,viewModes:{daily:`Täglich`,monthly:`Monatlich`,yearly:`Jährlich`},datePresets:{all:`Alle Daten`,"7d":`Letzte 7 Tage`,"30d":`Letzte 30 Tage`,month:`Aktueller Monat`,year:`Aktuelles Jahr`},sources:{file:`Datei-Upload`,"auto-import":`Auto-Import`,"cli-auto-load":`CLI Auto-Load`,unknown:`Unbekannt`}}},drillDown:{description:`Detaillierte {{periodType}}-Ansicht mit Benchmarks, Modellaufschlüsselung, Anbieter-Zusammenfassung und Token-Verteilung.`,cacheRate:`Cache-Rate`,tokensPerRequest:`Tokens / Anfrage`,costPerRequest:`Kosten / Anfrage`,costRank:`Kosten-Rang`,requestRank:`Anfragen-Rang`,overview:`Überblick`,benchmarks:`Benchmarks`,periodType:`Typ: {{period}}`,coverage:`Abdeckung`,coverageDays:`{{count}} Rohdaten-Tag`,coverageDays_other:`{{count}} Rohdaten-Tage`,singlePeriod:`1 {{period}}`,activeProviders:`Aktive Anbieter`,topRequestModel:`Dominant nach Anfragen`,topCostModel:`Top nach Kosten`,topTokenModel:`Top nach Tokens`,priciestPerMillionModel:`Höchstes $/1M`,topCostShare:`Top-1 Kostenanteil`,topThreeCostShare:`Top-3 Kostenanteil`,modelBreakdown:`Modelle im Detail`,providerSummary:`Anbieter-Zusammenfassung`,providerCount:`{{count}} Anbieter`,modelCount:`{{count}} Modell`,modelCount_other:`{{count}} Modelle`,activeModelsCount:`{{count}} aktives Modell`,activeModelsCount_other:`{{count}} aktive Modelle`,costShare:`Kostenanteil`,tokenShare:`Tokenanteil`,costShareByModel:`Kostenanteil nach Modell`,costVsPrevious:`Kosten vs. vorher`,tokensVsPrevious:`Tokens vs. vorher`,requestsVsPrevious:`Anfragen vs. vorher`,costPerMillionVsPrevious:`$/1M vs. vorher`,previousDay:`Vorheriger Tag`,nextDay:`Nächster Tag`,previousPeriod:`Vorherige Periode`,nextPeriod:`Nächste Periode`,position:`{{current}} / {{total}}`,keyboardHint:`Mit ← / → wechseln`,costVsAverageWindow:`Kosten vs. {{window}}-Ø`,requestsVsAverageWindow:`Anfragen vs. {{window}}-Ø`,tokensVsAverageWindow:`Tokens vs. {{window}}-Ø`,costPerMillionVsAverageWindow:`$/1M vs. {{window}}-Ø`,windowUnit:{day:`T`,month:`M`,year:`J`},tokenDistribution:`Token-Verteilung`,requestCountShort:`{{count}} Anfragen`,modelRequestSummary:`{{costPerRequest}} / Anfrage · {{tokensPerRequest}} / Anfrage`,noRequests:`Keine Anfragen`,tokenSegments:{cacheRead:`Cache Read`,cacheWrite:`Cache Write`}},chartCard:{expandedDescription:`Erweiterte Chart-Ansicht mit Kennzahlenübersicht und optionalem CSV-Export.`,exportCsv:`CSV exportieren`},customTooltip:{total:`Gesamt`,delta:`Delta`,vsPrevious:`vs. vorher`,vsAverage:`vs. Ø`},limits:{sectionTitle:`Limits & Abonnements`,sectionDescription:`Budget-Risiko getrennt von Abo-Wirkung im aktuellen Filterkontext`,providersBadge:`{{count}} Anbieter`,warningBanner:`{{count}} Anbieter haben ihr Monatslimit im aktuellen Ausschnitt erreicht oder überschritten.`,cards:{atLimit:`Anbieter am Limit`,nearLimit:`Nahe am Limit`,subscriptionVolume:`Abo-Volumen`,subscriptionValue:`Abo-Mehrwert`,nearLimitHint:`ab 80% Auslastung`,subscriptionVolumeHint:`fixe Kosten / Monat`,subscriptionValueHint:`Nutzung über dem Abo`,noMonth:`Kein Monat`},statuses:{limitExceeded:`Limit überschritten`,budgetTight:`Budget angespannt`,budgetStable:`Budget stabil`,noLimit:`Kein Limit gesetzt`,noSubscription:`Kein Abo`,subscriptionPaysOff:`Abo zahlt sich aus`,belowSubscription:`Noch unter dem Abo`},badge:{limit:`{{value}}% Limit`,subscription:`{{value}}% Abo`,open:`Offen`},tracks:{budgetTitle:`Budget-Status je Anbieter`,budgetSubtitle:`Jeder Track zeigt pro Anbieter direkt den Abstand bis zum Limit oder den bereits eingetretenen Überzug`,budgetNoMonth:`Kein Monat im aktuellen Ausschnitt`,subscriptionTitle:`Abo-Status je Anbieter`,subscriptionSubtitle:`Jeder Track zeigt pro Anbieter direkt den Abstand zum Break-even oder den bereits erreichten Mehrwert`,subscriptionNoMonth:`Kein Monat im aktuellen Ausschnitt`,portfolioTitle:`Portfolio-Entwicklung`,portfolioSubtitle:`Monatlicher Verlauf von Nutzung, konfigurierten Limits und Abo-Wirkung`,usage:`Nutzung`,limit:`Limit`,limits:`Limits`,subscription:`Abo`,subscriptions:`Abos`,breakEven:`Break-even`,currentlyUsed:`Aktuell verbraucht`,remainingToLimit:`Bis Limit offen`,alreadyOverLimit:`Schon darüber`,remainingToBreakEven:`Bis Break-even offen`,alreadyAboveBreakEven:`Schon darüber`,usageFocusMonth:`Kosten Fokusmonat`,limitSubscription:`Limit / Abo`,budgetRisk:`Budget-Risiko`,subscriptionEffect:`Abo-Wirkung`,stillToLimit:`Noch {{value}} bis zum Limit`,alreadyAboveLimit:`Schon {{value}} über Limit`,stillToBreakEven:`Noch {{value}} bis Break-even`,alreadyAboveBreakEvenText:`Schon {{value}} über Break-even`,noSubscriptionSet:`Kein Abo gesetzt`},modal:{title:`Anbieterlimits`,description:`Definiere pro Anbieter Abo und Monatslimit. Nur Anbieter aus dem aktuell geladenen Report sind editierbar. Ein Limit von 0 bedeutet kein Limit.`,dataStatus:`Datenstatus`,lastLoaded:`Zuletzt geladen`,loadedVia:`Geladen über`,cliAutoLoad:`CLI Auto-Load`,noProviders:`Keine Anbieter im geladenen Report gefunden.`,hasSubscription:`Abo vorhanden`,subscriptionPerMonth:`Abo $/Monat`,monthlyLimit:`Monatslimit $`,close:`Schliessen`,save:`Speichern`,sources:{file:`Datei-Upload`,"auto-import":`Auto-Import`,"cli-auto-load":`CLI Auto-Load`,unknown:`Unbekannt`}}},report:{title:`TTDash Report`,common:{notAvailable:`n/v`},header:{eyebrow:`TTDash PDF-Bericht`},summary:{peakPeriod:`Spitzenzeitraum`},sections:{overview:`Überblick`,insights:`Wichtigste Erkenntnisse`,filters:`Filter`,modelsProviders:`Modelle & Anbieter`,recentPeriods:`Letzte Zeiträume`,interpretation:`Interpretation`},fields:{dateRange:`Zeitraum`,view:`Ansicht`,generated:`Generiert`,month:`Monat`,selectedProviders:`Ausgewählte Anbieter`,selectedModels:`Ausgewählte Modelle`,startDate:`Startdatum`,endDate:`Enddatum`},filters:{all:`Alle`,noFilter:`Kein Filter`,andMore:`+{{count}} weitere`},tables:{topModels:`Top-Modelle`,providers:`Anbieter`,columns:{model:`Modell`,provider:`Anbieter`,cost:`Kosten`,tokens:`Tokens`,requests:`Anfragen`,period:`Zeitraum`}},charts:{costTrend:`Kostenverlauf`,topModels:`Top-Modelle nach Kosten`,tokenTrend:`Token-Mix pro Zeitraum`,costTrendAlt:`Liniendiagramm der Report-Kosten pro Zeitraum.`,costTrendSummary:`Letzter Wert {{latest}}. Peak {{peak}} am {{date}}.`,topModelsAlt:`Horizontales Balkendiagramm der teuersten Modelle im Report.`,topModelsSummary:`{{model}} führt mit {{cost}} und {{share}} der Report-Kosten.`,topModelsFullNames:`Vollständige Diagramm-Labels: {{names}}.`,tokenTrendAlt:`Gestapeltes Balkendiagramm des Token-Mix pro Report-Zeitraum.`,tokenTrendSummary:`Gesamt {{total}}. Höchstes Token-Volumen {{peak}} am {{date}}.`,noDataSummary:`Nicht genug Daten für eine belastbare Diagramm-Zusammenfassung.`},interpretation:{summary:`Dieser Report umfasst {{days}} Rohdaten-Tage und {{periods}} aggregierte Zeiträume. Spitzenzeitraum: {{peak}}. Top-Modell: {{topModel}}. Führender Anbieter: {{topProvider}}.`,footer:`Erstellt mit TTDash v{{version}} und serverseitiger Typst-Kompilierung.`},insights:{coverageTitle:`Datenbasis`,coverageBody:`Dieser Report basiert auf einer schmalen Datenbasis mit {{days}} Rohdaten-Tagen und {{periods}} aggregierten Zeiträumen. Trend-Aussagen sollten vorsichtig gelesen werden.`,providerTitle:`Anbieter-Konzentration`,providerBody:`{{provider}} steht für {{share}} der gesamten Report-Kosten.`,cacheTitle:`Cache-Beitrag`,cacheBody:`Cache-Reads machen im gewählten Zeitraum {{share}} der Token-Aktivität aus.`,peakWindowTitle:`Stärkstes 7-Tage-Fenster`,peakWindowBody:`Das stärkste rollierende 7-Tage-Fenster lag zwischen {{start}} und {{end}} mit insgesamt {{cost}} Kosten.`}},api:{fetchUsageFailed:`Fehler beim Laden der Daten`,fetchSettingsFailed:`Fehler beim Laden der Einstellungen`,uploadFailed:`Upload fehlgeschlagen`,deleteFailed:`Löschen fehlgeschlagen`,deleteSettingsFailed:`Einstellungen konnten nicht zurückgesetzt werden`,importUsageFailed:`Datenimport fehlgeschlagen`,importSettingsFailed:`Einstellungs-Import fehlgeschlagen`,saveSettingsFailed:`Einstellungen konnten nicht gespeichert werden`,pdfFailed:`PDF-Generierung fehlgeschlagen`},toasts:{fileLoaded:`Datei {{name}} erfolgreich geladen`,fileReadFailed:`Datei konnte nicht gelesen werden`,dataDeleted:`Daten gelöscht`,csvExported:`CSV exportiert`,dataImported:`Daten erfolgreich importiert`,settingsExported:`Einstellungs-Backup exportiert`,dataExported:`Daten-Backup exportiert`,noDataToExport:`Keine Daten zum Exportieren vorhanden`,settingsImported:`Einstellungen aus {{name}} importiert`,settingsReset:`Einstellungen zurückgesetzt`,settingsSaved:`Einstellungen gespeichert`,dataBackupImported:`Backup importiert: {{added}} neue Tage ergänzt, {{unchanged}} identische Tage übersprungen`,dataBackupImportedWithConflicts:`Backup importiert: {{added}} neue Tage ergänzt, {{conflicts}} Konflikttage lokal beibehalten`}},ee={app:{name:`TTDash`,language:`Language`,languages:{de:`German`,en:`English`}},header:{import:`Import`,upload:`Upload`,limits:`Limits`,settings:`Settings`,report:`Report`,csv:`CSV`,delete:`Delete`,help:`Help & shortcuts`,loaded:`Loaded`,loadedAt:`Last loaded: {{time}}`,autoLoadActive:`Auto-load on start`,autoLoadAt:`Automatically loaded on start: {{time}}`,versionLinkTitle:`Open TTDash v{{version}} on npm`,streak:`{{count}}D streak`},emptyState:{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`.",autoImport:`Auto import`,uploadFile:`Upload file`,openSettings:`Settings & backups`,or:`or`},loadError:{title:`Could not load local app state`,settingsDescription:`The local settings could not be loaded. Reset them or retry the load.`,usageDescription:`The stored usage data could not be loaded. Remove the broken data or retry the load.`,multipleDescription:`TTDash found problems in both local settings and stored usage data. Reset the affected state and retry the load.`,details:`Details`,retry:`Retry load`,resetSettings:`Reset settings`,deleteData:`Delete stored data`,settingsCorrupted:`The local settings file is unreadable or corrupted.`,usageCorrupted:`The local usage data file is unreadable or corrupted.`},viewModes:{daily:`Daily view`,monthly:`Monthly view`,yearly:`Yearly view`},periods:{day:`day`,days:`days`,month:`month`,months:`months`,year:`year`,years:`years`,unitDay:`day`,unitMonth:`mo.`,unitYear:`year`},common:{all:`All`,none:`None`,reset:`Reset`,notAvailable:`n/a`,noData:`No data`,generated:`Generated`,view:`View`,dateRange:`Date range`,month:`Month`,provider:`Provider`,providers:`Providers`,model:`Model`,models:`Models`,cost:`Cost`,costs:`Costs`,tokens:`Tokens`,requests:`Requests`,today:`Today`,currentMonth:`Month`,yes:`Yes`,no:`No`,enabled:`Enabled`,disabled:`Disabled`,visible:`Visible`,hidden:`Hidden`,open:`Open`,close:`Close`,previousMonth:`Previous month`,nextMonth:`Next month`,startDate:`Start date`,endDate:`End date`,selectedProviders:`Selected providers`,selectedModels:`Selected models`,allProviders:`All providers`,allModels:`All models`,allMonths:`All months`,noFilter:`No filter`,focusMonth:`Focus month`,showInfo:`Show info`,expand:`Expand`,expandWithTitle:`{{title}} expand`,expandedCardDescription:`Expanded card view with additional metrics and full content.`,input:`Input`,output:`Output`,cacheWrite:`Cache write`,cacheRead:`Cache read`,thinking:`Thinking`,requestsShort:`Req`,request:`Request`,share:`Share`,top:`Top`},filterBar:{status:`Filter status`,viewModeLabel:`View mode`,focusMonthLabel:`Focus month`,providersActive:`{{count}} providers active`,modelsActive:`{{count}} models active`,dateFilterActive:`Date filter active`,clearDate:`Clear {{label}}`,presets:{"7d":`7D`,"30d":`30D`,month:`Month`,year:`Year`,all:`All`},until:`to`,resetDateRange:`Reset date range`,resetAll:`Reset all`,providers:`Providers`,models:`Models`,resetModels:`Reset models`},dashboard:{insights:{title:`Insights`,badge:`Condensed signals`,description:`Focused signals from cost, model, and request data`,quickRead:`Quick read`},metrics:{title:`Metrics`,badge:`10 metrics`,description:`Core KPIs at a glance`},activity:{title:`Activity`,dailyDescription:`Daily usage overview`,monthlyDescription:`Monthly usage overview`,yearlyDescription:`Yearly usage overview`},forecastCache:{title:`Forecast & Cache`,description:`Cost forecast and cache efficiency`},costAnalysis:{title:`Cost analysis`,description:`Detailed cost breakdown`},tokenAnalysis:{title:`Token analysis`,description:`Usage by token type`},requestAnalysis:{title:`Request analysis`,description:`Requests overall, by model, and over time`},advancedAnalysis:{title:`Distributions & Risk`,description:`Additional signals for spread, correlation, and dependencies`},comparisons:{title:`Comparisons & Anomalies`,description:`Period comparison and outliers`},tables:{title:`Tables`,description:`Detailed breakdowns`},lazySectionError:{title:`Section unavailable`,description:`This dashboard section could not be loaded right now.`},cards:{periodComparison:`Period comparison`,anomalyDetection:`Anomaly detection`,costForecast:`Cost forecast`,cacheRoi:`Cache ROI`},stats:{min:`Min`,max:`Max`,avg:`Avg`,cacheHitRate:`Cache hit rate`,totalTokens:`Total tokens`,cacheRead:`Cache read`,dataPoints:`Data points`,avgCostPerUnit:`Avg cost/{{unit}}`,total:`Total`,avgPerUnit:`Avg / {{unit}}`}},metricCards:{primary:{totalCost:`Total cost`,totalTokens:`Total tokens`,activeDays:`Active days`,topModel:`Top model`,cacheHitRate:`Cache hit rate`,costPerMillion:`$/1M tokens`,requests:`Requests`,thinking:`Thinking`,avgPerPeriod:`{{value}}/{{unit}} avg`,tokensPerRequestAvg:`{{value}} average per request`,coverageOfDays:`{{coverage}} coverage across {{days}} days`,providersActive:`{{count}} providers active`,share:`{{value}} share`,requestLead:`Req lead: {{value}}`,allTokensViaCacheRead:`{{value}} of all tokens via cache read`,requestCountersMissing:`No request counters in the dataset`,thinkingShareOfVolume:`{{value}} of total token volume`,totalCostSubtitle:`Avg {{average}}/{{unit}} · {{costPerRequest}} per request`,totalTokensSubtitle:`{{tokensPerRequest}} per request`,totalTokensSubtitleWithRatio:`Input/Output {{ratio}}:1 · {{tokensPerRequest}} per request`,requestsSubtitle:`Avg {{requests}} / {{unit}} · {{cost}} / req · σ {{volatility}}`,thinkingSubtitle:`{{share}} share · {{tokens}} / request`},secondary:{mostExpensiveDay:`Most expensive day`,mostExpensiveMonth:`Most expensive month`,mostExpensiveYear:`Most expensive year`,dominantProvider:`Dominant provider`,peak7Days:`Peak 7 days`,avgCostPerUnit:`Avg cost/{{unit}}`,spread:`Spread: {{value}}`,medianPerUnit:`Median/{{unit}}`,vsAverage:`{{direction}}{{value}}% vs avg`,vsAverageWithVolatility:`{{direction}}{{value}}% vs avg · σ Req {{volatility}}`,medianInfo:`The median shows the typical value and is less sensitive to outliers than the average.`,requestLeader:`{{model}} · {{requests}} req`,dominantProviderSubtitle:`{{share}} share · {{cost}}{{requestLeader}}`},today:{title:`Today — {{date}}`,description:`KPIs for the current day`,costToday:`Cost today`,tokensToday:`Tokens today`,models:`Models`,costPerMillion:`$/1M tokens`,cacheHitRate:`Cache hit rate`,requests:`Requests`,thinking:`Thinking`,vsAverageShort:`vs avg`,overallAverage:`Overall avg: {{value}}`,cacheShare:`{{value}} cache share`,requestsToday:`Requests today`,avgPerDay:`Avg {{value}}/day`,ioRatio:`I/O ratio: {{value}}:1`,topModel:`Top: {{value}}`,requestsSubtitle:`{{value}} / model · {{cost}}/req`,tokensInsight:`{{value}} per request`,requestsInsight:`{{value}} per request`,requestCountersMissing:`No request counters`,thinkingSubtitle:`{{value}} share`},month:{title:`Month — {{date}}`,badge:`{{count}} days`,description:`KPIs for the current month`,costMonth:`Month cost`,tokensMonth:`Month tokens`,activeDays:`Active days`,models:`Models`,costPerMillion:`$/1M tokens`,cacheHitRate:`Cache hit rate`,requests:`Requests`,thinking:`Thinking`,vsPreviousMonth:`vs previous month`,coverage:`{{value}} coverage`,requestsInMonth:`Requests this month`,avgPerDay:`Avg {{value}}/day`,ioRatio:`I/O ratio: {{value}}:1`,topModel:`Top: {{value}}`,cacheMix:`In: {{input}} / Out: {{output}}`,costPerRequest:`{{value}} / req`,requestsSubtitle:`Avg {{value}}/day · {{cost}}/req`,requestCountersMissing:`No request counters`,thinkingSubtitle:`{{value}} share`}},insights:{concentration:{title:`Cost concentration`,summary:`{{provider}} is currently the dominant provider in the selected slice, while {{model}} is the strongest single lever.`,fallback:`No stable provider distribution is available yet.`,topProvider:`Top provider`,topModel:`Top model`,topModelShare:`Top model share`,topThreeModels:`Top 3 models`},requestEconomy:{title:`Request economy`,valueLabel:`Avg cost per request`,summary:`Each request costs {{cost}} on average and processes {{tokens}}. {{leader}}`,leader:`{{model}} currently leads on request volume.`,fallback:`The loaded dataset does not contain reliable request counters. Request economy is therefore unavailable.`,avgRequests:`Avg req/{{unit}}`,avgTokensPerRequest:`Avg tokens/req`,costPerMillion:`$/1M tokens`,totalRequests:`Total requests`},usagePatterns:{title:`Usage patterns`,summaryWithCoverage:`{{activeDays}} of {{totalDays}} calendar days contain activity in the filtered range. Requests vary by {{volatility}}.`,summaryWithoutCoverage:`{{activeDays}} active {{unit}} in the selected slice.`,avgModels:`Avg models/entry`,providersActive:`Providers active`,weekendShare:`Weekend share`,thinkingShare:`Thinking share`},peakWindow:{title:`Peak window`,summary:`Strongest 7-day phase from {{start}} to {{end}}.`,fallback:`No 7-day window is available, so the focus falls back to the most expensive single point.`,peakDay:`Peak day`,avgPerUnit:`Avg/{{unit}}`,peak7DayAverage:`Peak 7D avg/day`,signal:`Signal`,signalStrong:`highly concentrated`,signalModerate:`moderately concentrated`,signalWide:`broadly distributed`},quickRead:{summary:`{{provider}} accounts for {{providerShare}} of cost, while the top 3 models concentrate {{topThreeShare}}. {{requestLeader}}`,requestLeader:`{{requestModel}} leads on requests, while {{tokenModel}} leads on token volume.`,fallback:`There is not enough data in the current filter slice for a stable summary yet.`}},charts:{costOverTime:{title:`Cost over time + 7-day avg`,subtitle:`Daily cost with 7-day moving average`,summary:`Latest {{latest}} · Peak {{peak}} on {{date}}`,cost:`Cost`,movingAverage:`7-day avg`},costByModel:{title:`Cost by model`,subtitle:`Cost distribution by model`,total:`Total`,otherModels:`Other models`},costByModelOverTime:{title:`Cost by model over time`,subtitle:`Per model over time`,topDriver:`Top driver: {{model}} · {{total}} cumulative`,movingAverageHeading:`7-day average by model`,movingAverageSuffix:`avg`},cumulativeCost:{title:`Cumulative cost`,total:`Total: {{value}}`,cumulative:`Cumulative`,projection:`Projection`},tokensOverTime:{title:`Tokens over time`,subtitle:`All token types with 7-day avg`,allTypes:`Total tokens (all types)`,totalTokens:`Total tokens`,movingAverage:`7-day avg`,cacheTokens:`Cache tokens`,inputOutputTokens:`Input / Output tokens`,thinkingTokens:`Thinking tokens`,averageSuffix:`avg`},requestsOverTime:{title:`Requests over time`,subtitle:`Requests overall, by model, and with 7-day avg`,summary:`Total {{total}} · Peak {{peak}} on {{date}}`,averagePerUnit:`Avg / {{unit}}`,trend:`Trend avg`,movingAverage:`7-day avg`,trendHeading:`Moving average by model`,movingAverageHeading:`7-day average by model`,totalMovingAverage:`Total {{label}}`,requestsByModelTotal:`Requests by model total`,requestsInRange:`Requests in the selected range`,total:`Total`,topModel:`Top model`,topShare:`Top share`,totalRequestsSeries:`Total requests`},requestCacheHitRate:{title:`Cache hit rate by model`,subtitle:`Total {{total}} · 7-day avg {{trailing}}`,totalRate:`Total`,trailing7Rate:`7-day avg`,trendRate:`Trend avg`,topModel:`Top model`,models:`Models`,total:`Total`,timelineHeading:`Cache hit rate over time / {{unit}}`,modelBreakdownHeading:`Current model snapshot`},heatmap:{costTitle:`Cost heatmap`,requestsTitle:`Request heatmap`,tokensTitle:`Token heatmap`,cellLabel:`{{date}}: {{value}}`,costEmpty:`Cost heatmap is only available in daily view`,requestsEmpty:`Request heatmap is only available in daily view`,tokensEmpty:`Token heatmap is only available in daily view`,switchToDaily:`Switch to daily view for the calendar heatmap`,less:`Less`,more:`More`},tokenTypes:{title:`Token types`,subtitle:`Distribution of token types`,total:`Total`},modelMix:{title:`Model mix`,subtitle:`Cost share by model over time`},distribution:{title:`Distributions`,requiresData:`At least 2 data points are required in the current filter for distributions.`,costPerPeriod:`Cost per {{period}}`,requestsPerPeriod:`Requests per {{period}}`,tokensPerRequest:`Tokens per request`,interval:`Interval`,dataPoints:`Data points`,buckets:`Buckets`},correlation:{title:`Correlations`,requiresData:`At least 2 data points are required in the current filter for correlations.`,points:`{{count}} points`,requestsVsCost:`Requests vs. cost`,cacheVsCostPerRequest:`Cache rate vs. $/req`,requestsAxis:`Requests`,requestsLabel:`Requests`,tokensLabel:`Tokens`,costPerRequestAxis:`$/Req`,cost:`Cost`,costPerRequest:`Cost / req`,cacheRate:`Cache rate`,strongRequestCost:`Strong relationship: more requests visibly drive cost.`,mediumRequestCost:`Moderate relationship between load and cost.`,weakRequestCost:`Weak relationship: cost is driven more by model mix and token load.`,negativeCache:`Negative relationship: higher cache rate tends to reduce cost per request.`,neutralCache:`Little linear effect: cache helps, but is not the only driver.`,positiveCache:`Positive relationship: high cache rates do not automatically coincide with lower cost per request here.`},costByWeekday:{title:`Cost by weekday`,subtitle:`Peak: {{peak}} · Low: {{low}} · Weekend {{share}}`,averageCost:`Avg cost`},tokenEfficiency:{title:`Token efficiency ($/1M)`,subtitle:`Avg {{value}}/1M tokens`,series:`$/1M tokens`,movingAverage:`7D avg`}},risk:{title:`Concentration risk`,modelDependency:`Model dependency`,providerDependency:`Provider dependency`,high:`high`,medium:`medium`,low:`low`,modelHint:`HHI {{value}} · Higher values indicate a few dominant models.`,providerHint:`HHI {{value}} · Shows dependency on individual providers.`},requestQuality:{title:`Request quality`,tokensPerRequest:`Tokens / request`,costPerRequest:`Cost / request`,cachePerRequest:`Cache / request`,thinkingPerRequest:`Thinking / request`,tokensHint:`Average token load per request`,costHint:`Direct cost per request`,cacheHint:`Read cache tokens per request`,thinkingHint:`Thinking tokens per request`,requestDensity:`Request density`,averagePerActiveUnit:`Avg per active {{unit}}`,cacheHitRate:`Cache hit rate`,cacheHitHint:`Direct cache-read relative to all tokens`,inputOutput:`Input / Output`,inputOutputHint:`Drift between incoming and generated tokens`,topRequestModel:`Top request model`,noRequestLeader:`No request leader`},forecast:{noData:`No data available`,noForecast:`No forecast available`,requiresTwoDays:`At least 2 days with data are required`,avgMonthlyCost:`Avg monthly cost`,avgYearlyCost:`Avg yearly cost`,totalOverPeriods:`Total: {{total}} over {{count}} {{unit}}`,monthEndForecast:`Month-end forecast`,low:`low`,medium:`medium`,high:`high`,soFar:`So far: {{value}}`,remainingDays:`Days remaining: {{count}}`,projectedPerDay:`Forecast {{value}}/day`,vsLastWeek:`vs last week`,chartTitle:`Current month cost forecast`,chartSubtitle:`Month-end forecast based on smoothed calendar-day cost`,lowerBound:`Lower bound`,uncertaintyBand:`Uncertainty band`,actualCost:`Actual cost`,projection:`Forecast`},cacheRoi:{title:`Cache savings (ROI)`,noData:`No data available`,heuristicFallback:`For {{count}} {{modelsLabel}} without a configured price table, the ROI estimate uses a heuristic fallback.`,model:`model`,models:`models`,withoutCache:`Without cache`,withCache:`With cache`,withCacheActual:`With cache (actual)`,savings:`Savings`,avgCostPerUnit:`Avg cost/{{unit}}`,paid:`Paid`,saved:`Saved`},comparison:{title:`Period comparison`,notEnoughData:`Not enough data for a comparison`,requiresDays:`At least 7 days required (currently: {{count}})`,thisWeek:`This week`,lastWeek:`Last week`,thisMonth:`This month`,lastMonth:`Last month`,week:`Week`,month:`Month`,metric:`Metric`,delta:`Delta`,cost:`Cost`,tokens:`Tokens`,avgPerDay:`Avg/day`,cacheRate:`Cache rate`,days:`Days`},anomaly:{title:`Unusual {{period}}`,none:`No anomalies detected`,withinStdDev:`All costs are within 2 standard deviations`,description:`{{period}} with cost >2 standard deviations from the mean ({{mean}} +/- {{stdDev}})`,critical:`critical`},tables:{modelEfficiency:{title:`Model efficiency`,count:`{{count}} models`,topModel:`Top model`,mostEfficient:`Most efficient model`,totalRequests:`Total requests`,topModelTokens:`Top model tokens`,share:`{{value}} share`,perModel:`{{value}} / model`,more:`+{{count}} more`,model:`Model`,cost:`Cost`,tokens:`Tokens`,shareShort:`Share`,req:`Req`,reqShare:`Req %`,costPerReq:`$ / Req`,tokensPerReq:`Tokens / Req`,cacheShare:`Cache %`,thinkingShare:`Think %`,avgPerUnit:`Avg/{{unit}}`},providerEfficiency:{title:`Provider efficiency`,count:`{{count}} providers`,leadProvider:`Lead provider`,mostEfficient:`Most efficient provider`,totalRequests:`Total requests`,share:`{{value}} share`,perProvider:`{{value}} / provider`,avgPerUnit:`Avg/{{unit}}`,provider:`Provider`,cost:`Cost`,shareShort:`Share`,req:`Req`,tokens:`Tokens`,costPerReq:`$ / Req`,costPerMillion:`$/1M`,cacheShare:`Cache %`},recentDays:{daysDetail:`Recent days in detail`,monthsDetail:`Months in detail`,yearsDetail:`Years in detail`,showing:`Showing {{shown}} of {{total}} {{unit}}`,showLess:`Show less`,showAll:`Show all`,totalCost:`Total cost`,totalTokens:`Total tokens`,requests:`Requests`,cacheReadShare:`Cache read share`,peak:`Peak`,previousDay:`Previous day`,avg7d:`7D avg`,reqAvg:`Req avg`,date:`Date`,cost:`Cost`,tokens:`Tokens`,models:`Models`}},helpPanel:{projectLinks:{title:`Project links`,description:`Open the published npm package for v{{version}}, the GitHub repository, or the issue tracker.`,npm:`npm`,github:`GitHub`,issues:`GitHub Issues`},chartsAndFeatures:`Charts`,dashboardSectionsTitle:`Dashboard sections`,featuresTitle:`Features`,tablesTitle:`Tables`,metricLabels:{totalCost:`Total cost`,totalTokens:`Total tokens`,activeDays:`Active days`,topModel:`Top model`,cacheHitRate:`Cache hit rate`,costPerMillion:`Cost / 1M tokens`,mostExpensiveDay:`Most expensive day`,cheapestDay:`Cheapest day`,avgCostPerDay:`Avg cost / day`,outputTokens:`Output tokens`},chartLabels:{costOverTime:`Cost over time`,costByModel:`Cost by model`,costByModelOverTime:`Cost by model over time`,cumulativeCost:`Cumulative cost`,costByWeekday:`Cost by weekday`,tokensOverTime:`Tokens over time`,requestsOverTime:`Requests over time`,requestCacheHitRate:`Cache hit rate by model`,tokenTypes:`Token types`,tokenEfficiency:`Token efficiency`,modelMix:`Model mix`,distributionAnalysis:`Distributions`,correlationAnalysis:`Correlations`,heatmap:`Cost heatmap`,requestHeatmap:`Request heatmap`,tokenHeatmap:`Token heatmap`,forecast:`Forecast`,cacheROI:`Cache ROI`,providerLimitProgress:`Provider limit usage`,providerSubscriptionMix:`Provider subscriptions vs. API cost`,providerLimitTimeline:`Provider limits over time`,periodComparison:`Period comparison`,anomalyDetection:`Anomaly detection`,cellLabel:`{{date}}: {{value}}`},sectionLabels:{insights:`Insights`,metrics:`Metrics`,today:`Today`,currentMonth:`Month`,activity:`Activity`,forecastCache:`Forecast & Cache`,costAnalysis:`Cost analysis`,tokenAnalysis:`Token analysis`,requestAnalysis:`Request analysis`,advancedAnalysis:`Distributions & Risk`,comparisons:`Comparisons & Anomalies`,tables:`Tables`,limits:`Limits & Subscriptions`},featureLabels:{requestQuality:`Request quality`,providerLimits:`Limits & Subscriptions`,concentrationRisk:`Concentration risk`,providerEfficiency:`Provider efficiency`,modelEfficiency:`Model efficiency`,recentDays:`Periods in detail`}},autoImportModal:{title:`Toktrack auto import`,description:"Automatically imports local usage data via local `toktrack`, `bunx`, or `npm exec` and stores it only on this device.",connecting:`Connecting...`,checkingTool:`Checking {{tool}}...`,toolFound:`{{tool}} found ({{method}}, v{{version}})`,toolNotFound:`{{tool}} not found`,importedDays:`{{days}} days imported ({{cost}} USD)`,checkingPrerequisites:`Checking prerequisites...`,importingData:`Importing data...`,startingLocalImport:`Starting local toktrack import...`,loadingUsageData:`Loading usage data via {{command}}...`,processingUsageData:`Processing usage data... ({{seconds}}s)`,serverConnectionLost:`Lost connection to server.`,autoImportRunning:`An auto import is already running. Please wait.`,noRunnerFound:`No local toktrack, Bun, or npm exec found.`,errorPrefix:`Error: {{message}}`,loadedDays:`{{days}} days loaded ({{cost}} USD)`,errorOccurred:`An error occurred`,close:`Close`},commandPalette:{title:`Command palette`,description:`Keyboard-driven command menu for navigation and actions in the ttdash dashboard.`,placeholder:`Search commands...`,empty:`No command found.`,groups:{actions:`Actions`,filters:`Filters & View`,navigation:`Navigation`,view:`View`,language:`Language`,help:`Help`,providers:`Providers`,models:`Models`},commands:{autoImport:{label:`Start auto import`,description:`Run local toktrack import`},openSettings:{label:`Open settings`,description:`Manage backups, app options, and provider limits`},exportCsv:{label:`Export CSV`,description:`Export currently filtered data`},generateReport:{label:`Generate PDF report`,labelLoading:`Generating PDF report`,description:`Export currently filtered data as PDF`},upload:{label:`Upload JSON`,description:`Import toktrack or legacy JSON`},delete:{label:`Delete data`,description:`Remove local dataset`},viewDaily:{label:`Switch to daily view`,description:`Show data per day`},viewMonthly:{label:`Switch to monthly view`,description:`Show data per month`},viewYearly:{label:`Switch to yearly view`,description:`Show data per year`},preset7d:{label:`Range: last 7 days`,description:`Sets the date filter to 7 days`},preset30d:{label:`Range: last 30 days`,description:`Sets the date filter to 30 days`},presetMonth:{label:`Range: current month`,description:`Sets the date filter to the current month`},presetYear:{label:`Range: current year`,description:`Sets the date filter to the current year`},presetAll:{label:`Range: all data`,description:`Clears preset date filters`},clearProviders:{label:`Reset provider filter`,description:`Remove all active provider filters`},clearModels:{label:`Reset model filter`,description:`Remove all active model filters`},clearDates:{label:`Reset date filter`,description:`Remove start and end date`},resetAll:{label:`Reset all filters`,description:`Restore the default dashboard filter state`},scrollTop:{label:`Scroll to top`,description:`Jump to the top of the page`},scrollBottom:{label:`Scroll to bottom`,description:`Jump to the bottom of the page`},filters:{label:`Go to filters`,description:`Jump to the filter bar`},goToSection:{label:`Go to {{section}}`,description:`Jump to the {{section}} section`},insights:{label:`Go to insights`,description:`Jump to the executive summary`},metrics:{label:`Go to metrics`,description:`Jump to KPI cards`},today:{label:`Go to today`,description:`Jump to the current day KPIs`},month:{label:`Go to month`,description:`Jump to the current month KPIs`},activity:{label:`Go to activity`,description:`Jump to the activity heatmap`},forecastCache:{label:`Go to forecast & cache`,description:`Jump to forecast and cache ROI`},limits:{label:`Go to Limits & Subscriptions`,description:`Jump to the limits section`},charts:{label:`Go to cost analysis`,description:`Jump to cost charts`},tokenAnalysis:{label:`Go to token analysis`,description:`Jump to token charts and distributions`},requestAnalysis:{label:`Go to request analysis`,description:`Jump to requests over time and request distribution`},comparisons:{label:`Go to comparisons & anomalies`,description:`Jump to period comparison and unusual activity`},tables:{label:`Go to tables`,description:`Jump to detailed tables`},themeLight:{label:`Enable light mode`,description:`Switch between light and dark theme`},themeDark:{label:`Enable dark mode`,description:`Switch between light and dark theme`},languageGerman:{label:`Switch to German`,description:`Change the dashboard language to German`},languageEnglish:{label:`Switch to English`,description:`Change the dashboard language to English`},help:{label:`Open help & shortcuts`,description:`Open the help overview`}}},settings:{modal:{title:`Settings`,description:`Manage app backups, stored data, and provider limits in one place.`,languageTitle:`Dashboard language`,languageDescription:`Choose the language used in the dashboard UI, dialogs, and reports.`,dataStatus:`Data status`,lastLoaded:`Last loaded`,loadedVia:`Loaded via`,cliAutoLoad:`CLI auto-load`,defaultFiltersTitle:`Default dashboard filters`,defaultFiltersDescription:`Choose the filter state that should be applied when the dashboard opens or when filters are reset.`,defaultViewMode:`Default view mode`,defaultDateRange:`Default date range`,filterProviders:`Default provider filter`,filterModels:`Default model filter`,noModels:`No models found in the loaded report.`,sectionVisibilityTitle:`Visible dashboard sections`,sectionVisibilityDescription:`Control which sections are rendered in the dashboard and adjust their order.`,sectionOrderHint:`Drag sections to reorder them. The current order is the default dashboard layout.`,positionLabel:`Position {{position}} of {{total}}`,moveSectionUp:`Move {{section}} up`,moveSectionDown:`Move {{section}} down`,settingsBackupTitle:`Back up settings`,settingsBackupDescription:`Export and import language, theme, limits, and stored load metadata as a versioned backup.`,dataBackupTitle:`Back up data`,dataBackupDescription:`Export the locally stored usage state as a backup and import backups conservatively.`,dataImportPolicy:`Data import only adds missing days. Existing days with different values stay local and are reported as conflicts.`,dataImportReplaceHint:`If you want to fully replace the dataset, keep using the regular JSON upload in the header.`,providerLimitsTitle:`Provider limits`,providerLimitsDescription:`Define subscription and monthly limit per provider. Only providers from the currently loaded report can be edited.`,noProviders:`No providers found in the loaded report.`,exportSettings:`Export settings`,importSettings:`Import settings`,exportData:`Export data`,importData:`Import data`,close:`Close`,save:`Save`,viewModes:{daily:`Daily`,monthly:`Monthly`,yearly:`Yearly`},datePresets:{all:`All data`,"7d":`Last 7 days`,"30d":`Last 30 days`,month:`Current month`,year:`Current year`},sources:{file:`File upload`,"auto-import":`Auto import`,"cli-auto-load":`CLI auto-load`,unknown:`Unknown`}}},drillDown:{description:`Detailed {{periodType}} view with benchmarks, model breakdown, provider summary, and token distribution.`,cacheRate:`Cache rate`,tokensPerRequest:`Tokens / Req`,costPerRequest:`Cost / Req`,costRank:`Cost rank`,requestRank:`Request rank`,overview:`Overview`,benchmarks:`Benchmarks`,periodType:`Type: {{period}}`,coverage:`Coverage`,coverageDays:`{{count}} raw day`,coverageDays_other:`{{count}} raw days`,singlePeriod:`1 {{period}}`,activeProviders:`Active providers`,topRequestModel:`Top by requests`,topCostModel:`Top by cost`,topTokenModel:`Top by tokens`,priciestPerMillionModel:`Highest $/1M`,topCostShare:`Top 1 cost share`,topThreeCostShare:`Top 3 cost share`,modelBreakdown:`Model breakdown`,providerSummary:`Provider summary`,providerCount:`{{count}} provider`,providerCount_other:`{{count}} providers`,modelCount:`{{count}} model`,modelCount_other:`{{count}} models`,activeModelsCount:`{{count}} active model`,activeModelsCount_other:`{{count}} active models`,costShare:`Cost share`,tokenShare:`Token share`,costShareByModel:`Cost share by model`,costVsPrevious:`Cost vs. previous`,tokensVsPrevious:`Tokens vs. previous`,requestsVsPrevious:`Requests vs. previous`,costPerMillionVsPrevious:`$/1M vs. previous`,previousDay:`Previous day`,nextDay:`Next day`,previousPeriod:`Previous period`,nextPeriod:`Next period`,position:`{{current}} / {{total}}`,keyboardHint:`Use ← / →`,costVsAverageWindow:`Cost vs. {{window}} avg`,requestsVsAverageWindow:`Requests vs. {{window}} avg`,tokensVsAverageWindow:`Tokens vs. {{window}} avg`,costPerMillionVsAverageWindow:`$/1M vs. {{window}} avg`,windowUnit:{day:`D`,month:`M`,year:`Y`},tokenDistribution:`Token distribution`,requestCountShort:`{{count}} Req`,modelRequestSummary:`{{costPerRequest}}/Req · {{tokensPerRequest}}/Req`,noRequests:`No requests`,tokenSegments:{cacheRead:`Cache Read`,cacheWrite:`Cache Write`}},chartCard:{expandedDescription:`Expanded chart view with metric summary and optional CSV export.`,exportCsv:`Export CSV`},customTooltip:{total:`Total`,delta:`Delta`,vsPrevious:`vs. previous`,vsAverage:`vs. avg`},limits:{sectionTitle:`Limits & Subscriptions`,sectionDescription:`Budget risk separated from subscription impact in the current filter context`,providersBadge:`{{count}} providers`,warningBanner:`{{count}} providers have reached or exceeded their monthly limit in the current slice.`,cards:{atLimit:`Providers at limit`,nearLimit:`Near limit`,subscriptionVolume:`Subscription volume`,subscriptionValue:`Subscription value`,nearLimitHint:`from 80% utilization`,subscriptionVolumeHint:`fixed cost / month`,subscriptionValueHint:`usage above subscription`,noMonth:`No month`},statuses:{limitExceeded:`Limit exceeded`,budgetTight:`Budget tight`,budgetStable:`Budget stable`,noLimit:`No limit set`,noSubscription:`No subscription`,subscriptionPaysOff:`Subscription pays off`,belowSubscription:`Still below subscription`},badge:{limit:`{{value}}% Limit`,subscription:`{{value}}% Sub`,open:`Open`},tracks:{budgetTitle:`Budget status by provider`,budgetSubtitle:`Each track shows the remaining distance to the limit or the already incurred overrun for each provider`,budgetNoMonth:`No month in the current slice`,subscriptionTitle:`Subscription status by provider`,subscriptionSubtitle:`Each track shows the remaining distance to break-even or the already realized value for each provider`,subscriptionNoMonth:`No month in the current slice`,portfolioTitle:`Portfolio trend`,portfolioSubtitle:`Monthly trend of usage, configured limits, and subscription impact`,usage:`Usage`,limit:`Limit`,limits:`Limits`,subscription:`Subscription`,subscriptions:`Subscriptions`,breakEven:`Break-even`,currentlyUsed:`Currently used`,remainingToLimit:`Remaining to limit`,alreadyOverLimit:`Already over`,remainingToBreakEven:`Remaining to break-even`,alreadyAboveBreakEven:`Already above`,usageFocusMonth:`Focus month cost`,limitSubscription:`Limit / Subscription`,budgetRisk:`Budget risk`,subscriptionEffect:`Subscription effect`,stillToLimit:`{{value}} remaining to limit`,alreadyAboveLimit:`{{value}} above limit`,stillToBreakEven:`{{value}} remaining to break-even`,alreadyAboveBreakEvenText:`{{value}} above break-even`,noSubscriptionSet:`No subscription set`},modal:{title:`Provider limits`,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.`,dataStatus:`Data status`,lastLoaded:`Last loaded`,loadedVia:`Loaded via`,cliAutoLoad:`CLI auto-load`,noProviders:`No providers found in the loaded report.`,hasSubscription:`Subscription enabled`,subscriptionPerMonth:`Subscription $/month`,monthlyLimit:`Monthly limit $`,close:`Close`,save:`Save`,sources:{file:`File upload`,"auto-import":`Auto import`,"cli-auto-load":`CLI auto-load`,unknown:`Unknown`}}},report:{title:`TTDash Report`,common:{notAvailable:`n/a`},header:{eyebrow:`TTDash PDF Report`},summary:{peakPeriod:`Peak period`},sections:{overview:`Overview`,insights:`Key insights`,filters:`Filters`,modelsProviders:`Models & Providers`,recentPeriods:`Recent periods`,interpretation:`Interpretation`},fields:{dateRange:`Date range`,view:`View`,generated:`Generated`,month:`Month`,selectedProviders:`Selected providers`,selectedModels:`Selected models`,startDate:`Start date`,endDate:`End date`},filters:{all:`All`,noFilter:`No filter`,andMore:`+{{count}} more`},tables:{topModels:`Top models`,providers:`Providers`,columns:{model:`Model`,provider:`Provider`,cost:`Cost`,tokens:`Tokens`,requests:`Requests`,period:`Period`}},charts:{costTrend:`Cost trend`,topModels:`Top models by cost`,tokenTrend:`Token mix by period`,costTrendAlt:`Line chart showing report cost by period.`,costTrendSummary:`Latest {{latest}}. Peak {{peak}} on {{date}}.`,topModelsAlt:`Horizontal bar chart comparing the highest-cost models in the report.`,topModelsSummary:`{{model}} leads with {{cost}} and {{share}} of report cost.`,topModelsFullNames:`Full chart labels: {{names}}.`,tokenTrendAlt:`Stacked bar chart showing the token mix for each report period.`,tokenTrendSummary:`Total {{total}}. Peak token volume {{peak}} on {{date}}.`,noDataSummary:`Not enough data for a stable chart summary.`},interpretation:{summary:`This report covers {{days}} raw days and {{periods}} aggregated periods. Peak period: {{peak}}. Top model: {{topModel}}. Leading provider: {{topProvider}}.`,footer:`Created with TTDash v{{version}} and server-side Typst compilation.`},insights:{coverageTitle:`Data coverage`,coverageBody:`This report is based on a narrow slice of data with {{days}} raw days and {{periods}} aggregated periods. Treat trend statements cautiously.`,providerTitle:`Provider concentration`,providerBody:`{{provider}} accounts for {{share}} of total report cost.`,cacheTitle:`Cache contribution`,cacheBody:`Cache reads contribute {{share}} of token activity in the selected period.`,peakWindowTitle:`Peak 7-day window`,peakWindowBody:`The strongest rolling 7-day window ran from {{start}} to {{end}} with {{cost}} total cost.`}},api:{fetchUsageFailed:`Failed to load data`,fetchSettingsFailed:`Failed to load settings`,uploadFailed:`Upload failed`,deleteFailed:`Delete failed`,deleteSettingsFailed:`Failed to reset settings`,importUsageFailed:`Data import failed`,importSettingsFailed:`Settings import failed`,saveSettingsFailed:`Failed to save settings`,pdfFailed:`PDF generation failed`},toasts:{fileLoaded:`File {{name}} loaded successfully`,fileReadFailed:`Could not read file`,dataDeleted:`Data deleted`,csvExported:`CSV exported`,dataImported:`Data imported successfully`,settingsExported:`Settings backup exported`,dataExported:`Data backup exported`,noDataToExport:`No data available to export`,settingsImported:`Imported settings from {{name}}`,settingsReset:`Settings reset`,settingsSaved:`Settings saved`,dataBackupImported:`Backup imported: added {{added}} new days, skipped {{unchanged}} identical days`,dataBackupImportedWithConflicts:`Backup imported: added {{added}} new days, kept {{conflicts}} conflicting days local`}},te=[`de`,`en`],ne={de:`de-CH`,en:`en-US`};function Q(e){return e===`en`?`en`:`de`}async function re(t=`de`){let n=Q(t);X.isInitialized?X.resolvedLanguage!==n&&await X.changeLanguage(n):await X.use(e).init({resources:{de:{common:Z},en:{common:ee}},lng:n,fallbackLng:`de`,defaultNS:`common`,ns:[`common`],interpolation:{escapeValue:!1}}),typeof document<`u`&&(document.documentElement.lang=n)}X.on(`languageChanged`,e=>{typeof document<`u`&&(document.documentElement.lang=e)});function $(){return Q(X.language)}function ie(){return ne[$()]}var ae=X;export{re as a,ae as i,$ as n,ie as r,te as t};