mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-05 08:09:22 +00:00
fix(rum): fix session link NaN, heatmap snapshot, trace duration, widen button and analytics header (#16389)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
co-authored by
github-actions[bot]
parent
0963521eec
commit
a82aaeff2b
@@ -2995,6 +2995,11 @@
|
||||
"organizationHelpText": "d9cdc834fbfc24d8",
|
||||
"organizationLabel": "d764d42592fc9687",
|
||||
"output_format": "ef22a51c869f0983",
|
||||
"payloadFormat": "20d3e5624cadea6b",
|
||||
"payloadFormatAuto": "d461a493a3753877",
|
||||
"payloadFormatHelp": "39611037b3f91112",
|
||||
"payloadFormatLegacy": "46a69d0863b7b935",
|
||||
"payloadFormatRendered": "61954406a964a6df",
|
||||
"prebuilt": {
|
||||
"chatPostsShort": "d22f97f025061bc3",
|
||||
"customShort": "3ff61f1bbc91d71e",
|
||||
@@ -3294,6 +3299,14 @@
|
||||
"addTitle": "30d87ec4525974fb",
|
||||
"addToTemplate": "1db08760ac2ebd31",
|
||||
"addToTemplateCaption": "f83de3e69ecc3f94",
|
||||
"allKindsNotice": "7f23c044c629633d",
|
||||
"allKindsNoticeReview": "aff0766a5290e117",
|
||||
"appliesTo": "6687458beee57a58",
|
||||
"appliesToAll": "ddd0c2108e40c8b8",
|
||||
"appliesToAny": "bcb32f115ce6b582",
|
||||
"appliesToInferred": "a5e37fb769ee7dc8",
|
||||
"appliesToManual": "e4b802b7ff239951",
|
||||
"appliesToReset": "c5322f1451f4890c",
|
||||
"body": "6ccaa6415b5ee449",
|
||||
"bodyInvalidJsonHelp": "3c676f355a9f94f6",
|
||||
"bodyMarkdownLint": "5e13130e86487d50",
|
||||
@@ -3346,6 +3359,7 @@
|
||||
"emojiFire": "c141faa80e43a119",
|
||||
"emojiSiren": "248f1ca4059ee2a7",
|
||||
"emojiWarning": "e981ddae45d8f4ca",
|
||||
"emptyVariables": "fc839fc6f5b02a31",
|
||||
"exportTemplate": "e2fcdf940448a5f5",
|
||||
"fieldLabel": "0e66373f45dcf3dd",
|
||||
"fieldLabelPlaceholder": "1be972b2422a73f1",
|
||||
@@ -3390,16 +3404,20 @@
|
||||
"nameLockedHint": "3bb173a8b2c6bfe8",
|
||||
"namePlaceholder": "42a4c305cb8432c1",
|
||||
"outputMessages": "ace70a9ce0d04504",
|
||||
"playgroundHelp": "41159d362d20d3b0",
|
||||
"playgroundLabel": "a6273fb551f223ce",
|
||||
"prebuiltBadge": "e230325386e39e00",
|
||||
"prebuiltBadgeHint": "39e7b4153d331e0e",
|
||||
"previewApproximate": "324b134f57c70c72",
|
||||
"previewChannel": "ce4683e7013a18cd",
|
||||
"previewEmptyTitle": "0a44b1414f67ff5d",
|
||||
"previewFailed": "278e5c0835162cd8",
|
||||
"previewFidelityEmail": "6453bcfab90d9306",
|
||||
"previewFidelityMachine": "47ad920f68131a8b",
|
||||
"previewFidelityNote": "b2ae97d334ae9e61",
|
||||
"previewFidelityWebhook": "8790c72363c615c7",
|
||||
"previewGroupLabel": "f1a4aba767ae014e",
|
||||
"previewForbidden": "2755a8230f22b63c",
|
||||
"previewKind": "f5387f9bb6ed7031",
|
||||
"previewRawPayload": "99733344956dde48",
|
||||
"previewSeverity": "5e9f98120dbe5682",
|
||||
"previewSeveritySingle": "2b2d13f4dee205db",
|
||||
@@ -3414,8 +3432,12 @@
|
||||
"rowsSectionDescription": "0890b041ad6db134",
|
||||
"savedSuccessfully": "b2c655467ea71e28",
|
||||
"severityCritical": "427dd2969bd140be",
|
||||
"severityDegraded": "a8494c12f2243903",
|
||||
"severityFailed": "031a8f0f659df890",
|
||||
"severityFlaky": "cefa8e8972de2695",
|
||||
"severityNoData": "3b41ba9c7cb8c5d6",
|
||||
"severityOk": "843ac01149cced78",
|
||||
"severityRecovered": "37ce0a91ee27ce92",
|
||||
"severityWarning": "e981ddae45d8f4ca",
|
||||
"showWhenAllPlaceholder": "a52ace420f2175d0",
|
||||
"showWhenCaption": "e14d545f76326843",
|
||||
@@ -3442,6 +3464,7 @@
|
||||
"unknownVariables": "9a870420a8e0846b",
|
||||
"updateTitle": "cdf3d76a7834d5c5",
|
||||
"variableEpisodeIdDescription": "675c8fcb2fd2c8ec",
|
||||
"variableGroupCommon": "309955e00850b8af",
|
||||
"variableLimits": "6cbac2ac16a05eaa",
|
||||
"variableRowsDescription": "a14c93fab7fc021c",
|
||||
"variableStreamFields": "e86ad015c050bbe6",
|
||||
@@ -3563,14 +3586,18 @@
|
||||
"createsIncidentTooltip": "6247680d29ce5226",
|
||||
"destinationsTooltip": "f601ce64da7a4c20",
|
||||
"helpApplyToAlert": "b260517401d76a07",
|
||||
"helpApplyToObject": "1a439ee577c7ee95",
|
||||
"helpBuiltInFooter": "e9a6a4220e72dad6",
|
||||
"helpBuiltInHeading": "9dc1591f15a114a9",
|
||||
"helpBuiltInIntro": "57600ff308a84234",
|
||||
"helpCurrentBodyEmpty": "9b1b8cde966d919a",
|
||||
"helpCurrentHeading": "f9c8e6c12fcd5c88",
|
||||
"helpCurrentHeadingObject": "6e8bab1852eaef29",
|
||||
"helpCurrentNoDestinations": "8611ded262fceb3e",
|
||||
"helpCurrentNoOverride": "00465ee58ba181a6",
|
||||
"helpCurrentOverrideHeading": "2cef85e7cce184f7",
|
||||
"helpCurrentOverrideSome": "7014110c33ae2ff8",
|
||||
"helpCurrentResolved": "aaf94304ecd4acb7",
|
||||
"helpDestinationNoTemplate": "a90b2dde07be7449",
|
||||
"helpExampleHeading": "d029f87e3d80f8fd",
|
||||
"helpExampleResultLabel": "e9b57b6fd33d498b",
|
||||
@@ -3597,8 +3624,10 @@
|
||||
"helpRowTemplateWhyDesc": "9526c74b34dda66d",
|
||||
"helpRowTemplateWhyHeading": "268e600b3182e877",
|
||||
"helpTemplateExplain": "4c1506ff2ab22fad",
|
||||
"helpTemplateExplainObject": "55662c5336e0d905",
|
||||
"helpTemplateTitle": "84de89c26b0ff73f",
|
||||
"helpTemplateWhenDesc": "ee28cd7620178bb7",
|
||||
"helpTemplateWhenDescObject": "f6279efe0a37f7fe",
|
||||
"helpTemplateWhenHeading": "c38334b43ce34521",
|
||||
"helpVariablesExampleCaption": "dfebcf401828f373",
|
||||
"helpVariablesExplain": "b8d86c46c9ea8212",
|
||||
@@ -4299,6 +4328,7 @@
|
||||
"ok": "c16bc82bf1f04ede",
|
||||
"pending": "e595f17fac1d8384",
|
||||
"result": "6e7d50e84f4731ef",
|
||||
"template": "0575f29df888a27e",
|
||||
"time": "33b93476cf597a33"
|
||||
},
|
||||
"regionNote": "f5ed2e60103bf71c",
|
||||
@@ -5404,6 +5434,14 @@
|
||||
"noData": "af75117dfbb0edb7",
|
||||
"noTemplatesMsg": "e9e871d4bebbbe00",
|
||||
"noTriggersLoaded": "980bb294c56dd9e3",
|
||||
"notificationKinds": {
|
||||
"alert": "44a57b22e03d9a66",
|
||||
"anomaly": "79622828d2d8d988",
|
||||
"downtime": "5f8d6d8feb7b17a5",
|
||||
"incident": "36a606d4886552e8",
|
||||
"on_call": "0a33491906e00678",
|
||||
"synthetics": "f45c092981915635"
|
||||
},
|
||||
"oncallTeam": "b250e6b0b87af388",
|
||||
"oncallTeamAtFireTime": "80a154924b2e1c49",
|
||||
"oncallTeamFromRules": "6ca74cdb253f8fc9",
|
||||
@@ -5907,6 +5945,34 @@
|
||||
"tags": "1331275bc537b4c2",
|
||||
"tagsTooltip": "a56e372b90037999",
|
||||
"template": "84de89c26b0ff73f",
|
||||
"templateOverride": {
|
||||
"builtIn": "f721f7df7e39f9f3",
|
||||
"create": "7dc9c0adaca09e51",
|
||||
"emailOnly": "ecf8fea0cb44b2e3",
|
||||
"empty": "a1f60de70abec9c9",
|
||||
"forbidden": "e15b5db2103d2103",
|
||||
"groupContent": "47bd29075f8b8019",
|
||||
"groupCustom": "494ca78f7374e46f",
|
||||
"help": "ec7761ee7c813c65",
|
||||
"label": "3037bb192c8121ac",
|
||||
"loadFailed": "9a794687fa935a04",
|
||||
"mismatch": "c2d86508bc207eab",
|
||||
"placeholder": "c3033736b3864b6d",
|
||||
"snsOnly": "a97427f6124e7e52",
|
||||
"sourceCompiled": "33a7431aadae8522",
|
||||
"sourceDestination": "09849c42b87f4092",
|
||||
"sourceExplicit": "2995c0d322bbce95",
|
||||
"sourceLegacy": "57c686be41c66320",
|
||||
"sourceLegacyPayload": "278fc723fb4fcdb5",
|
||||
"sourceOrgDefault": "cbf6d49ec0f6d5bb",
|
||||
"sourcePlatformResolve": "ebb6b76a74129396",
|
||||
"stale": "c66188ecd3e68b35",
|
||||
"templateWithSource": "8fb8577722557a62",
|
||||
"webhookOnly": "267c3107cccf89d6",
|
||||
"willUse": "0c4145de85e3a7f9",
|
||||
"willUsePerDestination": "e1f36c1e4129bef4",
|
||||
"willUseRow": "13c699e5269fd408"
|
||||
},
|
||||
"testErrorClientError": "a68c0b2917185644",
|
||||
"testErrorConnection": "d756aae07e05473d",
|
||||
"testErrorDNS": "d3477f5ad3f618cb",
|
||||
@@ -15389,6 +15455,17 @@
|
||||
"envButton": "8594d2ee749572c4",
|
||||
"envHelp": "a674c8b69df5e79c",
|
||||
"envTitle": "08d3da57e11a658c",
|
||||
"health": {
|
||||
"checkAgain": "fb7099ad8e818d42",
|
||||
"checkAgainHint": "1d7f729465b86cd9",
|
||||
"checking": "5e8de672881e0d07",
|
||||
"error": "4a98aa4088c2ee4d",
|
||||
"noGenAiSpans": "089cf5c60886e5cb",
|
||||
"scopeAgent": "2ab32ec1ddbad9af",
|
||||
"scopeStream": "be6e5739c9f5e7d8",
|
||||
"title": "f918ce9614900771",
|
||||
"unsupported": "fdb2f19aeabd3d77"
|
||||
},
|
||||
"promptCopied": "c55394776b1492cf",
|
||||
"promptLabel": "5c39123805ffb4e2",
|
||||
"promptTitle": "c36d206528dfdcd8",
|
||||
@@ -15548,6 +15625,7 @@
|
||||
"connectSource": "0d50d7e94e3cddd3",
|
||||
"copyCommand": "9a01feecae675f2f",
|
||||
"copyConfig": "33ef5844548d0a4f",
|
||||
"copyPrompt": "ffc64b8bb8c4532d",
|
||||
"elapsedMinutes": "1829c58ba472520f",
|
||||
"elapsedSeconds": "e4e6c0fbc1a49d45",
|
||||
"endpointLabel": "3df9726c68ba76d6",
|
||||
@@ -15555,19 +15633,25 @@
|
||||
"fixInvalidCredentials": "14e39e6a9a1f1547",
|
||||
"fixInvalidCredentialsConfig": "7d023861b759a3a5",
|
||||
"fixInvalidCredentialsConfigUnnamed": "bcb719d88183cb95",
|
||||
"fixInvalidCredentialsPrompt": "c2fb88cc64830cf8",
|
||||
"fixInvalidCredentialsPromptUnnamed": "69da5571f9384541",
|
||||
"fixInvalidCredentialsUnnamed": "4d8976ca5087b52a",
|
||||
"fixMalformedBody": "5d360efdbe892460",
|
||||
"fixRateOrQuota": "bf6b0dcb2e6d2130",
|
||||
"guideDocs": "9d5099415bc97cb2",
|
||||
"hintStillChecking": "a49091733bfa9904",
|
||||
"hintWaiting": "c5136fb31e8de3a6",
|
||||
"hintWaitingAfter": "b4d295041fd15738",
|
||||
"hintWaitingLate": "36a7512a71c70f0e",
|
||||
"idleIn": "9bd8f732bf90fe71",
|
||||
"idleInConfig": "654a3d3a666c47da",
|
||||
"idleInPrompt": "e5ca7ab87f8e020e",
|
||||
"idleMatches": "07b128b00baed4cc",
|
||||
"idleMatchesConfig": "50da86325e8062d0",
|
||||
"idleMatchesPrompt": "8bf54703aeb0fcf0",
|
||||
"idleNew": "9ad87a51f28cd79d",
|
||||
"idleNewConfig": "4c7fccd2b51a4c5f",
|
||||
"idleNewPrompt": "ccd1f01c5b0c4426",
|
||||
"idlePill": "062093d7d3f4ff01",
|
||||
"installCheck": "64399266f1936bde",
|
||||
"meta": "2c6ef980667c5380",
|
||||
@@ -18275,6 +18359,7 @@
|
||||
"deliveryStatus_delivered": "906115657390f367",
|
||||
"deliveryStatus_failed": "031a8f0f659df890",
|
||||
"deliveryStatus_sent": "c16bc82bf1f04ede",
|
||||
"deliveryTemplate": "1ff1e821bde54da4",
|
||||
"deliveryTo": "f4b06ef6d3c81436",
|
||||
"description": "526e0087cc3f254d",
|
||||
"dimensionAlreadyUsed": "f45ee45ef04a4715",
|
||||
@@ -18706,6 +18791,7 @@
|
||||
"policyFix": "21f1595b614ffc31",
|
||||
"policyHint": "8d8e8833d7ee31ae",
|
||||
"policyIfNoAck": "7a5eb9ed14493cc5",
|
||||
"policyMailBanner": "f0232decc4aaab3d",
|
||||
"policyMainTabPolicy": "e1a8e3b1dca1c59a",
|
||||
"policyNoDefaultTeam": "ef87b2ed4b1bfa71",
|
||||
"policyNoDestinationWarning": "5a72c2c10ad7c3d8",
|
||||
@@ -23220,6 +23306,7 @@
|
||||
"noPages": "225e96d078e9b6d7",
|
||||
"noPosition": "5c13bcfb8fce2a42",
|
||||
"noReplay": "392b83d55800274c",
|
||||
"noReplayLegacySdk": "4c6e54c44430550f",
|
||||
"noTargets": "17c7a35194a02ab9",
|
||||
"offSnapshot": "9289a83bb31c8a0a",
|
||||
"opacityLabel": "2ddc54d254b4f59d",
|
||||
@@ -23450,11 +23537,31 @@
|
||||
"platform": "c78ffe19571018fb",
|
||||
"playSessionReplay": "8859d8b3f9b8664f",
|
||||
"playerEvents": {
|
||||
"abortedByApp": "e0de92dd7cca2b3d",
|
||||
"action": "64cff1319d2fd2cb",
|
||||
"browserStatus": "5be4dfa46df153a7",
|
||||
"duration": "4fc52a3c4c558b51",
|
||||
"error": "54a0e8c17ebb21a1",
|
||||
"failedRequest": "acc9650ce8c7cf32",
|
||||
"failedRequestDetails": "90f2c85037d7a87f",
|
||||
"frustration": "8302925ce5f5d7fe",
|
||||
"initiatedBy": "81b7f94aee9327fe",
|
||||
"method": "52a0f9b65b278850",
|
||||
"noResponse": "961136f9207a19be",
|
||||
"noResponseStatus": "e2e9c23acba97544",
|
||||
"noServerSpanFound": "b89658e79d796e81",
|
||||
"noServerSpanHint": "f8f83f8175a49272",
|
||||
"serverStatus": "344c9097cc039597",
|
||||
"size": "1af851907331c0ed",
|
||||
"timing": "fc4e84255a41a3a2",
|
||||
"timingConnect": "1a2303ede07493ac",
|
||||
"timingDns": "020965a2f08f4028",
|
||||
"timingDownload": "d6eafe8235910042",
|
||||
"timingFirstByte": "da1f76e743e7a4d4",
|
||||
"timingSsl": "07f9736e7adea312",
|
||||
"unknown": "b764cdc0eab71374",
|
||||
"unknownNoTrace": "26688553a94183a9",
|
||||
"url": "e7a241debad56609",
|
||||
"view": "dcc839a4015c4b7d"
|
||||
},
|
||||
"rageDeadClicks": "383f715434d129d3",
|
||||
|
||||
@@ -223,7 +223,12 @@
|
||||
"rum-15190-paths-build-funnel.spec.js",
|
||||
"rum-15230-paths-drawer-user.spec.js",
|
||||
"rum-15304-overview-synthetic-counts.spec.js",
|
||||
"rum-15269-list-view-state.spec.js"
|
||||
"rum-15269-list-view-state.spec.js",
|
||||
"rum-3268-session-link-no-nan.spec.js",
|
||||
"rum-3268-heatmap-no-view-id.spec.js",
|
||||
"rum-3268-trace-duration-skew.spec.js",
|
||||
"rum-3268-no-widen-at-30d.spec.js",
|
||||
"rum-3268-analytics-header-1200.spec.js"
|
||||
],
|
||||
"disabled": [],
|
||||
"ingest_allowed_upto": "1440",
|
||||
|
||||
+140
@@ -0,0 +1,140 @@
|
||||
// Product Analytics header: the title stays whole and clear of the app picker at 1440, 1366, 1290, 1200 and 1000px viewports; below ~1300px the filters wrap into their own band.
|
||||
|
||||
const { test, expect } = require("../../utils/enhanced-baseFixtures.js");
|
||||
const testLogger = require("../../utils/test-logger.js");
|
||||
const PageManager = require("../../../pages/page-manager.js");
|
||||
const {
|
||||
seedBuilt,
|
||||
SessionBuilder,
|
||||
runAppId,
|
||||
HOUR_MS,
|
||||
} = require("../../utils/rum-analytics-ingestion.js");
|
||||
|
||||
const TAGS = ["@bug-3268", "@P3", "@regression", "@rumRegression"];
|
||||
const SUB_TABS = ["funnels", "paths"];
|
||||
const WIDTHS = [1440, 1366, 1290, 1200, 1000];
|
||||
const WIDE_FROM = 1300;
|
||||
|
||||
function buildViewSeed(appId, nowMs) {
|
||||
const session = new SessionBuilder(
|
||||
appId,
|
||||
`${appId}-s0`,
|
||||
nowMs - 2 * HOUR_MS,
|
||||
{ user: "h0@e2e.test" },
|
||||
);
|
||||
session.view("https://shop.example.com/web/start");
|
||||
session.view("https://shop.example.com/web/product");
|
||||
return { rows: session.rows, facts: { appId } };
|
||||
}
|
||||
|
||||
test.describe("Product Analytics header across widths", () => {
|
||||
test.describe.configure({ mode: "parallel" });
|
||||
test.use({ timezoneId: "UTC", viewport: { width: 1200, height: 800 } });
|
||||
let seed = null;
|
||||
|
||||
test.beforeAll(async ({ browser }) => {
|
||||
const page = await browser.newPage();
|
||||
try {
|
||||
seed = await seedBuilt(
|
||||
page,
|
||||
buildViewSeed(runAppId("pa-3268"), Date.now()),
|
||||
);
|
||||
} finally {
|
||||
await page.close();
|
||||
}
|
||||
});
|
||||
|
||||
test.beforeEach(async ({}, testInfo) => {
|
||||
testLogger.testStart(testInfo.title, testInfo.file);
|
||||
});
|
||||
|
||||
for (const width of WIDTHS)
|
||||
for (const subTab of SUB_TABS) {
|
||||
test(
|
||||
`the title is fully visible and clear of the app picker on ${subTab} at ${width}px`,
|
||||
{ tag: TAGS },
|
||||
async ({ page }) => {
|
||||
await page.setViewportSize({ width, height: 800 });
|
||||
const pa = new PageManager(page).rumProductAnalyticsPage;
|
||||
await pa.goto(subTab, { app: seed.appId, period: "7d" });
|
||||
const title = page.locator('[data-test="rum-analytics-title"]');
|
||||
const picker = page
|
||||
.locator(
|
||||
'[data-test="rum-analytics-app-select"], [data-test="rum-analytics-app-label"]',
|
||||
)
|
||||
.first();
|
||||
await expect(title).toBeVisible({ timeout: 30000 });
|
||||
await expect(picker).toBeVisible({ timeout: 30000 });
|
||||
await expect(title).toContainText(/Product analytics/i);
|
||||
|
||||
const wide = width >= WIDE_FROM;
|
||||
await expect
|
||||
.poll(
|
||||
() =>
|
||||
page.evaluate((isWide) => {
|
||||
const q = (sel) => document.querySelector(sel);
|
||||
const rect = (el) => el.getBoundingClientRect();
|
||||
const header = q(".app-page-header");
|
||||
const title = q('[data-test="rum-analytics-title"]');
|
||||
const picker = q(
|
||||
'[data-test="rum-analytics-app-select"], [data-test="rum-analytics-app-label"]',
|
||||
);
|
||||
const tabs = q('[data-test^="rum-analytics-subtab-"]');
|
||||
const host = q('[data-test="rum-analytics-filters"]');
|
||||
if (!header || !title || !picker || !tabs || !host)
|
||||
return ["missing element"];
|
||||
const h = rect(header);
|
||||
const t = rect(title);
|
||||
const p = rect(picker);
|
||||
const tabTop = rect(tabs).top;
|
||||
const range = document.createRange();
|
||||
range.selectNodeContents(title);
|
||||
const bad = [];
|
||||
if (t.width < range.getBoundingClientRect().width)
|
||||
bad.push("title truncated");
|
||||
if (
|
||||
t.left < p.right &&
|
||||
p.left < t.right &&
|
||||
t.top < p.bottom &&
|
||||
p.top < t.bottom
|
||||
)
|
||||
bad.push("title overlaps picker");
|
||||
const inHeader = header.contains(host);
|
||||
if (isWide) {
|
||||
if (!inHeader) bad.push("filters not in header");
|
||||
if (getComputedStyle(host).display !== "contents")
|
||||
bad.push("filters wrapper is not display: contents");
|
||||
if (p.bottom > h.bottom + 1 || p.top < h.top - 1)
|
||||
bad.push("picker outside header");
|
||||
} else {
|
||||
if (inHeader) bad.push("filters still in header");
|
||||
const hb = rect(host);
|
||||
if (hb.top < h.bottom - 1)
|
||||
bad.push("band above header bottom");
|
||||
if (hb.bottom > tabTop + 1) bad.push("band covers tabs");
|
||||
for (const c of host.children) {
|
||||
if (rect(c).bottom > tabTop + 1)
|
||||
bad.push("filter covers tabs");
|
||||
}
|
||||
}
|
||||
for (const sel of [
|
||||
'[data-test="rum-analytics-date-picker"]',
|
||||
'[data-test="rum-analytics-refresh-btn"]',
|
||||
'[data-test="rum-analytics-share-btn"]',
|
||||
]) {
|
||||
const el = q(sel);
|
||||
if (!el) continue;
|
||||
const r = rect(el);
|
||||
if (r.bottom > h.bottom + 1 || r.top < h.top - 1)
|
||||
bad.push(`${sel} outside header`);
|
||||
}
|
||||
if (t.bottom > h.bottom + 1) bad.push("title outside header");
|
||||
return bad;
|
||||
}, wide),
|
||||
{ timeout: 15000 },
|
||||
)
|
||||
.toEqual([]);
|
||||
},
|
||||
);
|
||||
}
|
||||
});
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
// Heatmaps on an org whose _sessionreplay stream has no view_id (older SDK replay) must show the older-SDK state, not a 400.
|
||||
|
||||
const { test, expect } = require("../../utils/enhanced-baseFixtures.js");
|
||||
const testLogger = require("../../utils/test-logger.js");
|
||||
const PageManager = require("../../../pages/page-manager.js");
|
||||
const { sqlOf } = require("../../../pages/rumPages/rumProductAnalyticsPage.js");
|
||||
const {
|
||||
ensureRumStateOrg,
|
||||
seedBuilt,
|
||||
ensureSessionReplayStream,
|
||||
buildFunnelSessions,
|
||||
runAppId,
|
||||
} = require("../../utils/rum-analytics-ingestion.js");
|
||||
|
||||
const TAGS = [
|
||||
"@rum",
|
||||
"@rumAnalytics",
|
||||
"@bug-3268",
|
||||
"@P3",
|
||||
"@all",
|
||||
"@regression",
|
||||
"@rumRegression",
|
||||
];
|
||||
const SEARCH_URL = /\/api\/[^/]+\/_search(_stream)?(\?|$)/;
|
||||
const PAGE_URL = "https://shop.example.com/web/a";
|
||||
|
||||
test.describe("RUM Heatmaps without view_id in _sessionreplay", () => {
|
||||
test.describe.configure({ mode: "default" });
|
||||
test.use({ timezoneId: "UTC" });
|
||||
|
||||
let org = null;
|
||||
let appId = null;
|
||||
|
||||
test.beforeAll(async ({ browser }) => {
|
||||
const page = await browser.newPage();
|
||||
try {
|
||||
const { identifier } = await ensureRumStateOrg(page, "pa_hmnovid");
|
||||
const nowMs = Date.now();
|
||||
const seed = buildFunnelSessions(runAppId("pa-hmnovid"), nowMs, {
|
||||
replay: false,
|
||||
});
|
||||
const facts = await seedBuilt(page, seed, { nowMs, orgId: identifier });
|
||||
// The marker row carries no view_id, so the stream schema lacks the field.
|
||||
await ensureSessionReplayStream(page, facts.appId, nowMs, {
|
||||
orgId: identifier,
|
||||
});
|
||||
org = identifier;
|
||||
appId = facts.appId;
|
||||
} finally {
|
||||
await page.close();
|
||||
}
|
||||
});
|
||||
|
||||
test.beforeEach(async ({}, testInfo) => {
|
||||
testLogger.testStart(testInfo.title, testInfo.file);
|
||||
});
|
||||
|
||||
test(
|
||||
"the page snapshot shows the no-replay state and sends no view_id query",
|
||||
{
|
||||
tag: TAGS,
|
||||
},
|
||||
async ({ page }) => {
|
||||
const pa = new PageManager(page).rumProductAnalyticsPage;
|
||||
const bad = [];
|
||||
const replaySql = [];
|
||||
page.on("response", (r) => {
|
||||
if (!SEARCH_URL.test(r.url())) return;
|
||||
const sql = sqlOf(r.request());
|
||||
if (/FROM "_sessionreplay"/.test(sql)) replaySql.push(sql);
|
||||
if (r.status() === 400) bad.push(sql.slice(0, 300));
|
||||
});
|
||||
|
||||
await pa.goto(
|
||||
"heatmaps",
|
||||
{ app: appId, period: "7d", page_url: PAGE_URL },
|
||||
{ org },
|
||||
);
|
||||
|
||||
const notice = page.locator('[data-test="rum-heatmap-snapshot-error"]');
|
||||
await expect(notice).toBeVisible({ timeout: 60000 });
|
||||
await expect(notice).toContainText("Page snapshots need a newer RUM SDK");
|
||||
await expect(notice).not.toContainText("Couldn't load the page snapshot");
|
||||
await pa.waitForNetworkQuiet();
|
||||
expect(
|
||||
replaySql.filter((s) => /view_id/.test(s)),
|
||||
"no _sessionreplay query references view_id",
|
||||
).toEqual([]);
|
||||
expect(bad, bad.join("\n")).toEqual([]);
|
||||
},
|
||||
);
|
||||
});
|
||||
@@ -0,0 +1,52 @@
|
||||
// Product Analytics empty state offers "Show the past 30 days" only when the range is shorter than 30 days.
|
||||
|
||||
const { test, expect } = require("../../utils/enhanced-baseFixtures.js");
|
||||
const testLogger = require("../../utils/test-logger.js");
|
||||
const PageManager = require("../../../pages/page-manager.js");
|
||||
const {
|
||||
runAppId,
|
||||
seedViewsOnlyApp,
|
||||
} = require("../../utils/rum-analytics-ingestion.js");
|
||||
|
||||
const TAGS = ["@bug-3268", "@P3", "@regression", "@rumRegression"];
|
||||
|
||||
test.describe("Product Analytics widen-range action", () => {
|
||||
test.use({ timezoneId: "UTC" });
|
||||
const emptyAppId = runAppId("pa-3268-empty");
|
||||
|
||||
// Another app's rows give the org a _rumdata schema, so the empty app shows the empty overview, not onboarding.
|
||||
test.beforeAll(async ({ browser }) => {
|
||||
const page = await browser.newPage();
|
||||
try {
|
||||
await seedViewsOnlyApp(page, { appId: runAppId("pa-3268-other") });
|
||||
} finally {
|
||||
await page.close();
|
||||
}
|
||||
});
|
||||
|
||||
test.beforeEach(async ({}, testInfo) => {
|
||||
testLogger.testStart(testInfo.title, testInfo.file);
|
||||
});
|
||||
|
||||
test(
|
||||
"the empty overview has no widen button at the past 30 days",
|
||||
{ tag: TAGS },
|
||||
async ({ page }) => {
|
||||
const pa = new PageManager(page).rumProductAnalyticsPage;
|
||||
await pa.goto("overview", { app: emptyAppId, period: "30d" });
|
||||
await expect(pa.overviewEmpty).toBeVisible({ timeout: 30000 });
|
||||
await expect(pa.widenRangeBtn).toHaveCount(0);
|
||||
},
|
||||
);
|
||||
|
||||
test(
|
||||
"the empty overview still offers the widen button at the past 1 day",
|
||||
{ tag: TAGS },
|
||||
async ({ page }) => {
|
||||
const pa = new PageManager(page).rumProductAnalyticsPage;
|
||||
await pa.goto("overview", { app: emptyAppId, period: "1d" });
|
||||
await expect(pa.overviewEmpty).toBeVisible({ timeout: 30000 });
|
||||
await expect(pa.widenRangeBtn).toBeVisible();
|
||||
},
|
||||
);
|
||||
});
|
||||
+99
@@ -0,0 +1,99 @@
|
||||
const {
|
||||
test,
|
||||
expect,
|
||||
navigateToBase,
|
||||
} = require("../../utils/enhanced-baseFixtures.js");
|
||||
const testLogger = require("../../utils/test-logger.js");
|
||||
const PageManager = require("../../../pages/page-manager.js");
|
||||
const {
|
||||
SessionBuilder,
|
||||
runAppId,
|
||||
seedBuilt,
|
||||
} = require("../../utils/rum-analytics-ingestion.js");
|
||||
|
||||
const TAGS = ["@bug-3268", "@P2", "@regression", "@rumRegression"];
|
||||
const HEATMAP_BTN = '[data-test="rum-app-sessions-view-heatmap-btn"]';
|
||||
const DURATION = '[data-test="session-viewer-duration"]';
|
||||
|
||||
test.describe("RUM Sessions list links carry a real time range", () => {
|
||||
test.describe.configure({ mode: "default" });
|
||||
const appId = runAppId("pa-3268-nan");
|
||||
|
||||
test.beforeAll(async ({ browser }) => {
|
||||
const page = await browser.newPage();
|
||||
try {
|
||||
const nowMs = Date.now();
|
||||
const session = new SessionBuilder(
|
||||
appId,
|
||||
`${appId}-s1`,
|
||||
nowMs - 20 * 60 * 1000,
|
||||
{ user: "nan@e2e.test" },
|
||||
);
|
||||
session
|
||||
.view("https://shop.example.com/web/a")
|
||||
.wait(60000)
|
||||
.click("buy", "https://shop.example.com/web/a");
|
||||
session.rows.forEach((row) => {
|
||||
row.service = appId;
|
||||
});
|
||||
await seedBuilt(
|
||||
page,
|
||||
{ rows: session.rows, facts: { appId } },
|
||||
{ nowMs },
|
||||
);
|
||||
} finally {
|
||||
await page.close();
|
||||
}
|
||||
});
|
||||
|
||||
test.beforeEach(async ({ page }, testInfo) => {
|
||||
testLogger.testStart(testInfo.title, testInfo.file);
|
||||
await navigateToBase(page);
|
||||
});
|
||||
|
||||
test(
|
||||
"opening a session without replay puts finite start_time and end_time in the URL and keeps its duration on reload",
|
||||
{
|
||||
tag: TAGS,
|
||||
},
|
||||
async ({ page }) => {
|
||||
const pm = new PageManager(page);
|
||||
const sessions = pm.rumSessionsPage;
|
||||
|
||||
await sessions.gotoSessionsList({ service: appId, period: "1d" });
|
||||
await sessions.expectSessionsTableVisible();
|
||||
await sessions.waitForSessionRowsPresent();
|
||||
|
||||
const noReplayRow = sessions.tableRow
|
||||
.filter({ hasNot: page.locator(HEATMAP_BTN) })
|
||||
.first();
|
||||
await expect(noReplayRow).toBeVisible();
|
||||
|
||||
await noReplayRow.click();
|
||||
await expect(page).toHaveURL(/\/rum\/sessions\/view\//, {
|
||||
timeout: 15000,
|
||||
});
|
||||
|
||||
const url = page.url();
|
||||
testLogger.info("Session viewer URL", { url });
|
||||
expect(url).not.toContain("NaN");
|
||||
const query = new URL(url).searchParams;
|
||||
for (const key of ["start_time", "end_time"]) {
|
||||
expect(
|
||||
Number.isFinite(Number(query.get(key))),
|
||||
`${key} must be a finite number`,
|
||||
).toBe(true);
|
||||
expect(
|
||||
Number(query.get(key)),
|
||||
`${key} must be a real timestamp`,
|
||||
).toBeGreaterThan(0);
|
||||
}
|
||||
expect(Number(query.get("end_time"))).toBeGreaterThanOrEqual(
|
||||
Number(query.get("start_time")),
|
||||
);
|
||||
|
||||
await page.reload();
|
||||
await expect(page.locator(DURATION)).toBeVisible({ timeout: 30000 });
|
||||
},
|
||||
);
|
||||
});
|
||||
+217
@@ -0,0 +1,217 @@
|
||||
// Clock skew made the trace end precede the event date, so the duration clamped to 0us; fall back to the span length.
|
||||
|
||||
const {
|
||||
test,
|
||||
expect,
|
||||
navigateToBase,
|
||||
} = require("../../utils/enhanced-baseFixtures.js");
|
||||
const testLogger = require("../../utils/test-logger.js");
|
||||
const {
|
||||
getAuthHeaders,
|
||||
getOrgIdentifier,
|
||||
} = require("../../utils/cloud-auth.js");
|
||||
const crypto = require("crypto");
|
||||
const { ingestBase } = require("../../utils/ingest-url.js");
|
||||
|
||||
const TRACE_ID_FIELD = "_o2_trace_id";
|
||||
const SKEW_MS = 5000;
|
||||
const SPAN_MS = 150;
|
||||
|
||||
const hex = (bytes) => crypto.randomBytes(bytes).toString("hex");
|
||||
|
||||
function buildFixture() {
|
||||
return {
|
||||
sessionId: `e2e${hex(6)}`,
|
||||
viewId: hex(8),
|
||||
traceId: hex(16),
|
||||
now: Date.now(),
|
||||
op: "GET /api/skewed",
|
||||
url: "https://shop.example.com/api/skewed",
|
||||
};
|
||||
}
|
||||
|
||||
function rumRows({ sessionId, viewId, traceId, now, url }) {
|
||||
const base = {
|
||||
session_id: sessionId,
|
||||
view_id: viewId,
|
||||
view_url: "https://shop.example.com/checkout",
|
||||
view_loading_type: "initial_load",
|
||||
service: "shop-frontend",
|
||||
application_id: "e2e-rum-app",
|
||||
source: "browser",
|
||||
};
|
||||
const traceEnd = now - 60000 + SPAN_MS;
|
||||
return [
|
||||
{
|
||||
...base,
|
||||
_timestamp: (now - 60000) * 1000,
|
||||
date: now - 60000,
|
||||
type: "view",
|
||||
usr_id: "e2e-user",
|
||||
},
|
||||
{
|
||||
...base,
|
||||
_timestamp: (now - 60000 + 500) * 1000,
|
||||
date: traceEnd + SKEW_MS,
|
||||
type: "resource",
|
||||
resource_url: url,
|
||||
resource_type: "fetch",
|
||||
resource_method: "GET",
|
||||
resource_status_code: 200,
|
||||
resource_duration: SPAN_MS * 1000000,
|
||||
[TRACE_ID_FIELD]: traceId,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
function tracePayload({ now, traceId, op, url }) {
|
||||
const attr = (key, value) => ({ key, value: { stringValue: String(value) } });
|
||||
const startNs = BigInt(now - 60000) * 1000000n;
|
||||
return {
|
||||
resourceSpans: [
|
||||
{
|
||||
resource: { attributes: [attr("service.name", "shop-api")] },
|
||||
scopeSpans: [
|
||||
{
|
||||
scope: { name: "rum-skew" },
|
||||
spans: [
|
||||
{
|
||||
traceId,
|
||||
spanId: hex(8),
|
||||
name: op,
|
||||
kind: 2,
|
||||
startTimeUnixNano: String(startNs),
|
||||
endTimeUnixNano: String(startNs + BigInt(SPAN_MS) * 1000000n),
|
||||
attributes: [attr("http.url", url)],
|
||||
status: { code: 1 },
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
test.describe("RUM session trace duration under clock skew", () => {
|
||||
test.describe.configure({ mode: "serial" });
|
||||
|
||||
let fixture;
|
||||
|
||||
test.beforeAll(async ({ browser }) => {
|
||||
const context = await browser.newContext({
|
||||
storageState: "playwright-tests/utils/auth/user.json",
|
||||
});
|
||||
const page = await context.newPage();
|
||||
try {
|
||||
fixture = buildFixture();
|
||||
const org = getOrgIdentifier() || "default";
|
||||
const headers = getAuthHeaders();
|
||||
const base = (
|
||||
process.env["INGESTION_URL"] ||
|
||||
process.env["ZO_BASE_URL"] ||
|
||||
""
|
||||
).replace(/\/+$/, "");
|
||||
|
||||
const rum = await page.request.post(
|
||||
`${ingestBase(base)}/api/${org}/_rumdata/_json`,
|
||||
{
|
||||
headers,
|
||||
data: rumRows(fixture),
|
||||
},
|
||||
);
|
||||
expect(rum.status(), "RUM events must ingest").toBe(200);
|
||||
|
||||
const traces = await page.request.post(
|
||||
`${ingestBase(base)}/api/${org}/v1/traces`,
|
||||
{
|
||||
headers,
|
||||
data: tracePayload(fixture),
|
||||
},
|
||||
);
|
||||
expect(traces.status(), "skewed trace must ingest").toBe(200);
|
||||
|
||||
await expect
|
||||
.poll(
|
||||
async () => {
|
||||
const res = await page.request.post(
|
||||
`${base}/api/${org}/_search?type=logs`,
|
||||
{
|
||||
headers,
|
||||
data: {
|
||||
query: {
|
||||
sql: `SELECT COUNT(*) AS n FROM "_rumdata" WHERE session_id = '${fixture.sessionId}'`,
|
||||
start_time: (fixture.now - 3600000) * 1000,
|
||||
end_time: (fixture.now + 3600000) * 1000,
|
||||
from: 0,
|
||||
size: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
);
|
||||
if (!res.ok()) return 0;
|
||||
return Number(((await res.json()).hits || [])[0]?.n || 0);
|
||||
},
|
||||
{ message: "RUM events must be searchable", timeout: 90000 },
|
||||
)
|
||||
.toBeGreaterThanOrEqual(2);
|
||||
|
||||
testLogger.info("Ingested RUM skew fixture", {
|
||||
sessionId: fixture.sessionId,
|
||||
});
|
||||
} finally {
|
||||
await page.close();
|
||||
await context.close();
|
||||
}
|
||||
});
|
||||
|
||||
test.beforeEach(async ({ page }, testInfo) => {
|
||||
testLogger.testStart(testInfo.title, testInfo.file);
|
||||
await navigateToBase(page);
|
||||
const baseUrl = (process.env["ZO_BASE_URL"] || "").replace(/\/+$/, "");
|
||||
const org = getOrgIdentifier() || "default";
|
||||
await page.goto(
|
||||
`${baseUrl}/web/rum/sessions/view/${fixture.sessionId}?org_identifier=${org}`,
|
||||
);
|
||||
await page
|
||||
.waitForLoadState("networkidle", { timeout: 30000 })
|
||||
.catch(() => {});
|
||||
});
|
||||
|
||||
test.afterEach(async ({}, testInfo) => {
|
||||
testLogger.testEnd(testInfo.title, testInfo.status);
|
||||
});
|
||||
|
||||
test(
|
||||
"P3: a trace that ends before its RUM request shows the span duration, not 0us",
|
||||
{
|
||||
tag: [
|
||||
"@rum",
|
||||
"@sessionReplay",
|
||||
"@bug-3268",
|
||||
"@regression",
|
||||
"@P3",
|
||||
"@all",
|
||||
],
|
||||
},
|
||||
async ({ page }) => {
|
||||
const row = page
|
||||
.locator('[data-test^="o2-table-row-"]')
|
||||
.filter({ hasText: fixture.op });
|
||||
// The trace lands in search after the RUM rows, so reload until it shows up.
|
||||
await expect(async () => {
|
||||
await page.reload();
|
||||
await page.locator('[data-test="tab-traces"]').click();
|
||||
await expect(
|
||||
page.locator('[data-test="rum-player-traces-tab-table"]'),
|
||||
).toBeVisible({ timeout: 15000 });
|
||||
await expect(row).toHaveCount(1, { timeout: 5000 });
|
||||
}).toPass({ timeout: 90000, intervals: [3000] });
|
||||
// The duration is rendered from microsecond timestamps, so it may land a millisecond under the seeded span.
|
||||
await expect(row).toContainText(
|
||||
new RegExp(`(${SPAN_MS - 1}|${SPAN_MS})(\\.\\d+)?ms`),
|
||||
);
|
||||
await expect(row).not.toContainText("0us");
|
||||
},
|
||||
);
|
||||
});
|
||||
@@ -883,6 +883,68 @@ describe("PlayerTracesTab", () => {
|
||||
expect(wrapper.text()).toContain("523ms");
|
||||
});
|
||||
|
||||
it("should fall back to the span duration when the trace ends before the RUM request", async () => {
|
||||
wrapper.unmount();
|
||||
|
||||
// _date = 5000ms but the trace ended at 1150ms (clock skew); span lasted 150ms.
|
||||
setupSuccessfulMocks(
|
||||
[createRumHit({ _date: 5000 })],
|
||||
[createTraceMetadata({ start_time: 1_000_000_000, end_time: 1_150_000_000 })],
|
||||
);
|
||||
|
||||
wrapper = mountComponent();
|
||||
await flushPromises();
|
||||
|
||||
expect(wrapper.text()).toContain("150ms");
|
||||
expect(wrapper.text()).not.toContain("0us");
|
||||
|
||||
await wrapper.find('[data-test="table-row-0"]').trigger("click");
|
||||
await nextTick();
|
||||
expect(wrapper.text()).toContain("150ms");
|
||||
});
|
||||
|
||||
it("should show a dash and no timer chip when the trace has no usable duration", async () => {
|
||||
wrapper.unmount();
|
||||
|
||||
// Trace ended before the RUM request and the span has zero length.
|
||||
setupSuccessfulMocks(
|
||||
[createRumHit({ _date: 5000 })],
|
||||
[createTraceMetadata({ start_time: 1_000_000_000, end_time: 1_000_000_000 })],
|
||||
);
|
||||
|
||||
wrapper = mountComponent();
|
||||
await flushPromises();
|
||||
|
||||
expect(wrapper.find('[data-test="table-row-0"]').text()).toContain("—");
|
||||
|
||||
await wrapper.find('[data-test="table-row-0"]').trigger("click");
|
||||
await nextTick();
|
||||
expect(wrapper.find('[data-test="rum-player-traces-tab-seek-btn"]').exists()).toBe(true);
|
||||
expect(wrapper.html()).not.toContain('name="timer"');
|
||||
});
|
||||
|
||||
it("should match the Slow filter on the span duration when the trace ends before the RUM request", async () => {
|
||||
wrapper.unmount();
|
||||
|
||||
setupSuccessfulMocks(
|
||||
[createRumHit({ _date: 9000 })],
|
||||
[createTraceMetadata({ start_time: 1_000_000_000, end_time: 2_500_000_000 })],
|
||||
);
|
||||
|
||||
wrapper = mountComponent();
|
||||
await flushPromises();
|
||||
|
||||
const status = wrapper
|
||||
.findAllComponents({ name: "OSelect" })
|
||||
.find(
|
||||
(select) => select.attributes("data-test") === "rum-player-traces-tab-status-filter",
|
||||
)!;
|
||||
status.vm.$emit("update:modelValue", ["slow"]);
|
||||
await flushPromises();
|
||||
|
||||
expect(wrapper.findAll('[data-test^="table-row-"]')).toHaveLength(1);
|
||||
});
|
||||
|
||||
it("should display error count badge in detail header when trace has errors", async () => {
|
||||
wrapper.unmount();
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
{{ traceTimeOffset(selectedTrace.metadata.start_time) }}
|
||||
</button>
|
||||
<span
|
||||
v-if="selectedTrace.metadata?.e2eDuration"
|
||||
v-if="selectedTrace.metadata?.e2eDuration != null"
|
||||
class="rounded-default text-2xs bg-surface-accent text-text-body inline-flex items-center gap-1 px-1.5 py-0.5 whitespace-nowrap"
|
||||
>
|
||||
<OIcon name="timer" size="xs" class="text-text-secondary" />
|
||||
@@ -231,7 +231,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</template>
|
||||
<template #cell-duration="{ row }">
|
||||
<span class="text-xs tabular-nums">
|
||||
{{ formatTimeWithSuffix(row.metadata?.e2eDuration * 1000) }}
|
||||
{{
|
||||
row.metadata?.e2eDuration != null
|
||||
? formatTimeWithSuffix(row.metadata.e2eDuration * 1000)
|
||||
: "—"
|
||||
}}
|
||||
</span>
|
||||
</template>
|
||||
<template #cell-status="{ row }">
|
||||
@@ -347,6 +351,18 @@ const pageOptions = computed(() =>
|
||||
})),
|
||||
);
|
||||
|
||||
// Clock skew can put the trace end before the RUM request, so fall back to the span's own length.
|
||||
function traceDurationMs(rumDateMs: number, meta: any): number | null {
|
||||
const endToEndMs =
|
||||
rumDateMs && meta.end_time ? Math.floor(meta.end_time / 1_000_000) - rumDateMs : 0;
|
||||
if (endToEndMs > 0) return endToEndMs;
|
||||
const spanMs =
|
||||
meta.start_time && meta.end_time
|
||||
? Math.floor((meta.end_time - meta.start_time) / 1_000_000)
|
||||
: 0;
|
||||
return spanMs > 0 ? spanMs : null;
|
||||
}
|
||||
|
||||
// Like the Breadcrumbs type filter: a trace shows if it matches any checked status,
|
||||
// and an empty selection shows every trace.
|
||||
function matchesTraceStatus(view: any): boolean {
|
||||
@@ -792,10 +808,7 @@ async function fetchTraces() {
|
||||
.filter((view) => metadata[view.traceId])
|
||||
.map((view) => {
|
||||
const meta = metadata[view.traceId];
|
||||
const e2eDuration =
|
||||
view.rumDate && meta.end_time
|
||||
? Math.max(0, Math.floor(meta.end_time / 1_000_000) - view.rumDate)
|
||||
: 0;
|
||||
const e2eDuration = traceDurationMs(view.rumDate, meta);
|
||||
return { ...view, metadata: { ...meta, e2eDuration: e2eDuration } };
|
||||
})
|
||||
.sort((a, b) => (a.metadata.start_time ?? 0) - (b.metadata.start_time ?? 0));
|
||||
|
||||
@@ -603,6 +603,23 @@ describe("AnalyticsFunnels", () => {
|
||||
expect(useProductAnalytics().state.datetime.relativeTimePeriod).toBe("30d");
|
||||
});
|
||||
|
||||
it("an empty step 1 offers no widen action once the range is already 30 days (#3268)", async () => {
|
||||
routes = [[/FROM ps LIMIT 1/, [{ c1: 0, c2: 0, seen1: 0, seen2: 0 }]], ...baseRoutes()];
|
||||
respond();
|
||||
await mountFunnels();
|
||||
useProductAnalytics().setScope({
|
||||
datetime: { valueType: "relative", relativeTimePeriod: "30d", startTime: 0, endTime: 0 },
|
||||
});
|
||||
await setSteps([
|
||||
["p", "/nowhere"],
|
||||
["c", "b"],
|
||||
]);
|
||||
expect(text("rum-analytics-funnel-step1-empty")).toContain("/nowhere");
|
||||
expect(wrapper!.find('[data-test="rum-analytics-funnel-widen-range-btn"]').exists()).toBe(
|
||||
false,
|
||||
);
|
||||
});
|
||||
|
||||
it("tags a step never seen in range while the funnel still computes (AC-21)", async () => {
|
||||
routes = [[/FROM ps LIMIT 1/, [{ c1: 100, c2: 0, seen1: 150, seen2: 0 }]], ...baseRoutes()];
|
||||
respond();
|
||||
|
||||
@@ -602,6 +602,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<template #actions>
|
||||
<OButton
|
||||
v-if="pa.canWidenRange.value"
|
||||
variant="outline"
|
||||
size="md"
|
||||
icon-left="schedule"
|
||||
|
||||
@@ -455,6 +455,28 @@ describe("AnalyticsOverview", () => {
|
||||
expect(useProductAnalytics().state.datetime.relativeTimePeriod).toBe("30d");
|
||||
});
|
||||
|
||||
it.each([
|
||||
["30d", true],
|
||||
["90d", true],
|
||||
["1d", false],
|
||||
["15m", false],
|
||||
])("empty state at period %s hides the widen action: %s", async (period, hidden) => {
|
||||
routes = [
|
||||
[/va_rows/, [{ ...SUMMARY, sessions: 0 }]],
|
||||
[/AS app, COUNT/, [{ app: "web", sessions: 0 }]],
|
||||
];
|
||||
respond();
|
||||
await mountOverview();
|
||||
useProductAnalytics().setScope({
|
||||
datetime: { valueType: "relative", relativeTimePeriod: period, startTime: 0, endTime: 0 },
|
||||
});
|
||||
await flushPromises();
|
||||
expect(wrapper!.find('[data-test="rum-analytics-overview-empty"]').exists()).toBe(true);
|
||||
expect(wrapper!.find('[data-test="rum-analytics-overview-widen-range-btn"]').exists()).toBe(
|
||||
!hidden,
|
||||
);
|
||||
});
|
||||
|
||||
it("explains missing click tracking while pages still render (AC-8)", async () => {
|
||||
routes = baseRoutes().map(([re, v]) =>
|
||||
String(re) === String(/AS clicks/) ? [re, []] : [re, v],
|
||||
|
||||
@@ -52,6 +52,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<template #actions>
|
||||
<OButton
|
||||
v-if="pa.canWidenRange.value"
|
||||
variant="primary"
|
||||
size="sm"
|
||||
data-test="rum-analytics-overview-widen-range-btn"
|
||||
|
||||
@@ -397,6 +397,37 @@ describe("AnalyticsPaths", () => {
|
||||
expect(pathSqls()).toEqual([]);
|
||||
});
|
||||
|
||||
it.each([
|
||||
["30d", false],
|
||||
["1d", true],
|
||||
])("the no-entry-pages widen button at a %s range is present: %s", async (period, shown) => {
|
||||
entryRows = [];
|
||||
await mountPaths(() => {
|
||||
useProductAnalytics().setScope({
|
||||
datetime: { valueType: "relative", relativeTimePeriod: period, startTime: 0, endTime: 0 },
|
||||
});
|
||||
});
|
||||
expect(wrapper!.find('[data-test="rum-analytics-paths-no-anchor"]').exists()).toBe(true);
|
||||
expect(
|
||||
wrapper!.find('[data-test="rum-analytics-paths-no-anchor-widen-range-btn"]').exists(),
|
||||
).toBe(shown);
|
||||
});
|
||||
|
||||
it.each([
|
||||
["30d", false],
|
||||
["1d", true],
|
||||
])("the empty-flow widen button at a %s range is present: %s", async (period, shown) => {
|
||||
pathRows = [];
|
||||
await mountPaths(() => {
|
||||
useProductAnalytics().setScope({
|
||||
datetime: { valueType: "relative", relativeTimePeriod: period, startTime: 0, endTime: 0 },
|
||||
});
|
||||
useProductAnalytics().paths.value = COHORT_DEF();
|
||||
});
|
||||
expect(wrapper!.find('[data-test="rum-analytics-paths-empty"]').exists()).toBe(true);
|
||||
expect(wrapper!.find('[data-test="rum-analytics-paths-widen-range-btn"]').exists()).toBe(shown);
|
||||
});
|
||||
|
||||
it("a cold tab anchors at the top entry page", async () => {
|
||||
await mountPaths();
|
||||
expect(useProductAnalytics().paths.value.anchor).toEqual({ kind: "p", key: "/web/login" });
|
||||
|
||||
@@ -228,6 +228,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<template #actions>
|
||||
<OButton
|
||||
v-if="pa.canWidenRange.value"
|
||||
variant="outline"
|
||||
size="md"
|
||||
data-test="rum-analytics-paths-no-anchor-widen-range-btn"
|
||||
@@ -270,6 +271,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>{{ t("rum.analytics.pathsView.backToFunnel") }}</OButton
|
||||
>
|
||||
<OButton
|
||||
v-if="pa.canWidenRange.value"
|
||||
variant="outline"
|
||||
size="md"
|
||||
data-test="rum-analytics-paths-widen-range-btn"
|
||||
|
||||
@@ -302,6 +302,22 @@ describe("AnalyticsRetention", () => {
|
||||
expect(gridSqls()).toHaveLength(0);
|
||||
});
|
||||
|
||||
it("the too-short empty state at 1d offers the widen button", async () => {
|
||||
await mountRetention({ period: "1d" });
|
||||
expect(wrapper!.find('[data-test="rum-analytics-retention-widen-range-btn"]').exists()).toBe(
|
||||
true,
|
||||
);
|
||||
});
|
||||
|
||||
it("the too-short empty state at 30d (range clipped to data start) has no widen button", async () => {
|
||||
streamStats.doc_time_min = Date.now() * 1000 - 2 * DAY_US;
|
||||
await mountRetention({ period: "30d" });
|
||||
expect(wrapper!.find('[data-test="rum-analytics-retention-too-short"]').exists()).toBe(true);
|
||||
expect(wrapper!.find('[data-test="rum-analytics-retention-widen-range-btn"]').exists()).toBe(
|
||||
false,
|
||||
);
|
||||
});
|
||||
|
||||
it("the legend says a cell click shows who returned", async () => {
|
||||
await mountRetention();
|
||||
expect(wrapper!.find('[data-test="rum-analytics-retention-cell-hint"]').text()).toBe(
|
||||
|
||||
@@ -127,7 +127,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<template #actions>
|
||||
<OButton
|
||||
v-if="periodState === 'tooShort'"
|
||||
v-if="periodState === 'tooShort' && pa.canWidenRange.value"
|
||||
variant="outline"
|
||||
size="md"
|
||||
data-test="rum-analytics-retention-widen-range-btn"
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { createMemoryHistory, createRouter } from "vue-router";
|
||||
import { flushPromises } from "@vue/test-utils";
|
||||
import * as dateUtils from "@/utils/date";
|
||||
|
||||
vi.mock("@/services/search", async (importOriginal) => {
|
||||
const { overlayServiceMock } = await import("@/test/unit/helpers/mockService");
|
||||
@@ -467,6 +468,57 @@ describe("useProductAnalytics", () => {
|
||||
expect(pa.deletedEventLink.value).toBe(false);
|
||||
});
|
||||
|
||||
it.each([
|
||||
["15m", true],
|
||||
["1d", true],
|
||||
["7d", true],
|
||||
["30d", false],
|
||||
["90d", false],
|
||||
])("canWidenRange for a relative %s range is %s", (period, expected) => {
|
||||
const pa = useProductAnalytics();
|
||||
pa.initFromRoute({ app: "web" });
|
||||
pa.setScope({
|
||||
datetime: { valueType: "relative", relativeTimePeriod: period, startTime: 0, endTime: 0 },
|
||||
});
|
||||
expect(pa.canWidenRange.value).toBe(expected);
|
||||
});
|
||||
|
||||
it("canWidenRange is false for a relative 30d range that spans 719h across a DST change", () => {
|
||||
const end = Date.now() * 1000;
|
||||
vi.spyOn(dateUtils, "getConsumableRelativeTime").mockReturnValue({
|
||||
startTime: end - (30 * 24 - 1) * 3600 * 1_000_000,
|
||||
endTime: end,
|
||||
});
|
||||
try {
|
||||
const pa = useProductAnalytics();
|
||||
pa.initFromRoute({ app: "web" });
|
||||
pa.setScope({
|
||||
datetime: { valueType: "relative", relativeTimePeriod: "30d", startTime: 0, endTime: 0 },
|
||||
});
|
||||
expect(pa.canWidenRange.value).toBe(false);
|
||||
} finally {
|
||||
vi.restoreAllMocks();
|
||||
}
|
||||
});
|
||||
|
||||
it.each([
|
||||
[2, true],
|
||||
[40, false],
|
||||
])("canWidenRange for an absolute %s-day range is %s", (days, expected) => {
|
||||
const pa = useProductAnalytics();
|
||||
pa.initFromRoute({ app: "web" });
|
||||
const end = Date.now() * 1000;
|
||||
pa.setScope({
|
||||
datetime: {
|
||||
valueType: "absolute",
|
||||
relativeTimePeriod: undefined,
|
||||
startTime: end - days * 24 * 3600 * 1_000_000,
|
||||
endTime: end,
|
||||
},
|
||||
});
|
||||
expect(pa.canWidenRange.value).toBe(expected);
|
||||
});
|
||||
|
||||
it("the scope key changes with app, range and the identity and exact toggles", () => {
|
||||
const pa = useProductAnalytics();
|
||||
pa.initFromRoute({ app: "web", from: "100", to: "200" });
|
||||
|
||||
@@ -121,6 +121,9 @@ interface FacetRow {
|
||||
type UsRange = { startUs: number; endUs: number };
|
||||
|
||||
const DEFAULT_PERIOD = "7d";
|
||||
const WIDEN_RANGE_US = 30 * 24 * 3600 * 1_000_000;
|
||||
// DST makes 30 calendar days 719h, so the threshold gets an hour of slack.
|
||||
const DST_TOLERANCE_US = 3600 * 1_000_000;
|
||||
export const PICKER_LIMIT = 200;
|
||||
const SEARCH_STREAM_NOT_FOUND = 20002;
|
||||
const PATH_KEYS = ["anchor", "dir", "depth", "inc", "cohort"] as const;
|
||||
@@ -555,6 +558,16 @@ export default function useProductAnalytics() {
|
||||
void syncUrl(router);
|
||||
};
|
||||
|
||||
const canWidenRange = computed(() => {
|
||||
const dt = state.datetime;
|
||||
let span = dt.endTime - dt.startTime;
|
||||
if (dt.valueType === "relative") {
|
||||
const r = getConsumableRelativeTime(dt.relativeTimePeriod ?? DEFAULT_PERIOD);
|
||||
span = r ? r.endTime - r.startTime : 0;
|
||||
}
|
||||
return span < WIDEN_RANGE_US - DST_TOLERANCE_US;
|
||||
});
|
||||
|
||||
const setScope = (patch: Partial<AnalyticsScopeState>, explicitApp = false) => {
|
||||
if (patch.datetime) range.value = null;
|
||||
if (patch.app !== undefined && patch.app !== state.app) savedLinkIssue.value = null;
|
||||
@@ -1149,6 +1162,7 @@ export default function useProductAnalytics() {
|
||||
syncedSignature: readonly(syncedSignature),
|
||||
setScope,
|
||||
widenRange,
|
||||
canWidenRange,
|
||||
resolveRange,
|
||||
loadScope,
|
||||
pickerOptions,
|
||||
|
||||
@@ -33,7 +33,7 @@ export default function useSessionHeatmap() {
|
||||
const openingSessionId = ref("");
|
||||
|
||||
// The window always reaches back to the session so an old session's page is still in the list.
|
||||
async function openSessionHeatmap(sessionId: string, sessionStartUs: number) {
|
||||
async function openSessionHeatmap(sessionId: string, sessionStartUs?: number) {
|
||||
if (!sessionId || opening.value) return;
|
||||
opening.value = true;
|
||||
openingSessionId.value = sessionId;
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "منظر",
|
||||
"frustration": "الإحباط",
|
||||
"failedRequest": "الطلبات الفاشلة",
|
||||
"noResponse": "لا استجابة"
|
||||
"noResponse": "لا استجابة",
|
||||
"noResponseStatus": "0 — لا استجابة",
|
||||
"failedRequestDetails": "تفاصيل الطلب الفاشل",
|
||||
"browserStatus": "حالة المتصفح",
|
||||
"serverStatus": "حالة الخادم",
|
||||
"noServerSpanFound": "لم يُعثر على امتداد خادم",
|
||||
"noServerSpanHint": "قد يعني غياب الامتداد أيضًا أخذ العينات أو تأخر الاستيعاب أو مسارًا غير مُجهّز بالتتبع أو الاحتفاظ بالبيانات.",
|
||||
"unknownNoTrace": "غير معروف (لا يوجد تتبع)",
|
||||
"unknown": "غير معروف",
|
||||
"abortedByApp": "أُلغي بواسطة التطبيق",
|
||||
"method": "الطريقة",
|
||||
"url": "URL",
|
||||
"duration": "المدة",
|
||||
"timing": "التوقيت",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "الاتصال",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "أول بايت",
|
||||
"timingDownload": "التنزيل",
|
||||
"size": "الحجم",
|
||||
"initiatedBy": "المُبادر"
|
||||
},
|
||||
"replayCanvasNotRecorded": "لم يتم تسجيل محتوى Canvas",
|
||||
"actionOnTarget": "{action} في \"{target}\"",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "الصفحة",
|
||||
"noDeviceData": "لم تُسجّل أي نقرات على نوع الجهاز هذا لهذه الصفحة.",
|
||||
"noReplay": "لم يتم تسجيل إعادة تشغيل جلسة لهذه الصفحة، لذلك لا توجد لقطة شاشة للرسم عليها. فعّل إعادة تشغيل الجلسة للتطبيق.",
|
||||
"noReplayLegacySdk": "تحتاج لقطات الصفحة إلى إصدار أحدث من RUM SDK. إعادة تشغيل الجلسة المسجلة هنا تأتي من SDK أقدم، لذا لا توجد لقطة شاشة للرسم عليها.",
|
||||
"loadFailed": "تعذّر تحميل بيانات النقرات.",
|
||||
"snapshotFailed": "تعذّر تحميل لقطة الصفحة.",
|
||||
"noPosition": "لا توجد نقرات في هذه الفترة لهذه الصفحة.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "يتم التحقق كل {seconds} ث · بدأ منذ {elapsed}",
|
||||
"metaSince": "يتم التحقق كل {seconds} ث · بدأ منذ {elapsed} · يحسب فقط السجلات بعد {time}",
|
||||
"hintWaiting": "يتحول هذا إلى اللون الأخضر تلقائيًا عند وصول أول سجل. إذا لم يصل شيء خلال دقيقتين، فسيظهر ما الذي حدث بشكل خاطئ؛ استكشاف الأخطاء يفحص الآن.",
|
||||
"hintWaitingAfter": "يتحول هذا إلى اللون الأخضر من تلقاء نفسه عند وصول أول سجل. إذا لم يصل شيء خلال {elapsed} فسيعرض سبب المشكلة؛ تتحقق أداة استكشاف الأخطاء الآن.",
|
||||
"hintWaitingLate": "يتحول هذا إلى اللون الأخضر تلقائيًا عند وصول أول سجل. تتوقف عمليات التحقق بعد 60 دقيقة؛ إذا وصلت البيانات لاحقًا، فستخبرك الرئيسية في زيارتك التالية.",
|
||||
"hintStillChecking": "لا يزال التحقق جاريًا كل {seconds} ث. يتحول هذا إلى اللون الأخضر تلقائيًا عند وصول البيانات.",
|
||||
"troubleshoot": "استكشاف الأخطاء",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "التدفقات المطابقة تتلقى البيانات بالفعل. تبدأ عمليات التحقق عند نسخ التكوين.",
|
||||
"idleNew": "تبدأ الفحوصات عند نسخ الأمر.",
|
||||
"idleNewConfig": "تبدأ الفحوصات عند نسخ التكوين.",
|
||||
"idleInPrompt": "{stream} يتلقى البيانات بالفعل. تبدأ الفحوصات عند نسخ النص التوجيهي.",
|
||||
"idleMatchesPrompt": "التدفقات المطابقة تتلقى البيانات بالفعل. تبدأ الفحوصات عند نسخ النص التوجيهي.",
|
||||
"idleNewPrompt": "تبدأ الفحوصات عند نسخ النص التوجيهي.",
|
||||
"checkNow": "تحقق الآن",
|
||||
"receivedPill": "تم استلام الحدث الأول",
|
||||
"receivedNewPill": "تم استلام بيانات جديدة",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "الرمز الذي يستخدمه المُرسِل لا يطابق الرمز الحالي لهذه المؤسسة. انسخ الأمر مرة أخرى وأعد تشغيله.",
|
||||
"fixInvalidCredentialsConfig": "كلمة المرور في إعدادات {tool} لا تطابق رمز المؤسسة {token}. انسخ الإعدادات مرة أخرى وأعد تشغيل {tool}.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "كلمة المرور في إعدادات {tool} لا تطابق الرمز الحالي لهذه المؤسسة. انسخ الإعدادات مرة أخرى وأعد تشغيل {tool}.",
|
||||
"fixInvalidCredentialsPrompt": "الرمز في ملف .env لا يطابق رمز المؤسسة {token}. نزّل ملف .env مرة أخرى واطلب من وكيل البرمجة إعادة تنفيذ الطلب.",
|
||||
"fixInvalidCredentialsPromptUnnamed": "الرمز في ملف .env لا يطابق رمز هذه المؤسسة الحالي. نزّل ملف .env مرة أخرى واطلب من وكيل البرمجة إعادة تنفيذ الطلب.",
|
||||
"fixMalformedBody": "متن الطلب ليس بالتنسيق الذي تقبله نقطة النهاية هذه. تحقق من تنسيق الحمولة، ثم أرسل مرة أخرى.",
|
||||
"fixBatchTooLarge": "الدفعة أكبر مما تقبله نقطة النهاية هذه. قلّل حجم الدفعة، ثم أرسل مرة أخرى.",
|
||||
"fixRateOrQuota": "الطلبات تجاوزت حد المعدل أو الحصة. انتظر دقيقة حتى تمر، أو تحقق من الخطة.",
|
||||
"copyCommand": "نسخ الأمر",
|
||||
"copyConfig": "نسخ الإعدادات",
|
||||
"copyPrompt": "نسخ النص التوجيهي",
|
||||
"rightPlace": "هل ترسل إلى المكان الصحيح؟ {org} موجودة في {region}: {endpoint}",
|
||||
"noRequestsPill": "لم يصل أي شيء بعد",
|
||||
"noRequestsSummary": "لم يصل أي شيء إلى {org} في {region} {window}، ولم يُرفض أي طلب.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": "نزّل .env",
|
||||
"promptTitle": "الصق هذا في {client1} أو {client2} أو {client3}",
|
||||
"promptLabel": "المطالبة",
|
||||
"promptCopied": "تم نسخ المطالبة"
|
||||
"promptCopied": "تم نسخ المطالبة",
|
||||
"health": {
|
||||
"title": "سلامة بيانات الذكاء الاصطناعي",
|
||||
"scopeAgent": "الامتدادات من الوكيل {agent} في {stream} منذ بدء الفحص",
|
||||
"scopeStream": "الامتدادات في {stream} منذ بدء الفحص",
|
||||
"checking": "جارٍ التحقق من سلامة بيانات الذكاء الاصطناعي…",
|
||||
"checkAgain": "تحقق مرة أخرى",
|
||||
"checkAgainHint": "بعد أن يغيّر وكيل البرمجة الشيفرة ويشغّل طلبًا آخر، تحقق مرة أخرى.",
|
||||
"unsupported": "لا يتحقق إصدار OpenObserve هذا من سلامة بيانات الذكاء الاصطناعي. وصل أول امتداد لديك، لذا يعمل التتبع.",
|
||||
"error": "تعذّر تشغيل فحوصات سلامة بيانات الذكاء الاصطناعي. وصل أول امتداد لديك، لذا يعمل التتبع.",
|
||||
"noGenAiSpans": "وصلت الامتدادات، لكن لا شيء منها استدعاء LLM، لذا عميل LLM غير مُجهّز بالتتبع. اطلب من وكيل البرمجة تجهيز عميل LLM بالتتبع، ثم شغّل طلبًا وتحقق مرة أخرى."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "مصادر البيانات",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "معاينة قالب",
|
||||
"helpPreviewSelectPlaceholder": "اختر قالبا للمعاينة",
|
||||
"helpApplyToAlert": "تطبيق على التنبيه",
|
||||
"helpApplyToObject": "استخدام هذا القالب",
|
||||
"helpTemplateExplainObject": "القالب هو الرسالة التي تُرسَل: النص بالإضافة إلى المتغيرات. اختيار قالب هنا يستبدل قالب كل وجهة، لهذا الإعداد فقط.",
|
||||
"helpTemplateWhenDescObject": "إذا تُرك هذا فارغًا، تستخدم كل وجهة قالبها الخاص إن كان ينطبق على هذا النوع، ثم الرسالة المدمجة. عيّن تجاوزًا لإرسال رسالة واحدة إلى كل وجهة مطابقة.",
|
||||
"helpCurrentHeadingObject": "ما يُرسَل الآن",
|
||||
"helpCurrentOverrideSome": "تستخدم الوجهات المطابقة هذا القالب:",
|
||||
"helpCurrentResolved": "لم يتم تعيين أي تجاوز. تستخدم كل وجهة:",
|
||||
"helpVariablesExplain": "المتغيرات هي قيمك الخاصة التي يمكنك وضعها في رسالة إشعار. أعط كل واحد اسما وقيمة هنا، ثم اكتب {'{'}your_name{'}'} في أي مكان في القالب — يتم ملؤه عند تشغيل التنبيه.",
|
||||
"helpBuiltInHeading": "تصفح المتغيرات المدمجة",
|
||||
"helpBuiltInIntro": "{product} يملأ هذه الصفحات تلقائيا — اضغط على واحد لنسخها.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "الوقت",
|
||||
"event": "الحدث",
|
||||
"destinations": "الوجهات",
|
||||
"template": "القالب",
|
||||
"result": "النتيجة",
|
||||
"ok": "أُرسل",
|
||||
"pending": "جارٍ الإرسال",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "قيد الإطلاق لمدة {duration}",
|
||||
"incident": "الحادث"
|
||||
},
|
||||
"priorityUnsetPagesAs": "غير محددة (تنبيه بمستوى P2)"
|
||||
"priorityUnsetPagesAs": "غير محددة (تنبيه بمستوى P2)",
|
||||
"notificationKinds": {
|
||||
"alert": "التنبيه",
|
||||
"incident": "الحادث",
|
||||
"anomaly": "الشذوذ",
|
||||
"synthetics": "المراقبة الاصطناعية",
|
||||
"downtime": "فترة الصيانة",
|
||||
"on_call": "المناوبة"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "تجاوز القالب",
|
||||
"placeholder": "استخدام قالب الوجهة",
|
||||
"help": "يتجاوز قالب الوجهة لرسائل {kind}. لا يمكن اختيار القوالب المُعدّة مسبقًا؛ انسخ أحدها أولًا.",
|
||||
"empty": "لا توجد قوالب تنطبق على {kind} بعد.",
|
||||
"create": "أنشئ قالبًا",
|
||||
"loadFailed": "تعذّر تحميل القوالب",
|
||||
"forbidden": "يتطلب سرد القوالب إذن قراءة القوالب",
|
||||
"mismatch": "لا يناسب {count} من وجهاتك ({names})؛ وستعود تلك الوجهات إلى قالبها الخاص.",
|
||||
"groupContent": "المحتوى",
|
||||
"groupCustom": "مخصص",
|
||||
"webhookOnly": "(Webhook فقط)",
|
||||
"emailOnly": "(البريد الإلكتروني فقط)",
|
||||
"snsOnly": "(SNS فقط)",
|
||||
"stale": "لم يعد القالب {name} موجودًا. اختر قالبًا آخر أو امسح الحقل.",
|
||||
"willUse": "سيُستخدم: {template}",
|
||||
"willUsePerDestination": "سيُستخدم لكل وجهة:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "رسالة {kind} المضمنة",
|
||||
"sourceExplicit": "هذا التجاوز",
|
||||
"sourceDestination": "قالب الوجهة",
|
||||
"sourceOrgDefault": "افتراضي المؤسسة",
|
||||
"sourceCompiled": "مضمن",
|
||||
"sourcePlatformResolve": "تحديد المنصة",
|
||||
"sourceLegacy": "الحمولة القديمة",
|
||||
"sourceLegacyPayload": "حمولة JSON الخاصة بالنوع (Webhook عام)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "فتح",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "البريد الإلكتروني الحقيقي هو HTML مع بديل نصي عادي. انظر الحمولة لكلا النسختين.",
|
||||
"previewFidelityWebhook": "مستقبلات Webhook تحصل على JSON، وليس بطاقة. انظر الحمولة للجسم الدقيق.",
|
||||
"previewFidelityMachine": "تستهلك هذه القناة من قبل البرنامج، وليس من قبل الناس — البطاقة هي عرض طبيعي. تظهر الحمولة الجسم الدقيق الذي تم إرساله.",
|
||||
"playgroundLabel": "ساحة التجربة",
|
||||
"playgroundHelp": "لا يتم إرسال أي شيء من هنا.",
|
||||
"previewChannel": "القناة",
|
||||
"previewSeverity": "الخطورة",
|
||||
"previewSeveritySingle": "المستوى الواحد (بدون مستوى)",
|
||||
"previewEmptyTitle": "ستظهر معاينة هنا",
|
||||
"unknownVariables": "المتغيرات غير المعروفة",
|
||||
"emptyVariables": "فارغة لـ {kind}: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "الفرق (البطاقة التكيفية)",
|
||||
"channelTeamsMessageCard": "Teams (بطاقة الرسائل)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "هذا سيرسل رسالة حقيقية إلى القناة المختارة، مع علامة [اختبار].",
|
||||
"testSendSuccess": "تم إرسال رسالة الاختبار",
|
||||
"testSendRateLimited": "الكثير من الاختبارات — يرجى الانتظار لحظة والمحاولة مرة أخرى",
|
||||
"testSendNoDestination": "اختر وجهة أولا"
|
||||
"testSendNoDestination": "اختر وجهة أولا",
|
||||
"appliesTo": "ينطبق على",
|
||||
"appliesToAll": "جميع الأنواع",
|
||||
"appliesToAny": "أي نوع",
|
||||
"allKindsNotice": "القوالب التي تنطبق على جميع الأنواع: {count}. تستخدمها وجهاتها أيضًا لرسائل الشذوذ والمراقبة الاصطناعية والمناوبة وفترة الصيانة والحوادث. راجعها.",
|
||||
"allKindsNoticeReview": "راجع",
|
||||
"appliesToInferred": "مستنتج من المتغيرات في النص",
|
||||
"appliesToManual": "اختيارك",
|
||||
"appliesToReset": "أعد التعيين إلى المستنتج",
|
||||
"previewKind": "النوع",
|
||||
"previewForbidden": "ليس لديك إذن لمعاينة القوالب",
|
||||
"previewFailed": "فشلت المعاينة: {message}",
|
||||
"severityFailed": "فشل",
|
||||
"severityDegraded": "متدهور",
|
||||
"severityFlaky": "متقلب",
|
||||
"severityRecovered": "متعافى",
|
||||
"variableGroupCommon": "عامة"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "مصادر تنبيه خارجية",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "الرأس",
|
||||
"api_header_value": "القيمة",
|
||||
"skip_tls_verify": "تخطي التحقق من TLS",
|
||||
"payloadFormat": "تنسيق الحمولة",
|
||||
"payloadFormatAuto": "تلقائي",
|
||||
"payloadFormatLegacy": "JSON قديم",
|
||||
"payloadFormatRendered": "قالب مُصيَّر",
|
||||
"payloadFormatHelp": "يرسل الوضع التلقائي متن JSON القديم لرسائل الشذوذ والمراقبة الاصطناعية والمناوبة حتى يتم إرفاق قالب. يُخزَّن كمفتاح البيانات الوصفية payload_format.",
|
||||
"output_format": "تنسيق الإخراج",
|
||||
"readonly": "قراءة فقط",
|
||||
"additional_settings": "إعدادات إضافية",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "لم يتم إرسال أي شيء بعد.",
|
||||
"deliveriesRun": "تشغيل السلّم {run} — تسليم الحالة أعاد بدء التصعيد لدى الفريق المستلم",
|
||||
"deliveryLanded": "أُرسل",
|
||||
"deliveryTemplate": "القالب: {templates}",
|
||||
"deliveryFailed": "فشل الإرسال",
|
||||
"deliveriesTruncated": "الإرسالات المعروضة: {shown} من أصل {total}.",
|
||||
"teamChannelTitle": "قناة الفريق",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "إرسال تنبيه اختباري بأولوية {priority} إلى {names}؟ لا يتم تصعيده.",
|
||||
"testPageSentOf": "أُرسلت {sent} من {total} رسالة | أُرسلت {sent} من {total} رسائل",
|
||||
"ladderSendTest": "إرسال اختبار",
|
||||
"scopeNotSeenYet": "لم يُرَ في بياناتك بعد"
|
||||
"scopeNotSeenYet": "لم يُرَ في بياناتك بعد",
|
||||
"policyMailBanner": "تتلقى وجهات البريد الإلكتروني وSNS نداءات المناوبة من هذا الإصدار: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "هل تريد تشغيل استخدام الذكاء الاصطناعي المدفوع؟",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "Ansicht",
|
||||
"frustration": "Frustration",
|
||||
"failedRequest": "Fehlgeschlagene Anfragen",
|
||||
"noResponse": "Keine Antwort"
|
||||
"noResponse": "Keine Antwort",
|
||||
"noResponseStatus": "0 — Keine Antwort",
|
||||
"failedRequestDetails": "Details zur fehlgeschlagenen Anfrage",
|
||||
"browserStatus": "Browserstatus",
|
||||
"serverStatus": "Serverstatus",
|
||||
"noServerSpanFound": "Kein Server-Span gefunden",
|
||||
"noServerSpanHint": "Ein fehlender Span kann auch auf Sampling, Erfassungsverzögerung, eine nicht instrumentierte Route oder Aufbewahrung hindeuten.",
|
||||
"unknownNoTrace": "Unbekannt (kein Trace)",
|
||||
"unknown": "Unbekannt",
|
||||
"abortedByApp": "von der App abgebrochen",
|
||||
"method": "Methode",
|
||||
"url": "URL",
|
||||
"duration": "Dauer",
|
||||
"timing": "Timing",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "Verbindung",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "Erstes Byte",
|
||||
"timingDownload": "Download",
|
||||
"size": "Größe",
|
||||
"initiatedBy": "Initiiert von"
|
||||
},
|
||||
"replayCanvasNotRecorded": "Canvas-Inhalt nicht aufgezeichnet",
|
||||
"actionOnTarget": "{action} auf \"{target}\"",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "Seite",
|
||||
"noDeviceData": "Für diese Seite wurden auf diesem Gerätetyp keine Klicks aufgezeichnet.",
|
||||
"noReplay": "Für diese Seite wurde kein Session-Replay aufgezeichnet, daher gibt es keinen Screenshot zum Daraufzeichnen. Aktivieren Sie Session-Replay für die App.",
|
||||
"noReplayLegacySdk": "Seiten-Snapshots benötigen ein neueres RUM-SDK. Das hier aufgezeichnete Session-Replay stammt von einem älteren SDK, daher gibt es keinen Screenshot, auf dem gezeichnet werden kann.",
|
||||
"loadFailed": "Die Klickdaten konnten nicht geladen werden.",
|
||||
"snapshotFailed": "Der Seiten-Snapshot konnte nicht geladen werden.",
|
||||
"noPosition": "Keine Klicks in diesem Zeitraum für diese Seite.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "Prüfung alle {seconds} s · gestartet vor {elapsed}",
|
||||
"metaSince": "Prüfung alle {seconds} s · gestartet vor {elapsed} · zählt nur Datensätze nach {time}",
|
||||
"hintWaiting": "Dies wird automatisch grün, sobald der erste Datensatz eintrifft. Wenn innerhalb von 2 Minuten nichts ankommt, wird angezeigt, was schiefgelaufen ist; Fehlerbehebung prüft jetzt.",
|
||||
"hintWaitingAfter": "Dieser Punkt wird automatisch grün, sobald der erste Datensatz eintrifft. Kommt innerhalb von {elapsed} nichts an, wird angezeigt, was schiefgelaufen ist; Fehlerbehebung prüft jetzt.",
|
||||
"hintWaitingLate": "Dies wird automatisch grün, sobald der erste Datensatz eintrifft. Die Prüfungen enden nach 60 Minuten; wenn Daten später eintreffen, informiert Sie die Startseite beim nächsten Besuch.",
|
||||
"hintStillChecking": "Prüft weiterhin alle {seconds} s. Dies wird automatisch grün, sobald Daten eintreffen.",
|
||||
"troubleshoot": "Fehlerbehebung",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "Passende Streams empfangen bereits Daten. Die Prüfung startet, wenn Sie die Konfiguration kopieren.",
|
||||
"idleNew": "Die Prüfungen starten, sobald Sie den Befehl kopieren.",
|
||||
"idleNewConfig": "Die Prüfungen starten, sobald Sie die Konfiguration kopieren.",
|
||||
"idleInPrompt": "{stream} empfängt bereits Daten. Die Prüfungen starten, sobald Sie den Prompt kopieren.",
|
||||
"idleMatchesPrompt": "Passende Streams empfangen bereits Daten. Die Prüfungen starten, sobald Sie den Prompt kopieren.",
|
||||
"idleNewPrompt": "Die Prüfungen starten, sobald Sie den Prompt kopieren.",
|
||||
"checkNow": "Jetzt prüfen",
|
||||
"receivedPill": "Erstes Ereignis empfangen",
|
||||
"receivedNewPill": "Neue Daten empfangen",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "Das Token, das Ihr Sender verwendet, stimmt nicht mit dem aktuellen Token dieser Organisation überein. Kopieren Sie den Befehl erneut und führen Sie ihn noch einmal aus.",
|
||||
"fixInvalidCredentialsConfig": "Das Passwort in Ihrer {tool}-Konfiguration stimmt nicht mit dem Org-Token {token} überein. Kopieren Sie die Konfiguration erneut und starten Sie {tool} neu.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "Das Passwort in Ihrer {tool}-Konfiguration stimmt nicht mit dem aktuellen Token dieser Organisation überein. Kopieren Sie die Konfiguration erneut und starten Sie {tool} neu.",
|
||||
"fixInvalidCredentialsPrompt": "Das Token in Ihrer .env stimmt nicht mit dem Organisations-Token {token} überein. Laden Sie die .env erneut herunter und bitten Sie Ihren Coding-Agenten, die Anfrage erneut auszuführen.",
|
||||
"fixInvalidCredentialsPromptUnnamed": "Das Token in Ihrer .env stimmt nicht mit dem aktuellen Token dieser Organisation überein. Laden Sie die .env erneut herunter und bitten Sie Ihren Coding-Agenten, die Anfrage erneut auszuführen.",
|
||||
"fixMalformedBody": "Der Anfragetext hat kein Format, das dieser Endpunkt akzeptiert. Prüfen Sie das Payload-Format und senden Sie erneut.",
|
||||
"fixBatchTooLarge": "Der Batch ist größer, als dieser Endpunkt akzeptiert. Verringern Sie die Batch-Größe und senden Sie erneut.",
|
||||
"fixRateOrQuota": "Anfragen überschreiten das Rate- oder Kontingentlimit. Warten Sie eine Minute, bis sie durchgehen, oder prüfen Sie den Plan.",
|
||||
"copyCommand": "Befehl kopieren",
|
||||
"copyConfig": "Konfiguration kopieren",
|
||||
"copyPrompt": "Prompt kopieren",
|
||||
"rightPlace": "Senden Sie an die richtige Stelle? {org} befindet sich in {region}: {endpoint}",
|
||||
"noRequestsPill": "Bisher ist nichts angekommen",
|
||||
"noRequestsSummary": "In {org} in {region} ist {window} nichts angekommen, und keine Anfrage wurde abgewiesen.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": ".env herunterladen",
|
||||
"promptTitle": "Fügen Sie dies in {client1}, {client2} oder {client3} ein",
|
||||
"promptLabel": "Prompt",
|
||||
"promptCopied": "Prompt kopiert"
|
||||
"promptCopied": "Prompt kopiert",
|
||||
"health": {
|
||||
"title": "KI-Datenzustand",
|
||||
"scopeAgent": "Spans von Agent {agent} in {stream} seit Beginn der Prüfung",
|
||||
"scopeStream": "Spans in {stream} seit Beginn der Prüfung",
|
||||
"checking": "KI-Datenzustand wird geprüft…",
|
||||
"checkAgain": "Erneut prüfen",
|
||||
"checkAgainHint": "Nachdem Ihr Coding-Agent den Code geändert und eine weitere Anfrage ausgeführt hat, prüfen Sie erneut.",
|
||||
"unsupported": "Diese OpenObserve-Version prüft den KI-Datenzustand nicht. Ihr erster Span ist angekommen, daher funktioniert das Tracing.",
|
||||
"error": "Die Prüfungen des KI-Datenzustands konnten nicht ausgeführt werden. Ihr erster Span ist angekommen, daher funktioniert das Tracing.",
|
||||
"noGenAiSpans": "Spans sind angekommen, aber keiner davon ist ein LLM-Aufruf, daher ist der LLM-Client nicht instrumentiert. Bitten Sie Ihren Coding-Agenten, den LLM-Client zu instrumentieren, eine Anfrage auszuführen und dann erneut zu prüfen."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "Datenquellen",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "Eine Vorlage in der Vorschau anzeigen",
|
||||
"helpPreviewSelectPlaceholder": "Wählen Sie eine Vorlage für die Vorschau aus",
|
||||
"helpApplyToAlert": "Auf Alarm anwenden",
|
||||
"helpApplyToObject": "Diese Vorlage verwenden",
|
||||
"helpTemplateExplainObject": "Eine Vorlage ist die Nachricht, die gesendet wird: der Text plus Variablen. Wenn Sie hier eine auswählen, wird die eigene Vorlage jedes Ziels ersetzt – nur für diese Konfiguration.",
|
||||
"helpTemplateWhenDescObject": "Lassen Sie dies leer, und jedes Ziel verwendet seine eigene Vorlage, sofern sie für diese Art gilt, andernfalls die integrierte Nachricht. Legen Sie eine Überschreibung fest, um eine Nachricht an jedes passende Ziel zu senden.",
|
||||
"helpCurrentHeadingObject": "Was jetzt gesendet wird",
|
||||
"helpCurrentOverrideSome": "Passende Ziele verwenden diese Vorlage:",
|
||||
"helpCurrentResolved": "Keine Überschreibung festgelegt. Jedes Ziel verwendet:",
|
||||
"helpVariablesExplain": "Variablen sind Ihre eigenen Werte, die Sie in eine Benachrichtigung einfügen können. Geben Sie hier jeder einen Namen und einen Wert und schreiben Sie dann {'{'}your_name{'}'} an eine beliebige Stelle in die Vorlage — sie wird ausgefüllt, wenn der Alarm ausgelöst wird.",
|
||||
"helpBuiltInHeading": "Integrierte Variablen durchsuchen",
|
||||
"helpBuiltInIntro": "{product} füllt diese automatisch aus — klicken Sie auf einen davon, um ihn zu kopieren.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "Zeit",
|
||||
"event": "Ereignis",
|
||||
"destinations": "Ziele",
|
||||
"template": "Vorlage",
|
||||
"result": "Ergebnis",
|
||||
"ok": "Gesendet",
|
||||
"pending": "Wird gesendet",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "ausgelöst seit {duration}",
|
||||
"incident": "Vorfall"
|
||||
},
|
||||
"priorityUnsetPagesAs": "Nicht gesetzt (alarmiert als P2)"
|
||||
"priorityUnsetPagesAs": "Nicht gesetzt (alarmiert als P2)",
|
||||
"notificationKinds": {
|
||||
"alert": "Alarm",
|
||||
"incident": "Vorfall",
|
||||
"anomaly": "Anomalie",
|
||||
"synthetics": "Synthetics",
|
||||
"downtime": "Wartungsfenster",
|
||||
"on_call": "On-Call"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "Vorlagenüberschreibung",
|
||||
"placeholder": "Vorlage des Ziels verwenden",
|
||||
"help": "Überschreibt die Zielvorlage für {kind}-Nachrichten. Vorgefertigte Vorlagen können nicht ausgewählt werden; kopieren Sie zuerst eine.",
|
||||
"empty": "Für {kind} gelten noch keine Vorlagen.",
|
||||
"create": "Vorlage erstellen",
|
||||
"loadFailed": "Vorlagen konnten nicht geladen werden",
|
||||
"forbidden": "Das Auflisten von Vorlagen erfordert die Berechtigung zum Lesen von Vorlagen",
|
||||
"mismatch": "Passt nicht zu {count} Ihrer Ziele ({names}); diese greifen auf ihre eigene Vorlage zurück.",
|
||||
"groupContent": "Inhalt",
|
||||
"groupCustom": "Benutzerdefiniert",
|
||||
"webhookOnly": "(nur Webhook)",
|
||||
"emailOnly": "(nur E-Mail)",
|
||||
"snsOnly": "(nur SNS)",
|
||||
"stale": "Vorlage {name} existiert nicht mehr. Wählen Sie eine andere oder leeren Sie das Feld.",
|
||||
"willUse": "Verwendet: {template}",
|
||||
"willUsePerDestination": "Wird je Ziel verwendet:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "Integrierte {kind}-Nachricht",
|
||||
"sourceExplicit": "diese Überschreibung",
|
||||
"sourceDestination": "Zielvorlage",
|
||||
"sourceOrgDefault": "Organisationsstandard",
|
||||
"sourceCompiled": "integriert",
|
||||
"sourcePlatformResolve": "Plattformauflösung",
|
||||
"sourceLegacy": "Legacy-Nutzlast",
|
||||
"sourceLegacyPayload": "die eigene JSON-Nutzlast des Typs (generischer Webhook)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "Öffnen",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "Die echte E-Mail ist HTML mit einer Klartext-Alternative. Siehe Payload für beides.",
|
||||
"previewFidelityWebhook": "Webhook-Empfänger erhalten JSON, keine Karte. Siehe Payload für den genauen Inhalt.",
|
||||
"previewFidelityMachine": "Dieser Kanal wird von Software verarbeitet, nicht von Menschen gelesen – die Karte ist eine normalisierte Darstellung. Payload zeigt den exakten gesendeten Inhalt.",
|
||||
"playgroundLabel": "Playground",
|
||||
"playgroundHelp": "Hier wird nichts gesendet.",
|
||||
"previewChannel": "Kanal",
|
||||
"previewSeverity": "Schweregrad",
|
||||
"previewSeveritySingle": "Einzelne Stufe (keine Stufe)",
|
||||
"previewEmptyTitle": "Die Vorschau wird hier angezeigt",
|
||||
"unknownVariables": "Unbekannte Variablen",
|
||||
"emptyVariables": "Leer für {kind}: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (Adaptive Card)",
|
||||
"channelTeamsMessageCard": "Teams (MessageCard)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "Dadurch wird eine echte Nachricht an den ausgewählten Kanal gesendet, gekennzeichnet mit [TEST].",
|
||||
"testSendSuccess": "Testnachricht gesendet",
|
||||
"testSendRateLimited": "Zu viele Testsendungen – bitte warten Sie einen Moment und versuchen Sie es erneut.",
|
||||
"testSendNoDestination": "Wählen Sie zuerst ein Ziel aus"
|
||||
"testSendNoDestination": "Wählen Sie zuerst ein Ziel aus",
|
||||
"appliesTo": "Gilt für",
|
||||
"appliesToAll": "Alle Typen",
|
||||
"appliesToAny": "Beliebiger Typ",
|
||||
"allKindsNotice": "Vorlagen, die für alle Typen gelten: {count}. Die zugehörigen Ziele verwenden sie auch für Anomalie-, Synthetics-, On-Call-, Wartungsfenster- und Vorfallnachrichten. Prüfen Sie sie.",
|
||||
"allKindsNoticeReview": "Prüfen",
|
||||
"appliesToInferred": "Aus den Variablen im Inhalt abgeleitet",
|
||||
"appliesToManual": "Von Ihnen gewählt",
|
||||
"appliesToReset": "Auf abgeleitet zurücksetzen",
|
||||
"previewKind": "Typ",
|
||||
"previewForbidden": "Sie haben keine Berechtigung, Vorlagen in der Vorschau anzuzeigen",
|
||||
"previewFailed": "Vorschau fehlgeschlagen: {message}",
|
||||
"severityFailed": "Fehlgeschlagen",
|
||||
"severityDegraded": "Beeinträchtigt",
|
||||
"severityFlaky": "Instabil",
|
||||
"severityRecovered": "Wiederhergestellt",
|
||||
"variableGroupCommon": "Allgemein"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "Externe Alarmquellen",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "Kopfzeile",
|
||||
"api_header_value": "Wert",
|
||||
"skip_tls_verify": "TLS-Verifizierung überspringen",
|
||||
"payloadFormat": "Nutzlastformat",
|
||||
"payloadFormatAuto": "Automatisch",
|
||||
"payloadFormatLegacy": "Legacy-JSON",
|
||||
"payloadFormatRendered": "Gerenderte Vorlage",
|
||||
"payloadFormatHelp": "Automatisch sendet den alten JSON-Body für Anomalie-, Synthetics- und On-Call-Nachrichten, bis eine Vorlage angehängt wird. Wird als Metadatenschlüssel payload_format gespeichert.",
|
||||
"output_format": "Ausgabeformat",
|
||||
"readonly": "Nur lesbar",
|
||||
"additional_settings": "Zusätzliche Einstellungen",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "Noch wurde nichts gesendet.",
|
||||
"deliveriesRun": "Leiterlauf {run} — eine Übergabe startete den Aufstieg beim empfangenden Team neu.",
|
||||
"deliveryLanded": "Gesendet",
|
||||
"deliveryTemplate": "Vorlage: {templates}",
|
||||
"deliveryFailed": "Fehlgeschlagen",
|
||||
"deliveriesTruncated": "{shown} von {total} Zustellungen werden angezeigt.",
|
||||
"teamChannelTitle": "Teamkanal",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "Test-Alarmierung für {priority} an {names} senden? Sie eskaliert nicht.",
|
||||
"testPageSentOf": "{sent} von {total} Nachricht gesendet | {sent} von {total} Nachrichten gesendet",
|
||||
"ladderSendTest": "Test senden",
|
||||
"scopeNotSeenYet": "Noch nicht in Ihren Daten gesehen"
|
||||
"scopeNotSeenYet": "Noch nicht in Ihren Daten gesehen",
|
||||
"policyMailBanner": "E-Mail- und SNS-Ziele empfangen Alarmierungen aus dieser Version: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "Kostenpflichtige KI-Nutzung aktivieren?",
|
||||
|
||||
@@ -2208,6 +2208,7 @@
|
||||
"pageLabel": "Page",
|
||||
"noDeviceData": "No clicks recorded on this device type for this page.",
|
||||
"noReplay": "No session replay was recorded for this page, so there is no screenshot to draw on. Turn on session replay for the app.",
|
||||
"noReplayLegacySdk": "Page snapshots need a newer RUM SDK. The session replay recorded here comes from an older SDK, so there is no screenshot to draw on.",
|
||||
"loadFailed": "Couldn't load the click data.",
|
||||
"snapshotFailed": "Couldn't load the page snapshot.",
|
||||
"noPosition": "No clicks in this period for this page.",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "Vista",
|
||||
"frustration": "Frustración",
|
||||
"failedRequest": "Solicitudes fallidas",
|
||||
"noResponse": "Sin respuesta"
|
||||
"noResponse": "Sin respuesta",
|
||||
"noResponseStatus": "0 — Sin respuesta",
|
||||
"failedRequestDetails": "Detalles de la solicitud fallida",
|
||||
"browserStatus": "Estado del navegador",
|
||||
"serverStatus": "Estado del servidor",
|
||||
"noServerSpanFound": "No se encontró ningún span de servidor",
|
||||
"noServerSpanHint": "Un span ausente también puede deberse al muestreo, al retraso en la ingesta, a una ruta no instrumentada o a la retención.",
|
||||
"unknownNoTrace": "Desconocido (sin traza)",
|
||||
"unknown": "Desconocido",
|
||||
"abortedByApp": "abortada por la aplicación",
|
||||
"method": "Método",
|
||||
"url": "URL",
|
||||
"duration": "Duración",
|
||||
"timing": "Tiempos",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "Conexión",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "Primer byte",
|
||||
"timingDownload": "Descarga",
|
||||
"size": "Tamaño",
|
||||
"initiatedBy": "Iniciado por"
|
||||
},
|
||||
"replayCanvasNotRecorded": "Contenido del canvas no grabado",
|
||||
"actionOnTarget": "{action} sobre \"{target}\"",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "Página",
|
||||
"noDeviceData": "No se han registrado clics en este tipo de dispositivo para esta página.",
|
||||
"noReplay": "No se grabó ninguna repetición de sesión para esta página, por lo que no hay ninguna captura de pantalla sobre la que dibujar. Activa la repetición de sesiones para la aplicación.",
|
||||
"noReplayLegacySdk": "Las instantáneas de página necesitan un SDK de RUM más reciente. La reproducción de sesión registrada aquí proviene de un SDK anterior, por lo que no hay ninguna captura de pantalla sobre la que dibujar.",
|
||||
"loadFailed": "No se pudieron cargar los datos de clics.",
|
||||
"snapshotFailed": "No se pudo cargar la instantánea de la página.",
|
||||
"noPosition": "No hay clics en este período para esta página.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "Comprobando cada {seconds} s · iniciado hace {elapsed}",
|
||||
"metaSince": "Comprobando cada {seconds} s · iniciado hace {elapsed} · solo cuenta registros posteriores a {time}",
|
||||
"hintWaiting": "Esto se pone verde solo cuando llega el primer registro. Si no llega nada en 2 minutos, muestra qué falló; Solucionar problemas comprueba ahora.",
|
||||
"hintWaitingAfter": "Esto se pone verde por sí solo cuando llega el primer registro. Si no llega nada en {elapsed}, muestra qué ha fallado; Solucionar problemas comprueba ahora.",
|
||||
"hintWaitingLate": "Esto se pone verde solo cuando llega el primer registro. Las comprobaciones se detienen después de 60 minutos; si los datos llegan más tarde, Inicio te lo indica en tu próxima visita.",
|
||||
"hintStillChecking": "Seguimos comprobando cada {seconds} s. Esto se pone verde solo cuando llegan los datos.",
|
||||
"troubleshoot": "Solucionar problemas",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "Los streams coincidentes ya reciben datos. Las verificaciones comienzan cuando copias la configuración.",
|
||||
"idleNew": "Las comprobaciones se inician cuando copias el comando.",
|
||||
"idleNewConfig": "Las comprobaciones se inician cuando copias la configuración.",
|
||||
"idleInPrompt": "{stream} ya recibe datos. Las comprobaciones empiezan cuando copies el prompt.",
|
||||
"idleMatchesPrompt": "Los streams coincidentes ya reciben datos. Las comprobaciones empiezan cuando copies el prompt.",
|
||||
"idleNewPrompt": "Las comprobaciones empiezan cuando copies el prompt.",
|
||||
"checkNow": "Verificar ahora",
|
||||
"receivedPill": "Primer evento recibido",
|
||||
"receivedNewPill": "Nuevos datos recibidos",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "El token que usa tu emisor no coincide con el token actual de esta organización. Copia el comando de nuevo y vuelve a ejecutarlo.",
|
||||
"fixInvalidCredentialsConfig": "La contraseña de tu configuración de {tool} no coincide con el token de la organización {token}. Copia la configuración de nuevo y reinicia {tool}.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "La contraseña de tu configuración de {tool} no coincide con el token actual de esta organización. Copia la configuración de nuevo y reinicia {tool}.",
|
||||
"fixInvalidCredentialsPrompt": "El token de tu .env no coincide con el token de la organización {token}. Vuelve a descargar el .env y pide a tu agente de programación que vuelva a ejecutar la solicitud.",
|
||||
"fixInvalidCredentialsPromptUnnamed": "El token de tu .env no coincide con el token actual de esta organización. Vuelve a descargar el .env y pide a tu agente de programación que vuelva a ejecutar la solicitud.",
|
||||
"fixMalformedBody": "El cuerpo de la solicitud no tiene un formato que este endpoint acepte. Comprueba el formato de la carga útil y vuelve a enviarla.",
|
||||
"fixBatchTooLarge": "El lote supera lo que este endpoint acepta. Reduce el tamaño del lote y vuelve a enviarlo.",
|
||||
"fixRateOrQuota": "Las solicitudes superan el límite de tasa o de cuota. Espera un minuto para que se procesen o revisa el plan.",
|
||||
"copyCommand": "Copiar comando",
|
||||
"copyConfig": "Copiar configuración",
|
||||
"copyPrompt": "Copiar prompt",
|
||||
"rightPlace": "¿Envías al lugar correcto? {org} está en {region}: {endpoint}",
|
||||
"noRequestsPill": "Todavía no ha llegado nada",
|
||||
"noRequestsSummary": "No ha llegado nada a {org} en {region} {window}, y no se rechazó ninguna solicitud.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": "Descargar .env",
|
||||
"promptTitle": "Pega esto en {client1}, {client2} o {client3}",
|
||||
"promptLabel": "Prompt",
|
||||
"promptCopied": "Prompt copiado"
|
||||
"promptCopied": "Prompt copiado",
|
||||
"health": {
|
||||
"title": "Estado de los datos de IA",
|
||||
"scopeAgent": "Spans del agente {agent} en {stream} desde que empezó la comprobación",
|
||||
"scopeStream": "Spans en {stream} desde que empezó la comprobación",
|
||||
"checking": "Comprobando el estado de los datos de IA…",
|
||||
"checkAgain": "Comprobar de nuevo",
|
||||
"checkAgainHint": "Cuando tu agente de programación cambie el código y ejecute otra solicitud, vuelve a comprobar.",
|
||||
"unsupported": "Esta versión de OpenObserve no comprueba el estado de los datos de IA. Tu primer span ha llegado, así que el trazado funciona.",
|
||||
"error": "No se pudieron ejecutar las comprobaciones del estado de los datos de IA. Tu primer span ha llegado, así que el trazado funciona.",
|
||||
"noGenAiSpans": "Han llegado spans, pero ninguno es una llamada a un LLM, así que el cliente LLM no está instrumentado. Pide a tu agente de programación que instrumente el cliente LLM, ejecute una solicitud y luego vuelve a comprobar."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "Fuentes de datos",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "Vista previa de una plantilla",
|
||||
"helpPreviewSelectPlaceholder": "Seleccione una plantilla para obtener una vista previa",
|
||||
"helpApplyToAlert": "Aplicar a la alerta",
|
||||
"helpApplyToObject": "Usar esta plantilla",
|
||||
"helpTemplateExplainObject": "Una plantilla es el mensaje que se envía: el texto más las variables. Si eliges una aquí, sustituye la plantilla propia de cada destino, solo para esta configuración.",
|
||||
"helpTemplateWhenDescObject": "Déjalo vacío y cada destino usará su propia plantilla si se aplica a este tipo, y después el mensaje integrado. Define una anulación para enviar un mismo mensaje a todos los destinos que encajen.",
|
||||
"helpCurrentHeadingObject": "Lo que se envía ahora",
|
||||
"helpCurrentOverrideSome": "Los destinos que encajan usan esta plantilla:",
|
||||
"helpCurrentResolved": "No hay ninguna anulación definida. Cada destino usa:",
|
||||
"helpVariablesExplain": "Las variables son tus propios valores que puedes incluir en un mensaje de notificación. Aquí asigne a cada una un nombre y un valor y, a continuación, escriba {'{'}your_name{'}'} en cualquier parte de la plantilla; se rellenará cuando se dispare la alerta.",
|
||||
"helpBuiltInHeading": "Explore las variables integradas",
|
||||
"helpBuiltInIntro": "{product} rellena estos automáticamente — haga clic en uno para copiarlo.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "Hora",
|
||||
"event": "Evento",
|
||||
"destinations": "Destinos",
|
||||
"template": "Plantilla",
|
||||
"result": "Resultado",
|
||||
"ok": "Enviado",
|
||||
"pending": "Enviando",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "disparada desde hace {duration}",
|
||||
"incident": "Incidente"
|
||||
},
|
||||
"priorityUnsetPagesAs": "Sin definir (avisa como P2)"
|
||||
"priorityUnsetPagesAs": "Sin definir (avisa como P2)",
|
||||
"notificationKinds": {
|
||||
"alert": "Alerta",
|
||||
"incident": "Incidente",
|
||||
"anomaly": "Anomalía",
|
||||
"synthetics": "Sintéticos",
|
||||
"downtime": "Periodo de mantenimiento",
|
||||
"on_call": "Guardia"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "Anulación de plantilla",
|
||||
"placeholder": "Usar la plantilla del destino",
|
||||
"help": "Sobrescribe la plantilla del destino para los mensajes de {kind}. Las plantillas predefinidas no se pueden elegir; primero copia una.",
|
||||
"empty": "Aún no hay plantillas que se apliquen a {kind}.",
|
||||
"create": "Crear plantilla",
|
||||
"loadFailed": "No se pudieron cargar las plantillas",
|
||||
"forbidden": "Listar plantillas requiere el permiso de lectura de plantillas",
|
||||
"mismatch": "No encaja en {count} de tus destinos ({names}); esos recurrirán a su propia plantilla.",
|
||||
"groupContent": "Contenido",
|
||||
"groupCustom": "Personalizado",
|
||||
"webhookOnly": "(solo webhook)",
|
||||
"emailOnly": "(solo correo electrónico)",
|
||||
"snsOnly": "(solo SNS)",
|
||||
"stale": "La plantilla {name} ya no existe. Elige otra o borra el campo.",
|
||||
"willUse": "Se usará: {template}",
|
||||
"willUsePerDestination": "Se usará, por destino:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "Mensaje integrado de {kind}",
|
||||
"sourceExplicit": "esta sobrescritura",
|
||||
"sourceDestination": "plantilla del destino",
|
||||
"sourceOrgDefault": "predeterminada de la organización",
|
||||
"sourceCompiled": "integrado",
|
||||
"sourcePlatformResolve": "resolución de la plataforma",
|
||||
"sourceLegacy": "payload heredado",
|
||||
"sourceLegacyPayload": "el payload JSON propio del tipo (webhook genérico)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "Abrir",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "El correo real es HTML con una alternativa de texto plano. Consulta Carga útil para ambos.",
|
||||
"previewFidelityWebhook": "Los receptores de webhook reciben JSON, no una tarjeta. Consulta Carga útil para el cuerpo exacto.",
|
||||
"previewFidelityMachine": "Este canal es consumido por software, no lo leen personas: la tarjeta es una representación normalizada. Carga útil muestra el cuerpo exacto que se envía.",
|
||||
"playgroundLabel": "Área de pruebas",
|
||||
"playgroundHelp": "Aquí no se envía nada.",
|
||||
"previewChannel": "Canal",
|
||||
"previewSeverity": "Severidad",
|
||||
"previewSeveritySingle": "Nivel único (sin nivel)",
|
||||
"previewEmptyTitle": "La vista previa aparecerá aquí",
|
||||
"unknownVariables": "Variables desconocidas",
|
||||
"emptyVariables": "Sin valor para {kind}: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (Tarjeta adaptable)",
|
||||
"channelTeamsMessageCard": "Teams (MessageCard)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "Esto publicará un mensaje real en el canal seleccionado, marcado como [TEST].",
|
||||
"testSendSuccess": "Mensaje de prueba enviado",
|
||||
"testSendRateLimited": "Demasiados envíos de prueba: espera un momento e inténtalo de nuevo.",
|
||||
"testSendNoDestination": "Selecciona un destino primero"
|
||||
"testSendNoDestination": "Selecciona un destino primero",
|
||||
"appliesTo": "Se aplica a",
|
||||
"appliesToAll": "Todos los tipos",
|
||||
"appliesToAny": "Cualquier tipo",
|
||||
"allKindsNotice": "Plantillas que se aplican a todos los tipos: {count}. Sus destinos también las usan para mensajes de anomalías, sintéticos, guardia, periodos de mantenimiento e incidentes. Revísalas.",
|
||||
"allKindsNoticeReview": "Revisar",
|
||||
"appliesToInferred": "Inferido a partir de las variables del cuerpo",
|
||||
"appliesToManual": "Elegido por ti",
|
||||
"appliesToReset": "Restablecer a lo inferido",
|
||||
"previewKind": "Tipo",
|
||||
"previewForbidden": "No tienes permiso para previsualizar plantillas",
|
||||
"previewFailed": "Error en la vista previa: {message}",
|
||||
"severityFailed": "Fallido",
|
||||
"severityDegraded": "Degradado",
|
||||
"severityFlaky": "Inestable",
|
||||
"severityRecovered": "Recuperado",
|
||||
"variableGroupCommon": "Comunes"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "Fuentes de alerta externas",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "Cabecera",
|
||||
"api_header_value": "Valor",
|
||||
"skip_tls_verify": "Omitir verificación TLS",
|
||||
"payloadFormat": "Formato del payload",
|
||||
"payloadFormatAuto": "Automático",
|
||||
"payloadFormatLegacy": "JSON heredado",
|
||||
"payloadFormatRendered": "Plantilla renderizada",
|
||||
"payloadFormatHelp": "La opción Automático envía el cuerpo JSON antiguo para los mensajes de anomalías, sintéticos y guardia hasta que se adjunte una plantilla. Se almacena como la clave de metadatos payload_format.",
|
||||
"output_format": "Formato de salida",
|
||||
"readonly": "Solo lectura",
|
||||
"additional_settings": "Ajustes adicionales",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "Aún no se ha enviado nada.",
|
||||
"deliveriesRun": "Ejecución de escalera {run} — un traspaso reinició el ascenso en el equipo receptor.",
|
||||
"deliveryLanded": "Enviado",
|
||||
"deliveryTemplate": "Plantilla: {templates}",
|
||||
"deliveryFailed": "Fallido",
|
||||
"deliveriesTruncated": "Mostrando {shown} de {total} envíos.",
|
||||
"teamChannelTitle": "Canal del equipo",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "¿Enviar un aviso de prueba de {priority} a {names}? No escala.",
|
||||
"testPageSentOf": "Enviado {sent} de {total} mensaje | Enviados {sent} de {total} mensajes",
|
||||
"ladderSendTest": "Enviar prueba",
|
||||
"scopeNotSeenYet": "Aún no visto en tus datos"
|
||||
"scopeNotSeenYet": "Aún no visto en tus datos",
|
||||
"policyMailBanner": "Los destinos de correo electrónico y SNS reciben avisos desde esta versión: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "¿Activar el uso de IA de pago?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "Vue",
|
||||
"frustration": "Frustration",
|
||||
"failedRequest": "Requêtes échouées",
|
||||
"noResponse": "Aucune réponse"
|
||||
"noResponse": "Aucune réponse",
|
||||
"noResponseStatus": "0 — Aucune réponse",
|
||||
"failedRequestDetails": "Détails de la requête échouée",
|
||||
"browserStatus": "Statut du navigateur",
|
||||
"serverStatus": "Statut du serveur",
|
||||
"noServerSpanFound": "Aucun span serveur trouvé",
|
||||
"noServerSpanHint": "Un span manquant peut aussi signifier de l'échantillonnage, un retard d'ingestion, une route non instrumentée ou de la rétention.",
|
||||
"unknownNoTrace": "Inconnu (aucune trace)",
|
||||
"unknown": "Inconnu",
|
||||
"abortedByApp": "interrompu par l'application",
|
||||
"method": "Méthode",
|
||||
"url": "URL",
|
||||
"duration": "Durée",
|
||||
"timing": "Chronométrage",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "Connexion",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "Premier octet",
|
||||
"timingDownload": "Téléchargement",
|
||||
"size": "Taille",
|
||||
"initiatedBy": "Initié par"
|
||||
},
|
||||
"replayCanvasNotRecorded": "Contenu du canvas non enregistré",
|
||||
"actionOnTarget": "{action} sur « {target} »",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "Page",
|
||||
"noDeviceData": "Aucun clic enregistré sur ce type d'appareil pour cette page.",
|
||||
"noReplay": "Aucun rejeu de session n'a été enregistré pour cette page, il n'y a donc pas de capture d'écran à utiliser. Activez le rejeu de session pour l'application.",
|
||||
"noReplayLegacySdk": "Les instantanés de page nécessitent un SDK RUM plus récent. La relecture de session enregistrée ici provient d'un SDK plus ancien, il n'y a donc pas de capture d'écran sur laquelle dessiner.",
|
||||
"loadFailed": "Impossible de charger les données de clics.",
|
||||
"snapshotFailed": "Impossible de charger l'instantané de la page.",
|
||||
"noPosition": "Aucun clic sur cette période pour cette page.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "Vérification toutes les {seconds} s · démarré il y a {elapsed}",
|
||||
"metaSince": "Vérification toutes les {seconds} s · démarré il y a {elapsed} · ne compte que les enregistrements après {time}",
|
||||
"hintWaiting": "Cela passe au vert tout seul dès que le premier enregistrement arrive. Si rien n'arrive en 2 minutes, il indique ce qui a échoué ; Diagnostiquer vérifie immédiatement.",
|
||||
"hintWaitingAfter": "Ceci passe au vert tout seul dès que le premier enregistrement arrive. Si rien n'arrive dans {elapsed}, il indique ce qui a échoué ; Dépanner vérifie maintenant.",
|
||||
"hintWaitingLate": "Cela passe au vert tout seul dès que le premier enregistrement arrive. Les vérifications s'arrêtent après 60 minutes ; si des données arrivent plus tard, Accueil vous en informe lors de votre prochaine visite.",
|
||||
"hintStillChecking": "Vérification toujours en cours toutes les {seconds} s. Cela passe au vert tout seul dès que les données arrivent.",
|
||||
"troubleshoot": "Diagnostiquer",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "Les flux correspondants reçoivent déjà des données. Les vérifications démarrent lorsque vous copiez la configuration.",
|
||||
"idleNew": "Les vérifications démarrent lorsque vous copiez la commande.",
|
||||
"idleNewConfig": "Les vérifications démarrent lorsque vous copiez la configuration.",
|
||||
"idleInPrompt": "{stream} reçoit déjà des données. Les vérifications démarrent lorsque vous copiez le prompt.",
|
||||
"idleMatchesPrompt": "Les flux correspondants reçoivent déjà des données. Les vérifications démarrent lorsque vous copiez le prompt.",
|
||||
"idleNewPrompt": "Les vérifications démarrent lorsque vous copiez le prompt.",
|
||||
"checkNow": "Vérifier maintenant",
|
||||
"receivedPill": "Premier événement reçu",
|
||||
"receivedNewPill": "Nouvelles données reçues",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "Le jeton utilisé par votre émetteur ne correspond pas au jeton actuel de cette organisation. Copiez à nouveau la commande et relancez-la.",
|
||||
"fixInvalidCredentialsConfig": "Le mot de passe dans votre configuration {tool} ne correspond pas au jeton de l'organisation {token}. Copiez à nouveau la configuration et redémarrez {tool}.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "Le mot de passe dans votre configuration {tool} ne correspond pas au jeton actuel de cette organisation. Copiez à nouveau la configuration et redémarrez {tool}.",
|
||||
"fixInvalidCredentialsPrompt": "Le token dans votre .env ne correspond pas au token d'organisation {token}. Téléchargez à nouveau le .env et demandez à votre agent de codage de relancer la requête.",
|
||||
"fixInvalidCredentialsPromptUnnamed": "Le token dans votre .env ne correspond pas au token actuel de cette organisation. Téléchargez à nouveau le .env et demandez à votre agent de codage de relancer la requête.",
|
||||
"fixMalformedBody": "Le corps de la requête n'est pas dans un format accepté par ce point de terminaison. Vérifiez le format de la charge utile, puis envoyez à nouveau.",
|
||||
"fixBatchTooLarge": "Le lot est plus grand que ce que ce point de terminaison accepte. Réduisez la taille du lot, puis envoyez à nouveau.",
|
||||
"fixRateOrQuota": "Les requêtes dépassent la limite de débit ou de quota. Attendez une minute qu'elles aboutissent, ou vérifiez le plan.",
|
||||
"copyCommand": "Copier la commande",
|
||||
"copyConfig": "Copier la configuration",
|
||||
"copyPrompt": "Copier le prompt",
|
||||
"rightPlace": "Vous envoyez au bon endroit ? {org} se trouve dans {region} : {endpoint}",
|
||||
"noRequestsPill": "Rien n'est encore arrivé",
|
||||
"noRequestsSummary": "Rien n'est arrivé dans {org} en {region} {window}, et aucune requête n'a été refusée.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": "Télécharger .env",
|
||||
"promptTitle": "Collez ceci dans {client1}, {client2} ou {client3}",
|
||||
"promptLabel": "Invite",
|
||||
"promptCopied": "Invite copiée"
|
||||
"promptCopied": "Invite copiée",
|
||||
"health": {
|
||||
"title": "Santé des données IA",
|
||||
"scopeAgent": "Spans de l'agent {agent} dans {stream} depuis le début de la vérification",
|
||||
"scopeStream": "Spans dans {stream} depuis le début de la vérification",
|
||||
"checking": "Vérification de la santé des données IA…",
|
||||
"checkAgain": "Vérifier à nouveau",
|
||||
"checkAgainHint": "Une fois que votre agent de codage a modifié le code et exécuté une autre requête, vérifiez à nouveau.",
|
||||
"unsupported": "Cette version d'OpenObserve ne vérifie pas la santé des données IA. Votre premier span est arrivé, le traçage fonctionne donc.",
|
||||
"error": "Les vérifications de la santé des données IA n'ont pas pu s'exécuter. Votre premier span est arrivé, le traçage fonctionne donc.",
|
||||
"noGenAiSpans": "Des spans sont arrivés, mais aucun n'est un appel LLM : le client LLM n'est donc pas instrumenté. Demandez à votre agent de codage d'instrumenter le client LLM, d'exécuter une requête, puis vérifiez à nouveau."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "Sources de données",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "Afficher un aperçu d'un modèle",
|
||||
"helpPreviewSelectPlaceholder": "Sélectionnez un modèle à prévisualiser",
|
||||
"helpApplyToAlert": "Faire une demande d'alerte",
|
||||
"helpApplyToObject": "Utiliser ce modèle",
|
||||
"helpTemplateExplainObject": "Un modèle est le message qui est envoyé : le texte plus les variables. En choisir un ici remplace le modèle propre à chaque destination, pour cette configuration uniquement.",
|
||||
"helpTemplateWhenDescObject": "Laissez ce champ vide et chaque destination utilise son propre modèle s'il s'applique à ce type, puis le message intégré. Définissez un remplacement pour envoyer un seul message à toutes les destinations compatibles.",
|
||||
"helpCurrentHeadingObject": "Ce qui est envoyé actuellement",
|
||||
"helpCurrentOverrideSome": "Les destinations compatibles utilisent ce modèle :",
|
||||
"helpCurrentResolved": "Aucun remplacement défini. Chaque destination utilise :",
|
||||
"helpVariablesExplain": "Les variables sont vos propres valeurs que vous pouvez insérer dans un message de notification. Donnez à chacune un nom et une valeur ici, puis écrivez {'{'}your_name{'}'} n'importe où dans le modèle — elle est remplacée lorsque l'alerte se déclenche.",
|
||||
"helpBuiltInHeading": "Parcourir les variables intégrées",
|
||||
"helpBuiltInIntro": "{product} les remplit automatiquement — cliquez sur l'un d'eux pour le copier.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "Heure",
|
||||
"event": "Événement",
|
||||
"destinations": "Destinations",
|
||||
"template": "Modèle",
|
||||
"result": "Résultat",
|
||||
"ok": "Envoyé",
|
||||
"pending": "Envoi en cours",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "déclenchée depuis {duration}",
|
||||
"incident": "Incident"
|
||||
},
|
||||
"priorityUnsetPagesAs": "Non défini (alerte en P2)"
|
||||
"priorityUnsetPagesAs": "Non défini (alerte en P2)",
|
||||
"notificationKinds": {
|
||||
"alert": "Alerte",
|
||||
"incident": "Incident",
|
||||
"anomaly": "Anomalie",
|
||||
"synthetics": "Synthétiques",
|
||||
"downtime": "Période de maintenance",
|
||||
"on_call": "Astreinte"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "Remplacement du modèle",
|
||||
"placeholder": "Utiliser le modèle de la destination",
|
||||
"help": "Remplace le modèle de la destination pour les messages {kind}. Les modèles prédéfinis ne peuvent pas être choisis ; copiez-en un d'abord.",
|
||||
"empty": "Aucun modèle ne s'applique encore à {kind}.",
|
||||
"create": "Créer un modèle",
|
||||
"loadFailed": "Impossible de charger les modèles",
|
||||
"forbidden": "Lister les modèles nécessite la permission de lecture des modèles",
|
||||
"mismatch": "Ne correspond pas à {count} de vos destinations ({names}) ; celles-ci reviennent à leur propre modèle.",
|
||||
"groupContent": "Contenu",
|
||||
"groupCustom": "Personnalisé",
|
||||
"webhookOnly": "(webhook uniquement)",
|
||||
"emailOnly": "(e-mail uniquement)",
|
||||
"snsOnly": "(SNS uniquement)",
|
||||
"stale": "Le modèle {name} n'existe plus. Choisissez-en un autre ou videz le champ.",
|
||||
"willUse": "Utilisera : {template}",
|
||||
"willUsePerDestination": "Utilisation, par destination :",
|
||||
"willUseRow": "{destination} : {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "Message {kind} intégré",
|
||||
"sourceExplicit": "cette substitution",
|
||||
"sourceDestination": "modèle de la destination",
|
||||
"sourceOrgDefault": "valeur par défaut de l'organisation",
|
||||
"sourceCompiled": "intégré",
|
||||
"sourcePlatformResolve": "résolution par la plateforme",
|
||||
"sourceLegacy": "charge utile héritée",
|
||||
"sourceLegacyPayload": "la charge utile JSON propre au type (webhook générique)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "Ouvrir",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "Le véritable e-mail est en HTML avec une alternative en texte brut. Voir Charge utile pour les deux.",
|
||||
"previewFidelityWebhook": "Les destinataires de webhook reçoivent du JSON, pas une carte. Voir Charge utile pour le corps exact.",
|
||||
"previewFidelityMachine": "Ce canal est consommé par un logiciel, pas lu par des personnes — la carte est un rendu normalisé. Charge utile montre le corps exact envoyé.",
|
||||
"playgroundLabel": "Bac à sable",
|
||||
"playgroundHelp": "Rien n'est envoyé ici.",
|
||||
"previewChannel": "Canal",
|
||||
"previewSeverity": "Gravité",
|
||||
"previewSeveritySingle": "Niveau unique (aucun niveau)",
|
||||
"previewEmptyTitle": "L'aperçu apparaîtra ici",
|
||||
"unknownVariables": "Variables inconnues",
|
||||
"emptyVariables": "Vides pour {kind} : {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (carte adaptative)",
|
||||
"channelTeamsMessageCard": "Teams (MessageCard)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "Cela enverra un vrai message au canal sélectionné, marqué [TEST].",
|
||||
"testSendSuccess": "Message de test envoyé",
|
||||
"testSendRateLimited": "Trop d'envois de test — veuillez patienter un moment et réessayer",
|
||||
"testSendNoDestination": "Sélectionnez d'abord une destination"
|
||||
"testSendNoDestination": "Sélectionnez d'abord une destination",
|
||||
"appliesTo": "S'applique à",
|
||||
"appliesToAll": "Tous les types",
|
||||
"appliesToAny": "N'importe quel type",
|
||||
"allKindsNotice": "Modèles s'appliquant à tous les types : {count}. Leurs destinations les utilisent aussi pour les messages d'anomalie, de synthétiques, d'astreinte, de période de maintenance et d'incident. Vérifiez-les.",
|
||||
"allKindsNoticeReview": "Vérifier",
|
||||
"appliesToInferred": "Déduit des variables du corps",
|
||||
"appliesToManual": "Choisi par vous",
|
||||
"appliesToReset": "Rétablir la déduction",
|
||||
"previewKind": "Type",
|
||||
"previewForbidden": "Vous n'avez pas la permission de prévisualiser les modèles",
|
||||
"previewFailed": "Échec de l'aperçu : {message}",
|
||||
"severityFailed": "Échec",
|
||||
"severityDegraded": "Dégradé",
|
||||
"severityFlaky": "Instable",
|
||||
"severityRecovered": "Rétabli",
|
||||
"variableGroupCommon": "Commun"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "Sources d'alerte externes",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "En-tête",
|
||||
"api_header_value": "Valeur",
|
||||
"skip_tls_verify": "Ignorer la vérification TLS",
|
||||
"payloadFormat": "Format de la charge utile",
|
||||
"payloadFormatAuto": "Automatique",
|
||||
"payloadFormatLegacy": "JSON hérité",
|
||||
"payloadFormatRendered": "Modèle rendu",
|
||||
"payloadFormatHelp": "Automatique envoie l'ancien corps JSON pour les messages d'anomalie, de synthétiques et d'astreinte tant qu'aucun modèle n'est associé. Stocké sous la clé de métadonnées payload_format.",
|
||||
"output_format": "Format de sortie",
|
||||
"readonly": "En lecture seule",
|
||||
"additional_settings": "Réglages supplémentaires",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "Rien n'a encore été envoyé.",
|
||||
"deliveriesRun": "Exécution d'échelle {run} — un transfert a relancé la montée au sein de l'équipe réceptrice.",
|
||||
"deliveryLanded": "Envoyé",
|
||||
"deliveryTemplate": "Modèle : {templates}",
|
||||
"deliveryFailed": "Échec",
|
||||
"deliveriesTruncated": "Affichage de {shown} sur {total} envois.",
|
||||
"teamChannelTitle": "Canal d'équipe",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "Envoyer une alerte de test {priority} à {names} ? Elle n'escalade pas.",
|
||||
"testPageSentOf": "{sent} message envoyé sur {total} | {sent} messages envoyés sur {total}",
|
||||
"ladderSendTest": "Envoyer un test",
|
||||
"scopeNotSeenYet": "Pas encore vu dans vos données"
|
||||
"scopeNotSeenYet": "Pas encore vu dans vos données",
|
||||
"policyMailBanner": "Les destinations e-mail et SNS reçoivent les notifications de cette version : {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "Activer l'utilisation payante de l'IA ?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "Vista",
|
||||
"frustration": "Frustrazione",
|
||||
"failedRequest": "Richieste non riuscite",
|
||||
"noResponse": "Nessuna risposta"
|
||||
"noResponse": "Nessuna risposta",
|
||||
"noResponseStatus": "0 — Nessuna risposta",
|
||||
"failedRequestDetails": "Dettagli della richiesta non riuscita",
|
||||
"browserStatus": "Stato del browser",
|
||||
"serverStatus": "Stato del server",
|
||||
"noServerSpanFound": "Nessuno span server trovato",
|
||||
"noServerSpanHint": "Uno span mancante può anche significare campionamento, ritardo nell'ingestione, una route non strumentata o conservazione.",
|
||||
"unknownNoTrace": "Sconosciuto (nessuna traccia)",
|
||||
"unknown": "Sconosciuto",
|
||||
"abortedByApp": "interrotta dall'app",
|
||||
"method": "Metodo",
|
||||
"url": "URL",
|
||||
"duration": "Durata",
|
||||
"timing": "Tempi",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "Connessione",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "Primo byte",
|
||||
"timingDownload": "Download",
|
||||
"size": "Dimensione",
|
||||
"initiatedBy": "Avviata da"
|
||||
},
|
||||
"replayCanvasNotRecorded": "Contenuto del canvas non registrato",
|
||||
"actionOnTarget": "{action} su \"{target}\"",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "Pagina",
|
||||
"noDeviceData": "Nessun clic registrato su questo tipo di dispositivo per questa pagina.",
|
||||
"noReplay": "Nessuna registrazione di sessione è stata acquisita per questa pagina, quindi non c'è uno screenshot su cui disegnare. Attiva la registrazione delle sessioni per l'app.",
|
||||
"noReplayLegacySdk": "Le istantanee della pagina richiedono un RUM SDK più recente. Il session replay registrato qui proviene da un SDK precedente, quindi non c'è alcuno screenshot su cui disegnare.",
|
||||
"loadFailed": "Impossibile caricare i dati dei clic.",
|
||||
"snapshotFailed": "Impossibile caricare l'istantanea della pagina.",
|
||||
"noPosition": "Nessun clic in questo periodo per questa pagina.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "Controllo ogni {seconds} s · avviato {elapsed} fa",
|
||||
"metaSince": "Controllo ogni {seconds} s · avviato {elapsed} fa · conta solo i record dopo {time}",
|
||||
"hintWaiting": "Diventa verde da solo quando arriva il primo record. Se non arriva nulla entro 2 minuti, mostra cosa è andato storto; Risoluzione problemi controlla subito.",
|
||||
"hintWaitingAfter": "Diventa verde da solo quando arriva il primo record. Se non arriva nulla entro {elapsed}, mostra cosa è andato storto; Risoluzione dei problemi controlla ora.",
|
||||
"hintWaitingLate": "Diventa verde da solo quando arriva il primo record. I controlli si interrompono dopo 60 minuti; se i dati arrivano più tardi, Home te lo segnala alla prossima visita.",
|
||||
"hintStillChecking": "Controllo ancora ogni {seconds} s. Diventa verde da solo quando arrivano i dati.",
|
||||
"troubleshoot": "Risoluzione problemi",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "Gli stream corrispondenti ricevono già dati. I controlli iniziano quando copi la configurazione.",
|
||||
"idleNew": "I controlli iniziano quando copi il comando.",
|
||||
"idleNewConfig": "I controlli iniziano quando copi la configurazione.",
|
||||
"idleInPrompt": "{stream} riceve già dati. I controlli iniziano quando copi il prompt.",
|
||||
"idleMatchesPrompt": "Gli stream corrispondenti ricevono già dati. I controlli iniziano quando copi il prompt.",
|
||||
"idleNewPrompt": "I controlli iniziano quando copi il prompt.",
|
||||
"checkNow": "Verifica ora",
|
||||
"receivedPill": "Primo evento ricevuto",
|
||||
"receivedNewPill": "Nuovi dati ricevuti",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "Il token usato dal tuo mittente non corrisponde al token attuale di questa organizzazione. Copia di nuovo il comando e rieseguilo.",
|
||||
"fixInvalidCredentialsConfig": "La password nella configurazione di {tool} non corrisponde al token dell'organizzazione {token}. Copia di nuovo la configurazione e riavvia {tool}.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "La password nella configurazione di {tool} non corrisponde al token attuale di questa organizzazione. Copia di nuovo la configurazione e riavvia {tool}.",
|
||||
"fixInvalidCredentialsPrompt": "Il token nel tuo .env non corrisponde al token dell'organizzazione {token}. Scarica di nuovo il file .env e chiedi al tuo agente di programmazione di eseguire nuovamente la richiesta.",
|
||||
"fixInvalidCredentialsPromptUnnamed": "Il token nel tuo .env non corrisponde al token corrente di questa organizzazione. Scarica di nuovo il file .env e chiedi al tuo agente di programmazione di eseguire nuovamente la richiesta.",
|
||||
"fixMalformedBody": "Il corpo della richiesta non è in un formato accettato da questo endpoint. Controlla il formato del payload, poi invia di nuovo.",
|
||||
"fixBatchTooLarge": "Il batch è più grande di quanto questo endpoint accetti. Riduci la dimensione del batch, poi invia di nuovo.",
|
||||
"fixRateOrQuota": "Le richieste superano il limite di frequenza o quota. Attendi un minuto per farle passare, oppure controlla il piano.",
|
||||
"copyCommand": "Copia comando",
|
||||
"copyConfig": "Copia configurazione",
|
||||
"copyPrompt": "Copia prompt",
|
||||
"rightPlace": "Stai inviando nel posto giusto? {org} si trova in {region}: {endpoint}",
|
||||
"noRequestsPill": "Non è ancora arrivato nulla",
|
||||
"noRequestsSummary": "Non è arrivato nulla in {org} in {region} {window}, e nessuna richiesta è stata rifiutata.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": "Scarica .env",
|
||||
"promptTitle": "Incolla questo in {client1}, {client2} o {client3}",
|
||||
"promptLabel": "Prompt",
|
||||
"promptCopied": "Prompt copiato"
|
||||
"promptCopied": "Prompt copiato",
|
||||
"health": {
|
||||
"title": "Stato dei dati AI",
|
||||
"scopeAgent": "Span dall'agente {agent} in {stream} dall'inizio del controllo",
|
||||
"scopeStream": "Span in {stream} dall'inizio del controllo",
|
||||
"checking": "Verifica dello stato dei dati AI…",
|
||||
"checkAgain": "Controlla di nuovo",
|
||||
"checkAgainHint": "Dopo che il tuo agente di programmazione modifica il codice ed esegue un'altra richiesta, controlla di nuovo.",
|
||||
"unsupported": "Questa versione di OpenObserve non controlla lo stato dei dati AI. Il tuo primo span è arrivato, quindi il tracciamento funziona.",
|
||||
"error": "Impossibile eseguire i controlli dello stato dei dati AI. Il tuo primo span è arrivato, quindi il tracciamento funziona.",
|
||||
"noGenAiSpans": "Sono arrivati degli span, ma nessuno è una chiamata LLM, quindi il client LLM non è strumentato. Chiedi al tuo agente di programmazione di strumentare il client LLM ed eseguire una richiesta, poi controlla di nuovo."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "Origini dei dati",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "Visualizza l'anteprima di un template",
|
||||
"helpPreviewSelectPlaceholder": "Seleziona un template da visualizzare in anteprima",
|
||||
"helpApplyToAlert": "Applica all'avviso",
|
||||
"helpApplyToObject": "Usa questo template",
|
||||
"helpTemplateExplainObject": "Un template è il messaggio che viene inviato: il testo più le variabili. Selezionarne uno qui sostituisce il template di ogni destinazione, solo per questa configurazione.",
|
||||
"helpTemplateWhenDescObject": "Lascia vuoto questo campo e ogni destinazione usa il proprio template, se si applica a questo tipo, poi il messaggio predefinito. Imposta un override per inviare un unico messaggio a ogni destinazione compatibile.",
|
||||
"helpCurrentHeadingObject": "Cosa viene inviato ora",
|
||||
"helpCurrentOverrideSome": "Le destinazioni compatibili usano questo template:",
|
||||
"helpCurrentResolved": "Nessun override impostato. Ogni destinazione usa:",
|
||||
"helpVariablesExplain": "Le variabili sono valori personalizzati che puoi inserire in un messaggio di notifica. Assegna a ciascuna un nome e un valore qui, quindi scrivi {'{'}your_name{'}'} in qualsiasi punto del template: viene compilato quando viene attivato l'avviso.",
|
||||
"helpBuiltInHeading": "Sfoglia le variabili integrate",
|
||||
"helpBuiltInIntro": "{product} li compila automaticamente — clicca su uno per copiarlo.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "Ora",
|
||||
"event": "Evento",
|
||||
"destinations": "Destinazioni",
|
||||
"template": "Template",
|
||||
"result": "Risultato",
|
||||
"ok": "Inviata",
|
||||
"pending": "Invio in corso",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "attivo per {duration}",
|
||||
"incident": "Incidente"
|
||||
},
|
||||
"priorityUnsetPagesAs": "Non impostata (avvisa come P2)"
|
||||
"priorityUnsetPagesAs": "Non impostata (avvisa come P2)",
|
||||
"notificationKinds": {
|
||||
"alert": "Avviso",
|
||||
"incident": "Incidente",
|
||||
"anomaly": "Anomalia",
|
||||
"synthetics": "Synthetics",
|
||||
"downtime": "Downtime",
|
||||
"on_call": "Reperibilità"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "Override del template",
|
||||
"placeholder": "Usa il template della destinazione",
|
||||
"help": "Sostituisce il template della destinazione per i messaggi di tipo {kind}. Non è possibile scegliere template predefiniti; copiarne prima uno.",
|
||||
"empty": "Nessun template si applica ancora a {kind}.",
|
||||
"create": "Crea template",
|
||||
"loadFailed": "Impossibile caricare i template",
|
||||
"forbidden": "Per elencare i template serve l'autorizzazione di lettura dei template",
|
||||
"mismatch": "Non si adatta a {count} delle tue destinazioni ({names}); queste useranno il proprio template.",
|
||||
"groupContent": "Contenuto",
|
||||
"groupCustom": "Personalizzato",
|
||||
"webhookOnly": "(solo webhook)",
|
||||
"emailOnly": "(solo email)",
|
||||
"snsOnly": "(solo SNS)",
|
||||
"stale": "Il template {name} non esiste più. Scegline un altro o svuota il campo.",
|
||||
"willUse": "Verrà usato: {template}",
|
||||
"willUsePerDestination": "Verrà usato, per destinazione:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "Messaggio predefinito di tipo {kind}",
|
||||
"sourceExplicit": "questa sovrascrittura",
|
||||
"sourceDestination": "template della destinazione",
|
||||
"sourceOrgDefault": "predefinito dell'organizzazione",
|
||||
"sourceCompiled": "predefinito",
|
||||
"sourcePlatformResolve": "risoluzione della piattaforma",
|
||||
"sourceLegacy": "payload legacy",
|
||||
"sourceLegacyPayload": "il payload JSON proprio del tipo (webhook generico)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "Apri",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "L'email reale è in HTML con un'alternativa in testo semplice. Vedi Payload per entrambi.",
|
||||
"previewFidelityWebhook": "I ricevitori webhook ricevono JSON, non una card. Vedi Payload per il corpo esatto.",
|
||||
"previewFidelityMachine": "Questo canale è utilizzato da software, non letto da persone — la card è una resa normalizzata. Payload mostra il corpo esatto che viene inviato.",
|
||||
"playgroundLabel": "Playground",
|
||||
"playgroundHelp": "Qui non viene inviato nulla.",
|
||||
"previewChannel": "Canale",
|
||||
"previewSeverity": "Gravità",
|
||||
"previewSeveritySingle": "Livello singolo (nessun livello)",
|
||||
"previewEmptyTitle": "L'anteprima apparirà qui",
|
||||
"unknownVariables": "Variabili sconosciute",
|
||||
"emptyVariables": "Vuoti per {kind}: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (Adaptive Card)",
|
||||
"channelTeamsMessageCard": "Teams (MessageCard)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "Questo invierà un vero messaggio al canale selezionato, contrassegnato [TEST].",
|
||||
"testSendSuccess": "Messaggio di test inviato",
|
||||
"testSendRateLimited": "Troppi invii di test — attendi un momento e riprova.",
|
||||
"testSendNoDestination": "Seleziona prima una destinazione"
|
||||
"testSendNoDestination": "Seleziona prima una destinazione",
|
||||
"appliesTo": "Si applica a",
|
||||
"appliesToAll": "Tutti i tipi",
|
||||
"appliesToAny": "Qualsiasi tipo",
|
||||
"allKindsNotice": "Template che si applicano a ogni tipo: {count}. Le relative destinazioni li usano anche per messaggi di anomalia, Synthetics, reperibilità, downtime e incidente. Rivedili.",
|
||||
"allKindsNoticeReview": "Rivedi",
|
||||
"appliesToInferred": "Dedotto dalle variabili nel corpo",
|
||||
"appliesToManual": "Scelto da te",
|
||||
"appliesToReset": "Ripristina al valore dedotto",
|
||||
"previewKind": "Tipo",
|
||||
"previewForbidden": "Non hai l'autorizzazione per visualizzare l'anteprima dei template",
|
||||
"previewFailed": "Anteprima non riuscita: {message}",
|
||||
"severityFailed": "Non riuscito",
|
||||
"severityDegraded": "Degradato",
|
||||
"severityFlaky": "Instabile",
|
||||
"severityRecovered": "Ripristinato",
|
||||
"variableGroupCommon": "Comuni"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "Sorgenti di avvisi esterne",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "Intestazione",
|
||||
"api_header_value": "Valore",
|
||||
"skip_tls_verify": "Salta la verifica TLS",
|
||||
"payloadFormat": "Formato payload",
|
||||
"payloadFormatAuto": "Automatico",
|
||||
"payloadFormatLegacy": "JSON legacy",
|
||||
"payloadFormatRendered": "Template renderizzato",
|
||||
"payloadFormatHelp": "Automatico invia il vecchio corpo JSON per i messaggi di anomalia, Synthetics e reperibilità finché non viene associato un template. Memorizzato come chiave di metadati payload_format.",
|
||||
"output_format": "Formato di output",
|
||||
"readonly": "Sola lettura",
|
||||
"additional_settings": "Impostazioni aggiuntive",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "Non è stato ancora inviato nulla.",
|
||||
"deliveriesRun": "Esecuzione della scala {run} — un passaggio di consegne ha riavviato la salita per il team ricevente.",
|
||||
"deliveryLanded": "Inviato",
|
||||
"deliveryTemplate": "Template: {templates}",
|
||||
"deliveryFailed": "Non riuscito",
|
||||
"deliveriesTruncated": "Mostrando {shown} di {total} invii.",
|
||||
"teamChannelTitle": "Canale del team",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "Inviare un avviso di test {priority} a {names}? Non viene escalato.",
|
||||
"testPageSentOf": "Inviato {sent} messaggio su {total} | Inviati {sent} messaggi su {total}",
|
||||
"ladderSendTest": "Invia test",
|
||||
"scopeNotSeenYet": "Non ancora visto nei tuoi dati"
|
||||
"scopeNotSeenYet": "Non ancora visto nei tuoi dati",
|
||||
"policyMailBanner": "Le destinazioni Email e SNS ricevono notifiche da questa versione: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "Attivare l'utilizzo a pagamento dell'IA?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "ビュー",
|
||||
"frustration": "フラストレーション",
|
||||
"failedRequest": "失敗したリクエスト",
|
||||
"noResponse": "応答なし"
|
||||
"noResponse": "応答なし",
|
||||
"noResponseStatus": "0 — レスポンスなし",
|
||||
"failedRequestDetails": "失敗したリクエストの詳細",
|
||||
"browserStatus": "ブラウザのステータス",
|
||||
"serverStatus": "サーバーのステータス",
|
||||
"noServerSpanFound": "サーバースパンが見つかりません",
|
||||
"noServerSpanHint": "スパンが見つからない場合は、サンプリング、取り込みの遅延、計装されていないルート、または保持期間が原因の可能性もあります。",
|
||||
"unknownNoTrace": "不明(トレースなし)",
|
||||
"unknown": "不明",
|
||||
"abortedByApp": "アプリによって中止",
|
||||
"method": "メソッド",
|
||||
"url": "URL",
|
||||
"duration": "所要時間",
|
||||
"timing": "タイミング",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "接続",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "最初のバイト",
|
||||
"timingDownload": "ダウンロード",
|
||||
"size": "サイズ",
|
||||
"initiatedBy": "開始元"
|
||||
},
|
||||
"replayCanvasNotRecorded": "Canvas の内容は記録されていません",
|
||||
"actionOnTarget": "{action}(\"{target}\" に対して)",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "ページ",
|
||||
"noDeviceData": "このページでは、このデバイスタイプでクリックが記録されていません。",
|
||||
"noReplay": "このページのセッションリプレイは記録されていないため、描画するスクリーンショットがありません。アプリでセッションリプレイを有効にしてください。",
|
||||
"noReplayLegacySdk": "ページスナップショットにはより新しい RUM SDK が必要です。ここで記録されたセッションリプレイは古い SDK によるものなので、描画に使えるスクリーンショットがありません。",
|
||||
"loadFailed": "クリックデータを読み込めませんでした。",
|
||||
"snapshotFailed": "ページスナップショットを読み込めませんでした。",
|
||||
"noPosition": "この期間、このページにはクリックがありません。",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "{seconds} 秒ごとに確認 · {elapsed}前に開始",
|
||||
"metaSince": "{seconds} 秒ごとに確認 · {elapsed}前に開始 · {time} 以降のレコードのみをカウント",
|
||||
"hintWaiting": "最初のレコードが到着すると自動的に緑になります。2分以内に何も到着しない場合は、問題点を表示します。トラブルシューティングで今すぐ確認できます。",
|
||||
"hintWaitingAfter": "最初のレコードが到着すると、これは自動的に緑になります。{elapsed}以内に何も届かない場合は、何が問題だったかを表示します。トラブルシュートを実行すると、すぐに確認できます。",
|
||||
"hintWaitingLate": "最初のレコードが到着すると自動的に緑になります。チェックは60分後に停止します。それ以降にデータが到着した場合は、次回アクセス時にホームで確認できます。",
|
||||
"hintStillChecking": "現在も {seconds} 秒ごとに確認しています。データが到着すると自動的に緑になります。",
|
||||
"troubleshoot": "トラブルシューティング",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "一致するストリームはすでにデータを受信しています。設定をコピーするとチェックが開始されます。",
|
||||
"idleNew": "コマンドをコピーするとチェックが開始されます。",
|
||||
"idleNewConfig": "設定をコピーするとチェックが開始されます。",
|
||||
"idleInPrompt": "{stream} はすでにデータを受信しています。プロンプトをコピーするとチェックが開始されます。",
|
||||
"idleMatchesPrompt": "一致するストリームはすでにデータを受信しています。プロンプトをコピーするとチェックが開始されます。",
|
||||
"idleNewPrompt": "プロンプトをコピーするとチェックが開始されます。",
|
||||
"checkNow": "今すぐ確認",
|
||||
"receivedPill": "最初のイベントを受信しました",
|
||||
"receivedNewPill": "新しいデータを受信しました",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "送信側が使用しているトークンがこの組織の現在のトークンと一致しません。コマンドを再度コピーして再実行してください。",
|
||||
"fixInvalidCredentialsConfig": "{tool} の設定内のパスワードが組織トークン {token} と一致しません。設定を再度コピーして {tool} を再起動してください。",
|
||||
"fixInvalidCredentialsConfigUnnamed": "{tool} の設定内のパスワードがこの組織の現在のトークンと一致しません。設定を再度コピーして {tool} を再起動してください。",
|
||||
"fixInvalidCredentialsPrompt": ".env 内のトークンが組織トークン {token} と一致しません。.env を再度ダウンロードし、コーディングエージェントにリクエストの再実行を依頼してください。",
|
||||
"fixInvalidCredentialsPromptUnnamed": ".env 内のトークンがこの組織の現在のトークンと一致しません。.env を再度ダウンロードし、コーディングエージェントにリクエストの再実行を依頼してください。",
|
||||
"fixMalformedBody": "リクエストボディがこのエンドポイントで受け付けられる形式ではありません。ペイロードの形式を確認して、再度送信してください。",
|
||||
"fixBatchTooLarge": "バッチがこのエンドポイントで受け付けられるサイズを超えています。バッチサイズを小さくして、再度送信してください。",
|
||||
"fixRateOrQuota": "リクエストがレートまたはクォータ制限を超えています。処理されるまで1分待つか、プランを確認してください。",
|
||||
"copyCommand": "コマンドをコピー",
|
||||
"copyConfig": "設定をコピー",
|
||||
"copyPrompt": "プロンプトをコピー",
|
||||
"rightPlace": "正しい送信先に送信していますか? {org} は {region} にあります: {endpoint}",
|
||||
"noRequestsPill": "まだ何も到着していません",
|
||||
"noRequestsSummary": "{region} の {org} には {window} 何も到着しておらず、リクエストも拒否されていません。",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": ".env をダウンロード",
|
||||
"promptTitle": "{client1}、{client2}、{client3} に貼り付けてください",
|
||||
"promptLabel": "プロンプト",
|
||||
"promptCopied": "プロンプトをコピーしました"
|
||||
"promptCopied": "プロンプトをコピーしました",
|
||||
"health": {
|
||||
"title": "AI データヘルス",
|
||||
"scopeAgent": "チェック開始以降に {stream} 内のエージェント {agent} から届いたスパン",
|
||||
"scopeStream": "チェック開始以降の {stream} 内のスパン",
|
||||
"checking": "AI データヘルスを確認しています…",
|
||||
"checkAgain": "再度確認",
|
||||
"checkAgainHint": "コーディングエージェントがコードを変更し、別のリクエストを実行したら、再度確認してください。",
|
||||
"unsupported": "このバージョンの OpenObserve は AI データヘルスを確認しません。最初のスパンは到着しているため、トレーシングは機能しています。",
|
||||
"error": "AI データヘルスのチェックを実行できませんでした。最初のスパンは到着しているため、トレーシングは機能しています。",
|
||||
"noGenAiSpans": "スパンは到着しましたが、そのいずれも LLM 呼び出しではないため、LLM クライアントは計装されていません。コーディングエージェントに LLM クライアントの計装を依頼し、リクエストを実行してから、再度確認してください。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "データソース",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "テンプレートをプレビューする",
|
||||
"helpPreviewSelectPlaceholder": "プレビューするテンプレートを選択してください",
|
||||
"helpApplyToAlert": "アラートに適用",
|
||||
"helpApplyToObject": "このテンプレートを使用",
|
||||
"helpTemplateExplainObject": "テンプレートは送信されるメッセージです。テキストと変数で構成されます。ここで選択すると、この設定に限り、各宛先の独自テンプレートが置き換えられます。",
|
||||
"helpTemplateWhenDescObject": "空のままにすると、各宛先はこの種類に該当する場合は独自テンプレートを使用し、その後、組み込みメッセージを使用します。オーバーライドを設定すると、該当するすべての宛先に同じメッセージを送信します。",
|
||||
"helpCurrentHeadingObject": "現在送信される内容",
|
||||
"helpCurrentOverrideSome": "該当する宛先はこのテンプレートを使用します:",
|
||||
"helpCurrentResolved": "オーバーライドは設定されていません。各宛先が使用するもの:",
|
||||
"helpVariablesExplain": "変数は、通知メッセージにドロップできる独自の値です。それぞれに名前と値を指定し、テンプレートの任意の場所に {'{'}your_name{'}'} と記述します。アラートが発生すると値が入力されます。",
|
||||
"helpBuiltInHeading": "組み込み変数を見る",
|
||||
"helpBuiltInIntro": "{product}はこれらを自動的に入力します — クリックしてコピーしてください。",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "時刻",
|
||||
"event": "イベント",
|
||||
"destinations": "宛先",
|
||||
"template": "テンプレート",
|
||||
"result": "結果",
|
||||
"ok": "送信済み",
|
||||
"pending": "送信中",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "{duration} 間発火中",
|
||||
"incident": "インシデント"
|
||||
},
|
||||
"priorityUnsetPagesAs": "未設定(P2 として呼び出し)"
|
||||
"priorityUnsetPagesAs": "未設定(P2 として呼び出し)",
|
||||
"notificationKinds": {
|
||||
"alert": "アラート",
|
||||
"incident": "インシデント",
|
||||
"anomaly": "異常",
|
||||
"synthetics": "合成モニタリング",
|
||||
"downtime": "ダウンタイム",
|
||||
"on_call": "オンコール"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "テンプレートオーバーライド",
|
||||
"placeholder": "宛先のテンプレートを使用",
|
||||
"help": "{kind} メッセージの宛先テンプレートを上書きします。プリビルドテンプレートは選択できないため、先にコピーしてください。",
|
||||
"empty": "{kind} に適用できるテンプレートはまだありません。",
|
||||
"create": "テンプレートを作成",
|
||||
"loadFailed": "テンプレートを読み込めませんでした",
|
||||
"forbidden": "テンプレートを一覧表示するには、テンプレートの読み取り権限が必要です",
|
||||
"mismatch": "あなたの宛先のうち {count} 件({names})には適合しません。これらの宛先はそれぞれのテンプレートにフォールバックします。",
|
||||
"groupContent": "コンテンツ",
|
||||
"groupCustom": "カスタム",
|
||||
"webhookOnly": "(Webhook のみ)",
|
||||
"emailOnly": "(メールのみ)",
|
||||
"snsOnly": "(SNS のみ)",
|
||||
"stale": "テンプレート {name} は存在しなくなりました。別のものを選択するか、フィールドをクリアしてください。",
|
||||
"willUse": "使用予定: {template}",
|
||||
"willUsePerDestination": "宛先ごとの使用予定:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "組み込みの {kind} メッセージ",
|
||||
"sourceExplicit": "このオーバーライド",
|
||||
"sourceDestination": "宛先テンプレート",
|
||||
"sourceOrgDefault": "組織のデフォルト",
|
||||
"sourceCompiled": "組み込み",
|
||||
"sourcePlatformResolve": "プラットフォームによる解決",
|
||||
"sourceLegacy": "レガシーペイロード",
|
||||
"sourceLegacyPayload": "種類固有の JSON ペイロード(汎用 Webhook)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "開く",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "実際のメールはHTMLで、プレーンテキスト版も含まれます。両方ともペイロードを参照してください。",
|
||||
"previewFidelityWebhook": "WebhookレシーバーはカードではなくJSONを受け取ります。正確な本文はペイロードを参照してください。",
|
||||
"previewFidelityMachine": "このチャネルは人が読むものではなくソフトウェアが利用するものです。カードは正規化されたレンダリングです。送信される正確な本文はペイロードに表示されます。",
|
||||
"playgroundLabel": "プレイグラウンド",
|
||||
"playgroundHelp": "ここでは何も送信されません。",
|
||||
"previewChannel": "チャネル",
|
||||
"previewSeverity": "重大度",
|
||||
"previewSeveritySingle": "単一レベル(レベルなし)",
|
||||
"previewEmptyTitle": "プレビューがここに表示されます",
|
||||
"unknownVariables": "不明な変数",
|
||||
"emptyVariables": "「{kind}」では次の変数が空です: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams(アダプティブカード)",
|
||||
"channelTeamsMessageCard": "Teams(メッセージカード)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "これにより、選択したチャネルに [TEST] とマークされた実際のメッセージが投稿されます。",
|
||||
"testSendSuccess": "テストメッセージを送信しました",
|
||||
"testSendRateLimited": "テスト送信が多すぎます。しばらく待ってから再試行してください",
|
||||
"testSendNoDestination": "最初に宛先を選択してください"
|
||||
"testSendNoDestination": "最初に宛先を選択してください",
|
||||
"appliesTo": "適用対象",
|
||||
"appliesToAll": "すべての種類",
|
||||
"appliesToAny": "任意の種類",
|
||||
"allKindsNotice": "すべての種類に適用されるテンプレート: {count} 件。これらのテンプレートは、宛先で異常検知、合成モニタリング、オンコール、ダウンタイム、インシデントのメッセージにも使用されます。確認してください。",
|
||||
"allKindsNoticeReview": "確認",
|
||||
"appliesToInferred": "本文内の変数から推定",
|
||||
"appliesToManual": "ユーザーが選択",
|
||||
"appliesToReset": "推定にリセット",
|
||||
"previewKind": "種類",
|
||||
"previewForbidden": "テンプレートをプレビューする権限がありません",
|
||||
"previewFailed": "プレビューに失敗しました: {message}",
|
||||
"severityFailed": "失敗",
|
||||
"severityDegraded": "劣化",
|
||||
"severityFlaky": "不安定",
|
||||
"severityRecovered": "復旧",
|
||||
"variableGroupCommon": "共通"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "外部アラートソース",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "ヘッダー",
|
||||
"api_header_value": "値",
|
||||
"skip_tls_verify": "TLS検証をスキップ",
|
||||
"payloadFormat": "ペイロード形式",
|
||||
"payloadFormatAuto": "自動",
|
||||
"payloadFormatLegacy": "レガシー JSON",
|
||||
"payloadFormatRendered": "レンダリング済みテンプレート",
|
||||
"payloadFormatHelp": "自動では、テンプレートが関連付けられるまで、異常検知、合成モニタリング、オンコールのメッセージに従来の JSON 本文を送信します。メタデータキー payload_format として保存されます。",
|
||||
"output_format": "出力フォーマット",
|
||||
"readonly": "読み取り専用",
|
||||
"additional_settings": "その他の設定",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "まだ何も送信されていません。",
|
||||
"deliveriesRun": "ラダー実行 {run} — ハンドオフにより、受け入れ側チームでラダーが最初から再開されました",
|
||||
"deliveryLanded": "送信済み",
|
||||
"deliveryTemplate": "テンプレート: {templates}",
|
||||
"deliveryFailed": "送信失敗",
|
||||
"deliveriesTruncated": "{total} 件中 {shown} 件の送信を表示中。",
|
||||
"teamChannelTitle": "チームチャンネル",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "{priority} のテスト呼び出しを {names} に送信しますか?エスカレーションはしません。",
|
||||
"testPageSentOf": "{total} 件中 {sent} 件のメッセージを送信 | {total} 件中 {sent} 件のメッセージを送信",
|
||||
"ladderSendTest": "テスト送信",
|
||||
"scopeNotSeenYet": "まだデータで確認されていません"
|
||||
"scopeNotSeenYet": "まだデータで確認されていません",
|
||||
"policyMailBanner": "メールおよび SNS の宛先は、このバージョンから呼び出しを受け取ります: {names}。"
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "有料のAI使用を有効にしますか?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "보기",
|
||||
"frustration": "불만",
|
||||
"failedRequest": "실패한 요청",
|
||||
"noResponse": "응답 없음"
|
||||
"noResponse": "응답 없음",
|
||||
"noResponseStatus": "0 — 응답 없음",
|
||||
"failedRequestDetails": "실패한 요청 세부 정보",
|
||||
"browserStatus": "브라우저 상태",
|
||||
"serverStatus": "서버 상태",
|
||||
"noServerSpanFound": "서버 스팬을 찾을 수 없음",
|
||||
"noServerSpanHint": "스팬이 없는 것은 샘플링, 수집 지연, 계측되지 않은 라우트 또는 보존 기간 때문일 수도 있습니다.",
|
||||
"unknownNoTrace": "알 수 없음 (트레이스 없음)",
|
||||
"unknown": "알 수 없음",
|
||||
"abortedByApp": "앱에서 중단됨",
|
||||
"method": "메서드",
|
||||
"url": "URL",
|
||||
"duration": "소요 시간",
|
||||
"timing": "타이밍",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "연결",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "첫 바이트",
|
||||
"timingDownload": "다운로드",
|
||||
"size": "크기",
|
||||
"initiatedBy": "시작 주체"
|
||||
},
|
||||
"replayCanvasNotRecorded": "캔버스 콘텐츠가 기록되지 않았습니다",
|
||||
"actionOnTarget": "{action}: \"{target}\"",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "페이지",
|
||||
"noDeviceData": "이 페이지에서는 이 기기 유형에 기록된 클릭이 없습니다.",
|
||||
"noReplay": "이 페이지에는 세션 재생이 기록되지 않아 히트맵을 그릴 스크린샷이 없습니다. 앱에서 세션 재생을 켜세요.",
|
||||
"noReplayLegacySdk": "페이지 스냅샷에는 최신 RUM SDK가 필요합니다. 여기에 기록된 세션 재생은 이전 SDK에서 생성되어 스크린샷을 표시할 수 없습니다.",
|
||||
"loadFailed": "클릭 데이터를 불러오지 못했습니다.",
|
||||
"snapshotFailed": "페이지 스냅샷을 불러오지 못했습니다.",
|
||||
"noPosition": "이 기간 동안 이 페이지에 클릭이 없습니다.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "{seconds}초마다 확인 중 · {elapsed} 전 시작",
|
||||
"metaSince": "{seconds}초마다 확인 중 · {elapsed} 전 시작 · {time} 이후 레코드만 집계",
|
||||
"hintWaiting": "첫 레코드가 도착하면 자동으로 초록색으로 바뀝니다. 2분 내에 아무것도 도착하지 않으면 무엇이 잘못되었는지 표시됩니다. 문제 해결을 누르면 지금 확인합니다.",
|
||||
"hintWaitingAfter": "첫 레코드가 도착하면 자동으로 초록색으로 바뀝니다. {elapsed} 안에 아무것도 도착하지 않으면 무엇이 잘못되었는지 표시되며, 문제 해결을 누르면 지금 확인합니다.",
|
||||
"hintWaitingLate": "첫 레코드가 도착하면 자동으로 초록색으로 바뀝니다. 확인은 60분 후 중지됩니다. 데이터가 나중에 도착하면 다음 방문 시 홈에서 알려드립니다.",
|
||||
"hintStillChecking": "{seconds}초마다 계속 확인 중입니다. 데이터가 도착하면 자동으로 초록색으로 바뀝니다.",
|
||||
"troubleshoot": "문제 해결",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "일치하는 스트림은 이미 데이터를 수신하고 있습니다. 구성을 복사하면 확인이 시작됩니다.",
|
||||
"idleNew": "명령을 복사하면 확인이 시작됩니다.",
|
||||
"idleNewConfig": "구성을 복사하면 확인이 시작됩니다.",
|
||||
"idleInPrompt": "{stream}은(는) 이미 데이터를 수신하고 있습니다. 프롬프트를 복사하면 확인이 시작됩니다.",
|
||||
"idleMatchesPrompt": "일치하는 스트림이 이미 데이터를 수신하고 있습니다. 프롬프트를 복사하면 확인이 시작됩니다.",
|
||||
"idleNewPrompt": "프롬프트를 복사하면 확인이 시작됩니다.",
|
||||
"checkNow": "지금 확인",
|
||||
"receivedPill": "첫 이벤트 수신됨",
|
||||
"receivedNewPill": "새 데이터 수신됨",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "보낸 쪽에서 사용하는 토큰이 이 조직의 현재 토큰과 일치하지 않습니다. 명령을 다시 복사한 후 다시 실행하세요.",
|
||||
"fixInvalidCredentialsConfig": "{tool} 구성의 비밀번호가 조직 토큰 {token}과 일치하지 않습니다. 구성을 다시 복사하고 {tool}을(를) 재시작하세요.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "{tool} 구성의 비밀번호가 이 조직의 현재 토큰과 일치하지 않습니다. 구성을 다시 복사하고 {tool}을(를) 재시작하세요.",
|
||||
"fixInvalidCredentialsPrompt": ".env의 토큰이 조직 토큰 {token}과 일치하지 않습니다. .env를 다시 다운로드한 뒤 코딩 에이전트에게 요청을 다시 실행하도록 하세요.",
|
||||
"fixInvalidCredentialsPromptUnnamed": ".env의 토큰이 이 조직의 현재 토큰과 일치하지 않습니다. .env를 다시 다운로드한 뒤 코딩 에이전트에게 요청을 다시 실행하도록 하세요.",
|
||||
"fixMalformedBody": "요청 본문이 이 엔드포인트에서 허용하는 형식이 아닙니다. 페이로드 형식을 확인한 후 다시 전송하세요.",
|
||||
"fixBatchTooLarge": "배치가 이 엔드포인트에서 허용하는 크기보다 큽니다. 배치 크기를 줄인 후 다시 전송하세요.",
|
||||
"fixRateOrQuota": "요청이 속도 또는 할당량 제한을 초과했습니다. 요청이 처리될 때까지 잠시 기다리거나 플랜을 확인하세요.",
|
||||
"copyCommand": "명령 복사",
|
||||
"copyConfig": "구성 복사",
|
||||
"copyPrompt": "프롬프트 복사",
|
||||
"rightPlace": "올바른 위치로 보내고 있나요? {org}은(는) {region}에 있습니다: {endpoint}",
|
||||
"noRequestsPill": "아직 아무것도 도착하지 않았습니다",
|
||||
"noRequestsSummary": "{region}의 {org}에 {window} 동안 아무것도 도착하지 않았고 거부된 요청도 없습니다.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": ".env 다운로드",
|
||||
"promptTitle": "{client1}, {client2} 또는 {client3}에 붙여넣으세요",
|
||||
"promptLabel": "프롬프트",
|
||||
"promptCopied": "프롬프트가 복사되었습니다"
|
||||
"promptCopied": "프롬프트가 복사되었습니다",
|
||||
"health": {
|
||||
"title": "AI 데이터 상태",
|
||||
"scopeAgent": "확인 시작 이후 {stream}의 에이전트 {agent}에서 발생한 스팬",
|
||||
"scopeStream": "확인 시작 이후 {stream}의 스팬",
|
||||
"checking": "AI 데이터 상태 확인 중…",
|
||||
"checkAgain": "다시 확인",
|
||||
"checkAgainHint": "코딩 에이전트가 코드를 변경하고 다른 요청을 실행한 후 다시 확인하세요.",
|
||||
"unsupported": "이 OpenObserve 버전은 AI 데이터 상태를 확인하지 않습니다. 첫 번째 스팬이 도착했으므로 트레이스가 동작합니다.",
|
||||
"error": "AI 데이터 상태 확인을 실행할 수 없습니다. 첫 번째 스팬이 도착했으므로 트레이스가 동작합니다.",
|
||||
"noGenAiSpans": "스팬은 도착했지만 그중 LLM 호출이 없으므로 LLM 클라이언트가 계측되지 않았습니다. 코딩 에이전트에게 LLM 클라이언트를 계측하고 요청을 실행한 뒤 다시 확인하도록 하세요."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "데이터 소스",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "템플릿 미리 보기",
|
||||
"helpPreviewSelectPlaceholder": "미리 볼 템플릿 선택",
|
||||
"helpApplyToAlert": "알림에 적용",
|
||||
"helpApplyToObject": "이 템플릿 사용",
|
||||
"helpTemplateExplainObject": "템플릿은 전송되는 메시지로, 텍스트와 변수로 구성됩니다. 여기서 템플릿을 선택하면 이 구성에 한해 각 대상의 자체 템플릿을 대체합니다.",
|
||||
"helpTemplateWhenDescObject": "비워 두면 각 대상은 이 종류에 적용되는 자체 템플릿을 사용하고, 없으면 기본 제공 메시지를 사용합니다. 재정의를 설정하면 해당하는 모든 대상에 하나의 메시지를 전송합니다.",
|
||||
"helpCurrentHeadingObject": "현재 전송되는 내용",
|
||||
"helpCurrentOverrideSome": "해당하는 대상은 이 템플릿을 사용합니다:",
|
||||
"helpCurrentResolved": "재정의가 설정되지 않았습니다. 각 대상은 다음을 사용합니다:",
|
||||
"helpVariablesExplain": "변수는 알림 메시지에 드롭할 수 있는 사용자 고유의 값입니다. 여기에 각 변수에 이름과 값을 지정한 다음 템플릿의 아무 곳에나 {'{'}your_name{'}'} 을 적으세요. 알림이 발생하면 자동으로 채워집니다.",
|
||||
"helpBuiltInHeading": "내장 변수 찾아보기",
|
||||
"helpBuiltInIntro": "{product}가 자동으로 입력합니다 — 클릭하여 복사하세요.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "시간",
|
||||
"event": "이벤트",
|
||||
"destinations": "대상",
|
||||
"template": "템플릿",
|
||||
"result": "결과",
|
||||
"ok": "전송됨",
|
||||
"pending": "전송 중",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "{duration} 동안 발생 중",
|
||||
"incident": "인시던트"
|
||||
},
|
||||
"priorityUnsetPagesAs": "설정 안 됨(P2로 호출)"
|
||||
"priorityUnsetPagesAs": "설정 안 됨(P2로 호출)",
|
||||
"notificationKinds": {
|
||||
"alert": "알림",
|
||||
"incident": "인시던트",
|
||||
"anomaly": "이상",
|
||||
"synthetics": "Synthetics",
|
||||
"downtime": "다운타임",
|
||||
"on_call": "온콜"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "템플릿 재정의",
|
||||
"placeholder": "대상의 템플릿 사용",
|
||||
"help": "{kind} 메시지에 대한 대상 템플릿을 재정의합니다. 미리 제공된 템플릿은 선택할 수 없습니다. 먼저 복사하세요.",
|
||||
"empty": "아직 {kind}에 적용되는 템플릿이 없습니다.",
|
||||
"create": "템플릿 생성",
|
||||
"loadFailed": "템플릿을 불러오지 못했습니다",
|
||||
"forbidden": "템플릿을 나열하려면 템플릿 읽기 권한이 필요합니다",
|
||||
"mismatch": "대상 {count}개에 적합하지 않습니다({names}). 해당 대상은 자체 템플릿으로 대체됩니다.",
|
||||
"groupContent": "콘텐츠",
|
||||
"groupCustom": "사용자 지정",
|
||||
"webhookOnly": "(웹훅 전용)",
|
||||
"emailOnly": "(이메일 전용)",
|
||||
"snsOnly": "(SNS 전용)",
|
||||
"stale": "템플릿 {name}이(가) 더 이상 존재하지 않습니다. 다른 템플릿을 선택하거나 필드를 비우세요.",
|
||||
"willUse": "사용 예정: {template}",
|
||||
"willUsePerDestination": "대상별 사용 예정:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "기본 제공 {kind} 메시지",
|
||||
"sourceExplicit": "이 재정의",
|
||||
"sourceDestination": "대상 템플릿",
|
||||
"sourceOrgDefault": "조직 기본값",
|
||||
"sourceCompiled": "기본 제공",
|
||||
"sourcePlatformResolve": "플랫폼 결정",
|
||||
"sourceLegacy": "레거시 페이로드",
|
||||
"sourceLegacyPayload": "해당 종류의 자체 JSON 페이로드(일반 웹훅)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "열기",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "실제 이메일은 일반 텍스트 대체 콘텐츠가 포함된 HTML입니다. 둘 다 페이로드를 확인하세요.",
|
||||
"previewFidelityWebhook": "웹훅 수신자는 카드가 아닌 JSON을 받습니다. 정확한 본문은 페이로드를 확인하세요.",
|
||||
"previewFidelityMachine": "이 채널은 사람이 읽는 것이 아니라 소프트웨어가 사용합니다 — 카드는 정규화된 렌더링입니다. 페이로드에는 전송되는 정확한 본문이 표시됩니다.",
|
||||
"playgroundLabel": "플레이그라운드",
|
||||
"playgroundHelp": "여기에서는 아무것도 전송되지 않습니다.",
|
||||
"previewChannel": "채널",
|
||||
"previewSeverity": "심각도",
|
||||
"previewSeveritySingle": "단일 레벨 (레벨 없음)",
|
||||
"previewEmptyTitle": "미리보기가 여기에 표시됩니다",
|
||||
"unknownVariables": "알 수 없는 변수",
|
||||
"emptyVariables": "{kind}에 대해 비어 있음: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (Adaptive Card)",
|
||||
"channelTeamsMessageCard": "Teams (MessageCard)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "선택한 채널에 [TEST]로 표시된 실제 메시지를 게시합니다.",
|
||||
"testSendSuccess": "테스트 메시지 전송됨",
|
||||
"testSendRateLimited": "테스트 전송이 너무 많습니다 — 잠시 후 다시 시도하세요.",
|
||||
"testSendNoDestination": "먼저 대상을 선택하세요."
|
||||
"testSendNoDestination": "먼저 대상을 선택하세요.",
|
||||
"appliesTo": "적용 대상",
|
||||
"appliesToAll": "모든 종류",
|
||||
"appliesToAny": "종류 무관",
|
||||
"allKindsNotice": "모든 종류에 적용되는 템플릿: {count}개. 이 템플릿의 대상은 이상 탐지, Synthetics, 온콜, 다운타임 및 인시던트 메시지에도 이 템플릿을 사용합니다. 검토하세요.",
|
||||
"allKindsNoticeReview": "검토",
|
||||
"appliesToInferred": "본문의 변수에서 추론됨",
|
||||
"appliesToManual": "직접 선택함",
|
||||
"appliesToReset": "추론값으로 재설정",
|
||||
"previewKind": "종류",
|
||||
"previewForbidden": "템플릿을 미리 볼 권한이 없습니다",
|
||||
"previewFailed": "미리보기 실패: {message}",
|
||||
"severityFailed": "실패",
|
||||
"severityDegraded": "저하됨",
|
||||
"severityFlaky": "불안정",
|
||||
"severityRecovered": "복구됨",
|
||||
"variableGroupCommon": "공통"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "외부 알림 소스",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "헤더",
|
||||
"api_header_value": "값",
|
||||
"skip_tls_verify": "TLS 확인 건너뛰기",
|
||||
"payloadFormat": "페이로드 형식",
|
||||
"payloadFormatAuto": "자동",
|
||||
"payloadFormatLegacy": "레거시 JSON",
|
||||
"payloadFormatRendered": "렌더링된 템플릿",
|
||||
"payloadFormatHelp": "자동은 템플릿이 연결될 때까지 이상 탐지, Synthetics 및 온콜 메시지에 기존 JSON 본문을 전송합니다. 메타데이터 키 payload_format으로 저장됩니다.",
|
||||
"output_format": "출력 형식",
|
||||
"readonly": "읽기 전용",
|
||||
"additional_settings": "추가 설정",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "아직 전송된 항목이 없습니다.",
|
||||
"deliveriesRun": "래더 실행 {run} — 인계로 인해 수신 팀의 호출 절차가 다시 시작되었습니다.",
|
||||
"deliveryLanded": "전송됨",
|
||||
"deliveryTemplate": "템플릿: {templates}",
|
||||
"deliveryFailed": "실패",
|
||||
"deliveriesTruncated": "{shown}건을 표시 중입니다 (총 {total}건).",
|
||||
"teamChannelTitle": "팀 채널",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "{priority} 테스트 호출을 {names}님에게 보낼까요? 에스컬레이션되지 않습니다.",
|
||||
"testPageSentOf": "메시지 {total}건 중 {sent}건 전송 | 메시지 {total}건 중 {sent}건 전송",
|
||||
"ladderSendTest": "테스트 보내기",
|
||||
"scopeNotSeenYet": "아직 데이터에서 확인되지 않음"
|
||||
"scopeNotSeenYet": "아직 데이터에서 확인되지 않음",
|
||||
"policyMailBanner": "이 버전에서는 이메일 및 SNS 대상이 호출을 수신합니다: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "유료 AI 사용을 켜시겠습니까?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "Weergave",
|
||||
"frustration": "Frustratie",
|
||||
"failedRequest": "Mislukte verzoeken",
|
||||
"noResponse": "Geen antwoord"
|
||||
"noResponse": "Geen antwoord",
|
||||
"noResponseStatus": "0 — Geen reactie",
|
||||
"failedRequestDetails": "Details van mislukte aanvraag",
|
||||
"browserStatus": "Browserstatus",
|
||||
"serverStatus": "Serverstatus",
|
||||
"noServerSpanFound": "Geen server-span gevonden",
|
||||
"noServerSpanHint": "Een ontbrekende span kan ook wijzen op sampling, ingestievertraging, een niet-geïnstrumenteerde route of retentie.",
|
||||
"unknownNoTrace": "Onbekend (geen trace)",
|
||||
"unknown": "Onbekend",
|
||||
"abortedByApp": "afgebroken door de app",
|
||||
"method": "Methode",
|
||||
"url": "URL",
|
||||
"duration": "Duur",
|
||||
"timing": "Timing",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "Verbinden",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "Eerste byte",
|
||||
"timingDownload": "Download",
|
||||
"size": "Grootte",
|
||||
"initiatedBy": "Geïnitieerd door"
|
||||
},
|
||||
"replayCanvasNotRecorded": "Canvas-inhoud niet opgenomen",
|
||||
"actionOnTarget": "{action} op \"{target}\"",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "Pagina",
|
||||
"noDeviceData": "Geen klikken geregistreerd op dit apparaattype voor deze pagina.",
|
||||
"noReplay": "Er is geen sessie-replay vastgelegd voor deze pagina, dus er is geen schermafbeelding om op te tekenen. Schakel sessie-replay in voor de app.",
|
||||
"noReplayLegacySdk": "Paginasnapshots vereisen een nieuwere RUM SDK. De sessie-replay die hier is opgenomen, is afkomstig van een oudere SDK, dus er is geen schermafbeelding om op te tekenen.",
|
||||
"loadFailed": "Kan de klikgegevens niet laden.",
|
||||
"snapshotFailed": "Kan de paginamomentopname niet laden.",
|
||||
"noPosition": "Geen klikken in deze periode voor deze pagina.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "Elke {seconds} s controleren · gestart {elapsed} geleden",
|
||||
"metaSince": "Elke {seconds} s controleren · gestart {elapsed} geleden · telt alleen records na {time}",
|
||||
"hintWaiting": "Dit wordt vanzelf groen zodra het eerste record binnenkomt. Als er binnen 2 minuten niets aankomt, laat het zien wat er misging; Probleemoplossing controleert nu.",
|
||||
"hintWaitingAfter": "Dit wordt vanzelf groen wanneer het eerste record binnenkomt. Als er niets aankomt binnen {elapsed}, laat het zien wat er misging; Probleemoplossing controleert nu.",
|
||||
"hintWaitingLate": "Dit wordt vanzelf groen zodra het eerste record binnenkomt. Controles stoppen na 60 minuten; als gegevens later binnenkomen, meldt Home dit bij je volgende bezoek.",
|
||||
"hintStillChecking": "Er wordt nog elke {seconds} s gecontroleerd. Dit wordt vanzelf groen zodra gegevens aankomen.",
|
||||
"troubleshoot": "Probleemoplossing",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "Overeenkomende streams ontvangen al gegevens. Controles starten zodra je de configuratie kopieert.",
|
||||
"idleNew": "Checks starten wanneer je het commando kopieert.",
|
||||
"idleNewConfig": "Checks starten wanneer je de configuratie kopieert.",
|
||||
"idleInPrompt": "{stream} ontvangt al gegevens. De controles starten wanneer je de prompt kopieert.",
|
||||
"idleMatchesPrompt": "Overeenkomende streams ontvangen al gegevens. De controles starten wanneer je de prompt kopieert.",
|
||||
"idleNewPrompt": "De controles starten wanneer je de prompt kopieert.",
|
||||
"checkNow": "Nu controleren",
|
||||
"receivedPill": "Eerste event ontvangen",
|
||||
"receivedNewPill": "Nieuwe gegevens ontvangen",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "Het token dat je verzender gebruikt komt niet overeen met het huidige token van deze org. Kopieer het commando opnieuw en voer het opnieuw uit.",
|
||||
"fixInvalidCredentialsConfig": "Het wachtwoord in je {tool}-configuratie komt niet overeen met org-token {token}. Kopieer de configuratie opnieuw en herstart {tool}.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "Het wachtwoord in je {tool}-configuratie komt niet overeen met het huidige token van deze org. Kopieer de configuratie opnieuw en herstart {tool}.",
|
||||
"fixInvalidCredentialsPrompt": "Het token in je .env komt niet overeen met org-token {token}. Download de .env opnieuw en vraag je codingagent om het verzoek opnieuw uit te voeren.",
|
||||
"fixInvalidCredentialsPromptUnnamed": "Het token in je .env komt niet overeen met het huidige token van deze org. Download de .env opnieuw en vraag je codingagent om het verzoek opnieuw uit te voeren.",
|
||||
"fixMalformedBody": "De body van het verzoek heeft niet het formaat dat dit endpoint accepteert. Controleer het payloadformaat en verzend opnieuw.",
|
||||
"fixBatchTooLarge": "De batch is groter dan dit endpoint accepteert. Verlaag de batchgrootte en verzend opnieuw.",
|
||||
"fixRateOrQuota": "Verzoeken overschrijden de snelheids- of quotumlimiet. Wacht een minuut tot ze doorgaan, of controleer het plan.",
|
||||
"copyCommand": "Commando kopiëren",
|
||||
"copyConfig": "Configuratie kopiëren",
|
||||
"copyPrompt": "Prompt kopiëren",
|
||||
"rightPlace": "Verstuur je naar de juiste plek? {org} bevindt zich in {region}: {endpoint}",
|
||||
"noRequestsPill": "Er is nog niets aangekomen",
|
||||
"noRequestsSummary": "Er is niets aangekomen in {org} in {region} {window}, en er is geen enkel verzoek geweigerd.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": ".env downloaden",
|
||||
"promptTitle": "Plak dit in {client1}, {client2} of {client3}",
|
||||
"promptLabel": "Prompt",
|
||||
"promptCopied": "Prompt gekopieerd"
|
||||
"promptCopied": "Prompt gekopieerd",
|
||||
"health": {
|
||||
"title": "Gezondheid van AI-gegevens",
|
||||
"scopeAgent": "Spans van agent {agent} in {stream} sinds de controle begon",
|
||||
"scopeStream": "Spans in {stream} sinds de controle begon",
|
||||
"checking": "Gezondheid van AI-gegevens controleren…",
|
||||
"checkAgain": "Opnieuw controleren",
|
||||
"checkAgainHint": "Nadat je codingagent de code heeft gewijzigd en nog een verzoek heeft uitgevoerd, kun je opnieuw controleren.",
|
||||
"unsupported": "Deze versie van OpenObserve controleert de gezondheid van AI-gegevens niet. Je eerste span is aangekomen, dus tracing werkt.",
|
||||
"error": "Gezondheidscontroles van AI-gegevens konden niet worden uitgevoerd. Je eerste span is aangekomen, dus tracing werkt.",
|
||||
"noGenAiSpans": "Er zijn spans aangekomen, maar geen ervan is een LLM-aanroep, dus de LLM-client is niet geïnstrumenteerd. Vraag je codingagent om de LLM-client te instrumenteren, een verzoek uit te voeren en daarna opnieuw te controleren."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "Gegevensbronnen",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "Een sjabloon bekijken",
|
||||
"helpPreviewSelectPlaceholder": "Selecteer een sjabloon om een voorbeeld te bekijken",
|
||||
"helpApplyToAlert": "Op alarm toepassen",
|
||||
"helpApplyToObject": "Dit sjabloon gebruiken",
|
||||
"helpTemplateExplainObject": "Een sjabloon is het bericht dat wordt verzonden: de tekst plus variabelen. Als je er hier een kiest, vervangt dat het eigen sjabloon van elke bestemming, alleen voor deze configuratie.",
|
||||
"helpTemplateWhenDescObject": "Laat dit leeg en elke bestemming gebruikt zijn eigen sjabloon als dat van toepassing is op dit soort, en anders het ingebouwde bericht. Stel een override in om één bericht te sturen naar elke bestemming waarop die van toepassing is.",
|
||||
"helpCurrentHeadingObject": "Wat dit nu verzendt",
|
||||
"helpCurrentOverrideSome": "Passende bestemmingen gebruiken dit sjabloon:",
|
||||
"helpCurrentResolved": "Geen override ingesteld. Elke bestemming gebruikt:",
|
||||
"helpVariablesExplain": "Variabelen zijn uw eigen waarden die u in een meldingsbericht kunt plaatsen. Geef ze hier allemaal een naam en een waarde en schrijf vervolgens {'{'}your_name{'}'} op een willekeurige plek in de sjabloon — deze wordt ingevuld wanneer het alarm afgaat.",
|
||||
"helpBuiltInHeading": "Bekijk de ingebouwde variabelen",
|
||||
"helpBuiltInIntro": "{product} vult deze automatisch in — klik op een om het te kopiëren.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "Tijd",
|
||||
"event": "Gebeurtenis",
|
||||
"destinations": "Bestemmingen",
|
||||
"template": "Sjabloon",
|
||||
"result": "Resultaat",
|
||||
"ok": "Verzonden",
|
||||
"pending": "Bezig met verzenden",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "gaat al {duration} af",
|
||||
"incident": "Incident"
|
||||
},
|
||||
"priorityUnsetPagesAs": "Niet ingesteld (meldt als P2)"
|
||||
"priorityUnsetPagesAs": "Niet ingesteld (meldt als P2)",
|
||||
"notificationKinds": {
|
||||
"alert": "Alarm",
|
||||
"incident": "Incident",
|
||||
"anomaly": "Anomalie",
|
||||
"synthetics": "Synthetics",
|
||||
"downtime": "Onderhoudsperiode",
|
||||
"on_call": "Piket"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "Sjabloon-override",
|
||||
"placeholder": "Gebruik het sjabloon van de bestemming",
|
||||
"help": "Overschrijft het sjabloon van de bestemming voor {kind}-berichten. Vooraf gebouwde sjablonen kunnen niet worden gekozen; kopieer er eerst een.",
|
||||
"empty": "Er zijn nog geen sjablonen van toepassing op {kind}.",
|
||||
"create": "Sjabloon maken",
|
||||
"loadFailed": "Kan sjablonen niet laden",
|
||||
"forbidden": "Voor het weergeven van sjablonen is de leesmachtiging voor sjablonen nodig",
|
||||
"mismatch": "Past niet bij {count} van je bestemmingen ({names}); die vallen terug op hun eigen sjabloon.",
|
||||
"groupContent": "Inhoud",
|
||||
"groupCustom": "Aangepast",
|
||||
"webhookOnly": "(alleen webhook)",
|
||||
"emailOnly": "(alleen e-mail)",
|
||||
"snsOnly": "(alleen SNS)",
|
||||
"stale": "Sjabloon {name} bestaat niet meer. Kies een ander of maak het veld leeg.",
|
||||
"willUse": "Zal gebruiken: {template}",
|
||||
"willUsePerDestination": "Zal gebruiken, per bestemming:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "Ingebouwd bericht voor {kind}",
|
||||
"sourceExplicit": "deze overschrijving",
|
||||
"sourceDestination": "bestemmingssjabloon",
|
||||
"sourceOrgDefault": "organisatiestandaard",
|
||||
"sourceCompiled": "ingebouwd",
|
||||
"sourcePlatformResolve": "platformresolutie",
|
||||
"sourceLegacy": "verouderde payload",
|
||||
"sourceLegacyPayload": "de eigen JSON-payload van het berichttype (generieke webhook)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "Openen",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "De echte e-mail is HTML met een platte-tekst alternatief. Zie Payload voor beide.",
|
||||
"previewFidelityWebhook": "Webhook-ontvangers krijgen JSON, geen kaart. Zie Payload voor de exacte inhoud.",
|
||||
"previewFidelityMachine": "Dit kanaal wordt gebruikt door software, niet gelezen door mensen — de kaart is een genormaliseerde weergave. Payload toont de exacte inhoud die wordt verzonden.",
|
||||
"playgroundLabel": "Playground",
|
||||
"playgroundHelp": "Er wordt hier niets verzonden.",
|
||||
"previewChannel": "Kanaal",
|
||||
"previewSeverity": "Ernst",
|
||||
"previewSeveritySingle": "Enkel niveau (geen niveau)",
|
||||
"previewEmptyTitle": "Voorbeeld verschijnt hier",
|
||||
"unknownVariables": "Onbekende variabelen",
|
||||
"emptyVariables": "Leeg voor {kind}: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (Adaptive Card)",
|
||||
"channelTeamsMessageCard": "Teams (MessageCard)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "Hiermee wordt een echt bericht naar het geselecteerde kanaal verzonden, gemarkeerd met [TEST].",
|
||||
"testSendSuccess": "Testbericht verzonden",
|
||||
"testSendRateLimited": "Te veel testverzendingen — wacht even en probeer het opnieuw",
|
||||
"testSendNoDestination": "Selecteer eerst een bestemming"
|
||||
"testSendNoDestination": "Selecteer eerst een bestemming",
|
||||
"appliesTo": "Van toepassing op",
|
||||
"appliesToAll": "Alle typen",
|
||||
"appliesToAny": "Elk type",
|
||||
"allKindsNotice": "Sjablonen die op elk type van toepassing zijn: {count}. De betreffende bestemmingen gebruiken ze ook voor berichten over anomalieën, synthetics, piket, onderhoudsperiodes en incidenten. Controleer ze.",
|
||||
"allKindsNoticeReview": "Controleren",
|
||||
"appliesToInferred": "Afgeleid van de variabelen in de body",
|
||||
"appliesToManual": "Door jou gekozen",
|
||||
"appliesToReset": "Terugzetten naar afgeleid",
|
||||
"previewKind": "Type",
|
||||
"previewForbidden": "Je hebt geen machtiging om een voorbeeld van sjablonen te bekijken",
|
||||
"previewFailed": "Voorbeeld mislukt: {message}",
|
||||
"severityFailed": "Mislukt",
|
||||
"severityDegraded": "Gedegradeerd",
|
||||
"severityFlaky": "Instabiel",
|
||||
"severityRecovered": "Hersteld",
|
||||
"variableGroupCommon": "Algemeen"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "Externe alarmbronnen",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "Koptekst",
|
||||
"api_header_value": "Waarde",
|
||||
"skip_tls_verify": "TLS-verificatie overslaan",
|
||||
"payloadFormat": "Payloadformaat",
|
||||
"payloadFormatAuto": "Automatisch",
|
||||
"payloadFormatLegacy": "Verouderde JSON",
|
||||
"payloadFormatRendered": "Gerenderd sjabloon",
|
||||
"payloadFormatHelp": "Automatisch verzendt de oude JSON-body voor berichten over anomalieën, synthetics en piket totdat een sjabloon is gekoppeld. Opgeslagen als de metagegevenssleutel payload_format.",
|
||||
"output_format": "Uitvoerformaat",
|
||||
"readonly": "Alleen lezen",
|
||||
"additional_settings": "Aanvullende instellingen",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "Er is nog niets verzonden.",
|
||||
"deliveriesRun": "Ladderuitvoering {run} — een overdracht herstartte de beklimming bij het ontvangende team.",
|
||||
"deliveryLanded": "Verzonden",
|
||||
"deliveryTemplate": "Sjabloon: {templates}",
|
||||
"deliveryFailed": "Mislukt",
|
||||
"deliveriesTruncated": "Toont {shown} van de {total} verzendingen.",
|
||||
"teamChannelTitle": "Teamkanaal",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "Een testmelding voor {priority} naar {names} versturen? Deze escaleert niet.",
|
||||
"testPageSentOf": "{sent} van {total} bericht verstuurd | {sent} van {total} berichten verstuurd",
|
||||
"ladderSendTest": "Test versturen",
|
||||
"scopeNotSeenYet": "Nog niet gezien in je gegevens"
|
||||
"scopeNotSeenYet": "Nog niet gezien in je gegevens",
|
||||
"policyMailBanner": "E-mail- en SNS-bestemmingen ontvangen oproepen van deze versie: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "Betaald AI-gebruik inschakelen?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "Widok",
|
||||
"frustration": "Frustracja",
|
||||
"failedRequest": "Nieudane żądania",
|
||||
"noResponse": "Brak odpowiedzi"
|
||||
"noResponse": "Brak odpowiedzi",
|
||||
"noResponseStatus": "0 — Brak odpowiedzi",
|
||||
"failedRequestDetails": "Szczegóły nieudanego żądania",
|
||||
"browserStatus": "Status przeglądarki",
|
||||
"serverStatus": "Status serwera",
|
||||
"noServerSpanFound": "Nie znaleziono spanu serwera",
|
||||
"noServerSpanHint": "Brakujący span może też oznaczać próbkowanie, opóźnienie pozyskiwania danych, nieinstrumentowaną trasę lub retencję.",
|
||||
"unknownNoTrace": "Nieznane (brak trace)",
|
||||
"unknown": "Nieznane",
|
||||
"abortedByApp": "przerwane przez aplikację",
|
||||
"method": "Metoda",
|
||||
"url": "URL",
|
||||
"duration": "Czas trwania",
|
||||
"timing": "Czasy",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "Połączenie",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "Pierwszy bajt",
|
||||
"timingDownload": "Pobieranie",
|
||||
"size": "Rozmiar",
|
||||
"initiatedBy": "Zainicjowane przez"
|
||||
},
|
||||
"replayCanvasNotRecorded": "Zawartość canvas nie została nagrana",
|
||||
"actionOnTarget": "{action} na \"{target}\"",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "Strona",
|
||||
"noDeviceData": "Nie zarejestrowano kliknięć na tym typie urządzenia dla tej strony.",
|
||||
"noReplay": "Dla tej strony nie zarejestrowano żadnego odtwarzania sesji, więc nie ma zrzutu ekranu do naniesienia danych. Włącz odtwarzanie sesji dla aplikacji.",
|
||||
"noReplayLegacySdk": "Migawki stron wymagają nowszego RUM SDK. Zarejestrowane tutaj odtwarzanie sesji pochodzi ze starszego SDK, więc nie ma zrzutu ekranu, na którym można rysować.",
|
||||
"loadFailed": "Nie udało się wczytać danych o kliknięciach.",
|
||||
"snapshotFailed": "Nie udało się wczytać zrzutu strony.",
|
||||
"noPosition": "Brak kliknięć w tym okresie dla tej strony.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "Sprawdzanie co {seconds} s · rozpoczęto {elapsed} temu",
|
||||
"metaSince": "Sprawdzanie co {seconds} s · rozpoczęto {elapsed} temu · zliczane są tylko rekordy po {time}",
|
||||
"hintWaiting": "Zmieni się na zielono automatycznie, gdy dotrze pierwszy rekord. Jeśli nic nie dotrze w ciągu 2 minut, pokaże, co poszło nie tak; Rozwiązywanie problemów sprawdzi teraz.",
|
||||
"hintWaitingAfter": "To zmieni kolor na zielony samoczynnie, gdy dotrze pierwszy rekord. Jeśli nic nie dotrze w ciągu {elapsed}, wskaże, co poszło nie tak; opcja Rozwiązywanie problemów sprawdzi teraz.",
|
||||
"hintWaitingLate": "Zmieni się na zielono automatycznie, gdy dotrze pierwszy rekord. Sprawdzanie zatrzymuje się po 60 minutach; jeśli dane dotrą później, Strona główna poinformuje Cię przy następnej wizycie.",
|
||||
"hintStillChecking": "Nadal sprawdzanie co {seconds} s. Zmieni się na zielono automatycznie, gdy dotrą dane.",
|
||||
"troubleshoot": "Rozwiązywanie problemów",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "Pasujące strumienie już odbierają dane. Sprawdzanie rozpocznie się po skopiowaniu konfiguracji.",
|
||||
"idleNew": "Sprawdzanie rozpocznie się po skopiowaniu polecenia.",
|
||||
"idleNewConfig": "Sprawdzanie rozpocznie się po skopiowaniu konfiguracji.",
|
||||
"idleInPrompt": "{stream} już odbiera dane. Sprawdzanie rozpocznie się po skopiowaniu promptu.",
|
||||
"idleMatchesPrompt": "Pasujące strumienie już odbierają dane. Sprawdzanie rozpocznie się po skopiowaniu promptu.",
|
||||
"idleNewPrompt": "Sprawdzanie rozpocznie się po skopiowaniu promptu.",
|
||||
"checkNow": "Sprawdź teraz",
|
||||
"receivedPill": "Odebrano pierwsze zdarzenie",
|
||||
"receivedNewPill": "Odebrano nowe dane",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "Token używany przez nadawcę nie pasuje do bieżącego tokena tej organizacji. Skopiuj polecenie ponownie i uruchom je jeszcze raz.",
|
||||
"fixInvalidCredentialsConfig": "Hasło w konfiguracji {tool} nie pasuje do tokena organizacji {token}. Skopiuj konfigurację ponownie i uruchom ponownie {tool}.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "Hasło w konfiguracji {tool} nie pasuje do bieżącego tokena tej organizacji. Skopiuj konfigurację ponownie i uruchom ponownie {tool}.",
|
||||
"fixInvalidCredentialsPrompt": "Token w Twoim pliku .env nie pasuje do tokenu organizacji {token}. Pobierz plik .env ponownie i poproś swojego agenta programistycznego o ponowne wykonanie żądania.",
|
||||
"fixInvalidCredentialsPromptUnnamed": "Token w Twoim pliku .env nie pasuje do bieżącego tokenu tej organizacji. Pobierz plik .env ponownie i poproś swojego agenta programistycznego o ponowne wykonanie żądania.",
|
||||
"fixMalformedBody": "Treść żądania nie ma formatu akceptowanego przez ten punkt końcowy. Sprawdź format ładunku i wyślij ponownie.",
|
||||
"fixBatchTooLarge": "Partia jest większa, niż akceptuje ten punkt końcowy. Zmniejsz rozmiar partii i wyślij ponownie.",
|
||||
"fixRateOrQuota": "Żądania przekraczają limit szybkości lub przydziału. Poczekaj minutę, aż przejdą, lub sprawdź plan.",
|
||||
"copyCommand": "Kopiuj polecenie",
|
||||
"copyConfig": "Kopiuj konfigurację",
|
||||
"copyPrompt": "Kopiuj prompt",
|
||||
"rightPlace": "Wysyłasz we właściwe miejsce? {org} znajduje się w {region}: {endpoint}",
|
||||
"noRequestsPill": "Jeszcze nic nie dotarło",
|
||||
"noRequestsSummary": "Nic nie dotarło do {org} w {region} {window} i żadne żądanie nie zostało odrzucone.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": "Pobierz .env",
|
||||
"promptTitle": "Wklej to do {client1}, {client2} lub {client3}",
|
||||
"promptLabel": "Prompt",
|
||||
"promptCopied": "Prompt skopiowany"
|
||||
"promptCopied": "Prompt skopiowany",
|
||||
"health": {
|
||||
"title": "Kondycja danych AI",
|
||||
"scopeAgent": "Spany od agenta {agent} w strumieniu {stream} od rozpoczęcia sprawdzania",
|
||||
"scopeStream": "Spany w strumieniu {stream} od rozpoczęcia sprawdzania",
|
||||
"checking": "Sprawdzanie kondycji danych AI…",
|
||||
"checkAgain": "Sprawdź ponownie",
|
||||
"checkAgainHint": "Gdy Twój agent programistyczny zmieni kod i wykona kolejne żądanie, sprawdź ponownie.",
|
||||
"unsupported": "Ta wersja OpenObserve nie sprawdza kondycji danych AI. Pierwszy span dotarł, więc śledzenie działa.",
|
||||
"error": "Nie udało się uruchomić sprawdzania kondycji danych AI. Pierwszy span dotarł, więc śledzenie działa.",
|
||||
"noGenAiSpans": "Spany dotarły, ale żaden z nich nie jest wywołaniem LLM, więc klient LLM nie jest instrumentowany. Poproś swojego agenta programistycznego o instrumentację klienta LLM, wykonanie żądania i ponowne sprawdzenie."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "Źródła danych",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "Podgląd szablonu",
|
||||
"helpPreviewSelectPlaceholder": "Wybierz szablon do podglądu",
|
||||
"helpApplyToAlert": "Zastosuj do alertu",
|
||||
"helpApplyToObject": "Użyj tego szablonu",
|
||||
"helpTemplateExplainObject": "Szablon to wysyłana wiadomość: tekst wraz ze zmiennymi. Wybranie go tutaj zastępuje własny szablon każdego miejsca docelowego, tylko w tej konfiguracji.",
|
||||
"helpTemplateWhenDescObject": "Pozostaw to pole puste, a każde miejsce docelowe użyje własnego szablonu, jeśli ma on zastosowanie do tego rodzaju, w przeciwnym razie wbudowanej wiadomości. Ustaw nadpisanie, aby wysłać jedną wiadomość do każdego pasującego miejsca docelowego.",
|
||||
"helpCurrentHeadingObject": "Co jest teraz wysyłane",
|
||||
"helpCurrentOverrideSome": "Pasujące miejsca docelowe używają tego szablonu:",
|
||||
"helpCurrentResolved": "Nie ustawiono nadpisania. Każde miejsce docelowe używa:",
|
||||
"helpVariablesExplain": "Zmienne to Twoje własne wartości, które możesz wstawić do treści powiadomienia. Nadaj każdej z nich nazwę i wartość, a następnie wpisz {'{'}your_name{'}'} w dowolnym miejscu szablonu — zostanie ona wypełniona, gdy alert się wyzwoli.",
|
||||
"helpBuiltInHeading": "Przeglądaj wbudowane zmienne",
|
||||
"helpBuiltInIntro": "{product} wypełnia je automatycznie — kliknij jeden z nich, aby skopiować.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "Czas",
|
||||
"event": "Zdarzenie",
|
||||
"destinations": "Miejsca docelowe",
|
||||
"template": "Szablon",
|
||||
"result": "Wynik",
|
||||
"ok": "Wysłano",
|
||||
"pending": "Wysyłanie",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "wyzwolony od {duration}",
|
||||
"incident": "Incydent"
|
||||
},
|
||||
"priorityUnsetPagesAs": "Nie ustawiono (powiadamia jako P2)"
|
||||
"priorityUnsetPagesAs": "Nie ustawiono (powiadamia jako P2)",
|
||||
"notificationKinds": {
|
||||
"alert": "Alert",
|
||||
"incident": "Incydent",
|
||||
"anomaly": "Anomalia",
|
||||
"synthetics": "Syntetyki",
|
||||
"downtime": "Okno serwisowe",
|
||||
"on_call": "Dyżury"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "Nadpisanie szablonu",
|
||||
"placeholder": "Użyj szablonu miejsca docelowego",
|
||||
"help": "Nadpisuje szablon miejsca docelowego dla wiadomości typu {kind}. Nie można wybierać gotowych szablonów; najpierw skopiuj jeden.",
|
||||
"empty": "Żadne szablony nie mają jeszcze zastosowania do typu {kind}.",
|
||||
"create": "Utwórz szablon",
|
||||
"loadFailed": "Nie udało się wczytać szablonów",
|
||||
"forbidden": "Wyświetlanie listy szablonów wymaga uprawnienia do odczytu szablonów",
|
||||
"mismatch": "Nie pasuje do {count} z Twoich miejsc docelowych ({names}); te miejsca użyją własnego szablonu.",
|
||||
"groupContent": "Treść",
|
||||
"groupCustom": "Niestandardowe",
|
||||
"webhookOnly": "(tylko webhook)",
|
||||
"emailOnly": "(tylko e-mail)",
|
||||
"snsOnly": "(tylko SNS)",
|
||||
"stale": "Szablon {name} już nie istnieje. Wybierz inny lub wyczyść pole.",
|
||||
"willUse": "Zostanie użyty: {template}",
|
||||
"willUsePerDestination": "Zostanie użyty dla poszczególnych miejsc docelowych:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "Wbudowana wiadomość typu {kind}",
|
||||
"sourceExplicit": "to nadpisanie",
|
||||
"sourceDestination": "szablon miejsca docelowego",
|
||||
"sourceOrgDefault": "domyślny w organizacji",
|
||||
"sourceCompiled": "wbudowany",
|
||||
"sourcePlatformResolve": "rozstrzygane przez platformę",
|
||||
"sourceLegacy": "starszy ładunek",
|
||||
"sourceLegacyPayload": "własny ładunek JSON danego typu (ogólny webhook)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "Otwórz",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "Prawdziwy e-mail ma format HTML z wersją zwykłego tekstu. Zobacz Payload dla obu.",
|
||||
"previewFidelityWebhook": "Odbiorcy webhook otrzymują JSON, a nie kartę. Zobacz Payload, aby uzyskać dokładną treść.",
|
||||
"previewFidelityMachine": "Ten kanał jest używany przez oprogramowanie, a nie czytany przez ludzi — karta jest znormalizowanym odwzorowaniem. Payload pokazuje dokładną treść, która jest wysyłana.",
|
||||
"playgroundLabel": "Obszar testowy",
|
||||
"playgroundHelp": "Nic tutaj nie jest wysyłane.",
|
||||
"previewChannel": "Kanał",
|
||||
"previewSeverity": "Ważność",
|
||||
"previewSeveritySingle": "Pojedynczy poziom (bez poziomu)",
|
||||
"previewEmptyTitle": "Podgląd pojawi się tutaj",
|
||||
"unknownVariables": "Nieznane zmienne",
|
||||
"emptyVariables": "Brak wartości dla typu {kind}: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (Adaptive Card)",
|
||||
"channelTeamsMessageCard": "Teams (MessageCard)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "To wyśle prawdziwą wiadomość do wybranego kanału, oznaczoną jako [TEST].",
|
||||
"testSendSuccess": "Wiadomość testowa wysłana",
|
||||
"testSendRateLimited": "Zbyt wiele wysłanych testów — poczekaj chwilę i spróbuj ponownie",
|
||||
"testSendNoDestination": "Najpierw wybierz miejsce docelowe"
|
||||
"testSendNoDestination": "Najpierw wybierz miejsce docelowe",
|
||||
"appliesTo": "Dotyczy",
|
||||
"appliesToAll": "Wszystkie typy",
|
||||
"appliesToAny": "Dowolny typ",
|
||||
"allKindsNotice": "Szablony stosowane do każdego typu: {count}. Miejsca docelowe tych szablonów używają ich również do wiadomości o anomaliach, syntetykach, dyżurach, oknach serwisowych i incydentach. Przejrzyj je.",
|
||||
"allKindsNoticeReview": "Przejrzyj",
|
||||
"appliesToInferred": "Wywnioskowane na podstawie zmiennych w treści",
|
||||
"appliesToManual": "Wybrane przez Ciebie",
|
||||
"appliesToReset": "Przywróć wywnioskowane",
|
||||
"previewKind": "Typ",
|
||||
"previewForbidden": "Nie masz uprawnień do podglądu szablonów",
|
||||
"previewFailed": "Podgląd nie powiódł się: {message}",
|
||||
"severityFailed": "Niepowodzenie",
|
||||
"severityDegraded": "Pogorszenie",
|
||||
"severityFlaky": "Niestabilny",
|
||||
"severityRecovered": "Przywrócono",
|
||||
"variableGroupCommon": "Wspólne"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "Zewnętrzne źródła alertów",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "Nagłówek",
|
||||
"api_header_value": "Wartość",
|
||||
"skip_tls_verify": "Pomiń weryfikację TLS",
|
||||
"payloadFormat": "Format ładunku",
|
||||
"payloadFormatAuto": "Automatyczny",
|
||||
"payloadFormatLegacy": "Starszy JSON",
|
||||
"payloadFormatRendered": "Wyrenderowany szablon",
|
||||
"payloadFormatHelp": "W trybie automatycznym wysyłany jest stary ładunek JSON dla wiadomości o anomaliach, syntetykach i dyżurach, dopóki nie zostanie dołączony szablon. Zapisywane jako klucz metadanych payload_format.",
|
||||
"output_format": "Format wyjściowy",
|
||||
"readonly": "Tylko do odczytu",
|
||||
"additional_settings": "Dodatkowe ustawienia",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "Nic jeszcze nie zostało wysłane.",
|
||||
"deliveriesRun": "Przebieg drabinki {run} — przekazanie wznowiło wspinaczkę po stronie przejmującego zespołu",
|
||||
"deliveryLanded": "Wysłano",
|
||||
"deliveryTemplate": "Szablon: {templates}",
|
||||
"deliveryFailed": "Nieudane",
|
||||
"deliveriesTruncated": "Wyświetlono {shown} z {total} wysyłek.",
|
||||
"teamChannelTitle": "Kanał zespołu",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "Wysłać powiadomienie testowe {priority} do {names}? Nie eskaluje.",
|
||||
"testPageSentOf": "Wysłano {sent} z {total} wiadomości | Wysłano {sent} z {total} wiadomości",
|
||||
"ladderSendTest": "Wyślij test",
|
||||
"scopeNotSeenYet": "Jeszcze niewidoczny w Twoich danych"
|
||||
"scopeNotSeenYet": "Jeszcze niewidoczny w Twoich danych",
|
||||
"policyMailBanner": "Miejsca docelowe e-mail i SNS otrzymują wezwania z tej wersji: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "Włączyć płatne korzystanie z AI?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "Visualização",
|
||||
"frustration": "Frustração",
|
||||
"failedRequest": "Pedidos com falha",
|
||||
"noResponse": "Sem resposta"
|
||||
"noResponse": "Sem resposta",
|
||||
"noResponseStatus": "0 — Sem resposta",
|
||||
"failedRequestDetails": "Detalhes do pedido com falha",
|
||||
"browserStatus": "Estado do navegador",
|
||||
"serverStatus": "Estado do servidor",
|
||||
"noServerSpanFound": "Nenhum span de servidor encontrado",
|
||||
"noServerSpanHint": "Um span ausente também pode significar amostragem, atraso de ingestão, uma rota sem instrumentação ou retenção.",
|
||||
"unknownNoTrace": "Desconhecido (sem trace)",
|
||||
"unknown": "Desconhecido",
|
||||
"abortedByApp": "abortado pela aplicação",
|
||||
"method": "Método",
|
||||
"url": "URL",
|
||||
"duration": "Duração",
|
||||
"timing": "Tempos",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "Ligação",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "Primeiro byte",
|
||||
"timingDownload": "Transferência",
|
||||
"size": "Tamanho",
|
||||
"initiatedBy": "Iniciado por"
|
||||
},
|
||||
"replayCanvasNotRecorded": "Conteúdo do canvas não gravado",
|
||||
"actionOnTarget": "{action} em \"{target}\"",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "Página",
|
||||
"noDeviceData": "Não foram registados cliques neste tipo de dispositivo nesta página.",
|
||||
"noReplay": "Não existe nenhuma reprodução de sessão gravada para esta página, pelo que não há captura de ecrã onde desenhar. Ative a reprodução de sessões para a aplicação.",
|
||||
"noReplayLegacySdk": "Os instantâneos de página requerem um SDK RUM mais recente. A reprodução de sessão gravada aqui provém de um SDK mais antigo, pelo que não há captura de ecrã para mostrar.",
|
||||
"loadFailed": "Não foi possível carregar os dados de cliques.",
|
||||
"snapshotFailed": "Não foi possível carregar o instantâneo da página.",
|
||||
"noPosition": "Sem cliques neste período para esta página.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "A verificar a cada {seconds} s · iniciado há {elapsed}",
|
||||
"metaSince": "A verificar a cada {seconds} s · iniciado há {elapsed} · conta apenas registos após {time}",
|
||||
"hintWaiting": "Isto fica verde automaticamente quando o primeiro registo chegar. Se nada chegar em 2 minutos, mostra o que correu mal; Diagnosticar verifica agora.",
|
||||
"hintWaitingAfter": "Isto fica verde automaticamente quando chega o primeiro registo. Se nada chegar em {elapsed}, mostra o que correu mal; Resolver problemas verifica agora.",
|
||||
"hintWaitingLate": "Isto fica verde automaticamente quando o primeiro registo chegar. As verificações param após 60 minutos; se os dados chegarem depois, o Início avisa-o na próxima visita.",
|
||||
"hintStillChecking": "Ainda a verificar a cada {seconds} s. Isto fica verde automaticamente quando os dados chegarem.",
|
||||
"troubleshoot": "Diagnosticar",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "Os streams correspondentes já recebem dados. As verificações começam quando copia a configuração.",
|
||||
"idleNew": "As verificações começam quando copia o comando.",
|
||||
"idleNewConfig": "As verificações começam quando copia a configuração.",
|
||||
"idleInPrompt": "{stream} já recebe dados. As verificações começam quando copiar o prompt.",
|
||||
"idleMatchesPrompt": "Os streams correspondentes já recebem dados. As verificações começam quando copiar o prompt.",
|
||||
"idleNewPrompt": "As verificações começam quando copiar o prompt.",
|
||||
"checkNow": "Verificar agora",
|
||||
"receivedPill": "Primeiro evento recebido",
|
||||
"receivedNewPill": "Novos dados recebidos",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "O token que o seu remetente usa não corresponde ao token atual desta organização. Copie o comando novamente e execute-o de novo.",
|
||||
"fixInvalidCredentialsConfig": "A palavra-passe na sua configuração do {tool} não corresponde ao token da organização {token}. Copie a configuração novamente e reinicie o {tool}.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "A palavra-passe na sua configuração do {tool} não corresponde ao token atual desta organização. Copie a configuração novamente e reinicie o {tool}.",
|
||||
"fixInvalidCredentialsPrompt": "O token no seu .env não corresponde ao token da organização {token}. Transfira o .env novamente e peça ao seu agente de programação para voltar a executar o pedido.",
|
||||
"fixInvalidCredentialsPromptUnnamed": "O token no seu .env não corresponde ao token atual desta organização. Transfira o .env novamente e peça ao seu agente de programação para voltar a executar o pedido.",
|
||||
"fixMalformedBody": "O corpo do pedido não está num formato que este endpoint aceita. Verifique o formato do payload e envie novamente.",
|
||||
"fixBatchTooLarge": "O lote é maior do que este endpoint aceita. Reduza o tamanho do lote e envie novamente.",
|
||||
"fixRateOrQuota": "Os pedidos ultrapassaram o limite de taxa ou quota. Aguarde um minuto para que passem, ou verifique o plano.",
|
||||
"copyCommand": "Copiar comando",
|
||||
"copyConfig": "Copiar configuração",
|
||||
"copyPrompt": "Copiar prompt",
|
||||
"rightPlace": "A enviar para o lugar certo? {org} fica em {region}: {endpoint}",
|
||||
"noRequestsPill": "Ainda não chegou nada",
|
||||
"noRequestsSummary": "Nada chegou em {org} em {region} {window}, e nenhum pedido foi recusado.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": "Descarregar .env",
|
||||
"promptTitle": "Cole isto em {client1}, {client2} ou {client3}",
|
||||
"promptLabel": "Prompt",
|
||||
"promptCopied": "Prompt copiado"
|
||||
"promptCopied": "Prompt copiado",
|
||||
"health": {
|
||||
"title": "Estado dos dados de IA",
|
||||
"scopeAgent": "Spans do agente {agent} em {stream} desde o início da verificação",
|
||||
"scopeStream": "Spans em {stream} desde o início da verificação",
|
||||
"checking": "A verificar o estado dos dados de IA…",
|
||||
"checkAgain": "Verificar novamente",
|
||||
"checkAgainHint": "Depois de o seu agente de programação alterar o código e executar outro pedido, verifique novamente.",
|
||||
"unsupported": "Esta versão do OpenObserve não verifica o estado dos dados de IA. O seu primeiro span chegou, por isso o tracing funciona.",
|
||||
"error": "Não foi possível executar as verificações do estado dos dados de IA. O seu primeiro span chegou, por isso o tracing funciona.",
|
||||
"noGenAiSpans": "Chegaram spans, mas nenhum deles é uma chamada ao LLM, pelo que o cliente LLM não está instrumentado. Peça ao seu agente de programação para instrumentar o cliente LLM, executar um pedido e depois verificar novamente."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "Fontes de dados",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "Pré-visualizar um modelo",
|
||||
"helpPreviewSelectPlaceholder": "Selecione um modelo para pré-visualizar",
|
||||
"helpApplyToAlert": "Aplicar ao alerta",
|
||||
"helpApplyToObject": "Utilizar este template",
|
||||
"helpTemplateExplainObject": "Um template é a mensagem que é enviada: o texto e as variáveis. Escolher um aqui substitui o template próprio de cada destino, apenas para esta configuração.",
|
||||
"helpTemplateWhenDescObject": "Deixe isto vazio e cada destino usa o seu próprio template, se se aplicar a este tipo, e depois a mensagem predefinida. Defina uma substituição para enviar uma mensagem a todos os destinos compatíveis.",
|
||||
"helpCurrentHeadingObject": "O que isto envia agora",
|
||||
"helpCurrentOverrideSome": "Os destinos compatíveis usam este template:",
|
||||
"helpCurrentResolved": "Nenhuma substituição definida. Cada destino usa:",
|
||||
"helpVariablesExplain": "As variáveis são os seus próprios valores que pode inserir numa mensagem de notificação. Dê a cada uma um nome e um valor aqui e, em seguida, escreva {'{'}your_name{'}'} em qualquer lugar do modelo — é preenchida quando o alerta é acionado.",
|
||||
"helpBuiltInHeading": "Explorar variáveis integradas",
|
||||
"helpBuiltInIntro": "{product} preenche estes automaticamente — clique num para copiá-lo.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "Hora",
|
||||
"event": "Evento",
|
||||
"destinations": "Destinos",
|
||||
"template": "Template",
|
||||
"result": "Resultado",
|
||||
"ok": "Enviado",
|
||||
"pending": "A enviar",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "disparado há {duration}",
|
||||
"incident": "Incidente"
|
||||
},
|
||||
"priorityUnsetPagesAs": "Não definida (alerta como P2)"
|
||||
"priorityUnsetPagesAs": "Não definida (alerta como P2)",
|
||||
"notificationKinds": {
|
||||
"alert": "Alerta",
|
||||
"incident": "Incidente",
|
||||
"anomaly": "Anomalia",
|
||||
"synthetics": "Sintéticos",
|
||||
"downtime": "Janela de manutenção",
|
||||
"on_call": "Piquete"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "Substituição de template",
|
||||
"placeholder": "Utilizar o modelo do destino",
|
||||
"help": "Substitui o modelo do destino para mensagens do tipo {kind}. Os modelos predefinidos não podem ser escolhidos; copie um primeiro.",
|
||||
"empty": "Ainda não se aplicam modelos a {kind}.",
|
||||
"create": "Criar modelo",
|
||||
"loadFailed": "Não foi possível carregar os modelos",
|
||||
"forbidden": "Listar modelos requer a permissão de leitura de modelos",
|
||||
"mismatch": "Não se adequa a {count} dos seus destinos ({names}); esses recorrem ao seu próprio modelo.",
|
||||
"groupContent": "Conteúdo",
|
||||
"groupCustom": "Personalizado",
|
||||
"webhookOnly": "(apenas webhook)",
|
||||
"emailOnly": "(apenas email)",
|
||||
"snsOnly": "(apenas SNS)",
|
||||
"stale": "O modelo {name} já não existe. Escolha outro ou limpe o campo.",
|
||||
"willUse": "Vai utilizar: {template}",
|
||||
"willUsePerDestination": "Vai utilizar, por destino:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "Mensagem integrada de {kind}",
|
||||
"sourceExplicit": "esta substituição",
|
||||
"sourceDestination": "modelo do destino",
|
||||
"sourceOrgDefault": "predefinição da organização",
|
||||
"sourceCompiled": "integrado",
|
||||
"sourcePlatformResolve": "resolução da plataforma",
|
||||
"sourceLegacy": "payload legado",
|
||||
"sourceLegacyPayload": "o próprio payload JSON do tipo (webhook genérico)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "Abrir",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "O e-mail real é HTML com uma alternativa em texto simples. Consulte Payload para ambos.",
|
||||
"previewFidelityWebhook": "Os recetores de webhook recebem JSON, não um cartão. Consulte Payload para ver o corpo exato.",
|
||||
"previewFidelityMachine": "Este canal é consumido por software, não lido por pessoas — o cartão é uma renderização normalizada. O Payload mostra o corpo exato que é enviado.",
|
||||
"playgroundLabel": "Playground",
|
||||
"playgroundHelp": "Nada aqui é enviado.",
|
||||
"previewChannel": "Canal",
|
||||
"previewSeverity": "Severidade",
|
||||
"previewSeveritySingle": "Nível único (sem nível)",
|
||||
"previewEmptyTitle": "A pré-visualização aparecerá aqui",
|
||||
"unknownVariables": "Variáveis desconhecidas",
|
||||
"emptyVariables": "Vazio para {kind}: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (Adaptive Card)",
|
||||
"channelTeamsMessageCard": "Teams (MessageCard)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "Isto publicará uma mensagem real no canal selecionado, marcada como [TEST].",
|
||||
"testSendSuccess": "Mensagem de teste enviada",
|
||||
"testSendRateLimited": "Demasiados envios de teste — aguarde um momento e tente novamente.",
|
||||
"testSendNoDestination": "Selecione um destino primeiro"
|
||||
"testSendNoDestination": "Selecione um destino primeiro",
|
||||
"appliesTo": "Aplica-se a",
|
||||
"appliesToAll": "Todos os tipos",
|
||||
"appliesToAny": "Qualquer tipo",
|
||||
"allKindsNotice": "Modelos que se aplicam a todos os tipos: {count}. Os destinos desses modelos também os utilizam para mensagens de anomalia, de Sintéticos, de piquete, de janela de manutenção e de incidentes. Reveja-os.",
|
||||
"allKindsNoticeReview": "Rever",
|
||||
"appliesToInferred": "Inferido a partir das variáveis no corpo",
|
||||
"appliesToManual": "Escolhido por si",
|
||||
"appliesToReset": "Repor como inferido",
|
||||
"previewKind": "Tipo",
|
||||
"previewForbidden": "Não tem permissão para pré-visualizar modelos",
|
||||
"previewFailed": "Falha na pré-visualização: {message}",
|
||||
"severityFailed": "Falhou",
|
||||
"severityDegraded": "Degradado",
|
||||
"severityFlaky": "Instável",
|
||||
"severityRecovered": "Recuperado",
|
||||
"variableGroupCommon": "Comum"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "Fontes de alerta externas",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "Cabeçalho",
|
||||
"api_header_value": "Valor",
|
||||
"skip_tls_verify": "Ignorar a verificação de TLS",
|
||||
"payloadFormat": "Formato do payload",
|
||||
"payloadFormatAuto": "Automático",
|
||||
"payloadFormatLegacy": "JSON legado",
|
||||
"payloadFormatRendered": "Modelo renderizado",
|
||||
"payloadFormatHelp": "A opção Automático envia o corpo JSON antigo para mensagens de anomalia, sintéticos e piquete até que um modelo seja associado. Armazenado como a chave de metadados payload_format.",
|
||||
"output_format": "Formato de saída",
|
||||
"readonly": "Só de leitura",
|
||||
"additional_settings": "Definições adicionais",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "Ainda não foi enviado nada.",
|
||||
"deliveriesRun": "Execução da escada {run} — uma transferência reiniciou a subida na equipa recetora",
|
||||
"deliveryLanded": "Enviado",
|
||||
"deliveryTemplate": "Modelo: {templates}",
|
||||
"deliveryFailed": "Falhou",
|
||||
"deliveriesTruncated": "A mostrar {shown} de {total} envios.",
|
||||
"teamChannelTitle": "Canal da equipa",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "Enviar um alerta de teste {priority} para {names}? Não escala.",
|
||||
"testPageSentOf": "Enviada {sent} de {total} mensagem | Enviadas {sent} de {total} mensagens",
|
||||
"ladderSendTest": "Enviar teste",
|
||||
"scopeNotSeenYet": "Ainda não visto nos seus dados"
|
||||
"scopeNotSeenYet": "Ainda não visto nos seus dados",
|
||||
"policyMailBanner": "Os destinos de e-mail e SNS recebem acionamentos desta versão: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "Ativar o uso pago de IA?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "Представление",
|
||||
"frustration": "Фрустрация",
|
||||
"failedRequest": "Неудачные запросы",
|
||||
"noResponse": "Нет ответа"
|
||||
"noResponse": "Нет ответа",
|
||||
"noResponseStatus": "0 — Нет ответа",
|
||||
"failedRequestDetails": "Детали неудачного запроса",
|
||||
"browserStatus": "Статус браузера",
|
||||
"serverStatus": "Статус сервера",
|
||||
"noServerSpanFound": "Серверный спан не найден",
|
||||
"noServerSpanHint": "Отсутствие спана также может объясняться сэмплированием, задержкой приёма, неинструментированным маршрутом или политикой хранения.",
|
||||
"unknownNoTrace": "Неизвестно (нет трейса)",
|
||||
"unknown": "Неизвестно",
|
||||
"abortedByApp": "прервано приложением",
|
||||
"method": "Метод",
|
||||
"url": "URL",
|
||||
"duration": "Длительность",
|
||||
"timing": "Тайминги",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "Подключение",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "Первый байт",
|
||||
"timingDownload": "Загрузка",
|
||||
"size": "Размер",
|
||||
"initiatedBy": "Инициатор"
|
||||
},
|
||||
"replayCanvasNotRecorded": "Содержимое canvas не записано",
|
||||
"actionOnTarget": "{action} на \"{target}\"",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "Страница",
|
||||
"noDeviceData": "На этой странице для этого типа устройств клики не зафиксированы.",
|
||||
"noReplay": "Для этой страницы не велась запись сессии, поэтому нет снимка экрана, на который можно нанести тепловую карту. Включите запись сессий для приложения.",
|
||||
"noReplayLegacySdk": "Снимки страниц требуют более новой версии RUM SDK. Записанный здесь сеанс воспроизведения получен от более старой версии SDK, поэтому скриншота для отрисовки нет.",
|
||||
"loadFailed": "Не удалось загрузить данные о кликах.",
|
||||
"snapshotFailed": "Не удалось загрузить снимок страницы.",
|
||||
"noPosition": "За этот период на этой странице кликов нет.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "Проверка каждые {seconds} с · запущено {elapsed} назад",
|
||||
"metaSince": "Проверка каждые {seconds} с · запущено {elapsed} назад · учитываются только записи после {time}",
|
||||
"hintWaiting": "Он станет зелёным сам, когда поступит первая запись. Если в течение 2 минут ничего не придёт, он покажет, что пошло не так; «Диагностика» проверит сейчас.",
|
||||
"hintWaitingAfter": "Это само станет зелёным, когда поступит первая запись. Если за {elapsed} ничего не придёт, здесь будет показано, что пошло не так; «Диагностика» запустит проверку сейчас.",
|
||||
"hintWaitingLate": "Он станет зелёным сам, когда поступит первая запись. Проверки прекращаются через 60 минут; если данные поступят позже, Главная сообщит вам при следующем посещении.",
|
||||
"hintStillChecking": "Продолжаем проверять каждые {seconds} с. Он станет зелёным сам, когда появятся данные.",
|
||||
"troubleshoot": "Диагностика",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "Совпадающие потоки уже получают данные. Проверка начнётся, когда вы скопируете конфигурацию.",
|
||||
"idleNew": "Проверки начнутся, когда вы скопируете команду.",
|
||||
"idleNewConfig": "Проверки начнутся, когда вы скопируете конфигурацию.",
|
||||
"idleInPrompt": "{stream} уже получает данные. Проверки начнутся, когда вы скопируете промпт.",
|
||||
"idleMatchesPrompt": "Подходящие потоки уже получают данные. Проверки начнутся, когда вы скопируете промпт.",
|
||||
"idleNewPrompt": "Проверки начнутся, когда вы скопируете промпт.",
|
||||
"checkNow": "Проверить сейчас",
|
||||
"receivedPill": "Первое событие получено",
|
||||
"receivedNewPill": "Получены новые данные",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "Токен, который использует ваш отправитель, не совпадает с текущим токеном этой организации. Скопируйте команду заново и запустите её ещё раз.",
|
||||
"fixInvalidCredentialsConfig": "Пароль в вашем конфиге {tool} не совпадает с токеном организации {token}. Скопируйте конфиг заново и перезапустите {tool}.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "Пароль в вашем конфиге {tool} не совпадает с текущим токеном этой организации. Скопируйте конфиг заново и перезапустите {tool}.",
|
||||
"fixInvalidCredentialsPrompt": "Токен в вашем .env не совпадает с токеном организации {token}. Скачайте .env заново и попросите своего агента для написания кода повторно выполнить запрос.",
|
||||
"fixInvalidCredentialsPromptUnnamed": "Токен в вашем .env не совпадает с текущим токеном этой организации. Скачайте .env заново и попросите своего агента для написания кода повторно выполнить запрос.",
|
||||
"fixMalformedBody": "Тело запроса не в том формате, который принимает эта конечная точка. Проверьте формат полезной нагрузки и отправьте снова.",
|
||||
"fixBatchTooLarge": "Размер пакета превышает допустимый для этой конечной точки. Уменьшите размер пакета и отправьте снова.",
|
||||
"fixRateOrQuota": "Запросы превышают лимит частоты или квоты. Подождите минуту, чтобы они прошли, или проверьте план.",
|
||||
"copyCommand": "Скопировать команду",
|
||||
"copyConfig": "Скопировать конфиг",
|
||||
"copyPrompt": "Копировать промпт",
|
||||
"rightPlace": "Отправляете по нужному адресу? {org} находится в {region}: {endpoint}",
|
||||
"noRequestsPill": "Пока ничего не поступило",
|
||||
"noRequestsSummary": "В {org} в регионе {region} {window} ничего не поступило, и ни один запрос не был отклонён.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": "Скачать .env",
|
||||
"promptTitle": "Вставьте это в {client1}, {client2} или {client3}",
|
||||
"promptLabel": "Промпт",
|
||||
"promptCopied": "Промпт скопирован"
|
||||
"promptCopied": "Промпт скопирован",
|
||||
"health": {
|
||||
"title": "Состояние данных ИИ",
|
||||
"scopeAgent": "Спаны от агента {agent} в {stream} с момента начала проверки",
|
||||
"scopeStream": "Спаны в {stream} с момента начала проверки",
|
||||
"checking": "Проверка состояния данных ИИ…",
|
||||
"checkAgain": "Проверить снова",
|
||||
"checkAgainHint": "После того как ваш агент для написания кода изменит код и выполнит ещё один запрос, проверьте снова.",
|
||||
"unsupported": "Эта версия OpenObserve не проверяет состояние данных ИИ. Ваш первый спан поступил, значит трассировка работает.",
|
||||
"error": "Не удалось запустить проверки состояния данных ИИ. Ваш первый спан поступил, значит трассировка работает.",
|
||||
"noGenAiSpans": "Спаны поступили, но ни один из них не является вызовом LLM, значит клиент LLM не инструментирован. Попросите своего агента для написания кода инструментировать клиент LLM, выполните запрос, затем проверьте снова."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "Источники данных",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "Предварительный просмотр шаблона",
|
||||
"helpPreviewSelectPlaceholder": "Выберите шаблон для предварительного просмотра",
|
||||
"helpApplyToAlert": "Применить к оповещению",
|
||||
"helpApplyToObject": "Использовать этот шаблон",
|
||||
"helpTemplateExplainObject": "Шаблон — это отправляемое сообщение: текст и переменные. Выбор шаблона здесь заменяет собственный шаблон каждого получателя, только для этой конфигурации.",
|
||||
"helpTemplateWhenDescObject": "Оставьте это поле пустым, и каждый получатель будет использовать свой шаблон, если он подходит для этого типа, а в противном случае — встроенное сообщение. Задайте переопределение, чтобы отправлять одно сообщение каждому подходящему получателю.",
|
||||
"helpCurrentHeadingObject": "Что отправляется сейчас",
|
||||
"helpCurrentOverrideSome": "Подходящие получатели используют этот шаблон:",
|
||||
"helpCurrentResolved": "Переопределение не задано. Каждый получатель использует:",
|
||||
"helpVariablesExplain": "Переменные — это ваши собственные значения, которые можно вставить в сообщение уведомления. Дайте каждой переменной имя и значение здесь, затем напишите {'{'}your_name{'}'} в любом месте шаблона — оно будет заполнено при срабатывании оповещения.",
|
||||
"helpBuiltInHeading": "Просмотр встроенных переменных",
|
||||
"helpBuiltInIntro": "{product} заполняет их автоматически — нажмите на один, чтобы скопировать.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "Время",
|
||||
"event": "Событие",
|
||||
"destinations": "Получатели",
|
||||
"template": "Шаблон",
|
||||
"result": "Результат",
|
||||
"ok": "Отправлено",
|
||||
"pending": "Отправляется",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "срабатывает уже {duration}",
|
||||
"incident": "Инцидент"
|
||||
},
|
||||
"priorityUnsetPagesAs": "Не задан (вызывает как P2)"
|
||||
"priorityUnsetPagesAs": "Не задан (вызывает как P2)",
|
||||
"notificationKinds": {
|
||||
"alert": "Оповещение",
|
||||
"incident": "Инцидент",
|
||||
"anomaly": "Аномалия",
|
||||
"synthetics": "Синтетика",
|
||||
"downtime": "Окно обслуживания",
|
||||
"on_call": "Дежурства"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "Переопределение шаблона",
|
||||
"placeholder": "Использовать шаблон получателя",
|
||||
"help": "Переопределяет шаблон получателя для сообщений типа {kind}. Предустановленные шаблоны выбрать нельзя; сначала скопируйте один.",
|
||||
"empty": "Для {kind} пока нет подходящих шаблонов.",
|
||||
"create": "Создать шаблон",
|
||||
"loadFailed": "Не удалось загрузить шаблоны",
|
||||
"forbidden": "Чтобы просмотреть список шаблонов, нужно разрешение на чтение шаблонов",
|
||||
"mismatch": "Не подходит для получателей ({count}): {names}; они будут использовать собственный шаблон.",
|
||||
"groupContent": "Содержимое",
|
||||
"groupCustom": "Пользовательские",
|
||||
"webhookOnly": "(только вебхук)",
|
||||
"emailOnly": "(только email)",
|
||||
"snsOnly": "(только SNS)",
|
||||
"stale": "Шаблон {name} больше не существует. Выберите другой или очистите поле.",
|
||||
"willUse": "Будет использован: {template}",
|
||||
"willUsePerDestination": "Будет использоваться для каждого получателя:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "Встроенное сообщение типа {kind}",
|
||||
"sourceExplicit": "это переопределение",
|
||||
"sourceDestination": "шаблон получателя",
|
||||
"sourceOrgDefault": "по умолчанию в организации",
|
||||
"sourceCompiled": "встроенный",
|
||||
"sourcePlatformResolve": "определяется платформой",
|
||||
"sourceLegacy": "устаревшая полезная нагрузка",
|
||||
"sourceLegacyPayload": "собственная JSON-полезная нагрузка этого типа (универсальный вебхук)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "Открыть",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "Настоящее письмо — это HTML с альтернативой в виде обычного текста. См. «Полезная нагрузка» для обоих вариантов.",
|
||||
"previewFidelityWebhook": "Получатели вебхука получают JSON, а не карточку. См. «Полезная нагрузка» для точного содержимого.",
|
||||
"previewFidelityMachine": "Этот канал используется программным обеспечением, а не читается людьми — карточка является нормализованным отображением. Полезная нагрузка показывает точное содержимое, которое отправляется.",
|
||||
"playgroundLabel": "Песочница",
|
||||
"playgroundHelp": "Здесь ничего не отправляется.",
|
||||
"previewChannel": "Канал",
|
||||
"previewSeverity": "Критичность",
|
||||
"previewSeveritySingle": "Один уровень (без уровня)",
|
||||
"previewEmptyTitle": "Предпросмотр появится здесь",
|
||||
"unknownVariables": "Неизвестные переменные",
|
||||
"emptyVariables": "Пусто для {kind}: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (адаптивная карточка)",
|
||||
"channelTeamsMessageCard": "Teams (MessageCard)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "Это отправит реальное сообщение в выбранный канал с пометкой [TEST].",
|
||||
"testSendSuccess": "Тестовое сообщение отправлено",
|
||||
"testSendRateLimited": "Слишком много тестовых отправок — подождите немного и попробуйте снова",
|
||||
"testSendNoDestination": "Сначала выберите получателя"
|
||||
"testSendNoDestination": "Сначала выберите получателя",
|
||||
"appliesTo": "Применяется к",
|
||||
"appliesToAll": "Все типы",
|
||||
"appliesToAny": "Любой тип",
|
||||
"allKindsNotice": "Шаблоны, применяемые ко всем типам: {count}. Получатели этих шаблонов также используют их для сообщений по аномалиям, синтетическим проверкам, дежурствам, окнам обслуживания и инцидентам. Проверьте эти шаблоны.",
|
||||
"allKindsNoticeReview": "Проверить",
|
||||
"appliesToInferred": "Определяется по переменным в теле",
|
||||
"appliesToManual": "Выбрано вами",
|
||||
"appliesToReset": "Сбросить к выведенному значению",
|
||||
"previewKind": "Тип",
|
||||
"previewForbidden": "У вас нет разрешения на предварительный просмотр шаблонов",
|
||||
"previewFailed": "Ошибка предварительного просмотра: {message}",
|
||||
"severityFailed": "Сбой",
|
||||
"severityDegraded": "Деградация",
|
||||
"severityFlaky": "Нестабильно",
|
||||
"severityRecovered": "Восстановлено",
|
||||
"variableGroupCommon": "Общие"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "Внешние источники оповещений",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "Заголовок",
|
||||
"api_header_value": "Значение",
|
||||
"skip_tls_verify": "Пропустить проверку TLS",
|
||||
"payloadFormat": "Формат полезной нагрузки",
|
||||
"payloadFormatAuto": "Автоматический",
|
||||
"payloadFormatLegacy": "Устаревший JSON",
|
||||
"payloadFormatRendered": "Отрендеренный шаблон",
|
||||
"payloadFormatHelp": "Режим «Автоматический» отправляет старое JSON-тело для сообщений по аномалиям, синтетическим проверкам и дежурствам, пока не привязан шаблон. Сохраняется в ключе метаданных payload_format.",
|
||||
"output_format": "Формат вывода",
|
||||
"readonly": "Только для чтения",
|
||||
"additional_settings": "Дополнительные настройки",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "Пока ничего не отправлено.",
|
||||
"deliveriesRun": "Прогон лестницы {run} — передача перезапустила эскалацию в принимающей команде",
|
||||
"deliveryLanded": "Отправлено",
|
||||
"deliveryTemplate": "Шаблон: {templates}",
|
||||
"deliveryFailed": "Сбой",
|
||||
"deliveriesTruncated": "Показано отправок: {shown} из {total}.",
|
||||
"teamChannelTitle": "Канал команды",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "Отправить тестовый вызов {priority} для {names}? Эскалации не будет.",
|
||||
"testPageSentOf": "Отправлено {sent} из {total} сообщения | Отправлено {sent} из {total} сообщений",
|
||||
"ladderSendTest": "Отправить тест",
|
||||
"scopeNotSeenYet": "Пока не встречался в ваших данных"
|
||||
"scopeNotSeenYet": "Пока не встречался в ваших данных",
|
||||
"policyMailBanner": "Получатели Email и SNS получают вызовы из этой версии: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "Включить платное использование ИИ?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "ดู",
|
||||
"frustration": "Frustration",
|
||||
"failedRequest": "คำขอที่ล้มเหลว",
|
||||
"noResponse": "ไม่มีการตอบสนอง"
|
||||
"noResponse": "ไม่มีการตอบสนอง",
|
||||
"noResponseStatus": "0 — ไม่มีการตอบสนอง",
|
||||
"failedRequestDetails": "รายละเอียดคำขอที่ล้มเหลว",
|
||||
"browserStatus": "สถานะเบราว์เซอร์",
|
||||
"serverStatus": "สถานะเซิร์ฟเวอร์",
|
||||
"noServerSpanFound": "ไม่พบสแปนเซิร์ฟเวอร์",
|
||||
"noServerSpanHint": "สแปนที่หายไปอาจหมายถึงการสุ่มตัวอย่าง ความล่าช้าในการนำเข้าข้อมูล เส้นทางที่ไม่ได้ติดตั้งเครื่องมือตรวจวัด หรือการเก็บรักษาข้อมูล",
|
||||
"unknownNoTrace": "ไม่ทราบ (ไม่มีเทรซ)",
|
||||
"unknown": "ไม่ทราบ",
|
||||
"abortedByApp": "ถูกยกเลิกโดยแอป",
|
||||
"method": "เมธอด",
|
||||
"url": "URL",
|
||||
"duration": "ระยะเวลา",
|
||||
"timing": "การจับเวลา",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "เชื่อมต่อ",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "ไบต์แรก",
|
||||
"timingDownload": "ดาวน์โหลด",
|
||||
"size": "ขนาด",
|
||||
"initiatedBy": "เริ่มต้นโดย"
|
||||
},
|
||||
"replayCanvasNotRecorded": "ไม่ได้บันทึกเนื้อหา Canvas",
|
||||
"actionOnTarget": "{action} on \"{target}\"",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "หน้า",
|
||||
"noDeviceData": "ไม่มีการบันทึกการคลิกบนอุปกรณ์ประเภทนี้สำหรับหน้านี้",
|
||||
"noReplay": "ไม่มีการบันทึกการเล่นซ้ำเซสชันสำหรับหน้านี้ จึงไม่มีภาพหน้าจอให้วาดทับ โปรดเปิดใช้การเล่นซ้ำเซสชันสำหรับแอป",
|
||||
"noReplayLegacySdk": "สแนปช็อตของหน้าต้องใช้ RUM SDK เวอร์ชันใหม่กว่า การเล่นเซสชันที่บันทึกไว้ที่นี่มาจาก SDK เวอร์ชันเก่า จึงไม่มีสกรีนช็อตให้แสดงผล",
|
||||
"loadFailed": "ไม่สามารถโหลดข้อมูลการคลิกได้",
|
||||
"snapshotFailed": "ไม่สามารถโหลดสแนปช็อตของหน้าได้",
|
||||
"noPosition": "ไม่มีการคลิกในช่วงเวลานี้สำหรับหน้านี้",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "Checking every {seconds} s · started {elapsed} ago",
|
||||
"metaSince": "Checking every {seconds} s · started {elapsed} ago · counts only records after {time}",
|
||||
"hintWaiting": "This turns green by itself when the first record lands. If nothing arrives in 2 minutes it shows what went wrong; Troubleshoot checks now.",
|
||||
"hintWaitingAfter": "สถานะนี้จะเปลี่ยนเป็นสีเขียวเองเมื่อมีข้อมูลแรกเข้ามา หากไม่มีข้อมูลเข้ามาภายใน {elapsed} ระบบจะแสดงว่าอะไรผิดพลาด; การแก้ไขปัญหาจะเริ่มตรวจสอบทันที",
|
||||
"hintWaitingLate": "This turns green by itself when the first record lands. Checks stop after 60 minutes; if data lands later, Home tells you on your next visit.",
|
||||
"hintStillChecking": "Still checking every {seconds} s. This turns green by itself when data arrives.",
|
||||
"troubleshoot": "Troubleshoot",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "Matching streams already receive data. Checks start when you copy the config.",
|
||||
"idleNew": "Checks start when you copy the command.",
|
||||
"idleNewConfig": "Checks start when you copy the config.",
|
||||
"idleInPrompt": "{stream} ได้รับข้อมูลอยู่แล้ว การตรวจสอบจะเริ่มเมื่อคุณคัดลอกพรอมต์",
|
||||
"idleMatchesPrompt": "สตรีมที่ตรงกันได้รับข้อมูลอยู่แล้ว การตรวจสอบจะเริ่มเมื่อคุณคัดลอกพรอมต์",
|
||||
"idleNewPrompt": "การตรวจสอบจะเริ่มเมื่อคุณคัดลอกพรอมต์",
|
||||
"checkNow": "Check now",
|
||||
"receivedPill": "First event received",
|
||||
"receivedNewPill": "New data received",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "The token your sender uses doesn't match this org's current token. Copy the command again and re-run it.",
|
||||
"fixInvalidCredentialsConfig": "The password in your {tool} config doesn't match org token {token}. Copy the config again and restart {tool}.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "The password in your {tool} config doesn't match this org's current token. Copy the config again and restart {tool}.",
|
||||
"fixInvalidCredentialsPrompt": "โทเค็นใน .env ของคุณไม่ตรงกับโทเค็นองค์กร {token} โปรดดาวน์โหลด .env อีกครั้ง และขอให้เอเจนต์เขียนโค้ดของคุณเรียกใช้คำขออีกครั้ง",
|
||||
"fixInvalidCredentialsPromptUnnamed": "โทเค็นใน .env ของคุณไม่ตรงกับโทเค็นปัจจุบันขององค์กรนี้ โปรดดาวน์โหลด .env อีกครั้ง และขอให้เอเจนต์เขียนโค้ดของคุณเรียกใช้คำขออีกครั้ง",
|
||||
"fixMalformedBody": "The request body isn't in a format this endpoint accepts. Check the payload format, then send again.",
|
||||
"fixBatchTooLarge": "The batch is larger than this endpoint accepts. Lower the batch size, then send again.",
|
||||
"fixRateOrQuota": "Requests are over the rate or quota limit. Wait a minute for them to go through, or check the plan.",
|
||||
"copyCommand": "Copy command",
|
||||
"copyConfig": "Copy config",
|
||||
"copyPrompt": "คัดลอกพรอมต์",
|
||||
"rightPlace": "Sending to the right place? {org} lives in {region}: {endpoint}",
|
||||
"noRequestsPill": "Nothing has arrived yet",
|
||||
"noRequestsSummary": "Nothing has arrived in {org} in {region} {window}, and no request was refused.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": "ดาวน์โหลด .env",
|
||||
"promptTitle": "วางข้อความนี้ใน {client1}, {client2} หรือ {client3}",
|
||||
"promptLabel": "พรอมต์",
|
||||
"promptCopied": "คัดลอกพรอมต์แล้ว"
|
||||
"promptCopied": "คัดลอกพรอมต์แล้ว",
|
||||
"health": {
|
||||
"title": "สถานะสุขภาพข้อมูล AI",
|
||||
"scopeAgent": "สแปนจากเอเจนต์ {agent} ใน {stream} ตั้งแต่เริ่มการตรวจสอบ",
|
||||
"scopeStream": "สแปนใน {stream} ตั้งแต่เริ่มการตรวจสอบ",
|
||||
"checking": "กำลังตรวจสอบสุขภาพข้อมูล AI…",
|
||||
"checkAgain": "ตรวจสอบอีกครั้ง",
|
||||
"checkAgainHint": "หลังจากเอเจนต์เขียนโค้ดของคุณแก้ไขโค้ดและเรียกใช้คำขออื่นแล้ว ให้ตรวจสอบอีกครั้ง",
|
||||
"unsupported": "OpenObserve เวอร์ชันนี้ไม่ตรวจสอบสุขภาพข้อมูล AI สแปนแรกของคุณมาถึงแล้ว ดังนั้นการเทรซจึงทำงานได้",
|
||||
"error": "ไม่สามารถดำเนินการตรวจสอบสุขภาพข้อมูล AI ได้ สแปนแรกของคุณมาถึงแล้ว ดังนั้นการเทรซจึงทำงานได้",
|
||||
"noGenAiSpans": "มีสแปนเข้ามาแล้ว แต่ไม่มีสแปนใดเป็นการเรียก LLM ดังนั้นไคลเอนต์ LLM จึงยังไม่ได้ติดตั้งเครื่องมือตรวจวัด ขอให้เอเจนต์เขียนโค้ดของคุณติดตั้งเครื่องมือตรวจวัดให้ไคลเอนต์ LLM เรียกใช้คำขอ แล้วตรวจสอบอีกครั้ง"
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "Data sources",
|
||||
@@ -12432,6 +12471,12 @@
|
||||
"helpPreviewHeading": "Preview a template",
|
||||
"helpPreviewSelectPlaceholder": "Select a template to preview",
|
||||
"helpApplyToAlert": "Apply to alert",
|
||||
"helpApplyToObject": "ใช้เทมเพลตนี้",
|
||||
"helpTemplateExplainObject": "เทมเพลตคือข้อความที่จะถูกส่ง: ข้อความพร้อมตัวแปร การเลือกเทมเพลตที่นี่จะแทนที่เทมเพลตของแต่ละปลายทาง เฉพาะกับการกำหนดค่านี้เท่านั้น",
|
||||
"helpTemplateWhenDescObject": "ปล่อยช่องนี้ว่างไว้ แล้วแต่ละปลายทางจะใช้เทมเพลตของตนเองหากใช้กับชนิดนี้ได้ จากนั้นจึงใช้ข้อความที่มีมาให้ ตั้งค่าการแทนที่เพื่อส่งข้อความเดียวไปยังทุกปลายทางที่เข้ากันได้",
|
||||
"helpCurrentHeadingObject": "สิ่งที่ส่งอยู่ในขณะนี้",
|
||||
"helpCurrentOverrideSome": "ปลายทางที่เข้ากันได้ใช้เทมเพลตนี้:",
|
||||
"helpCurrentResolved": "ไม่ได้ตั้งค่าการแทนที่ แต่ละปลายทางใช้:",
|
||||
"helpVariablesExplain": "Variables are your own values you can drop into a notification message. Give each one a name and a value here, then write {'{'}your_name{'}'} anywhere in the template — it gets filled in when the alert fires.",
|
||||
"helpBuiltInHeading": "Browse built-in variables",
|
||||
"helpBuiltInIntro": "{product} fills these in automatically — click one to copy it.",
|
||||
@@ -13687,6 +13732,7 @@
|
||||
"time": "เวลา",
|
||||
"event": "Event",
|
||||
"destinations": "Destinations",
|
||||
"template": "เทมเพลต",
|
||||
"result": "Result",
|
||||
"ok": "Sent",
|
||||
"pending": "Sending",
|
||||
@@ -13767,7 +13813,43 @@
|
||||
"firingFor": "firing for {duration}",
|
||||
"incident": "Incident"
|
||||
},
|
||||
"priorityUnsetPagesAs": "ไม่ได้ตั้งค่า (แจ้งเตือนเรียกเวรเป็น P2)"
|
||||
"priorityUnsetPagesAs": "ไม่ได้ตั้งค่า (แจ้งเตือนเรียกเวรเป็น P2)",
|
||||
"notificationKinds": {
|
||||
"alert": "การแจ้งเตือน",
|
||||
"incident": "เหตุการณ์ขัดข้อง",
|
||||
"anomaly": "ความผิดปกติ",
|
||||
"synthetics": "การตรวจสอบสังเคราะห์ (Synthetics)",
|
||||
"downtime": "ช่วงเวลาปิดปรับปรุง",
|
||||
"on_call": "เวรประจำการ (On-Call)"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "การแทนที่เทมเพลต",
|
||||
"placeholder": "ใช้เทมเพลตของปลายทาง",
|
||||
"help": "แทนที่เทมเพลตของปลายทางสำหรับข้อความ {kind} ไม่สามารถเลือกเทมเพลตสำเร็จรูปได้ ต้องคัดลอกก่อน",
|
||||
"empty": "ยังไม่มีเทมเพลตที่ใช้กับ {kind}",
|
||||
"create": "สร้างเทมเพลต",
|
||||
"loadFailed": "ไม่สามารถโหลดเทมเพลตได้",
|
||||
"forbidden": "การแสดงรายการเทมเพลตต้องมีสิทธิ์อ่านเทมเพลต",
|
||||
"mismatch": "ไม่ตรงกับปลายทาง {count} รายการของคุณ ({names}) ปลายทางเหล่านั้นจะใช้เทมเพลตของตัวเองแทน",
|
||||
"groupContent": "เนื้อหา",
|
||||
"groupCustom": "กำหนดเอง",
|
||||
"webhookOnly": "(เฉพาะ webhook)",
|
||||
"emailOnly": "(เฉพาะอีเมล)",
|
||||
"snsOnly": "(เฉพาะ SNS)",
|
||||
"stale": "ไม่พบเทมเพลต {name} อีกแล้ว โปรดเลือกเทมเพลตอื่นหรือล้างข้อมูลในช่องนี้",
|
||||
"willUse": "จะใช้: {template}",
|
||||
"willUsePerDestination": "จะใช้ตามปลายทางแต่ละรายการ:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "ข้อความ {kind} แบบในตัว",
|
||||
"sourceExplicit": "การแทนที่นี้",
|
||||
"sourceDestination": "เทมเพลตของปลายทาง",
|
||||
"sourceOrgDefault": "ค่าเริ่มต้นขององค์กร",
|
||||
"sourceCompiled": "ในตัว",
|
||||
"sourcePlatformResolve": "การกำหนดจากแพลตฟอร์ม",
|
||||
"sourceLegacy": "เพย์โหลดแบบเดิม",
|
||||
"sourceLegacyPayload": "เพย์โหลด JSON ของชนิดนั้นเอง (webhook ทั่วไป)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "Open",
|
||||
@@ -14064,11 +14146,14 @@
|
||||
"previewFidelityEmail": "The real email is HTML with a plain-text alternative. See Payload for both.",
|
||||
"previewFidelityWebhook": "Webhook receivers get JSON, not a card. See Payload for the exact body.",
|
||||
"previewFidelityMachine": "This channel is consumed by software, not read by people — the card is a normalized rendering. Payload shows the exact body that is sent.",
|
||||
"playgroundLabel": "พื้นที่ทดลอง",
|
||||
"playgroundHelp": "ไม่มีการส่งข้อมูลใด ๆ จากที่นี่",
|
||||
"previewChannel": "Channel",
|
||||
"previewSeverity": "Severity",
|
||||
"previewSeveritySingle": "Single-level (no level)",
|
||||
"previewEmptyTitle": "Preview will appear here",
|
||||
"unknownVariables": "Unknown variables",
|
||||
"emptyVariables": "ว่างสำหรับ {kind}: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (Adaptive Card)",
|
||||
"channelTeamsMessageCard": "Teams (MessageCard)",
|
||||
@@ -14086,7 +14171,23 @@
|
||||
"testSendConfirm": "This will post a real message to the selected channel, marked [TEST].",
|
||||
"testSendSuccess": "Test message sent",
|
||||
"testSendRateLimited": "Too many test-sends — please wait a moment and try again",
|
||||
"testSendNoDestination": "Select a destination first"
|
||||
"testSendNoDestination": "Select a destination first",
|
||||
"appliesTo": "ใช้กับ",
|
||||
"appliesToAll": "ทุกชนิด",
|
||||
"appliesToAny": "ชนิดใดก็ได้",
|
||||
"allKindsNotice": "เทมเพลตที่ใช้กับทุกชนิด: {count} รายการ ปลายทางที่ใช้เทมเพลตเหล่านี้จะใช้เทมเพลตดังกล่าวกับข้อความแจ้งความผิดปกติ ข้อความการตรวจสอบสังเคราะห์ (Synthetics) ข้อความเวรประจำการ (On-Call) ข้อความช่วงเวลาปิดปรับปรุง และข้อความเหตุการณ์ขัดข้องด้วย โปรดตรวจทาน",
|
||||
"allKindsNoticeReview": "ตรวจทาน",
|
||||
"appliesToInferred": "อนุมานจากตัวแปรในเนื้อความ",
|
||||
"appliesToManual": "คุณเป็นผู้เลือก",
|
||||
"appliesToReset": "รีเซ็ตกลับเป็นค่าที่อนุมาน",
|
||||
"previewKind": "ชนิด",
|
||||
"previewForbidden": "คุณไม่มีสิทธิ์ดูตัวอย่างเทมเพลต",
|
||||
"previewFailed": "ดูตัวอย่างไม่สำเร็จ: {message}",
|
||||
"severityFailed": "ล้มเหลว",
|
||||
"severityDegraded": "เสื่อมประสิทธิภาพ",
|
||||
"severityFlaky": "ไม่เสถียร",
|
||||
"severityRecovered": "กลับมาปกติ",
|
||||
"variableGroupCommon": "ทั่วไป"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "External Alert Sources",
|
||||
@@ -14216,6 +14317,11 @@
|
||||
"api_header": "Header",
|
||||
"api_header_value": "ค่า",
|
||||
"skip_tls_verify": "Skip TLS Verify",
|
||||
"payloadFormat": "รูปแบบเพย์โหลด",
|
||||
"payloadFormatAuto": "อัตโนมัติ",
|
||||
"payloadFormatLegacy": "JSON แบบเดิม",
|
||||
"payloadFormatRendered": "เทมเพลตที่เรนเดอร์แล้ว",
|
||||
"payloadFormatHelp": "โหมดอัตโนมัติจะส่งเนื้อหา JSON แบบเดิมสำหรับข้อความแจ้งความผิดปกติ ข้อความการตรวจสอบสังเคราะห์ (Synthetics) และข้อความเวรประจำการ (On-Call) จนกว่าจะแนบเทมเพลต ระบบจัดเก็บเป็นคีย์เมทาดาทา payload_format",
|
||||
"output_format": "Output Format",
|
||||
"readonly": "Read-only",
|
||||
"additional_settings": "Additional Settings",
|
||||
@@ -26136,6 +26242,7 @@
|
||||
"deliveriesNone": "Nothing has been sent yet.",
|
||||
"deliveriesRun": "Ladder run {run} — a handoff restarted the climb under the receiving team",
|
||||
"deliveryLanded": "Sent",
|
||||
"deliveryTemplate": "เทมเพลต: {templates}",
|
||||
"deliveryFailed": "Failed",
|
||||
"deliveriesTruncated": "Showing {shown} of {total} sends.",
|
||||
"teamChannelTitle": "Team channel",
|
||||
@@ -27539,7 +27646,8 @@
|
||||
"testPageConfirmNoChannel": "ส่งการแจ้งเตือนเรียกเวรทดสอบสำหรับ {priority} ไปยัง {names} หรือไม่ การแจ้งเตือนนี้จะไม่ถูกยกระดับ",
|
||||
"testPageSentOf": "ส่งแล้ว {sent} จาก {total} ข้อความ | ส่งแล้ว {sent} จาก {total} ข้อความ",
|
||||
"ladderSendTest": "ส่งทดสอบ",
|
||||
"scopeNotSeenYet": "ยังไม่พบในข้อมูลของคุณ"
|
||||
"scopeNotSeenYet": "ยังไม่พบในข้อมูลของคุณ",
|
||||
"policyMailBanner": "ปลายทางอีเมลและ SNS จะได้รับการแจ้งเตือนเรียกเวรจากเวอร์ชันนี้: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "Turn on paid AI usage?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "Görünüm",
|
||||
"frustration": "Hayal kırıklığı",
|
||||
"failedRequest": "Başarısız istekler",
|
||||
"noResponse": "Yanıt yok"
|
||||
"noResponse": "Yanıt yok",
|
||||
"noResponseStatus": "0 — Yanıt yok",
|
||||
"failedRequestDetails": "Başarısız istek ayrıntıları",
|
||||
"browserStatus": "Tarayıcı durumu",
|
||||
"serverStatus": "Sunucu durumu",
|
||||
"noServerSpanFound": "Sunucu span'i bulunamadı",
|
||||
"noServerSpanHint": "Eksik bir span örnekleme, veri alımı gecikmesi, enstrümantasyonu yapılmamış bir rota veya saklama süresi anlamına da gelebilir.",
|
||||
"unknownNoTrace": "Bilinmiyor (iz yok)",
|
||||
"unknown": "Bilinmiyor",
|
||||
"abortedByApp": "uygulama tarafından iptal edildi",
|
||||
"method": "Yöntem",
|
||||
"url": "URL",
|
||||
"duration": "Süre",
|
||||
"timing": "Zamanlama",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "Bağlanma",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "İlk bayt",
|
||||
"timingDownload": "İndirme",
|
||||
"size": "Boyut",
|
||||
"initiatedBy": "Başlatan"
|
||||
},
|
||||
"replayCanvasNotRecorded": "Canvas içeriği kaydedilmedi",
|
||||
"actionOnTarget": "\"{target}\" üzerinde {action}",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "Sayfa",
|
||||
"noDeviceData": "Bu sayfada bu cihaz türünde tıklama kaydedilmedi.",
|
||||
"noReplay": "Bu sayfa için oturum tekrarı kaydedilmedi, bu yüzden üzerine çizim yapılacak ekran görüntüsü yok. Uygulama için oturum tekrarını açın.",
|
||||
"noReplayLegacySdk": "Sayfa anlık görüntüleri daha yeni bir RUM SDK gerektirir. Burada kaydedilen oturum tekrarı daha eski bir SDK'dan geldiği için üzerine çizilecek ekran görüntüsü yok.",
|
||||
"loadFailed": "Tıklama verileri yüklenemedi.",
|
||||
"snapshotFailed": "Sayfa anlık görüntüsü yüklenemedi.",
|
||||
"noPosition": "Bu sayfada bu dönemde tıklama yok.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "{seconds} sn'de bir kontrol ediliyor · başlayalı {elapsed} oldu",
|
||||
"metaSince": "{seconds} sn'de bir kontrol ediliyor · başlayalı {elapsed} oldu · yalnızca {time} sonrasındaki kayıtlar sayılır",
|
||||
"hintWaiting": "İlk kayıt geldiğinde bu kendiliğinden yeşile döner. 2 dakika içinde hiçbir şey gelmezse neyin yanlış gittiğini gösterir; Sorun Giderme şimdi kontrol eder.",
|
||||
"hintWaitingAfter": "İlk kayıt geldiğinde bu kendiliğinden yeşile döner. {elapsed} içinde hiçbir şey gelmezse neyin ters gittiğini gösterir; Sorun Giderme hemen kontrol eder.",
|
||||
"hintWaitingLate": "İlk kayıt geldiğinde bu kendiliğinden yeşile döner. Kontroller 60 dakika sonra durur; veri daha sonra gelirse, Ana Sayfa bir sonraki ziyaretinizde size bildirir.",
|
||||
"hintStillChecking": "Hâlâ {seconds} sn'de bir kontrol ediliyor. Veri geldiğinde bu kendiliğinden yeşile döner.",
|
||||
"troubleshoot": "Sorun Giderme",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "Eşleşen akışlar zaten veri alıyor. Kontroller, yapılandırmayı kopyaladığınızda başlar.",
|
||||
"idleNew": "Komutu kopyaladığınızda kontroller başlar.",
|
||||
"idleNewConfig": "Yapılandırmayı kopyaladığınızda kontroller başlar.",
|
||||
"idleInPrompt": "{stream} zaten veri alıyor. İstem metnini kopyaladığınızda kontroller başlar.",
|
||||
"idleMatchesPrompt": "Eşleşen akışlar zaten veri alıyor. İstem metnini kopyaladığınızda kontroller başlar.",
|
||||
"idleNewPrompt": "İstem metnini kopyaladığınızda kontroller başlar.",
|
||||
"checkNow": "Şimdi kontrol et",
|
||||
"receivedPill": "İlk olay alındı",
|
||||
"receivedNewPill": "Yeni veri alındı",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "Göndericinizin kullandığı token, bu kuruluşun geçerli token'ıyla eşleşmiyor. Komutu yeniden kopyalayıp tekrar çalıştırın.",
|
||||
"fixInvalidCredentialsConfig": "{tool} yapılandırmanızdaki parola, org token'ı {token} ile eşleşmiyor. Yapılandırmayı yeniden kopyalayıp {tool} uygulamasını yeniden başlatın.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "{tool} yapılandırmanızdaki parola, bu kuruluşun geçerli token'ıyla eşleşmiyor. Yapılandırmayı yeniden kopyalayıp {tool} uygulamasını yeniden başlatın.",
|
||||
"fixInvalidCredentialsPrompt": ".env dosyanızdaki token, {token} kuruluş token'ıyla eşleşmiyor. .env dosyasını yeniden indirin ve kodlama aracınızdan isteği tekrar çalıştırmasını isteyin.",
|
||||
"fixInvalidCredentialsPromptUnnamed": ".env dosyanızdaki token bu kuruluşun geçerli token'ıyla eşleşmiyor. .env dosyasını yeniden indirin ve kodlama aracınızdan isteği tekrar çalıştırmasını isteyin.",
|
||||
"fixMalformedBody": "İstek gövdesi, bu uç noktanın kabul ettiği biçimde değil. Yük biçimini kontrol edip tekrar gönderin.",
|
||||
"fixBatchTooLarge": "Toplu gönderim, bu uç noktanın kabul ettiğinden daha büyük. Toplu gönderim boyutunu düşürüp tekrar gönderin.",
|
||||
"fixRateOrQuota": "İstekler hız veya kota sınırını aşıyor. Geçmeleri için bir dakika bekleyin ya da planı kontrol edin.",
|
||||
"copyCommand": "Komutu kopyala",
|
||||
"copyConfig": "Yapılandırmayı kopyala",
|
||||
"copyPrompt": "İstem metnini kopyala",
|
||||
"rightPlace": "Doğru yere mi gönderiyorsunuz? {org}, {region} bölgesinde bulunur: {endpoint}",
|
||||
"noRequestsPill": "Henüz hiçbir şey ulaşmadı",
|
||||
"noRequestsSummary": "{region} bölgesindeki {org} adresine {window} hiçbir şey ulaşmadı ve hiçbir istek reddedilmedi.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": ".env indir",
|
||||
"promptTitle": "Bunu {client1}, {client2} veya {client3} içine yapıştırın",
|
||||
"promptLabel": "İstem",
|
||||
"promptCopied": "İstem kopyalandı"
|
||||
"promptCopied": "İstem kopyalandı",
|
||||
"health": {
|
||||
"title": "Yapay zeka veri sağlığı",
|
||||
"scopeAgent": "Kontrol başladığından beri {stream} içindeki {agent} aracısından gelen span'ler",
|
||||
"scopeStream": "Kontrol başladığından beri {stream} içindeki span'ler",
|
||||
"checking": "Yapay zeka veri sağlığı kontrol ediliyor…",
|
||||
"checkAgain": "Tekrar kontrol et",
|
||||
"checkAgainHint": "Kodlama aracınız kodu değiştirip başka bir istek çalıştırdıktan sonra tekrar kontrol edin.",
|
||||
"unsupported": "Bu OpenObserve sürümü yapay zeka veri sağlığını kontrol etmez. İlk span'iniz geldi, yani izleme çalışıyor.",
|
||||
"error": "Yapay zeka veri sağlığı kontrolleri çalıştırılamadı. İlk span'iniz geldi, yani izleme çalışıyor.",
|
||||
"noGenAiSpans": "Span'ler geldi ancak hiçbiri bir LLM çağrısı değil, bu yüzden LLM istemcisi enstrümante edilmemiş. Kodlama aracınızdan LLM istemcisini enstrümante etmesini ve bir istek çalıştırmasını isteyin, sonra tekrar kontrol edin."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "Veri kaynakları",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "Bir şablonu önizleyin",
|
||||
"helpPreviewSelectPlaceholder": "Önizlemek için bir şablon seçin",
|
||||
"helpApplyToAlert": "Uyarıya uygula",
|
||||
"helpApplyToObject": "Bu şablonu kullan",
|
||||
"helpTemplateExplainObject": "Şablon, gönderilen mesajdır: metin artı değişkenler. Burada bir tane seçmek, yalnızca bu yapılandırma için her hedefin kendi şablonunun yerini alır.",
|
||||
"helpTemplateWhenDescObject": "Bunu boş bırakırsanız, her hedef bu türe uyuyorsa önce kendi şablonunu, ardından yerleşik mesajı kullanır. Uyan her hedefe tek bir mesaj göndermek için bir geçersiz kılma ayarlayın.",
|
||||
"helpCurrentHeadingObject": "Bunun şu anda gönderdiği",
|
||||
"helpCurrentOverrideSome": "Uyan hedefler bu şablonu kullanır:",
|
||||
"helpCurrentResolved": "Geçersiz kılma ayarlanmadı. Her hedef şunu kullanır:",
|
||||
"helpVariablesExplain": "Değişkenler, bir bildirim mesajına ekleyebileceğiniz kendi değerlerinizdir. Her birine burada bir ad ve bir değer verin, ardından şablonun herhangi bir yerine {'{'}your_name{'}'} yazın — uyarı tetiklendiğinde doldurulur.",
|
||||
"helpBuiltInHeading": "Yerleşik değişkenlere göz atın",
|
||||
"helpBuiltInIntro": "{product} bunları otomatik doldurur — kopyalamak için birine tıklayın.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "Zaman",
|
||||
"event": "Olay",
|
||||
"destinations": "Hedefler",
|
||||
"template": "Şablon",
|
||||
"result": "Sonuç",
|
||||
"ok": "Gönderildi",
|
||||
"pending": "Gönderiliyor",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "{duration} süredir tetiklenmiş",
|
||||
"incident": "Vaka"
|
||||
},
|
||||
"priorityUnsetPagesAs": "Ayarlanmadı (P2 olarak çağırır)"
|
||||
"priorityUnsetPagesAs": "Ayarlanmadı (P2 olarak çağırır)",
|
||||
"notificationKinds": {
|
||||
"alert": "Uyarı",
|
||||
"incident": "Vaka",
|
||||
"anomaly": "Anomali",
|
||||
"synthetics": "Sentetikler",
|
||||
"downtime": "Bakım penceresi",
|
||||
"on_call": "Nöbet"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "Şablon geçersiz kılma",
|
||||
"placeholder": "Hedefin şablonunu kullan",
|
||||
"help": "{kind} iletileri için hedef şablonunu geçersiz kılar. Hazır şablonlar seçilemez; önce birini kopyalayın.",
|
||||
"empty": "Henüz {kind} için geçerli şablon yok.",
|
||||
"create": "Şablon oluştur",
|
||||
"loadFailed": "Şablonlar yüklenemedi",
|
||||
"forbidden": "Şablonları listelemek için şablon okuma izni gerekir",
|
||||
"mismatch": "Hedeflerinizden {count} tanesine uymuyor ({names}); bunlar kendi şablonlarına geri döner.",
|
||||
"groupContent": "İçerik",
|
||||
"groupCustom": "Özel",
|
||||
"webhookOnly": "(yalnızca webhook)",
|
||||
"emailOnly": "(yalnızca e-posta)",
|
||||
"snsOnly": "(yalnızca SNS)",
|
||||
"stale": "{name} şablonu artık mevcut değil. Başka bir tane seçin veya alanı temizleyin.",
|
||||
"willUse": "Kullanılacak: {template}",
|
||||
"willUsePerDestination": "Hedef başına kullanılacak:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "Yerleşik {kind} iletisi",
|
||||
"sourceExplicit": "bu geçersiz kılma",
|
||||
"sourceDestination": "hedef şablonu",
|
||||
"sourceOrgDefault": "kuruluş varsayılanı",
|
||||
"sourceCompiled": "yerleşik",
|
||||
"sourcePlatformResolve": "platform çözümlemesi",
|
||||
"sourceLegacy": "eski yük",
|
||||
"sourceLegacyPayload": "türün kendi JSON yükü (genel webhook)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "Aç",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "Gerçek e-posta, düz metin alternatifi olan HTML'dir. Her ikisi için Veri yüküne bakın.",
|
||||
"previewFidelityWebhook": "Webhook alıcıları kart değil JSON alır. Tam içerik için Veri yüküne bakın.",
|
||||
"previewFidelityMachine": "Bu kanal insanlar tarafından değil yazılım tarafından tüketilir — kart normalleştirilmiş bir görünümdür. Veri yükü, gönderilen tam içeriği gösterir.",
|
||||
"playgroundLabel": "Deneme alanı",
|
||||
"playgroundHelp": "Buradan hiçbir şey gönderilmez.",
|
||||
"previewChannel": "Kanal",
|
||||
"previewSeverity": "Önem derecesi",
|
||||
"previewSeveritySingle": "Tek seviye (seviye yok)",
|
||||
"previewEmptyTitle": "Önizleme burada görünecek",
|
||||
"unknownVariables": "Bilinmeyen değişkenler",
|
||||
"emptyVariables": "{kind} için boş: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (Uyarlanabilir Kart)",
|
||||
"channelTeamsMessageCard": "Teams (Mesaj Kartı)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "Bu, seçilen kanala [TEST] olarak işaretlenmiş gerçek bir mesaj gönderir.",
|
||||
"testSendSuccess": "Test mesajı gönderildi",
|
||||
"testSendRateLimited": "Çok fazla test gönderimi — lütfen bir an bekleyin ve tekrar deneyin",
|
||||
"testSendNoDestination": "Önce bir hedef seçin"
|
||||
"testSendNoDestination": "Önce bir hedef seçin",
|
||||
"appliesTo": "Şunlara uygulanır",
|
||||
"appliesToAll": "Tüm türler",
|
||||
"appliesToAny": "Herhangi bir tür",
|
||||
"allKindsNotice": "Her türe uygulanan şablonlar: {count}. Hedefleri bunları anomali, sentetikler, nöbet, bakım penceresi ve vaka iletileri için de kullanır. Bunları gözden geçirin.",
|
||||
"allKindsNoticeReview": "Gözden geçir",
|
||||
"appliesToInferred": "Gövdedeki değişkenlerden çıkarıldı",
|
||||
"appliesToManual": "Sizin seçiminiz",
|
||||
"appliesToReset": "Çıkarılan değere sıfırla",
|
||||
"previewKind": "Tür",
|
||||
"previewForbidden": "Şablonları önizleme izniniz yok",
|
||||
"previewFailed": "Önizleme başarısız: {message}",
|
||||
"severityFailed": "Başarısız",
|
||||
"severityDegraded": "Kötüleşmiş",
|
||||
"severityFlaky": "Kararsız",
|
||||
"severityRecovered": "Düzeldi",
|
||||
"variableGroupCommon": "Genel"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "Harici Uyarı Kaynakları",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "Başlık",
|
||||
"api_header_value": "Değer",
|
||||
"skip_tls_verify": "TLS Doğrulamasını Atla",
|
||||
"payloadFormat": "Yük biçimi",
|
||||
"payloadFormatAuto": "Otomatik",
|
||||
"payloadFormatLegacy": "Eski JSON",
|
||||
"payloadFormatRendered": "İşlenmiş şablon",
|
||||
"payloadFormatHelp": "Otomatik, bir şablon eklenene kadar anomali, sentetikler ve nöbet iletileri için eski JSON gövdesini gönderir. Meta veri anahtarı payload_format olarak saklanır.",
|
||||
"output_format": "Çıktı Biçimi",
|
||||
"readonly": "Salt okunur",
|
||||
"additional_settings": "Ek Ayarlar",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "Henüz hiçbir şey gönderilmedi.",
|
||||
"deliveriesRun": "Merdiven çalışması {run} — bir devir teslim, tırmanışı devralan ekip bünyesinde yeniden başlattı.",
|
||||
"deliveryLanded": "Gönderildi",
|
||||
"deliveryTemplate": "Şablon: {templates}",
|
||||
"deliveryFailed": "Başarısız",
|
||||
"deliveriesTruncated": "{total} gönderimden {shown} gösteriliyor.",
|
||||
"teamChannelTitle": "Ekip kanalı",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "{priority} için test çağrısı {names} kişisine gönderilsin mi? Yükseltilmez.",
|
||||
"testPageSentOf": "{total} mesajdan {sent} tanesi gönderildi | {total} mesajdan {sent} tanesi gönderildi",
|
||||
"ladderSendTest": "Test gönder",
|
||||
"scopeNotSeenYet": "Verilerinizde henüz görülmedi"
|
||||
"scopeNotSeenYet": "Verilerinizde henüz görülmedi",
|
||||
"policyMailBanner": "E-posta ve SNS hedefleri bu sürümden çağrı alır: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "Ücretli Yapay Zeka kullanımı açılsın mı?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "Lượt xem",
|
||||
"frustration": "Bực bội",
|
||||
"failedRequest": "Yêu cầu thất bại",
|
||||
"noResponse": "Không có phản hồi"
|
||||
"noResponse": "Không có phản hồi",
|
||||
"noResponseStatus": "0 — Không phản hồi",
|
||||
"failedRequestDetails": "Chi tiết yêu cầu thất bại",
|
||||
"browserStatus": "Trạng thái trình duyệt",
|
||||
"serverStatus": "Trạng thái máy chủ",
|
||||
"noServerSpanFound": "Không tìm thấy span máy chủ",
|
||||
"noServerSpanHint": "Span bị thiếu cũng có thể là do lấy mẫu, độ trễ tiếp nhận dữ liệu, một tuyến chưa được đo hoặc thời gian lưu giữ.",
|
||||
"unknownNoTrace": "Không xác định (không có trace)",
|
||||
"unknown": "Không xác định",
|
||||
"abortedByApp": "bị ứng dụng hủy",
|
||||
"method": "Phương thức",
|
||||
"url": "URL",
|
||||
"duration": "Thời lượng",
|
||||
"timing": "Thời gian",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "Kết nối",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "Byte đầu tiên",
|
||||
"timingDownload": "Tải xuống",
|
||||
"size": "Kích thước",
|
||||
"initiatedBy": "Khởi tạo bởi"
|
||||
},
|
||||
"replayCanvasNotRecorded": "Nội dung canvas không được ghi lại",
|
||||
"actionOnTarget": "{action} trên \"{target}\"",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "Trang",
|
||||
"noDeviceData": "Không có lượt nhấp nào được ghi nhận trên loại thiết bị này cho trang này.",
|
||||
"noReplay": "Không có bản phát lại phiên nào được ghi cho trang này, nên không có ảnh chụp màn hình để vẽ lên. Hãy bật tính năng phát lại phiên cho ứng dụng.",
|
||||
"noReplayLegacySdk": "Ảnh chụp trang cần RUM SDK mới hơn. Bản phát lại phiên được ghi ở đây đến từ SDK cũ hơn, nên không có ảnh chụp màn hình để vẽ lên.",
|
||||
"loadFailed": "Không thể tải dữ liệu lượt nhấp.",
|
||||
"snapshotFailed": "Không thể tải ảnh chụp nhanh trang.",
|
||||
"noPosition": "Không có lượt nhấp nào trong khoảng thời gian này cho trang này.",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "Kiểm tra mỗi {seconds} giây · bắt đầu cách đây {elapsed}",
|
||||
"metaSince": "Kiểm tra mỗi {seconds} giây · bắt đầu cách đây {elapsed} · chỉ đếm các bản ghi sau {time}",
|
||||
"hintWaiting": "Mục này tự chuyển sang màu xanh khi bản ghi đầu tiên đến. Nếu sau 2 phút vẫn không có dữ liệu, nó sẽ hiển thị nguyên nhân; Khắc phục sự cố sẽ kiểm tra ngay.",
|
||||
"hintWaitingAfter": "Mục này tự chuyển xanh khi bản ghi đầu tiên đến. Nếu không có gì đến trong {elapsed}, mục này hiển thị lỗi; Khắc phục sự cố sẽ kiểm tra ngay.",
|
||||
"hintWaitingLate": "Mục này tự chuyển sang màu xanh khi bản ghi đầu tiên đến. Quá trình kiểm tra dừng sau 60 phút; nếu dữ liệu đến muộn hơn, Trang chủ sẽ thông báo cho bạn trong lần truy cập tiếp theo.",
|
||||
"hintStillChecking": "Vẫn đang kiểm tra mỗi {seconds} giây. Mục này tự chuyển sang màu xanh khi dữ liệu đến.",
|
||||
"troubleshoot": "Khắc phục sự cố",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "Các stream khớp đã nhận dữ liệu. Quá trình kiểm tra bắt đầu khi bạn sao chép cấu hình.",
|
||||
"idleNew": "Quá trình kiểm tra bắt đầu khi bạn sao chép lệnh.",
|
||||
"idleNewConfig": "Quá trình kiểm tra bắt đầu khi bạn sao chép cấu hình.",
|
||||
"idleInPrompt": "{stream} đã nhận dữ liệu. Quá trình kiểm tra sẽ bắt đầu khi bạn sao chép lời nhắc.",
|
||||
"idleMatchesPrompt": "Các stream khớp đã nhận dữ liệu. Quá trình kiểm tra sẽ bắt đầu khi bạn sao chép lời nhắc.",
|
||||
"idleNewPrompt": "Quá trình kiểm tra sẽ bắt đầu khi bạn sao chép lời nhắc.",
|
||||
"checkNow": "Kiểm tra ngay",
|
||||
"receivedPill": "Đã nhận sự kiện đầu tiên",
|
||||
"receivedNewPill": "Đã nhận dữ liệu mới",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "Token mà trình gửi của bạn dùng không khớp với token hiện tại của tổ chức này. Hãy sao chép lại lệnh và chạy lại.",
|
||||
"fixInvalidCredentialsConfig": "Mật khẩu trong cấu hình {tool} của bạn không khớp với token của tổ chức {token}. Hãy sao chép lại cấu hình và khởi động lại {tool}.",
|
||||
"fixInvalidCredentialsConfigUnnamed": "Mật khẩu trong cấu hình {tool} của bạn không khớp với token hiện tại của tổ chức này. Hãy sao chép lại cấu hình và khởi động lại {tool}.",
|
||||
"fixInvalidCredentialsPrompt": "Token trong tệp .env của bạn không khớp với token tổ chức {token}. Hãy tải lại tệp .env và yêu cầu coding agent chạy lại yêu cầu.",
|
||||
"fixInvalidCredentialsPromptUnnamed": "Token trong tệp .env của bạn không khớp với token hiện tại của tổ chức này. Hãy tải lại tệp .env và yêu cầu coding agent chạy lại yêu cầu.",
|
||||
"fixMalformedBody": "Phần thân yêu cầu không đúng định dạng mà endpoint này chấp nhận. Hãy kiểm tra định dạng payload rồi gửi lại.",
|
||||
"fixBatchTooLarge": "Lô dữ liệu lớn hơn mức endpoint này chấp nhận. Hãy giảm kích thước lô rồi gửi lại.",
|
||||
"fixRateOrQuota": "Các yêu cầu đã vượt giới hạn tốc độ hoặc hạn mức. Hãy đợi một phút để chúng được xử lý, hoặc kiểm tra gói dịch vụ.",
|
||||
"copyCommand": "Sao chép lệnh",
|
||||
"copyConfig": "Sao chép cấu hình",
|
||||
"copyPrompt": "Sao chép lời nhắc",
|
||||
"rightPlace": "Đang gửi đến đúng nơi chứ? {org} nằm ở {region}: {endpoint}",
|
||||
"noRequestsPill": "Chưa có gì đến",
|
||||
"noRequestsSummary": "Chưa có gì đến {org} ở {region} {window}, và không có yêu cầu nào bị từ chối.",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": "Tải xuống .env",
|
||||
"promptTitle": "Dán nội dung này vào {client1}, {client2} hoặc {client3}",
|
||||
"promptLabel": "Prompt",
|
||||
"promptCopied": "Đã sao chép prompt"
|
||||
"promptCopied": "Đã sao chép prompt",
|
||||
"health": {
|
||||
"title": "Tình trạng dữ liệu AI",
|
||||
"scopeAgent": "Các span từ agent {agent} trong {stream} kể từ khi bắt đầu kiểm tra",
|
||||
"scopeStream": "Các span trong {stream} kể từ khi bắt đầu kiểm tra",
|
||||
"checking": "Đang kiểm tra tình trạng dữ liệu AI…",
|
||||
"checkAgain": "Kiểm tra lại",
|
||||
"checkAgainHint": "Sau khi coding agent của bạn sửa mã và chạy một yêu cầu khác, hãy kiểm tra lại.",
|
||||
"unsupported": "Phiên bản OpenObserve này không kiểm tra tình trạng dữ liệu AI. Span đầu tiên của bạn đã đến, nên quá trình trace hoạt động.",
|
||||
"error": "Không thể chạy kiểm tra tình trạng dữ liệu AI. Span đầu tiên của bạn đã đến, nên quá trình trace hoạt động.",
|
||||
"noGenAiSpans": "Các span đã đến, nhưng không có span nào là cuộc gọi LLM, nên ứng dụng khách LLM chưa được gắn công cụ đo. Hãy yêu cầu coding agent của bạn gắn công cụ đo cho ứng dụng khách LLM, chạy một yêu cầu rồi kiểm tra lại."
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "Nguồn dữ liệu",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "Xem trước mẫu",
|
||||
"helpPreviewSelectPlaceholder": "Chọn mẫu để xem trước",
|
||||
"helpApplyToAlert": "Áp dụng cho cảnh báo",
|
||||
"helpApplyToObject": "Dùng mẫu này",
|
||||
"helpTemplateExplainObject": "Mẫu là thông điệp được gửi đi: văn bản cùng các biến. Chọn một mẫu ở đây sẽ thay thế mẫu riêng của từng đích, chỉ cho cấu hình này.",
|
||||
"helpTemplateWhenDescObject": "Để trống mục này và mỗi đích sẽ dùng mẫu riêng của nó nếu mẫu đó áp dụng cho loại này, nếu không thì dùng thông điệp tích hợp. Đặt ghi đè để gửi một thông điệp đến mọi đích phù hợp.",
|
||||
"helpCurrentHeadingObject": "Nội dung gửi hiện tại",
|
||||
"helpCurrentOverrideSome": "Các đích phù hợp dùng mẫu này:",
|
||||
"helpCurrentResolved": "Chưa đặt ghi đè. Mỗi đích sẽ dùng:",
|
||||
"helpVariablesExplain": "Biến là các giá trị riêng của bạn mà bạn có thể đưa vào thông báo. Đặt tên và giá trị cho mỗi biến ở đây, sau đó viết {'{'}your_name{'}'} ở bất kỳ đâu trong mẫu — nó sẽ được điền khi cảnh báo được kích hoạt.",
|
||||
"helpBuiltInHeading": "Duyệt các biến tích hợp",
|
||||
"helpBuiltInIntro": "{product} tự động điền các mục này — nhấp vào một mục để sao chép.",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "Thời gian",
|
||||
"event": "Sự kiện",
|
||||
"destinations": "Đích",
|
||||
"template": "Mẫu",
|
||||
"result": "Kết quả",
|
||||
"ok": "Đã gửi",
|
||||
"pending": "Đang gửi",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "đang kích hoạt trong {duration}",
|
||||
"incident": "Sự cố"
|
||||
},
|
||||
"priorityUnsetPagesAs": "Chưa đặt (cảnh báo ở mức P2)"
|
||||
"priorityUnsetPagesAs": "Chưa đặt (cảnh báo ở mức P2)",
|
||||
"notificationKinds": {
|
||||
"alert": "Cảnh báo",
|
||||
"incident": "Sự cố",
|
||||
"anomaly": "Bất thường",
|
||||
"synthetics": "Synthetics",
|
||||
"downtime": "Thời gian bảo trì",
|
||||
"on_call": "Trực"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "Ghi đè mẫu",
|
||||
"placeholder": "Dùng template của đích",
|
||||
"help": "Ghi đè template của đích cho tin nhắn {kind}. Không thể chọn template dựng sẵn; hãy sao chép một template trước.",
|
||||
"empty": "Chưa có template nào áp dụng cho {kind}.",
|
||||
"create": "Tạo template",
|
||||
"loadFailed": "Không thể tải template",
|
||||
"forbidden": "Liệt kê template cần quyền đọc template",
|
||||
"mismatch": "Không phù hợp với {count} đích của bạn ({names}); các đích đó sẽ quay về template riêng của chúng.",
|
||||
"groupContent": "Nội dung",
|
||||
"groupCustom": "Tùy chỉnh",
|
||||
"webhookOnly": "(chỉ webhook)",
|
||||
"emailOnly": "(chỉ email)",
|
||||
"snsOnly": "(chỉ SNS)",
|
||||
"stale": "Template {name} không còn tồn tại. Hãy chọn template khác hoặc xóa trường này.",
|
||||
"willUse": "Sẽ dùng: {template}",
|
||||
"willUsePerDestination": "Sẽ dùng, theo từng đích:",
|
||||
"willUseRow": "{destination}: {template}",
|
||||
"templateWithSource": "{name} ({source})",
|
||||
"builtIn": "Tin nhắn {kind} dựng sẵn",
|
||||
"sourceExplicit": "ghi đè này",
|
||||
"sourceDestination": "template của đích",
|
||||
"sourceOrgDefault": "mặc định của tổ chức",
|
||||
"sourceCompiled": "dựng sẵn",
|
||||
"sourcePlatformResolve": "nền tảng phân giải",
|
||||
"sourceLegacy": "payload kiểu cũ",
|
||||
"sourceLegacyPayload": "payload JSON riêng của loại này (webhook chung)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "Mở",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "Email thực tế là HTML có kèm bản văn bản thuần túy. Xem Payload để biết cả hai.",
|
||||
"previewFidelityWebhook": "Trình nhận webhook nhận JSON, không phải thẻ. Xem Payload để biết nội dung chính xác.",
|
||||
"previewFidelityMachine": "Kênh này được phần mềm sử dụng, không phải con người đọc — thẻ là bản kết xuất chuẩn hóa. Payload hiển thị nội dung chính xác được gửi.",
|
||||
"playgroundLabel": "Playground",
|
||||
"playgroundHelp": "Không có gì ở đây được gửi đi.",
|
||||
"previewChannel": "Kênh",
|
||||
"previewSeverity": "Mức độ nghiêm trọng",
|
||||
"previewSeveritySingle": "Một cấp độ (không có cấp độ)",
|
||||
"previewEmptyTitle": "Bản xem trước sẽ xuất hiện ở đây",
|
||||
"unknownVariables": "Biến không xác định",
|
||||
"emptyVariables": "Trống cho {kind}: {names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams (Adaptive Card)",
|
||||
"channelTeamsMessageCard": "Teams (MessageCard)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "Thao tác này sẽ đăng một tin nhắn thực tế tới kênh đã chọn, được đánh dấu [TEST].",
|
||||
"testSendSuccess": "Tin nhắn kiểm tra đã được gửi",
|
||||
"testSendRateLimited": "Quá nhiều lần gửi kiểm tra — vui lòng chờ một lát và thử lại",
|
||||
"testSendNoDestination": "Chọn một đích trước"
|
||||
"testSendNoDestination": "Chọn một đích trước",
|
||||
"appliesTo": "Áp dụng cho",
|
||||
"appliesToAll": "Tất cả các loại",
|
||||
"appliesToAny": "Mọi loại",
|
||||
"allKindsNotice": "Số template áp dụng cho mọi loại: {count}. Các đích của chúng cũng dùng chúng cho tin nhắn bất thường, synthetics, trực, thời gian bảo trì và sự cố. Hãy xem lại.",
|
||||
"allKindsNoticeReview": "Xem lại",
|
||||
"appliesToInferred": "Suy ra từ các biến trong nội dung",
|
||||
"appliesToManual": "Do bạn chọn",
|
||||
"appliesToReset": "Đặt lại về suy luận",
|
||||
"previewKind": "Loại",
|
||||
"previewForbidden": "Bạn không có quyền xem trước template",
|
||||
"previewFailed": "Xem trước thất bại: {message}",
|
||||
"severityFailed": "Thất bại",
|
||||
"severityDegraded": "Suy giảm",
|
||||
"severityFlaky": "Chập chờn",
|
||||
"severityRecovered": "Đã phục hồi",
|
||||
"variableGroupCommon": "Chung"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "Nguồn cảnh báo bên ngoài",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "Tiêu đề",
|
||||
"api_header_value": "Giá trị",
|
||||
"skip_tls_verify": "Bỏ qua xác thực TLS",
|
||||
"payloadFormat": "Định dạng payload",
|
||||
"payloadFormatAuto": "Tự động",
|
||||
"payloadFormatLegacy": "JSON kiểu cũ",
|
||||
"payloadFormatRendered": "Template đã kết xuất",
|
||||
"payloadFormatHelp": "Tự động gửi nội dung JSON cũ cho tin nhắn bất thường, synthetics và trực cho đến khi có template được gắn. Được lưu dưới khóa metadata payload_format.",
|
||||
"output_format": "Định dạng đầu ra",
|
||||
"readonly": "Chỉ đọc",
|
||||
"additional_settings": "Cài đặt bổ sung",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "Chưa có gì được gửi đi.",
|
||||
"deliveriesRun": "Lần chạy thang {run} — một lần bàn giao đã khởi động lại quá trình leo thang dưới nhóm nhận",
|
||||
"deliveryLanded": "Đã gửi",
|
||||
"deliveryTemplate": "Template: {templates}",
|
||||
"deliveryFailed": "Thất bại",
|
||||
"deliveriesTruncated": "Đang hiển thị {shown} trong {total} lần gửi.",
|
||||
"teamChannelTitle": "Kênh nhóm",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "Gửi cảnh báo thử {priority} đến {names}? Không leo thang.",
|
||||
"testPageSentOf": "Đã gửi {sent}/{total} tin nhắn | Đã gửi {sent}/{total} tin nhắn",
|
||||
"ladderSendTest": "Gửi thử",
|
||||
"scopeNotSeenYet": "Chưa thấy trong dữ liệu của bạn"
|
||||
"scopeNotSeenYet": "Chưa thấy trong dữ liệu của bạn",
|
||||
"policyMailBanner": "Các đích Email và SNS nhận thông báo trực từ phiên bản này: {names}."
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "Bật sử dụng AI trả phí?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "视图",
|
||||
"frustration": "挫败",
|
||||
"failedRequest": "失败请求",
|
||||
"noResponse": "无响应"
|
||||
"noResponse": "无响应",
|
||||
"noResponseStatus": "0 — 无响应",
|
||||
"failedRequestDetails": "失败请求详情",
|
||||
"browserStatus": "浏览器状态",
|
||||
"serverStatus": "服务器状态",
|
||||
"noServerSpanFound": "未找到服务端 Span",
|
||||
"noServerSpanHint": "缺少 Span 也可能意味着采样、摄取延迟、未埋点的路由或保留策略。",
|
||||
"unknownNoTrace": "未知(无追踪)",
|
||||
"unknown": "未知",
|
||||
"abortedByApp": "被应用中止",
|
||||
"method": "方法",
|
||||
"url": "URL",
|
||||
"duration": "持续时间",
|
||||
"timing": "耗时",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "连接",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "首字节",
|
||||
"timingDownload": "下载",
|
||||
"size": "大小",
|
||||
"initiatedBy": "发起方"
|
||||
},
|
||||
"replayCanvasNotRecorded": "未录制 Canvas 内容",
|
||||
"actionOnTarget": "在 \"{target}\" 上 {action}",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "页面",
|
||||
"noDeviceData": "该页面在此设备类型上未记录到点击。",
|
||||
"noReplay": "该页面未记录到会话回放,因此没有可绘制的截图。请为应用开启会话回放。",
|
||||
"noReplayLegacySdk": "页面快照需要较新版本的 RUM SDK。此处记录的会话回放来自较旧版本的 SDK,因此没有可用于绘制的截图。",
|
||||
"loadFailed": "无法加载点击数据。",
|
||||
"snapshotFailed": "无法加载页面快照。",
|
||||
"noPosition": "该页面在该时间段内没有点击。",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "每 {seconds} 秒检查一次 · {elapsed} 前开始",
|
||||
"metaSince": "每 {seconds} 秒检查一次 · {elapsed} 前开始 · 仅统计 {time} 之后的记录",
|
||||
"hintWaiting": "第一条记录到达后,此处会自动变绿。如果 2 分钟内没有数据到达,它会显示问题所在;排查会立即检查。",
|
||||
"hintWaitingAfter": "第一条记录到达后,此处会自动变绿。如果 {elapsed} 内没有任何数据到达,它会显示哪里出了问题;「排查」会立即检查。",
|
||||
"hintWaitingLate": "第一条记录到达后,此处会自动变绿。检查会在 60 分钟后停止;如果数据之后才到达,主页会在您下次访问时告知您。",
|
||||
"hintStillChecking": "仍在每 {seconds} 秒检查一次。数据到达后,此处会自动变绿。",
|
||||
"troubleshoot": "排查",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "匹配的数据流已在接收数据。复制配置后将开始检查。",
|
||||
"idleNew": "复制命令后即开始检查。",
|
||||
"idleNewConfig": "复制配置后即开始检查。",
|
||||
"idleInPrompt": "{stream} 已在接收数据。复制提示词后即开始检查。",
|
||||
"idleMatchesPrompt": "匹配的数据流已在接收数据。复制提示词后即开始检查。",
|
||||
"idleNewPrompt": "复制提示词后即开始检查。",
|
||||
"checkNow": "立即检查",
|
||||
"receivedPill": "已收到首个事件",
|
||||
"receivedNewPill": "已收到新数据",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "你的发送端使用的令牌与该组织当前的令牌不匹配。请重新复制命令并再次运行。",
|
||||
"fixInvalidCredentialsConfig": "你的 {tool} 配置中的密码与组织令牌 {token} 不匹配。请重新复制配置并重启 {tool}。",
|
||||
"fixInvalidCredentialsConfigUnnamed": "你的 {tool} 配置中的密码与该组织当前的令牌不匹配。请重新复制配置并重启 {tool}。",
|
||||
"fixInvalidCredentialsPrompt": "你 .env 中的令牌与组织令牌 {token} 不匹配。请重新下载 .env,并让你的编码智能体重新运行该请求。",
|
||||
"fixInvalidCredentialsPromptUnnamed": "你 .env 中的令牌与该组织当前的令牌不匹配。请重新下载 .env,并让你的编码智能体重新运行该请求。",
|
||||
"fixMalformedBody": "请求体的格式不是该端点所接受的格式。请检查负载格式,然后重新发送。",
|
||||
"fixBatchTooLarge": "批次大小超过了该端点所接受的范围。请减小批次大小,然后重新发送。",
|
||||
"fixRateOrQuota": "请求已超出速率或配额限制。请等待一分钟让其通过,或检查订阅计划。",
|
||||
"copyCommand": "复制命令",
|
||||
"copyConfig": "复制配置",
|
||||
"copyPrompt": "复制提示词",
|
||||
"rightPlace": "发送到正确的位置了吗?{org} 位于 {region}:{endpoint}",
|
||||
"noRequestsPill": "尚未收到任何数据",
|
||||
"noRequestsSummary": "{window} 内 {region} 的 {org} 尚未收到任何数据,也没有请求被拒绝。",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": "下载 .env",
|
||||
"promptTitle": "将此内容粘贴到 {client1}、{client2} 或 {client3}",
|
||||
"promptLabel": "提示词",
|
||||
"promptCopied": "提示词已复制"
|
||||
"promptCopied": "提示词已复制",
|
||||
"health": {
|
||||
"title": "AI 数据健康",
|
||||
"scopeAgent": "自检查开始以来 {stream} 中来自智能体 {agent} 的 Span",
|
||||
"scopeStream": "自检查开始以来 {stream} 中的 Span",
|
||||
"checking": "正在检查 AI 数据健康…",
|
||||
"checkAgain": "重新检查",
|
||||
"checkAgainHint": "在你的编码智能体修改代码并再次运行请求后,请重新检查。",
|
||||
"unsupported": "此 OpenObserve 版本不检查 AI 数据健康。你的首个 Span 已到达,说明追踪工作正常。",
|
||||
"error": "无法运行 AI 数据健康检查。你的首个 Span 已到达,说明追踪工作正常。",
|
||||
"noGenAiSpans": "Span 已到达,但其中没有 LLM 调用,说明 LLM 客户端未埋点。请让你的编码智能体为 LLM 客户端埋点,运行一次请求,然后重新检查。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "数据源",
|
||||
@@ -12434,6 +12473,12 @@
|
||||
"helpPreviewHeading": "预览模板",
|
||||
"helpPreviewSelectPlaceholder": "选择要预览的模板",
|
||||
"helpApplyToAlert": "应用于告警",
|
||||
"helpApplyToObject": "使用此模板",
|
||||
"helpTemplateExplainObject": "模板就是要发送的消息:文本加上变量。在此选择一个模板会替换各目标自身的模板,且仅对本配置生效。",
|
||||
"helpTemplateWhenDescObject": "留空时,每个目标会使用其自身适用于此类通知的模板,否则使用内置消息。设置覆盖项可向所有适配的目标发送同一条消息。",
|
||||
"helpCurrentHeadingObject": "当前发送内容",
|
||||
"helpCurrentOverrideSome": "适配的目标使用此模板:",
|
||||
"helpCurrentResolved": "未设置覆盖项。每个目标使用:",
|
||||
"helpVariablesExplain": "变量是可插入通知消息的自定义值。在此处为每个变量指定名称和值,然后在模板任意位置写入 {'{'}your_name{'}'},告警触发时会自动填充。",
|
||||
"helpBuiltInHeading": "浏览内置变量",
|
||||
"helpBuiltInIntro": "{product} 会自动填写这些内容 — 点击一个即可复制。",
|
||||
@@ -13689,6 +13734,7 @@
|
||||
"time": "时间",
|
||||
"event": "事件",
|
||||
"destinations": "目标",
|
||||
"template": "模板",
|
||||
"result": "结果",
|
||||
"ok": "已发送",
|
||||
"pending": "发送中",
|
||||
@@ -13769,7 +13815,43 @@
|
||||
"firingFor": "已触发 {duration}",
|
||||
"incident": "事件"
|
||||
},
|
||||
"priorityUnsetPagesAs": "未设置(按 P2 呼叫)"
|
||||
"priorityUnsetPagesAs": "未设置(按 P2 呼叫)",
|
||||
"notificationKinds": {
|
||||
"alert": "告警",
|
||||
"incident": "事件",
|
||||
"anomaly": "异常",
|
||||
"synthetics": "合成监控",
|
||||
"downtime": "静默期",
|
||||
"on_call": "值班"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "模板覆盖",
|
||||
"placeholder": "使用目标的模板",
|
||||
"help": "覆盖 {kind} 消息的目标模板。无法选择预置模板;请先复制一个。",
|
||||
"empty": "暂无适用于 {kind} 的模板。",
|
||||
"create": "创建模板",
|
||||
"loadFailed": "无法加载模板",
|
||||
"forbidden": "列出模板需要模板读取权限",
|
||||
"mismatch": "不适用于您的 {count} 个目标({names});这些目标将回退到其自身的模板。",
|
||||
"groupContent": "内容",
|
||||
"groupCustom": "自定义",
|
||||
"webhookOnly": "(仅 Webhook)",
|
||||
"emailOnly": "(仅邮件)",
|
||||
"snsOnly": "(仅 SNS)",
|
||||
"stale": "模板 {name} 已不存在。请选择其他模板或清空该字段。",
|
||||
"willUse": "将使用:{template}",
|
||||
"willUsePerDestination": "按目标分别使用:",
|
||||
"willUseRow": "{destination}:{template}",
|
||||
"templateWithSource": "{name}({source})",
|
||||
"builtIn": "内置 {kind} 消息",
|
||||
"sourceExplicit": "此覆盖",
|
||||
"sourceDestination": "目标模板",
|
||||
"sourceOrgDefault": "组织默认",
|
||||
"sourceCompiled": "内置",
|
||||
"sourcePlatformResolve": "平台解析",
|
||||
"sourceLegacy": "旧版载荷",
|
||||
"sourceLegacyPayload": "该类型自身的 JSON 载荷(通用 Webhook)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "打开",
|
||||
@@ -14066,11 +14148,14 @@
|
||||
"previewFidelityEmail": "实际电子邮件是带纯文本替代格式的 HTML。两者请参阅载荷。",
|
||||
"previewFidelityWebhook": "Webhook 接收方收到的是 JSON,而不是卡片。确切内容请参阅载荷。",
|
||||
"previewFidelityMachine": "此频道由软件消费,而非人工阅读——卡片是规范化渲染。载荷显示实际发送的确切内容。",
|
||||
"playgroundLabel": "演练场",
|
||||
"playgroundHelp": "此处不会发送任何内容。",
|
||||
"previewChannel": "频道",
|
||||
"previewSeverity": "严重程度",
|
||||
"previewSeveritySingle": "单级(无级别)",
|
||||
"previewEmptyTitle": "预览将显示在此处",
|
||||
"unknownVariables": "未知变量",
|
||||
"emptyVariables": "{kind} 为空:{names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams(自适应卡片)",
|
||||
"channelTeamsMessageCard": "Teams(消息卡片)",
|
||||
@@ -14088,7 +14173,23 @@
|
||||
"testSendConfirm": "这将向所选频道发布一条真实消息,并标记为 [TEST]。",
|
||||
"testSendSuccess": "测试消息已发送",
|
||||
"testSendRateLimited": "测试发送过于频繁——请稍等片刻后重试",
|
||||
"testSendNoDestination": "请先选择目标"
|
||||
"testSendNoDestination": "请先选择目标",
|
||||
"appliesTo": "适用于",
|
||||
"appliesToAll": "所有类型",
|
||||
"appliesToAny": "任意类型",
|
||||
"allKindsNotice": "适用于所有类型的模板:{count} 个。它们的目标也会将其用于异常、合成监控、值班、静默期和事件消息。请检查。",
|
||||
"allKindsNoticeReview": "检查",
|
||||
"appliesToInferred": "根据正文中的变量推断",
|
||||
"appliesToManual": "由您选择",
|
||||
"appliesToReset": "重置为推断值",
|
||||
"previewKind": "类型",
|
||||
"previewForbidden": "您没有预览模板的权限",
|
||||
"previewFailed": "预览失败:{message}",
|
||||
"severityFailed": "失败",
|
||||
"severityDegraded": "降级",
|
||||
"severityFlaky": "不稳定",
|
||||
"severityRecovered": "已恢复",
|
||||
"variableGroupCommon": "通用"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "外部告警源",
|
||||
@@ -14218,6 +14319,11 @@
|
||||
"api_header": "Header",
|
||||
"api_header_value": "Value",
|
||||
"skip_tls_verify": "跳过 TLS 验证",
|
||||
"payloadFormat": "载荷格式",
|
||||
"payloadFormatAuto": "自动",
|
||||
"payloadFormatLegacy": "旧版 JSON",
|
||||
"payloadFormatRendered": "渲染后的模板",
|
||||
"payloadFormatHelp": "在附加模板之前,自动模式会为异常、合成监控和值班消息发送旧的 JSON 正文。存储为元数据键 payload_format。",
|
||||
"output_format": "输出格式",
|
||||
"readonly": "只读",
|
||||
"additional_settings": "其他设置",
|
||||
@@ -26138,6 +26244,7 @@
|
||||
"deliveriesNone": "尚未发送任何内容。",
|
||||
"deliveriesRun": "升级阶梯运行 {run} — 交接后由接收团队重新开始逐级升级",
|
||||
"deliveryLanded": "已发送",
|
||||
"deliveryTemplate": "模板:{templates}",
|
||||
"deliveryFailed": "失败",
|
||||
"deliveriesTruncated": "正在显示共 {total} 条发送记录中的 {shown} 条。",
|
||||
"teamChannelTitle": "团队频道",
|
||||
@@ -27541,7 +27648,8 @@
|
||||
"testPageConfirmNoChannel": "向 {names} 发送 {priority} 测试呼叫?不会升级。",
|
||||
"testPageSentOf": "已发送 {sent}/{total} 条消息 | 已发送 {sent}/{total} 条消息",
|
||||
"ladderSendTest": "发送测试",
|
||||
"scopeNotSeenYet": "尚未在你的数据中出现"
|
||||
"scopeNotSeenYet": "尚未在你的数据中出现",
|
||||
"policyMailBanner": "此版本会向以下邮箱和 SNS 目标发送值班通知:{names}。"
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "开启付费 AI 使用?",
|
||||
|
||||
@@ -2144,7 +2144,27 @@
|
||||
"view": "檢視",
|
||||
"frustration": "沮喪",
|
||||
"failedRequest": "失敗的請求",
|
||||
"noResponse": "無回應"
|
||||
"noResponse": "無回應",
|
||||
"noResponseStatus": "0 — 無回應",
|
||||
"failedRequestDetails": "失敗請求詳情",
|
||||
"browserStatus": "瀏覽器狀態",
|
||||
"serverStatus": "伺服器狀態",
|
||||
"noServerSpanFound": "找不到伺服器 Span",
|
||||
"noServerSpanHint": "缺少 Span 也可能因為取樣、擷取延遲、路由未受監測或資料保留所致。",
|
||||
"unknownNoTrace": "未知(無追蹤)",
|
||||
"unknown": "未知",
|
||||
"abortedByApp": "被應用程式中止",
|
||||
"method": "方法",
|
||||
"url": "URL",
|
||||
"duration": "持續時間",
|
||||
"timing": "時間",
|
||||
"timingDns": "DNS",
|
||||
"timingConnect": "連線",
|
||||
"timingSsl": "SSL",
|
||||
"timingFirstByte": "首位元組",
|
||||
"timingDownload": "下載",
|
||||
"size": "大小",
|
||||
"initiatedBy": "發起者"
|
||||
},
|
||||
"replayCanvasNotRecorded": "未錄製畫布內容",
|
||||
"actionOnTarget": "{action} 於「{target}」",
|
||||
@@ -2188,6 +2208,7 @@
|
||||
"pageLabel": "頁面",
|
||||
"noDeviceData": "此頁面在此裝置類型上未記錄任何點擊。",
|
||||
"noReplay": "此頁面未記錄工作階段重播,因此沒有可繪製的螢幕擷取畫面。請為應用程式開啟工作階段重播。",
|
||||
"noReplayLegacySdk": "頁面快照需要較新的 RUM SDK。此處錄製的工作階段重播來自較舊的 SDK,因此沒有可繪製的螢幕截圖。",
|
||||
"loadFailed": "無法載入點擊資料。",
|
||||
"snapshotFailed": "無法載入頁面快照。",
|
||||
"noPosition": "此頁面在此期間沒有點擊。",
|
||||
@@ -6278,6 +6299,7 @@
|
||||
"meta": "每 {seconds} 秒檢查一次 · 已開始 {elapsed}",
|
||||
"metaSince": "每 {seconds} 秒檢查一次 · 已開始 {elapsed} · 僅計入 {time} 之後的記錄",
|
||||
"hintWaiting": "第一筆記錄送達時,這裡會自動變成綠色。如果 2 分鐘內沒有資料送達,會顯示哪裡出了問題;「疑難排解」可立即檢查。",
|
||||
"hintWaitingAfter": "第一筆記錄送達後,這裡會自動變成綠色。若在 {elapsed} 內沒有收到任何資料,就會顯示問題所在;「疑難排解」會立即檢查。",
|
||||
"hintWaitingLate": "第一筆記錄送達時,這裡會自動變成綠色。檢查會在 60 分鐘後停止;若資料稍後才送達,下次造訪時首頁會通知您。",
|
||||
"hintStillChecking": "仍在每 {seconds} 秒檢查一次。資料送達時,這裡會自動變成綠色。",
|
||||
"troubleshoot": "疑難排解",
|
||||
@@ -6292,6 +6314,9 @@
|
||||
"idleMatchesConfig": "符合的串流已在接收數據。複製設定後即開始檢查。",
|
||||
"idleNew": "複製指令後,檢查就會開始。",
|
||||
"idleNewConfig": "複製設定後,檢查就會開始。",
|
||||
"idleInPrompt": "{stream} 已在接收資料。複製提示詞後就會開始檢查。",
|
||||
"idleMatchesPrompt": "相符的串流已在接收資料。複製提示詞後就會開始檢查。",
|
||||
"idleNewPrompt": "複製提示詞後就會開始檢查。",
|
||||
"checkNow": "立即檢查",
|
||||
"receivedPill": "已收到第一個事件",
|
||||
"receivedNewPill": "已收到新資料",
|
||||
@@ -6325,11 +6350,14 @@
|
||||
"fixInvalidCredentialsUnnamed": "您的傳送端使用的權杖與此組織目前的權杖不符。請再次複製命令並重新執行。",
|
||||
"fixInvalidCredentialsConfig": "您的 {tool} 設定中的密碼與組織權杖 {token} 不符。請再次複製設定並重新啟動 {tool}。",
|
||||
"fixInvalidCredentialsConfigUnnamed": "您的 {tool} 設定中的密碼與此組織目前的權杖不符。請再次複製設定並重新啟動 {tool}。",
|
||||
"fixInvalidCredentialsPrompt": "你的 .env 中的權杖與組織權杖 {token} 不符。請重新下載 .env,並請你的編碼代理重新執行此請求。",
|
||||
"fixInvalidCredentialsPromptUnnamed": "你的 .env 中的權杖與此組織目前的權杖不符。請重新下載 .env,並請你的編碼代理重新執行此請求。",
|
||||
"fixMalformedBody": "請求主體不是此端點接受的格式。請檢查承載資料格式,然後再次傳送。",
|
||||
"fixBatchTooLarge": "批次大於此端點可接受的大小。請降低批次大小,然後再次傳送。",
|
||||
"fixRateOrQuota": "請求超出速率或配額限制。請等待一分鐘讓其通過,或檢查方案。",
|
||||
"copyCommand": "複製命令",
|
||||
"copyConfig": "複製設定",
|
||||
"copyPrompt": "複製提示詞",
|
||||
"rightPlace": "要傳送到正確的位置嗎?{org} 位於 {region}:{endpoint}",
|
||||
"noRequestsPill": "尚未有任何資料送達",
|
||||
"noRequestsSummary": "在 {region} 的 {org} 中,{window}沒有收到任何資料,且沒有請求遭拒。",
|
||||
@@ -6498,7 +6526,18 @@
|
||||
"envButton": "下載 .env",
|
||||
"promptTitle": "將此內容貼到 {client1}、{client2} 或 {client3}",
|
||||
"promptLabel": "提示詞",
|
||||
"promptCopied": "已複製提示詞"
|
||||
"promptCopied": "已複製提示詞",
|
||||
"health": {
|
||||
"title": "AI 資料健康狀態",
|
||||
"scopeAgent": "自檢查開始以來,{stream} 中來自代理 {agent} 的 Span",
|
||||
"scopeStream": "自檢查開始以來,{stream} 中的 Span",
|
||||
"checking": "正在檢查 AI 資料健康狀態…",
|
||||
"checkAgain": "再次檢查",
|
||||
"checkAgainHint": "在你的編碼代理變更程式碼並執行另一個請求後,請再次檢查。",
|
||||
"unsupported": "此 OpenObserve 版本不會檢查 AI 資料健康狀態。你的第一個 Span 已送達,因此追蹤功能正常。",
|
||||
"error": "無法執行 AI 資料健康狀態檢查。你的第一個 Span 已送達,因此追蹤功能正常。",
|
||||
"noGenAiSpans": "Span 已送達,但沒有任何一筆是 LLM 呼叫,表示 LLM 用戶端未加入監測。請你的編碼代理為 LLM 用戶端加入監測、執行請求,然後再次檢查。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": "資料來源",
|
||||
@@ -12429,6 +12468,12 @@
|
||||
"helpPreviewHeading": "預覽範本",
|
||||
"helpPreviewSelectPlaceholder": "選取要預覽的範本",
|
||||
"helpApplyToAlert": "套用至警示",
|
||||
"helpApplyToObject": "使用此範本",
|
||||
"helpTemplateExplainObject": "範本是實際傳送的訊息:文字加上變數。在此處選擇範本,只會取代此設定中各個目標自己的範本。",
|
||||
"helpTemplateWhenDescObject": "留空時,每個目標會在其範本適用於此類型時使用該範本,否則使用內建訊息。設定覆寫後,會將同一則訊息傳送給所有符合的目標。",
|
||||
"helpCurrentHeadingObject": "目前會傳送的內容",
|
||||
"helpCurrentOverrideSome": "符合的目標會使用此範本:",
|
||||
"helpCurrentResolved": "未設定覆寫。每個目標會使用:",
|
||||
"helpVariablesExplain": "變數是您可以放入通知訊息中的自有值。在此處為每個變數指定名稱和值,然後在範本中的任何位置寫入 {'{'}your_name{'}'} — 它會在警示觸發時填入。",
|
||||
"helpBuiltInHeading": "瀏覽內建變數",
|
||||
"helpBuiltInIntro": "{product} 會自動填入這些內容 — 按一下即可複製。",
|
||||
@@ -13684,6 +13729,7 @@
|
||||
"time": "時間",
|
||||
"event": "事件",
|
||||
"destinations": "目標",
|
||||
"template": "範本",
|
||||
"result": "結果",
|
||||
"ok": "已傳送",
|
||||
"pending": "傳送中",
|
||||
@@ -13764,7 +13810,43 @@
|
||||
"firingFor": "已觸發 {duration}",
|
||||
"incident": "事件"
|
||||
},
|
||||
"priorityUnsetPagesAs": "未設定(以 P2 呼叫)"
|
||||
"priorityUnsetPagesAs": "未設定(以 P2 呼叫)",
|
||||
"notificationKinds": {
|
||||
"alert": "警示",
|
||||
"incident": "事件",
|
||||
"anomaly": "異常",
|
||||
"synthetics": "合成監控",
|
||||
"downtime": "停機時段",
|
||||
"on_call": "值班"
|
||||
},
|
||||
"templateOverride": {
|
||||
"label": "範本覆寫",
|
||||
"placeholder": "使用目標的範本",
|
||||
"help": "覆寫 {kind} 訊息的目標範本。無法選擇預建範本;請先複製一個。",
|
||||
"empty": "尚無適用於 {kind} 的範本。",
|
||||
"create": "建立範本",
|
||||
"loadFailed": "無法載入範本",
|
||||
"forbidden": "列出範本需要範本的讀取權限",
|
||||
"mismatch": "不適用於您的 {count} 個目標({names});這些目標會改用各自的範本。",
|
||||
"groupContent": "內容",
|
||||
"groupCustom": "自訂",
|
||||
"webhookOnly": "(僅限 Webhook)",
|
||||
"emailOnly": "(僅限電子郵件)",
|
||||
"snsOnly": "(僅限 SNS)",
|
||||
"stale": "範本 {name} 已不存在。請選擇其他範本,或清除此欄位。",
|
||||
"willUse": "將使用:{template}",
|
||||
"willUsePerDestination": "各目標將使用:",
|
||||
"willUseRow": "{destination}:{template}",
|
||||
"templateWithSource": "{name}({source})",
|
||||
"builtIn": "內建 {kind} 訊息",
|
||||
"sourceExplicit": "此覆寫",
|
||||
"sourceDestination": "目標範本",
|
||||
"sourceOrgDefault": "組織預設",
|
||||
"sourceCompiled": "內建",
|
||||
"sourcePlatformResolve": "平台解析",
|
||||
"sourceLegacy": "舊版承載內容",
|
||||
"sourceLegacyPayload": "該類型本身的 JSON 承載內容(一般 Webhook)"
|
||||
}
|
||||
},
|
||||
"alert_dependencies": {
|
||||
"actionOpen": "開啟",
|
||||
@@ -14061,11 +14143,14 @@
|
||||
"previewFidelityEmail": "實際的電子郵件是 HTML,並提供純文字替代版本。請參閱酬載以了解兩者。",
|
||||
"previewFidelityWebhook": "Webhook 接收端收到的是 JSON,而非卡片。請參閱酬載以了解確切的內文。",
|
||||
"previewFidelityMachine": "此頻道由軟體使用,而非人工閱讀——卡片是標準化的呈現方式。酬載會顯示實際傳送的內文。",
|
||||
"playgroundLabel": "測試區",
|
||||
"playgroundHelp": "此處不會傳送任何內容。",
|
||||
"previewChannel": "頻道",
|
||||
"previewSeverity": "嚴重性",
|
||||
"previewSeveritySingle": "單一層級(無層級)",
|
||||
"previewEmptyTitle": "預覽將顯示在此處",
|
||||
"unknownVariables": "未知變數",
|
||||
"emptyVariables": "在 {kind} 中為空:{names}",
|
||||
"channelSlack": "Slack",
|
||||
"channelTeamsAdaptiveCard": "Teams(Adaptive Card)",
|
||||
"channelTeamsMessageCard": "Teams(MessageCard)",
|
||||
@@ -14083,7 +14168,23 @@
|
||||
"testSendConfirm": "這會將真實訊息發佈到所選頻道,並標記為 [TEST]。",
|
||||
"testSendSuccess": "測試訊息已傳送",
|
||||
"testSendRateLimited": "傳送測試次數過多——請稍候片刻再試",
|
||||
"testSendNoDestination": "請先選擇目標"
|
||||
"testSendNoDestination": "請先選擇目標",
|
||||
"appliesTo": "適用於",
|
||||
"appliesToAll": "所有類型",
|
||||
"appliesToAny": "任何類型",
|
||||
"allKindsNotice": "適用於所有類型的範本:{count} 個。其目標也會將這些範本用於異常、合成監控、值班、停機時段與事件訊息。請檢閱。",
|
||||
"allKindsNoticeReview": "檢閱",
|
||||
"appliesToInferred": "由內文中的變數推斷",
|
||||
"appliesToManual": "由您選擇",
|
||||
"appliesToReset": "重設為推斷結果",
|
||||
"previewKind": "類型",
|
||||
"previewForbidden": "您沒有預覽範本的權限",
|
||||
"previewFailed": "預覽失敗:{message}",
|
||||
"severityFailed": "失敗",
|
||||
"severityDegraded": "降級",
|
||||
"severityFlaky": "不穩定",
|
||||
"severityRecovered": "已恢復",
|
||||
"variableGroupCommon": "通用"
|
||||
},
|
||||
"alert_sources": {
|
||||
"header": "外部警示來源",
|
||||
@@ -14213,6 +14314,11 @@
|
||||
"api_header": "標頭",
|
||||
"api_header_value": "值",
|
||||
"skip_tls_verify": "略過 TLS 驗證",
|
||||
"payloadFormat": "承載格式",
|
||||
"payloadFormatAuto": "自動",
|
||||
"payloadFormatLegacy": "舊版 JSON",
|
||||
"payloadFormatRendered": "轉譯後的範本",
|
||||
"payloadFormatHelp": "在附加範本之前,自動模式會為異常、合成監控與值班訊息傳送舊版 JSON 內文。此設定會儲存為中繼資料鍵 payload_format。",
|
||||
"output_format": "輸出格式",
|
||||
"readonly": "唯讀",
|
||||
"additional_settings": "額外設定",
|
||||
@@ -26133,6 +26239,7 @@
|
||||
"deliveriesNone": "尚未傳送任何項目。",
|
||||
"deliveriesRun": "階梯執行 {run} — 因交接,接收團隊重新開始逐層通知。",
|
||||
"deliveryLanded": "已送出",
|
||||
"deliveryTemplate": "範本:{templates}",
|
||||
"deliveryFailed": "失敗",
|
||||
"deliveriesTruncated": "顯示 {shown} / {total} 次傳送。",
|
||||
"teamChannelTitle": "團隊頻道",
|
||||
@@ -27536,7 +27643,8 @@
|
||||
"testPageConfirmNoChannel": "向 {names} 傳送 {priority} 測試呼叫?不會升級。",
|
||||
"testPageSentOf": "已傳送 {sent}/{total} 則訊息 | 已傳送 {sent}/{total} 則訊息",
|
||||
"ladderSendTest": "傳送測試",
|
||||
"scopeNotSeenYet": "尚未在你的資料中出現"
|
||||
"scopeNotSeenYet": "尚未在你的資料中出現",
|
||||
"policyMailBanner": "電子郵件與 SNS 目標會從此版本接收值班通知:{names}。"
|
||||
},
|
||||
"paidUsage": {
|
||||
"consentTitle": "要開啟付費 AI 使用嗎?",
|
||||
|
||||
@@ -122,6 +122,7 @@ describe("AppAnalytics shell", () => {
|
||||
replaceSpy = vi.spyOn(router, "replace");
|
||||
setSavedDateSpy = vi.fn();
|
||||
wrapper = mount(keepAlive ? KeptAliveRoot : { template: "<router-view />" }, {
|
||||
attachTo: document.body,
|
||||
global: {
|
||||
plugins: [router, store],
|
||||
stubs: {
|
||||
@@ -133,7 +134,6 @@ describe("AppAnalytics shell", () => {
|
||||
ShareButton: { template: "<button data-test='share-stub' />", props: ["url"] },
|
||||
},
|
||||
},
|
||||
attachTo: document.body,
|
||||
});
|
||||
await flushPromises();
|
||||
await flushPromises();
|
||||
@@ -164,7 +164,13 @@ describe("AppAnalytics shell", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
const defaultWidth = window.innerWidth;
|
||||
beforeEach(() => {
|
||||
window.innerWidth = 1600;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
window.innerWidth = defaultWidth;
|
||||
wrapper?.unmount();
|
||||
wrapper = null;
|
||||
document.body.innerHTML = "";
|
||||
@@ -431,6 +437,86 @@ describe("AppAnalytics shell", () => {
|
||||
expect(router.currentRoute.value.query.period).toBe("7d");
|
||||
});
|
||||
|
||||
describe("header filters by page width (#3268)", () => {
|
||||
const FILTER = '[data-test="rum-analytics-app-select"], [data-test="rum-analytics-app-label"]';
|
||||
|
||||
it("keeps the filters inline in the header actions on a wide page, with no band", async () => {
|
||||
await mountAt("/product-analytics/overview?app=web&period=7d");
|
||||
const header = wrapper!.find(".app-page-header");
|
||||
const host = header.find('[data-test="rum-analytics-filters"]');
|
||||
expect(host.classes()).toContain("contents");
|
||||
expect(host.find(FILTER).exists()).toBe(true);
|
||||
});
|
||||
|
||||
it("renders the filters as a wrapping band in the body on a narrow page, none in the header", async () => {
|
||||
window.innerWidth = 1000;
|
||||
await mountAt("/product-analytics/overview?app=web&period=7d");
|
||||
const band = wrapper!.find('[data-test="rum-analytics-filters"]');
|
||||
expect(band.classes()).toContain("flex-wrap");
|
||||
expect(band.find(FILTER).exists()).toBe(true);
|
||||
const header = wrapper!.find(".app-page-header");
|
||||
expect(header.find(FILTER).exists()).toBe(false);
|
||||
expect(header.find('[data-test="rum-analytics-date-picker"]').exists()).toBe(true);
|
||||
expect(wrapper!.findAll(FILTER)).toHaveLength(1);
|
||||
});
|
||||
|
||||
it("hides the band on a narrow page when there is nothing to filter", async () => {
|
||||
window.innerWidth = 1000;
|
||||
usePerformance().performanceState.data.streams._rumdata = { name: "_rumdata", schema: {} };
|
||||
respond([[/AS app, COUNT/, []]]);
|
||||
await mountAt("/product-analytics/overview");
|
||||
const band = wrapper!.find('[data-test="rum-analytics-filters"]');
|
||||
expect(band.element.childElementCount).toBe(0);
|
||||
expect(band.classes()).toContain("empty:hidden");
|
||||
});
|
||||
|
||||
it("follows the page container width, keeps the same filter nodes across the cutoff and ignores a zero width", async () => {
|
||||
let width = 1500;
|
||||
const observers: ((entries: unknown[]) => void)[] = [];
|
||||
const notify = () => observers.forEach((cb) => cb([]));
|
||||
const page = {
|
||||
get clientWidth() {
|
||||
return width;
|
||||
},
|
||||
};
|
||||
const originalRO = globalThis.ResizeObserver;
|
||||
globalThis.ResizeObserver = class {
|
||||
constructor(cb: (entries: unknown[]) => void) {
|
||||
observers.push(cb);
|
||||
}
|
||||
observe() {}
|
||||
disconnect() {}
|
||||
} as never;
|
||||
const closest = vi
|
||||
.spyOn(HTMLElement.prototype, "closest")
|
||||
.mockImplementation(((sel: string) =>
|
||||
String(sel).includes("@container/page") ? page : null) as never);
|
||||
try {
|
||||
await mountAt("/product-analytics/overview?app=web&period=7d");
|
||||
const header = () => wrapper!.find(".app-page-header");
|
||||
const node = wrapper!.find(FILTER).element;
|
||||
expect(header().find(FILTER).exists()).toBe(true);
|
||||
width = 1100;
|
||||
notify();
|
||||
await flushPromises();
|
||||
expect(header().find(FILTER).exists()).toBe(false);
|
||||
expect(wrapper!.find(FILTER).element).toBe(node);
|
||||
width = 0;
|
||||
notify();
|
||||
await flushPromises();
|
||||
expect(header().find(FILTER).exists()).toBe(false);
|
||||
width = 1500;
|
||||
notify();
|
||||
await flushPromises();
|
||||
expect(header().find(FILTER).exists()).toBe(true);
|
||||
expect(wrapper!.find(FILTER).element).toBe(node);
|
||||
} finally {
|
||||
closest.mockRestore();
|
||||
globalThis.ResizeObserver = originalRO;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it("states data through on the refresh tooltip and the SDK sampling caveat beside the title (AC-54)", async () => {
|
||||
await mountAt("/product-analytics/overview?app=web&period=7d");
|
||||
expect(wrapper!.find('[data-test="rum-analytics-trust-caption"]').exists()).toBe(false);
|
||||
|
||||
+253
-211
@@ -16,6 +16,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
<template>
|
||||
<OPageLayout
|
||||
ref="layoutRef"
|
||||
:key="org"
|
||||
data-test="rum-analytics-page"
|
||||
:subtitle="t('rum.analytics.subtitle')"
|
||||
@@ -48,116 +49,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</span>
|
||||
</template>
|
||||
<template #actions>
|
||||
<OSelect
|
||||
v-if="appOptions.length > 1"
|
||||
:model-value="[state.app, ...(pa.scope.value.apps ?? [])]"
|
||||
:options="appOptions"
|
||||
size="sm"
|
||||
searchable
|
||||
multiple
|
||||
row-click-single-select
|
||||
class="w-48 max-md:w-36"
|
||||
data-test="rum-analytics-app-select"
|
||||
@update:model-value="onAppsChange"
|
||||
/>
|
||||
<OTag
|
||||
v-else-if="state.app"
|
||||
:label="raw(state.app)"
|
||||
variant="default-outline"
|
||||
size="md"
|
||||
data-test="rum-analytics-app-label"
|
||||
/>
|
||||
<OSelect
|
||||
v-if="envOptions.length"
|
||||
:model-value="state.env"
|
||||
:options="envSelectOptions"
|
||||
:placeholder="t('rum.analytics.allEnvs')"
|
||||
multiple
|
||||
size="sm"
|
||||
class="w-36 max-md:hidden"
|
||||
data-test="rum-analytics-env-select"
|
||||
@update:model-value="onEnvChange"
|
||||
/>
|
||||
<OSelect
|
||||
v-if="versionOptions.length"
|
||||
:model-value="state.version"
|
||||
:options="versionSelectOptions"
|
||||
:placeholder="t('rum.analytics.allVersions')"
|
||||
multiple
|
||||
size="sm"
|
||||
class="w-36 max-md:hidden"
|
||||
data-test="rum-analytics-version-select"
|
||||
@update:model-value="onVersionChange"
|
||||
/>
|
||||
<OPopover
|
||||
v-if="identityNote"
|
||||
v-model:open="identityOpen"
|
||||
side="bottom"
|
||||
align="end"
|
||||
content-class="p-3 w-80"
|
||||
>
|
||||
<template #trigger>
|
||||
<OTag
|
||||
:label="
|
||||
state.includeAllIdentities
|
||||
? t('rum.analytics.identityIncluded')
|
||||
: t(
|
||||
'rum.analytics.identityExcluded',
|
||||
{ count: identityNote.count, pct: sharePct },
|
||||
identityNote.count,
|
||||
)
|
||||
"
|
||||
variant="warning-soft"
|
||||
size="md"
|
||||
clickable
|
||||
data-test="rum-analytics-identity-note"
|
||||
/>
|
||||
</template>
|
||||
<div class="flex flex-col gap-2 text-sm">
|
||||
<p class="text-text-body" data-test="rum-analytics-identity-help">
|
||||
{{ identityHelp }}
|
||||
</p>
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="sm"
|
||||
data-test="rum-analytics-identity-include-btn"
|
||||
@click="toggleIncludeAll"
|
||||
>{{
|
||||
state.includeAllIdentities
|
||||
? t("rum.analytics.excludeAgain")
|
||||
: t("rum.analytics.includeIt")
|
||||
}}</OButton
|
||||
>
|
||||
</div>
|
||||
</OPopover>
|
||||
<OButton
|
||||
v-if="exclusionCount !== null"
|
||||
variant="outline"
|
||||
size="sm"
|
||||
:icon-left="likelyBot ? 'warning' : 'filter-alt'"
|
||||
data-test="rum-analytics-exclusions-chip"
|
||||
@click="exclusionsOpen = true"
|
||||
>{{
|
||||
likelyBot
|
||||
? t("rum.analytics.exclusions.chipLikelyBot", { count: exclusionCount })
|
||||
: t("rum.analytics.exclusions.chip", { count: exclusionCount })
|
||||
}}</OButton
|
||||
>
|
||||
<OButton
|
||||
v-if="showNewUsers"
|
||||
variant="outline"
|
||||
size="sm"
|
||||
:active="state.newUsers"
|
||||
:aria-pressed="state.newUsers"
|
||||
:disabled="newUsersDisabled"
|
||||
focusable-unavailable
|
||||
data-test="rum-analytics-new-users-chip"
|
||||
@click="toggleNewUsers"
|
||||
>{{ t("rum.analytics.exclusions.newUsersOnly")
|
||||
}}<OTooltip
|
||||
v-if="newUsersDisabled"
|
||||
:content="t('rum.analytics.exclusions.newUsersSessionsTip')"
|
||||
/></OButton>
|
||||
<span id="rum-analytics-filters-host" class="contents" />
|
||||
<DateTimePickerDashboard
|
||||
ref="dateTimePickerRef"
|
||||
:model-value="state.datetime"
|
||||
@@ -221,115 +113,242 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
</template>
|
||||
|
||||
<div v-if="noRumData" class="flex h-full min-h-0 flex-col" data-test="rum-analytics-no-data">
|
||||
<RumNoDataState />
|
||||
</div>
|
||||
<div v-else class="flex h-full min-h-0 flex-col">
|
||||
<OBanner
|
||||
v-if="invalidParams.length && !invalidDismissed"
|
||||
variant="warning"
|
||||
dense
|
||||
class="mx-page-edge mt-2"
|
||||
:content="t('rum.analytics.invalidLink')"
|
||||
data-test="rum-analytics-invalid-link"
|
||||
>
|
||||
<template #actions>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
<div class="flex h-full min-h-0 flex-col">
|
||||
<!-- Teleport moves the same filter instances between the header and the sub-nav, so they never remount. -->
|
||||
<Teleport to="#rum-analytics-filters-host" defer :disabled="narrow">
|
||||
<div
|
||||
:class="
|
||||
narrow
|
||||
? 'px-page-edge border-border-default flex flex-wrap items-center gap-2 border-b py-2 empty:hidden'
|
||||
: 'contents'
|
||||
"
|
||||
data-test="rum-analytics-filters"
|
||||
>
|
||||
<OSelect
|
||||
v-if="appOptions.length > 1"
|
||||
:model-value="[state.app, ...(pa.scope.value.apps ?? [])]"
|
||||
:options="appOptions"
|
||||
size="sm"
|
||||
data-test="rum-analytics-invalid-link-dismiss"
|
||||
@click="invalidDismissed = true"
|
||||
>{{ t("rum.analytics.dismiss") }}</OButton
|
||||
searchable
|
||||
:width="narrow ? 'sm' : undefined"
|
||||
multiple
|
||||
row-click-single-select
|
||||
class="w-48 max-md:w-36"
|
||||
data-test="rum-analytics-app-select"
|
||||
@update:model-value="onAppsChange"
|
||||
/>
|
||||
<OTag
|
||||
v-else-if="state.app"
|
||||
:label="raw(state.app)"
|
||||
variant="default-outline"
|
||||
size="md"
|
||||
data-test="rum-analytics-app-label"
|
||||
/>
|
||||
<OSelect
|
||||
v-if="envOptions.length"
|
||||
:model-value="state.env"
|
||||
:options="envSelectOptions"
|
||||
:placeholder="t('rum.analytics.allEnvs')"
|
||||
multiple
|
||||
size="sm"
|
||||
:width="narrow ? 'sm' : undefined"
|
||||
class="w-36 max-md:hidden"
|
||||
data-test="rum-analytics-env-select"
|
||||
@update:model-value="onEnvChange"
|
||||
/>
|
||||
<OSelect
|
||||
v-if="versionOptions.length"
|
||||
:model-value="state.version"
|
||||
:options="versionSelectOptions"
|
||||
:placeholder="t('rum.analytics.allVersions')"
|
||||
multiple
|
||||
size="sm"
|
||||
:width="narrow ? 'sm' : undefined"
|
||||
class="w-36 max-md:hidden"
|
||||
data-test="rum-analytics-version-select"
|
||||
@update:model-value="onVersionChange"
|
||||
/>
|
||||
<OPopover
|
||||
v-if="identityNote"
|
||||
v-model:open="identityOpen"
|
||||
side="bottom"
|
||||
:align="narrow ? 'start' : 'end'"
|
||||
content-class="p-3 w-80"
|
||||
>
|
||||
</template>
|
||||
</OBanner>
|
||||
|
||||
<OBanner
|
||||
v-if="deletedEventLink"
|
||||
variant="info"
|
||||
dense
|
||||
class="mx-page-edge mt-2"
|
||||
:content="t('rum.analytics.events.deletedNotice')"
|
||||
data-test="rum-analytics-deleted-event-link"
|
||||
/>
|
||||
|
||||
<OBanner
|
||||
v-if="state.includeExcluded"
|
||||
variant="warning"
|
||||
dense
|
||||
class="mx-page-edge mt-2"
|
||||
:content="includedBanner"
|
||||
data-test="rum-analytics-included-banner"
|
||||
>
|
||||
<template #actions>
|
||||
<template #trigger>
|
||||
<OTag
|
||||
:label="
|
||||
state.includeAllIdentities
|
||||
? t('rum.analytics.identityIncluded')
|
||||
: t(
|
||||
'rum.analytics.identityExcluded',
|
||||
{ count: identityNote.count, pct: sharePct },
|
||||
identityNote.count,
|
||||
)
|
||||
"
|
||||
variant="warning-soft"
|
||||
size="md"
|
||||
clickable
|
||||
data-test="rum-analytics-identity-note"
|
||||
/>
|
||||
</template>
|
||||
<div class="flex flex-col gap-2 text-sm">
|
||||
<p class="text-text-body" data-test="rum-analytics-identity-help">
|
||||
{{ identityHelp }}
|
||||
</p>
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="sm"
|
||||
data-test="rum-analytics-identity-include-btn"
|
||||
@click="toggleIncludeAll"
|
||||
>{{
|
||||
state.includeAllIdentities
|
||||
? t("rum.analytics.excludeAgain")
|
||||
: t("rum.analytics.includeIt")
|
||||
}}</OButton
|
||||
>
|
||||
</div>
|
||||
</OPopover>
|
||||
<OButton
|
||||
v-if="appFilters.hiddenFailed.value"
|
||||
variant="ghost"
|
||||
v-if="exclusionCount !== null"
|
||||
variant="outline"
|
||||
size="sm"
|
||||
data-test="rum-analytics-hidden-count-retry-btn"
|
||||
@click="appFilters.retryHidden()"
|
||||
>{{ t("common.retry") }}</OButton
|
||||
:icon-left="likelyBot ? 'warning' : 'filter-alt'"
|
||||
data-test="rum-analytics-exclusions-chip"
|
||||
@click="exclusionsOpen = true"
|
||||
>{{
|
||||
likelyBot
|
||||
? t("rum.analytics.exclusions.chipLikelyBot", { count: exclusionCount })
|
||||
: t("rum.analytics.exclusions.chip", { count: exclusionCount })
|
||||
}}</OButton
|
||||
>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
v-if="showNewUsers"
|
||||
variant="outline"
|
||||
size="sm"
|
||||
data-test="rum-analytics-hide-hidden-btn"
|
||||
@click="appFilters.setIncludeHidden(router, false)"
|
||||
>{{ t("rum.analytics.appFilters.hideHidden") }}</OButton
|
||||
>
|
||||
</template>
|
||||
</OBanner>
|
||||
|
||||
<div class="border-border-default pe-page-edge flex shrink-0 items-center gap-2 border-b">
|
||||
<!-- Sub-tab navigation stays live on a license-locked page. -->
|
||||
<FeatureLockExempt class="contents">
|
||||
<OTabs
|
||||
:model-value="activeSubTab"
|
||||
align="left"
|
||||
dense
|
||||
class="min-w-0 flex-1"
|
||||
@update:model-value="onSubTabChange"
|
||||
>
|
||||
<OTab
|
||||
v-for="tab in subTabs"
|
||||
:key="tab.value"
|
||||
:name="tab.value"
|
||||
:label="tab.label"
|
||||
:data-test="`rum-analytics-subtab-${tab.value}`"
|
||||
/>
|
||||
</OTabs>
|
||||
</FeatureLockExempt>
|
||||
<SampledTag
|
||||
v-if="showSampledTag"
|
||||
:ratio="sampleRatio"
|
||||
:va-rows="summary?.vaRows ?? 0"
|
||||
:exact="state.exact"
|
||||
@update:exact="onExactChange"
|
||||
/>
|
||||
:active="state.newUsers"
|
||||
:aria-pressed="state.newUsers"
|
||||
:disabled="newUsersDisabled"
|
||||
focusable-unavailable
|
||||
data-test="rum-analytics-new-users-chip"
|
||||
@click="toggleNewUsers"
|
||||
>{{ t("rum.analytics.exclusions.newUsersOnly")
|
||||
}}<OTooltip
|
||||
v-if="newUsersDisabled"
|
||||
:content="t('rum.analytics.exclusions.newUsersSessionsTip')"
|
||||
/></OButton>
|
||||
</div>
|
||||
</Teleport>
|
||||
<div v-if="noRumData" class="flex min-h-0 flex-1 flex-col" data-test="rum-analytics-no-data">
|
||||
<RumNoDataState />
|
||||
</div>
|
||||
<div v-else class="flex min-h-0 flex-1 flex-col">
|
||||
<OBanner
|
||||
v-if="invalidParams.length && !invalidDismissed"
|
||||
variant="warning"
|
||||
dense
|
||||
class="mx-page-edge mt-2"
|
||||
:content="t('rum.analytics.invalidLink')"
|
||||
data-test="rum-analytics-invalid-link"
|
||||
>
|
||||
<template #actions>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
data-test="rum-analytics-invalid-link-dismiss"
|
||||
@click="invalidDismissed = true"
|
||||
>{{ t("rum.analytics.dismiss") }}</OButton
|
||||
>
|
||||
</template>
|
||||
</OBanner>
|
||||
|
||||
<OEmptyState
|
||||
v-if="scopeStatus === 'forbidden'"
|
||||
preset="no-access"
|
||||
data-test="rum-analytics-no-access"
|
||||
/>
|
||||
<AnalyticsPanelState
|
||||
v-else-if="scopeStatus === 'error'"
|
||||
:state="scopePanel"
|
||||
data-test="rum-analytics-scope"
|
||||
class="px-page-edge py-4"
|
||||
@retry="refresh"
|
||||
/>
|
||||
<div v-else class="min-h-0 flex-1 overflow-auto">
|
||||
<router-view v-slot="{ Component }">
|
||||
<keep-alive :include="SUBTAB_VIEWS">
|
||||
<component
|
||||
:is="Component"
|
||||
@open-exclusions="exclusionsOpen = true"
|
||||
@likely-bot="(v: boolean) => (likelyBot = v)"
|
||||
/>
|
||||
</keep-alive>
|
||||
</router-view>
|
||||
<OBanner
|
||||
v-if="deletedEventLink"
|
||||
variant="info"
|
||||
dense
|
||||
class="mx-page-edge mt-2"
|
||||
:content="t('rum.analytics.events.deletedNotice')"
|
||||
data-test="rum-analytics-deleted-event-link"
|
||||
/>
|
||||
|
||||
<OBanner
|
||||
v-if="state.includeExcluded"
|
||||
variant="warning"
|
||||
dense
|
||||
class="mx-page-edge mt-2"
|
||||
:content="includedBanner"
|
||||
data-test="rum-analytics-included-banner"
|
||||
>
|
||||
<template #actions>
|
||||
<OButton
|
||||
v-if="appFilters.hiddenFailed.value"
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
data-test="rum-analytics-hidden-count-retry-btn"
|
||||
@click="appFilters.retryHidden()"
|
||||
>{{ t("common.retry") }}</OButton
|
||||
>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
data-test="rum-analytics-hide-hidden-btn"
|
||||
@click="appFilters.setIncludeHidden(router, false)"
|
||||
>{{ t("rum.analytics.appFilters.hideHidden") }}</OButton
|
||||
>
|
||||
</template>
|
||||
</OBanner>
|
||||
|
||||
<div class="border-border-default pe-page-edge flex shrink-0 items-center gap-2 border-b">
|
||||
<!-- Sub-tab navigation stays live on a license-locked page. -->
|
||||
<FeatureLockExempt class="contents">
|
||||
<OTabs
|
||||
:model-value="activeSubTab"
|
||||
align="left"
|
||||
dense
|
||||
class="min-w-0 flex-1"
|
||||
@update:model-value="onSubTabChange"
|
||||
>
|
||||
<OTab
|
||||
v-for="tab in subTabs"
|
||||
:key="tab.value"
|
||||
:name="tab.value"
|
||||
:label="tab.label"
|
||||
:data-test="`rum-analytics-subtab-${tab.value}`"
|
||||
/>
|
||||
</OTabs>
|
||||
</FeatureLockExempt>
|
||||
<SampledTag
|
||||
v-if="showSampledTag"
|
||||
:ratio="sampleRatio"
|
||||
:va-rows="summary?.vaRows ?? 0"
|
||||
:exact="state.exact"
|
||||
@update:exact="onExactChange"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<OEmptyState
|
||||
v-if="scopeStatus === 'forbidden'"
|
||||
preset="no-access"
|
||||
data-test="rum-analytics-no-access"
|
||||
/>
|
||||
<AnalyticsPanelState
|
||||
v-else-if="scopeStatus === 'error'"
|
||||
:state="scopePanel"
|
||||
data-test="rum-analytics-scope"
|
||||
class="px-page-edge py-4"
|
||||
@retry="refresh"
|
||||
/>
|
||||
<div v-else class="min-h-0 flex-1 overflow-auto">
|
||||
<router-view v-slot="{ Component }">
|
||||
<keep-alive :include="SUBTAB_VIEWS">
|
||||
<component
|
||||
:is="Component"
|
||||
@open-exclusions="exclusionsOpen = true"
|
||||
@likely-bot="(v: boolean) => (likelyBot = v)"
|
||||
/>
|
||||
</keep-alive>
|
||||
</router-view>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<ExclusionsDrawer v-model:open="exclusionsOpen" />
|
||||
@@ -342,7 +361,7 @@ let enteredOrg = "";
|
||||
</script>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, onActivated, onDeactivated, onMounted, ref, watch } from "vue";
|
||||
import { computed, onActivated, onBeforeUnmount, onDeactivated, onMounted, ref, watch } from "vue";
|
||||
import { useRoute, useRouter } from "vue-router";
|
||||
import { useStore } from "vuex";
|
||||
import { formatInTimeZone } from "date-fns-tz";
|
||||
@@ -437,6 +456,29 @@ const dateTimePickerRef = ref<any>(null);
|
||||
const exclusionsOpen = ref(false);
|
||||
const likelyBot = ref(false);
|
||||
|
||||
// Page container width below which the filters no longer fit beside the title and actions.
|
||||
const WIDE_PAGE_REM = 75;
|
||||
const layoutRef = ref<{ $el: HTMLElement } | null>(null);
|
||||
const pageWidth = ref(window.innerWidth);
|
||||
let pageObserver: ResizeObserver | null = null;
|
||||
onMounted(() => {
|
||||
const page = layoutRef.value?.$el?.closest<HTMLElement>('[class~="@container/page"]');
|
||||
if (!page || typeof ResizeObserver === "undefined") return;
|
||||
const measure = () => {
|
||||
// A zero width means the page is hidden (kept alive), not narrow.
|
||||
if (page.clientWidth) pageWidth.value = page.clientWidth;
|
||||
};
|
||||
measure();
|
||||
pageObserver = new ResizeObserver(measure);
|
||||
pageObserver.observe(page);
|
||||
});
|
||||
onBeforeUnmount(() => pageObserver?.disconnect());
|
||||
const narrow = computed(
|
||||
() =>
|
||||
pageWidth.value <
|
||||
WIDE_PAGE_REM * (parseFloat(getComputedStyle(document.documentElement).fontSize) || 16),
|
||||
);
|
||||
|
||||
const org = computed(() => store.state.selectedOrganization?.identifier ?? "");
|
||||
|
||||
const subTabs = computed(() => [
|
||||
|
||||
@@ -412,6 +412,44 @@ describe("AppSessions.vue", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("falls back to the _rumdata timestamps for a session without replay", () => {
|
||||
const pushSpy = vi.spyOn(router, "push");
|
||||
|
||||
wrapper.vm.handleCellClick({
|
||||
columnName: "action_play",
|
||||
row: {
|
||||
session_id: "session-no-replay",
|
||||
zo_sql_timestamp: 1672531000000000,
|
||||
zo_sql_end_timestamp: 1672531300000000,
|
||||
},
|
||||
});
|
||||
|
||||
const query = pushSpy.mock.calls.at(-1)![0].query;
|
||||
expect(query).toEqual({ start_time: 1672531000000000, end_time: 1672531300000000 });
|
||||
});
|
||||
|
||||
it("never pushes NaN when a session has no usable time at all", () => {
|
||||
const pushSpy = vi.spyOn(router, "push");
|
||||
|
||||
wrapper.vm.handleCellClick({
|
||||
columnName: "action_play",
|
||||
row: { session_id: "session-bare" },
|
||||
});
|
||||
|
||||
const query = pushSpy.mock.calls.at(-1)![0].query;
|
||||
expect(query).toEqual({});
|
||||
});
|
||||
|
||||
it("computes the heatmap start from the _rumdata timestamp when there is no replay start", () => {
|
||||
expect(wrapper.vm.sessionStartUs({ zo_sql_timestamp: 1672531000000000 })).toBe(
|
||||
1672531000000000,
|
||||
);
|
||||
expect(wrapper.vm.sessionStartUs({ start_time: 1672531000, zo_sql_timestamp: 5 })).toBe(
|
||||
1672531000000,
|
||||
);
|
||||
expect(wrapper.vm.sessionStartUs({})).toBeUndefined();
|
||||
});
|
||||
|
||||
it("should handle scroll end events for pagination", () => {
|
||||
// handleScrollEnd increments currentPage when sessions are fully fetched
|
||||
wrapper.vm.handleScrollEnd();
|
||||
@@ -1158,7 +1196,20 @@ describe("AppSessions.vue", () => {
|
||||
expect(push).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
name: "productAnalyticsHeatmaps",
|
||||
query: expect.objectContaining({ app: "web", page_url: "/home" }),
|
||||
query: expect.objectContaining({ app: "web", page_url: "/home", from: "1000000" }),
|
||||
}),
|
||||
);
|
||||
|
||||
push.mockClear();
|
||||
wrapper.vm.rows = [
|
||||
{ session_id: "session-2", zo_sql_timestamp: 2_000_000, has_replay: true },
|
||||
];
|
||||
await nextTick();
|
||||
await wrapper.find('[data-test="rum-app-sessions-view-heatmap-btn"]').trigger("click");
|
||||
await flushPromises();
|
||||
expect(push).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
query: expect.objectContaining({ from: "2000000" }),
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -1237,6 +1288,33 @@ describe("AppSessions.vue", () => {
|
||||
expect(platformText.text()).toBe("roku");
|
||||
});
|
||||
|
||||
it("copies zo_sql_end_timestamp from the _rumdata hit into the session row", async () => {
|
||||
vi.mocked(searchService.search).mockImplementation(async (params: any) => {
|
||||
const sql = params?.query?.query?.sql ?? "";
|
||||
if (sql.includes("GROUP BY session_id") && sql.includes("zo_sql_timestamp")) {
|
||||
return {
|
||||
data: {
|
||||
hits: [
|
||||
{
|
||||
session_id: "s-end",
|
||||
zo_sql_timestamp: 1672531200000000,
|
||||
zo_sql_end_timestamp: 1672531260000000,
|
||||
error_count: 0,
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
}
|
||||
return { data: { hits: [] } };
|
||||
});
|
||||
|
||||
wrapper.vm.getSessions();
|
||||
await flushPromises();
|
||||
|
||||
const row = wrapper.vm.rows.find((r: any) => r.session_id === "s-end");
|
||||
expect(row.zo_sql_end_timestamp).toBe(1672531260000000);
|
||||
});
|
||||
|
||||
it("includes min(source) as source in the main _rumdata search query", async () => {
|
||||
// Arrange — getSessions() builds its 3 chained search requests by
|
||||
// mutating a single shared request object in place (main query, then
|
||||
|
||||
@@ -388,7 +388,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:aria-label="t('rum.heatmap.viewHeatmap')"
|
||||
:disabled="heatmapOpening === row.session_id"
|
||||
data-test="rum-app-sessions-view-heatmap-btn"
|
||||
@click.stop="openSessionHeatmap(row.session_id, row.start_time * 1000)"
|
||||
@click.stop="openSessionHeatmap(row.session_id, sessionStartUs(row))"
|
||||
>
|
||||
<OIcon name="grid-on" size="sm" />
|
||||
<OTooltip :content="t('rum.heatmap.viewHeatmapTip')" side="bottom" />
|
||||
@@ -1098,6 +1098,7 @@ const getSessions = () => {
|
||||
sessionState.data.sessions[hit.session_id] = {
|
||||
session_id: hit.session_id,
|
||||
zo_sql_timestamp: hit.zo_sql_timestamp,
|
||||
zo_sql_end_timestamp: hit.zo_sql_end_timestamp,
|
||||
timestamp: hit.zo_sql_timestamp,
|
||||
type: hit.type,
|
||||
source: hit.source,
|
||||
@@ -1759,15 +1760,28 @@ const handleScrollEnd = () => {
|
||||
}
|
||||
};
|
||||
|
||||
// Replay start/end are ms; sessions without replay only have the _rumdata us timestamps.
|
||||
const sessionStartUs = (row: any): number | undefined => {
|
||||
const us = Number(row.start_time) * 1000 || Number(row.zo_sql_timestamp);
|
||||
return us || undefined;
|
||||
};
|
||||
|
||||
const sessionEndUs = (row: any): number | undefined => {
|
||||
const us = Number(row.end_time) * 1000 || Number(row.zo_sql_end_timestamp);
|
||||
return us || undefined;
|
||||
};
|
||||
|
||||
const handleCellClick = (payload: any) => {
|
||||
if (payload.columnName !== "action_play") return;
|
||||
sessionState.data.selectedSession = sessionState.data.sessions[payload.row.session_id];
|
||||
const start = sessionStartUs(payload.row);
|
||||
const end = sessionEndUs(payload.row);
|
||||
router.push({
|
||||
name: "SessionViewer",
|
||||
params: { id: payload.row.session_id },
|
||||
query: {
|
||||
start_time: payload.row.start_time * 1000,
|
||||
end_time: payload.row.end_time * 1000,
|
||||
...(start && { start_time: start }),
|
||||
...(end && { end_time: end }),
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
@@ -124,6 +124,7 @@ import OSwitch from "@/lib/forms/Switch/OSwitch.vue";
|
||||
import OSlider from "@/lib/forms/Slider/OSlider.vue";
|
||||
import OToggleGroup from "@/lib/core/ToggleGroup/OToggleGroup.vue";
|
||||
import searchService from "@/services/search";
|
||||
import i18n from "@/locales";
|
||||
import { PAGE_LIST_LIMIT, RANKING_LIMIT } from "@/utils/rum/clickHeatmapQueries";
|
||||
|
||||
const store = createStore({
|
||||
@@ -173,7 +174,7 @@ describe("ClickHeatmap", () => {
|
||||
h.range = { startUs: 1_000_000_000_000, endUs: 1_000_000_000_000 + 24 * 3_600_000_000 };
|
||||
h.route = { name: "productAnalyticsHeatmaps", query: {} };
|
||||
h.getStream.mockImplementation(async (name: string) => ({
|
||||
schema: name === "_sessionreplay" ? [{ name: "has_full_snapshot" }] : [],
|
||||
schema: name === "_sessionreplay" ? [{ name: "view_id" }, { name: "has_full_snapshot" }] : [],
|
||||
}));
|
||||
});
|
||||
|
||||
@@ -433,7 +434,7 @@ describe("ClickHeatmap", () => {
|
||||
});
|
||||
|
||||
it("skips the snapshot flag query when _sessionreplay has no has_full_snapshot column", async () => {
|
||||
h.getStream.mockResolvedValue({ schema: [] });
|
||||
h.getStream.mockResolvedValue({ schema: [{ name: "view_id" }] });
|
||||
answer({ "replay-views": () => ok([{ view_id: "v1" }, { view_id: "v2" }]) });
|
||||
await mountPage();
|
||||
|
||||
@@ -442,6 +443,50 @@ describe("ClickHeatmap", () => {
|
||||
expect(segments?.[1].sql).toContain("v1");
|
||||
});
|
||||
|
||||
it("sends no view_id query and shows the no-replay state when _sessionreplay has no view_id", async () => {
|
||||
h.getStream.mockImplementation(async (name: string) => ({
|
||||
schema: name === "_sessionreplay" ? [{ name: "has_full_snapshot" }] : [],
|
||||
}));
|
||||
answer({ "replay-views": () => ok([{ view_id: "v1" }]) });
|
||||
const wrapper = await mountPage();
|
||||
|
||||
expect(ids()).not.toContain("replay-views");
|
||||
expect(ids()).not.toContain("replay-flags");
|
||||
expect(ids()).not.toContain("replay-segments");
|
||||
const notice = wrapper.find('[data-test="rum-heatmap-snapshot-error"]');
|
||||
expect(notice.text()).toContain("Page snapshots need a newer RUM SDK");
|
||||
expect(notice.text()).not.toContain("No session replay was recorded");
|
||||
});
|
||||
|
||||
it("shows the no-replay state, not a failure, when the org has no _sessionreplay stream", async () => {
|
||||
h.getStream.mockImplementation(async (name: string) => {
|
||||
if (name === "_sessionreplay")
|
||||
throw new Error(
|
||||
i18n.global.t("logStream.streamNotFoundForType", { stream: name, type: "logs" }),
|
||||
);
|
||||
return { schema: [] };
|
||||
});
|
||||
const wrapper = await mountPage();
|
||||
|
||||
expect(ids()).not.toContain("replay-views");
|
||||
const notice = wrapper.find('[data-test="rum-heatmap-snapshot-error"]');
|
||||
expect(notice.text()).toContain("No session replay was recorded");
|
||||
expect(notice.text()).not.toContain("Couldn't load the page snapshot");
|
||||
});
|
||||
|
||||
it("shows the load failure, not the no-replay state, when the _sessionreplay schema fetch fails", async () => {
|
||||
vi.spyOn(console, "error").mockImplementation(() => {});
|
||||
h.getStream.mockImplementation(async (name: string) => {
|
||||
if (name === "_sessionreplay") throw new Error("network");
|
||||
return { schema: [] };
|
||||
});
|
||||
const wrapper = await mountPage();
|
||||
|
||||
const notice = wrapper.find('[data-test="rum-heatmap-snapshot-error"]');
|
||||
expect(notice.text()).toContain("Couldn't load the page snapshot");
|
||||
expect(notice.text()).not.toContain("No session replay was recorded");
|
||||
});
|
||||
|
||||
it("runs the snapshot lookups through the real search helper without a stream rejection", async () => {
|
||||
h.real = true;
|
||||
vi.spyOn(console, "error").mockImplementation(() => {});
|
||||
|
||||
@@ -1366,7 +1366,33 @@ interface SnapshotSource {
|
||||
viewId: string;
|
||||
}
|
||||
|
||||
async function pickReplayView(token: number): Promise<string | null> {
|
||||
type SnapshotHead = ({ kind: "view" } & SnapshotSource) | { kind: "none" } | { kind: "legacySdk" };
|
||||
|
||||
type ReplayPick = { kind: "view"; viewId: string } | { kind: "none" } | { kind: "legacySdk" };
|
||||
|
||||
async function pickReplayView(token: number): Promise<ReplayPick> {
|
||||
let replayStream: any = null;
|
||||
try {
|
||||
replayStream = await getStream("_sessionreplay", "logs", true);
|
||||
} catch (e) {
|
||||
// Only a missing stream is the calm no-replay case; any other failure must surface.
|
||||
const missing = t("logStream.streamNotFoundForType", {
|
||||
stream: "_sessionreplay",
|
||||
type: "logs",
|
||||
});
|
||||
if ((e as Error)?.message === missing) return { kind: "none" };
|
||||
throw e;
|
||||
}
|
||||
if (token !== loadToken) return { kind: "none" };
|
||||
// Replay from an older SDK has no view_id column, and querying it fails with 400.
|
||||
if (!(replayStream?.schema ?? []).some((f: any) => f?.name === "view_id")) {
|
||||
return { kind: "legacySdk" };
|
||||
}
|
||||
const viewId = await pickViewWithSnapshot(token, replayStream);
|
||||
return viewId ? { kind: "view", viewId } : { kind: "none" };
|
||||
}
|
||||
|
||||
async function pickViewWithSnapshot(token: number, replayStream: any): Promise<string | null> {
|
||||
const stream = await getStream("_rumdata", "logs", true);
|
||||
if (token !== loadToken) return null;
|
||||
const hasActions = (stream?.schema ?? []).some((f: any) => f?.name === "view_action_count");
|
||||
@@ -1377,8 +1403,6 @@ async function pickReplayView(token: number): Promise<string | null> {
|
||||
views = await replayRows("replay-views", viewsSql, 30);
|
||||
}
|
||||
if (!views.length || token !== loadToken) return null;
|
||||
const replayStream = await getStream("_sessionreplay", "logs", true);
|
||||
if (token !== loadToken) return null;
|
||||
// Older and mobile streams have no has_full_snapshot column, so any view may hold a snapshot.
|
||||
if (!(replayStream?.schema ?? []).some((f: any) => f?.name === "has_full_snapshot")) {
|
||||
return String(views[0].view_id);
|
||||
@@ -1425,9 +1449,11 @@ const hasFirstFrame = (events: any[]) =>
|
||||
events.some((e) => e.type === META) && events.some((e) => e.type === FULL_SNAPSHOT);
|
||||
|
||||
// The earliest segments hold the meta and full snapshot, so they alone are enough to show the first frame.
|
||||
async function loadSnapshotHead(token: number): Promise<SnapshotSource | null> {
|
||||
const viewId = await pickReplayView(token);
|
||||
if (!viewId || token !== loadToken) return null;
|
||||
async function loadSnapshotHead(token: number): Promise<SnapshotHead> {
|
||||
const pick = await pickReplayView(token);
|
||||
if (pick.kind !== "view") return pick;
|
||||
if (token !== loadToken) return { kind: "none" };
|
||||
const viewId = pick.viewId;
|
||||
let rows = await replayRows(
|
||||
"replay-segments",
|
||||
segmentsSql(viewId, FIRST_SEGMENTS),
|
||||
@@ -1444,8 +1470,8 @@ async function loadSnapshotHead(token: number): Promise<SnapshotSource | null> {
|
||||
);
|
||||
events = decodeReplayEvents(parseSegments(rows));
|
||||
}
|
||||
if (token !== loadToken || !events.length) return null;
|
||||
return { viewId, events };
|
||||
if (token !== loadToken || !events.length) return { kind: "none" };
|
||||
return { kind: "view", viewId, events };
|
||||
}
|
||||
|
||||
async function loadSnapshot(token: number, key: string) {
|
||||
@@ -1455,8 +1481,12 @@ async function loadSnapshot(token: number, key: string) {
|
||||
try {
|
||||
const head = await loadSnapshotHead(token);
|
||||
if (token !== loadToken) return;
|
||||
const meta = head?.events.find((e) => e.type === META);
|
||||
if (!head || !hasFirstFrame(head.events) || !meta) {
|
||||
if (head.kind === "legacySdk") {
|
||||
snapshotError.value = t("rum.heatmap.noReplayLegacySdk");
|
||||
return;
|
||||
}
|
||||
const meta = head.kind === "view" ? head.events.find((e) => e.type === META) : undefined;
|
||||
if (head.kind !== "view" || !hasFirstFrame(head.events) || !meta) {
|
||||
snapshotError.value = t("rum.heatmap.noReplay");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -20,6 +20,9 @@ import { createRouter, createWebHistory } from "vue-router";
|
||||
|
||||
// --- Module-level mocks (hoisted by Vitest before any import) ---
|
||||
|
||||
// Extra fields a Sessions-list click-through leaves on the selected session.
|
||||
const seededSession = vi.hoisted(() => ({ extra: {} as Record<string, unknown> }));
|
||||
|
||||
// Reactive like the real store, so computeds over the selected session follow getSession().
|
||||
vi.mock("@/composables/useSessionReplay", async () => {
|
||||
const { reactive } = await import("vue");
|
||||
@@ -37,6 +40,7 @@ vi.mock("@/composables/useSessionReplay", async () => {
|
||||
city: "San Francisco",
|
||||
country: "US",
|
||||
session_id: "session-abc",
|
||||
...seededSession.extra,
|
||||
},
|
||||
},
|
||||
}),
|
||||
@@ -3981,6 +3985,34 @@ describe("SessionViewer.vue — events-only view for a session with no replay (A
|
||||
wrapper.unmount();
|
||||
});
|
||||
|
||||
it("shows the session duration after a reload, when the store holds no row to copy it from", async () => {
|
||||
const wrapper = await mountEventsOnly();
|
||||
expect(wrapper.find('[data-test="session-viewer-duration"]').text()).toBe("7m 35s");
|
||||
wrapper.unmount();
|
||||
});
|
||||
|
||||
it("keeps the duration of the Sessions list row on a click-through instead of recomputing it", async () => {
|
||||
seededSession.extra = { time_spent: 123_000, session_id: "session-events" };
|
||||
try {
|
||||
const wrapper = await mountEventsOnly();
|
||||
expect(wrapper.find('[data-test="session-viewer-duration"]').text()).toBe("2m 3s");
|
||||
wrapper.unmount();
|
||||
} finally {
|
||||
seededSession.extra = {};
|
||||
}
|
||||
});
|
||||
|
||||
it("ignores the duration of a different session left in the store by another entry point", async () => {
|
||||
seededSession.extra = { time_spent: 123_000, session_id: "session-other" };
|
||||
try {
|
||||
const wrapper = await mountEventsOnly();
|
||||
expect(wrapper.find('[data-test="session-viewer-duration"]').text()).toBe("7m 35s");
|
||||
wrapper.unmount();
|
||||
} finally {
|
||||
seededSession.extra = {};
|
||||
}
|
||||
});
|
||||
|
||||
it("hands the Traces tab the route window padded by a day, not the device-clock bounds", async () => {
|
||||
const wrapper = await mountEventsOnly();
|
||||
const sidebar = wrapper.findComponent({ name: "PlayerEventsSidebar" });
|
||||
|
||||
@@ -838,11 +838,15 @@ async function loadEventsOnlySession(): Promise<"found" | "missing" | "failed">
|
||||
);
|
||||
const hit = res?.data?.hits?.[0];
|
||||
if (!hit || hit.start_time === null || hit.start_time === undefined) return "missing";
|
||||
const stored = sessionState.data.selectedSession;
|
||||
const existingSpent =
|
||||
stored?.session_id === String(getSessionId.value) ? Number(stored?.time_spent) : 0;
|
||||
sessionState.data.selectedSession = {
|
||||
...sessionState.data.selectedSession,
|
||||
session_id: String(getSessionId.value),
|
||||
start_time: Number(hit.start_time),
|
||||
end_time: Number(hit.end_time),
|
||||
time_spent: existingSpent > 0 ? existingSpent : Number(hit.end_time) - Number(hit.start_time),
|
||||
user_email: hit.user_email,
|
||||
source: hit.source,
|
||||
replay_start: null,
|
||||
|
||||
Reference in New Issue
Block a user