@analitikisler/ai-tag-debugger 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/i18n.js CHANGED
@@ -32,18 +32,11 @@ const en = {
32
32
  eyebrow: "AI tracking audit",
33
33
  paramsShort: "params",
34
34
  noParameters: "No parameters.",
35
- pushMatchHint: "dataLayer pushes in this step with the same event name.",
36
35
  noMatchingPush: "No dataLayer push with this event name in this step. The tag may fire from a page view, a click trigger or a hardcoded pixel.",
37
- otherInStep: "Other dataLayer pushes and network calls",
38
36
  noHits: "No tracking events",
39
- hasProblems: "Has problems",
40
- stepsShort: "steps",
41
- eventsShort: "events",
42
- problemsShort: "problems",
43
37
  findings: "Findings",
44
38
  what: "What",
45
39
  where: "Where",
46
- causeAndFix: "Cause and fix",
47
40
  likelyCause: "Likely cause",
48
41
  gtmTags: "In your GTM container",
49
42
  gtmNoTag: "No tag in the container export sends this event.",
@@ -57,14 +50,10 @@ const en = {
57
50
  fix: "Fix",
58
51
  captured: "Captured",
59
52
  noProblems: "No problems found.",
60
- noExplanation: "No model explanation in this run. The consequence, owner and fix below do not need one.",
61
- matchingPlan: "Matching the plan",
62
53
  timeline: "Journeys and event timeline",
63
- timelineLead: "Every step of every journey. Events are grouped by platform; open one to see its parameters, the dataLayer push behind it and the network request that carried it. Steps with problems are open.",
64
54
  completed: "Completed",
65
55
  notCompleted: "Not completed",
66
56
  step: "step",
67
- trackingHits: "Tracking hits",
68
57
  dataLayer: "dataLayer pushes",
69
58
  network: "Network calls",
70
59
  platform: "Platform",
@@ -74,8 +63,6 @@ const en = {
74
63
  method: "Method",
75
64
  status: "Status",
76
65
  vendor: "Vendor",
77
- blockedNote: "blocked by this audit: answered locally, never reached the vendor",
78
- blockedNoteVendor: (vendor) => `blocked by this audit: answered locally, never reached ${vendor}`,
79
66
  clickedThrough: "clicked through an overlapping element",
80
67
  generatedBy: "Generated by AI Tag Debugger",
81
68
  nothing: "None",
@@ -84,48 +71,31 @@ const en = {
84
71
  acceptedLine: (n) => (n === 1 ? "1 accepted finding from the baseline is not counted" : `${n} accepted findings from the baseline are not counted`),
85
72
  whereStep: (journey, viewport, step) => `${journey} (${viewport})${step ? `, step "${step}"` : ""}`,
86
73
  allGood: "All planned events fired correctly on every journey tested.",
87
- tabEvents: "Events",
88
- tabTimeline: "Timeline",
89
- timelineGtmEvent: "GTM event",
90
- timelineConsent: "Consent command",
91
- timelineNoEvent: "No GTM event (data only)",
92
- timelineNoHits: "No platform hit followed this push.",
93
- timelineOther: "Hits without a dataLayer push",
94
74
  bodyDropped: "Request body not stored: this audit reached its 2 MB limit for stored request bodies.",
95
75
  tabNetwork: "Network requests",
96
- filterBy: "Filter by source",
97
76
  all: "All",
98
77
  items: "Items",
99
78
  customItemParams: "Custom item parameters",
100
- itemsCount: (n) => `${n} ${n === 1 ? "item" : "items"}`,
101
79
  noItems: "no items",
102
80
  serverSideTag: "server-side",
103
81
  source: "Source",
104
82
  request: "Request",
105
- noRequest: "No matching request",
106
83
  noPushes: "No dataLayer pushes in this step.",
107
84
  noRequests: "No requests to the chosen providers in this step.",
108
85
  eventParams: "Event parameters",
109
86
  contextParams: "Session, device, page and consent parameters",
110
87
  rawRequest: "Raw request",
111
- rawJson: "Raw JSON",
112
88
  inBatch: (i, n) => `${i} of ${n} in one request`,
113
89
  impact: "Impact",
114
90
  evidence: "Evidence",
115
91
  fixSteps: "Fix",
116
92
  verify: "How to verify",
117
93
  owners: { developer: "Developer", gtm: "Tag Manager", marketing: "Marketing" },
118
- ownerHint: { developer: "Site code and dataLayer", gtm: "Tags, triggers and consent setup", marketing: "The measurement plan" },
119
94
  places: (n) => `${n} ${n === 1 ? "place" : "places"}`,
120
95
  alsoCheck: "Not in the findings list, but worth checking",
121
- providersChecked: "Providers checked:",
122
- outOfScope: (list, n) => `Out of scope: ${list} (${n} ${n === 1 ? "request" : "requests"} skipped)`,
123
96
  skippedInStep: (list, n) => `Only requests to the chosen providers are shown. ${n} out-of-scope ${n === 1 ? "request was" : "requests were"} skipped in this step: ${list}.`,
124
- tabOverview: "Overview",
125
97
  tabJourneys: "Journeys",
126
- tabScope: "Scope and plan",
127
98
  sections: "Report sections",
128
- headerMeta: (journeys, providers) => `${journeys} ${journeys === 1 ? "journey" : "journeys"} · ${providers} ${providers === 1 ? "provider" : "providers"}`,
129
99
  checkedAgainst: (id) => `Checked against plan ${id}`,
130
100
  planChangesLine: (pc) => (pc.same ? `Plan unchanged since ${pc.previous}` : `Plan changed since ${pc.previous}: ${pc.added.length} added, ${pc.removed.length} removed, ${pc.changed.length} changed`),
131
101
  planVsSite: "Plan vs. site",
@@ -133,22 +103,15 @@ const en = {
133
103
  changesLead: (id, mode) => `Compared with run ${id}, by ${mode === "plan" ? "plan coverage" : "health findings"}`,
134
104
  changesLine: (ch) => ch.fixed.length || ch.new.length ? [ch.fixed.length ? `${ch.fixed.length} ${ch.mode === "plan" ? (ch.fixed.length === 1 ? "event" : "events") : (ch.fixed.length === 1 ? "problem" : "problems")} fixed` : "", ch.new.length ? `${ch.new.length} new ${ch.new.length === 1 ? "problem" : "problems"}` : ""].filter(Boolean).join(", ") : "No changes since the last run",
135
105
  changeFixed: "Fixed",
136
- changeWas: (what) => `was: ${what}`,
137
106
  changeNew: "New",
138
107
  noSavedRun: "No saved run for this site yet. Run `aitd run` first; each run is compared with the one before it.",
139
108
  routeChanged: (list) => `The AI took a different route through the site than in the last run: ${list}`,
140
109
  noPreviousRun: "This is the first saved run for this site, so there is nothing to compare yet.",
141
- planVsSiteLead: "Each planned event, and what the site actually sent",
142
110
  coverageLine: (c) => `Coverage ${c.implemented} of ${c.checkable}${c.percent === null ? "" : ` (${c.percent}%)`}${c.not_checked ? `, ${c.not_checked} ${c.not_checked === 1 ? "event" : "events"} not checked` : ""}`,
143
111
  bucket: { implemented: "Implemented", missing: "Missing", missing_params: "Missing params", wrong_values: "Wrong values", unplanned: "Unplanned", not_checked: "Not checked" },
144
112
  bucketCol: "Result",
145
- summaryLead: "AI summary, most important first",
146
- noSummary: "No model summary in this run. The verdict and the findings below stand on their own.",
147
- seeAllFindings: "See all findings →",
148
113
  journey: "Journey",
149
114
  stepsCol: "Steps",
150
- problemsCol: "Problems",
151
- scopeCard: "Scope",
152
115
  site: "Site",
153
116
  runCard: "This run",
154
117
  runPlatforms: "Platforms",
@@ -166,45 +129,32 @@ const en = {
166
129
  junitSite: "site",
167
130
  consentDefault: "Default",
168
131
  consentUpdate: "Update",
169
- consentLead: "Consent Mode commands the site sent, in order.",
170
- consentNone: "The site sent no Consent Mode commands on this journey.",
171
132
  scenarios: "Consent scenarios",
172
- scenariosLead: (cmp) => `The home page was opened once per consent choice, answered through ${cmp === "banner" ? "the banner's buttons" : cmp}. Each cell is how many hits the tag sent after that choice. A red number is data the visitor had refused.`,
173
133
  scenarioCols: { before: "No choice yet", accept: "Accept all", reject: "Reject all", analytics: "Analytics only" },
174
134
  scenarioNotRun: "Not supported here",
175
135
  scenarioTag: "Tag",
176
136
  skippedLine: (list, n) => `${n} out-of-scope ${n === 1 ? "request was" : "requests were"} skipped: ${list}.`,
177
- findingHint: "Open a finding to see its likely cause, evidence and fix steps.",
178
- spread: (j, s) => `${j} ${j === 1 ? "journey" : "journeys"}${s ? ` · ${s} ${s === 1 ? "step" : "steps"}` : ""}`,
179
137
  chooseJourney: "Choose a journey",
180
- stepsNav: "Steps",
181
- stepMeta: (t, events, pushes, skipped) => `${t} · ${events} ${events === 1 ? "event" : "events"} · ${pushes} dataLayer${skipped ? ` · ${skipped} out-of-scope ${skipped === 1 ? "request" : "requests"} skipped` : ""}`,
182
138
  noSteps: "This journey has no steps.",
183
139
  planCoverage: "Measurement plan coverage",
184
- planCoverageLead: "Whether each planned event was sent on each journey",
185
- coverageLegend: "✓ sent · ✗ not sent · – not expected on this journey",
186
140
  notChecked: "not checked",
187
141
  noPlan: "No measurement plan was given, so there is nothing to compare against.",
188
142
  providers: "Providers",
189
143
  inventoryTitle: "Tag inventory",
190
- inventoryLead: "Every vendor the site sent requests to, and where",
191
144
  vendorCol: "Vendor",
192
145
  partyCol: "Party",
193
146
  pagesCol: "Pages",
194
147
  cookiesCol: "Cookies",
195
148
  party: { first: "First party", third: "Third party", both: "Both" },
196
- morePages: (n) => `+${n} more`,
197
149
  otherCookies: "Other cookies",
198
150
  noInventory: "No vendor requests were recorded.",
199
151
  provider: "Provider",
200
- requestsCol: "Requests",
201
152
  checked: "Checked",
202
153
  outOfScopeStatus: "Out of scope",
203
154
  missing: "missing",
204
155
  requestTo: (p) => `${p} request`,
205
156
  by: "by",
206
157
  credit: (atd) => `This report was made with the open source ${atd}.`,
207
- timelineLeadV2: "Every step has three tabs: the events it sent, its dataLayer pushes and its network requests. Events and requests can be filtered by source. Steps with problems are open.",
208
158
  // The run history (src/history.js): the trend lines after a run, in the alert and in `aitd history`.
209
159
  history: {
210
160
  noRuns: "No saved run for this site yet. Run `aitd run` first; the trend starts with the second run.",
@@ -502,34 +452,23 @@ const en = {
502
452
  themeLight: "Theme: light",
503
453
  themeDark: "Theme: dark",
504
454
  newTab: "opens in a new tab",
505
- ownerSplit: (parts) => `${parts.join(", ")}.`,
506
- forOwner: { developer: (n) => `${n} for the developer`, gtm: (n) => `${n} for Tag Manager`, marketing: (n) => `${n} for marketing` },
507
455
  aiSummary: "AI summary",
508
456
  platformsChecked: "Platforms checked",
509
457
  campaignCheck: "Campaign check",
510
- campaignChecked: "UTM, gclid and fbclid on the landing page",
511
- consentModeOn: "consent mode on",
512
458
  consentModeSeen: "Consent Mode commands seen",
513
459
  cmpBanner: "banner",
514
460
  scenariosRun: (n) => `${n} ${n === 1 ? "scenario" : "scenarios"}`,
515
461
  runsAllCompleted: (n) => `${n} ${n === 1 ? "run" : "runs"}, all completed`,
516
462
  runsCompleted: (done, n) => `${done} of ${n} runs completed`,
517
- fixFirst: "What to fix first",
518
- fixFirstLead: "Grouped by who fixes it, most points first. Each line opens its finding.",
519
- pointsToRecover: (n) => `+${n} points when fixed`,
520
- nothingFor: (owner) => `Nothing for ${owner} in this run.`,
521
463
  moreInFindings: (n) => `${n} more in Findings →`,
522
464
  working: "What is working",
523
465
  whatWasChecked: "What was checked",
524
466
  nothingVerified: "Nothing was verified in this run.",
525
- coverageVerified: (done, total, pct) => `${done} of ${total} planned events verified${pct === null ? "" : ` (${pct}%)`}.`,
526
467
  allRuns: (n) => `all ${n} runs`,
527
468
  onlyOn: (places) => `${places.join(", ")} only`,
528
- journeysLead: "Steps walked, hits captured and the problem cards that point at each run.",
529
469
  viewport: "Viewport",
530
470
  hitsCol: "Hits",
531
471
  trend: "Trend",
532
- trendLead: "Problem counts over the saved runs, oldest left. A hollow point is a run where a journey did not finish.",
533
472
  trendDirection: { improving: "Improving", worsening: "Getting worse", flat: "No change" },
534
473
  trendSpan: (n, first, last) => `over ${n} runs, ${first} to ${last}`,
535
474
  runIncomplete: "a journey did not finish",
@@ -538,10 +477,6 @@ const en = {
538
477
  openLongest: "Open longest",
539
478
  openSince: (date, runs, places) => `open since ${date} · ${runs} ${runs === 1 ? "run" : "runs"} · ${places} ${places === 1 ? "place" : "places"}`,
540
479
  score: "Data quality score",
541
- scoreLead: "100 minus 15 per broken problem, 10 per risk and 5 per warning, doubled on a conversion event.",
542
- scoreLost: (n) => `${n} points lost`,
543
- findingsLead: "Open a finding for its evidence, where it happened and how to verify the fix.",
544
- okInOverview: (n) => `${n} OK ${n === 1 ? "result is" : "results are"} listed in the overview.`,
545
480
  noModel: "No model explanation in this run. The evidence, owner and verify links below do not need one.",
546
481
  accepted: "Accepted",
547
482
  acceptedNote: "This finding is in the baseline: it is known and does not count against the run.",
@@ -550,44 +485,28 @@ const en = {
550
485
  findingLink: "Finding →",
551
486
  consentMode: "Consent Mode",
552
487
  consentTiming: (ms, before, v2, missing) => `Default set ${ms === null ? "on the first page" : `${Math.round(ms)} ms into the first page`}${before === null ? "" : before ? ", before the first Google hit" : ", after the first Google hit"} · v2 signals ${v2 ? "present" : `missing: ${missing.join(", ")}`}.`,
553
- consentNoDefault: "No Consent Mode default was pushed on this journey.",
554
- consentResent: (n) => `The default and the update are re-sent on ${n} more ${n === 1 ? "page load" : "page loads"}, so the stored choice is restored each time.`,
555
- consentOnHit: "Consent on this hit:",
556
- scenariosLead: (cmp) => `The home page was opened once per consent choice, answered through ${cmp === "banner" ? "the banner's buttons" : cmp}. Each cell is how many hits the tag sent after that choice.`,
557
- scenariosLegend: "A marked number is data the visitor had refused. \"cookieless\" is a Consent Mode ping with storage denied, which is allowed.",
558
488
  cellCookieless: "cookieless",
559
489
  cellAdDenied: "ad storage denied",
560
490
  cellWithCookies: "with cookies",
561
491
  cellProblem: "problem:",
562
492
  cellShouldNot: "should not have been sent",
563
- stepsTitle: "Steps and the hits each one sent",
564
- stepsLead: "Open a row for the parameters, the dataLayer pushes and the requests. Rows with a finding are open.",
565
- stepCol: "Step",
566
493
  timeCol: "Time",
567
- hasFinding: (sev) => `has a ${sev.toLowerCase()} finding`,
568
- stepDetails: (hits, pushes) => `Details · ${hits} ${hits === 1 ? "hit" : "hits"} · ${pushes} dataLayer`,
569
494
  hitsInStep: "Hits in this step",
570
495
  blockedBy: (platform) => `blocked by the audit: answered locally, never reached ${platform}`,
571
496
  problems: (n) => `${n} ${n === 1 ? "problem" : "problems"}`,
572
497
  funnel: "Expected vs observed",
573
498
  funnelLead: (observed, expected, ok) => `${observed} of ${expected} expected events fired, ${ok} with every required parameter.`,
574
- funnelBreaks: (event) => `The funnel breaks at ${event}.`,
575
499
  conversion: "conversion",
576
500
  sent: "sent",
577
501
  notSent: "not sent",
578
- firstAt: "First at",
579
502
  page: "Page",
580
503
  params: (list) => `without ${list.join(", ")}`,
581
504
  paramsShort: "params",
582
505
  parity: "Platform parity",
583
- parityLead: "The same event on two platforms, and what differs between them.",
584
506
  perPlatform: "Per platform",
585
- difference: "Difference",
586
507
  agree: "agree",
587
508
  mismatch: { count: "count differs", value: "value differs", currency: "currency differs", value_missing: "value on one side only" },
588
- onlyOnPlatform: "Only on one platform:",
589
509
  detailsCol: "Details",
590
- coverageLegend: "✓ sent with its parameters · params: sent without required parameters · ✗ not sent · – not expected on this journey",
591
510
  needs: (list) => `needs ${list.join(", ")}`,
592
511
  notExpected: "not expected",
593
512
  conversions: "Conversion integrity",
@@ -598,15 +517,204 @@ const en = {
598
517
  pass: "pass",
599
518
  fail: "fail",
600
519
  notApplicable: "not applicable",
601
- seenOn: "Seen on",
602
520
  checkedNotSeen: "Checked, not seen",
603
521
  neverSeen: (list) => `Checked but never seen: ${list}. No request reached them on any page.`,
604
522
  timing: "Timing",
605
- timingLead: "How long each run took and how far behind each step its first hit came. Includes the audit's own waiting time.",
606
523
  duration: "Duration",
607
524
  medianFirstHit: "Median first hit",
608
525
  slowestHit: "Slowest hit",
609
526
  planChanges: "Plan changes",
527
+
528
+ // ---- html.shell: top bar, rail, section tools and footer of src/html/shell.js ----
529
+ shell: {
530
+ skip: "Skip to the report",
531
+ eyebrow: "Tracking audit",
532
+ heading: (site) => `Tracking audit of ${site}`,
533
+ railLabel: "Report sections",
534
+ sections: { summary: "Summary", findings: "Findings", journeys: "Journeys", consent: "Consent", coverage: "Coverage", inventory: "Inventory", run: "Run" },
535
+ railTip: (label, token) => `${label} · ${token}`,
536
+ collapse: "Collapse sidebar",
537
+ expand: "Expand sidebar",
538
+ expandAll: "Expand all",
539
+ collapseAll: "Collapse all",
540
+ clear: "Clear",
541
+ filterCount: (shown, total) => `${shown} of ${total}`,
542
+ score: "Score",
543
+ outOf: "/100",
544
+ scoreLabel: (score, verdict) => `Score ${score} of 100, verdict ${verdict}`,
545
+ noScore: (verdict) => `No score, verdict ${verdict}`,
546
+ themeAuto: "Theme: follows your system",
547
+ themeLight: "Theme: light",
548
+ themeDark: "Theme: dark",
549
+ },
550
+ // ---- end of html.shell ----
551
+
552
+ // ---- html.summary: strings of src/html/summary.js, edited only by its builder ----
553
+ summary: {
554
+ about: "About this run",
555
+ events: "Events checked",
556
+ noPlan: "No measurement plan given",
557
+ plannedSeen: (planned, seen) => `${planned} <small>planned</small> · ${seen} <small>seen</small>`,
558
+ withParams: (percent) => `${percent}% with required parameters`,
559
+ seen: "seen",
560
+ notSeen: "not seen",
561
+ seenOf: (seen, total) => `${seen} of ${total} seen`,
562
+ noRuns: "No journey ran",
563
+ runState: { completed: "completed", incomplete: "incomplete" },
564
+ steps: (n) => `${n} ${n === 1 ? "step" : "steps"}`,
565
+ hits: (n) => `${n} ${n === 1 ? "hit" : "hits"}`,
566
+ problems: (n) => `${n} ${n === 1 ? "problem" : "problems"}`,
567
+ completedOf: (done, total) => `${done} of ${total} completed`,
568
+ stoppedAt: (step) => `stopped at step ${step}`,
569
+ // chip is HTML (the consent state chip, with its leading space); range is "27–53" or null when no timing was seen.
570
+ defaultAt: (chip, range) => `Default${chip}${range === null ? "" : ` <small>at ${range} ms</small>`}`,
571
+ noDefault: "No default seen",
572
+ mixed: "mixed",
573
+ noBanner: "No banner found",
574
+ bannerNotReached: "Banner not reached",
575
+ scripted: "Scripted, no model",
576
+ deterministic: "Deterministic checks only",
577
+ explains: "Explains causes and fixes",
578
+ seconds: (s) => `${s} s`,
579
+ runs: (n) => `${n} ${n === 1 ? "run" : "runs"}`,
580
+ more: (n) => `${n} more`,
581
+ moreInFindings: (n) => `${n} more in Findings`,
582
+ // The score's cost lines; event and params arrive as HTML (<code>).
583
+ cost: {
584
+ missingParams: (event, params) => `${event} sent without ${params}`,
585
+ missingParamsAny: (event) => `${event} sent without its required parameters`,
586
+ beforeConsent: (event) => `${event} sent before consent`,
587
+ afterReject: (event) => `${event} sent after reject all`,
588
+ duplicate: (event, n) => (n ? `${event} sent ${n} times per click` : `${event} sent more than once per click`),
589
+ missingEvent: (event) => `${event} never sent`,
590
+ stopped: (step, runs) => (step === null ? "Journeys stopped early" : `${runs === 1 ? "Journey" : "Journeys"} stopped at step ${step}`),
591
+ noConsentDefault: "No Consent Mode default",
592
+ },
593
+ },
594
+ // ---- end of html.summary ----
595
+
596
+ // ---- html.findings: strings of src/html/findings.js, edited only by its builder ----
597
+ findings: {
598
+ severity: "Severity",
599
+ filterLabel: "Filter findings",
600
+ search: "Search",
601
+ searchLabel: "Search findings: event, parameter, page",
602
+ filters: "Filters",
603
+ groups: { failed: "Failed", unverified: "Unverified", passed: "Passed" },
604
+ empty: "No finding matches these filters.",
605
+ details: (title) => `${title}: details`,
606
+ runs: (n) => `${n} runs`,
607
+ showWhere: "Show where",
608
+ // Short row titles, at most eight words; event and parameter names are quoted and shown as code.
609
+ title: {
610
+ missing_params: (event, params) => `${q(event)} was sent without ${andList(sortParams(params).map(q), "and")}`,
611
+ duplicate: (event, n) => `${q(event)} was sent ${n} times per action`,
612
+ before_consent: (event) => `${q(event)} was sent before the consent choice`,
613
+ after_reject: (event) => `${q(event)} was still sent after Reject all`,
614
+ missing_event: (event) => `${q(event)} was not sent`,
615
+ consent_default_missing: () => "No Consent Mode default was set",
616
+ journey_incomplete: (step) => (step === null ? "The journey did not finish" : `The journey stopped at step ${step}`),
617
+ },
618
+ notReached: "not reached",
619
+ passed: {
620
+ campaign: "Campaign parameters survived the redirect",
621
+ coverage: (done, total, percent) => `${done} of ${total} planned events complete${percent === null ? "" : ` (${percent}%)`}`,
622
+ consentDefault: (onTime) => (onTime ? "Consent Mode default set before the first Google hit" : "Consent Mode default set"),
623
+ conversion: (event, amount) => `${q(event)} carried ${amount}`,
624
+ },
625
+ fineOn: (place, amount) => `Fine on ${place}${amount ? `: ${amount}` : ""}`,
626
+ pushLacks: (params) => `The dataLayer push already lacks ${andList(sortParams(params).map(q), "and")}.`,
627
+ pushCarries: "The dataLayer push carries them; the tag drops them.",
628
+ pushRaw: "dataLayer push",
629
+ perAction: (n) => `${n} ${n === 1 ? "time" : "times"} per action`,
630
+ noSignal: "no signal",
631
+ stillSent: "still sent",
632
+ stopped: "stopped",
633
+ stoppedAt: "Stopped at",
634
+ error: "Error",
635
+ defaultIn: (present, total) => `default in ${present} of ${total} runs`,
636
+ replay: "Replay",
637
+ ai: "The model's explanation",
638
+ noModel: "No model explanation in this run.",
639
+ },
640
+ // ---- end of html.findings ----
641
+
642
+ // ---- html.journeys: strings of src/html/journeys.js, edited only by its builder ----
643
+ journeys: {
644
+ steps: "Steps",
645
+ pickViewport: "Viewport",
646
+ dataLayer: "Data Layer",
647
+ startStep: "Before the first step",
648
+ stats: (steps, hits, secs) => `${steps} ${steps === 1 ? "step" : "steps"} · ${hits} ${hits === 1 ? "hit" : "hits"}${secs === null ? "" : ` · ${secs} s`}`,
649
+ noRuns: "No journey was run.",
650
+ nothing: "Nothing was sent in this step.",
651
+ noSignal: "no signal",
652
+ noSignalTitle: "No consent signal on this hit",
653
+ signals: { ad_storage: "ad", analytics_storage: "an", ad_user_data: "ud", ad_personalization: "ap" },
654
+ blocked: "blocked",
655
+ clear: "clear",
656
+ colUrl: "URL",
657
+ colId: "ID",
658
+ colName: "Name",
659
+ colPrice: "Price",
660
+ colQty: "Qty",
661
+ itemMore: "Item parameters",
662
+ hitsOf: (count, platform) => `${count} ${platform} ${count === 1 ? "hit" : "hits"}`,
663
+ stepOf: (i) => `Step ${i}`,
664
+ },
665
+ // ---- end of html.journeys ----
666
+
667
+ // ---- html.consent: strings of src/html/consent.js, edited only by its builder ----
668
+ consent: {
669
+ statusLabel: "Consent status per platform",
670
+ cols: { before: "No choice", accept: "Accept", reject: "Reject", analytics: "Analytics only" },
671
+ state: { denied: "denied", granted: "granted", none: "no signal" },
672
+ tally: (n, state) => `${n} · ${state}`,
673
+ scenarios: "Scenarios",
674
+ notSupported: "not supported",
675
+ sent: "Sent",
676
+ problems: (n) => `${n} ${n === 1 ? "problem" : "problems"}`,
677
+ noProblems: "No problems",
678
+ defaultFirst: "Default first",
679
+ defaultLate: "Default late",
680
+ noDefault: "No default",
681
+ v2: "v2",
682
+ v2Missing: "v2 missing",
683
+ timing: (lo, hi) => (lo === hi ? `${lo} ms` : `${lo}–${hi} ms`),
684
+ runsWith: (k, n) => (k === n ? `${n} ${n === 1 ? "run" : "runs"}` : `${k} of ${n} runs`),
685
+ resent: (n) => `Sent again on ${n} more page ${n === 1 ? "load" : "loads"}`,
686
+ },
687
+ // ---- end of html.consent ----
688
+
689
+ // ---- html.scope: strings of src/html/scope.js, edited only by its builder ----
690
+ scope: {
691
+ ofEvents: (n, total) => `${n} of ${total}`,
692
+ problemPoints: "Problem points",
693
+ barLabel: (ok, params, missing) => `${ok} complete, ${params} with a missing parameter, ${missing} not sent`,
694
+ missingParams: (n) => `${n} missing params`,
695
+ notSentCount: (n) => `${n} not sent`,
696
+ notCheckedCount: (n) => `${n} not checked`,
697
+ searchEvents: "Search events",
698
+ needs: "Needs",
699
+ keyOk: "sent with its parameters",
700
+ keyParams: "a required parameter is missing",
701
+ keyMissing: "never sent",
702
+ keyNotExpected: "not expected on this journey",
703
+ purchasesPass: (n, total) => `${n} of ${total} pass`,
704
+ purchasesFail: (n) => `${n} fail`,
705
+ seen: "Seen",
706
+ hosts: "Hosts",
707
+ noneSeen: "None seen",
708
+ requests: (n, num = n) => `${num} ${n === 1 ? "request" : "requests"}`,
709
+ pages: (n, num = n) => `${num} ${n === 1 ? "page" : "pages"}`,
710
+ cookies: (n, num = n) => `${num} ${n === 1 ? "cookie" : "cookies"}`,
711
+ generated: "Generated",
712
+ runs: "Runs",
713
+ files: "Files",
714
+ firstHit: (range) => `first hit ${range} ms`,
715
+ runCol: "Run",
716
+ },
717
+ // ---- end of html.scope ----
610
718
  },
611
719
  };
612
720
 
@@ -620,18 +728,11 @@ const tr = {
620
728
  eyebrow: "Yapay zekâ ile izleme denetimi",
621
729
  paramsShort: "parametre",
622
730
  noParameters: "Parametre yok.",
623
- pushMatchHint: "Bu adımda aynı olay adına sahip dataLayer gönderimleri.",
624
731
  noMatchingPush: "Bu adımda bu olay adıyla bir dataLayer gönderimi yok. Etiket bir sayfa görüntüleme, tıklama tetikleyicisi ya da sayfaya gömülü bir pikselden tetikleniyor olabilir.",
625
- otherInStep: "Diğer dataLayer gönderimleri ve ağ çağrıları",
626
732
  noHits: "İzleme olayı yok",
627
- hasProblems: "Sorun var",
628
- stepsShort: "adım",
629
- eventsShort: "olay",
630
- problemsShort: "sorun",
631
733
  findings: "Bulgular",
632
734
  what: "Ne",
633
735
  where: "Nerede",
634
- causeAndFix: "Neden ve çözüm",
635
736
  likelyCause: "Olası neden",
636
737
  gtmTags: "GTM container'ınızda",
637
738
  gtmNoTag: "Container dışa aktarımındaki hiçbir etiket bu olayı göndermiyor.",
@@ -645,14 +746,10 @@ const tr = {
645
746
  fix: "Çözüm",
646
747
  captured: "Yakalanan",
647
748
  noProblems: "Sorun bulunamadı.",
648
- noExplanation: "Bu çalıştırmada model açıklaması yok. Aşağıdaki etki, sorumlu ve çözüm bilgileri için gerekmiyor.",
649
- matchingPlan: "Plana uygun olanlar",
650
749
  timeline: "Yolculuklar ve olay zaman çizelgesi",
651
- timelineLead: "Her yolculuğun her adımı. Olaylar platforma göre gruplanır; bir olayı açınca parametrelerini, arkasındaki dataLayer gönderimini ve onu taşıyan ağ isteğini görürsünüz. Sorunlu adımlar açık gösterilir.",
652
750
  completed: "Tamamlandı",
653
751
  notCompleted: "Tamamlanmadı",
654
752
  step: "adım",
655
- trackingHits: "İzleme istekleri",
656
753
  dataLayer: "dataLayer gönderimleri",
657
754
  network: "Ağ çağrıları",
658
755
  platform: "Platform",
@@ -662,8 +759,6 @@ const tr = {
662
759
  method: "Metot",
663
760
  status: "Durum",
664
761
  vendor: "Sağlayıcı",
665
- blockedNote: "bu denetim engelledi: yerel olarak yanıtlandı, sağlayıcıya hiç ulaşmadı",
666
- blockedNoteVendor: (vendor) => `bu denetim engelledi: yerel olarak yanıtlandı, ${vendor} platformuna hiç ulaşmadı`,
667
762
  clickedThrough: "üstündeki bir öğeye rağmen tıklandı",
668
763
  generatedBy: "AI Tag Debugger ile oluşturuldu",
669
764
  nothing: "Yok",
@@ -672,48 +767,31 @@ const tr = {
672
767
  acceptedLine: (n) => `Temel dosyada kabul edilen ${n} bulgu sayılmadı`,
673
768
  whereStep: (journey, viewport, step) => `${journey} (${viewport})${step ? `, "${step}" adımı` : ""}`,
674
769
  allGood: "Test edilen tüm yolculuklarda plandaki tüm olaylar doğru çalıştı.",
675
- tabEvents: "Olaylar",
676
- tabTimeline: "Zaman çizelgesi",
677
- timelineGtmEvent: "GTM olayı",
678
- timelineConsent: "İzin komutu",
679
- timelineNoEvent: "GTM olayı yok (yalnızca veri)",
680
- timelineNoHits: "Bu gönderimin ardından platform isteği gelmedi.",
681
- timelineOther: "dataLayer gönderimi olmayan istekler",
682
770
  bodyDropped: "İstek gövdesi saklanmadı: bu denetim, saklanan istek gövdeleri için 2 MB sınırına ulaştı.",
683
771
  tabNetwork: "Ağ istekleri",
684
- filterBy: "Kaynağa göre filtrele",
685
772
  all: "Tümü",
686
773
  items: "Ürünler",
687
774
  customItemParams: "Özel ürün parametreleri",
688
- itemsCount: (n) => `${n} ürün`,
689
775
  noItems: "ürün yok",
690
776
  serverSideTag: "sunucu tarafı",
691
777
  source: "Kaynak",
692
778
  request: "İstek",
693
- noRequest: "Eşleşen istek yok",
694
779
  noPushes: "Bu adımda dataLayer gönderimi yok.",
695
780
  noRequests: "Bu adımda seçilen sağlayıcılara istek yok.",
696
781
  eventParams: "Olay parametreleri",
697
782
  contextParams: "Oturum, cihaz, sayfa ve onay parametreleri",
698
783
  rawRequest: "Ham istek",
699
- rawJson: "Ham JSON",
700
784
  inBatch: (i, n) => `tek istekte ${n} olaydan ${i}.`,
701
785
  impact: "Etkisi",
702
786
  evidence: "Kanıt",
703
787
  fixSteps: "Çözüm",
704
788
  verify: "Nasıl doğrulanır",
705
789
  owners: { developer: "Yazılımcı", gtm: "Tag Manager", marketing: "Pazarlama" },
706
- ownerHint: { developer: "Site kodu ve dataLayer", gtm: "Etiketler, tetikleyiciler ve onay ayarları", marketing: "Ölçüm planı" },
707
790
  places: (n) => `${n} yer`,
708
791
  alsoCheck: "Bulgu listesinde olmayan, ama kontrol edilmesi gerekenler",
709
- providersChecked: "Kontrol edilen sağlayıcılar:",
710
- outOfScope: (list, n) => `Kapsam dışı: ${list} (${n} istek atlandı)`,
711
792
  skippedInStep: (list, n) => `Yalnızca seçilen sağlayıcıların istekleri gösterilir. Bu adımda kapsam dışı ${n} istek atlandı: ${list}.`,
712
- tabOverview: "Genel bakış",
713
793
  tabJourneys: "Yolculuklar",
714
- tabScope: "Kapsam ve plan",
715
794
  sections: "Rapor bölümleri",
716
- headerMeta: (journeys, providers) => `${journeys} yolculuk · ${providers} sağlayıcı`,
717
795
  checkedAgainst: (id) => `${id} planına göre kontrol edildi`,
718
796
  planChangesLine: (pc) => (pc.same ? `Plan ${pc.previous} sürümünden bu yana değişmedi` : `Plan ${pc.previous} sürümünden bu yana değişti: ${pc.added.length} eklendi, ${pc.removed.length} çıkarıldı, ${pc.changed.length} değişti`),
719
797
  planVsSite: "Plan ve site",
@@ -721,22 +799,15 @@ const tr = {
721
799
  changesLead: (id, mode) => `${id} çalıştırmasıyla ${mode === "plan" ? "plan kapsamına" : "sağlık bulgularına"} göre karşılaştırıldı`,
722
800
  changesLine: (ch) => ch.fixed.length || ch.new.length ? [ch.fixed.length ? `${ch.fixed.length} ${ch.mode === "plan" ? "olay" : "sorun"} düzeldi` : "", ch.new.length ? `${ch.new.length} yeni sorun` : ""].filter(Boolean).join(", ") : "Son çalıştırmadan bu yana değişiklik yok",
723
801
  changeFixed: "Düzeldi",
724
- changeWas: (what) => `önceki durum: ${what}`,
725
802
  changeNew: "Yeni",
726
803
  noSavedRun: "Bu site için henüz kayıtlı çalıştırma yok. Önce `aitd run` çalıştırın; her çalıştırma bir öncekiyle karşılaştırılır.",
727
804
  routeChanged: (list) => `Yapay zeka siteyi son çalıştırmadan farklı bir yoldan gezdi: ${list}`,
728
805
  noPreviousRun: "Bu site için kayıtlı ilk çalıştırma bu, karşılaştırılacak bir şey henüz yok.",
729
- planVsSiteLead: "Plandaki her olay ve sitenin gerçekte gönderdiği",
730
806
  coverageLine: (c) => `Kapsam ${c.checkable} olaydan ${c.implemented}${c.percent === null ? "" : ` (%${c.percent})`}${c.not_checked ? `, ${c.not_checked} olay kontrol edilmedi` : ""}`,
731
807
  bucket: { implemented: "Uygulanmış", missing: "Eksik", missing_params: "Eksik parametre", wrong_values: "Hatalı değer", unplanned: "Planda yok", not_checked: "Kontrol edilmedi" },
732
808
  bucketCol: "Sonuç",
733
- summaryLead: "Yapay zekâ özeti, öncelik sırasıyla",
734
- noSummary: "Bu çalıştırmada model özeti yok. Karar ve aşağıdaki bulgular tek başına yeterli.",
735
- seeAllFindings: "Tüm bulguları gör →",
736
809
  journey: "Yolculuk",
737
810
  stepsCol: "Adım",
738
- problemsCol: "Sorun",
739
- scopeCard: "Kapsam",
740
811
  site: "Site",
741
812
  runCard: "Bu çalıştırma",
742
813
  runPlatforms: "Platformlar",
@@ -754,45 +825,32 @@ const tr = {
754
825
  junitSite: "site",
755
826
  consentDefault: "Varsayılan",
756
827
  consentUpdate: "Güncelleme",
757
- consentLead: "Sitenin gönderdiği Consent Mode komutları, sırasıyla.",
758
- consentNone: "Site bu yolculukta Consent Mode komutu göndermedi.",
759
828
  scenarios: "Onay senaryoları",
760
- scenariosLead: (cmp) => `Ana sayfa her onay seçimi için bir kez açıldı; seçim ${cmp === "banner" ? "banner düğmeleriyle" : `${cmp} üzerinden`} yapıldı. Her hücre, etiketin o seçimden sonra gönderdiği istek sayısıdır. Kırmızı sayı, ziyaretçinin reddettiği veridir.`,
761
829
  scenarioCols: { before: "Henüz seçim yok", accept: "Tümünü kabul", reject: "Tümünü reddet", analytics: "Yalnızca analitik" },
762
830
  scenarioNotRun: "Burada desteklenmiyor",
763
831
  scenarioTag: "Etiket",
764
832
  skippedLine: (list, n) => `Kapsam dışı ${n} istek atlandı: ${list}.`,
765
- findingHint: "Bir bulguyu açınca olası neden, kanıt ve çözüm adımları görünür.",
766
- spread: (j, s) => `${j} yolculuk${s ? ` · ${s} adım` : ""}`,
767
833
  chooseJourney: "Yolculuk seç",
768
- stepsNav: "Adımlar",
769
- stepMeta: (t, events, pushes, skipped) => `${t} · ${events} olay · ${pushes} dataLayer${skipped ? ` · kapsam dışı ${skipped} istek atlandı` : ""}`,
770
834
  noSteps: "Bu yolculukta adım yok.",
771
835
  planCoverage: "Ölçüm planı kapsamı",
772
- planCoverageLead: "Plandaki her olayın her yolculukta gönderilip gönderilmediği",
773
- coverageLegend: "✓ gönderildi · ✗ gönderilmedi · – bu yolculukta beklenmiyor",
774
836
  notChecked: "kontrol edilmedi",
775
837
  noPlan: "Ölçüm planı verilmediği için karşılaştırılacak bir şey yok.",
776
838
  providers: "Sağlayıcılar",
777
839
  inventoryTitle: "Etiket envanteri",
778
- inventoryLead: "Sitenin istek gönderdiği tüm sağlayıcılar ve hangi sayfalarda",
779
840
  vendorCol: "Sağlayıcı",
780
841
  partyCol: "Taraf",
781
842
  pagesCol: "Sayfalar",
782
843
  cookiesCol: "Çerezler",
783
844
  party: { first: "Birinci taraf", third: "Üçüncü taraf", both: "İkisi de" },
784
- morePages: (n) => `+${n} daha`,
785
845
  otherCookies: "Diğer çerezler",
786
846
  noInventory: "Sağlayıcıya giden istek kaydedilmedi.",
787
847
  provider: "Sağlayıcı",
788
- requestsCol: "İstek",
789
848
  checked: "Kontrol edildi",
790
849
  outOfScopeStatus: "Kapsam dışı",
791
850
  missing: "yok",
792
851
  requestTo: (p) => `${p} isteği`,
793
852
  by: "by",
794
853
  credit: (atd) => `Bu rapor açık kaynak ${atd} ile oluşturuldu.`,
795
- timelineLeadV2: "Her adımda üç sekme var: o adımda gönderilen olaylar, dataLayer gönderimleri ve ağ istekleri. Olayları ve istekleri kaynağa göre filtreleyebilirsiniz. Sorunlu adımlar açık gösterilir.",
796
854
  history: {
797
855
  noRuns: "Bu site için henüz kayıtlı çalıştırma yok. Önce `aitd run` çalıştırın; eğilim ikinci çalıştırmayla başlar.",
798
856
  oneRun: (id) => `Tek kayıtlı çalıştırma var (${id}); eğilim bir sonrakiyle başlar.`,
@@ -1080,34 +1138,23 @@ const tr = {
1080
1138
  themeLight: "Tema: açık",
1081
1139
  themeDark: "Tema: koyu",
1082
1140
  newTab: "yeni sekmede açılır",
1083
- ownerSplit: (parts) => `${parts.join(", ")}.`,
1084
- forOwner: { developer: (n) => `geliştirici için ${n}`, gtm: (n) => `Tag Manager için ${n}`, marketing: (n) => `pazarlama için ${n}` },
1085
1141
  aiSummary: "Yapay zekâ özeti",
1086
1142
  platformsChecked: "Kontrol edilen platformlar",
1087
1143
  campaignCheck: "Kampanya kontrolü",
1088
- campaignChecked: "Açılış sayfasında UTM, gclid ve fbclid",
1089
- consentModeOn: "consent mode açık",
1090
1144
  consentModeSeen: "Consent Mode komutları görüldü",
1091
1145
  cmpBanner: "banner",
1092
1146
  scenariosRun: (n) => `${n} senaryo`,
1093
1147
  runsAllCompleted: (n) => `${n} çalıştırma, hepsi tamamlandı`,
1094
1148
  runsCompleted: (done, n) => `${n} çalıştırmadan ${done} tanesi tamamlandı`,
1095
- fixFirst: "Önce ne düzeltilmeli",
1096
- fixFirstLead: "Düzeltecek kişiye göre gruplandı, en çok puan kazandıran önce. Her satır bulgusunu açar.",
1097
- pointsToRecover: (n) => `düzeltilince +${n} puan`,
1098
- nothingFor: (owner) => `Bu çalıştırmada ${owner} için bir şey yok.`,
1099
1149
  moreInFindings: (n) => `Bulgular'da ${n} tane daha →`,
1100
1150
  working: "Çalışanlar",
1101
1151
  whatWasChecked: "Neler kontrol edildi",
1102
1152
  nothingVerified: "Bu çalıştırmada hiçbir şey doğrulanmadı.",
1103
- coverageVerified: (done, total, pct) => `Planlanan ${total} olaydan ${done} tanesi doğrulandı${pct === null ? "" : ` (%${pct})`}.`,
1104
1153
  allRuns: (n) => `${n} çalıştırmanın hepsi`,
1105
1154
  onlyOn: (places) => `yalnızca ${places.join(", ")}`,
1106
- journeysLead: "Yürünen adımlar, yakalanan istekler ve her çalıştırmayı gösteren sorun kartları.",
1107
1155
  viewport: "Görünüm",
1108
1156
  hitsCol: "İstekler",
1109
1157
  trend: "Eğilim",
1110
- trendLead: "Kayıtlı çalıştırmalardaki sorun sayıları, en eski solda. İçi boş nokta, bir yolculuğun tamamlanmadığı çalıştırmadır.",
1111
1158
  trendDirection: { improving: "İyileşiyor", worsening: "Kötüleşiyor", flat: "Değişmedi" },
1112
1159
  trendSpan: (n, first, last) => `${n} çalıştırmada, ${first} – ${last}`,
1113
1160
  runIncomplete: "bir yolculuk tamamlanmadı",
@@ -1116,10 +1163,6 @@ const tr = {
1116
1163
  openLongest: "En uzun süredir açık",
1117
1164
  openSince: (date, runs, places) => `${date} tarihinden beri açık · ${runs} çalıştırma · ${places} yer`,
1118
1165
  score: "Veri kalitesi puanı",
1119
- scoreLead: "100 eksi her bozuk sorun için 15, her risk için 10 ve her uyarı için 5; dönüşüm olaylarında iki katı.",
1120
- scoreLost: (n) => `${n} puan kaybedildi`,
1121
- findingsLead: "Kanıtı, nerede olduğunu ve düzeltmenin nasıl doğrulanacağını görmek için bir bulguyu açın.",
1122
- okInOverview: (n) => `${n} sorunsuz sonuç genel bakışta listeleniyor.`,
1123
1166
  noModel: "Bu çalıştırmada model açıklaması yok. Aşağıdaki kanıt, sorumlu ve doğrulama bağlantıları için gerekmiyor.",
1124
1167
  accepted: "Kabul edildi",
1125
1168
  acceptedNote: "Bu bulgu temel çizgide: biliniyor ve çalıştırmanın aleyhine sayılmıyor.",
@@ -1128,44 +1171,28 @@ const tr = {
1128
1171
  findingLink: "Bulgu →",
1129
1172
  consentMode: "Consent Mode",
1130
1173
  consentTiming: (ms, before, v2, missing) => `Varsayılan ${ms === null ? "ilk sayfada" : `ilk sayfanın ${Math.round(ms)}. milisaniyesinde`} ayarlandı${before === null ? "" : before ? ", ilk Google isteğinden önce" : ", ilk Google isteğinden sonra"} · v2 sinyalleri ${v2 ? "mevcut" : `eksik: ${missing.join(", ")}`}.`,
1131
- consentNoDefault: "Bu yolculukta Consent Mode varsayılanı gönderilmedi.",
1132
- consentResent: (n) => `Varsayılan ve güncelleme ${n} sayfa yüklemesinde daha yeniden gönderildi; kayıtlı tercih her seferinde geri yükleniyor.`,
1133
- consentOnHit: "Bu istekteki onay:",
1134
- scenariosLead: (cmp) => `Ana sayfa her onay seçeneği için bir kez açıldı; yanıt ${cmp === "banner" ? "bandın düğmeleriyle" : cmp} verildi. Her hücre, etiketin o seçimden sonra gönderdiği istek sayısıdır.`,
1135
- scenariosLegend: "İşaretli sayı, ziyaretçinin reddettiği veridir. \"cookieless\", depolama reddedilmişken atılan Consent Mode ping'idir ve izinlidir.",
1136
1174
  cellCookieless: "cookieless",
1137
1175
  cellAdDenied: "ad storage reddedilmiş",
1138
1176
  cellWithCookies: "çerezlerle",
1139
1177
  cellProblem: "sorun:",
1140
1178
  cellShouldNot: "gönderilmemeliydi",
1141
- stepsTitle: "Adımlar ve her birinin gönderdiği istekler",
1142
- stepsLead: "Parametreler, dataLayer gönderimleri ve istekler için bir satırı açın. Bulgusu olan satırlar açık.",
1143
- stepCol: "Adım",
1144
1179
  timeCol: "Zaman",
1145
- hasFinding: (sev) => `${sev.toLowerCase()} bulgusu var`,
1146
- stepDetails: (hits, pushes) => `Ayrıntılar · ${hits} istek · ${pushes} dataLayer`,
1147
1180
  hitsInStep: "Bu adımdaki istekler",
1148
1181
  blockedBy: (platform) => `denetim engelledi: yerel olarak yanıtlandı, ${platform} platformuna hiç ulaşmadı`,
1149
1182
  problems: (n) => `${n} sorun`,
1150
1183
  funnel: "Beklenen ve gözlenen",
1151
1184
  funnelLead: (observed, expected, ok) => `Beklenen ${expected} olaydan ${observed} tanesi tetiklendi, ${ok} tanesi tüm zorunlu parametrelerle.`,
1152
- funnelBreaks: (event) => `Huni ${event} olayında kopuyor.`,
1153
1185
  conversion: "dönüşüm",
1154
1186
  sent: "gönderildi",
1155
1187
  notSent: "gönderilmedi",
1156
- firstAt: "İlk görüldüğü yer",
1157
1188
  page: "Sayfa",
1158
1189
  params: (list) => `${list.join(", ")} olmadan`,
1159
1190
  paramsShort: "param.",
1160
1191
  parity: "Platform tutarlılığı",
1161
- parityLead: "Aynı olayın iki platformdaki hâli ve aralarındaki farklar.",
1162
1192
  perPlatform: "Platforma göre",
1163
- difference: "Fark",
1164
1193
  agree: "uyumlu",
1165
1194
  mismatch: { count: "sayı farklı", value: "değer farklı", currency: "para birimi farklı", value_missing: "değer yalnızca bir tarafta" },
1166
- onlyOnPlatform: "Yalnızca tek platformda:",
1167
1195
  detailsCol: "Ayrıntılar",
1168
- coverageLegend: "✓ parametreleriyle gönderildi · param.: zorunlu parametreler olmadan gönderildi · ✗ gönderilmedi · – bu yolculukta beklenmiyor",
1169
1196
  needs: (list) => `gerekli: ${list.join(", ")}`,
1170
1197
  notExpected: "beklenmiyor",
1171
1198
  conversions: "Dönüşüm bütünlüğü",
@@ -1176,15 +1203,202 @@ const tr = {
1176
1203
  pass: "geçti",
1177
1204
  fail: "başarısız",
1178
1205
  notApplicable: "uygulanamaz",
1179
- seenOn: "Görüldüğü sayfalar",
1180
1206
  checkedNotSeen: "Kontrol edildi, görülmedi",
1181
1207
  neverSeen: (list) => `Kontrol edildi ama hiç görülmedi: ${list}. Hiçbir sayfada onlara istek gitmedi.`,
1182
1208
  timing: "Zamanlama",
1183
- timingLead: "Her çalıştırmanın süresi ve her adımın ilk isteğinin ne kadar geç geldiği. Denetimin kendi bekleme süresi dahildir.",
1184
1209
  duration: "Süre",
1185
1210
  medianFirstHit: "Ortanca ilk istek",
1186
1211
  slowestHit: "En yavaş istek",
1187
1212
  planChanges: "Plan değişiklikleri",
1213
+
1214
+ // ---- html.shell: top bar, rail, section tools and footer of src/html/shell.js ----
1215
+ shell: {
1216
+ skip: "Rapora atla",
1217
+ eyebrow: "İzleme denetimi",
1218
+ heading: (site) => `${site} izleme denetimi`,
1219
+ railLabel: "Rapor bölümleri",
1220
+ sections: { summary: "Özet", findings: "Bulgular", journeys: "Yolculuklar", consent: "Onay", coverage: "Kapsam", inventory: "Envanter", run: "Çalıştırma" },
1221
+ railTip: (label, token) => `${label} · ${token}`,
1222
+ collapse: "Kenar çubuğunu daralt",
1223
+ expand: "Kenar çubuğunu genişlet",
1224
+ expandAll: "Tümünü aç",
1225
+ collapseAll: "Tümünü kapat",
1226
+ clear: "Temizle",
1227
+ filterCount: (shown, total) => `${shown} / ${total} gösteriliyor`,
1228
+ score: "Puan",
1229
+ outOf: "/100",
1230
+ scoreLabel: (score, verdict) => `Puan 100 üzerinden ${score}, sonuç: ${verdict}`,
1231
+ noScore: (verdict) => `Puan yok, sonuç: ${verdict}`,
1232
+ themeAuto: "Tema: sistemi izler",
1233
+ themeLight: "Tema: açık",
1234
+ themeDark: "Tema: koyu",
1235
+ },
1236
+ // ---- end of html.shell ----
1237
+
1238
+ // ---- html.summary: strings of src/html/summary.js, edited only by its builder ----
1239
+ summary: {
1240
+ about: "Bu çalıştırma hakkında",
1241
+ events: "Kontrol edilen olaylar",
1242
+ noPlan: "Ölçüm planı verilmedi",
1243
+ plannedSeen: (planned, seen) => `${planned} <small>planlı</small> · ${seen} <small>görülen</small>`,
1244
+ withParams: (percent) => `%${percent} gerekli parametreleriyle`,
1245
+ seen: "görüldü",
1246
+ notSeen: "görülmedi",
1247
+ seenOf: (seen, total) => `Görülen: ${seen} / ${total}`,
1248
+ noRuns: "Hiç yolculuk çalışmadı",
1249
+ runState: { completed: "tamamlandı", incomplete: "tamamlanmadı" },
1250
+ steps: (n) => `${n} adım`,
1251
+ hits: (n) => `${n} istek`,
1252
+ problems: (n) => `${n} sorun`,
1253
+ completedOf: (done, total) => `${done}/${total} tamamlandı`,
1254
+ stoppedAt: (step) => `${step}. adımda durdu`,
1255
+ defaultAt: (chip, range) => `Varsayılan${chip}${range === null ? "" : ` <small>${range} ms'de</small>`}`,
1256
+ noDefault: "Varsayılan görülmedi",
1257
+ mixed: "karışık",
1258
+ noBanner: "Banner bulunamadı",
1259
+ bannerNotReached: "Banner'a ulaşılamadı",
1260
+ scripted: "Betikle, model olmadan",
1261
+ deterministic: "Yalnızca kural tabanlı kontroller",
1262
+ explains: "Nedenleri ve düzeltmeleri açıklar",
1263
+ seconds: (s) => `${s} sn`,
1264
+ runs: (n) => `${n} çalıştırma`,
1265
+ more: (n) => `${n} tane daha`,
1266
+ moreInFindings: (n) => `Bulgular'da ${n} tane daha`,
1267
+ cost: {
1268
+ missingParams: (event, params) => `${event} içinde ${params} yok`,
1269
+ missingParamsAny: (event) => `${event} içinde gerekli parametreler yok`,
1270
+ beforeConsent: (event) => `${event} onaydan önce gönderildi`,
1271
+ afterReject: (event) => `${event} tümü reddedildikten sonra gönderildi`,
1272
+ duplicate: (event, n) => (n ? `${event} tıklama başına ${n} kez gönderildi` : `${event} tıklama başına birden çok kez gönderildi`),
1273
+ missingEvent: (event) => `${event} hiç gönderilmedi`,
1274
+ stopped: (step, runs) => (step === null ? "Yolculuklar erken durdu" : `${runs === 1 ? "Yolculuk" : "Yolculuklar"} ${step}. adımda durdu`),
1275
+ noConsentDefault: "Consent Mode varsayılanı yok",
1276
+ },
1277
+ },
1278
+ // ---- end of html.summary ----
1279
+
1280
+ // ---- html.findings: strings of src/html/findings.js, edited only by its builder ----
1281
+ findings: {
1282
+ severity: "Önem",
1283
+ filterLabel: "Bulguları filtrele",
1284
+ search: "Ara",
1285
+ searchLabel: "Bulgularda ara: olay, parametre, sayfa",
1286
+ filters: "Filtreler",
1287
+ groups: { failed: "Başarısız", unverified: "Doğrulanmadı", passed: "Geçti" },
1288
+ empty: "Bu filtrelere uyan bulgu yok.",
1289
+ details: (title) => `${title}: ayrıntılar`,
1290
+ runs: (n) => `${n} çalıştırma`,
1291
+ showWhere: "Nerede olduğunu göster",
1292
+ // Kısa satır başlıkları, en fazla sekiz kelime; olay ve parametre adları tırnak içinde, kod olarak gösterilir.
1293
+ title: {
1294
+ missing_params: (event, params) => `${q(event)} olayı ${andList(sortParams(params).map(q), "ve")} olmadan gönderildi`,
1295
+ duplicate: (event, n) => `${q(event)} tek işlemde ${n} kez gönderildi`,
1296
+ before_consent: (event) => `${q(event)} onay seçiminden önce gönderildi`,
1297
+ after_reject: (event) => `${q(event)} "Tümünü reddet"ten sonra da gönderildi`,
1298
+ missing_event: (event) => `${q(event)} gönderilmedi`,
1299
+ consent_default_missing: () => "Consent Mode varsayılanı ayarlanmadı",
1300
+ journey_incomplete: (step) => (step === null ? "Yolculuk tamamlanmadı" : `Yolculuk ${step}. adımda durdu`),
1301
+ },
1302
+ notReached: "ulaşılmadı",
1303
+ passed: {
1304
+ campaign: "Kampanya parametreleri yönlendirmeden geçti",
1305
+ coverage: (done, total, percent) => `Planlanan ${total} olaydan ${done} tanesi eksiksiz${percent === null ? "" : ` (%${percent})`}`,
1306
+ consentDefault: (onTime) => (onTime ? "Consent Mode varsayılanı ilk Google isteğinden önce ayarlandı" : "Consent Mode varsayılanı ayarlandı"),
1307
+ conversion: (event, amount) => `${q(event)} ${amount} ile gönderildi`,
1308
+ },
1309
+ fineOn: (place, amount) => `${place} sorunsuz${amount ? `: ${amount}` : ""}`,
1310
+ pushLacks: (params) => `dataLayer gönderiminde ${andList(sortParams(params).map(q), "ve")} zaten yok.`,
1311
+ pushCarries: "dataLayer gönderimi bunları taşıyor; etiket onları düşürüyor.",
1312
+ pushRaw: "dataLayer gönderimi",
1313
+ perAction: (n) => `işlem başına ${n} kez`,
1314
+ noSignal: "sinyal yok",
1315
+ stillSent: "yine gönderildi",
1316
+ stopped: "durdu",
1317
+ stoppedAt: "Durduğu yer",
1318
+ error: "Hata",
1319
+ defaultIn: (present, total) => `${total} çalıştırmanın ${present} tanesinde varsayılan var`,
1320
+ replay: "Yeniden oynatma",
1321
+ ai: "Modelin açıklaması",
1322
+ noModel: "Bu çalıştırmada model açıklaması yok.",
1323
+ },
1324
+ // ---- end of html.findings ----
1325
+
1326
+ // ---- html.journeys: strings of src/html/journeys.js, edited only by its builder ----
1327
+ journeys: {
1328
+ steps: "Adımlar",
1329
+ pickViewport: "Görünüm",
1330
+ dataLayer: "Veri katmanı",
1331
+ startStep: "İlk adımdan önce",
1332
+ stats: (steps, hits, secs) => `${steps} adım · ${hits} istek${secs === null ? "" : ` · ${secs} sn`}`,
1333
+ noRuns: "Hiç yolculuk çalıştırılmadı.",
1334
+ nothing: "Bu adımda hiçbir şey gönderilmedi.",
1335
+ noSignal: "sinyal yok",
1336
+ noSignalTitle: "Bu istekte onay sinyali yok",
1337
+ signals: { ad_storage: "ad", analytics_storage: "an", ad_user_data: "ud", ad_personalization: "ap" },
1338
+ blocked: "engellendi",
1339
+ clear: "temizleme",
1340
+ colUrl: "URL",
1341
+ colId: "Kimlik",
1342
+ colName: "Ad",
1343
+ colPrice: "Fiyat",
1344
+ colQty: "Adet",
1345
+ itemMore: "Ürün parametreleri",
1346
+ hitsOf: (count, platform) => `${count} ${platform} isteği`,
1347
+ stepOf: (i) => `Adım ${i}`,
1348
+ },
1349
+ // ---- end of html.journeys ----
1350
+
1351
+ // ---- html.consent: strings of src/html/consent.js, edited only by its builder ----
1352
+ consent: {
1353
+ statusLabel: "Platform başına onay durumu",
1354
+ cols: { before: "Seçim yok", accept: "Kabul", reject: "Reddet", analytics: "Yalnızca analitik" },
1355
+ state: { denied: "reddedildi", granted: "verildi", none: "sinyal yok" },
1356
+ tally: (n, state) => `${n} · ${state}`,
1357
+ scenarios: "Senaryolar",
1358
+ notSupported: "desteklenmiyor",
1359
+ sent: "Gönderildi",
1360
+ problems: (n) => `${n} sorun`,
1361
+ noProblems: "Sorun yok",
1362
+ defaultFirst: "Varsayılan önce",
1363
+ defaultLate: "Varsayılan geç",
1364
+ noDefault: "Varsayılan yok",
1365
+ v2: "v2",
1366
+ v2Missing: "v2 eksik",
1367
+ timing: (lo, hi) => (lo === hi ? `${lo} ms` : `${lo}–${hi} ms`),
1368
+ runsWith: (k, n) => (k === n ? `${n} çalıştırma` : `${n} çalıştırmadan ${k} tanesi`),
1369
+ resent: (n) => `${n} sayfa yüklemesinde daha yeniden gönderildi`,
1370
+ },
1371
+ // ---- end of html.consent ----
1372
+
1373
+ // ---- html.scope: strings of src/html/scope.js, edited only by its builder ----
1374
+ scope: {
1375
+ ofEvents: (n, total) => `${total} olaydan ${n}`,
1376
+ problemPoints: "Sorun puanı",
1377
+ barLabel: (ok, params, missing) => `${ok} eksiksiz, ${params} olayda zorunlu parametre eksik, ${missing} olay gönderilmedi`,
1378
+ missingParams: (n) => `${n} olayda eksik parametre`,
1379
+ notSentCount: (n) => `${n} olay gönderilmedi`,
1380
+ notCheckedCount: (n) => `${n} olay kontrol edilmedi`,
1381
+ searchEvents: "Olay ara",
1382
+ needs: "Gerekenler",
1383
+ keyOk: "parametreleriyle gönderildi",
1384
+ keyParams: "zorunlu bir parametre eksik",
1385
+ keyMissing: "hiç gönderilmedi",
1386
+ keyNotExpected: "bu yolculukta beklenmiyor",
1387
+ purchasesPass: (n, total) => `${total} satın almadan ${n} geçti`,
1388
+ purchasesFail: (n) => `${n} başarısız`,
1389
+ seen: "Görüldü",
1390
+ hosts: "Alan adları",
1391
+ noneSeen: "Görülmedi",
1392
+ requests: (n, num = n) => `${num} istek`,
1393
+ pages: (n, num = n) => `${num} sayfa`,
1394
+ cookies: (n, num = n) => `${num} çerez`,
1395
+ generated: "Oluşturulma",
1396
+ runs: "Çalıştırmalar",
1397
+ files: "Dosyalar",
1398
+ firstHit: (range) => `ilk istek ${range} ms`,
1399
+ runCol: "Çalıştırma",
1400
+ },
1401
+ // ---- end of html.scope ----
1188
1402
  },
1189
1403
  };
1190
1404