codex-chatgpt-control 0.1.0-alpha.1 → 0.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +55 -0
- package/contracts/v1/fixtures/backend-capabilities.json +7 -0
- package/contracts/v1/fixtures/blocker-explanation-profiles.json +114 -0
- package/contracts/v1/fixtures/command-descriptors.json +192 -15
- package/contracts/v1/fixtures/doctor-bridge-upload.json +8 -0
- package/contracts/v1/fixtures/doctor-scenario-preflight.json +108 -0
- package/contracts/v1/fixtures/existing-tab-diagnostics-blocker.json +57 -0
- package/contracts/v1/fixtures/files-preflight-success.json +32 -0
- package/contracts/v1/fixtures/help-root.json +1 -1
- package/contracts/v1/fixtures/output-json-parse-success.json +17 -2
- package/contracts/v1/fixtures/project-sources-plan-add.json +71 -0
- package/contracts/v1/fixtures/read-latest-clipped.json +31 -0
- package/contracts/v1/fixtures/reports-create-redacted.json +15 -0
- package/contracts/v1/fixtures/responses-basic-success.json +11 -0
- package/contracts/v1/fixtures/run-basic-success.json +15 -0
- package/contracts/v1/fixtures/run-browser-bridge-blocker.json +2 -2
- package/contracts/v1/fixtures/run-timeout-partial.json +2 -2
- package/contracts/v1/fixtures/runner-budget-blocker.json +1 -1
- package/contracts/v1/fixtures/stream-blocked.ndjson +1 -1
- package/contracts/v1/fixtures/stream-submitted-completed.ndjson +1 -1
- package/contracts/v1/manifest.json +30 -0
- package/contracts/v1/parity-suite.json +72 -6
- package/contracts/v1/schemas/backend-request.schema.json +3 -0
- package/contracts/v1/schemas/command-result.schema.json +48 -0
- package/contracts/v1/schemas/response.schema.json +28 -0
- package/contracts/v1/schemas/run-result.schema.json +84 -0
- package/contracts/v1/surface-drift-policy.json +210 -0
- package/dist/codex-chatgpt-control-backend.mjs +5137 -488
- package/dist/codex-chatgpt-control.bundle.mjs +5001 -286
- package/dist/src/backend/client.d.ts +6 -1
- package/dist/src/backend/client.js +5 -0
- package/dist/src/backend/protocol.d.ts +1 -1
- package/dist/src/backend/protocol.js +7 -0
- package/dist/src/backend/session.js +14 -0
- package/dist/src/browser/attach.js +128 -20
- package/dist/src/browser/downloads.js +2 -1
- package/dist/src/browser/page-state.js +6 -3
- package/dist/src/client.d.ts +16 -1
- package/dist/src/client.js +86 -7
- package/dist/src/commands/artifacts.d.ts +5 -0
- package/dist/src/commands/artifacts.js +432 -0
- package/dist/src/commands/context.js +5 -2
- package/dist/src/commands/doctor.d.ts +10 -2
- package/dist/src/commands/doctor.js +242 -14
- package/dist/src/commands/files.d.ts +2 -1
- package/dist/src/commands/files.js +352 -18
- package/dist/src/commands/messages.d.ts +2 -1
- package/dist/src/commands/messages.js +232 -40
- package/dist/src/commands/modes.js +202 -20
- package/dist/src/commands/project-sources.d.ts +10 -0
- package/dist/src/commands/project-sources.js +643 -0
- package/dist/src/commands/registry.js +76 -14
- package/dist/src/commands/reports.d.ts +9 -0
- package/dist/src/commands/reports.js +83 -6
- package/dist/src/commands/response-actions.js +33 -0
- package/dist/src/commands/sequence.js +14 -0
- package/dist/src/commands/threads.js +2 -1
- package/dist/src/commands/timeouts.d.ts +2 -0
- package/dist/src/commands/timeouts.js +18 -0
- package/dist/src/diagnostics/blockers.d.ts +54 -0
- package/dist/src/diagnostics/blockers.js +299 -0
- package/dist/src/dom/artifacts.d.ts +7 -0
- package/dist/src/dom/artifacts.js +198 -0
- package/dist/src/dom/generation-state.d.ts +8 -0
- package/dist/src/dom/generation-state.js +103 -0
- package/dist/src/dom/locale/am.d.ts +28 -0
- package/dist/src/dom/locale/am.js +28 -0
- package/dist/src/dom/locale/ar.d.ts +28 -0
- package/dist/src/dom/locale/ar.js +28 -0
- package/dist/src/dom/locale/bg.d.ts +28 -0
- package/dist/src/dom/locale/bg.js +28 -0
- package/dist/src/dom/locale/bn.d.ts +28 -0
- package/dist/src/dom/locale/bn.js +28 -0
- package/dist/src/dom/locale/bs.d.ts +28 -0
- package/dist/src/dom/locale/bs.js +28 -0
- package/dist/src/dom/locale/ca.d.ts +28 -0
- package/dist/src/dom/locale/ca.js +28 -0
- package/dist/src/dom/locale/cs.d.ts +28 -0
- package/dist/src/dom/locale/cs.js +28 -0
- package/dist/src/dom/locale/da.d.ts +28 -0
- package/dist/src/dom/locale/da.js +28 -0
- package/dist/src/dom/locale/de.d.ts +30 -0
- package/dist/src/dom/locale/de.js +30 -0
- package/dist/src/dom/locale/el.d.ts +28 -0
- package/dist/src/dom/locale/el.js +28 -0
- package/dist/src/dom/locale/en.d.ts +50 -0
- package/dist/src/dom/locale/en.js +56 -0
- package/dist/src/dom/locale/es-419.d.ts +28 -0
- package/dist/src/dom/locale/es-419.js +28 -0
- package/dist/src/dom/locale/es-ES.d.ts +28 -0
- package/dist/src/dom/locale/es-ES.js +28 -0
- package/dist/src/dom/locale/et.d.ts +28 -0
- package/dist/src/dom/locale/et.js +28 -0
- package/dist/src/dom/locale/fa.d.ts +28 -0
- package/dist/src/dom/locale/fa.js +28 -0
- package/dist/src/dom/locale/fi.d.ts +28 -0
- package/dist/src/dom/locale/fi.js +28 -0
- package/dist/src/dom/locale/fr-CA.d.ts +29 -0
- package/dist/src/dom/locale/fr-CA.js +29 -0
- package/dist/src/dom/locale/fr-FR.d.ts +30 -0
- package/dist/src/dom/locale/fr-FR.js +30 -0
- package/dist/src/dom/locale/gu.d.ts +28 -0
- package/dist/src/dom/locale/gu.js +28 -0
- package/dist/src/dom/locale/hi.d.ts +28 -0
- package/dist/src/dom/locale/hi.js +28 -0
- package/dist/src/dom/locale/hr.d.ts +28 -0
- package/dist/src/dom/locale/hr.js +28 -0
- package/dist/src/dom/locale/hu.d.ts +28 -0
- package/dist/src/dom/locale/hu.js +28 -0
- package/dist/src/dom/locale/hy.d.ts +28 -0
- package/dist/src/dom/locale/hy.js +28 -0
- package/dist/src/dom/locale/id.d.ts +28 -0
- package/dist/src/dom/locale/id.js +28 -0
- package/dist/src/dom/locale/index.d.ts +79 -0
- package/dist/src/dom/locale/index.js +202 -0
- package/dist/src/dom/locale/is.d.ts +28 -0
- package/dist/src/dom/locale/is.js +28 -0
- package/dist/src/dom/locale/it.d.ts +27 -0
- package/dist/src/dom/locale/it.js +27 -0
- package/dist/src/dom/locale/ja.d.ts +27 -0
- package/dist/src/dom/locale/ja.js +27 -0
- package/dist/src/dom/locale/ka.d.ts +28 -0
- package/dist/src/dom/locale/ka.js +28 -0
- package/dist/src/dom/locale/kk.d.ts +28 -0
- package/dist/src/dom/locale/kk.js +28 -0
- package/dist/src/dom/locale/kn.d.ts +28 -0
- package/dist/src/dom/locale/kn.js +28 -0
- package/dist/src/dom/locale/ko.d.ts +28 -0
- package/dist/src/dom/locale/ko.js +28 -0
- package/dist/src/dom/locale/lt.d.ts +28 -0
- package/dist/src/dom/locale/lt.js +28 -0
- package/dist/src/dom/locale/lv.d.ts +28 -0
- package/dist/src/dom/locale/lv.js +28 -0
- package/dist/src/dom/locale/mk.d.ts +28 -0
- package/dist/src/dom/locale/mk.js +28 -0
- package/dist/src/dom/locale/ml.d.ts +28 -0
- package/dist/src/dom/locale/ml.js +28 -0
- package/dist/src/dom/locale/mn.d.ts +28 -0
- package/dist/src/dom/locale/mn.js +28 -0
- package/dist/src/dom/locale/mr.d.ts +28 -0
- package/dist/src/dom/locale/mr.js +28 -0
- package/dist/src/dom/locale/ms.d.ts +28 -0
- package/dist/src/dom/locale/ms.js +28 -0
- package/dist/src/dom/locale/my.d.ts +28 -0
- package/dist/src/dom/locale/my.js +28 -0
- package/dist/src/dom/locale/nb.d.ts +28 -0
- package/dist/src/dom/locale/nb.js +28 -0
- package/dist/src/dom/locale/nl.d.ts +28 -0
- package/dist/src/dom/locale/nl.js +28 -0
- package/dist/src/dom/locale/pa.d.ts +28 -0
- package/dist/src/dom/locale/pa.js +28 -0
- package/dist/src/dom/locale/pl.d.ts +28 -0
- package/dist/src/dom/locale/pl.js +28 -0
- package/dist/src/dom/locale/pt-BR.d.ts +28 -0
- package/dist/src/dom/locale/pt-BR.js +28 -0
- package/dist/src/dom/locale/pt-PT.d.ts +28 -0
- package/dist/src/dom/locale/pt-PT.js +28 -0
- package/dist/src/dom/locale/ro.d.ts +28 -0
- package/dist/src/dom/locale/ro.js +28 -0
- package/dist/src/dom/locale/ru.d.ts +28 -0
- package/dist/src/dom/locale/ru.js +28 -0
- package/dist/src/dom/locale/sk.d.ts +28 -0
- package/dist/src/dom/locale/sk.js +28 -0
- package/dist/src/dom/locale/sl.d.ts +28 -0
- package/dist/src/dom/locale/sl.js +28 -0
- package/dist/src/dom/locale/so.d.ts +28 -0
- package/dist/src/dom/locale/so.js +28 -0
- package/dist/src/dom/locale/sq.d.ts +28 -0
- package/dist/src/dom/locale/sq.js +28 -0
- package/dist/src/dom/locale/sr.d.ts +28 -0
- package/dist/src/dom/locale/sr.js +28 -0
- package/dist/src/dom/locale/sv.d.ts +28 -0
- package/dist/src/dom/locale/sv.js +28 -0
- package/dist/src/dom/locale/sw.d.ts +28 -0
- package/dist/src/dom/locale/sw.js +28 -0
- package/dist/src/dom/locale/ta.d.ts +28 -0
- package/dist/src/dom/locale/ta.js +28 -0
- package/dist/src/dom/locale/te.d.ts +28 -0
- package/dist/src/dom/locale/te.js +28 -0
- package/dist/src/dom/locale/th.d.ts +28 -0
- package/dist/src/dom/locale/th.js +28 -0
- package/dist/src/dom/locale/tl.d.ts +28 -0
- package/dist/src/dom/locale/tl.js +28 -0
- package/dist/src/dom/locale/tr.d.ts +28 -0
- package/dist/src/dom/locale/tr.js +28 -0
- package/dist/src/dom/locale/types.d.ts +45 -0
- package/dist/src/dom/locale/types.js +1 -0
- package/dist/src/dom/locale/uk.d.ts +28 -0
- package/dist/src/dom/locale/uk.js +28 -0
- package/dist/src/dom/locale/ur.d.ts +28 -0
- package/dist/src/dom/locale/ur.js +28 -0
- package/dist/src/dom/locale/vi.d.ts +28 -0
- package/dist/src/dom/locale/vi.js +28 -0
- package/dist/src/dom/locale/zh-HK.d.ts +28 -0
- package/dist/src/dom/locale/zh-HK.js +28 -0
- package/dist/src/dom/locale/zh-Hans.d.ts +28 -0
- package/dist/src/dom/locale/zh-Hans.js +28 -0
- package/dist/src/dom/locale/zh-TW.d.ts +29 -0
- package/dist/src/dom/locale/zh-TW.js +29 -0
- package/dist/src/dom/locale-labels.d.ts +26 -0
- package/dist/src/dom/locale-labels.js +26 -0
- package/dist/src/dom/menus.d.ts +6 -0
- package/dist/src/dom/menus.js +34 -8
- package/dist/src/dom/message-format.d.ts +2 -1
- package/dist/src/dom/message-format.js +67 -10
- package/dist/src/dom/messages.d.ts +2 -1
- package/dist/src/dom/messages.js +2 -4
- package/dist/src/dom/selectors.d.ts +1 -0
- package/dist/src/dom/selectors.js +42 -15
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.js +5 -0
- package/dist/src/platform/local-paths.d.ts +4 -0
- package/dist/src/platform/local-paths.js +20 -0
- package/dist/src/runner/interruptions.js +15 -4
- package/dist/src/runner/responses.js +18 -1
- package/dist/src/runner/result.js +15 -0
- package/dist/src/runner/resume.js +1 -0
- package/dist/src/runner/types.d.ts +3 -0
- package/dist/src/safety/risk.d.ts +7 -0
- package/dist/src/safety/risk.js +7 -0
- package/dist/src/safety/untrusted-output.d.ts +73 -0
- package/dist/src/safety/untrusted-output.js +199 -0
- package/dist/src/scripts/apply-intelligence-locale-captures.d.ts +1 -0
- package/dist/src/scripts/apply-intelligence-locale-captures.js +184 -0
- package/dist/src/scripts/capture-intelligence-locales.d.ts +25 -0
- package/dist/src/scripts/capture-intelligence-locales.js +669 -0
- package/dist/src/scripts/check-surface-drift.d.ts +1 -0
- package/dist/src/scripts/check-surface-drift.js +11 -0
- package/dist/src/scripts/live-smoke/scenarios.js +84 -0
- package/dist/src/scripts/locale-capture/language-coverage.d.ts +10 -0
- package/dist/src/scripts/locale-capture/language-coverage.js +39 -0
- package/dist/src/testing/surface-drift.d.ts +66 -0
- package/dist/src/testing/surface-drift.js +363 -0
- package/dist/src/types.d.ts +201 -2
- package/package.json +2 -1
- package/references/backend-protocol.md +93 -1
- package/references/language-coverage.md +142 -0
- package/references/localization.md +247 -0
- package/references/python-parity.md +63 -1
- package/references/safety.md +2 -0
- package/references/troubleshooting.md +58 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Armenian (hy-AM). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=hy-AM, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export declare const hy: {
|
|
10
|
+
composerTextbox: string[];
|
|
11
|
+
sendButton: string[];
|
|
12
|
+
searchChatsButton: string[];
|
|
13
|
+
searchChatsPlaceholder: string[];
|
|
14
|
+
newChat: string[];
|
|
15
|
+
addFilesButton: string[];
|
|
16
|
+
addFilesOpenerCandidates: string[];
|
|
17
|
+
addPhotosFilesMenuItem: string[];
|
|
18
|
+
copyResponse: string[];
|
|
19
|
+
modeLabels: string[];
|
|
20
|
+
modeOpenerExtra: string[];
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: string[];
|
|
23
|
+
deep_research: string[];
|
|
24
|
+
create_image: string[];
|
|
25
|
+
};
|
|
26
|
+
signedInMarkers: string[];
|
|
27
|
+
responseActions: string[];
|
|
28
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Armenian (hy-AM). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=hy-AM, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export const hy = {
|
|
10
|
+
composerTextbox: ["Զրույց ChatGPT-ի հետ"],
|
|
11
|
+
sendButton: ["Ուղարկել հուշանիշ"],
|
|
12
|
+
searchChatsButton: ["Որոնել զրույցները"],
|
|
13
|
+
searchChatsPlaceholder: ["Որոնել զրույցներում․․․"],
|
|
14
|
+
newChat: ["Նոր զրույց"],
|
|
15
|
+
addFilesButton: ["Ավելացրեք ֆայլեր և ավելին"],
|
|
16
|
+
addFilesOpenerCandidates: ["Ավելացրեք ֆայլեր և ավելին"],
|
|
17
|
+
addPhotosFilesMenuItem: ["Ավելացնել լուսանկարներ և ֆայլեր"],
|
|
18
|
+
copyResponse: ["Պատճենել պատասխանը"],
|
|
19
|
+
modeLabels: ["Ակնթարթային", "Միջին", "Բարձր", "Շատ բարձր", "Պրո"],
|
|
20
|
+
modeOpenerExtra: ["Կազմաձևել․․․"],
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: ["Վեբ որոնում"],
|
|
23
|
+
deep_research: ["Խորը ուսումնասիրություն"],
|
|
24
|
+
create_image: ["Ստեղծել պատկեր"],
|
|
25
|
+
},
|
|
26
|
+
signedInMarkers: ["Նոր զրույց", "Որոնել զրույցները", "Թարմ", "Զրույցների պատմություն", "Նախագծեր", "Զրույց ChatGPT-ի հետ"],
|
|
27
|
+
responseActions: ["Պատճենել պատասխանը"],
|
|
28
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Indonesian (id-ID). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=id-ID, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export declare const id: {
|
|
10
|
+
composerTextbox: string[];
|
|
11
|
+
sendButton: string[];
|
|
12
|
+
searchChatsButton: string[];
|
|
13
|
+
searchChatsPlaceholder: string[];
|
|
14
|
+
newChat: string[];
|
|
15
|
+
addFilesButton: string[];
|
|
16
|
+
addFilesOpenerCandidates: string[];
|
|
17
|
+
addPhotosFilesMenuItem: string[];
|
|
18
|
+
copyResponse: string[];
|
|
19
|
+
modeLabels: string[];
|
|
20
|
+
modeOpenerExtra: string[];
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: string[];
|
|
23
|
+
deep_research: string[];
|
|
24
|
+
create_image: string[];
|
|
25
|
+
};
|
|
26
|
+
signedInMarkers: string[];
|
|
27
|
+
responseActions: string[];
|
|
28
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Indonesian (id-ID). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=id-ID, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export const id = {
|
|
10
|
+
composerTextbox: ["Obrolan dengan ChatGPT"],
|
|
11
|
+
sendButton: ["Kirim perintah"],
|
|
12
|
+
searchChatsButton: ["Cari obrolan"],
|
|
13
|
+
searchChatsPlaceholder: ["Cari obrolan..."],
|
|
14
|
+
newChat: ["Obrolan baru"],
|
|
15
|
+
addFilesButton: ["Tambahkan file dan lainnya"],
|
|
16
|
+
addFilesOpenerCandidates: ["Tambahkan file dan lainnya"],
|
|
17
|
+
addPhotosFilesMenuItem: ["Tambah foto & file"],
|
|
18
|
+
copyResponse: ["Salin respons"],
|
|
19
|
+
modeLabels: ["Instan", "Sedang", "Tinggi", "Sangat Tinggi"],
|
|
20
|
+
modeOpenerExtra: ["Konfigurasi..."],
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: ["Pencarian web"],
|
|
23
|
+
deep_research: ["Riset dalam"],
|
|
24
|
+
create_image: ["Buat gambar"],
|
|
25
|
+
},
|
|
26
|
+
signedInMarkers: ["Obrolan baru", "Cari obrolan", "Terkini", "Riwayat obrolan", "Proyek", "Obrolan dengan ChatGPT"],
|
|
27
|
+
responseActions: ["Salin respons"],
|
|
28
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized, locale-sensitive ChatGPT UI strings.
|
|
3
|
+
*
|
|
4
|
+
* Every entry is an ORDERED list of candidate strings. English is canonical and MUST
|
|
5
|
+
* stay first: it is also the public API contract for mode/tool selection (callers pass
|
|
6
|
+
* `effort: "Thinking"`, `tool: "web_search"`, etc.). Matchers iterate the whole list,
|
|
7
|
+
* so localizing the SDK is just appending verified strings to these arrays — no selector
|
|
8
|
+
* or command code needs to change.
|
|
9
|
+
*
|
|
10
|
+
* RULES
|
|
11
|
+
* - Do NOT add unverified translations. A locale string is only valid once it has been
|
|
12
|
+
* observed in a real localized ChatGPT session. Guesses are worse than nothing because
|
|
13
|
+
* they mask the `selector_drift` blocker that is the designed recovery path.
|
|
14
|
+
* - Keys are stable logical ids. The localized display text goes in the array; the key
|
|
15
|
+
* never changes.
|
|
16
|
+
* - These are the visible/accessible-name surfaces only. Structural anchors (roles,
|
|
17
|
+
* element ids like `#composer-plus-btn`, `a[href^='/c/']`, `data-message-author-role`)
|
|
18
|
+
* are language-agnostic and live in the selectors directly.
|
|
19
|
+
*
|
|
20
|
+
* Structural-only blocker patterns stay literal in `safety/blockers.ts` on purpose:
|
|
21
|
+
* numeric/HTTP codes (`404`), our own bridge error fragments (`fileChooser.setFiles`,
|
|
22
|
+
* `permission denied`), and the modal heuristic are not ChatGPT-localized UI text.
|
|
23
|
+
*
|
|
24
|
+
* HOW TO ADD A NEW LANGUAGE
|
|
25
|
+
* 1. Create `src/dom/locale/<bcp47>.ts` exporting a `const <bcp47>` that satisfies
|
|
26
|
+
* `LocaleContribution` (Partial — only include keys whose text differs from English).
|
|
27
|
+
* Example:
|
|
28
|
+
* import type { LocaleContribution } from "./types.js";
|
|
29
|
+
* export const de = {
|
|
30
|
+
* sendButton: ["Send prompt", "Nachricht senden"],
|
|
31
|
+
* // ...
|
|
32
|
+
* } satisfies LocaleContribution;
|
|
33
|
+
* 2. Import it here and append it to the `locales` array below.
|
|
34
|
+
* Example:
|
|
35
|
+
* import { de } from "./de.js";
|
|
36
|
+
* const locales = [en, de] as const;
|
|
37
|
+
*/
|
|
38
|
+
/**
|
|
39
|
+
* The combined locale registry. Values are `string[]` (mutable; English-first; deduped).
|
|
40
|
+
* Consumers treat this identically to the previous `as const` object — the array contents
|
|
41
|
+
* are identical to the original English-only values unless additional locales are added.
|
|
42
|
+
*/
|
|
43
|
+
export declare const localeLabels: {
|
|
44
|
+
composerTextbox: string[];
|
|
45
|
+
sendButton: string[];
|
|
46
|
+
searchChatsButton: string[];
|
|
47
|
+
searchChatsPlaceholder: string[];
|
|
48
|
+
newChat: string[];
|
|
49
|
+
addFilesButton: string[];
|
|
50
|
+
addFilesOpenerCandidates: string[];
|
|
51
|
+
addPhotosFilesMenuItem: string[];
|
|
52
|
+
projectSourcesTab: string[];
|
|
53
|
+
projectSourcesAddSource: string[];
|
|
54
|
+
projectSourcesUploadFiles: string[];
|
|
55
|
+
copyResponse: string[];
|
|
56
|
+
download: string[];
|
|
57
|
+
downloadImage: string[];
|
|
58
|
+
imageContainerHint: string[];
|
|
59
|
+
modeLabels: string[];
|
|
60
|
+
modeOpenerExtra: string[];
|
|
61
|
+
tools: Record<string, string[]>;
|
|
62
|
+
signedInMarkers: string[];
|
|
63
|
+
transientAssistant: string[];
|
|
64
|
+
stopControl: string[];
|
|
65
|
+
stoppedAssistant: string[];
|
|
66
|
+
responseActions: string[];
|
|
67
|
+
loginBlocker: string[];
|
|
68
|
+
captchaBlocker: string[];
|
|
69
|
+
rateLimitBlocker: string[];
|
|
70
|
+
};
|
|
71
|
+
export declare function escapeRegExp(value: string): string;
|
|
72
|
+
/**
|
|
73
|
+
* Builds a case-insensitive RegExp that matches any of the candidate labels as a
|
|
74
|
+
* substring. Suitable for Playwright `getByRole({ name })` and `getByPlaceholder()`,
|
|
75
|
+
* which accept a RegExp and preserve the prior substring-match semantics for a single
|
|
76
|
+
* English candidate while transparently supporting added locales.
|
|
77
|
+
*/
|
|
78
|
+
export declare function anyLabelPattern(candidates: readonly string[]): RegExp;
|
|
79
|
+
export type { LocaleStrings, LocaleContribution } from "./types.js";
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized, locale-sensitive ChatGPT UI strings.
|
|
3
|
+
*
|
|
4
|
+
* Every entry is an ORDERED list of candidate strings. English is canonical and MUST
|
|
5
|
+
* stay first: it is also the public API contract for mode/tool selection (callers pass
|
|
6
|
+
* `effort: "Thinking"`, `tool: "web_search"`, etc.). Matchers iterate the whole list,
|
|
7
|
+
* so localizing the SDK is just appending verified strings to these arrays — no selector
|
|
8
|
+
* or command code needs to change.
|
|
9
|
+
*
|
|
10
|
+
* RULES
|
|
11
|
+
* - Do NOT add unverified translations. A locale string is only valid once it has been
|
|
12
|
+
* observed in a real localized ChatGPT session. Guesses are worse than nothing because
|
|
13
|
+
* they mask the `selector_drift` blocker that is the designed recovery path.
|
|
14
|
+
* - Keys are stable logical ids. The localized display text goes in the array; the key
|
|
15
|
+
* never changes.
|
|
16
|
+
* - These are the visible/accessible-name surfaces only. Structural anchors (roles,
|
|
17
|
+
* element ids like `#composer-plus-btn`, `a[href^='/c/']`, `data-message-author-role`)
|
|
18
|
+
* are language-agnostic and live in the selectors directly.
|
|
19
|
+
*
|
|
20
|
+
* Structural-only blocker patterns stay literal in `safety/blockers.ts` on purpose:
|
|
21
|
+
* numeric/HTTP codes (`404`), our own bridge error fragments (`fileChooser.setFiles`,
|
|
22
|
+
* `permission denied`), and the modal heuristic are not ChatGPT-localized UI text.
|
|
23
|
+
*
|
|
24
|
+
* HOW TO ADD A NEW LANGUAGE
|
|
25
|
+
* 1. Create `src/dom/locale/<bcp47>.ts` exporting a `const <bcp47>` that satisfies
|
|
26
|
+
* `LocaleContribution` (Partial — only include keys whose text differs from English).
|
|
27
|
+
* Example:
|
|
28
|
+
* import type { LocaleContribution } from "./types.js";
|
|
29
|
+
* export const de = {
|
|
30
|
+
* sendButton: ["Send prompt", "Nachricht senden"],
|
|
31
|
+
* // ...
|
|
32
|
+
* } satisfies LocaleContribution;
|
|
33
|
+
* 2. Import it here and append it to the `locales` array below.
|
|
34
|
+
* Example:
|
|
35
|
+
* import { de } from "./de.js";
|
|
36
|
+
* const locales = [en, de] as const;
|
|
37
|
+
*/
|
|
38
|
+
import { en } from "./en.js";
|
|
39
|
+
import { de } from "./de.js";
|
|
40
|
+
import { esES } from "./es-ES.js";
|
|
41
|
+
import { frFR } from "./fr-FR.js";
|
|
42
|
+
import { zhHK } from "./zh-HK.js";
|
|
43
|
+
import { zhTW } from "./zh-TW.js";
|
|
44
|
+
import { ja } from "./ja.js";
|
|
45
|
+
import { it } from "./it.js";
|
|
46
|
+
import { vi } from "./vi.js";
|
|
47
|
+
import { am } from "./am.js";
|
|
48
|
+
import { ar } from "./ar.js";
|
|
49
|
+
import { bg } from "./bg.js";
|
|
50
|
+
import { bs } from "./bs.js";
|
|
51
|
+
import { ca } from "./ca.js";
|
|
52
|
+
import { cs } from "./cs.js";
|
|
53
|
+
import { da } from "./da.js";
|
|
54
|
+
import { el } from "./el.js";
|
|
55
|
+
import { es419 } from "./es-419.js";
|
|
56
|
+
import { et } from "./et.js";
|
|
57
|
+
import { fa } from "./fa.js";
|
|
58
|
+
import { fi } from "./fi.js";
|
|
59
|
+
import { frCA } from "./fr-CA.js";
|
|
60
|
+
import { gu } from "./gu.js";
|
|
61
|
+
import { hi } from "./hi.js";
|
|
62
|
+
import { hr } from "./hr.js";
|
|
63
|
+
import { hu } from "./hu.js";
|
|
64
|
+
import { hy } from "./hy.js";
|
|
65
|
+
import { id } from "./id.js";
|
|
66
|
+
import { is as isIS } from "./is.js";
|
|
67
|
+
import { ka } from "./ka.js";
|
|
68
|
+
import { kk } from "./kk.js";
|
|
69
|
+
import { kn } from "./kn.js";
|
|
70
|
+
import { ko } from "./ko.js";
|
|
71
|
+
import { lt } from "./lt.js";
|
|
72
|
+
import { zhHans } from "./zh-Hans.js";
|
|
73
|
+
import { ur } from "./ur.js";
|
|
74
|
+
import { uk } from "./uk.js";
|
|
75
|
+
import { ptBR } from "./pt-BR.js";
|
|
76
|
+
import { ptPT } from "./pt-PT.js";
|
|
77
|
+
import { pl } from "./pl.js";
|
|
78
|
+
import { sk } from "./sk.js";
|
|
79
|
+
import { ro } from "./ro.js";
|
|
80
|
+
import { nb } from "./nb.js";
|
|
81
|
+
import { ml } from "./ml.js";
|
|
82
|
+
import { ru } from "./ru.js";
|
|
83
|
+
import { pa } from "./pa.js";
|
|
84
|
+
import { mr } from "./mr.js";
|
|
85
|
+
import { tr } from "./tr.js";
|
|
86
|
+
import { sw } from "./sw.js";
|
|
87
|
+
import { te } from "./te.js";
|
|
88
|
+
import { tl } from "./tl.js";
|
|
89
|
+
import { th } from "./th.js";
|
|
90
|
+
import { bn } from "./bn.js";
|
|
91
|
+
import { ms } from "./ms.js";
|
|
92
|
+
import { so } from "./so.js";
|
|
93
|
+
import { nl } from "./nl.js";
|
|
94
|
+
import { sv } from "./sv.js";
|
|
95
|
+
import { lv } from "./lv.js";
|
|
96
|
+
import { mk } from "./mk.js";
|
|
97
|
+
import { sq } from "./sq.js";
|
|
98
|
+
import { sl } from "./sl.js";
|
|
99
|
+
import { sr } from "./sr.js";
|
|
100
|
+
import { mn } from "./mn.js";
|
|
101
|
+
import { my } from "./my.js";
|
|
102
|
+
import { ta } from "./ta.js";
|
|
103
|
+
// --- Locale registration ---
|
|
104
|
+
// English MUST be first (canonical). Append additional locale objects here.
|
|
105
|
+
const locales = [en, de, esES, frFR, zhHK, zhTW, ja, it, vi, am, ar, bg, bs, ca, cs, da, el, es419, et, fa, fi, frCA, gu, hi, hr, hu, hy, id, isIS, ka, kk, kn, ko, lt, zhHans, ur, uk, ptBR, ptPT, pl, sk, ro, nb, ml, ru, pa, mr, tr, sw, te, tl, th, bn, ms, so, nl, sv, lv, mk, sq, sl, sr, mn, my, ta];
|
|
106
|
+
const TOOL_IDS = ["web_search", "deep_research", "create_image"];
|
|
107
|
+
/**
|
|
108
|
+
* Flatten contributions for a single non-tools key, deduplicating strings while
|
|
109
|
+
* preserving first-seen order (English first).
|
|
110
|
+
*/
|
|
111
|
+
function flattenKey(localeList, key) {
|
|
112
|
+
const seen = new Set();
|
|
113
|
+
const result = [];
|
|
114
|
+
for (const locale of localeList) {
|
|
115
|
+
const value = locale[key];
|
|
116
|
+
if (value === undefined || value === null)
|
|
117
|
+
continue;
|
|
118
|
+
const candidates = typeof value === "string" ? [value] : value;
|
|
119
|
+
for (const candidate of candidates) {
|
|
120
|
+
if (candidate.length > 0 && !seen.has(candidate)) {
|
|
121
|
+
seen.add(candidate);
|
|
122
|
+
result.push(candidate);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Flatten contributions for a single tool id across all locales.
|
|
130
|
+
*/
|
|
131
|
+
function flattenTool(localeList, toolId) {
|
|
132
|
+
const seen = new Set();
|
|
133
|
+
const result = [];
|
|
134
|
+
for (const locale of localeList) {
|
|
135
|
+
const tools = locale["tools"];
|
|
136
|
+
if (tools === undefined || tools === null)
|
|
137
|
+
continue;
|
|
138
|
+
const value = tools[toolId];
|
|
139
|
+
if (value === undefined || value === null)
|
|
140
|
+
continue;
|
|
141
|
+
const candidates = typeof value === "string" ? [value] : value;
|
|
142
|
+
for (const candidate of candidates) {
|
|
143
|
+
if (candidate.length > 0 && !seen.has(candidate)) {
|
|
144
|
+
seen.add(candidate);
|
|
145
|
+
result.push(candidate);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
// Build the combined localeLabels object by flattening all locales.
|
|
152
|
+
const nonToolKeys = [
|
|
153
|
+
"composerTextbox",
|
|
154
|
+
"sendButton",
|
|
155
|
+
"searchChatsButton",
|
|
156
|
+
"searchChatsPlaceholder",
|
|
157
|
+
"newChat",
|
|
158
|
+
"addFilesButton",
|
|
159
|
+
"addFilesOpenerCandidates",
|
|
160
|
+
"addPhotosFilesMenuItem",
|
|
161
|
+
"projectSourcesTab",
|
|
162
|
+
"projectSourcesAddSource",
|
|
163
|
+
"projectSourcesUploadFiles",
|
|
164
|
+
"copyResponse",
|
|
165
|
+
"download",
|
|
166
|
+
"downloadImage",
|
|
167
|
+
"imageContainerHint",
|
|
168
|
+
"modeLabels",
|
|
169
|
+
"modeOpenerExtra",
|
|
170
|
+
"signedInMarkers",
|
|
171
|
+
"transientAssistant",
|
|
172
|
+
"stopControl",
|
|
173
|
+
"stoppedAssistant",
|
|
174
|
+
"responseActions",
|
|
175
|
+
"loginBlocker",
|
|
176
|
+
"captchaBlocker",
|
|
177
|
+
"rateLimitBlocker",
|
|
178
|
+
];
|
|
179
|
+
const builtLabels = Object.fromEntries(nonToolKeys.map(key => [key, flattenKey(locales, key)]));
|
|
180
|
+
const builtTools = Object.fromEntries(TOOL_IDS.map(id => [id, flattenTool(locales, id)]));
|
|
181
|
+
/**
|
|
182
|
+
* The combined locale registry. Values are `string[]` (mutable; English-first; deduped).
|
|
183
|
+
* Consumers treat this identically to the previous `as const` object — the array contents
|
|
184
|
+
* are identical to the original English-only values unless additional locales are added.
|
|
185
|
+
*/
|
|
186
|
+
export const localeLabels = {
|
|
187
|
+
...builtLabels,
|
|
188
|
+
tools: builtTools,
|
|
189
|
+
};
|
|
190
|
+
// --- Helpers (re-exported so the barrel and any direct locale/index imports both work) ---
|
|
191
|
+
export function escapeRegExp(value) {
|
|
192
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Builds a case-insensitive RegExp that matches any of the candidate labels as a
|
|
196
|
+
* substring. Suitable for Playwright `getByRole({ name })` and `getByPlaceholder()`,
|
|
197
|
+
* which accept a RegExp and preserve the prior substring-match semantics for a single
|
|
198
|
+
* English candidate while transparently supporting added locales.
|
|
199
|
+
*/
|
|
200
|
+
export function anyLabelPattern(candidates) {
|
|
201
|
+
return new RegExp(candidates.map(escapeRegExp).join("|"), "i");
|
|
202
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icelandic (is-IS). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=is-IS, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export declare const is: {
|
|
10
|
+
composerTextbox: string[];
|
|
11
|
+
sendButton: string[];
|
|
12
|
+
searchChatsButton: string[];
|
|
13
|
+
searchChatsPlaceholder: string[];
|
|
14
|
+
newChat: string[];
|
|
15
|
+
addFilesButton: string[];
|
|
16
|
+
addFilesOpenerCandidates: string[];
|
|
17
|
+
addPhotosFilesMenuItem: string[];
|
|
18
|
+
copyResponse: string[];
|
|
19
|
+
modeLabels: string[];
|
|
20
|
+
modeOpenerExtra: string[];
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: string[];
|
|
23
|
+
deep_research: string[];
|
|
24
|
+
create_image: string[];
|
|
25
|
+
};
|
|
26
|
+
signedInMarkers: string[];
|
|
27
|
+
responseActions: string[];
|
|
28
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icelandic (is-IS). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=is-IS, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export const is = {
|
|
10
|
+
composerTextbox: ["Spjallaðu við ChatGPT"],
|
|
11
|
+
sendButton: ["Senda kvaðningu"],
|
|
12
|
+
searchChatsButton: ["Leita í spjöllum"],
|
|
13
|
+
searchChatsPlaceholder: ["Leita í spjalli..."],
|
|
14
|
+
newChat: ["Nýtt spjall"],
|
|
15
|
+
addFilesButton: ["Bæta við skrám og fleira"],
|
|
16
|
+
addFilesOpenerCandidates: ["Bæta við skrám og fleira"],
|
|
17
|
+
addPhotosFilesMenuItem: ["Bæta myndum og skrám við"],
|
|
18
|
+
copyResponse: ["Afrita svar"],
|
|
19
|
+
modeLabels: ["Strax", "Miðlungs", "Hátt", "Mjög hátt"],
|
|
20
|
+
modeOpenerExtra: ["Stillir…"],
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: ["Vefleit"],
|
|
23
|
+
deep_research: ["Ítarleg rannsókn"],
|
|
24
|
+
create_image: ["Búa til mynd"],
|
|
25
|
+
},
|
|
26
|
+
signedInMarkers: ["Nýtt spjall", "Leita í spjöllum", "Nýlegt", "Spjallferill", "Verkefni", "Spjallaðu við ChatGPT"],
|
|
27
|
+
responseActions: ["Afrita svar"],
|
|
28
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Italian (it-IT). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=it-IT, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export declare const it: {
|
|
10
|
+
composerTextbox: string[];
|
|
11
|
+
sendButton: string[];
|
|
12
|
+
searchChatsButton: string[];
|
|
13
|
+
searchChatsPlaceholder: string[];
|
|
14
|
+
newChat: string[];
|
|
15
|
+
addFilesButton: string[];
|
|
16
|
+
addFilesOpenerCandidates: string[];
|
|
17
|
+
addPhotosFilesMenuItem: string[];
|
|
18
|
+
copyResponse: string[];
|
|
19
|
+
modeLabels: string[];
|
|
20
|
+
modeOpenerExtra: string[];
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: string[];
|
|
23
|
+
create_image: string[];
|
|
24
|
+
};
|
|
25
|
+
signedInMarkers: string[];
|
|
26
|
+
responseActions: string[];
|
|
27
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Italian (it-IT). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=it-IT, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export const it = {
|
|
10
|
+
composerTextbox: ["Chatta con ChatGPT"],
|
|
11
|
+
sendButton: ["Invia prompt"],
|
|
12
|
+
searchChatsButton: ["Cerca chat"],
|
|
13
|
+
searchChatsPlaceholder: ["Cerca chat…"],
|
|
14
|
+
newChat: ["Nuova chat"],
|
|
15
|
+
addFilesButton: ["Aggiungi file e altro"],
|
|
16
|
+
addFilesOpenerCandidates: ["Aggiungi file e altro"],
|
|
17
|
+
addPhotosFilesMenuItem: ["Aggiungi foto e file"],
|
|
18
|
+
copyResponse: ["Copia risposta"],
|
|
19
|
+
modeLabels: ["Istantanea", "Media", "Alta", "Extra elevata"],
|
|
20
|
+
modeOpenerExtra: ["Configura"],
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: ["Ricerca sul web"],
|
|
23
|
+
create_image: ["Crea immagine"],
|
|
24
|
+
},
|
|
25
|
+
signedInMarkers: ["Nuova chat", "Cerca chat", "Chat recenti", "Libreria", "Progetti", "Chatta con ChatGPT"],
|
|
26
|
+
responseActions: ["Copia risposta"],
|
|
27
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Japanese (ja-JP). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=ja-JP, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export declare const ja: {
|
|
10
|
+
composerTextbox: string[];
|
|
11
|
+
sendButton: string[];
|
|
12
|
+
searchChatsButton: string[];
|
|
13
|
+
searchChatsPlaceholder: string[];
|
|
14
|
+
newChat: string[];
|
|
15
|
+
addFilesButton: string[];
|
|
16
|
+
addFilesOpenerCandidates: string[];
|
|
17
|
+
addPhotosFilesMenuItem: string[];
|
|
18
|
+
copyResponse: string[];
|
|
19
|
+
modeLabels: string[];
|
|
20
|
+
modeOpenerExtra: string[];
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: string[];
|
|
23
|
+
create_image: string[];
|
|
24
|
+
};
|
|
25
|
+
signedInMarkers: string[];
|
|
26
|
+
responseActions: string[];
|
|
27
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Japanese (ja-JP). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=ja-JP, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export const ja = {
|
|
10
|
+
composerTextbox: ["ChatGPT とチャットする"],
|
|
11
|
+
sendButton: ["プロンプトを送信する"],
|
|
12
|
+
searchChatsButton: ["チャットを検索"],
|
|
13
|
+
searchChatsPlaceholder: ["チャットを検索..."],
|
|
14
|
+
newChat: ["新しいチャット"],
|
|
15
|
+
addFilesButton: ["ファイルの追加など"],
|
|
16
|
+
addFilesOpenerCandidates: ["ファイルの追加など"],
|
|
17
|
+
addPhotosFilesMenuItem: ["写真とファイルを追加"],
|
|
18
|
+
copyResponse: ["回答をコピーする"],
|
|
19
|
+
modeLabels: ["最速", "標準", "高", "最高"],
|
|
20
|
+
modeOpenerExtra: ["設定する"],
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: ["ウェブ検索"],
|
|
23
|
+
create_image: ["画像を作成する"],
|
|
24
|
+
},
|
|
25
|
+
signedInMarkers: ["新しいチャット", "チャットを検索", "最近のチャット", "ライブラリ", "プロジェクト", "ChatGPT とチャットする"],
|
|
26
|
+
responseActions: ["回答をコピーする"],
|
|
27
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Georgian (ka-GE). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=ka-GE, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export declare const ka: {
|
|
10
|
+
composerTextbox: string[];
|
|
11
|
+
sendButton: string[];
|
|
12
|
+
searchChatsButton: string[];
|
|
13
|
+
searchChatsPlaceholder: string[];
|
|
14
|
+
newChat: string[];
|
|
15
|
+
addFilesButton: string[];
|
|
16
|
+
addFilesOpenerCandidates: string[];
|
|
17
|
+
addPhotosFilesMenuItem: string[];
|
|
18
|
+
copyResponse: string[];
|
|
19
|
+
modeLabels: string[];
|
|
20
|
+
modeOpenerExtra: string[];
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: string[];
|
|
23
|
+
deep_research: string[];
|
|
24
|
+
create_image: string[];
|
|
25
|
+
};
|
|
26
|
+
signedInMarkers: string[];
|
|
27
|
+
responseActions: string[];
|
|
28
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Georgian (ka-GE). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=ka-GE, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export const ka = {
|
|
10
|
+
composerTextbox: ["საუბარი ChatGPT-სთან"],
|
|
11
|
+
sendButton: ["მოთხოვნის გაგზავნა"],
|
|
12
|
+
searchChatsButton: ["ჩატების ძიება"],
|
|
13
|
+
searchChatsPlaceholder: ["მოძებნეთ ჩატებში…"],
|
|
14
|
+
newChat: ["ახალი ჩატი"],
|
|
15
|
+
addFilesButton: ["ფაილების დამატება და მეტი"],
|
|
16
|
+
addFilesOpenerCandidates: ["ფაილების დამატება და მეტი"],
|
|
17
|
+
addPhotosFilesMenuItem: ["ფოტოების და ფაილების დამატება"],
|
|
18
|
+
copyResponse: ["პასუხის კოპირება"],
|
|
19
|
+
modeLabels: ["მყისიერი", "საშუალო", "მაღალი", "ძალიან მაღალი"],
|
|
20
|
+
modeOpenerExtra: ["კონფიგურირება…"],
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: ["ვებში ძიება"],
|
|
23
|
+
deep_research: ["სიღრმისეული კვლევა"],
|
|
24
|
+
create_image: ["შექმენი სურათი"],
|
|
25
|
+
},
|
|
26
|
+
signedInMarkers: ["ახალი ჩატი", "ჩატების ძიება", "ბოლოდროინდელი", "ჩატის ისტორია", "პროექტები", "საუბარი ChatGPT-სთან"],
|
|
27
|
+
responseActions: ["პასუხის კოპირება"],
|
|
28
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kazakh (kk). Captured 2026-06-09 against a live chatgpt.com session
|
|
3
|
+
* (html lang=kk, Google Translate confirmed off).
|
|
4
|
+
*
|
|
5
|
+
* Some non-Intelligence surfaces may still fall back to English + `selector_drift`.
|
|
6
|
+
*
|
|
7
|
+
* Intelligence picker labels updated 2026-06-10 from a visible ChatGPT Pro session.
|
|
8
|
+
*/
|
|
9
|
+
export declare const kk: {
|
|
10
|
+
composerTextbox: string[];
|
|
11
|
+
sendButton: string[];
|
|
12
|
+
searchChatsButton: string[];
|
|
13
|
+
searchChatsPlaceholder: string[];
|
|
14
|
+
newChat: string[];
|
|
15
|
+
addFilesButton: string[];
|
|
16
|
+
addFilesOpenerCandidates: string[];
|
|
17
|
+
addPhotosFilesMenuItem: string[];
|
|
18
|
+
copyResponse: string[];
|
|
19
|
+
modeLabels: string[];
|
|
20
|
+
modeOpenerExtra: string[];
|
|
21
|
+
tools: {
|
|
22
|
+
web_search: string[];
|
|
23
|
+
deep_research: string[];
|
|
24
|
+
create_image: string[];
|
|
25
|
+
};
|
|
26
|
+
signedInMarkers: string[];
|
|
27
|
+
responseActions: string[];
|
|
28
|
+
};
|