@yansigit/opencodex 2.36.1-dev.20260829.21 → 2.36.1-dev.20260829.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/gui/dist/assets/ApiKeys-nJ-qJbkG.js +20 -0
  2. package/gui/dist/assets/Claude-Br34aNO2.js +2 -0
  3. package/gui/dist/assets/CodexSet-Bo2Vel9f.js +12 -0
  4. package/gui/dist/assets/FileIntegrationPage-8JuhUwT7.js +1 -0
  5. package/gui/dist/assets/Grok-pTPUqi3L.js +1 -0
  6. package/gui/dist/assets/Integrations-N-s59k0n.js +2 -0
  7. package/gui/dist/assets/IntegrationsOverview-C6Mkt8OU.js +3 -0
  8. package/gui/dist/assets/Logs-BzYAbD9a.js +1 -0
  9. package/gui/dist/assets/Models-8o4TdPzd.js +1 -0
  10. package/gui/dist/assets/NumberStepper-y1MLMfxu.js +1 -0
  11. package/gui/dist/assets/Providers-oTh_-wqc.js +1 -0
  12. package/gui/dist/assets/RestoreDialog-BnPA60nS.js +1 -0
  13. package/gui/dist/assets/Startup-eM7zbmU_.js +1 -0
  14. package/gui/dist/assets/Storage-Cuf1wakW.js +1 -0
  15. package/gui/dist/assets/Subagents-DEnwUJJx.js +1 -0
  16. package/gui/dist/assets/Usage-BMBOTm6l.js +1 -0
  17. package/gui/dist/assets/catalog-CerhMn14.js +1 -0
  18. package/gui/dist/assets/collapse-store-DnqZvhx0.js +1 -0
  19. package/gui/dist/assets/data-surface-Cq2fDI2w.js +1 -0
  20. package/gui/dist/assets/data-surface-D8RXShV2.js +1 -0
  21. package/gui/dist/assets/index-CEcmjvjC.js +12 -0
  22. package/gui/dist/assets/index-pLho_LBF.css +1 -0
  23. package/gui/dist/assets/intl-formatters-CTcuZoAe.js +1 -0
  24. package/gui/dist/assets/model-display-CTtXLqIv.js +1 -0
  25. package/gui/dist/assets/provider-payload-Bs3Sdqv7.js +1 -0
  26. package/gui/dist/assets/section-tabs-DEASco68.js +1 -0
  27. package/gui/dist/assets/shared-p0R307IX.js +69 -0
  28. package/gui/dist/index.html +3 -2
  29. package/package.json +1 -1
  30. package/src/generated/compatibility-version.json +1 -1
  31. package/gui/dist/assets/index-DLkXOXLC.css +0 -1
  32. package/gui/dist/assets/index-JGrKnrFw.js +0 -112
@@ -0,0 +1,69 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n)),l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function k(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var A=/\/+/g;function j(e,t){return typeof e==`object`&&e&&e.key!=null?k(``+e.key):t.toString(36)}function M(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function N(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,N(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+j(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(A,`$&/`)+`/`),N(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(A,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u<e.length;u++)a=e[u],s=l+j(a,u),c+=N(a,r,i,s,o);else if(u=m(e),typeof u==`function`)for(e=u.call(e),u=0;!(a=e.next()).done;)a=a.value,s=l+j(a,u++),c+=N(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return N(M(e),r,i,a,o);throw r=String(e),Error(`Objects are not valid as a React child (found: `+(r===`[object Object]`?`object with keys {`+Object.keys(e).join(`, `)+`}`:r)+`). If you meant to render a collection of children, use an array instead.`)}return c}function P(e,t,n){if(e==null)return e;var r=[],i=0;return N(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function F(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(t){(e._status===0||e._status===-1)&&(e._status=1,e._result=t)},function(t){(e._status===0||e._status===-1)&&(e._status=2,e._result=t)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var I=typeof reportError==`function`?reportError:function(e){if(typeof window==`object`&&typeof window.ErrorEvent==`function`){var t=new window.ErrorEvent(`error`,{bubbles:!0,cancelable:!0,message:typeof e==`object`&&e&&typeof e.message==`string`?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process==`object`&&typeof process.emit==`function`){process.emit(`uncaughtException`,e);return}console.error(e)},L={map:P,forEach:function(e,t,n){P(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return P(e,function(){t++}),t},toArray:function(e){return P(e,function(e){return e})||[]},only:function(e){if(!O(e))throw Error(`React.Children.only expected to receive a single React element child.`);return e}};e.Activity=f,e.Children=L,e.Component=v,e.Fragment=r,e.Profiler=a,e.PureComponent=b,e.StrictMode=i,e.Suspense=l,e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=w,e.__COMPILER_RUNTIME={__proto__:null,c:function(e){return w.H.useMemoCache(e)}},e.cache=function(e){return function(){return e.apply(null,arguments)}},e.cacheSignal=function(){return null},e.cloneElement=function(e,t,n){if(e==null)throw Error(`The argument must be a React element, but you passed `+e+`.`);var r=g({},e.props),i=e.key;if(t!=null)for(a in t.key!==void 0&&(i=``+t.key),t)!T.call(t,a)||a===`key`||a===`__self`||a===`__source`||a===`ref`&&t.ref===void 0||(r[a]=t[a]);var a=arguments.length-2;if(a===1)r.children=n;else if(1<a){for(var o=Array(a),s=0;s<a;s++)o[s]=arguments[s+2];r.children=o}return E(e.type,i,r)},e.createContext=function(e){return e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:o,_context:e},e},e.createElement=function(e,t,n){var r,i={},a=null;if(t!=null)for(r in t.key!==void 0&&(a=``+t.key),t)T.call(t,r)&&r!==`key`&&r!==`__self`&&r!==`__source`&&(i[r]=t[r]);var o=arguments.length-2;if(o===1)i.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];i.children=s}if(e&&e.defaultProps)for(r in o=e.defaultProps,o)i[r]===void 0&&(i[r]=o[r]);return E(e,a,i)},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:c,render:e}},e.isValidElement=O,e.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:F}},e.memo=function(e,t){return{$$typeof:u,type:e,compare:t===void 0?null:t}},e.startTransition=function(e){var t=w.T,n={};w.T=n;try{var r=e(),i=w.S;i!==null&&i(n,r),typeof r==`object`&&r&&typeof r.then==`function`&&r.then(C,I)}catch(e){I(e)}finally{t!==null&&n.types!==null&&(t.types=n.types),w.T=t}},e.unstable_useCacheRefresh=function(){return w.H.useCacheRefresh()},e.use=function(e){return w.H.use(e)},e.useActionState=function(e,t,n){return w.H.useActionState(e,t,n)},e.useCallback=function(e,t){return w.H.useCallback(e,t)},e.useContext=function(e){return w.H.useContext(e)},e.useDebugValue=function(){},e.useDeferredValue=function(e,t){return w.H.useDeferredValue(e,t)},e.useEffect=function(e,t){return w.H.useEffect(e,t)},e.useEffectEvent=function(e){return w.H.useEffectEvent(e)},e.useId=function(){return w.H.useId()},e.useImperativeHandle=function(e,t,n){return w.H.useImperativeHandle(e,t,n)},e.useInsertionEffect=function(e,t){return w.H.useInsertionEffect(e,t)},e.useLayoutEffect=function(e,t){return w.H.useLayoutEffect(e,t)},e.useMemo=function(e,t){return w.H.useMemo(e,t)},e.useOptimistic=function(e,t){return w.H.useOptimistic(e,t)},e.useReducer=function(e,t,n){return w.H.useReducer(e,t,n)},e.useRef=function(e){return w.H.useRef(e)},e.useState=function(e){return w.H.useState(e)},e.useSyncExternalStore=function(e,t,n){return w.H.useSyncExternalStore(e,t,n)},e.useTransition=function(){return w.H.useTransition()},e.version=`19.2.8`})),u=o(((e,t)=>{t.exports=l()})),d=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),f=o(((e,t)=>{t.exports=d()})),p=c(u(),1),m={"nav.dashboard":`Dashboard`,"uptime.day":`d`,"uptime.hour":`h`,"uptime.minute":`m`,"uptime.second":`s`,"nav.startup":`Startup`,"nav.providers":`Providers`,"nav.models":`Models`,"nav.combos":`Combos`,"nav.subagents":`Subagents`,"nav.logs":`Logs & Debug`,"nav.usage":`Usage`,"common.github":`GitHub`,"sidebar.star":`Star on GitHub`,"sidebar.starred":`Starred on GitHub`,"sidebar.starUnauthenticated":`Open GitHub to star (gh CLI is not signed in)`,"sidebar.starFailed":`Could not star through gh. Opening GitHub instead.`,"sidebar.updateAvailable":`Update available: {version}`,"sidebar.checkUpdate":`Check for updates`,"common.save":`Save`,"common.saving":`Saving…`,"common.cancel":`Cancel`,"common.discard":`Discard`,"common.delete":`Delete`,"common.close":`Close`,"common.ok":`OK`,"common.remove":`Remove`,"common.loading":`Loading…`,"common.retry":`Retry`,"auth.adminTokenTitle":`OpenCodex admin token (OPENCODEX_ADMIN_AUTH_TOKEN)`,"auth.adminAccountLabel":`Account`,"auth.adminTokenFieldLabel":`Admin token`,"auth.adminTokenRejected":`That admin token was rejected. Check it and try again.`,"auth.adminTokenUnavailable":`The admin token could not be verified. Try again.`,"app.logoAria":`opencodex logo`,"app.pageTitle":`{page} — opencodex`,"app.claudeOn":`Claude ON`,"app.claudeOff":`Claude OFF`,"theme.label":`Theme`,"theme.light":`Light`,"theme.dark":`Dark`,"theme.system":`System`,"lang.label":`Language`,"lang.nativeName":`English`,"provider.name.commandCodeAuth":`Command Code - Auth`,"provider.name.commandCodeApi":`Command Code - API`,"provider.name.volcengine":`Volcengine Ark`,"provider.name.volcengineCodingPlan":`Volcengine Ark Coding Plan`,"provider.name.volcengineAgentPlan":`Volcengine Ark Agent Plan`,"errorBoundary.title":`Page failed to load`,"errorBoundary.message":`This section hit a rendering error. Reload it to try again.`,"errorBoundary.details":`Error`,"errorBoundary.reload":`Reload`,"routing.title":`Routing Intelligence (beta)`,"routing.subtitle":`Policy profiles, dry-run evaluation, and source-backed routing analytics.`,"routing.loadFailed":`Could not load routing data`,"routing.empty":"No routing profiles configured. Add `routingProfiles` to config.json.","routing.revision":`rev`,"routing.detail":`Profile`,"routing.createProfile":`Create profile`,"routing.dryRunError":`Dry-run failed (HTTP {status})`,"routing.removeConfirm":`Remove profile {id}?`,"routing.unknownEvidence.allow":`allow`,"routing.unknownEvidence.penalize":`penalize`,"routing.unknownEvidence.exclude":`exclude`,"routing.removeCandidate":`Remove candidate {provider}/{model}`,"routing.candidates":`Candidates`,"routing.require":`Hard requirements`,"routing.optimize":`Optimization weights`,"routing.limits":`Limits`,"routing.unknownEvidence":`Unknown evidence policy`,"routing.compatibility.title":`Compatibility policy`,"routing.compatibility.enabled":`Require Compatibility Lab evidence`,"routing.compatibility.requiredSuites":`Required suites`,"routing.compatibility.loadingCatalog":`Loading lab catalog…`,"routing.compatibility.catalogUnavailable":`Lab catalog unavailable — enter suite ids manually in config.json.`,"routing.compatibility.layer.protocol_conformance":`Protocol conformance`,"routing.compatibility.layer.live_route_compatibility":`Live route compatibility`,"routing.compatibility.minStatus":`Minimum compatibility status`,"routing.none":`none`,"routing.unavailable":`–`,"routing.dryRun":`Dry-run evaluation`,"routing.dryRunContext":`Request context window (tokens)`,"routing.dryRunTools":`Request requires tools`,"routing.dryRunImage":`Request requires image input`,"routing.dryRunStructured":`Request requires structured output`,"routing.dryRunRun":`Evaluate candidates`,"routing.candidate":`Candidate`,"routing.eligible":`Eligible`,"routing.exclusions":`Exclusions`,"routing.costCap":`Cost cap`,"routing.capOutcome.satisfied":`within limit`,"routing.capOutcome.exceeded":`over limit`,"routing.capOutcome.unknown-allowed":`unknown (allowed)`,"routing.capOutcome.unknown-excluded":`unknown (excluded)`,"routing.exclusion.capability-unsatisfied":`capability not met`,"routing.exclusion.unknown-capability":`unknown capability`,"routing.exclusion.cost-limit":`over cost cap`,"routing.exclusion.cost-limit-unknown":`unknown cost under cap`,"routing.exclusion.cooldown":`cooldown`,"routing.exclusion.unknown-health":`unknown health`,"routing.exclusion.unknown-quota":`unknown quota`,"routing.exclusion.unknown-price":`unknown price`,"routing.exclusion.other":`exclusion: {code}`,"routing.score":`Score`,"routing.selected":`selected`,"routing.yes":`yes`,"routing.no":`no`,"routing.analytics":`Routing analytics`,"routing.analyticsTotal":`Requests`,"routing.analyticsSuccessRate":`Success`,"routing.analyticsFallbackRate":`Fallback`,"routing.analyticsP50":`p50`,"routing.analyticsP95":`p95`,"routing.analyticsP99":`p99`,"routing.analyticsCooldown":`Cooldown failures`,"routing.analyticsConfidence":`Confidence`,"routing.analyticsTruncated":`truncated history`,"routing.analyticsRequests":`Requests`,"routing.analyticsEmpty":`No analytics yet — send some requests first.`,"startup.title":`Startup safety`,"startup.subtitle":`Verify that Codex can reach opencodex after a restart, before local proxy routing becomes a reconnect loop.`,"startup.refresh":`Refresh`,"startup.backToDashboard":`Back to Dashboard`,"startup.loading":`Checking startup protection…`,"startup.error":`Could not read startup protection.`,"startup.staleData":`The latest startup check failed. The values below are stale and must not be treated as proof of protection.`,"startup.status.native":`Native routing`,"startup.status.protected":`Restart protected`,"startup.status.atRisk":`Action required`,"startup.summary.native":`Codex does not depend on the local proxy`,"startup.summary.protected":`opencodex will be available after restart`,"startup.summary.atRisk":`Codex can lose model access after restart`,"startup.riskDetail":`Codex is pinned to the local proxy, but no persistent service or healthy launcher shim will start it again.`,"startup.riskDetailCustomLocal":`Codex points to a custom local gateway. opencodex cannot manage or verify that gateway's restart lifecycle.`,"startup.riskDetailWindowsShim":`The launcher shim protects supported CLI scripts, but Codex Desktop and direct codex.exe launches can bypass it on Windows.`,"startup.safeDetail":`The current routing and startup mechanism are consistent. No manual ocx start should be required after restart.`,"startup.routing":`Codex routing`,"startup.routing.proxy":`Local proxy`,"startup.routing.native":`Native OpenAI`,"startup.routing.customLocal":`Custom local gateway`,"startup.routing.customRemote":`Custom remote gateway`,"startup.routing.unknown":`Unknown or invalid routing`,"startup.restartProtection":`Restart protection`,"startup.preference":`On-demand startup`,"startup.enabled":`Enabled`,"startup.disabled":`Disabled`,"startup.protection.service":`Background service`,"startup.protection.shim":`Launcher shim`,"startup.protection.none":`Not installed`,"startup.details":`Protection details`,"startup.service":`Background service`,"startup.serviceHint":`Starts at login and restarts the proxy after a crash.`,"startup.installed":`Installed`,"startup.notInstalled":`Not installed`,"startup.unsupported":`Unsupported`,"startup.shim":`Codex launcher shim`,"startup.shimHint":`Runs ocx ensure when a supported Codex script launcher starts.`,"startup.healthy":`Healthy`,"startup.cliOnly":`CLI only`,"startup.stale":`Stale`,"startup.viable":`Ready`,"startup.unhealthy":`Installed but unhealthy`,"startup.conflict":`Service conflict`,"startup.installedDisabled":`Installed but disabled`,"startup.install":`Install`,"startup.installing":`Installing…`,"startup.repair":`Repair`,"startup.repairing":`Repairing…`,"startup.serviceInstalled":`Background service installed successfully.`,"startup.serviceRepaired":`Background service repaired successfully.`,"startup.shimInstalled":`Codex launcher shim installed successfully.`,"startup.shimRepaired":`Codex launcher shim repaired successfully.`,"startup.installFailed":`Installation failed:`,"startup.tray.title":`Windows system tray`,"startup.tray.hint":`Install a login tray icon for one-click proxy start, stop, restart, dashboard, and status controls.`,"startup.tray.login":`Start tray at Windows login`,"startup.tray.notProtection":`The tray is a controller, not restart protection. A viable background service is still required for unattended proxy recovery.`,"startup.tray.running":`Running`,"startup.tray.stopped":`Installed, hidden`,"startup.tray.stale":`Repair required`,"startup.tray.notInstalled":`Not installed`,"startup.tray.loading":`Checking…`,"startup.tray.unavailable":`Status unavailable`,"startup.tray.install":`Install and show tray`,"startup.tray.start":`Show tray icon`,"startup.tray.stop":`Exit tray icon`,"startup.tray.uninstall":`Remove login tray`,"startup.tray.error":`The Windows tray action failed. Check ocx tray status for details.`,"startup.recovery":`Repair options`,"startup.recoveryHint":`Use the one-click installers above, or copy a command for manual repair. The background service is recommended for Codex Desktop and Windows executables.`,"startup.command.service":`Recommended: persistent background service`,"startup.command.shim":`Alternative: CLI launcher shim`,"startup.command.native":`Fail-safe: restore native Codex routing`,"startup.copy":`Copy`,"startup.copied":`Copied`,"startup.recommended":`Recommended repair: {cmd}`,"startup.navRisk":`Startup protection requires attention`,"startup.codexRuntime.clampHidden":`Some reasoning effort options were hidden because OpenCodex used Codex {version}.`,"startup.codexRuntime.clampHiddenWithEfforts":`Some reasoning effort options were hidden because OpenCodex used Codex {version} (removed: {efforts}).`,"startup.codexRuntime.olderBinary":`OpenCodex is using an older Codex binary ({version}). A newer installation is available.`,"dash.subtitle":`Live status of the local opencodex proxy, its providers, and the models routed into Codex.`,"dash.workspace.overview":`Overview`,"dash.workspace.sections":`Sections`,"dash.status":`Status`,"dash.online":`Online`,"dash.offline":`Offline`,"dash.version":`Version`,"dash.uptime":`Uptime`,"dash.providers":`Providers`,"dash.tokens30d":`Tokens (30d)`,"dash.activity.title":`30-day activity`,"dash.activity.requests":`Requests`,"dash.activity.tokens":`Tokens`,"dash.activity.chartLabel":`30-day activity. Use Left and Right to select a day; Home and End jump to the range bounds.`,"dash.activity.viewUsage":`View usage`,"dash.coverage":`{pct} coverage`,"dash.mem.title":`Memory observability`,"dash.mem.hint":`Read-only runtime diagnostics. Observed memory is max(RSS, external, ArrayBuffers) so Windows working-set trimming does not hide committed retention.`,"dash.mem.rss":`Resident set (RSS)`,"dash.mem.jsHeap":`JS heap in use`,"dash.mem.jsHeapArena":`arena {total}`,"dash.mem.pressure":`Against warn threshold`,"dash.mem.pressureOf":`{pct}% of threshold`,"dash.mem.pressureUnknown":`No threshold reported`,"dash.mem.jscHeap":`JSC heap`,"dash.mem.external":`External`,"dash.mem.arrayBuffers":`ArrayBuffers`,"dash.mem.observed":`Observed`,"dash.mem.runtime":`Runtime counters`,"dash.mem.growth":`Observed drift / hour`,"dash.mem.perHour":`/h`,"dash.mem.store":`Continuation store`,"dash.mem.storeHint":`Proxy previous_response_id cache. Rising total bytes under a rising heap points at conversation retention rather than the runtime allocator.`,"dash.mem.storeEntries":`Entries`,"dash.mem.storeTotal":`Total`,"dash.mem.storeLargest":`Largest`,"dash.mem.storeOldest":`Oldest`,"dash.mem.threshold":`Warn threshold`,"dash.mem.lastWarn":`Last warning`,"dash.mem.never":`Never`,"dash.mem.details":`Details`,"dash.mem.unavailable":`Memory diagnostics unavailable (older proxy).`,"dash.mem.inFlight":`In-flight requests`,"dash.mem.restart":`Drain & restart`,"dash.mem.restartConfirm":`Wait for {count} in-flight request(s), then restart (up to {seconds}s; remaining requests are cut on timeout).`,"dash.mem.draining":`Draining {count} request(s)… restarting when complete`,"dash.mem.reconnecting":`Proxy restarting… waiting to reconnect`,"dash.connectionReconnecting":`Connection interrupted — reconnecting…`,"dash.mem.restartFailed":`Drain & restart failed. Check that the proxy is running.`,"dash.mem.restartNoSupervisor":`No restart protection detected. The proxy may stay down after restart unless you start it again.`,"dash.activeProviders":`Active providers`,"dash.noProviders":`No providers configured. Run {cmd}.`,"dash.col.name":`Name`,"dash.col.adapter":`Adapter`,"dash.col.baseUrl":`Base URL`,"dash.col.model":`Model`,"dash.modelsNoResults":`No models match your search.`,"dash.availableModels":`Available models`,"dash.noModels":`No models found. Check provider API keys.`,"dash.cannotConnect":`Cannot connect to proxy. Is it running?`,"dash.runStart":`Run {cmd} to start the proxy.`,"dash.stop":`Stop Proxy`,"dash.stopConfirm":`Stop the proxy and restore native Codex?`,"dash.stopFailed":`Failed to stop proxy (HTTP {status}).`,"dash.maSwitchFailed":`Mode switch failed (HTTP {status}).`,"dash.maNetworkError":`Network error — is the proxy running?`,"dash.stopping":`Stopping…`,"dash.actions":`Proxy`,"dash.codexRestart":`Reload Codex models`,"dash.codexRestarting":`Stopping…`,"dash.codexRestartConfirm":`Stop Codex app-servers so they reload the model list? Any Codex turn in progress is interrupted, and Codex does not relaunch on its own — reopen it afterwards.`,"dash.codexRestartDone":`Stopped {count} Codex app-server(s). Reopen Codex to load the current model list.`,"dash.codexRestartNothing":`No Codex app-server is running. The next launch reads the current model list.`,"dash.codexRestartUnknown":`Could not list processes, so nothing was stopped.`,"dash.codexRestartPartial":`{count} app-server(s) did not exit. Stop them manually if the model list stays stale.`,"dash.codexRestartFailed":`Failed to reload Codex models (HTTP {status}).`,"dash.codexRestartUnreachable":`Could not reach the proxy.`,"dash.codexRestartMalformed":`The proxy returned an unexpected response.`,"dash.codexRestartTimeout":`The proxy did not answer in time. It may still be stopping app-servers.`,"models.staleBanner":`Codex is showing an older model list than this catalog. Restart Codex to reload it.`,"dash.codexAutoStart":`Start opencodex with Codex`,"dash.codexAutoStartHint":`Allows an installed launcher shim to run ocx ensure. This setting does not install restart protection; check Startup safety for the effective state.`,"dash.searchModel":`Search sidecar model`,"dash.searchModelHint":`Model used for web_search on non-OpenAI routed models. Requires ChatGPT login.`,"dash.searchReasoning":`Search reasoning effort`,"dash.visionModel":`Vision sidecar model`,"dash.visionModelHint":`Model used to describe images for text-only routed models. Requires ChatGPT login.`,"dash.webSearchSidecar":`Web search sidecar`,"dash.webSearchSidecarHint":`Choose the backend and model used for web search on routed models.`,"dash.webSearchStream":`Stream answers live`,"dash.webSearchStreamHint":`Stream the model’s leading text and reasoning live until it decides on a tool call; the rest of the turn stays buffered for search interception. Text written before a search may partially repeat.`,"dash.visionSidecar":`Vision sidecar`,"dash.visionSidecarHint":`Choose the backend and model used to describe images for text-only routed models.`,"dash.visionOff":`Off`,"dash.visionAdvanced":`Advanced settings`,"dash.visionMaxDescriptions":`Maximum descriptions per turn`,"dash.visionMaxDescriptionsInvalid":`Enter a positive integer.`,"dash.visionTimeout":`Timeout`,"dash.visionTimeoutInvalid":`Enter an integer from {min} to {max} milliseconds.`,"dash.visionAdvancedPopover":`Advanced vision settings`,"dash.shadowCallIntercept":`Shadow Call Intercept`,"dash.shadowCallInterceptHint":`Intercepts Codex App's background helper calls ({models}) for title generation and commit messages and redirects them to your chosen model. Effort is fixed to low.`,"dash.shadowCallWarning":`⚠ When enabled, ALL requests for {models} will be replaced with the selected model.`,"dash.shadowCallOriginal":`Original`,"dash.shadowCallModel":`Replacement model`,"dash.shadowCallTooltip":`Codex App makes background helper calls for thread title generation, commit message generation, and skill orchestration. The helper model changed across client versions, so opencodex intercepts every model in this set: {models}. Enable this to redirect those calls to your chosen model.`,"models.shadowCallIntercept":`Shadow Call Intercept`,"models.shadowCallInterceptHint":`Intercepts Codex App's background helper calls ({models}) for titles and commit messages and redirects them to your chosen model.`,"dash.sidecarBackend":`Backend`,"dash.sidecarModel":`Model`,"dash.backendAuto":`Auto`,"dash.backendOpenAI":`OpenAI`,"dash.backendAnthropic":`Anthropic`,"dash.sidecarSaved":`Sidecar settings saved. Applied on the next request.`,"dash.sidecarSaveFailed":`Failed to save sidecar settings.`,"dash.injectionLabel":`Sub-agent delegation`,"dash.injectionHint":`Pick the model Codex should hand sub-agent work to. The two switches below decide where that pick is used.`,"dash.injectionManage":`Open settings`,"dash.syncCodexSubagentDefaults":`Also save as a Codex default`,"dash.syncCodexSubagentDefaultsHint":`On, the pick above is written into Codex's own config, so new tasks start with that model too. Off, it is remembered only here. It takes effect on the next sync or restart, and your hand-written [agents] settings are left alone.`,"dash.multiAgentGuidance":`Tell Codex how to split work`,"dash.multiAgentGuidanceHint":`Sends a short note telling Codex how to hand work to sub-agents. On v2 it names the models it may use and which to prefer; on v1 it only applies at max or ultra reasoning effort. Off, no note is added.`,"dash.injectionNone":`None`,"dash.injectionEffortLabel":`Reasoning effort`,"dash.injectionEffortNone":`Model default`,"dash.effortCapLabel":`V2 ultra effort limit`,"dash.subagentEffortCapLabel":`V2 sub-agent effort limit`,"dash.effortCapHelp":`Limits the reasoning effort for V2 ultra-mode turns. When set, incoming max-effort requests (from ultra mode) are capped to the selected level. The sub-agent limit applies only to spawned child agents. Caps only lower effort, never raise it. If a model doesn't support the capped level, it snaps down to the nearest supported level.`,"dash.effortCapNone":`No cap`,"dash.maintenance":`Maintenance`,"dash.maintenanceHint":`Refresh Codex's model catalog or install a newer opencodex release.`,"dash.syncModels":`Sync models`,"dash.syncModelsHint":`Rewrite Codex's model catalog from the providers you have connected.`,"dash.syncRun":`Sync now`,"dash.syncing":`Syncing…`,"dash.syncOk":`Sync complete. {count} model(s) appended.`,"dash.syncStaleHint":`If Codex still shows an older list, restart its long-lived app-server ({cmd}).`,"dash.syncFailed":`Sync failed: {error}`,"dash.projectConfigTitle":`Project Codex config bypasses OpenCodex`,"dash.projectConfigHint":`These repo-local settings override the OpenCodex proxy (e.g. route to OpenCode Go directly). Remove them so ~/.codex/config.toml routing applies in that project.`,"dash.checkUpdate":`Check update`,"dash.updateTitle":`Update opencodex`,"dash.updateDesc":`Check npm for the selected channel, then choose whether to restart the proxy after installation.`,"dash.updateChannel":`Channel`,"dash.updateChecking":`Checking for updates…`,"dash.updateInstalled":`Installed`,"dash.updateLatest":`Latest`,"dash.updateAvailable":`Update available`,"dash.updateCurrent":`Up to date`,"dash.updateCommand":`Command`,"dash.updateSource":`This is a source checkout. Update it from the terminal with the shown command.`,"dash.updateUnavailable":`Could not read the latest version from npm. Try again later.`,"dash.updateRetry":`Retry`,"dash.updateRecheck":`Re-check`,"dash.updateCannotAuto":`One-click update is unavailable ({reason}).`,"dash.updateReason.source_checkout":`source checkout`,"dash.updateReason.latest_unavailable":`npm registry unreachable`,"dash.updateReason.already_latest":`already on latest`,"dash.updateReason.unknown":`update unavailable`,"dash.updateRestart":`Restart after update`,"dash.updateRestartHint":`Recommended. The current GUI keeps running the old code until the proxy restarts.`,"dash.runUpdate":`Update`,"dash.updateReconnecting":`Waiting for the restarted proxy…`,"dash.updateStatus.running":`Updating opencodex.`,"dash.updateStatus.restarting":`Update installed. Restarting proxy.`,"dash.updateStatus.succeeded":`Update finished.`,"dash.updateVersionTransition":`{currentVersion} -> {latestVersion}.`,"dash.updateStatus.failed":`Update failed.`,"prov.subtitle":`Configure the upstream providers opencodex routes into Codex. Log in with an account, add a provider, or edit the raw config.`,"prov.add":`Add Provider`,"prov.editJson":`Edit JSON`,"prov.accountLogin":`Account login`,"prov.noOauth":`No OAuth providers available.`,"prov.loggedIn":`logged in`,"prov.notLoggedIn":`not logged in`,"prov.logout":`Logout`,"prov.login":`Login`,"prov.loginWith":`Login with {provider}`,"prov.waitingBrowser":`Waiting for browser…`,"prov.didntOpen":`Didn't open? Click here`,"prov.copyLink":`Copy link`,"prov.dontOpenBrowser":`Don't open a browser on the proxy machine`,"prov.dontOpenBrowserHint":`Useful for a different browser profile, or when the dashboard is not on the proxy's machine.`,"prov.linkCopied":`Copied`,"prov.linkCopyUnavailable":`Clipboard unavailable`,"prov.deviceCode":`Device code`,"prov.copyCode":`Copy code`,"prov.codeCopied":`Code copied`,"prov.editAlias":`Edit alias`,"prov.aliasPrompt":`Display name (leave empty to clear)`,"prov.aliasSaved":`Alias saved`,"prov.aliasSaveFailed":`Could not save alias`,"prov.cooldownCleared":`Cooldown cleared`,"prov.cooldownClearFailed":`Could not clear cooldown`,"prov.accountId":`ID`,"prov.pasteRedirect":`Paste redirect URL or code`,"prov.pasteRedirectHint":`If the browser shows a localhost error, copy the full URL from its address bar and paste it here (or paste the authorization code).`,"prov.pasteSubmit":`Submit`,"prov.pasteSubmitting":`Submitting…`,"prov.pasteOk":`Code submitted — finishing login…`,"prov.pasteFail":`Could not submit code: {error}`,"prov.port":`Port`,"prov.default":`Default`,"prov.loadingConfig":`Loading…`,"prov.saved":`Saved! Restart proxy to apply.`,"prov.loadConfigFail":`Failed to load config`,"prov.invalidJson":`Invalid JSON`,"prov.saveFailed":`Save failed`,"prov.loginFailStart":`{provider} login failed to start`,"prov.loginError":`{provider} login error: {error}`,"prov.loginRequestFail":`{provider} login request failed`,"prov.loginCancelled":`{provider} login cancelled`,"prov.loginTimeout":`{provider} login timed out — browser closed or never finished. Try again.`,"prov.loginOk":`Logged in to {provider}. Run {cmd} (or it applies live) to list its models.`,"prov.loginSameAccount":`Still the same {provider} account — switch accounts in the browser, then try Add account again.`,"oauthTos.highTitle":`{provider}: subscription OAuth risk`,"oauthTos.elevatedTitle":`{provider}: unofficial OAuth bridge`,"oauthTos.anthropicBody":`Directly reusing Claude subscription OAuth tokens through a third-party proxy such as OpenCodex is not a supported Anthropic integration and may lead to access restrictions. Supported Agent SDK integrations that use Claude subscriptions are separate.`,"oauthTos.highBody":`OpenCodex connects {provider} through a third-party OAuth path. Unsupported use may lead to access limits or suspension.`,"oauthTos.elevatedBody":`OpenCodex connects {provider} through an unofficial OAuth path. Use the official client when possible; unusual or automated traffic may be treated as abuse and access may be limited or suspended.`,"oauthTos.saferPath":`Safer option: configure an API key in OpenCodex instead.`,"oauthTos.acknowledge":`I understand the risk and want to continue with OAuth anyway.`,"oauthTos.continue":`Continue with OAuth`,"prov.logoutOk":`Logged out of {provider}.`,"prov.logoutFail":`Could not log out of {provider}. Your account state is unchanged.`,"prov.removed":`Removed "{name}".`,"prov.removedDefault":`Removed "{name}". Default provider is now "{defaultProvider}".`,"prov.removeFail":`Failed to remove "{name}".`,"prov.removeLastProvider":`You can't remove this provider when no other enabled provider can become the default.`,"prov.removeHasDependentCombos":`Remove or update these dependent combos first: {combos}.`,"prov.setDefault":`Set as default`,"prov.setDefaultSuccess":`"{name}" is now the default provider.`,"prov.setDefaultFail":`Couldn't set "{name}" as the default provider.`,"prov.defaultDisabled":`Enable this provider before making it the default.`,"prov.updateFail":`Couldn't update this provider.`,"prov.networkError":`Network error. Check that the proxy is running and try again.`,"prov.added":`Added "{name}". Live now — run {cmd} (or restart) to list its models in Codex's picker.`,"prov.removeConfirm":`Remove provider "{name}"? Its models disappear from Codex's picker.`,"prov.hasApiKey":`api key configured`,"prov.hasHeaders":`custom headers configured`,"prov.accounts":`Accounts ({n})`,"prov.accountsAria":`Toggle {name} accounts`,"prov.accountActive":`Active`,"prov.accountReauth":`Re-login`,"prov.reauthenticate":`Re-authenticate`,"prov.reauthAccountMissing":`Selected account was not found after login`,"prov.reauthIdentityMismatch":`Signed-in account did not match the selected account`,"prov.accountAdd":`Add account`,"prov.accountNoLabel":`account {id}`,"prov.accountSwitchTitle":`Use this account`,"prov.accountSwitched":`Switched to {email}.`,"prov.accountSwitchFail":`Failed to switch account`,"prov.accountRemoved":`Removed {email}.`,"prov.accountRemoveFail":`Could not remove {email}. The account is unchanged.`,"prov.accountRemoveAria":`Remove {email}`,"prov.accountRemoveConfirm":`Remove account {email}? Its login is deleted from this proxy.`,"prov.keyAdd":`Add API key`,"prov.keyAdded":`Added API key to {name}.`,"prov.keyAddFail":`Failed to add API key`,"prov.keyPlaceholder":`Paste API key`,"prov.keySwitchTitle":`Use this key`,"prov.keySwitched":`Switched to key {key}.`,"prov.keySwitchFail":`Failed to switch key`,"prov.keyRemoved":`Removed key {key}.`,"prov.keyRemoveAria":`Remove key {key}`,"prov.keyRemoveConfirm":`Remove API key {key}? It is deleted from this proxy's config.`,"prov.activeBadge":`Active`,"prov.disabledBadge":`Disabled`,"prov.defaultBadge":`Default`,"prov.enable":`Enable`,"prov.disable":`Disable`,"prov.enabled":`Enabled "{name}". Its models can appear in Codex again.`,"prov.disabled":`Disabled "{name}". Settings are kept, but its models are hidden.`,"prov.enableFail":`Failed to enable "{name}".`,"prov.disableFail":`Failed to disable "{name}".`,"prov.enableAria":`Enable provider {name}`,"prov.disableAria":`Disable provider {name}`,"prov.defaultCannotDisable":`Default provider can't be disabled`,"prov.openaiAccountMode":`Codex account mode`,"prov.openaiModePool":`Pool`,"prov.openaiModeDirect":`Direct`,"prov.openaiPoolDesc":`Default. Rotate the main login and added accounts using affinity, quota, cooldown, and failover.`,"prov.openaiDirectDesc":`Use only the current/main Codex login. Stored pool accounts are not read or rotated.`,"prov.openaiModeSaved":`OpenAI account mode changed to {mode}.`,"prov.openaiModeSaveFailed":`Could not change the OpenAI account mode.`,"prov.openaiApiDesc":`Uses an OpenAI API key and never uses Codex account credentials.`,"prov.manageCodexAccounts":`Manage Codex accounts`,"prov.openaiApiMissing":`API key required`,"prov.openaiApiSetup":`Set up API key`,"models.tab.catalog":`Models`,"models.tab.combos":`Combos`,"models.tab.compatibility":`Compatibility`,"models.tab.routing":`Routing (beta)`,"models.tabsLabel":`Model surfaces`,"models.subtitle.combos":`Ordered groups of models that answer as one id. Failover tries targets in order; round-robin spreads the load.`,"models.subtitle.compatibility":`Read-only compatibility verdict matrix from lab projection evidence.`,"models.subtitle.routing":`Policy profiles, dry-run evaluation, and source-backed routing analytics.`,"models.subtitle":`Toggle which models Codex sees — native GPT passthrough and routed providers, grouped by provider (click a header to collapse). Hidden models stay off the catalog + model picker but remain directly callable by exact id. Changes apply on the next Codex turn — opencodex invalidates Codex's 5-min model cache so no restart is needed.`,"models.nativeGroupLabel":`OpenAI native`,"models.nativeHint":"Passthrough models use the Pool or Direct account option selected on Providers. Toggling one off hides it from the Codex picker (the catalog entry is kept, so re-enabling restores it exactly). Adding a model here registers a routed `openai/<model>` selector, not a new bare passthrough id.","models.active":`{active}/{total} visible`,"models.workspace.providers":`Providers`,"models.workspace.allProviders":`All providers`,"models.workspace.mainAria":`Model details`,"models.allOn":`All on`,"models.allOff":`All off`,"models.presetLabel":`Models`,"models.presetMode_preset":`Preset`,"models.presetMode_all":`All`,"models.presetMode_custom":`Custom`,"models.presetSummary":`{count} of {total} shown — core preset v{version}`,"models.presetUpdateAvailable":`Preset v{version} available`,"models.presetAppliedToast":`{provider}: preset applied — {count} models selected`,"models.presetClearedToast":`{provider}: showing all models`,"models.presetEmpty":`{provider}: preset matched no models — selection unchanged`,"models.presetConfirmReplace":`Replace your selection with the {count}-model preset?`,"models.cap350k":`Cap 350k`,"models.capApplied":`Context cap applied — takes effect on the next Codex turn.`,"models.capSaveFailed":`Failed to save context cap`,"models.contextCapped":`350k cap`,"models.contextCapLabel":`Safety cap / fallback`,"models.v2Label":`Sub-agent`,"models.shadowCallOriginal":`⚠ {models} →`,"models.v2DocsLink":`What is v1 / v2?`,"models.v2Mode_v1":`v1`,"models.v2Mode_default":`base`,"models.v2Mode_v2":`v2`,"models.v2ModeDesc_v1":`All models → v1 surface`,"models.v2ModeDesc_default":`Upstream defaults (sol/terra=v2, luna=v1)`,"models.v2ModeDesc_v2":`All models → v2 surface`,"models.keepNativeOnV1":`Keep ChatGPT on v1`,"models.keepNativeOnV1Hint":`ChatGPT encrypts v2 child tasks only when a ChatGPT-native parent stays on v2, so Grok and Claude cannot read them. Turn this on to keep Sol/Terra on v1 and avoid that encryption. Routed parents keep v2.`,"models.v2Help":`Controls the multi-agent surface for all models.
2
+
3
+ v1: Classic single-thread agent. Every model uses the v1 collab surface.
4
+ base: Upstream defaults — sol/terra use v2, luna uses v1, others follow the codex feature flag.
5
+ v2: Multi-thread agent with spawn_agent. Every model uses the v2 collab surface.
6
+
7
+ On v2, Keep ChatGPT on v1 leaves Sol/Terra on the v1 surface so they can still spawn Grok or Claude. ChatGPT encrypts v2 child tasks; routed models cannot read them. Routed parents stay on v2.
8
+
9
+ Changes apply to new sessions.`,"dash.multiAgent":`Sub-agent`,"models.v2Conflict":`[agents] max_threads is set — codex will refuse to start; remove it from config.toml`,"models.v2Applied":`Sub-agent mode updated — applies to new sessions (restart the Codex app to refresh the picker)`,"models.v2ThreadsLabel":`Max threads`,"models.v2ThreadsDefault":`default (4)`,"models.v2ThreadsApplied":`Thread limit updated — applies to new sessions`,"models.v2ThreadsInvalid":`Thread limit must be an integer >= 1`,"models.v2ThreadsApply":`Apply`,"models.capValue":`Default {value}`,"models.contextSettings":`Custom windows`,"models.contextSettingsTitle":`Custom windows — {provider}`,"models.contextDefault":`Safety cap / fallback`,"models.contextModel":`Model`,"models.contextModelOverride":`Model override`,"models.contextHint":`Leave blank for automatic discovery. A value here is a safety cap and fallback: it fills a missing upstream window and only lowers a larger reported one. Live discovery is never written into this field.`,"models.contextAutomatic":`Automatic discovery`,"models.contextSaved":`Context windows updated — takes effect on the next Codex turn.`,"models.contextUnchanged":`No context window changes to save.`,"models.contextSaveFailed":`Failed to save context windows`,"models.contextInvalid":`Context windows must be positive whole numbers`,"models.contextCappedValue":`{value} cap`,"models.contextMetadataSource":`Source`,"models.contextMetadataLive":`detected`,"models.contextMetadataRegistry":`registry`,"models.contextMetadataCursorStatic":`Cursor curated`,"models.contextMetadataSnapshot":`saved`,"models.contextMetadataFallback":`fallback`,"models.contextMetadataDerived":`derived`,"models.contextMetadataUnknown":`unknown`,"models.contextMetadataStale":`stale`,"models.contextTooltipDetected":`{value} · detected`,"models.contextTooltipCapped":`{detected} detected · capped at {cap}`,"models.contextTooltipStale":`{value} · {when}`,"models.contextTooltipUnknown":`Context window unknown`,"models.contextTooltipSource":`{value} · {source}`,"models.contextLastChecked":`last checked {when}`,"models.contextYesterday":`yesterday`,"models.setAll":`Set all`,"models.setAllHint":`Turn on the {value} default window for every routed provider. Relays that omit context_window / context_length get this as the actual Codex window. Use Custom windows on a provider row to set one model by hand. Native providers are unaffected.`,"models.collapseAll":`Collapse all`,"models.expandAll":`Expand all`,"models.orderHint":`Picker order: Subagents picks (in the selected order) → remaining routed models alphabetically by provider, then model ID → native models. Visibility switches only filter models; they do not change this order.`,"models.custom":`Custom…`,"models.customApply":`Apply`,"models.customPlaceholder":`Tokens (e.g. 420000)`,"models.customAdd":`Add custom model`,"models.customAddTitle":`Add custom model — {provider}`,"models.customEditTitle":`Edit custom model — {provider}`,"models.customAdded":`Custom model added`,"models.customUpdated":`Custom model updated`,"models.customDeleted":`Custom model deleted`,"models.customSaveFailed":`Failed to save custom model`,"models.customSaving":`Saving…`,"models.customAddBtn":`Add`,"models.customEditBtn":`Update`,"models.customEditNamed":`Edit {name}`,"models.customDeleteNamed":`Delete {name}`,"models.customDeleteConfirm":`Delete the {name} model?`,"models.customBadge":`Custom`,"models.customSummary":`{count} custom`,"models.customFieldModelId":`Model ID (endpoint slug)`,"models.customFieldModelIdPlaceholder":`e.g. qwen4-max-preview`,"models.customFieldDisplayName":`Display name (optional)`,"models.customFieldDisplayNamePlaceholder":`e.g. Qwen 4 Max Preview`,"models.customFieldContext":`Context window`,"models.customFieldModalities":`Input modalities`,"models.customFieldReasoning":`Reasoning effort`,"models.customFieldReasoningOverride":`Override reasoning effort`,"models.reasoningEffort.none":`None`,"models.reasoningEffort.minimal":`Minimal`,"models.reasoningEffort.low":`Low`,"models.reasoningEffort.medium":`Medium`,"models.reasoningEffort.high":`High`,"models.reasoningEffort.xhigh":`Extra high`,"models.reasoningEffort.max":`Maximum`,"models.tipProvider":`Provider`,"models.tipContext":`Context`,"models.tipModalities":`Modalities`,"models.tipStatus":`Status`,"models.tipActive":`Active`,"models.tipDisabled":`Disabled`,"models.applied":`Applied — takes effect on the next Codex turn.`,"models.saveFailed":`Save failed`,"models.networkError":`Network error — is the proxy running?`,"models.loadFail":`Failed to load models — is the proxy running?`,"models.noRouted":`No routed models`,"models.noRoutedHint":`Log into a provider or add one first.`,"models.emptyDiscovery":`No models were discovered. Check the provider endpoint or add a static/custom model.`,"models.emptyDiscoveryDisabled":`Live model discovery is off and no static models are configured.`,"models.discoveryFailedBadge":`Discovery failed`,"models.discoveryFailedHttp":`Model discovery failed (HTTP {status}).`,"models.discoveryFailedBlocked":`Model discovery was blocked by the destination policy.`,"models.discoveryFailedInvalidResponse":`Model discovery returned an invalid response.`,"models.discoveryFailedNetwork":`Model discovery failed due to a network error.`,"models.discoveryFailedProvider":`The provider reported a model discovery error.`,"models.discoveryFailedGeneric":`Model discovery failed.`,"models.openProviderSettings":`Open provider settings`,"models.loading":`Loading…`,"models.search":`Search models…`,"models.showMore":`Show {n} more`,"models.allowlistLabel":`Only selected`,"models.allowlistHint":`Only checked models ship to the catalog (empty = all). Useful for providers exposing thousands of models.`,"models.selectedCount":`{n} selected`,"sub.subtitle":`Codex's {cmd} advertises only the first 5 models (by priority) as overrides. Pick up to 5 here — native gpt or routed — and opencodex sets their catalog priority so exactly these lead. Any other model is still callable by its exact name; this only controls what's shown.`,"sub.featured":`Featured`,"sub.orderHint":`The order shown here sets positions 1–5 at the top of the Codex model picker and the default model candidates for {cmd}.`,"sub.noneSelected":`None selected — pick from the list below.`,"sub.models":`Models`,"sub.search":`Search models (native gpt + routed)…`,"sub.settings":`Settings`,"sub.sections":`Subagent sections`,"sub.delegation.model":`Model to call first`,"sub.delegation.modelHint":`The model Codex reaches for first when it hands off work. Featured above is the list it may call; this is the one it calls first.`,"sub.noModels":`No models — log into a provider or add one first.`,"sub.saved":`Saved {n} models. Start a new Codex session (or run {cmd}) to see them as spawn_agent overrides.`,"sub.saveFailed":`Save failed`,"sub.networkError":`Network error — is the proxy running?`,"sub.loadFail":`Failed to load models — is the proxy running?`,"sub.loading":`Loading…`,"sub.moveUp":`Move {m} up`,"sub.moveDown":`Move {m} down`,"sub.removeAria":`Remove {m}`,"sub.workspace.addToFeatured":`Add {m} to featured`,"sub.workspace.allModels":`All models`,"sub.workspace.featuredFull":`Featured list is full (max 5)`,"sub.workspace.mainAria":`Subagent model details`,"sub.workspace.notFeatured":`Not featured`,"sub.workspace.priority":`Priority`,"sub.ultraMode":`Ultra mode`,"sub.ultraModeHint":`Enable the Proactive multi-agent delegation policy for every model and reasoning effort (does not change reasoning effort itself). Writes features.multi_agent_v2.multi_agent_mode_hint_text in config.toml.`,"sub.ultraModeV2Required":`Requires the v2 multi-agent surface — enable multi_agent_v2 and select v2 in the Sub-agent mode control first.`,"sub.ultraModeText":`Ultra mode delegation text`,"sub.ultraModePreset":`Restore preset`,"sub.ultraModeLoadFail":`Failed to load Ultra mode settings — is the proxy running?`,"sub.ultraModeSaveFail":`Failed to save Ultra mode settings`,"sub.ultraModeSaved":`Ultra mode saved. Applies to new Codex sessions.`,"sub.nativeParentOverride":`Route native V2 parents`,"sub.nativeParentOverrideHint":`Codex may display the original native model while OpenCodex executes the root on the selected routed target.`,"sub.nativeParentOverridePrivacyWarning":`Prompts, repository context, conversation history, and tool results go to the selected provider and inherit its availability, context, latency, behavior, cost, and privacy characteristics.`,"sub.nativeParentOverrideModel":`Native parent target model`,"sub.nativeParentOverrideV2Required":`Requires explicit V2, the upstream V2 flag, and Keep ChatGPT on v1 turned off.`,"sub.nativeParentOverrideSaveFail":`Failed to save native parent routing`,"sub.nativeParentOverrideSaved":`Native parent routing saved. Applies to subsequent parent turns and compaction.`,"sub.routedDelegationBridge":`Routed V2 delegation bridge`,"sub.routedDelegationBridgeHint":`Experimental. While active, spawn, send, and follow-up messages are plaintext, including native-to-native delegation. Codex may still show the original model; routed content and privacy follow the selected provider.`,"sub.routedDelegationBridgeInactive":`Armed; activates only for eligible native V2 roots.`,"sub.routedDelegationBridgeSaveFail":`Failed to save routed V2 delegation bridge`,"sub.routedDelegationBridgeSaved":`Routed V2 delegation bridge saved. Disabling applies immediately.`,"sub.agentTaskRecovery":`Recover Encrypted V2 Tasks`,"sub.agentTaskRecoveryHint":`Unwraps OpenAI Fernet-encrypted task messages via ChatGPT so non-OpenAI subagents can read and execute routed V2 tasks.`,"sub.agentTaskRecoveryModel":`Recovery model (default: gpt-5.6-luna)`,"sub.agentTaskRecoverySaveFail":`Failed to save encrypted task recovery`,"sub.agentTaskRecoverySaved":`Encrypted task recovery setting saved.`,"sub.roles":`Roles`,"sub.roles.hint":`Named specialists the parent can spawn. Each role pins a model and the child's prompt. The parent still decides when to delegate.`,"sub.roles.add":`Add role`,"sub.roles.empty":`No roles yet. Add a specialist for review, search, or other delegated work.`,"sub.roles.full":`Role catalog is full (max 8)`,"sub.roles.id":`Role name`,"sub.roles.description":`When to use`,"sub.roles.descriptionHint":`Shown to the parent so it knows when to spawn this specialist.`,"sub.roles.model":`Model`,"sub.roles.effort":`Effort`,"sub.roles.effortNone":`Model default`,"sub.roles.instructions":`Child instructions`,"sub.roles.instructionsHint":`Developer prompt the child agent loads.`,"sub.roles.enabled":`Enabled`,"sub.roles.delete":`Delete role {id}`,"sub.roles.save":`Save roles`,"sub.roles.saved":`Roles saved. Applies to new Codex sessions.`,"sub.roles.saveFailed":`Failed to save roles`,"sub.roles.loadFail":`Failed to load roles — is the proxy running?`,"sub.roles.routedV2Warning":`This role uses a routed model on the v2 surface without keeping ChatGPT on v1. Native v2 parents encrypt child tasks.`,"sub.roles.sync":`Sync to Codex agent files`,"sub.roles.syncHint":`Write enabled roles to marker-owned ocx-*.toml files. Off prunes OpenCodex-owned files and leaves yours untouched.`,"sub.injectionPrompt":`Custom parent guidance`,"sub.injectionPromptHint":`Replaces the built-in v2 spawn advice. Leave empty for the built-in text. Include placeholders if you want live values:`,"sub.injectionPromptSave":`Save parent guidance`,"sub.injectionPromptSaved":`Parent guidance saved. Applies to new Codex sessions.`,"sub.injectionPromptSaveFailed":`Failed to save parent guidance`,"sub.childInstructions":`Global child instructions`,"sub.childInstructionsHint":`Applies to every spawned child. Named role instructions, when synced to Codex, apply only to that specialist.`,"sub.childInstructionsSave":`Save child instructions`,"sub.childInstructionsSaved":`Child instructions saved. Applies to new Codex sessions.`,"sub.childInstructionsSaveFailed":`Failed to save child instructions`,"sub.workspace.removeFromFeatured":`Remove {m} from featured`,"sub.workspace.selectModel":`Select a model`,"sub.workspace.selectModelDesc":`Pick a model from the list to see details and feature it for spawn_agent.`,"sub.workspace.selector":`Public selector`,"logs.title":`Request Logs`,"logs.tabLogs":`Logs`,"logs.tabDebug":`Debug`,"logs.subtitle":`Recent requests routed through the local opencodex proxy, newest first.`,"logs.autoRefresh":`Auto-refresh`,"logs.noRequests":`No requests yet.`,"logs.loadError":`Could not load request logs.`,"logs.filter.surface.label":`Surface`,"logs.filter.surface.all":`All`,"logs.filter.surface.claude":`Claude`,"logs.filter.surface.codex":`Codex`,"logs.filter.surface.grok":`Grok`,"logs.filter.interceptedHelpersOnly":`Intercepted helpers only`,"logs.filter.model.label":`Model`,"logs.filter.model.all":`All models`,"logs.filter.provider.label":`Provider`,"logs.filter.provider.all":`All providers`,"logs.filter.status.label":`Status`,"logs.filter.status.all":`All statuses`,"logs.filter.status.success":`Success (2xx)`,"logs.filter.status.errors":`Errors (4xx/5xx)`,"logs.filter.time.label":`Time`,"logs.filter.time.all":`All time`,"logs.filter.time.15m":`Last 15m`,"logs.filter.time.1h":`Last 1h`,"logs.filter.time.24h":`Last 24h`,"logs.filter.speed.label":`Speed`,"logs.filter.speed.all":`All speeds`,"logs.filter.speed.slow":`< 15 tok/s`,"logs.filter.speed.medium":`15–50 tok/s`,"logs.filter.speed.fast":`> 50 tok/s`,"logs.filter.reset":`Reset filters`,"logs.filter.showingCount":`Showing {count} of {total}`,"logs.badge.interceptedHelper":`I · {model}`,"logs.badge.interceptedHelperTitle":`Intercepted helper request`,"logs.filter.conversation.label":`Conversation`,"logs.filter.conversation.placeholder":`Paste conversation id`,"logs.filter.conversation.clear":`Clear`,"logs.filter.conversation.apply":`Filter logs`,"logs.conversation.totals":`{requests} requests · {tokens} tokens · {cost}`,"logs.conversation.scope":`Totals cover the currently loaded Logs ring only.`,"logs.conversation.excluded":`({unpriced} unpriced, {unmetered} unmetered excluded from ~$)`,"logs.cost.approximate":`~{amount}`,"logs.cost.lowerBound":`≥{amount}`,"logs.cost.unavailable":`—`,"logs.detail.conversation":`Conversation`,"logs.badge.claude":`Claude`,"logs.badge.grok":`Grok`,"logs.col.time":`Time`,"logs.col.request":`Request`,"logs.col.model":`Model`,"logs.col.effort":`Effort`,"logs.col.provider":`Provider`,"logs.col.status":`Status`,"logs.col.tokens":`Tokens`,"logs.col.tokPerSec":`tok/s`,"logs.col.estimatedCost":`~$`,"logs.metric.tokPerSecTitle":`Output tokens per second over the full request duration`,"logs.metric.estimatedCostTitle":`API list-price equivalent, not an actual charge; unmatched pricing is unavailable`,"usage.cost.total":`API list-price equivalent (this range)`,"usage.cost.disclaimer":`Not a billing receipt. Subscription usage or provider credits may apply instead.`,"usage.cost.unpricedNote":`{count} requests excluded (no price or usage)`,"logs.detail.section.basic":`Basic information`,"logs.detail.route.section":`Route decision`,"logs.detail.route.kind":`Route kind`,"logs.detail.route.profile":`Profile`,"logs.detail.route.selected":`Selected`,"logs.detail.route.candidates":`Candidates`,"logs.detail.route.unknown":`No route trace recorded for this request (pre-trace row).`,"logs.detail.section.performance":`Performance`,"logs.detail.section.cost":`API list-price equivalent`,"logs.detail.section.attempts":`Combo attempts`,"logs.detail.section.usage":`Raw usage`,"logs.detail.ttft":`TTFT`,"logs.detail.costTotal":`List-price equivalent`,"logs.detail.totalTokens":`Total tokens`,"logs.detail.matchedKey":`Matched price key`,"logs.detail.priceSource":`Price source`,"logs.detail.unavailableReason":`Unavailable reason`,"logs.detail.copyRequestId":`Copy request ID`,"logs.detail.copied":`Copied`,"logs.detail.source.jawcode":`jawcode catalog`,"logs.detail.source.expected":`Expected price overlay`,"logs.detail.source.user":`Provider-configured price overlay`,"logs.detail.verification.verified":`Verified`,"logs.detail.verification.derived":`Derived from base model`,"logs.detail.attempt.target":`Provider / model`,"logs.detail.attempt.reason":`Result / reason`,"logs.detail.attempt.completed":`Completed`,"logs.detail.attempt.e2eNote":`Top-level tok/s is end-to-end; each attempt uses its own duration.`,"logs.detail.attempt.recovery.transient5xx":`Transient 5xx`,"logs.detail.attempt.recovery.connectionReset":`Connection reset`,"logs.detail.attempt.recovery.oauth401":`OAuth re-authentication`,"logs.detail.attempt.recovery.key429":`Key rate-limited (429)`,"logs.detail.attempt.recovery.rateLimit429":`Rate-limited (429)`,"logs.detail.attempt.recovery.anthropicOauth429":`Anthropic OAuth rate-limited (429)`,"logs.detail.attempt.recovery.image413":`Image payload too large (413)`,"logs.detail.attempt.recovery.emptyCompletion":`Empty completion retry`,"logs.detail.attempt.recovery.unknown":`Unknown recovery reason`,"logs.detail.reason.usage_missing":`Usage was not reported.`,"logs.detail.reason.usage_unsupported":`This provider does not report usage.`,"logs.detail.reason.output_missing":`No positive output token count was reported.`,"logs.detail.reason.invalid_duration":`The request duration is not valid.`,"logs.detail.reason.price_unmatched":`No matching price was found.`,"logs.detail.reason.invalid_cache_breakdown":`Cache token details conflict with total input tokens.`,"logs.detail.reason.invalid_usage":`Usage contains an invalid token value.`,"logs.detail.reason.combo_attempt_unavailable":`At least one combo attempt could not be priced.`,"logs.detail.estimate.usage_estimated":`Provider usage is estimated.`,"logs.detail.estimate.cache_detail_missing":`Cache details were unavailable; input is an upper-bound estimate.`,"logs.detail.estimate.expected_price_overlay":`A verified expected list price was used.`,"logs.detail.estimate.provider_cost_overlay":`A provider-configured price overlay was used.`,"logs.detail.estimate.priority_lower_bound":`The confirmed Priority price is unavailable; the displayed estimate is a known lower bound.`,"logs.col.error":`Error`,"logs.col.upstreamReason":`Upstream reason`,"logs.col.duration":`Duration`,"logs.modelTooltip.model":`model`,"logs.modelTooltip.resolvedModel":`resolved model`,"logs.modelTooltip.requestedTier":`requested tier`,"logs.modelTooltip.configuredTier":`configured tier`,"logs.modelTooltip.responseTier":`response tier`,"logs.modelTooltip.supportsTier":`tier support`,"logs.tokens.reported":`reported`,"logs.tokens.unreported":`unreported`,"logs.tokens.unsupported":`unsupported`,"logs.tokens.estimated":`estimated`,"logs.tokens.input":`input`,"logs.tokens.output":`output`,"logs.tokens.cacheRead":`cache read (c)`,"logs.tokens.cacheWrite":`cache write (w)`,"logs.tokens.reasoning":`reasoning`,"logs.tokens.noCache":`no cache data`,"logs.tokens.contextTotal":`active context`,"logs.tokens.noCacheNote":`this provider does not report cache tokens`,"logs.tokens.noCacheCursor":`Cursor cache detail unreported`,"logs.tokens.noCacheCursorNote":`Cursor does not expose cache read/write token counts; this is unknown, not a confirmed cache miss`,"logs.tokens.estimatedNote":`estimated (provider reports no exact usage)`,"logs.details":`Details`,"logs.detailTitle":`Request details`,"logs.detailRaw":`Raw log entry`,"debug.title":`Debug`,"debug.subtitle":`Opt-in provider transport and usage-extraction diagnostics. Request errors and 502s stay on the Logs tab.`,"debug.debug":`Provider debug`,"debug.usage":`Usage extraction`,"debug.injection":`Injection log`,"debug.claude":`Claude inbound`,"debug.claudeInbound.title":`Claude inbound requests`,"debug.claudeInbound.sub":`What Claude Code/Desktop actually sends (thinking, effort, metadata) — no prompt text is stored.`,"debug.claudeInbound.empty":`No requests captured yet. Send a message from Claude while this is on.`,"debug.claudeInbound.time":`Time`,"debug.claudeInbound.endpoint":`Endpoint`,"debug.claudeInbound.model":`Model`,"debug.claudeInbound.none":`none`,"debug.reset":`Clear runtime overrides`,"debug.refresh":`Refresh`,"debug.follow":`Follow`,"debug.streamProvider":`Provider`,"debug.streamUsage":`Usage`,"debug.streamInjection":`Injection`,"debug.loading":`Loading debug settings…`,"debug.loadFailed":`Could not load debug settings.`,"debug.emptyTitle":`Debug logging is off`,"debug.empty":`Turn on Provider debug or Usage extraction in the card above. Lines appear here after you send a request through the proxy.`,"debug.noLinesTitle":`Waiting for lines`,"debug.noLines.provider":`Provider debug is on, but it only records transport anomalies (dropped or malformed frames, and Cursor dial/retry events). A clean request through a provider like Anthropic can produce no lines.`,"debug.noLines.usage":`Usage extraction is on but nothing has been captured yet. Send a chat/request through Codex and it appears here.`,"debug.noLines.injection":`Injection log is on but nothing has been captured yet. It records multi-agent guidance injection and effort-cap decisions on collab and sub-agent turns.`,"usage.title":`Usage`,"usage.subtitle":`Local token accounting from your proxy. Missing usage is never shown as zero.`,"usage.loading":`Loading usage data…`,"usage.empty":`No usage recorded yet. Send a request through the proxy to see activity here.`,"usage.loadError":`Could not load usage data.`,"usage.range.all":`All`,"usage.range.available":`Available history`,"usage.historyTruncated":`Totals cover available history only because older usage was not loaded.`,"usage.historyTruncatedWindow":`Loaded rows have request start times ranging from {start} to {end}. Earlier file entries were omitted by the read limit, so any selected range may be incomplete.`,"usage.range.30d":`30d`,"usage.range.7d":`7d`,"usage.card.requests":`Requests`,"usage.card.measured":`Measured`,"usage.card.reported":`Reported`,"usage.card.totalTokens":`Total tokens`,"usage.card.cachedTokens":`Cache reads`,"usage.card.cachedTokensHint":`Prompt tokens served from the provider cache (reads). Cache writes are shown below when present.`,"usage.card.cacheWriteTokens":`cache writes`,"usage.card.coverage":`Coverage`,"usage.card.activeDays":`Active days`,"usage.section.heatmap":`Daily activity`,"usage.section.overview":`Overview`,"usage.section.models":`Models`,"usage.section.providers":`Providers`,"usage.section.coverage":`Coverage breakdown`,"usage.workspace.report":`Usage report`,"usage.workspace.sections":`Usage sections`,"usage.coverage.measured":`Measured`,"usage.coverage.reported":`Provider reported`,"usage.coverage.estimated":`Estimated`,"usage.coverage.note":`Measured entries include provider-reported and estimated token counts. Unreported and unsupported requests are tracked but never inflated to zero tokens.`,"usage.search.models":`Search models…`,"usage.col.requests":`Requests`,"usage.col.measured":`Measured`,"usage.col.reported":`Reported`,"usage.col.tokens":`Tokens`,"usage.col.share":`Share`,"usage.heatmap.less":`Less`,"usage.heatmap.more":`More`,"usage.dayMon":`Mon`,"usage.dayWed":`Wed`,"usage.dayFri":`Fri`,"usage.heatmap.tooltipTokens":`{tokens} tokens`,"usage.heatmap.tooltipRequests":`{requests} requests`,"usage.chart.dayDetail":`{date}: {requests} requests, {tokens} tokens`,"usage.heatmap.keyboardLabel":`Use Up and Down to move by day; Left and Right to move by week.`,"nav.storage":`Storage`,"storage.title":`Storage`,"storage.subtitle":`See what’s using CODEX_HOME. Cleanup never touches active sessions.`,"storage.loading":`Scanning storage…`,"storage.empty":`CODEX_HOME is empty or missing — nothing to report.`,"storage.error":`Storage scan failed. Check that CODEX_HOME points at a valid directory.`,"storage.refresh":`Rescan`,"storage.rescanned":`Scan complete.`,"storage.card.total":`Total size`,"storage.card.files":`Files`,"storage.card.home":`CODEX_HOME`,"storage.snapshot.lastScan":`Last scan`,"storage.snapshot.scanning":`Scanning…`,"storage.snapshot.unavailable":`No scan yet.`,"storage.cleanupCard.title":`Free up space`,"storage.cleanupCard.tabs":`Cleanup options`,"storage.cleanupCard.tab.policy":`Policy`,"storage.cleanupCard.tab.quarantine":`Quarantine`,"storage.cleanup.noArchives":`No archived sessions to clean up.`,"storage.section.buckets":`Buckets`,"storage.section.largest":`Largest files`,"storage.workspace.overview":`Overview`,"storage.workspace.selectBucket":`Select a bucket from the list to see its breakdown.`,"storage.col.bucket":`Bucket`,"storage.col.size":`Size`,"storage.col.files":`Files`,"storage.col.oldest":`Oldest`,"storage.col.newest":`Newest`,"storage.col.rows":`DB rows`,"storage.rows.unknown":`unknown (locked)`,"storage.bucket.sessions":`Active sessions`,"storage.bucket.archived_sessions":`Archived sessions`,"storage.bucket.logs_db":`Logs database`,"storage.bucket.state_db":`State database`,"storage.bucket.attachments":`Attachments`,"storage.bucket.deletion_manifests":`Deletion manifests`,"storage.bucket.other":`Other`,"storage.cleanup.title":`Archived cleanup`,"storage.cleanup.help":`Remove the oldest archived sessions by percentage. Active sessions are never touched. Quarantine is the default — files move to CODEX_HOME/.trash.`,"storage.cleanup.slider":`Oldest archived percent`,"storage.cleanup.percent":`{percent}%`,"storage.cleanup.preset":`{percent}`,"storage.cleanup.preview":`Preview`,"storage.cleanup.confirmTitle":`Confirm archived cleanup`,"storage.cleanup.confirmBody":`This will process {count} archived file(s) (~{size}), the oldest {percent}%.`,"storage.cleanup.moreFiles":`…and {n} more`,"storage.cleanup.permanent":`Delete permanently (skip quarantine)`,"storage.cleanup.permanentWarn":`Permanent delete cannot be undone.`,"storage.cleanup.quarantineNote":`Files move to .trash under CODEX_HOME. You can restore them from the Quarantine tab.`,"storage.cleanup.cancel":`Cancel`,"storage.cleanup.confirmQuarantine":`Quarantine`,"storage.cleanup.confirmPermanent":`Delete permanently`,"storage.cleanup.doneQuarantine":`Quarantined {count} file(s) ({size}).`,"storage.cleanup.donePermanent":`Permanently deleted {count} file(s) ({size}).`,"storage.cleanup.previewFailed":`Preview failed.`,"storage.cleanup.cleanupFailed":`Cleanup failed.`,"storage.cleanup.err.codex_busy":`Codex is using state.sqlite — try again after quitting Codex.`,"storage.cleanup.err.stale_preview":`Archived files changed since preview — run Preview again.`,"storage.cleanup.err.restore_pending_overlap":`Selected archives overlap an incomplete trash restore — finish or retry restore first.`,"storage.cleanup.err.referenced_history":`Selected archives are still referenced by forked or paginated history.`,"storage.cleanup.err.invalid_digest":`Preview digest is missing or invalid.`,"storage.cleanup.err.invalid_mode":`Cleanup mode must be quarantine or permanent.`,"storage.cleanup.err.fs_failed":`Filesystem cleanup failed. Some changes may already be applied — check CODEX_HOME/.trash and any recovery path shown.`,"storage.cleanup.err.fs_failed_trash":`Filesystem cleanup failed. Some changes may already be applied — check {trashDir} and manifest.json for recoverable files.`,"storage.cleanup.err.db_reconcile_failed":`Could not update Codex state database.`,"storage.cleanup.err.cleanup_failed":`Cleanup failed.`,"storage.trash.title":`Quarantine`,"storage.trash.help":`Archived sessions moved to CODEX_HOME/.trash. Restore puts JSONL files and thread rows back.`,"storage.trash.empty":`No quarantined entries.`,"storage.trash.loading":`Loading quarantine…`,"storage.trash.col.when":`Quarantined`,"storage.trash.col.files":`Files`,"storage.trash.col.size":`Size`,"storage.trash.col.mode":`Mode`,"storage.trash.col.id":`Entry`,"storage.trash.restore":`Restore`,"storage.trash.confirmTitle":`Restore quarantine entry?`,"storage.trash.confirmBody":`Restore {count} file(s) (~{size}) from {id} back to archived sessions.`,"storage.trash.cancel":`Cancel`,"storage.trash.confirmRestore":`Restore`,"storage.trash.done":`Restored {count} file(s) ({size}).`,"storage.trash.restoreFailed":`Restore failed.`,"storage.trash.listFailed":`Could not list quarantine entries.`,"storage.trash.mode.quarantine":`quarantine`,"storage.trash.mode.permanent":`permanent (incomplete)`,"storage.trash.err.codex_busy":`Codex is using state.sqlite — try again after quitting Codex.`,"storage.trash.err.invalid_trash":`Trash entry id is missing or invalid.`,"storage.trash.err.missing_trash":`Trash entry was not found.`,"storage.trash.err.dest_exists":`Restore destination already exists — remove or rename the archived file and retry.`,"storage.trash.err.fs_failed":`Filesystem restore failed. Some files may already be restored — check archived_sessions and .trash.`,"storage.trash.err.db_reconcile_failed":`Could not restore Codex state database rows.`,"storage.trash.err.storage_mutation_busy":`Another storage cleanup or restore is in progress — try again shortly.`,"storage.trash.err.restore_failed":`Restore failed.`,"storage.trash.err.restore_worker_timeout":`Restore took too long (over 10 minutes) and was stopped.`,"storage.trash.err.restore_worker_aborted":`Restore was cancelled during shutdown.`,"storage.trash.err.restore_worker_failed":`Restore worker crashed or failed unexpectedly.`,"storage.policy.title":`Auto-cleanup policy`,"storage.policy.help":`Optional batch cleanup when archived sessions exceed a threshold. Off by default — never enabled automatically.`,"storage.policy.loading":`Loading policy…`,"storage.policy.loadFailed":`Could not load cleanup policy.`,"storage.policy.saveFailed":`Could not save cleanup policy.`,"storage.policy.runFailed":`Policy run failed.`,"storage.policy.alreadyRunning":`A cleanup policy run is already in progress.`,"storage.policy.invalid":`Invalid policy values.`,"storage.policy.enabled":`Enable auto-cleanup`,"storage.policy.enabledHint":`Default is off. Enabling runs only on the schedule you choose (or Run now).`,"storage.policy.threshold":`When archived size exceeds (GiB)`,"storage.policy.trigger":`Trigger`,"storage.policy.target":`Cleanup target`,"storage.policy.targetPercent":`Remove oldest archived (%)`,"storage.policy.targetReduce":`Reduce archived size to (GiB)`,"storage.policy.thresholdInc":`Increase threshold`,"storage.policy.thresholdDec":`Decrease threshold`,"storage.policy.percentInc":`Increase percent`,"storage.policy.percentDec":`Decrease percent`,"storage.policy.reduceInc":`Increase reduce-to size`,"storage.policy.reduceDec":`Decrease reduce-to size`,"storage.policy.schedule":`Schedule`,"storage.policy.schedule.manual":`Manual only`,"storage.policy.schedule.startup":`On proxy startup`,"storage.policy.schedule.daily":`Daily`,"storage.policy.schedule.weekly":`Weekly`,"storage.policy.mode":`Deletion mode`,"storage.policy.mode.quarantine":`Quarantine (default)`,"storage.policy.mode.permanent":`Permanent delete`,"storage.policy.permanentWarn":`Permanent mode cannot be undone. Prefer quarantine unless you are sure.`,"storage.policy.lastRun":`Last run`,"storage.policy.lastRunDetail":`Removed {count} · freed {size}`,"storage.policy.nextRun":`Next run`,"storage.policy.never":`Never`,"storage.policy.save":`Save`,"storage.policy.runNow":`Run now`,"storage.policy.running":`Running…`,"storage.policy.saved":`Policy saved.`,"storage.policy.skippedDisabled":`Policy is disabled — enable it first.`,"storage.policy.skippedUnder":`Archived size is under the threshold — nothing to do.`,"storage.policy.skippedEmpty":`No archived candidates matched the target.`,"storage.policy.doneQuarantine":`Policy quarantined {count} file(s) ({size}).`,"storage.policy.donePermanent":`Policy permanently deleted {count} file(s) ({size}).`,"modal.addNamed":`Add: {label}`,"modal.add":`Add provider`,"modal.catalogTabs":`Provider categories`,"modal.searchLabel":`Search providers`,"modal.search":`Search providers…`,"modal.logInWith":`Log in with {label}`,"modal.waitingBrowser":`Waiting for browser…`,"modal.providerName":`Provider name`,"modal.adapter":`Adapter`,"modal.baseUrl":`Base URL`,"modal.endpoint":`Endpoint`,"modal.endpoint.tokenPlan":`Token plan`,"modal.endpoint.payAsYouGo":`Pay as you go`,"modal.endpoint.custom":`Custom`,"modal.defaultModel":`Default model (optional)`,"modal.allowPrivateNetwork":`Allow local/private network`,"modal.allowPrivateNetworkHint":`Enable only for intentionally self-hosted providers. Metadata endpoints remain blocked.`,"modal.nameRequired":`Provider name is required`,"modal.baseUrlRequired":`Base URL is required`,"modal.networkError":`Network error — is the proxy running?`,"modal.loginFailStart":`Login failed to start`,"modal.waitingLogin":`Waiting for browser login…`,"modal.loggingIn":`Logging in…`,"modal.loginTimeout":`Login timed out — try again.`,"modal.back":`Back`,"modal.badge.oauth":`OAuth`,"modal.customProvider":`Custom provider`,"replitGateway.title":`Replit gateway companion`,"replitGateway.subtitle":`Connect your user-deployed Replit gateway and install the paired OpenAI Chat and Anthropic providers together.`,"replitGateway.companionNote":`This is a custom companion workflow, not a canonical registry preset.`,"replitGateway.originLabel":`Deployment origin`,"replitGateway.originHint":`HTTPS origin of your Replit deployment (for example https://my-app.replit.app).`,"replitGateway.keyLabel":`Gateway key`,"replitGateway.keyHint":`The REPLIT_GATEWAY_KEY secret from your deployment. It is stored in your local provider configuration and used to authenticate gateway traffic.`,"replitGateway.keyTooShort":`Gateway key is too short (minimum 32 characters).`,"replitGateway.keyTooLong":`Gateway key must be at most 512 characters.`,"replitGateway.keyInvalidChars":`Gateway key must contain only printable ASCII characters.`,"replitGateway.errorNetwork":`Could not reach the proxy. Check that it is running and try again.`,"replitGateway.errorMalformed":`The proxy returned an invalid response. Try again shortly.`,"replitGateway.customDomainLabel":`Allow custom domain`,"replitGateway.customDomainHint":`Only enable when your gateway is not hosted on .replit.app.`,"replitGateway.setDefaultLabel":`Set replit as the default provider after install`,"replitGateway.install":`Install pair`,"replitGateway.installing":`Installing…`,"replitGateway.close":`Close`,"replitGateway.openButton":`Replit gateway…`,"replitGateway.replaceTitle":`Replace the existing Replit pair?`,"replitGateway.replaceBody":`Providers replit and replit-anthropic already exist. Replacing overwrites the gateway origin and key while preserving your overlays.`,"replitGateway.replaceConfirm":`Replace pair`,"replitGateway.replaceCancel":`Keep existing`,"replitGateway.probeHealth":`healthz: HTTP {status} ({ms} ms)`,"replitGateway.probeModels":`models: {count} discovered ({ms} ms)`,"replitGateway.successTitle":`Installed the Replit gateway pair.`,"replitGateway.errorGeneric":`Could not install the Replit gateway pair.`,"replitGateway.errorCollision":`The Replit provider pair already exists.`,"replitGateway.errorBusy":`Configuration is busy. Retry shortly.`,"replitGateway.originRequired":`Deployment origin is required.`,"replitGateway.keyRequired":`Gateway key is required.`,"modal.failedStatus":`Failed ({status})`,"modal.loginError":`Login error: {error}`,"modal.badge.codexLogin":`Codex login`,"modal.badge.local":`Local`,"modal.badge.apiKey":`API key`,"modal.badge.direct":`Direct`,"modal.badge.pool":`Pool`,"modal.badge.free":`Free`,"modal.invalidPreset":`This built-in provider preset is incomplete. Restart the proxy and try again.`,"modal.freeTierTitle":`Free tier`,"modal.freeTierDefault":`No API key required. Works out of the box.`,"modal.tab.accounts":`Accounts`,"modal.tab.free":`Free`,"modal.tab.paid":`Paid`,"modal.accountsHint":`Sign in to ChatGPT/Codex, OAuth providers, and API-key accounts here. OpenAI is built in — log in rather than adding it again.`,"modal.accountsCodexAuthLink":`Codex Auth`,"modal.notListed":`Provider not listed? Add a custom one`,"modal.catalogLoading":`Loading catalog…`,"modal.catalogLoadFailed":`Could not load provider catalog.`,"modal.accountLogin":`Log in`,"modal.accountLogout":`Log out`,"modal.accountAdd":`Add account`,"modal.accountManage":`Manage`,"modal.accountCodexPool":`ChatGPT account pool`,"modal.accountLoggedIn":`Logged in`,"modal.accountLoggedOut":`Not logged in`,"quota.fiveHourLimit":`5-hour limit`,"quota.weeklyLimit":`Weekly limit`,"quota.monthlyLimit":`30-day limit`,"quota.cursorFirstParty":`First-party models`,"quota.cursorApiUsage":`API usage`,"quota.totalSubscriptionCredits":`Total subscription credits`,"quota.creditsBalance":`Credits balance`,"quota.creditsPeriodEnds":`Billing period ends {date}`,"quota.usedPercent":`{pct}% used`,"quota.limitReached":`Limit reached`,"quota.resetsToday":`Resets today at {time}`,"quota.resetsTomorrow":`Resets tomorrow at {time}`,"quota.resetsAt":`Resets {when}`,"quota.resetsRelativeMinutes":`Resets in {n} min`,"quota.resetsRelativeHours":`Resets in {n} h`,"pws.status.ready":`Ready`,"pws.status.needsSetup":`Needs setup`,"pws.status.needsAttention":`Needs attention`,"pws.auth.chatgptPassthrough":`ChatGPT passthrough`,"pws.auth.noKey":`No key needed`,"pws.freeTitle":`Free pricing (a key may still be required)`,"pws.localTitle":`Local runtime`,"pws.modelCountOne":`1 model`,"pws.modelCount":`{count} models`,"pws.rail.suffixDefault":` · default`,"pws.rail.suffixLocal":` · local`,"pws.rail.suffixFree":` · free`,"pws.rail.selectAria":`Select {name} — {status}{suffix}`,"pws.searchPlaceholder":`Search providers…`,"pws.filterAria":`Filter providers`,"pws.providerFiltersAria":`Provider filters`,"pws.filters":`Filters`,"pws.filterStatus":`Status`,"pws.pricing":`Pricing`,"pws.paid":`Paid`,"pws.filterType":`Type`,"pws.type.cloud":`Cloud`,"pws.type.local":`Local`,"pws.type.selfHosted":`Self-hosted`,"pws.type.login":`Login`,"pws.sort":`Sort`,"pws.sortProvidersAria":`Sort providers`,"pws.sort.az":`A–Z`,"pws.sort.za":`Z–A`,"pws.sort.freePaid":`Free first`,"pws.sort.paidFree":`Paid first`,"pws.sort.accountsFirst":`Accounts first`,"pws.resetAll":`Reset all`,"pws.providerList":`Provider list`,"pws.providersAria":`Providers`,"pws.groupReady":`Ready ({count})`,"pws.groupNeedsSetup":`Needs setup ({count})`,"pws.groupDisabled":`Disabled ({count})`,"pws.noSearchResults":`No providers match your search.`,"pws.noMatchFilters":`No providers match the filters.`,"pws.noProvidersConfigured":`No providers configured.`,"pws.workspaceMainAria":`Provider details`,"pws.detailComingSoon":`Detail view coming soon — use the classic view to manage this provider.`,"pws.selectPrompt":`Select a provider from the list.`,"pws.connectFirst":`Connect your first provider`,"pws.empty.browseFree":`Browse free providers`,"pws.empty.browseFreeDesc":`Start without a subscription`,"pws.empty.connectAccount":`Connect an account`,"pws.empty.connectAccountDesc":`Use your ChatGPT or provider login`,"pws.empty.addEndpoint":`Add an endpoint`,"pws.empty.addEndpointDesc":`Custom base URL and API key`,"pws.tab.overview":`Overview`,"pws.tab.models":`Models`,"pws.tab.usage":`Usage`,"pws.tab.accounts":`Accounts`,"pws.tab.settings":`Settings`,"pws.connection":`Connection`,"pws.status.connected":`Connected`,"pws.attentionTitle":`Needs attention`,"pws.attention.reauth":`Active account needs re-authentication`,"pws.attention.reauthForward":`Active Codex account needs re-authentication — open Accounts to fix it`,"pws.attention.missingCredentials":`Missing credentials`,"pws.cell.auth":`Authentication`,"pws.cell.note":`Note`,"pws.cell.defaultModel":`Default model`,"pws.statsAria":`Provider statistics`,"pws.statsTitle":`Statistics`,"pws.stats.totalRequests":`Requests (30d)`,"pws.stats.totalTokens":`Tokens (30d)`,"pws.stats.quotaUpdated":`Quota updated`,"pws.stats.quotaTracked":`Rate limits tracked on the Usage tab.`,"pws.stats.source":`Source`,"pws.usageLast30d":`Usage (last 30 days)`,"pws.allAccounts":`All accounts`,"pws.estimatedCost":`Estimated cost`,"pws.costDisclaimer":`API list-price estimate, not an actual charge.`,"pws.modelBreakdown":`Model breakdown`,"pws.col.model":`Model`,"pws.col.cost":`Est. cost`,"pws.col.tokens":`Tokens`,"pws.col.requests":`Req.`,"pws.col.share":`Share`,"pws.tokenInput":`Input`,"pws.tokenOutput":`Output`,"pws.metricRequests":`requests`,"pws.metricTokens":`tokens`,"pws.usageUnavailable":`No usage recorded yet.`,"pws.rateLimits":`Rate limits`,"pws.quotaUnavailable":`No quota data for this provider.`,"pws.accountQuotaUnavailable":`Rate-limit data temporarily unavailable; showing last known values when present.`,"pws.selected":`Selected`,"pws.copyModelId":`Copy ID`,"pws.modelCopied":`Copied!`,"pws.modelsAvailable":`{count} available`,"pws.modelSearchPlaceholder":`Filter models…`,"pws.modelsLoading":`Loading models…`,"pws.modelsLoadFailed":`Could not load models.`,"pws.modelsNeedsReauth":`Account needs re-login before live model discovery works. Showing configured models for now.`,"pws.modelsConfiguredFallback":`Showing configured models (live discovery unavailable).`,"pws.modelsTruncated":`Showing first {shown} of {total} models. Filter to narrow the list.`,"pws.retry":`Retry`,"pws.noModels":`No models discovered for this provider.`,"pws.noModelMatch":`No models match the filter.`,"pws.adapterBaseRequired":`Adapter and base URL are required.`,"pws.addAccount":`Add account`,"pws.addKey":`Add API key`,"pws.apiKeys":`API Keys`,"pws.authMode":`Auth mode`,"pws.availableAccounts":`Available accounts`,"pws.accountOrdinal":`Account {count}`,"pws.accountsLoading":`Loading accounts…`,"pws.accountsLoadFailed":`Accounts could not be loaded.`,"pws.retryAccounts":`Retry`,"pws.noAccounts":`No accounts are connected yet.`,"pws.cockpitImportDescription":`Import a Cockpit Tools Antigravity JSON export from this device. The file contents are not shown.`,"pws.cockpitImportFileLabel":`Cockpit Tools Antigravity JSON export`,"pws.cockpitImportChooseFile":`Choose JSON file`,"pws.cockpitImporting":`Importing…`,"pws.cockpitImportInvalid":`The selected file is not a valid JSON export or is too large.`,"pws.cockpitImportFailed":`The account import could not be completed.`,"pws.cockpitImportComplete":`Import complete: {imported} imported, {updated} updated, {failed} failed, {unsupported} unsupported.`,"pws.accountSwitching":`Switching…`,"pws.accountCurrent":`Current account`,"pws.defaultModelNone":`None (use provider default)`,"pws.discardSettings":`Discard`,"pws.jsonEditorDesc":`Edit the raw provider JSON config. Changes are saved immediately.`,"pws.jsonEditorTitle":`JSON editor — {name}`,"pws.jsonRestore":`Restore`,"pws.jsonSave":`Save`,"pws.loggedInTitle":`Logged in`,"pws.notLoggedInTitle":`Not logged in`,"pws.note":`Note`,"pws.allowPrivateNetwork":`Allow local/private network`,"pws.liveModels":`Discover models from provider`,"pws.liveModelsDesc":`Fetch the provider's live model catalog. Turn this off to use only configured/static models.`,"pws.xaiResponsesOptIn":`Use Responses API for Grok 4.5 and 4.6`,"pws.xaiResponsesOptInDesc":`Routes both models through openai-responses. Other Grok models and tier behavior are unchanged.`,"pws.xaiResponsesOptInMixed":`Partially enabled.`,"pws.cursorTransport":`Cursor transport`,"pws.cursorTransportHttp2":`HTTP/2 (default)`,"pws.cursorTransportHttp1":`HTTP/1.1 (proxy compatibility)`,"pws.cursorTransportDesc":`Use HTTP/1.1 when your proxy cannot reliably carry Cursor's HTTP/2 stream.`,"pws.optionalPlaceholder":`Optional`,"pws.providerId":`Provider ID`,"pws.reauth":`Needs re-auth`,"pws.reauthenticate":`Re-authenticate`,"pws.clearCooldown":`Clear cooldown`,"pws.copyDoctor":`Copy ocx doctor`,"pws.doctorCopied":`Copied`,"pws.doctorCopyUnavailable":`Clipboard unavailable`,"pws.healthCooldownHint":`Wait until the cooldown ends. Do not probe this account yet.`,"pws.healthLabel.rateLimited":`Rate limited`,"pws.healthLabel.quotaLimited":`Quota limited`,"pws.healthLabel.reauthRequired":`Reauthentication required`,"pws.healthLabel.refreshFailed":`Refresh failed`,"pws.healthLabel.metadataMismatch":`Metadata mismatch`,"pws.healthLabel.credentialConflict":`Credential conflict`,"pws.healthSummary.rateLimited":`{provider} {account}: rate limited until {until}. Routing for this account is paused until then.`,"pws.healthSummary.quotaLimited":`{provider} {account}: quota limited until {until}. Routing for this account is paused until then.`,"pws.healthSummary.reauthRequired":`{provider} {account}: reauthentication required.`,"pws.healthSummary.credentialConflict":`{provider} {account}: credential conflict.`,"pws.healthSummary.metadataMismatch":`{provider} {account}: metadata mismatch.`,"pws.healthSummary.staleCredentials":`{provider} {account}: incomplete credentials.`,"pws.removeConfirm":`Remove`,"pws.removeConfirmBody":`Remove provider "{name}"? This cannot be undone.`,"pws.removeDefaultConfirmBody":`Remove default provider "{name}"? "{defaultProvider}" will become the default provider. This cannot be undone.`,"pws.removeConfirmTitle":`Remove provider`,"pws.saveSettings":`Save`,"pws.pacingTitle":`Request pacing`,"pws.pacingDesc":`Evenly delay outbound request starts for this provider. Streaming responses may overlap.`,"pws.pacingEnabled":`Enabled`,"pws.pacingRpm":`Requests per minute`,"pws.pacingRpmUnit":`RPM`,"pws.pacingDelay":`Minimum interval (ms)`,"pws.pacingJitter":`Random jitter (ms)`,"pws.pacingSlowerWins":`The slower provider limit wins. Model overrides can only add more delay.`,"pws.pacingQueued":`queued`,"pws.pacingNextSlot":`until next slot`,"pws.pacingLastModel":`last model`,"pws.pacingNone":`None`,"pws.pacingModelOverrides":`Model overrides`,"pws.pacingModel":`Model`,"pws.pacingAdd":`Add override`,"pws.pacingRemove":`Remove`,"pws.pacingRemoveModel":`Remove request pacing override for {model}`,"pws.pacingRuleRequired":`Enable request pacing only after setting a provider limit or a model override.`,"pws.antigravityTlsTitle":`Antigravity browser TLS profile`,"pws.antigravityTlsEnable":`Enable experimental TLS/HTTP2 emulation`,"pws.antigravityTlsWarning":`Unofficial compatibility behavior. It does not ensure Terms-of-Service compliance or prevent suspension, may make traffic more distinctive, and can fall back to Bun when initialization fails. Official Gemini API-key, Vertex, or documented Code Assist routes are safer choices.`,"pws.antigravityTlsConfirm":`Enable the experimental unofficial Antigravity TLS profile? It does not ensure policy compliance or prevent suspension and may make traffic more distinctive. Continue?`,"pws.antigravityTlsStatus":`TLS profile status: {status}`,"pws.antigravityTlsDisabled":`Disabled`,"pws.antigravityTlsActive":`Active`,"pws.antigravityTlsFallback":`Fallback`,"pws.saving":`Saving…`,"pws.settingsSaved":`Settings saved.`,"pws.accountModeSaved":`Account mode saved.`,"pws.accountModeFailed":`Could not switch the account mode.`,"pws.accountModeConfirm":`Switch the OpenAI account mode? Running conversations will be reassigned to the other mode's account set, and quota usage will be tracked against the new mode.`,"pws.settingsUnsavedBar":`You have unsaved changes.`,"pws.unsavedLeaveBody":`You have unsaved changes. Save them before leaving?`,"pws.unsavedLeaveTitle":`Unsaved changes`,"pws.attentionRequired":`Attention required`,"pws.attentionAria":`{name}: {reason}`,"pws.missingCredentials":`Missing credentials`,"pws.editJsonDesc":`Edit the raw proxy config as JSON`,"pws.updatesUnavailable":`Provider updates are not available.`,"pws.dashboard.title":`Providers overview`,"pws.dashboard.subtitle":`Manage all your model providers in one place.`,"pws.dashboard.rateLimits":`RATE LIMITS`,"pws.capacity.estimate":`Configured-weight pool estimate`,"pws.capacity.currentAccount":`Current effective account`,"pws.capacity.nextRecovery":`Next capacity recovery`,"pws.capacity.recoveryShare":`+{percent}% pool capacity`,"pws.capacity.incomplete":`Incomplete coverage: {excluded} account(s) excluded, including {unknown} unknown plan(s)`,"pws.capacity.partial":`Partial window coverage: {count} account(s) do not report every displayed limit window`,"pws.capacity.windowPartial":`Partial`,"pws.capacity.windowPartialA11y":`{window}: incomplete account coverage`,"pws.dashboard.recentlyUsed":`RECENTLY USED`,"pws.dashboard.requests":`{count} requests`,"pws.dashboard.checkedAgo":`Checked {time}`,"pws.dashboard.noQuota":`No quota data`,"pws.dashboard.noUsage":`No usage data yet`,"pws.dashboard.noRateLimits":`No rate-limit data yet`,"pws.allProviders":`Provider Overview`,"pws.enabledLabel":`Enabled`,"pws.testConnection":`Test connection`,"pws.testing":`Testing…`,"pws.connectionOk":`Connection OK`,"pws.connectionFailed":`Connection failed`,"pws.connectionNotApplicable":`Not applicable — this provider uses a static model catalog.`,"pws.editSettings":`Edit settings`,"pws.viewUsage":`View detailed usage`,"pws.allSystemsOk":`All systems operational`,"pws.apiKeyConfigured":`API key configured`,"pws.addApiKey":`Add API key`,"pws.loggedInAs":`Logged in as {email}`,"pws.notLoggedIn":`Not logged in`,"pws.passthrough":`Codex passthrough`,"pws.notes":`NOTES`,"pws.notePlaceholder":`Add a note about this provider...`,"pws.noteSaved":`Note saved`,"pws.authSummary":`AUTHENTICATION`,"pws.aiStudio":`AI Studio`,"pws.aiStudio.connected":`Connected`,"pws.aiStudio.checking":`Checking session`,"pws.aiStudio.unsupported":`Native login unsupported on this platform`,"pws.aiStudio.needsReauth":`Reauthentication required`,"pws.aiStudio.reauthenticated":`Reauthenticated successfully`,"pws.aiStudio.loginFailed":`Native login failed`,"pws.aiStudio.connect":`Connect`,"time.justNow":`Just now`,"time.notChecked":`Not checked`,"time.minutesAgo":`{n}m ago`,"time.hoursAgo":`{n}h ago`,"time.daysAgo":`{n}d ago`,"modal.noMatch":`No match.`,"modal.oauthDefaultNote":`Log in with your account — no API key needed.`,"modal.oauthComingSoon":`OAuth login for {label} arrives in the next update. Use an API key for now.`,"modal.oauthComingSoonShort":`OAuth login for this provider arrives in the next update — use an API key for now.`,"modal.useApiKeyInstead":`Use an API key instead`,"modal.setupGuide":`Setup guide`,"modal.setupStep1Prefix":`Go to`,"modal.setupDashboardLink":`{label} dashboard`,"modal.setupStep1Suffix":`and copy your API key`,"modal.setupStep2":`Paste it in the API key field below`,"modal.setupStep3":`Click Add provider — models are auto-discovered`,"modal.namePlaceholder":`e.g. openrouter`,"modal.duplicateWarn":`Provider "{name}" exists and will be overwritten.`,"modal.forwardHintPrefix":`No key needed — the proxy forwards your`,"modal.forwardCredentials":`codex login`,"modal.forwardHintSuffix":`credentials to this provider.`,"modal.localHint":`No API key is stored. This adds Cursor's static public model catalog for Codex, but live Cursor transport and native file/shell execution remain disabled until audited.`,"modal.getApiKey":`Get your {label} API key`,"modal.apiKey":`API key`,"modal.apiKeyTransport":`API key header`,"modal.apiKeyTransportNative":`x-api-key (Anthropic native)`,"modal.apiKeyTransportBearer":`Authorization: Bearer`,"modal.apiKeyPlaceholder":`sk-… (or $ENV_VAR)`,"modal.defaultModelPlaceholder":`e.g. gpt-5.5`,"modal.baseUrlPlaceholder":`https://...`,"modal.baseUrlPlaceholderError":`Base URL contains an unresolved {placeholder}. Replace it with your actual value.`,"modal.baseUrlPlaceholderHint":`Replace the {placeholder} in the Base URL with your actual Account ID before adding.`,"modal.adding":`Adding…`,"modal.useOauthLogin":`← Use OAuth login`,"nav.codexAuth":`Codex Auth`,"nav.codexSet":`Codex Set`,"codexSet.tab.multiauth":`Multi-auth`,"codexSet.tab.prompt":`Prompt`,"codexSet.prompt.title":`Prompt layers`,"codexSet.prompt.timing":`Applies to newly started sessions. Running sessions keep their current prompt settings.`,"codexSet.prompt.staleRevision":`The configuration changed elsewhere. The list was reloaded.`,"codexSet.prompt.writeFailed":`The change could not be saved.`,"codexSet.prompt.loadFailed":`The prompt layers could not be loaded.`,"codexSet.prompt.repair":`Repair`,"codexSet.prompt.repairFailed":`The repair could not be completed.`,"codexSet.drift.journalPresent":`A previous write did not finish. Recovery runs automatically on the next write.`,"codexSet.drift.projectionStale":`The saved layers and the value in config.toml disagree. Repair rewrites the value from your layers.`,"codexSet.drift.storeMissing":`The layer file is gone while instructions remain in config.toml. Repair keeps the text as one layer and writes a backup first.`,"codexSet.drift.ownedMalformed":`The generated line in config.toml was reshaped by hand, so it is no longer safe to rewrite.`,"codexSet.custom.adoptUnsupported":`The value at {path} line {line} is not a single-line string, so it cannot be imported. Move it by hand to manage it here.`,"codexSet.prompt.unreadable":`The Codex configuration file exists but could not be read, so changes are refused.`,"codexSet.layer.permissions":`Permissions`,"codexSet.layer.collaboration":`Collaboration mode`,"codexSet.layer.environment":`Environment context`,"codexSet.layer.apps":`Apps`,"codexSet.layer.skills":`Skills`,"codexSet.prompt.extensionsUnknown":`Extensions can add their own layers. Codex does not expose them, so they cannot be listed here.`,"codexSet.group.transition":`Transition notices`,"codexSet.group.transitionDesc":`These announce a change rather than describe state, so they appear only when the session enters realtime or switches model.`,"codexSet.custom.slotNote":`Custom layers are joined into one section in this order.`,"codexSet.row.alwaysOn":`Always on`,"codexSet.row.onChange":`Fires on change`,"codexSet.row.featureGated":`Configured under [features]`,"codexSet.row.openFeatures":`Open settings`,"codexSet.dialog.setValue":`{value} (default {fallback})`,"codexSet.dialog.copyKey":`Copy key`,"codexSet.dialog.unknownLayer":`This build has no description for this layer. It comes from a newer Codex runtime than the dashboard.`,"codexSet.custom.heading":`Custom layers`,"codexSet.custom.add":`+ Add layer`,"codexSet.custom.newTitle":`New layer`,"codexSet.custom.editTitle":`Edit layer`,"codexSet.custom.titleLabel":`Title`,"codexSet.custom.bodyLabel":`Instructions`,"codexSet.custom.bodySize":`{bytes} of {max} bytes`,"codexSet.custom.normalized":`Tabs became four spaces and line endings became LF.`,"codexSet.custom.titleRequired":`Enter a title.`,"codexSet.custom.titleTooLong":`Title is {count} characters; the limit is {max}.`,"codexSet.custom.titleMultiline":`A title must be a single line.`,"codexSet.custom.bodyTooLarge":`This layer is {bytes} bytes; the limit is {max}.`,"codexSet.custom.composedTooLarge":`Together the enabled layers would be {bytes} bytes, over the limit.`,"codexSet.custom.invalidCharacter":`A control character at position {position} cannot be saved.`,"codexSet.custom.discardPrompt":`Discard your changes?`,"codexSet.custom.keepEditing":`Keep editing`,"codexSet.custom.delete":`Delete {title}`,"codexSet.custom.deleteConfirm":`Delete this layer? There is no undo.`,"codexSet.custom.layerGone":`That layer was removed elsewhere, so the editor was closed.`,"codexSet.custom.deleteConfirmNamed":`Delete “{title}”? There is no undo.`,"codexSet.custom.moveUp":`Move {title} up`,"codexSet.custom.prevLayer":`Previous layer`,"codexSet.custom.nextLayer":`Next layer`,"codexSet.custom.navPosition":`{position} / {total}`,"codexSet.custom.moveDown":`Move {title} down`,"codexSet.custom.limitReached":`You can keep up to {max} custom layers.`,"codexSet.custom.notOwned":`developer_instructions was written outside opencodex, so it is not edited from here. Import it to manage it as a layer.`,"codexSet.custom.adopt":`Import existing instructions`,"codexSet.custom.adoptConfirm":`Import as a layer`,"codexSet.custom.adoptRefused":`The existing value could not be imported.`,"codexSet.custom.baseReplaced":`model_instructions_file is set to {path}, so something outside opencodex has replaced the base prompt.`,"codexSet.lint.identity":`This claims a different identity from the one Codex establishes.`,"codexSet.lint.foreignTool":`Tools come from the registry; naming one here does not create it.`,"codexSet.lint.placeholder":`No template engine runs over instructions, so this ships literally.`,"codexSet.lint.applyPatch":`apply_patch is defined by the tool registry, not by instructions.`,"codexSet.lint.approvalVocab":`Codex injects its own approval vocabulary; this may contradict it.`,"codexSet.lint.environment":`Environment facts are generated later and may contradict this.`,"codexSet.lint.size":`This layer is over 8 KB. It still saves, but it costs tokens on every request.`,"codexSet.preset.blank":`Blank layer`,"codexSet.preset.concise.name":`Concise output`,"codexSet.preset.concise.description":`Short answers, no preamble, minimal formatting.`,"codexSet.preset.concise.provenance":`Adapted from Claude Code's brevity directives. Our wording, not a copy.`,"codexSet.preset.planFirst.name":`Plan before editing`,"codexSet.preset.planFirst.description":`State the plan, then make the change.`,"codexSet.preset.planFirst.provenance":`Adapted from Claude Code's planning posture. Our wording, not a copy.`,"codexSet.preset.explainWhy.name":`Explain reasoning`,"codexSet.preset.explainWhy.description":`Say why, not only what.`,"codexSet.preset.explainWhy.provenance":`Adapted from Grok Build's confirmation style. Our wording, not a copy.`,"codexSet.preset.testFirst.name":`Test first`,"codexSet.preset.testFirst.description":`Write the failing test before the fix.`,"codexSet.preset.testFirst.provenance":`Adapted from common agent practice. Our wording, not a copy.`,"codexSet.preset.korean.name":`Korean replies`,"codexSet.preset.korean.description":`Answer in Korean whatever language the request uses.`,"codexSet.preset.korean.provenance":`Written for opencodex from a user-requested staple. Our wording, not a copy.`,"codexSet.dialog.class":`Kind`,"codexSet.dialog.key":`Config key`,"codexSet.dialog.fileValue":`Value in this file`,"codexSet.dialog.absentDefault":`not set (defaults to {value})`,"codexSet.dialog.noRenderedText":`Codex does not expose the assembled text of a built-in layer, so this dialog describes the layer and names its key rather than showing its contents.`,"codexSet.dialog.sourceText":`Text sent to the model`,"codexSet.dialog.sourceBytes":`{bytes} bytes`,"codexSet.dialog.notRendered":`This layer sent nothing on the turn we read. Sections are only re-sent when they change, so an unchanged layer is absent from a single sample.`,"codexSet.dialog.emptySource":`The file at {path} exists but is empty, so this layer sends nothing.`,"codexSet.dialog.notExposed":`The base prompt travels outside the message list Codex can print, so it cannot be shown here. Replacing it is possible through model_instructions_file.`,"codexSet.dialog.textUnavailable":`The Codex prompt could not be read on this machine, so the text is unavailable.`,"codexSet.class.base":`Base instructions`,"codexSet.class.config-toggle":`Switchable here`,"codexSet.class.feature-gated":`Feature-gated`,"codexSet.class.runtime-conditional":`Runtime-conditional`,"codexSet.class.extension-unknown":`Extension layer`,"codexSet.layer.base-instructions":`Base instructions`,"codexSet.layer.model-switch":`Model switch notice`,"codexSet.layer.personality":`Personality`,"codexSet.layer.context-window-guidance":`Context window guidance`,"codexSet.layer.realtime":`Realtime`,"codexSet.layer.agents-md":`AGENTS.md`,"codexSet.layer.environments-instructions":`Environments`,"codexSet.layer.plugins":`Plugins`,"codexSet.layer.tools":`Tools`,"codexSet.layer.multi-agent-mode":`Multi-agent mode`,"codexSet.layer.git-attribution":`Commit attribution`,"codexSet.about.base-instructions":`Codex's own instructions. They travel with the request itself and cannot be turned off.`,"codexSet.about.model-switch":`Added when the session changes model mid-conversation.`,"codexSet.about.personality":`Tone and voice guidance, governed by a feature flag.`,"codexSet.about.context-window-guidance":`Advice about the remaining context budget, governed by a feature flag.`,"codexSet.about.realtime":`Added for realtime sessions.`,"codexSet.about.agents-md":`Your project's AGENTS.md files. This page reports the layer; it never edits your project docs.`,"codexSet.about.permissions":`Explains the sandbox and approval settings in force.`,"codexSet.about.collaboration":`Explains the active collaboration mode.`,"codexSet.about.environment":`Working directory, platform, and other environment facts.`,"codexSet.about.environments-instructions":`Guidance for deferred execution environments, governed by a feature flag.`,"codexSet.about.apps":`How to use connected apps.`,"codexSet.about.plugins":`Added when a plugin is selected or any plugin advertises a capability.`,"codexSet.about.tools":`Deferred tool descriptions, governed by a feature flag.`,"codexSet.about.skills":`The list of available skills.`,"codexSet.about.multi-agent-mode":`Subagent instructions, governed by a feature flag.`,"codexSet.about.git-attribution":`Tells the model to add a Co-authored-by: Codex trailer to commits it writes, and a Generated with Codex. line to pull requests it opens. Codex resolves this from your account, so there is no setting for it here or under [features]. When your account has it off, Codex sends the opposite instruction rather than sending nothing.`,"codexSet.condition.model-switch":`Emitted only after a mid-session model change.`,"codexSet.condition.realtime":`Emitted only in a realtime session.`,"codexSet.condition.agents-md":`Emitted when a project doc is found for the working directory.`,"codexSet.condition.plugins":`Emitted when a plugin is selected or any plugin advertises a capability.`,"codexSet.condition.git-attribution":`Set by your account's attribution policy.`,"codexSet.base.title":`Base prompt`,"codexSet.base.prev":`Previous option`,"codexSet.base.next":`Next option`,"codexSet.base.position":`{position} / {total}`,"codexSet.base.swipeHint":`Swipe sideways, use the arrow keys, or press the arrows to move between options. Applies to newly started sessions.`,"codexSet.base.defaultTitle":`Codex's own base prompt`,"codexSet.base.defaultBody":`The default is not stored here, so there is nothing to edit or delete: choosing it simply removes model_instructions_file from your config, and Codex uses the prompt it ships with.`,"codexSet.base.variantTitle":`Name`,"codexSet.base.variantBody":`Prompt`,"codexSet.base.replacesWarning":`This REPLACES Codex's own base prompt rather than adding to it. A short prompt here means a model with short instructions.`,"codexSet.base.use":`Use this one`,"codexSet.base.inUse":`In use`,"codexSet.base.externalBlocked":`model_instructions_file already points at {path}, which opencodex did not write. Clear it yourself before choosing an option here.`,"nav.api":`API`,"nav.integrations":`Integrations`,"nav.openMenu":`Open menu`,"nav.closeMenu":`Close menu`,"integrations.subtitle":`Connect clients to opencodex, manage credentials, and restore client configuration.`,"integrations.tabsLabel":`Integration surfaces`,"integrations.tab.overview":`Overview`,"integrations.tab.keys":`API Keys`,"integrations.tab.codex":`Codex CLI`,"integrations.tab.claude":`Claude`,"integrations.tab.grok":`Grok Build`,"integrations.tab.opencode":`OpenCode`,"integrations.tab.pi":`Pi`,"integrations.tab.omp":`OMP`,"integrations.tab.hermes":`Hermes`,"integrations.tab.openclaw":`OpenClaw`,"integrations.tab.kimi":`Kimi Code`,"integrations.tab.gajae":`Gajae Code`,"integrations.tab.dsh":`DeepSeek Harness (DSH)`,"integrations.tab.mcode":`MiniMax Code`,"integrations.tab.zcode":`ZCode`,"integrations.tab.prime":`Prime Agent`,"integrations.codex.title":`Codex CLI`,"integrations.codex.body":`Codex wiring is owned by the proxy service. Starting opencodex applies it; stopping the service restores native routing.`,"integrations.codex.openService":`Open service controls`,"integrations.state.notInstalled":`Not installed`,"integrations.state.unknown":`Checking…`,"integrations.detail.codexRouted":`Codex requests go through this proxy`,"integrations.detail.codexAbsent":`Codex is not routed through this proxy yet`,"integrations.detail.keyCount":`{count} key(s) issued`,"integrations.detail.keyNone":`No keys issued`,"integrations.detail.keyChecking":`Checking…`,"integrations.detail.keyUnavailable":`Key status unavailable`,"integrations.detail.claudeOff":`Connection is off`,"integrations.detail.desktopCurrent":`Desktop is running this profile`,"integrations.detail.desktopStale":`The profile file changed after it was applied`,"integrations.detail.desktopNotServed":`The profile exists, but Desktop serves another one`,"integrations.detail.desktopAbsent":`No profile applied`,"integrations.detail.desktopDesiredOff":`Claude Desktop integration is off`,"integrations.detail.desktopDesiredOffCleanupPending":`Claude Desktop is still using the gateway; cleanup is pending`,"integrations.detail.desktopDesiredOnNotApplied":`Integration is on, but Desktop is not using the gateway profile`,"integrations.detail.desktopSelectedElsewhere":`Desktop is using another profile`,"integrations.detail.desktopProfileDrift":`The selected Desktop profile changed`,"integrations.detail.desktopObservedUnsafe":`The selected Desktop profile cannot be changed safely`,"integrations.detail.desktopNotInstalled":`Claude Desktop configuration library is not installed`,"integrations.detail.grokModels":`{count} model(s) wired`,"integrations.detail.grokAbsent":`No opencodex block in the config`,"integrations.dialog.grok.title":`Disable the Grok Build integration?`,"integrations.dialog.grok.changes":`Only the block marked by opencodex will be removed from {path}. Content written outside the block will remain unchanged.`,"integrations.dialog.grok.breakage":`Disabling removes the opencodex model aliases from Grok Build. Models used with your xAI account remain available.`,"integrations.dialog.grok.undo":`If opencodex is running on a loopback address, turning this back on writes a new block from the models currently available.`,"integrations.dialog.grok.confirm":`Disable`,"integrations.dialog.desktop.title":`Disable Claude Desktop integration?`,"integrations.dialog.desktop.changes":`If {path} contains an opencodex-managed gateway profile, Desktop will first select a new credential-free standard profile, then remove the old profile and backup.`,"integrations.dialog.desktop.breakage":`Claude Desktop will return to standard Claude instead of models routed through opencodex.`,"integrations.dialog.desktop.undo":`Turning this back on regenerates the opencodex profile from your saved model assignments.`,"integrations.dialog.desktop.restart":`Claude Desktop reads this configuration only at launch. Fully quit and reopen it for this change to take effect.`,"integrations.dialog.desktop.confirm":`Disable`,"integrations.native.msg.nonLoopbackRemoved":`Grok Build can be registered automatically only while opencodex runs on a loopback address. The previous block that pointed to loopback was removed.`,"integrations.native.msg.nonLoopbackRemovedNoop":`Grok Build can be registered automatically only while opencodex runs on a loopback address. There was no previous block to remove.`,"integrations.native.msg.nonLoopbackSuperseded":`Grok Build can be registered automatically only while opencodex runs on a loopback address. Another process wrote a new block in the meantime, so the block now in the file was not created by this request.`,"integrations.native.error.orphanedMarker":`{path} has an opencodex start marker but no end marker. The file was left unchanged because opencodex cannot determine where its block ends.`,"integrations.native.error.homeMismatch":`The installed service home does not match the current home, so the file was left unchanged.`,"integrations.native.error.notInstalled":`Grok Build is not installed, so there is nothing to change.`,"integrations.native.error.configBusy":`The configuration is being saved elsewhere and could not be changed. Try again shortly.`,"integrations.native.error.desktopUnsafeMetadata":`Claude Desktop metadata at {path} could not be read safely, so its library was not changed.`,"integrations.native.error.desktopCleanupIncomplete":`Claude Desktop is pointed at standard mode, but old opencodex credential files remain at: {paths}.`,"integrations.native.msg.desktopDisabled":`Claude Desktop integration disabled.`,"integrations.native.msg.desktopEnabled":`Claude Desktop integration enabled.`,"integrations.state.absent":`Not applied`,"integrations.state.current":`Applied`,"integrations.state.stale":`Update needed`,"integrations.state.conflict":`Conflict`,"integrations.state.unsafe":`Cannot verify`,"integrations.summary.detected":`Clients detected`,"integrations.summary.applied":`Configured clients`,"integrations.summary.stale":`Update needed`,"integrations.summary.lastChange":`Last change`,"integrations.summary.disableAll":`Disable all…`,"integrations.onboarding":`Applying writes one opencodex provider block after saving a backup. Disable removes only that block, and a retained snapshot can be restored.`,"integrations.empty.title":`No installed clients were detected`,"integrations.empty.body":`Install a supported client, then return here to apply opencodex.`,"integrations.action.apply":`Apply`,"integrations.action.disable":`Disable`,"integrations.action.refresh":`Update`,"integrations.action.settings":`Settings`,"integrations.action.manageKeys":`Manage keys`,"integrations.action.restore":`Restore…`,"integrations.action.undo":`Undo`,"integrations.action.restorePoint":`Restore this point…`,"integrations.action.snapshotExpired":`Backup expired`,"integrations.rollback.title":`Rollback center`,"integrations.rollback.empty":`No apply history yet`,"integrations.rollback.emptyBody":`Every successful write keeps a pre-write snapshot first.`,"integrations.restore.title":`Restore this snapshot?`,"integrations.restore.body":`The current file is backed up first, then the selected snapshot replaces it.`,"integrations.restore.driftTitle":`Newer edits were detected`,"integrations.restore.driftBody":`Changes made after this snapshot will be backed up, then the file will be replaced.`,"integrations.restore.confirm":`Restore`,"integrations.restore.confirmDrift":`Back up newer edits and restore`,"integrations.restore.pending":`Restoring…`,"integrations.restore.manual":`Automatic restore failed: {reason}. Restore manually from {path}.`,"integrations.error.load":`Could not load integration state.`,"integrations.error.stale":`The latest refresh failed. The values below may be stale.`,"integrations.error.busy":`Another change for this client is still running. Try again shortly.`,"integrations.error.conflict":`The config changed after opencodex wrote it. Nothing was removed.`,"integrations.error.unsafe":`The config cannot be changed safely.`,"integrations.error.generic":`The integration change failed. Your previous state was kept.`,"integrations.error.nonLoopback":`{client} can only reach a proxy on localhost — its config has nowhere to put the admission header a remote bind requires, so writing one by hand would not help either. Give it loopback access instead, through a tunnel or a local forwarder.`,"integrations.status.installed":`Installed`,"integrations.status.notInstalled":`Not installed`,"integrations.status.appliedAt":`Applied`,"integrations.status.backup":`Backup`,"integrations.status.lastRestore":`Last restore`,"integrations.status.unknown":`Unknown`,"integrations.bulk.title":`Disable applied client integrations?`,"integrations.bulk.body":`Only the opencodex-owned block is removed. A pre-write snapshot is kept for each client.`,"integrations.bulk.partial":`Some clients could not be disabled: {clients}`,"integrations.bulk.success":`Applied client integrations were disabled.`,"integrations.retention.degraded":`Backup cleanup is behind; older backups may still be on disk.`,"integrations.error.residual":`The file may be in an intermediate state: {message} Restore it from {path}.`,"integrations.error.recover":`{message} A backup is at {path}.`,"integrations.kind.apply":`Applied`,"integrations.kind.disable":`Disabled`,"integrations.kind.refresh":`Updated`,"integrations.kind.restore":`Restored`,"integrations.semantics.opencode":`Direct disk launches only; ocx opencode environment injection takes precedence.`,"integrations.semantics.pi":`Applies to new sessions.`,"integrations.semantics.omp":`Restart OMP to load the catalog.`,"integrations.semantics.hermes":`Applies to new sessions.`,"integrations.semantics.openclaw":`Applies immediately to a running gateway.`,"integrations.semantics.kimi":`Restart or run /reload to apply it (v2 watches the file).`,"integrations.semantics.gajae":`Applies to a new session or when opening /model.`,"integrations.semantics.dsh":`OpenCodex manages only llm-pi-ai.providers.opencodex in $DSH_HOME/settings.yaml. DSH hot reloads this provider; your default model and deepseek-official stay unchanged. Currently loopback-only; no real credential is written.`,"integrations.semantics.mcode":`Manages only custom_provider.opencodex. Your default model and MiniMax login stay unchanged.`,"integrations.semantics.zcode":`Manages only provider.opencodex in ~/.zcode/v2/config.json. Your Z.ai login and other providers stay unchanged. Restart ZCode after changes.`,"integrations.semantics.prime":`Manages only providers.opencodex in Prime Agent's models.json — ~/.prime/agent unless PRIME_AGENT_CODING_AGENT_DIR redirects it. Your other providers and model overrides stay unchanged. Applies to new sessions.`,"codexAuth.mainAccount":`Main Account`,"codexAuth.logLabel":`Log label`,"codexAuth.codexApp":`Codex App`,"codexAuth.appLogin":`App login`,"codexAuth.accountPool":`Account Pool`,"codexAuth.accountModeTitle":`OpenAI account mode`,"codexAuth.accountModePool":`Pool mode`,"codexAuth.accountModePoolDesc":`The main login and eligible added accounts rotate here.`,"codexAuth.accountModeDirect":`Direct mode`,"codexAuth.accountModeDirectDesc":`Requests use only the main login; added accounts remain stored for Pool mode.`,"codexAuth.openaiMissing":`The built-in OpenAI provider is not configured.`,"codexAuth.openaiDisabled":`The built-in OpenAI provider is disabled.`,"codexAuth.openaiUnavailableDesc":`Your OpenAI accounts are still available. Enable the provider to route Codex requests.`,"codexAuth.enableOpenai":`Enable OpenAI`,"codexAuth.enablingOpenai":`Enabling...`,"codexAuth.enableOpenaiFailed":`Failed to enable the OpenAI provider.`,"codexAuth.openaiPresetLoadFailed":`Failed to load the OpenAI provider preset.`,"codexAuth.openaiPresetUnavailable":`OpenAI provider preset is unavailable.`,"codexAuth.openProviders":`Open Providers`,"codexAuth.add":`Add`,"codexAuth.sparkQuota":`Codex Spark quota`,"codexAuth.sparkQuotaHint":`Show the GPT-5.3-Codex-Spark weekly window on account cards. Hidden by default because it applies to one model only.`,"codexAuth.sparkQuotaShown":`Codex Spark quota shown`,"codexAuth.sparkQuotaHidden":`Codex Spark quota hidden`,"codexAuth.sparkQuotaFailed":`Could not change the Codex Spark quota setting`,"codexAuth.refreshQuota":`Refresh quotas`,"codexAuth.refreshingQuota":`Refreshing...`,"codexAuth.quotaRefreshed":`Quotas refreshed`,"codexAuth.quotaRefreshFailed":`Failed to refresh quotas`,"codexAuth.pauseExhausted":`Pause exhausted`,"codexAuth.pausingExhausted":`Checking quotas...`,"codexAuth.pauseExhaustedSucceeded":`Accounts at the limit paused: {count}`,"codexAuth.pauseExhaustedNone":`No accounts have confirmed 100% usage.`,"codexAuth.pauseExhaustedFailed":`Failed to check and pause exhausted accounts.`,"codexAuth.noPool":`No pool accounts added yet.`,"codexAuth.pause":`Pause`,"codexAuth.resume":`Resume`,"codexAuth.paused":`PAUSED`,"codexAuth.pauseSucceeded":`{email} is paused`,"codexAuth.resumeSucceeded":`{email} is available to the pool again`,"codexAuth.pauseFailed":`Could not pause {email}. Nothing was changed.`,"codexAuth.resumeFailed":`Could not resume {email}. Nothing was changed.`,"codexAuth.pausedHint":`Excluded from automatic switching, retries, cooldown recovery, and manual selection until resumed.`,"codexAuth.pinned":`PINNED`,"codexAuth.pinnedHint":`You selected this account by hand, so a higher selection order will not move past it. The pin lasts until this account is drained, you select another, or you change any selection order.`,"codexAuth.fiveHour":`5h`,"codexAuth.weekly":`Week`,"codexAuth.monthly":`30d`,"codexAuth.resets":`resets`,"codexAuth.today":`Today`,"codexAuth.current":`CURRENT`,"codexAuth.nextSession":`SELECTED`,"codexAuth.poolPrepared":`PREPARED FOR POOL`,"codexAuth.preparePoolTitle":`Prepare this account for Pool mode?`,"codexAuth.preparePoolDesc":`Direct requests keep using the main login. This account becomes the prepared Pool selection when Pool mode is enabled.`,"codexAuth.prepareForPool":`Prepare for Pool`,"codexAuth.poolPreparedToast":`{email} is prepared for Pool mode`,"codexAuth.switchTitle":`Switch active account?`,"codexAuth.switchDesc":`Takes effect immediately. Existing account-affine threads and requests already in flight keep their captured account; new or unbound requests use the selected account's order tier, and accounts at the same selection order still take turns.`,"codexAuth.cacheWarning":`Prompt cache resets on account switch. New session starts with empty cache.`,"codexAuth.setAsNext":`Use this account next`,"codexAuth.cancel":`Cancel`,"codexAuth.switchBack":`Switch back to Main?`,"codexAuth.switchBackDesc":`Takes effect immediately. Existing account-affine threads and requests already in flight keep their captured account; new or unbound requests use your App login account's order tier, and accounts at the same selection order still take turns.`,"codexAuth.autoSwitch":`Usage-based proactive switching`,"codexAuth.autoSwitchQuotaDesc":`Quota: at {threshold}% usage or above, the next request may move to a lower-usage eligible account, including an already-bound task; Go/Free use 30d only.`,"codexAuth.autoSwitchQuotaOffDesc":`Usage-based proactive switching is off. New/unbound assignment and failure recovery still apply.`,"codexAuth.autoSwitchRoundRobinDesc":`Round-robin assignment does not use this threshold; it continues to rotate new/unbound tasks.`,"codexAuth.autoSwitchFillFirstDesc":`Fill-first: {threshold}% is the drain point for new/unbound tasks; healthy bound tasks keep their account.`,"codexAuth.autoSwitchFillFirstOffDesc":`Fill-first has no usage drain point for new/unbound tasks; cooldown, reauthentication, and failure recovery can still move routing.`,"codexAuth.failureRecoveryNote":`Failure recovery is separate: a request rejected before output with 429/402, cooldown, reauthentication, exclusion, or configured transient failover may select another eligible account.`,"codexAuth.autoSwitchThreshold":`Usage threshold`,"codexAuth.autoSwitchThresholdAria":`Usage threshold, percent`,"codexAuth.autoSwitchThresholdInc":`Increase usage threshold`,"codexAuth.autoSwitchThresholdDec":`Decrease usage threshold`,"codexAuth.autoSwitchLoadFailed":`Usage-based switching setting could not be loaded.`,"codexAuth.autoSwitchThresholdInvalid":`Enter a whole number from 1 to 100`,"codexAuth.autoSwitchUpdated":`Usage-based proactive switching updated`,"codexAuth.autoSwitchUpdateFailed":`The usage-based switching update could not be confirmed. The last confirmed value is shown.`,"codexAuth.requestUserInput":`Ask for input in Default mode`,"codexAuth.requestUserInputDesc":`Lets Codex pause a Default-mode session and ask you questions with the request_user_input tool.`,"codexAuth.requestUserInputUpdated":`Feature flag updated - applies to new sessions.`,"codexAuth.requestUserInputUpdatedRestart":`Feature flag updated - applies to new sessions. Restart the Codex app to pick it up.`,"codexAuth.requestUserInputUpdateFailed":`Could not update the feature flag. Nothing was changed.`,"codexAuth.requestUserInputLoadFailed":`Could not read the feature flag from config.toml.`,"codexAuth.accountPickerTitle":`Target a specific Codex account from the model picker`,"codexAuth.accountPickerOffDesc":`When enabled, ordinary GPT picker rows are replaced by one entry per account selector, so you can choose the exact account for a conversation without logging out. Turning it off removes no accounts.`,"codexAuth.accountPickerOnDesc":`Each selector is a public label for one stored account. Choosing it locks that conversation to the mapped account: it never rotates or falls back, and it does not change the active Pool account.`,"codexAuth.accountPickerCompatibility":`The built-in Codex App login has its own selector; generated maps normally call it main and use a collision-safe suffix such as main-2 when needed. Added accounts receive stable privacy-safe labels, while custom selector labels stay unchanged. Existing conversations and saved model selections continue routing. Turning this off hides generated entries but preserves selectors and exact routes. Plain GPT model IDs keep their Pool or Direct behavior.`,"codexAuth.accountPickerUpdated":`Account targeting updated.`,"codexAuth.accountPickerUpdateFailed":`Could not update account targeting. The last confirmed setting is shown.`,"codexAuth.accountPickerLoadFailed":`Could not load the account-targeting setting.`,"codexAuth.accountPickerRefreshFailed":`Could not refresh this setting. The last confirmed value is still shown.`,"codexAuth.advancedSettings":`Advanced settings`,"codexAuth.advancedSettingsAria":`Show or hide advanced Codex Auth settings`,"codexAuth.catalogRefreshPending":`The change was saved, but the Codex model catalog refresh is pending. Run ocx sync to retry.`,"anthropicPool.title":`Claude account pool (experimental)`,"anthropicPool.enabledDesc":`On 429, cools the account and fails over. New sessions prefer usage under {threshold}% (5-hour bar).`,"anthropicPool.disabledDesc":`Uses only the active Claude account. Enable only if you accept experimental routing.`,"anthropicPool.experimentalWarning":`Experimental and not battle-tested. Anthropic may restrict accounts that look like automated multi-account rotation. Same organization can share quota — pooling those accounts will not help. Keep this off unless you understand the risk.`,"anthropicPool.needTwoAccounts":`Add at least two Claude OAuth accounts before enabling the pool.`,"anthropicPool.threshold":`New-session usage threshold`,"anthropicPool.thresholdAria":`New-session usage threshold, percent`,"anthropicPool.thresholdHelp":`0 disables quota-based picking (affinity + active account only). Default 80.`,"anthropicPool.thresholdInvalid":`Enter a whole number from 0 to 100`,"anthropicPool.loadFailed":`Claude pool settings could not be loaded.`,"anthropicPool.saveFailed":`Claude pool settings could not be saved.`,"anthropicPool.on":`On`,"anthropicPool.off":`Off`,"cursorPool.title":`Cursor account pool (experimental)`,"cursorPool.enabledDesc":`On 429 or auth failure, cools the account and fails over for this conversation. Each conversation stays on one account until a rate-limit or credential failure.`,"cursorPool.disabledDesc":`Uses only the active Cursor account. Enable only if you accept experimental routing.`,"cursorPool.experimentalWarning":`Experimental and not battle-tested. Cursor's acceptable-use policy forbids circumventing rate limits and manipulating usage metering. Teams included usage is per seat and may not transfer. Keep this off unless you understand the risk.`,"cursorPool.needTwoAccounts":`Add at least two Cursor OAuth accounts before enabling the pool.`,"cursorPool.loadFailed":`Cursor pool settings could not be loaded.`,"cursorPool.saveFailed":`Cursor pool settings could not be saved.`,"cursorPool.on":`On`,"cursorPool.off":`Off`,"antigravityRouting.failoverOnlyTitle":`Multi-account routing (failover only)`,"antigravityRouting.failoverOnlyDesc":`Each conversation stays on one Antigravity account. On rate-limit 429 or credential failure, opencodex may fail over to another eligible account for that conversation — without load-balancing new sessions across accounts or changing the global active account for other live conversations.`,"accountPool.strategy":`Rotation strategy`,"accountPool.strategyDesc":`How OpenCodex assigns an account to a new/unbound task.`,"accountPool.strategyQuota":`Quota`,"accountPool.strategyRoundRobin":`Round-robin`,"accountPool.strategyFillFirst":`Fill-first`,"accountPool.strategyHintQuota":`Quota can also rebind an existing task on its next request after the usage threshold is crossed.`,"accountPool.strategyHintRoundRobin":`Round-robin rotates only tasks without a live binding; the usage threshold does not change normal rotation.`,"accountPool.strategyHintFillFirst":`Fill-first uses the threshold as a drain point for unbound tasks; healthy bound tasks keep affinity.`,"accountPool.unboundDefinition":`New/unbound task means a request with no current account binding; an existing visible task can become unbound after a proxy or affinity reset.`,"accountPool.stickyLimit":`New/unbound assignments before rotate`,"accountPool.stickyLimitAria":`New/unbound assignments before rotate`,"accountPool.stickyLimitInc":`Increase sticky limit`,"accountPool.stickyLimitDec":`Decrease sticky limit`,"accountPool.stickyLimitHelp":`Keep the selected account for this many new/unbound task assignments before advancing; the counter increments when the task is bound, not after upstream success.`,"accountPool.stickyLimitInvalid":`Enter a whole number from 1 to 100`,"accountPool.strategyLoadFailed":`Rotation strategy could not be loaded.`,"accountPool.strategyUpdateFailed":`Rotation strategy could not be saved.`,"accountPool.priority":`Selection order`,"accountPool.priorityAria":`Selection order for this account`,"accountPool.priorityHint":`Higher numbers are used first. The pool moves to a lower number only when every account above it is drained or unavailable.`,"accountPool.priorityFirst":`First`,"accountPool.priorityEarlier":`Earlier`,"accountPool.priorityNormal":`Normal`,"accountPool.priorityLater":`Later`,"accountPool.priorityLast":`Last`,"accountPool.priorityOption":`{name} ({value})`,"accountPool.priorityCustom":`Custom`,"accountPool.priorityUpdated":`Selection order updated for {email}`,"accountPool.priorityUpdateFailed":`Selection order for {email} could not be saved. The last confirmed value is shown.`,"codexAuth.switched":`{email} is selected for the next request`,"codexAuth.loadFailed":`Codex account settings could not be loaded.`,"codexAuth.switchFailed":`The account could not be switched. Your previous selection is unchanged.`,"codexAuth.removeConfirm":`Remove {id}?`,"codexAuth.removeFailed":`The account could not be removed. Nothing was changed.`,"codexAuth.addTitle":`Add Codex Account`,"codexAuth.addIdLabel":`Account ID (slug)`,"codexAuth.addIdPlaceholder":`codex-work, codex-alt, team...`,"codexAuth.resetCreditsAria":`{count} reset credit(s)`,"codexAuth.addJsonLabel":`auth.json content`,"codexAuth.addHelp":`Copy from another machine's ~/.codex/auth.json, or use codex-auth export.`,"codexAuth.importBtn":`Import`,"codexAuth.importInvalidJson":`Invalid JSON`,"codexAuth.importMissingTokens":`Missing access_token or refresh_token in JSON`,"codexAuth.importMissingId":`Account ID is required`,"codexAuth.accountAdded":`Account added to pool`,"codexAuth.addPickDesc":`Login with another ChatGPT account to add it to the pool.`,"codexAuth.oauthLogin":`OAuth Login`,"codexAuth.oauthDesc":`Opens ChatGPT login in browser`,"codexAuth.importAuthJson":`Import auth.json`,"codexAuth.importAuthJsonDesc":`From another Codex install or codex-auth export`,"codexAuth.back":`Back`,"codexAuth.oauthAlreadyInProgress":`Login already in progress. Complete it in your browser.`,"codexAuth.oauthWaiting":`Waiting for ChatGPT login to complete in your browser...`,"codexAuth.oauthSubmittingCode":`Submitting code…`,"codexAuth.oauthCodeSubmitted":`Code submitted — waiting for login to finish…`,"codexAuth.oauthStatusRetrying":`Network or proxy error while checking login status — retrying…`,"codexAuth.oauthCancelled":`Login was cancelled.`,"codexAuth.loginFailed":`Login failed`,"codexAuth.needsReauth":`Re-login`,"codexAuth.reauthenticate":`Re-authenticate`,"codexAuth.tokenExpired":`Token expired — re-authenticate this account`,"codexAuth.mainTokenExpired":`Token expired — sign in again via Codex App login`,"codexAuth.emailCollision":`This account matches your main Codex login. Use a different account.`,"codexAuth.resetCreditsTitle":`Reset Credits`,"codexAuth.resetCreditsAvailable":`You have {count} reset credit(s) available.`,"codexAuth.resetCreditsDesc":`Each credit resets your current hourly and weekly usage limits instantly.`,"codexAuth.noResetCredits":`You don't have any reset credits.`,"codexAuth.earnCreditsHint":`Credits are earned monthly and via the referral program.`,"codexAuth.creditsExpireNote":`Credits expire 30 days after earning.`,"codexAuth.useOneCredit":`Use 1 Credit`,"codexAuth.confirmResetTitle":`Use Reset Credit?`,"codexAuth.confirmResetDesc":`This will instantly reset your current rate limits. You have {count} credit(s) remaining.`,"codexAuth.irreversible":`This action cannot be undone.`,"codexAuth.useCredit":`Use Credit`,"codexAuth.redeeming":`Resetting...`,"codexAuth.resetSuccess":`Rate limits reset! {remaining} credit(s) remaining.`,"codexAuth.resetSuccessGeneric":`Rate limits reset!`,"codexAuth.resetAlreadyRedeemed":`This credit was already redeemed. Credits unchanged.`,"codexAuth.resetNothingToReset":`No rate-limit window needs resetting right now.`,"codexAuth.resetNoCredit":`No reset credits available.`,"codexAuth.resetError":`Failed to redeem reset credit. Please try again.`,"codexAuth.fifoNote":`The oldest credit is used first.`,"codexAuth.confirmWhichCredit":`Credit from {date} will be used.`,"codexAuth.creditNext":`Next to use`,"codexAuth.creditLabel":`Credit #{n}`,"codexAuth.creditNextBadge":`NEXT`,"codexAuth.creditGranted":`Granted {date}`,"codexAuth.creditExpires":`Expires {date} ({days}d left)`,"api.title":`API Access`,"api.subtitle":`Use generated API keys to access the opencodex proxy from external apps. Keys authenticate via the {authHeader} header; see the table below for what each endpoint accepts.`,"api.baseUrl":`Base URL`,"api.responsesEndpoint":`Responses API`,"api.chatCompletionsEndpoint":`Chat Completions API`,"api.messagesEndpoint":`Messages API`,"api.modelsEndpoint":`Models API`,"api.endpointNote":`Use the base URL with OpenAI-compatible clients. Responses and Chat Completions are exposed under /v1.`,"api.endpointsTitle":`Endpoints`,"api.authTitle":`Authentication`,"api.authLoopback":`Loopback binds (127.0.0.1 or ::1) bypass authentication. Remote binds require a generated ocx_ key or OPENCODEX_API_AUTH_TOKEN.`,"api.authBaseUrlNote":`Configure clients with the base URL, then choose the protocol-specific endpoint below.`,"api.newKeyTitle":`New key created`,"api.newKeyNote":`Copy this key now — it won't be shown again.`,"api.copy":`Copy`,"api.copied":`Copied`,"api.dismiss":`Dismiss`,"api.generateTitle":`Generate key`,"api.keyNamePlaceholder":`Key name (optional)`,"api.generate":`Generate`,"api.generating":`Creating…`,"api.activeKeys":`Active keys ({count})`,"api.activeKeysLoading":`Active keys`,"api.noKeys":`No API keys yet. Generate one above.`,"api.workspace.sections":`API sections`,"api.section.keys":`Keys`,"api.section.connect":`Connect`,"api.section.endpoints":`Endpoints`,"api.section.models":`Models`,"api.section.examples":`Examples`,"api.workspace.details":`API key details`,"api.workspace.keyDetails":`Key details`,"api.workspace.keyPrefix":`Key prefix`,"api.workspace.deleteKey":`Delete key`,"api.workspace.deleteConfirm":`Are you sure you want to delete this key? This cannot be undone.`,"api.workspace.usageExamples":`Usage examples`,"api.copyUrlHint":`Click to copy URL`,"api.urlCopied":`URL copied`,"api.copyExampleHint":`Click to copy example`,"api.exampleCopied":`Example copied`,"api.colName":`Name`,"api.colKey":`Key`,"api.colCreated":`Created`,"api.confirm":`Confirm`,"api.deleteAria":`Delete API key`,"api.modelsTitle":`External model catalog`,"api.modelsCount":`{count} callable`,"api.modelsLoading":`Loading models…`,"api.modelsSearch":`Search models`,"api.modelsSubtitle":`Use these exact model IDs with /v1/models and your chosen inbound protocol.`,"api.modelsEmpty":`No externally callable models are available yet.`,"api.modelsNoMatch":`No models match “{query}”.`,"api.modelsLoadFailed":`Could not load the external model catalog.`,"api.colModel":`Model`,"api.colSource":`Source`,"api.colProtocols":`Protocols`,"api.sourceNative":`ChatGPT pool`,"api.sourceCombo":`Combo route`,"api.sourceCustom":`Custom`,"api.protocolResponses":`Responses`,"api.protocolChatCompletions":`Chat Completions`,"api.protocolMessages":`Messages`,"api.copyModelId":`Copy ID`,"api.modelCopied":`Copied`,"api.testModel":`Test`,"api.testingModel":`Testing…`,"api.testSucceeded":`OK`,"api.testFailed":`Failed`,"api.usageChatTitle":`Chat Completions example`,"api.usageResponsesTitle":`Responses example`,"api.usageMessagesTitle":`Messages example`,"api.usageSampleInput":`Hello, world!`,"api.clientConfig.title":`Client config`,"api.clientConfig.rowsLabel":`Connect a client`,"api.clientConfig.details":`Details`,"api.clientConfig.detailsAria":`{client} config details`,"api.clientConfig.copyAria":`Copy {client} config`,"api.clientConfig.downloadAria":`Download {client} config`,"api.clientConfig.rowMeta":`{destination} · {count} model(s)`,"api.clientConfig.rowError":`Could not build the {client} config.`,"api.clientConfig.copiedAnnounceClient":`{client} config copied to the clipboard.`,"api.clientConfig.clientOpencode":`OpenCode`,"api.clientConfig.clientPi":`Pi`,"api.clientConfig.clientOmp":`OMP`,"api.clientConfig.clientHermes":`Hermes`,"api.clientConfig.clientOpenclaw":`OpenClaw`,"api.clientConfig.clientKimi":`Kimi Code`,"api.clientConfig.clientGajae":`Gajae Code`,"api.clientConfig.clientDsh":`DeepSeek Harness (DSH)`,"api.clientConfig.clientMcode":`MiniMax Code`,"api.clientConfig.clientZcode":`ZCode`,"api.clientConfig.clientPrime":`Prime Agent`,"api.clientConfig.copy":`Copy config`,"api.clientConfig.download":`Download`,"api.clientConfig.loading":`Building client config…`,"api.clientConfig.jsonLabel":`{client} config`,"api.clientConfig.destination":`Destination file`,"api.clientConfig.envHint":`Set the key before launching`,"api.clientConfig.mergeWarning":`Merge this into the destination file. Replacing it would drop your other providers and MCP settings.`,"api.clientConfig.modelCount":`{count} model(s) exported`,"api.clientConfig.missingLimits":`{count} of {total} model(s) ship without a context limit; the client applies its own defaults.`,"api.clientConfig.noKeyYet":`{env} has no key behind it yet. Generate a key above before using this config off loopback.`,"api.clientConfig.loadFailed":`Could not read the model list, so no client config was produced.`,"api.clientConfig.copiedAnnounce":`Client config copied to the clipboard.`,"api.clientConfig.copyFailed":`Could not copy the client config.`,"api.clientConfig.downloadedAnnounce":`Downloaded {filename}. Nothing changed yet — merge it into {destination} yourself.`,"api.clientConfig.whereDisclosure":`Where this file goes`,"api.clientConfig.whereBody":`The destination above is the global path. A project-local config file in the working directory takes precedence over it, and the client reads the key from the environment variable named in the config — never from this file.`,"api.keysLoadFailed":`Could not load API keys.`,"api.createFailed":`Could not create API key.`,"api.deleteFailed":`Could not delete API key.`,"api.auth.endpoint":`Endpoint`,"api.auth.required":`Required`,"api.auth.accepted":`Accepted`,"api.auth.rejected":`Not accepted`,"api.auth.testProtocol":`Test {protocol}`,"api.auth.testNeedsFreshKey":`Generate a key and keep its one-time value on screen to run an authenticated test.`,"api.key.name":`Key name`,"api.key.rename":`Rename`,"api.key.saveName":`Save name`,"api.key.renaming":`Saving…`,"api.key.renameFailed":`Could not rename the key. Your draft was kept.`,"api.key.deleting":`Deleting…`,"api.key.copyFailed":`Could not copy the key. Select it and copy it manually before dismissing this panel.`,"api.attribution.title":`Attributed usage`,"api.attribution.requests7d":`Requests, last 7 days`,"api.attribution.totalRequests":`Total attributed requests`,"api.attribution.totalRequestsAvailable":`Requests in available history`,"api.attribution.sinceAvailable":`Available attribution since`,"api.attribution.lastUsed":`Last used`,"api.attribution.since":`Attribution available since`,"api.attribution.neverUsed":`Not used since attribution began`,"api.attribution.unavailable":`Usage unavailable`,"api.attribution.unavailableDetail":`No usage has been attributed yet. Requests recorded before attribution began cannot be assigned retroactively.`,"api.attribution.ambiguous":`Two keys share this ID, so usage cannot be attributed to one of them. Give each key a unique ID in the config file.`,"api.attribution.railAmbiguous":`duplicate ID`,"claude.subtitle":`Use GPT, Gemini, and other models inside Claude Code.`,"claude.pageTitle":`Claude Code`,"claude.workspace.settings":`Settings`,"claude.enabledLabel":`Claude connection`,"claude.enabledHint":`When off, Claude Code cannot use this proxy.`,"claude.authMode":`Auth Mode`,"claude.authModeHint":`Subscription requires Claude account, Proxy works without Anthropic account`,"claude.authModeSubscription":`Subscription (Claude account)`,"claude.authModeProxy":`Proxy (no account needed)`,"claude.authModeAuto":`Auto (detect Claude auth)`,"claude.effectiveMode.label":`Effective on next launch`,"claude.effectiveMode.manual":`Manual: {mode}`,"claude.effectiveMode.autoPresent":`Auto: subscription — Claude auth found via {source}`,"claude.effectiveMode.autoAbsent":`Auto: proxy mode — no Claude auth found`,"claude.effectiveMode.autoUnknown":`Auto: subscription — auth could not be verified`,"claude.effectiveMode.admissionKey":`This proxy's API key is still sent.`,"claude.authSource.claude-json-oauth":`Claude account`,"claude.authSource.claude-credentials-file":`credentials file`,"claude.authSource.macos-keychain":`macOS Keychain`,"claude.authSource.exported-env":`environment variable`,"claude.authSource.unknown":`a detected credential`,"claude.systemEnv":`Auto-connect`,"claude.systemEnvDesc":`When on, running claude in any terminal automatically goes through the proxy.`,"claude.systemEnvUnsupported":`Auto-connect is available on macOS only. On this system, start Claude with {cmd}.`,"claude.systemEnvWarn":`⚠ You must fully quit and relaunch your terminal app for this to take effect. Not recommended.`,"claude.fastMode":`Fast Mode (OpenAI)`,"claude.fastModeDesc":`Controls service_tier for OpenAI models. ON = priority (faster). OFF = default. Auto = passthrough (client decides).`,"claude.fastAuto":`Auto`,"claude.fastOn":`ON`,"claude.fastOff":`OFF`,"claude.autoContext":`Use big context automatically`,"claude.autoContextDesc":`Controls how far the 1M marking goes. ON: any model whose window can host the compaction threshold gets a big-context row. OFF: only true 1M models get one.`,"claude.autoContextInert":`Inactive because a legacy context-size value (maxContextTokens) exists in the config file. Remove it there to re-enable.`,"claude.autoCompactWindow":`Auto-summarize point`,"claude.autoCompactDefault":`{value} (default)`,"claude.autoCompactWindowDesc":`Older messages are summarized when the chat reaches this point. It never exceeds each model's own limit, so 200k models are unaffected.`,"claude.autoCompactWindowWarn":`Changing this can break GPT models — set higher than a model's real limit, chats will error before the summary kicks in.`,"claude.injectAgents":`Auto-register subagents`,"claude.injectAgentsDesc":`Registers the models picked on the Subagents tab (plus the current default model) as dispatchable Claude Code agents (ocx-*). Applies from the next session.`,"claude.webSearchSidecar":`Web search sidecar override`,"claude.webSearchSidecarHint":`Override the main web search sidecar for Claude Code requests.`,"claude.visionSidecar":`Vision sidecar override`,"claude.visionSidecarHint":`Override the main vision sidecar for Claude Code requests.`,"claude.useMainSetting":`Use main setting`,"claude.sidecarModelPlaceholder":`Main setting model`,"claude.quickstart":`Get started`,"claude.quickstartHint":`{cmd} opens Claude Code through the proxy. Your claude.ai login stays active.`,"claude.manualEnv":`Manual setup (advanced)`,"claude.smallFastModel":`Background helper model`,"claude.smallFastModelHint":`The model Claude Code uses for background work like chat summaries and topic detection. The haiku subagent alias uses it too. Empty = Claude default (Haiku).`,"claude.smallFastModelAccurateHint":`The model Claude Code uses for background work such as chat summaries and topic detection. The haiku subagent alias uses it too.`,"claude.smallFastModelUnsetOption":`Let Claude Code choose (native model)`,"claude.smallFastModelNativeWarning":`When unset, OpenCodex leaves the helper-model overrides unset. Claude Code may use its native Sonnet model, which may incur charges from your native provider.`,"claude.slotUnset":`Use Claude default`,"claude.modelMap":`Model interception`,"claude.modelMapHint":`Intercepts requests for a specific model and reroutes them to the one you pick. Empty by default — nothing happens until you add a rule.`,"claude.mapFrom":`Original model (e.g. claude-sonnet-4-5)`,"claude.mapTo":`Swap to (e.g. gemini/gemini-3-pro)`,"claude.addMapping":`Add rule`,"claude.removeMapping":`Remove rule`,"claude.aliases":`Available models`,"claude.aliasesHint":`Models that appear in Claude Code's /model menu.`,"claude.aliasProviderOther":`Other`,"claude.loading":`Loading…`,"claude.loadFail":`Failed to load Claude settings`,"claude.saved":`Saved.`,"claude.saveFailed":`Save failed`,"claude.networkError":`Network error — is the proxy running?`,"claude.toggleAria":`Toggle Claude connection`,"claude.none":`None`,"cws.loading":`Loading combos…`,"cws.loadFailed":`Could not load combos.`,"cws.saveFailed":`Could not save combo.`,"cws.removeFailed":`Could not remove combo.`,"cws.saved":`Combo saved.`,"cws.created":`Created {model}.`,"cws.removed":`Removed combo/{id}.`,"cws.renamed":`Renamed {from} to {to}.`,"cws.add":`Add combo`,"cws.addTitle":`Add combo`,"cws.addSubtitle":`Create a virtual model across providers and choose the exact model name clients will request.`,"cws.create":`Create combo`,"cws.railAria":`Combo list`,"cws.searchPlaceholder":`Search combos or targets…`,"cws.noSearchResults":`No combos match your search.`,"cws.group.failover":`Failover`,"cws.group.roundRobin":`Round-robin`,"cws.targetCount":`{count} targets`,"cws.targetCountOne":`1 target`,"cws.overviewTitle":`Combos`,"cws.overviewBlurb":`Virtual models that fail over across provider/model targets or use deterministic smooth weighted round-robin.`,"cws.count.total":`Total`,"cws.count.failover":`Failover`,"cws.count.roundRobin":`Round-robin`,"cws.howTitle":`How it works`,"cws.howBody":`Ask Codex for the combo's public model name. Without one, the default is combo/<id>. OpenCodex selects a target and hops only on retryable upstream failures. If no target remains available, the request fails closed instead of using the global default provider.`,"cws.attentionTitle":`Needs attention`,"cws.attention.empty":`No targets configured`,"cws.attention.few":`Only one target — failover has nowhere to hop`,"cws.attention.catalogOmitted":`Missing from the model catalog — member capabilities are incomplete or incompatible (missing context window / metadata, or empty modality intersection). Routing by alias still works`,"cws.attention.allTargetsExhausted":`All enabled targets are out of quota`,"cws.emptyTitle":`Create your first combo`,"cws.empty.createDesc":`Name a virtual model and chain two or more backends.`,"cws.backToAll":`Back to all combos`,"cws.allCombos":`All combos`,"cws.copyModel":`Copy id`,"cws.copied":`Copied`,"cws.tabsLabel":`Combo detail sections`,"cws.tab.config":`Config`,"cws.tab.about":`About`,"cws.strategy":`Strategy`,"cws.strategy.failover":`Failover`,"cws.strategy.roundRobin":`Round-robin`,"cws.strategy.failoverHint":`Try targets in order. If the first fails with a retryable error (rate limit, outage, subscription gate), hop to the next.`,"cws.strategy.roundRobinHint":`Deterministically balance traffic by weight. Keep each selected target for a batch of successful requests, then advance.`,"cws.field.id":`Combo id`,"cws.field.idHint":`Clients will request {model}`,"cws.field.idInternalHint":`Internal combo id. You can change it after creation.`,"cws.field.idHintEdit":`Renaming moves the combo to a new id. Clients request {model}.`,"cws.field.alias":`Public model name`,"cws.field.aliasPlaceholder":`deepseek-v4-flash or vendor/model`,"cws.field.aliasHint":`Optional. Use a bare name with no prefix, a custom prefix like vendor/model, or leave blank to use combo/<id>.`,"cws.field.nativeAlias":`Native OpenAI alias`,"cws.field.nativeAliasHint":`Let this combo own a supported unqualified native OpenAI model id. Account- and provider-qualified OpenAI routes stay separate.`,"cws.field.displayName":`Display name`,"cws.field.displayNameHint":`Picker label for this combo. Required when Native OpenAI alias is enabled.`,"cws.field.stickyLimit":`Sticky successes before rotate`,"cws.field.stickyLimitHint":`Retain the selected target for this many successful requests before the weighted selector advances.`,"cws.field.defaultEffort":`Default reasoning`,"cws.field.defaultEffortNone":`None (target default)`,"cws.field.defaultEffortHint":`Used only when the client omits reasoning effort. Options are the intersection of the selected targets' advertised efforts; targets without catalog effort metadata offer none.`,"cws.capability.imageInputUnavailable":`Unavailable until every selected target supports image input.`,"cws.capability.imageInputHint":`On by default when every target supports images. Turn off to accept text only.`,"cws.capability.imageInput":`Image / multimodal`,"cws.capabilities":`Capabilities`,"cws.field.defaultEffortUnsupported":`This effort is not in the targets' common ladder — it will be ignored or snapped at request time.`,"cws.field.defaultEffortUnsupportedOption":`not in intersection`,"cws.targets":`Targets`,"cws.targets.failoverHint":`Order matters — first is primary.`,"cws.targets.roundRobinHint":`Weights control deterministic relative selection; order breaks ties in the rotation ring.`,"cws.target.provider":`Provider`,"cws.target.model":`Model`,"cws.target.weight":`Weight`,"cws.target.pickProvider":`Select provider…`,"cws.target.pickProviderFirst":`Select a provider first…`,"cws.target.pickModel":`Select model…`,"cws.target.noModels":`No models for this provider`,"cws.target.modelPlaceholder":`model id`,"cws.target.add":`Add target`,"cws.target.drag":`Drag to reorder`,"cws.target.moveUp":`Move up`,"cws.target.moveDown":`Move down`,"cws.quota.available":`Available`,"cws.quota.exhausted":`Out of quota`,"cws.quota.unknown":`Quota unknown`,"cws.quota.allExhausted":`All enabled targets are out of quota. Choose another target or wait for quota recovery.`,"cws.aboutTitle":`Runtime`,"cws.aboutBody":`Failed targets cool down briefly, honoring Retry-After. Invalid or context errors do not hop. Each target adapts effort to its own capabilities; exhausted combos fail closed. Logs and Usage retain ordered physical attempts and per-attempt usage.`,"cws.removeConfirmTitle":`Remove {model}?`,"cws.removeConfirmDesc":`This removes the virtual model from config and the Codex catalog. It does not delete any providers.`,"cws.unsavedTitle":`Unsaved changes`,"cws.unsavedDesc":`Discard edits to this combo and continue?`,"cws.keepEditing":`Keep editing`,"cws.err.missingId":`Combo id is required.`,"cws.err.invalidId":`Id must start with a letter or number and use only letters, numbers, dots, underscores, or hyphens (max 64).`,"cws.err.duplicateId":`A combo with this id already exists.`,"cws.err.invalidAlias":`Alias must use letters, numbers, dots, underscores, or hyphens, with at most one "/" segment.`,"cws.err.aliasReservedNamespace":`The alias must not use the reserved "combo/" namespace.`,"cws.err.aliasNativeFamily":`Bare aliases in the OpenAI native family (gpt-*, o1-*, o3-*, o4-*, codex-*) are not allowed.`,"cws.err.unsupportedNativeAlias":`Native alias must be a currently supported bare OpenAI model id.`,"cws.err.missingNativeAliasDisplayName":`A display name is required for native aliases.`,"cws.err.invalidDisplayName":`Display name must be at most 128 characters and contain no control characters.`,"cws.err.duplicateAlias":`Another combo already uses this alias.`,"cws.err.noTargets":`Add at least one target.`,"cws.err.incompleteTarget":`Each target needs a provider and model.`,"cws.target.disabled":`{name} (disabled)`,"cws.err.reservedNamespace":`A physical provider named combo must be renamed before creating combos.`,"cws.err.providerCollision":`The combo ID conflicts with a configured provider name.`,"cws.err.unknownProvider":`Each target must use a configured provider.`,"cws.err.duplicateTarget":`The same provider/model target can appear only once.`,"cws.err.invalidStickyLimit":`Sticky successes must be an integer from 1 to 100.`,"cws.err.invalidWeight":`Each round-robin weight must be an integer from 1 to 10000.`,"cws.err.noEnabledTarget":`At least one target must use an enabled provider.`,"claude.tabsLabel":`Claude client`,"claude.tabCode":`Code`,"claude.tabDesktop":`Desktop`,"claudeDesktop.title":`Claude Desktop`,"claudeDesktop.subtitle":`Route each Claude model family through an available model on port {port}.`,"claudeDesktop.importJson":`Import JSON`,"claudeDesktop.exportJson":`Export JSON`,"claudeDesktop.loading":`Loading Claude Desktop profile…`,"claudeDesktop.loadFail":`Failed to load Claude Desktop profile.`,"claudeDesktop.retry":`Retry`,"claudeDesktop.saveFailed":`Failed to save Claude Desktop profile.`,"claudeDesktop.applyFailed":`Profile was saved, but could not be applied.`,"claudeDesktop.updateFailed":`Claude Desktop update failed.`,"claudeDesktop.savedApplied":`Profile saved and applied to Claude Desktop.`,"claudeDesktop.appliedMarkerUnsaved":`Applied to Claude Desktop, but the applied marker was not saved — the saved-vs-applied state below may read stale until you apply again.`,"claudeDesktop.savedAppliedAnnounce":`Claude Desktop profile saved and applied.`,"claudeDesktop.saved":`Profile saved.`,"claudeDesktop.savedAnnounce":`Claude Desktop profile saved.`,"claudeDesktop.exported":`Profile exported as JSON.`,"claudeDesktop.importExpected":`Expected a version 1 Claude Desktop profile.`,"claudeDesktop.importReady":`JSON imported. Review the draft, then save and apply it.`,"claudeDesktop.importedAnnounce":`Profile JSON imported. Unsaved changes are ready for review.`,"claudeDesktop.importInvalid":`The selected file is not a valid profile.`,"claudeDesktop.importFailed":`Import failed. {error}`,"claudeDesktop.moved":`{route} moved to {family}.`,"claudeDesktop.unsaved":`Unsaved changes`,"claudeDesktop.upToDate":`Profile is up to date`,"claudeDesktop.saving":`Saving…`,"claudeDesktop.applying":`Applying…`,"claudeDesktop.saveApply":`Save & apply`,"claudeDesktop.emptyTitle":`No models available`,"claudeDesktop.emptyHint":`Add or enable a provider, then return to assign Claude Desktop routes.`,"claudeDesktop.assignmentsLabel":`Claude model family assignments`,"claudeDesktop.family.opus":`Opus`,"claudeDesktop.family.fable":`Fable`,"claudeDesktop.family.sonnet":`Sonnet`,"claudeDesktop.family.haiku":`Haiku`,"claudeDesktop.modelCountOne":`{count} model`,"claudeDesktop.modelCountMany":`{count} models`,"claudeDesktop.chooseDefault":`Choose a default`,"claudeDesktop.temporaryDefault":`Temporary default`,"claudeDesktop.laneEmpty":`Drop a model here or use its Move control.`,"claudeDesktop.laneNoMatch":`No model in this family matches your search.`,"nav.grok":`Grok`,"grok.title":`Grok Build`,"grok.subtitle":`Models opencodex has registered in your Grok config.`,"grok.loading":`Loading Grok status…`,"grok.loadFail":`Could not read the Grok config.`,"grok.notConfiguredTitle":`Grok Build is not wired up`,"grok.notConfiguredHint":`Start or restart the proxy with Grok installed and opencodex writes a managed block into:`,"grok.endpoint":`Endpoint`,"grok.colModel":`Model`,"grok.colAlias":`Grok alias`,"grok.colContext":`Context`,"grok.groupNative":`Native models`,"grok.groupRouted":`Routed models`,"grok.enabledCount":`{on} of {total} registered`,"grok.saved":`Selection saved.`,"grok.savedApplied":`Selection saved and written to your Grok config.`,"grok.saveFailed":`Could not save the Grok selection.`,"grok.applyFailed":`Selection saved, but the Grok config could not be updated.`,"grok.applySkipped":`Selection saved. The Grok config was not changed.`,"grok.saveApply":`Save & apply`,"grok.saving":`Saving…`,"grok.applying":`Applying…`,"grok.unsaved":`Unsaved changes`,"grok.upToDate":`Selection is up to date`,"grok.toggleModel":`Register {id} with Grok`,"claudeDesktop.available":`Available`,"claudeDesktop.defaultBadge":`Default`,"claudeDesktop.supports1m":`1M`,"claudeDesktop.unavailable":`Unavailable`,"claudeDesktop.contextM":`{n}M context`,"claudeDesktop.contextK":`{n}k context`,"claudeDesktop.contextUnknown":`context unknown`,"claudeDesktop.alias":`Alias`,"claudeDesktop.useAsDefault":`Use as {family} default`,"claudeDesktop.moveTo":`Move to`,"claudeDesktop.move":`Move`,"claudeDesktop.status.applied":`Applied to Desktop`,"claudeDesktop.status.stale":`Config stale — re-apply`,"claudeDesktop.status.notApplied":`Not applied`,"claudeDesktop.status.notActiveProfile":`Desktop is serving another profile — re-apply`,"claudeDesktop.status.disabled":`Claude Desktop integration is off. Fully quit and reopen Desktop after enabling it.`,"claudeDesktop.enableApply":`Enable and apply`,"claudeDesktop.health.lastRequest":`Last request`,"claudeDesktop.health.stats":`{count} req / {errors} err`,"claudeDesktop.effort.supported":`effort`,"claudeDesktop.effort.displayOnly":`effort (display only)`,"lab.title":`Compatibility Lab`,"lab.subtitle":`Read-only compatibility verdict matrix from lab projection evidence.`,"lab.loadFailed":`Could not load compatibility lab data`,"lab.projectionUnavailable":`Lab projection is not available. Run conformance or live probes first.`,"lab.projectionIncompatible":`Lab projection schema is incompatible. Rebuild the projection.`,"lab.statusTitle":`Projection status`,"lab.matrixTitle":`Compatibility matrix`,"lab.verdictsTitle":`Verdict records`,"lab.filter.layer":`Evidence layer`,"lab.filter.verdict":`Verdict`,"lab.filter.subject":`Subject ID`,"lab.filter.all":`All`,"lab.col.subject":`Subject`,"lab.col.layer":`Layer`,"lab.col.suite":`Suite`,"lab.col.verdict":`Verdict`,"lab.col.asOf":`As of`,"lab.col.protocol":`Protocol conformance`,"lab.col.live":`Live route compatibility`,"lab.col.task":`Task effectiveness`,"lab.empty":`No compatibility verdicts in the projection yet.`,"lab.subjectKind":`Kind`,"lab.observationCount":`Observations`,"lab.eventCount":`Events`,"lab.verdictCount":`Verdicts`,"lab.subjectCount":`Subjects`,"lab.builtAt":`Built`,"lab.loading":`Loading compatibility evidence…`,"lab.loadMore":`Load more`,"lab.detailTitle":`Verdict detail`,"lab.detailClose":`Close`,"lab.detailSubject":`Subject`,"lab.detailObservations":`Observations`,"lab.detailEvents":`Contributing events`,"lab.detailArtifacts":`Artifact metadata`,"lab.production.title":`Observed production traffic`,"lab.production.notVerification":`Not Lab verification`,"lab.production.attempts":`Attempts`,"lab.production.successes":`Successes`,"lab.production.routeErrors":`Route errors`,"lab.production.lastObserved":`Last observed`,"lab.detailLoadFailed":`Could not load verdict detail`,"lab.refresh":`Refresh`,"lab.verdict.UNKNOWN":`Unknown`,"lab.verdict.CLAIMED":`Claimed`,"lab.verdict.PROBED":`Probed`,"lab.verdict.VERIFIED":`Verified`,"lab.verdict.DEGRADED":`Degraded`,"lab.verdict.BLOCKED":`Blocked`,"lab.verdict.UNSUPPORTED":`Unsupported`,"lab.layer.protocol_conformance":`Protocol conformance`,"lab.layer.live_route_compatibility":`Live route compatibility`,"lab.layer.task_effectiveness":`Task effectiveness`,"models.newPolicyGlobal":`New models start disabled`,"models.newPolicyProvider":`New model policy`,"models.newPolicy_inherit":`Inherit`,"models.newPolicy_off":`Off`,"models.newPolicy_on":`On`,"models.newBadge":`NEW`,"models.newCount":`{count} new, off`,"models.aliases":`Aliases`,"models.aliasesTable":`Alias table`,"models.aliasPrompt":`Provider alias (leave empty to clear)`,"models.modelAliasPrompt":`Model alias (leave empty to clear)`,"models.aliasSaved":`Alias saved`,"models.aliasConflict":`That alias conflicts with an existing name`,"models.editProviderAlias":`Edit provider alias`,"models.editModelAlias":`Edit model alias`,"models.useDefaultAliases":`Use default aliases`,"models.useDefaultAliasesGlobal":`Use default aliases globally`,"models.aliasAuto":`auto`,"models.aliasUser":`user`,"models.aliasStale":`stale`},h={"nav.dashboard":`Übersicht`,"uptime.day":`T`,"uptime.hour":`Std`,"uptime.minute":`Min`,"uptime.second":`Sek`,"nav.startup":`Startsicherheit`,"nav.providers":`Anbieter`,"nav.models":`Modelle`,"nav.combos":`Combos`,"nav.subagents":`Sub-Agenten`,"routing.title":`Routing-Intelligenz (beta)`,"routing.subtitle":`Policy-Profile, Trockenlauf-Bewertung und routinggestützte Analysen.`,"routing.loadFailed":`Routing-Daten konnten nicht geladen werden`,"routing.empty":"Keine Routing-Profile konfiguriert. Fügen Sie `routingProfiles` zur config.json hinzu.","routing.revision":`rev`,"routing.detail":`Profil`,"routing.createProfile":`Profil erstellen`,"routing.dryRunError":`Trockenlauf fehlgeschlagen (HTTP {status})`,"routing.removeConfirm":`Profil {id} entfernen?`,"routing.unknownEvidence.allow":`zulassen`,"routing.unknownEvidence.penalize":`bestrafen`,"routing.unknownEvidence.exclude":`ausschließen`,"routing.removeCandidate":`Kandidat {provider}/{model} entfernen`,"routing.candidates":`Kandidaten`,"routing.require":`Harte Anforderungen`,"routing.optimize":`Optimierungsgewichte`,"routing.limits":`Grenzen`,"routing.unknownEvidence":`Richtlinie für unbekannte Evidenz`,"routing.compatibility.title":`Kompatibilitätsrichtlinie`,"routing.compatibility.enabled":`Compatibility-Lab-Evidenz erforderlich`,"routing.compatibility.requiredSuites":`Erforderliche Suites`,"routing.compatibility.loadingCatalog":`Lab-Katalog wird geladen…`,"routing.compatibility.catalogUnavailable":`Lab-Katalog nicht verfügbar — Suite-IDs in config.json manuell eintragen.`,"routing.compatibility.layer.protocol_conformance":`Protokollkonformität`,"routing.compatibility.layer.live_route_compatibility":`Live-Route-Kompatibilität`,"routing.compatibility.minStatus":`Mindest-Kompatibilitätsstatus`,"routing.none":`keine`,"routing.unavailable":`–`,"routing.dryRun":`Trockenlauf-Bewertung`,"routing.dryRunContext":`Kontextfenster der Anfrage (Tokens)`,"routing.dryRunTools":`Anfrage benötigt Tools`,"routing.dryRunImage":`Anfrage benötigt Bild-Eingabe`,"routing.dryRunStructured":`Anfrage benötigt strukturierte Ausgabe`,"routing.dryRunRun":`Kandidaten bewerten`,"routing.candidate":`Kandidat`,"routing.eligible":`Geeignet`,"routing.exclusions":`Ausschlüsse`,"routing.costCap":`Kostenobergrenze`,"routing.capOutcome.satisfied":`innerhalb des Limits`,"routing.capOutcome.exceeded":`über dem Limit`,"routing.capOutcome.unknown-allowed":`unbekannt (erlaubt)`,"routing.capOutcome.unknown-excluded":`unbekannt (ausgeschlossen)`,"routing.exclusion.capability-unsatisfied":`Anforderung nicht erfüllt`,"routing.exclusion.unknown-capability":`unbekannte Fähigkeit`,"routing.exclusion.cost-limit":`Kostenobergrenze überschritten`,"routing.exclusion.cost-limit-unknown":`Kosten unbekannt — Obergrenze nicht prüfbar`,"routing.exclusion.cooldown":`Abklingzeit`,"routing.exclusion.unknown-health":`unbekannter Zustand`,"routing.exclusion.unknown-quota":`unbekanntes Kontingent`,"routing.exclusion.unknown-price":`unbekannter Preis`,"routing.exclusion.other":`Ausschluss: {code}`,"routing.score":`Punktzahl`,"routing.selected":`ausgewählt`,"routing.yes":`ja`,"routing.no":`nein`,"routing.analytics":`Routing-Analysen`,"routing.analyticsTotal":`Anfragen`,"routing.analyticsSuccessRate":`Erfolg`,"routing.analyticsFallbackRate":`Fallback`,"routing.analyticsP50":`p50`,"routing.analyticsP95":`p95`,"routing.analyticsP99":`p99`,"routing.analyticsCooldown":`Cooldown-Fehler`,"routing.analyticsConfidence":`Konfidenz`,"routing.analyticsTruncated":`abgeschnittener Verlauf`,"routing.analyticsRequests":`Anfragen`,"routing.analyticsEmpty":`Noch keine Analysen – senden Sie zuerst einige Anfragen.`,"nav.logs":`Protokolle & Diagnose`,"nav.usage":`Nutzung`,"common.github":`GitHub`,"sidebar.star":`Auf GitHub mit Stern markieren`,"sidebar.starred":`Auf GitHub markiert`,"sidebar.starUnauthenticated":`GitHub öffnen, um zu markieren (gh CLI nicht angemeldet)`,"sidebar.starFailed":`Markieren über gh fehlgeschlagen. GitHub wird stattdessen geöffnet.`,"sidebar.updateAvailable":`Update verfügbar: {version}`,"sidebar.checkUpdate":`Nach Updates suchen`,"common.save":`Speichern`,"common.saving":`Speichern…`,"common.cancel":`Abbrechen`,"common.discard":`Verwerfen`,"common.delete":`Löschen`,"common.remove":`Entfernen`,"common.loading":`Lädt…`,"common.retry":`Wiederholen`,"auth.adminTokenTitle":`OpenCodex-Admin-Token (OPENCODEX_ADMIN_AUTH_TOKEN)`,"auth.adminAccountLabel":`Konto`,"auth.adminTokenFieldLabel":`Admin-Token`,"auth.adminTokenRejected":`Der Admin-Token wurde abgelehnt. Prüfen Sie ihn und versuchen Sie es erneut.`,"auth.adminTokenUnavailable":`Der Admin-Token konnte nicht überprüft werden. Versuchen Sie es erneut.`,"theme.label":`Design`,"theme.light":`Hell`,"theme.dark":`Dunkel`,"theme.system":`System`,"lang.label":`Sprache`,"lang.nativeName":`Deutsch`,"provider.name.commandCodeAuth":`Command Code - Auth`,"provider.name.commandCodeApi":`Command Code - API`,"provider.name.volcengine":`Volcengine Ark`,"provider.name.volcengineCodingPlan":`Volcengine Ark Coding-Tarif`,"provider.name.volcengineAgentPlan":`Volcengine Ark Agent-Tarif`,"errorBoundary.title":`Seite konnte nicht geladen werden`,"errorBoundary.message":`In diesem Bereich ist ein Darstellungsfehler aufgetreten. Lade ihn neu, um es noch einmal zu versuchen.`,"errorBoundary.details":`Fehler`,"errorBoundary.reload":`Neu laden`,"startup.title":`Startsicherheit`,"startup.subtitle":`Prüft, ob Codex opencodex nach einem Neustart erreicht, bevor lokales Proxy-Routing in einer Wiederverbindungsschleife endet.`,"startup.refresh":`Aktualisieren`,"startup.backToDashboard":`Zurück zum Dashboard`,"startup.loading":`Startschutz wird geprüft…`,"startup.error":`Startschutz konnte nicht gelesen werden.`,"startup.staleData":`Die aktuelle Prüfung ist fehlgeschlagen. Die Werte unten sind veraltet und kein Nachweis für Schutz.`,"startup.status.native":`Natives Routing`,"startup.status.protected":`Neustartgeschützt`,"startup.status.atRisk":`Aktion erforderlich`,"startup.summary.native":`Codex ist nicht vom lokalen Proxy abhängig`,"startup.summary.protected":`opencodex ist nach einem Neustart verfügbar`,"startup.summary.atRisk":`Codex kann nach einem Neustart den Modellzugriff verlieren`,"startup.riskDetail":`Codex ist auf den lokalen Proxy festgelegt, aber weder ein dauerhafter Dienst noch ein intakter Launcher-Shim startet ihn erneut.`,"startup.riskDetailCustomLocal":`Codex verwendet ein benutzerdefiniertes lokales Gateway. opencodex kann dessen Neustart-Lebenszyklus weder verwalten noch prüfen.`,"startup.riskDetailWindowsShim":`Der Launcher-Shim schützt unterstützte CLI-Skripte, aber Codex Desktop und direkte codex.exe-Aufrufe können ihn unter Windows umgehen.`,"startup.safeDetail":`Routing und Startmechanismus stimmen überein. Nach einem Neustart sollte kein manuelles ocx start nötig sein.`,"startup.routing":`Codex-Routing`,"startup.routing.proxy":`Lokaler Proxy`,"startup.routing.native":`Natives OpenAI`,"startup.routing.customLocal":`Benutzerdefiniertes lokales Gateway`,"startup.routing.customRemote":`Benutzerdefiniertes Remote-Gateway`,"startup.routing.unknown":`Unbekanntes oder ungültiges Routing`,"startup.restartProtection":`Neustartschutz`,"startup.preference":`Start bei Bedarf`,"startup.enabled":`Aktiviert`,"startup.disabled":`Deaktiviert`,"startup.protection.service":`Hintergrunddienst`,"startup.protection.shim":`Launcher-Shim`,"startup.protection.none":`Nicht installiert`,"startup.details":`Schutzdetails`,"startup.service":`Hintergrunddienst`,"startup.serviceHint":`Startet bei der Anmeldung und startet den Proxy nach einem Absturz neu.`,"startup.installed":`Installiert`,"startup.notInstalled":`Nicht installiert`,"startup.unsupported":`Nicht unterstützt`,"startup.shim":`Codex-Launcher-Shim`,"startup.shimHint":`Führt ocx ensure aus, wenn ein unterstützter Codex-Skript-Launcher startet.`,"startup.healthy":`Intakt`,"startup.cliOnly":`Nur CLI`,"startup.stale":`Veraltet`,"startup.viable":`Einsatzbereit`,"startup.unhealthy":`Installiert, aber fehlerhaft`,"startup.conflict":`Dienstkonflikt`,"startup.installedDisabled":`Installiert, aber deaktiviert`,"startup.install":`Installieren`,"startup.installing":`Wird installiert…`,"startup.repair":`Reparieren`,"startup.repairing":`Wird repariert…`,"startup.serviceInstalled":`Hintergrunddienst wurde erfolgreich installiert.`,"startup.serviceRepaired":`Hintergrunddienst wurde erfolgreich repariert.`,"startup.shimInstalled":`Codex-Launcher-Shim wurde erfolgreich installiert.`,"startup.shimRepaired":`Codex-Launcher-Shim wurde erfolgreich repariert.`,"startup.installFailed":`Installation fehlgeschlagen:`,"startup.tray.title":`Windows-Infobereich`,"startup.tray.hint":`Installiert ein Anmeldesymbol für Proxy-Start, Stopp, Neustart, Dashboard und Status per Klick.`,"startup.tray.login":`Infobereich bei Windows-Anmeldung starten`,"startup.tray.notProtection":`Das Symbol ist nur eine Steuerung, kein Neustartschutz. Für unbeaufsichtigte Wiederherstellung bleibt ein funktionsfähiger Hintergrunddienst nötig.`,"startup.tray.running":`Wird ausgeführt`,"startup.tray.stopped":`Installiert, ausgeblendet`,"startup.tray.stale":`Reparatur erforderlich`,"startup.tray.notInstalled":`Nicht installiert`,"startup.tray.loading":`Wird geprüft…`,"startup.tray.unavailable":`Status nicht verfügbar`,"startup.tray.install":`Installieren und anzeigen`,"startup.tray.start":`Symbol anzeigen`,"startup.tray.stop":`Symbol beenden`,"startup.tray.uninstall":`Anmeldesymbol entfernen`,"startup.tray.error":`Die Windows-Infobereichsaktion ist fehlgeschlagen. Details: ocx tray status.`,"startup.recovery":`Reparaturoptionen`,"startup.recoveryHint":`Nutze die Ein-Klick-Installation oben oder kopiere einen Befehl für die manuelle Reparatur. Für Codex Desktop und Windows-Programme wird der Hintergrunddienst empfohlen.`,"startup.command.service":`Empfohlen: dauerhafter Hintergrunddienst`,"startup.command.shim":`Alternative: CLI-Launcher-Shim`,"startup.command.native":`Ausfallsicher: natives Codex-Routing wiederherstellen`,"startup.copy":`Kopieren`,"startup.copied":`Kopiert`,"startup.recommended":`Empfohlene Reparatur: {cmd}`,"startup.navRisk":`Der Startschutz erfordert Aufmerksamkeit`,"startup.codexRuntime.clampHidden":`Einige Reasoning-Effort-Optionen wurden ausgeblendet, weil OpenCodex Codex {version} verwendet hat.`,"startup.codexRuntime.clampHiddenWithEfforts":`Einige Reasoning-Effort-Optionen wurden ausgeblendet, weil OpenCodex Codex {version} verwendet hat (entfernt: {efforts}).`,"startup.codexRuntime.olderBinary":`OpenCodex verwendet eine ältere Codex-Binary ({version}). Eine neuere Installation ist verfügbar.`,"dash.subtitle":`Live-Status des lokalen opencodex-Proxys, seiner Anbieter und der in Codex gerouteten Modelle.`,"dash.workspace.overview":`Übersicht`,"dash.workspace.sections":`Abschnitte`,"dash.status":`Status`,"dash.online":`Online`,"dash.offline":`Offline`,"dash.version":`Version`,"dash.uptime":`Laufzeit`,"dash.providers":`Anbieter`,"dash.tokens30d":`Tokens (30d)`,"dash.activity.title":`Aktivität der letzten 30 Tage`,"dash.activity.requests":`Anfragen`,"dash.activity.tokens":`Token`,"dash.activity.chartLabel":`Aktivität der letzten 30 Tage. Mit Links und Rechts einen Tag auswählen; Pos1 und Ende springen zu den Bereichsgrenzen.`,"dash.activity.viewUsage":`Nutzung anzeigen`,"dash.coverage":`{pct} Abdeckung`,"dash.mem.title":`Speicherbeobachtung`,"dash.mem.hint":`Schreibgeschützte Laufzeitdiagnose. Beobachteter Speicher ist max(RSS, external, ArrayBuffers), damit Windows-Working-Set-Trimming gebundenen Speicher nicht versteckt.`,"dash.mem.rss":`Resident Set (RSS)`,"dash.mem.jsHeap":`JS-Heap belegt`,"dash.mem.jsHeapArena":`Arena {total}`,"dash.mem.pressure":`Gegen Warnschwelle`,"dash.mem.pressureOf":`{pct}% der Schwelle`,"dash.mem.pressureUnknown":`Keine Schwelle gemeldet`,"dash.mem.jscHeap":`JSC-Heap`,"dash.mem.external":`External`,"dash.mem.arrayBuffers":`ArrayBuffers`,"dash.mem.observed":`Beobachtet`,"dash.mem.runtime":`Laufzeit-Zähler`,"dash.mem.growth":`Beobachtete Drift / Stunde`,"dash.mem.perHour":`/Std`,"dash.mem.store":`Fortsetzungsspeicher`,"dash.mem.storeHint":`Proxy-Cache für previous_response_id. Steigende Gesamtbytes bei steigendem Heap deuten auf Konversationsspeicherung hin, nicht auf den Laufzeit-Allokator.`,"dash.mem.storeEntries":`Einträge`,"dash.mem.storeTotal":`Gesamt`,"dash.mem.storeLargest":`Größter`,"dash.mem.storeOldest":`Ältester`,"dash.mem.threshold":`Warnschwelle`,"dash.mem.lastWarn":`Letzte Warnung`,"dash.mem.never":`Nie`,"dash.mem.details":`Details`,"dash.mem.unavailable":`Speicherdiagnose nicht verfügbar (älterer Proxy).`,"dash.mem.inFlight":`Laufende Anfragen`,"dash.mem.restart":`Abwarten & neu starten`,"dash.mem.restartConfirm":`Auf {count} laufende Anfrage(n) warten, dann neu starten (bis zu {seconds}s; Rest wird bei Timeout abgebrochen).`,"dash.mem.draining":`{count} Anfrage(n) werden abgewartet… Neustart danach`,"dash.mem.reconnecting":`Proxy wird neu gestartet… warte auf Verbindung`,"dash.connectionReconnecting":`Verbindung unterbrochen — erneuter Verbindungsaufbau…`,"dash.mem.restartFailed":`Abwarten & Neustart fehlgeschlagen. Prüfen Sie, ob der Proxy läuft.`,"dash.mem.restartNoSupervisor":`Kein Neustartschutz erkannt. Der Proxy bleibt nach dem Neustart möglicherweise aus, bis Sie ihn erneut starten.`,"dash.activeProviders":`Aktive Anbieter`,"dash.noProviders":`Keine Anbieter konfiguriert. Führe {cmd} aus.`,"dash.col.name":`Name`,"dash.col.adapter":`Adapter`,"dash.col.baseUrl":`Basis-URL`,"dash.col.model":`Modell`,"dash.modelsNoResults":`Keine Modelle entsprechen deiner Suche.`,"dash.availableModels":`Verfügbare Modelle`,"dash.noModels":`Keine Modelle gefunden. Prüfe die API-Schlüssel des Anbieters.`,"dash.cannotConnect":`Keine Verbindung zum Proxy. Läuft er?`,"dash.runStart":`Führe {cmd} aus, um den Proxy zu starten.`,"dash.stop":`Proxy stoppen`,"dash.stopConfirm":`Proxy stoppen und natives Codex wiederherstellen?`,"dash.stopFailed":`Proxy konnte nicht gestoppt werden (HTTP {status}).`,"dash.maSwitchFailed":`Moduswechsel fehlgeschlagen (HTTP {status}).`,"dash.maNetworkError":`Netzwerkfehler — läuft der Proxy?`,"dash.stopping":`Wird gestoppt…`,"dash.actions":`Proxy`,"dash.codexRestart":`Codex-Modelle neu laden`,"dash.codexRestarting":`Wird gestoppt…`,"dash.codexRestartConfirm":`Codex-App-Server stoppen, damit sie die Modellliste neu laden? Ein laufender Codex-Vorgang wird unterbrochen, und Codex startet nicht von selbst neu — öffne es danach erneut.`,"dash.codexRestartDone":`{count} Codex-App-Server gestoppt. Öffne Codex erneut, um die aktuelle Modellliste zu laden.`,"dash.codexRestartNothing":`Es läuft kein Codex-App-Server. Der nächste Start liest die aktuelle Modellliste.`,"dash.codexRestartUnknown":`Prozesse konnten nicht aufgelistet werden, daher wurde nichts gestoppt.`,"dash.codexRestartPartial":`{count} App-Server wurden nicht beendet. Beende sie manuell, falls die Modellliste veraltet bleibt.`,"dash.codexRestartFailed":`Codex-Modelle konnten nicht neu geladen werden (HTTP {status}).`,"dash.codexRestartUnreachable":`Der Proxy war nicht erreichbar.`,"dash.codexRestartMalformed":`Der Proxy hat eine unerwartete Antwort gesendet.`,"dash.codexRestartTimeout":`Der Proxy hat nicht rechtzeitig geantwortet. Möglicherweise stoppt er noch App-Server.`,"models.staleBanner":`Codex zeigt eine ältere Modellliste als dieser Katalog. Starte Codex neu, um sie neu zu laden.`,"dash.codexAutoStart":`opencodex mit Codex starten`,"dash.codexAutoStartHint":`Erlaubt einem installierten Launcher-Shim, ocx ensure auszuführen. Diese Einstellung installiert keinen Neustartschutz; prüfe den effektiven Zustand unter Startsicherheit.`,"dash.searchModel":`Such-Sidecar-Modell`,"dash.searchModelHint":`Modell für web_search bei nicht über OpenAI gerouteten Modellen. Erfordert ChatGPT-Login.`,"dash.searchReasoning":`Such-Reasoning-Aufwand`,"dash.visionModel":`Vision-Sidecar-Modell`,"dash.visionModelHint":`Modell zur Beschreibung von Bildern für nur-Text-Routen. Erfordert ChatGPT-Login.`,"dash.webSearchSidecar":`Websuche-Sidecar`,"dash.webSearchSidecarHint":`Backend und Modell für die Websuche gerouteter Modelle auswählen.`,"dash.webSearchStream":`Antworten live streamen`,"dash.webSearchStreamHint":`Führenden Text und Reasoning live streamen, bis das Modell über einen Tool-Aufruf entscheidet; der Rest bleibt für das Abfangen der Suche gepuffert. Text vor einer Suche kann sich teilweise wiederholen.`,"dash.visionSidecar":`Vision-Sidecar`,"dash.visionSidecarHint":`Backend und Modell zur Bildbeschreibung für reine Textmodelle auswählen.`,"dash.visionOff":`Aus`,"dash.shadowCallIntercept":`Shadow-Call-Abfangen`,"dash.shadowCallInterceptHint":`Fängt die Hintergrund-Hilfsaufrufe der Codex-App ({models}) ab und leitet sie an das gewählte Modell um. Effort wird auf low fixiert.`,"dash.shadowCallWarning":`⚠ Bei Aktivierung werden ALLE Anfragen an {models} durch das gewählte Modell ersetzt.`,"dash.shadowCallOriginal":`Original`,"dash.shadowCallModel":`Ersatzmodell`,"dash.shadowCallTooltip":`Die Codex-App ruft im Hintergrund ein Hilfsmodell für Titelgenerierung, Commit-Nachrichten und Skill-Orchestrierung auf. Das Modell wechselt zwischen Client-Versionen, daher fängt opencodex diesen Satz ab: {models}.`,"models.shadowCallIntercept":`Shadow-Call-Abfangen`,"models.shadowCallInterceptHint":`Fängt die Hintergrund-Hilfsaufrufe der Codex-App ({models}) ab und leitet sie an das gewählte Modell um.`,"dash.sidecarBackend":`Backend`,"dash.sidecarModel":`Modell`,"dash.backendAuto":`Automatisch`,"dash.backendOpenAI":`OpenAI`,"dash.backendAnthropic":`Anthropic`,"dash.sidecarSaved":`Sidecar-Einstellungen gespeichert. Angewendet bei der nächsten Anfrage.`,"dash.sidecarSaveFailed":`Sidecar-Einstellungen konnten nicht gespeichert werden.`,"dash.injectionLabel":`Sub-Agent-Delegation`,"dash.injectionHint":`Wähle das Modell, an das Codex Sub-Agent-Arbeit übergibt. Wo diese Wahl gilt, entscheiden die beiden Schalter unten.`,"dash.syncCodexSubagentDefaults":`Auch als Codex-Standard speichern`,"dash.syncCodexSubagentDefaultsHint":`Eingeschaltet wird die Wahl von oben in Codex' eigene Konfiguration geschrieben, sodass auch neue Aufgaben mit diesem Modell starten. Ausgeschaltet wird sie nur hier gemerkt. Wirksam beim nächsten Sync oder Neustart; deine selbst geschriebenen [agents]-Einstellungen bleiben unberührt.`,"dash.multiAgentGuidance":`Codex sagen, wie Arbeit aufgeteilt wird`,"dash.multiAgentGuidanceHint":`Schickt Codex eine kurze Notiz, wie Arbeit an Sub-Agenten übergeben werden soll. Auf v2 nennt sie die verfügbaren Modelle und das bevorzugte; auf v1 wirkt sie nur bei Reasoning-Effort max oder ultra. Ausgeschaltet wird keine Notiz angehängt.`,"dash.injectionNone":`Keine`,"dash.injectionEffortLabel":`Reasoning-Aufwand`,"dash.injectionEffortNone":`Modell-Standard`,"dash.effortCapLabel":`V2 Ultra Effort-Limit`,"dash.subagentEffortCapLabel":`V2 Sub-Agent Effort-Limit`,"dash.effortCapHelp":`Begrenzt die Reasoning-Intensität für V2-Ultra-Modus-Turns. Wenn gesetzt, werden eingehende Max-Anfragen (aus dem Ultra-Modus) auf das gewählte Niveau begrenzt. Das Sub-Agent-Limit gilt nur für erzeugte Kind-Agenten. Limits senken die Intensität nur, sie erhöhen sie nie. Wenn ein Modell das gewählte Niveau nicht unterstützt, wird automatisch auf das nächste unterstützte Niveau herabgesetzt.`,"dash.effortCapNone":`Kein Limit`,"dash.maintenance":`Wartung`,"dash.maintenanceHint":`Aktualisiere Codex’ Modellkatalog oder installiere eine neuere opencodex-Version.`,"dash.syncModels":`Modelle synchronisieren`,"dash.syncing":`Synchronisiere…`,"dash.syncOk":`Synchronisierung abgeschlossen. {count} Modell(e) angehängt.`,"dash.syncStaleHint":`Falls Codex weiterhin eine alte Liste zeigt, starte den langlebigen App-Server neu ({cmd}).`,"dash.syncFailed":`Synchronisierung fehlgeschlagen: {error}`,"dash.projectConfigTitle":`Projekt-Codex-Konfig umgeht OpenCodex`,"dash.projectConfigHint":`Diese repo-lokalen Einstellungen überschreiben den OpenCodex-Proxy (z. B. direkt zu OpenCode Go routen). Entferne sie, damit die Routing aus ~/.codex/config.toml in diesem Projekt greift.`,"dash.checkUpdate":`Update prüfen`,"dash.updateTitle":`opencodex aktualisieren`,"dash.updateDesc":`Prüfe npm auf den ausgewählten Kanal und wähle dann, ob der Proxy nach der Installation neu gestartet wird.`,"dash.updateChannel":`Kanal`,"dash.updateChecking":`Updates werden geprüft…`,"dash.updateInstalled":`Installiert`,"dash.updateLatest":`Neueste`,"dash.updateAvailable":`Update verfügbar`,"dash.updateCurrent":`Auf dem neuesten Stand`,"dash.updateCommand":`Befehl`,"dash.updateSource":`Dies ist ein Source-Checkout. Aktualisiere es im Terminal mit dem angezeigten Befehl.`,"dash.updateUnavailable":`Die neueste Version konnte nicht von npm gelesen werden. Versuche es später erneut.`,"dash.updateRetry":`Wiederholen`,"dash.updateRecheck":`Erneut prüfen`,"dash.updateCannotAuto":`Ein-Klick-Update ist nicht verfügbar ({reason}).`,"dash.updateReason.source_checkout":`Quellcode-Checkout`,"dash.updateReason.latest_unavailable":`npm-Registry nicht erreichbar`,"dash.updateReason.already_latest":`bereits auf dem neuesten Stand`,"dash.updateReason.unknown":`Update nicht verfügbar`,"dash.updateRestart":`Nach Update neu starten`,"dash.updateRestartHint":`Empfohlen. Die aktuelle GUI läuft weiter mit altem Code, bis der Proxy neu startet.`,"dash.runUpdate":`Aktualisieren`,"dash.updateReconnecting":`Warten auf den neu gestarteten Proxy…`,"dash.updateStatus.running":`opencodex wird aktualisiert.`,"dash.updateStatus.restarting":`Update installiert. Proxy wird neu gestartet.`,"dash.updateStatus.succeeded":`Update abgeschlossen.`,"dash.updateVersionTransition":`{currentVersion} -> {latestVersion}.`,"dash.updateStatus.failed":`Update fehlgeschlagen.`,"prov.subtitle":`Konfiguriere die Upstream-Anbieter, die opencodex in Codex routet. Melde dich mit einem Konto an, füge einen Anbieter hinzu oder bearbeite die Rohkonfiguration.`,"prov.add":`Anbieter hinzufügen`,"prov.editJson":`JSON bearbeiten`,"prov.accountLogin":`Konto-Login`,"prov.noOauth":`Keine OAuth-Anbieter verfügbar.`,"prov.loggedIn":`angemeldet`,"prov.notLoggedIn":`nicht angemeldet`,"prov.logout":`Abmelden`,"prov.login":`Anmelden`,"prov.loginWith":`Anmelden mit {provider}`,"prov.waitingBrowser":`Warten auf Browser…`,"prov.didntOpen":`Hat sich nicht geöffnet? Hier klicken`,"prov.copyLink":`Link kopieren`,"prov.dontOpenBrowser":`Keinen Browser auf dem Proxy-Rechner öffnen`,"prov.dontOpenBrowserHint":`Nützlich für ein anderes Browser-Profil oder wenn das Dashboard nicht auf dem Proxy-Rechner läuft.`,"prov.linkCopied":`Kopiert`,"prov.linkCopyUnavailable":`Zwischenablage nicht verfügbar`,"prov.deviceCode":`Gerätecode`,"prov.copyCode":`Code kopieren`,"prov.codeCopied":`Code kopiert`,"prov.editAlias":`Alias bearbeiten`,"prov.aliasPrompt":`Anzeigename (leer lassen zum Entfernen)`,"prov.aliasSaved":`Alias gespeichert`,"prov.aliasSaveFailed":`Alias konnte nicht gespeichert werden`,"prov.cooldownCleared":`Abklingzeit gelöscht`,"prov.cooldownClearFailed":`Abklingzeit konnte nicht gelöscht werden`,"prov.accountId":`ID`,"prov.pasteRedirect":`Redirect-URL oder Code einfügen`,"prov.pasteRedirectHint":`Zeigt der Browser einen localhost-Fehler, kopiere die vollständige URL aus der Adressleiste und füge sie hier ein (oder den Autorisierungscode).`,"prov.pasteSubmit":`Senden`,"prov.pasteSubmitting":`Wird gesendet…`,"prov.pasteOk":`Code gesendet — Anmeldung wird abgeschlossen…`,"prov.pasteFail":`Code konnte nicht gesendet werden: {error}`,"prov.port":`Port`,"prov.default":`Standard`,"prov.loadingConfig":`Lädt…`,"prov.saved":`Gespeichert! Proxy neu starten, um anzuwenden.`,"prov.loadConfigFail":`Konfiguration konnte nicht geladen werden`,"prov.invalidJson":`Ungültiges JSON`,"prov.saveFailed":`Speichern fehlgeschlagen`,"prov.loginFailStart":`{provider}-Login konnte nicht gestartet werden`,"prov.loginError":`{provider}-Login-Fehler: {error}`,"prov.loginRequestFail":`{provider}-Login-Anfrage fehlgeschlagen`,"prov.loginCancelled":`{provider}-Login abgebrochen`,"prov.loginTimeout":`{provider}-Login abgelaufen — Browser geschlossen oder nicht beendet. Erneut versuchen.`,"prov.loginOk":`Bei {provider} angemeldet. Führe {cmd} aus (oder es gilt live), um seine Modelle aufzulisten.`,"prov.loginSameAccount":`Immer noch dasselbe {provider}-Konto — wechsle im Browser das Konto und versuche „Konto hinzufügen“ erneut.`,"oauthTos.highTitle":`{provider}: Risiko bei Abo-OAuth`,"oauthTos.elevatedTitle":`{provider}: inoffizielle OAuth-Brücke`,"oauthTos.anthropicBody":`Die direkte Wiederverwendung von Claude-Abo-OAuth-Tokens über einen Drittanbieter-Proxy wie OpenCodex ist keine von Anthropic unterstützte Integration und kann zu Zugriffsbeschränkungen führen. Unterstützte Agent-SDK-Integrationen, die Claude-Abos verwenden, sind davon getrennt.`,"oauthTos.highBody":`OpenCodex verbindet {provider} über einen OAuth-Pfad eines Drittanbieters. Bei nicht unterstützter Nutzung kann der Zugriff eingeschränkt oder gesperrt werden.`,"oauthTos.elevatedBody":`OpenCodex verbindet {provider} über einen inoffiziellen OAuth-Pfad. Nutze nach Möglichkeit den offiziellen Client; ungewöhnlicher oder automatisierter Traffic kann als Missbrauch gewertet und der Zugriff eingeschränkt oder gesperrt werden.`,"oauthTos.saferPath":`Sicherere Option: Hinterlege stattdessen einen API-Schlüssel in OpenCodex.`,"oauthTos.acknowledge":`Ich verstehe das Risiko und möchte trotzdem mit OAuth fortfahren.`,"oauthTos.continue":`Mit OAuth fortfahren`,"prov.logoutOk":`Von {provider} abgemeldet.`,"prov.logoutFail":`Abmeldung von {provider} fehlgeschlagen. Der Kontostatus bleibt unverändert.`,"prov.removed":`"{name}" entfernt.`,"prov.removedDefault":`"{name}" entfernt. Standardanbieter ist jetzt "{defaultProvider}".`,"prov.removeFail":`"{name}" konnte nicht entfernt werden.`,"prov.removeLastProvider":`Der Standardanbieter kann nicht entfernt werden, wenn kein anderer aktivierter Anbieter Standard werden kann.`,"prov.removeHasDependentCombos":`Entferne oder aktualisiere zuerst diese abhängigen Combos: {combos}.`,"prov.setDefault":`Als Standard festlegen`,"prov.setDefaultSuccess":`"{name}" ist jetzt der Standardanbieter.`,"prov.setDefaultFail":`"{name}" konnte nicht als Standardanbieter festgelegt werden.`,"prov.defaultDisabled":`Aktiviere diesen Anbieter, bevor du ihn als Standard festlegst.`,"prov.updateFail":`Dieser Anbieter konnte nicht aktualisiert werden.`,"prov.networkError":`Netzwerkfehler. Prüfe, ob der Proxy läuft, und versuche es erneut.`,"prov.added":`"{name}" hinzugefügt. Sofort aktiv — führe {cmd} aus (oder starte neu), um seine Modelle in Codex’ Auswahl zu listen.`,"prov.removeConfirm":`Anbieter "{name}" entfernen? Seine Modelle verschwinden aus Codex’ Auswahl.`,"prov.hasApiKey":`API-Schlüssel konfiguriert`,"prov.hasHeaders":`benutzerdefinierte Header konfiguriert`,"prov.accounts":`Konten ({n})`,"prov.accountsAria":`{name}-Konten umschalten`,"prov.accountActive":`Aktiv`,"prov.accountReauth":`Erneut anmelden`,"prov.reauthenticate":`Erneut authentifizieren`,"prov.reauthAccountMissing":`Ausgewähltes Konto nach dem Login nicht gefunden`,"prov.reauthIdentityMismatch":`Angemeldetes Konto stimmt nicht mit dem ausgewählten Konto überein`,"prov.accountAdd":`Konto hinzufügen`,"prov.accountNoLabel":`Konto {id}`,"prov.accountSwitchTitle":`Dieses Konto verwenden`,"prov.accountSwitched":`Zu {email} gewechselt.`,"prov.accountSwitchFail":`Konto-Wechsel fehlgeschlagen`,"prov.accountRemoved":`{email} entfernt.`,"prov.accountRemoveFail":`{email} konnte nicht entfernt werden. Das Konto bleibt unverändert.`,"prov.accountRemoveAria":`{email} entfernen`,"prov.accountRemoveConfirm":`Konto {email} entfernen? Sein Login wird aus diesem Proxy gelöscht.`,"prov.keyAdd":`API-Schlüssel hinzufügen`,"prov.keyAdded":`API-Schlüssel zu {name} hinzugefügt.`,"prov.keyAddFail":`API-Schlüssel konnte nicht hinzugefügt werden`,"prov.keyPlaceholder":`API-Schlüssel einfügen`,"prov.keySwitchTitle":`Diesen Schlüssel verwenden`,"prov.keySwitched":`Zu Schlüssel {key} gewechselt.`,"prov.keySwitchFail":`Schlüssel-Wechsel fehlgeschlagen`,"prov.keyRemoved":`Schlüssel {key} entfernt.`,"prov.keyRemoveAria":`Schlüssel {key} entfernen`,"prov.keyRemoveConfirm":`API-Schlüssel {key} entfernen? Er wird aus der Proxy-Konfiguration gelöscht.`,"prov.activeBadge":`Aktiv`,"prov.disabledBadge":`Deaktiviert`,"prov.defaultBadge":`Standard`,"prov.enable":`Aktivieren`,"prov.disable":`Deaktivieren`,"prov.enabled":`"{name}" aktiviert. Seine Modelle können wieder in Codex erscheinen.`,"prov.disabled":`"{name}" deaktiviert. Einstellungen bleiben erhalten, aber seine Modelle sind verborgen.`,"prov.enableFail":`"{name}" konnte nicht aktiviert werden.`,"prov.disableFail":`"{name}" konnte nicht deaktiviert werden.`,"prov.enableAria":`Anbieter {name} aktivieren`,"prov.disableAria":`Anbieter {name} deaktivieren`,"prov.defaultCannotDisable":`Standard-Anbieter kann nicht deaktiviert werden`,"prov.openaiAccountMode":`Codex-Kontomodus`,"prov.openaiModePool":`Pool`,"prov.openaiModeDirect":`Direkt`,"prov.openaiPoolDesc":`Standard. Wechselt mit Affinität, Kontingent, Abklingzeit und Ausfallsicherung zwischen Hauptanmeldung und hinzugefügten Konten.`,"prov.openaiDirectDesc":`Verwendet nur die aktuelle primäre Codex-Anmeldung. Gespeicherte Pool-Konten werden weder gelesen noch gewechselt.`,"prov.openaiModeSaved":`OpenAI-Kontomodus wurde zu {mode} geändert.`,"prov.openaiModeSaveFailed":`Der OpenAI-Kontomodus konnte nicht geändert werden.`,"prov.openaiApiDesc":`Verwendet nur einen OpenAI-API-Schlüssel und keine Codex-Kontodaten.`,"prov.manageCodexAccounts":`Codex-Konten verwalten`,"prov.openaiApiMissing":`API-Schlüssel erforderlich`,"prov.openaiApiSetup":`API-Schlüssel einrichten`,"models.tab.catalog":`Modelle`,"models.tab.combos":`Combos`,"models.tab.compatibility":`Kompatibilität`,"models.tab.routing":`Routing (beta)`,"models.tabsLabel":`Modell-Oberflächen`,"models.subtitle.combos":`Geordnete Modellgruppen, die unter einer id antworten. Failover probiert Ziele der Reihe nach, Round-Robin verteilt die Last.`,"models.subtitle.compatibility":`Schreibgeschützte Kompatibilitätsmatrix aus der Lab-Projektion.`,"models.subtitle.routing":`Policy-Profile, Dry-Run-Auswertung und quellenbasierte Routing-Analysen.`,"models.subtitle":`Steuere, welche Modelle Codex sieht — natives GPT-Passthrough und geroutete Anbieter, nach Anbieter gruppiert (Kopfzeile zum Einklappen anklicken). Ausgeblendete Modelle fehlen in Katalog und Auswahl, bleiben aber per genauer ID aufrufbar. Änderungen gelten bei der nächsten Codex-Runde — opencodex invalidiert Codex 5-Minuten-Modell-Cache, kein Neustart nötig.`,"models.nativeGroupLabel":`OpenAI nativ`,"models.nativeHint":"Passthrough-Modelle verwenden die unter Anbieter gewählte Pool- oder Direkt-Option. Ausblenden entfernt sie aus der Codex-Auswahl (Katalogeintrag bleibt, Reaktivierung stellt exakt wieder her). Ein hier hinzugefügtes Modell wird als gerouteter `openai/<model>`-Selektor registriert, nicht als neue reine Passthrough-ID.","models.active":`{active}/{total} sichtbar`,"models.workspace.providers":`Anbieter`,"models.workspace.allProviders":`Alle Anbieter`,"models.workspace.mainAria":`Modelldetails`,"models.allOn":`Alle an`,"models.allOff":`Alle aus`,"models.presetLabel":`Modelle`,"models.presetMode_preset":`Voreinstellung`,"models.presetMode_all":`Alle`,"models.presetMode_custom":`Eigene`,"models.presetSummary":`{count} von {total} angezeigt — Core-Voreinstellung v{version}`,"models.presetUpdateAvailable":`Voreinstellung v{version} verfügbar`,"models.presetAppliedToast":`{provider}: Voreinstellung angewendet — {count} Modelle ausgewählt`,"models.presetClearedToast":`{provider}: alle Modelle werden angezeigt`,"models.presetEmpty":`{provider}: Voreinstellung traf auf kein Modell zu — Auswahl unverändert`,"models.presetConfirmReplace":`Auswahl durch die Voreinstellung mit {count} Modellen ersetzen?`,"models.cap350k":`Limit 350k`,"models.capApplied":`Kontext-Limit angewendet — greift bei der nächsten Codex-Runde.`,"models.capSaveFailed":`Kontext-Limit konnte nicht gespeichert werden`,"models.contextCapped":`350k-Limit`,"models.contextCapLabel":`Sicherheitslimit / Fallback`,"models.v2Label":`Sub-Agent`,"models.shadowCallOriginal":`⚠ {models} →`,"models.v2DocsLink":`Was ist v1 / v2?`,"models.v2Mode_v1":`v1`,"models.v2Mode_default":`base`,"models.v2Mode_v2":`v2`,"models.v2ModeDesc_v1":`Alle Modelle → v1-Oberfläche`,"models.v2ModeDesc_default":`Upstream-Standard (sol/terra=v2, luna=v1)`,"models.v2ModeDesc_v2":`Alle Modelle → v2-Oberfläche`,"models.keepNativeOnV1":`ChatGPT auf v1 lassen`,"models.keepNativeOnV1Hint":`ChatGPT-native Eltern verschlüsseln v2-Kindaufgaben — Grok und Claude können sie nicht lesen. An lassen, wenn Sol/Terra weiterhin geroutete Modelle starten sollen. Geroutete Eltern bleiben auf v2.`,"models.v2Help":`Steuert die Multi-Agent-Oberfläche für alle Modelle.
10
+
11
+ v1: Klassischer Single-Thread-Agent. Jedes Modell nutzt die v1-Collab-Oberfläche.
12
+ base: Upstream-Standard — sol/terra nutzen v2, luna v1, andere folgen dem Codex-Feature-Flag.
13
+ v2: Multi-Thread-Agent mit spawn_agent. Jedes Modell nutzt die v2-Collab-Oberfläche.
14
+
15
+ Unter v2 lässt „ChatGPT auf v1 lassen“ Sol/Terra auf v1, damit sie weiter Grok oder Claude starten können. ChatGPT verschlüsselt v2-Kindaufgaben; geroutete Modelle können sie nicht lesen. Geroutete Eltern bleiben auf v2.
16
+
17
+ Änderungen gelten für neue Sitzungen.`,"dash.multiAgent":`Sub-Agent`,"models.v2Conflict":`[agents] max_threads ist gesetzt — codex verweigert den Start; entferne es aus config.toml`,"models.v2Applied":`Sub-Agent-Modus aktualisiert — gilt für neue Sitzungen (Codex-App neu starten, um die Auswahl zu aktualisieren)`,"models.v2ThreadsLabel":`Max. Threads`,"models.v2ThreadsDefault":`Standard (4)`,"models.v2ThreadsApplied":`Thread-Limit aktualisiert — gilt für neue Sitzungen`,"models.v2ThreadsInvalid":`Thread-Limit muss eine ganze Zahl >= 1 sein`,"models.v2ThreadsApply":`Anwenden`,"models.capValue":`Standard {value}`,"models.contextSettings":`Eigene Fenster`,"models.contextSettingsTitle":`Eigene Fenster — {provider}`,"models.contextDefault":`Sicherheitslimit / Fallback`,"models.contextModel":`Modell`,"models.contextModelOverride":`Modellüberschreibung`,"models.contextHint":`Leer lassen für automatische Erkennung. Ein Wert hier ist ein Sicherheitslimit und Fallback: er füllt ein fehlendes Upstream-Fenster und senkt nur ein größeres gemeldetes. Live-Erkennung wird nie in dieses Feld geschrieben.`,"models.contextAutomatic":`Automatische Erkennung`,"models.contextSaved":`Kontextfenster aktualisiert — gilt ab der nächsten Codex-Runde.`,"models.contextUnchanged":`Keine Änderungen am Kontextfenster zu speichern.`,"models.contextSaveFailed":`Kontextfenster konnten nicht gespeichert werden`,"models.contextInvalid":`Kontextfenster müssen positive ganze Zahlen sein`,"models.contextCappedValue":`{value}-Limit`,"models.contextMetadataSource":`Quelle`,"models.contextMetadataLive":`erkannt`,"models.contextMetadataRegistry":`Registry`,"models.contextMetadataCursorStatic":`Cursor-kuratiert`,"models.contextMetadataSnapshot":`gespeichert`,"models.contextMetadataFallback":`Fallback`,"models.contextMetadataDerived":`abgeleitet`,"models.contextMetadataUnknown":`unbekannt`,"models.contextMetadataStale":`veraltet`,"models.contextTooltipDetected":`{value} · erkannt`,"models.contextTooltipCapped":`{detected} erkannt · begrenzt auf {cap}`,"models.contextTooltipStale":`{value} · {when}`,"models.contextTooltipUnknown":`Kontextfenster unbekannt`,"models.contextTooltipSource":`{value} · {source}`,"models.contextLastChecked":`zuletzt geprüft {when}`,"models.contextYesterday":`gestern`,"models.setAll":`Alle setzen`,"models.setAllHint":`Schaltet das Standardfenster {value} für alle gerouteten Anbieter ein. Fehlen context_window / context_length, wird dieser Wert das tatsächliche Codex-Fenster. Für ein einzelnes Modell nutzen Sie «Eigene Fenster» in derselben Zeile. Native Anbieter bleiben unberührt.`,"models.collapseAll":`Alle einklappen`,"models.expandAll":`Alle ausklappen`,"models.orderHint":`Reihenfolge in der Modellauswahl: Subagents-Auswahl (in der festgelegten Reihenfolge) → übrige geroutete Modelle alphabetisch nach Anbieter, dann Modell-ID → native Modelle. Sichtbarkeitsschalter filtern nur; sie ändern diese Reihenfolge nicht.`,"models.custom":`Benutzerdefiniert…`,"models.customApply":`Anwenden`,"models.customPlaceholder":`Tokens (z. B. 420000)`,"models.customAdd":`Benutzerdefiniertes Modell hinzufügen`,"models.customAddTitle":`Benutzerdefiniertes Modell hinzufügen — {provider}`,"models.customEditTitle":`Benutzerdefiniertes Modell bearbeiten — {provider}`,"models.customAdded":`Benutzerdefiniertes Modell hinzugefügt`,"models.customUpdated":`Benutzerdefiniertes Modell aktualisiert`,"models.customDeleted":`Benutzerdefiniertes Modell gelöscht`,"models.customSaveFailed":`Benutzerdefiniertes Modell konnte nicht gespeichert werden`,"models.customSaving":`Wird gespeichert…`,"models.customAddBtn":`Hinzufügen`,"models.customEditBtn":`Aktualisieren`,"models.customEditNamed":`{name} bearbeiten`,"models.customDeleteNamed":`{name} löschen`,"models.customDeleteConfirm":`Modell {name} löschen?`,"models.customBadge":`Benutzerdefiniert`,"models.customSummary":`{count} benutzerdefiniert`,"models.customFieldModelId":`Modell-ID (Endpunkt-Slug)`,"models.customFieldModelIdPlaceholder":`z. B. qwen4-max-preview`,"models.customFieldDisplayName":`Anzeigename (optional)`,"models.customFieldDisplayNamePlaceholder":`z. B. Qwen 4 Max Preview`,"models.customFieldContext":`Kontextfenster`,"models.customFieldModalities":`Eingabemodalitäten`,"models.customFieldReasoning":`Reasoning-Aufwand`,"models.customFieldReasoningOverride":`Reasoning-Aufwand überschreiben`,"models.reasoningEffort.none":`Keine`,"models.reasoningEffort.minimal":`Minimal`,"models.reasoningEffort.low":`Niedrig`,"models.reasoningEffort.medium":`Mittel`,"models.reasoningEffort.high":`Hoch`,"models.reasoningEffort.xhigh":`Sehr hoch`,"models.reasoningEffort.max":`Maximal`,"models.tipProvider":`Anbieter`,"models.tipContext":`Kontext`,"models.tipModalities":`Modalitäten`,"models.tipStatus":`Status`,"models.tipActive":`Aktiv`,"models.tipDisabled":`Deaktiviert`,"models.applied":`Angewendet — greift bei der nächsten Codex-Runde.`,"models.saveFailed":`Speichern fehlgeschlagen`,"models.networkError":`Netzwerkfehler — läuft der Proxy?`,"models.loadFail":`Modelle konnten nicht geladen werden — läuft der Proxy?`,"models.noRouted":`Keine gerouteten Modelle`,"models.noRoutedHint":`Melde dich zuerst bei einem Anbieter an oder füge einen hinzu.`,"models.emptyDiscovery":`Es wurden keine Modelle gefunden. Prüfe den Anbieter-Endpunkt oder füge ein statisches/eigenes Modell hinzu.`,"models.emptyDiscoveryDisabled":`Die Live-Modellerkennung ist aus und es sind keine statischen Modelle konfiguriert.`,"models.discoveryFailedBadge":`Erkennung fehlgeschlagen`,"models.discoveryFailedHttp":`Die Modellerkennung ist fehlgeschlagen (HTTP {status}).`,"models.discoveryFailedBlocked":`Die Modellerkennung wurde durch die Zielrichtlinie blockiert.`,"models.discoveryFailedInvalidResponse":`Die Modellerkennung lieferte eine ungültige Antwort.`,"models.discoveryFailedNetwork":`Die Modellerkennung ist an einem Netzwerkfehler gescheitert.`,"models.discoveryFailedProvider":`Der Anbieter meldete einen Fehler bei der Modellerkennung.`,"models.discoveryFailedGeneric":`Die Modellerkennung ist fehlgeschlagen.`,"models.openProviderSettings":`Anbietereinstellungen öffnen`,"models.loading":`Lädt…`,"models.search":`Modelle suchen…`,"models.showMore":`{n} weitere anzeigen`,"models.allowlistLabel":`Nur ausgewählte`,"models.allowlistHint":`Nur geprüfte Modelle gehen in den Katalog (leer = alle). Nützlich für Anbieter mit tausenden Modellen.`,"models.selectedCount":`{n} ausgewählt`,"sub.subtitle":`Codex {cmd} bewirbt nur die ersten 5 Modelle (nach Priorität) als Overrides. Wähle hier bis zu 5 — natives gpt oder geroutet — und opencodex setzt ihre Katalog-Priorität, sodass genau diese führen. Jedes andere Modell bleibt über seinen exakten Namen aufrufbar; dies steuert nur die Anzeige.`,"sub.featured":`Empfohlen`,"sub.orderHint":`Die hier gewählte und angezeigte Reihenfolge bestimmt die Plätze 1–5 oben in der Codex-Modellauswahl und die Standard-Modellkandidaten für {cmd}.`,"sub.noneSelected":`Nichts ausgewählt — wähle aus der Liste unten.`,"sub.models":`Modelle`,"sub.search":`Modelle suchen (nativ gpt + geroutet)…`,"sub.noModels":`Keine Modelle — melde dich zuerst bei einem Anbieter an oder füge einen hinzu.`,"sub.saved":`{n} Modelle gespeichert. Starte eine neue Codex-Sitzung (oder führe {cmd} aus), um sie als spawn_agent-Overrides zu sehen.`,"sub.saveFailed":`Speichern fehlgeschlagen`,"sub.networkError":`Netzwerkfehler — läuft der Proxy?`,"sub.loadFail":`Modelle konnten nicht geladen werden — läuft der Proxy?`,"sub.loading":`Lädt…`,"sub.moveUp":`{m} nach oben`,"sub.moveDown":`{m} nach unten`,"sub.removeAria":`{m} entfernen`,"sub.workspace.addToFeatured":`{m} zu Hervorgehobenen hinzufügen`,"sub.workspace.allModels":`Alle Modelle`,"sub.workspace.featuredFull":`Hervorgehobene Liste ist voll (max. 5)`,"sub.workspace.mainAria":`Subagent-Modelldetails`,"sub.workspace.notFeatured":`Nicht hervorgehoben`,"sub.workspace.priority":`Priorität`,"sub.workspace.removeFromFeatured":`{m} aus Hervorgehobenen entfernen`,"sub.workspace.selectModel":`Modell auswählen`,"sub.workspace.selectModelDesc":`Wählen Sie ein Modell aus der Liste, um Details anzuzeigen und es für spawn_agent hervorzuheben.`,"sub.workspace.selector":`Öffentlicher Selektor`,"sub.ultraMode":`Ultra-Modus`,"sub.ultraModeHint":`Aktiviert die proaktive Multi-Agent-Delegierungsrichtlinie für alle Modelle und Reasoning-Efforts (ändert den Reasoning-Effort selbst nicht). Schreibt features.multi_agent_v2.multi_agent_mode_hint_text in config.toml.`,"sub.ultraModeV2Required":`Erfordert die v2-Multi-Agent-Oberfläche — aktivieren Sie zuerst multi_agent_v2 und wählen Sie v2 in der Subagentenmodus-Steuerung.`,"sub.ultraModeText":`Delegierungstext des Ultra-Modus`,"sub.ultraModePreset":`Voreinstellung wiederherstellen`,"sub.ultraModeLoadFail":`Ultra-Modus-Einstellungen konnten nicht geladen werden — läuft der Proxy?`,"sub.ultraModeSaveFail":`Ultra-Modus-Einstellungen konnten nicht gespeichert werden`,"sub.ultraModeSaved":`Ultra-Modus gespeichert. Gilt für neue Codex-Sitzungen.`,"sub.nativeParentOverride":`Native V2-Eltern weiterleiten`,"sub.nativeParentOverrideHint":`Codex kann das ursprüngliche native Modell anzeigen, während OpenCodex den Root auf dem ausgewählten weitergeleiteten Ziel ausführt.`,"sub.nativeParentOverridePrivacyWarning":`Prompts, Repository-Kontext, Gesprächsverlauf und Tool-Ergebnisse gehen an den ausgewählten Anbieter und übernehmen dessen Verfügbarkeit, Kontext, Latenz, Verhalten, Kosten und Datenschutzeigenschaften.`,"sub.nativeParentOverrideModel":`Zielmodell für native Eltern`,"sub.nativeParentOverrideV2Required":`Erfordert explizites V2, das Upstream-V2-Flag und deaktiviertes „ChatGPT auf v1 behalten“.`,"sub.nativeParentOverrideSaveFail":`Native Elternweiterleitung konnte nicht gespeichert werden`,"sub.nativeParentOverrideSaved":`Native Elternweiterleitung gespeichert. Gilt für nachfolgende Elternrunden und die Komprimierung.`,"sub.agentTaskRecovery":`Verschlüsselte V2-Aufgaben wiederherstellen`,"sub.agentTaskRecoveryHint":`Entschlüsselt OpenAI Fernet-verschlüsselte Aufgaben über ChatGPT, damit Nicht-OpenAI-Subagenten weitergeleitete V2-Aufgaben lesen können.`,"sub.agentTaskRecoveryModel":`Wiederherstellungsmodell (Standard: gpt-5.6-luna)`,"sub.agentTaskRecoverySaveFail":`Wiederherstellung verschlüsselter Aufgaben konnte nicht gespeichert werden`,"sub.agentTaskRecoverySaved":`Einstellung für die Wiederherstellung verschlüsselter Aufgaben gespeichert.`,"sub.roles":`Rollen`,"sub.roles.hint":`Benannte Spezialisten, die das Eltern-Agent spawnen kann. Jede Rolle legt ein Modell und den Kind-Prompt fest. Das Eltern-Agent entscheidet weiterhin, wann delegiert wird.`,"sub.roles.add":`Rolle hinzufügen`,"sub.roles.empty":`Noch keine Rollen. Fügen Sie einen Spezialisten für Review, Suche oder andere delegierte Arbeit hinzu.`,"sub.roles.full":`Rollenkatalog ist voll (max. 8)`,"sub.roles.id":`Rollenname`,"sub.roles.description":`Wann verwenden`,"sub.roles.descriptionHint":`Wird dem Eltern-Agent gezeigt, damit es weiß, wann dieser Spezialist gespawnt werden soll.`,"sub.roles.model":`Modell`,"sub.roles.effort":`Aufwand`,"sub.roles.effortNone":`Modellstandard`,"sub.roles.instructions":`Kind-Anweisungen`,"sub.roles.instructionsHint":`Developer-Prompt, den das Kind-Agent lädt.`,"sub.roles.enabled":`Aktiv`,"sub.roles.delete":`Rolle {id} löschen`,"sub.roles.save":`Rollen speichern`,"sub.roles.saved":`Rollen gespeichert. Gilt für neue Codex-Sitzungen.`,"sub.roles.saveFailed":`Rollen konnten nicht gespeichert werden`,"sub.roles.loadFail":`Rollen konnten nicht geladen werden — läuft der Proxy?`,"sub.roles.routedV2Warning":`Diese Rolle nutzt ein geroutetes Modell auf der v2-Oberfläche, ohne ChatGPT auf v1 zu halten. Native v2-Eltern verschlüsseln Kind-Aufgaben.`,"sub.roles.sync":`Mit Codex-Agent-Dateien synchronisieren`,"sub.roles.syncHint":`Schreibt aktivierte Rollen in marker-eigene ocx-*.toml-Dateien. Aus bereinigt OpenCodex-eigene Dateien und lässt Ihre unangetastet.`,"sub.injectionPrompt":`Benutzerdefinierte Eltern-Anleitung`,"sub.injectionPromptHint":`Ersetzt den eingebauten v2-Spawn-Hinweis. Leer lassen für den Standardtext. Platzhalter einfügen, wenn Live-Werte nötig sind:`,"sub.injectionPromptSave":`Eltern-Anleitung speichern`,"sub.injectionPromptSaved":`Eltern-Anleitung gespeichert. Gilt für neue Codex-Sitzungen.`,"sub.injectionPromptSaveFailed":`Eltern-Anleitung konnte nicht gespeichert werden`,"sub.childInstructions":`Globale Kind-Anweisungen`,"sub.childInstructionsHint":`Gilt für jedes gespawnte Kind. Rollenanweisungen gelten nach der Synchronisierung nur für diesen Spezialisten.`,"sub.childInstructionsSave":`Kind-Anweisungen speichern`,"sub.childInstructionsSaved":`Kind-Anweisungen gespeichert. Gilt für neue Codex-Sitzungen.`,"sub.childInstructionsSaveFailed":`Kind-Anweisungen konnten nicht gespeichert werden`,"logs.title":`Anfrage-Protokolle`,"logs.tabLogs":`Protokolle`,"logs.tabDebug":`Diagnose`,"logs.subtitle":`Letzte Anfragen über den lokalen opencodex-Proxy, neueste zuerst.`,"logs.autoRefresh":`Auto-Aktualisierung`,"logs.noRequests":`Noch keine Anfragen.`,"logs.loadError":`Anfrageprotokolle konnten nicht geladen werden.`,"logs.filter.surface.label":`Oberfläche`,"logs.filter.surface.all":`Alle`,"logs.filter.surface.claude":`Claude`,"logs.filter.surface.codex":`Codex`,"logs.filter.surface.grok":`Grok`,"logs.filter.interceptedHelpersOnly":`Nur abgefangene Helfer`,"logs.filter.model.label":`Modell`,"logs.filter.model.all":`Alle Modelle`,"logs.filter.provider.label":`Anbieter`,"logs.filter.provider.all":`Alle Anbieter`,"logs.filter.status.label":`Status`,"logs.filter.status.all":`Alle Status`,"logs.filter.status.success":`Erfolg (2xx)`,"logs.filter.status.errors":`Fehler (4xx/5xx)`,"logs.filter.time.label":`Zeit`,"logs.filter.time.all":`Gesamte Zeit`,"logs.filter.time.15m":`Letzte 15 Min`,"logs.filter.time.1h":`Letzte 1 Std`,"logs.filter.time.24h":`Letzte 24 Std`,"logs.filter.speed.label":`Geschwindigkeit`,"logs.filter.speed.all":`Alle Geschwindigkeiten`,"logs.filter.speed.slow":`< 15 tok/s`,"logs.filter.speed.medium":`15–50 tok/s`,"logs.filter.speed.fast":`> 50 tok/s`,"logs.filter.reset":`Filter zurücksetzen`,"logs.filter.showingCount":`Zeige {count} von {total}`,"logs.badge.interceptedHelper":`I · {model}`,"logs.badge.interceptedHelperTitle":`Abgefangene Helfer-Anfrage`,"logs.filter.conversation.label":`Konversation`,"logs.filter.conversation.placeholder":`Konversations-ID einfügen`,"logs.filter.conversation.clear":`Löschen`,"logs.filter.conversation.apply":`Logs filtern`,"logs.conversation.totals":`{requests} Anfragen · {tokens} Tokens · {cost}`,"logs.conversation.scope":`Summen gelten nur für den aktuell geladenen Logs-Ring.`,"logs.conversation.excluded":`({unpriced} ohne Preis, {unmetered} ohne Messung vom ~$ ausgenommen)`,"logs.cost.approximate":`ca. {amount}`,"logs.cost.lowerBound":`mind. {amount}`,"logs.cost.unavailable":`nicht verfügbar`,"logs.detail.conversation":`Konversation`,"logs.badge.claude":`Claude`,"logs.badge.grok":`Grok`,"logs.col.time":`Zeit`,"logs.col.request":`Anfrage`,"logs.col.model":`Modell`,"logs.col.effort":`Aufwand`,"logs.col.provider":`Anbieter`,"logs.col.status":`Status`,"logs.col.tokens":`Tokens`,"logs.col.tokPerSec":`tok/s`,"logs.col.estimatedCost":`~$`,"logs.metric.tokPerSecTitle":`Ausgabe-Tokens pro Sekunde über die gesamte Anfragedauer`,"logs.metric.estimatedCostTitle":`API-Listenpreis-Äquivalent, keine tatsächliche Belastung; bei fehlendem Preisabgleich nicht verfügbar`,"usage.cost.total":`API-Listenpreis-Äquivalent (dieser Zeitraum)`,"usage.cost.disclaimer":`Kein Abrechnungsbeleg. Stattdessen können Abonnementnutzung oder Anbieter-Guthaben gelten.`,"usage.cost.unpricedNote":`{count} Anfragen ohne Preis oder Nutzung ausgeschlossen`,"logs.detail.section.basic":`Grundinformationen`,"logs.detail.route.section":`Route-Entscheidung`,"logs.detail.route.kind":`Route-Typ`,"logs.detail.route.profile":`Profil`,"logs.detail.route.selected":`Ausgewählt`,"logs.detail.route.candidates":`Kandidaten`,"logs.detail.route.unknown":`Für diese Anfrage wurde keine Route-Entscheidung aufgezeichnet (Zeile vor dem Trace).`,"logs.detail.section.performance":`Leistung`,"logs.detail.section.cost":`API-Listenpreis-Äquivalent`,"logs.detail.section.attempts":`Combo-Versuche`,"logs.detail.section.usage":`Roh-Nutzung`,"logs.detail.ttft":`TTFT`,"logs.detail.costTotal":`Listenpreis-Äquivalent`,"logs.detail.totalTokens":`Tokens gesamt`,"logs.detail.matchedKey":`Zugeordneter Preisschlüssel`,"logs.detail.priceSource":`Preisquelle`,"logs.detail.unavailableReason":`Grund der Nichtverfügbarkeit`,"logs.detail.copyRequestId":`Anfrage-ID kopieren`,"logs.detail.copied":`Kopiert`,"logs.detail.source.jawcode":`jawcode-Katalog`,"logs.detail.source.expected":`Expected-Preis-Overlay`,"logs.detail.source.user":`Anbieter-konfiguriertes Preis-Overlay`,"logs.detail.verification.verified":`Verifiziert`,"logs.detail.verification.derived":`Vom Basismodell abgeleitet`,"logs.detail.attempt.target":`Anbieter / Modell`,"logs.detail.attempt.reason":`Ergebnis / Grund`,"logs.detail.attempt.completed":`Abgeschlossen`,"logs.detail.attempt.e2eNote":`Tok/s auf oberster Ebene ist Ende-zu-Ende; jeder Versuch nutzt seine eigene Dauer.`,"logs.detail.attempt.recovery.transient5xx":`Vorübergehender 5xx-Fehler`,"logs.detail.attempt.recovery.connectionReset":`Verbindung zurückgesetzt`,"logs.detail.attempt.recovery.oauth401":`OAuth-Neuanmeldung`,"logs.detail.attempt.recovery.key429":`Schlüssel ratenbegrenzt (429)`,"logs.detail.attempt.recovery.rateLimit429":`Ratenbegrenzt (429)`,"logs.detail.attempt.recovery.anthropicOauth429":`Anthropic OAuth ratenbegrenzt (429)`,"logs.detail.attempt.recovery.image413":`Bildnutzlast zu groß (413)`,"logs.detail.attempt.recovery.emptyCompletion":`Wiederholung nach leerer Antwort`,"logs.detail.attempt.recovery.unknown":`Unbekannter Wiederherstellungsgrund`,"logs.detail.reason.usage_missing":`Nutzung wurde nicht gemeldet.`,"logs.detail.reason.usage_unsupported":`Dieser Anbieter meldet keine Nutzung.`,"logs.detail.reason.output_missing":`Es wurden keine positiven Ausgabe-Tokens gemeldet.`,"logs.detail.reason.invalid_duration":`Die Anfragedauer ist ungültig.`,"logs.detail.reason.price_unmatched":`Kein passender Preis gefunden.`,"logs.detail.reason.invalid_cache_breakdown":`Cache-Token-Details widersprechen den Eingabe-Tokens.`,"logs.detail.reason.invalid_usage":`Die Nutzung enthält einen ungültigen Token-Wert.`,"logs.detail.reason.combo_attempt_unavailable":`Mindestens ein Combo-Versuch konnte nicht bepreist werden.`,"logs.detail.estimate.usage_estimated":`Die Anbieternutzung ist geschätzt.`,"logs.detail.estimate.cache_detail_missing":`Cache-Details fehlen; Eingabe ist als Obergrenze geschätzt.`,"logs.detail.estimate.expected_price_overlay":`Ein verifizierter Expected-Listenpreis wurde verwendet.`,"logs.detail.estimate.provider_cost_overlay":`Ein vom Anbieter konfiguriertes Preis-Overlay wurde verwendet.`,"logs.detail.estimate.priority_lower_bound":`Der bestätigte Priority-Preis ist nicht verfügbar; die angezeigte Schätzung ist eine bekannte Untergrenze.`,"logs.col.error":`Fehler`,"logs.col.upstreamReason":`Upstream-Grund`,"logs.col.duration":`Dauer`,"logs.modelTooltip.model":`Modell`,"logs.modelTooltip.resolvedModel":`aufgelöstes Modell`,"logs.modelTooltip.requestedTier":`angeforderte Stufe`,"logs.modelTooltip.configuredTier":`konfigurierte Stufe`,"logs.modelTooltip.responseTier":`Antwortstufe`,"logs.modelTooltip.supportsTier":`Stufenunterstützung`,"logs.tokens.reported":`gemeldet`,"logs.tokens.unreported":`nicht gemeldet`,"logs.tokens.unsupported":`nicht unterstützt`,"logs.tokens.estimated":`geschätzt`,"logs.tokens.input":`Eingabe`,"logs.tokens.output":`Ausgabe`,"logs.tokens.cacheRead":`Cache-Treffer (c)`,"logs.tokens.cacheWrite":`Cache-Schreiben (w)`,"logs.tokens.reasoning":`Reasoning`,"logs.tokens.noCache":`keine Cache-Daten`,"logs.tokens.contextTotal":`aktiver Kontext`,"logs.tokens.noCacheNote":`dieser Anbieter meldet keine Cache-Tokens`,"logs.tokens.noCacheCursor":`Cursor-Cache-Details nicht gemeldet`,"logs.tokens.noCacheCursorNote":`Cursor liefert keine Cache-Read/Write-Tokenzahlen; das ist unbekannt und kein bestätigter Cache-Miss`,"logs.tokens.estimatedNote":`Schätzung (Anbieter meldet keine exakte Nutzung)`,"logs.details":`Details`,"logs.detailTitle":`Anfragedetails`,"logs.detailRaw":`Roh-Protokolleintrag`,"debug.title":`Fehlerdiagnose`,"debug.subtitle":`Opt-in-Diagnose für Provider-Transport und Nutzungs-Extraktion. Anfragefehler und 502er bleiben im Protokolle-Tab.`,"debug.debug":`Provider-Diagnose`,"debug.usage":`Nutzungs-Extraktion`,"debug.injection":`Injektions-Log`,"debug.claude":`Claude-Inbound`,"debug.claudeInbound.title":`Claude-Inbound-Anfragen`,"debug.claudeInbound.sub":`Zeigt, was Claude Code/Desktop tatsächlich sendet (thinking, effort, metadata) — kein Prompt-Text wird gespeichert.`,"debug.claudeInbound.empty":`Noch keine Anfragen erfasst. Sende bei aktivierter Erfassung eine Nachricht aus Claude.`,"debug.claudeInbound.time":`Zeit`,"debug.claudeInbound.endpoint":`Endpunkt`,"debug.claudeInbound.model":`Modell`,"debug.claudeInbound.none":`keine`,"debug.reset":`Laufzeit-Überschreibungen löschen`,"debug.refresh":`Aktualisieren`,"debug.follow":`Folgen`,"debug.streamProvider":`Anbieter`,"debug.streamUsage":`Nutzung`,"debug.streamInjection":`Injektion`,"debug.loading":`Lade Diagnose-Einstellungen…`,"debug.loadFailed":`Diagnose-Einstellungen konnten nicht geladen werden.`,"debug.emptyTitle":`Diagnose-Logging ist aus`,"debug.empty":`Aktiviere Provider-Diagnose oder Nutzungs-Extraktion in der Karte oben. Zeilen erscheinen hier, nachdem du eine Anfrage über den Proxy gesendet hast.`,"debug.noLinesTitle":`Warte auf Zeilen`,"debug.noLines.provider":`Anbieter-Debug ist an, erfasst aber nur Transport-Anomalien (verworfene oder fehlerhafte Frames sowie Cursor-Dial/Retry-Ereignisse). Eine saubere Anfrage über einen Anbieter wie Anthropic kann null Zeilen erzeugen.`,"debug.noLines.usage":`Nutzungserfassung ist an, aber es wurde noch nichts erfasst. Sende einen Chat/eine Anfrage über Codex, dann erscheint es hier.`,"debug.noLines.injection":`Injektions-Log ist an, aber es wurde noch nichts erfasst. Es erfasst Multi-Agent-Guidance-Injektion und Effort-Cap-Entscheidungen bei Collab- und Sub-Agent-Turns.`,"usage.title":`Nutzung`,"usage.subtitle":`Lokale Token-Buchhaltung deines Proxys. Fehlende Nutzung wird nie als Null angezeigt.`,"usage.loading":`Lade Nutzungsdaten…`,"usage.empty":`Noch keine Nutzung erfasst. Sende eine Anfrage über den Proxy, um Aktivität hier zu sehen.`,"usage.loadError":`Nutzungsdaten konnten nicht geladen werden.`,"usage.range.all":`Alle`,"usage.range.available":`Verfügbarer Verlauf`,"usage.historyTruncated":`Die Summen beziehen sich nur auf den verfügbaren Verlauf, da ältere Nutzungsdaten nicht geladen wurden.`,"usage.historyTruncatedWindow":`Die geladenen Zeilen haben Anfragestartzeiten zwischen {start} und {end}. Frühere Dateieinträge wurden durch das Leselimit ausgelassen, daher kann jeder gewählte Zeitraum unvollständig sein.`,"usage.range.30d":`30d`,"usage.range.7d":`7d`,"usage.card.requests":`Anfragen`,"usage.card.measured":`Gemessen`,"usage.card.reported":`Gemeldet`,"usage.card.totalTokens":`Gesamt-Tokens`,"usage.card.cachedTokens":`Cache-Treffer-Tokens`,"usage.card.cachedTokensHint":`Prompt-Tokens aus dem Provider-Cache (Treffer). Cache-Schreibvorgänge werden darunter separat angezeigt.`,"usage.card.cacheWriteTokens":`Cache-Schreiben`,"usage.card.coverage":`Abdeckung`,"usage.card.activeDays":`Aktive Tage`,"usage.section.heatmap":`Tägliche Aktivität`,"usage.section.overview":`Übersicht`,"usage.section.models":`Modelle`,"usage.section.providers":`Anbieter`,"usage.section.coverage":`Abdeckungs-Aufschlüsselung`,"usage.workspace.report":`Nutzungsbericht`,"usage.workspace.sections":`Nutzungsabschnitte`,"usage.coverage.measured":`Gemessen`,"usage.coverage.reported":`Anbieter gemeldet`,"usage.coverage.estimated":`Geschätzt`,"usage.coverage.note":`Gemessene Einträge enthalten anbieter-gemeldete und geschätzte Token-Zahlen. Nicht gemeldete und nicht unterstützte Anfragen werden erfasst, aber nie auf Null aufgebläht.`,"usage.search.models":`Modelle suchen…`,"usage.col.requests":`Anfragen`,"usage.col.measured":`Gemessen`,"usage.col.reported":`Gemeldet`,"usage.col.tokens":`Tokens`,"usage.col.share":`Anteil`,"usage.heatmap.less":`Weniger`,"usage.heatmap.more":`Mehr`,"modal.addNamed":`Hinzufügen: {label}`,"modal.add":`Anbieter hinzufügen`,"modal.catalogTabs":`Anbieterkategorien`,"modal.searchLabel":`Anbieter suchen`,"modal.search":`Anbieter suchen…`,"modal.logInWith":`Anmelden mit {label}`,"modal.waitingBrowser":`Warten auf Browser…`,"modal.providerName":`Anbietername`,"modal.adapter":`Adapter`,"modal.baseUrl":`Basis-URL`,"modal.endpoint":`Endpunkt`,"modal.endpoint.tokenPlan":`Token-Plan`,"modal.endpoint.payAsYouGo":`Pay as you go`,"modal.endpoint.custom":`Benutzerdefiniert`,"modal.defaultModel":`Standardmodell (optional)`,"modal.allowPrivateNetwork":`Lokales/privates Netzwerk erlauben`,"modal.allowPrivateNetworkHint":`Nur für absichtlich selbst gehostete Provider aktivieren. Metadaten-Endpunkte bleiben blockiert.`,"modal.nameRequired":`Anbietername ist erforderlich`,"modal.baseUrlRequired":`Basis-URL ist erforderlich`,"modal.networkError":`Netzwerkfehler — läuft der Proxy?`,"modal.loginFailStart":`Login konnte nicht gestartet werden`,"modal.waitingLogin":`Warten auf Browser-Login…`,"modal.loggingIn":`Anmelden…`,"modal.loginTimeout":`Login-Zeitüberschreitung — versuche es erneut.`,"nav.codexAuth":`Codex-Auth`,"nav.codexSet":`Codex-Einstellungen`,"codexSet.tab.multiauth":`Multi-Auth`,"codexSet.tab.prompt":`Prompt`,"codexSet.prompt.title":`Prompt-Ebenen`,"codexSet.prompt.timing":`Gilt für neu gestartete Sitzungen. Laufende Sitzungen behalten ihre aktuellen Prompt-Einstellungen.`,"codexSet.prompt.staleRevision":`Die Konfiguration wurde anderswo geändert. Die Liste wurde neu geladen.`,"codexSet.prompt.writeFailed":`Die Änderung konnte nicht gespeichert werden.`,"codexSet.prompt.loadFailed":`Die Prompt-Ebenen konnten nicht geladen werden.`,"codexSet.prompt.repair":`Reparieren`,"codexSet.prompt.repairFailed":`Die Reparatur konnte nicht abgeschlossen werden.`,"codexSet.drift.journalPresent":`Ein vorheriger Schreibvorgang wurde nicht abgeschlossen. Die Wiederherstellung läuft beim nächsten Schreibvorgang automatisch.`,"codexSet.drift.projectionStale":`Die gespeicherten Ebenen und der Wert in config.toml stimmen nicht überein. Die Reparatur schreibt den Wert aus deinen Ebenen neu.`,"codexSet.drift.storeMissing":`Die Ebenendatei fehlt, während in config.toml noch Anweisungen stehen. Die Reparatur legt zuerst eine Sicherung an und behält den Text als eine Ebene.`,"codexSet.drift.ownedMalformed":`Die generierte Zeile in config.toml wurde von Hand verändert und kann daher nicht mehr sicher überschrieben werden.`,"codexSet.custom.adoptUnsupported":`Der Wert in {path} Zeile {line} ist keine einzeilige Zeichenkette und kann nicht importiert werden. Verschiebe ihn von Hand, um ihn hier zu verwalten.`,"codexSet.prompt.unreadable":`Die Codex-Konfigurationsdatei existiert, konnte aber nicht gelesen werden, daher wurden Änderungen abgelehnt.`,"codexSet.layer.permissions":`Berechtigungen`,"codexSet.layer.collaboration":`Kollaborationsmodus`,"codexSet.layer.environment":`Umgebungskontext`,"codexSet.layer.apps":`Apps`,"codexSet.layer.skills":`Skills`,"codexSet.prompt.extensionsUnknown":`Erweiterungen können eigene Ebenen hinzufügen. Codex legt sie nicht offen, daher können sie hier nicht aufgeführt werden.`,"codexSet.group.transition":`Übergangshinweise`,"codexSet.group.transitionDesc":`Sie melden eine Änderung, statt einen Zustand zu beschreiben, und erscheinen daher nur beim Wechsel in den Echtzeitmodus oder beim Modellwechsel.`,"codexSet.custom.slotNote":`Benutzerdefinierte Ebenen werden in dieser Reihenfolge zu einem Abschnitt zusammengefügt.`,"codexSet.row.alwaysOn":`Immer aktiv`,"codexSet.row.onChange":`Bei Änderung`,"codexSet.row.featureGated":`Unter [features] konfiguriert`,"codexSet.row.openFeatures":`Einstellungen öffnen`,"codexSet.dialog.setValue":`{value} (Standard {fallback})`,"codexSet.dialog.copyKey":`Schlüssel kopieren`,"codexSet.dialog.unknownLayer":`Dieser Build enthält keine Beschreibung für diese Ebene. Sie stammt aus einer neueren Codex-Laufzeit als das Dashboard.`,"codexSet.custom.heading":`Benutzerdefinierte Ebenen`,"codexSet.custom.add":`+ Ebene hinzufügen`,"codexSet.custom.newTitle":`Neue Ebene`,"codexSet.custom.editTitle":`Ebene bearbeiten`,"codexSet.custom.titleLabel":`Titel`,"codexSet.custom.bodyLabel":`Anweisungen`,"codexSet.custom.bodySize":`{bytes} von {max} Byte`,"codexSet.custom.normalized":`Tabulatoren wurden durch vier Leerzeichen und Zeilenenden durch LF ersetzt.`,"codexSet.custom.titleRequired":`Gib einen Titel ein.`,"codexSet.custom.titleTooLong":`Der Titel hat {count} Zeichen; das Limit liegt bei {max}.`,"codexSet.custom.titleMultiline":`Der Titel muss einzeilig sein.`,"codexSet.custom.bodyTooLarge":`Diese Ebene umfasst {bytes} Byte; das Limit liegt bei {max}.`,"codexSet.custom.composedTooLarge":`Die aktivierten Ebenen würden zusammen {bytes} Byte umfassen und das Limit überschreiten.`,"codexSet.custom.invalidCharacter":`Ein Steuerzeichen an Position {position} kann nicht gespeichert werden.`,"codexSet.custom.discardPrompt":`Änderungen verwerfen?`,"codexSet.custom.keepEditing":`Weiter bearbeiten`,"codexSet.custom.delete":`{title} löschen`,"codexSet.custom.deleteConfirm":`Diese Ebene löschen? Dies kann nicht rückgängig gemacht werden.`,"codexSet.custom.layerGone":`Diese Ebene wurde anderswo entfernt, daher wurde der Editor geschlossen.`,"codexSet.custom.deleteConfirmNamed":`„{title}“ löschen? Dies kann nicht rückgängig gemacht werden.`,"codexSet.custom.moveUp":`{title} nach oben verschieben`,"codexSet.custom.prevLayer":`Vorherige Ebene`,"codexSet.custom.nextLayer":`Nächste Ebene`,"codexSet.custom.navPosition":`{position} / {total}`,"codexSet.custom.moveDown":`{title} nach unten verschieben`,"codexSet.custom.limitReached":`Du kannst bis zu {max} benutzerdefinierte Ebenen speichern.`,"codexSet.custom.notOwned":`developer_instructions wurde außerhalb von opencodex geschrieben und kann daher hier nicht bearbeitet werden. Importiere den Inhalt, um ihn als Ebene zu verwalten.`,"codexSet.custom.adopt":`Vorhandene Anweisungen importieren`,"codexSet.custom.adoptConfirm":`Als Ebene importieren`,"codexSet.custom.adoptRefused":`Der vorhandene Wert konnte nicht importiert werden.`,"codexSet.custom.baseReplaced":`model_instructions_file ist auf {path} gesetzt. Daher wurde der Basis-Prompt außerhalb von opencodex ersetzt.`,"codexSet.lint.identity":`Hier wird eine andere Identität beansprucht als die von Codex festgelegte.`,"codexSet.lint.foreignTool":`Tools stammen aus der Registry; ein Name an dieser Stelle erstellt kein Tool.`,"codexSet.lint.placeholder":`Anweisungen werden nicht von einer Template-Engine verarbeitet. Dieser Inhalt wird daher wörtlich gesendet.`,"codexSet.lint.applyPatch":`apply_patch wird von der Tool-Registry definiert, nicht von Anweisungen.`,"codexSet.lint.approvalVocab":`Codex fügt eigene Begriffe für Genehmigungen ein; dies könnte ihnen widersprechen.`,"codexSet.lint.environment":`Umgebungsdaten werden später erzeugt und könnten dem widersprechen.`,"codexSet.lint.size":`Diese Ebene ist größer als 8 KB. Sie kann trotzdem gespeichert werden, verbraucht aber bei jeder Anfrage Tokens.`,"codexSet.preset.blank":`Leere Ebene`,"codexSet.preset.concise.name":`Knappe Ausgabe`,"codexSet.preset.concise.description":`Kurze Antworten ohne Einleitung und mit minimaler Formatierung.`,"codexSet.preset.concise.provenance":`Angelehnt an die Kürzevorgaben von Claude Code. Eigene Formulierung, keine Kopie.`,"codexSet.preset.planFirst.name":`Vor dem Bearbeiten planen`,"codexSet.preset.planFirst.description":`Zuerst den Plan nennen, dann die Änderung vornehmen.`,"codexSet.preset.planFirst.provenance":`Angelehnt an den Planungsansatz von Claude Code. Eigene Formulierung, keine Kopie.`,"codexSet.preset.explainWhy.name":`Begründung erklären`,"codexSet.preset.explainWhy.description":`Nicht nur sagen, was geschieht, sondern auch warum.`,"codexSet.preset.explainWhy.provenance":`Angelehnt an den Bestätigungsstil von Grok Build. Eigene Formulierung, keine Kopie.`,"codexSet.preset.testFirst.name":`Zuerst testen`,"codexSet.preset.testFirst.description":`Vor der Korrektur einen fehlschlagenden Test schreiben.`,"codexSet.preset.testFirst.provenance":`Angelehnt an gängige Vorgehensweisen von Agenten. Eigene Formulierung, keine Kopie.`,"codexSet.preset.korean.name":`Antworten auf Koreanisch`,"codexSet.preset.korean.description":`Unabhängig von der Sprache der Anfrage auf Koreanisch antworten.`,"codexSet.preset.korean.provenance":`Für opencodex aus einem häufig gewünschten Standard verfasst. Eigene Formulierung, keine Kopie.`,"codexSet.dialog.class":`Art`,"codexSet.dialog.key":`Konfigurationsschlüssel`,"codexSet.dialog.fileValue":`Wert in dieser Datei`,"codexSet.dialog.absentDefault":`nicht festgelegt (Standard: {value})`,"codexSet.dialog.noRenderedText":`Codex legt den zusammengesetzten Text einer integrierten Ebene nicht offen. Dieser Dialog beschreibt daher die Ebene und nennt ihren Schlüssel, statt ihren Inhalt anzuzeigen.`,"codexSet.dialog.sourceText":`An das Modell gesendeter Text`,"codexSet.dialog.sourceBytes":`{bytes} Byte`,"codexSet.dialog.notRendered":`In der gelesenen Runde hat diese Ebene nichts gesendet. Abschnitte werden nur bei Änderungen erneut gesendet, daher kann eine einzelne Stichprobe sie nicht enthalten.`,"codexSet.dialog.emptySource":`Die Datei unter {path} existiert, ist aber leer, daher sendet diese Ebene nichts.`,"codexSet.dialog.notExposed":`Der Basis-Prompt läuft außerhalb der Nachrichtenliste, die Codex ausgeben kann, und lässt sich hier nicht anzeigen. Ersetzen ist über model_instructions_file möglich.`,"codexSet.dialog.textUnavailable":`Der Codex-Prompt konnte auf diesem Rechner nicht gelesen werden, daher ist der Text nicht verfügbar.`,"codexSet.class.base":`Basisanweisungen`,"codexSet.class.config-toggle":`Hier umschaltbar`,"codexSet.class.feature-gated":`Feature-gesteuert`,"codexSet.class.runtime-conditional":`Laufzeitabhängig`,"codexSet.class.extension-unknown":`Erweiterungsebene`,"codexSet.layer.base-instructions":`Basisanweisungen`,"codexSet.layer.model-switch":`Hinweis zum Modellwechsel`,"codexSet.layer.personality":`Persönlichkeit`,"codexSet.layer.context-window-guidance":`Kontextfenster-Hinweise`,"codexSet.layer.realtime":`Echtzeit`,"codexSet.layer.agents-md":`AGENTS.md`,"codexSet.layer.environments-instructions":`Ausführungsumgebungen`,"codexSet.layer.plugins":`Plugins`,"codexSet.layer.tools":`Tools`,"codexSet.layer.multi-agent-mode":`Multi-Agenten-Modus`,"codexSet.layer.git-attribution":`Commit-Attribution`,"codexSet.about.base-instructions":`Codex-eigene Anweisungen. Sie werden mit der Anfrage selbst gesendet und können nicht deaktiviert werden.`,"codexSet.about.model-switch":`Wird hinzugefügt, wenn das Modell während einer Unterhaltung gewechselt wird.`,"codexSet.about.personality":`Vorgaben für Ton und Ausdruck, gesteuert durch ein Feature-Flag.`,"codexSet.about.context-window-guidance":`Hinweise zum verbleibenden Kontextbudget, gesteuert durch ein Feature-Flag.`,"codexSet.about.realtime":`Wird bei Echtzeitsitzungen hinzugefügt.`,"codexSet.about.agents-md":`Die AGENTS.md-Dateien deines Projekts. Diese Seite zeigt die Ebene an, bearbeitet aber nie deine Projektdokumentation.`,"codexSet.about.permissions":`Erläutert die geltenden Sandbox- und Genehmigungseinstellungen.`,"codexSet.about.collaboration":`Erläutert den aktiven Kollaborationsmodus.`,"codexSet.about.environment":`Arbeitsverzeichnis, Plattform und weitere Umgebungsdaten.`,"codexSet.about.environments-instructions":`Vorgaben für verzögerte Ausführungsumgebungen, gesteuert durch ein Feature-Flag.`,"codexSet.about.apps":`Anleitung zur Verwendung verbundener Apps.`,"codexSet.about.plugins":`Wird hinzugefügt, wenn ein Plugin ausgewählt ist oder ein Plugin eine Funktion bereitstellt.`,"codexSet.about.tools":`Verzögert geladene Tool-Beschreibungen, gesteuert durch ein Feature-Flag.`,"codexSet.about.skills":`Liste der verfügbaren Skills.`,"codexSet.about.multi-agent-mode":`Anweisungen für Subagenten, gesteuert durch ein Feature-Flag.`,"codexSet.about.git-attribution":`Lässt das Modell einen Co-authored-by: Codex-Trailer in Commits schreiben, die es erstellt, und eine Zeile Generated with Codex. in Pull Requests, die es öffnet. Codex liest das aus deinem Konto, deshalb ist es weder hier noch unter [features] einstellbar. Ist es im Konto aus, sendet Codex die umgekehrte Anweisung statt gar keine.`,"codexSet.condition.model-switch":`Wird nur nach einem Modellwechsel während der Sitzung ausgegeben.`,"codexSet.condition.realtime":`Wird nur in einer Echtzeitsitzung ausgegeben.`,"codexSet.condition.agents-md":`Wird ausgegeben, wenn für das Arbeitsverzeichnis eine Projektdokumentation gefunden wird.`,"codexSet.condition.plugins":`Wird ausgegeben, wenn ein Plugin ausgewählt ist oder ein Plugin eine Funktion bereitstellt.`,"codexSet.condition.git-attribution":`Wird durch die Attributionsrichtlinie deines Kontos bestimmt.`,"codexSet.base.title":`Basis-Prompt`,"codexSet.base.prev":`Vorherige Option`,"codexSet.base.next":`Nächste Option`,"codexSet.base.position":`{position} / {total}`,"codexSet.base.swipeHint":`Seitlich wischen, die Pfeiltasten oder die Pfeil-Schaltflächen verwenden, um zwischen Optionen zu wechseln. Gilt für neu gestartete Sitzungen.`,"codexSet.base.defaultTitle":`Codex’ eigener Basis-Prompt`,"codexSet.base.defaultBody":`Die Voreinstellung wird hier nicht gespeichert, es gibt also nichts zu bearbeiten oder zu löschen: Ihre Auswahl entfernt einfach model_instructions_file aus der Konfiguration, und Codex nutzt den mitgelieferten Prompt.`,"codexSet.base.variantTitle":`Name`,"codexSet.base.variantBody":`Prompt`,"codexSet.base.replacesWarning":`Das ERSETZT Codex’ eigenen Basis-Prompt, statt ihn zu ergänzen. Ein kurzer Prompt hier bedeutet ein Modell mit kurzen Anweisungen.`,"codexSet.base.use":`Diesen verwenden`,"codexSet.base.inUse":`In Verwendung`,"codexSet.base.externalBlocked":`model_instructions_file zeigt bereits auf {path}, und das hat nicht opencodex geschrieben. Entfernen Sie es selbst, bevor Sie hier auswählen.`,"nav.api":`API`,"nav.integrations":`Integrationen`,"nav.openMenu":`Menü öffnen`,"nav.closeMenu":`Menü schließen`,"integrations.subtitle":`Clients mit opencodex verbinden, Zugangsdaten verwalten und Client-Konfigurationen wiederherstellen.`,"integrations.tabsLabel":`Integrationsbereiche`,"integrations.tab.overview":`Übersicht`,"integrations.tab.keys":`API-Schlüssel`,"integrations.tab.codex":`Codex CLI`,"integrations.tab.claude":`Claude`,"integrations.tab.grok":`Grok Build`,"integrations.tab.opencode":`OpenCode`,"integrations.tab.pi":`Pi`,"integrations.tab.omp":`OMP`,"integrations.tab.hermes":`Hermes`,"integrations.tab.openclaw":`OpenClaw`,"integrations.tab.kimi":`Kimi Code`,"integrations.tab.gajae":`Gajae Code`,"integrations.tab.dsh":`DeepSeek Harness (DSH)`,"integrations.tab.mcode":`MiniMax Code`,"integrations.tab.zcode":`ZCode`,"integrations.tab.prime":`Prime Agent`,"integrations.codex.title":`Codex CLI`,"integrations.codex.body":`Die Codex-Anbindung wird vom Proxy-Dienst verwaltet. Beim Start von opencodex wird sie angewendet; beim Stoppen des Dienstes wird das native Routing wiederhergestellt.`,"integrations.codex.openService":`Dienststeuerung öffnen`,"integrations.state.notInstalled":`Nicht installiert`,"integrations.state.unknown":`Wird geprüft…`,"integrations.detail.codexRouted":`Codex-Anfragen laufen über diesen Proxy`,"integrations.detail.codexAbsent":`Codex läuft noch nicht über diesen Proxy`,"integrations.detail.keyCount":`{count} Schlüssel ausgestellt`,"integrations.detail.keyNone":`Keine Schlüssel ausgestellt`,"integrations.detail.keyChecking":`Wird geprüft…`,"integrations.detail.keyUnavailable":`Schlüsselstatus nicht verfügbar`,"integrations.detail.claudeOff":`Verbindung ist aus`,"integrations.detail.desktopCurrent":`Desktop läuft mit diesem Profil`,"integrations.detail.desktopStale":`Die Profildatei hat sich nach dem Anwenden geändert`,"integrations.detail.desktopNotServed":`Das Profil ist da, Desktop nutzt aber ein anderes`,"integrations.detail.desktopAbsent":`Kein Profil angewendet`,"integrations.detail.desktopDesiredOff":`Die Claude-Desktop-Integration ist deaktiviert`,"integrations.detail.desktopDesiredOffCleanupPending":`Claude Desktop verwendet das Gateway noch; die Bereinigung steht aus`,"integrations.detail.desktopDesiredOnNotApplied":`Die Integration ist aktiviert, aber Desktop verwendet nicht das Gateway-Profil`,"integrations.detail.desktopSelectedElsewhere":`Desktop verwendet ein anderes Profil`,"integrations.detail.desktopProfileDrift":`Das ausgewählte Desktop-Profil wurde geändert`,"integrations.detail.desktopObservedUnsafe":`Das ausgewählte Desktop-Profil kann nicht sicher geändert werden`,"integrations.detail.desktopNotInstalled":`Die Claude-Desktop-Konfigurationsbibliothek ist nicht installiert`,"integrations.dialog.desktop.title":`Claude-Desktop-Integration deaktivieren?`,"integrations.dialog.desktop.changes":`Falls {path} ein von opencodex verwaltetes Gateway-Profil enthält, wählt Desktop zuerst ein neues Standardprofil ohne Zugangsdaten und entfernt danach das alte Profil und dessen Sicherung.`,"integrations.dialog.desktop.breakage":`Claude Desktop verwendet dann statt über opencodex gerouteter Modelle wieder das standardmäßige Claude.`,"integrations.dialog.desktop.undo":`Beim erneuten Aktivieren wird das opencodex-Profil aus deinen gespeicherten Modellzuweisungen neu erstellt.`,"integrations.dialog.desktop.restart":`Claude Desktop liest diese Konfiguration nur beim Start. Beende Desktop vollständig und öffne es erneut, damit die Änderung wirksam wird.`,"integrations.dialog.desktop.confirm":`Deaktivieren`,"integrations.native.error.desktopUnsafeMetadata":`Die Claude-Desktop-Metadaten unter {path} konnten nicht sicher gelesen werden; die Bibliothek wurde nicht geändert.`,"integrations.native.error.desktopCleanupIncomplete":`Claude Desktop zeigt auf den Standardmodus, aber alte opencodex-Zugangsdaten befinden sich noch unter: {paths}.`,"integrations.native.msg.desktopDisabled":`Claude-Desktop-Integration deaktiviert.`,"integrations.native.msg.desktopEnabled":`Claude-Desktop-Integration aktiviert.`,"integrations.detail.grokModels":`{count} Modell(e) verbunden`,"integrations.detail.grokAbsent":`Kein opencodex-Block in der Konfiguration`,"integrations.dialog.grok.title":`Grok-Build-Integration deaktivieren?`,"integrations.dialog.grok.changes":`Aus {path} wird nur der von opencodex markierte Block entfernt. Manuell geschriebener Inhalt außerhalb des Blocks bleibt unverändert.`,"integrations.dialog.grok.breakage":`Nach dem Deaktivieren verschwinden die opencodex-Modellaliase aus Grok Build. Modelle, die mit dem xAI-Konto verwendet wurden, bleiben erhalten.`,"integrations.dialog.grok.undo":`Wenn opencodex unter einer Loopback-Adresse läuft, wird beim erneuten Aktivieren ein neuer Block aus der aktuell verfügbaren Modellliste geschrieben.`,"integrations.dialog.grok.confirm":`Deaktivieren`,"integrations.native.msg.nonLoopbackRemoved":`Grok Build kann nur automatisch registriert werden, wenn opencodex unter einer Loopback-Adresse läuft. Der vorherige Block mit Verweis auf Loopback wurde entfernt.`,"integrations.native.msg.nonLoopbackRemovedNoop":`Grok Build kann nur automatisch registriert werden, wenn opencodex unter einer Loopback-Adresse läuft. Es gab keinen vorherigen Block zu entfernen.`,"integrations.native.msg.nonLoopbackSuperseded":`Grok Build kann nur automatisch registriert werden, wenn opencodex unter einer Loopback-Adresse läuft. Inzwischen hat eine andere Stelle einen neuen Block in die Konfiguration geschrieben; der aktuelle Block in der Datei wurde daher nicht von dieser Anfrage erstellt.`,"integrations.native.error.orphanedMarker":`{path} enthält eine opencodex-Startmarkierung, aber keine Endmarkierung. Die Datei wurde nicht geändert, weil das Ende des Blocks nicht sicher bestimmt werden kann.`,"integrations.native.error.homeMismatch":`Das Home des installierten Dienstes stimmt nicht mit dem aktuellen Home überein; die Datei wurde daher nicht geändert.`,"integrations.native.error.notInstalled":`Grok Build ist nicht installiert; es gibt nichts zu ändern.`,"integrations.native.error.configBusy":`Die Konfiguration wird gerade an anderer Stelle gespeichert und konnte nicht geändert werden. Versuche es in Kürze erneut.`,"integrations.state.absent":`Nicht angewendet`,"integrations.state.current":`Angewendet`,"integrations.state.stale":`Aktualisierung erforderlich`,"integrations.state.conflict":`Konflikt`,"integrations.state.unsafe":`Nicht überprüfbar`,"integrations.summary.detected":`Clients erkannt`,"integrations.summary.applied":`Konfigurierte Clients`,"integrations.summary.stale":`Aktualisierung erforderlich`,"integrations.summary.lastChange":`Letzte Änderung`,"integrations.summary.disableAll":`Alle deaktivieren…`,"integrations.onboarding":`Beim Anwenden wird nach dem Speichern einer Sicherung genau ein opencodex-Anbieterblock geschrieben. Beim Deaktivieren wird nur dieser Block entfernt; eine aufbewahrte Momentaufnahme kann wiederhergestellt werden.`,"integrations.empty.title":`Keine installierten Clients erkannt`,"integrations.empty.body":`Installiere einen unterstützten Client und kehre dann hierher zurück, um opencodex anzuwenden.`,"integrations.action.apply":`Anwenden`,"integrations.action.disable":`Deaktivieren`,"integrations.action.refresh":`Aktualisieren`,"integrations.action.settings":`Einstellungen`,"integrations.action.manageKeys":`Schlüssel verwalten`,"integrations.action.restore":`Wiederherstellen…`,"integrations.action.undo":`Rückgängig`,"integrations.action.restorePoint":`Diesen Stand wiederherstellen…`,"integrations.action.snapshotExpired":`Sicherung abgelaufen`,"integrations.rollback.title":`Wiederherstellungscenter`,"integrations.rollback.empty":`Noch kein Anwendungsverlauf`,"integrations.rollback.emptyBody":`Vor jedem erfolgreichen Schreibvorgang wird zuerst eine Momentaufnahme gespeichert.`,"integrations.restore.title":`Diese Momentaufnahme wiederherstellen?`,"integrations.restore.body":`Die aktuelle Datei wird zuerst gesichert und dann durch die ausgewählte Momentaufnahme ersetzt.`,"integrations.restore.driftTitle":`Neuere Änderungen wurden erkannt`,"integrations.restore.driftBody":`Änderungen nach dieser Momentaufnahme werden gesichert; anschließend wird die Datei ersetzt.`,"integrations.restore.confirm":`Wiederherstellen`,"integrations.restore.confirmDrift":`Neuere Änderungen sichern und wiederherstellen`,"integrations.restore.pending":`Wiederherstellung läuft…`,"integrations.restore.manual":`Automatische Wiederherstellung fehlgeschlagen: {reason}. Stelle die Datei manuell aus {path} wieder her.`,"integrations.error.load":`Integrationsstatus konnte nicht geladen werden.`,"integrations.error.stale":`Die letzte Aktualisierung ist fehlgeschlagen. Die folgenden Werte könnten veraltet sein.`,"integrations.error.busy":`Eine andere Änderung für diesen Client läuft noch. Versuche es in Kürze erneut.`,"integrations.error.conflict":`Die Konfiguration wurde geändert, nachdem opencodex sie geschrieben hatte. Es wurde nichts entfernt.`,"integrations.error.unsafe":`Die Konfiguration kann nicht sicher geändert werden.`,"integrations.error.generic":`Die Integrationsänderung ist fehlgeschlagen. Der vorherige Zustand wurde beibehalten.`,"integrations.error.nonLoopback":`{client} erreicht nur einen Proxy auf localhost. In seiner Konfiguration ist kein Platz für den Header, den eine Remote-Bindung verlangt — von Hand geschrieben hilft es also ebenso wenig. Ermöglichen Sie stattdessen Loopback-Zugriff, etwa über einen Tunnel oder lokalen Forwarder.`,"integrations.status.installed":`Installiert`,"integrations.status.notInstalled":`Nicht installiert`,"integrations.status.appliedAt":`Angewendet`,"integrations.status.backup":`Sicherung`,"integrations.status.lastRestore":`Letzte Wiederherstellung`,"integrations.status.unknown":`Unbekannt`,"integrations.bulk.title":`Angewendete Client-Integrationen deaktivieren?`,"integrations.bulk.body":`Nur der opencodex-eigene Block wird entfernt. Für jeden Client wird vorher eine Momentaufnahme gespeichert.`,"integrations.bulk.partial":`Einige Clients konnten nicht deaktiviert werden: {clients}`,"integrations.bulk.success":`Angewendete Client-Integrationen wurden deaktiviert.`,"integrations.retention.degraded":`Die Sicherungsbereinigung ist im Rückstand; ältere Sicherungen könnten noch auf dem Datenträger liegen.`,"integrations.error.residual":`Die Datei könnte sich in einem Zwischenzustand befinden: {message} Stellen Sie sie aus {path} wieder her.`,"integrations.error.recover":`{message} Eine Sicherung liegt unter {path}.`,"integrations.kind.apply":`Angewendet`,"integrations.kind.disable":`Deaktiviert`,"integrations.kind.refresh":`Aktualisiert`,"integrations.kind.restore":`Wiederhergestellt`,"integrations.semantics.opencode":`Gilt nur für direkte Starts von der Festplatte; die Umgebungsinjektion von ocx opencode hat Vorrang.`,"integrations.semantics.pi":`Gilt für neue Sitzungen.`,"integrations.semantics.omp":`Starten Sie OMP neu, um den Katalog zu laden.`,"integrations.semantics.hermes":`Gilt für neue Sitzungen.`,"integrations.semantics.openclaw":`Wird sofort auf ein laufendes Gateway angewendet.`,"integrations.semantics.kimi":`Zum Anwenden neu starten oder /reload ausführen (v2 überwacht die Datei).`,"integrations.semantics.gajae":`Gilt für eine neue Sitzung oder beim Öffnen von /model.`,"integrations.semantics.dsh":`OpenCodex verwaltet nur llm-pi-ai.providers.opencodex in $DSH_HOME/settings.yaml. DSH lädt diesen Anbieter im laufenden Betrieb neu; Ihr Standardmodell und deepseek-official bleiben unverändert. Derzeit nur über Loopback; es werden keine echten Zugangsdaten geschrieben.`,"integrations.semantics.mcode":`Verwaltet nur custom_provider.opencodex. Standardmodell und MiniMax-Anmeldung bleiben unverändert.`,"integrations.semantics.zcode":`Verwaltet nur provider.opencodex in ~/.zcode/v2/config.json. Z.ai-Anmeldung und andere Provider bleiben unverändert. ZCode nach Änderungen neu starten.`,"integrations.semantics.prime":`Verwaltet nur providers.opencodex in der models.json von Prime Agent — ~/.prime/agent, sofern PRIME_AGENT_CODING_AGENT_DIR sie nicht umleitet. Andere Provider und Modell-Overrides bleiben unverändert. Gilt für neue Sitzungen.`,"codexAuth.mainAccount":`Hauptkonto`,"codexAuth.logLabel":`Log-Kennung`,"codexAuth.codexApp":`Codex App`,"codexAuth.appLogin":`App-Login`,"codexAuth.accountPool":`Kontopool`,"codexAuth.accountModeTitle":`OpenAI-Kontomodus`,"codexAuth.accountModePool":`Pool-Modus`,"codexAuth.accountModePoolDesc":`Die Hauptanmeldung und geeignete hinzugefügte Konten wechseln sich hier ab.`,"codexAuth.accountModeDirect":`Direktmodus`,"codexAuth.accountModeDirectDesc":`Anfragen verwenden nur die Hauptanmeldung; hinzugefügte Konten bleiben für den Pool-Modus gespeichert.`,"codexAuth.openaiMissing":`Der integrierte OpenAI-Anbieter ist nicht konfiguriert.`,"codexAuth.openaiDisabled":`Der integrierte OpenAI-Anbieter ist deaktiviert.`,"codexAuth.openaiUnavailableDesc":`Deine OpenAI-Konten sind weiterhin verfügbar. Aktiviere den Anbieter, um Codex-Anfragen weiterzuleiten.`,"codexAuth.enableOpenai":`OpenAI aktivieren`,"codexAuth.enablingOpenai":`Wird aktiviert...`,"codexAuth.enableOpenaiFailed":`OpenAI-Anbieter konnte nicht aktiviert werden.`,"codexAuth.openaiPresetLoadFailed":`OpenAI-Anbieter-Preset konnte nicht geladen werden.`,"codexAuth.openaiPresetUnavailable":`OpenAI-Anbieter-Preset ist nicht verfügbar.`,"codexAuth.openProviders":`Anbieter öffnen`,"codexAuth.add":`Hinzufügen`,"codexAuth.sparkQuota":`Codex-Spark-Kontingent`,"codexAuth.sparkQuotaHint":`Zeigt das GPT-5.3-Codex-Spark-Wochenfenster auf Kontokarten. Standardmäßig ausgeblendet, da es nur für ein Modell gilt.`,"codexAuth.sparkQuotaShown":`Codex-Spark-Kontingent wird angezeigt`,"codexAuth.sparkQuotaHidden":`Codex-Spark-Kontingent ausgeblendet`,"codexAuth.sparkQuotaFailed":`Codex-Spark-Kontingent konnte nicht geändert werden`,"codexAuth.refreshQuota":`Kontingente aktualisieren`,"codexAuth.refreshingQuota":`Aktualisiere…`,"codexAuth.quotaRefreshed":`Kontingente aktualisiert`,"codexAuth.quotaRefreshFailed":`Kontingente konnten nicht aktualisiert werden`,"codexAuth.pauseExhausted":`Ausgeschöpfte pausieren`,"codexAuth.pausingExhausted":`Kontingente werden geprüft…`,"codexAuth.pauseExhaustedSucceeded":`Konten am Limit pausiert: {count}`,"codexAuth.pauseExhaustedNone":`Keine Konten mit bestätigter 100-%-Nutzung.`,"codexAuth.pauseExhaustedFailed":`Ausgeschöpfte Konten konnten nicht geprüft und pausiert werden.`,"codexAuth.noPool":`Noch keine Pool-Konten hinzugefügt.`,"codexAuth.pause":`Pausieren`,"codexAuth.resume":`Fortsetzen`,"codexAuth.paused":`PAUSIERT`,"codexAuth.pauseSucceeded":`{email} ist pausiert`,"codexAuth.resumeSucceeded":`{email} ist wieder im Pool verfügbar`,"codexAuth.pauseFailed":`{email} konnte nicht pausiert werden. Es wurde nichts geändert.`,"codexAuth.resumeFailed":`{email} konnte nicht fortgesetzt werden. Es wurde nichts geändert.`,"codexAuth.pausedHint":`Bis zur Fortsetzung von automatischem Wechsel, Wiederholungen, Cooldown-Wiederherstellung und manueller Auswahl ausgeschlossen.`,"codexAuth.pinned":`ANGEHEFTET`,"codexAuth.pinnedHint":`Du hast dieses Konto von Hand ausgewählt, daher geht eine höhere Auswahlreihenfolge nicht daran vorbei. Die Fixierung gilt, bis dieses Konto aufgebraucht ist, du ein anderes auswählst oder du eine Auswahlreihenfolge änderst.`,"codexAuth.fiveHour":`5 Std.`,"codexAuth.weekly":`Woche`,"codexAuth.monthly":`30d`,"codexAuth.resets":`zurücksetzen`,"codexAuth.today":`Heute`,"codexAuth.current":`AKTUELL`,"codexAuth.nextSession":`AUSGEWÄHLT`,"codexAuth.poolPrepared":`FÜR POOL VORBEREITET`,"codexAuth.preparePoolTitle":`Dieses Konto für den Pool-Modus vorbereiten?`,"codexAuth.preparePoolDesc":`Direkte Anfragen verwenden weiterhin die Hauptanmeldung. Dieses Konto wird zur vorbereiteten Pool-Auswahl, sobald der Pool-Modus aktiviert ist.`,"codexAuth.prepareForPool":`Für Pool vorbereiten`,"codexAuth.poolPreparedToast":`{email} ist für den Pool-Modus vorbereitet`,"codexAuth.switchTitle":`Aktives Konto wechseln?`,"codexAuth.switchDesc":`Wird sofort wirksam. Bereits laufende Anfragen behalten ihr Konto; alles andere wechselt zu diesem Konto, wobei Konten mit derselben Auswahlreihenfolge sich weiterhin abwechseln.`,"codexAuth.cacheWarning":`Prompt-Cache wird beim Kontowechsel zurückgesetzt. Neue Sitzung startet mit leerem Cache.`,"codexAuth.setAsNext":`Dieses Konto als Nächstes verwenden`,"codexAuth.cancel":`Abbrechen`,"codexAuth.switchBack":`Zurück zum Hauptkonto?`,"codexAuth.switchBackDesc":`Wird sofort wirksam. Bereits laufende Anfragen behalten ihr Konto; alles andere wechselt zu deinem App-Login-Konto, wobei Konten mit derselben Auswahlreihenfolge sich weiterhin abwechseln.`,"codexAuth.autoSwitch":`Proaktiver Wechsel nach Nutzung`,"codexAuth.autoSwitchQuotaDesc":`Kontingent: Ab {threshold} % Nutzung kann die nächste Anfrage zu einem geeigneten Konto mit geringerer Nutzung wechseln, auch bei einer bereits gebundenen Aufgabe; Go/Free nutzen nur 30 Tage.`,"codexAuth.autoSwitchQuotaOffDesc":`Der proaktive Wechsel nach Nutzung ist aus. Zuweisung neuer/ungebundener Aufgaben und Fehlerbehebung bleiben aktiv.`,"codexAuth.autoSwitchRoundRobinDesc":`Round-Robin-Zuweisung verwendet diesen Schwellenwert nicht und rotiert weiter neue/ungebundene Aufgaben.`,"codexAuth.autoSwitchFillFirstDesc":`Fill-first: {threshold} % ist der Entleerungspunkt für neue/ungebundene Aufgaben; gesunde gebundene Aufgaben behalten ihr Konto.`,"codexAuth.autoSwitchFillFirstOffDesc":`Fill-first hat keinen nutzungsbasierten Entleerungspunkt für neue/ungebundene Aufgaben; Cooldown, Neuanmeldung und Fehlerbehebung können das Routing weiterhin ändern.`,"codexAuth.failureRecoveryNote":`Fehlerbehebung ist getrennt: Eine Ablehnung vor der Ausgabe mit 429/402, Cooldown, Neuanmeldung, Ausschluss oder konfiguriertes temporäres Failover kann ein anderes geeignetes Konto auswählen.`,"codexAuth.autoSwitchThreshold":`Nutzungsschwelle`,"codexAuth.autoSwitchThresholdAria":`Nutzungsschwelle in Prozent`,"codexAuth.autoSwitchThresholdInc":`Nutzungsschwelle erhöhen`,"codexAuth.autoSwitchThresholdDec":`Nutzungsschwelle verringern`,"codexAuth.autoSwitchLoadFailed":`Die Einstellung für den nutzungsbasierten Wechsel konnte nicht geladen werden.`,"codexAuth.autoSwitchThresholdInvalid":`Gib eine ganze Zahl von 1 bis 100 ein`,"codexAuth.autoSwitchUpdated":`Der proaktive Wechsel nach Nutzung wurde aktualisiert`,"codexAuth.autoSwitchUpdateFailed":`Die Aktualisierung des nutzungsbasierten Wechsels konnte nicht bestätigt werden. Der zuletzt bestätigte Wert wird angezeigt.`,"codexAuth.requestUserInput":`Im Default-Modus nachfragen`,"codexAuth.requestUserInputDesc":`Erlaubt Codex, eine Session im Default-Modus zu pausieren und dir über das request_user_input-Tool Fragen zu stellen.`,"codexAuth.requestUserInputUpdated":`Feature-Flag aktualisiert - gilt für neue Sessions.`,"codexAuth.requestUserInputUpdatedRestart":`Feature-Flag aktualisiert - gilt für neue Sessions. Starte die Codex-App neu, damit es wirksam wird.`,"codexAuth.requestUserInputUpdateFailed":`Feature-Flag konnte nicht aktualisiert werden. Es wurde nichts geändert.`,"codexAuth.requestUserInputLoadFailed":`Feature-Flag konnte nicht aus config.toml gelesen werden.`,"codexAuth.accountPickerTitle":`Ein bestimmtes Codex-Konto in der Modellauswahl verwenden`,"codexAuth.accountPickerOffDesc":`Wenn aktiviert, werden die normalen GPT-Einträge in der Modellauswahl durch je einen Eintrag pro Kontoselektor ersetzt. So kannst du ohne Abmeldung das genaue Konto für eine Unterhaltung wählen. Beim Deaktivieren werden keine Konten entfernt.`,"codexAuth.accountPickerOnDesc":`Jeder Selektor ist eine öffentliche Bezeichnung für ein gespeichertes Konto. Seine Auswahl bindet die Unterhaltung an dieses Konto: keine Pool-Rotation, kein Fallback und keine Änderung des aktiven Pool-Kontos.`,"codexAuth.accountPickerCompatibility":`Die integrierte Codex-App-Anmeldung hat einen eigenen Selektor; generierte Zuordnungen nennen ihn normalerweise main und verwenden bei Bedarf ein kollisionssicheres Suffix wie main-2. Hinzugefügte Konten erhalten stabile, datenschutzfreundliche Bezeichnungen; eigene Selektornamen bleiben erhalten. Bestehende Unterhaltungen und gespeicherte Modellauswahlen werden weiterhin geroutet. Beim Deaktivieren werden nur generierte Einträge ausgeblendet, Selektoren und exakte Routen bleiben bestehen. Einfache GPT-Modell-IDs behalten ihr Pool- oder Direct-Verhalten.`,"codexAuth.accountPickerUpdated":`Kontozielauswahl aktualisiert.`,"codexAuth.accountPickerUpdateFailed":`Die Kontozielauswahl konnte nicht aktualisiert werden. Die zuletzt bestätigte Einstellung wird angezeigt.`,"codexAuth.accountPickerLoadFailed":`Die Einstellung für die Kontozielauswahl konnte nicht geladen werden.`,"codexAuth.accountPickerRefreshFailed":`Diese Einstellung konnte nicht aktualisiert werden. Der zuletzt bestätigte Wert wird weiterhin angezeigt.`,"codexAuth.advancedSettings":`Erweiterte Einstellungen`,"codexAuth.advancedSettingsAria":`Erweiterte Codex-Auth-Einstellungen ein- oder ausblenden`,"codexAuth.catalogRefreshPending":`Die Änderung wurde gespeichert, aber die Aktualisierung des Codex-Modellkatalogs steht noch aus. Führe ocx sync aus, um es erneut zu versuchen.`,"anthropicPool.title":`Claude-Kontenpool (experimentell)`,"anthropicPool.enabledDesc":`Bei 429 wird das Konto gekühlt und umgeschaltet. Neue Sitzungen bevorzugen Nutzung unter {threshold}% (5-Stunden-Balken).`,"anthropicPool.disabledDesc":`Nutzt nur das aktive Claude-Konto. Nur aktivieren, wenn experimentelles Routing akzeptabel ist.`,"anthropicPool.experimentalWarning":`Experimentell und nicht kampferprobt. Anthropic kann Konten einschränken, die wie automatische Multi-Konto-Rotation wirken. Dieselbe Organisation kann Kontingent teilen — Pooling hilft dann nicht. Ausgeschaltet lassen, sofern das Risiko unklar ist.`,"anthropicPool.needTwoAccounts":`Füge mindestens zwei Claude-OAuth-Konten hinzu, bevor du den Pool aktivierst.`,"anthropicPool.threshold":`Nutzungsschwelle für neue Sitzungen`,"anthropicPool.thresholdAria":`Nutzungsschwelle für neue Sitzungen in Prozent`,"anthropicPool.thresholdHelp":`0 deaktiviert die kontingentbasierte Auswahl (nur Affinität + aktives Konto). Standard 80.`,"anthropicPool.thresholdInvalid":`Gib eine ganze Zahl von 0 bis 100 ein`,"anthropicPool.loadFailed":`Claude-Pool-Einstellungen konnten nicht geladen werden.`,"anthropicPool.saveFailed":`Claude-Pool-Einstellungen konnten nicht gespeichert werden.`,"anthropicPool.on":`An`,"anthropicPool.off":`Aus`,"cursorPool.title":`Cursor-Kontenpool (experimentell)`,"cursorPool.enabledDesc":`Bei 429 oder Auth-Fehler wird das Konto gekühlt und für diese Konversation umgeschaltet. Jede Konversation bleibt auf einem Konto, bis ein Rate-Limit- oder Anmeldefehler auftritt.`,"cursorPool.disabledDesc":`Nutzt nur das aktive Cursor-Konto. Nur aktivieren, wenn experimentelles Routing akzeptabel ist.`,"cursorPool.experimentalWarning":`Experimentell und nicht kampferprobt. Die Cursor-Nutzungsrichtlinie verbietet das Umgehen von Rate-Limits und die Manipulation von Nutzungsmessung. Teams-Nutzung ist pro Sitz und kann nicht übertragen werden. Ausgeschaltet lassen, sofern das Risiko unklar ist.`,"cursorPool.needTwoAccounts":`Füge mindestens zwei Cursor-OAuth-Konten hinzu, bevor du den Pool aktivierst.`,"cursorPool.loadFailed":`Cursor-Pool-Einstellungen konnten nicht geladen werden.`,"cursorPool.saveFailed":`Cursor-Pool-Einstellungen konnten nicht gespeichert werden.`,"cursorPool.on":`An`,"cursorPool.off":`Aus`,"antigravityRouting.failoverOnlyTitle":`Multi-Konto-Routing (nur Failover)`,"antigravityRouting.failoverOnlyDesc":`Jede Konversation bleibt auf einem Antigravity-Konto. Bei Rate-Limit-429 oder Anmeldefehler kann opencodex für diese Konversation auf ein anderes geeignetes Konto umschalten — ohne neue Sitzungen zu verteilen oder das globale aktive Konto für andere laufende Konversationen zu ändern.`,"accountPool.strategy":`Rotationsstrategie`,"accountPool.strategyDesc":`Wie OpenCodex einer neuen/ungebundenen Aufgabe ein Konto zuweist.`,"accountPool.strategyQuota":`Kontingent`,"accountPool.strategyRoundRobin":`Round-Robin`,"accountPool.strategyFillFirst":`Fill-first`,"accountPool.strategyHintQuota":`Kontingent kann eine bestehende Aufgabe bei ihrer nächsten Anfrage neu binden, nachdem die Nutzungsschwelle überschritten wurde.`,"accountPool.strategyHintRoundRobin":`Round-Robin rotiert nur Aufgaben ohne aktive Bindung; die Nutzungsschwelle ändert die normale Rotation nicht.`,"accountPool.strategyHintFillFirst":`Fill-first nutzt die Schwelle als Entleerungspunkt für ungebundene Aufgaben; gesunde gebundene Aufgaben behalten ihre Affinität.`,"accountPool.unboundDefinition":`Neue/ungebundene Aufgabe bedeutet eine Anfrage ohne aktuelle Kontobindung; eine sichtbare bestehende Aufgabe kann nach einem Proxy- oder Affinitätsreset ungebunden sein.`,"accountPool.stickyLimit":`Neue/ungebundene Zuweisungen vor Rotation`,"accountPool.stickyLimitAria":`Neue/ungebundene Zuweisungen vor Rotation`,"accountPool.stickyLimitInc":`Sticky-Limit erhöhen`,"accountPool.stickyLimitDec":`Sticky-Limit verringern`,"accountPool.stickyLimitHelp":`So viele neue/ungebundene Aufgaben dem gewählten Konto zuweisen, bevor weitergeschaltet wird; gezählt wird bei der Bindung, nicht nach einem Upstream-Erfolg.`,"accountPool.stickyLimitInvalid":`Gib eine ganze Zahl von 1 bis 100 ein`,"accountPool.strategyLoadFailed":`Rotationsstrategie konnte nicht geladen werden.`,"accountPool.strategyUpdateFailed":`Rotationsstrategie konnte nicht gespeichert werden.`,"accountPool.priority":`Auswahlreihenfolge`,"accountPool.priorityAria":`Auswahlreihenfolge für dieses Konto`,"accountPool.priorityHint":`Höhere Zahlen werden zuerst verwendet. Der Pool geht erst zu einer niedrigeren Zahl über, wenn alle Konten darüber aufgebraucht oder nicht verfügbar sind.`,"accountPool.priorityFirst":`Zuerst`,"accountPool.priorityEarlier":`Früher`,"accountPool.priorityNormal":`Normal`,"accountPool.priorityLater":`Später`,"accountPool.priorityLast":`Zuletzt`,"accountPool.priorityOption":`{name} ({value})`,"accountPool.priorityCustom":`Benutzerdefiniert`,"accountPool.priorityUpdated":`Auswahlreihenfolge für {email} aktualisiert`,"accountPool.priorityUpdateFailed":`Die Auswahlreihenfolge für {email} konnte nicht gespeichert werden. Der zuletzt bestätigte Wert wird angezeigt.`,"codexAuth.switched":`{email} ist für die nächste Anfrage ausgewählt`,"codexAuth.loadFailed":`Die Codex-Kontoeinstellungen konnten nicht geladen werden.`,"codexAuth.switchFailed":`Das Konto konnte nicht gewechselt werden. Die vorherige Auswahl bleibt erhalten.`,"codexAuth.removeConfirm":`{id} entfernen?`,"codexAuth.removeFailed":`Das Konto konnte nicht entfernt werden. Es wurde nichts geändert.`,"codexAuth.addTitle":`Codex-Konto hinzufügen`,"codexAuth.addIdLabel":`Konto-ID (slug)`,"codexAuth.addJsonLabel":`auth.json-Inhalt`,"codexAuth.addHelp":`Kopiere von ~/.codex/auth.json einer anderen Maschine oder nutze codex-auth export.`,"codexAuth.importBtn":`Importieren`,"codexAuth.importInvalidJson":`Ungültiges JSON`,"codexAuth.importMissingTokens":`access_token oder refresh_token fehlen in JSON`,"codexAuth.importMissingId":`Konto-ID ist erforderlich`,"codexAuth.accountAdded":`Konto zum Pool hinzugefügt`,"codexAuth.addPickDesc":`Melde dich mit einem anderen ChatGPT-Konto an, um es zum Pool hinzuzufügen.`,"codexAuth.oauthLogin":`OAuth-Login`,"codexAuth.oauthDesc":`Öffnet ChatGPT-Login im Browser`,"codexAuth.importAuthJson":`auth.json importieren`,"codexAuth.importAuthJsonDesc":`Von einer anderen Codex-Installation oder codex-auth export`,"codexAuth.back":`Zurück`,"codexAuth.oauthAlreadyInProgress":`Login läuft bereits. Schließe es in deinem Browser ab.`,"codexAuth.oauthWaiting":`Warte auf Abschluss des ChatGPT-Logins in deinem Browser…`,"codexAuth.oauthSubmittingCode":`Code wird gesendet…`,"codexAuth.oauthCodeSubmitted":`Code gesendet — warte auf Abschluss der Anmeldung…`,"codexAuth.oauthStatusRetrying":`Beim Prüfen des Login-Status ist ein Netzwerk- oder Proxyfehler aufgetreten — erneuter Versuch…`,"codexAuth.oauthCancelled":`Login wurde abgebrochen.`,"codexAuth.loginFailed":`Login fehlgeschlagen`,"codexAuth.needsReauth":`Erneut anmelden`,"codexAuth.reauthenticate":`Re-authenticate`,"codexAuth.tokenExpired":`Token abgelaufen — dieses Konto erneut authentifizieren`,"codexAuth.mainTokenExpired":`Token abgelaufen — erneut über Codex-App-Login anmelden`,"codexAuth.emailCollision":`Dieses Konto entspricht deinem Haupt-Codex-Login. Nutze ein anderes Konto.`,"codexAuth.resetCreditsTitle":`Gutschriften zurücksetzen`,"codexAuth.resetCreditsAvailable":`Du hast {count} Reset-Gutschrift(en) verfügbar.`,"codexAuth.resetCreditsDesc":`Jede Gutschrift setzt deine aktuellen stündlichen und wöchentlichen Nutzungsgrenzen sofort zurück.`,"codexAuth.noResetCredits":`Du hast keine Reset-Gutschriften.`,"codexAuth.earnCreditsHint":`Gutschriften werden monatlich und über das Empfehlungsprogramm verdient.`,"codexAuth.creditsExpireNote":`Gutschriften verfallen 30 Tage nach Erhalt.`,"codexAuth.useOneCredit":`1 Gutschrift nutzen`,"codexAuth.confirmResetTitle":`Reset-Gutschrift nutzen?`,"codexAuth.confirmResetDesc":`Dies setzt deine aktuellen Ratenbegrenzungen sofort zurück. Du hast noch {count} Gutschrift(en).`,"codexAuth.irreversible":`Diese Aktion kann nicht rückgängig gemacht werden.`,"codexAuth.useCredit":`Gutschrift nutzen`,"codexAuth.redeeming":`Wird zurückgesetzt…`,"codexAuth.resetSuccess":`Ratenbegrenzungen zurückgesetzt! {remaining} Gutschrift(en) übrig.`,"codexAuth.resetSuccessGeneric":`Ratenbegrenzungen zurückgesetzt!`,"codexAuth.resetAlreadyRedeemed":`Diese Gutschrift wurde bereits eingelöst. Gutschriften unverändert.`,"codexAuth.resetNothingToReset":`Kein Ratenbegrenzungs-Fenster muss gerade zurückgesetzt werden.`,"codexAuth.resetNoCredit":`Keine Reset-Gutschriften verfügbar.`,"codexAuth.resetError":`Reset-Gutschrift konnte nicht eingelöst werden. Bitte erneut versuchen.`,"codexAuth.fifoNote":`Die älteste Gutschrift wird zuerst verwendet.`,"codexAuth.confirmWhichCredit":`Gutschrift vom {date} wird verwendet.`,"codexAuth.creditNext":`Als nächstes`,"codexAuth.creditLabel":`Gutschrift #{n}`,"codexAuth.creditNextBadge":`NÄCHSTE`,"codexAuth.creditGranted":`Erhalten {date}`,"codexAuth.creditExpires":`Läuft ab {date} ({days} Tage übrig)`,"api.title":`API-Zugriff`,"api.subtitle":`Mit generierten API-Schlüsseln greifen externe Apps auf den opencodex-Proxy zu. Die Authentifizierung läuft über den {authHeader}-Header; welche Header ein Endpunkt akzeptiert, steht in der Tabelle unten.`,"api.baseUrl":`Basis-URL`,"api.responsesEndpoint":`Responses API`,"api.chatCompletionsEndpoint":`Chat Completions API`,"api.messagesEndpoint":`Messages API`,"api.modelsEndpoint":`Models API`,"api.endpointNote":`Nutze die Basis-URL für OpenAI-kompatible Clients. Responses und Chat Completions liegen unter /v1.`,"api.endpointsTitle":`Gateway-Endpunkte`,"api.authBaseUrlNote":`Konfiguriere Clients mit der Basis-URL und wähle dann den protokollspezifischen Endpunkt unten.`,"api.authTitle":`Authentifizierung`,"api.authLoopback":`Loopback-Binds (127.0.0.1 oder ::1) umgehen die Authentifizierung. Remote-Binds benötigen einen generierten ocx_-Schlüssel oder OPENCODEX_API_AUTH_TOKEN.`,"api.modelsTitle":`Externe Modelle`,"api.modelsCount":`{count} aufrufbar`,"api.modelsSearch":`Modelle suchen`,"api.modelsSubtitle":`Verwende diese exakten Modell-IDs mit /v1/models und dem gewählten eingehenden Protokoll.`,"api.modelsLoading":`Modelle werden geladen…`,"api.modelsEmpty":`Noch keine extern aufrufbaren Modelle verfügbar.`,"api.modelsNoMatch":`Keine Modelle passen zu „{query}“.`,"api.modelsLoadFailed":`Der externe Modellkatalog konnte nicht geladen werden.`,"api.colModel":`Modell`,"api.colSource":`Quelle`,"api.colProtocols":`Protokolle`,"api.copyModelId":`ID kopieren`,"api.modelCopied":`Kopiert`,"api.testModel":`Testen`,"api.testingModel":`Teste…`,"api.testFailed":`Fehlgeschlagen`,"api.protocolResponses":`Responses`,"api.protocolChatCompletions":`Chat Completions`,"api.protocolMessages":`Messages`,"api.sourceNative":`ChatGPT-Pool`,"api.sourceCombo":`Combo`,"api.sourceCustom":`Benutzerdefiniert`,"api.usageResponsesTitle":`Responses-Beispiel`,"api.usageChatTitle":`Chat-Completions-Beispiel`,"api.usageMessagesTitle":`Messages-Beispiel`,"api.testSucceeded":`OK`,"api.newKeyTitle":`Neuer Schlüssel erstellt`,"api.newKeyNote":`Kopiere diesen Schlüssel jetzt — er wird nicht erneut angezeigt.`,"api.copy":`Kopieren`,"api.copied":`Kopiert`,"api.dismiss":`Schließen`,"api.generateTitle":`Schlüssel generieren`,"api.keyNamePlaceholder":`Schlüsselname (optional)`,"api.generate":`Generieren`,"api.generating":`Erstelle…`,"api.activeKeys":`Aktive Schlüssel ({count})`,"api.activeKeysLoading":`Aktive Schlüssel`,"api.noKeys":`Noch keine API-Schlüssel. Erstelle oben einen.`,"api.workspace.sections":`API-Abschnitte`,"api.section.keys":`Schlüssel`,"api.section.connect":`Verbinden`,"api.section.endpoints":`Endpunkte`,"api.section.models":`Modelle`,"api.section.examples":`Beispiele`,"api.workspace.details":`API-Schlüsseldetails`,"api.workspace.keyDetails":`Schlüsseldetails`,"api.workspace.keyPrefix":`Schlüssel-Präfix`,"api.workspace.deleteKey":`Schlüssel löschen`,"api.workspace.deleteConfirm":`Diesen Schlüssel wirklich löschen? Das lässt sich nicht rückgängig machen.`,"api.workspace.usageExamples":`Nutzungsbeispiele`,"api.copyUrlHint":`Klick um URL zu kopieren`,"api.urlCopied":`URL kopiert`,"api.copyExampleHint":`Klick um Beispiel zu kopieren`,"api.exampleCopied":`Beispiel kopiert`,"api.colName":`Name`,"api.colKey":`Schlüssel`,"api.colCreated":`Erstellt`,"api.confirm":`Bestätigen`,"api.deleteAria":`API-Schlüssel löschen`,"api.usageSampleInput":`Hallo, Welt!`,"api.clientConfig.title":`Client-Konfiguration`,"api.clientConfig.rowsLabel":`Client verbinden`,"api.clientConfig.details":`Details`,"api.clientConfig.detailsAria":`Details zur {client}-Konfiguration`,"api.clientConfig.copyAria":`{client}-Konfiguration kopieren`,"api.clientConfig.downloadAria":`{client}-Konfiguration herunterladen`,"api.clientConfig.rowMeta":`{destination} · {count} Modell(e)`,"api.clientConfig.rowError":`Die {client}-Konfiguration konnte nicht erstellt werden.`,"api.clientConfig.copiedAnnounceClient":`{client}-Konfiguration in die Zwischenablage kopiert.`,"api.clientConfig.clientOpencode":`OpenCode`,"api.clientConfig.clientPi":`Pi`,"api.clientConfig.clientOmp":`OMP`,"api.clientConfig.clientHermes":`Hermes`,"api.clientConfig.clientOpenclaw":`OpenClaw`,"api.clientConfig.clientKimi":`Kimi Code`,"api.clientConfig.clientGajae":`Gajae Code`,"api.clientConfig.clientDsh":`DeepSeek Harness (DSH)`,"api.clientConfig.clientMcode":`MiniMax Code`,"api.clientConfig.clientZcode":`ZCode`,"api.clientConfig.clientPrime":`Prime Agent`,"api.clientConfig.copy":`Konfiguration kopieren`,"api.clientConfig.download":`Herunterladen`,"api.clientConfig.loading":`Client-Konfiguration wird erstellt…`,"api.clientConfig.jsonLabel":`{client}-Konfiguration`,"api.clientConfig.destination":`Zieldatei`,"api.clientConfig.envHint":`Schlüssel vor dem Start setzen`,"api.clientConfig.mergeWarning":`Führe dies in die Zieldatei ein. Ein Ersetzen würde deine anderen Provider und MCP-Einstellungen entfernen.`,"api.clientConfig.modelCount":`{count} Modell(e) exportiert`,"api.clientConfig.missingLimits":`{count} von {total} Modell(en) haben kein Kontextlimit; der Client verwendet dafür seine eigenen Vorgaben.`,"api.clientConfig.noKeyYet":`Für {env} existiert noch kein Schlüssel. Erzeuge oben einen Schlüssel, bevor du diese Konfiguration außerhalb von Loopback nutzt.`,"api.clientConfig.loadFailed":`Die Modellliste konnte nicht gelesen werden, daher wurde keine Client-Konfiguration erzeugt.`,"api.clientConfig.copiedAnnounce":`Client-Konfiguration in die Zwischenablage kopiert.`,"api.clientConfig.copyFailed":`Client-Konfiguration konnte nicht kopiert werden.`,"api.clientConfig.downloadedAnnounce":`{filename} heruntergeladen. Es hat sich noch nichts geändert — führe die Datei selbst in {destination} ein.`,"api.clientConfig.whereDisclosure":`Wohin diese Datei gehört`,"api.clientConfig.whereBody":`Der Pfad oben ist der globale Speicherort. Eine projektlokale Konfigurationsdatei im Arbeitsverzeichnis hat Vorrang, und der Schlüssel wird aus der in der Konfiguration genannten Umgebungsvariable gelesen — nie aus dieser Datei.`,"api.keysLoadFailed":`API-Schlüssel konnten nicht geladen werden.`,"api.createFailed":`API-Schlüssel konnte nicht erstellt werden.`,"api.deleteFailed":`API-Schlüssel konnte nicht gelöscht werden.`,"api.auth.endpoint":`Endpunkt`,"api.auth.required":`Erforderlich`,"api.auth.accepted":`Akzeptiert`,"api.auth.rejected":`Nicht akzeptiert`,"api.auth.testProtocol":`{protocol} testen`,"api.auth.testNeedsFreshKey":`Für einen authentifizierten Test einen Schlüssel erzeugen und den einmalig angezeigten Wert auf dem Bildschirm lassen.`,"api.key.name":`Schlüsselname`,"api.key.rename":`Umbenennen`,"api.key.saveName":`Namen speichern`,"api.key.renaming":`Wird gespeichert…`,"api.key.renameFailed":`Schlüssel konnte nicht umbenannt werden. Deine Eingabe wurde behalten.`,"api.key.deleting":`Wird gelöscht…`,"api.key.copyFailed":`Schlüssel konnte nicht kopiert werden. Vor dem Schließen dieses Panels manuell markieren und kopieren.`,"api.attribution.title":`Zugeordnete Nutzung`,"api.attribution.requests7d":`Anfragen, letzte 7 Tage`,"api.attribution.totalRequests":`Zugeordnete Anfragen gesamt`,"api.attribution.totalRequestsAvailable":`Anfragen im verfügbaren Verlauf`,"api.attribution.sinceAvailable":`Verfügbare Zuordnung seit`,"api.attribution.lastUsed":`Zuletzt verwendet`,"api.attribution.since":`Zuordnung verfügbar seit`,"api.attribution.neverUsed":`Seit Beginn der Zuordnung nicht verwendet`,"api.attribution.unavailable":`Keine Nutzungsdaten`,"api.attribution.unavailableDetail":`Es wurde noch keine Nutzung zugeordnet. Anfragen von vor dem Start der Zuordnung lassen sich nicht rückwirkend zuweisen.`,"api.attribution.ambiguous":`Zwei Schlüssel teilen sich diese ID, daher lässt sich die Nutzung keinem davon zuordnen. Vergib in der Konfigurationsdatei je Schlüssel eine eindeutige ID.`,"api.attribution.railAmbiguous":`doppelte ID`,"claude.subtitle":`GPT, Gemini und andere Modelle in Claude Code verwenden.`,"claude.enabledLabel":`Claude-Verbindung`,"claude.enabledHint":`Wenn aus, kann Claude Code diesen Proxy nicht verwenden.`,"claude.authMode":`Auth-Modus`,"claude.authModeHint":`Subscription erfordert Claude-Konto, Proxy funktioniert ohne Anthropic-Konto`,"claude.authModeSubscription":`Subscription (Claude-Konto)`,"claude.authModeProxy":`Proxy (kein Konto nötig)`,"claude.authModeAuto":`Auto (Claude-Anmeldung erkennen)`,"claude.effectiveMode.label":`Beim nächsten Start aktiv`,"claude.effectiveMode.manual":`Manuell: {mode}`,"claude.effectiveMode.autoPresent":`Auto: Abo — Claude-Anmeldung über {source} gefunden`,"claude.effectiveMode.autoAbsent":`Auto: Proxy-Modus — keine Claude-Anmeldung gefunden`,"claude.effectiveMode.autoUnknown":`Auto: Abo — Anmeldung konnte nicht geprüft werden`,"claude.effectiveMode.admissionKey":`Der API-Schlüssel dieses Proxys wird weiterhin gesendet.`,"claude.authSource.claude-json-oauth":`Claude-Konto`,"claude.authSource.claude-credentials-file":`Anmeldedatei`,"claude.authSource.macos-keychain":`macOS-Schlüsselbund`,"claude.authSource.exported-env":`Umgebungsvariable`,"claude.authSource.unknown":`erkannte Anmeldedaten`,"claude.systemEnv":`Auto-Verbindung`,"claude.systemEnvDesc":`Wenn an, wird claude in jedem Terminal automatisch über den Proxy geleitet.`,"claude.systemEnvUnsupported":`Auto-Verbindung ist nur unter macOS verfügbar. Starten Sie Claude auf diesem System mit {cmd}.`,"claude.systemEnvWarn":`⚠ Die Terminal-App muss vollständig beendet und neu gestartet werden. Nicht empfohlen.`,"claude.fastMode":`Fast Mode (OpenAI)`,"claude.fastModeDesc":`Steuert service_tier für OpenAI-Modelle. ON = Priorität (schneller). OFF = Standard. Auto = Durchleitung.`,"claude.fastAuto":`Auto`,"claude.fastOn":`ON`,"claude.fastOff":`OFF`,"claude.autoContext":`Großen Kontext automatisch nutzen`,"claude.autoContextDesc":`Steuert, wie weit die 1M-Markierung geht. AN: jedes Modell, dessen Fenster den Komprimierungsschwellwert fasst, erhält eine Big-Context-Zeile. AUS: nur echte 1M-Modelle.`,"claude.autoContextInert":`Inaktiv, weil in der Konfigurationsdatei ein alter Kontextgrößen-Wert (maxContextTokens) steht. Dort entfernen, um es wieder zu aktivieren.`,"claude.autoCompactWindow":`Punkt für Auto-Zusammenfassung`,"claude.autoCompactDefault":`{value} (Standard)`,"claude.autoCompactWindowDesc":`Ältere Nachrichten werden an diesem Punkt zusammengefasst. Das eigene Limit jedes Modells wird nie überschritten — 200k-Modelle bleiben unberührt.`,"claude.autoCompactWindowWarn":`Eine Änderung kann GPT-Modelle stören — liegt der Wert über dem echten Modelllimit, kommt es vor der Zusammenfassung zu Fehlern.`,"claude.injectAgents":`Subagenten automatisch registrieren`,"claude.injectAgentsDesc":`Registriert die im Subagenten-Tab gewählten Modelle (plus das aktuelle Standardmodell) als aufrufbare Claude-Code-Agenten (ocx-*). Gilt ab der nächsten Sitzung.`,"claude.webSearchSidecar":`Websuche-Sidecar überschreiben`,"claude.webSearchSidecarHint":`Überschreibt den allgemeinen Websuche-Sidecar für Claude-Code-Anfragen.`,"claude.visionSidecar":`Vision-Sidecar überschreiben`,"claude.visionSidecarHint":`Überschreibt den allgemeinen Vision-Sidecar für Claude-Code-Anfragen.`,"claude.useMainSetting":`Haupteinstellung verwenden`,"claude.sidecarModelPlaceholder":`Modell der Haupteinstellung`,"claude.quickstart":`Erste Schritte`,"claude.quickstartHint":`{cmd} öffnet Claude Code über den Proxy. Dein claude.ai-Login bleibt aktiv.`,"claude.manualEnv":`Manuelle Einrichtung (erweitert)`,"claude.smallFastModel":`Hintergrund-Hilfsmodell`,"claude.smallFastModelHint":`Das Modell für Hintergrundarbeit wie Chat-Zusammenfassungen und Themenerkennung. Auch der haiku-Alias der Subagenten nutzt es. Leer = Claude-Standard (Haiku).`,"claude.smallFastModelAccurateHint":`Das Modell, das Claude Code für Hintergrundaufgaben wie Chat-Zusammenfassungen und Themenerkennung verwendet. Auch der haiku-Alias der Subagenten nutzt es.`,"claude.smallFastModelUnsetOption":`Claude Code wählen lassen (natives Modell)`,"claude.smallFastModelNativeWarning":`Wenn kein Modell gewählt ist, setzt OpenCodex keine Hilfsmodell-Overrides. Claude Code kann dann sein natives Sonnet-Modell verwenden, wodurch Kosten bei deinem nativen Anbieter entstehen können.`,"claude.slotUnset":`Claude-Standard verwenden`,"claude.modelMap":`Modell-Abfangen`,"claude.modelMapHint":`Fängt Anfragen für ein bestimmtes Modell ab und leitet sie an das gewählte Modell um. Standardmäßig leer — wirkt erst mit einer Regel.`,"claude.mapFrom":`Originalmodell (z. B. claude-sonnet-4-5)`,"claude.mapTo":`Ersetzen durch (z. B. gemini/gemini-3-pro)`,"claude.addMapping":`Regel hinzufügen`,"claude.removeMapping":`Regel entfernen`,"claude.aliases":`Verfügbare Modelle`,"claude.aliasesHint":`Modelle, die im /model-Menü von Claude Code erscheinen.`,"claude.aliasProviderOther":`Sonstiges`,"claude.loading":`Lädt…`,"claude.loadFail":`Claude-Einstellungen konnten nicht geladen werden`,"claude.saved":`Gespeichert.`,"claude.saveFailed":`Speichern fehlgeschlagen`,"claude.networkError":`Netzwerkfehler — läuft der Proxy?`,"claude.toggleAria":`Claude-Verbindung umschalten`,"claude.none":`Keine`,"common.close":`Schließen`,"common.ok":`OK`,"app.logoAria":`opencodex-Logo`,"app.pageTitle":`{page} — opencodex`,"app.claudeOn":`Claude AN`,"app.claudeOff":`Claude AUS`,"usage.dayMon":`Mo`,"usage.dayWed":`Mi`,"usage.dayFri":`Fr`,"usage.heatmap.tooltipTokens":`{tokens} Tokens`,"usage.heatmap.tooltipRequests":`{requests} Anfragen`,"usage.chart.dayDetail":`{date}: {requests} Anfragen, {tokens} Token`,"usage.heatmap.keyboardLabel":`Mit Hoch und Runter tageweise, mit Links und Rechts wochenweise navigieren.`,"nav.storage":`Speicher`,"storage.title":`Speicher`,"storage.subtitle":`Zeigt, was CODEX_HOME belegt. Die Bereinigung lässt aktive Sitzungen unberührt.`,"storage.loading":`Speicher wird gescannt…`,"storage.empty":`CODEX_HOME ist leer oder fehlt — nichts zu berichten.`,"storage.error":`Speicher-Scan fehlgeschlagen. Prüfe, ob CODEX_HOME auf ein gültiges Verzeichnis zeigt.`,"storage.refresh":`Neu scannen`,"storage.rescanned":`Scan abgeschlossen.`,"storage.card.total":`Gesamtgröße`,"storage.card.files":`Dateien`,"storage.card.home":`CODEX_HOME`,"storage.snapshot.lastScan":`Letzter Scan`,"storage.snapshot.scanning":`Scanne…`,"storage.snapshot.unavailable":`Noch kein Scan.`,"storage.cleanupCard.title":`Speicher freigeben`,"storage.cleanupCard.tabs":`Bereinigungsoptionen`,"storage.cleanupCard.tab.policy":`Richtlinie`,"storage.cleanupCard.tab.quarantine":`Quarantäne`,"storage.cleanup.noArchives":`Keine archivierten Sitzungen zum Bereinigen.`,"storage.section.buckets":`Bereiche`,"storage.section.largest":`Größte Dateien`,"storage.workspace.overview":`Übersicht`,"storage.workspace.selectBucket":`Wähle einen Bucket aus der Liste, um die Aufschlüsselung zu sehen.`,"storage.col.bucket":`Bereich`,"storage.col.size":`Größe`,"storage.col.files":`Dateien`,"storage.col.oldest":`Älteste`,"storage.col.newest":`Neueste`,"storage.col.rows":`DB-Zeilen`,"storage.rows.unknown":`unbekannt (gesperrt)`,"storage.bucket.sessions":`Aktive Sitzungen`,"storage.bucket.archived_sessions":`Archivierte Sitzungen`,"storage.bucket.logs_db":`Log-Datenbank`,"storage.bucket.state_db":`Status-Datenbank`,"storage.bucket.attachments":`Anhänge`,"storage.bucket.deletion_manifests":`Lösch-Manifeste`,"storage.bucket.other":`Sonstiges`,"storage.cleanup.title":`Archivbereinigung`,"storage.cleanup.help":`Entfernt die ältesten archivierten Sitzungen nach Prozentsatz. Aktive Sitzungen werden nie angefasst. Standard ist Quarantäne — Dateien wandern nach CODEX_HOME/.trash.`,"storage.cleanup.slider":`Ältester Archivanteil`,"storage.cleanup.percent":`{percent}%`,"storage.cleanup.preset":`{percent}`,"storage.cleanup.preview":`Vorschau`,"storage.cleanup.confirmTitle":`Archivbereinigung bestätigen`,"storage.cleanup.confirmBody":`Es werden {count} archivierte Datei(en) (~{size}) verarbeitet, die ältesten {percent}%.`,"storage.cleanup.moreFiles":`…und {n} weitere`,"storage.cleanup.permanent":`Dauerhaft löschen (ohne Quarantäne)`,"storage.cleanup.permanentWarn":`Dauerhaftes Löschen kann nicht rückgängig gemacht werden.`,"storage.cleanup.quarantineNote":`Dateien wandern nach .trash unter CODEX_HOME. Du kannst sie im Tab Quarantäne wiederherstellen.`,"storage.cleanup.cancel":`Abbrechen`,"storage.cleanup.confirmQuarantine":`In Quarantäne`,"storage.cleanup.confirmPermanent":`Dauerhaft löschen`,"storage.cleanup.doneQuarantine":`{count} Datei(en) in Quarantäne ({size}).`,"storage.cleanup.donePermanent":`{count} Datei(en) dauerhaft gelöscht ({size}).`,"storage.cleanup.previewFailed":`Vorschau fehlgeschlagen.`,"storage.cleanup.cleanupFailed":`Bereinigung fehlgeschlagen.`,"storage.cleanup.err.codex_busy":`Codex verwendet state.sqlite — beende Codex und versuche es erneut.`,"storage.cleanup.err.stale_preview":`Archivdateien haben sich seit der Vorschau geändert — führe Vorschau erneut aus.`,"storage.cleanup.err.restore_pending_overlap":`Ausgewählte Archive überschneiden sich mit einer unvollständigen Wiederherstellung — zuerst Wiederherstellung abschließen oder erneut versuchen.`,"storage.cleanup.err.referenced_history":`Ausgewählte Archive werden noch von Fork- oder paginierter Historie referenziert.`,"storage.cleanup.err.invalid_digest":`Vorschaudigest fehlt oder ist ungültig.`,"storage.cleanup.err.invalid_mode":`Modus muss quarantine oder permanent sein.`,"storage.cleanup.err.fs_failed":`Dateisystem-Bereinigung fehlgeschlagen. Einige Änderungen können bereits angewendet sein — prüfen Sie CODEX_HOME/.trash und den angezeigten Wiederherstellungspfad.`,"storage.cleanup.err.fs_failed_trash":`Dateisystem-Bereinigung fehlgeschlagen. Einige Änderungen können bereits angewendet sein — prüfen Sie {trashDir} und manifest.json auf wiederherstellbare Dateien.`,"storage.cleanup.err.db_reconcile_failed":`Codex-Statusdatenbank konnte nicht aktualisiert werden.`,"storage.cleanup.err.cleanup_failed":`Bereinigung fehlgeschlagen.`,"storage.trash.title":`Quarantäne`,"storage.trash.help":`Archivierte Sitzungen in CODEX_HOME/.trash. Wiederherstellen legt JSONL-Dateien und Thread-Zeilen zurück.`,"storage.trash.empty":`Keine Quarantäne-Einträge.`,"storage.trash.loading":`Quarantäne wird geladen…`,"storage.trash.col.when":`Quarantäne seit`,"storage.trash.col.files":`Dateien`,"storage.trash.col.size":`Größe`,"storage.trash.col.mode":`Modus`,"storage.trash.col.id":`Eintrag`,"storage.trash.restore":`Wiederherstellen`,"storage.trash.confirmTitle":`Quarantäne-Eintrag wiederherstellen?`,"storage.trash.confirmBody":`{count} Datei(en) (~{size}) aus {id} zurück in archivierte Sitzungen legen.`,"storage.trash.cancel":`Abbrechen`,"storage.trash.confirmRestore":`Wiederherstellen`,"storage.trash.done":`{count} Datei(en) wiederhergestellt ({size}).`,"storage.trash.restoreFailed":`Wiederherstellung fehlgeschlagen.`,"storage.trash.listFailed":`Quarantäne-Einträge konnten nicht geladen werden.`,"storage.trash.mode.quarantine":`quarantine`,"storage.trash.mode.permanent":`permanent (unvollständig)`,"storage.trash.err.codex_busy":`Codex verwendet state.sqlite — beende Codex und versuche es erneut.`,"storage.trash.err.invalid_trash":`Trash-Eintrags-ID fehlt oder ist ungültig.`,"storage.trash.err.missing_trash":`Trash-Eintrag wurde nicht gefunden.`,"storage.trash.err.dest_exists":`Wiederherstellungsziel existiert bereits — entferne oder benenne die Archivdatei um und versuche es erneut.`,"storage.trash.err.fs_failed":`Dateisystem-Wiederherstellung fehlgeschlagen. Einige Dateien können bereits wiederhergestellt sein — prüfe archived_sessions und .trash.`,"storage.trash.err.storage_mutation_busy":`Eine andere Speicher-Bereinigung oder Wiederherstellung läuft — bitte kurz warten.`,"storage.trash.err.db_reconcile_failed":`Codex-Statusdatenbankzeilen konnten nicht wiederhergestellt werden.`,"storage.trash.err.restore_failed":`Wiederherstellung fehlgeschlagen.`,"storage.trash.err.restore_worker_timeout":`Wiederherstellung dauerte zu lange (über 10 Minuten) und wurde abgebrochen.`,"storage.trash.err.restore_worker_aborted":`Wiederherstellung wurde beim Herunterfahren abgebrochen.`,"storage.trash.err.restore_worker_failed":`Wiederherstellungs-Worker ist abgestürzt oder unerwartet fehlgeschlagen.`,"storage.policy.title":`Automatische Bereinigungsrichtlinie`,"storage.policy.help":`Optionale Stapelbereinigung, wenn archivierte Sitzungen einen Schwellwert überschreiten. Standardmäßig aus — wird nie automatisch aktiviert.`,"storage.policy.loading":`Richtlinie wird geladen…`,"storage.policy.loadFailed":`Bereinigungsrichtlinie konnte nicht geladen werden.`,"storage.policy.saveFailed":`Bereinigungsrichtlinie konnte nicht gespeichert werden.`,"storage.policy.runFailed":`Richtlinienlauf fehlgeschlagen.`,"storage.policy.alreadyRunning":`Ein Bereinigungsrichtlinienlauf läuft bereits.`,"storage.policy.invalid":`Ungültige Richtlinienwerte.`,"storage.policy.enabled":`Automatische Bereinigung aktivieren`,"storage.policy.enabledHint":`Standard ist aus. Bei Aktivierung nur nach gewähltem Zeitplan (oder Jetzt ausführen).`,"storage.policy.threshold":`Wenn Archivgröße größer als (GiB)`,"storage.policy.trigger":`Auslöser`,"storage.policy.target":`Bereinigungsziel`,"storage.policy.targetPercent":`Älteste Archive entfernen (%)`,"storage.policy.targetReduce":`Archivgröße reduzieren auf (GiB)`,"storage.policy.thresholdInc":`Schwellwert erhöhen`,"storage.policy.thresholdDec":`Schwellwert verringern`,"storage.policy.percentInc":`Prozent erhöhen`,"storage.policy.percentDec":`Prozent verringern`,"storage.policy.reduceInc":`Zielgröße erhöhen`,"storage.policy.reduceDec":`Zielgröße verringern`,"storage.policy.schedule":`Zeitplan`,"storage.policy.schedule.manual":`Nur manuell`,"storage.policy.schedule.startup":`Beim Proxy-Start`,"storage.policy.schedule.daily":`Täglich`,"storage.policy.schedule.weekly":`Wöchentlich`,"storage.policy.mode":`Löschmodus`,"storage.policy.mode.quarantine":`Quarantäne (Standard)`,"storage.policy.mode.permanent":`Endgültig löschen`,"storage.policy.permanentWarn":`Endgültiger Modus kann nicht rückgängig gemacht werden. Quarantäne bevorzugen, sofern unsicher.`,"storage.policy.lastRun":`Letzter Lauf`,"storage.policy.lastRunDetail":`{count} entfernt · {size} freigegeben`,"storage.policy.nextRun":`Nächster Lauf`,"storage.policy.never":`Nie`,"storage.policy.save":`Speichern`,"storage.policy.runNow":`Jetzt ausführen`,"storage.policy.running":`Läuft…`,"storage.policy.saved":`Richtlinie gespeichert.`,"storage.policy.skippedDisabled":`Richtlinie ist deaktiviert — zuerst aktivieren.`,"storage.policy.skippedUnder":`Archivgröße unter dem Schwellwert — nichts zu tun.`,"storage.policy.skippedEmpty":`Keine Archivkandidaten passend zum Ziel.`,"storage.policy.doneQuarantine":`Richtlinie hat {count} Datei(en) in Quarantäne ({size}).`,"storage.policy.donePermanent":`Richtlinie hat {count} Datei(en) endgültig gelöscht ({size}).`,"modal.back":`Zurück`,"modal.badge.oauth":`OAuth`,"modal.customProvider":`Benutzerdefinierter Anbieter`,"replitGateway.title":`Replit-Gateway-Begleiter`,"replitGateway.subtitle":`Verbinden Sie Ihr selbst bereitgestelltes Replit-Gateway und installieren Sie die gepaarten OpenAI-Chat- und Anthropic-Anbieter gemeinsam.`,"replitGateway.companionNote":`Dies ist ein benutzerdefinierter Begleit-Workflow, kein kanonisches Registry-Preset.`,"replitGateway.originLabel":`Bereitstellungs-Ursprung`,"replitGateway.originHint":`HTTPS-Ursprung Ihrer Replit-Bereitstellung (z. B. https://my-app.replit.app).`,"replitGateway.keyLabel":`Gateway-Schlüssel`,"replitGateway.keyHint":`Das REPLIT_GATEWAY_KEY-Geheimnis aus Ihrer Bereitstellung. Es wird in Ihrer lokalen Anbieterkonfiguration gespeichert und authentifiziert den Gateway-Datenverkehr.`,"replitGateway.keyTooShort":`Der Gateway-Schlüssel ist zu kurz (mindestens 32 Zeichen).`,"replitGateway.keyTooLong":`Der Gateway-Schlüssel darf höchstens 512 Zeichen lang sein.`,"replitGateway.keyInvalidChars":`Der Gateway-Schlüssel darf nur druckbare ASCII-Zeichen enthalten.`,"replitGateway.errorNetwork":`Der Proxy konnte nicht erreicht werden. Prüfen Sie, ob er läuft, und versuchen Sie es erneut.`,"replitGateway.errorMalformed":`Der Proxy hat eine ungültige Antwort zurückgegeben. Versuchen Sie es in Kürze erneut.`,"replitGateway.customDomainLabel":`Benutzerdefinierte Domain zulassen`,"replitGateway.customDomainHint":`Nur aktivieren, wenn Ihr Gateway nicht auf .replit.app gehostet wird.`,"replitGateway.setDefaultLabel":`replit nach der Installation als Standardanbieter festlegen`,"replitGateway.install":`Paar installieren`,"replitGateway.installing":`Installation…`,"replitGateway.close":`Schließen`,"replitGateway.openButton":`Replit-Gateway…`,"replitGateway.replaceTitle":`Bestehendes Replit-Paar ersetzen?`,"replitGateway.replaceBody":`Die Anbieter replit und replit-anthropic existieren bereits. Beim Ersetzen werden Gateway-Ursprung und Schlüssel überschrieben; Ihre Overlays bleiben erhalten.`,"replitGateway.replaceConfirm":`Paar ersetzen`,"replitGateway.replaceCancel":`Bestehendes behalten`,"replitGateway.probeHealth":`healthz: HTTP {status} ({ms} ms)`,"replitGateway.probeModels":`models: {count} gefunden ({ms} ms)`,"replitGateway.successTitle":`Das Replit-Gateway-Paar wurde installiert.`,"replitGateway.errorGeneric":`Das Replit-Gateway-Paar konnte nicht installiert werden.`,"replitGateway.errorCollision":`Das Replit-Anbieterpaar existiert bereits.`,"replitGateway.errorBusy":`Die Konfiguration ist ausgelastet. Versuchen Sie es in Kürze erneut.`,"replitGateway.originRequired":`Der Bereitstellungs-Ursprung ist erforderlich.`,"replitGateway.keyRequired":`Der Gateway-Schlüssel ist erforderlich.`,"modal.failedStatus":`Fehlgeschlagen ({status})`,"modal.loginError":`Login-Fehler: {error}`,"modal.badge.codexLogin":`Codex-Login`,"modal.badge.local":`Lokal`,"modal.badge.apiKey":`API-Schlüssel`,"modal.badge.direct":`Direct`,"modal.badge.pool":`Pool`,"modal.badge.free":`Kostenlos`,"modal.invalidPreset":`Diese integrierte Anbietervorlage ist unvollständig. Starten Sie den Proxy neu und versuchen Sie es erneut.`,"modal.freeTierTitle":`Kostenloser Tarif`,"modal.freeTierDefault":`Kein API-Schlüssel nötig. Funktioniert sofort.`,"modal.tab.accounts":`Konten`,"modal.tab.free":`Kostenlos`,"modal.tab.paid":`Bezahlt`,"modal.accountsHint":`Hier ChatGPT/Codex, OAuth-Provider und API-Key-Konten anmelden. OpenAI ist eingebaut — anmelden statt erneut hinzufügen.`,"modal.accountsCodexAuthLink":`Codex Auth`,"modal.notListed":`Provider nicht dabei? Eigenen hinzufügen`,"modal.catalogLoading":`Katalog wird geladen…`,"modal.catalogLoadFailed":`Anbieterkatalog konnte nicht geladen werden.`,"modal.accountLogin":`Anmelden`,"modal.accountLogout":`Abmelden`,"modal.accountAdd":`Konto hinzufügen`,"modal.accountManage":`Verwalten`,"modal.accountCodexPool":`ChatGPT-Kontopool`,"modal.accountLoggedIn":`Angemeldet`,"modal.accountLoggedOut":`Nicht angemeldet`,"quota.fiveHourLimit":`5-Stunden-Limit`,"quota.weeklyLimit":`Wochenlimit`,"quota.monthlyLimit":`30-Tage-Limit`,"quota.cursorFirstParty":`Erstanbieter-Modelle`,"quota.cursorApiUsage":`API-Nutzung`,"quota.totalSubscriptionCredits":`Gesamtes Abo-Guthaben`,"quota.creditsBalance":`Guthabenstand`,"quota.creditsPeriodEnds":`Abrechnungszeitraum endet am {date}`,"quota.usedPercent":`{pct} % genutzt`,"quota.limitReached":`Limit erreicht`,"quota.resetsToday":`Zurücksetzung heute um {time}`,"quota.resetsTomorrow":`Zurücksetzung morgen um {time}`,"quota.resetsAt":`Zurücksetzung {when}`,"quota.resetsRelativeMinutes":`Zurücksetzung in {n} Min.`,"quota.resetsRelativeHours":`Zurücksetzung in {n} Std.`,"pws.status.ready":`Bereit`,"pws.status.needsSetup":`Einrichtung nötig`,"pws.status.needsAttention":`Aufmerksamkeit nötig`,"pws.auth.chatgptPassthrough":`ChatGPT-Passthrough`,"pws.auth.noKey":`Kein Schlüssel nötig`,"pws.freeTitle":`Kostenlos (Schlüssel ggf. erforderlich)`,"pws.localTitle":`Lokale Laufzeit`,"pws.modelCountOne":`1 Modell`,"pws.modelCount":`{count} Modelle`,"pws.rail.suffixDefault":` · Standard`,"pws.rail.suffixLocal":` · lokal`,"pws.rail.suffixFree":` · kostenlos`,"pws.rail.selectAria":`{name} auswählen — {status}{suffix}`,"pws.searchPlaceholder":`Provider durchsuchen…`,"pws.filterAria":`Provider filtern`,"pws.providerFiltersAria":`Provider-Filter`,"pws.filters":`Filter`,"pws.filterStatus":`Status`,"pws.pricing":`Preis`,"pws.paid":`Bezahlt`,"pws.filterType":`Typ`,"pws.type.cloud":`Cloud`,"pws.type.local":`Lokal`,"pws.type.selfHosted":`Selbst gehostet`,"pws.type.login":`Login`,"pws.sort":`Sortierung`,"pws.sortProvidersAria":`Provider sortieren`,"pws.sort.az":`A–Z`,"pws.sort.za":`Z–A`,"pws.sort.freePaid":`Kostenlos zuerst`,"pws.sort.paidFree":`Bezahlt zuerst`,"pws.sort.accountsFirst":`Konten zuerst`,"pws.resetAll":`Alle zurücksetzen`,"pws.providerList":`Provider-Liste`,"pws.providersAria":`Provider`,"pws.groupReady":`Bereit ({count})`,"pws.groupNeedsSetup":`Einrichtung nötig ({count})`,"pws.groupDisabled":`Deaktiviert ({count})`,"pws.noSearchResults":`Keine Provider entsprechen der Suche.`,"pws.noMatchFilters":`Keine Provider entsprechen den Filtern.`,"pws.noProvidersConfigured":`Keine Provider konfiguriert.`,"pws.workspaceMainAria":`Provider-Details`,"pws.detailComingSoon":`Detailansicht folgt — nutze die klassische Ansicht zur Verwaltung.`,"pws.selectPrompt":`Wähle einen Provider aus der Liste.`,"pws.connectFirst":`Verbinde deinen ersten Provider`,"pws.empty.browseFree":`Kostenlose Provider ansehen`,"pws.empty.browseFreeDesc":`Ohne Abo starten`,"pws.empty.connectAccount":`Konto verbinden`,"pws.empty.connectAccountDesc":`ChatGPT- oder Provider-Login nutzen`,"pws.empty.addEndpoint":`Endpunkt hinzufügen`,"pws.empty.addEndpointDesc":`Eigene Base-URL und API-Schlüssel`,"pws.tab.overview":`Übersicht`,"pws.tab.models":`Modelle`,"pws.tab.usage":`Nutzung`,"pws.tab.accounts":`Konten`,"pws.tab.settings":`Einstellungen`,"pws.connection":`Verbindung`,"pws.status.connected":`Verbunden`,"pws.attentionTitle":`Aufmerksamkeit nötig`,"pws.attention.reauth":`Aktives Konto muss erneut authentifiziert werden`,"pws.attention.reauthForward":`Aktives Codex-Konto muss erneut authentifiziert werden — unter Konten beheben`,"pws.attention.missingCredentials":`Anmeldedaten fehlen`,"pws.cell.auth":`Authentifizierung`,"pws.cell.note":`Notiz`,"pws.cell.defaultModel":`Standardmodell`,"pws.statsAria":`Provider-Statistiken`,"pws.statsTitle":`Statistiken`,"pws.stats.totalRequests":`Anfragen (30 T.)`,"pws.stats.totalTokens":`Tokens (30 T.)`,"pws.stats.quotaUpdated":`Kontingent aktualisiert`,"pws.stats.quotaTracked":`Limits siehe Nutzungs-Tab.`,"pws.stats.source":`Quelle`,"pws.usageLast30d":`Nutzung (letzte 30 Tage)`,"pws.allAccounts":`Alle Konten`,"pws.estimatedCost":`Geschätzte Kosten`,"pws.costDisclaimer":`Schätzung basierend auf API-Listenpreisen, keine tatsächliche Abrechnung.`,"pws.modelBreakdown":`Modellaufschlüsselung`,"pws.col.model":`Modell`,"pws.col.cost":`Gesch. Kosten`,"pws.col.tokens":`Token`,"pws.col.requests":`Anfr.`,"pws.col.share":`Anteil`,"pws.tokenInput":`Eingabe`,"pws.tokenOutput":`Ausgabe`,"pws.metricRequests":`Anfragen`,"pws.metricTokens":`Tokens`,"pws.usageUnavailable":`Noch keine Nutzung erfasst.`,"pws.rateLimits":`Limits`,"pws.quotaUnavailable":`Keine Kontingentdaten für diesen Provider.`,"pws.accountQuotaUnavailable":`Ratenlimit-Daten vorübergehend nicht verfügbar; falls vorhanden, werden zuletzt bekannte Werte angezeigt.`,"pws.selected":`Ausgewählt`,"pws.copyModelId":`ID kopieren`,"pws.modelCopied":`Kopiert!`,"pws.modelsAvailable":`{count} verfügbar`,"pws.modelSearchPlaceholder":`Modelle filtern…`,"pws.modelsLoading":`Modelle werden geladen…`,"pws.modelsLoadFailed":`Modelle konnten nicht geladen werden.`,"pws.modelsNeedsReauth":`Konto muss neu angemeldet werden, bevor Live-Modelle geladen werden. Zeige konfigurierte Modelle.`,"pws.modelsConfiguredFallback":`Zeige konfigurierte Modelle (Live-Erkennung nicht verfügbar).`,"pws.modelsTruncated":`Zeige die ersten {shown} von {total} Modellen. Filtern, um die Liste einzugrenzen.`,"pws.retry":`Erneut versuchen`,"pws.noModels":`Keine Modelle für diesen Provider gefunden.`,"pws.noModelMatch":`Keine Modelle entsprechen dem Filter.`,"pws.adapterBaseRequired":`Adapter und Basis-URL sind erforderlich.`,"pws.addAccount":`Konto hinzufügen`,"pws.addKey":`API-Schlüssel hinzufügen`,"pws.apiKeys":`API-Schlüssel`,"pws.authMode":`Auth-Modus`,"pws.availableAccounts":`Verfügbare Konten`,"pws.accountOrdinal":`Konto {count}`,"pws.accountsLoading":`Konten werden geladen…`,"pws.accountsLoadFailed":`Konten konnten nicht geladen werden.`,"pws.retryAccounts":`Erneut versuchen`,"pws.noAccounts":`Noch keine Konten verbunden.`,"pws.cockpitImportDescription":`Importieren Sie einen Cockpit-Tools-Antigravity-JSON-Export von diesem Gerät. Der Dateiinhalt wird nicht angezeigt.`,"pws.cockpitImportFileLabel":`Cockpit-Tools-Antigravity-JSON-Export`,"pws.cockpitImportChooseFile":`JSON-Datei auswählen`,"pws.cockpitImporting":`Import wird ausgeführt…`,"pws.cockpitImportInvalid":`Die ausgewählte Datei ist kein gültiger JSON-Export oder zu groß.`,"pws.cockpitImportFailed":`Der Kontoimport konnte nicht abgeschlossen werden.`,"pws.cockpitImportComplete":`Import abgeschlossen: {imported} importiert, {updated} aktualisiert, {failed} fehlgeschlagen, {unsupported} nicht unterstützt.`,"pws.accountSwitching":`Wechsel läuft…`,"pws.accountCurrent":`Aktuelles Konto`,"pws.defaultModelNone":`Keins (Standard des Anbieters verwenden)`,"pws.discardSettings":`Verwerfen`,"pws.jsonEditorDesc":`Bearbeiten Sie die JSON-Konfiguration des Anbieters. Änderungen werden sofort gespeichert.`,"pws.jsonEditorTitle":`JSON-Editor — {name}`,"pws.jsonRestore":`Wiederherstellen`,"pws.jsonSave":`Speichern`,"pws.loggedInTitle":`Angemeldet`,"pws.notLoggedInTitle":`Nicht angemeldet`,"pws.note":`Notiz`,"pws.allowPrivateNetwork":`Lokales/privates Netzwerk erlauben`,"pws.liveModels":`Modelle beim Anbieter erkennen`,"pws.liveModelsDesc":`Lädt den Live-Modellkatalog des Anbieters. Ausschalten, um nur konfigurierte statische Modelle zu verwenden.`,"pws.xaiResponsesOptIn":`Responses API für Grok 4.5 und 4.6 verwenden`,"pws.xaiResponsesOptInDesc":`Leitet beide Modelle über openai-responses. Andere Grok-Modelle und das Tier-Verhalten bleiben unverändert.`,"pws.xaiResponsesOptInMixed":`Teilweise aktiviert.`,"pws.cursorTransport":`Cursor-Transport`,"pws.cursorTransportHttp2":`HTTP/2 (Standard)`,"pws.cursorTransportHttp1":`HTTP/1.1 (Proxy-Kompatibilität)`,"pws.cursorTransportDesc":`Verwenden Sie HTTP/1.1, wenn Ihr Proxy den HTTP/2-Stream von Cursor nicht zuverlässig überträgt.`,"pws.optionalPlaceholder":`Optional`,"pws.providerId":`Anbieter-ID`,"pws.reauth":`Erneute Anmeldung erforderlich`,"pws.reauthenticate":`Erneut authentifizieren`,"pws.clearCooldown":`Abklingzeit löschen`,"pws.copyDoctor":`ocx doctor kopieren`,"pws.doctorCopied":`Kopiert`,"pws.healthCooldownHint":`Warten Sie, bis die Abkühlzeit endet. Prüfen Sie dieses Konto noch nicht.`,"pws.doctorCopyUnavailable":`Zwischenablage nicht verfügbar`,"pws.healthLabel.rateLimited":`Ratelimit`,"pws.healthLabel.quotaLimited":`Kontingent begrenzt`,"pws.healthLabel.reauthRequired":`Erneute Anmeldung erforderlich`,"pws.healthLabel.refreshFailed":`Aktualisierung fehlgeschlagen`,"pws.healthLabel.metadataMismatch":`Metadaten stimmen nicht überein`,"pws.healthLabel.credentialConflict":`Anmeldedaten-Konflikt`,"pws.healthSummary.rateLimited":`{provider} {account}: ratelimited bis {until}. Routing für dieses Konto ist bis dahin pausiert.`,"pws.healthSummary.quotaLimited":`{provider} {account}: Kontingent begrenzt bis {until}. Routing für dieses Konto ist bis dahin pausiert.`,"pws.healthSummary.reauthRequired":`{provider} {account}: erneute Anmeldung erforderlich.`,"pws.healthSummary.credentialConflict":`{provider} {account}: Anmeldedaten-Konflikt.`,"pws.healthSummary.metadataMismatch":`{provider} {account}: Metadaten stimmen nicht überein.`,"pws.healthSummary.staleCredentials":`{provider} {account}: unvollständige Anmeldedaten.`,"pws.removeConfirm":`Entfernen`,"pws.removeConfirmBody":`Anbieter "{name}" entfernen? Dies kann nicht rückgängig gemacht werden.`,"pws.removeDefaultConfirmBody":`Standardanbieter "{name}" entfernen? "{defaultProvider}" wird zum Standardanbieter. Dies kann nicht rückgängig gemacht werden.`,"pws.removeConfirmTitle":`Anbieter entfernen`,"pws.saveSettings":`Speichern`,"pws.pacingTitle":`Anfragetaktung`,"pws.pacingDesc":`Verteilt ausgehende Anfragestarts für diesen Anbieter gleichmäßig. Streaming-Antworten dürfen sich überlappen.`,"pws.pacingEnabled":`Aktiviert`,"pws.pacingRpm":`Anfragen pro Minute`,"pws.pacingRpmUnit":`RPM`,"pws.pacingDelay":`Mindestintervall (ms)`,"pws.pacingJitter":`Zufällige Streuung (ms)`,"pws.pacingSlowerWins":`Das langsamere Anbieterlimit gilt. Modellregeln können nur stärker verzögern.`,"pws.pacingQueued":`in Warteschlange`,"pws.pacingNextSlot":`bis zum nächsten Slot`,"pws.pacingLastModel":`letztes Modell`,"pws.pacingNone":`Keine`,"pws.pacingModelOverrides":`Modellregeln`,"pws.pacingModel":`Modell`,"pws.pacingAdd":`Regel hinzufügen`,"pws.pacingRemove":`Entfernen`,"pws.pacingRemoveModel":`Anfragetaktung für {model} entfernen`,"pws.pacingRuleRequired":`Legen Sie zuerst ein Anbieterlimit oder eine Modellregel fest.`,"pws.antigravityTlsTitle":`Antigravity-Browser-TLS-Profil`,"pws.antigravityTlsEnable":`Experimentelle TLS/HTTP2-Emulation aktivieren`,"pws.antigravityTlsWarning":`Inoffizielle Kompatibilitätsfunktion. Sie gewährleistet keine Einhaltung der Nutzungsbedingungen und verhindert keine Sperrung, kann den Datenverkehr auffälliger machen und bei Initialisierungsfehlern auf Bun zurückfallen. Offizielle Gemini-API-Key-, Vertex- oder dokumentierte Code-Assist-Routen sind sicherere Optionen.`,"pws.antigravityTlsConfirm":`Das experimentelle, inoffizielle Antigravity-TLS-Profil aktivieren? Es gewährleistet keine Richtlinienkonformität und verhindert keine Sperrung. Fortfahren?`,"pws.antigravityTlsStatus":`TLS-Profilstatus: {status}`,"pws.antigravityTlsDisabled":`Deaktiviert`,"pws.antigravityTlsActive":`Aktiv`,"pws.antigravityTlsFallback":`Fallback`,"pws.saving":`Wird gespeichert…`,"pws.settingsSaved":`Einstellungen gespeichert.`,"pws.accountModeSaved":`Kontomodus gespeichert.`,"pws.accountModeFailed":`Kontomodus konnte nicht gewechselt werden.`,"pws.accountModeConfirm":`OpenAI-Kontomodus wechseln? Laufende Unterhaltungen werden dem anderen Kontosatz zugeordnet und die Quotennutzung wird unter dem neuen Modus erfasst.`,"pws.settingsUnsavedBar":`Es gibt ungespeicherte Änderungen.`,"pws.unsavedLeaveBody":`Es gibt ungespeicherte Änderungen. Vor dem Verlassen speichern?`,"pws.unsavedLeaveTitle":`Ungespeicherte Änderungen`,"pws.attentionRequired":`Aufmerksamkeit erforderlich`,"pws.attentionAria":`{name}: {reason}`,"pws.missingCredentials":`Zugangsdaten fehlen`,"pws.editJsonDesc":`Rohe Proxy-Konfiguration als JSON bearbeiten`,"pws.updatesUnavailable":`Anbieter-Updates sind nicht verfügbar.`,"pws.dashboard.title":`Anbieterübersicht`,"pws.dashboard.subtitle":`Verwalten Sie alle Ihre Modellanbieter an einem Ort.`,"pws.dashboard.rateLimits":`RATE LIMITS`,"pws.capacity.estimate":`Pool-Schätzung anhand konfigurierter Gewichtungen`,"pws.capacity.currentAccount":`Aktuelles effektives Konto`,"pws.capacity.nextRecovery":`Nächste Kapazitätswiederherstellung`,"pws.capacity.recoveryShare":`+{percent} % Pool-Kapazität`,"pws.capacity.incomplete":`Unvollständige Abdeckung: {excluded} Konten ausgeschlossen, davon {unknown} mit unbekanntem Tarif`,"pws.capacity.partial":`Teilweise Fensterabdeckung: {count} Konten melden nicht jedes angezeigte Limitfenster`,"pws.capacity.windowPartial":`Teilweise`,"pws.capacity.windowPartialA11y":`{window}: unvollständige Kontoabdeckung`,"pws.dashboard.recentlyUsed":`KÜRZLICH VERWENDET`,"pws.dashboard.requests":`{count} Anfragen`,"pws.dashboard.checkedAgo":`Geprüft {time}`,"pws.dashboard.noQuota":`Keine Kontingentdaten`,"pws.dashboard.noUsage":`Noch keine Nutzungsdaten`,"pws.dashboard.noRateLimits":`Noch keine Limit-Daten`,"pws.allProviders":`Anbieterübersicht`,"pws.enabledLabel":`Aktiviert`,"pws.testConnection":`Verbindung testen`,"pws.testing":`Teste…`,"pws.connectionOk":`Verbindung OK`,"pws.connectionFailed":`Verbindung fehlgeschlagen`,"pws.connectionNotApplicable":`Nicht zutreffend — dieser Anbieter verwendet einen statischen Modellkatalog.`,"pws.editSettings":`Einstellungen bearbeiten`,"pws.viewUsage":`Detaillierte Nutzung anzeigen`,"pws.allSystemsOk":`Alle Systeme betriebsbereit`,"pws.apiKeyConfigured":`API-Schlüssel konfiguriert`,"pws.addApiKey":`API-Schlüssel hinzufügen`,"pws.loggedInAs":`Angemeldet als {email}`,"pws.notLoggedIn":`Nicht angemeldet`,"pws.passthrough":`Codex-Passthrough`,"pws.notes":`NOTIZEN`,"pws.notePlaceholder":`Notiz zu diesem Anbieter hinzufügen...`,"pws.noteSaved":`Notiz gespeichert`,"pws.authSummary":`AUTHENTIFIZIERUNG`,"pws.aiStudio":`AI Studio`,"pws.aiStudio.connected":`Verbunden`,"pws.aiStudio.checking":`Sitzung wird geprüft`,"pws.aiStudio.unsupported":`Native Anmeldung auf dieser Plattform nicht unterstützt`,"pws.aiStudio.needsReauth":`Erneute Anmeldung erforderlich`,"pws.aiStudio.reauthenticated":`Erfolgreich erneut angemeldet`,"pws.aiStudio.loginFailed":`Native Anmeldung fehlgeschlagen`,"pws.aiStudio.connect":`Verbinden`,"time.justNow":`Gerade eben`,"time.notChecked":`Nicht geprüft`,"time.minutesAgo":`vor {n} Min.`,"time.hoursAgo":`vor {n} Std.`,"time.daysAgo":`vor {n} T.`,"modal.noMatch":`Kein Treffer.`,"modal.oauthDefaultNote":`Mit deinem Konto anmelden — kein API-Schlüssel nötig.`,"modal.oauthComingSoon":`OAuth-Login für {label} kommt im nächsten Update. Nutze vorerst einen API-Schlüssel.`,"modal.oauthComingSoonShort":`OAuth-Login für diesen Anbieter kommt im nächsten Update — nutze vorerst einen API-Schlüssel.`,"modal.useApiKeyInstead":`Stattdessen API-Schlüssel verwenden`,"modal.setupGuide":`Einrichtungsanleitung`,"modal.setupStep1Prefix":`Gehe zu`,"modal.setupDashboardLink":`{label}-Dashboard`,"modal.setupStep1Suffix":`und kopiere deinen API-Schlüssel`,"modal.setupStep2":`Füge ihn unten in das API-Schlüssel-Feld ein`,"modal.setupStep3":`Klicke auf Anbieter hinzufügen — Modelle werden automatisch erkannt`,"modal.namePlaceholder":`z. B. openrouter`,"modal.duplicateWarn":`Anbieter "{name}" existiert und wird überschrieben.`,"modal.forwardHintPrefix":`Kein Schlüssel nötig — der Proxy leitet deine`,"modal.forwardCredentials":`codex login`,"modal.forwardHintSuffix":`Anmeldedaten an diesen Anbieter weiter.`,"modal.localHint":`Es wird kein API-Schlüssel gespeichert. Damit wird Cursors öffentlicher Modellkatalog für Codex hinzugefügt; live Cursor-Transport und native Datei-/Shell-Ausführung bleiben deaktiviert, bis sie geprüft sind.`,"modal.getApiKey":`{label}-API-Schlüssel holen`,"modal.apiKey":`API-Schlüssel`,"modal.apiKeyTransport":`API-Schlüssel-Header`,"modal.apiKeyTransportNative":`x-api-key (Anthropic-Standard)`,"modal.apiKeyTransportBearer":`Authorization: Bearer`,"modal.apiKeyPlaceholder":`sk-… (oder $ENV_VAR)`,"modal.defaultModelPlaceholder":`z. B. gpt-5.5`,"modal.baseUrlPlaceholder":`https://...`,"modal.baseUrlPlaceholderError":`Base-URL enthält einen ungelösten {placeholder}. Ersetze ihn durch deinen tatsächlichen Wert.`,"modal.baseUrlPlaceholderHint":`Ersetze den {placeholder} in der Base-URL durch deine tatsächliche Account-ID, bevor du hinzufügst.`,"modal.adding":`Wird hinzugefügt…`,"modal.useOauthLogin":`← OAuth-Login verwenden`,"codexAuth.addIdPlaceholder":`codex-work, codex-alt, team…`,"codexAuth.resetCreditsAria":`{count} Reset-Guthaben`,"claude.pageTitle":`Claude Code`,"claude.workspace.settings":`Einstellungen`,"cws.loading":`Combos werden geladen…`,"cws.loadFailed":`Combos konnten nicht geladen werden.`,"cws.saveFailed":`Combo konnte nicht gespeichert werden.`,"cws.removeFailed":`Combo konnte nicht entfernt werden.`,"cws.saved":`Combo gespeichert.`,"cws.created":`{model} erstellt.`,"cws.removed":`combo/{id} entfernt.`,"cws.renamed":`{from} wurde in {to} umbenannt.`,"cws.add":`Combo hinzufügen`,"cws.addTitle":`Combo hinzufügen`,"cws.addSubtitle":`Erstellen Sie ein virtuelles Modell über mehrere Anbieter und wählen Sie den exakten Modellnamen für Clients.`,"cws.create":`Combo erstellen`,"cws.railAria":`Combo-Liste`,"cws.searchPlaceholder":`Combos oder Ziele suchen…`,"cws.noSearchResults":`Keine Combos passen zur Suche.`,"cws.group.failover":`Failover`,"cws.group.roundRobin":`Round-Robin`,"cws.targetCount":`{count} Ziele`,"cws.targetCountOne":`1 Ziel`,"cws.overviewTitle":`Combos`,"cws.overviewBlurb":`Virtuelle Modelle mit Failover über Anbieter/Modell-Ziele oder deterministischem Smooth Weighted Round-Robin.`,"cws.count.total":`Gesamt`,"cws.count.failover":`Failover`,"cws.count.roundRobin":`Round-Robin`,"cws.howTitle":`So funktioniert es`,"cws.howBody":`Fordern Sie in Codex den öffentlichen Modellnamen der Combo an. Ohne eigenen Namen gilt combo/<id>. OpenCodex wählt ein Ziel und springt nur bei wiederholbaren Upstream-Fehlern. Ist kein Ziel verfügbar, schlägt die Anfrage geschlossen fehl, statt den globalen Standardanbieter zu verwenden.`,"cws.attentionTitle":`Aufmerksamkeit nötig`,"cws.attention.empty":`Keine Ziele konfiguriert`,"cws.attention.few":`Nur ein Ziel — Failover hat kein Ersatzziel`,"cws.attention.catalogOmitted":`Fehlt im Modellkatalog — Mitgliederfähigkeiten sind unvollständig oder inkompatibel (fehlendes Context-Window/Metadaten oder leere Modalitäts-Schnittmenge). Routing per Alias funktioniert weiterhin`,"cws.attention.allTargetsExhausted":`Alle aktivierten Ziele haben ihr Kontingent ausgeschöpft`,"cws.emptyTitle":`Erste Combo erstellen`,"cws.empty.createDesc":`Virtuelles Modell benennen und zwei oder mehr Backends verketten.`,"cws.backToAll":`Zurück zu allen Combos`,"cws.allCombos":`Alle Combos`,"cws.copyModel":`ID kopieren`,"cws.copied":`Kopiert`,"cws.tabsLabel":`Combo-Detailbereiche`,"cws.tab.config":`Konfiguration`,"cws.tab.about":`Info`,"cws.strategy":`Strategie`,"cws.strategy.failover":`Failover`,"cws.strategy.roundRobin":`Round-Robin`,"cws.strategy.failoverHint":`Ziele der Reihe nach versuchen. Bei einem wiederholbaren Fehler (Limit, Ausfall, Abo-Sperre) zum nächsten springen.`,"cws.strategy.roundRobinHint":`Datenverkehr deterministisch nach Gewicht verteilen. Das gewählte Ziel für einen Block erfolgreicher Anfragen behalten und dann weiterschalten.`,"cws.field.id":`Combo-ID`,"cws.field.idHintEdit":`Das Ändern der ID benennt die Combo um. Clients fordern {model} an.`,"cws.field.alias":`Öffentlicher Modellname`,"cws.field.aliasPlaceholder":`deepseek-v4-flash oder vendor/model`,"cws.field.aliasHint":`Optional. Verwenden Sie einen Namen ohne Präfix, ein eigenes Präfix wie vendor/model oder lassen Sie das Feld leer für combo/<id>.`,"cws.field.nativeAlias":`Natives OpenAI-Alias`,"cws.field.nativeAliasHint":`Lässt diese Combo eine unterstützte unqualifizierte native OpenAI-Modell-ID übernehmen. Konto- und providerqualifizierte OpenAI-Routen bleiben getrennt.`,"cws.field.displayName":`Anzeigename`,"cws.field.displayNameHint":`Bezeichnung im Modell-Picker. Erforderlich, wenn das native OpenAI-Alias aktiviert ist.`,"cws.field.idHint":`Clients fordern {model} an`,"cws.field.idInternalHint":`Interne Combo-ID. Sie kann nach dem Erstellen geändert werden.`,"cws.field.stickyLimit":`Sticky-Erfolge vor Rotation`,"cws.field.stickyLimitHint":`Das gewählte Ziel für so viele erfolgreiche Anfragen behalten, bevor die gewichtete Auswahl weiterschaltet.`,"cws.field.defaultEffort":`Standard-Reasoning`,"cws.field.defaultEffortNone":`Keine (Ziel-Standard)`,"cws.field.defaultEffortHint":`Nur verwendet, wenn der Client keinen Reasoning-Aufwand sendet. Optionen sind die Schnittmenge der beworbenen Aufwände der gewählten Ziele.`,"cws.capability.imageInputUnavailable":`Erst verfügbar, wenn jedes gewählte Ziel Bildeingabe unterstützt.`,"cws.capability.imageInputHint":`Standardmäßig aktiv, wenn jedes Ziel Bilder unterstützt. Ausschalten für nur Text.`,"cws.capability.imageInput":`Bild / multimodal`,"cws.capabilities":`Fähigkeiten`,"cws.field.defaultEffortUnsupported":`Dieser Aufwand liegt nicht in der gemeinsamen Leiter der Ziele — er wird zur Anfragezeit ignoriert oder angepasst.`,"cws.field.defaultEffortUnsupportedOption":`nicht in der Schnittmenge`,"cws.targets":`Ziele`,"cws.targets.failoverHint":`Reihenfolge zählt — das erste ist primär.`,"cws.targets.roundRobinHint":`Gewichte steuern die deterministische relative Auswahl; die Reihenfolge löst Gleichstände im Rotationsring.`,"cws.target.provider":`Anbieter`,"cws.target.model":`Modell`,"cws.target.weight":`Gewicht`,"cws.target.pickProvider":`Anbieter wählen…`,"cws.target.pickProviderFirst":`Zuerst Anbieter wählen…`,"cws.target.pickModel":`Modell wählen…`,"cws.target.noModels":`Keine Modelle für diesen Anbieter`,"cws.target.modelPlaceholder":`Modell-ID`,"cws.target.add":`Ziel hinzufügen`,"cws.target.drag":`Ziehen zum Umsortieren`,"cws.target.moveUp":`Nach oben`,"cws.target.moveDown":`Nach unten`,"cws.quota.available":`Verfügbar`,"cws.quota.exhausted":`Kontingent erschöpft`,"cws.quota.unknown":`Kontingent unbekannt`,"cws.quota.allExhausted":`Alle aktivierten Ziele haben ihr Kontingent ausgeschöpft. Wählen Sie ein anderes Ziel oder warten Sie auf die Erholung.`,"cws.aboutTitle":`Laufzeit`,"cws.aboutBody":`Fehlgeschlagene Ziele kühlen kurz ab; Retry-After wird beachtet. Ungültige oder Kontextfehler springen nicht. Jedes Ziel passt den Aufwand an seine Fähigkeiten an; erschöpfte Combos schlagen geschlossen fehl. Protokolle und Nutzung behalten geordnete physische Versuche samt Nutzung je Versuch.`,"cws.removeConfirmTitle":`{model} entfernen?`,"cws.removeConfirmDesc":`Entfernt das virtuelle Modell aus Config und Codex-Katalog. Anbieter bleiben erhalten.`,"cws.unsavedTitle":`Ungespeicherte Änderungen`,"cws.unsavedDesc":`Änderungen an dieser Combo verwerfen und fortfahren?`,"cws.keepEditing":`Weiter bearbeiten`,"cws.err.missingId":`Combo-ID ist erforderlich.`,"cws.err.invalidId":`ID muss mit Buchstabe/Zahl beginnen und darf nur Buchstaben, Zahlen, Punkte, Unterstriche oder Bindestriche enthalten (max. 64).`,"cws.err.duplicateId":`Eine Combo mit dieser ID existiert bereits.`,"cws.err.invalidAlias":`Der Alias darf nur Buchstaben, Zahlen, Punkte, Unterstriche oder Bindestriche enthalten, mit höchstens einem "/"-Segment.`,"cws.err.aliasReservedNamespace":`Der Alias darf den reservierten Namensraum "combo/" nicht verwenden.`,"cws.err.aliasNativeFamily":`Einfache Aliase aus der OpenAI-nativen Familie (gpt-*, o1-*, o3-*, o4-*, codex-*) sind nicht erlaubt.`,"cws.err.unsupportedNativeAlias":`Ein nativer Alias muss eine derzeit unterstützte, unqualifizierte OpenAI-Modell-ID sein.`,"cws.err.missingNativeAliasDisplayName":`Für native Aliase ist ein Anzeigename erforderlich.`,"cws.err.invalidDisplayName":`Der Anzeigename darf höchstens 128 Zeichen und keine Steuerzeichen enthalten.`,"cws.err.duplicateAlias":`Eine andere Combo verwendet diesen Alias bereits.`,"cws.err.noTargets":`Mindestens ein Ziel hinzufügen.`,"cws.err.incompleteTarget":`Jedes Ziel braucht Anbieter und Modell.`,"cws.target.disabled":`{name} (deaktiviert)`,"cws.err.reservedNamespace":`Ein physischer Anbieter namens combo muss vor dem Erstellen von Combos umbenannt werden.`,"cws.err.providerCollision":`Die Combo-ID kollidiert mit einem konfigurierten Anbieternamen.`,"cws.err.unknownProvider":`Jedes Ziel muss einen konfigurierten Anbieter verwenden.`,"cws.err.duplicateTarget":`Dasselbe Anbieter/Modell-Ziel darf nur einmal vorkommen.`,"cws.err.invalidStickyLimit":`Sticky-Erfolge müssen eine Ganzzahl von 1 bis 100 sein.`,"cws.err.invalidWeight":`Jedes Round-Robin-Gewicht muss eine Ganzzahl von 1 bis 10000 sein.`,"cws.err.noEnabledTarget":`Mindestens ein Ziel muss einen aktivierten Anbieter verwenden.`,"claude.tabsLabel":`Claude-Client`,"claude.tabCode":`Code`,"claude.tabDesktop":`Desktop`,"claudeDesktop.title":`Claude Desktop`,"claudeDesktop.subtitle":`Leite jede Claude-Modellfamilie über ein verfügbares Modell auf Port {port}.`,"claudeDesktop.importJson":`JSON importieren`,"claudeDesktop.exportJson":`JSON exportieren`,"claudeDesktop.loading":`Claude-Desktop-Profil wird geladen…`,"claudeDesktop.loadFail":`Claude-Desktop-Profil konnte nicht geladen werden.`,"claudeDesktop.retry":`Erneut versuchen`,"claudeDesktop.saveFailed":`Claude-Desktop-Profil konnte nicht gespeichert werden.`,"claudeDesktop.applyFailed":`Das Profil wurde gespeichert, konnte aber nicht angewendet werden.`,"claudeDesktop.updateFailed":`Claude-Desktop-Aktualisierung fehlgeschlagen.`,"claudeDesktop.savedApplied":`Profil gespeichert und auf Claude Desktop angewendet.`,"claudeDesktop.appliedMarkerUnsaved":`Auf Claude Desktop angewendet, aber die Anwendungsmarkierung wurde nicht gespeichert – der Status unten kann veraltet sein, bis Sie erneut anwenden.`,"claudeDesktop.savedAppliedAnnounce":`Claude-Desktop-Profil gespeichert und angewendet.`,"claudeDesktop.saved":`Profil gespeichert.`,"claudeDesktop.savedAnnounce":`Claude-Desktop-Profil gespeichert.`,"claudeDesktop.exported":`Profil als JSON exportiert.`,"claudeDesktop.importExpected":`Ein Claude-Desktop-Profil der Version 1 wurde erwartet.`,"claudeDesktop.importReady":`JSON importiert. Prüfe den Entwurf und speichere und wende ihn dann an.`,"claudeDesktop.importedAnnounce":`Profil-JSON importiert. Ungespeicherte Änderungen können geprüft werden.`,"claudeDesktop.importInvalid":`Die ausgewählte Datei ist kein gültiges Profil.`,"claudeDesktop.importFailed":`Import fehlgeschlagen. {error}`,"claudeDesktop.moved":`{route} wurde nach {family} verschoben.`,"claudeDesktop.unsaved":`Ungespeicherte Änderungen`,"claudeDesktop.upToDate":`Profil ist aktuell`,"claudeDesktop.saving":`Speichert…`,"claudeDesktop.applying":`Wird angewendet…`,"claudeDesktop.saveApply":`Speichern & anwenden`,"claudeDesktop.emptyTitle":`Keine Modelle verfügbar`,"claudeDesktop.emptyHint":`Füge einen Anbieter hinzu oder aktiviere ihn und weise dann Claude-Desktop-Routen zu.`,"claudeDesktop.assignmentsLabel":`Zuweisungen der Claude-Modellfamilien`,"claudeDesktop.family.opus":`Opus`,"claudeDesktop.family.fable":`Fable`,"claudeDesktop.family.sonnet":`Sonnet`,"claudeDesktop.family.haiku":`Haiku`,"claudeDesktop.modelCountOne":`{count} Modell`,"claudeDesktop.modelCountMany":`{count} Modelle`,"claudeDesktop.chooseDefault":`Standard wählen`,"claudeDesktop.temporaryDefault":`Temporärer Standard`,"claudeDesktop.laneEmpty":`Modell hier ablegen oder die Verschieben-Steuerung verwenden.`,"claudeDesktop.laneNoMatch":`Kein Modell dieser Familie passt zur Suche.`,"nav.grok":`Grok`,"grok.title":`Grok Build`,"grok.subtitle":`Modelle, die opencodex in deiner Grok-Konfiguration registriert hat.`,"grok.loading":`Grok-Status wird geladen…`,"grok.loadFail":`Die Grok-Konfiguration konnte nicht gelesen werden.`,"grok.notConfiguredTitle":`Grok Build ist nicht eingerichtet`,"grok.notConfiguredHint":`Starte den Proxy mit installiertem Grok neu; opencodex schreibt dann einen verwalteten Block nach:`,"grok.endpoint":`Endpunkt`,"grok.colModel":`Modell`,"grok.colAlias":`Grok-Alias`,"grok.colContext":`Kontext`,"grok.groupNative":`Native Modelle`,"grok.groupRouted":`Geroutete Modelle`,"grok.enabledCount":`{on} von {total} registriert`,"grok.saved":`Auswahl gespeichert.`,"grok.savedApplied":`Auswahl gespeichert und in die Grok-Konfiguration geschrieben.`,"grok.saveFailed":`Grok-Auswahl konnte nicht gespeichert werden.`,"grok.applyFailed":`Auswahl gespeichert, aber die Grok-Konfiguration konnte nicht aktualisiert werden.`,"grok.applySkipped":`Auswahl gespeichert. Die Grok-Konfiguration wurde nicht geändert.`,"grok.saveApply":`Speichern & anwenden`,"grok.saving":`Speichern…`,"grok.applying":`Anwenden…`,"grok.unsaved":`Ungespeicherte Änderungen`,"grok.upToDate":`Auswahl ist aktuell`,"grok.toggleModel":`{id} bei Grok registrieren`,"claudeDesktop.available":`Verfügbar`,"claudeDesktop.defaultBadge":`Standard`,"claudeDesktop.supports1m":`1M`,"claudeDesktop.unavailable":`Nicht verfügbar`,"claudeDesktop.contextM":`{n}M Kontext`,"claudeDesktop.contextK":`{n}k Kontext`,"claudeDesktop.contextUnknown":`Kontext unbekannt`,"claudeDesktop.alias":`Alias`,"claudeDesktop.useAsDefault":`Als {family}-Standard verwenden`,"claudeDesktop.moveTo":`Verschieben nach`,"claudeDesktop.move":`Verschieben`,"claudeDesktop.status.applied":`Auf Desktop angewendet`,"claudeDesktop.status.stale":`Konfiguration veraltet — erneut anwenden`,"claudeDesktop.status.notApplied":`Nicht angewendet`,"claudeDesktop.status.notActiveProfile":`Desktop nutzt ein anderes Profil — erneut anwenden`,"claudeDesktop.status.disabled":`Die Claude-Desktop-Integration ist deaktiviert. Beende Desktop nach dem Aktivieren vollständig und öffne es erneut.`,"claudeDesktop.enableApply":`Aktivieren und anwenden`,"claudeDesktop.health.lastRequest":`Letzte Anfrage`,"claudeDesktop.health.stats":`{count} Anf. / {errors} Fehl.`,"claudeDesktop.effort.supported":`effort`,"claudeDesktop.effort.displayOnly":`effort (nur Anzeige)`,"dash.injectionManage":`Einstellungen öffnen`,"sub.settings":`Einstellungen`,"sub.sections":`Subagent-Abschnitte`,"sub.delegation.model":`Zuerst aufgerufenes Modell`,"sub.delegation.modelHint":`Das Modell, zu dem Codex zuerst greift, wenn es Arbeit übergibt. Oben steht, wen es überhaupt aufrufen darf; hier wählst du den Ersten davon.`,"dash.syncModelsHint":`Schreibt Codex' Modellkatalog anhand deiner verbundenen Provider neu.`,"dash.syncRun":`Jetzt synchronisieren`,"lab.title":`Kompatibilitäts-Labor`,"lab.subtitle":`Schreibgeschützte Kompatibilitätsmatrix aus der Lab-Projektion.`,"lab.loadFailed":`Kompatibilitäts-Lab-Daten konnten nicht geladen werden`,"lab.projectionUnavailable":`Lab-Projektion ist nicht verfügbar. Führen Sie zuerst Konformitäts- oder Live-Probes aus.`,"lab.projectionIncompatible":`Lab-Projektionsschema ist inkompatibel. Projektion neu aufbauen.`,"lab.statusTitle":`Projektionsstatus`,"lab.matrixTitle":`Kompatibilitätsmatrix`,"lab.verdictsTitle":`Urteilsdatensätze`,"lab.filter.layer":`Evidenzschicht`,"lab.filter.verdict":`Urteil`,"lab.filter.subject":`Subject-ID`,"lab.filter.all":`Alle`,"lab.col.subject":`Subject`,"lab.col.layer":`Schicht`,"lab.col.suite":`Suite`,"lab.col.verdict":`Urteil`,"lab.col.asOf":`Stand`,"lab.col.protocol":`Protokollkonformität`,"lab.col.live":`Live-Route-Kompatibilität`,"lab.col.task":`Aufgabenwirksamkeit`,"lab.empty":`Noch keine Kompatibilitätsurteile in der Projektion.`,"lab.subjectKind":`Art`,"lab.observationCount":`Beobachtungen`,"lab.eventCount":`Ereignisse`,"lab.verdictCount":`Urteile`,"lab.subjectCount":`Subjects`,"lab.builtAt":`Erstellt`,"lab.loading":`Kompatibilitätsevidenz wird geladen…`,"lab.loadMore":`Load more`,"lab.detailTitle":`Verdict detail`,"lab.detailClose":`Close`,"lab.detailSubject":`Subject`,"lab.detailObservations":`Observations`,"lab.detailEvents":`Contributing events`,"lab.detailArtifacts":`Artifact metadata`,"lab.production.title":`Beobachteter Produktionsverkehr`,"lab.production.notVerification":`Keine Lab-Verifizierung`,"lab.production.attempts":`Versuche`,"lab.production.successes":`Erfolge`,"lab.production.routeErrors":`Routing-Fehler`,"lab.production.lastObserved":`Zuletzt beobachtet`,"lab.detailLoadFailed":`Could not load verdict detail`,"lab.refresh":`Aktualisieren`,"lab.verdict.UNKNOWN":`Unbekannt`,"lab.verdict.CLAIMED":`Behauptet`,"lab.verdict.PROBED":`Geprüft`,"lab.verdict.VERIFIED":`Verifiziert`,"lab.verdict.DEGRADED":`Eingeschränkt`,"lab.verdict.BLOCKED":`Blockiert`,"lab.verdict.UNSUPPORTED":`Nicht unterstützt`,"lab.layer.protocol_conformance":`Protokollkonformität`,"lab.layer.live_route_compatibility":`Live-Route-Kompatibilität`,"lab.layer.task_effectiveness":`Aufgabenwirksamkeit`,"dash.visionAdvanced":`Erweiterte Einstellungen`,"dash.visionMaxDescriptions":`Maximale Beschreibungen pro Turn`,"dash.visionMaxDescriptionsInvalid":`Geben Sie eine positive ganze Zahl ein.`,"dash.visionTimeout":`Timeout`,"dash.visionTimeoutInvalid":`Geben Sie eine ganze Zahl von {min} bis {max} Millisekunden ein.`,"dash.visionAdvancedPopover":`Erweiterte Vision-Einstellungen`,"sub.routedDelegationBridge":`Geroutete V2-Delegationsbrücke`,"sub.routedDelegationBridgeHint":`Experimentell. Solange aktiv, sind Spawn-, Sende- und Follow-up-Nachrichten Klartext, auch bei nativer Delegation. Codex kann weiterhin das ursprüngliche Modell anzeigen; geroutete Inhalte und Datenschutz folgen dem ausgewählten Anbieter.`,"sub.routedDelegationBridgeInactive":`Bereitgestellt; wird nur für geeignete native V2-Roots aktiviert.`,"sub.routedDelegationBridgeSaveFail":`Geroutete V2-Delegationsbrücke konnte nicht gespeichert werden`,"sub.routedDelegationBridgeSaved":`Geroutete V2-Delegationsbrücke gespeichert. Das Deaktivieren wirkt sofort.`,"models.newPolicyGlobal":`Neue Modelle zunächst deaktivieren`,"models.newPolicyProvider":`Richtlinie für neue Modelle`,"models.newPolicy_inherit":`Übernehmen`,"models.newPolicy_off":`Aus`,"models.newPolicy_on":`An`,"models.newBadge":`NEU`,"models.newCount":`{count} neu, aus`,"models.aliases":`Aliase`,"models.aliasesTable":`Alias-Tabelle`,"models.aliasPrompt":`Anbieter-Alias (leer lassen zum Entfernen)`,"models.modelAliasPrompt":`Modell-Alias (leer lassen zum Entfernen)`,"models.aliasSaved":`Alias gespeichert`,"models.aliasConflict":`Dieser Alias steht in Konflikt mit einem vorhandenen Namen`,"models.editProviderAlias":`Anbieter-Alias bearbeiten`,"models.editModelAlias":`Modell-Alias bearbeiten`,"models.useDefaultAliases":`Standard-Aliase verwenden`,"models.useDefaultAliasesGlobal":`Standard-Aliase global verwenden`,"models.aliasAuto":`automatisch`,"models.aliasUser":`benutzerdefiniert`,"models.aliasStale":`veraltet`},g={"nav.dashboard":`Tableau de bord`,"uptime.day":`j`,"uptime.hour":`h`,"uptime.minute":`min`,"uptime.second":`s`,"nav.startup":`Démarrage`,"nav.providers":`Fournisseurs`,"nav.models":`Modèles`,"nav.combos":`Combinaisons`,"nav.subagents":`Sous-agents`,"nav.logs":`Journaux et débogage`,"nav.usage":`Utilisation`,"common.github":`GitHub`,"sidebar.star":`Ajouter une étoile sur GitHub`,"sidebar.starred":`Étoile ajoutée sur GitHub`,"sidebar.starUnauthenticated":`Ouvrir GitHub pour ajouter une étoile (gh CLI n’est pas connecté)`,"sidebar.starFailed":`Impossible d’ajouter une étoile avec gh. Ouverture de GitHub à la place.`,"sidebar.updateAvailable":`Mise à jour disponible : {version}`,"sidebar.checkUpdate":`Rechercher des mises à jour`,"common.save":`Enregistrer`,"common.saving":`Enregistrement…`,"common.cancel":`Annuler`,"common.discard":`Abandonner les modifications`,"common.delete":`Supprimer`,"common.close":`Fermer`,"common.ok":`OK`,"common.remove":`Supprimer`,"common.loading":`Chargement…`,"common.retry":`Réessayer`,"auth.adminTokenTitle":`Jeton d’administration OpenCodex (OPENCODEX_ADMIN_AUTH_TOKEN)`,"auth.adminAccountLabel":`Compte`,"auth.adminTokenFieldLabel":`Jeton d’administration`,"auth.adminTokenRejected":`Ce jeton d’administration a été refusé. Vérifiez-le et réessayez.`,"auth.adminTokenUnavailable":`Le jeton d’administration n’a pas pu être vérifié. Réessayez.`,"app.logoAria":`Logo opencodex`,"app.pageTitle":`{page} — opencodex`,"app.claudeOn":`Claude ACTIVÉ`,"app.claudeOff":`Claude DÉSACTIVÉ`,"theme.label":`Thème`,"theme.light":`Clair`,"theme.dark":`Sombre`,"theme.system":`Système`,"lang.label":`Langue`,"lang.nativeName":`Français`,"provider.name.commandCodeAuth":`Command Code - Auth`,"provider.name.commandCodeApi":`Command Code - API`,"provider.name.volcengine":`Volcengine Ark`,"provider.name.volcengineCodingPlan":`Volcengine Ark Coding Plan`,"provider.name.volcengineAgentPlan":`Volcengine Ark Agent Plan`,"errorBoundary.title":`Échec du chargement de la page`,"errorBoundary.message":`Une erreur de rendu s’est produite dans cette section. Rechargez-la pour réessayer.`,"errorBoundary.details":`Erreur`,"errorBoundary.reload":`Recharger`,"routing.title":`Routage intelligent (bêta)`,"routing.subtitle":`Profils de stratégie, évaluation à blanc et analyses de routage fondées sur les sources.`,"routing.loadFailed":`Impossible de charger les données de routage`,"routing.empty":"Aucun profil de routage configuré. Ajoutez `routingProfiles` à config.json.","routing.revision":`rév.`,"routing.detail":`Profil`,"routing.createProfile":`Créer un profil`,"routing.dryRunError":`Échec de l’évaluation à blanc (HTTP {status})`,"routing.removeConfirm":`Supprimer le profil {id} ?`,"routing.unknownEvidence.allow":`autoriser`,"routing.unknownEvidence.penalize":`pénaliser`,"routing.unknownEvidence.exclude":`exclure`,"routing.removeCandidate":`Supprimer le candidat {provider}/{model}`,"routing.candidates":`Candidats`,"routing.require":`Exigences strictes`,"routing.optimize":`Pondérations d’optimisation`,"routing.limits":`Limites`,"routing.unknownEvidence":`Stratégie pour les preuves inconnues`,"routing.compatibility.title":`Stratégie de compatibilité`,"routing.compatibility.enabled":`Exiger des preuves du laboratoire de compatibilité`,"routing.compatibility.requiredSuites":`Suites requises`,"routing.compatibility.loadingCatalog":`Chargement du catalogue du laboratoire…`,"routing.compatibility.catalogUnavailable":`Catalogue du laboratoire indisponible — saisissez manuellement les identifiants de suite dans config.json.`,"routing.compatibility.layer.protocol_conformance":`Conformité au protocole`,"routing.compatibility.layer.live_route_compatibility":`Compatibilité du routage en direct`,"routing.compatibility.minStatus":`État de compatibilité minimal`,"routing.none":`aucun`,"routing.unavailable":`–`,"routing.dryRun":`Évaluation à blanc`,"routing.dryRunContext":`Fenêtre de contexte de la requête (jetons)`,"routing.dryRunTools":`La requête nécessite des outils`,"routing.dryRunImage":`La requête nécessite une image en entrée`,"routing.dryRunStructured":`La requête nécessite une sortie structurée`,"routing.dryRunRun":`Évaluer les candidats`,"routing.candidate":`Candidat`,"routing.eligible":`Admissible`,"routing.exclusions":`Exclusions`,"routing.costCap":`Plafond de coût`,"routing.capOutcome.satisfied":`dans la limite`,"routing.capOutcome.exceeded":`limite dépassée`,"routing.capOutcome.unknown-allowed":`inconnu (autorisé)`,"routing.capOutcome.unknown-excluded":`inconnu (exclu)`,"routing.exclusion.capability-unsatisfied":`capacité non satisfaite`,"routing.exclusion.unknown-capability":`capacité inconnue`,"routing.exclusion.cost-limit":`plafond de coût dépassé`,"routing.exclusion.cost-limit-unknown":`coût inconnu sous le plafond`,"routing.exclusion.cooldown":`délai de récupération`,"routing.exclusion.unknown-health":`état de santé inconnu`,"routing.exclusion.unknown-quota":`quota inconnu`,"routing.exclusion.unknown-price":`prix inconnu`,"routing.exclusion.other":`exclusion : {code}`,"routing.score":`Score`,"routing.selected":`sélectionné`,"routing.yes":`oui`,"routing.no":`non`,"routing.analytics":`Analyse du routage`,"routing.analyticsTotal":`Requêtes`,"routing.analyticsSuccessRate":`Réussite`,"routing.analyticsFallbackRate":`Repli`,"routing.analyticsP50":`p50`,"routing.analyticsP95":`p95`,"routing.analyticsP99":`p99`,"routing.analyticsCooldown":`Échecs pendant le délai de récupération`,"routing.analyticsConfidence":`Confiance`,"routing.analyticsTruncated":`historique tronqué`,"routing.analyticsRequests":`Requêtes`,"routing.analyticsEmpty":`Aucune donnée d’analyse pour le moment — envoyez d’abord quelques requêtes.`,"startup.title":`Sécurité du démarrage`,"startup.subtitle":`Vérifiez que Codex peut joindre opencodex après un redémarrage, avant que le routage du proxy local n’entre dans une boucle de reconnexion.`,"startup.refresh":`Actualiser`,"startup.backToDashboard":`Retour au tableau de bord`,"startup.loading":`Vérification de la protection au démarrage…`,"startup.error":`Impossible de lire la protection au démarrage.`,"startup.staleData":`La dernière vérification du démarrage a échoué. Les valeurs ci-dessous sont obsolètes et ne doivent pas être considérées comme une preuve de protection.`,"startup.status.native":`Routage natif`,"startup.status.protected":`Redémarrage protégé`,"startup.status.atRisk":`Action requise`,"startup.summary.native":`Codex ne dépend pas du proxy local`,"startup.summary.protected":`opencodex sera disponible après le redémarrage`,"startup.summary.atRisk":`Codex peut perdre l’accès aux modèles après le redémarrage`,"startup.riskDetail":`Codex est lié au proxy local, mais aucun service persistant ni mécanisme de lancement opérationnel ne le redémarrera.`,"startup.riskDetailCustomLocal":`Codex pointe vers une passerelle locale personnalisée. opencodex ne peut ni gérer ni vérifier le cycle de redémarrage de cette passerelle.`,"startup.riskDetailWindowsShim":`Le mécanisme de lancement protège les scripts CLI pris en charge, mais Codex Desktop et les lancements directs de codex.exe peuvent le contourner sous Windows.`,"startup.safeDetail":`Le routage et le mécanisme de démarrage actuels sont cohérents. Aucun démarrage manuel avec ocx ne devrait être nécessaire après un redémarrage.`,"startup.routing":`Routage de Codex`,"startup.routing.proxy":`Proxy local`,"startup.routing.native":`OpenAI natif`,"startup.routing.customLocal":`Passerelle locale personnalisée`,"startup.routing.customRemote":`Passerelle distante personnalisée`,"startup.routing.unknown":`Routage inconnu ou non valide`,"startup.restartProtection":`Protection au redémarrage`,"startup.preference":`Démarrage à la demande`,"startup.enabled":`Activé`,"startup.disabled":`Désactivé`,"startup.protection.service":`Service en arrière-plan`,"startup.protection.shim":`Mécanisme de lancement`,"startup.protection.none":`Non installé`,"startup.details":`Détails de la protection`,"startup.service":`Service en arrière-plan`,"startup.serviceHint":`Démarre à la connexion et relance le proxy après un plantage.`,"startup.installed":`Installé`,"startup.notInstalled":`Non installé`,"startup.unsupported":`Non pris en charge`,"startup.shim":`Mécanisme de lancement Codex`,"startup.shimHint":`Exécute ocx ensure au démarrage d’un script de lancement Codex pris en charge.`,"startup.healthy":`Opérationnel`,"startup.cliOnly":`CLI uniquement`,"startup.stale":`Obsolète`,"startup.viable":`Prêt`,"startup.unhealthy":`Installé, mais défaillant`,"startup.conflict":`Conflit de service`,"startup.installedDisabled":`Installé, mais désactivé`,"startup.install":`Installer`,"startup.installing":`Installation…`,"startup.repair":`Réparer`,"startup.repairing":`Réparation…`,"startup.serviceInstalled":`Service en arrière-plan installé avec succès.`,"startup.serviceRepaired":`Service en arrière-plan réparé avec succès.`,"startup.shimInstalled":`Mécanisme de lancement Codex installé avec succès.`,"startup.shimRepaired":`Mécanisme de lancement Codex réparé avec succès.`,"startup.installFailed":`Échec de l’installation :`,"startup.tray.title":`Zone de notification Windows`,"startup.tray.hint":`Installez une icône dans la zone de notification à la connexion pour démarrer, arrêter et redémarrer le proxy, ouvrir le tableau de bord et consulter l’état en un clic.`,"startup.tray.login":`Lancer l’icône à la connexion Windows`,"startup.tray.notProtection":`L’icône de notification est un contrôleur, pas une protection au redémarrage. Un service en arrière-plan opérationnel reste nécessaire pour rétablir le proxy sans intervention.`,"startup.tray.running":`En cours d’exécution`,"startup.tray.stopped":`Installé, masqué`,"startup.tray.stale":`Réparation requise`,"startup.tray.notInstalled":`Non installé`,"startup.tray.loading":`Vérification…`,"startup.tray.unavailable":`État indisponible`,"startup.tray.install":`Installer et afficher l’icône`,"startup.tray.start":`Afficher l’icône de notification`,"startup.tray.stop":`Quitter l’icône de notification`,"startup.tray.uninstall":`Supprimer le lancement à la connexion`,"startup.tray.error":`Échec de l’action sur l’icône de notification Windows. Consultez ocx tray status pour plus de détails.`,"startup.recovery":`Options de réparation`,"startup.recoveryHint":`Utilisez les programmes d’installation en un clic ci-dessus ou copiez une commande pour effectuer une réparation manuelle. Le service en arrière-plan est recommandé pour Codex Desktop et les exécutables Windows.`,"startup.command.service":`Recommandé : service persistant en arrière-plan`,"startup.command.shim":`Alternative : mécanisme de lancement CLI`,"startup.command.native":`Solution de secours : restaurer le routage Codex natif`,"startup.copy":`Copier`,"startup.copied":`Copié`,"startup.recommended":`Réparation recommandée : {cmd}`,"startup.navRisk":`La protection au démarrage requiert votre attention`,"startup.codexRuntime.clampHidden":`Certaines options d’effort de raisonnement ont été masquées, car OpenCodex utilisait Codex {version}.`,"startup.codexRuntime.clampHiddenWithEfforts":`Certaines options d’effort de raisonnement ont été masquées, car OpenCodex utilisait Codex {version} (supprimées : {efforts}).`,"startup.codexRuntime.olderBinary":`OpenCodex utilise un binaire Codex plus ancien ({version}). Une installation plus récente est disponible.`,"dash.subtitle":`État en direct du proxy opencodex local, de ses fournisseurs et des modèles routés vers Codex.`,"dash.workspace.overview":`Vue d’ensemble`,"dash.workspace.sections":`Sections`,"dash.status":`État`,"dash.online":`En ligne`,"dash.offline":`Hors ligne`,"dash.version":`Version`,"dash.uptime":`Durée de fonctionnement`,"dash.providers":`Fournisseurs`,"dash.tokens30d":`Jetons (30 j)`,"dash.activity.title":`Activité sur 30 jours`,"dash.activity.requests":`Requêtes`,"dash.activity.tokens":`Jetons`,"dash.activity.chartLabel":`Activité sur 30 jours. Utilisez Gauche et Droite pour choisir un jour ; Début et Fin accèdent aux limites.`,"dash.activity.viewUsage":`Voir l’utilisation`,"dash.coverage":`Couverture : {pct}`,"dash.mem.title":`Observabilité de la mémoire`,"dash.mem.hint":`Diagnostics d’exécution en lecture seule. La mémoire observée correspond à max(RSS, external, ArrayBuffers), afin que la réduction de l’ensemble de travail Windows ne masque pas la rétention allouée.`,"dash.mem.rss":`Ensemble résident (RSS)`,"dash.mem.jsHeap":`Tas JS utilisé`,"dash.mem.jsHeapArena":`arène {total}`,"dash.mem.pressure":`Par rapport au seuil d’avertissement`,"dash.mem.pressureOf":`{pct} % du seuil`,"dash.mem.pressureUnknown":`Aucun seuil signalé`,"dash.mem.jscHeap":`Tas JSC`,"dash.mem.external":`Mémoire externe`,"dash.mem.arrayBuffers":`ArrayBuffers`,"dash.mem.observed":`Observée`,"dash.mem.runtime":`Compteurs d’exécution`,"dash.mem.growth":`Dérive observée par heure`,"dash.mem.perHour":`/h`,"dash.mem.store":`Stockage des continuations`,"dash.mem.storeHint":`Cache previous_response_id du proxy. Une hausse du nombre total d’octets accompagnée d’une augmentation du tas indique une rétention des conversations plutôt qu’un effet de l’allocateur d’exécution.`,"dash.mem.storeEntries":`Entrées`,"dash.mem.storeTotal":`Total`,"dash.mem.storeLargest":`Plus grande`,"dash.mem.storeOldest":`Plus ancienne`,"dash.mem.threshold":`Seuil d’avertissement`,"dash.mem.lastWarn":`Dernier avertissement`,"dash.mem.never":`Jamais`,"dash.mem.details":`Détails`,"dash.mem.unavailable":`Diagnostics de mémoire indisponibles (proxy plus ancien).`,"dash.mem.inFlight":`Requêtes en cours`,"dash.mem.restart":`Drainer et redémarrer`,"dash.mem.restartConfirm":`Attendre la fin de {count} requête(s) en cours, puis redémarrer (jusqu’à {seconds} s ; les requêtes restantes seront interrompues à l’expiration du délai).`,"dash.mem.draining":`Drainage de {count} requête(s)… redémarrage une fois terminé`,"dash.mem.reconnecting":`Redémarrage du proxy… attente de la reconnexion`,"dash.connectionReconnecting":`Connexion interrompue — reconnexion…`,"dash.mem.restartFailed":`Échec du drainage et du redémarrage. Vérifiez que le proxy est en cours d’exécution.`,"dash.mem.restartNoSupervisor":`Aucune protection au redémarrage détectée. Le proxy peut rester arrêté après le redémarrage, sauf si vous le relancez.`,"dash.activeProviders":`Fournisseurs actifs`,"dash.noProviders":`Aucun fournisseur configuré. Exécutez {cmd}.`,"dash.col.name":`Nom`,"dash.col.adapter":`Adaptateur`,"dash.col.baseUrl":`URL de base`,"dash.col.model":`Modèle`,"dash.modelsNoResults":`Aucun modèle ne correspond à votre recherche.`,"dash.availableModels":`Modèles disponibles`,"dash.noModels":`Aucun modèle trouvé. Vérifiez les clés API des fournisseurs.`,"dash.cannotConnect":`Impossible de se connecter au proxy. Est-il en cours d’exécution ?`,"dash.runStart":`Exécutez {cmd} pour démarrer le proxy.`,"dash.stop":`Arrêter le proxy`,"dash.stopConfirm":`Arrêter le proxy et restaurer Codex natif ?`,"dash.stopFailed":`Échec de l’arrêt du proxy (HTTP {status}).`,"dash.maSwitchFailed":`Échec du changement de mode (HTTP {status}).`,"dash.maNetworkError":`Erreur réseau — le proxy est-il en cours d’exécution ?`,"dash.stopping":`Arrêt…`,"dash.actions":`Proxy`,"dash.codexRestart":`Recharger les modèles Codex`,"dash.codexRestarting":`Arrêt…`,"dash.codexRestartConfirm":`Arrêter les serveurs d’application Codex afin qu’ils rechargent la liste des modèles ? Tout tour Codex en cours sera interrompu et Codex ne redémarrera pas automatiquement — rouvrez-le ensuite.`,"dash.codexRestartDone":`{count} serveur(s) d’application Codex arrêté(s). Rouvrez Codex pour charger la liste actuelle des modèles.`,"dash.codexRestartNothing":`Aucun serveur d’application Codex n’est en cours d’exécution. Le prochain lancement lira la liste actuelle des modèles.`,"dash.codexRestartUnknown":`Impossible de répertorier les processus ; aucun n’a donc été arrêté.`,"dash.codexRestartPartial":`{count} serveur(s) d’application ne se sont pas arrêtés. Arrêtez-les manuellement si la liste des modèles reste obsolète.`,"dash.codexRestartFailed":`Échec du rechargement des modèles Codex (HTTP {status}).`,"dash.codexRestartUnreachable":`Impossible de joindre le proxy.`,"dash.codexRestartMalformed":`Le proxy a renvoyé une réponse inattendue.`,"dash.codexRestartTimeout":`Le proxy n’a pas répondu à temps. Il est peut-être encore en train d’arrêter les serveurs d’application.`,"models.staleBanner":`Codex affiche une liste de modèles plus ancienne que ce catalogue. Redémarrez Codex pour la recharger.`,"dash.codexAutoStart":`Démarrer opencodex avec Codex`,"dash.codexAutoStartHint":`Permet à un mécanisme de lancement installé d’exécuter ocx ensure. Ce réglage n’installe pas de protection au redémarrage ; consultez Sécurité du démarrage pour connaître l’état effectif.`,"dash.searchModel":`Modèle auxiliaire de recherche`,"dash.searchModelHint":`Modèle utilisé pour web_search sur les modèles routés autres qu’OpenAI. Nécessite une connexion à ChatGPT.`,"dash.searchReasoning":`Effort de raisonnement pour la recherche`,"dash.visionModel":`Modèle auxiliaire de vision`,"dash.visionModelHint":`Modèle utilisé pour décrire les images aux modèles routés en mode texte uniquement. Nécessite une connexion à ChatGPT.`,"dash.webSearchSidecar":`Service auxiliaire de recherche Web`,"dash.webSearchSidecarHint":`Choisissez le moteur et le modèle utilisés pour la recherche Web sur les modèles routés.`,"dash.webSearchStream":`Diffuser les réponses en direct`,"dash.webSearchStreamHint":`Diffuse en direct le texte initial et le raisonnement du modèle jusqu’à ce qu’il décide d’appeler un outil ; le reste du tour demeure en mémoire tampon pour intercepter la recherche. Le texte produit avant une recherche peut être partiellement répété.`,"dash.visionSidecar":`Service auxiliaire de vision`,"dash.visionSidecarHint":`Choisissez le moteur et le modèle utilisés pour décrire les images aux modèles routés en mode texte uniquement.`,"dash.visionOff":`Désactivé`,"dash.visionAdvanced":`Paramètres avancés`,"dash.visionMaxDescriptions":`Nombre maximal de descriptions par tour`,"dash.visionMaxDescriptionsInvalid":`Saisissez un entier positif.`,"dash.visionTimeout":`Délai d’expiration`,"dash.visionTimeoutInvalid":`Saisissez un entier compris entre {min} et {max} millisecondes.`,"dash.visionAdvancedPopover":`Paramètres de vision avancés`,"dash.shadowCallIntercept":`Interception des appels fantômes`,"dash.shadowCallInterceptHint":`Intercepte les appels auxiliaires en arrière-plan de l’application Codex ({models}) pour générer les titres et les messages de commit, puis les redirige vers le modèle choisi. L’effort est fixé à faible.`,"dash.shadowCallWarning":`⚠ Lorsque cette option est activée, TOUTES les requêtes destinées à {models} sont remplacées par le modèle sélectionné.`,"dash.shadowCallOriginal":`Original`,"dash.shadowCallModel":`Modèle de remplacement`,"dash.shadowCallTooltip":`L’application Codex effectue des appels auxiliaires en arrière-plan pour générer les titres de fils, les messages de commit et orchestrer les compétences. Le modèle auxiliaire ayant changé selon les versions du client, opencodex intercepte tous les modèles de cet ensemble : {models}. Activez cette option pour rediriger ces appels vers le modèle choisi.`,"models.shadowCallIntercept":`Interception des appels fantômes`,"models.shadowCallInterceptHint":`Intercepte les appels auxiliaires en arrière-plan de l’application Codex ({models}) pour les titres et les messages de commit, puis les redirige vers le modèle choisi.`,"dash.sidecarBackend":`Moteur`,"dash.sidecarModel":`Modèle`,"dash.backendAuto":`Auto`,"dash.backendOpenAI":`OpenAI`,"dash.backendAnthropic":`Anthropic`,"dash.sidecarSaved":`Paramètres des services auxiliaires enregistrés. Ils s’appliqueront à la prochaine requête.`,"dash.sidecarSaveFailed":`Échec de l’enregistrement des paramètres des services auxiliaires.`,"dash.injectionLabel":`Délégation aux sous-agents`,"dash.injectionHint":`Choisissez le modèle auquel Codex doit confier le travail des sous-agents. Les deux options ci-dessous déterminent où ce choix est utilisé.`,"dash.injectionManage":`Ouvrir les paramètres`,"dash.syncCodexSubagentDefaults":`Enregistrer aussi comme valeur par défaut de Codex`,"dash.syncCodexSubagentDefaultsHint":`Si cette option est activée, le choix ci-dessus est inscrit dans la configuration de Codex afin que les nouvelles tâches commencent aussi avec ce modèle. Si elle est désactivée, il n’est mémorisé qu’ici. Il prend effet à la prochaine synchronisation ou au prochain redémarrage, sans modifier vos paramètres [agents] saisis manuellement.`,"dash.multiAgentGuidance":`Indiquer à Codex comment répartir le travail`,"dash.multiAgentGuidanceHint":`Envoie une brève note indiquant à Codex comment confier le travail aux sous-agents. En v2, elle précise les modèles utilisables et celui à privilégier ; en v1, elle ne s’applique qu’avec un effort de raisonnement maximal ou ultra. Si cette option est désactivée, aucune note n’est ajoutée.`,"dash.injectionNone":`Aucun`,"dash.injectionEffortLabel":`Effort de raisonnement`,"dash.injectionEffortNone":`Valeur par défaut du modèle`,"dash.effortCapLabel":`Limite de l’effort ultra en V2`,"dash.subagentEffortCapLabel":`Limite de l’effort des sous-agents en V2`,"dash.effortCapHelp":`Limite l’effort de raisonnement des tours en mode ultra V2. Lorsqu’une limite est définie, les requêtes entrantes avec l’effort maximal (issues du mode ultra) sont plafonnées au niveau sélectionné. La limite des sous-agents s’applique uniquement aux agents enfants créés. Les plafonds ne font que réduire l’effort, jamais l’augmenter. Si un modèle ne prend pas en charge le niveau plafonné, le niveau inférieur pris en charge le plus proche est utilisé.`,"dash.effortCapNone":`Aucune limite`,"dash.maintenance":`Maintenance`,"dash.maintenanceHint":`Actualisez le catalogue de modèles de Codex ou installez une version plus récente d’opencodex.`,"dash.syncModels":`Synchroniser les modèles`,"dash.syncModelsHint":`Réécrit le catalogue de modèles de Codex à partir des fournisseurs connectés.`,"dash.syncRun":`Synchroniser maintenant`,"dash.syncing":`Synchronisation…`,"dash.syncOk":`Synchronisation terminée. {count} modèle(s) ajouté(s).`,"dash.syncStaleHint":`Si Codex affiche toujours une ancienne liste, redémarrez son app-server de longue durée ({cmd}).`,"dash.syncFailed":`Échec de la synchronisation : {error}`,"dash.projectConfigTitle":`La configuration Codex du projet contourne OpenCodex`,"dash.projectConfigHint":`Ces paramètres propres au dépôt remplacent le proxy OpenCodex (par exemple, en routant directement vers OpenCode Go). Supprimez-les afin que le routage défini dans ~/.codex/config.toml s’applique à ce projet.`,"dash.checkUpdate":`Rechercher une mise à jour`,"dash.updateTitle":`Mettre à jour opencodex`,"dash.updateDesc":`Recherchez le canal sélectionné sur npm, puis choisissez de redémarrer ou non le proxy après l’installation.`,"dash.updateChannel":`Canal`,"dash.updateChecking":`Recherche de mises à jour…`,"dash.updateInstalled":`Installée`,"dash.updateLatest":`Dernière version`,"dash.updateAvailable":`Mise à jour disponible`,"dash.updateCurrent":`À jour`,"dash.updateCommand":`Commande`,"dash.updateSource":`Il s’agit d’une extraction du code source. Mettez-la à jour depuis le terminal avec la commande affichée.`,"dash.updateUnavailable":`Impossible de lire la dernière version depuis npm. Réessayez plus tard.`,"dash.updateRetry":`Réessayer`,"dash.updateRecheck":`Revérifier`,"dash.updateCannotAuto":`La mise à jour en un clic est indisponible ({reason}).`,"dash.updateReason.source_checkout":`extraction du code source`,"dash.updateReason.latest_unavailable":`registre npm inaccessible`,"dash.updateReason.already_latest":`dernière version déjà installée`,"dash.updateReason.unknown":`mise à jour indisponible`,"dash.updateRestart":`Redémarrer après la mise à jour`,"dash.updateRestartHint":`Recommandé. L’interface graphique actuelle continue d’exécuter l’ancien code jusqu’au redémarrage du proxy.`,"dash.runUpdate":`Mettre à jour`,"dash.updateReconnecting":`Attente du proxy redémarré…`,"dash.updateStatus.running":`Mise à jour d’opencodex.`,"dash.updateStatus.restarting":`Mise à jour installée. Redémarrage du proxy.`,"dash.updateStatus.succeeded":`Mise à jour terminée.`,"dash.updateVersionTransition":`{currentVersion} -> {latestVersion}.`,"dash.updateStatus.failed":`Échec de la mise à jour.`,"prov.subtitle":`Configurez les fournisseurs en amont vers lesquels opencodex route Codex. Connectez-vous avec un compte, ajoutez un fournisseur ou modifiez la configuration brute.`,"prov.add":`Ajouter un fournisseur`,"prov.editJson":`Modifier le JSON`,"prov.accountLogin":`Connexion au compte`,"prov.noOauth":`Aucun fournisseur OAuth disponible.`,"prov.loggedIn":`connecté`,"prov.notLoggedIn":`non connecté`,"prov.logout":`Se déconnecter`,"prov.login":`Se connecter`,"prov.loginWith":`Se connecter avec {provider}`,"prov.waitingBrowser":`Attente du navigateur…`,"prov.didntOpen":`La page ne s’est pas ouverte ? Cliquez ici`,"prov.copyLink":`Copier le lien`,"prov.dontOpenBrowser":`Ne pas ouvrir de navigateur sur la machine du proxy`,"prov.dontOpenBrowserHint":`Utile pour un autre profil de navigateur, ou quand le tableau de bord n'est pas sur la machine du proxy.`,"prov.linkCopied":`Copié`,"prov.linkCopyUnavailable":`Presse-papiers indisponible`,"prov.deviceCode":`Code de l’appareil`,"prov.copyCode":`Copier le code`,"prov.codeCopied":`Code copié`,"prov.editAlias":`Modifier l’alias`,"prov.aliasPrompt":`Nom d’affichage (laissez vide pour l’effacer)`,"prov.aliasSaved":`Alias enregistré`,"prov.aliasSaveFailed":`Impossible d’enregistrer l’alias`,"prov.cooldownCleared":`Délai de récupération effacé`,"prov.cooldownClearFailed":`Impossible d'effacer le délai de récupération`,"prov.accountId":`ID`,"prov.pasteRedirect":`Coller l’URL de redirection ou le code`,"prov.pasteRedirectHint":`Si le navigateur affiche une erreur localhost, copiez l’URL complète depuis sa barre d’adresse et collez-la ici (ou collez le code d’autorisation).`,"prov.pasteSubmit":`Envoyer`,"prov.pasteSubmitting":`Envoi…`,"prov.pasteOk":`Code envoyé — finalisation de la connexion…`,"prov.pasteFail":`Impossible d’envoyer le code : {error}`,"prov.port":`Port`,"prov.default":`Par défaut`,"prov.loadingConfig":`Chargement…`,"prov.saved":`Enregistré ! Redémarrez le proxy pour appliquer les modifications.`,"prov.loadConfigFail":`Échec du chargement de la configuration`,"prov.invalidJson":`JSON non valide`,"prov.saveFailed":`Échec de l’enregistrement`,"prov.loginFailStart":`Impossible de démarrer la connexion à {provider}`,"prov.loginError":`Erreur de connexion à {provider} : {error}`,"prov.loginRequestFail":`Échec de la demande de connexion à {provider}`,"prov.loginCancelled":`Connexion à {provider} annulée`,"prov.loginTimeout":`Délai de connexion à {provider} dépassé — le navigateur a été fermé ou l’opération n’a jamais abouti. Réessayez.`,"prov.loginOk":`Connexion à {provider} réussie. Exécutez {cmd} (ou laissez l’application en direct) pour afficher ses modèles.`,"prov.loginSameAccount":`Il s’agit toujours du même compte {provider} — changez de compte dans le navigateur, puis réessayez d’ajouter un compte.`,"oauthTos.highTitle":`{provider} : risque lié à l’abonnement OAuth`,"oauthTos.elevatedTitle":`{provider} : passerelle OAuth non officielle`,"oauthTos.anthropicBody":`La réutilisation directe des jetons OAuth d’un abonnement Claude par l’intermédiaire d’un proxy tiers tel qu’OpenCodex n’est pas une intégration prise en charge par Anthropic et peut entraîner des restrictions d’accès. Les intégrations Agent SDK prises en charge qui utilisent les abonnements Claude sont distinctes.`,"oauthTos.highBody":`OpenCodex connecte {provider} par un mécanisme OAuth tiers. Une utilisation non prise en charge peut entraîner des limitations d’accès ou une suspension.`,"oauthTos.elevatedBody":`OpenCodex connecte {provider} par un mécanisme OAuth non officiel. Utilisez le client officiel lorsque cela est possible ; un trafic inhabituel ou automatisé peut être considéré comme abusif et l’accès peut être limité ou suspendu.`,"oauthTos.saferPath":`Option plus sûre : configurez plutôt une clé API dans OpenCodex.`,"oauthTos.acknowledge":`Je comprends le risque et souhaite tout de même continuer avec OAuth.`,"oauthTos.continue":`Continuer avec OAuth`,"prov.logoutOk":`Déconnexion de {provider} réussie.`,"prov.logoutFail":`Impossible de se déconnecter de {provider}. L’état de votre compte n’a pas changé.`,"prov.removed":`« {name} » supprimé.`,"prov.removedDefault":`« {name} » supprimé. Le fournisseur par défaut est maintenant « {defaultProvider} ».`,"prov.removeFail":`Échec de la suppression de « {name} ».`,"prov.removeLastProvider":`Vous ne pouvez pas supprimer ce fournisseur si aucun autre fournisseur activé ne peut devenir le fournisseur par défaut.`,"prov.removeHasDependentCombos":`Supprimez ou mettez d’abord à jour les combinaisons dépendantes suivantes : {combos}.`,"prov.setDefault":`Définir par défaut`,"prov.setDefaultSuccess":`« {name} » est maintenant le fournisseur par défaut.`,"prov.setDefaultFail":`Impossible de définir « {name} » comme fournisseur par défaut.`,"prov.defaultDisabled":`Activez ce fournisseur avant de le définir comme fournisseur par défaut.`,"prov.updateFail":`Impossible de mettre à jour ce fournisseur.`,"prov.networkError":`Erreur réseau. Vérifiez que le proxy est en cours d’exécution et réessayez.`,"prov.added":`« {name} » ajouté. Déjà actif — exécutez {cmd} (ou redémarrez) pour afficher ses modèles dans le sélecteur de Codex.`,"prov.removeConfirm":`Supprimer le fournisseur « {name} » ? Ses modèles disparaîtront du sélecteur de Codex.`,"prov.hasApiKey":`clé API configurée`,"prov.hasHeaders":`en-têtes personnalisés configurés`,"prov.accounts":`Comptes ({n})`,"prov.accountsAria":`Afficher ou masquer les comptes de {name}`,"prov.accountActive":`Actif`,"prov.accountReauth":`Se reconnecter`,"prov.reauthenticate":`Se réauthentifier`,"prov.reauthAccountMissing":`Le compte sélectionné n’a pas été trouvé après la connexion`,"prov.reauthIdentityMismatch":`Le compte connecté ne correspond pas au compte sélectionné`,"prov.accountAdd":`Ajouter un compte`,"prov.accountNoLabel":`compte {id}`,"prov.accountSwitchTitle":`Utiliser ce compte`,"prov.accountSwitched":`Compte remplacé par {email}.`,"prov.accountSwitchFail":`Échec du changement de compte`,"prov.accountRemoved":`{email} supprimé.`,"prov.accountRemoveFail":`Impossible de supprimer {email}. Le compte n’a pas été modifié.`,"prov.accountRemoveAria":`Supprimer {email}`,"prov.accountRemoveConfirm":`Supprimer le compte {email} ? Ses données de connexion seront supprimées de ce proxy.`,"prov.keyAdd":`Ajouter une clé API`,"prov.keyAdded":`Clé API ajoutée à {name}.`,"prov.keyAddFail":`Échec de l’ajout de la clé API`,"prov.keyPlaceholder":`Coller la clé API`,"prov.keySwitchTitle":`Utiliser cette clé`,"prov.keySwitched":`Clé remplacée par {key}.`,"prov.keySwitchFail":`Échec du changement de clé`,"prov.keyRemoved":`Clé {key} supprimée.`,"prov.keyRemoveAria":`Supprimer la clé {key}`,"prov.keyRemoveConfirm":`Supprimer la clé API {key} ? Elle sera supprimée de la configuration de ce proxy.`,"prov.activeBadge":`Actif`,"prov.disabledBadge":`Désactivé`,"prov.defaultBadge":`Par défaut`,"prov.enable":`Activer`,"prov.disable":`Désactiver`,"prov.enabled":`« {name} » activé. Ses modèles peuvent de nouveau apparaître dans Codex.`,"prov.disabled":`« {name} » désactivé. Les paramètres sont conservés, mais ses modèles sont masqués.`,"prov.enableFail":`Échec de l’activation de « {name} ».`,"prov.disableFail":`Échec de la désactivation de « {name} ».`,"prov.enableAria":`Activer le fournisseur {name}`,"prov.disableAria":`Désactiver le fournisseur {name}`,"prov.defaultCannotDisable":`Le fournisseur par défaut ne peut pas être désactivé`,"prov.openaiAccountMode":`Mode de compte Codex`,"prov.openaiModePool":`Groupe`,"prov.openaiModeDirect":`Direct`,"prov.openaiPoolDesc":`Par défaut. Alterne entre la connexion principale et les comptes ajoutés selon l’affinité, le quota, le délai de récupération et le repli.`,"prov.openaiDirectDesc":`Utilise uniquement la connexion Codex actuelle ou principale. Les comptes du groupe enregistrés ne sont ni lus ni utilisés en alternance.`,"prov.openaiModeSaved":`Mode de compte OpenAI remplacé par {mode}.`,"prov.openaiModeSaveFailed":`Impossible de modifier le mode de compte OpenAI.`,"prov.openaiApiDesc":`Utilise une clé API OpenAI et n’utilise jamais les identifiants d’un compte Codex.`,"prov.manageCodexAccounts":`Gérer les comptes Codex`,"prov.openaiApiMissing":`Clé API requise`,"prov.openaiApiSetup":`Configurer la clé API`,"models.tab.catalog":`Modèles`,"models.tab.combos":`Combinaisons`,"models.tab.compatibility":`Compatibilité`,"models.tab.routing":`Routage (bêta)`,"models.tabsLabel":`Espaces des modèles`,"models.subtitle.combos":`Groupes ordonnés de modèles qui répondent sous un même identifiant. Le repli essaie les cibles dans l’ordre ; la rotation distribue la charge.`,"models.subtitle.compatibility":`Matrice en lecture seule des verdicts de compatibilité issus des preuves de projection du laboratoire.`,"models.subtitle.routing":`Profils de stratégie, évaluation à blanc et analyses de routage fondées sur les sources.`,"models.subtitle":`Choisissez les modèles visibles par Codex — accès direct aux GPT natifs et fournisseurs routés, regroupés par fournisseur (cliquez sur un en-tête pour le réduire). Les modèles masqués sont retirés du catalogue et du sélecteur, mais restent directement accessibles par leur identifiant exact. Les modifications s’appliquent au prochain tour Codex — opencodex invalide le cache de modèles de Codex de 5 min, sans nécessiter de redémarrage.`,"models.nativeGroupLabel":`OpenAI natif`,"models.nativeHint":"Les modèles en accès direct utilisent l’option de compte Groupe ou Direct sélectionnée dans Fournisseurs. La désactivation d’un modèle le masque dans le sélecteur Codex (son entrée de catalogue est conservée afin que sa réactivation la restaure à l’identique). Ajouter un modèle ici enregistre un sélecteur routé `openai/<model>`, et non un nouvel identifiant passthrough brut.","models.active":`{active}/{total} visibles`,"models.workspace.providers":`Fournisseurs`,"models.workspace.allProviders":`Tous les fournisseurs`,"models.workspace.mainAria":`Détails du modèle`,"models.allOn":`Tout activer`,"models.allOff":`Tout désactiver`,"models.presetLabel":`Modèles`,"models.presetMode_preset":`Préréglage`,"models.presetMode_all":`Tous`,"models.presetMode_custom":`Personnalisé`,"models.presetSummary":`{count} sur {total} affichés — préréglage core v{version}`,"models.presetUpdateAvailable":`Préréglage v{version} disponible`,"models.presetAppliedToast":`{provider} : préréglage appliqué — {count} modèles sélectionnés`,"models.presetClearedToast":`{provider} : tous les modèles affichés`,"models.presetEmpty":`{provider} : le préréglage n’a trouvé aucun modèle — sélection inchangée`,"models.presetConfirmReplace":`Remplacer votre sélection par le préréglage de {count} modèles ?`,"models.cap350k":`Plafond de 350k`,"models.capApplied":`Plafond de contexte appliqué — il prendra effet au prochain tour Codex.`,"models.capSaveFailed":`Échec de l’enregistrement du plafond de contexte`,"models.contextCapped":`Plafond de 350k`,"models.contextCapLabel":`Plafond de sécurité / repli`,"models.v2Label":`Sous-agent`,"models.shadowCallOriginal":`⚠ {models} →`,"models.v2DocsLink":`Que sont v1 et v2 ?`,"models.v2Mode_v1":`v1`,"models.v2Mode_default":`base`,"models.v2Mode_v2":`v2`,"models.v2ModeDesc_v1":`Tous les modèles → interface v1`,"models.v2ModeDesc_default":`Valeurs par défaut en amont (sol/terra=v2, luna=v1)`,"models.v2ModeDesc_v2":`Tous les modèles → interface v2`,"models.keepNativeOnV1":`Garder ChatGPT sur v1`,"models.keepNativeOnV1Hint":`ChatGPT chiffre les tâches enfants v2 uniquement lorsqu’un parent natif ChatGPT reste sur v2, de sorte que Grok et Claude ne peuvent pas les lire. Activez cette option pour garder Sol/Terra sur v1 et éviter ce chiffrement. Les parents routés restent sur v2.`,"models.v2Help":`Contrôle l’interface multi-agent pour tous les modèles.
18
+
19
+ v1 : agent classique à fil unique. Tous les modèles utilisent l’interface collab v1.
20
+ base : valeurs par défaut en amont — sol/terra utilisent v2, luna utilise v1 et les autres suivent l’indicateur de fonctionnalité codex.
21
+ v2 : agent multifil avec spawn_agent. Tous les modèles utilisent l’interface collab v2.
22
+
23
+ En v2, « Garder ChatGPT sur v1 » laisse Sol/Terra sur l’interface v1 afin qu’ils puissent encore lancer Grok ou Claude. ChatGPT chiffre les tâches enfants v2 ; les modèles routés ne peuvent pas les lire. Les parents routés restent sur v2.
24
+
25
+ Les modifications s’appliquent aux nouvelles sessions.`,"dash.multiAgent":`Sous-agent`,"models.v2Conflict":`[agents] max_threads est défini — codex refusera de démarrer ; supprimez-le de config.toml`,"models.v2Applied":`Mode sous-agent mis à jour — s’applique aux nouvelles sessions (redémarrez l’application Codex pour actualiser le sélecteur)`,"models.v2ThreadsLabel":`Nombre maximal de fils`,"models.v2ThreadsDefault":`par défaut (4)`,"models.v2ThreadsApplied":`Limite de fils mise à jour — s’applique aux nouvelles sessions`,"models.v2ThreadsInvalid":`La limite de fils doit être un entier >= 1`,"models.v2ThreadsApply":`Appliquer`,"models.capValue":`Défaut {value}`,"models.contextSettings":`Fenêtres perso`,"models.contextSettingsTitle":`Fenêtres perso — {provider}`,"models.contextDefault":`Plafond de sécurité / repli`,"models.contextModel":`Modèle`,"models.contextModelOverride":`Remplacement pour le modèle`,"models.contextHint":`Laissez vide pour la découverte automatique. Une valeur ici est un plafond de sécurité et un repli : elle comble une fenêtre amont manquante et n’abaisse qu’une fenêtre plus grande. La découverte en direct n’est jamais écrite dans ce champ.`,"models.contextAutomatic":`Détection automatique`,"models.contextSaved":`Fenêtres de contexte mises à jour — prend effet au prochain tour Codex.`,"models.contextUnchanged":`Aucune modification des fenêtres de contexte à enregistrer.`,"models.contextSaveFailed":`Échec de l’enregistrement des fenêtres de contexte`,"models.contextInvalid":`Les fenêtres de contexte doivent être des nombres entiers positifs`,"models.contextCappedValue":`Plafond de {value}`,"models.contextMetadataSource":`Origine`,"models.contextMetadataLive":`détecté`,"models.contextMetadataRegistry":`registre`,"models.contextMetadataCursorStatic":`sélectionné par Cursor`,"models.contextMetadataSnapshot":`enregistré`,"models.contextMetadataFallback":`repli`,"models.contextMetadataDerived":`dérivé`,"models.contextMetadataUnknown":`inconnu`,"models.contextMetadataStale":`périmé`,"models.contextTooltipDetected":`{value} · détecté`,"models.contextTooltipCapped":`{detected} détecté · plafonné à {cap}`,"models.contextTooltipStale":`{value} ({when})`,"models.contextTooltipUnknown":`Fenêtre de contexte inconnue`,"models.contextTooltipSource":`{value} ({source})`,"models.contextLastChecked":`dernière vérif. {when}`,"models.contextYesterday":`hier`,"models.setAll":`Tout définir`,"models.setAllHint":`Active la fenêtre par défaut {value} pour chaque fournisseur routé. Si un relais omet context_window / context_length, cette valeur devient la fenêtre Codex réelle. Pour un seul modèle, utilisez « Fenêtres perso » sur la même ligne. Les fournisseurs natifs ne sont pas affectés.`,"models.collapseAll":`Tout réduire`,"models.expandAll":`Tout développer`,"models.orderHint":`Ordre du sélecteur : choix des sous-agents (dans l’ordre sélectionné) → autres modèles routés, classés par ordre alphabétique du fournisseur puis par ID de modèle → modèles natifs. Les options de visibilité ne font que filtrer les modèles ; elles ne modifient pas cet ordre.`,"models.custom":`Personnalisé…`,"models.customApply":`Appliquer`,"models.customPlaceholder":`Jetons (p. ex. 420000)`,"models.customAdd":`Ajouter un modèle personnalisé`,"models.customAddTitle":`Ajouter un modèle personnalisé — {provider}`,"models.customEditTitle":`Modifier le modèle personnalisé — {provider}`,"models.customAdded":`Modèle personnalisé ajouté`,"models.customUpdated":`Modèle personnalisé mis à jour`,"models.customDeleted":`Modèle personnalisé supprimé`,"models.customSaveFailed":`Échec de l’enregistrement du modèle personnalisé`,"models.customSaving":`Enregistrement…`,"models.customAddBtn":`Ajouter`,"models.customEditBtn":`Mettre à jour`,"models.customEditNamed":`Modifier {name}`,"models.customDeleteNamed":`Supprimer {name}`,"models.customDeleteConfirm":`Supprimer le modèle {name} ?`,"models.customBadge":`Personnalisé`,"models.customSummary":`{count} personnalisés`,"models.customFieldModelId":`ID du modèle (slug du point de terminaison)`,"models.customFieldModelIdPlaceholder":`p. ex. qwen4-max-preview`,"models.customFieldDisplayName":`Nom d’affichage (facultatif)`,"models.customFieldDisplayNamePlaceholder":`p. ex. Qwen 4 Max Preview`,"models.customFieldContext":`Fenêtre de contexte`,"models.customFieldModalities":`Modalités d’entrée`,"models.customFieldReasoning":`Effort de raisonnement`,"models.customFieldReasoningOverride":`Remplacer l’effort de raisonnement`,"models.reasoningEffort.none":`Aucun`,"models.reasoningEffort.minimal":`Minimal`,"models.reasoningEffort.low":`Faible`,"models.reasoningEffort.medium":`Moyen`,"models.reasoningEffort.high":`Élevé`,"models.reasoningEffort.xhigh":`Très élevé`,"models.reasoningEffort.max":`Maximum`,"models.tipProvider":`Fournisseur`,"models.tipContext":`Contexte`,"models.tipModalities":`Modalités`,"models.tipStatus":`État`,"models.tipActive":`Actif`,"models.tipDisabled":`Désactivé`,"models.applied":`Appliqué — prend effet au prochain tour Codex.`,"models.saveFailed":`Échec de l’enregistrement`,"models.networkError":`Erreur réseau — le proxy est-il en cours d’exécution ?`,"models.loadFail":`Échec du chargement des modèles — le proxy est-il en cours d’exécution ?`,"models.noRouted":`Aucun modèle routé`,"models.noRoutedHint":`Se connecter d’abord à un fournisseur ou en ajouter un.`,"models.emptyDiscovery":`Aucun modèle n’a été détecté. Vérifiez le point de terminaison du fournisseur ou ajoutez un modèle statique/personnalisé.`,"models.emptyDiscoveryDisabled":`La détection dynamique des modèles est désactivée et aucun modèle statique n’est configuré.`,"models.discoveryFailedBadge":`Échec de la détection`,"models.discoveryFailedHttp":`Échec de la détection des modèles (HTTP {status}).`,"models.discoveryFailedBlocked":`La détection des modèles a été bloquée par la politique de destination.`,"models.discoveryFailedInvalidResponse":`La détection des modèles a renvoyé une réponse non valide.`,"models.discoveryFailedNetwork":`La détection des modèles a échoué en raison d’une erreur réseau.`,"models.discoveryFailedProvider":`Le fournisseur a signalé une erreur de détection des modèles.`,"models.discoveryFailedGeneric":`Échec de la détection des modèles.`,"models.openProviderSettings":`Ouvrir les paramètres du fournisseur`,"models.loading":`Chargement…`,"models.search":`Rechercher des modèles…`,"models.showMore":`Afficher {n} de plus`,"models.allowlistLabel":`Sélection uniquement`,"models.allowlistHint":`Seuls les modèles cochés sont inclus dans le catalogue (vide = tous). Utile pour les fournisseurs proposant des milliers de modèles.`,"models.selectedCount":`{n} sélectionnés`,"sub.subtitle":`La commande {cmd} de Codex ne présente que les 5 premiers modèles (par priorité) comme remplacements. Choisissez-en jusqu’à 5 ici — natifs gpt ou routés — et opencodex définit leur priorité dans le catalogue pour qu’ils apparaissent en tête. Tout autre modèle reste accessible par son nom exact ; ceci contrôle uniquement ce qui est affiché.`,"sub.featured":`À la une`,"sub.orderHint":`L’ordre affiché ici détermine les positions 1 à 5 en haut du sélecteur de modèles Codex et les modèles candidats par défaut pour {cmd}.`,"sub.noneSelected":`Aucun modèle sélectionné — faites votre choix dans la liste ci-dessous.`,"sub.models":`Modèles`,"sub.search":`Rechercher des modèles (gpt natifs + routés)…`,"sub.settings":`Paramètres`,"sub.sections":`Sections des sous-agents`,"sub.delegation.model":`Modèle à appeler en premier`,"sub.delegation.modelHint":`Le modèle que Codex sollicite en premier lorsqu’il délègue une tâche. La liste À la une ci-dessus contient les modèles qu’il peut appeler ; celui-ci est appelé en premier.`,"sub.noModels":`Aucun modèle — connectez-vous d’abord à un fournisseur ou ajoutez-en un.`,"sub.saved":`{n} modèles enregistrés. Démarrez une nouvelle session Codex (ou exécutez {cmd}) pour les voir comme remplacements de spawn_agent.`,"sub.saveFailed":`Échec de l’enregistrement`,"sub.networkError":`Erreur réseau — le proxy est-il en cours d’exécution ?`,"sub.loadFail":`Échec du chargement des modèles — le proxy est-il en cours d’exécution ?`,"sub.loading":`Chargement…`,"sub.moveUp":`Monter {m}`,"sub.moveDown":`Descendre {m}`,"sub.removeAria":`Retirer {m}`,"sub.workspace.addToFeatured":`Ajouter {m} à la sélection À la une`,"sub.workspace.allModels":`Tous les modèles`,"sub.workspace.featuredFull":`La liste À la une est complète (5 maximum)`,"sub.workspace.mainAria":`Détails du modèle de sous-agent`,"sub.workspace.notFeatured":`Non mis à la une`,"sub.workspace.priority":`Priorité`,"sub.ultraMode":`Mode Ultra`,"sub.ultraModeHint":`Activer la politique de délégation multi-agent proactive pour tous les modèles et niveaux de raisonnement (sans modifier le niveau de raisonnement lui-même). Écrit features.multi_agent_v2.multi_agent_mode_hint_text dans config.toml.`,"sub.ultraModeV2Required":`Nécessite l’interface multi-agent v2 — activez multi_agent_v2 et sélectionnez d’abord v2 dans le contrôle du mode Sous-agent.`,"sub.ultraModeText":`Texte de délégation du mode Ultra`,"sub.ultraModePreset":`Rétablir le préréglage`,"sub.ultraModeLoadFail":`Échec du chargement des paramètres du mode Ultra — le proxy est-il en cours d’exécution ?`,"sub.ultraModeSaveFail":`Échec de l’enregistrement des paramètres du mode Ultra`,"sub.ultraModeSaved":`Mode Ultra enregistré. S’applique aux nouvelles sessions Codex.`,"sub.nativeParentOverride":`Acheminer les parents V2 natifs`,"sub.nativeParentOverrideHint":`Codex peut afficher le modèle natif d’origine tandis qu’OpenCodex exécute la racine sur la cible routée sélectionnée.`,"sub.nativeParentOverridePrivacyWarning":`Les prompts, le contexte du dépôt, l’historique de conversation et les résultats des outils sont envoyés au fournisseur sélectionné et héritent de sa disponibilité, son contexte, sa latence, son comportement, son coût et ses caractéristiques de confidentialité.`,"sub.nativeParentOverrideModel":`Modèle cible du parent natif`,"sub.nativeParentOverrideV2Required":`Nécessite V2 explicite, le flag V2 amont et la désactivation de « garder ChatGPT sur v1 ».`,"sub.nativeParentOverrideSaveFail":`Impossible d’enregistrer le routage du parent natif`,"sub.nativeParentOverrideSaved":`Routage du parent natif enregistré. S’applique aux tours suivants du parent et à la compaction.`,"sub.agentTaskRecovery":`Récupérer les tâches V2 chiffrées`,"sub.agentTaskRecoveryHint":`Déchiffre les messages de tâche chiffrés Fernet d’OpenAI via ChatGPT afin que les sous-agents non-OpenAI puissent exécuter les tâches V2.`,"sub.agentTaskRecoveryModel":`Modèle de récupération (par défaut : gpt-5.6-luna)`,"sub.agentTaskRecoverySaveFail":`Échec de l’enregistrement de la récupération des tâches chiffrées`,"sub.agentTaskRecoverySaved":`Paramètre de récupération des tâches chiffrées enregistré.`,"sub.roles":`Rôles`,"sub.roles.hint":`Spécialistes nommés que le parent peut lancer. Chaque rôle fixe un modèle et le prompt de l’enfant. Le parent décide toujours quand déléguer.`,"sub.roles.add":`Ajouter un rôle`,"sub.roles.empty":`Aucun rôle pour l’instant. Ajoutez un spécialiste pour la revue, la recherche ou d’autres tâches déléguées.`,"sub.roles.full":`Le catalogue de rôles est plein (max. 8)`,"sub.roles.id":`Nom du rôle`,"sub.roles.description":`Quand l’utiliser`,"sub.roles.descriptionHint":`Montré au parent pour qu’il sache quand lancer ce spécialiste.`,"sub.roles.model":`Modèle`,"sub.roles.effort":`Effort de raisonnement`,"sub.roles.effortNone":`Défaut du modèle`,"sub.roles.instructions":`Instructions enfant`,"sub.roles.instructionsHint":`Prompt développeur chargé par l’agent enfant.`,"sub.roles.enabled":`Activé`,"sub.roles.delete":`Supprimer le rôle {id}`,"sub.roles.save":`Enregistrer les rôles`,"sub.roles.saved":`Rôles enregistrés. S’applique aux nouvelles sessions Codex.`,"sub.roles.saveFailed":`Échec de l’enregistrement des rôles`,"sub.roles.loadFail":`Impossible de charger les rôles — le proxy tourne-t-il ?`,"sub.roles.routedV2Warning":`Ce rôle utilise un modèle routé sur la surface v2 sans garder ChatGPT en v1. Les parents v2 natifs chiffrent les tâches enfants.`,"sub.roles.sync":`Synchroniser vers les fichiers d’agent Codex`,"sub.roles.syncHint":`Écrit les rôles activés dans des fichiers ocx-*.toml marqués. Désactivé, cela élague les fichiers OpenCodex et laisse les vôtres.`,"sub.injectionPrompt":`Conseils parent personnalisés`,"sub.injectionPromptHint":`Remplace le texte v2 intégré. Laissez vide pour le texte par défaut. Incluez des espaces réservés pour les valeurs live :`,"sub.injectionPromptSave":`Enregistrer les conseils parent`,"sub.injectionPromptSaved":`Conseils parent enregistrés. S’applique aux nouvelles sessions Codex.`,"sub.injectionPromptSaveFailed":`Échec de l’enregistrement des conseils parent`,"sub.childInstructions":`Instructions enfant globales`,"sub.childInstructionsHint":`S’applique à chaque enfant lancé. Les instructions de rôle, une fois synchronisées, ne s’appliquent qu’à ce spécialiste.`,"sub.childInstructionsSave":`Enregistrer les instructions enfant`,"sub.childInstructionsSaved":`Instructions enfant enregistrées. S’applique aux nouvelles sessions Codex.`,"sub.childInstructionsSaveFailed":`Échec de l’enregistrement des instructions enfant`,"sub.workspace.removeFromFeatured":`Retirer {m} de la sélection À la une`,"sub.workspace.selectModel":`Sélectionner un modèle`,"sub.workspace.selectModelDesc":`Choisissez un modèle dans la liste pour afficher ses détails et le mettre à la une pour spawn_agent.`,"sub.workspace.selector":`Sélecteur public`,"logs.title":`Journaux des requêtes`,"logs.tabLogs":`Journaux`,"logs.tabDebug":`Débogage`,"logs.subtitle":`Requêtes récentes routées par le proxy opencodex local, de la plus récente à la plus ancienne.`,"logs.autoRefresh":`Actualisation automatique`,"logs.noRequests":`Aucune requête pour le moment.`,"logs.loadError":`Impossible de charger les journaux des requêtes.`,"logs.filter.surface.label":`Interface`,"logs.filter.surface.all":`Toutes`,"logs.filter.surface.claude":`Claude`,"logs.filter.surface.codex":`Codex`,"logs.filter.surface.grok":`Grok`,"logs.filter.interceptedHelpersOnly":`Assistants interceptés uniquement`,"logs.filter.model.label":`Modèle`,"logs.filter.model.all":`Tous les modèles`,"logs.filter.provider.label":`Fournisseur`,"logs.filter.provider.all":`Tous les fournisseurs`,"logs.filter.status.label":`Statut`,"logs.filter.status.all":`Tous les statuts`,"logs.filter.status.success":`Succès (2xx)`,"logs.filter.status.errors":`Erreurs (4xx/5xx)`,"logs.filter.time.label":`Période`,"logs.filter.time.all":`Tout l'historique`,"logs.filter.time.15m":`15 dernières min`,"logs.filter.time.1h":`Dernière heure`,"logs.filter.time.24h":`Dernières 24h`,"logs.filter.speed.label":`Vitesse`,"logs.filter.speed.all":`Toutes les vitesses`,"logs.filter.speed.slow":`< 15 tok/s`,"logs.filter.speed.medium":`15–50 tok/s`,"logs.filter.speed.fast":`> 50 tok/s`,"logs.filter.reset":`Réinitialiser les filtres`,"logs.filter.showingCount":`{count} sur {total} affichés`,"logs.badge.interceptedHelper":`I · {model}`,"logs.badge.interceptedHelperTitle":`Requête d'assistant interceptée`,"logs.filter.conversation.label":`Conversation`,"logs.filter.conversation.placeholder":`Coller l’ID de conversation`,"logs.filter.conversation.clear":`Effacer`,"logs.filter.conversation.apply":`Filtrer les journaux`,"logs.conversation.totals":`{requests} requêtes · {tokens} jetons · {cost}`,"logs.conversation.scope":`Les totaux couvrent uniquement le tampon circulaire des journaux actuellement chargé.`,"logs.conversation.excluded":`({unpriced} sans tarif, {unmetered} sans mesure exclus du total en ~$)`,"logs.cost.approximate":`env. {amount}`,"logs.cost.lowerBound":`au moins {amount}`,"logs.cost.unavailable":`indisponible`,"logs.detail.conversation":`Conversation`,"logs.badge.claude":`Claude`,"logs.badge.grok":`Grok`,"logs.col.time":`Heure`,"logs.col.request":`Requête`,"logs.col.model":`Modèle`,"logs.col.effort":`Niveau`,"logs.col.provider":`Fournisseur`,"logs.col.status":`État`,"logs.col.tokens":`Jetons`,"logs.col.tokPerSec":`jetons/s`,"logs.col.estimatedCost":`~$`,"logs.metric.tokPerSecTitle":`Jetons de sortie par seconde sur toute la durée de la requête`,"logs.metric.estimatedCostTitle":`Équivalent au tarif catalogue de l’API, et non montant réellement facturé ; aucun tarif n’est disponible en l’absence de correspondance`,"usage.cost.total":`Équivalent au tarif catalogue de l’API (cette période)`,"usage.cost.disclaimer":`Ceci n’est pas un reçu de facturation. L’utilisation d’un abonnement ou les crédits du fournisseur peuvent s’appliquer à la place.`,"usage.cost.unpricedNote":`{count} requêtes exclues (aucun tarif ni donnée d’utilisation)`,"logs.detail.section.basic":`Informations générales`,"logs.detail.route.section":`Décision de routage`,"logs.detail.route.kind":`Type de route`,"logs.detail.route.profile":`Profil`,"logs.detail.route.selected":`Sélection`,"logs.detail.route.candidates":`Candidats`,"logs.detail.route.unknown":`Aucune trace de routage enregistrée pour cette requête (ligne antérieure à la traçabilité).`,"logs.detail.section.performance":`Performances`,"logs.detail.section.cost":`Équivalent au tarif catalogue de l’API`,"logs.detail.section.attempts":`Tentatives de combinaison`,"logs.detail.section.usage":`Utilisation brute`,"logs.detail.ttft":`TTFT`,"logs.detail.costTotal":`Équivalent au tarif catalogue`,"logs.detail.totalTokens":`Nombre total de jetons`,"logs.detail.matchedKey":`Clé de tarif correspondante`,"logs.detail.priceSource":`Source du tarif`,"logs.detail.unavailableReason":`Motif d’indisponibilité`,"logs.detail.copyRequestId":`Copier l’ID de requête`,"logs.detail.copied":`Copié`,"logs.detail.source.jawcode":`Catalogue jawcode`,"logs.detail.source.expected":`Remplacement par le tarif attendu`,"logs.detail.source.user":`Remplacement par le tarif configuré pour le fournisseur`,"logs.detail.verification.verified":`Vérifié`,"logs.detail.verification.derived":`Dérivé du modèle de base`,"logs.detail.attempt.target":`Fournisseur / modèle`,"logs.detail.attempt.reason":`Résultat / motif`,"logs.detail.attempt.completed":`Terminée`,"logs.detail.attempt.e2eNote":`Le débit global en jetons/s est calculé de bout en bout ; chaque tentative utilise sa propre durée.`,"logs.detail.attempt.recovery.transient5xx":`Erreur 5xx temporaire`,"logs.detail.attempt.recovery.connectionReset":`Réinitialisation de la connexion`,"logs.detail.attempt.recovery.emptyCompletion":`Nouvelle tentative après une réponse vide`,"logs.detail.attempt.recovery.oauth401":`Réauthentification OAuth`,"logs.detail.attempt.recovery.key429":`Clé soumise à une limitation de débit (429)`,"logs.detail.attempt.recovery.rateLimit429":`Limitation de débit (429)`,"logs.detail.attempt.recovery.anthropicOauth429":`Limitation de débit OAuth Anthropic (429)`,"logs.detail.attempt.recovery.image413":`Charge utile d’image trop volumineuse (413)`,"logs.detail.attempt.recovery.unknown":`Motif de récupération inconnu`,"logs.detail.reason.usage_missing":`L’utilisation n’a pas été communiquée.`,"logs.detail.reason.usage_unsupported":`Ce fournisseur ne communique pas l’utilisation.`,"logs.detail.reason.output_missing":`Aucun nombre positif de jetons de sortie n’a été communiqué.`,"logs.detail.reason.invalid_duration":`La durée de la requête n’est pas valide.`,"logs.detail.reason.price_unmatched":`Aucun tarif correspondant n’a été trouvé.`,"logs.detail.reason.invalid_cache_breakdown":`Le détail des jetons du cache est incompatible avec le nombre total de jetons d’entrée.`,"logs.detail.reason.invalid_usage":`Les données d’utilisation contiennent une valeur de jetons non valide.`,"logs.detail.reason.combo_attempt_unavailable":`Au moins une tentative de combinaison n’a pas pu être chiffrée.`,"logs.detail.estimate.usage_estimated":`L’utilisation du fournisseur est estimée.`,"logs.detail.estimate.cache_detail_missing":`Les détails du cache n’étaient pas disponibles ; l’entrée est une estimation de la limite supérieure.`,"logs.detail.estimate.expected_price_overlay":`Un tarif catalogue attendu et vérifié a été utilisé.`,"logs.detail.estimate.provider_cost_overlay":`Un remplacement de tarif configuré pour le fournisseur a été utilisé.`,"logs.detail.estimate.priority_lower_bound":`Le tarif Priority confirmé n’est pas disponible ; l’estimation affichée est une borne inférieure connue.`,"logs.col.error":`Erreur`,"logs.col.upstreamReason":`Motif en amont`,"logs.col.duration":`Durée`,"logs.modelTooltip.model":`modèle`,"logs.modelTooltip.resolvedModel":`modèle résolu`,"logs.modelTooltip.requestedTier":`niveau demandé`,"logs.modelTooltip.configuredTier":`niveau configuré`,"logs.modelTooltip.responseTier":`niveau de réponse`,"logs.modelTooltip.supportsTier":`prise en charge du niveau`,"logs.tokens.reported":`communiqués`,"logs.tokens.unreported":`non communiqués`,"logs.tokens.unsupported":`non pris en charge`,"logs.tokens.estimated":`estimés`,"logs.tokens.input":`entrée`,"logs.tokens.output":`sortie`,"logs.tokens.cacheRead":`lecture du cache (c)`,"logs.tokens.cacheWrite":`écriture dans le cache (w)`,"logs.tokens.reasoning":`raisonnement`,"logs.tokens.noCache":`aucune donnée de cache`,"logs.tokens.contextTotal":`contexte actif`,"logs.tokens.noCacheNote":`ce fournisseur ne communique pas les jetons du cache`,"logs.tokens.noCacheCursor":`détails du cache Cursor non communiqués`,"logs.tokens.noCacheCursorNote":`Cursor n’indique pas le nombre de jetons lus/écrits dans le cache ; la valeur est inconnue et ne constitue pas un défaut de cache confirmé`,"logs.tokens.estimatedNote":`estimés (le fournisseur ne communique pas l’utilisation exacte)`,"logs.details":`Détails`,"logs.detailTitle":`Détails de la requête`,"logs.detailRaw":`Entrée de journal brute`,"debug.title":`Débogage`,"debug.subtitle":`Diagnostics facultatifs du transport des fournisseurs et de l’extraction de l’utilisation. Les erreurs de requête et les erreurs 502 restent dans l’onglet Journaux.`,"debug.debug":`Débogage du fournisseur`,"debug.usage":`Extraction de l’utilisation`,"debug.injection":`Journal des injections`,"debug.claude":`Entrées Claude`,"debug.claudeInbound.title":`Requêtes entrantes Claude`,"debug.claudeInbound.sub":`Ce que Claude Code/Desktop envoie réellement (thinking, effort, métadonnées) — aucun texte de prompt n’est stocké.`,"debug.claudeInbound.empty":`Aucune requête capturée pour le moment. Envoyez un message depuis Claude pendant que cette option est activée.`,"debug.claudeInbound.time":`Heure`,"debug.claudeInbound.endpoint":`Point de terminaison`,"debug.claudeInbound.model":`Modèle`,"debug.claudeInbound.none":`aucun`,"debug.reset":`Effacer les remplacements d’exécution`,"debug.refresh":`Actualiser`,"debug.follow":`Suivre`,"debug.streamProvider":`Fournisseur`,"debug.streamUsage":`Utilisation`,"debug.streamInjection":`Injection`,"debug.loading":`Chargement des paramètres de débogage…`,"debug.loadFailed":`Impossible de charger les paramètres de débogage.`,"debug.emptyTitle":`La journalisation de débogage est désactivée`,"debug.empty":`Activez Débogage du fournisseur ou Extraction de l’utilisation dans la carte ci-dessus. Les lignes apparaîtront ici après l’envoi d’une requête par le proxy.`,"debug.noLinesTitle":`En attente de lignes`,"debug.noLines.provider":`Le débogage du fournisseur est activé, mais il n’enregistre que les anomalies de transport (trames abandonnées ou mal formées, et événements de connexion/nouvelle tentative Cursor). Une requête sans anomalie auprès d’un fournisseur comme Anthropic peut ne produire aucune ligne.`,"debug.noLines.usage":`L’extraction de l’utilisation est activée, mais rien n’a encore été capturé. Envoyez une conversation ou une requête par Codex pour qu’elle apparaisse ici.`,"debug.noLines.injection":`Le journal des injections est activé, mais rien n’a encore été capturé. Il consigne l’injection des directives multi-agents et les décisions de plafonnement du niveau lors des tours collab et des sous-agents.`,"usage.title":`Utilisation`,"usage.subtitle":`Comptabilisation locale des jetons par votre proxy. Une utilisation manquante n’est jamais affichée comme nulle.`,"usage.loading":`Chargement des données d’utilisation…`,"usage.empty":`Aucune utilisation enregistrée pour le moment. Envoyez une requête par le proxy pour voir l’activité ici.`,"usage.loadError":`Impossible de charger les données d’utilisation.`,"usage.range.all":`Tout`,"usage.range.available":`Historique disponible`,"usage.historyTruncated":`Les totaux couvrent uniquement l’historique disponible, car les données d’utilisation plus anciennes n’ont pas été chargées.`,"usage.historyTruncatedWindow":`Les heures de début des requêtes dans les lignes chargées vont de {start} à {end}. Les entrées antérieures du fichier ont été omises en raison de la limite de lecture ; toute période sélectionnée peut donc être incomplète.`,"usage.range.30d":`30 j`,"usage.range.7d":`7 j`,"usage.card.requests":`Requêtes`,"usage.card.measured":`Mesurées`,"usage.card.reported":`Communiquées`,"usage.card.totalTokens":`Nombre total de jetons`,"usage.card.cachedTokens":`Lectures du cache`,"usage.card.cachedTokensHint":`Jetons de prompt servis depuis le cache du fournisseur (lectures). Les écritures dans le cache sont indiquées ci-dessous lorsqu’elles sont présentes.`,"usage.card.cacheWriteTokens":`écritures dans le cache`,"usage.card.coverage":`Couverture`,"usage.card.activeDays":`Jours actifs`,"usage.section.heatmap":`Activité quotidienne`,"usage.section.overview":`Vue d’ensemble`,"usage.section.models":`Modèles`,"usage.section.providers":`Fournisseurs`,"usage.section.coverage":`Répartition de la couverture`,"usage.workspace.report":`Rapport d’utilisation`,"usage.workspace.sections":`Sections d’utilisation`,"usage.coverage.measured":`Mesurée`,"usage.coverage.reported":`Communiquée par le fournisseur`,"usage.coverage.estimated":`Estimée`,"usage.coverage.note":`Les entrées mesurées comprennent les nombres de jetons communiqués par le fournisseur et ceux qui sont estimés. Les requêtes non communiquées ou non prises en charge sont suivies, mais ne sont jamais artificiellement comptées comme zéro jeton.`,"usage.search.models":`Rechercher des modèles…`,"usage.col.requests":`Requêtes`,"usage.col.measured":`Mesurées`,"usage.col.reported":`Communiquées`,"usage.col.tokens":`Jetons`,"usage.col.share":`Part`,"usage.heatmap.less":`Moins`,"usage.heatmap.more":`Plus`,"usage.dayMon":`Lun`,"usage.dayWed":`Mer`,"usage.dayFri":`Ven`,"usage.heatmap.tooltipTokens":`{tokens} jetons`,"usage.heatmap.tooltipRequests":`{requests} requêtes`,"usage.chart.dayDetail":`{date} : {requests} requêtes, {tokens} jetons`,"usage.heatmap.keyboardLabel":`Utilisez Haut et Bas pour changer de jour ; Gauche et Droite pour changer de semaine.`,"nav.storage":`Stockage`,"storage.title":`Stockage`,"storage.subtitle":`Consultez l’espace utilisé dans CODEX_HOME. Le nettoyage ne touche jamais aux sessions actives.`,"storage.loading":`Analyse du stockage…`,"storage.empty":`CODEX_HOME est vide ou absent — rien à signaler.`,"storage.error":`Échec de l’analyse du stockage. Vérifiez que CODEX_HOME pointe vers un répertoire valide.`,"storage.refresh":`Relancer l’analyse`,"storage.rescanned":`Analyse terminée.`,"storage.card.total":`Taille totale`,"storage.card.files":`Fichiers`,"storage.card.home":`CODEX_HOME`,"storage.snapshot.lastScan":`Dernière analyse`,"storage.snapshot.scanning":`Analyse…`,"storage.snapshot.unavailable":`Aucune analyse pour le moment.`,"storage.cleanupCard.title":`Libérer de l’espace`,"storage.cleanupCard.tabs":`Options de nettoyage`,"storage.cleanupCard.tab.policy":`Politique`,"storage.cleanupCard.tab.quarantine":`Quarantaine`,"storage.cleanup.noArchives":`Aucune session archivée à nettoyer.`,"storage.section.buckets":`Catégories`,"storage.section.largest":`Fichiers les plus volumineux`,"storage.workspace.overview":`Vue d’ensemble`,"storage.workspace.selectBucket":`Sélectionnez une catégorie dans la liste pour afficher sa répartition.`,"storage.col.bucket":`Catégorie`,"storage.col.size":`Taille`,"storage.col.files":`Fichiers`,"storage.col.oldest":`Plus ancien`,"storage.col.newest":`Plus récent`,"storage.col.rows":`Lignes de la BDD`,"storage.rows.unknown":`inconnu (verrouillé)`,"storage.bucket.sessions":`Sessions actives`,"storage.bucket.archived_sessions":`Sessions archivées`,"storage.bucket.logs_db":`Base de données des journaux`,"storage.bucket.state_db":`Base de données d’état`,"storage.bucket.attachments":`Pièces jointes`,"storage.bucket.deletion_manifests":`Manifestes de suppression`,"storage.bucket.other":`Autres`,"storage.cleanup.title":`Nettoyage des archives`,"storage.cleanup.help":`Supprimez un pourcentage des sessions archivées les plus anciennes. Les sessions actives ne sont jamais touchées. La quarantaine est le mode par défaut : les fichiers sont déplacés vers CODEX_HOME/.trash.`,"storage.cleanup.slider":`Pourcentage d’archives les plus anciennes`,"storage.cleanup.percent":`{percent} %`,"storage.cleanup.preset":`{percent}`,"storage.cleanup.preview":`Aperçu`,"storage.cleanup.confirmTitle":`Confirmer le nettoyage des archives`,"storage.cleanup.confirmBody":`Cette opération traitera {count} fichier(s) archivé(s) (~{size}), soit les {percent} % les plus anciens.`,"storage.cleanup.moreFiles":`…et {n} de plus`,"storage.cleanup.permanent":`Supprimer définitivement (sans quarantaine)`,"storage.cleanup.permanentWarn":`La suppression définitive est irréversible.`,"storage.cleanup.quarantineNote":`Les fichiers sont déplacés vers .trash sous CODEX_HOME. Vous pouvez les restaurer depuis l’onglet Quarantaine.`,"storage.cleanup.cancel":`Annuler`,"storage.cleanup.confirmQuarantine":`Mettre en quarantaine`,"storage.cleanup.confirmPermanent":`Supprimer définitivement`,"storage.cleanup.doneQuarantine":`{count} fichier(s) mis en quarantaine ({size}).`,"storage.cleanup.donePermanent":`{count} fichier(s) supprimé(s) définitivement ({size}).`,"storage.cleanup.previewFailed":`Échec de l’aperçu.`,"storage.cleanup.cleanupFailed":`Échec du nettoyage.`,"storage.cleanup.err.codex_busy":`Codex utilise state.sqlite — réessayez après avoir quitté Codex.`,"storage.cleanup.err.stale_preview":`Les fichiers archivés ont changé depuis l’aperçu — relancez l’aperçu.`,"storage.cleanup.err.restore_pending_overlap":`Les archives sélectionnées chevauchent une restauration incomplète depuis la corbeille — terminez ou relancez d’abord la restauration.`,"storage.cleanup.err.referenced_history":`Les archives sélectionnées sont encore référencées par un historique dérivé ou paginé.`,"storage.cleanup.err.invalid_digest":`L’empreinte de l’aperçu est absente ou non valide.`,"storage.cleanup.err.invalid_mode":`Le mode de nettoyage doit être la quarantaine ou la suppression définitive.`,"storage.cleanup.err.fs_failed":`Échec du nettoyage du système de fichiers. Certaines modifications ont peut-être déjà été appliquées — vérifiez CODEX_HOME/.trash et tout chemin de récupération indiqué.`,"storage.cleanup.err.fs_failed_trash":`Échec du nettoyage du système de fichiers. Certaines modifications ont peut-être déjà été appliquées — recherchez les fichiers récupérables dans {trashDir} et manifest.json.`,"storage.cleanup.err.db_reconcile_failed":`Impossible de mettre à jour la base de données d’état de Codex.`,"storage.cleanup.err.cleanup_failed":`Échec du nettoyage.`,"storage.trash.title":`Quarantaine`,"storage.trash.help":`Sessions archivées déplacées vers CODEX_HOME/.trash. La restauration remet en place les fichiers JSONL et les lignes de conversation.`,"storage.trash.empty":`Aucune entrée en quarantaine.`,"storage.trash.loading":`Chargement de la quarantaine…`,"storage.trash.col.when":`Mise en quarantaine`,"storage.trash.col.files":`Fichiers`,"storage.trash.col.size":`Taille`,"storage.trash.col.mode":`Mode`,"storage.trash.col.id":`Entrée`,"storage.trash.restore":`Restaurer`,"storage.trash.confirmTitle":`Restaurer l’entrée de quarantaine ?`,"storage.trash.confirmBody":`Restaurer {count} fichier(s) (~{size}) depuis {id} vers les sessions archivées.`,"storage.trash.cancel":`Annuler`,"storage.trash.confirmRestore":`Restaurer`,"storage.trash.done":`{count} fichier(s) restauré(s) ({size}).`,"storage.trash.restoreFailed":`Échec de la restauration.`,"storage.trash.listFailed":`Impossible d’afficher les entrées de quarantaine.`,"storage.trash.mode.quarantine":`quarantaine`,"storage.trash.mode.permanent":`définitif (incomplet)`,"storage.trash.err.codex_busy":`Codex utilise state.sqlite — réessayez après avoir quitté Codex.`,"storage.trash.err.invalid_trash":`L’ID de l’entrée de la corbeille est absent ou non valide.`,"storage.trash.err.missing_trash":`L’entrée de la corbeille est introuvable.`,"storage.trash.err.dest_exists":`La destination de restauration existe déjà — supprimez ou renommez le fichier archivé, puis réessayez.`,"storage.trash.err.fs_failed":`Échec de la restauration du système de fichiers. Certains fichiers ont peut-être déjà été restaurés — vérifiez archived_sessions et .trash.`,"storage.trash.err.db_reconcile_failed":`Impossible de restaurer les lignes de la base de données d’état de Codex.`,"storage.trash.err.storage_mutation_busy":`Un autre nettoyage ou une autre restauration du stockage est en cours — réessayez dans quelques instants.`,"storage.trash.err.restore_failed":`Échec de la restauration.`,"storage.trash.err.restore_worker_timeout":`La restauration a pris trop de temps (plus de 10 minutes) et a été arrêtée.`,"storage.trash.err.restore_worker_aborted":`La restauration a été annulée lors de l’arrêt.`,"storage.trash.err.restore_worker_failed":`Le processus de restauration s’est interrompu ou a échoué de manière inattendue.`,"storage.policy.title":`Politique de nettoyage automatique`,"storage.policy.help":`Nettoyage facultatif par lots lorsque les sessions archivées dépassent un seuil. Désactivé par défaut — jamais activé automatiquement.`,"storage.policy.loading":`Chargement de la politique…`,"storage.policy.loadFailed":`Impossible de charger la politique de nettoyage.`,"storage.policy.saveFailed":`Impossible d’enregistrer la politique de nettoyage.`,"storage.policy.runFailed":`Échec de l’exécution de la politique.`,"storage.policy.alreadyRunning":`Une exécution de la politique de nettoyage est déjà en cours.`,"storage.policy.invalid":`Valeurs de politique non valides.`,"storage.policy.enabled":`Activer le nettoyage automatique`,"storage.policy.enabledHint":`Cette option est désactivée par défaut. Une fois activée, elle ne s’exécute que selon la planification choisie (ou avec Exécuter maintenant).`,"storage.policy.threshold":`Lorsque la taille des archives dépasse (Gio)`,"storage.policy.trigger":`Déclencheur`,"storage.policy.target":`Objectif du nettoyage`,"storage.policy.targetPercent":`Supprimer les archives les plus anciennes (%)`,"storage.policy.targetReduce":`Réduire la taille des archives à (Gio)`,"storage.policy.thresholdInc":`Augmenter le seuil`,"storage.policy.thresholdDec":`Diminuer le seuil`,"storage.policy.percentInc":`Augmenter le pourcentage`,"storage.policy.percentDec":`Diminuer le pourcentage`,"storage.policy.reduceInc":`Augmenter la taille cible`,"storage.policy.reduceDec":`Diminuer la taille cible`,"storage.policy.schedule":`Planification`,"storage.policy.schedule.manual":`Manuel uniquement`,"storage.policy.schedule.startup":`Au démarrage du proxy`,"storage.policy.schedule.daily":`Quotidienne`,"storage.policy.schedule.weekly":`Hebdomadaire`,"storage.policy.mode":`Mode de suppression`,"storage.policy.mode.quarantine":`Quarantaine (par défaut)`,"storage.policy.mode.permanent":`Suppression définitive`,"storage.policy.permanentWarn":`Le mode définitif est irréversible. Préférez la quarantaine sauf si vous êtes certain de votre choix.`,"storage.policy.lastRun":`Dernière exécution`,"storage.policy.lastRunDetail":`{count} supprimés · {size} libérés`,"storage.policy.nextRun":`Prochaine exécution`,"storage.policy.never":`Jamais`,"storage.policy.save":`Enregistrer`,"storage.policy.runNow":`Exécuter maintenant`,"storage.policy.running":`Exécution…`,"storage.policy.saved":`Politique enregistrée.`,"storage.policy.skippedDisabled":`La politique est désactivée — activez-la d’abord.`,"storage.policy.skippedUnder":`La taille des archives est inférieure au seuil — aucune action nécessaire.`,"storage.policy.skippedEmpty":`Aucune archive candidate ne correspond à l’objectif.`,"storage.policy.doneQuarantine":`La politique a mis {count} fichier(s) en quarantaine ({size}).`,"storage.policy.donePermanent":`La politique a supprimé définitivement {count} fichier(s) ({size}).`,"modal.addNamed":`Ajouter : {label}`,"modal.add":`Ajouter un fournisseur`,"modal.catalogTabs":`Catégories de fournisseurs`,"modal.searchLabel":`Rechercher des fournisseurs`,"modal.search":`Rechercher des fournisseurs…`,"modal.logInWith":`Se connecter avec {label}`,"modal.waitingBrowser":`En attente du navigateur…`,"modal.providerName":`Nom du fournisseur`,"modal.adapter":`Adaptateur`,"modal.baseUrl":`URL de base`,"modal.endpoint":`Point de terminaison`,"modal.endpoint.tokenPlan":`Forfait de jetons`,"modal.endpoint.payAsYouGo":`Paiement à l’utilisation`,"modal.endpoint.custom":`Personnalisé`,"modal.defaultModel":`Modèle par défaut (facultatif)`,"modal.allowPrivateNetwork":`Autoriser le réseau local/privé`,"modal.allowPrivateNetworkHint":`À activer uniquement pour les fournisseurs volontairement auto-hébergés. Les points de terminaison de métadonnées restent bloqués.`,"modal.nameRequired":`Le nom du fournisseur est requis`,"modal.baseUrlRequired":`L’URL de base est requise`,"modal.networkError":`Erreur réseau — le proxy est-il en cours d’exécution ?`,"modal.loginFailStart":`Échec du lancement de la connexion`,"modal.waitingLogin":`En attente de la connexion dans le navigateur…`,"modal.loggingIn":`Connexion…`,"modal.loginTimeout":`Délai de connexion dépassé — réessayez.`,"modal.back":`Retour`,"modal.badge.oauth":`OAuth`,"modal.customProvider":`Fournisseur personnalisé`,"replitGateway.title":`Compagnon passerelle Replit`,"replitGateway.subtitle":`Connectez votre passerelle Replit auto-hébergée et installez ensemble les fournisseurs OpenAI Chat et Anthropic associés.`,"replitGateway.companionNote":`Il s’agit d’un flux compagnon personnalisé, et non d’un préréglage canonique du registre.`,"replitGateway.originLabel":`Origine du déploiement`,"replitGateway.originHint":`Origine HTTPS de votre déploiement Replit (par exemple https://my-app.replit.app).`,"replitGateway.keyLabel":`Clé de passerelle`,"replitGateway.keyHint":`Secret REPLIT_GATEWAY_KEY de votre déploiement. Il est enregistré dans votre configuration locale des fournisseurs et sert à authentifier le trafic vers la passerelle.`,"replitGateway.keyTooShort":`La clé de passerelle est trop courte (32 caractères minimum).`,"replitGateway.keyTooLong":`La clé de passerelle ne doit pas dépasser 512 caractères.`,"replitGateway.keyInvalidChars":`La clé de passerelle ne doit contenir que des caractères ASCII imprimables.`,"replitGateway.errorNetwork":`Impossible de joindre le proxy. Vérifiez qu’il est en cours d’exécution, puis réessayez.`,"replitGateway.errorMalformed":`Le proxy a renvoyé une réponse invalide. Réessayez dans un instant.`,"replitGateway.customDomainLabel":`Autoriser un domaine personnalisé`,"replitGateway.customDomainHint":`Activez cette option uniquement si votre passerelle n’est pas hébergée sur .replit.app.`,"replitGateway.setDefaultLabel":`Définir replit comme fournisseur par défaut après l’installation`,"replitGateway.install":`Installer la paire`,"replitGateway.installing":`Installation…`,"replitGateway.close":`Fermer`,"replitGateway.openButton":`Passerelle Replit…`,"replitGateway.replaceTitle":`Remplacer la paire Replit existante ?`,"replitGateway.replaceBody":`Les fournisseurs replit et replit-anthropic existent déjà. Le remplacement écrase l’origine et la clé de la passerelle tout en conservant vos surcharges.`,"replitGateway.replaceConfirm":`Remplacer la paire`,"replitGateway.replaceCancel":`Conserver l’existant`,"replitGateway.probeHealth":`healthz : HTTP {status} ({ms} ms)`,"replitGateway.probeModels":`models : {count} découvert(s) ({ms} ms)`,"replitGateway.successTitle":`La paire passerelle Replit a été installée.`,"replitGateway.errorGeneric":`Impossible d’installer la paire passerelle Replit.`,"replitGateway.errorCollision":`La paire de fournisseurs Replit existe déjà.`,"replitGateway.errorBusy":`La configuration est occupée. Réessayez dans un instant.`,"replitGateway.originRequired":`L’origine du déploiement est obligatoire.`,"replitGateway.keyRequired":`La clé de passerelle est obligatoire.`,"modal.failedStatus":`Échec ({status})`,"modal.loginError":`Erreur de connexion : {error}`,"modal.badge.codexLogin":`Connexion Codex`,"modal.badge.local":`Local`,"modal.badge.apiKey":`Clé API`,"modal.badge.direct":`Direct`,"modal.badge.pool":`Groupe`,"modal.badge.free":`Gratuit`,"modal.invalidPreset":`Ce préréglage de fournisseur intégré est incomplet. Redémarrez le proxy et réessayez.`,"modal.freeTierTitle":`Offre gratuite`,"modal.freeTierDefault":`Aucune clé API requise. Fonctionne immédiatement.`,"modal.tab.accounts":`Comptes`,"modal.tab.free":`Gratuit`,"modal.tab.paid":`Payant`,"modal.accountsHint":`Connectez-vous ici à ChatGPT/Codex, aux fournisseurs OAuth et aux comptes avec clé API. OpenAI est intégré : connectez-vous au lieu de l’ajouter de nouveau.`,"modal.accountsCodexAuthLink":`Codex Auth`,"modal.notListed":`Fournisseur absent de la liste ? Ajoutez-en un personnalisé`,"modal.catalogLoading":`Chargement du catalogue…`,"modal.catalogLoadFailed":`Impossible de charger le catalogue des fournisseurs.`,"modal.accountLogin":`Se connecter`,"modal.accountLogout":`Se déconnecter`,"modal.accountAdd":`Ajouter un compte`,"modal.accountManage":`Gérer`,"modal.accountCodexPool":`Groupe de comptes ChatGPT`,"modal.accountLoggedIn":`Connecté`,"modal.accountLoggedOut":`Non connecté`,"quota.fiveHourLimit":`Limite sur 5 heures`,"quota.weeklyLimit":`Limite hebdomadaire`,"quota.monthlyLimit":`Limite sur 30 jours`,"quota.cursorFirstParty":`Modèles propriétaires`,"quota.cursorApiUsage":`Utilisation de l’API`,"quota.totalSubscriptionCredits":`Total des crédits d’abonnement`,"quota.creditsBalance":`Solde de crédits`,"quota.creditsPeriodEnds":`La période de facturation se termine le {date}`,"quota.usedPercent":`{pct} % utilisés`,"quota.limitReached":`Limite atteinte`,"quota.resetsToday":`Réinitialisation aujourd’hui à {time}`,"quota.resetsTomorrow":`Réinitialisation demain à {time}`,"quota.resetsAt":`Réinitialisation {when}`,"quota.resetsRelativeMinutes":`Réinitialisation dans {n} min`,"quota.resetsRelativeHours":`Réinitialisation dans {n} h`,"pws.status.ready":`Prêt`,"pws.status.needsSetup":`Configuration requise`,"pws.status.needsAttention":`Attention requise`,"pws.auth.chatgptPassthrough":`Relais ChatGPT`,"pws.auth.noKey":`Aucune clé requise`,"pws.freeTitle":`Tarification gratuite (une clé peut néanmoins être requise)`,"pws.localTitle":`Environnement d’exécution local`,"pws.modelCountOne":`1 modèle`,"pws.modelCount":`{count} modèles`,"pws.rail.suffixDefault":` · par défaut`,"pws.rail.suffixLocal":` · local`,"pws.rail.suffixFree":` · gratuit`,"pws.rail.selectAria":`Sélectionner {name} — {status}{suffix}`,"pws.searchPlaceholder":`Rechercher des fournisseurs…`,"pws.filterAria":`Filtrer les fournisseurs`,"pws.providerFiltersAria":`Filtres des fournisseurs`,"pws.filters":`Filtres`,"pws.filterStatus":`État`,"pws.pricing":`Tarification`,"pws.paid":`Payant`,"pws.filterType":`Type`,"pws.type.cloud":`Cloud`,"pws.type.local":`Local`,"pws.type.selfHosted":`Auto-hébergé`,"pws.type.login":`Connexion`,"pws.sort":`Trier`,"pws.sortProvidersAria":`Trier les fournisseurs`,"pws.sort.az":`A–Z`,"pws.sort.za":`Z–A`,"pws.sort.freePaid":`Gratuits en premier`,"pws.sort.paidFree":`Payants en premier`,"pws.sort.accountsFirst":`Comptes en premier`,"pws.resetAll":`Tout réinitialiser`,"pws.providerList":`Liste des fournisseurs`,"pws.providersAria":`Fournisseurs`,"pws.groupReady":`Prêts ({count})`,"pws.groupNeedsSetup":`Configuration requise ({count})`,"pws.groupDisabled":`Désactivés ({count})`,"pws.noSearchResults":`Aucun fournisseur ne correspond à votre recherche.`,"pws.noMatchFilters":`Aucun fournisseur ne correspond aux filtres.`,"pws.noProvidersConfigured":`Aucun fournisseur configuré.`,"pws.workspaceMainAria":`Détails du fournisseur`,"pws.detailComingSoon":`La vue détaillée sera bientôt disponible — utilisez la vue classique pour gérer ce fournisseur.`,"pws.selectPrompt":`Sélectionnez un fournisseur dans la liste.`,"pws.connectFirst":`Connecter votre premier fournisseur`,"pws.empty.browseFree":`Parcourir les fournisseurs gratuits`,"pws.empty.browseFreeDesc":`Commencez sans abonnement`,"pws.empty.connectAccount":`Connecter un compte`,"pws.empty.connectAccountDesc":`Utilisez votre identifiant ChatGPT ou celui du fournisseur`,"pws.empty.addEndpoint":`Ajouter un point de terminaison`,"pws.empty.addEndpointDesc":`URL de base personnalisée et clé API`,"pws.tab.overview":`Vue d’ensemble`,"pws.tab.models":`Modèles`,"pws.tab.usage":`Utilisation`,"pws.tab.accounts":`Comptes`,"pws.tab.settings":`Paramètres`,"pws.connection":`Connexion`,"pws.status.connected":`Connecté`,"pws.attentionTitle":`Intervention requise`,"pws.attention.reauth":`Le compte actif doit être réauthentifié`,"pws.attention.reauthForward":`Le compte Codex actif doit être réauthentifié — ouvrez Comptes pour corriger le problème`,"pws.attention.missingCredentials":`Identifiants manquants`,"pws.cell.auth":`Authentification`,"pws.cell.note":`Note`,"pws.cell.defaultModel":`Modèle par défaut`,"pws.statsAria":`Statistiques du fournisseur`,"pws.statsTitle":`Statistiques`,"pws.stats.totalRequests":`Requêtes (30 j)`,"pws.stats.totalTokens":`Jetons (30 j)`,"pws.stats.quotaUpdated":`Quota mis à jour`,"pws.stats.quotaTracked":`Limites de débit suivies dans l’onglet Utilisation.`,"pws.stats.source":`Source`,"pws.usageLast30d":`Utilisation (30 derniers jours)`,"pws.allAccounts":`Tous les comptes`,"pws.estimatedCost":`Coût estimé`,"pws.costDisclaimer":`Estimation fondée sur le tarif public de l’API, et non montant réellement facturé.`,"pws.modelBreakdown":`Répartition par modèle`,"pws.col.model":`Modèle`,"pws.col.cost":`Coût est.`,"pws.col.tokens":`Jetons`,"pws.col.requests":`Req.`,"pws.col.share":`Part`,"pws.tokenInput":`Entrée`,"pws.tokenOutput":`Sortie`,"pws.metricRequests":`requêtes`,"pws.metricTokens":`jetons`,"pws.usageUnavailable":`Aucune utilisation enregistrée pour le moment.`,"pws.rateLimits":`Limites de débit`,"pws.quotaUnavailable":`Aucune donnée de quota pour ce fournisseur.`,"pws.accountQuotaUnavailable":`Données de limite de débit temporairement indisponibles ; affichage des dernières valeurs connues, le cas échéant.`,"pws.selected":`Sélectionné`,"pws.copyModelId":`Copier l’ID`,"pws.modelCopied":`Copié !`,"pws.modelsAvailable":`{count} disponibles`,"pws.modelSearchPlaceholder":`Filtrer les modèles…`,"pws.modelsLoading":`Chargement des modèles…`,"pws.modelsLoadFailed":`Impossible de charger les modèles.`,"pws.modelsNeedsReauth":`Le compte doit être reconnecté pour permettre la détection des modèles en direct. Affichage temporaire des modèles configurés.`,"pws.modelsConfiguredFallback":`Affichage des modèles configurés (détection en direct indisponible).`,"pws.modelsTruncated":`Affichage des {shown} premiers modèles sur {total}. Filtrez pour réduire la liste.`,"pws.retry":`Réessayer`,"pws.noModels":`Aucun modèle détecté pour ce fournisseur.`,"pws.noModelMatch":`Aucun modèle ne correspond au filtre.`,"pws.adapterBaseRequired":`L’adaptateur et l’URL de base sont requis.`,"pws.addAccount":`Ajouter un compte`,"pws.addKey":`Ajouter une clé API`,"pws.apiKeys":`Clés API`,"pws.authMode":`Mode d’authentification`,"pws.availableAccounts":`Comptes disponibles`,"pws.accountOrdinal":`Compte {count}`,"pws.accountsLoading":`Chargement des comptes…`,"pws.accountsLoadFailed":`Impossible de charger les comptes.`,"pws.retryAccounts":`Réessayer`,"pws.noAccounts":`Aucun compte connecté pour le moment.`,"pws.cockpitImportDescription":`Importez depuis cet appareil une exportation JSON Antigravity de Cockpit Tools. Le contenu du fichier n’est pas affiché.`,"pws.cockpitImportFileLabel":`Exportation JSON Antigravity de Cockpit Tools`,"pws.cockpitImportChooseFile":`Choisir un fichier JSON`,"pws.cockpitImporting":`Importation…`,"pws.cockpitImportInvalid":`Le fichier sélectionné n’est pas une exportation JSON valide ou est trop volumineux.`,"pws.cockpitImportFailed":`Impossible de terminer l’importation du compte.`,"pws.cockpitImportComplete":`Importation terminée : {imported} importés, {updated} mis à jour, {failed} en échec, {unsupported} non pris en charge.`,"pws.accountSwitching":`Changement…`,"pws.accountCurrent":`Compte actuel`,"pws.defaultModelNone":`Aucun (utiliser la valeur par défaut du fournisseur)`,"pws.discardSettings":`Abandonner les modifications`,"pws.jsonEditorDesc":`Modifiez la configuration JSON brute du fournisseur. Les modifications sont enregistrées immédiatement.`,"pws.jsonEditorTitle":`Éditeur JSON — {name}`,"pws.jsonRestore":`Restaurer`,"pws.jsonSave":`Enregistrer`,"pws.loggedInTitle":`Connecté`,"pws.notLoggedInTitle":`Non connecté`,"pws.note":`Note`,"pws.allowPrivateNetwork":`Autoriser le réseau local/privé`,"pws.liveModels":`Détecter les modèles auprès du fournisseur`,"pws.liveModelsDesc":`Récupérez le catalogue de modèles en direct du fournisseur. Désactivez cette option pour utiliser uniquement les modèles configurés/statiques.`,"pws.xaiResponsesOptIn":`Utiliser l’API Responses pour Grok 4.5 et 4.6`,"pws.xaiResponsesOptInDesc":`Achemine les deux modèles via openai-responses. Les autres modèles Grok et le comportement des tiers restent inchangés.`,"pws.xaiResponsesOptInMixed":`Activation partielle.`,"pws.cursorTransport":`Transport Cursor`,"pws.cursorTransportHttp2":`HTTP/2 (par défaut)`,"pws.cursorTransportHttp1":`HTTP/1.1 (compatibilité proxy)`,"pws.cursorTransportDesc":`Utilisez HTTP/1.1 si votre proxy ne transporte pas de façon fiable le flux HTTP/2 de Cursor.`,"pws.optionalPlaceholder":`Facultatif`,"pws.pacingTitle":`Cadencement des requêtes`,"pws.pacingDesc":`Répartissez uniformément le démarrage des requêtes sortantes pour ce fournisseur. Les réponses diffusées peuvent se chevaucher.`,"pws.pacingEnabled":`Activé`,"pws.pacingRpm":`Requêtes par minute`,"pws.pacingRpmUnit":`RPM`,"pws.pacingDelay":`Intervalle minimal (ms)`,"pws.pacingJitter":`Variation aléatoire (ms)`,"pws.pacingSlowerWins":`La limite la plus lente du fournisseur s’applique. Les remplacements par modèle ne peuvent qu’ajouter un délai.`,"pws.pacingQueued":`en attente`,"pws.pacingNextSlot":`avant le prochain créneau`,"pws.pacingLastModel":`dernier modèle`,"pws.pacingNone":`Aucun`,"pws.pacingModelOverrides":`Remplacements par modèle`,"pws.pacingModel":`Modèle`,"pws.pacingAdd":`Ajouter un remplacement`,"pws.pacingRemove":`Supprimer`,"pws.pacingRemoveModel":`Supprimer le remplacement du cadencement des requêtes pour {model}`,"pws.pacingRuleRequired":`Activez le cadencement des requêtes seulement après avoir défini une limite de fournisseur ou un remplacement par modèle.`,"pws.antigravityTlsTitle":`Profil TLS du navigateur Antigravity`,"pws.antigravityTlsEnable":`Activer l’émulation TLS/HTTP2 expérimentale`,"pws.antigravityTlsWarning":`Fonction de compatibilité non officielle. Elle ne garantit pas le respect des conditions d’utilisation ni l’absence de suspension, peut rendre le trafic plus distinctif et revenir à Bun si l’initialisation échoue. Les routes officielles Gemini par clé API, Vertex ou Code Assist documentées sont plus sûres.`,"pws.antigravityTlsConfirm":`Activer le profil TLS Antigravity expérimental et non officiel ? Il ne garantit pas la conformité et n’empêche pas une suspension. Continuer ?`,"pws.antigravityTlsStatus":`État du profil TLS : {status}`,"pws.antigravityTlsDisabled":`Désactivé`,"pws.antigravityTlsActive":`Actif`,"pws.antigravityTlsFallback":`Repli`,"pws.providerId":`ID du fournisseur`,"pws.reauth":`Réauthentification requise`,"pws.reauthenticate":`Réauthentifier`,"pws.clearCooldown":`Effacer le délai de récupération`,"pws.copyDoctor":`Copier ocx doctor`,"pws.doctorCopied":`Copié`,"pws.doctorCopyUnavailable":`Presse-papiers indisponible`,"pws.healthCooldownHint":`Attendez la fin du délai de récupération. Ne sondez pas encore ce compte.`,"pws.healthLabel.rateLimited":`Débit limité`,"pws.healthLabel.quotaLimited":`Quota limité`,"pws.healthLabel.reauthRequired":`Réauthentification requise`,"pws.healthLabel.refreshFailed":`Actualisation échouée`,"pws.healthLabel.metadataMismatch":`Métadonnées incompatibles`,"pws.healthLabel.credentialConflict":`Conflit d’identifiants`,"pws.healthSummary.rateLimited":`{provider} {account} : débit limité jusqu’à {until}. Le routage de ce compte est suspendu jusque-là.`,"pws.healthSummary.quotaLimited":`{provider} {account} : quota limité jusqu’à {until}. Le routage de ce compte est suspendu jusque-là.`,"pws.healthSummary.reauthRequired":`{provider} {account} : réauthentification requise.`,"pws.healthSummary.credentialConflict":`{provider} {account} : conflit d’identifiants.`,"pws.healthSummary.metadataMismatch":`{provider} {account} : métadonnées incompatibles.`,"pws.healthSummary.staleCredentials":`{provider} {account} : identifiants incomplets.`,"pws.removeConfirm":`Supprimer`,"pws.removeConfirmBody":`Supprimer le fournisseur "{name}" ? Cette action est irréversible.`,"pws.removeDefaultConfirmBody":`Supprimer le fournisseur par défaut "{name}" ? "{defaultProvider}" deviendra le fournisseur par défaut. Cette action est irréversible.`,"pws.removeConfirmTitle":`Supprimer le fournisseur`,"pws.saveSettings":`Enregistrer`,"pws.saving":`Enregistrement…`,"pws.settingsSaved":`Paramètres enregistrés.`,"pws.accountModeSaved":`Mode de compte enregistré.`,"pws.accountModeFailed":`Impossible de changer de mode de compte.`,"pws.accountModeConfirm":`Changer le mode de compte OpenAI ? Les conversations en cours seront réaffectées à l’ensemble de comptes de l’autre mode, et l’utilisation du quota sera suivie selon le nouveau mode.`,"pws.settingsUnsavedBar":`Vous avez des modifications non enregistrées.`,"pws.unsavedLeaveBody":`Vous avez des modifications non enregistrées. Les enregistrer avant de quitter ?`,"pws.unsavedLeaveTitle":`Modifications non enregistrées`,"pws.attentionRequired":`Intervention requise`,"pws.attentionAria":`{name} : {reason}`,"pws.missingCredentials":`Identifiants manquants`,"pws.editJsonDesc":`Modifier la configuration brute du proxy au format JSON`,"pws.updatesUnavailable":`Les mises à jour du fournisseur ne sont pas disponibles.`,"pws.dashboard.title":`Vue d’ensemble des fournisseurs`,"pws.dashboard.subtitle":`Gérez tous vos fournisseurs de modèles au même endroit.`,"pws.dashboard.rateLimits":`LIMITES DE DÉBIT`,"pws.capacity.estimate":`Estimation du groupe pondérée selon la configuration`,"pws.capacity.currentAccount":`Compte effectif actuel`,"pws.capacity.nextRecovery":`Prochaine récupération de capacité`,"pws.capacity.recoveryShare":`+{percent}% de capacité du groupe`,"pws.capacity.incomplete":`Couverture incomplète : {excluded} compte(s) exclus, dont {unknown} forfait(s) inconnu(s)`,"pws.capacity.partial":`Couverture partielle des fenêtres : {count} compte(s) ne signalent pas toutes les fenêtres de limite affichées`,"pws.capacity.windowPartial":`Partielle`,"pws.capacity.windowPartialA11y":`{window} : couverture incomplète des comptes`,"pws.dashboard.recentlyUsed":`UTILISÉS RÉCEMMENT`,"pws.dashboard.requests":`{count} requêtes`,"pws.dashboard.checkedAgo":`Vérifié {time}`,"pws.dashboard.noQuota":`Aucune donnée de quota`,"pws.dashboard.noUsage":`Aucune donnée d’utilisation pour le moment`,"pws.dashboard.noRateLimits":`Aucune donnée de limite de débit pour le moment`,"pws.allProviders":`Vue d’ensemble des fournisseurs`,"pws.enabledLabel":`Activé`,"pws.testConnection":`Tester la connexion`,"pws.testing":`Test…`,"pws.connectionOk":`Connexion réussie`,"pws.connectionFailed":`Échec de la connexion`,"pws.connectionNotApplicable":`Sans objet — ce fournisseur utilise un catalogue de modèles statique.`,"pws.editSettings":`Modifier les paramètres`,"pws.viewUsage":`Afficher l’utilisation détaillée`,"pws.allSystemsOk":`Tous les systèmes sont opérationnels`,"pws.apiKeyConfigured":`Clé API configurée`,"pws.addApiKey":`Ajouter une clé API`,"pws.loggedInAs":`Connecté en tant que {email}`,"pws.notLoggedIn":`Non connecté`,"pws.passthrough":`Transfert direct Codex`,"pws.notes":`NOTES`,"pws.notePlaceholder":`Ajouter une note sur ce fournisseur…`,"pws.noteSaved":`Note enregistrée`,"pws.authSummary":`AUTHENTIFICATION`,"pws.aiStudio":`AI Studio`,"pws.aiStudio.connected":`Connecté`,"pws.aiStudio.checking":`Vérification de la session`,"pws.aiStudio.unsupported":`Connexion native non prise en charge sur cette plateforme`,"pws.aiStudio.needsReauth":`Réauthentification requise`,"pws.aiStudio.reauthenticated":`Réauthentification réussie`,"pws.aiStudio.loginFailed":`Échec de la connexion native`,"pws.aiStudio.connect":`Connecter`,"time.justNow":`À l’instant`,"time.notChecked":`Non vérifié`,"time.minutesAgo":`il y a {n} min`,"time.hoursAgo":`il y a {n} h`,"time.daysAgo":`il y a {n} j`,"modal.noMatch":`Aucun résultat.`,"modal.oauthDefaultNote":`Connectez-vous avec votre compte — aucune clé API requise.`,"modal.oauthComingSoon":`La connexion OAuth pour {label} sera disponible dans la prochaine mise à jour. Utilisez une clé API pour le moment.`,"modal.oauthComingSoonShort":`La connexion OAuth pour ce fournisseur sera disponible dans la prochaine mise à jour — utilisez une clé API pour le moment.`,"modal.useApiKeyInstead":`Utiliser plutôt une clé API`,"modal.setupGuide":`Guide de configuration`,"modal.setupStep1Prefix":`Accédez au`,"modal.setupDashboardLink":`tableau de bord {label}`,"modal.setupStep1Suffix":`et copiez votre clé API`,"modal.setupStep2":`Collez-la dans le champ de clé API ci-dessous`,"modal.setupStep3":`Cliquez sur Ajouter le fournisseur — les modèles sont détectés automatiquement`,"modal.namePlaceholder":`p. ex. openrouter`,"modal.duplicateWarn":`Le fournisseur "{name}" existe déjà et sera remplacé.`,"modal.forwardHintPrefix":`Aucune clé requise — le proxy transmet vos identifiants de`,"modal.forwardCredentials":`connexion Codex`,"modal.forwardHintSuffix":`à ce fournisseur.`,"modal.localHint":`Aucune clé API n’est stockée. Cette option ajoute le catalogue public statique de modèles Cursor pour Codex, mais le transport Cursor en direct et l’exécution native de fichiers/commandes restent désactivés jusqu’à leur audit.`,"modal.getApiKey":`Obtenir votre clé API {label}`,"modal.apiKey":`Clé API`,"modal.apiKeyTransport":`En-tête de clé API`,"modal.apiKeyTransportNative":`x-api-key (natif Anthropic)`,"modal.apiKeyTransportBearer":`Authorization: Bearer`,"modal.apiKeyPlaceholder":`sk-… (ou $ENV_VAR)`,"modal.defaultModelPlaceholder":`p. ex. gpt-5.5`,"modal.baseUrlPlaceholder":`https://...`,"modal.baseUrlPlaceholderError":`L’URL de base contient un {placeholder} non résolu. Remplacez-le par votre valeur réelle.`,"modal.baseUrlPlaceholderHint":`Remplacez le {placeholder} dans l’URL de base par votre ID de compte réel avant l’ajout.`,"modal.adding":`Ajout…`,"modal.useOauthLogin":`← Utiliser la connexion OAuth`,"nav.codexAuth":`Authentification Codex`,"nav.codexSet":`Réglages Codex`,"codexSet.tab.multiauth":`Multi-authentification`,"codexSet.tab.prompt":`Invite`,"codexSet.prompt.title":`Couches d'invite`,"codexSet.prompt.timing":`S'applique aux sessions nouvellement démarrées. Les sessions en cours conservent leurs réglages d'invite actuels.`,"codexSet.prompt.staleRevision":`La configuration a changé ailleurs. La liste a été rechargée.`,"codexSet.prompt.writeFailed":`La modification n'a pas pu être enregistrée.`,"codexSet.prompt.loadFailed":`Les couches d'invite n'ont pas pu être chargées.`,"codexSet.prompt.repair":`Réparer`,"codexSet.prompt.repairFailed":`La réparation n'a pas pu aboutir.`,"codexSet.drift.journalPresent":`Une écriture précédente ne s'est pas terminée. La récupération s'exécute automatiquement à la prochaine écriture.`,"codexSet.drift.projectionStale":`Les couches enregistrées et la valeur dans config.toml divergent. La réparation réécrit la valeur à partir de vos couches.`,"codexSet.drift.storeMissing":`Le fichier des couches a disparu alors que des instructions subsistent dans config.toml. La réparation crée d'abord une sauvegarde et conserve le texte en une seule couche.`,"codexSet.drift.ownedMalformed":`La ligne générée dans config.toml a été modifiée à la main ; la réécrire n'est plus sûr.`,"codexSet.custom.adoptUnsupported":`La valeur à {path} ligne {line} n'est pas une chaîne sur une seule ligne et ne peut pas être importée. Déplacez-la à la main pour la gérer ici.`,"codexSet.prompt.unreadable":`Le fichier de configuration Codex existe mais n'a pas pu être lu, les modifications sont donc refusées.`,"codexSet.layer.permissions":`Autorisations`,"codexSet.layer.collaboration":`Mode collaboration`,"codexSet.layer.environment":`Contexte d'environnement`,"codexSet.layer.apps":`Applications`,"codexSet.layer.skills":`Compétences`,"codexSet.prompt.extensionsUnknown":`Les extensions peuvent ajouter leurs propres couches. Codex ne les expose pas, elles ne peuvent donc pas être répertoriées ici.`,"codexSet.group.transition":`Avis de transition`,"codexSet.group.transitionDesc":`Ils signalent un changement au lieu de décrire un état : ils n'apparaissent donc qu'au passage en temps réel ou au changement de modèle.`,"codexSet.custom.slotNote":`Les couches personnalisées sont réunies en une seule section dans cet ordre.`,"codexSet.row.alwaysOn":`Toujours actif`,"codexSet.row.onChange":`Lors d'un changement`,"codexSet.row.featureGated":`Configuré sous [features]`,"codexSet.row.openFeatures":`Ouvrir les réglages`,"codexSet.dialog.setValue":`{value} (par défaut {fallback})`,"codexSet.dialog.copyKey":`Copier la clé`,"codexSet.dialog.unknownLayer":`Cette version ne contient pas de description pour cette couche. Elle provient d'un runtime Codex plus récent que le tableau de bord.`,"codexSet.custom.heading":`Couches personnalisées`,"codexSet.custom.add":`+ Ajouter une couche`,"codexSet.custom.newTitle":`Nouvelle couche`,"codexSet.custom.editTitle":`Modifier la couche`,"codexSet.custom.titleLabel":`Titre`,"codexSet.custom.bodyLabel":`Instructions`,"codexSet.custom.bodySize":`{bytes} octets sur {max}`,"codexSet.custom.normalized":`Les tabulations ont été remplacées par quatre espaces et les fins de ligne par LF.`,"codexSet.custom.titleRequired":`Saisissez un titre.`,"codexSet.custom.titleTooLong":`Le titre contient {count} caractères ; la limite est de {max}.`,"codexSet.custom.titleMultiline":`Le titre doit tenir sur une seule ligne.`,"codexSet.custom.bodyTooLarge":`Cette couche fait {bytes} octets ; la limite est de {max}.`,"codexSet.custom.composedTooLarge":`Les couches actives totaliseraient {bytes} octets, au-delà de la limite.`,"codexSet.custom.invalidCharacter":`Un caractère de contrôle à la position {position} ne peut pas être enregistré.`,"codexSet.custom.discardPrompt":`Abandonner vos modifications ?`,"codexSet.custom.keepEditing":`Continuer la modification`,"codexSet.custom.delete":`Supprimer {title}`,"codexSet.custom.deleteConfirm":`Supprimer cette couche ? Cette action est irréversible.`,"codexSet.custom.layerGone":`Cette couche a été supprimée ailleurs : l'éditeur a donc été fermé.`,"codexSet.custom.deleteConfirmNamed":`Supprimer « {title} » ? Cette action est irréversible.`,"codexSet.custom.moveUp":`Déplacer {title} vers le haut`,"codexSet.custom.prevLayer":`Couche précédente`,"codexSet.custom.nextLayer":`Couche suivante`,"codexSet.custom.navPosition":`{position} / {total}`,"codexSet.custom.moveDown":`Déplacer {title} vers le bas`,"codexSet.custom.limitReached":`Vous pouvez conserver jusqu’à {max} couches personnalisées.`,"codexSet.custom.notOwned":`developer_instructions a été écrit en dehors d’opencodex et ne peut donc pas être modifié ici. Importez-le pour le gérer comme une couche.`,"codexSet.custom.adopt":`Importer les instructions existantes`,"codexSet.custom.adoptConfirm":`Importer comme couche`,"codexSet.custom.adoptRefused":`La valeur existante n’a pas pu être importée.`,"codexSet.custom.baseReplaced":`model_instructions_file est défini sur {path} : un élément extérieur à opencodex a donc remplacé l’invite de base.`,"codexSet.lint.identity":`Ce texte revendique une identité différente de celle établie par Codex.`,"codexSet.lint.foreignTool":`Les outils proviennent du registre ; en nommer un ici ne le crée pas.`,"codexSet.lint.placeholder":`Aucun moteur de modèles ne traite les instructions ; ce texte sera donc envoyé tel quel.`,"codexSet.lint.applyPatch":`apply_patch est défini par le registre des outils, pas par les instructions.`,"codexSet.lint.approvalVocab":`Codex injecte son propre vocabulaire d’approbation ; ce texte peut le contredire.`,"codexSet.lint.environment":`Les informations d’environnement sont générées plus tard et peuvent contredire ce texte.`,"codexSet.lint.size":`Cette couche dépasse 8 KB. Elle peut être enregistrée, mais consomme des jetons à chaque requête.`,"codexSet.preset.blank":`Couche vide`,"codexSet.preset.concise.name":`Réponses concises`,"codexSet.preset.concise.description":`Réponses courtes, sans préambule et avec un minimum de mise en forme.`,"codexSet.preset.concise.provenance":`Adapté des consignes de concision de Claude Code. Formulation originale, pas une copie.`,"codexSet.preset.planFirst.name":`Planifier avant de modifier`,"codexSet.preset.planFirst.description":`Présenter le plan, puis effectuer la modification.`,"codexSet.preset.planFirst.provenance":`Adapté de l’approche de planification de Claude Code. Formulation originale, pas une copie.`,"codexSet.preset.explainWhy.name":`Expliquer le raisonnement`,"codexSet.preset.explainWhy.description":`Expliquer pourquoi, et pas seulement quoi.`,"codexSet.preset.explainWhy.provenance":`Adapté du style de confirmation de Grok Build. Formulation originale, pas une copie.`,"codexSet.preset.testFirst.name":`Tester d’abord`,"codexSet.preset.testFirst.description":`Écrire le test qui échoue avant d’apporter le correctif.`,"codexSet.preset.testFirst.provenance":`Adapté des pratiques courantes des agents. Formulation originale, pas une copie.`,"codexSet.preset.korean.name":`Réponses en coréen`,"codexSet.preset.korean.description":`Répondre en coréen, quelle que soit la langue de la requête.`,"codexSet.preset.korean.provenance":`Rédigé pour opencodex à partir d'une demande fréquente des utilisateurs. Formulation originale, pas une copie.`,"codexSet.dialog.class":`Type`,"codexSet.dialog.key":`Clé de configuration`,"codexSet.dialog.fileValue":`Valeur dans ce fichier`,"codexSet.dialog.absentDefault":`non défini (valeur par défaut : {value})`,"codexSet.dialog.noRenderedText":`Codex n’expose pas le texte assemblé d’une couche intégrée. Cette boîte de dialogue décrit donc la couche et indique sa clé au lieu d’afficher son contenu.`,"codexSet.dialog.sourceText":`Texte envoyé au modèle`,"codexSet.dialog.sourceBytes":`{bytes} octets`,"codexSet.dialog.notRendered":`Lors du tour que nous avons lu, cette couche n'a rien envoyé. Les sections ne sont renvoyées qu'en cas de changement : un seul échantillon peut donc ne pas la contenir.`,"codexSet.dialog.emptySource":`Le fichier {path} existe mais il est vide : cette couche n'envoie donc rien.`,"codexSet.dialog.notExposed":`L'invite de base circule en dehors de la liste de messages que Codex peut afficher ; elle ne peut donc pas être montrée ici. On peut la remplacer via model_instructions_file.`,"codexSet.dialog.textUnavailable":`L'invite Codex n'a pas pu être lue sur cette machine, le texte est donc indisponible.`,"codexSet.class.base":`Instructions de base`,"codexSet.class.config-toggle":`Modifiable ici`,"codexSet.class.feature-gated":`Contrôlé par une fonctionnalité`,"codexSet.class.runtime-conditional":`Conditionnel à l’exécution`,"codexSet.class.extension-unknown":`Couche d’extension`,"codexSet.layer.base-instructions":`Instructions de base`,"codexSet.layer.model-switch":`Avis de changement de modèle`,"codexSet.layer.personality":`Personnalité`,"codexSet.layer.context-window-guidance":`Conseils sur la fenêtre de contexte`,"codexSet.layer.realtime":`Temps réel`,"codexSet.layer.agents-md":`AGENTS.md`,"codexSet.layer.environments-instructions":`Environnements`,"codexSet.layer.plugins":`Plugins`,"codexSet.layer.tools":`Outils`,"codexSet.layer.multi-agent-mode":`Mode multi-agents`,"codexSet.layer.git-attribution":`Attribution des commits`,"codexSet.about.base-instructions":`Instructions propres à Codex. Elles accompagnent la requête elle-même et ne peuvent pas être désactivées.`,"codexSet.about.model-switch":`Ajouté lorsque le modèle change en cours de conversation.`,"codexSet.about.personality":`Consignes de ton et de style, régies par un indicateur de fonctionnalité.`,"codexSet.about.context-window-guidance":`Conseils sur le budget de contexte restant, régis par un indicateur de fonctionnalité.`,"codexSet.about.realtime":`Ajouté aux sessions en temps réel.`,"codexSet.about.agents-md":`Les fichiers AGENTS.md de votre projet. Cette page indique la couche, mais ne modifie jamais la documentation du projet.`,"codexSet.about.permissions":`Décrit les réglages actifs du bac à sable et des approbations.`,"codexSet.about.collaboration":`Décrit le mode collaboration actif.`,"codexSet.about.environment":`Répertoire de travail, plateforme et autres informations d’environnement.`,"codexSet.about.environments-instructions":`Consignes pour les environnements d’exécution différée, régies par un indicateur de fonctionnalité.`,"codexSet.about.apps":`Utilisation des applications connectées.`,"codexSet.about.plugins":`Ajouté lorsqu’un plugin est sélectionné ou qu’un plugin déclare une capacité.`,"codexSet.about.tools":`Descriptions différées des outils, régies par un indicateur de fonctionnalité.`,"codexSet.about.skills":`Liste des compétences disponibles.`,"codexSet.about.multi-agent-mode":`Instructions pour les sous-agents, régies par un indicateur de fonctionnalité.`,"codexSet.about.git-attribution":`Demande au modèle d’ajouter un trailer Co-authored-by: Codex aux commits qu’il écrit, et une ligne Generated with Codex. aux pull requests qu’il ouvre. Codex lit ce réglage depuis votre compte : il n’est modifiable ni ici ni dans [features]. Si votre compte le désactive, Codex envoie l’instruction inverse au lieu de ne rien envoyer.`,"codexSet.condition.model-switch":`Émis uniquement après un changement de modèle en cours de session.`,"codexSet.condition.realtime":`Émis uniquement dans une session en temps réel.`,"codexSet.condition.agents-md":`Émis lorsqu’un document de projet est trouvé pour le répertoire de travail.`,"codexSet.condition.plugins":`Émis lorsqu’un plugin est sélectionné ou qu’un plugin déclare une capacité.`,"codexSet.condition.git-attribution":`Défini par la politique d’attribution de votre compte.`,"codexSet.base.title":`Invite de base`,"codexSet.base.prev":`Option précédente`,"codexSet.base.next":`Option suivante`,"codexSet.base.position":`{position} / {total}`,"codexSet.base.swipeHint":`Balayez latéralement, utilisez les touches fléchées ou les boutons pour changer d’option. S’applique aux sessions démarrées ensuite.`,"codexSet.base.defaultTitle":`Invite de base propre à Codex`,"codexSet.base.defaultBody":`L’option par défaut n’est pas stockée ici : il n’y a donc rien à modifier ni à supprimer. La choisir retire simplement model_instructions_file de votre configuration, et Codex utilise l’invite qu’il fournit.`,"codexSet.base.variantTitle":`Nom`,"codexSet.base.variantBody":`Invite`,"codexSet.base.replacesWarning":`Ceci REMPLACE l’invite de base de Codex au lieu de s’y ajouter. Une invite courte ici donne un modèle avec des instructions courtes.`,"codexSet.base.use":`Utiliser celle-ci`,"codexSet.base.inUse":`Utilisée`,"codexSet.base.externalBlocked":`model_instructions_file pointe déjà vers {path}, une valeur qu’opencodex n’a pas écrite. Retirez-la vous-même avant de choisir ici.`,"nav.api":`API`,"nav.integrations":`Intégrations`,"nav.openMenu":`Ouvrir le menu`,"nav.closeMenu":`Fermer le menu`,"integrations.subtitle":`Connectez des clients à opencodex, gérez les identifiants et restaurez la configuration des clients.`,"integrations.tabsLabel":`Surfaces d’intégration`,"integrations.tab.overview":`Vue d’ensemble`,"integrations.tab.keys":`Clés API`,"integrations.tab.codex":`Codex CLI`,"integrations.tab.claude":`Claude`,"integrations.tab.grok":`Grok Build`,"integrations.tab.opencode":`OpenCode`,"integrations.tab.pi":`Pi`,"integrations.tab.omp":`OMP`,"integrations.tab.hermes":`Hermes`,"integrations.tab.openclaw":`OpenClaw`,"integrations.tab.kimi":`Kimi Code`,"integrations.tab.gajae":`Gajae Code`,"integrations.tab.dsh":`DeepSeek Harness (DSH)`,"integrations.tab.mcode":`MiniMax Code`,"integrations.tab.zcode":`ZCode`,"integrations.tab.prime":`Prime Agent`,"integrations.codex.title":`Codex CLI`,"integrations.codex.body":`Le câblage de Codex est géré par le service proxy. Le démarrage d’opencodex l’applique ; l’arrêt du service rétablit le routage natif.`,"integrations.codex.openService":`Ouvrir les commandes du service`,"integrations.state.notInstalled":`Non installé`,"integrations.state.unknown":`Vérification…`,"integrations.detail.codexRouted":`Les requêtes Codex passent par ce proxy`,"integrations.detail.codexAbsent":`Codex ne passe pas encore par ce proxy`,"integrations.detail.keyCount":`{count} clé(s) émises`,"integrations.detail.keyNone":`Aucune clé émise`,"integrations.detail.keyChecking":`Vérification…`,"integrations.detail.keyUnavailable":`État des clés indisponible`,"integrations.detail.claudeOff":`La connexion est désactivée`,"integrations.detail.desktopCurrent":`Desktop exécute ce profil`,"integrations.detail.desktopStale":`Le fichier de profil a été modifié après son application`,"integrations.detail.desktopNotServed":`Le profil existe, mais Desktop en utilise un autre`,"integrations.detail.desktopAbsent":`Aucun profil appliqué`,"integrations.detail.desktopDesiredOff":`L’intégration Claude Desktop est désactivée`,"integrations.detail.desktopDesiredOffCleanupPending":`Claude Desktop utilise encore la passerelle ; le nettoyage est en attente`,"integrations.detail.desktopDesiredOnNotApplied":`L’intégration est activée, mais Desktop n’utilise pas le profil de passerelle`,"integrations.detail.desktopSelectedElsewhere":`Desktop utilise un autre profil`,"integrations.detail.desktopProfileDrift":`Le profil Desktop sélectionné a changé`,"integrations.detail.desktopObservedUnsafe":`Le profil Desktop sélectionné ne peut pas être modifié en toute sécurité`,"integrations.detail.desktopNotInstalled":`La bibliothèque de configuration de Claude Desktop n’est pas installée`,"integrations.detail.grokModels":`{count} modèle(s) câblés`,"integrations.detail.grokAbsent":`Aucun bloc opencodex dans la configuration`,"integrations.dialog.grok.title":`Désactiver l’intégration Grok Build ?`,"integrations.dialog.grok.changes":`Seul le bloc marqué par opencodex sera supprimé de {path}. Le contenu écrit en dehors du bloc restera inchangé.`,"integrations.dialog.grok.breakage":`La désactivation supprime les alias de modèles opencodex de Grok Build. Les modèles utilisés avec votre compte xAI restent disponibles.`,"integrations.dialog.grok.undo":`Si opencodex s’exécute sur une adresse de bouclage, la réactivation écrit un nouveau bloc à partir des modèles actuellement disponibles.`,"integrations.dialog.grok.confirm":`Désactiver`,"integrations.dialog.desktop.title":`Désactiver l’intégration Claude Desktop ?`,"integrations.dialog.desktop.changes":`Si {path} contient un profil de passerelle géré par opencodex, Desktop sélectionnera d’abord un nouveau profil standard sans identifiants, puis supprimera l’ancien profil et sa sauvegarde.`,"integrations.dialog.desktop.breakage":`Claude Desktop reviendra à Claude standard au lieu des modèles acheminés par opencodex.`,"integrations.dialog.desktop.undo":`La réactivation régénère le profil opencodex à partir de vos affectations de modèles enregistrées.`,"integrations.dialog.desktop.restart":`Claude Desktop lit cette configuration uniquement au lancement. Quittez-le complètement, puis rouvrez-le pour appliquer cette modification.`,"integrations.dialog.desktop.confirm":`Désactiver`,"integrations.native.msg.nonLoopbackRemoved":`Grok Build ne peut être enregistré automatiquement que lorsqu’opencodex s’exécute sur une adresse de bouclage. Le bloc précédent qui pointait vers le bouclage a été supprimé.`,"integrations.native.msg.nonLoopbackRemovedNoop":`Grok Build ne peut être enregistré automatiquement que lorsqu’opencodex s’exécute sur une adresse de bouclage. Aucun bloc précédent n’était à supprimer.`,"integrations.native.msg.nonLoopbackSuperseded":`Grok Build ne peut être enregistré automatiquement que lorsqu’opencodex s’exécute sur une adresse de bouclage. Un autre processus a écrit un nouveau bloc entre-temps ; le bloc désormais présent dans le fichier n’a donc pas été créé par cette requête.`,"integrations.native.error.orphanedMarker":`{path} contient un marqueur de début opencodex, mais aucun marqueur de fin. Le fichier est resté inchangé, car opencodex ne peut pas déterminer où se termine son bloc.`,"integrations.native.error.homeMismatch":`Le répertoire d’accueil du service installé ne correspond pas au répertoire actuel ; le fichier est donc resté inchangé.`,"integrations.native.error.notInstalled":`Grok Build n’est pas installé ; il n’y a donc rien à modifier.`,"integrations.native.error.configBusy":`La configuration est en cours d’enregistrement ailleurs et n’a pas pu être modifiée. Réessayez dans un instant.`,"integrations.native.error.desktopUnsafeMetadata":`Les métadonnées de Claude Desktop dans {path} n’ont pas pu être lues en toute sécurité ; sa bibliothèque n’a donc pas été modifiée.`,"integrations.native.error.desktopCleanupIncomplete":`Claude Desktop pointe vers le mode standard, mais d’anciens fichiers d’identifiants opencodex subsistent ici : {paths}.`,"integrations.native.msg.desktopDisabled":`Intégration Claude Desktop désactivée.`,"integrations.native.msg.desktopEnabled":`Intégration Claude Desktop activée.`,"integrations.state.absent":`Non appliqué`,"integrations.state.current":`Appliqué`,"integrations.state.stale":`Mise à jour requise`,"integrations.state.conflict":`Conflit`,"integrations.state.unsafe":`Vérification impossible`,"integrations.summary.detected":`Clients détectés`,"integrations.summary.applied":`Clients configurés`,"integrations.summary.stale":`Mise à jour requise`,"integrations.summary.lastChange":`Dernière modification`,"integrations.summary.disableAll":`Tout désactiver…`,"integrations.onboarding":`L’application écrit un bloc de fournisseur opencodex après avoir créé une sauvegarde. La désactivation supprime uniquement ce bloc, et un instantané conservé peut être restauré.`,"integrations.empty.title":`Aucun client installé n’a été détecté`,"integrations.empty.body":`Installez un client pris en charge, puis revenez ici pour appliquer opencodex.`,"integrations.action.apply":`Appliquer`,"integrations.action.disable":`Désactiver`,"integrations.action.refresh":`Mettre à jour`,"integrations.action.settings":`Paramètres`,"integrations.action.manageKeys":`Gérer les clés`,"integrations.action.restore":`Restaurer…`,"integrations.action.undo":`Annuler`,"integrations.action.restorePoint":`Restaurer ce point…`,"integrations.action.snapshotExpired":`Sauvegarde expirée`,"integrations.rollback.title":`Centre de restauration`,"integrations.rollback.empty":`Aucun historique d’application`,"integrations.rollback.emptyBody":`Chaque écriture réussie conserve d’abord un instantané antérieur.`,"integrations.restore.title":`Restaurer cet instantané ?`,"integrations.restore.body":`Le fichier actuel est d’abord sauvegardé, puis remplacé par l’instantané sélectionné.`,"integrations.restore.driftTitle":`Des modifications plus récentes ont été détectées`,"integrations.restore.driftBody":`Les modifications apportées après cet instantané seront sauvegardées, puis le fichier sera remplacé.`,"integrations.restore.confirm":`Restaurer`,"integrations.restore.confirmDrift":`Sauvegarder les modifications récentes et restaurer`,"integrations.restore.pending":`Restauration…`,"integrations.restore.manual":`Échec de la restauration automatique : {reason}. Restaurez manuellement depuis {path}.`,"integrations.error.load":`Impossible de charger l’état de l’intégration.`,"integrations.error.stale":`La dernière actualisation a échoué. Les valeurs ci-dessous peuvent être obsolètes.`,"integrations.error.busy":`Une autre modification de ce client est toujours en cours. Réessayez dans un instant.`,"integrations.error.conflict":`La configuration a changé après son écriture par opencodex. Rien n’a été supprimé.`,"integrations.error.unsafe":`La configuration ne peut pas être modifiée en toute sécurité.`,"integrations.error.generic":`La modification de l’intégration a échoué. Votre état précédent a été conservé.`,"integrations.error.nonLoopback":`{client} ne peut atteindre qu’un proxy sur localhost — sa configuration ne permet pas d’ajouter l’en-tête d’admission requis par une liaison distante ; l’écrire manuellement ne servirait donc à rien. Donnez-lui plutôt un accès par bouclage, via un tunnel ou un redirecteur local.`,"integrations.status.installed":`Installé`,"integrations.status.notInstalled":`Non installé`,"integrations.status.appliedAt":`Appliqué`,"integrations.status.backup":`Sauvegarde`,"integrations.status.lastRestore":`Dernière restauration`,"integrations.status.unknown":`Inconnu`,"integrations.bulk.title":`Désactiver les intégrations client appliquées ?`,"integrations.bulk.body":`Seul le bloc appartenant à opencodex est supprimé. Un instantané antérieur est conservé pour chaque client.`,"integrations.bulk.partial":`Certains clients n’ont pas pu être désactivés : {clients}`,"integrations.bulk.success":`Les intégrations client appliquées ont été désactivées.`,"integrations.retention.degraded":`Le nettoyage des sauvegardes est en retard ; d’anciennes sauvegardes peuvent encore se trouver sur le disque.`,"integrations.error.residual":`Le fichier peut être dans un état intermédiaire : {message} Restaurez-le depuis {path}.`,"integrations.error.recover":`{message} Une sauvegarde se trouve dans {path}.`,"integrations.kind.apply":`Appliqué`,"integrations.kind.disable":`Désactivé`,"integrations.kind.refresh":`Mis à jour`,"integrations.kind.restore":`Restauré`,"integrations.semantics.opencode":`Uniquement pour les lancements directs depuis le disque ; l’injection d’environnement par ocx opencode est prioritaire.`,"integrations.semantics.pi":`S’applique aux nouvelles sessions.`,"integrations.semantics.omp":`Redémarrez OMP pour charger le catalogue.`,"integrations.semantics.hermes":`S’applique aux nouvelles sessions.`,"integrations.semantics.openclaw":`S’applique immédiatement à une passerelle en cours d’exécution.`,"integrations.semantics.kimi":`Redémarrez ou exécutez /reload pour l’appliquer (la v2 surveille le fichier).`,"integrations.semantics.gajae":`S’applique à une nouvelle session ou à l’ouverture de /model.`,"integrations.semantics.dsh":`OpenCodex gère uniquement llm-pi-ai.providers.opencodex dans $DSH_HOME/settings.yaml. DSH recharge ce fournisseur à chaud ; votre modèle par défaut et deepseek-official restent inchangés. Seule l’adresse de bouclage est actuellement prise en charge ; aucun identifiant réel n’est écrit.`,"integrations.semantics.mcode":`Gère uniquement custom_provider.opencodex. Votre modèle par défaut et votre connexion MiniMax restent inchangés.`,"integrations.semantics.zcode":`Gère uniquement provider.opencodex dans ~/.zcode/v2/config.json. Votre connexion Z.ai et les autres fournisseurs restent inchangés. Redémarrez ZCode après toute modification.`,"integrations.semantics.prime":`Gère uniquement providers.opencodex dans le models.json de Prime Agent — ~/.prime/agent, sauf si PRIME_AGENT_CODING_AGENT_DIR le redirige. Vos autres fournisseurs et surcharges de modèles restent inchangés. S'applique aux nouvelles sessions.`,"codexAuth.mainAccount":`Compte principal`,"codexAuth.logLabel":`Libellé du journal`,"codexAuth.codexApp":`Application Codex`,"codexAuth.appLogin":`Connexion à l’application`,"codexAuth.accountPool":`Groupe de comptes`,"codexAuth.accountModeTitle":`Mode de compte OpenAI`,"codexAuth.accountModePool":`Mode Groupe`,"codexAuth.accountModePoolDesc":`La connexion principale et les comptes ajoutés admissibles alternent ici.`,"codexAuth.accountModeDirect":`Mode Direct`,"codexAuth.accountModeDirectDesc":`Les requêtes utilisent uniquement la connexion principale ; les comptes ajoutés restent stockés pour le mode Groupe.`,"codexAuth.openaiMissing":`Le fournisseur OpenAI intégré n’est pas configuré.`,"codexAuth.openaiDisabled":`Le fournisseur OpenAI intégré est désactivé.`,"codexAuth.openaiUnavailableDesc":`Vos comptes OpenAI restent disponibles. Activez le fournisseur pour acheminer les requêtes Codex.`,"codexAuth.enableOpenai":`Activer OpenAI`,"codexAuth.enablingOpenai":`Activation…`,"codexAuth.enableOpenaiFailed":`Échec de l’activation du fournisseur OpenAI.`,"codexAuth.openaiPresetLoadFailed":`Échec du chargement du préréglage du fournisseur OpenAI.`,"codexAuth.openaiPresetUnavailable":`Le préréglage du fournisseur OpenAI est indisponible.`,"codexAuth.openProviders":`Ouvrir Fournisseurs`,"codexAuth.add":`Ajouter`,"codexAuth.sparkQuota":`Quota Codex Spark`,"codexAuth.sparkQuotaHint":`Affiche la fenêtre hebdomadaire GPT-5.3-Codex-Spark sur les cartes de compte. Masquée par défaut car elle ne concerne qu'un seul modèle.`,"codexAuth.sparkQuotaShown":`Quota Codex Spark affiché`,"codexAuth.sparkQuotaHidden":`Quota Codex Spark masqué`,"codexAuth.sparkQuotaFailed":`Impossible de modifier le réglage du quota Codex Spark`,"codexAuth.refreshQuota":`Actualiser les quotas`,"codexAuth.refreshingQuota":`Actualisation…`,"codexAuth.quotaRefreshed":`Quotas actualisés`,"codexAuth.quotaRefreshFailed":`Échec de l’actualisation des quotas`,"codexAuth.pauseExhausted":`Suspendre les comptes épuisés`,"codexAuth.pausingExhausted":`Vérification des quotas…`,"codexAuth.pauseExhaustedSucceeded":`Comptes à la limite suspendus : {count}`,"codexAuth.pauseExhaustedNone":`Aucun compte n’a une utilisation confirmée à 100 %.`,"codexAuth.pauseExhaustedFailed":`Échec de la vérification et de la suspension des comptes épuisés.`,"codexAuth.noPool":`Aucun compte ajouté au groupe pour le moment.`,"codexAuth.pause":`Suspendre`,"codexAuth.resume":`Reprendre`,"codexAuth.paused":`SUSPENDU`,"codexAuth.pauseSucceeded":`{email} est suspendu`,"codexAuth.resumeSucceeded":`{email} est de nouveau disponible dans le groupe`,"codexAuth.pauseFailed":`Impossible de suspendre {email}. Aucune modification apportée.`,"codexAuth.resumeFailed":`Impossible de réactiver {email}. Aucune modification apportée.`,"codexAuth.pausedHint":`Exclu du changement automatique, des nouvelles tentatives, de la récupération après délai et de la sélection manuelle jusqu’à sa réactivation.`,"codexAuth.pinned":`ÉPINGLÉ`,"codexAuth.pinnedHint":`Vous avez sélectionné ce compte manuellement ; un ordre de sélection supérieur ne le remplacera donc pas. L’épinglage dure jusqu’à l’épuisement de ce compte, la sélection d’un autre compte ou la modification d’un ordre de sélection.`,"codexAuth.fiveHour":`5 h`,"codexAuth.weekly":`Semaine`,"codexAuth.monthly":`30 j`,"codexAuth.resets":`réinitialisation`,"codexAuth.today":`Aujourd’hui`,"codexAuth.current":`ACTUEL`,"codexAuth.nextSession":`SÉLECTIONNÉ`,"codexAuth.poolPrepared":`PRÉPARÉ POUR LE GROUPE`,"codexAuth.preparePoolTitle":`Préparer ce compte pour le mode Groupe ?`,"codexAuth.preparePoolDesc":`Les requêtes directes continuent d’utiliser la connexion principale. Ce compte devient la sélection préparée du Groupe lorsque le mode Groupe est activé.`,"codexAuth.prepareForPool":`Préparer pour le Groupe`,"codexAuth.poolPreparedToast":`{email} est préparé pour le mode Groupe`,"codexAuth.switchTitle":`Changer de compte actif ?`,"codexAuth.switchDesc":`Prend effet immédiatement. Les fils liés à un compte et les requêtes déjà en cours conservent le compte capturé ; les requêtes nouvelles ou non liées utilisent le niveau d’ordre du compte sélectionné, et les comptes de même ordre continuent d’alterner.`,"codexAuth.cacheWarning":`Le cache des prompts est réinitialisé lors d’un changement de compte. La nouvelle session démarre avec un cache vide.`,"codexAuth.setAsNext":`Utiliser ensuite ce compte`,"codexAuth.cancel":`Annuler`,"codexAuth.switchBack":`Revenir au compte principal ?`,"codexAuth.switchBackDesc":`Prend effet immédiatement. Les fils liés à un compte et les requêtes déjà en cours conservent le compte capturé ; les requêtes nouvelles ou non liées utilisent le niveau d’ordre du compte de connexion à l’application, et les comptes de même ordre continuent d’alterner.`,"codexAuth.autoSwitch":`Changement proactif selon l’utilisation`,"codexAuth.autoSwitchQuotaDesc":`Quota : à partir de {threshold}% d’utilisation, la requête suivante peut passer à un compte admissible moins utilisé, y compris pour une tâche déjà liée ; Go/Free utilisent uniquement 30 j.`,"codexAuth.autoSwitchQuotaOffDesc":`Le changement proactif selon l’utilisation est désactivé. L’affectation nouvelle/non liée et la récupération après échec restent actives.`,"codexAuth.autoSwitchRoundRobinDesc":`L’affectation en rotation n’utilise pas ce seuil ; elle continue d’alterner les tâches nouvelles/non liées.`,"codexAuth.autoSwitchFillFirstDesc":`Remplissage prioritaire : {threshold}% est le seuil d’épuisement pour les tâches nouvelles/non liées ; les tâches liées saines conservent leur compte.`,"codexAuth.autoSwitchFillFirstOffDesc":`Le remplissage prioritaire n’a aucun seuil d’épuisement lié à l’utilisation pour les tâches nouvelles/non liées ; le délai de récupération, la réauthentification et la récupération après échec peuvent toujours modifier le routage.`,"codexAuth.failureRecoveryNote":`La récupération après échec est distincte : une requête rejetée avant toute sortie avec 429/402, un délai de récupération, une réauthentification, une exclusion ou un basculement transitoire configuré peut sélectionner un autre compte admissible.`,"codexAuth.autoSwitchThreshold":`Seuil d’utilisation`,"codexAuth.autoSwitchThresholdAria":`Seuil d’utilisation, en pourcentage`,"codexAuth.autoSwitchThresholdInc":`Augmenter le seuil d’utilisation`,"codexAuth.autoSwitchThresholdDec":`Diminuer le seuil d’utilisation`,"codexAuth.autoSwitchLoadFailed":`Impossible de charger le paramètre de changement selon l’utilisation.`,"codexAuth.autoSwitchThresholdInvalid":`Saisissez un nombre entier compris entre 1 et 100`,"codexAuth.autoSwitchUpdated":`Changement proactif selon l’utilisation mis à jour`,"codexAuth.autoSwitchUpdateFailed":`Impossible de confirmer la mise à jour du changement selon l’utilisation. La dernière valeur confirmée est affichée.`,"codexAuth.requestUserInput":`Demander une saisie en mode Default`,"codexAuth.requestUserInputDesc":`Permet à Codex de suspendre une session en mode Default et de vous poser des questions avec l’outil request_user_input.`,"codexAuth.requestUserInputUpdated":`Indicateur de fonctionnalité mis à jour — s’applique aux nouvelles sessions.`,"codexAuth.requestUserInputUpdatedRestart":`Indicateur de fonctionnalité mis à jour — s’applique aux nouvelles sessions. Redémarrez l’application Codex pour le prendre en compte.`,"codexAuth.requestUserInputUpdateFailed":`Impossible de mettre à jour l’indicateur de fonctionnalité. Aucune modification apportée.`,"codexAuth.requestUserInputLoadFailed":`Impossible de lire l’indicateur de fonctionnalité dans config.toml.`,"codexAuth.accountPickerTitle":`Cibler un compte Codex précis depuis le sélecteur de modèle`,"codexAuth.accountPickerOffDesc":`Lorsque cette option est activée, les lignes GPT ordinaires du sélecteur sont remplacées par une entrée pour chaque sélecteur de compte. Vous pouvez ainsi choisir le compte exact d’une conversation sans vous déconnecter. La désactivation ne supprime aucun compte.`,"codexAuth.accountPickerOnDesc":`Chaque sélecteur est un libellé public associé à un compte stocké. Le choisir verrouille la conversation sur le compte correspondant : elle n’alterne jamais et ne bascule pas vers un compte de secours, sans modifier le compte Groupe actif.`,"codexAuth.accountPickerCompatibility":`La connexion intégrée à l’application Codex possède son propre sélecteur ; les mappages générés l’appellent normalement main et utilisent au besoin un suffixe évitant les collisions, tel que main-2. Les comptes ajoutés reçoivent des libellés stables qui préservent la confidentialité, tandis que les libellés personnalisés restent inchangés. Le routage des conversations existantes et des sélections de modèles enregistrées se poursuit. La désactivation masque les entrées générées, mais préserve les sélecteurs et les routes exactes. Les ID de modèle GPT simples conservent leur comportement Groupe ou Direct.`,"codexAuth.accountPickerUpdated":`Ciblage des comptes mis à jour.`,"codexAuth.accountPickerUpdateFailed":`Impossible de mettre à jour le ciblage des comptes. Le dernier paramètre confirmé est affiché.`,"codexAuth.accountPickerLoadFailed":`Impossible de charger le paramètre de ciblage des comptes.`,"codexAuth.accountPickerRefreshFailed":`Impossible d’actualiser ce paramètre. La dernière valeur confirmée reste affichée.`,"codexAuth.advancedSettings":`Paramètres avancés`,"codexAuth.advancedSettingsAria":`Afficher ou masquer les paramètres avancés de l’authentification Codex`,"codexAuth.catalogRefreshPending":`La modification a été enregistrée, mais l’actualisation du catalogue de modèles Codex est en attente. Exécutez ocx sync pour réessayer.`,"anthropicPool.title":`Groupe de comptes Claude (expérimental)`,"anthropicPool.enabledDesc":`En cas de 429, met le compte en délai de récupération et bascule vers un autre. Les nouvelles sessions privilégient une utilisation inférieure à {threshold}% (barre de 5 heures).`,"anthropicPool.disabledDesc":`Utilise uniquement le compte Claude actif. Activez cette option seulement si vous acceptez le routage expérimental.`,"anthropicPool.experimentalWarning":`Fonctionnalité expérimentale et peu éprouvée. Anthropic peut restreindre les comptes présentant une rotation multicomptes automatisée. Les comptes d’une même organisation peuvent partager un quota — leur mise en groupe n’apportera rien. Laissez cette option désactivée si vous n’en comprenez pas les risques.`,"anthropicPool.needTwoAccounts":`Ajoutez au moins deux comptes OAuth Claude avant d’activer le groupe.`,"anthropicPool.threshold":`Seuil d’utilisation des nouvelles sessions`,"anthropicPool.thresholdAria":`Seuil d’utilisation des nouvelles sessions, en pourcentage`,"anthropicPool.thresholdHelp":`0 désactive la sélection selon le quota (affinité + compte actif uniquement). Valeur par défaut : 80.`,"anthropicPool.thresholdInvalid":`Saisissez un nombre entier compris entre 0 et 100`,"anthropicPool.loadFailed":`Impossible de charger les paramètres du groupe Claude.`,"anthropicPool.saveFailed":`Impossible d’enregistrer les paramètres du groupe Claude.`,"anthropicPool.on":`Activé`,"anthropicPool.off":`Désactivé`,"cursorPool.title":`Groupe de comptes Cursor (expérimental)`,"cursorPool.enabledDesc":`En cas de 429 ou d'échec d'authentification, met le compte en délai de récupération et bascule pour cette conversation. Chaque conversation reste sur un compte jusqu'à une limite de débit ou un échec d'identifiants.`,"cursorPool.disabledDesc":`Utilise uniquement le compte Cursor actif. Activez cette option seulement si vous acceptez le routage expérimental.`,"cursorPool.experimentalWarning":`Fonctionnalité expérimentale et peu éprouvée. La politique d'utilisation de Cursor interdit de contourner les limites de débit et de manipuler la mesure d'utilisation. L'utilisation Teams incluse est par siège et peut ne pas être transférable. Laissez cette option désactivée si vous n'en comprenez pas les risques.`,"cursorPool.needTwoAccounts":`Ajoutez au moins deux comptes OAuth Cursor avant d'activer le groupe.`,"cursorPool.loadFailed":`Impossible de charger les paramètres du groupe Cursor.`,"cursorPool.saveFailed":`Impossible d'enregistrer les paramètres du groupe Cursor.`,"cursorPool.on":`Activé`,"cursorPool.off":`Désactivé`,"antigravityRouting.failoverOnlyTitle":`Routage multi-comptes (failover uniquement)`,"antigravityRouting.failoverOnlyDesc":`Chaque conversation reste sur un compte Antigravity. En cas de limite de débit 429 ou d'échec d'identifiants, opencodex peut basculer vers un autre compte éligible pour cette conversation — sans équilibrer les nouvelles sessions entre comptes ni changer le compte actif global pour d'autres conversations en cours.`,"accountPool.strategy":`Stratégie de rotation`,"accountPool.strategyDesc":`Méthode utilisée par OpenCodex pour affecter un compte à une tâche nouvelle/non liée.`,"accountPool.strategyQuota":`Quota`,"accountPool.strategyRoundRobin":`Rotation`,"accountPool.strategyFillFirst":`Remplissage prioritaire`,"accountPool.strategyHintQuota":`La stratégie Quota peut également relier une tâche existante à un autre compte lors de sa requête suivante, une fois le seuil d’utilisation franchi.`,"accountPool.strategyHintRoundRobin":`La rotation ne concerne que les tâches sans liaison active ; le seuil d’utilisation ne modifie pas la rotation normale.`,"accountPool.strategyHintFillFirst":`Le remplissage prioritaire utilise le seuil comme point d’épuisement pour les tâches non liées ; les tâches liées saines conservent leur affinité.`,"accountPool.unboundDefinition":`Une tâche nouvelle/non liée désigne une requête sans liaison actuelle à un compte ; une tâche existante visible peut devenir non liée après la réinitialisation du proxy ou de l’affinité.`,"accountPool.stickyLimit":`Affectations nouvelles/non liées avant rotation`,"accountPool.stickyLimitAria":`Affectations nouvelles/non liées avant rotation`,"accountPool.stickyLimitInc":`Augmenter la limite de persistance`,"accountPool.stickyLimitDec":`Diminuer la limite de persistance`,"accountPool.stickyLimitHelp":`Conservez le compte sélectionné pour ce nombre d’affectations de tâches nouvelles/non liées avant de passer au suivant ; le compteur augmente lorsque la tâche est liée, et non après la réussite en amont.`,"accountPool.stickyLimitInvalid":`Saisissez un nombre entier compris entre 1 et 100`,"accountPool.strategyLoadFailed":`Impossible de charger la stratégie de rotation.`,"accountPool.strategyUpdateFailed":`Impossible d’enregistrer la stratégie de rotation.`,"accountPool.priority":`Ordre de sélection`,"accountPool.priorityAria":`Ordre de sélection de ce compte`,"accountPool.priorityHint":`Les nombres les plus élevés sont utilisés en premier. Le groupe ne passe à un nombre inférieur que lorsque tous les comptes de niveau supérieur sont épuisés ou indisponibles.`,"accountPool.priorityFirst":`Premier`,"accountPool.priorityEarlier":`Plus tôt`,"accountPool.priorityNormal":`Normal`,"accountPool.priorityLater":`Plus tard`,"accountPool.priorityLast":`Dernier`,"accountPool.priorityOption":`{name} ({value})`,"accountPool.priorityCustom":`Personnalisé`,"accountPool.priorityUpdated":`Ordre de sélection mis à jour pour {email}`,"accountPool.priorityUpdateFailed":`Impossible d’enregistrer l’ordre de sélection de {email}. La dernière valeur confirmée est affichée.`,"codexAuth.switched":`{email} est sélectionné pour la prochaine requête`,"codexAuth.loadFailed":`Impossible de charger les paramètres des comptes Codex.`,"codexAuth.switchFailed":`Impossible de changer de compte. Votre sélection précédente reste inchangée.`,"codexAuth.removeConfirm":`Supprimer {id} ?`,"codexAuth.removeFailed":`Impossible de supprimer le compte. Aucune modification apportée.`,"codexAuth.addTitle":`Ajouter un compte Codex`,"codexAuth.addIdLabel":`ID du compte (slug)`,"codexAuth.addIdPlaceholder":`codex-work, codex-alt, team...`,"codexAuth.resetCreditsAria":`{count} crédit(s) de réinitialisation`,"codexAuth.addJsonLabel":`Contenu de auth.json`,"codexAuth.addHelp":`Copiez-le depuis le fichier ~/.codex/auth.json d’une autre machine ou utilisez codex-auth export.`,"codexAuth.importBtn":`Importer`,"codexAuth.importInvalidJson":`JSON non valide`,"codexAuth.importMissingTokens":`access_token ou refresh_token absent du JSON`,"codexAuth.importMissingId":`L’identifiant du compte est requis`,"codexAuth.accountAdded":`Compte ajouté au groupe`,"codexAuth.addPickDesc":`Connectez-vous avec un autre compte ChatGPT pour l’ajouter au groupe.`,"codexAuth.oauthLogin":`Connexion OAuth`,"codexAuth.oauthDesc":`Ouvre la page de connexion ChatGPT dans le navigateur`,"codexAuth.importAuthJson":`Importer auth.json`,"codexAuth.importAuthJsonDesc":`Depuis une autre installation de Codex ou un export codex-auth`,"codexAuth.back":`Retour`,"codexAuth.oauthAlreadyInProgress":`Une connexion est déjà en cours. Terminez-la dans votre navigateur.`,"codexAuth.oauthWaiting":`En attente de la fin de la connexion à ChatGPT dans votre navigateur...`,"codexAuth.oauthSubmittingCode":`Envoi du code…`,"codexAuth.oauthCodeSubmitted":`Code envoyé — en attente de la fin de la connexion…`,"codexAuth.oauthStatusRetrying":`Erreur réseau ou de proxy lors de la vérification de l’état de la connexion — nouvelle tentative…`,"codexAuth.oauthCancelled":`La connexion a été annulée.`,"codexAuth.loginFailed":`Échec de la connexion`,"codexAuth.needsReauth":`Se reconnecter`,"codexAuth.reauthenticate":`Se réauthentifier`,"codexAuth.tokenExpired":`Jeton expiré — réauthentifiez ce compte`,"codexAuth.mainTokenExpired":`Jeton expiré — reconnectez-vous depuis l’application Codex`,"codexAuth.emailCollision":`Ce compte correspond à votre connexion Codex principale. Utilisez un autre compte.`,"codexAuth.resetCreditsTitle":`Crédits de réinitialisation`,"codexAuth.resetCreditsAvailable":`Vous disposez de {count} crédit(s) de réinitialisation.`,"codexAuth.resetCreditsDesc":`Chaque crédit réinitialise instantanément vos limites d’utilisation horaire et hebdomadaire actuelles.`,"codexAuth.noResetCredits":`Vous ne disposez d’aucun crédit de réinitialisation.`,"codexAuth.earnCreditsHint":`Les crédits sont accordés chaque mois et dans le cadre du programme de parrainage.`,"codexAuth.creditsExpireNote":`Les crédits expirent 30 jours après leur obtention.`,"codexAuth.useOneCredit":`Utiliser 1 crédit`,"codexAuth.confirmResetTitle":`Utiliser un crédit de réinitialisation?`,"codexAuth.confirmResetDesc":`Vos limites de débit actuelles seront réinitialisées immédiatement. Il vous reste {count} crédit(s).`,"codexAuth.irreversible":`Cette action est irréversible.`,"codexAuth.useCredit":`Utiliser le crédit`,"codexAuth.redeeming":`Réinitialisation...`,"codexAuth.resetSuccess":`Limites de débit réinitialisées! {remaining} crédit(s) restant(s).`,"codexAuth.resetSuccessGeneric":`Limites de débit réinitialisées!`,"codexAuth.resetAlreadyRedeemed":`Ce crédit a déjà été utilisé. Les crédits sont inchangés.`,"codexAuth.resetNothingToReset":`Aucune fenêtre de limite de débit ne doit être réinitialisée actuellement.`,"codexAuth.resetNoCredit":`Aucun crédit de réinitialisation disponible.`,"codexAuth.resetError":`Impossible d’utiliser le crédit de réinitialisation. Réessayez.`,"codexAuth.fifoNote":`Le crédit le plus ancien est utilisé en premier.`,"codexAuth.confirmWhichCredit":`Le crédit du {date} sera utilisé.`,"codexAuth.creditNext":`Prochain à utiliser`,"codexAuth.creditLabel":`Crédit nº {n}`,"codexAuth.creditNextBadge":`PROCHAIN`,"codexAuth.creditGranted":`Accordé le {date}`,"codexAuth.creditExpires":`Expire le {date} ({days} j restants)`,"api.title":`Accès à l’API`,"api.subtitle":`Utilisez les clés API générées pour accéder au proxy opencodex depuis des applications externes. Les clés s’authentifient au moyen de l’en-tête {authHeader}; consultez le tableau ci-dessous pour connaître les éléments acceptés par chaque point de terminaison.`,"api.baseUrl":`URL de base`,"api.responsesEndpoint":`API Responses`,"api.chatCompletionsEndpoint":`API Chat Completions`,"api.messagesEndpoint":`API Messages`,"api.modelsEndpoint":`API des modèles`,"api.endpointNote":`Utilisez l’URL de base avec les clients compatibles avec OpenAI. Responses et Chat Completions sont accessibles sous /v1.`,"api.endpointsTitle":`Points de terminaison`,"api.authTitle":`Authentification`,"api.authLoopback":`Les écoutes en boucle locale (127.0.0.1 ou ::1) contournent l’authentification. Les écoutes distantes nécessitent une clé ocx_ générée ou OPENCODEX_API_AUTH_TOKEN.`,"api.authBaseUrlNote":`Configurez les clients avec l’URL de base, puis choisissez ci-dessous le point de terminaison propre au protocole.`,"api.newKeyTitle":`Nouvelle clé créée`,"api.newKeyNote":`Copiez cette clé maintenant — elle ne sera plus affichée.`,"api.copy":`Copier`,"api.copied":`Copié`,"api.dismiss":`Fermer`,"api.generateTitle":`Générer une clé`,"api.keyNamePlaceholder":`Nom de la clé (facultatif)`,"api.generate":`Générer`,"api.generating":`Création…`,"api.activeKeys":`Clés actives ({count})`,"api.activeKeysLoading":`Clés actives`,"api.noKeys":`Aucune clé API pour le moment. Générez-en une ci-dessus.`,"api.workspace.sections":`Sections de l’API`,"api.section.keys":`Clés`,"api.section.connect":`Connexion`,"api.section.endpoints":`Points de terminaison`,"api.section.models":`Modèles`,"api.section.examples":`Exemples`,"api.workspace.details":`Détails de la clé API`,"api.workspace.keyDetails":`Détails de la clé`,"api.workspace.keyPrefix":`Préfixe de la clé`,"api.workspace.deleteKey":`Supprimer la clé`,"api.workspace.deleteConfirm":`Voulez-vous vraiment supprimer cette clé? Cette action est irréversible.`,"api.workspace.usageExamples":`Exemples d’utilisation`,"api.copyUrlHint":`Cliquer pour copier l’URL`,"api.urlCopied":`URL copiée`,"api.copyExampleHint":`Cliquer pour copier l’exemple`,"api.exampleCopied":`Exemple copié`,"api.colName":`Nom`,"api.colKey":`Clé`,"api.colCreated":`Création`,"api.confirm":`Confirmer`,"api.deleteAria":`Supprimer la clé API`,"api.modelsTitle":`Catalogue de modèles externes`,"api.modelsCount":`{count} appelable(s)`,"api.modelsLoading":`Chargement des modèles…`,"api.modelsSearch":`Rechercher des modèles`,"api.modelsSubtitle":`Utilisez ces identifiants de modèle exacts avec /v1/models et le protocole entrant de votre choix.`,"api.modelsEmpty":`Aucun modèle appelable de l’extérieur n’est encore disponible.`,"api.modelsNoMatch":`Aucun modèle ne correspond à « {query} ».`,"api.modelsLoadFailed":`Impossible de charger le catalogue de modèles externes.`,"api.colModel":`Modèle`,"api.colSource":`Source`,"api.colProtocols":`Protocoles`,"api.sourceNative":`Groupe ChatGPT`,"api.sourceCombo":`Route de combinaison`,"api.sourceCustom":`Personnalisé`,"api.protocolResponses":`Responses`,"api.protocolChatCompletions":`Chat Completions`,"api.protocolMessages":`Messages`,"api.copyModelId":`Copier l’identifiant`,"api.modelCopied":`Copié`,"api.testModel":`Tester`,"api.testingModel":`Test en cours…`,"api.testSucceeded":`OK`,"api.testFailed":`Échec`,"api.usageChatTitle":`Exemple Chat Completions`,"api.usageResponsesTitle":`Exemple Responses`,"api.usageMessagesTitle":`Exemple Messages`,"api.usageSampleInput":`Bonjour tout le monde!`,"api.clientConfig.title":`Configuration du client`,"api.clientConfig.rowsLabel":`Connecter un client`,"api.clientConfig.details":`Détails`,"api.clientConfig.detailsAria":`Détails de la configuration de {client}`,"api.clientConfig.copyAria":`Copier la configuration de {client}`,"api.clientConfig.downloadAria":`Télécharger la configuration de {client}`,"api.clientConfig.rowMeta":`{destination} · {count} modèle(s)`,"api.clientConfig.rowError":`Impossible de générer la configuration de {client}.`,"api.clientConfig.copiedAnnounceClient":`Configuration de {client} copiée dans le presse-papiers.`,"api.clientConfig.clientOpencode":`OpenCode`,"api.clientConfig.clientPi":`Pi`,"api.clientConfig.clientOmp":`OMP`,"api.clientConfig.clientHermes":`Hermes`,"api.clientConfig.clientOpenclaw":`OpenClaw`,"api.clientConfig.clientKimi":`Kimi Code`,"api.clientConfig.clientGajae":`Gajae Code`,"api.clientConfig.clientDsh":`DeepSeek Harness (DSH)`,"api.clientConfig.clientMcode":`MiniMax Code`,"api.clientConfig.clientZcode":`ZCode`,"api.clientConfig.clientPrime":`Prime Agent`,"api.clientConfig.copy":`Copier la configuration`,"api.clientConfig.download":`Télécharger`,"api.clientConfig.loading":`Génération de la configuration du client…`,"api.clientConfig.jsonLabel":`Configuration de {client}`,"api.clientConfig.destination":`Fichier de destination`,"api.clientConfig.envHint":`Définissez la clé avant le lancement`,"api.clientConfig.mergeWarning":`Fusionnez ceci dans le fichier de destination. Le remplacer supprimerait vos autres fournisseurs et paramètres MCP.`,"api.clientConfig.modelCount":`{count} modèle(s) exporté(s)`,"api.clientConfig.missingLimits":`{count} modèle(s) sur {total} sont fournis sans limite de contexte; le client applique ses propres valeurs par défaut.`,"api.clientConfig.noKeyYet":`Aucune clé ne se trouve encore derrière {env}. Générez une clé ci-dessus avant d’utiliser cette configuration hors de la boucle locale.`,"api.clientConfig.loadFailed":`Impossible de lire la liste des modèles; aucune configuration de client n’a donc été produite.`,"api.clientConfig.copiedAnnounce":`Configuration du client copiée dans le presse-papiers.`,"api.clientConfig.copyFailed":`Impossible de copier la configuration du client.`,"api.clientConfig.downloadedAnnounce":`{filename} téléchargé. Rien n’a encore changé — fusionnez-le vous-même dans {destination}.`,"api.clientConfig.whereDisclosure":`Emplacement de ce fichier`,"api.clientConfig.whereBody":`La destination ci-dessus est le chemin global. Un fichier de configuration local au projet dans le répertoire de travail a priorité sur celui-ci, et le client lit la clé depuis la variable d’environnement nommée dans la configuration — jamais depuis ce fichier.`,"api.keysLoadFailed":`Impossible de charger les clés API.`,"api.createFailed":`Impossible de créer la clé API.`,"api.deleteFailed":`Impossible de supprimer la clé API.`,"api.auth.endpoint":`Point de terminaison`,"api.auth.required":`Requis`,"api.auth.accepted":`Accepté`,"api.auth.rejected":`Non accepté`,"api.auth.testProtocol":`Tester {protocol}`,"api.auth.testNeedsFreshKey":`Générez une clé et conservez sa valeur à usage unique à l’écran pour exécuter un test authentifié.`,"api.key.name":`Nom de la clé`,"api.key.rename":`Renommer`,"api.key.saveName":`Enregistrer le nom`,"api.key.renaming":`Enregistrement…`,"api.key.renameFailed":`Impossible de renommer la clé. Votre brouillon a été conservé.`,"api.key.deleting":`Suppression…`,"api.key.copyFailed":`Impossible de copier la clé. Sélectionnez-la et copiez-la manuellement avant de fermer ce panneau.`,"api.attribution.title":`Utilisation attribuée`,"api.attribution.requests7d":`Requêtes des 7 derniers jours`,"api.attribution.totalRequests":`Total des requêtes attribuées`,"api.attribution.totalRequestsAvailable":`Requêtes dans l’historique disponible`,"api.attribution.sinceAvailable":`Attribution disponible depuis le`,"api.attribution.lastUsed":`Dernière utilisation`,"api.attribution.since":`Attribution disponible depuis le`,"api.attribution.neverUsed":`Non utilisée depuis le début de l’attribution`,"api.attribution.unavailable":`Utilisation indisponible`,"api.attribution.unavailableDetail":`Aucune utilisation n’a encore été attribuée. Les requêtes enregistrées avant le début de l’attribution ne peuvent pas être attribuées rétroactivement.`,"api.attribution.ambiguous":`Deux clés partagent cet identifiant; l’utilisation ne peut donc pas être attribuée à l’une d’elles. Attribuez un identifiant unique à chaque clé dans le fichier de configuration.`,"api.attribution.railAmbiguous":`identifiant en double`,"claude.subtitle":`Utilisez GPT, Gemini et d’autres modèles dans Claude Code.`,"claude.pageTitle":`Claude Code`,"claude.workspace.settings":`Paramètres`,"claude.enabledLabel":`Connexion Claude`,"claude.enabledHint":`Lorsque cette option est désactivée, Claude Code ne peut pas utiliser ce proxy.`,"claude.authMode":`Mode d’authentification`,"claude.authModeHint":`L’abonnement nécessite un compte Claude; le proxy fonctionne sans compte Anthropic`,"claude.authModeSubscription":`Abonnement (compte Claude)`,"claude.authModeProxy":`Proxy (aucun compte requis)`,"claude.authModeAuto":`Automatique (détecter l’authentification Claude)`,"claude.effectiveMode.label":`Effectif au prochain lancement`,"claude.effectiveMode.manual":`Manuel : {mode}`,"claude.effectiveMode.autoPresent":`Automatique : abonnement — authentification Claude trouvée via {source}`,"claude.effectiveMode.autoAbsent":`Automatique : mode proxy — aucune authentification Claude trouvée`,"claude.effectiveMode.autoUnknown":`Automatique : abonnement — impossible de vérifier l’authentification`,"claude.effectiveMode.admissionKey":`La clé API de ce proxy est toujours envoyée.`,"claude.authSource.claude-json-oauth":`Compte Claude`,"claude.authSource.claude-credentials-file":`fichier d’identifiants`,"claude.authSource.macos-keychain":`Trousseau macOS`,"claude.authSource.exported-env":`variable d’environnement`,"claude.authSource.unknown":`un identifiant détecté`,"claude.systemEnv":`Connexion automatique`,"claude.systemEnvDesc":`Lorsque cette option est activée, l’exécution de claude dans n’importe quel terminal passe automatiquement par le proxy.`,"claude.systemEnvUnsupported":`La connexion automatique est disponible uniquement sous macOS. Sur ce système, démarrez Claude avec {cmd}.`,"claude.systemEnvWarn":`⚠ Vous devez quitter complètement votre application de terminal et la relancer pour appliquer ce changement. Non recommandé.`,"claude.fastMode":`Mode rapide (OpenAI)`,"claude.fastModeDesc":`Contrôle service_tier pour les modèles OpenAI. ACTIVÉ = priorité (plus rapide). DÉSACTIVÉ = valeur par défaut. Automatique = transmission directe (le client décide).`,"claude.fastAuto":`Automatique`,"claude.fastOn":`ACTIVÉ`,"claude.fastOff":`DÉSACTIVÉ`,"claude.autoContext":`Utiliser automatiquement le grand contexte`,"claude.autoContextDesc":`Contrôle l’étendue du marquage 1M. ACTIVÉ : tout modèle dont la fenêtre peut accueillir le seuil de compaction obtient une ligne de grand contexte. DÉSACTIVÉ : seuls les véritables modèles 1M en obtiennent une.`,"claude.autoContextInert":`Inactif, car une ancienne valeur de taille de contexte (maxContextTokens) existe dans le fichier de configuration. Supprimez-la dans ce fichier pour réactiver l’option.`,"claude.autoCompactWindow":`Seuil de résumé automatique`,"claude.autoCompactDefault":`{value} (par défaut)`,"claude.autoCompactWindowDesc":`Les anciens messages sont résumés lorsque la conversation atteint ce seuil. Celui-ci ne dépasse jamais la limite propre à chaque modèle; les modèles 200k ne sont donc pas affectés.`,"claude.autoCompactWindowWarn":`La modification de ce paramètre peut perturber les modèles GPT — s’il dépasse la limite réelle d’un modèle, les conversations échoueront avant le déclenchement du résumé.`,"claude.injectAgents":`Enregistrer automatiquement les sous-agents`,"claude.injectAgentsDesc":`Enregistre les modèles choisis dans l’onglet Sous-agents (ainsi que le modèle par défaut actuel) comme agents Claude Code délégables (ocx-*). S’applique à partir de la prochaine session.`,"claude.webSearchSidecar":`Remplacement du service auxiliaire de recherche Web`,"claude.webSearchSidecarHint":`Remplace le service auxiliaire principal de recherche Web pour les requêtes Claude Code.`,"claude.visionSidecar":`Remplacement du service auxiliaire de vision`,"claude.visionSidecarHint":`Remplace le service auxiliaire principal de vision pour les requêtes Claude Code.`,"claude.useMainSetting":`Utiliser le paramètre principal`,"claude.sidecarModelPlaceholder":`Modèle du paramètre principal`,"claude.quickstart":`Commencer`,"claude.quickstartHint":`{cmd} ouvre Claude Code via le proxy. Votre connexion à claude.ai reste active.`,"claude.manualEnv":`Configuration manuelle (avancé)`,"claude.smallFastModel":`Modèle auxiliaire en arrière-plan`,"claude.smallFastModelHint":`Le modèle utilisé par Claude Code pour les tâches en arrière-plan, comme le résumé des conversations et la détection des sujets. L’alias de sous-agent haiku l’utilise également. Vide = valeur par défaut de Claude (Haiku).`,"claude.smallFastModelAccurateHint":`Le modèle utilisé par Claude Code pour les tâches en arrière-plan, comme le résumé des conversations et la détection des sujets. L’alias de sous-agent haiku l’utilise également.`,"claude.smallFastModelUnsetOption":`Laisser Claude Code choisir (modèle natif)`,"claude.smallFastModelNativeWarning":`Lorsque ce champ est vide, OpenCodex ne définit aucun remplacement du modèle auxiliaire. Claude Code peut utiliser son modèle Sonnet natif, ce qui peut entraîner des frais auprès de votre fournisseur natif.`,"claude.slotUnset":`Utiliser la valeur par défaut de Claude`,"claude.modelMap":`Interception de modèles`,"claude.modelMapHint":`Intercepte les requêtes visant un modèle précis et les redirige vers celui que vous choisissez. Vide par défaut — rien ne se produit tant que vous n’ajoutez pas de règle.`,"claude.mapFrom":`Modèle d’origine (p. ex. claude-sonnet-4-5)`,"claude.mapTo":`Remplacer par (p. ex. gemini/gemini-3-pro)`,"claude.addMapping":`Ajouter une règle`,"claude.removeMapping":`Supprimer la règle`,"claude.aliases":`Modèles disponibles`,"claude.aliasesHint":`Modèles affichés dans le menu /model de Claude Code.`,"claude.aliasProviderOther":`Autre`,"claude.loading":`Chargement…`,"claude.loadFail":`Impossible de charger les paramètres de Claude`,"claude.saved":`Enregistré.`,"claude.saveFailed":`Échec de l’enregistrement`,"claude.networkError":`Erreur réseau — le proxy est-il en cours d’exécution?`,"claude.toggleAria":`Activer ou désactiver la connexion Claude`,"claude.none":`Aucun`,"cws.loading":`Chargement des combinaisons…`,"cws.loadFailed":`Impossible de charger les combinaisons.`,"cws.saveFailed":`Impossible d’enregistrer la combinaison.`,"cws.removeFailed":`Impossible de supprimer la combinaison.`,"cws.saved":`Combinaison enregistrée.`,"cws.created":`{model} créé.`,"cws.removed":`combo/{id} supprimé.`,"cws.renamed":`{from} renommé en {to}.`,"cws.add":`Ajouter une combinaison`,"cws.addTitle":`Ajouter une combinaison`,"cws.addSubtitle":`Créez un modèle virtuel couvrant plusieurs fournisseurs et choisissez le nom de modèle exact que les clients demanderont.`,"cws.create":`Créer la combinaison`,"cws.railAria":`Liste des combinaisons`,"cws.searchPlaceholder":`Rechercher des combinaisons ou des cibles…`,"cws.noSearchResults":`Aucune combinaison ne correspond à votre recherche.`,"cws.group.failover":`Basculement`,"cws.group.roundRobin":`Rotation`,"cws.targetCount":`{count} cibles`,"cws.targetCountOne":`1 cible`,"cws.overviewTitle":`Combinaisons`,"cws.overviewBlurb":`Modèles virtuels qui basculent entre des cibles fournisseur/modèle ou utilisent une rotation pondérée fluide et déterministe.`,"cws.count.total":`Total`,"cws.count.failover":`Basculement`,"cws.count.roundRobin":`Rotation`,"cws.howTitle":`Fonctionnement`,"cws.howBody":`Demandez à Codex le nom de modèle public de la combinaison. Sans nom, combo/<id> est utilisé par défaut. OpenCodex sélectionne une cible et ne bascule qu’en cas d’échec réessayable en amont. Si aucune cible ne reste disponible, la requête est bloquée au lieu d’utiliser le fournisseur global par défaut.`,"cws.attentionTitle":`Intervention requise`,"cws.attention.empty":`Aucune cible configurée`,"cws.attention.few":`Une seule cible — le basculement n’a aucune autre destination`,"cws.attention.catalogOmitted":`Absent du catalogue de modèles — les capacités des membres sont incomplètes ou incompatibles (fenêtre de contexte ou métadonnées manquantes, ou intersection des modalités vide). Le routage par alias fonctionne toujours`,"cws.attention.allTargetsExhausted":`Toutes les cibles activées ont épuisé leur quota`,"cws.emptyTitle":`Créer votre première combinaison`,"cws.empty.createDesc":`Nommez un modèle virtuel et enchaînez au moins deux services principaux.`,"cws.backToAll":`Retour à toutes les combinaisons`,"cws.capability.imageInputUnavailable":`Indisponible tant que toutes les cibles sélectionnées ne prennent pas en charge les images.`,"cws.capability.imageInputHint":`Activé par défaut lorsque toutes les cibles prennent en charge les images. Désactivez cette option pour n’accepter que du texte.`,"cws.capability.imageInput":`Images / multimodal`,"cws.capabilities":`Capacités`,"cws.allCombos":`Toutes les combinaisons`,"cws.copyModel":`Copier l’identifiant`,"cws.copied":`Copié`,"cws.tabsLabel":`Sections des détails de la combinaison`,"cws.tab.config":`Configuration`,"cws.tab.about":`À propos`,"cws.strategy":`Stratégie`,"cws.strategy.failover":`Basculement`,"cws.strategy.roundRobin":`Rotation`,"cws.strategy.failoverHint":`Essaie les cibles dans l’ordre. Si la première échoue avec une erreur réessayable (limite de débit, panne, restriction d’abonnement), passe à la suivante.`,"cws.strategy.roundRobinHint":`Répartit le trafic de manière déterministe selon les pondérations. Conserve chaque cible sélectionnée pendant un lot de requêtes réussies, puis passe à la suivante.`,"cws.field.id":`Identifiant de la combinaison`,"cws.field.idHint":`Les clients demanderont {model}`,"cws.field.idInternalHint":`Identifiant interne de la combinaison. Vous pouvez le modifier après la création.`,"cws.field.idHintEdit":`Le renommage déplace la combinaison vers un nouvel identifiant. Les clients demandent {model}.`,"cws.field.alias":`Nom de modèle public`,"cws.field.aliasPlaceholder":`deepseek-v4-flash ou vendor/model`,"cws.field.aliasHint":`Facultatif. Utilisez un nom simple sans préfixe, un préfixe personnalisé comme vendor/model, ou laissez le champ vide pour utiliser combo/<id>.`,"cws.field.nativeAlias":`Alias OpenAI natif`,"cws.field.nativeAliasHint":`Permet à cette combinaison de prendre en charge un identifiant de modèle OpenAI natif non qualifié compatible. Les routes OpenAI qualifiées par compte ou fournisseur restent distinctes.`,"cws.field.displayName":`Nom d’affichage`,"cws.field.displayNameHint":`Libellé de cette combinaison dans le sélecteur. Requis lorsque l’alias OpenAI natif est activé.`,"cws.field.stickyLimit":`Réussites persistantes avant rotation`,"cws.field.stickyLimitHint":`Conserve la cible sélectionnée pendant ce nombre de requêtes réussies avant que le sélecteur pondéré passe à la suivante.`,"cws.field.defaultEffort":`Raisonnement par défaut`,"cws.field.defaultEffortNone":`Aucun (valeur par défaut de la cible)`,"cws.field.defaultEffortHint":`Utilisé uniquement lorsque le client omet l’effort de raisonnement. Les options correspondent à l’intersection des efforts annoncés par les cibles sélectionnées; les cibles sans métadonnées d’effort dans le catalogue n’en proposent aucun.`,"cws.field.defaultEffortUnsupported":`Cet effort ne figure pas dans l’échelle commune des cibles — il sera ignoré ou ajusté lors de la requête.`,"cws.field.defaultEffortUnsupportedOption":`absent de l’intersection`,"cws.targets":`Cibles`,"cws.targets.failoverHint":`L’ordre est important — la première est la cible principale.`,"cws.targets.roundRobinHint":`Les pondérations contrôlent la sélection relative déterministe; l’ordre départage les égalités dans l’anneau de rotation.`,"cws.target.provider":`Fournisseur`,"cws.target.model":`Modèle`,"cws.target.weight":`Pondération`,"cws.target.pickProvider":`Sélectionner un fournisseur…`,"cws.target.pickProviderFirst":`Sélectionner d’abord un fournisseur…`,"cws.target.pickModel":`Sélectionner un modèle…`,"cws.target.noModels":`Aucun modèle pour ce fournisseur`,"cws.target.modelPlaceholder":`identifiant du modèle`,"cws.target.add":`Ajouter une cible`,"cws.target.drag":`Faire glisser pour réorganiser`,"cws.target.moveUp":`Monter`,"cws.target.moveDown":`Descendre`,"cws.quota.available":`Disponible`,"cws.quota.exhausted":`Quota épuisé`,"cws.quota.unknown":`Quota inconnu`,"cws.quota.allExhausted":`Toutes les cibles activées ont épuisé leur quota. Choisissez une autre cible ou attendez le rétablissement du quota.`,"cws.aboutTitle":`Exécution`,"cws.aboutBody":`Les cibles en échec sont temporairement mises en attente conformément à Retry-After. Les erreurs de contexte ou de validité ne provoquent aucun basculement. Chaque cible adapte l’effort à ses propres capacités ; les combinaisons épuisées bloquent les requêtes. Les journaux et la section Utilisation conservent les tentatives physiques ordonnées et l’utilisation de chaque tentative.`,"cws.removeConfirmTitle":`Supprimer {model}?`,"cws.removeConfirmDesc":`Cette action supprime le modèle virtuel de la configuration et du catalogue Codex. Elle ne supprime aucun fournisseur.`,"cws.unsavedTitle":`Modifications non enregistrées`,"cws.unsavedDesc":`Abandonner les modifications de cette combinaison et continuer ?`,"cws.keepEditing":`Continuer la modification`,"cws.err.missingId":`L’identifiant de la combinaison est requis.`,"cws.err.invalidId":`L’identifiant doit commencer par une lettre ou un chiffre et contenir uniquement des lettres, des chiffres, des points, des traits de soulignement ou des traits d’union (64 caractères au maximum).`,"cws.err.duplicateId":`Une combinaison portant cet identifiant existe déjà.`,"cws.err.invalidAlias":`L’alias doit contenir des lettres, des chiffres, des points, des traits de soulignement ou des traits d’union, avec au plus un segment « / ».`,"cws.err.aliasReservedNamespace":`L’alias ne doit pas utiliser l’espace de noms réservé « combo/ ».`,"cws.err.aliasNativeFamily":`Les alias simples de la famille native OpenAI (gpt-*, o1-*, o3-*, o4-*, codex-*) ne sont pas autorisés.`,"cws.err.unsupportedNativeAlias":`L’alias natif doit être un identifiant simple de modèle OpenAI actuellement pris en charge.`,"cws.err.missingNativeAliasDisplayName":`Un nom d’affichage est requis pour les alias natifs.`,"cws.err.invalidDisplayName":`Le nom d’affichage doit comporter au plus 128 caractères et ne contenir aucun caractère de contrôle.`,"cws.err.duplicateAlias":`Une autre combinaison utilise déjà cet alias.`,"cws.err.noTargets":`Ajoutez au moins une cible.`,"cws.err.incompleteTarget":`Chaque cible nécessite un fournisseur et un modèle.`,"cws.target.disabled":`{name} (désactivé)`,"cws.err.reservedNamespace":`Un fournisseur physique nommé « combo » doit être renommé avant la création de combinaisons.`,"cws.err.providerCollision":`L’identifiant de la combinaison entre en conflit avec le nom d’un fournisseur configuré.`,"cws.err.unknownProvider":`Chaque cible doit utiliser un fournisseur configuré.`,"cws.err.duplicateTarget":`Une même cible fournisseur/modèle ne peut apparaître qu’une seule fois.`,"cws.err.invalidStickyLimit":`Le nombre de réussites persistantes doit être un entier compris entre 1 et 100.`,"cws.err.invalidWeight":`Chaque pondération de rotation doit être un entier compris entre 1 et 10000.`,"cws.err.noEnabledTarget":`Au moins une cible doit utiliser un fournisseur activé.`,"claude.tabsLabel":`Client Claude`,"claude.tabCode":`Code`,"claude.tabDesktop":`Desktop`,"claudeDesktop.title":`Claude Desktop`,"claudeDesktop.subtitle":`Acheminez chaque famille de modèles Claude vers un modèle disponible sur le port {port}.`,"claudeDesktop.importJson":`Importer le JSON`,"claudeDesktop.exportJson":`Exporter le JSON`,"claudeDesktop.loading":`Chargement du profil Claude Desktop…`,"claudeDesktop.loadFail":`Impossible de charger le profil Claude Desktop.`,"claudeDesktop.retry":`Réessayer`,"claudeDesktop.saveFailed":`Impossible d’enregistrer le profil Claude Desktop.`,"claudeDesktop.applyFailed":`Le profil a été enregistré, mais n’a pas pu être appliqué.`,"claudeDesktop.updateFailed":`Échec de la mise à jour de Claude Desktop.`,"claudeDesktop.savedApplied":`Profil enregistré et appliqué à Claude Desktop.`,"claudeDesktop.appliedMarkerUnsaved":`Appliqué à Claude Desktop, mais le marqueur d’application n’a pas été enregistré — l’état enregistré/appliqué ci-dessous peut être obsolète jusqu’à la prochaine application.`,"claudeDesktop.savedAppliedAnnounce":`Profil Claude Desktop enregistré et appliqué.`,"claudeDesktop.saved":`Profil enregistré.`,"claudeDesktop.savedAnnounce":`Profil Claude Desktop enregistré.`,"claudeDesktop.exported":`Profil exporté au format JSON.`,"claudeDesktop.importExpected":`Un profil Claude Desktop de version 1 était attendu.`,"claudeDesktop.importReady":`JSON importé. Vérifiez le brouillon, puis enregistrez-le et appliquez-le.`,"claudeDesktop.importedAnnounce":`JSON du profil importé. Les modifications non enregistrées sont prêtes à être vérifiées.`,"claudeDesktop.importInvalid":`Le fichier sélectionné n’est pas un profil valide.`,"claudeDesktop.importFailed":`Échec de l’importation. {error}`,"claudeDesktop.moved":`{route} déplacé vers {family}.`,"claudeDesktop.unsaved":`Modifications non enregistrées`,"claudeDesktop.upToDate":`Le profil est à jour`,"claudeDesktop.saving":`Enregistrement…`,"claudeDesktop.applying":`Application…`,"claudeDesktop.saveApply":`Enregistrer et appliquer`,"claudeDesktop.emptyTitle":`Aucun modèle disponible`,"claudeDesktop.emptyHint":`Ajoutez ou activez un fournisseur, puis revenez attribuer les routes Claude Desktop.`,"claudeDesktop.assignmentsLabel":`Attributions des familles de modèles Claude`,"claudeDesktop.family.opus":`Opus`,"claudeDesktop.family.fable":`Fable`,"claudeDesktop.family.sonnet":`Sonnet`,"claudeDesktop.family.haiku":`Haiku`,"claudeDesktop.modelCountOne":`{count} modèle`,"claudeDesktop.modelCountMany":`{count} modèles`,"claudeDesktop.chooseDefault":`Choisir une valeur par défaut`,"claudeDesktop.temporaryDefault":`Valeur par défaut temporaire`,"claudeDesktop.laneEmpty":`Déposez un modèle ici ou utilisez sa commande Déplacer.`,"claudeDesktop.laneNoMatch":`Aucun modèle de cette famille ne correspond à votre recherche.`,"nav.grok":`Grok`,"grok.title":`Grok Build`,"grok.subtitle":`Modèles qu’opencodex a enregistrés dans votre configuration Grok.`,"grok.loading":`Chargement de l’état de Grok…`,"grok.loadFail":`Impossible de lire la configuration Grok.`,"grok.notConfiguredTitle":`Grok Build n’est pas configuré`,"grok.notConfiguredHint":`Démarrez ou redémarrez le proxy avec Grok installé; opencodex écrit alors un bloc géré dans :`,"grok.endpoint":`Point de terminaison`,"grok.colModel":`Modèle`,"grok.colAlias":`Alias Grok`,"grok.colContext":`Contexte`,"grok.groupNative":`Modèles natifs`,"grok.groupRouted":`Modèles acheminés`,"grok.enabledCount":`{on} sur {total} enregistrés`,"grok.saved":`Sélection enregistrée.`,"grok.savedApplied":`Sélection enregistrée et écrite dans votre configuration Grok.`,"grok.saveFailed":`Impossible d’enregistrer la sélection Grok.`,"grok.applyFailed":`Sélection enregistrée, mais impossible de mettre à jour la configuration Grok.`,"grok.applySkipped":`Sélection enregistrée. La configuration Grok n’a pas été modifiée.`,"grok.saveApply":`Enregistrer et appliquer`,"grok.saving":`Enregistrement…`,"grok.applying":`Application…`,"grok.unsaved":`Modifications non enregistrées`,"grok.upToDate":`La sélection est à jour`,"grok.toggleModel":`Enregistrer {id} auprès de Grok`,"claudeDesktop.available":`Disponible`,"claudeDesktop.defaultBadge":`Par défaut`,"claudeDesktop.supports1m":`1M`,"claudeDesktop.unavailable":`Indisponible`,"claudeDesktop.contextM":`Contexte de {n}M`,"claudeDesktop.contextK":`Contexte de {n}k`,"claudeDesktop.contextUnknown":`contexte inconnu`,"claudeDesktop.alias":`Alias`,"claudeDesktop.useAsDefault":`Utiliser par défaut pour {family}`,"claudeDesktop.moveTo":`Déplacer vers`,"claudeDesktop.move":`Déplacer`,"claudeDesktop.status.applied":`Appliqué à Desktop`,"claudeDesktop.status.stale":`Configuration obsolète — appliquer de nouveau`,"claudeDesktop.status.notApplied":`Non appliqué`,"claudeDesktop.status.notActiveProfile":`Desktop utilise un autre profil — appliquer de nouveau`,"claudeDesktop.status.disabled":`L’intégration Claude Desktop est désactivée. Quittez complètement Desktop et rouvrez-le après l’avoir activée.`,"claudeDesktop.enableApply":`Activer et appliquer`,"claudeDesktop.health.lastRequest":`Dernière requête`,"claudeDesktop.health.stats":`{count} req. / {errors} err.`,"claudeDesktop.effort.supported":`effort`,"claudeDesktop.effort.displayOnly":`effort (affichage uniquement)`,"lab.title":`Laboratoire de compatibilité`,"lab.subtitle":`Matrice en lecture seule des verdicts de compatibilité issus des preuves de projection du laboratoire.`,"lab.loadFailed":`Impossible de charger les données du laboratoire de compatibilité`,"lab.projectionUnavailable":`La projection du laboratoire n’est pas disponible. Exécutez d’abord les tests de conformité ou les sondes en direct.`,"lab.projectionIncompatible":`Le schéma de projection du laboratoire est incompatible. Régénérez la projection.`,"lab.statusTitle":`État de la projection`,"lab.matrixTitle":`Matrice de compatibilité`,"lab.verdictsTitle":`Enregistrements de verdicts`,"lab.filter.layer":`Couche de preuve`,"lab.filter.verdict":`Verdict`,"lab.filter.subject":`Identifiant du sujet`,"lab.filter.all":`Tous`,"lab.col.subject":`Sujet`,"lab.col.layer":`Couche`,"lab.col.suite":`Suite`,"lab.col.verdict":`Verdict`,"lab.col.asOf":`En date du`,"lab.col.protocol":`Conformité du protocole`,"lab.col.live":`Compatibilité des routes en direct`,"lab.col.task":`Efficacité des tâches`,"lab.empty":`Aucun verdict de compatibilité dans la projection pour le moment.`,"lab.subjectKind":`Type`,"lab.observationCount":`Observations`,"lab.eventCount":`Événements`,"lab.verdictCount":`Verdicts`,"lab.subjectCount":`Sujets`,"lab.builtAt":`Générée le`,"lab.loading":`Chargement des preuves de compatibilité…`,"lab.loadMore":`Charger davantage`,"lab.detailTitle":`Détails du verdict`,"lab.detailClose":`Fermer`,"lab.detailSubject":`Sujet`,"lab.detailObservations":`Observations`,"lab.detailEvents":`Événements contributifs`,"lab.detailArtifacts":`Métadonnées des artefacts`,"lab.production.title":`Trafic de production observé`,"lab.production.notVerification":`Ne constitue pas une vérification du laboratoire`,"lab.production.attempts":`Tentatives`,"lab.production.successes":`Réussites`,"lab.production.routeErrors":`Erreurs de routage`,"lab.production.lastObserved":`Dernière observation`,"lab.detailLoadFailed":`Impossible de charger les détails du verdict`,"lab.refresh":`Actualiser`,"lab.verdict.UNKNOWN":`Inconnu`,"lab.verdict.CLAIMED":`Déclaré`,"lab.verdict.PROBED":`Sondé`,"lab.verdict.VERIFIED":`Vérifié`,"lab.verdict.DEGRADED":`Dégradé`,"lab.verdict.BLOCKED":`Bloqué`,"lab.verdict.UNSUPPORTED":`Non pris en charge`,"lab.layer.protocol_conformance":`Conformité du protocole`,"lab.layer.live_route_compatibility":`Compatibilité des routes en direct`,"lab.layer.task_effectiveness":`Efficacité des tâches`,"sub.routedDelegationBridge":`Pont de délégation V2 routé`,"sub.routedDelegationBridgeHint":`Expérimental. Lorsqu’il est actif, les messages de création, d’envoi et de suivi sont en clair, y compris entre agents natifs. Codex peut encore afficher le modèle d’origine ; le contenu routé et la confidentialité suivent le fournisseur sélectionné.`,"sub.routedDelegationBridgeInactive":`Armé ; ne s’active que pour les racines V2 natives éligibles.`,"sub.routedDelegationBridgeSaveFail":`Échec de l’enregistrement du pont de délégation V2 routé`,"sub.routedDelegationBridgeSaved":`Pont de délégation V2 routé enregistré. La désactivation s’applique immédiatement.`,"models.newPolicyGlobal":`Désactiver les nouveaux modèles par défaut`,"models.newPolicyProvider":`Politique des nouveaux modèles`,"models.newPolicy_inherit":`Hériter`,"models.newPolicy_off":`Désactivé`,"models.newPolicy_on":`Activé`,"models.newBadge":`NOUVEAU`,"models.newCount":`{count} nouveaux, désactivés`,"models.aliases":`Alias`,"models.aliasesTable":`Table des alias`,"models.aliasPrompt":`Alias du fournisseur (laisser vide pour effacer)`,"models.modelAliasPrompt":`Alias du modèle (laisser vide pour effacer)`,"models.aliasSaved":`Alias enregistré`,"models.aliasConflict":`Cet alias entre en conflit avec un nom existant`,"models.editProviderAlias":`Modifier l'alias du fournisseur`,"models.editModelAlias":`Modifier l'alias du modèle`,"models.useDefaultAliases":`Utiliser les alias par défaut`,"models.useDefaultAliasesGlobal":`Utiliser les alias par défaut partout`,"models.aliasAuto":`auto`,"models.aliasUser":`utilisateur`,"models.aliasStale":`obsolète`},_={"nav.dashboard":`대시보드`,"uptime.day":`일`,"uptime.hour":`시간`,"uptime.minute":`분`,"uptime.second":`초`,"nav.startup":`시작 안전성`,"nav.providers":`프로바이더`,"nav.models":`모델`,"nav.combos":`콤보`,"nav.subagents":`서브에이전트`,"routing.title":`라우팅 인텔리전스 (beta)`,"routing.subtitle":`정책 프로필, 드라이런 평가, 소스 기반 라우팅 분석.`,"routing.loadFailed":`라우팅 데이터를 불러오지 못했습니다`,"routing.empty":"라우팅 프로필이 구성되지 않았습니다. config.json에 `routingProfiles`를 추가하세요.","routing.revision":`rev`,"routing.detail":`프로필`,"routing.createProfile":`프로필 만들기`,"routing.dryRunError":`드라이런 실패 (HTTP {status})`,"routing.removeConfirm":`프로필 {id}을(를) 제거할까요?`,"routing.unknownEvidence.allow":`허용`,"routing.unknownEvidence.penalize":`불이익`,"routing.unknownEvidence.exclude":`제외`,"routing.removeCandidate":`후보 {provider}/{model} 제거`,"routing.candidates":`후보`,"routing.require":`필수 요구사항`,"routing.optimize":`최적화 가중치`,"routing.limits":`제한`,"routing.unknownEvidence":`알 수 없는 증거 정책`,"routing.compatibility.title":`호환성 정책`,"routing.compatibility.enabled":`Compatibility Lab 증거 필요`,"routing.compatibility.requiredSuites":`필수 스위트`,"routing.compatibility.loadingCatalog":`Lab 카탈로그 로드 중…`,"routing.compatibility.catalogUnavailable":`Lab 카탈로그를 사용할 수 없습니다 — config.json에서 스위트 ID를 수동으로 입력하세요.`,"routing.compatibility.layer.protocol_conformance":`프로토콜 적합성`,"routing.compatibility.layer.live_route_compatibility":`라이브 라우트 호환성`,"routing.compatibility.minStatus":`최소 호환성 상태`,"routing.none":`없음`,"routing.unavailable":`–`,"routing.dryRun":`드라이런 평가`,"routing.dryRunContext":`요청 컨텍스트 창(토큰)`,"routing.dryRunTools":`요청에 도구 필요`,"routing.dryRunImage":`요청에 이미지 입력 필요`,"routing.dryRunStructured":`요청에 구조화된 출력 필요`,"routing.dryRunRun":`후보 평가`,"routing.candidate":`후보`,"routing.eligible":`적격`,"routing.exclusions":`제외`,"routing.costCap":`비용 상한`,"routing.capOutcome.satisfied":`한도 이내`,"routing.capOutcome.exceeded":`한도 초과`,"routing.capOutcome.unknown-allowed":`알 수 없음(허용)`,"routing.capOutcome.unknown-excluded":`알 수 없음(제외)`,"routing.exclusion.capability-unsatisfied":`기능 미충족`,"routing.exclusion.unknown-capability":`알 수 없는 기능`,"routing.exclusion.cost-limit":`비용 상한 초과`,"routing.exclusion.cost-limit-unknown":`상한 이하 비용 불명`,"routing.exclusion.cooldown":`쿨다운`,"routing.exclusion.unknown-health":`상태 불명`,"routing.exclusion.unknown-quota":`할당량 불명`,"routing.exclusion.unknown-price":`가격 불명`,"routing.exclusion.other":`제외: {code}`,"routing.score":`점수`,"routing.selected":`선택됨`,"routing.yes":`예`,"routing.no":`아니요`,"routing.analytics":`라우팅 분석`,"routing.analyticsTotal":`요청`,"routing.analyticsSuccessRate":`성공`,"routing.analyticsFallbackRate":`폴백`,"routing.analyticsP50":`p50`,"routing.analyticsP95":`p95`,"routing.analyticsP99":`p99`,"routing.analyticsCooldown":`쿨다운 실패`,"routing.analyticsConfidence":`신뢰도`,"routing.analyticsTruncated":`잘린 기록`,"routing.analyticsRequests":`요청`,"routing.analyticsEmpty":`분석이 아직 없습니다. 먼저 요청을 보내세요.`,"nav.logs":`로그&디버그`,"nav.usage":`사용량`,"common.github":`GitHub`,"sidebar.star":`GitHub에서 스타 누르기`,"sidebar.starred":`GitHub 스타 완료`,"sidebar.starUnauthenticated":`GitHub에서 스타 누르기 (gh CLI 로그인 안 됨)`,"sidebar.starFailed":`gh로 스타를 누르지 못했습니다. GitHub를 대신 엽니다.`,"sidebar.updateAvailable":`업데이트 있음: {version}`,"sidebar.checkUpdate":`업데이트 확인`,"common.save":`저장`,"common.saving":`저장 중…`,"common.cancel":`취소`,"common.discard":`버리기`,"common.delete":`삭제`,"common.remove":`삭제`,"common.loading":`불러오는 중…`,"common.retry":`재시도`,"auth.adminTokenTitle":`OpenCodex 관리자 토큰 (OPENCODEX_ADMIN_AUTH_TOKEN)`,"auth.adminAccountLabel":`계정`,"auth.adminTokenFieldLabel":`관리자 토큰`,"auth.adminTokenRejected":`관리자 토큰이 거부되었습니다. 확인한 후 다시 시도하세요.`,"auth.adminTokenUnavailable":`관리자 토큰을 확인할 수 없습니다. 다시 시도하세요.`,"theme.label":`테마`,"theme.light":`라이트`,"theme.dark":`다크`,"theme.system":`시스템`,"lang.label":`언어`,"lang.nativeName":`한국어`,"provider.name.commandCodeAuth":`Command Code - Auth`,"provider.name.commandCodeApi":`Command Code - API`,"provider.name.volcengine":`Volcengine Ark`,"provider.name.volcengineCodingPlan":`Volcengine Ark 코딩 플랜`,"provider.name.volcengineAgentPlan":`Volcengine Ark 에이전트 플랜`,"errorBoundary.title":`페이지를 불러오지 못했습니다`,"errorBoundary.message":`이 섹션을 렌더링하는 중 오류가 발생했습니다. 다시 불러와 재시도하세요.`,"errorBoundary.details":`오류`,"errorBoundary.reload":`다시 불러오기`,"startup.title":`시작 안전성`,"startup.subtitle":`재부팅 후 로컬 프록시 라우팅이 재연결 반복으로 이어지기 전에 Codex가 opencodex에 연결될 수 있는지 확인합니다.`,"startup.refresh":`새로고침`,"startup.backToDashboard":`대시보드로 돌아가기`,"startup.loading":`시작 보호 상태 확인 중…`,"startup.error":`시작 보호 상태를 읽지 못했습니다.`,"startup.staleData":`최신 시작 상태 확인에 실패했습니다. 아래 값은 이전 결과이며 보호 증거로 사용하면 안 됩니다.`,"startup.status.native":`네이티브 라우팅`,"startup.status.protected":`재부팅 보호됨`,"startup.status.atRisk":`조치 필요`,"startup.summary.native":`Codex가 로컬 프록시에 의존하지 않습니다`,"startup.summary.protected":`재부팅 후에도 opencodex가 자동으로 준비됩니다`,"startup.summary.atRisk":`재부팅 후 Codex 모델 연결이 끊길 수 있습니다`,"startup.riskDetail":`Codex는 로컬 프록시를 바라보지만 이를 다시 시작할 영구 서비스나 정상 launcher shim이 없습니다.`,"startup.riskDetailCustomLocal":`Codex가 사용자 지정 로컬 게이트웨이를 바라봅니다. opencodex는 해당 게이트웨이의 재시작 수명주기를 관리하거나 검증할 수 없습니다.`,"startup.riskDetailWindowsShim":`Launcher shim은 지원되는 CLI 스크립트만 보호하며 Windows의 Codex Desktop과 직접 codex.exe 실행은 이를 우회할 수 있습니다.`,"startup.safeDetail":`현재 라우팅과 시작 방식이 일치합니다. 재부팅 후 ocx start를 수동으로 실행할 필요가 없습니다.`,"startup.routing":`Codex 라우팅`,"startup.routing.proxy":`로컬 프록시`,"startup.routing.native":`OpenAI 네이티브`,"startup.routing.customLocal":`사용자 지정 로컬 게이트웨이`,"startup.routing.customRemote":`사용자 지정 원격 게이트웨이`,"startup.routing.unknown":`알 수 없거나 잘못된 라우팅`,"startup.restartProtection":`재부팅 보호`,"startup.preference":`필요 시 자동 시작`,"startup.enabled":`켜짐`,"startup.disabled":`꺼짐`,"startup.protection.service":`백그라운드 서비스`,"startup.protection.shim":`Launcher shim`,"startup.protection.none":`설치되지 않음`,"startup.details":`보호 상태 상세`,"startup.service":`백그라운드 서비스`,"startup.serviceHint":`로그인할 때 시작하고 프록시가 중단되면 다시 실행합니다.`,"startup.installed":`설치됨`,"startup.notInstalled":`설치되지 않음`,"startup.unsupported":`지원되지 않음`,"startup.shim":`Codex launcher shim`,"startup.shimHint":`지원되는 Codex 스크립트 런처가 시작될 때 ocx ensure를 실행합니다.`,"startup.healthy":`정상`,"startup.cliOnly":`CLI 전용`,"startup.stale":`업데이트 필요`,"startup.viable":`사용 가능`,"startup.unhealthy":`설치됐지만 비정상`,"startup.conflict":`서비스 충돌`,"startup.installedDisabled":`설치됐지만 꺼짐`,"startup.install":`설치하기`,"startup.installing":`설치 중…`,"startup.repair":`복구`,"startup.repairing":`복구 중…`,"startup.serviceInstalled":`백그라운드 서비스를 설치했습니다.`,"startup.serviceRepaired":`백그라운드 서비스를 복구했습니다.`,"startup.shimInstalled":`Codex launcher shim을 설치했습니다.`,"startup.shimRepaired":`Codex launcher shim을 복구했습니다.`,"startup.installFailed":`설치하지 못했습니다:`,"startup.tray.title":`Windows 시스템 트레이`,"startup.tray.hint":`로그인할 때 트레이 아이콘을 띄우고 프록시 시작·중지·재시작·대시보드·상태를 클릭으로 제어합니다.`,"startup.tray.login":`Windows 로그인 시 트레이 시작`,"startup.tray.notProtection":`트레이는 제어 화면이며 재부팅 보호 서비스가 아닙니다. 무인 복구에는 정상 백그라운드 서비스가 별도로 필요합니다.`,"startup.tray.running":`실행 중`,"startup.tray.stopped":`설치됨, 숨김`,"startup.tray.stale":`복구 필요`,"startup.tray.notInstalled":`설치되지 않음`,"startup.tray.loading":`확인 중…`,"startup.tray.unavailable":`상태 확인 불가`,"startup.tray.install":`트레이 설치 및 표시`,"startup.tray.start":`트레이 아이콘 표시`,"startup.tray.stop":`트레이 아이콘 종료`,"startup.tray.uninstall":`로그인 트레이 제거`,"startup.tray.error":`Windows 트레이 작업에 실패했습니다. ocx tray status에서 상세 내용을 확인하세요.`,"startup.recovery":`복구 방법`,"startup.recoveryHint":`위의 원클릭 설치를 사용하거나 수동 복구 명령을 복사할 수 있습니다. Codex Desktop과 Windows 실행 파일에는 백그라운드 서비스를 권장합니다.`,"startup.command.service":`권장: 영구 백그라운드 서비스`,"startup.command.shim":`대안: CLI launcher shim`,"startup.command.native":`안전 전환: Codex 네이티브 라우팅 복구`,"startup.copy":`복사`,"startup.copied":`복사됨`,"startup.recommended":`권장 복구 명령: {cmd}`,"startup.navRisk":`시작 보호 상태에 조치가 필요합니다`,"startup.codexRuntime.clampHidden":`OpenCodex가 Codex {version}을(를) 사용해 일부 reasoning effort 옵션이 숨겨졌습니다.`,"startup.codexRuntime.clampHiddenWithEfforts":`OpenCodex가 Codex {version}을(를) 사용해 일부 reasoning effort 옵션이 숨겨졌습니다(제거됨: {efforts}).`,"startup.codexRuntime.olderBinary":`OpenCodex가 더 오래된 Codex 바이너리({version})를 사용 중입니다. 더 새 설치를 사용할 수 있습니다.`,"dash.subtitle":`로컬 opencodex 프록시와 프로바이더, 그리고 Codex로 라우팅되는 모델의 실시간 상태입니다.`,"dash.workspace.overview":`개요`,"dash.workspace.sections":`섹션`,"dash.status":`상태`,"dash.online":`온라인`,"dash.offline":`오프라인`,"dash.version":`버전`,"dash.uptime":`가동 시간`,"dash.providers":`프로바이더`,"dash.tokens30d":`토큰 (30일)`,"dash.activity.title":`30일 활동`,"dash.activity.requests":`요청`,"dash.activity.tokens":`토큰`,"dash.activity.chartLabel":`30일 활동입니다. 왼쪽과 오른쪽 화살표로 날짜를 선택하고 Home과 End로 범위 끝으로 이동합니다.`,"dash.activity.viewUsage":`사용량 보기`,"dash.coverage":`커버리지 {pct}`,"dash.mem.title":`메모리 관찰`,"dash.mem.hint":`읽기 전용 런타임 진단. 관측 메모리는 max(RSS, external, ArrayBuffers)라 Windows working set trimming이 커밋된 보존 메모리를 숨기지 못합니다.`,"dash.mem.rss":`상주 메모리 (RSS)`,"dash.mem.jsHeap":`JS 힙 사용량`,"dash.mem.jsHeapArena":`아레나 {total}`,"dash.mem.pressure":`경고 임계값 대비`,"dash.mem.pressureOf":`임계값의 {pct}%`,"dash.mem.pressureUnknown":`임계값 정보 없음`,"dash.mem.jscHeap":`JSC 힙`,"dash.mem.external":`External`,"dash.mem.arrayBuffers":`ArrayBuffers`,"dash.mem.observed":`관측값`,"dash.mem.runtime":`런타임 카운터`,"dash.mem.growth":`시간당 관측 변화`,"dash.mem.perHour":`/시간`,"dash.mem.store":`연속 응답 저장소`,"dash.mem.storeHint":`프록시 previous_response_id 캐시. 힙이 증가하는 가운데 총 바이트가 늘면 런타임 할당기보다 대화 보존을 가리킵니다.`,"dash.mem.storeEntries":`항목`,"dash.mem.storeTotal":`합계`,"dash.mem.storeLargest":`최대`,"dash.mem.storeOldest":`가장 오래됨`,"dash.mem.threshold":`경고 임계값`,"dash.mem.lastWarn":`마지막 경고`,"dash.mem.never":`없음`,"dash.mem.details":`상세 정보`,"dash.mem.unavailable":`메모리 진단을 사용할 수 없음 (구버전 프록시).`,"dash.mem.inFlight":`진행 중 요청`,"dash.mem.restart":`작업 완료 후 재시작`,"dash.mem.restartConfirm":`진행 중 요청 {count}개가 끝날 때까지 기다린 뒤 재시작합니다(최대 {seconds}초; 시간이 지나면 남은 요청은 중단됩니다).`,"dash.mem.draining":`요청 {count}개 완료 대기 중… 끝나면 재시작`,"dash.mem.reconnecting":`프록시 재시작 중… 다시 연결하는 중`,"dash.connectionReconnecting":`연결이 중단되었습니다 — 다시 연결하는 중…`,"dash.mem.restartFailed":`작업 완료 후 재시작에 실패했습니다. 프록시가 실행 중인지 확인하세요.`,"dash.mem.restartNoSupervisor":`재시작 보호가 없습니다. 재시작 후 프록시가 자동으로 올라오지 않을 수 있습니다.`,"dash.activeProviders":`활성 프로바이더`,"dash.noProviders":`설정된 프로바이더가 없습니다. {cmd} 를 실행하세요.`,"dash.col.name":`이름`,"dash.col.adapter":`어댑터`,"dash.col.baseUrl":`Base URL`,"dash.col.model":`모델`,"dash.modelsNoResults":`검색과 일치하는 모델이 없습니다.`,"dash.availableModels":`사용 가능한 모델`,"dash.noModels":`모델을 찾을 수 없습니다. 프로바이더 API 키를 확인하세요.`,"dash.cannotConnect":`프록시에 연결할 수 없습니다. 실행 중인가요?`,"dash.runStart":`{cmd} 를 실행해 프록시를 시작하세요.`,"dash.stop":`프록시 중지`,"dash.stopConfirm":`프록시를 중지하고 Codex 원본 설정을 복원할까요?`,"dash.stopFailed":`프록시를 중지하지 못했습니다 (HTTP {status}).`,"dash.maSwitchFailed":`모드 전환에 실패했습니다 (HTTP {status}).`,"dash.maNetworkError":`네트워크 오류 — 프록시가 실행 중인지 확인하세요.`,"dash.stopping":`중지 중…`,"dash.actions":`프록시`,"dash.codexRestart":`Codex 모델 목록 새로고침`,"dash.codexRestarting":`종료하는 중…`,"dash.codexRestartConfirm":`Codex app-server를 종료해 모델 목록을 다시 읽게 할까요? 진행 중인 Codex 작업이 끊기고, Codex가 저절로 다시 뜨지는 않으니 끝나면 직접 열어야 합니다.`,"dash.codexRestartDone":`Codex app-server {count}개를 종료했습니다. Codex를 다시 열면 최신 모델 목록이 보입니다.`,"dash.codexRestartNothing":`실행 중인 Codex app-server가 없습니다. 다음 실행 때 최신 목록을 읽습니다.`,"dash.codexRestartUnknown":`프로세스 목록을 읽지 못해 아무것도 종료하지 않았습니다.`,"dash.codexRestartPartial":`app-server {count}개가 종료되지 않았습니다. 모델 목록이 최신 상태로 바뀌지 않으면 직접 종료하세요.`,"dash.codexRestartFailed":`Codex 모델 목록을 새로고침하지 못했습니다 (HTTP {status}).`,"dash.codexRestartUnreachable":`프록시에 연결하지 못했습니다.`,"dash.codexRestartMalformed":`프록시가 예상과 다른 응답을 보냈습니다.`,"dash.codexRestartTimeout":`프록시가 제때 응답하지 않았습니다. app-server를 계속 종료하는 중일 수 있습니다.`,"models.staleBanner":`Codex가 이 카탈로그보다 오래된 모델 목록을 보여주고 있습니다. Codex를 재시작하면 새로 읽습니다.`,"dash.codexAutoStart":`Codex 실행 시 opencodex 시작`,"dash.codexAutoStartHint":`설치된 launcher shim이 ocx ensure를 실행하도록 허용합니다. 이 설정은 재부팅 보호를 설치하지 않으므로 시작 안전성에서 실제 상태를 확인하세요.`,"dash.searchModel":`서치 사이드카 모델`,"dash.searchModelHint":`비-OpenAI 라우팅 모델의 web_search에 사용되는 모델입니다. ChatGPT 로그인 필요.`,"dash.searchReasoning":`서치 추론 강도`,"dash.visionModel":`비전 사이드카 모델`,"dash.visionModelHint":`텍스트 전용 라우팅 모델에 이미지를 설명하는 데 사용되는 모델입니다. ChatGPT 로그인 필요.`,"dash.webSearchSidecar":`웹 검색 사이드카`,"dash.webSearchSidecarHint":`라우팅 모델의 웹 검색에 쓸 백엔드와 모델을 고릅니다.`,"dash.webSearchStream":`응답 실시간 스트리밍`,"dash.webSearchStreamHint":`모델이 도구 호출을 결정할 때까지 앞부분 텍스트와 추론을 실시간 스트리밍합니다. 이후는 검색 가로채기를 위해 버퍼링됩니다. 검색 전 텍스트가 일부 반복될 수 있습니다.`,"dash.visionSidecar":`비전 사이드카`,"dash.visionSidecarHint":`텍스트 전용 라우팅 모델이 이미지를 읽을 때 쓸 백엔드와 모델을 고릅니다.`,"dash.visionOff":`끔`,"dash.shadowCallIntercept":`쉐도우 호출 가로채기`,"dash.shadowCallInterceptHint":`Codex 앱이 제목·커밋 메시지 생성에 쓰는 백그라운드 호출({models})을 가로채 선택한 모델로 바꿉니다. effort는 low로 고정됩니다.`,"dash.shadowCallWarning":`⚠ 활성화하면 {models} 요청이 모두 선택한 모델로 대체됩니다.`,"dash.shadowCallOriginal":`원본`,"dash.shadowCallModel":`대체 모델`,"dash.shadowCallTooltip":`Codex 앱은 스레드 제목 자동 생성, 커밋 메시지 생성, 스킬 오케스트레이션 같은 내부 작업을 백그라운드로 호출합니다. 이때 쓰는 모델은 클라이언트 버전마다 달라서 opencodex는 {models}를 모두 가로챕니다. 이 설정을 켜면 해당 호출이 선택한 모델로 넘어갑니다.`,"models.shadowCallIntercept":`쉐도우 호출 가로채기`,"models.shadowCallInterceptHint":`Codex 앱의 백그라운드 호출({models}, 제목·커밋 메시지)을 가로채 선택한 모델로 바꿉니다.`,"dash.sidecarBackend":`백엔드`,"dash.sidecarModel":`모델`,"dash.backendAuto":`자동`,"dash.backendOpenAI":`OpenAI`,"dash.backendAnthropic":`Anthropic`,"dash.sidecarSaved":`사이드카 설정이 저장됐습니다. 다음 요청부터 적용됩니다.`,"dash.sidecarSaveFailed":`사이드카 설정 저장에 실패했습니다.`,"dash.injectionLabel":`서브에이전트 위임`,"dash.injectionHint":`Codex가 서브에이전트에게 일을 넘길 때 쓸 모델을 고릅니다. 이 선택을 어디에 적용할지는 아래 두 스위치가 정합니다.`,"dash.injectionManage":`설정 열기`,"dash.syncCodexSubagentDefaults":`Codex 설정에도 기본값으로 저장`,"dash.syncCodexSubagentDefaultsHint":`켜면 위에서 고른 모델이 Codex 설정 파일에 저장돼, 새로 시작하는 작업도 처음부터 그 모델을 씁니다. 끄면 여기서만 기억합니다. 반영은 다음 동기화나 재시작 때이고, 직접 적어둔 [agents] 설정은 그대로 둡니다.`,"dash.multiAgentGuidance":`일 나누는 방법 알려주기`,"dash.multiAgentGuidanceHint":`Codex에게 "일을 이렇게 나눠 맡기면 된다"는 짧은 쪽지를 붙여 보냅니다. v2에서는 쓸 수 있는 모델 목록과 우선 모델을 알려주고, v1에서는 추론 강도가 max나 ultra일 때만 동작합니다. 끄면 아무 쪽지도 붙지 않습니다.`,"dash.injectionNone":`없음`,"dash.injectionEffortLabel":`추론 강도`,"dash.injectionEffortNone":`모델 기본값`,"dash.effortCapLabel":`V2 ultra 추론 강도 제한`,"dash.subagentEffortCapLabel":`V2 서브에이전트 추론 강도 제한`,"dash.effortCapHelp":`V2 ultra 모드 턴의 추론 강도를 제한합니다. 설정하면 ultra 모드에서 들어오는 max 요청이 선택한 수준으로 내려갑니다. 서브에이전트 제한은 스폰된 자식 에이전트에만 적용됩니다. 강도를 낮추기만 하고 올리지는 않습니다. 모델이 해당 수준을 지원하지 않으면 가장 가까운 지원 수준으로 내려갑니다.`,"dash.effortCapNone":`상한 없음`,"dash.maintenance":`유지보수`,"dash.maintenanceHint":`Codex 모델 카탈로그를 새로고침하거나 최신 opencodex 릴리스를 설치합니다.`,"dash.syncModels":`모델 동기화`,"dash.syncModelsHint":`연결해둔 프로바이더를 기준으로 Codex 모델 카탈로그를 다시 씁니다.`,"dash.syncRun":`지금 동기화`,"dash.syncing":`동기화 중…`,"dash.syncOk":`동기화 완료. {count}개 모델이 추가됐습니다.`,"dash.syncStaleHint":`Codex에 여전히 예전 목록이 보이면 오래 실행 중인 app-server를 재시작하세요 ({cmd}).`,"dash.syncFailed":`동기화 실패: {error}`,"dash.projectConfigTitle":`프로젝트 Codex 설정이 OpenCodex를 우회합니다`,"dash.projectConfigHint":`저장소 로컬 설정이 OpenCodex 프록시를 덮어씁니다(예: OpenCode Go로 직접 라우팅). 해당 프로젝트에서 ~/.codex/config.toml 프록시를 쓰려면 제거하세요.`,"dash.checkUpdate":`업데이트 확인`,"dash.updateTitle":`opencodex 업데이트`,"dash.updateDesc":`선택한 채널의 npm 최신 버전을 확인한 뒤, 설치 후 프록시를 재시작할지 선택합니다.`,"dash.updateChannel":`채널`,"dash.updateChecking":`업데이트 확인 중…`,"dash.updateInstalled":`설치됨`,"dash.updateLatest":`최신`,"dash.updateAvailable":`업데이트 가능`,"dash.updateCurrent":`최신 상태`,"dash.updateCommand":`명령`,"dash.updateSource":`현재는 소스 체크아웃입니다. 표시된 명령을 터미널에서 실행해 업데이트하세요.`,"dash.updateUnavailable":`npm에서 최신 버전을 읽지 못했습니다. 잠시 후 다시 시도하세요.`,"dash.updateRetry":`재시도`,"dash.updateRecheck":`다시 확인`,"dash.updateCannotAuto":`원클릭 업데이트를 사용할 수 없습니다 ({reason}).`,"dash.updateReason.source_checkout":`소스 체크아웃`,"dash.updateReason.latest_unavailable":`npm 레지스트리에 연결할 수 없음`,"dash.updateReason.already_latest":`이미 최신 버전`,"dash.updateReason.unknown":`업데이트 불가`,"dash.updateRestart":`업데이트 후 재시작`,"dash.updateRestartHint":`권장. 프록시를 재시작하기 전까지 현재 GUI는 이전 코드로 계속 실행됩니다.`,"dash.runUpdate":`업데이트`,"dash.updateReconnecting":`재시작된 프록시를 기다리는 중…`,"dash.updateStatus.running":`opencodex 업데이트 중입니다.`,"dash.updateStatus.restarting":`업데이트 설치 완료. 프록시를 재시작하는 중입니다.`,"dash.updateStatus.succeeded":`업데이트가 완료됐습니다.`,"dash.updateVersionTransition":`{currentVersion} -> {latestVersion}.`,"dash.updateStatus.failed":`업데이트에 실패했습니다.`,"prov.subtitle":`opencodex가 Codex로 라우팅하는 업스트림 프로바이더를 설정합니다. 계정으로 로그인하거나, 프로바이더를 추가하거나, 원본 설정을 편집하세요.`,"prov.add":`프로바이더 추가`,"prov.editJson":`JSON 편집`,"prov.accountLogin":`계정 로그인`,"prov.noOauth":`사용 가능한 OAuth 프로바이더가 없습니다.`,"prov.loggedIn":`로그인됨`,"prov.notLoggedIn":`로그인 안 됨`,"prov.logout":`로그아웃`,"prov.login":`로그인`,"prov.loginWith":`{provider} 로 로그인`,"prov.waitingBrowser":`브라우저 대기 중…`,"prov.didntOpen":`안 열렸나요? 여기를 클릭하세요`,"prov.copyLink":`링크 복사`,"prov.dontOpenBrowser":`프록시가 실행 중인 컴퓨터에서 브라우저를 열지 않기`,"prov.dontOpenBrowserHint":`다른 브라우저 프로필로 로그인하거나, 대시보드를 프록시와 다른 컴퓨터에서 쓸 때 유용합니다.`,"prov.linkCopied":`복사됨`,"prov.linkCopyUnavailable":`클립보드를 사용할 수 없음`,"prov.deviceCode":`기기 인증 코드`,"prov.copyCode":`코드 복사`,"prov.codeCopied":`코드 복사됨`,"prov.editAlias":`별칭 편집`,"prov.aliasPrompt":`표시 이름 (비우면 삭제)`,"prov.aliasSaved":`별칭이 저장되었습니다`,"prov.aliasSaveFailed":`별칭을 저장하지 못했습니다`,"prov.cooldownCleared":`쿨다운이 해제되었습니다`,"prov.cooldownClearFailed":`쿨다운을 해제하지 못했습니다`,"prov.accountId":`ID`,"prov.pasteRedirect":`리다이렉트 URL 또는 코드 붙여넣기`,"prov.pasteRedirectHint":`브라우저에 localhost 오류가 표시되면, 주소창의 전체 URL을 복사해 여기에 붙여넣으세요(또는 인증 코드 붙여넣기).`,"prov.pasteSubmit":`제출`,"prov.pasteSubmitting":`제출 중…`,"prov.pasteOk":`코드를 제출했습니다 — 로그인 완료 중…`,"prov.pasteFail":`코드 제출 실패: {error}`,"prov.port":`포트`,"prov.default":`기본값`,"prov.loadingConfig":`불러오는 중…`,"prov.saved":`저장됨! 적용하려면 프록시를 재시작하세요.`,"prov.loadConfigFail":`설정을 불러오지 못했습니다`,"prov.invalidJson":`잘못된 JSON`,"prov.saveFailed":`저장 실패`,"prov.loginFailStart":`{provider} 로그인을 시작하지 못했습니다`,"prov.loginError":`{provider} 로그인 오류: {error}`,"prov.loginRequestFail":`{provider} 로그인 요청 실패`,"prov.loginCancelled":`{provider} 로그인이 취소되었습니다`,"prov.loginTimeout":`{provider} 로그인 시간 초과 — 브라우저를 닫았거나 완료되지 않았습니다. 다시 시도하세요.`,"prov.loginOk":`{provider} 에 로그인했습니다. 모델을 표시하려면 {cmd} 를 실행하세요(또는 실시간 적용됩니다).`,"prov.loginSameAccount":`같은 {provider} 계정입니다. 브라우저에서 계정을 전환한 뒤 계정 추가를 다시 시도하세요.`,"oauthTos.highTitle":`{provider}: 구독 OAuth 위험`,"oauthTos.elevatedTitle":`{provider}: 비공식 OAuth 브리지`,"oauthTos.anthropicBody":`Claude 구독 OAuth 토큰을 OpenCodex 같은 타사 프록시에서 직접 재사용하는 방식은 Anthropic이 지원하는 통합이 아니며 접근이 제한될 수 있습니다. Claude 구독을 사용하는 공식 Agent SDK 통합은 별도입니다.`,"oauthTos.highBody":`OpenCodex는 {provider}를 타사 OAuth 경로로 연결합니다. 지원되지 않는 사용 방식이면 접근이 제한되거나 정지될 수 있습니다.`,"oauthTos.elevatedBody":`OpenCodex는 {provider}를 비공식 OAuth 경로로 연결합니다. 가능하면 공식 클라이언트를 사용하세요. 비정상적이거나 자동화된 트래픽은 남용으로 간주되어 접근이 제한되거나 정지될 수 있습니다.`,"oauthTos.saferPath":`더 안전한 방법: OpenCodex에 API 키를 대신 설정하세요.`,"oauthTos.acknowledge":`위험을 이해했으며 OAuth로 계속 진행합니다.`,"oauthTos.continue":`OAuth로 계속`,"prov.logoutOk":`{provider} 에서 로그아웃했습니다.`,"prov.logoutFail":`{provider}에서 로그아웃하지 못했습니다. 계정 상태는 그대로입니다.`,"prov.removed":`"{name}" 을(를) 삭제했습니다.`,"prov.removedDefault":`"{name}"을(를) 삭제했습니다. 이제 기본 프로바이더는 "{defaultProvider}"입니다.`,"prov.removeFail":`"{name}" 삭제에 실패했습니다.`,"prov.removeLastProvider":`활성화된 다른 프로바이더가 기본이 될 수 없으면 이 프로바이더를 삭제할 수 없습니다.`,"prov.removeHasDependentCombos":`먼저 이 프로바이더를 사용하는 콤보를 삭제하거나 수정하세요: {combos}.`,"prov.setDefault":`기본으로 설정`,"prov.setDefaultSuccess":`"{name}"이(가) 기본 프로바이더로 설정되었습니다.`,"prov.setDefaultFail":`"{name}"을(를) 기본 프로바이더로 설정하지 못했습니다.`,"prov.defaultDisabled":`기본으로 설정하려면 먼저 이 프로바이더를 활성화하세요.`,"prov.updateFail":`이 프로바이더를 업데이트하지 못했습니다.`,"prov.networkError":`네트워크 오류입니다. 프록시가 실행 중인지 확인한 후 다시 시도하세요.`,"prov.added":`"{name}" 을(를) 추가했습니다. 지금 활성화됨 — Codex 모델 선택기에 표시하려면 {cmd} 를 실행하세요(또는 재시작).`,"prov.removeConfirm":`프로바이더 "{name}" 을(를) 삭제할까요? 해당 모델이 Codex 선택기에서 사라집니다.`,"prov.hasApiKey":`API 키 설정됨`,"prov.hasHeaders":`커스텀 헤더 설정됨`,"prov.accounts":`계정 ({n})`,"prov.accountsAria":`{name} 계정 목록 열기/닫기`,"prov.accountActive":`활성`,"prov.accountReauth":`재로그인`,"prov.reauthenticate":`재인증`,"prov.reauthAccountMissing":`로그인 후 선택한 계정을 찾을 수 없습니다`,"prov.reauthIdentityMismatch":`로그인한 계정이 선택한 계정과 일치하지 않습니다`,"prov.accountAdd":`계정 추가`,"prov.accountNoLabel":`계정 {id}`,"prov.accountSwitchTitle":`이 계정 사용`,"prov.accountSwitched":`{email} 계정으로 전환했습니다.`,"prov.accountSwitchFail":`계정 전환에 실패했습니다`,"prov.accountRemoved":`{email} 계정을 제거했습니다.`,"prov.accountRemoveFail":`{email} 계정을 제거하지 못했습니다. 계정은 그대로입니다.`,"prov.accountRemoveAria":`{email} 제거`,"prov.accountRemoveConfirm":`{email} 계정을 제거할까요? 이 프록시에서 로그인이 삭제됩니다.`,"prov.keyAdd":`API 키 추가`,"prov.keyAdded":`{name}에 API 키를 추가했습니다.`,"prov.keyAddFail":`API 키 추가에 실패했습니다`,"prov.keyPlaceholder":`API 키 붙여넣기`,"prov.keySwitchTitle":`이 키 사용`,"prov.keySwitched":`{key} 키로 전환했습니다.`,"prov.keySwitchFail":`키 전환에 실패했습니다`,"prov.keyRemoved":`{key} 키를 제거했습니다.`,"prov.keyRemoveAria":`{key} 키 제거`,"prov.keyRemoveConfirm":`API 키 {key}를 제거할까요? 이 프록시 설정에서 삭제됩니다.`,"prov.activeBadge":`활성`,"prov.disabledBadge":`비활성`,"prov.defaultBadge":`기본`,"prov.enable":`활성화`,"prov.disable":`비활성화`,"prov.enabled":`"{name}" 을(를) 활성화했습니다. 해당 모델을 다시 Codex에서 사용할 수 있습니다.`,"prov.disabled":`"{name}" 을(를) 비활성화했습니다. 설정은 유지되고 모델은 숨겨집니다.`,"prov.enableFail":`"{name}" 활성화에 실패했습니다.`,"prov.disableFail":`"{name}" 비활성화에 실패했습니다.`,"prov.enableAria":`{name} 프로바이더 활성화`,"prov.disableAria":`{name} 프로바이더 비활성화`,"prov.defaultCannotDisable":`기본 프로바이더는 비활성화할 수 없습니다`,"prov.openaiAccountMode":`Codex 계정 모드`,"prov.openaiModePool":`풀`,"prov.openaiModeDirect":`직접`,"prov.openaiPoolDesc":`기본값입니다. 메인 로그인과 추가 계정을 친화도, 할당량, 대기 시간, 장애 조치에 따라 순환합니다.`,"prov.openaiDirectDesc":`현재 메인 Codex 로그인만 사용합니다. 저장된 풀 계정은 읽거나 순환하지 않습니다.`,"prov.openaiModeSaved":`OpenAI 계정 모드를 {mode} 모드로 변경했습니다.`,"prov.openaiModeSaveFailed":`OpenAI 계정 모드를 변경하지 못했습니다.`,"prov.openaiApiDesc":`OpenAI API 키만 사용하며 Codex 계정 인증과 섞이지 않습니다.`,"prov.manageCodexAccounts":`Codex 계정 관리`,"prov.openaiApiMissing":`API 키 필요`,"prov.openaiApiSetup":`API 키 설정`,"models.tab.catalog":`모델`,"models.tab.combos":`콤보`,"models.tab.compatibility":`호환성`,"models.tab.routing":`라우팅 (beta)`,"models.tabsLabel":`모델 표면`,"models.subtitle.combos":`여러 모델을 하나의 id로 묶어 순서대로 응답하게 합니다. failover는 순서대로 시도하고, round-robin은 부하를 나눕니다.`,"models.subtitle.compatibility":`랩 프로젝션 증거의 읽기 전용 호환성 판정 행렬.`,"models.subtitle.routing":`정책 프로필, dry-run 평가, 그리고 근거가 남는 라우팅 분석입니다.`,"models.subtitle":`Codex가 보는 모델을 켜고 끕니다 — 네이티브 GPT passthrough와 라우팅된 모델을 프로바이더별로 묶어 보여줍니다(헤더를 클릭하면 접힘). 숨긴 모델은 카탈로그와 선택기에서 빠지지만 정확한 id로 직접 호출할 수 있습니다. 변경 사항은 다음 Codex 턴에 적용됩니다 — opencodex가 Codex의 5분 모델 캐시를 무효화하므로 재시작이 필요 없습니다.`,"models.nativeGroupLabel":`OpenAI 네이티브`,"models.nativeHint":"프로바이더에서 선택한 풀 또는 직접 계정 옵션으로 서빙되는 passthrough 모델입니다. 끄면 Codex 선택기에서 숨겨지고, 카탈로그 항목은 유지되므로 다시 켜면 그대로 복원됩니다. 여기서 모델을 추가하면 bare passthrough id가 아니라 라우팅된 `openai/<model>` selector로 등록됩니다.","models.active":`{active}/{total} 표시`,"models.workspace.providers":`프로바이더`,"models.workspace.allProviders":`모든 프로바이더`,"models.workspace.mainAria":`모델 세부정보`,"models.allOn":`모두 켜기`,"models.allOff":`모두 끄기`,"models.presetLabel":`모델`,"models.presetMode_preset":`프리셋`,"models.presetMode_all":`전체`,"models.presetMode_custom":`커스텀`,"models.presetSummary":`{total}개 중 {count}개 표시 — 코어 프리셋 v{version}`,"models.presetUpdateAvailable":`프리셋 v{version} 사용 가능`,"models.presetAppliedToast":`{provider}: 프리셋 적용 — 모델 {count}개 선택`,"models.presetClearedToast":`{provider}: 모든 모델 표시`,"models.presetEmpty":`{provider}: 프리셋과 일치하는 모델이 없어 선택을 그대로 두었습니다`,"models.presetConfirmReplace":`선택한 목록을 {count}개짜리 프리셋으로 바꿀까요?`,"models.cap350k":`350k 제한`,"models.capApplied":`컨텍스트 제한 적용됨 — 다음 Codex 턴부터 반영됩니다.`,"models.capSaveFailed":`컨텍스트 제한 저장 실패`,"models.contextCapped":`350k 제한`,"models.contextCapLabel":`안전 상한 / 폴백`,"models.v2Label":`서브에이전트`,"models.shadowCallOriginal":`⚠ {models} →`,"models.v2Mode_v1":`v1`,"models.v2Mode_default":`base`,"models.v2Mode_v2":`v2`,"models.v2ModeDesc_v1":`전 모델 → v1 서피스`,"models.v2ModeDesc_default":`업스트림 기본값 (sol/terra=v2, luna=v1)`,"models.v2ModeDesc_v2":`전 모델 → v2 서피스`,"models.keepNativeOnV1":`ChatGPT는 v1 유지`,"models.keepNativeOnV1Hint":`ChatGPT 네이티브 부모는 v2 자식 작업을 암호화해서 Grok/Claude가 읽지 못합니다. Sol/Terra가 routed 모델을 spawn해야 하면 켜 두세요. routed 부모는 v2를 유지합니다.`,"models.v2Help":`모든 모델의 멀티에이전트 서피스를 제어합니다.
26
+
27
+ v1: 단일 스레드 에이전트. 모든 모델이 v1 서피스를 사용합니다.
28
+ base: 업스트림 기본값 — sol/terra는 v2, luna는 v1, 나머지는 codex 플래그를 따릅니다.
29
+ v2: 멀티 스레드 에이전트(spawn_agent). 모든 모델이 v2 서피스를 사용합니다.
30
+
31
+ v2에서 ChatGPT는 v1 유지를 켜면 Sol/Terra가 v1에 남아 Grok이나 Claude를 spawn할 수 있습니다. ChatGPT는 v2 자식 작업을 암호화하므로 routed 모델은 읽지 못합니다. routed 부모는 v2를 유지합니다.
32
+
33
+ 새 세션부터 적용됩니다.`,"models.v2DocsLink":`v1 / v2가 뭔가요?`,"dash.multiAgent":`서브에이전트`,"models.v2Conflict":`[agents] max_threads가 남아 있어 codex가 부팅을 거부합니다 — config.toml에서 제거하세요`,"models.v2Applied":`서브에이전트 모드 변경됨 — 새 세션부터 적용 (피커 갱신은 Codex 앱 재시작)`,"models.v2ThreadsLabel":`최대 스레드`,"models.v2ThreadsDefault":`기본값 (4)`,"models.v2ThreadsApplied":`스레드 한도 변경됨 — 새 세션부터 적용`,"models.v2ThreadsInvalid":`스레드 한도는 1 이상 정수여야 합니다`,"models.v2ThreadsApply":`적용`,"models.capValue":`기본 {value}`,"models.contextSettings":`사용자 지정 창`,"models.contextSettingsTitle":`사용자 지정 창 — {provider}`,"models.contextDefault":`안전 상한 / 폴백`,"models.contextModel":`모델`,"models.contextModelOverride":`모델별 재정의`,"models.contextHint":`비워 두면 자동 검색합니다. 여기에 적은 값은 안전 상한이자 폴백입니다. 업스트림 창이 없을 때만 채우고, 더 큰 보고값만 낮춥니다. 라이브 검색 결과는 이 칸에 다시 쓰이지 않습니다.`,"models.contextAutomatic":`자동 검색`,"models.contextSaved":`컨텍스트 윈도우가 업데이트되었습니다 — 다음 Codex 턴부터 적용됩니다.`,"models.contextUnchanged":`저장할 컨텍스트 윈도우 변경이 없습니다.`,"models.contextSaveFailed":`컨텍스트 윈도우를 저장하지 못했습니다`,"models.contextInvalid":`컨텍스트 윈도우는 양의 정수여야 합니다`,"models.contextCappedValue":`{value} 제한`,"models.contextMetadataSource":`출처`,"models.contextMetadataLive":`감지됨`,"models.contextMetadataRegistry":`레지스트리`,"models.contextMetadataCursorStatic":`Cursor 정적 큐레이션`,"models.contextMetadataSnapshot":`저장됨`,"models.contextMetadataFallback":`폴백`,"models.contextMetadataDerived":`파생`,"models.contextMetadataUnknown":`알 수 없음`,"models.contextMetadataStale":`오래됨`,"models.contextTooltipDetected":`{value} · 감지됨`,"models.contextTooltipCapped":`{detected} 감지됨 · {cap}으로 제한`,"models.contextTooltipStale":`{value} · {when}`,"models.contextTooltipUnknown":`컨텍스트 윈도우를 알 수 없음`,"models.contextTooltipSource":`{value} · {source}`,"models.contextLastChecked":`마지막 확인 {when}`,"models.contextYesterday":`어제`,"models.setAll":`전체 적용`,"models.setAllHint":`라우팅된 모든 프로바이더에 {value} 기본 창을 켭니다. 중계가 context_window / context_length 를 주지 않으면 이 값이 실제 Codex 창이 됩니다. 모델 하나만 손으로 쓰려면 같은 줄의 「사용자 지정 창」을 쓰세요. 네이티브 프로바이더는 영향을 받지 않습니다.`,"models.collapseAll":`모두 접기`,"models.expandAll":`모두 펼치기`,"models.orderHint":`피커 순서: Subagents에서 지정한 순서 → 나머지 라우팅 모델(프로바이더, 모델 ID 순 알파벳 정렬) → 네이티브 모델. 노출 토글은 모델을 필터링할 뿐 이 순서를 바꾸지 않습니다.`,"models.custom":`직접 입력…`,"models.customApply":`적용`,"models.customPlaceholder":`토큰 (예: 420000)`,"models.customAdd":`커스텀 모델 추가`,"models.customAddTitle":`커스텀 모델 추가 — {provider}`,"models.customEditTitle":`커스텀 모델 편집 — {provider}`,"models.customAdded":`커스텀 모델 추가됨`,"models.customUpdated":`커스텀 모델 수정됨`,"models.customDeleted":`커스텀 모델 삭제됨`,"models.customSaveFailed":`커스텀 모델 저장 실패`,"models.customSaving":`저장 중…`,"models.customAddBtn":`추가`,"models.customEditBtn":`수정`,"models.customEditNamed":`{name} 편집`,"models.customDeleteNamed":`{name} 삭제`,"models.customDeleteConfirm":`{name} 모델을 삭제하시겠습니까?`,"models.customBadge":`커스텀`,"models.customSummary":`커스텀 {count}개`,"models.customFieldModelId":`모델 ID (엔드포인트 슬러그)`,"models.customFieldModelIdPlaceholder":`예: qwen4-max-preview`,"models.customFieldDisplayName":`표시명 (선택)`,"models.customFieldDisplayNamePlaceholder":`예: Qwen 4 Max Preview`,"models.customFieldContext":`컨텍스트 윈도우`,"models.customFieldModalities":`입력 모달리티`,"models.customFieldReasoning":`추론 노력`,"models.customFieldReasoningOverride":`추론 노력 재정의`,"models.reasoningEffort.none":`없음`,"models.reasoningEffort.minimal":`최소`,"models.reasoningEffort.low":`낮음`,"models.reasoningEffort.medium":`중간`,"models.reasoningEffort.high":`높음`,"models.reasoningEffort.xhigh":`매우 높음`,"models.reasoningEffort.max":`최대`,"models.tipProvider":`프로바이더`,"models.tipContext":`컨텍스트`,"models.tipModalities":`모달리티`,"models.tipStatus":`상태`,"models.tipActive":`활성`,"models.tipDisabled":`비활성`,"models.applied":`적용됨 — 다음 Codex 턴부터 반영됩니다.`,"models.saveFailed":`저장 실패`,"models.networkError":`네트워크 오류 — 프록시가 실행 중인가요?`,"models.loadFail":`모델을 불러오지 못했습니다 — 프록시가 실행 중인가요?`,"models.noRouted":`라우팅된 모델 없음`,"models.noRoutedHint":`먼저 프로바이더에 로그인하거나 추가하세요.`,"models.emptyDiscovery":`발견된 모델이 없습니다. 프로바이더 엔드포인트를 확인하거나 정적/사용자 모델을 추가하세요.`,"models.emptyDiscoveryDisabled":`실시간 모델 검색이 꺼져 있고 정적 모델도 설정되지 않았습니다.`,"models.discoveryFailedBadge":`검색 실패`,"models.discoveryFailedHttp":`모델 검색에 실패했습니다(HTTP {status}).`,"models.discoveryFailedBlocked":`대상 정책 때문에 모델 검색이 차단되었습니다.`,"models.discoveryFailedInvalidResponse":`모델 검색이 잘못된 응답을 받았습니다.`,"models.discoveryFailedNetwork":`네트워크 오류로 모델 검색에 실패했습니다.`,"models.discoveryFailedProvider":`프로바이더가 모델 검색 오류를 보고했습니다.`,"models.discoveryFailedGeneric":`모델 검색에 실패했습니다.`,"models.openProviderSettings":`프로바이더 설정 열기`,"models.loading":`불러오는 중…`,"models.search":`모델 검색…`,"models.showMore":`{n}개 더 보기`,"models.allowlistLabel":`선택만 노출`,"models.allowlistHint":`체크한 모델만 카탈로그에 노출돼요 (비우면 전체). 수천 개 모델을 노출하는 프로바이더에 유용해요.`,"models.selectedCount":`{n}개 선택`,"sub.subtitle":`Codex의 {cmd} 는 우선순위 상위 5개 모델만 오버라이드로 노출합니다. 여기서 최대 5개를 선택하면 — 네이티브 gpt 또는 라우팅된 모델 — opencodex가 카탈로그 우선순위를 설정해 정확히 이들이 앞에 옵니다. 다른 모델도 정확한 이름으로 호출할 수 있으며, 이 설정은 표시 항목만 제어합니다.`,"sub.featured":`추천`,"sub.orderHint":`여기서 선택해 표시된 순서가 Codex 모델 피커 최상단 1~5위와 {cmd}의 기본 모델 후보를 결정합니다.`,"sub.noneSelected":`선택된 항목 없음 — 아래 목록에서 선택하세요.`,"sub.models":`모델`,"sub.search":`모델 검색(네이티브 gpt + 라우팅)…`,"sub.settings":`설정`,"sub.sections":`서브에이전트 구역`,"sub.delegation.model":`먼저 부를 모델`,"sub.delegation.modelHint":`Codex가 일을 나눠 맡길 때 가장 먼저 부를 모델입니다. 위 추천 목록이 부를 수 있는 후보라면, 여기서 고른 모델이 그중 1순위가 됩니다.`,"sub.noModels":`모델 없음 — 먼저 프로바이더에 로그인하거나 추가하세요.`,"sub.saved":`{n}개 모델을 저장했습니다. spawn_agent 오버라이드로 보려면 새 Codex 세션을 시작하거나 {cmd} 를 실행하세요.`,"sub.saveFailed":`저장 실패`,"sub.networkError":`네트워크 오류 — 프록시가 실행 중인가요?`,"sub.loadFail":`모델을 불러오지 못했습니다 — 프록시가 실행 중인가요?`,"sub.loading":`불러오는 중…`,"sub.moveUp":`{m} 위로 이동`,"sub.moveDown":`{m} 아래로 이동`,"sub.removeAria":`{m} 삭제`,"sub.workspace.addToFeatured":`{m}을(를) 추천에 추가`,"sub.workspace.allModels":`모든 모델`,"sub.workspace.featuredFull":`추천 목록이 가득 찼습니다 (최대 5개)`,"sub.workspace.mainAria":`서브에이전트 모델 세부 정보`,"sub.workspace.notFeatured":`추천되지 않음`,"sub.workspace.priority":`우선순위`,"sub.workspace.removeFromFeatured":`{m}을(를) 추천에서 제거`,"sub.workspace.selectModel":`모델 선택`,"sub.workspace.selectModelDesc":`목록에서 모델을 선택하여 세부 정보를 확인하고 spawn_agent에 추천하세요.`,"sub.workspace.selector":`공개 셀렉터`,"sub.ultraMode":`울트라 모드`,"sub.ultraModeHint":`모든 모델과 reasoning effort에서 Proactive 멀티에이전트 위임 정책을 켭니다 (reasoning effort 자체는 변경하지 않음). config.toml에 features.multi_agent_v2.multi_agent_mode_hint_text를 기록합니다.`,"sub.ultraModeV2Required":`v2 멀티에이전트 서피스가 필요합니다 — 먼저 multi_agent_v2를 켜고 서브에이전트 모드에서 v2를 선택하세요.`,"sub.ultraModeText":`울트라 모드 위임 텍스트`,"sub.ultraModePreset":`프리셋 복원`,"sub.ultraModeLoadFail":`울트라 모드 설정을 불러오지 못했습니다 — 프록시가 실행 중인가요?`,"sub.ultraModeSaveFail":`울트라 모드 설정 저장에 실패했습니다`,"sub.ultraModeSaved":`울트라 모드가 저장되었습니다. 새 Codex 세션부터 적용됩니다.`,"sub.nativeParentOverride":`네이티브 V2 부모 라우팅`,"sub.nativeParentOverrideHint":`Codex에는 원래 네이티브 모델이 표시될 수 있지만 OpenCodex는 선택한 라우팅 대상으로 루트를 실행합니다.`,"sub.nativeParentOverridePrivacyWarning":`프롬프트, 저장소 컨텍스트, 대화 기록, 도구 결과가 선택한 제공업체로 전송되며 해당 제공업체의 가용성, 컨텍스트, 지연 시간, 동작, 비용 및 개인정보 보호 특성을 따릅니다.`,"sub.nativeParentOverrideModel":`네이티브 부모 대상 모델`,"sub.nativeParentOverrideV2Required":`명시적 V2, 업스트림 V2 플래그, 그리고 ‘ChatGPT를 v1에 유지’ 끄기가 필요합니다.`,"sub.nativeParentOverrideSaveFail":`네이티브 부모 라우팅을 저장하지 못했습니다`,"sub.nativeParentOverrideSaved":`네이티브 부모 라우팅이 저장되었습니다. 이후 부모 턴과 컴팩션에 적용됩니다.`,"sub.agentTaskRecovery":`암호화된 V2 작업 복구`,"sub.agentTaskRecoveryHint":`ChatGPT를 통해 OpenAI Fernet 암호화된 작업 메시지를 복호화하여 OpenAI 외 하위 에이전트도 라우팅된 V2 작업을 읽고 실행할 수 있도록 합니다.`,"sub.agentTaskRecoveryModel":`복구 모델 (기본값: gpt-5.6-luna)`,"sub.agentTaskRecoverySaveFail":`암호화된 작업 복구 설정 저장 실패`,"sub.agentTaskRecoverySaved":`암호화된 작업 복구 설정이 저장되었습니다.`,"sub.roles":`역할`,"sub.roles.hint":`부모가 spawn할 수 있는 이름 있는 전문가입니다. 각 역할은 모델과 자식 프롬프트를 고정합니다. 위임 여부는 부모가 결정합니다.`,"sub.roles.add":`역할 추가`,"sub.roles.empty":`아직 역할이 없습니다. 리뷰, 검색 등 위임할 작업용 전문가를 추가하세요.`,"sub.roles.full":`역할 카탈로그가 가득 찼습니다(최대 8)`,"sub.roles.id":`역할 이름`,"sub.roles.description":`사용할 때`,"sub.roles.descriptionHint":`부모가 이 전문가를 언제 spawn할지 알 수 있도록 표시됩니다.`,"sub.roles.model":`모델`,"sub.roles.effort":`에포트`,"sub.roles.effortNone":`모델 기본값`,"sub.roles.instructions":`자식 지시`,"sub.roles.instructionsHint":`자식 에이전트가 불러오는 개발자 프롬프트입니다.`,"sub.roles.enabled":`사용`,"sub.roles.delete":`역할 {id} 삭제`,"sub.roles.save":`역할 저장`,"sub.roles.saved":`역할이 저장되었습니다. 새 Codex 세션부터 적용됩니다.`,"sub.roles.saveFailed":`역할을 저장하지 못했습니다`,"sub.roles.loadFail":`역할을 불러오지 못했습니다 — 프록시가 실행 중인가요?`,"sub.roles.routedV2Warning":`이 역할은 ChatGPT를 v1에 유지하지 않은 v2 표면의 라우팅된 모델을 사용합니다. 네이티브 v2 부모는 자식 작업을 암호화합니다.`,"sub.roles.sync":`Codex 에이전트 파일로 동기화`,"sub.roles.syncHint":`사용 중인 역할을 마커 소유 ocx-*.toml에 씁니다. 끄면 OpenCodex 소유 파일만 정리하고 사용자 파일은 건드리지 않습니다.`,"sub.injectionPrompt":`사용자 지정 부모 안내`,"sub.injectionPromptHint":`내장 v2 spawn 안내를 바꿉니다. 비우면 기본 문장입니다. 실시간 값이 필요하면 플레이스홀더를 넣으세요:`,"sub.injectionPromptSave":`부모 안내 저장`,"sub.injectionPromptSaved":`부모 안내가 저장되었습니다. 새 Codex 세션부터 적용됩니다.`,"sub.injectionPromptSaveFailed":`부모 안내를 저장하지 못했습니다`,"sub.childInstructions":`전역 자식 지시`,"sub.childInstructionsHint":`spawn된 모든 자식에 적용됩니다. 역할 지시는 동기화 후 해당 전문가에만 적용됩니다.`,"sub.childInstructionsSave":`자식 지시 저장`,"sub.childInstructionsSaved":`자식 지시가 저장되었습니다. 새 Codex 세션부터 적용됩니다.`,"sub.childInstructionsSaveFailed":`자식 지시를 저장하지 못했습니다`,"logs.title":`요청 로그`,"logs.tabLogs":`로그`,"logs.tabDebug":`디버그`,"logs.subtitle":`로컬 opencodex 프록시를 거친 최근 요청입니다. 최신순.`,"logs.autoRefresh":`자동 새로고침`,"logs.noRequests":`아직 요청이 없습니다.`,"logs.loadError":`요청 로그를 불러오지 못했습니다.`,"logs.filter.surface.label":`표면`,"logs.filter.surface.all":`전체`,"logs.filter.surface.claude":`Claude`,"logs.filter.surface.codex":`Codex`,"logs.filter.surface.grok":`Grok`,"logs.filter.interceptedHelpersOnly":`가로챈 헬퍼만`,"logs.filter.model.label":`모델`,"logs.filter.model.all":`모든 모델`,"logs.filter.provider.label":`제공자`,"logs.filter.provider.all":`모든 제공자`,"logs.filter.status.label":`상태`,"logs.filter.status.all":`모든 상태`,"logs.filter.status.success":`성공 (2xx)`,"logs.filter.status.errors":`오류 (4xx/5xx)`,"logs.filter.time.label":`시간`,"logs.filter.time.all":`전체 시간`,"logs.filter.time.15m":`최근 15분`,"logs.filter.time.1h":`최근 1시간`,"logs.filter.time.24h":`최근 24시간`,"logs.filter.speed.label":`속도`,"logs.filter.speed.all":`모든 속도`,"logs.filter.speed.slow":`< 15 tok/s`,"logs.filter.speed.medium":`15–50 tok/s`,"logs.filter.speed.fast":`> 50 tok/s`,"logs.filter.reset":`필터 초기화`,"logs.filter.showingCount":`{total}개 중 {count}개 표시`,"logs.badge.interceptedHelper":`I · {model}`,"logs.badge.interceptedHelperTitle":`가로챈 헬퍼 요청`,"logs.filter.conversation.label":`대화`,"logs.filter.conversation.placeholder":`대화 ID 붙여넣기`,"logs.filter.conversation.clear":`지우기`,"logs.filter.conversation.apply":`로그 필터`,"logs.conversation.totals":`{requests}건 요청 · {tokens} 토큰 · {cost}`,"logs.conversation.scope":`합계는 현재 로드된 Logs 링만 포함합니다.`,"logs.conversation.excluded":`(~$에서 가격 없음 {unpriced}건, 미측정 {unmetered}건 제외)`,"logs.cost.approximate":`약 {amount}`,"logs.cost.lowerBound":`최소 {amount}`,"logs.cost.unavailable":`사용 불가`,"logs.detail.conversation":`대화`,"logs.badge.claude":`Claude`,"logs.badge.grok":`Grok`,"logs.col.time":`시간`,"logs.col.request":`요청`,"logs.col.model":`모델`,"logs.col.effort":`추론 강도`,"logs.col.provider":`프로바이더`,"logs.col.status":`상태`,"logs.col.tokens":`토큰`,"logs.col.tokPerSec":`tok/s`,"logs.col.estimatedCost":`~$`,"logs.metric.tokPerSecTitle":`전체 요청 시간 기준 초당 출력 토큰`,"logs.metric.estimatedCostTitle":`API 정가 환산치이며 실제 청구액이 아닙니다. 가격 미매칭은 표시하지 않습니다.`,"usage.cost.total":`API 정가 환산치 (이 기간)`,"usage.cost.disclaimer":`결제 영수증이 아닙니다. 구독 사용량 또는 프로바이더 크레딧이 대신 적용될 수 있습니다.`,"usage.cost.unpricedNote":`비용 산정 불가 {count}건 제외`,"logs.detail.section.basic":`기본 정보`,"logs.detail.route.section":`라우팅 결정`,"logs.detail.route.kind":`라우팅 종류`,"logs.detail.route.profile":`프로필`,"logs.detail.route.selected":`선택됨`,"logs.detail.route.candidates":`후보`,"logs.detail.route.unknown":`이 요청에 대한 라우팅 추적이 기록되지 않았습니다(추적 이전 행).`,"logs.detail.section.performance":`성능`,"logs.detail.section.cost":`API 정가 환산치`,"logs.detail.section.attempts":`Combo 시도`,"logs.detail.section.usage":`원본 usage`,"logs.detail.ttft":`TTFT`,"logs.detail.costTotal":`정가 환산치`,"logs.detail.totalTokens":`전체 토큰`,"logs.detail.matchedKey":`매칭된 가격 키`,"logs.detail.priceSource":`가격 출처`,"logs.detail.unavailableReason":`표시 불가 사유`,"logs.detail.copyRequestId":`요청 ID 복사`,"logs.detail.copied":`복사됨`,"logs.detail.source.jawcode":`jawcode 카탈로그`,"logs.detail.source.expected":`expected 가격 오버레이`,"logs.detail.source.user":`프로바이더 구성 가격 오버레이`,"logs.detail.verification.verified":`검증됨`,"logs.detail.verification.derived":`기반 모델 유도`,"logs.detail.attempt.target":`프로바이더 / 모델`,"logs.detail.attempt.reason":`결과 / 사유`,"logs.detail.attempt.completed":`완료`,"logs.detail.attempt.e2eNote":`상위 tok/s는 전체 요청 기준이며 각 시도는 자체 소요 시간을 사용합니다.`,"logs.detail.attempt.recovery.transient5xx":`일시적 5xx 오류`,"logs.detail.attempt.recovery.connectionReset":`연결이 재설정됨`,"logs.detail.attempt.recovery.oauth401":`OAuth 재인증`,"logs.detail.attempt.recovery.key429":`키 요청 한도 초과 (429)`,"logs.detail.attempt.recovery.rateLimit429":`요청 한도 초과 (429)`,"logs.detail.attempt.recovery.anthropicOauth429":`Anthropic OAuth 요청 한도 초과 (429)`,"logs.detail.attempt.recovery.image413":`이미지 페이로드가 너무 큼 (413)`,"logs.detail.attempt.recovery.emptyCompletion":`빈 응답 재시도`,"logs.detail.attempt.recovery.unknown":`알 수 없는 복구 사유`,"logs.detail.reason.usage_missing":`usage가 보고되지 않았습니다.`,"logs.detail.reason.usage_unsupported":`이 프로바이더는 usage 보고를 지원하지 않습니다.`,"logs.detail.reason.output_missing":`양수 출력 토큰 수가 보고되지 않았습니다.`,"logs.detail.reason.invalid_duration":`요청 소요 시간이 유효하지 않습니다.`,"logs.detail.reason.price_unmatched":`매칭되는 가격을 찾지 못했습니다.`,"logs.detail.reason.invalid_cache_breakdown":`캐시 토큰 상세가 전체 입력 토큰과 모순됩니다.`,"logs.detail.reason.invalid_usage":`usage에 유효하지 않은 토큰 값이 있습니다.`,"logs.detail.reason.combo_attempt_unavailable":`하나 이상의 combo 시도 비용을 계산할 수 없습니다.`,"logs.detail.estimate.usage_estimated":`프로바이더 usage가 추정치입니다.`,"logs.detail.estimate.cache_detail_missing":`캐시 상세가 없어 입력 전액을 상한으로 추정했습니다.`,"logs.detail.estimate.expected_price_overlay":`검증된 expected 정가를 사용했습니다.`,"logs.detail.estimate.provider_cost_overlay":`프로바이더 구성 가격 오버레이를 사용했습니다.`,"logs.detail.estimate.priority_lower_bound":`확인된 Priority 가격을 사용할 수 없어 표시된 추정치는 알려진 하한입니다.`,"logs.col.error":`오류`,"logs.col.upstreamReason":`업스트림 원인`,"logs.col.duration":`소요 시간`,"logs.modelTooltip.model":`모델`,"logs.modelTooltip.resolvedModel":`해석된 모델`,"logs.modelTooltip.requestedTier":`요청 티어`,"logs.modelTooltip.configuredTier":`설정 티어`,"logs.modelTooltip.responseTier":`응답 티어`,"logs.modelTooltip.supportsTier":`티어 지원`,"logs.tokens.reported":`측정됨`,"logs.tokens.unreported":`미보고`,"logs.tokens.unsupported":`미지원`,"logs.tokens.estimated":`추정`,"logs.tokens.input":`입력`,"logs.tokens.output":`출력`,"logs.tokens.cacheRead":`캐시 히트 (c)`,"logs.tokens.cacheWrite":`캐시 생성 (w)`,"logs.tokens.reasoning":`추론`,"logs.tokens.noCache":`캐시 미보고`,"logs.tokens.contextTotal":`활성 컨텍스트`,"logs.tokens.noCacheNote":`이 프로바이더는 캐시 토큰 수치를 제공하지 않습니다`,"logs.tokens.noCacheCursor":`Cursor 캐시 상세 미보고`,"logs.tokens.noCacheCursorNote":`Cursor 프로토콜은 캐시 read/write 토큰 수치를 제공하지 않습니다. 캐시 미스가 확인됐다는 뜻은 아닙니다`,"logs.tokens.estimatedNote":`추정치 (프로바이더가 정확한 사용량을 제공하지 않음)`,"logs.details":`상세보기`,"logs.detailTitle":`요청 상세`,"logs.detailRaw":`원본 로그`,"debug.title":`디버그`,"debug.subtitle":`선택적 provider transport 및 usage 추출 진단. 요청 오류와 502는 로그 탭에 표시됩니다.`,"debug.debug":`Provider debug`,"debug.usage":`Usage 추출`,"debug.injection":`주입 로그`,"debug.claude":`Claude 인바운드`,"debug.claudeInbound.title":`Claude 인바운드 요청`,"debug.claudeInbound.sub":`Claude Code/Desktop이 실제로 보내는 값(thinking, effort, metadata)을 보여줍니다 — 프롬프트 원문은 저장하지 않습니다.`,"debug.claudeInbound.empty":`아직 캡처된 요청이 없습니다. 켜진 상태에서 Claude로 메시지를 보내보세요.`,"debug.claudeInbound.time":`시간`,"debug.claudeInbound.endpoint":`엔드포인트`,"debug.claudeInbound.model":`모델`,"debug.claudeInbound.none":`없음`,"debug.reset":`런타임 재정의 해제`,"debug.refresh":`새로고침`,"debug.follow":`Follow`,"debug.streamProvider":`Provider`,"debug.streamUsage":`Usage`,"debug.streamInjection":`Injection`,"debug.loading":`디버그 설정 로딩 중…`,"debug.loadFailed":`디버그 설정을 불러오지 못했습니다.`,"debug.emptyTitle":`디버그 로깅 꺼짐`,"debug.empty":`위 카드에서 Provider debug 또는 Usage extraction을 켜세요. 프록시로 요청을 보낸 뒤 라인이 표시됩니다.`,"debug.noLinesTitle":`라인 대기 중`,"debug.noLines.provider":`공급자 디버그는 켜져 있지만 전송 이상(드롭되거나 잘못된 프레임, Cursor dial/retry 이벤트)만 기록합니다. Anthropic 같은 공급자로의 정상 요청은 라인을 생성하지 않을 수 있습니다.`,"debug.noLines.usage":`사용량 추출은 켜져 있지만 아직 캡처된 항목이 없습니다. Codex로 요청을 보내면 여기에 표시됩니다.`,"debug.noLines.injection":`주입 로그는 켜져 있지만 아직 캡처된 항목이 없습니다. Collab 및 서브 에이전트 턴의 멀티 에이전트 가이던스 주입과 effort-cap 결정을 기록합니다.`,"usage.title":`사용량`,"usage.subtitle":`프록시의 로컬 토큰 집계입니다. 누락된 사용량은 0으로 표시하지 않습니다.`,"usage.loading":`사용량 데이터를 불러오는 중…`,"usage.empty":`아직 기록된 사용량이 없습니다. 프록시로 요청을 보내면 여기에 표시됩니다.`,"usage.loadError":`사용량 데이터를 불러오지 못했습니다.`,"usage.range.all":`전체`,"usage.range.available":`사용 가능한 기록`,"usage.historyTruncated":`이전 사용 기록을 불러오지 않아 합계는 사용 가능한 기록만 포함합니다.`,"usage.historyTruncatedWindow":`불러온 기록의 요청 시작 시각은 {start}부터 {end} 사이입니다. 읽기 한도 때문에 파일 앞부분의 기록이 빠졌으므로 선택한 기간이 완전하지 않을 수 있습니다.`,"usage.range.30d":`30일`,"usage.range.7d":`7일`,"usage.card.requests":`요청`,"usage.card.measured":`측정됨`,"usage.card.reported":`측정됨`,"usage.card.totalTokens":`총 토큰`,"usage.card.cachedTokens":`캐시 히트 토큰`,"usage.card.cachedTokensHint":`프로바이더 캐시에서 읽어온 프롬프트 토큰(히트)입니다. 캐시 생성(쓰기)은 아래에 별도 표시됩니다.`,"usage.card.cacheWriteTokens":`캐시 생성`,"usage.card.coverage":`커버리지`,"usage.card.activeDays":`활동일`,"usage.section.heatmap":`일별 활동`,"usage.section.overview":`개요`,"usage.section.models":`모델`,"usage.section.providers":`프로바이더`,"usage.section.coverage":`커버리지 상세`,"usage.workspace.report":`사용량 보고서`,"usage.workspace.sections":`사용량 섹션`,"usage.coverage.measured":`측정됨`,"usage.coverage.reported":`제공자 보고`,"usage.coverage.estimated":`추정`,"usage.coverage.note":`측정됨 항목은 제공자 보고와 추정 토큰 수치를 함께 포함합니다. 미보고/미지원 요청은 추적만 하고 0으로 환산하지 않습니다.`,"usage.search.models":`모델 검색…`,"usage.col.requests":`요청`,"usage.col.measured":`측정됨`,"usage.col.reported":`측정됨`,"usage.col.tokens":`토큰`,"usage.col.share":`비율`,"usage.heatmap.less":`적음`,"usage.heatmap.more":`많음`,"modal.addNamed":`추가: {label}`,"modal.add":`프로바이더 추가`,"modal.catalogTabs":`프로바이더 카테고리`,"modal.searchLabel":`프로바이더 검색`,"modal.search":`프로바이더 검색…`,"modal.logInWith":`{label} 로 로그인`,"modal.waitingBrowser":`브라우저 대기 중…`,"modal.providerName":`프로바이더 이름`,"modal.adapter":`어댑터`,"modal.baseUrl":`Base URL`,"modal.endpoint":`엔드포인트`,"modal.endpoint.tokenPlan":`토큰 플랜`,"modal.endpoint.payAsYouGo":`종량제`,"modal.endpoint.custom":`사용자 지정`,"modal.defaultModel":`기본 모델(선택)`,"modal.allowPrivateNetwork":`로컬/사설 네트워크 허용`,"modal.allowPrivateNetworkHint":`의도적으로 자체 호스팅하는 프로바이더에만 활성화하세요. 메타데이터 엔드포인트는 계속 차단됩니다.`,"modal.nameRequired":`프로바이더 이름을 입력하세요`,"modal.baseUrlRequired":`Base URL을 입력하세요`,"modal.networkError":`네트워크 오류 — 프록시가 실행 중인가요?`,"modal.loginFailStart":`로그인을 시작하지 못했습니다`,"modal.waitingLogin":`브라우저 로그인 대기 중…`,"modal.loggingIn":`로그인 중…`,"modal.loginTimeout":`로그인 시간 초과 — 다시 시도하세요.`,"nav.api":`API`,"nav.integrations":`연동`,"nav.codexAuth":`Codex 인증`,"nav.codexSet":`Codex 설정`,"codexSet.tab.multiauth":`다중 인증`,"codexSet.tab.prompt":`프롬프트`,"codexSet.prompt.title":`프롬프트 레이어`,"codexSet.prompt.timing":`새 세션부터 적용됩니다. 실행 중인 세션은 현재 설정을 유지합니다.`,"codexSet.prompt.staleRevision":`다른 곳에서 설정이 바뀌어 목록을 다시 불러왔습니다.`,"codexSet.prompt.writeFailed":`변경 내용을 저장하지 못했습니다.`,"codexSet.prompt.loadFailed":`프롬프트 레이어를 불러오지 못했습니다.`,"codexSet.prompt.repair":`복구`,"codexSet.prompt.repairFailed":`복구를 완료하지 못했습니다.`,"codexSet.drift.journalPresent":`이전 쓰기가 끝나지 않았습니다. 다음 쓰기에서 자동으로 복구됩니다.`,"codexSet.drift.projectionStale":`저장된 레이어와 config.toml의 값이 서로 다릅니다. 복구하면 레이어 기준으로 값을 다시 씁니다.`,"codexSet.drift.storeMissing":`레이어 파일이 없는데 config.toml에는 지침이 남아 있습니다. 복구하면 백업을 먼저 만들고 그 내용을 레이어 하나로 보존합니다.`,"codexSet.drift.ownedMalformed":`config.toml에 생성된 줄이 직접 수정되어 다시 쓰기가 안전하지 않습니다.`,"codexSet.custom.adoptUnsupported":`{path} {line}번째 줄의 값이 한 줄 문자열이 아니어서 가져올 수 없습니다. 여기서 관리하려면 직접 옮기세요.`,"codexSet.prompt.unreadable":`Codex 설정 파일이 있지만 읽을 수 없어 변경을 거부했습니다.`,"codexSet.layer.permissions":`권한`,"codexSet.layer.collaboration":`협업 모드`,"codexSet.layer.environment":`환경 정보`,"codexSet.layer.apps":`앱`,"codexSet.layer.skills":`스킬`,"codexSet.prompt.extensionsUnknown":`확장 프로그램은 자체 레이어를 추가할 수 있습니다. Codex가 이를 공개하지 않아 여기에 표시할 수 없습니다.`,"codexSet.group.transition":`전환 알림`,"codexSet.group.transitionDesc":`상태를 설명하는 대신 변화를 알리는 항목이라, 세션이 실시간 모드로 바뀌거나 모델이 교체될 때만 나타납니다.`,"codexSet.custom.slotNote":`커스텀 레이어는 이 순서대로 이어져 하나의 섹션이 됩니다.`,"codexSet.row.alwaysOn":`항상 켜짐`,"codexSet.row.onChange":`변경 시 전달`,"codexSet.row.featureGated":`[features]에서 설정`,"codexSet.row.openFeatures":`설정 열기`,"codexSet.dialog.setValue":`{value}(기본값 {fallback})`,"codexSet.dialog.copyKey":`키 복사`,"codexSet.dialog.unknownLayer":`이 빌드에는 이 레이어에 대한 설명이 없습니다. 대시보드보다 최신 Codex 런타임에서 온 레이어입니다.`,"codexSet.custom.heading":`커스텀 레이어`,"codexSet.custom.add":`+ 레이어 추가`,"codexSet.custom.newTitle":`새 레이어`,"codexSet.custom.editTitle":`레이어 편집`,"codexSet.custom.titleLabel":`제목`,"codexSet.custom.bodyLabel":`지침`,"codexSet.custom.bodySize":`{max}바이트 중 {bytes}바이트`,"codexSet.custom.normalized":`탭을 공백 4개로, 줄바꿈을 LF로 바꿨습니다.`,"codexSet.custom.titleRequired":`제목을 입력하세요.`,"codexSet.custom.titleTooLong":`제목이 {count}자입니다. 최대 {max}자까지 입력할 수 있습니다.`,"codexSet.custom.titleMultiline":`제목은 한 줄이어야 합니다.`,"codexSet.custom.bodyTooLarge":`이 레이어는 {bytes}바이트입니다. 제한은 {max}바이트입니다.`,"codexSet.custom.composedTooLarge":`활성 레이어를 합치면 {bytes}바이트로 제한을 초과합니다.`,"codexSet.custom.invalidCharacter":`{position} 위치의 제어 문자는 저장할 수 없습니다.`,"codexSet.custom.discardPrompt":`변경 내용을 버리시겠습니까?`,"codexSet.custom.keepEditing":`계속 편집`,"codexSet.custom.delete":`{title} 삭제`,"codexSet.custom.deleteConfirm":`이 레이어를 삭제하시겠습니까? 되돌릴 수 없습니다.`,"codexSet.custom.layerGone":`다른 곳에서 해당 레이어가 삭제되어 편집기를 닫았습니다.`,"codexSet.custom.deleteConfirmNamed":`“{title}” 레이어를 삭제하시겠습니까? 되돌릴 수 없습니다.`,"codexSet.custom.moveUp":`{title} 위로 이동`,"codexSet.custom.prevLayer":`이전 레이어`,"codexSet.custom.nextLayer":`다음 레이어`,"codexSet.custom.navPosition":`{position} / {total}`,"codexSet.custom.moveDown":`{title} 아래로 이동`,"codexSet.custom.limitReached":`커스텀 레이어는 최대 {max}개까지 보관할 수 있습니다.`,"codexSet.custom.notOwned":`developer_instructions가 opencodex 외부에서 작성되어 여기서는 편집할 수 없습니다. 레이어로 관리하려면 가져오세요.`,"codexSet.custom.adopt":`기존 지침 가져오기`,"codexSet.custom.adoptConfirm":`레이어로 가져오기`,"codexSet.custom.adoptRefused":`기존 값을 가져오지 못했습니다.`,"codexSet.custom.baseReplaced":`model_instructions_file이 {path}(으)로 설정되어 opencodex 외부에서 기본 프롬프트를 교체했습니다.`,"codexSet.lint.identity":`Codex가 설정한 것과 다른 정체성을 주장합니다.`,"codexSet.lint.foreignTool":`도구는 레지스트리에서 제공됩니다. 여기서 이름을 지정해도 도구가 생성되지 않습니다.`,"codexSet.lint.placeholder":`지침에는 템플릿 엔진이 실행되지 않으므로 이 내용이 그대로 전달됩니다.`,"codexSet.lint.applyPatch":`apply_patch는 지침이 아니라 도구 레지스트리에서 정의됩니다.`,"codexSet.lint.approvalVocab":`Codex가 자체 승인 용어를 삽입하므로 이 내용과 충돌할 수 있습니다.`,"codexSet.lint.environment":`환경 정보는 나중에 생성되므로 이 내용과 충돌할 수 있습니다.`,"codexSet.lint.size":`이 레이어는 8 KB를 초과합니다. 저장은 가능하지만 요청마다 토큰을 사용합니다.`,"codexSet.preset.blank":`빈 레이어`,"codexSet.preset.concise.name":`간결한 출력`,"codexSet.preset.concise.description":`짧게 답하고, 서론과 불필요한 서식을 생략합니다.`,"codexSet.preset.concise.provenance":`Claude Code의 간결성 지침을 바탕으로 각색했습니다. 직접 작성한 문구이며 복사본이 아닙니다.`,"codexSet.preset.planFirst.name":`편집 전 계획`,"codexSet.preset.planFirst.description":`계획을 먼저 밝힌 뒤 변경합니다.`,"codexSet.preset.planFirst.provenance":`Claude Code의 계획 중심 방식을 바탕으로 각색했습니다. 직접 작성한 문구이며 복사본이 아닙니다.`,"codexSet.preset.explainWhy.name":`이유 설명`,"codexSet.preset.explainWhy.description":`무엇을 했는지만 말하지 말고 이유도 설명합니다.`,"codexSet.preset.explainWhy.provenance":`Grok Build의 확인 방식을 바탕으로 각색했습니다. 직접 작성한 문구이며 복사본이 아닙니다.`,"codexSet.preset.testFirst.name":`테스트 우선`,"codexSet.preset.testFirst.description":`수정 전에 실패하는 테스트부터 작성합니다.`,"codexSet.preset.testFirst.provenance":`일반적인 에이전트 작업 방식을 바탕으로 각색했습니다. 직접 작성한 문구이며 복사본이 아닙니다.`,"codexSet.preset.korean.name":`한국어 답변`,"codexSet.preset.korean.description":`요청 언어와 관계없이 한국어로 답합니다.`,"codexSet.preset.korean.provenance":`자주 요청되는 항목을 바탕으로 opencodex용으로 작성했습니다. 직접 작성한 문구이며 복사본이 아닙니다.`,"codexSet.dialog.class":`종류`,"codexSet.dialog.key":`설정 키`,"codexSet.dialog.fileValue":`이 파일의 값`,"codexSet.dialog.absentDefault":`설정되지 않음(기본값: {value})`,"codexSet.dialog.noRenderedText":`Codex는 기본 제공 레이어의 조합된 텍스트를 공개하지 않습니다. 따라서 이 대화상자에는 내용 대신 레이어 설명과 키를 표시합니다.`,"codexSet.dialog.sourceText":`모델에 전달되는 원문`,"codexSet.dialog.sourceBytes":`{bytes}바이트`,"codexSet.dialog.notRendered":`확인한 턴에서는 이 레이어가 아무것도 보내지 않았습니다. 각 섹션은 내용이 바뀔 때만 다시 전송되므로, 한 번 확인한 것만으로는 빠져 보일 수 있습니다.`,"codexSet.dialog.emptySource":`{path} 파일은 있지만 비어 있어서 이 레이어는 아무것도 보내지 않습니다.`,"codexSet.dialog.notExposed":`기본 프롬프트는 Codex가 출력하는 메시지 목록 밖으로 전달되어 여기서 보여줄 수 없습니다. 대신 model_instructions_file로 교체할 수 있습니다.`,"codexSet.dialog.textUnavailable":`이 컴퓨터에서 Codex 프롬프트를 읽지 못해 원문을 표시할 수 없습니다.`,"codexSet.class.base":`기본 지침`,"codexSet.class.config-toggle":`여기서 전환 가능`,"codexSet.class.feature-gated":`기능 플래그 적용`,"codexSet.class.runtime-conditional":`런타임 조건부`,"codexSet.class.extension-unknown":`확장 레이어`,"codexSet.layer.base-instructions":`기본 지침`,"codexSet.layer.model-switch":`모델 전환 알림`,"codexSet.layer.personality":`성격`,"codexSet.layer.context-window-guidance":`컨텍스트 창 안내`,"codexSet.layer.realtime":`실시간`,"codexSet.layer.agents-md":`AGENTS.md`,"codexSet.layer.environments-instructions":`실행 환경`,"codexSet.layer.plugins":`플러그인`,"codexSet.layer.tools":`도구`,"codexSet.layer.multi-agent-mode":`멀티 에이전트 모드`,"codexSet.layer.git-attribution":`커밋 어트리뷰션`,"codexSet.about.base-instructions":`Codex 자체 지침입니다. 요청에 포함되며 끌 수 없습니다.`,"codexSet.about.model-switch":`대화 도중 세션 모델이 바뀌면 추가됩니다.`,"codexSet.about.personality":`기능 플래그로 제어되는 어조와 말투 지침입니다.`,"codexSet.about.context-window-guidance":`기능 플래그로 제어되는 남은 컨텍스트 예산 안내입니다.`,"codexSet.about.realtime":`실시간 세션에 추가됩니다.`,"codexSet.about.agents-md":`프로젝트의 AGENTS.md 파일입니다. 이 페이지는 레이어만 표시하며 프로젝트 문서를 수정하지 않습니다.`,"codexSet.about.permissions":`현재 적용 중인 샌드박스와 승인 설정을 설명합니다.`,"codexSet.about.collaboration":`활성 협업 모드를 설명합니다.`,"codexSet.about.environment":`작업 디렉터리, 플랫폼 및 기타 환경 정보입니다.`,"codexSet.about.environments-instructions":`기능 플래그로 제어되는 지연 실행 환경 지침입니다.`,"codexSet.about.apps":`연결된 앱의 사용 방법입니다.`,"codexSet.about.plugins":`플러그인을 선택했거나 플러그인이 기능을 제공하면 추가됩니다.`,"codexSet.about.tools":`기능 플래그로 제어되는 지연 로드 도구 설명입니다.`,"codexSet.about.skills":`사용 가능한 스킬 목록입니다.`,"codexSet.about.multi-agent-mode":`기능 플래그로 제어되는 서브에이전트 지침입니다.`,"codexSet.about.git-attribution":`모델이 작성한 커밋에 Co-authored-by: Codex 트레일러를, 새로 여는 풀 리퀘스트에 Generated with Codex. 한 줄을 붙이게 합니다. Codex가 계정에서 이 값을 가져오기 때문에 여기서도 [features]에서도 바꿀 수 없습니다. 계정에서 꺼두면 아무것도 보내지 않는 대신 반대 지시를 보냅니다.`,"codexSet.condition.model-switch":`세션 도중 모델이 바뀐 뒤에만 포함됩니다.`,"codexSet.condition.realtime":`실시간 세션에만 포함됩니다.`,"codexSet.condition.agents-md":`작업 디렉터리에서 프로젝트 문서를 찾으면 포함됩니다.`,"codexSet.condition.plugins":`플러그인을 선택했거나 플러그인이 기능을 제공하면 포함됩니다.`,"codexSet.condition.git-attribution":`계정의 어트리뷰션 정책이 결정합니다.`,"codexSet.base.title":`기본 프롬프트`,"codexSet.base.prev":`이전 옵션`,"codexSet.base.next":`다음 옵션`,"codexSet.base.position":`{position} / {total}`,"codexSet.base.swipeHint":`좌우로 스와이프하거나 방향키 또는 화살표 버튼으로 옵션을 넘깁니다. 새로 시작하는 세션에 적용됩니다.`,"codexSet.base.defaultTitle":`Codex 자체 기본 프롬프트`,"codexSet.base.defaultBody":`기본값은 여기에 저장되지 않으므로 편집하거나 삭제할 것이 없습니다. 선택하면 설정에서 model_instructions_file을 지우고 Codex가 기본 제공 프롬프트를 씁니다.`,"codexSet.base.variantTitle":`이름`,"codexSet.base.variantBody":`프롬프트`,"codexSet.base.replacesWarning":`Codex 자체 기본 프롬프트에 덧붙이는 게 아니라 통째로 바꿉니다. 여기에 짧게 쓰면 모델도 그만큼 짧은 지시만 받습니다.`,"codexSet.base.use":`이걸로 쓰기`,"codexSet.base.inUse":`사용 중`,"codexSet.base.externalBlocked":`model_instructions_file이 이미 {path}를 가리키고 있고, opencodex가 쓴 값이 아닙니다. 직접 지운 뒤 여기서 선택하세요.`,"nav.openMenu":`메뉴 열기`,"nav.closeMenu":`메뉴 닫기`,"integrations.subtitle":`클라이언트를 opencodex에 연결하고 자격 증명과 설정 복원을 관리합니다.`,"integrations.tabsLabel":`연동 화면`,"integrations.tab.overview":`개요`,"integrations.tab.keys":`API 키`,"integrations.tab.codex":`Codex CLI`,"integrations.tab.claude":`Claude`,"integrations.tab.grok":`Grok Build`,"integrations.tab.opencode":`OpenCode`,"integrations.tab.pi":`Pi`,"integrations.tab.omp":`OMP`,"integrations.tab.hermes":`Hermes`,"integrations.tab.openclaw":`OpenClaw`,"integrations.tab.kimi":`Kimi Code`,"integrations.tab.gajae":`Gajae Code`,"integrations.tab.dsh":`DeepSeek Harness (DSH)`,"integrations.tab.mcode":`MiniMax Code`,"integrations.tab.zcode":`ZCode`,"integrations.tab.prime":`Prime Agent`,"integrations.codex.title":`Codex CLI`,"integrations.codex.body":`Codex 연결은 프록시 서비스가 관리합니다. opencodex를 시작하면 적용되고 서비스를 중지하면 기본 라우팅으로 복원됩니다.`,"integrations.codex.openService":`서비스 제어 열기`,"integrations.state.notInstalled":`미설치`,"integrations.state.unknown":`확인 중`,"integrations.detail.codexRouted":`Codex 요청이 이 프록시를 지납니다`,"integrations.detail.codexAbsent":`Codex는 아직 이 프록시를 지나지 않습니다`,"integrations.detail.keyCount":`키 {count}개 발급됨`,"integrations.detail.keyNone":`발급된 키 없음`,"integrations.detail.keyChecking":`확인 중…`,"integrations.detail.keyUnavailable":`키 상태를 확인할 수 없음`,"integrations.detail.claudeOff":`연결이 꺼져 있습니다`,"integrations.detail.desktopCurrent":`Desktop이 이 프로필로 실행됩니다`,"integrations.detail.desktopStale":`적용 후 프로필 파일이 바뀌었습니다`,"integrations.detail.desktopNotServed":`프로필은 있지만 Desktop이 다른 것을 씁니다`,"integrations.detail.desktopAbsent":`적용된 프로필이 없습니다`,"integrations.detail.desktopDesiredOff":`Claude Desktop 통합이 꺼져 있습니다`,"integrations.detail.desktopDesiredOffCleanupPending":`Claude Desktop이 여전히 게이트웨이를 사용 중입니다. 정리 대기 중`,"integrations.detail.desktopDesiredOnNotApplied":`통합은 켜져 있지만 Desktop이 게이트웨이 프로필을 사용하지 않습니다`,"integrations.detail.desktopSelectedElsewhere":`Desktop이 다른 프로필을 사용 중입니다`,"integrations.detail.desktopProfileDrift":`선택된 Desktop 프로필이 변경되었습니다`,"integrations.detail.desktopObservedUnsafe":`선택된 Desktop 프로필은 안전하게 변경할 수 없습니다`,"integrations.detail.desktopNotInstalled":`Claude Desktop 구성 라이브러리가 설치되지 않았습니다`,"integrations.dialog.desktop.title":`Claude Desktop 통합을 끌까요?`,"integrations.dialog.desktop.changes":`{path}에 opencodex 게이트웨이 프로필이 있으면 먼저 자격 증명 없는 표준 프로필을 선택한 뒤 이전 프로필과 백업을 제거합니다.`,"integrations.dialog.desktop.breakage":`Claude Desktop은 opencodex를 통한 모델 대신 표준 Claude로 돌아갑니다.`,"integrations.dialog.desktop.undo":`다시 켜면 저장된 모델 할당으로 opencodex 프로필을 새로 만듭니다.`,"integrations.dialog.desktop.restart":`Claude Desktop은 시작할 때만 이 구성을 읽습니다. 변경하려면 완전히 종료한 뒤 다시 여세요.`,"integrations.dialog.desktop.confirm":`해제`,"integrations.native.error.desktopUnsafeMetadata":`{path}의 Claude Desktop 메타데이터를 안전하게 읽을 수 없어 라이브러리를 변경하지 않았습니다.`,"integrations.native.error.desktopCleanupIncomplete":`Claude Desktop은 표준 모드를 가리키지만 이전 opencodex 자격 증명 파일이 남아 있습니다: {paths}.`,"integrations.native.msg.desktopDisabled":`Claude Desktop 통합을 해제했습니다.`,"integrations.native.msg.desktopEnabled":`Claude Desktop 통합을 켰습니다.`,"integrations.detail.grokModels":`모델 {count}개 연결됨`,"integrations.detail.grokAbsent":`설정에 opencodex 블록이 없습니다`,"integrations.dialog.grok.title":`Grok Build 연동을 해제할까요?`,"integrations.dialog.grok.changes":`{path}에서 opencodex가 표시해 둔 블록만 제거합니다. 블록 바깥에 직접 쓴 내용은 그대로 둡니다.`,"integrations.dialog.grok.breakage":`해제하면 Grok Build에서 opencodex 모델 별칭이 사라집니다. xAI 계정으로 쓰던 모델은 그대로입니다.`,"integrations.dialog.grok.undo":`opencodex가 loopback 주소로 실행 중이면, 다시 켤 때 지금 쓸 수 있는 모델 목록으로 블록을 새로 씁니다.`,"integrations.dialog.grok.confirm":`해제`,"integrations.native.msg.nonLoopbackRemoved":`Grok Build은 opencodex가 loopback 주소로 실행 중일 때만 자동 등록할 수 있습니다. loopback 주소를 가리키던 이전 블록은 제거했습니다.`,"integrations.native.msg.nonLoopbackRemovedNoop":`Grok Build은 opencodex가 loopback 주소로 실행 중일 때만 자동 등록할 수 있습니다. 제거할 이전 블록은 없었습니다.`,"integrations.native.msg.nonLoopbackSuperseded":`Grok Build은 opencodex가 loopback 주소로 실행 중일 때만 자동 등록할 수 있습니다. 그 사이 다른 곳에서 설정에 블록이 새로 쓰여, 지금 파일에 있는 블록은 이 요청이 만든 것이 아닙니다.`,"integrations.native.error.orphanedMarker":`{path}에 opencodex 시작 표시는 있는데 끝 표시가 없습니다. 어디까지가 우리 블록인지 확신할 수 없어 파일을 건드리지 않았습니다.`,"integrations.native.error.homeMismatch":`설치된 서비스의 홈과 현재 홈이 일치하지 않아 파일을 건드리지 않았습니다.`,"integrations.native.error.notInstalled":`Grok Build가 설치되어 있지 않아 변경할 수 없습니다.`,"integrations.native.error.configBusy":`다른 곳에서 설정을 저장하는 중이라 변경하지 못했습니다. 잠시 후 다시 시도해 주세요.`,"integrations.state.absent":`미적용`,"integrations.state.current":`적용됨`,"integrations.state.stale":`업데이트 필요`,"integrations.state.conflict":`충돌`,"integrations.state.unsafe":`확인 불가`,"integrations.summary.detected":`감지된 클라이언트`,"integrations.summary.applied":`설정된 클라이언트`,"integrations.summary.stale":`업데이트 필요`,"integrations.summary.lastChange":`마지막 변경`,"integrations.summary.disableAll":`모두 해제…`,"integrations.onboarding":`적용하면 먼저 백업을 보관한 뒤 opencodex 제공자 블록 하나만 씁니다. 해제는 그 블록만 제거하며 보관된 스냅샷으로 복원할 수 있습니다.`,"integrations.empty.title":`설치된 클라이언트가 감지되지 않았습니다`,"integrations.empty.body":`지원 클라이언트를 설치한 뒤 돌아와 opencodex를 적용하세요.`,"integrations.action.apply":`적용`,"integrations.action.disable":`해제`,"integrations.action.refresh":`업데이트`,"integrations.action.settings":`설정`,"integrations.action.manageKeys":`키 관리`,"integrations.action.restore":`복원…`,"integrations.action.undo":`되돌리기`,"integrations.action.restorePoint":`이 시점으로 복원…`,"integrations.action.snapshotExpired":`백업 만료됨`,"integrations.rollback.title":`복원 센터`,"integrations.rollback.empty":`아직 적용 기록이 없습니다`,"integrations.rollback.emptyBody":`모든 쓰기는 먼저 변경 전 스냅샷을 보관합니다.`,"integrations.restore.title":`이 스냅샷으로 복원할까요?`,"integrations.restore.body":`현재 파일을 먼저 백업한 뒤 선택한 스냅샷으로 교체합니다.`,"integrations.restore.driftTitle":`스냅샷 이후 변경이 감지되었습니다`,"integrations.restore.driftBody":`스냅샷 이후의 변경이 백업으로 보관되고 파일이 교체됩니다.`,"integrations.restore.confirm":`복원`,"integrations.restore.confirmDrift":`새 변경을 백업하고 복원`,"integrations.restore.pending":`복원 중…`,"integrations.restore.manual":`자동 복원에 실패했습니다: {reason}. {path}에서 직접 복원하세요.`,"integrations.error.load":`연동 상태를 불러오지 못했습니다.`,"integrations.error.stale":`최신 새로고침에 실패했습니다. 아래 값은 오래된 정보일 수 있습니다.`,"integrations.error.busy":`이 클라이언트의 다른 변경이 진행 중입니다. 잠시 후 다시 시도하세요.`,"integrations.error.conflict":`opencodex가 쓴 뒤 설정이 변경되었습니다. 아무 내용도 제거하지 않았습니다.`,"integrations.error.unsafe":`설정을 안전하게 변경할 수 없습니다.`,"integrations.error.generic":`연동 변경에 실패했습니다. 이전 상태는 유지되었습니다.`,"integrations.error.nonLoopback":`{client}은(는) localhost 프록시에만 연결할 수 있습니다. 원격 바인드에 필요한 인증 헤더를 넣을 자리가 설정 파일에 없어 직접 작성해도 마찬가지입니다. 터널이나 로컬 포워더로 loopback 경로를 열어주세요.`,"integrations.status.installed":`설치 감지됨`,"integrations.status.notInstalled":`설치되지 않음`,"integrations.status.appliedAt":`적용`,"integrations.status.backup":`백업`,"integrations.status.lastRestore":`마지막 복원`,"integrations.status.unknown":`알 수 없음`,"integrations.bulk.title":`적용된 클라이언트 연동을 해제할까요?`,"integrations.bulk.body":`opencodex가 소유한 블록만 제거합니다. 각 클라이언트의 변경 전 스냅샷을 보관합니다.`,"integrations.bulk.partial":`일부 클라이언트를 해제하지 못했습니다: {clients}`,"integrations.bulk.success":`적용된 클라이언트 연동을 해제했습니다.`,"integrations.retention.degraded":`백업 정리가 밀려 있습니다 — 오래된 백업이 남아 있을 수 있습니다.`,"integrations.error.residual":`파일이 중간 상태로 남았을 수 있습니다: {message} {path}에서 복원하세요.`,"integrations.error.recover":`{message} 백업 위치는 {path}입니다.`,"integrations.kind.apply":`적용`,"integrations.kind.disable":`해제`,"integrations.kind.refresh":`업데이트`,"integrations.kind.restore":`복원`,"integrations.semantics.opencode":`디스크에서 직접 실행할 때만 적용됩니다. ocx opencode의 환경 주입이 우선합니다.`,"integrations.semantics.pi":`새 세션부터 적용됩니다.`,"integrations.semantics.omp":`카탈로그를 불러오려면 OMP를 재시작하세요.`,"integrations.semantics.hermes":`새 세션부터 적용됩니다.`,"integrations.semantics.openclaw":`실행 중인 게이트웨이에 즉시 반영됩니다.`,"integrations.semantics.kimi":`재시작 또는 /reload 시 적용됩니다 (v2는 파일 변경을 감지합니다).`,"integrations.semantics.gajae":`새 세션 또는 /model을 열 때 적용됩니다.`,"integrations.semantics.dsh":`OpenCodex는 $DSH_HOME/settings.yaml의 llm-pi-ai.providers.opencodex만 관리합니다. DSH는 이 provider를 hot reload하며 기본 model과 deepseek-official은 변경하지 않습니다. 현재 loopback 전용이며 실제 credential을 기록하지 않습니다.`,"integrations.semantics.mcode":`custom_provider.opencodex만 관리하며 기본 모델과 MiniMax 로그인은 변경하지 않습니다.`,"integrations.semantics.zcode":`~/.zcode/v2/config.json의 provider.opencodex만 관리하며 Z.ai 로그인과 다른 프로바이더는 변경하지 않습니다. 변경 후 ZCode를 재시작하세요.`,"integrations.semantics.prime":`Prime Agent의 models.json에서 providers.opencodex만 관리합니다. 위치는 ~/.prime/agent이며 PRIME_AGENT_CODING_AGENT_DIR가 설정되면 그쪽이 우선합니다. 다른 프로바이더와 모델 오버라이드는 변경하지 않습니다. 새 세션부터 적용됩니다.`,"codexAuth.mainAccount":`메인 계정`,"codexAuth.logLabel":`로그 라벨`,"codexAuth.codexApp":`Codex App`,"codexAuth.appLogin":`앱 로그인`,"codexAuth.accountPool":`계정 풀`,"codexAuth.accountModeTitle":`OpenAI 계정 모드`,"codexAuth.accountModePool":`풀 모드`,"codexAuth.accountModePoolDesc":`메인 로그인과 사용 가능한 추가 계정이 여기에서 순환됩니다.`,"codexAuth.accountModeDirect":`직접 모드`,"codexAuth.accountModeDirectDesc":`요청은 메인 로그인만 사용하며, 추가 계정은 풀 모드용으로 계속 저장됩니다.`,"codexAuth.openaiMissing":`내장 OpenAI 프로바이더가 설정되지 않았습니다.`,"codexAuth.openaiDisabled":`내장 OpenAI 프로바이더가 비활성화되어 있습니다.`,"codexAuth.openaiUnavailableDesc":`OpenAI 계정은 그대로 사용할 수 있습니다. Codex 요청을 라우팅하려면 프로바이더를 활성화하세요.`,"codexAuth.enableOpenai":`OpenAI 활성화`,"codexAuth.enablingOpenai":`활성화 중...`,"codexAuth.enableOpenaiFailed":`OpenAI 공급자를 활성화하지 못했습니다.`,"codexAuth.openaiPresetLoadFailed":`OpenAI 공급자 프리셋을 불러오지 못했습니다.`,"codexAuth.openaiPresetUnavailable":`OpenAI 공급자 프리셋을 사용할 수 없습니다.`,"codexAuth.openProviders":`프로바이더 열기`,"codexAuth.add":`추가`,"codexAuth.sparkQuota":`Codex Spark 할당량`,"codexAuth.sparkQuotaHint":`계정 카드에 GPT-5.3-Codex-Spark 주간 창을 표시합니다. 모델 하나에만 적용되므로 기본값은 숨김입니다.`,"codexAuth.sparkQuotaShown":`Codex Spark 할당량을 표시합니다`,"codexAuth.sparkQuotaHidden":`Codex Spark 할당량을 숨겼습니다`,"codexAuth.sparkQuotaFailed":`Codex Spark 할당량 설정을 바꾸지 못했습니다`,"codexAuth.refreshQuota":`할당량 새로고침`,"codexAuth.refreshingQuota":`새로고침 중...`,"codexAuth.quotaRefreshed":`할당량을 다시 조회했습니다`,"codexAuth.quotaRefreshFailed":`할당량 재조회에 실패했습니다`,"codexAuth.pauseExhausted":`한도 도달 계정 일시 중지`,"codexAuth.pausingExhausted":`할당량 확인 중...`,"codexAuth.pauseExhaustedSucceeded":`한도에 도달해 일시 중지된 계정: {count}`,"codexAuth.pauseExhaustedNone":`사용량 100%가 확인된 계정이 없습니다.`,"codexAuth.pauseExhaustedFailed":`한도 도달 계정을 확인하고 일시 중지하지 못했습니다.`,"codexAuth.noPool":`풀 계정이 아직 없습니다.`,"codexAuth.pause":`일시 중지`,"codexAuth.resume":`재개`,"codexAuth.paused":`일시 중지됨`,"codexAuth.pauseSucceeded":`{email} 계정을 일시 중지했습니다`,"codexAuth.resumeSucceeded":`{email} 계정을 풀에서 다시 사용할 수 있습니다`,"codexAuth.pauseFailed":`{email} 계정을 일시 중지하지 못했습니다. 변경 사항이 없습니다.`,"codexAuth.resumeFailed":`{email} 계정을 재개하지 못했습니다. 변경 사항이 없습니다.`,"codexAuth.pausedHint":`재개할 때까지 자동 전환, 재시도, 쿨다운 복구 및 수동 선택에서 제외됩니다.`,"codexAuth.pinned":`고정됨`,"codexAuth.pinnedHint":`직접 선택한 계정이므로 더 높은 선택 순서가 이 계정을 앞지르지 않습니다. 고정은 이 계정이 소진되거나, 다른 계정을 선택하거나, 어떤 계정이든 선택 순서를 변경할 때까지 유지됩니다.`,"codexAuth.fiveHour":`5시간`,"codexAuth.weekly":`주간`,"codexAuth.monthly":`30일`,"codexAuth.resets":`리셋`,"codexAuth.today":`오늘`,"codexAuth.current":`현재`,"codexAuth.nextSession":`선택됨`,"codexAuth.poolPrepared":`풀 모드 준비됨`,"codexAuth.preparePoolTitle":`이 계정을 풀 모드용으로 준비할까요?`,"codexAuth.preparePoolDesc":`직접 모드 요청은 계속 메인 로그인을 사용합니다. 풀 모드를 켜면 이 계정이 준비된 풀 선택으로 사용됩니다.`,"codexAuth.prepareForPool":`풀 모드용으로 준비`,"codexAuth.poolPreparedToast":`{email} 계정을 풀 모드용으로 준비했습니다`,"codexAuth.switchTitle":`활성 계정을 변경하시겠습니까?`,"codexAuth.switchDesc":`즉시 적용됩니다. 계정에 바인딩된 기존 스레드와 이미 진행 중인 요청은 기존 계정을 유지하고, 새 요청이나 바인딩 없는 요청은 선택한 계정의 순서 티어를 사용합니다. 같은 선택 순서의 계정은 계속 번갈아 사용됩니다.`,"codexAuth.cacheWarning":`계정 전환 시 프롬프트 캐시가 초기화됩니다.`,"codexAuth.setAsNext":`이 계정을 다음에 사용`,"codexAuth.cancel":`취소`,"codexAuth.switchBack":`메인 계정으로 돌아가시겠습니까?`,"codexAuth.switchBackDesc":`즉시 적용됩니다. 계정에 바인딩된 기존 스레드와 이미 진행 중인 요청은 기존 계정을 유지하고, 새 요청이나 바인딩 없는 요청은 앱 로그인 계정의 순서 티어를 사용합니다. 같은 선택 순서의 계정은 계속 번갈아 사용됩니다.`,"codexAuth.autoSwitch":`사용량 기반 선제 전환`,"codexAuth.autoSwitchQuotaDesc":`할당량: 사용량이 {threshold}% 이상이면 이미 바인딩된 작업을 포함해 다음 요청이 사용량이 더 낮은 적격 계정으로 이동할 수 있습니다. Go/Free는 30일만 봅니다.`,"codexAuth.autoSwitchQuotaOffDesc":`사용량 기반 선제 전환이 꺼져 있습니다. 새 작업/바인딩 없는 작업 배정과 실패 복구는 계속 적용됩니다.`,"codexAuth.autoSwitchRoundRobinDesc":`라운드로빈 배정은 이 임계값을 사용하지 않으며, 바인딩 없는 새 작업을 계속 순환합니다.`,"codexAuth.autoSwitchFillFirstDesc":`필 퍼스트: {threshold}%는 새 작업/바인딩 없는 작업의 소진 기준이며, 정상적인 바인딩 작업은 계정을 유지합니다.`,"codexAuth.autoSwitchFillFirstOffDesc":`필 퍼스트에는 새 작업/바인딩 없는 작업의 사용량 소진 기준이 없습니다. 쿨다운, 재인증, 실패 복구는 여전히 라우팅을 바꿀 수 있습니다.`,"codexAuth.failureRecoveryNote":`실패 복구는 별도입니다. 출력 전 429/402 거절, 쿨다운, 재인증, 제외 또는 설정된 일시적 장애 조치로 다른 적격 계정이 선택될 수 있습니다.`,"codexAuth.autoSwitchThreshold":`사용량 임계값`,"codexAuth.autoSwitchThresholdAria":`사용량 임계값(퍼센트)`,"codexAuth.autoSwitchThresholdInc":`사용량 임계값 증가`,"codexAuth.autoSwitchThresholdDec":`사용량 임계값 감소`,"codexAuth.autoSwitchLoadFailed":`사용량 기반 전환 설정을 불러오지 못했습니다.`,"codexAuth.autoSwitchThresholdInvalid":`1~100 사이의 정수를 입력하세요`,"codexAuth.autoSwitchUpdated":`사용량 기반 선제 전환 설정을 저장했습니다`,"codexAuth.autoSwitchUpdateFailed":`사용량 기반 전환 설정 변경을 확인하지 못했습니다. 마지막으로 확인된 값을 표시합니다.`,"codexAuth.requestUserInput":`Default 모드에서 입력 요청`,"codexAuth.requestUserInputDesc":`Default 모드 세션에서 Codex가 일시 중지하고 request_user_input 도구로 질문할 수 있게 합니다.`,"codexAuth.requestUserInputUpdated":`기능 플래그가 업데이트되었습니다 - 새 세션부터 적용됩니다.`,"codexAuth.requestUserInputUpdatedRestart":`기능 플래그가 업데이트되었습니다 - 새 세션부터 적용됩니다. Codex 앱을 다시 시작하세요.`,"codexAuth.requestUserInputUpdateFailed":`기능 플래그를 업데이트하지 못했습니다. 변경된 내용이 없습니다.`,"codexAuth.requestUserInputLoadFailed":`config.toml에서 기능 플래그를 읽지 못했습니다.`,"codexAuth.accountPickerTitle":`모델 선택기에서 사용할 Codex 계정 지정`,"codexAuth.accountPickerOffDesc":`활성화하면 일반 GPT 선택기 항목이 계정 선택기별 항목으로 대체되어 로그아웃하지 않고도 대화에 사용할 정확한 계정을 선택할 수 있습니다. 비활성화해도 계정은 삭제되지 않습니다.`,"codexAuth.accountPickerOnDesc":`각 선택기는 저장된 계정 하나를 나타내는 공개 레이블입니다. 선택하면 해당 대화가 그 계정에 고정되며 Pool 순환이나 대체가 일어나지 않고 활성 Pool 계정도 바뀌지 않습니다.`,"codexAuth.accountPickerCompatibility":`기본 Codex App 로그인에는 자체 선택기가 있습니다. 생성된 맵에서는 보통 main을 사용하며, 충돌 시 main-2 같은 안전한 접미사가 붙습니다. 추가 계정에는 안정적인 개인정보 보호 레이블이 부여되고 사용자 지정 선택기 이름은 유지됩니다. 기존 대화와 저장된 모델 선택은 계속 라우팅됩니다. 비활성화하면 생성된 항목만 숨기며 선택기와 정확한 경로는 보존됩니다. 일반 GPT 모델 ID는 기존 Pool 또는 Direct 동작을 유지합니다.`,"codexAuth.accountPickerUpdated":`계정 지정 설정을 업데이트했습니다.`,"codexAuth.accountPickerUpdateFailed":`계정 지정 설정을 업데이트하지 못했습니다. 마지막으로 확인된 설정을 표시합니다.`,"codexAuth.accountPickerLoadFailed":`계정 지정 설정을 불러오지 못했습니다.`,"codexAuth.accountPickerRefreshFailed":`이 설정을 새로 고치지 못했습니다. 마지막으로 확인된 값을 계속 표시합니다.`,"codexAuth.advancedSettings":`고급 설정`,"codexAuth.advancedSettingsAria":`고급 Codex 인증 설정 표시 또는 숨기기`,"codexAuth.catalogRefreshPending":`변경 사항은 저장되었지만 Codex 모델 카탈로그 새로 고침이 보류 중입니다. ocx sync를 실행해 다시 시도하세요.`,"anthropicPool.title":`Claude 계정 풀(실험적)`,"anthropicPool.enabledDesc":`429 시 계정을 쿨다운하고 장애 조치합니다. 새 세션은 5시간 사용량이 {threshold}% 미만인 계정을 우선합니다.`,"anthropicPool.disabledDesc":`활성 Claude 계정만 사용합니다. 실험적 라우팅을 감수할 때만 켜세요.`,"anthropicPool.experimentalWarning":`실험적이며 충분히 검증되지 않았습니다. 자동 다중 계정 로테이션처럼 보이는 동작은 Anthropic이 계정을 제한할 수 있습니다. 같은 조직은 할당량을 공유할 수 있어 풀링이 도움이 되지 않을 수 있습니다. 위험을 이해하지 못하면 꺼 두세요.`,"anthropicPool.needTwoAccounts":`풀을 켜기 전에 Claude OAuth 계정을 두 개 이상 추가하세요.`,"anthropicPool.threshold":`새 세션 사용량 임계값`,"anthropicPool.thresholdAria":`새 세션 사용량 임계값(퍼센트)`,"anthropicPool.thresholdHelp":`0은 할당량 기반 선택을 끕니다(어피니티 + 활성 계정만). 기본값 80.`,"anthropicPool.thresholdInvalid":`0에서 100 사이의 정수를 입력하세요`,"anthropicPool.loadFailed":`Claude 풀 설정을 불러오지 못했습니다.`,"anthropicPool.saveFailed":`Claude 풀 설정을 저장하지 못했습니다.`,"anthropicPool.on":`켜짐`,"anthropicPool.off":`꺼짐`,"cursorPool.title":`Cursor 계정 풀(실험적)`,"cursorPool.enabledDesc":`429 또는 인증 실패 시 계정을 쿨다운하고 이 대화에서 장애 조치합니다. 각 대화는 레이트 제한 또는 인증 실패가 발생할 때까지 한 계정에 유지됩니다.`,"cursorPool.disabledDesc":`활성 Cursor 계정만 사용합니다. 실험적 라우팅을 감수할 때만 켜세요.`,"cursorPool.experimentalWarning":`실험적이며 충분히 검증되지 않았습니다. Cursor 이용 규정은 레이트 제한 우회와 사용량 측정 조작을 금지합니다. Teams 포함 사용량은 좌석 단위이며 이전되지 않을 수 있습니다. 위험을 이해하지 못하면 꺼 두세요.`,"cursorPool.needTwoAccounts":`풀을 켜기 전에 Cursor OAuth 계정을 두 개 이상 추가하세요.`,"cursorPool.loadFailed":`Cursor 풀 설정을 불러오지 못했습니다.`,"cursorPool.saveFailed":`Cursor 풀 설정을 저장하지 못했습니다.`,"cursorPool.on":`켜짐`,"cursorPool.off":`꺼짐`,"antigravityRouting.failoverOnlyTitle":`다중 계정 라우팅(장애 조치만)`,"antigravityRouting.failoverOnlyDesc":`각 대화는 하나의 Antigravity 계정에 유지됩니다. 레이트 제한 429 또는 인증 실패 시 opencodex는 해당 대화의 다른 적격 계정으로 장애 조치할 수 있습니다 — 새 세션을 계정 간에 분산하거나 다른 진행 중 대화의 전역 활성 계정을 변경하지 않습니다.`,"accountPool.strategy":`로테이션 전략`,"accountPool.strategyDesc":`OpenCodex가 새 작업/바인딩 없는 작업에 계정을 배정하는 방식입니다.`,"accountPool.strategyQuota":`할당량`,"accountPool.strategyRoundRobin":`라운드로빈`,"accountPool.strategyFillFirst":`필 퍼스트`,"accountPool.strategyHintQuota":`할당량 전략은 사용량 임계값을 넘으면 기존 작업의 다음 요청도 다른 계정에 다시 바인딩할 수 있습니다.`,"accountPool.strategyHintRoundRobin":`라운드로빈은 현재 바인딩이 없는 작업만 순환하며, 사용량 임계값은 기본 순환에 영향을 주지 않습니다.`,"accountPool.strategyHintFillFirst":`필 퍼스트는 임계값을 바인딩 없는 작업의 소진 기준으로 사용하며, 정상적인 바인딩 작업은 어피니티를 유지합니다.`,"accountPool.unboundDefinition":`새 작업/바인딩 없는 작업은 현재 계정 바인딩이 없는 요청입니다. 기존에 보이던 작업도 프록시나 어피니티 상태가 초기화되면 바인딩이 없어질 수 있습니다.`,"accountPool.stickyLimit":`회전 전 새 작업/바인딩 없는 작업 배정 횟수`,"accountPool.stickyLimitAria":`회전 전 새 작업/바인딩 없는 작업 배정 횟수`,"accountPool.stickyLimitInc":`스티키 한도 증가`,"accountPool.stickyLimitDec":`스티키 한도 감소`,"accountPool.stickyLimitHelp":`다음 계정으로 넘어가기 전에 이 횟수의 새 작업/바인딩 없는 작업을 선택 계정에 배정합니다. 카운터는 업스트림 성공 후가 아니라 작업을 바인딩할 때 증가합니다.`,"accountPool.stickyLimitInvalid":`1에서 100 사이의 정수를 입력하세요`,"accountPool.strategyLoadFailed":`로테이션 전략을 불러오지 못했습니다.`,"accountPool.strategyUpdateFailed":`로테이션 전략을 저장하지 못했습니다.`,"accountPool.priority":`선택 순서`,"accountPool.priorityAria":`이 계정의 선택 순서`,"accountPool.priorityHint":`숫자가 클수록 먼저 사용됩니다. 위에 있는 계정이 모두 소진되거나 사용할 수 없을 때에만 더 낮은 숫자로 넘어갑니다.`,"accountPool.priorityFirst":`가장 먼저`,"accountPool.priorityEarlier":`먼저`,"accountPool.priorityNormal":`기본`,"accountPool.priorityLater":`나중에`,"accountPool.priorityLast":`가장 마지막`,"accountPool.priorityOption":`{name} ({value})`,"accountPool.priorityCustom":`사용자 지정`,"accountPool.priorityUpdated":`{email}의 선택 순서를 업데이트했습니다`,"accountPool.priorityUpdateFailed":`{email}의 선택 순서를 저장하지 못했습니다. 마지막으로 확인된 값을 표시합니다.`,"codexAuth.switched":`다음 요청에 {email}을(를) 사용합니다`,"codexAuth.loadFailed":`Codex 계정 설정을 불러오지 못했습니다.`,"codexAuth.switchFailed":`계정을 전환하지 못했습니다. 이전 선택은 그대로 유지됩니다.`,"codexAuth.removeConfirm":`{id}을(를) 삭제하시겠습니까?`,"codexAuth.removeFailed":`계정을 제거하지 못했습니다. 변경된 내용은 없습니다.`,"codexAuth.addTitle":`Codex 계정 추가`,"codexAuth.addIdLabel":`계정 ID (슬러그)`,"codexAuth.addJsonLabel":`auth.json 내용`,"codexAuth.addHelp":`다른 머신의 ~/.codex/auth.json을 복사하거나, codex-auth export를 사용하세요.`,"codexAuth.importBtn":`가져오기`,"codexAuth.importInvalidJson":`유효하지 않은 JSON`,"codexAuth.importMissingTokens":`JSON에 access_token 또는 refresh_token이 없습니다`,"codexAuth.importMissingId":`계정 ID를 입력하세요`,"codexAuth.accountAdded":`풀에 계정이 추가되었습니다`,"codexAuth.addPickDesc":`다른 ChatGPT 계정으로 로그인하여 풀에 추가하세요.`,"codexAuth.oauthLogin":`OAuth 로그인`,"codexAuth.oauthDesc":`브라우저에서 ChatGPT 로그인 열기`,"codexAuth.importAuthJson":`auth.json 가져오기`,"codexAuth.importAuthJsonDesc":`다른 Codex 설치 또는 codex-auth export에서`,"codexAuth.back":`뒤로`,"codexAuth.oauthAlreadyInProgress":`로그인이 이미 진행 중입니다. 브라우저에서 완료하세요.`,"codexAuth.oauthWaiting":`브라우저에서 ChatGPT 로그인 완료를 기다리는 중...`,"codexAuth.oauthSubmittingCode":`코드를 제출 중…`,"codexAuth.oauthCodeSubmitted":`코드를 제출했습니다 — 로그인 완료를 기다리는 중입니다…`,"codexAuth.oauthStatusRetrying":`로그인 상태를 확인하는 중 네트워크 또는 프록시 오류가 발생했습니다 — 재시도 중…`,"codexAuth.oauthCancelled":`로그인이 취소되었습니다.`,"codexAuth.loginFailed":`로그인에 실패했습니다`,"codexAuth.needsReauth":`재로그인`,"codexAuth.reauthenticate":`Re-authenticate`,"codexAuth.tokenExpired":`토큰 만료 — 이 계정을 다시 인증하세요`,"codexAuth.mainTokenExpired":`토큰 만료 — Codex 앱 로그인으로 다시 로그인하세요`,"codexAuth.emailCollision":`이 계정은 메인 Codex 로그인과 동일합니다. 다른 계정을 사용하세요.`,"codexAuth.resetCreditsTitle":`리셋 크레딧`,"codexAuth.resetCreditsAvailable":`사용 가능한 리셋 크레딧이 {count}개 있습니다.`,"codexAuth.resetCreditsDesc":`크레딧 1개로 현재 시간/주간 사용량 제한을 즉시 초기화합니다.`,"codexAuth.noResetCredits":`사용 가능한 리셋 크레딧이 없습니다.`,"codexAuth.earnCreditsHint":`크레딧은 매월 자동 지급되며 추천 프로그램으로도 획득할 수 있습니다.`,"codexAuth.creditsExpireNote":`크레딧은 획득 후 30일 뒤 만료됩니다.`,"codexAuth.useOneCredit":`크레딧 1개 사용`,"codexAuth.confirmResetTitle":`리셋 크레딧을 사용하시겠습니까?`,"codexAuth.confirmResetDesc":`현재 사용량 제한이 즉시 초기화됩니다. 남은 크레딧: {count}개.`,"codexAuth.irreversible":`이 작업은 되돌릴 수 없습니다.`,"codexAuth.useCredit":`크레딧 사용`,"codexAuth.redeeming":`초기화 중...`,"codexAuth.resetSuccess":`사용량 제한이 초기화되었습니다! 남은 크레딧: {remaining}개.`,"codexAuth.resetSuccessGeneric":`사용량 제한이 초기화되었습니다!`,"codexAuth.resetAlreadyRedeemed":`이 크레딧은 이미 사용되었습니다. 크레딧은 변경되지 않았습니다.`,"codexAuth.resetNothingToReset":`현재 초기화할 사용량 윈도우가 없습니다.`,"codexAuth.resetNoCredit":`사용 가능한 리셋 크레딧이 없습니다.`,"codexAuth.resetError":`리셋 크레딧 사용에 실패했습니다. 다시 시도해 주세요.`,"codexAuth.fifoNote":`가장 오래된 크레딧부터 사용됩니다.`,"codexAuth.confirmWhichCredit":`{date}에 획득한 크레딧이 사용됩니다.`,"codexAuth.creditNext":`다음 사용 대상`,"codexAuth.creditLabel":`크레딧 #{n}`,"codexAuth.creditNextBadge":`NEXT`,"codexAuth.creditGranted":`획득 {date}`,"codexAuth.creditExpires":`만료 {date} ({days}일 남음)`,"api.title":`API 액세스`,"api.subtitle":`생성한 API 키로 외부 앱에서 opencodex 프록시에 접속합니다. 인증은 {authHeader} 헤더로 하며, 엔드포인트별로 받는 헤더는 아래 표에 있습니다.`,"api.endpointNote":`기본 URL을 OpenAI 호환 클라이언트에 사용하세요. Responses와 Chat Completions는 /v1 아래에 제공됩니다.`,"api.baseUrl":`기본 URL`,"api.responsesEndpoint":`Responses API`,"api.chatCompletionsEndpoint":`Chat Completions API`,"api.messagesEndpoint":`Messages API`,"api.modelsEndpoint":`Models API`,"api.endpointsTitle":`게이트웨이 엔드포인트`,"api.authBaseUrlNote":`클라이언트에는 기본 URL을 설정한 뒤 아래에서 프로토콜별 엔드포인트를 선택하세요.`,"api.authTitle":`인증`,"api.authLoopback":`루프백 바인드(127.0.0.1 또는 ::1)는 인증을 건너뜁니다. 원격 바인드는 생성된 ocx_ 키 또는 OPENCODEX_API_AUTH_TOKEN이 필요합니다.`,"api.modelsTitle":`외부 모델 카탈로그`,"api.modelsCount":`{count}개 호출 가능`,"api.modelsSearch":`모델 검색`,"api.modelsSubtitle":`이 정확한 모델 ID를 /v1/models와 선택한 인바운드 프로토콜과 함께 사용하세요.`,"api.modelsLoading":`모델 불러오는 중…`,"api.modelsEmpty":`아직 외부에서 호출 가능한 모델이 없습니다.`,"api.modelsNoMatch":`“{query}”와 일치하는 모델이 없습니다.`,"api.modelsLoadFailed":`외부 모델 카탈로그를 불러오지 못했습니다.`,"api.colModel":`모델`,"api.colSource":`출처`,"api.colProtocols":`프로토콜`,"api.copyModelId":`ID 복사`,"api.modelCopied":`복사됨`,"api.testModel":`테스트`,"api.testingModel":`테스트 중…`,"api.testSucceeded":`확인`,"api.testFailed":`실패`,"api.protocolResponses":`Responses`,"api.protocolChatCompletions":`Chat Completions`,"api.protocolMessages":`Messages`,"api.sourceNative":`ChatGPT 풀`,"api.sourceCombo":`콤보 경로`,"api.sourceCustom":`사용자 정의`,"api.usageResponsesTitle":`Responses 예시`,"api.usageChatTitle":`Chat Completions 예시`,"api.usageMessagesTitle":`Messages 예시`,"api.newKeyTitle":`새 키 생성됨`,"api.newKeyNote":`지금 키를 복사하세요. 다시 표시되지 않습니다.`,"api.copy":`복사`,"api.copied":`복사됨`,"api.dismiss":`닫기`,"api.generateTitle":`키 생성`,"api.keyNamePlaceholder":`키 이름 (선택)`,"api.generate":`생성`,"api.generating":`생성 중…`,"api.activeKeys":`활성 키 ({count})`,"api.activeKeysLoading":`활성 키`,"api.noKeys":`아직 API 키가 없습니다. 위에서 하나 생성하세요.`,"api.workspace.sections":`API 섹션`,"api.section.keys":`키`,"api.section.connect":`연결`,"api.section.endpoints":`엔드포인트`,"api.section.models":`모델`,"api.section.examples":`예제`,"api.workspace.details":`API 키 세부 정보`,"api.workspace.keyDetails":`키 세부 정보`,"api.workspace.keyPrefix":`키 접두사`,"api.workspace.deleteKey":`키 삭제`,"api.workspace.deleteConfirm":`이 키를 삭제하시겠습니까? 되돌릴 수 없습니다.`,"api.workspace.usageExamples":`사용 예제`,"api.copyUrlHint":`클릭하여 URL 복사`,"api.urlCopied":`URL 복사됨`,"api.copyExampleHint":`클릭하여 예제 복사`,"api.exampleCopied":`예제 복사됨`,"api.colName":`이름`,"api.colKey":`키`,"api.colCreated":`생성일`,"api.confirm":`확인`,"api.deleteAria":`API 키 삭제`,"api.usageSampleInput":`안녕하세요, 세계!`,"api.clientConfig.title":`클라이언트 설정`,"api.clientConfig.rowsLabel":`클라이언트 연결`,"api.clientConfig.details":`자세히`,"api.clientConfig.detailsAria":`{client} 설정 자세히 보기`,"api.clientConfig.copyAria":`{client} 설정 복사`,"api.clientConfig.downloadAria":`{client} 설정 다운로드`,"api.clientConfig.rowMeta":`{destination} · 모델 {count}개`,"api.clientConfig.rowError":`{client} 설정을 만들지 못했습니다.`,"api.clientConfig.copiedAnnounceClient":`{client} 설정을 클립보드에 복사했습니다.`,"api.clientConfig.clientOpencode":`OpenCode`,"api.clientConfig.clientPi":`Pi`,"api.clientConfig.clientOmp":`OMP`,"api.clientConfig.clientHermes":`Hermes`,"api.clientConfig.clientOpenclaw":`OpenClaw`,"api.clientConfig.clientKimi":`Kimi Code`,"api.clientConfig.clientGajae":`Gajae Code`,"api.clientConfig.clientDsh":`DeepSeek Harness (DSH)`,"api.clientConfig.clientMcode":`MiniMax Code`,"api.clientConfig.clientZcode":`ZCode`,"api.clientConfig.clientPrime":`Prime Agent`,"api.clientConfig.copy":`설정 복사`,"api.clientConfig.download":`다운로드`,"api.clientConfig.loading":`클라이언트 설정 생성 중…`,"api.clientConfig.jsonLabel":`{client} 설정`,"api.clientConfig.destination":`대상 파일`,"api.clientConfig.envHint":`실행 전 키 설정`,"api.clientConfig.mergeWarning":`대상 파일에 병합하세요. 덮어쓰면 기존 프로바이더와 MCP 설정이 사라집니다.`,"api.clientConfig.modelCount":`모델 {count}개 내보냄`,"api.clientConfig.missingLimits":`{total}개 중 {count}개 모델에 컨텍스트 한도가 없어 클라이언트 기본값이 적용됩니다.`,"api.clientConfig.noKeyYet":`{env}에 연결된 키가 아직 없습니다. 루프백 밖에서 쓰려면 위에서 키를 발급하세요.`,"api.clientConfig.loadFailed":`모델 목록을 읽지 못해 클라이언트 설정을 만들지 못했습니다.`,"api.clientConfig.copiedAnnounce":`클라이언트 설정을 클립보드에 복사했습니다.`,"api.clientConfig.copyFailed":`클라이언트 설정을 복사하지 못했습니다.`,"api.clientConfig.downloadedAnnounce":`{filename} 파일을 다운로드했습니다. 아직 아무것도 바뀌지 않았으니 {destination}에 직접 병합하세요.`,"api.clientConfig.whereDisclosure":`이 파일이 들어갈 위치`,"api.clientConfig.whereBody":`위 경로는 전역 설정 경로입니다. 작업 디렉터리의 프로젝트 설정 파일이 우선하며, 키는 설정에 적힌 환경 변수에서 읽고 이 파일에는 저장되지 않습니다.`,"api.keysLoadFailed":`API 키를 불러오지 못했습니다.`,"api.createFailed":`API 키를 만들지 못했습니다.`,"api.deleteFailed":`API 키를 삭제하지 못했습니다.`,"api.auth.endpoint":`엔드포인트`,"api.auth.required":`필수`,"api.auth.accepted":`가능`,"api.auth.rejected":`안 됨`,"api.auth.testProtocol":`{protocol} 테스트`,"api.auth.testNeedsFreshKey":`인증 테스트를 하려면 키를 새로 만들고 한 번만 보이는 값을 화면에 둔 채로 실행하세요.`,"api.key.name":`키 이름`,"api.key.rename":`이름 변경`,"api.key.saveName":`이름 저장`,"api.key.renaming":`저장 중…`,"api.key.renameFailed":`이름을 바꾸지 못했습니다. 입력한 내용은 그대로 뒀습니다.`,"api.key.deleting":`삭제 중…`,"api.key.copyFailed":`키를 복사하지 못했습니다. 이 패널을 닫기 전에 직접 선택해서 복사하세요.`,"api.attribution.title":`키별 사용량`,"api.attribution.requests7d":`최근 7일 요청`,"api.attribution.totalRequests":`집계된 전체 요청`,"api.attribution.totalRequestsAvailable":`사용 가능한 기록의 요청`,"api.attribution.sinceAvailable":`사용 가능한 집계 시작일`,"api.attribution.lastUsed":`마지막 사용`,"api.attribution.since":`집계 시작`,"api.attribution.neverUsed":`집계 이후 사용 없음`,"api.attribution.unavailable":`사용량 없음`,"api.attribution.unavailableDetail":`아직 집계된 사용량이 없습니다. 집계가 시작되기 전 요청은 소급해서 배정할 수 없습니다.`,"api.attribution.ambiguous":`두 키가 같은 ID를 쓰고 있어 어느 쪽 사용량인지 가릴 수 없습니다. 설정 파일에서 키마다 다른 ID를 주세요.`,"api.attribution.railAmbiguous":`ID 중복`,"claude.subtitle":`Claude Code에서 GPT, Gemini 등 다른 모델도 쓸 수 있게 해줍니다.`,"claude.enabledLabel":`Claude 연결`,"claude.enabledHint":`끄면 Claude Code가 이 프록시를 사용할 수 없습니다.`,"claude.authMode":`인증 모드`,"claude.authModeHint":`subscription은 Claude 계정 필요, proxy는 opencodex 프록시만으로 사용 가능`,"claude.authModeSubscription":`Subscription (Claude 계정)`,"claude.authModeProxy":`Proxy (계정 불필요)`,"claude.authModeAuto":`자동 (Claude 인증 감지)`,"claude.effectiveMode.label":`다음 실행 시 적용`,"claude.effectiveMode.manual":`수동: {mode}`,"claude.effectiveMode.autoPresent":`자동: 구독 — {source}에서 Claude 인증을 찾았습니다`,"claude.effectiveMode.autoAbsent":`자동: 프록시 모드 — Claude 인증이 없습니다`,"claude.effectiveMode.autoUnknown":`자동: 구독 — 인증을 확인하지 못했습니다`,"claude.effectiveMode.admissionKey":`이 프록시의 API 키는 계속 전송됩니다.`,"claude.authSource.claude-json-oauth":`Claude 계정`,"claude.authSource.claude-credentials-file":`자격 증명 파일`,"claude.authSource.macos-keychain":`macOS 키체인`,"claude.authSource.exported-env":`환경 변수`,"claude.authSource.unknown":`감지된 자격 증명`,"claude.systemEnv":`자동 연결`,"claude.systemEnvDesc":`켜면 터미널에서 claude를 바로 실행해도 프록시를 거칩니다.`,"claude.systemEnvUnsupported":`자동 연결은 macOS에서만 지원됩니다. 이 시스템에서는 {cmd}로 Claude를 실행하세요.`,"claude.systemEnvWarn":`⚠ 터미널 앱을 완전히 종료했다 다시 열어야 적용됩니다. 사용을 권장하지 않습니다.`,"claude.fastMode":`Fast Mode (OpenAI)`,"claude.fastModeDesc":`OpenAI 모델의 추론 속도를 제어합니다. ON = 빠른 추론. OFF = 기본 속도. Auto = 클라이언트 설정 그대로.`,"claude.fastAuto":`Auto`,"claude.fastOn":`ON`,"claude.fastOff":`OFF`,"claude.autoContext":`큰 컨텍스트 자동 활용`,"claude.autoContextDesc":`1M 표기를 어디까지 붙일지 정합니다. 켜면 컴팩션 기준치를 담을 수 있는 창을 가진 모델에 큰 컨텍스트 행이 생기고, 끄면 진짜 1M 모델에만 생깁니다.`,"claude.autoContextInert":`설정 파일에 이전 방식의 컨텍스트 크기 값(maxContextTokens)이 있어 이 기능이 지금은 적용되지 않아요. 설정에서 그 값을 지우면 다시 켜집니다.`,"claude.autoCompactWindow":`자동 요약 지점`,"claude.autoCompactDefault":`{value} (기본값)`,"claude.autoCompactWindowDesc":`대화가 이 지점에 다다르면 오래된 내용을 자동 요약합니다. 모델마다 자기 한도를 넘지 않는 선에서만 적용되니 200k 모델은 영향받지 않아요.`,"claude.autoCompactWindowWarn":`값을 직접 바꾸면 GPT 모델들이 제대로 동작하지 않을 수 있어요 — 모델의 실제 한도보다 크게 잡으면 요약이 되기 전에 대화가 오류로 멈춥니다.`,"claude.injectAgents":`서브에이전트 자동 등록`,"claude.injectAgentsDesc":`위 '서브에이전트' 탭에서 고른 모델들(+현재 기본 모델)을 Claude Code의 파견 가능한 에이전트(ocx-*)로 자동 등록합니다. 새 세션부터 적용돼요.`,"claude.webSearchSidecar":`웹 검색 사이드카 덮어쓰기`,"claude.webSearchSidecarHint":`Claude Code 요청에만 메인 웹 검색 사이드카 대신 이 설정을 씁니다.`,"claude.visionSidecar":`비전 사이드카 덮어쓰기`,"claude.visionSidecarHint":`Claude Code 요청에만 메인 비전 사이드카 대신 이 설정을 씁니다.`,"claude.useMainSetting":`메인 설정 사용`,"claude.sidecarModelPlaceholder":`메인 설정의 모델`,"claude.quickstart":`시작하기`,"claude.quickstartHint":`{cmd} 을 실행하면 프록시를 거쳐 Claude Code가 열립니다. claude.ai 로그인은 그대로 유지됩니다.`,"claude.manualEnv":`직접 설정하기 (고급)`,"claude.smallFastModel":`백그라운드 보조 모델`,"claude.smallFastModelHint":`Claude Code가 대화 요약, 주제 감지 같은 배후 작업에 쓰는 모델입니다. 서브에이전트의 haiku 별칭도 이 모델을 씁니다. 비워두면 Claude 기본값(Haiku).`,"claude.smallFastModelAccurateHint":`Claude Code가 대화 요약, 주제 감지 같은 백그라운드 작업에 쓰는 모델입니다. 서브에이전트의 haiku 별칭도 이 모델을 사용합니다.`,"claude.smallFastModelUnsetOption":`Claude Code가 선택(네이티브 모델)`,"claude.smallFastModelNativeWarning":`비워 두면 OpenCodex가 보조 모델 환경 변수를 설정하지 않습니다. Claude Code가 네이티브 Sonnet 모델을 사용할 수 있으며, 네이티브 프로바이더 요금이 발생할 수 있습니다.`,"claude.slotUnset":`Claude 기본값 사용`,"claude.modelMap":`모델 가로채기`,"claude.modelMapHint":`Claude가 특정 모델을 요청하면 가로채서 지정한 모델로 보냅니다. 기본값은 비어 있어요 — 규칙을 추가할 때만 동작합니다.`,"claude.mapFrom":`원래 모델 (예: claude-sonnet-4-5)`,"claude.mapTo":`바꿀 모델 (예: gemini/gemini-3-pro)`,"claude.addMapping":`규칙 추가`,"claude.removeMapping":`규칙 삭제`,"claude.aliases":`사용 가능한 모델`,"claude.aliasesHint":`Claude Code의 /model 메뉴에 표시되는 모델 목록입니다.`,"claude.aliasProviderOther":`기타`,"claude.loading":`불러오는 중…`,"claude.loadFail":`Claude 설정을 불러오지 못했습니다`,"claude.saved":`저장되었습니다.`,"claude.saveFailed":`저장 실패`,"claude.networkError":`네트워크 오류 — 프록시가 실행 중인가요?`,"claude.toggleAria":`Claude 인바운드 켜기/끄기`,"claude.none":`없음`,"common.close":`닫기`,"common.ok":`확인`,"app.logoAria":`opencodex 로고`,"app.pageTitle":`{page} — opencodex`,"app.claudeOn":`Claude ON`,"app.claudeOff":`Claude OFF`,"usage.dayMon":`월`,"usage.dayWed":`수`,"usage.dayFri":`금`,"usage.heatmap.tooltipTokens":`{tokens} 토큰`,"usage.heatmap.tooltipRequests":`{requests} 요청`,"usage.chart.dayDetail":`{date}: 요청 {requests}개, 토큰 {tokens}개`,"usage.heatmap.keyboardLabel":`위아래 화살표로 하루씩, 좌우 화살표로 일주일씩 이동합니다.`,"nav.storage":`저장소`,"storage.title":`저장소`,"storage.subtitle":`CODEX_HOME 사용량을 확인합니다. 정리는 활성 세션을 건드리지 않습니다.`,"storage.loading":`저장소 스캔 중…`,"storage.empty":`CODEX_HOME이 비어 있거나 없습니다 — 표시할 내용이 없습니다.`,"storage.error":`저장소 스캔에 실패했습니다. CODEX_HOME이 올바른 디렉터리를 가리키는지 확인하세요.`,"storage.refresh":`다시 스캔`,"storage.rescanned":`스캔이 완료되었습니다.`,"storage.card.total":`전체 크기`,"storage.card.files":`파일 수`,"storage.card.home":`CODEX_HOME`,"storage.snapshot.lastScan":`마지막 스캔`,"storage.snapshot.scanning":`스캔 중…`,"storage.snapshot.unavailable":`아직 스캔 없음.`,"storage.cleanupCard.title":`공간 확보`,"storage.cleanupCard.tabs":`정리 옵션`,"storage.cleanupCard.tab.policy":`정책`,"storage.cleanupCard.tab.quarantine":`격리`,"storage.cleanup.noArchives":`정리할 보관 세션이 없습니다.`,"storage.section.buckets":`버킷`,"storage.section.largest":`가장 큰 파일`,"storage.workspace.overview":`개요`,"storage.workspace.selectBucket":`목록에서 버킷을 선택하면 세부 내역을 볼 수 있습니다.`,"storage.col.bucket":`버킷`,"storage.col.size":`크기`,"storage.col.files":`파일`,"storage.col.oldest":`가장 오래됨`,"storage.col.newest":`가장 최근`,"storage.col.rows":`DB 행 수`,"storage.rows.unknown":`알 수 없음 (잠김)`,"storage.bucket.sessions":`활성 세션`,"storage.bucket.archived_sessions":`보관된 세션`,"storage.bucket.logs_db":`로그 데이터베이스`,"storage.bucket.state_db":`상태 데이터베이스`,"storage.bucket.attachments":`첨부 파일`,"storage.bucket.deletion_manifests":`삭제 매니페스트`,"storage.bucket.other":`기타`,"storage.cleanup.title":`보관 정리`,"storage.cleanup.help":`가장 오래된 보관 세션을 비율로 제거합니다. 활성 세션은 건드리지 않습니다. 기본은 격리이며 파일은 CODEX_HOME/.trash로 이동합니다.`,"storage.cleanup.slider":`오래된 보관 비율`,"storage.cleanup.percent":`{percent}%`,"storage.cleanup.preset":`{percent}`,"storage.cleanup.preview":`미리보기`,"storage.cleanup.confirmTitle":`보관 정리 확인`,"storage.cleanup.confirmBody":`보관 파일 {count}개(약 {size}), 오래된 {percent}%를 처리합니다.`,"storage.cleanup.moreFiles":`…외 {n}개`,"storage.cleanup.permanent":`영구 삭제(격리 건너뛰기)`,"storage.cleanup.permanentWarn":`영구 삭제는 되돌릴 수 없습니다.`,"storage.cleanup.quarantineNote":`파일은 CODEX_HOME 아래 .trash로 이동합니다. 격리 탭에서 복원할 수 있습니다.`,"storage.cleanup.cancel":`취소`,"storage.cleanup.confirmQuarantine":`격리`,"storage.cleanup.confirmPermanent":`영구 삭제`,"storage.cleanup.doneQuarantine":`파일 {count}개를 격리했습니다({size}).`,"storage.cleanup.donePermanent":`파일 {count}개를 영구 삭제했습니다({size}).`,"storage.cleanup.previewFailed":`미리보기에 실패했습니다.`,"storage.cleanup.cleanupFailed":`정리에 실패했습니다.`,"storage.cleanup.err.codex_busy":`Codex가 state.sqlite를 사용 중입니다 — Codex를 종료한 뒤 다시 시도하세요.`,"storage.cleanup.err.stale_preview":`미리보기 이후 보관 파일이 변경되었습니다 — 미리보기를 다시 실행하세요.`,"storage.cleanup.err.restore_pending_overlap":`선택한 보관 파일이 미완료 휴지통 복원과 겹칩니다 — 복원을 완료하거나 다시 시도하세요.`,"storage.cleanup.err.referenced_history":`선택한 보관본이 포크 또는 페이지 기록에서 아직 참조됩니다.`,"storage.cleanup.err.invalid_digest":`미리보기 digest가 없거나 잘못되었습니다.`,"storage.cleanup.err.invalid_mode":`모드는 quarantine 또는 permanent여야 합니다.`,"storage.cleanup.err.fs_failed":`파일 시스템 정리에 실패했습니다. 일부 변경이 이미 적용되었을 수 있습니다 — CODEX_HOME/.trash와 표시된 복구 경로를 확인하세요.`,"storage.cleanup.err.fs_failed_trash":`파일 시스템 정리에 실패했습니다. 일부 변경이 이미 적용되었을 수 있습니다 — {trashDir}와 manifest.json에서 복구 가능한 파일을 확인하세요.`,"storage.cleanup.err.db_reconcile_failed":`Codex 상태 데이터베이스를 업데이트할 수 없습니다.`,"storage.cleanup.err.cleanup_failed":`정리에 실패했습니다.`,"storage.trash.title":`격리`,"storage.trash.help":`CODEX_HOME/.trash로 옮긴 보관 세션입니다. 복원하면 JSONL과 스레드 행이 돌아갑니다.`,"storage.trash.empty":`격리된 항목이 없습니다.`,"storage.trash.loading":`격리 목록 불러오는 중…`,"storage.trash.col.when":`격리 시각`,"storage.trash.col.files":`파일`,"storage.trash.col.size":`크기`,"storage.trash.col.mode":`모드`,"storage.trash.col.id":`항목`,"storage.trash.restore":`복원`,"storage.trash.confirmTitle":`격리 항목을 복원할까요?`,"storage.trash.confirmBody":`{id}에서 파일 {count}개(약 {size})를 보관 세션으로 되돌립니다.`,"storage.trash.cancel":`취소`,"storage.trash.confirmRestore":`복원`,"storage.trash.done":`파일 {count}개를 복원했습니다({size}).`,"storage.trash.restoreFailed":`복원에 실패했습니다.`,"storage.trash.listFailed":`격리 목록을 불러오지 못했습니다.`,"storage.trash.mode.quarantine":`격리`,"storage.trash.mode.permanent":`영구(미완료)`,"storage.trash.err.codex_busy":`Codex가 state.sqlite를 사용 중입니다 — Codex를 종료한 뒤 다시 시도하세요.`,"storage.trash.err.invalid_trash":`격리 항목 ID가 없거나 잘못되었습니다.`,"storage.trash.err.missing_trash":`격리 항목을 찾을 수 없습니다.`,"storage.trash.err.dest_exists":`복원 대상이 이미 있습니다 — 보관 파일을 삭제하거나 이름을 바꾼 뒤 다시 시도하세요.`,"storage.trash.err.fs_failed":`파일 시스템 복원에 실패했습니다. 일부 파일이 이미 복원되었을 수 있습니다 — archived_sessions와 .trash를 확인하세요.`,"storage.trash.err.storage_mutation_busy":`다른 저장소 정리 또는 복원이 진행 중입니다 — 잠시 후 다시 시도하세요.`,"storage.trash.err.db_reconcile_failed":`Codex 상태 데이터베이스 행을 복원할 수 없습니다.`,"storage.trash.err.restore_failed":`복원에 실패했습니다.`,"storage.trash.err.restore_worker_timeout":`복원 시간이 너무 길어(10분 초과) 중단되었습니다.`,"storage.trash.err.restore_worker_aborted":`종료 중 복원이 취소되었습니다.`,"storage.trash.err.restore_worker_failed":`복원 워커가 충돌하거나 예기치 않게 실패했습니다.`,"storage.policy.title":`자동 정리 정책`,"storage.policy.help":`보관 세션이 임계값을 넘을 때 선택적으로 일괄 정리합니다. 기본은 꺼짐 — 자동으로 켜지지 않습니다.`,"storage.policy.loading":`정책을 불러오는 중…`,"storage.policy.loadFailed":`정리 정책을 불러오지 못했습니다.`,"storage.policy.saveFailed":`정리 정책을 저장하지 못했습니다.`,"storage.policy.runFailed":`정책 실행에 실패했습니다.`,"storage.policy.alreadyRunning":`정리 정책이 이미 실행 중입니다.`,"storage.policy.invalid":`정책 값이 올바르지 않습니다.`,"storage.policy.enabled":`자동 정리 사용`,"storage.policy.enabledHint":`기본은 꺼짐입니다. 켜면 선택한 일정(또는 지금 실행)에만 동작합니다.`,"storage.policy.threshold":`보관 용량이 초과하면 (GiB)`,"storage.policy.trigger":`트리거`,"storage.policy.target":`정리 목표`,"storage.policy.targetPercent":`가장 오래된 보관 제거 (%)`,"storage.policy.targetReduce":`보관 용량을 다음까지 줄이기 (GiB)`,"storage.policy.thresholdInc":`임계값 증가`,"storage.policy.thresholdDec":`임계값 감소`,"storage.policy.percentInc":`퍼센트 증가`,"storage.policy.percentDec":`퍼센트 감소`,"storage.policy.reduceInc":`축소 목표 증가`,"storage.policy.reduceDec":`축소 목표 감소`,"storage.policy.schedule":`일정`,"storage.policy.schedule.manual":`수동만`,"storage.policy.schedule.startup":`프록시 시작 시`,"storage.policy.schedule.daily":`매일`,"storage.policy.schedule.weekly":`매주`,"storage.policy.mode":`삭제 모드`,"storage.policy.mode.quarantine":`격리(기본)`,"storage.policy.mode.permanent":`영구 삭제`,"storage.policy.permanentWarn":`영구 모드는 되돌릴 수 없습니다. 확실하지 않으면 격리를 사용하세요.`,"storage.policy.lastRun":`마지막 실행`,"storage.policy.lastRunDetail":`{count}개 제거 · {size} 확보`,"storage.policy.nextRun":`다음 실행`,"storage.policy.never":`없음`,"storage.policy.save":`저장`,"storage.policy.runNow":`지금 실행`,"storage.policy.running":`실행 중…`,"storage.policy.saved":`정책을 저장했습니다.`,"storage.policy.skippedDisabled":`정책이 꺼져 있습니다 — 먼저 켜세요.`,"storage.policy.skippedUnder":`보관 용량이 임계값 미만입니다 — 할 일이 없습니다.`,"storage.policy.skippedEmpty":`목표에 맞는 보관 후보가 없습니다.`,"storage.policy.doneQuarantine":`정책이 파일 {count}개를 격리했습니다({size}).`,"storage.policy.donePermanent":`정책이 파일 {count}개를 영구 삭제했습니다({size}).`,"modal.back":`뒤로`,"modal.badge.oauth":`OAuth`,"modal.customProvider":`사용자 지정 프로바이더`,"replitGateway.title":`Replit 게이트웨이 동반`,"replitGateway.subtitle":`직접 배포한 Replit 게이트웨이에 연결하고 OpenAI Chat 및 Anthropic 페어 프로바이더를 함께 설치합니다.`,"replitGateway.companionNote":`이것은 사용자 지정 동반 워크플로이며, 정식 레지스트리 프리셋이 아닙니다.`,"replitGateway.originLabel":`배포 origin`,"replitGateway.originHint":`Replit 배포의 HTTPS origin(예: https://my-app.replit.app).`,"replitGateway.keyLabel":`게이트웨이 키`,"replitGateway.keyHint":`배포의 REPLIT_GATEWAY_KEY 시크릿입니다. 로컬 프로바이더 구성에 저장되며 게이트웨이 트래픽 인증에 사용됩니다.`,"replitGateway.keyTooShort":`게이트웨이 키가 너무 짧습니다(최소 32자).`,"replitGateway.keyTooLong":`게이트웨이 키는 512자 이하여야 합니다.`,"replitGateway.keyInvalidChars":`게이트웨이 키는 인쇄 가능한 ASCII 문자만 포함해야 합니다.`,"replitGateway.errorNetwork":`프록시에 연결할 수 없습니다. 실행 중인지 확인한 뒤 다시 시도하세요.`,"replitGateway.errorMalformed":`프록시가 잘못된 응답을 반환했습니다. 잠시 후 다시 시도하세요.`,"replitGateway.customDomainLabel":`사용자 지정 도메인 허용`,"replitGateway.customDomainHint":`게이트웨이가 .replit.app에 호스트되지 않은 경우에만 활성화하세요.`,"replitGateway.setDefaultLabel":`설치 후 replit을 기본 프로바이더로 설정`,"replitGateway.install":`페어 설치`,"replitGateway.installing":`설치 중…`,"replitGateway.close":`닫기`,"replitGateway.openButton":`Replit 게이트웨이…`,"replitGateway.replaceTitle":`기존 Replit 페어를 교체할까요?`,"replitGateway.replaceBody":`replit 및 replit-anthropic 프로바이더가 이미 있습니다. 교체하면 게이트웨이 origin과 키가 덮어쓰여지지만 오버레이는 유지됩니다.`,"replitGateway.replaceConfirm":`페어 교체`,"replitGateway.replaceCancel":`기존 유지`,"replitGateway.probeHealth":`healthz: HTTP {status} ({ms} ms)`,"replitGateway.probeModels":`models: {count}개 발견 ({ms} ms)`,"replitGateway.successTitle":`Replit 게이트웨이 페어를 설치했습니다.`,"replitGateway.errorGeneric":`Replit 게이트웨이 페어를 설치할 수 없습니다.`,"replitGateway.errorCollision":`Replit 프로바이더 페어가 이미 있습니다.`,"replitGateway.errorBusy":`구성이 사용 중입니다. 잠시 후 다시 시도하세요.`,"replitGateway.originRequired":`배포 origin은 필수입니다.`,"replitGateway.keyRequired":`게이트웨이 키는 필수입니다.`,"modal.failedStatus":`실패 ({status})`,"modal.loginError":`로그인 오류: {error}`,"modal.badge.codexLogin":`Codex 로그인`,"modal.badge.local":`로컬`,"modal.badge.apiKey":`API 키`,"modal.badge.direct":`Direct`,"modal.badge.pool":`풀`,"modal.badge.free":`무료`,"modal.invalidPreset":`내장 프로바이더 설정이 완전하지 않습니다. 프록시를 다시 시작한 뒤 재시도하세요.`,"modal.freeTierTitle":`무료 티어`,"modal.freeTierDefault":`API 키가 필요 없습니다. 바로 사용할 수 있습니다.`,"modal.tab.accounts":`계정`,"modal.tab.free":`무료`,"modal.tab.paid":`유료`,"modal.accountsHint":`여기서 ChatGPT/Codex, OAuth, API 키 계정에 로그인하세요. OpenAI는 기본 제공 — 다시 추가하지 말고 로그인하세요.`,"modal.accountsCodexAuthLink":`Codex 인증`,"modal.notListed":`찾는 프로바이더가 없나요? 직접 추가`,"modal.catalogLoading":`카탈로그 불러오는 중…`,"modal.catalogLoadFailed":`프로바이더 카탈로그를 불러올 수 없습니다.`,"modal.accountLogin":`로그인`,"modal.accountLogout":`로그아웃`,"modal.accountAdd":`계정 추가`,"modal.accountManage":`관리`,"modal.accountCodexPool":`ChatGPT 계정 풀`,"modal.accountLoggedIn":`로그인됨`,"modal.accountLoggedOut":`로그인 안 됨`,"quota.fiveHourLimit":`5시간 한도`,"quota.weeklyLimit":`주간 한도`,"quota.monthlyLimit":`30일 한도`,"quota.cursorFirstParty":`자사 모델`,"quota.cursorApiUsage":`API 사용량`,"quota.totalSubscriptionCredits":`전체 구독 크레딧`,"quota.creditsBalance":`크레딧 잔액`,"quota.creditsPeriodEnds":`청구 기간 종료: {date}`,"quota.usedPercent":`{pct}% 사용`,"quota.limitReached":`한도 도달`,"quota.resetsToday":`오늘 {time} 초기화`,"quota.resetsTomorrow":`내일 {time} 초기화`,"quota.resetsAt":`{when} 초기화`,"quota.resetsRelativeMinutes":`{n}분 후 초기화`,"quota.resetsRelativeHours":`{n}시간 후 초기화`,"pws.status.ready":`준비됨`,"pws.status.needsSetup":`설정 필요`,"pws.status.needsAttention":`확인 필요`,"pws.auth.chatgptPassthrough":`ChatGPT 패스스루`,"pws.auth.noKey":`키 불필요`,"pws.freeTitle":`무료 요금제 (키는 필요할 수 있음)`,"pws.localTitle":`로컬 런타임`,"pws.modelCountOne":`모델 1개`,"pws.modelCount":`모델 {count}개`,"pws.rail.suffixDefault":` · 기본`,"pws.rail.suffixLocal":` · 로컬`,"pws.rail.suffixFree":` · 무료`,"pws.rail.selectAria":`{name} 선택 — {status}{suffix}`,"pws.searchPlaceholder":`프로바이더 검색…`,"pws.filterAria":`프로바이더 필터`,"pws.providerFiltersAria":`프로바이더 필터`,"pws.filters":`필터`,"pws.filterStatus":`상태`,"pws.pricing":`요금`,"pws.paid":`유료`,"pws.filterType":`유형`,"pws.type.cloud":`클라우드`,"pws.type.local":`로컬`,"pws.type.selfHosted":`셀프 호스팅`,"pws.type.login":`로그인`,"pws.sort":`정렬`,"pws.sortProvidersAria":`프로바이더 정렬`,"pws.sort.az":`A–Z`,"pws.sort.za":`Z–A`,"pws.sort.freePaid":`무료 우선`,"pws.sort.paidFree":`유료 우선`,"pws.sort.accountsFirst":`계정 우선`,"pws.resetAll":`모두 초기화`,"pws.providerList":`프로바이더 목록`,"pws.providersAria":`프로바이더`,"pws.groupReady":`준비됨 ({count})`,"pws.groupNeedsSetup":`설정 필요 ({count})`,"pws.groupDisabled":`비활성화 ({count})`,"pws.noSearchResults":`검색과 일치하는 프로바이더가 없습니다.`,"pws.noMatchFilters":`필터와 일치하는 프로바이더가 없습니다.`,"pws.noProvidersConfigured":`설정된 프로바이더가 없습니다.`,"pws.workspaceMainAria":`프로바이더 상세`,"pws.detailComingSoon":`상세 보기는 준비 중입니다 — 클래식 보기에서 관리하세요.`,"pws.selectPrompt":`목록에서 프로바이더를 선택하세요.`,"pws.connectFirst":`첫 프로바이더를 연결하세요`,"pws.empty.browseFree":`무료 프로바이더 보기`,"pws.empty.browseFreeDesc":`구독 없이 시작`,"pws.empty.connectAccount":`계정 연결`,"pws.empty.connectAccountDesc":`ChatGPT 또는 프로바이더 로그인 사용`,"pws.empty.addEndpoint":`엔드포인트 추가`,"pws.empty.addEndpointDesc":`커스텀 base URL과 API 키`,"pws.tab.overview":`개요`,"pws.tab.models":`모델`,"pws.tab.usage":`사용량`,"pws.tab.accounts":`계정`,"pws.tab.settings":`설정`,"pws.connection":`연결`,"pws.status.connected":`연결됨`,"pws.attentionTitle":`확인 필요`,"pws.attention.reauth":`활성 계정 재인증이 필요합니다`,"pws.attention.reauthForward":`활성 Codex 계정 재인증이 필요합니다 — 계정에서 해결하세요`,"pws.attention.missingCredentials":`자격 증명 없음`,"pws.cell.auth":`인증`,"pws.cell.note":`메모`,"pws.cell.defaultModel":`기본 모델`,"pws.statsAria":`프로바이더 통계`,"pws.statsTitle":`통계`,"pws.stats.totalRequests":`요청 수 (30일)`,"pws.stats.totalTokens":`토큰 (30일)`,"pws.stats.quotaUpdated":`쿼터 갱신`,"pws.stats.quotaTracked":`사용량 탭에서 한도를 확인할 수 있습니다.`,"pws.stats.source":`출처`,"pws.usageLast30d":`사용량 (최근 30일)`,"pws.allAccounts":`모든 계정`,"pws.estimatedCost":`추정 비용`,"pws.costDisclaimer":`API 공시가 기준 추정치이며, 실제 청구 금액이 아닙니다.`,"pws.modelBreakdown":`모델별 사용량`,"pws.col.model":`모델`,"pws.col.cost":`추정 비용`,"pws.col.tokens":`토큰`,"pws.col.requests":`요청`,"pws.col.share":`점유율`,"pws.tokenInput":`입력`,"pws.tokenOutput":`출력`,"pws.metricRequests":`요청`,"pws.metricTokens":`토큰`,"pws.usageUnavailable":`아직 기록된 사용량이 없습니다.`,"pws.rateLimits":`요청 한도`,"pws.quotaUnavailable":`이 프로바이더의 쿼터 데이터가 없습니다.`,"pws.accountQuotaUnavailable":`요금 한도 데이터를 일시적으로 가져올 수 없습니다. 이전 값이 있으면 그대로 표시합니다.`,"pws.selected":`선택됨`,"pws.copyModelId":`ID 복사`,"pws.modelCopied":`복사됨!`,"pws.modelsAvailable":`{count}개 사용 가능`,"pws.modelSearchPlaceholder":`모델 필터…`,"pws.modelsLoading":`모델 불러오는 중…`,"pws.modelsLoadFailed":`모델을 불러오지 못했습니다.`,"pws.modelsNeedsReauth":`실시간 모델 목록을 받으려면 다시 로그인해야 합니다. 지금은 설정된 모델을 표시합니다.`,"pws.modelsConfiguredFallback":`설정된 모델을 표시합니다 (실시간 검색 불가).`,"pws.modelsTruncated":`{total}개 모델 중 처음 {shown}개를 표시합니다. 필터로 목록을 좁히세요.`,"pws.retry":`다시 시도`,"pws.noModels":`이 프로바이더에서 발견된 모델이 없습니다.`,"pws.noModelMatch":`필터와 일치하는 모델이 없습니다.`,"pws.adapterBaseRequired":`어댑터와 기본 URL은 필수입니다.`,"pws.addAccount":`계정 추가`,"pws.addKey":`API 키 추가`,"pws.apiKeys":`API 키`,"pws.authMode":`인증 방식`,"pws.availableAccounts":`사용 가능한 계정`,"pws.accountOrdinal":`계정 {count}`,"pws.accountsLoading":`계정 불러오는 중…`,"pws.accountsLoadFailed":`계정을 불러오지 못했습니다.`,"pws.retryAccounts":`다시 시도`,"pws.noAccounts":`연결된 계정이 아직 없습니다.`,"pws.cockpitImportDescription":`이 기기에서 Cockpit Tools Antigravity JSON 내보내기를 가져옵니다. 파일 내용은 표시되지 않습니다.`,"pws.cockpitImportFileLabel":`Cockpit Tools Antigravity JSON 내보내기`,"pws.cockpitImportChooseFile":`JSON 파일 선택`,"pws.cockpitImporting":`가져오는 중…`,"pws.cockpitImportInvalid":`선택한 파일은 유효한 JSON 내보내기가 아니거나 너무 큽니다.`,"pws.cockpitImportFailed":`계정 가져오기를 완료할 수 없습니다.`,"pws.cockpitImportComplete":`가져오기 완료: 가져옴 {imported}, 업데이트 {updated}, 실패 {failed}, 지원되지 않음 {unsupported}.`,"pws.accountSwitching":`전환 중…`,"pws.accountCurrent":`현재 계정`,"pws.defaultModelNone":`없음 (프로바이더 기본값 사용)`,"pws.discardSettings":`되돌리기`,"pws.jsonEditorDesc":`프로바이더 JSON 설정을 직접 편집합니다. 저장 즉시 반영됩니다.`,"pws.jsonEditorTitle":`JSON 편집기 — {name}`,"pws.jsonRestore":`복원`,"pws.jsonSave":`저장`,"pws.loggedInTitle":`로그인됨`,"pws.notLoggedInTitle":`로그인 필요`,"pws.note":`메모`,"pws.allowPrivateNetwork":`로컬/사설 네트워크 허용`,"pws.liveModels":`프로바이더에서 모델 검색`,"pws.liveModelsDesc":`프로바이더의 실시간 모델 카탈로그를 가져옵니다. 끄면 설정된 정적 모델만 사용합니다.`,"pws.xaiResponsesOptIn":`Grok 4.5와 4.6에 Responses API 사용`,"pws.xaiResponsesOptInDesc":`두 모델을 openai-responses로 라우팅합니다. 다른 Grok 모델과 티어 동작은 바뀌지 않습니다.`,"pws.xaiResponsesOptInMixed":`일부만 활성화됨.`,"pws.cursorTransport":`Cursor 전송`,"pws.cursorTransportHttp2":`HTTP/2 (기본값)`,"pws.cursorTransportHttp1":`HTTP/1.1 (프록시 호환)`,"pws.cursorTransportDesc":`프록시가 Cursor의 HTTP/2 스트림을 안정적으로 전달하지 못할 때 HTTP/1.1을 사용하세요.`,"pws.optionalPlaceholder":`선택사항`,"pws.providerId":`프로바이더 ID`,"pws.reauth":`재인증 필요`,"pws.reauthenticate":`재인증`,"pws.clearCooldown":`쿨다운 해제`,"pws.copyDoctor":`ocx doctor 복사`,"pws.doctorCopied":`복사됨`,"pws.healthCooldownHint":`쿨다운이 끝날 때까지 기다리세요. 지금은 이 계정을 프로브하지 마세요.`,"pws.doctorCopyUnavailable":`클립보드를 사용할 수 없음`,"pws.healthLabel.rateLimited":`요청 한도 초과`,"pws.healthLabel.quotaLimited":`할당량 제한`,"pws.healthLabel.reauthRequired":`재인증 필요`,"pws.healthLabel.refreshFailed":`새로고침 실패`,"pws.healthLabel.metadataMismatch":`메타데이터 불일치`,"pws.healthLabel.credentialConflict":`자격 증명 충돌`,"pws.healthSummary.rateLimited":`{provider} {account}: {until}까지 요청 한도 초과. 그전까지 이 계정 라우팅이 일시 중지됩니다.`,"pws.healthSummary.quotaLimited":`{provider} {account}: {until}까지 할당량 제한. 그전까지 이 계정 라우팅이 일시 중지됩니다.`,"pws.healthSummary.reauthRequired":`{provider} {account}: 재인증이 필요합니다.`,"pws.healthSummary.credentialConflict":`{provider} {account}: 자격 증명 충돌.`,"pws.healthSummary.metadataMismatch":`{provider} {account}: 메타데이터 불일치.`,"pws.healthSummary.staleCredentials":`{provider} {account}: 자격 증명이 불완전합니다.`,"pws.removeConfirm":`제거`,"pws.removeConfirmBody":`프로바이더 "{name}"을(를) 제거하시겠습니까? 되돌릴 수 없습니다.`,"pws.removeDefaultConfirmBody":`기본 프로바이더 "{name}"을(를) 제거하시겠습니까? "{defaultProvider}"이(가) 기본 프로바이더가 됩니다. 이 작업은 되돌릴 수 없습니다.`,"pws.removeConfirmTitle":`프로바이더 제거`,"pws.saveSettings":`저장`,"pws.pacingTitle":`요청 속도 조절`,"pws.pacingDesc":`이 프로바이더로 나가는 요청 시작을 일정 간격으로 지연합니다. 스트리밍 응답은 서로 겹칠 수 있습니다.`,"pws.pacingEnabled":`사용`,"pws.pacingRpm":`분당 요청 수`,"pws.pacingRpmUnit":`RPM`,"pws.pacingDelay":`최소 시작 간격(ms)`,"pws.pacingJitter":`무작위 지터(ms)`,"pws.pacingSlowerWins":`프로바이더의 더 느린 제한이 우선합니다. 모델별 설정은 지연을 더 늘릴 때만 적용됩니다.`,"pws.pacingQueued":`대기 중`,"pws.pacingNextSlot":`다음 슬롯까지`,"pws.pacingLastModel":`마지막 모델`,"pws.pacingNone":`없음`,"pws.pacingModelOverrides":`모델별 설정`,"pws.pacingModel":`모델`,"pws.pacingAdd":`모델 제한 추가`,"pws.pacingRemove":`제거`,"pws.pacingRemoveModel":`{model} 모델의 요청 속도 설정 제거`,"pws.pacingRuleRequired":`프로바이더 제한이나 모델별 제한을 하나 이상 설정한 뒤 요청 속도 조절을 켜세요.`,"pws.antigravityTlsTitle":`Antigravity 브라우저 TLS 프로필`,"pws.antigravityTlsEnable":`실험적 TLS/HTTP2 에뮬레이션 사용`,"pws.antigravityTlsWarning":`비공식 호환 기능입니다. 서비스 약관 준수나 정지를 보장하지 않으며 트래픽을 더 식별하기 쉽게 만들 수 있고 초기화 실패 시 Bun으로 대체됩니다. 공식 Gemini API 키, Vertex 또는 문서화된 Code Assist 경로가 더 안전합니다.`,"pws.antigravityTlsConfirm":`실험적이고 비공식적인 Antigravity TLS 프로필을 사용하시겠습니까? 정책 준수나 정지 방지는 보장되지 않습니다. 계속할까요?`,"pws.antigravityTlsStatus":`TLS 프로필 상태: {status}`,"pws.antigravityTlsDisabled":`사용 안 함`,"pws.antigravityTlsActive":`활성`,"pws.antigravityTlsFallback":`대체 사용`,"pws.saving":`저장 중…`,"pws.settingsSaved":`설정이 저장되었습니다.`,"pws.accountModeSaved":`계정 모드가 저장되었습니다.`,"pws.accountModeFailed":`계정 모드를 전환할 수 없습니다.`,"pws.accountModeConfirm":`OpenAI 계정 모드를 전환할까요? 실행 중인 대화가 다른 모드의 계정 세트로 다시 연결되며, 할당량 사용량은 새 모드로 집계됩니다.`,"pws.settingsUnsavedBar":`저장하지 않은 변경사항이 있습니다.`,"pws.unsavedLeaveBody":`저장하지 않은 변경사항이 있습니다. 나가기 전에 저장하시겠습니까?`,"pws.unsavedLeaveTitle":`미저장 변경사항`,"pws.attentionRequired":`주의 필요`,"pws.attentionAria":`{name}: {reason}`,"pws.missingCredentials":`자격 증명 없음`,"pws.editJsonDesc":`프록시 설정을 JSON으로 편집`,"pws.updatesUnavailable":`프로바이더 업데이트를 사용할 수 없습니다.`,"pws.dashboard.title":`프로바이더 개요`,"pws.dashboard.subtitle":`모든 모델 프로바이더를 한곳에서 관리합니다.`,"pws.dashboard.rateLimits":`사용량 제한`,"pws.capacity.estimate":`설정 가중치 기반 풀 추정치`,"pws.capacity.currentAccount":`현재 유효 계정`,"pws.capacity.nextRecovery":`다음 용량 회복`,"pws.capacity.recoveryShare":`+{percent}% 풀 용량`,"pws.capacity.incomplete":`불완전한 범위: {excluded}개 계정 제외, 알 수 없는 요금제 {unknown}개 포함`,"pws.capacity.partial":`일부 기간의 범위가 불완전합니다: {count}개 계정에서 표시된 모든 한도 기간을 확인할 수 없습니다`,"pws.capacity.windowPartial":`일부만`,"pws.capacity.windowPartialA11y":`{window}: 계정 범위가 불완전합니다`,"pws.dashboard.recentlyUsed":`최근 사용`,"pws.dashboard.requests":`{count}건 요청`,"pws.dashboard.checkedAgo":`{time} 전 확인`,"pws.dashboard.noQuota":`할당량 데이터 없음`,"pws.dashboard.noUsage":`아직 사용 데이터 없음`,"pws.dashboard.noRateLimits":`아직 한도 데이터 없음`,"pws.allProviders":`프로바이더 개요`,"pws.enabledLabel":`활성화`,"pws.testConnection":`연결 테스트`,"pws.testing":`테스트 중…`,"pws.connectionOk":`연결 성공`,"pws.connectionFailed":`연결 실패`,"pws.connectionNotApplicable":`해당 없음 — 이 프로바이더는 정적 모델 카탈로그를 사용합니다.`,"pws.editSettings":`설정 편집`,"pws.viewUsage":`사용량 상세 보기`,"pws.allSystemsOk":`모든 시스템 정상`,"pws.apiKeyConfigured":`API 키 설정됨`,"pws.addApiKey":`API 키 추가`,"pws.loggedInAs":`{email}으로 로그인됨`,"pws.notLoggedIn":`로그인되지 않음`,"pws.passthrough":`Codex 패스스루`,"pws.notes":`메모`,"pws.notePlaceholder":`이 프로바이더에 대한 메모를 추가하세요...`,"pws.noteSaved":`메모 저장됨`,"pws.authSummary":`인증`,"pws.aiStudio":`AI Studio`,"pws.aiStudio.connected":`연결됨`,"pws.aiStudio.checking":`세션 확인 중`,"pws.aiStudio.unsupported":`이 플랫폼에서는 네이티브 로그인을 지원하지 않습니다`,"pws.aiStudio.needsReauth":`재인증이 필요합니다`,"pws.aiStudio.reauthenticated":`재인증에 성공했습니다`,"pws.aiStudio.loginFailed":`네이티브 로그인에 실패했습니다`,"pws.aiStudio.connect":`연결`,"time.justNow":`방금 전`,"time.notChecked":`확인 안 됨`,"time.minutesAgo":`{n}분 전`,"time.hoursAgo":`{n}시간 전`,"time.daysAgo":`{n}일 전`,"modal.noMatch":`일치 항목 없음.`,"modal.oauthDefaultNote":`계정으로 로그인 — API 키 불필요.`,"modal.oauthComingSoon":`{label} OAuth 로그인은 다음 업데이트에 제공됩니다. 지금은 API 키를 사용하세요.`,"modal.oauthComingSoonShort":`이 프로바이더의 OAuth 로그인은 다음 업데이트에 제공됩니다 — 지금은 API 키를 사용하세요.`,"modal.useApiKeyInstead":`대신 API 키 사용`,"modal.setupGuide":`설정 안내`,"modal.setupStep1Prefix":`다음으로 이동:`,"modal.setupDashboardLink":`{label} 대시보드`,"modal.setupStep1Suffix":`에서 API 키를 복사하세요`,"modal.setupStep2":`아래 API 키 필드에 붙여넣으세요`,"modal.setupStep3":`프로바이더 추가를 클릭하세요 — 모델은 자동으로 검색됩니다`,"modal.namePlaceholder":`예: openrouter`,"modal.duplicateWarn":`프로바이더 "{name}"이(가) 이미 있어 덮어씁니다.`,"modal.forwardHintPrefix":`키 불필요 — 프록시가`,"modal.forwardCredentials":`codex login`,"modal.forwardHintSuffix":`자격 증명을 이 프로바이더로 전달합니다.`,"modal.localHint":`API 키는 저장되지 않습니다. Cursor의 공개 모델 카탈로그만 Codex에 추가되며, live Cursor 전송과 네이티브 파일/셸 실행은 검토 전까지 비활성입니다.`,"modal.getApiKey":`{label} API 키 받기`,"modal.apiKey":`API 키`,"modal.apiKeyTransport":`API 키 헤더`,"modal.apiKeyTransportNative":`x-api-key (Anthropic 기본)`,"modal.apiKeyTransportBearer":`Authorization: Bearer`,"modal.apiKeyPlaceholder":`sk-… (또는 $ENV_VAR)`,"modal.defaultModelPlaceholder":`예: gpt-5.5`,"modal.baseUrlPlaceholder":`https://...`,"modal.baseUrlPlaceholderError":`Base URL에 해결되지 않은 {placeholder}가 있습니다. 실제 값으로 교체하세요.`,"modal.baseUrlPlaceholderHint":`추가하기 전에 Base URL의 {placeholder}를 실제 Account ID로 교체하세요.`,"modal.adding":`추가 중…`,"modal.useOauthLogin":`← OAuth 로그인 사용`,"codexAuth.addIdPlaceholder":`codex-work, codex-alt, team…`,"codexAuth.resetCreditsAria":`리셋 크레딧 {count}개`,"claude.pageTitle":`Claude Code`,"claude.workspace.settings":`설정`,"cws.loading":`콤보 불러오는 중…`,"cws.loadFailed":`콤보를 불러오지 못했습니다.`,"cws.saveFailed":`콤보를 저장하지 못했습니다.`,"cws.removeFailed":`콤보를 삭제하지 못했습니다.`,"cws.saved":`콤보를 저장했습니다.`,"cws.created":`{model}을(를) 만들었습니다.`,"cws.removed":`combo/{id}을(를) 삭제했습니다.`,"cws.renamed":`{from}을(를) {to}(으)로 이름을 변경했습니다.`,"cws.add":`콤보 추가`,"cws.addTitle":`콤보 추가`,"cws.addSubtitle":`여러 프로바이더를 사용하는 가상 모델을 만들고 클라이언트가 요청할 정확한 모델 이름을 선택하세요.`,"cws.create":`콤보 만들기`,"cws.railAria":`콤보 목록`,"cws.searchPlaceholder":`콤보 또는 대상 검색…`,"cws.noSearchResults":`검색과 일치하는 콤보가 없습니다.`,"cws.group.failover":`장애 조치`,"cws.group.roundRobin":`라운드로빈`,"cws.targetCount":`대상 {count}개`,"cws.targetCountOne":`대상 1개`,"cws.overviewTitle":`콤보`,"cws.overviewBlurb":`프로바이더/모델 대상 사이에서 장애 조치하거나 결정적 Smooth Weighted 라운드로빈을 사용하는 가상 모델입니다.`,"cws.count.total":`전체`,"cws.count.failover":`장애 조치`,"cws.count.roundRobin":`라운드로빈`,"cws.howTitle":`동작 방식`,"cws.howBody":`Codex에서 콤보의 공개 모델 이름을 요청하세요. 설정하지 않으면 combo/<id>가 기본값입니다. OpenCodex는 재시도 가능한 업스트림 오류에서만 다음 대상으로 넘깁니다. 사용 가능한 대상이 없으면 전역 기본 프로바이더로 우회하지 않고 요청을 실패 처리합니다.`,"cws.attentionTitle":`확인 필요`,"cws.attention.empty":`구성된 대상 없음`,"cws.attention.few":`대상이 하나뿐 — 장애 조치할 곳이 없음`,"cws.attention.catalogOmitted":`모델 카탈로그에 없음 — 멤버 능력이 불완전하거나 호환되지 않음(context window/메타데이터 부족 또는 modality 교집합이 비어 있음). 별칭 라우팅은 계속 동작`,"cws.attention.allTargetsExhausted":`활성화된 모든 대상의 할당량이 소진됨`,"cws.emptyTitle":`첫 콤보 만들기`,"cws.empty.createDesc":`가상 모델 이름을 정하고 백엔드를 둘 이상 연결하세요.`,"cws.backToAll":`모든 콤보로`,"cws.allCombos":`모든 콤보`,"cws.copyModel":`ID 복사`,"cws.copied":`복사됨`,"cws.tabsLabel":`콤보 상세 섹션`,"cws.tab.config":`설정`,"cws.tab.about":`정보`,"cws.strategy":`전략`,"cws.strategy.failover":`장애 조치`,"cws.strategy.roundRobin":`라운드로빈`,"cws.strategy.failoverHint":`대상을 순서대로 시도합니다. 재시도 가능한 오류(한도, 장애, 구독 게이트)면 다음으로 넘어갑니다.`,"cws.strategy.roundRobinHint":`가중치에 따라 트래픽을 결정적으로 분배합니다. 선택된 대상을 성공 요청 묶음 동안 유지한 뒤 다음 대상으로 진행합니다.`,"cws.field.id":`콤보 ID`,"cws.field.idHintEdit":`ID를 변경하면 콤보 이름이 바뀝니다. 클라이언트는 {model}을(를) 요청합니다.`,"cws.field.alias":`공개 모델 이름`,"cws.field.aliasPlaceholder":`deepseek-v4-flash 또는 vendor/model`,"cws.field.aliasHint":`선택 사항입니다. 접두사 없는 이름, vendor/model 같은 사용자 지정 접두사를 사용하거나 비워 두어 combo/<id>를 사용할 수 있습니다.`,"cws.field.nativeAlias":`네이티브 OpenAI 별칭`,"cws.field.nativeAliasHint":`이 콤보가 지원되는 비수식 OpenAI 네이티브 모델 ID를 사용합니다. 계정/프로바이더 수식 OpenAI 경로는 별도로 유지됩니다.`,"cws.field.displayName":`표시 이름`,"cws.field.displayNameHint":`모델 선택기에 표시할 이름입니다. 네이티브 OpenAI 별칭을 사용할 때 필수입니다.`,"cws.field.idHint":`클라이언트는 {model}을(를) 요청합니다`,"cws.field.idInternalHint":`내부 콤보 ID입니다. 생성 후에도 변경할 수 있습니다.`,"cws.field.stickyLimit":`회전 전 sticky 성공 횟수`,"cws.field.stickyLimitHint":`가중 선택기가 다음 대상으로 진행하기 전에 선택된 대상을 이 성공 요청 횟수만큼 유지합니다.`,"cws.field.defaultEffort":`기본 추론 수준`,"cws.field.defaultEffortNone":`없음 (대상 기본값)`,"cws.field.defaultEffortHint":`클라이언트가 추론 수준을 생략한 경우에만 사용합니다. 옵션은 선택한 대상이 광고하는 수준의 교집합입니다.`,"cws.capability.imageInputUnavailable":`선택한 모든 대상이 이미지 입력을 지원해야 사용할 수 있습니다.`,"cws.capability.imageInputHint":`모든 대상이 이미지를 지원하면 기본으로 켜집니다. 끄면 텍스트만 허용합니다.`,"cws.capability.imageInput":`이미지 / 멀티모달`,"cws.capabilities":`기능`,"cws.field.defaultEffortUnsupported":`이 수준은 대상의 공통 사다리에 없습니다 — 요청 시 무시되거나 스냅됩니다.`,"cws.field.defaultEffortUnsupportedOption":`교집합에 없음`,"cws.targets":`대상`,"cws.targets.failoverHint":`순서가 중요합니다 — 첫 번째가 기본입니다.`,"cws.targets.roundRobinHint":`가중치는 결정적 상대 선택을 제어하고, 순서는 회전 고리의 동률을 결정합니다.`,"cws.target.provider":`프로바이더`,"cws.target.model":`모델`,"cws.target.weight":`가중치`,"cws.target.pickProvider":`프로바이더 선택…`,"cws.target.pickProviderFirst":`먼저 프로바이더를 선택하세요…`,"cws.target.pickModel":`모델 선택…`,"cws.target.noModels":`이 프로바이더에 모델 없음`,"cws.target.modelPlaceholder":`모델 ID`,"cws.target.add":`대상 추가`,"cws.target.drag":`드래그하여 순서 변경`,"cws.target.moveUp":`위로`,"cws.target.moveDown":`아래로`,"cws.quota.available":`사용 가능`,"cws.quota.exhausted":`할당량 소진`,"cws.quota.unknown":`할당량 알 수 없음`,"cws.quota.allExhausted":`활성화된 모든 대상의 할당량이 소진되었습니다. 다른 대상을 선택하거나 할당량이 복구될 때까지 기다리세요.`,"cws.aboutTitle":`런타임`,"cws.aboutBody":`실패한 대상은 Retry-After를 반영해 잠시 쿨다운됩니다. 잘못된 요청과 컨텍스트 오류는 다음 대상으로 넘기지 않습니다. 각 대상은 자체 기능에 맞게 추론 수준을 조정하며, 모든 대상 소진 시 우회 없이 실패합니다. 로그와 사용량에는 순서가 있는 실제 시도와 시도별 사용량이 남습니다.`,"cws.removeConfirmTitle":`{model}을(를) 삭제할까요?`,"cws.removeConfirmDesc":`설정과 Codex 카탈로그에서 가상 모델만 제거합니다. 프로바이더는 삭제되지 않습니다.`,"cws.unsavedTitle":`저장되지 않은 변경`,"cws.unsavedDesc":`이 콤보의 편집을 버리고 계속할까요?`,"cws.keepEditing":`계속 편집`,"cws.err.missingId":`콤보 ID가 필요합니다.`,"cws.err.invalidId":`ID는 문자/숫자로 시작하고 문자·숫자·점·밑줄·하이픈만 사용할 수 있습니다(최대 64).`,"cws.err.duplicateId":`같은 ID의 콤보가 이미 있습니다.`,"cws.err.invalidAlias":`별칭은 문자·숫자·점·밑줄·하이픈만 사용할 수 있으며 "/" 구분은 최대 한 번만 허용됩니다.`,"cws.err.aliasReservedNamespace":`별칭은 예약된 "combo/" 네임스페이스를 사용할 수 없습니다.`,"cws.err.aliasNativeFamily":`OpenAI 네이티브 계열(gpt-*, o1-*, o3-*, o4-*, codex-*)의 접두사 없는 별칭은 허용되지 않습니다.`,"cws.err.unsupportedNativeAlias":`네이티브 별칭은 현재 지원되는 OpenAI bare model id 중 하나여야 합니다.`,"cws.err.missingNativeAliasDisplayName":`네이티브 별칭에는 표시 이름이 필요합니다.`,"cws.err.invalidDisplayName":`표시 이름은 128자 이하여야 하며 제어 문자를 포함할 수 없습니다.`,"cws.err.duplicateAlias":`다른 콤보가 이미 이 별칭을 사용하고 있습니다.`,"cws.err.noTargets":`대상을 하나 이상 추가하세요.`,"cws.err.incompleteTarget":`각 대상에 프로바이더와 모델이 필요합니다.`,"cws.target.disabled":`{name} (비활성화됨)`,"cws.err.reservedNamespace":`콤보를 만들기 전에 combo라는 실제 프로바이더의 이름을 변경하세요.`,"cws.err.providerCollision":`콤보 ID가 설정된 프로바이더 이름과 충돌합니다.`,"cws.err.unknownProvider":`각 대상은 설정된 프로바이더를 사용해야 합니다.`,"cws.err.duplicateTarget":`같은 프로바이더/모델 대상은 한 번만 추가할 수 있습니다.`,"cws.err.invalidStickyLimit":`sticky 성공 횟수는 1~100의 정수여야 합니다.`,"cws.err.invalidWeight":`각 라운드로빈 가중치는 1~10000의 정수여야 합니다.`,"cws.err.noEnabledTarget":`하나 이상의 대상이 활성화된 프로바이더를 사용해야 합니다.`,"claude.tabsLabel":`Claude 클라이언트`,"claude.tabCode":`Code`,"claude.tabDesktop":`Desktop`,"claudeDesktop.title":`Claude Desktop`,"claudeDesktop.subtitle":`각 Claude 모델 패밀리를 포트 {port}의 사용 가능한 모델로 연결합니다.`,"claudeDesktop.importJson":`JSON 가져오기`,"claudeDesktop.exportJson":`JSON 내보내기`,"claudeDesktop.loading":`Claude Desktop 프로필을 불러오는 중…`,"claudeDesktop.loadFail":`Claude Desktop 프로필을 불러오지 못했습니다.`,"claudeDesktop.retry":`다시 시도`,"claudeDesktop.saveFailed":`Claude Desktop 프로필을 저장하지 못했습니다.`,"claudeDesktop.applyFailed":`프로필은 저장했지만 적용하지 못했습니다.`,"claudeDesktop.updateFailed":`Claude Desktop 업데이트에 실패했습니다.`,"claudeDesktop.savedApplied":`프로필을 저장하고 Claude Desktop에 적용했습니다.`,"claudeDesktop.appliedMarkerUnsaved":`Claude Desktop에는 적용했지만 적용 표시를 저장하지 못했습니다. 다시 적용하기 전까지 아래 저장/적용 상태가 실제와 다르게 보일 수 있습니다.`,"claudeDesktop.savedAppliedAnnounce":`Claude Desktop 프로필 저장과 적용을 마쳤습니다.`,"claudeDesktop.saved":`프로필을 저장했습니다.`,"claudeDesktop.savedAnnounce":`Claude Desktop 프로필을 저장했습니다.`,"claudeDesktop.exported":`프로필을 JSON으로 내보냈습니다.`,"claudeDesktop.importExpected":`버전 1 Claude Desktop 프로필이 필요합니다.`,"claudeDesktop.importReady":`JSON을 가져왔습니다. 초안을 검토한 뒤 저장하고 적용하세요.`,"claudeDesktop.importedAnnounce":`프로필 JSON을 가져왔습니다. 저장하지 않은 변경 사항을 검토할 수 있습니다.`,"claudeDesktop.importInvalid":`선택한 파일은 올바른 프로필이 아닙니다.`,"claudeDesktop.importFailed":`가져오기에 실패했습니다. {error}`,"claudeDesktop.moved":`{route} 모델을 {family}(으)로 옮겼습니다.`,"claudeDesktop.unsaved":`저장하지 않은 변경 사항`,"claudeDesktop.upToDate":`프로필이 최신 상태입니다`,"claudeDesktop.saving":`저장 중…`,"claudeDesktop.applying":`적용 중…`,"claudeDesktop.saveApply":`저장 및 적용`,"claudeDesktop.emptyTitle":`사용 가능한 모델이 없습니다`,"claudeDesktop.emptyHint":`프로바이더를 추가하거나 활성화한 뒤 Claude Desktop 경로를 할당하세요.`,"claudeDesktop.assignmentsLabel":`Claude 모델 패밀리 할당`,"claudeDesktop.family.opus":`Opus`,"claudeDesktop.family.fable":`Fable`,"claudeDesktop.family.sonnet":`Sonnet`,"claudeDesktop.family.haiku":`Haiku`,"claudeDesktop.modelCountOne":`모델 {count}개`,"claudeDesktop.modelCountMany":`모델 {count}개`,"claudeDesktop.chooseDefault":`기본 모델 선택`,"claudeDesktop.temporaryDefault":`임시 기본 모델`,"claudeDesktop.laneEmpty":`모델을 여기에 놓거나 이동 컨트롤을 사용하세요.`,"claudeDesktop.laneNoMatch":`검색어와 일치하는 모델이 이 계열에 없습니다.`,"nav.grok":`Grok`,"grok.title":`Grok Build`,"grok.subtitle":`opencodex가 Grok 설정에 등록한 모델입니다.`,"grok.loading":`Grok 상태를 불러오는 중…`,"grok.loadFail":`Grok 설정을 읽지 못했습니다.`,"grok.notConfiguredTitle":`Grok Build가 연결되지 않았습니다`,"grok.notConfiguredHint":`Grok을 설치한 뒤 프록시를 다시 시작하면 opencodex가 관리 블록을 다음 위치에 씁니다:`,"grok.endpoint":`엔드포인트`,"grok.colModel":`모델`,"grok.colAlias":`Grok 별칭`,"grok.colContext":`컨텍스트`,"grok.groupNative":`네이티브 모델`,"grok.groupRouted":`라우팅 모델`,"grok.enabledCount":`{total}개 중 {on}개 등록됨`,"grok.saved":`선택을 저장했습니다.`,"grok.savedApplied":`선택을 저장하고 Grok 설정에 반영했습니다.`,"grok.saveFailed":`Grok 선택을 저장하지 못했습니다.`,"grok.applyFailed":`선택은 저장했지만 Grok 설정을 갱신하지 못했습니다.`,"grok.applySkipped":`선택은 저장했지만 Grok 설정은 바뀌지 않았습니다.`,"grok.saveApply":`저장 및 적용`,"grok.saving":`저장 중…`,"grok.applying":`적용 중…`,"grok.unsaved":`저장되지 않은 변경`,"grok.upToDate":`선택이 최신 상태입니다`,"grok.toggleModel":`{id} 모델을 Grok에 등록`,"claudeDesktop.available":`사용 가능`,"claudeDesktop.defaultBadge":`기본`,"claudeDesktop.supports1m":`1M`,"claudeDesktop.unavailable":`사용 불가`,"claudeDesktop.contextM":`컨텍스트 {n}M`,"claudeDesktop.contextK":`컨텍스트 {n}k`,"claudeDesktop.contextUnknown":`컨텍스트 불명`,"claudeDesktop.alias":`별칭`,"claudeDesktop.useAsDefault":`{family} 기본 모델로 사용`,"claudeDesktop.moveTo":`이동 위치`,"claudeDesktop.move":`이동`,"claudeDesktop.status.applied":`Desktop에 적용됨`,"claudeDesktop.status.stale":`설정 변경됨 — 재적용 필요`,"claudeDesktop.status.notApplied":`미적용`,"claudeDesktop.status.notActiveProfile":`Desktop이 다른 프로필을 사용 중 — 재적용 필요`,"claudeDesktop.status.disabled":`Claude Desktop 통합이 꺼져 있습니다. 켠 뒤 Desktop을 완전히 종료하고 다시 여세요.`,"claudeDesktop.enableApply":`켜고 적용`,"claudeDesktop.health.lastRequest":`마지막 요청`,"claudeDesktop.health.stats":`{count} 요청 / {errors} 에러`,"claudeDesktop.effort.supported":`effort`,"claudeDesktop.effort.displayOnly":`effort (표시만)`,"lab.title":`Compatibility Lab`,"lab.subtitle":`Read-only compatibility verdict matrix from lab projection evidence.`,"lab.loadFailed":`Could not load compatibility lab data`,"lab.projectionUnavailable":`Lab projection is not available. Run conformance or live probes first.`,"lab.projectionIncompatible":`Lab projection schema is incompatible. Rebuild the projection.`,"lab.statusTitle":`Projection status`,"lab.matrixTitle":`Compatibility matrix`,"lab.verdictsTitle":`Verdict records`,"lab.filter.layer":`Evidence layer`,"lab.filter.verdict":`Verdict`,"lab.filter.subject":`Subject ID`,"lab.filter.all":`All`,"lab.col.subject":`Subject`,"lab.col.layer":`Layer`,"lab.col.suite":`Suite`,"lab.col.verdict":`Verdict`,"lab.col.asOf":`As of`,"lab.col.protocol":`Protocol conformance`,"lab.col.live":`Live route compatibility`,"lab.col.task":`Task effectiveness`,"lab.empty":`No compatibility verdicts in the projection yet.`,"lab.subjectKind":`Kind`,"lab.observationCount":`Observations`,"lab.eventCount":`Events`,"lab.verdictCount":`Verdicts`,"lab.subjectCount":`Subjects`,"lab.builtAt":`Built`,"lab.loading":`Loading compatibility evidence…`,"lab.loadMore":`Load more`,"lab.detailTitle":`Verdict detail`,"lab.detailClose":`Close`,"lab.detailSubject":`Subject`,"lab.detailObservations":`Observations`,"lab.detailEvents":`Contributing events`,"lab.detailArtifacts":`Artifact metadata`,"lab.production.title":`관측된 프로덕션 트래픽`,"lab.production.notVerification":`랩 검증 아님`,"lab.production.attempts":`시도`,"lab.production.successes":`성공`,"lab.production.routeErrors":`라우팅 오류`,"lab.production.lastObserved":`마지막 관측`,"lab.detailLoadFailed":`Could not load verdict detail`,"lab.refresh":`Refresh`,"lab.verdict.UNKNOWN":`Unknown`,"lab.verdict.CLAIMED":`Claimed`,"lab.verdict.PROBED":`Probed`,"lab.verdict.VERIFIED":`Verified`,"lab.verdict.DEGRADED":`Degraded`,"lab.verdict.BLOCKED":`Blocked`,"lab.verdict.UNSUPPORTED":`Unsupported`,"lab.layer.protocol_conformance":`Protocol conformance`,"lab.layer.live_route_compatibility":`Live route compatibility`,"lab.layer.task_effectiveness":`Task effectiveness`,"dash.visionAdvanced":`고급 설정`,"dash.visionMaxDescriptions":`턴당 최대 설명 수`,"dash.visionMaxDescriptionsInvalid":`양의 정수를 입력하세요.`,"dash.visionTimeout":`제한 시간`,"dash.visionTimeoutInvalid":`{min}에서 {max} 밀리초 사이의 정수를 입력하세요.`,"dash.visionAdvancedPopover":`고급 비전 설정`,"sub.routedDelegationBridge":`라우팅된 V2 위임 브리지`,"sub.routedDelegationBridgeHint":`실험 기능입니다. 활성화 중에는 생성, 전송, 후속 메시지가 네이티브 간 위임을 포함해 평문입니다. Codex에는 원래 모델이 표시될 수 있으며, 라우팅된 내용과 개인정보 보호는 선택한 제공업체를 따릅니다.`,"sub.routedDelegationBridgeInactive":`설정됨: 적격 네이티브 V2 루트에서만 활성화됩니다.`,"sub.routedDelegationBridgeSaveFail":`라우팅된 V2 위임 브리지를 저장하지 못했습니다`,"sub.routedDelegationBridgeSaved":`라우팅된 V2 위임 브리지를 저장했습니다. 비활성화는 즉시 적용됩니다.`,"models.newPolicyGlobal":`새 모델을 비활성화 상태로 추가`,"models.newPolicyProvider":`새 모델 정책`,"models.newPolicy_inherit":`상속`,"models.newPolicy_off":`끔`,"models.newPolicy_on":`켬`,"models.newBadge":`신규`,"models.newCount":`신규 {count}개, 꺼짐`,"models.aliases":`별칭`,"models.aliasesTable":`별칭 표`,"models.aliasPrompt":`공급자 별칭 (비우면 해제)`,"models.modelAliasPrompt":`모델 별칭 (비우면 해제)`,"models.aliasSaved":`별칭을 저장했습니다`,"models.aliasConflict":`이 별칭은 기존 이름과 충돌합니다`,"models.editProviderAlias":`공급자 별칭 편집`,"models.editModelAlias":`모델 별칭 편집`,"models.useDefaultAliases":`기본 별칭 사용`,"models.useDefaultAliasesGlobal":`기본 별칭을 전체에 사용`,"models.aliasAuto":`자동`,"models.aliasUser":`사용자`,"models.aliasStale":`오래됨`},v={"nav.dashboard":`仪表盘`,"uptime.day":`天`,"uptime.hour":`小时`,"uptime.minute":`分钟`,"uptime.second":`秒`,"nav.startup":`启动安全`,"nav.providers":`提供方`,"nav.models":`模型`,"nav.combos":`组合`,"nav.subagents":`子代理`,"routing.title":`路由智能 (beta)`,"routing.subtitle":`策略配置文件、试运行评估以及基于来源的路由分析。`,"routing.loadFailed":`无法加载路由数据`,"routing.empty":"未配置路由策略。请在 config.json 中添加 `routingProfiles`。","routing.revision":`rev`,"routing.detail":`配置文件`,"routing.createProfile":`创建配置文件`,"routing.dryRunError":`试运行失败 (HTTP {status})`,"routing.removeConfirm":`删除配置文件 {id}?`,"routing.unknownEvidence.allow":`允许`,"routing.unknownEvidence.penalize":`惩罚`,"routing.unknownEvidence.exclude":`排除`,"routing.removeCandidate":`移除候选 {provider}/{model}`,"routing.candidates":`候选`,"routing.require":`硬性要求`,"routing.optimize":`优化权重`,"routing.limits":`限制`,"routing.unknownEvidence":`未知证据策略`,"routing.compatibility.title":`兼容性策略`,"routing.compatibility.enabled":`要求 Compatibility Lab 证据`,"routing.compatibility.requiredSuites":`必需套件`,"routing.compatibility.loadingCatalog":`正在加载 Lab 目录…`,"routing.compatibility.catalogUnavailable":`Lab 目录不可用 — 请在 config.json 中手动输入套件 ID。`,"routing.compatibility.layer.protocol_conformance":`协议一致性`,"routing.compatibility.layer.live_route_compatibility":`实时路由兼容性`,"routing.compatibility.minStatus":`最低兼容性状态`,"routing.none":`无`,"routing.unavailable":`–`,"routing.dryRun":`试运行评估`,"routing.dryRunContext":`请求上下文窗口(令牌)`,"routing.dryRunTools":`请求需要工具`,"routing.dryRunImage":`请求需要图像输入`,"routing.dryRunStructured":`请求需要结构化输出`,"routing.dryRunRun":`评估候选`,"routing.candidate":`候选`,"routing.eligible":`合格`,"routing.exclusions":`排除项`,"routing.costCap":`成本上限`,"routing.capOutcome.satisfied":`未超限`,"routing.capOutcome.exceeded":`已超限`,"routing.capOutcome.unknown-allowed":`未知(允许)`,"routing.capOutcome.unknown-excluded":`未知(排除)`,"routing.exclusion.capability-unsatisfied":`能力未满足`,"routing.exclusion.unknown-capability":`能力未知`,"routing.exclusion.cost-limit":`超出成本上限`,"routing.exclusion.cost-limit-unknown":`无法确认成本是否在上限内`,"routing.exclusion.cooldown":`冷却中`,"routing.exclusion.unknown-health":`健康状态未知`,"routing.exclusion.unknown-quota":`配额未知`,"routing.exclusion.unknown-price":`价格未知`,"routing.exclusion.other":`排除项:{code}`,"routing.score":`分数`,"routing.selected":`已选择`,"routing.yes":`是`,"routing.no":`否`,"routing.analytics":`路由分析`,"routing.analyticsTotal":`请求`,"routing.analyticsSuccessRate":`成功率`,"routing.analyticsFallbackRate":`回退`,"routing.analyticsP50":`p50`,"routing.analyticsP95":`p95`,"routing.analyticsP99":`p99`,"routing.analyticsCooldown":`冷却失败`,"routing.analyticsConfidence":`置信度`,"routing.analyticsTruncated":`历史已截断`,"routing.analyticsRequests":`请求`,"routing.analyticsEmpty":`暂无分析 — 请先发送一些请求。`,"nav.logs":`日志与调试`,"nav.usage":`用量`,"common.github":`GitHub`,"sidebar.star":`在 GitHub 上加星`,"sidebar.starred":`已在 GitHub 加星`,"sidebar.starUnauthenticated":`打开 GitHub 加星(gh CLI 未登录)`,"sidebar.starFailed":`无法通过 gh 加星,改为打开 GitHub。`,"sidebar.updateAvailable":`有可用更新:{version}`,"sidebar.checkUpdate":`检查更新`,"common.save":`保存`,"common.saving":`保存中…`,"common.cancel":`取消`,"common.discard":`丢弃`,"common.delete":`删除`,"common.remove":`移除`,"common.loading":`加载中…`,"common.retry":`重试`,"auth.adminTokenTitle":`OpenCodex 管理员令牌 (OPENCODEX_ADMIN_AUTH_TOKEN)`,"auth.adminAccountLabel":`账户`,"auth.adminTokenFieldLabel":`管理员令牌`,"auth.adminTokenRejected":`管理员令牌被拒绝。请检查后重试。`,"auth.adminTokenUnavailable":`无法验证管理员令牌。请重试。`,"theme.label":`主题`,"theme.light":`浅色`,"theme.dark":`深色`,"theme.system":`跟随系统`,"lang.label":`语言`,"lang.nativeName":`中文`,"provider.name.commandCodeAuth":`Command Code - Auth`,"provider.name.commandCodeApi":`Command Code - API`,"provider.name.volcengine":`火山方舟`,"provider.name.volcengineCodingPlan":`火山方舟编程套餐`,"provider.name.volcengineAgentPlan":`火山方舟智能体套餐`,"errorBoundary.title":`页面加载失败`,"errorBoundary.message":`此部分在渲染时发生错误。请重新加载后再试。`,"errorBoundary.details":`错误`,"errorBoundary.reload":`重新加载`,"startup.title":`启动安全`,"startup.subtitle":`检查重启后 Codex 是否仍能连接 opencodex,避免本地代理路由陷入重复重连。`,"startup.refresh":`刷新`,"startup.backToDashboard":`返回仪表盘`,"startup.loading":`正在检查启动保护…`,"startup.error":`无法读取启动保护状态。`,"startup.staleData":`最新启动检查失败。以下数据已过期,不得视为已受保护的证明。`,"startup.status.native":`原生路由`,"startup.status.protected":`重启已受保护`,"startup.status.atRisk":`需要处理`,"startup.summary.native":`Codex 不依赖本地代理`,"startup.summary.protected":`重启后 opencodex 会自动可用`,"startup.summary.atRisk":`重启后 Codex 可能无法访问模型`,"startup.riskDetail":`Codex 已指向本地代理,但没有持久服务或正常的 launcher shim 将其重新启动。`,"startup.riskDetailCustomLocal":`Codex 指向自定义本地网关。opencodex 无法管理或验证该网关的重启生命周期。`,"startup.riskDetailWindowsShim":`Launcher shim 仅保护受支持的 CLI 脚本;Windows 上的 Codex Desktop 和直接 codex.exe 启动可以绕过它。`,"startup.safeDetail":`当前路由与启动机制一致。重启后无需手动运行 ocx start。`,"startup.routing":`Codex 路由`,"startup.routing.proxy":`本地代理`,"startup.routing.native":`OpenAI 原生`,"startup.routing.customLocal":`自定义本地网关`,"startup.routing.customRemote":`自定义远程网关`,"startup.routing.unknown":`未知或无效的路由`,"startup.restartProtection":`重启保护`,"startup.preference":`按需启动`,"startup.enabled":`已启用`,"startup.disabled":`已禁用`,"startup.protection.service":`后台服务`,"startup.protection.shim":`Launcher shim`,"startup.protection.none":`未安装`,"startup.details":`保护详情`,"startup.service":`后台服务`,"startup.serviceHint":`登录时启动,并在代理崩溃后重新启动。`,"startup.installed":`已安装`,"startup.notInstalled":`未安装`,"startup.unsupported":`不支持`,"startup.shim":`Codex launcher shim`,"startup.shimHint":`支持的 Codex 脚本启动器运行时执行 ocx ensure。`,"startup.healthy":`正常`,"startup.cliOnly":`仅 CLI`,"startup.stale":`已过期`,"startup.viable":`可用`,"startup.unhealthy":`已安装但异常`,"startup.conflict":`服务冲突`,"startup.installedDisabled":`已安装但禁用`,"startup.install":`安装`,"startup.installing":`正在安装…`,"startup.repair":`修复`,"startup.repairing":`正在修复…`,"startup.serviceInstalled":`后台服务安装成功。`,"startup.serviceRepaired":`后台服务修复成功。`,"startup.shimInstalled":`Codex 启动器 shim 安装成功。`,"startup.shimRepaired":`Codex 启动器 shim 修复成功。`,"startup.installFailed":`安装失败:`,"startup.tray.title":`Windows 系统托盘`,"startup.tray.hint":`登录时启动托盘图标,一键控制代理启动、停止、重启、面板和状态。`,"startup.tray.login":`Windows 登录时启动托盘`,"startup.tray.notProtection":`托盘只是控制器,并非重启保护。无人值守恢复仍需要正常的后台服务。`,"startup.tray.running":`运行中`,"startup.tray.stopped":`已安装,未显示`,"startup.tray.stale":`需要修复`,"startup.tray.notInstalled":`未安装`,"startup.tray.loading":`正在检查…`,"startup.tray.unavailable":`状态不可用`,"startup.tray.install":`安装并显示托盘`,"startup.tray.start":`显示托盘图标`,"startup.tray.stop":`退出托盘图标`,"startup.tray.uninstall":`移除登录托盘`,"startup.tray.error":`Windows 托盘操作失败。请运行 ocx tray status 查看详情。`,"startup.recovery":`修复选项`,"startup.recoveryHint":`使用上方的一键安装,或复制命令进行手动修复。Codex Desktop 和 Windows 可执行文件建议使用后台服务。`,"startup.command.service":`推荐:持久后台服务`,"startup.command.shim":`备选:CLI launcher shim`,"startup.command.native":`安全恢复:还原 Codex 原生路由`,"startup.copy":`复制`,"startup.copied":`已复制`,"startup.recommended":`推荐修复:{cmd}`,"startup.navRisk":`启动保护需要处理`,"startup.codexRuntime.clampHidden":`部分推理强度选项已隐藏,因为 OpenCodex 正在使用 Codex {version}。`,"startup.codexRuntime.clampHiddenWithEfforts":`部分推理强度选项已隐藏,因为 OpenCodex 正在使用 Codex {version}(已移除:{efforts})。`,"startup.codexRuntime.olderBinary":`OpenCodex 正在使用较旧的 Codex 二进制文件({version})。检测到可用的较新安装。`,"dash.subtitle":`本地 opencodex 代理、其提供方以及路由到 Codex 的模型的实时状态。`,"dash.workspace.overview":`概览`,"dash.workspace.sections":`板块`,"dash.status":`状态`,"dash.online":`在线`,"dash.offline":`离线`,"dash.version":`版本`,"dash.uptime":`运行时间`,"dash.providers":`提供方`,"dash.tokens30d":`Token (30 天)`,"dash.activity.title":`30 天活动`,"dash.activity.requests":`请求`,"dash.activity.tokens":`Token`,"dash.activity.chartLabel":`30 天活动。使用左右方向键选择日期,使用 Home 和 End 跳转到范围两端。`,"dash.activity.viewUsage":`查看用量`,"dash.coverage":`覆盖率 {pct}`,"dash.mem.title":`内存可观测性`,"dash.mem.hint":`只读运行时诊断。观测内存为 max(RSS, external, ArrayBuffers),避免 Windows working set trimming 隐藏已提交的保留内存。`,"dash.mem.rss":`常驻内存 (RSS)`,"dash.mem.jsHeap":`JS 堆已用`,"dash.mem.jsHeapArena":`堆区 {total}`,"dash.mem.pressure":`相对告警阈值`,"dash.mem.pressureOf":`阈值的 {pct}%`,"dash.mem.pressureUnknown":`未提供阈值`,"dash.mem.jscHeap":`JSC 堆`,"dash.mem.external":`External`,"dash.mem.arrayBuffers":`ArrayBuffers`,"dash.mem.observed":`观测值`,"dash.mem.runtime":`运行时计数器`,"dash.mem.growth":`每小时观测变化`,"dash.mem.perHour":`/小时`,"dash.mem.store":`延续存储`,"dash.mem.storeHint":`代理 previous_response_id 缓存。堆上升时总字节数增加,说明是对话保留而非运行时分配器。`,"dash.mem.storeEntries":`条目`,"dash.mem.storeTotal":`总计`,"dash.mem.storeLargest":`最大`,"dash.mem.storeOldest":`最旧`,"dash.mem.threshold":`告警阈值`,"dash.mem.lastWarn":`上次告警`,"dash.mem.never":`从不`,"dash.mem.details":`详情`,"dash.mem.unavailable":`内存诊断不可用(旧版代理)。`,"dash.mem.inFlight":`进行中的请求`,"dash.mem.restart":`排空并重启`,"dash.mem.restartConfirm":`等待 {count} 个进行中的请求结束后再重启(最多 {seconds} 秒;超时将中断剩余请求)。`,"dash.mem.draining":`正在等待 {count} 个请求完成… 完成后重启`,"dash.mem.reconnecting":`代理正在重启… 等待重新连接`,"dash.connectionReconnecting":`连接中断 — 正在重新连接…`,"dash.mem.restartFailed":`排空并重启失败。请确认代理正在运行。`,"dash.mem.restartNoSupervisor":`未检测到重启保护。重启后代理可能不会自动恢复,需手动启动。`,"dash.activeProviders":`活跃提供方`,"dash.noProviders":`尚未配置提供方。请运行 {cmd}。`,"dash.col.name":`名称`,"dash.col.adapter":`适配器`,"dash.col.baseUrl":`Base URL`,"dash.col.model":`模型`,"dash.modelsNoResults":`没有符合搜索的模型。`,"dash.availableModels":`可用模型`,"dash.noModels":`未找到模型。请检查提供方 API 密钥。`,"dash.cannotConnect":`无法连接到代理。它在运行吗?`,"dash.runStart":`运行 {cmd} 以启动代理。`,"dash.stop":`停止代理`,"dash.stopConfirm":`停止代理并恢复原生 Codex 配置?`,"dash.stopFailed":`无法停止代理 (HTTP {status})。`,"dash.maSwitchFailed":`模式切换失败 (HTTP {status})。`,"dash.maNetworkError":`网络错误 — 代理是否正在运行?`,"dash.stopping":`正在停止…`,"dash.actions":`代理`,"dash.codexRestart":`重新加载 Codex 模型列表`,"dash.codexRestarting":`正在停止…`,"dash.codexRestartConfirm":`停止 Codex app-server 以便重新读取模型列表?进行中的 Codex 任务会被中断,且 Codex 不会自动重启,请稍后自行重新打开。`,"dash.codexRestartDone":`已停止 {count} 个 Codex app-server。重新打开 Codex 即可加载最新模型列表。`,"dash.codexRestartNothing":`没有正在运行的 Codex app-server。下次启动会读取最新模型列表。`,"dash.codexRestartUnknown":`无法枚举进程,因此没有停止任何进程。`,"dash.codexRestartPartial":`有 {count} 个 app-server 未退出。若模型列表仍然过旧,请手动停止。`,"dash.codexRestartFailed":`无法重新加载 Codex 模型列表 (HTTP {status})。`,"dash.codexRestartUnreachable":`无法连接到代理。`,"dash.codexRestartMalformed":`代理返回了意外的响应。`,"dash.codexRestartTimeout":`代理未在超时前响应,可能仍在停止 app-server。`,"models.staleBanner":`Codex 显示的模型列表比当前目录旧。重启 Codex 即可重新读取。`,"dash.codexAutoStart":`随 Codex 启动 opencodex`,"dash.codexAutoStartHint":`允许已安装的 launcher shim 运行 ocx ensure。此设置不会安装重启保护;请在启动安全中检查实际状态。`,"dash.searchModel":`搜索附属模型`,"dash.searchModelHint":`用于非 OpenAI 路由模型的 web_search 的模型。需要 ChatGPT 登录。`,"dash.searchReasoning":`搜索推理强度`,"dash.visionModel":`视觉附属模型`,"dash.visionModelHint":`为纯文本路由模型描述图像的模型。需要 ChatGPT 登录。`,"dash.webSearchSidecar":`网页搜索附属服务`,"dash.webSearchSidecarHint":`选择路由模型进行网页搜索时使用的后端和模型。`,"dash.webSearchStream":`实时流式输出回答`,"dash.webSearchStreamHint":`实时流式输出开头的文本和推理,直到模型决定调用工具;其余部分为拦截搜索而保持缓冲。搜索前的文本可能会部分重复。`,"dash.visionSidecar":`视觉附属服务`,"dash.visionSidecarHint":`选择纯文本路由模型描述图像时使用的后端和模型。`,"dash.visionOff":`关闭`,"dash.shadowCallIntercept":`影子调用拦截`,"dash.shadowCallInterceptHint":`拦截 Codex 应用的后台辅助调用({models}:标题生成、提交消息)并重定向到所选模型。effort 固定为 low。`,"dash.shadowCallWarning":`⚠ 启用后,所有对 {models} 的请求都将被替换为所选模型。`,"dash.shadowCallOriginal":`原始`,"dash.shadowCallModel":`替代模型`,"dash.shadowCallTooltip":`Codex 应用会在后台调用辅助模型来生成线程标题、提交消息以及进行技能编排。该模型随客户端版本变化,因此 opencodex 会同时拦截这些模型:{models}。启用此选项可将这些调用重定向到您选择的模型。`,"models.shadowCallIntercept":`影子调用拦截`,"models.shadowCallInterceptHint":`拦截 Codex 应用的后台辅助调用({models})并重定向到所选模型。`,"dash.sidecarBackend":`后端`,"dash.sidecarModel":`模型`,"dash.backendAuto":`自动`,"dash.backendOpenAI":`OpenAI`,"dash.backendAnthropic":`Anthropic`,"dash.sidecarSaved":`附属设置已保存。将在下一个请求时生效。`,"dash.sidecarSaveFailed":`保存附属设置失败。`,"dash.injectionLabel":`子代理委托`,"dash.injectionHint":`选择 Codex 把子任务交给谁来做的模型。这个选择用在哪里,由下面两个开关决定。`,"dash.syncCodexSubagentDefaults":`同时保存为 Codex 默认值`,"dash.syncCodexSubagentDefaultsHint":`打开后,上面选的模型会写进 Codex 自己的配置,新任务一开始也用它。关闭则只在这里记住。下次同步或重启后生效,你手写的 [agents] 设置不会被改动。`,"dash.multiAgentGuidance":`告诉 Codex 怎么分工`,"dash.multiAgentGuidanceHint":`给 Codex 附上一张短便条,说明怎么把活分给子代理。v2 会告诉它可用的模型和优先模型;v1 只在推理强度为 max 或 ultra 时才起作用。关闭则不附任何便条。`,"dash.injectionNone":`无`,"dash.injectionEffortLabel":`推理强度`,"dash.injectionEffortNone":`模型默认`,"dash.effortCapLabel":`V2 ultra 推理强度限制`,"dash.subagentEffortCapLabel":`V2 子代理推理强度限制`,"dash.effortCapHelp":`限制 V2 ultra 模式轮次的推理强度。设置后,来自 ultra 模式的 max 请求将被限制到所选级别。子代理限制仅适用于衍生的子代理。只会降低强度,不会提高。如果模型不支持所选级别,将自动降至最近的支持级别。`,"dash.effortCapNone":`无上限`,"dash.maintenance":`维护`,"dash.maintenanceHint":`刷新 Codex 模型目录,或安装新的 opencodex 版本。`,"dash.syncModels":`同步模型`,"dash.syncing":`同步中…`,"dash.syncOk":`同步完成。已追加 {count} 个模型。`,"dash.syncStaleHint":`如果 Codex 仍显示旧列表,请重启长期运行的 app-server({cmd})。`,"dash.syncFailed":`同步失败:{error}`,"dash.projectConfigTitle":`项目 Codex 配置绕过了 OpenCodex`,"dash.projectConfigHint":`这些仓库级设置会覆盖 OpenCodex 代理(例如直接走 OpenCode Go)。请移除它们,以便该项目使用 ~/.codex/config.toml 的代理路由。`,"dash.checkUpdate":`检查更新`,"dash.updateTitle":`更新 opencodex`,"dash.updateDesc":`检查所选 npm 频道的最新版本,然后选择安装后是否重启代理。`,"dash.updateChannel":`频道`,"dash.updateChecking":`正在检查更新…`,"dash.updateInstalled":`已安装`,"dash.updateLatest":`最新`,"dash.updateAvailable":`有可用更新`,"dash.updateCurrent":`已是最新`,"dash.updateCommand":`命令`,"dash.updateSource":`当前是源码检出。请在终端运行显示的命令进行更新。`,"dash.updateUnavailable":`无法从 npm 读取最新版本。请稍后重试。`,"dash.updateRetry":`重试`,"dash.updateRecheck":`重新检查`,"dash.updateCannotAuto":`无法一键更新({reason})。`,"dash.updateReason.source_checkout":`源码检出`,"dash.updateReason.latest_unavailable":`无法连接 npm 注册表`,"dash.updateReason.already_latest":`已是最新版本`,"dash.updateReason.unknown":`无法更新`,"dash.updateRestart":`更新后重启`,"dash.updateRestartHint":`推荐开启。代理重启前,当前 GUI 仍运行旧代码。`,"dash.runUpdate":`更新`,"dash.updateReconnecting":`正在等待重启后的代理…`,"dash.updateStatus.running":`正在更新 opencodex。`,"dash.updateStatus.restarting":`更新已安装。正在重启代理。`,"dash.updateStatus.succeeded":`更新完成。`,"dash.updateVersionTransition":`{currentVersion} -> {latestVersion}.`,"dash.updateStatus.failed":`更新失败。`,"prov.subtitle":`配置 opencodex 路由到 Codex 的上游提供方。使用账户登录、添加提供方,或编辑原始配置。`,"prov.add":`添加提供方`,"prov.editJson":`编辑 JSON`,"prov.accountLogin":`账户登录`,"prov.noOauth":`没有可用的 OAuth 提供方。`,"prov.loggedIn":`已登录`,"prov.notLoggedIn":`未登录`,"prov.logout":`退出登录`,"prov.login":`登录`,"prov.loginWith":`使用 {provider} 登录`,"prov.waitingBrowser":`等待浏览器…`,"prov.didntOpen":`没有打开?点击这里`,"prov.copyLink":`复制链接`,"prov.dontOpenBrowser":`不要在运行代理的机器上打开浏览器`,"prov.dontOpenBrowserHint":`适用于使用其他浏览器配置文件登录,或仪表板与代理不在同一台机器上。`,"prov.linkCopied":`已复制`,"prov.linkCopyUnavailable":`剪贴板不可用`,"prov.deviceCode":`设备验证码`,"prov.copyCode":`复制验证码`,"prov.codeCopied":`验证码已复制`,"prov.editAlias":`编辑别名`,"prov.aliasPrompt":`显示名称(留空以清除)`,"prov.aliasSaved":`别名已保存`,"prov.aliasSaveFailed":`无法保存别名`,"prov.cooldownCleared":`已清除冷却`,"prov.cooldownClearFailed":`清除冷却失败`,"prov.accountId":`ID`,"prov.pasteRedirect":`粘贴重定向 URL 或授权码`,"prov.pasteRedirectHint":`如果浏览器显示 localhost 错误,请复制地址栏中的完整 URL 并粘贴到此处(或粘贴授权码)。`,"prov.pasteSubmit":`提交`,"prov.pasteSubmitting":`提交中…`,"prov.pasteOk":`已提交代码 — 正在完成登录…`,"prov.pasteFail":`无法提交代码:{error}`,"prov.port":`端口`,"prov.default":`默认`,"prov.loadingConfig":`加载中…`,"prov.saved":`已保存!重启代理以生效。`,"prov.loadConfigFail":`加载配置失败`,"prov.invalidJson":`无效的 JSON`,"prov.saveFailed":`保存失败`,"prov.loginFailStart":`{provider} 登录启动失败`,"prov.loginError":`{provider} 登录错误:{error}`,"prov.loginRequestFail":`{provider} 登录请求失败`,"prov.loginCancelled":`{provider} 登录已取消`,"prov.loginTimeout":`{provider} 登录超时 — 浏览器已关闭或未完成。请重试。`,"prov.loginOk":`已登录到 {provider}。运行 {cmd}(或实时生效)以列出其模型。`,"prov.loginSameAccount":`仍是同一个 {provider} 账户 — 请在浏览器中切换账户后再次尝试添加账户。`,"oauthTos.highTitle":`{provider}:订阅 OAuth 风险`,"oauthTos.elevatedTitle":`{provider}:非官方 OAuth 桥接`,"oauthTos.anthropicBody":`通过 OpenCodex 等第三方代理直接复用 Claude 订阅 OAuth 令牌,并非 Anthropic 支持的集成方式,可能导致访问受限。可使用 Claude 订阅的受支持 Agent SDK 集成属于另一种方式。`,"oauthTos.highBody":`OpenCodex 通过第三方 OAuth 路径连接 {provider}。如果该用法不受支持,访问可能会被限制或暂停。`,"oauthTos.elevatedBody":`OpenCodex 通过非官方 OAuth 路径连接 {provider}。请尽量使用官方客户端;异常或自动化流量可能被视为滥用,访问可能会被限制或暂停。`,"oauthTos.saferPath":`更安全的做法:改为在 OpenCodex 中配置 API 密钥。`,"oauthTos.acknowledge":`我了解风险,仍要继续使用 OAuth。`,"oauthTos.continue":`继续使用 OAuth`,"prov.logoutOk":`已退出 {provider}。`,"prov.logoutFail":`无法退出 {provider}。账户状态保持不变。`,"prov.removed":`已移除 "{name}"。`,"prov.removedDefault":`已移除 "{name}"。默认提供方现为 "{defaultProvider}"。`,"prov.removeFail":`移除 "{name}" 失败。`,"prov.removeLastProvider":`如果没有其他已启用的提供方可以成为默认,则无法移除此提供方。`,"prov.removeHasDependentCombos":`请先移除或更新依赖它的组合:{combos}。`,"prov.setDefault":`设为默认`,"prov.setDefaultSuccess":`"{name}" 已设为默认提供方。`,"prov.setDefaultFail":`无法将 "{name}" 设为默认提供方。`,"prov.defaultDisabled":`请先启用此提供方,再将其设为默认。`,"prov.updateFail":`无法更新此提供方。`,"prov.networkError":`网络错误。请确认代理正在运行后重试。`,"prov.added":`已添加 "{name}"。现已生效 — 运行 {cmd}(或重启)以在 Codex 选择器中列出其模型。`,"prov.removeConfirm":`移除提供方 "{name}"?其模型将从 Codex 选择器中消失。`,"prov.hasApiKey":`已配置 API 密钥`,"prov.hasHeaders":`已配置自定义请求头`,"prov.accounts":`账户({n})`,"prov.accountsAria":`展开/收起 {name} 账户`,"prov.accountActive":`使用中`,"prov.accountReauth":`需重新登录`,"prov.reauthenticate":`重新认证`,"prov.reauthAccountMissing":`登录后未找到所选账号`,"prov.reauthIdentityMismatch":`登录账号与所选账号不匹配`,"prov.accountAdd":`添加账户`,"prov.accountNoLabel":`账户 {id}`,"prov.accountSwitchTitle":`使用此账户`,"prov.accountSwitched":`已切换到 {email}。`,"prov.accountSwitchFail":`切换账户失败`,"prov.accountRemoved":`已移除 {email}。`,"prov.accountRemoveFail":`无法移除 {email}。账户保持不变。`,"prov.accountRemoveAria":`移除 {email}`,"prov.accountRemoveConfirm":`移除账户 {email}?其登录将从此代理中删除。`,"prov.keyAdd":`添加 API 密钥`,"prov.keyAdded":`已为 {name} 添加 API 密钥。`,"prov.keyAddFail":`添加 API 密钥失败`,"prov.keyPlaceholder":`粘贴 API 密钥`,"prov.keySwitchTitle":`使用此密钥`,"prov.keySwitched":`已切换到密钥 {key}。`,"prov.keySwitchFail":`切换密钥失败`,"prov.keyRemoved":`已移除密钥 {key}。`,"prov.keyRemoveAria":`移除密钥 {key}`,"prov.keyRemoveConfirm":`移除 API 密钥 {key}?它将从此代理的配置中删除。`,"prov.activeBadge":`已启用`,"prov.disabledBadge":`已禁用`,"prov.defaultBadge":`默认`,"prov.enable":`启用`,"prov.disable":`禁用`,"prov.enabled":`已启用 "{name}"。其模型可再次出现在 Codex 中。`,"prov.disabled":`已禁用 "{name}"。设置会保留,但模型会被隐藏。`,"prov.enableFail":`启用 "{name}" 失败。`,"prov.disableFail":`禁用 "{name}" 失败。`,"prov.enableAria":`启用提供方 {name}`,"prov.disableAria":`禁用提供方 {name}`,"prov.defaultCannotDisable":`默认提供方不能被禁用`,"prov.openaiAccountMode":`Codex 账户模式`,"prov.openaiModePool":`账户池`,"prov.openaiModeDirect":`直连`,"prov.openaiPoolDesc":`默认模式。根据会话关联、额度、冷却时间和故障转移,在主登录与已添加账户之间轮换。`,"prov.openaiDirectDesc":`仅使用当前主 Codex 登录。不会读取或轮换已存储的账户池账号。`,"prov.openaiModeSaved":`OpenAI 账户模式已更改为 {mode}。`,"prov.openaiModeSaveFailed":`无法更改 OpenAI 账户模式。`,"prov.openaiApiDesc":`仅使用 OpenAI API 密钥,不使用 Codex 账户凭据。`,"prov.manageCodexAccounts":`管理 Codex 账户`,"prov.openaiApiMissing":`需要 API 密钥`,"prov.openaiApiSetup":`设置 API 密钥`,"models.tab.catalog":`模型`,"models.tab.combos":`组合`,"models.tab.compatibility":`兼容性`,"models.tab.routing":`路由 (beta)`,"models.tabsLabel":`模型界面`,"models.subtitle.combos":`把多个模型合成一个 id 依次应答。failover 按顺序尝试,round-robin 分摊负载。`,"models.subtitle.compatibility":`来自实验室投影证据的只读兼容性判定矩阵。`,"models.subtitle.routing":`策略配置、dry-run 评估,以及有据可查的路由分析。`,"models.subtitle":`开关 Codex 可见的模型 — 原生 GPT passthrough 与已路由模型按提供方分组(点击标题可折叠)。隐藏的模型不会出现在目录和模型选择器中,但仍可按精确 id 直接调用。更改在下一个 Codex 回合生效 — opencodex 会使 Codex 的 5 分钟模型缓存失效,因此无需重启。`,"models.nativeGroupLabel":`OpenAI 原生`,"models.nativeHint":"Passthrough 模型使用在提供方页面选择的账户池或直连选项。关闭后会从 Codex 选择器中隐藏(目录条目保留,重新开启即可完整恢复)。 在此添加模型将注册为路由的 `openai/<model>` 选择器,而不是新的裸 passthrough id。","models.active":`{active}/{total} 可见`,"models.workspace.providers":`提供方`,"models.workspace.allProviders":`所有提供方`,"models.workspace.mainAria":`模型详情`,"models.allOn":`全部开启`,"models.allOff":`全部关闭`,"models.presetLabel":`模型`,"models.presetMode_preset":`预设`,"models.presetMode_all":`全部`,"models.presetMode_custom":`自定义`,"models.presetSummary":`显示 {count} / {total} — 核心预设 v{version}`,"models.presetUpdateAvailable":`预设 v{version} 可用`,"models.presetAppliedToast":`{provider}:已应用预设 — 选中 {count} 个模型`,"models.presetClearedToast":`{provider}:显示全部模型`,"models.presetEmpty":`{provider}:预设未匹配到模型,选择保持不变`,"models.presetConfirmReplace":`用包含 {count} 个模型的预设替换你的选择?`,"models.cap350k":`限制 350k`,"models.capApplied":`上下文限制已应用 — 将在下一个 Codex 回合生效。`,"models.capSaveFailed":`保存上下文限制失败`,"models.contextCapped":`350k 限制`,"models.contextCapLabel":`安全上限 / 回退`,"models.v2Label":`子代理`,"models.shadowCallOriginal":`⚠ {models} →`,"models.v2Mode_v1":`v1`,"models.v2Mode_default":`base`,"models.v2Mode_v2":`v2`,"models.v2ModeDesc_v1":`所有模型 → v1 界面`,"models.v2ModeDesc_default":`上游默认值 (sol/terra=v2, luna=v1)`,"models.v2ModeDesc_v2":`所有模型 → v2 界面`,"models.keepNativeOnV1":`ChatGPT 保持 v1`,"models.keepNativeOnV1Hint":`仅当 ChatGPT 原生父代理仍留在 v2 时,才会加密 v2 子任务,Grok/Claude 无法读取。开启此选项可让 Sol/Terra 留在 v1,从而避免该加密。路由父代理仍使用 v2。`,"models.v2Help":`控制所有模型的多代理界面。
34
+
35
+ v1: 经典单线程代理。所有模型使用 v1 协作界面。
36
+ base: 上游默认值 — sol/terra 使用 v2,luna 使用 v1,其余跟随 codex 功能标志。
37
+ v2: 多线程代理(spawn_agent)。所有模型使用 v2 协作界面。
38
+
39
+ 在 v2 下,「ChatGPT 保持 v1」会让 Sol/Terra 留在 v1,以便继续派发 Grok 或 Claude。ChatGPT 会加密 v2 子任务,路由模型无法读取;路由父代理仍留在 v2。
40
+
41
+ 更改在新会话中生效。`,"models.v2DocsLink":`v1 / v2 是什么?`,"dash.multiAgent":`子代理`,"models.v2Conflict":`[agents] max_threads 仍存在 — codex 将拒绝启动,请从 config.toml 移除`,"models.v2Applied":`子代理模式已更新 — 新会话生效(重启 Codex 应用以刷新选择器)`,"models.v2ThreadsLabel":`最大线程`,"models.v2ThreadsDefault":`默认 (4)`,"models.v2ThreadsApplied":`线程上限已更新 — 新会话生效`,"models.v2ThreadsInvalid":`线程上限必须为 >= 1 的整数`,"models.v2ThreadsApply":`应用`,"models.capValue":`默认 {value}`,"models.contextSettings":`自定义窗口`,"models.contextSettingsTitle":`自定义窗口 — {provider}`,"models.contextDefault":`安全上限 / 回退`,"models.contextModel":`模型`,"models.contextModelOverride":`模型覆盖值`,"models.contextHint":`留空即自动发现。这里填写的是安全上限和回退:只在上游没有窗口时补上,并且只压低更大的上报值。实时发现的结果不会写回此栏。`,"models.contextAutomatic":`自动发现`,"models.contextSaved":`上下文窗口已更新 — 将在下一个 Codex 回合生效。`,"models.contextUnchanged":`没有需要保存的上下文窗口更改。`,"models.contextSaveFailed":`保存上下文窗口失败`,"models.contextInvalid":`上下文窗口必须为正整数`,"models.contextCappedValue":`{value} 限制`,"models.contextMetadataSource":`来源`,"models.contextMetadataLive":`已检测`,"models.contextMetadataRegistry":`注册表`,"models.contextMetadataCursorStatic":`Cursor 精选`,"models.contextMetadataSnapshot":`已保存`,"models.contextMetadataFallback":`回退`,"models.contextMetadataDerived":`派生`,"models.contextMetadataUnknown":`未知`,"models.contextMetadataStale":`过期`,"models.contextTooltipDetected":`{value} · 已检测`,"models.contextTooltipCapped":`{detected} 已检测 · 上限 {cap}`,"models.contextTooltipStale":`{value} · {when}`,"models.contextTooltipUnknown":`上下文窗口未知`,"models.contextTooltipSource":`{value} · {source}`,"models.contextLastChecked":`上次检查 {when}`,"models.contextYesterday":`昨天`,"models.setAll":`全部设置`,"models.setAllHint":`给所有已路由提供方打开 {value} 默认窗口。中转站没报 context_window / context_length 时,这个值就是 Codex 实际窗口。要给单个模型手写,用同一行上的「自定义窗口」。原生提供方不受影响。`,"models.collapseAll":`全部折叠`,"models.expandAll":`全部展开`,"models.orderHint":`选择器顺序:Subagents 中的选择(按所选顺序)→ 其余已路由模型(依次按提供方、模型 ID 字母排序)→ 原生模型。可见性开关仅用于筛选,不会改变此顺序。`,"models.custom":`自定义…`,"models.customApply":`应用`,"models.customPlaceholder":`令牌 (例如 420000)`,"models.customAdd":`添加自定义模型`,"models.customAddTitle":`添加自定义模型 — {provider}`,"models.customEditTitle":`编辑自定义模型 — {provider}`,"models.customAdded":`已添加自定义模型`,"models.customUpdated":`已更新自定义模型`,"models.customDeleted":`已删除自定义模型`,"models.customSaveFailed":`保存自定义模型失败`,"models.customSaving":`正在保存…`,"models.customAddBtn":`添加`,"models.customEditBtn":`更新`,"models.customEditNamed":`编辑{name}`,"models.customDeleteNamed":`删除{name}`,"models.customDeleteConfirm":`要删除模型 {name} 吗?`,"models.customBadge":`自定义`,"models.customSummary":`{count} 个自定义模型`,"models.customFieldModelId":`模型 ID(端点标识)`,"models.customFieldModelIdPlaceholder":`例如 qwen4-max-preview`,"models.customFieldDisplayName":`显示名称(可选)`,"models.customFieldDisplayNamePlaceholder":`例如 Qwen 4 Max Preview`,"models.customFieldContext":`上下文窗口`,"models.customFieldModalities":`输入模态`,"models.customFieldReasoning":`推理强度`,"models.customFieldReasoningOverride":`覆盖推理强度`,"models.reasoningEffort.none":`无`,"models.reasoningEffort.minimal":`最低`,"models.reasoningEffort.low":`低`,"models.reasoningEffort.medium":`中`,"models.reasoningEffort.high":`高`,"models.reasoningEffort.xhigh":`极高`,"models.reasoningEffort.max":`最高`,"models.tipProvider":`提供方`,"models.tipContext":`上下文`,"models.tipModalities":`模态`,"models.tipStatus":`状态`,"models.tipActive":`已启用`,"models.tipDisabled":`已禁用`,"models.applied":`已应用 — 将在下一个 Codex 回合生效。`,"models.saveFailed":`保存失败`,"models.networkError":`网络错误 — 代理在运行吗?`,"models.loadFail":`加载模型失败 — 代理在运行吗?`,"models.noRouted":`没有已路由的模型`,"models.noRoutedHint":`请先登录提供方或添加一个。`,"models.emptyDiscovery":`未发现任何模型。请检查提供方端点,或添加静态/自定义模型。`,"models.emptyDiscoveryDisabled":`实时模型发现已关闭,且尚未配置静态模型。`,"models.discoveryFailedBadge":`发现失败`,"models.discoveryFailedHttp":`模型发现失败(HTTP {status})。`,"models.discoveryFailedBlocked":`模型发现被目标策略阻止。`,"models.discoveryFailedInvalidResponse":`模型发现返回了无效响应。`,"models.discoveryFailedNetwork":`由于网络错误,模型发现失败。`,"models.discoveryFailedProvider":`提供方报告了模型发现错误。`,"models.discoveryFailedGeneric":`模型发现失败。`,"models.openProviderSettings":`打开提供方设置`,"models.loading":`加载中…`,"models.search":`搜索模型…`,"models.showMore":`再显示 {n} 个`,"models.allowlistLabel":`仅所选`,"models.allowlistHint":`仅勾选的模型进入目录(留空 = 全部)。适用于暴露成千上万模型的提供商。`,"models.selectedCount":`已选 {n} 个`,"sub.subtitle":`Codex 的 {cmd} 仅将优先级最高的前 5 个模型作为覆盖项公开。在此最多选择 5 个 — 原生 gpt 或已路由模型 — opencodex 会设置它们的目录优先级,使其正好排在前面。其他模型仍可按确切名称调用;此设置仅控制显示项。`,"sub.featured":`精选`,"sub.orderHint":`此处所选并显示的顺序决定 Codex 模型选择器顶部第 1–5 位,以及 {cmd} 的默认模型候选。`,"sub.noneSelected":`未选择 — 请从下方列表选择。`,"sub.models":`模型`,"sub.search":`搜索模型(原生 gpt + 已路由)…`,"sub.noModels":`没有模型 — 请先登录提供方或添加一个。`,"sub.saved":`已保存 {n} 个模型。启动新的 Codex 会话(或运行 {cmd})以将它们作为 spawn_agent 覆盖项查看。`,"sub.saveFailed":`保存失败`,"sub.networkError":`网络错误 — 代理在运行吗?`,"sub.loadFail":`加载模型失败 — 代理在运行吗?`,"sub.loading":`加载中…`,"sub.moveUp":`上移 {m}`,"sub.moveDown":`下移 {m}`,"sub.removeAria":`移除 {m}`,"sub.workspace.addToFeatured":`将 {m} 添加到精选`,"sub.workspace.allModels":`所有模型`,"sub.workspace.featuredFull":`精选列表已满(最多 5 个)`,"sub.workspace.mainAria":`子代理模型详情`,"sub.workspace.notFeatured":`未设为精选`,"sub.workspace.priority":`优先级`,"sub.workspace.removeFromFeatured":`将 {m} 从精选中移除`,"sub.workspace.selectModel":`选择模型`,"sub.workspace.selectModelDesc":`从列表中选择一个模型以查看详情,并将其设为 spawn_agent 的精选模型。`,"sub.workspace.selector":`公开选择器`,"sub.ultraMode":`超级模式`,"sub.ultraModeHint":`为所有模型和推理力度启用主动多代理委派策略(不改变推理力度本身)。将 features.multi_agent_v2.multi_agent_mode_hint_text 写入 config.toml。`,"sub.ultraModeV2Required":`需要 v2 多代理表面 — 请先启用 multi_agent_v2,并在子代理模式控件中选择 v2。`,"sub.ultraModeText":`超级模式委派文本`,"sub.ultraModePreset":`恢复预设`,"sub.ultraModeLoadFail":`无法加载超级模式设置 — 代理是否在运行?`,"sub.ultraModeSaveFail":`保存超级模式设置失败`,"sub.ultraModeSaved":`超级模式已保存。适用于新的 Codex 会话。`,"sub.nativeParentOverride":`路由原生 V2 父代理`,"sub.nativeParentOverrideHint":`Codex 可能显示原始原生模型,而 OpenCodex 会在所选路由目标上执行根请求。`,"sub.nativeParentOverridePrivacyWarning":`提示词、仓库上下文、对话历史和工具结果会发送到所选提供商,并继承其可用性、上下文、延迟、行为、成本和隐私特征。`,"sub.nativeParentOverrideModel":`原生父代理目标模型`,"sub.nativeParentOverrideV2Required":`需要显式 V2、上游 V2 标志,并关闭“将 ChatGPT 保持在 v1”。`,"sub.nativeParentOverrideSaveFail":`保存原生父代理路由失败`,"sub.nativeParentOverrideSaved":`原生父代理路由已保存。适用于后续父代理轮次和压缩。`,"sub.agentTaskRecovery":`恢复加密的 V2 任务`,"sub.agentTaskRecoveryHint":`通过 ChatGPT 解密 OpenAI Fernet 加密任务消息,以便非 OpenAI 子代理可以读取并执行路由的 V2 任务。`,"sub.agentTaskRecoveryModel":`恢复模型(默认:gpt-5.6-luna)`,"sub.agentTaskRecoverySaveFail":`保存加密任务恢复设置失败`,"sub.agentTaskRecoverySaved":`加密任务恢复设置已保存。`,"sub.roles":`角色`,"sub.roles.hint":`父代理可以 spawn 的具名专家。每个角色固定模型和子代理提示。是否委派仍由父代理决定。`,"sub.roles.add":`添加角色`,"sub.roles.empty":`还没有角色。为评审、搜索或其他委派工作添加专家。`,"sub.roles.full":`角色目录已满(最多 8 个)`,"sub.roles.id":`角色名`,"sub.roles.description":`何时使用`,"sub.roles.descriptionHint":`展示给父代理,以便它知道何时 spawn 该专家。`,"sub.roles.model":`模型`,"sub.roles.effort":`推理强度`,"sub.roles.effortNone":`模型默认`,"sub.roles.instructions":`子代理说明`,"sub.roles.instructionsHint":`子代理加载的开发者提示。`,"sub.roles.enabled":`启用`,"sub.roles.delete":`删除角色 {id}`,"sub.roles.save":`保存角色`,"sub.roles.saved":`角色已保存。适用于新的 Codex 会话。`,"sub.roles.saveFailed":`保存角色失败`,"sub.roles.loadFail":`无法加载角色 — 代理是否在运行?`,"sub.roles.routedV2Warning":`此角色在 v2 表面上使用了路由模型,且未将 ChatGPT 保持在 v1。原生 v2 父会话会加密子任务。`,"sub.roles.sync":`同步到 Codex 代理文件`,"sub.roles.syncHint":`将已启用角色写入带标记的 ocx-*.toml。关闭时只清理 OpenCodex 拥有的文件,不改动你的文件。`,"sub.injectionPrompt":`自定义父级指导`,"sub.injectionPromptHint":`替换内置 v2 spawn 说明。留空则使用内置文本。若需要实时值,请加入占位符:`,"sub.injectionPromptSave":`保存父级指导`,"sub.injectionPromptSaved":`父级指导已保存。适用于新的 Codex 会话。`,"sub.injectionPromptSaveFailed":`保存父级指导失败`,"sub.childInstructions":`全局子代理说明`,"sub.childInstructionsHint":`应用于每个被 spawn 的子代理。角色说明在同步后仅作用于该专家。`,"sub.childInstructionsSave":`保存子代理说明`,"sub.childInstructionsSaved":`子代理说明已保存。适用于新的 Codex 会话。`,"sub.childInstructionsSaveFailed":`保存子代理说明失败`,"logs.title":`请求日志`,"logs.tabLogs":`日志`,"logs.tabDebug":`调试`,"logs.subtitle":`经过本地 opencodex 代理的最近请求,最新在前。`,"logs.autoRefresh":`自动刷新`,"logs.noRequests":`暂无请求。`,"logs.loadError":`无法加载请求日志。`,"logs.filter.surface.label":`界面`,"logs.filter.surface.all":`全部`,"logs.filter.surface.claude":`Claude`,"logs.filter.surface.codex":`Codex`,"logs.filter.surface.grok":`Grok`,"logs.filter.interceptedHelpersOnly":`仅已拦截的辅助请求`,"logs.filter.model.label":`模型`,"logs.filter.model.all":`所有模型`,"logs.filter.provider.label":`提供商`,"logs.filter.provider.all":`所有提供商`,"logs.filter.status.label":`状态`,"logs.filter.status.all":`所有状态`,"logs.filter.status.success":`成功 (2xx)`,"logs.filter.status.errors":`错误 (4xx/5xx)`,"logs.filter.time.label":`时间`,"logs.filter.time.all":`全部时间`,"logs.filter.time.15m":`最近 15 分钟`,"logs.filter.time.1h":`最近 1 小时`,"logs.filter.time.24h":`最近 24 小时`,"logs.filter.speed.label":`速度`,"logs.filter.speed.all":`所有速度`,"logs.filter.speed.slow":`< 15 tok/s`,"logs.filter.speed.medium":`15–50 tok/s`,"logs.filter.speed.fast":`> 50 tok/s`,"logs.filter.reset":`重置筛选`,"logs.filter.showingCount":`显示 {count} / {total} 条`,"logs.badge.interceptedHelper":`I · {model}`,"logs.badge.interceptedHelperTitle":`已拦截的辅助请求`,"logs.filter.conversation.label":`会话`,"logs.filter.conversation.placeholder":`粘贴会话 ID`,"logs.filter.conversation.clear":`清除`,"logs.filter.conversation.apply":`筛选日志`,"logs.conversation.totals":`{requests} 次请求 · {tokens} tokens · {cost}`,"logs.conversation.scope":`合计仅覆盖当前已加载的 Logs 环形缓冲。`,"logs.conversation.excluded":`(~$ 已排除 {unpriced} 条无定价、{unmetered} 条无计量)`,"logs.cost.approximate":`约 {amount}`,"logs.cost.lowerBound":`至少 {amount}`,"logs.cost.unavailable":`无法估算`,"logs.detail.conversation":`会话`,"logs.badge.claude":`Claude`,"logs.badge.grok":`Grok`,"logs.col.time":`时间`,"logs.col.request":`请求`,"logs.col.model":`模型`,"logs.col.effort":`推理强度`,"logs.col.provider":`提供方`,"logs.col.status":`状态`,"logs.col.tokens":`Token 数`,"logs.col.tokPerSec":`tok/s`,"logs.col.estimatedCost":`~$`,"logs.metric.tokPerSecTitle":`按完整请求耗时计算的每秒输出 token`,"logs.metric.estimatedCostTitle":`按 API 标价估算,并非实际扣费;价格无法匹配时不显示`,"usage.cost.total":`API 标价折算(当前范围)`,"usage.cost.disclaimer":`这不是账单或扣费凭证。实际可能计入订阅用量或消耗服务商额度。`,"usage.cost.unpricedNote":`已排除 {count} 个无法计费的请求`,"logs.detail.section.basic":`基本信息`,"logs.detail.route.section":`路由决策`,"logs.detail.route.kind":`路由类型`,"logs.detail.route.profile":`配置文件`,"logs.detail.route.selected":`已选择`,"logs.detail.route.candidates":`候选`,"logs.detail.route.unknown":`此请求未记录路由跟踪(跟踪之前的行)。`,"logs.detail.section.performance":`性能`,"logs.detail.section.cost":`API 标价折算`,"logs.detail.section.attempts":`Combo 尝试`,"logs.detail.section.usage":`原始 usage`,"logs.detail.ttft":`TTFT`,"logs.detail.costTotal":`标价折算`,"logs.detail.totalTokens":`Token 总数`,"logs.detail.matchedKey":`匹配的价格键`,"logs.detail.priceSource":`价格来源`,"logs.detail.unavailableReason":`不可用原因`,"logs.detail.copyRequestId":`复制请求 ID`,"logs.detail.copied":`已复制`,"logs.detail.source.jawcode":`jawcode 目录`,"logs.detail.source.expected":`Expected 价格覆盖`,"logs.detail.source.user":`用户配置的提供方价格覆盖`,"logs.detail.verification.verified":`已验证`,"logs.detail.verification.derived":`由基础模型推导`,"logs.detail.attempt.target":`提供方 / 模型`,"logs.detail.attempt.reason":`结果 / 原因`,"logs.detail.attempt.completed":`已完成`,"logs.detail.attempt.e2eNote":`顶层 tok/s 为端到端值;每次尝试使用各自耗时。`,"logs.detail.attempt.recovery.transient5xx":`临时 5xx 错误`,"logs.detail.attempt.recovery.connectionReset":`连接已重置`,"logs.detail.attempt.recovery.oauth401":`OAuth 重新认证`,"logs.detail.attempt.recovery.key429":`密钥被限流 (429)`,"logs.detail.attempt.recovery.rateLimit429":`被限流 (429)`,"logs.detail.attempt.recovery.anthropicOauth429":`Anthropic OAuth 被限流 (429)`,"logs.detail.attempt.recovery.image413":`图片载荷过大 (413)`,"logs.detail.attempt.recovery.emptyCompletion":`空完成重试`,"logs.detail.attempt.recovery.unknown":`未知的恢复原因`,"logs.detail.reason.usage_missing":`未上报 usage。`,"logs.detail.reason.usage_unsupported":`该提供方不支持上报 usage。`,"logs.detail.reason.output_missing":`未上报正数输出 token。`,"logs.detail.reason.invalid_duration":`请求耗时无效。`,"logs.detail.reason.price_unmatched":`未找到匹配的价格。`,"logs.detail.reason.invalid_cache_breakdown":`缓存 token 明细与输入 token 总数冲突。`,"logs.detail.reason.invalid_usage":`Usage 包含无效的 token 值。`,"logs.detail.reason.combo_attempt_unavailable":`至少一次 Combo 尝试无法计价。`,"logs.detail.estimate.usage_estimated":`提供方 usage 为估算值。`,"logs.detail.estimate.cache_detail_missing":`缺少缓存明细;输入费用按上限估算。`,"logs.detail.estimate.expected_price_overlay":`使用了已验证的 Expected 标价。`,"logs.detail.estimate.provider_cost_overlay":`使用了用户配置的提供方价格覆盖。`,"logs.detail.estimate.priority_lower_bound":`暂无已确认的 Priority 价格;当前显示的估算是已知下界。`,"logs.col.error":`错误`,"logs.col.upstreamReason":`上游原因`,"logs.col.duration":`耗时`,"logs.modelTooltip.model":`模型`,"logs.modelTooltip.resolvedModel":`解析后模型`,"logs.modelTooltip.requestedTier":`请求层级`,"logs.modelTooltip.configuredTier":`配置层级`,"logs.modelTooltip.responseTier":`响应层级`,"logs.modelTooltip.supportsTier":`支持层级`,"logs.tokens.reported":`已上报`,"logs.tokens.unreported":`未上报`,"logs.tokens.unsupported":`不支持`,"logs.tokens.estimated":`估算`,"logs.tokens.input":`输入`,"logs.tokens.output":`输出`,"logs.tokens.cacheRead":`缓存命中 (c)`,"logs.tokens.cacheWrite":`缓存写入 (w)`,"logs.tokens.reasoning":`推理`,"logs.tokens.noCache":`无缓存数据`,"logs.tokens.contextTotal":`活动上下文`,"logs.tokens.noCacheNote":`该提供商不报告缓存 token 数`,"logs.tokens.noCacheCursor":`Cursor 未报告缓存明细`,"logs.tokens.noCacheCursorNote":`Cursor 不提供缓存读写 token 数;这表示未知,并不代表已确认缓存未命中`,"logs.tokens.estimatedNote":`估算值(提供商不报告精确用量)`,"logs.details":`查看详情`,"logs.detailTitle":`请求详情`,"logs.detailRaw":`原始日志`,"debug.title":`调试`,"debug.subtitle":`可选的 provider transport 与 usage 提取诊断。请求错误和 502 在“日志”标签页显示。`,"debug.debug":`提供方调试`,"debug.usage":`用量提取`,"debug.injection":`注入日志`,"debug.claude":`Claude 入站`,"debug.claudeInbound.title":`Claude 入站请求`,"debug.claudeInbound.sub":`显示 Claude Code/Desktop 实际发送的内容(thinking、effort、metadata)— 不保存提示词原文。`,"debug.claudeInbound.empty":`尚未捕获任何请求。开启后从 Claude 发送一条消息试试。`,"debug.claudeInbound.time":`时间`,"debug.claudeInbound.endpoint":`端点`,"debug.claudeInbound.model":`模型`,"debug.claudeInbound.none":`无`,"debug.reset":`清除运行时覆盖`,"debug.refresh":`刷新`,"debug.follow":`跟随滚动`,"debug.streamProvider":`提供方`,"debug.streamUsage":`用量`,"debug.streamInjection":`注入`,"debug.loading":`正在加载调试设置…`,"debug.loadFailed":`无法加载调试设置。`,"debug.emptyTitle":`调试日志已关闭`,"debug.empty":`请在上方卡片中开启 Provider debug 或 Usage extraction。通过代理发送请求后,诊断行会显示在这里。`,"debug.noLinesTitle":`等待诊断行`,"debug.noLines.provider":`提供商调试已开启,但仅记录传输异常(丢弃或格式错误的帧,以及 Cursor dial/retry 事件)。通过 Anthropic 等提供商的正常请求可能不会产生任何行。`,"debug.noLines.usage":`用量提取已开启但尚未捕获任何内容。请通过 Codex 发送请求,随后会显示在此处。`,"debug.noLines.injection":`注入日志已开启但尚未捕获任何内容。它记录协作和子代理回合中的多代理指导注入与 effort-cap 决策。`,"usage.title":`用量`,"usage.subtitle":`代理本地的 Token 用量统计。缺失的用量不会显示为零。`,"usage.loading":`正在加载用量数据…`,"usage.empty":`尚无用量记录。通过代理发送请求后将在此显示。`,"usage.loadError":`无法加载用量数据。`,"usage.range.all":`全部`,"usage.range.available":`可用历史`,"usage.historyTruncated":`由于未加载较早的使用记录,合计仅涵盖可用历史。`,"usage.historyTruncatedWindow":`已加载记录的请求开始时间介于 {start} 到 {end} 之间。受读取上限限制,文件较前的条目已被省略,所选时间范围可能不完整。`,"usage.range.30d":`30 天`,"usage.range.7d":`7 天`,"usage.card.requests":`请求数`,"usage.card.measured":`已计量`,"usage.card.reported":`已上报`,"usage.card.totalTokens":`Token 总数`,"usage.card.cachedTokens":`缓存命中 Token`,"usage.card.cachedTokensHint":`从提供商缓存读取的提示 Token(命中)。缓存写入在下方单独显示。`,"usage.card.cacheWriteTokens":`缓存写入`,"usage.card.coverage":`覆盖率`,"usage.card.activeDays":`活跃天数`,"usage.section.heatmap":`每日活动`,"usage.section.overview":`概览`,"usage.section.models":`模型`,"usage.section.providers":`提供方`,"usage.section.coverage":`覆盖率明细`,"usage.workspace.report":`用量报告`,"usage.workspace.sections":`用量分区`,"usage.coverage.measured":`已计量`,"usage.coverage.reported":`提供方上报`,"usage.coverage.estimated":`估算`,"usage.coverage.note":`已计量包含提供方上报和估算的 Token 数。未上报 / 不支持请求仅做计数,不会被算作 0 Token。`,"usage.search.models":`搜索模型…`,"usage.col.requests":`请求数`,"usage.col.measured":`已计量`,"usage.col.reported":`已上报`,"usage.col.tokens":`Token 数`,"usage.col.share":`占比`,"usage.heatmap.less":`少`,"usage.heatmap.more":`多`,"modal.addNamed":`添加:{label}`,"modal.add":`添加提供方`,"modal.catalogTabs":`提供方类别`,"modal.searchLabel":`搜索提供方`,"modal.search":`搜索提供方…`,"modal.logInWith":`使用 {label} 登录`,"modal.waitingBrowser":`等待浏览器…`,"modal.providerName":`提供方名称`,"modal.adapter":`适配器`,"modal.baseUrl":`Base URL`,"modal.endpoint":`端点`,"modal.endpoint.tokenPlan":`Token 套餐`,"modal.endpoint.payAsYouGo":`按量付费`,"modal.endpoint.custom":`自定义`,"modal.defaultModel":`默认模型(可选)`,"modal.allowPrivateNetwork":`允许本地/私有网络`,"modal.allowPrivateNetworkHint":`仅为有意自托管的提供商启用。元数据端点仍被阻止。`,"modal.nameRequired":`提供方名称为必填项`,"modal.baseUrlRequired":`Base URL 为必填项`,"modal.networkError":`网络错误 — 代理在运行吗?`,"modal.loginFailStart":`登录启动失败`,"modal.waitingLogin":`等待浏览器登录…`,"modal.loggingIn":`登录中…`,"modal.loginTimeout":`登录超时 — 请重试。`,"nav.api":`API`,"nav.integrations":`集成`,"nav.codexAuth":`Codex 认证`,"nav.codexSet":`Codex 设置`,"codexSet.tab.multiauth":`多账号认证`,"codexSet.tab.prompt":`提示词`,"codexSet.prompt.title":`提示词层`,"codexSet.prompt.timing":`对新启动的会话生效。正在运行的会话保持当前的提示词设置。`,"codexSet.prompt.staleRevision":`配置已在别处更改,列表已重新加载。`,"codexSet.prompt.writeFailed":`无法保存更改。`,"codexSet.prompt.loadFailed":`无法加载提示词层。`,"codexSet.prompt.repair":`修复`,"codexSet.prompt.repairFailed":`无法完成修复。`,"codexSet.drift.journalPresent":`上一次写入未完成。下次写入时会自动恢复。`,"codexSet.drift.projectionStale":`已保存的层与 config.toml 中的值不一致。修复会按你的层重新写入该值。`,"codexSet.drift.storeMissing":`层文件已丢失,但 config.toml 中仍有指令。修复会先创建备份,并将该文本保留为一个层。`,"codexSet.drift.ownedMalformed":`config.toml 中生成的那一行被手动改动过,因此重写不再安全。`,"codexSet.custom.adoptUnsupported":`{path} 第 {line} 行的值不是单行字符串,无法导入。若要在此管理,请手动移动它。`,"codexSet.prompt.unreadable":`Codex 配置文件存在但无法读取,因此拒绝了更改。`,"codexSet.layer.permissions":`权限`,"codexSet.layer.collaboration":`协作模式`,"codexSet.layer.environment":`环境上下文`,"codexSet.layer.apps":`应用`,"codexSet.layer.skills":`技能`,"codexSet.prompt.extensionsUnknown":`扩展可添加自己的层。Codex 不会公开这些层,因此无法在此列出。`,"codexSet.group.transition":`变更通知`,"codexSet.group.transitionDesc":`它们通报变化而非描述状态,因此仅在会话切换到实时模式或更换模型时出现。`,"codexSet.custom.slotNote":`自定义层会按此顺序合并为一个部分。`,"codexSet.row.alwaysOn":`始终启用`,"codexSet.row.onChange":`变更时发送`,"codexSet.row.featureGated":`在 [features] 下配置`,"codexSet.row.openFeatures":`打开设置`,"codexSet.dialog.setValue":`{value}(默认 {fallback})`,"codexSet.dialog.copyKey":`复制配置键`,"codexSet.dialog.unknownLayer":`此版本没有该层的说明。它来自比仪表板更新的 Codex 运行时。`,"codexSet.custom.heading":`自定义层`,"codexSet.custom.add":`+ 添加层`,"codexSet.custom.newTitle":`新建层`,"codexSet.custom.editTitle":`编辑层`,"codexSet.custom.titleLabel":`标题`,"codexSet.custom.bodyLabel":`指令`,"codexSet.custom.bodySize":`{bytes}/{max} 字节`,"codexSet.custom.normalized":`制表符已转换为四个空格,换行符已转换为 LF。`,"codexSet.custom.titleRequired":`请输入标题。`,"codexSet.custom.titleTooLong":`标题有 {count} 个字符,上限为 {max} 个。`,"codexSet.custom.titleMultiline":`标题必须为单行。`,"codexSet.custom.bodyTooLarge":`此层为 {bytes} 字节,上限为 {max} 字节。`,"codexSet.custom.composedTooLarge":`启用的层合计将达到 {bytes} 字节,超过上限。`,"codexSet.custom.invalidCharacter":`无法保存位置 {position} 的控制字符。`,"codexSet.custom.discardPrompt":`要放弃更改吗?`,"codexSet.custom.keepEditing":`继续编辑`,"codexSet.custom.delete":`删除 {title}`,"codexSet.custom.deleteConfirm":`要删除此层吗?此操作无法撤销。`,"codexSet.custom.layerGone":`该层已在别处被删除,因此编辑器已关闭。`,"codexSet.custom.deleteConfirmNamed":`要删除“{title}”吗?此操作无法撤销。`,"codexSet.custom.moveUp":`上移 {title}`,"codexSet.custom.prevLayer":`上一层`,"codexSet.custom.nextLayer":`下一层`,"codexSet.custom.navPosition":`{position} / {total}`,"codexSet.custom.moveDown":`下移 {title}`,"codexSet.custom.limitReached":`最多可保留 {max} 个自定义层。`,"codexSet.custom.notOwned":`developer_instructions 是在 opencodex 外部写入的,因此无法在此编辑。请将其导入,以便作为层进行管理。`,"codexSet.custom.adopt":`导入现有指令`,"codexSet.custom.adoptConfirm":`导入为层`,"codexSet.custom.adoptRefused":`无法导入现有值。`,"codexSet.custom.baseReplaced":`model_instructions_file 已设置为 {path},因此 opencodex 外部的内容已替换基础提示词。`,"codexSet.lint.identity":`此内容声明了与 Codex 所设定身份不同的身份。`,"codexSet.lint.foreignTool":`工具由注册表提供;在此指定名称并不会创建工具。`,"codexSet.lint.placeholder":`指令不会经过模板引擎处理,因此此内容会按原样发送。`,"codexSet.lint.applyPatch":`apply_patch 由工具注册表定义,而不是由指令定义。`,"codexSet.lint.approvalVocab":`Codex 会注入自己的审批术语;此内容可能与其冲突。`,"codexSet.lint.environment":`环境信息稍后生成,可能与此内容冲突。`,"codexSet.lint.size":`此层超过 8 KB。仍可保存,但每次请求都会消耗令牌。`,"codexSet.preset.blank":`空白层`,"codexSet.preset.concise.name":`简洁输出`,"codexSet.preset.concise.description":`简短作答,不加开场白,尽量减少格式。`,"codexSet.preset.concise.provenance":`改编自 Claude Code 的简洁性指令。文案由我们原创,并非复制。`,"codexSet.preset.planFirst.name":`编辑前先规划`,"codexSet.preset.planFirst.description":`先说明计划,再进行更改。`,"codexSet.preset.planFirst.provenance":`改编自 Claude Code 的规划思路。文案由我们原创,并非复制。`,"codexSet.preset.explainWhy.name":`解释理由`,"codexSet.preset.explainWhy.description":`不仅说明做什么,也说明为什么。`,"codexSet.preset.explainWhy.provenance":`改编自 Grok Build 的确认风格。文案由我们原创,并非复制。`,"codexSet.preset.testFirst.name":`测试优先`,"codexSet.preset.testFirst.description":`修复前先编写会失败的测试。`,"codexSet.preset.testFirst.provenance":`改编自常见的代理实践。文案由我们原创,并非复制。`,"codexSet.preset.korean.name":`韩语回复`,"codexSet.preset.korean.description":`无论请求使用哪种语言,都用韩语回答。`,"codexSet.preset.korean.provenance":`根据常见的用户需求为 opencodex 编写。文案由我们原创,并非复制。`,"codexSet.dialog.class":`类型`,"codexSet.dialog.key":`配置键`,"codexSet.dialog.fileValue":`此文件中的值`,"codexSet.dialog.absentDefault":`未设置(默认为 {value})`,"codexSet.dialog.noRenderedText":`Codex 不会公开内置层组装后的文本,因此此对话框仅说明该层并列出其配置键,不显示具体内容。`,"codexSet.dialog.sourceText":`发送给模型的原文`,"codexSet.dialog.sourceBytes":`{bytes} 字节`,"codexSet.dialog.notRendered":`在我们读取的那一轮中,此层没有发送任何内容。各部分仅在内容变化时才会重新发送,因此单次采样可能看不到它。`,"codexSet.dialog.emptySource":`{path} 文件存在但为空,因此此层不会发送任何内容。`,"codexSet.dialog.notExposed":`基础提示词不在 Codex 可打印的消息列表中传递,因此无法在此显示。可以通过 model_instructions_file 替换它。`,"codexSet.dialog.textUnavailable":`本机无法读取 Codex 提示词,因此无法显示原文。`,"codexSet.class.base":`基础指令`,"codexSet.class.config-toggle":`可在此切换`,"codexSet.class.feature-gated":`功能开关控制`,"codexSet.class.runtime-conditional":`运行时条件控制`,"codexSet.class.extension-unknown":`扩展层`,"codexSet.layer.base-instructions":`基础指令`,"codexSet.layer.model-switch":`模型切换通知`,"codexSet.layer.personality":`个性`,"codexSet.layer.context-window-guidance":`上下文窗口指引`,"codexSet.layer.realtime":`实时会话`,"codexSet.layer.agents-md":`AGENTS.md`,"codexSet.layer.environments-instructions":`执行环境`,"codexSet.layer.plugins":`插件`,"codexSet.layer.tools":`工具`,"codexSet.layer.multi-agent-mode":`多代理模式`,"codexSet.layer.git-attribution":`提交署名`,"codexSet.about.base-instructions":`Codex 自身的指令。它们随请求一同发送,无法关闭。`,"codexSet.about.model-switch":`会话中途切换模型时添加。`,"codexSet.about.personality":`语气和表达风格指引,由功能开关控制。`,"codexSet.about.context-window-guidance":`剩余上下文预算的相关建议,由功能开关控制。`,"codexSet.about.realtime":`实时会话中添加。`,"codexSet.about.agents-md":`项目中的 AGENTS.md 文件。此页面只显示该层,绝不会编辑项目文档。`,"codexSet.about.permissions":`说明当前生效的沙箱和审批设置。`,"codexSet.about.collaboration":`说明当前启用的协作模式。`,"codexSet.about.environment":`工作目录、平台及其他环境信息。`,"codexSet.about.environments-instructions":`延迟执行环境的相关指引,由功能开关控制。`,"codexSet.about.apps":`已连接应用的使用方式。`,"codexSet.about.plugins":`选中插件或任一插件声明功能时添加。`,"codexSet.about.tools":`延迟加载的工具说明,由功能开关控制。`,"codexSet.about.skills":`可用技能列表。`,"codexSet.about.multi-agent-mode":`子代理指令,由功能开关控制。`,"codexSet.about.git-attribution":`让模型在它写的提交里加上 Co-authored-by: Codex 尾注,并在它开的拉取请求里加上 Generated with Codex. 这一行。Codex 从你的账号读取此项,所以这里和 [features] 都改不了。账号关闭时,Codex 会发送相反的指令,而不是什么都不发。`,"codexSet.condition.model-switch":`仅在会话中途切换模型后注入。`,"codexSet.condition.realtime":`仅在实时会话中注入。`,"codexSet.condition.agents-md":`找到适用于当前工作目录的项目文档时注入。`,"codexSet.condition.plugins":`选中插件或任一插件声明功能时注入。`,"codexSet.condition.git-attribution":`由你账号的署名策略决定。`,"codexSet.base.title":`基础提示词`,"codexSet.base.prev":`上一个选项`,"codexSet.base.next":`下一个选项`,"codexSet.base.position":`{position} / {total}`,"codexSet.base.swipeHint":`左右滑动、按方向键,或点箭头按钮切换选项。对新开始的会话生效。`,"codexSet.base.defaultTitle":`Codex 自带的基础提示词`,"codexSet.base.defaultBody":`默认项并不存在这里,所以没有可编辑或删除的内容:选它只是从配置里移除 model_instructions_file,让 Codex 用自带的提示词。`,"codexSet.base.variantTitle":`名称`,"codexSet.base.variantBody":`提示词`,"codexSet.base.replacesWarning":`这会整体替换 Codex 自带的基础提示词,而不是在其后追加。这里写得短,模型收到的指令就只有这么短。`,"codexSet.base.use":`用这一个`,"codexSet.base.inUse":`正在使用`,"codexSet.base.externalBlocked":`model_instructions_file 已指向 {path},且不是 opencodex 写的。请先自行清除,再在此处选择。`,"nav.openMenu":`打开菜单`,"nav.closeMenu":`关闭菜单`,"integrations.subtitle":`将客户端连接到 opencodex,管理凭据并恢复客户端配置。`,"integrations.tabsLabel":`集成页面`,"integrations.tab.overview":`概览`,"integrations.tab.keys":`API 密钥`,"integrations.tab.codex":`Codex CLI`,"integrations.tab.claude":`Claude`,"integrations.tab.grok":`Grok Build`,"integrations.tab.opencode":`OpenCode`,"integrations.tab.pi":`Pi`,"integrations.tab.omp":`OMP`,"integrations.tab.hermes":`Hermes`,"integrations.tab.openclaw":`OpenClaw`,"integrations.tab.kimi":`Kimi Code`,"integrations.tab.gajae":`Gajae Code`,"integrations.tab.dsh":`DeepSeek Harness (DSH)`,"integrations.tab.mcode":`MiniMax Code`,"integrations.tab.zcode":`ZCode`,"integrations.tab.prime":`Prime Agent`,"integrations.codex.title":`Codex CLI`,"integrations.codex.body":`Codex 连接由代理服务管理。启动 opencodex 时应用该连接;停止服务时恢复原生路由。`,"integrations.codex.openService":`打开服务控制`,"integrations.state.notInstalled":`未安装`,"integrations.state.unknown":`检查中`,"integrations.detail.codexRouted":`Codex 请求经由此代理`,"integrations.detail.codexAbsent":`Codex 尚未经由此代理`,"integrations.detail.keyCount":`已签发 {count} 个密钥`,"integrations.detail.keyNone":`尚未签发密钥`,"integrations.detail.keyChecking":`检查中…`,"integrations.detail.keyUnavailable":`无法获取密钥状态`,"integrations.detail.claudeOff":`连接已关闭`,"integrations.detail.desktopCurrent":`Desktop 正在使用此配置`,"integrations.detail.desktopStale":`应用后配置文件已更改`,"integrations.detail.desktopNotServed":`配置存在,但 Desktop 使用的是另一个`,"integrations.detail.desktopAbsent":`未应用任何配置`,"integrations.detail.desktopDesiredOff":`Claude Desktop 集成已关闭`,"integrations.detail.desktopDesiredOffCleanupPending":`Claude Desktop 仍在使用网关,清理尚未完成`,"integrations.detail.desktopDesiredOnNotApplied":`集成已开启,但 Desktop 未使用网关配置`,"integrations.detail.desktopSelectedElsewhere":`Desktop 正在使用其他配置`,"integrations.detail.desktopProfileDrift":`选中的 Desktop 配置已更改`,"integrations.detail.desktopObservedUnsafe":`无法安全更改选中的 Desktop 配置`,"integrations.detail.desktopNotInstalled":`未安装 Claude Desktop 配置库`,"integrations.dialog.desktop.title":`要关闭 Claude Desktop 集成吗?`,"integrations.dialog.desktop.changes":`如果 {path} 包含由 opencodex 管理的网关配置,Desktop 会先选择新的无凭据标准配置,再移除旧配置及其备份。`,"integrations.dialog.desktop.breakage":`Claude Desktop 将不再使用经由 opencodex 路由的模型,而会恢复为标准 Claude。`,"integrations.dialog.desktop.undo":`重新开启后,会根据已保存的模型分配重新生成 opencodex 配置。`,"integrations.dialog.desktop.restart":`Claude Desktop 仅在启动时读取此配置。请完全退出并重新打开 Desktop 以使更改生效。`,"integrations.dialog.desktop.confirm":`停用`,"integrations.native.error.desktopUnsafeMetadata":`无法安全读取 {path} 中的 Claude Desktop 元数据,因此未更改其配置库。`,"integrations.native.error.desktopCleanupIncomplete":`Claude Desktop 已指向标准模式,但仍残留旧的 opencodex 凭据文件:{paths}。`,"integrations.native.msg.desktopDisabled":`Claude Desktop 集成已关闭。`,"integrations.native.msg.desktopEnabled":`Claude Desktop 集成已开启。`,"integrations.detail.grokModels":`已接入 {count} 个模型`,"integrations.detail.grokAbsent":`配置中没有 opencodex 区块`,"integrations.dialog.grok.title":`要停用 Grok Build 集成吗?`,"integrations.dialog.grok.changes":`只会从 {path} 中删除由 opencodex 标记的区块。区块之外手动写入的内容将保持不变。`,"integrations.dialog.grok.breakage":`停用后,Grok Build 中的 opencodex 模型别名将消失。通过 xAI 账号使用的模型不受影响。`,"integrations.dialog.grok.undo":`如果 opencodex 正在 loopback 地址上运行,再次启用时会根据当前可用的模型列表重新写入区块。`,"integrations.dialog.grok.confirm":`停用`,"integrations.native.msg.nonLoopbackRemoved":`只有当 opencodex 在 loopback 地址上运行时,才能自动注册 Grok Build。已删除之前指向 loopback 地址的区块。`,"integrations.native.msg.nonLoopbackRemovedNoop":`只有当 opencodex 在 loopback 地址上运行时,才能自动注册 Grok Build。没有需要删除的旧区块。`,"integrations.native.msg.nonLoopbackSuperseded":`只有当 opencodex 在 loopback 地址上运行时,才能自动注册 Grok Build。在此期间,其他进程向配置写入了新区块,因此文件中的当前区块并非由本次请求创建。`,"integrations.native.error.orphanedMarker":`{path} 中有 opencodex 开始标记,但没有结束标记。由于无法确定该区块的结束位置,因此未修改文件。`,"integrations.native.error.homeMismatch":`已安装服务的主目录与当前主目录不一致,因此未修改文件。`,"integrations.native.error.notInstalled":`尚未安装 Grok Build,因此没有可更改的内容。`,"integrations.native.error.configBusy":`其他进程正在保存配置,无法进行更改。请稍后重试。`,"integrations.state.absent":`未应用`,"integrations.state.current":`已应用`,"integrations.state.stale":`需要更新`,"integrations.state.conflict":`冲突`,"integrations.state.unsafe":`无法验证`,"integrations.summary.detected":`已检测客户端`,"integrations.summary.applied":`已配置客户端`,"integrations.summary.stale":`需要更新`,"integrations.summary.lastChange":`上次更改`,"integrations.summary.disableAll":`全部禁用…`,"integrations.onboarding":`应用时会先保存备份,再写入一个 opencodex 提供方配置块。禁用时只移除该配置块,并可从保留的快照恢复。`,"integrations.empty.title":`未检测到已安装的客户端`,"integrations.empty.body":`安装受支持的客户端,然后返回此处应用 opencodex。`,"integrations.action.apply":`应用`,"integrations.action.disable":`禁用`,"integrations.action.refresh":`更新`,"integrations.action.settings":`设置`,"integrations.action.manageKeys":`管理密钥`,"integrations.action.restore":`恢复…`,"integrations.action.undo":`撤销`,"integrations.action.restorePoint":`恢复到此时间点…`,"integrations.action.snapshotExpired":`备份已过期`,"integrations.rollback.title":`恢复中心`,"integrations.rollback.empty":`暂无应用记录`,"integrations.rollback.emptyBody":`每次成功写入前都会先保留一份写入前快照。`,"integrations.restore.title":`恢复此快照?`,"integrations.restore.body":`系统会先备份当前文件,再用所选快照替换它。`,"integrations.restore.driftTitle":`检测到较新的编辑`,"integrations.restore.driftBody":`此快照之后的更改将先备份,然后再替换文件。`,"integrations.restore.confirm":`恢复`,"integrations.restore.confirmDrift":`备份较新的编辑并恢复`,"integrations.restore.pending":`正在恢复…`,"integrations.restore.manual":`自动恢复失败:{reason}。请从 {path} 手动恢复。`,"integrations.error.load":`无法加载集成状态。`,"integrations.error.stale":`最近一次刷新失败。以下值可能已过期。`,"integrations.error.busy":`此客户端的另一项更改仍在进行中。请稍后重试。`,"integrations.error.conflict":`opencodex 写入后配置又发生了更改。未移除任何内容。`,"integrations.error.unsafe":`无法安全地更改配置。`,"integrations.error.generic":`集成更改失败。已保留之前的状态。`,"integrations.error.nonLoopback":`{client} 只能连接 localhost 上的代理:其配置没有位置放置远程绑定所需的准入标头,手动编写同样无效。请改用隧道或本地转发器提供 loopback 访问。`,"integrations.status.installed":`已安装`,"integrations.status.notInstalled":`未安装`,"integrations.status.appliedAt":`已应用`,"integrations.status.backup":`备份`,"integrations.status.lastRestore":`上次恢复`,"integrations.status.unknown":`未知`,"integrations.bulk.title":`禁用已应用的客户端集成?`,"integrations.bulk.body":`只会移除归 opencodex 所有的配置块。每个客户端都会先保留一份写入前快照。`,"integrations.bulk.partial":`部分客户端无法禁用:{clients}`,"integrations.bulk.success":`已禁用已应用的客户端集成。`,"integrations.retention.degraded":`备份清理进度滞后;磁盘上可能仍有较旧的备份。`,"integrations.error.residual":`文件可能处于中间状态:{message} 请从 {path} 恢复。`,"integrations.error.recover":`{message} 备份位于 {path}。`,"integrations.kind.apply":`已应用`,"integrations.kind.disable":`已停用`,"integrations.kind.refresh":`已更新`,"integrations.kind.restore":`已恢复`,"integrations.semantics.opencode":`仅适用于直接从磁盘启动;ocx opencode 的环境注入优先。`,"integrations.semantics.pi":`对新会话生效。`,"integrations.semantics.omp":`重启 OMP 以加载模型目录。`,"integrations.semantics.hermes":`对新会话生效。`,"integrations.semantics.openclaw":`立即应用到正在运行的网关。`,"integrations.semantics.kimi":`重启或运行 /reload 以应用(v2 会监视该文件)。`,"integrations.semantics.gajae":`在新会话中或打开 /model 时生效。`,"integrations.semantics.dsh":`OpenCodex 只管理 $DSH_HOME/settings.yaml 中的 llm-pi-ai.providers.opencodex。DSH 会热重载该 provider;你的默认模型和 deepseek-official 保持不变。目前仅支持环回地址,且不会写入真实凭据。`,"integrations.semantics.mcode":`仅管理 custom_provider.opencodex,不会更改默认模型或 MiniMax 登录状态。`,"integrations.semantics.zcode":`仅管理 ~/.zcode/v2/config.json 中的 provider.opencodex,不会更改 Z.ai 登录状态或其他提供商。更改后请重启 ZCode。`,"integrations.semantics.prime":`仅管理 Prime Agent 的 models.json 中的 providers.opencodex;默认位于 ~/.prime/agent,若设置 PRIME_AGENT_CODING_AGENT_DIR 则以其为准。不会更改其他提供商或模型覆盖设置。对新会话生效。`,"codexAuth.mainAccount":`主账号`,"codexAuth.logLabel":`日志标签`,"codexAuth.codexApp":`Codex App`,"codexAuth.appLogin":`应用登录`,"codexAuth.accountPool":`账号池`,"codexAuth.accountModeTitle":`OpenAI 账户模式`,"codexAuth.accountModePool":`账户池模式`,"codexAuth.accountModePoolDesc":`主登录与符合条件的已添加账户会在此轮换。`,"codexAuth.accountModeDirect":`直连模式`,"codexAuth.accountModeDirectDesc":`请求仅使用主登录;已添加账户会继续存储,供账户池模式使用。`,"codexAuth.openaiMissing":`未配置内置 OpenAI 提供方。`,"codexAuth.openaiDisabled":`内置 OpenAI 提供方已禁用。`,"codexAuth.openaiUnavailableDesc":`你的 OpenAI 账号仍然可用。启用提供方后即可路由 Codex 请求。`,"codexAuth.enableOpenai":`启用 OpenAI`,"codexAuth.enablingOpenai":`正在启用...`,"codexAuth.enableOpenaiFailed":`无法启用 OpenAI 提供方。`,"codexAuth.openaiPresetLoadFailed":`无法加载 OpenAI 提供方预设。`,"codexAuth.openaiPresetUnavailable":`OpenAI 提供方预设不可用。`,"codexAuth.openProviders":`打开提供商`,"codexAuth.add":`添加`,"codexAuth.sparkQuota":`Codex Spark 配额`,"codexAuth.sparkQuotaHint":`在账户卡片上显示 GPT-5.3-Codex-Spark 周窗口。默认隐藏,因为它只适用于一个模型。`,"codexAuth.sparkQuotaShown":`已显示 Codex Spark 配额`,"codexAuth.sparkQuotaHidden":`已隐藏 Codex Spark 配额`,"codexAuth.sparkQuotaFailed":`无法更改 Codex Spark 配额设置`,"codexAuth.refreshQuota":`刷新额度`,"codexAuth.refreshingQuota":`刷新中...`,"codexAuth.quotaRefreshed":`额度已刷新`,"codexAuth.quotaRefreshFailed":`额度刷新失败`,"codexAuth.pauseExhausted":`暂停已达上限账号`,"codexAuth.pausingExhausted":`正在检查额度...`,"codexAuth.pauseExhaustedSucceeded":`已暂停 {count} 个达到上限的账号`,"codexAuth.pauseExhaustedNone":`没有确认达到 100% 用量的账号。`,"codexAuth.pauseExhaustedFailed":`无法检查并暂停已达上限账号。`,"codexAuth.noPool":`尚未添加池账号。`,"codexAuth.pause":`暂停`,"codexAuth.resume":`恢复`,"codexAuth.paused":`已暂停`,"codexAuth.pauseSucceeded":`已暂停 {email}`,"codexAuth.resumeSucceeded":`{email} 已重新加入账号池`,"codexAuth.pauseFailed":`无法暂停 {email},未做任何更改。`,"codexAuth.resumeFailed":`无法恢复 {email},未做任何更改。`,"codexAuth.pausedHint":`恢复前不会参与自动切换、重试、冷却恢复或手动选择。`,"codexAuth.pinned":`已固定`,"codexAuth.pinnedHint":`这是你手动选择的账号,因此更高的选择顺序不会越过它。该固定会一直生效,直到此账号用尽、你改选其他账号,或你修改任一选择顺序。`,"codexAuth.fiveHour":`5 小时`,"codexAuth.weekly":`每周`,"codexAuth.monthly":`30天`,"codexAuth.resets":`重置`,"codexAuth.today":`今天`,"codexAuth.current":`当前`,"codexAuth.nextSession":`已选择`,"codexAuth.poolPrepared":`已为账户池准备`,"codexAuth.preparePoolTitle":`为账户池模式准备此账号?`,"codexAuth.preparePoolDesc":`直连请求仍使用主登录。启用账户池模式后,此账号会成为预先选择的池账号。`,"codexAuth.prepareForPool":`为账户池准备`,"codexAuth.poolPreparedToast":`已为账户池模式准备 {email}`,"codexAuth.switchTitle":`切换活跃账号?`,"codexAuth.switchDesc":`立即生效。已在进行中的请求保留原账号,其余都会切换到此账号;不过选择顺序相同的账号仍会轮换使用。`,"codexAuth.cacheWarning":`切换账号会重置提示缓存。新会话从空缓存开始。`,"codexAuth.setAsNext":`接下来使用此账号`,"codexAuth.cancel":`取消`,"codexAuth.switchBack":`切换回主账号?`,"codexAuth.switchBackDesc":`立即生效。已在进行中的请求保留原账号,其余都会切换到应用登录账号;不过选择顺序相同的账号仍会轮换使用。`,"codexAuth.autoSwitch":`基于用量的主动切换`,"codexAuth.autoSwitchQuotaDesc":`配额:使用率达到或超过 {threshold}% 时,包括已绑定任务在内的下一次请求可能转到用量更低的合格账号;Go/Free 仅使用 30 天窗口。`,"codexAuth.autoSwitchQuotaOffDesc":`基于用量的主动切换已关闭。新建/未绑定任务分配和故障恢复仍然生效。`,"codexAuth.autoSwitchRoundRobinDesc":`轮询分配不使用此阈值,并会继续轮换新建/未绑定任务。`,"codexAuth.autoSwitchFillFirstDesc":`填满优先:{threshold}% 是新建/未绑定任务的耗尽点;健康的已绑定任务继续使用原账号。`,"codexAuth.autoSwitchFillFirstOffDesc":`填满优先没有新建/未绑定任务的用量耗尽点;冷却、重新认证和故障恢复仍可能改变路由。`,"codexAuth.failureRecoveryNote":`故障恢复是独立机制:输出前的 429/402 拒绝、冷却、重新认证、排除或已配置的瞬时故障转移可能选择另一个合格账号。`,"codexAuth.autoSwitchThreshold":`用量阈值`,"codexAuth.autoSwitchThresholdAria":`用量阈值(百分比)`,"codexAuth.autoSwitchThresholdInc":`提高用量阈值`,"codexAuth.autoSwitchThresholdDec":`降低用量阈值`,"codexAuth.autoSwitchLoadFailed":`无法加载基于用量的切换设置。`,"codexAuth.autoSwitchThresholdInvalid":`请输入 1 到 100 之间的整数`,"codexAuth.autoSwitchUpdated":`基于用量的主动切换设置已更新`,"codexAuth.autoSwitchUpdateFailed":`无法确认基于用量的切换更新。当前显示最后一次确认的值。`,"codexAuth.requestUserInput":`在 Default 模式下请求输入`,"codexAuth.requestUserInputDesc":`允许 Codex 在 Default 模式会话中暂停,并通过 request_user_input 工具向你提问。`,"codexAuth.requestUserInputUpdated":`功能标志已更新 - 适用于新会话。`,"codexAuth.requestUserInputUpdatedRestart":`功能标志已更新 - 适用于新会话。请重启 Codex 应用。`,"codexAuth.requestUserInputUpdateFailed":`无法更新功能标志。未做任何更改。`,"codexAuth.requestUserInputLoadFailed":`无法从 config.toml 读取功能标志。`,"codexAuth.accountPickerTitle":`在模型选择器中指定 Codex 账号`,"codexAuth.accountPickerOffDesc":`启用后,普通 GPT 选择器条目会替换为每个账号选择器对应的条目,让你无需退出登录即可为对话明确选择账号。关闭此功能不会删除任何账号。`,"codexAuth.accountPickerOnDesc":`每个选择器都是一个已存储账号的公开标签。选择后,该对话会锁定到对应账号,不会参与 Pool 轮换或故障转移,也不会更改当前的 Pool 账号。`,"codexAuth.accountPickerCompatibility":`内置 Codex App 登录有自己的选择器;生成的映射通常使用 main,发生冲突时会使用 main-2 这类安全后缀。新增账号会获得稳定且保护隐私的标签,自定义选择器名称保持不变。现有对话和已保存的模型选择会继续路由。关闭后只隐藏生成的条目,选择器和精确路由仍会保留。普通 GPT 模型 ID 继续保持原有的 Pool 或 Direct 行为。`,"codexAuth.accountPickerUpdated":`账号指定设置已更新。`,"codexAuth.accountPickerUpdateFailed":`无法更新账号指定设置。当前显示的是最后一次确认的设置。`,"codexAuth.accountPickerLoadFailed":`无法加载账号指定设置。`,"codexAuth.accountPickerRefreshFailed":`无法刷新此设置。当前仍显示最后一次确认的值。`,"codexAuth.advancedSettings":`高级设置`,"codexAuth.advancedSettingsAria":`显示或隐藏高级 Codex 认证设置`,"codexAuth.catalogRefreshPending":`更改已保存,但 Codex 模型目录仍待刷新。请运行 ocx sync 重试。`,"anthropicPool.title":`Claude 账户池(实验性)`,"anthropicPool.enabledDesc":`遇到 429 时冷却该账户并故障转移。新会话优先使用 5 小时用量低于 {threshold}% 的账户。`,"anthropicPool.disabledDesc":`仅使用当前活跃的 Claude 账户。仅在接受实验性路由时启用。`,"anthropicPool.experimentalWarning":`实验性功能,尚未充分验证。看起来像自动多账户轮换的行为可能导致 Anthropic 限制账户。同一组织可能共享配额——对这些账户做池化没有帮助。除非了解风险,否则请保持关闭。`,"anthropicPool.needTwoAccounts":`启用账户池前请至少添加两个 Claude OAuth 账户。`,"anthropicPool.threshold":`新会话用量阈值`,"anthropicPool.thresholdAria":`新会话用量阈值(百分比)`,"anthropicPool.thresholdHelp":`0 表示禁用基于配额的选择(仅亲和性 + 活跃账户)。默认 80。`,"anthropicPool.thresholdInvalid":`请输入 0 到 100 之间的整数`,"anthropicPool.loadFailed":`无法加载 Claude 账户池设置。`,"anthropicPool.saveFailed":`无法保存 Claude 账户池设置。`,"anthropicPool.on":`开`,"anthropicPool.off":`关`,"cursorPool.title":`Cursor 账户池(实验性)`,"cursorPool.enabledDesc":`遇到 429 或认证失败时冷却该账户并为此对话故障转移。每个对话会保持一个账户,直到发生限速或凭据失败。`,"cursorPool.disabledDesc":`仅使用当前活跃的 Cursor 账户。仅在接受实验性路由时启用。`,"cursorPool.experimentalWarning":`实验性功能,尚未充分验证。Cursor 使用政策禁止规避速率限制和操纵用量计量。Teams 包含用量按席位计算,可能无法转移。除非了解风险,否则请保持关闭。`,"cursorPool.needTwoAccounts":`启用账户池前请至少添加两个 Cursor OAuth 账户。`,"cursorPool.loadFailed":`无法加载 Cursor 账户池设置。`,"cursorPool.saveFailed":`无法保存 Cursor 账户池设置。`,"cursorPool.on":`开`,"cursorPool.off":`关`,"antigravityRouting.failoverOnlyTitle":`多账户路由(仅故障转移)`,"antigravityRouting.failoverOnlyDesc":`每个对话保持一个 Antigravity 账户。遇到限速 429 或凭据失败时,opencodex 可为该对话故障转移到另一个符合条件的账户 — 不会在新会话间负载均衡,也不会更改其他进行中对话的全局活跃账户。`,"accountPool.strategy":`轮换策略`,"accountPool.strategyDesc":`OpenCodex 如何为新建/未绑定任务分配账号。`,"accountPool.strategyQuota":`配额`,"accountPool.strategyRoundRobin":`轮询`,"accountPool.strategyFillFirst":`填满优先`,"accountPool.strategyHintQuota":`配额策略在超过用量阈值后,也可以在现有任务的下一次请求中重新绑定账号。`,"accountPool.strategyHintRoundRobin":`轮询只轮换没有有效绑定的任务;用量阈值不会改变正常轮换。`,"accountPool.strategyHintFillFirst":`填满优先把阈值用作未绑定任务的耗尽点;健康的已绑定任务保持亲和性。`,"accountPool.unboundDefinition":`新建/未绑定任务是当前没有账号绑定的请求;已有的可见任务在代理或亲和性重置后也可能变为未绑定。`,"accountPool.stickyLimit":`轮换前的新建/未绑定任务分配数`,"accountPool.stickyLimitAria":`轮换前的新建/未绑定任务分配数`,"accountPool.stickyLimitInc":`提高粘性上限`,"accountPool.stickyLimitDec":`降低粘性上限`,"accountPool.stickyLimitHelp":`在推进到下一个账号之前,为所选账号分配这么多次新建/未绑定任务;计数在任务绑定时增加,而不是在上游成功后增加。`,"accountPool.stickyLimitInvalid":`请输入 1 到 100 之间的整数`,"accountPool.strategyLoadFailed":`无法加载轮换策略。`,"accountPool.strategyUpdateFailed":`无法保存轮换策略。`,"accountPool.priority":`选择顺序`,"accountPool.priorityAria":`此账号的选择顺序`,"accountPool.priorityHint":`数字越大越先使用。只有当排在前面的账号全部用尽或不可用时,账号池才会转向更小的数字。`,"accountPool.priorityFirst":`最先`,"accountPool.priorityEarlier":`较先`,"accountPool.priorityNormal":`默认`,"accountPool.priorityLater":`较后`,"accountPool.priorityLast":`最后`,"accountPool.priorityOption":`{name}({value})`,"accountPool.priorityCustom":`自定义`,"accountPool.priorityUpdated":`已更新 {email} 的选择顺序`,"accountPool.priorityUpdateFailed":`无法保存 {email} 的选择顺序。当前显示最后一次确认的值。`,"codexAuth.switched":`下一次请求将使用 {email}`,"codexAuth.loadFailed":`无法加载 Codex 账号设置。`,"codexAuth.switchFailed":`无法切换账户。之前的选择保持不变。`,"codexAuth.removeConfirm":`删除 {id}?`,"codexAuth.removeFailed":`无法移除账户。未进行任何更改。`,"codexAuth.addTitle":`添加 Codex 账号`,"codexAuth.addIdLabel":`账号 ID(标识符)`,"codexAuth.addJsonLabel":`auth.json 内容`,"codexAuth.addHelp":`从另一台机器的 ~/.codex/auth.json 复制,或使用 codex-auth export。`,"codexAuth.importBtn":`导入`,"codexAuth.importInvalidJson":`无效的 JSON`,"codexAuth.importMissingTokens":`JSON 中缺少 access_token 或 refresh_token`,"codexAuth.importMissingId":`请输入账号 ID`,"codexAuth.accountAdded":`账号已添加到池中`,"codexAuth.addPickDesc":`使用另一个 ChatGPT 账号登录以添加到池中。`,"codexAuth.oauthLogin":`OAuth 登录`,"codexAuth.oauthDesc":`在浏览器中打开 ChatGPT 登录`,"codexAuth.importAuthJson":`导入 auth.json`,"codexAuth.importAuthJsonDesc":`从另一个 Codex 安装或 codex-auth 导出`,"codexAuth.back":`返回`,"codexAuth.oauthAlreadyInProgress":`登录已在进行中。请在浏览器中完成。`,"codexAuth.oauthWaiting":`等待浏览器中完成 ChatGPT 登录...`,"codexAuth.oauthSubmittingCode":`正在提交代码…`,"codexAuth.oauthCodeSubmitted":`代码已提交——正在等待登录完成…`,"codexAuth.oauthStatusRetrying":`检查登录状态时发生网络或代理错误——正在重试…`,"codexAuth.oauthCancelled":`登录已取消。`,"codexAuth.loginFailed":`登录失败`,"codexAuth.needsReauth":`重新登录`,"codexAuth.reauthenticate":`重新认证`,"codexAuth.tokenExpired":`令牌已过期 — 请重新认证此账号`,"codexAuth.mainTokenExpired":`令牌已过期 — 请通过 Codex 应用登录重新登录`,"codexAuth.emailCollision":`此账号与您的主 Codex 登录相同。请使用其他账号。`,"codexAuth.resetCreditsTitle":`重置额度`,"codexAuth.resetCreditsAvailable":`您有 {count} 个可用重置额度。`,"codexAuth.resetCreditsDesc":`每个额度可立即重置您当前的小时和每周使用限制。`,"codexAuth.noResetCredits":`没有可用的重置额度。`,"codexAuth.earnCreditsHint":`额度每月自动发放,也可通过推荐计划获得。`,"codexAuth.creditsExpireNote":`额度在获得后 30 天过期。`,"codexAuth.useOneCredit":`使用 1 个额度`,"codexAuth.confirmResetTitle":`使用重置额度?`,"codexAuth.confirmResetDesc":`这将立即重置您当前的使用限制。剩余额度:{count} 个。`,"codexAuth.irreversible":`此操作不可撤销。`,"codexAuth.useCredit":`使用额度`,"codexAuth.redeeming":`重置中...`,"codexAuth.resetSuccess":`使用限制已重置!剩余额度:{remaining} 个。`,"codexAuth.resetSuccessGeneric":`使用限制已重置!`,"codexAuth.resetAlreadyRedeemed":`该额度已兑换过,额度未变。`,"codexAuth.resetNothingToReset":`当前没有需要重置的使用窗口。`,"codexAuth.resetNoCredit":`没有可用的重置额度。`,"codexAuth.resetError":`重置额度使用失败,请重试。`,"codexAuth.fifoNote":`最早获得的额度优先使用。`,"codexAuth.confirmWhichCredit":`将使用 {date} 获得的额度。`,"codexAuth.creditNext":`即将使用`,"codexAuth.creditLabel":`额度 #{n}`,"codexAuth.creditNextBadge":`NEXT`,"codexAuth.creditGranted":`获得 {date}`,"codexAuth.creditExpires":`过期 {date}(剩余 {days} 天)`,"api.title":`API 访问`,"api.subtitle":`用生成的 API 密钥从外部应用访问 opencodex 代理。认证使用 {authHeader} 请求头;各端点接受哪些请求头见下表。`,"api.endpointNote":`请将基础 URL 用于 OpenAI 兼容客户端。Responses 与 Chat Completions 在 /v1 下提供。`,"api.baseUrl":`基础 URL`,"api.responsesEndpoint":`Responses API`,"api.chatCompletionsEndpoint":`Chat Completions API`,"api.messagesEndpoint":`Messages API`,"api.modelsEndpoint":`Models API`,"api.endpointsTitle":`网关端点`,"api.authBaseUrlNote":`客户端应使用基础 URL,然后选择下面的协议端点。`,"api.authTitle":`身份验证`,"api.authLoopback":`回环绑定(127.0.0.1 或 ::1)会跳过身份验证。远程绑定需要生成的 ocx_ 密钥或 OPENCODEX_API_AUTH_TOKEN。`,"api.modelsTitle":`外部模型目录`,"api.modelsCount":`{count} 个可调用`,"api.modelsSearch":`搜索模型`,"api.modelsSubtitle":`请使用这些精确的模型 ID 搭配 /v1/models 和你选择的入站协议。`,"api.modelsLoading":`正在加载模型…`,"api.modelsEmpty":`还没有可供外部调用的模型。`,"api.modelsNoMatch":`没有与“{query}”匹配的模型。`,"api.modelsLoadFailed":`无法加载外部模型目录。`,"api.colModel":`模型`,"api.colSource":`来源`,"api.colProtocols":`协议`,"api.copyModelId":`复制 ID`,"api.modelCopied":`已复制`,"api.testModel":`测试`,"api.testingModel":`测试中…`,"api.testSucceeded":`成功`,"api.testFailed":`失败`,"api.protocolResponses":`Responses`,"api.protocolChatCompletions":`Chat Completions`,"api.protocolMessages":`Messages`,"api.sourceNative":`ChatGPT 池`,"api.sourceCombo":`组合路由`,"api.sourceCustom":`自定义`,"api.usageResponsesTitle":`Responses 示例`,"api.usageChatTitle":`Chat Completions 示例`,"api.usageMessagesTitle":`Messages 示例`,"api.newKeyTitle":`已创建新密钥`,"api.newKeyNote":`请立即复制此密钥,它不会再次显示。`,"api.copy":`复制`,"api.copied":`已复制`,"api.dismiss":`关闭`,"api.generateTitle":`生成密钥`,"api.keyNamePlaceholder":`密钥名称(可选)`,"api.generate":`生成`,"api.generating":`创建中…`,"api.activeKeys":`活跃密钥({count})`,"api.activeKeysLoading":`有效密钥`,"api.noKeys":`还没有 API 密钥。请在上方生成一个。`,"api.workspace.sections":`API 分区`,"api.section.keys":`密钥`,"api.section.connect":`连接`,"api.section.endpoints":`端点`,"api.section.models":`模型`,"api.section.examples":`示例`,"api.workspace.details":`API 密钥详情`,"api.workspace.keyDetails":`密钥详情`,"api.workspace.keyPrefix":`密钥前缀`,"api.workspace.deleteKey":`删除密钥`,"api.workspace.deleteConfirm":`确定要删除此密钥吗?此操作无法撤销。`,"api.workspace.usageExamples":`用法示例`,"api.copyUrlHint":`点击复制 URL`,"api.urlCopied":`已复制 URL`,"api.copyExampleHint":`点击复制示例`,"api.exampleCopied":`已复制示例`,"api.colName":`名称`,"api.colKey":`密钥`,"api.colCreated":`创建时间`,"api.confirm":`确认`,"api.deleteAria":`删除 API 密钥`,"api.usageSampleInput":`你好,世界!`,"api.clientConfig.title":`客户端配置`,"api.clientConfig.rowsLabel":`连接客户端`,"api.clientConfig.details":`详情`,"api.clientConfig.detailsAria":`{client} 配置详情`,"api.clientConfig.copyAria":`复制 {client} 配置`,"api.clientConfig.downloadAria":`下载 {client} 配置`,"api.clientConfig.rowMeta":`{destination} · {count} 个模型`,"api.clientConfig.rowError":`无法生成 {client} 配置。`,"api.clientConfig.copiedAnnounceClient":`已将 {client} 配置复制到剪贴板。`,"api.clientConfig.clientOpencode":`OpenCode`,"api.clientConfig.clientPi":`Pi`,"api.clientConfig.clientOmp":`OMP`,"api.clientConfig.clientHermes":`Hermes`,"api.clientConfig.clientOpenclaw":`OpenClaw`,"api.clientConfig.clientKimi":`Kimi Code`,"api.clientConfig.clientGajae":`Gajae Code`,"api.clientConfig.clientDsh":`DeepSeek Harness (DSH)`,"api.clientConfig.clientMcode":`MiniMax Code`,"api.clientConfig.clientZcode":`ZCode`,"api.clientConfig.clientPrime":`Prime Agent`,"api.clientConfig.copy":`复制配置`,"api.clientConfig.download":`下载`,"api.clientConfig.loading":`正在生成客户端配置…`,"api.clientConfig.jsonLabel":`{client} 配置`,"api.clientConfig.destination":`目标文件`,"api.clientConfig.envHint":`启动前设置密钥`,"api.clientConfig.mergeWarning":`请合并到目标文件中。直接替换会丢失你已有的其他提供商和 MCP 配置。`,"api.clientConfig.modelCount":`已导出 {count} 个模型`,"api.clientConfig.missingLimits":`{total} 个模型中有 {count} 个没有上下文上限,客户端将使用自己的默认值。`,"api.clientConfig.noKeyYet":`{env} 目前还没有对应的密钥。离开回环地址使用前,请先在上方生成密钥。`,"api.clientConfig.loadFailed":`无法读取模型列表,因此没有生成客户端配置。`,"api.clientConfig.copiedAnnounce":`客户端配置已复制到剪贴板。`,"api.clientConfig.copyFailed":`无法复制客户端配置。`,"api.clientConfig.downloadedAnnounce":`已下载 {filename}。目前还没有任何改动,请自行将其合并到 {destination}。`,"api.clientConfig.whereDisclosure":`该文件应放在哪里`,"api.clientConfig.whereBody":`上面的路径是全局配置位置。工作目录中的项目级配置文件优先级更高;密钥由配置中指定的环境变量读取,不会写入该文件。`,"api.keysLoadFailed":`无法加载 API 密钥。`,"api.createFailed":`无法创建 API 密钥。`,"api.deleteFailed":`无法删除 API 密钥。`,"api.auth.endpoint":`端点`,"api.auth.required":`必需`,"api.auth.accepted":`可用`,"api.auth.rejected":`不接受`,"api.auth.testProtocol":`测试 {protocol}`,"api.auth.testNeedsFreshKey":`要运行带认证的测试,请先生成密钥,并让一次性显示的值保留在屏幕上。`,"api.key.name":`密钥名称`,"api.key.rename":`重命名`,"api.key.saveName":`保存名称`,"api.key.renaming":`保存中…`,"api.key.renameFailed":`无法重命名密钥,已保留你输入的内容。`,"api.key.deleting":`删除中…`,"api.key.copyFailed":`无法复制密钥。关闭此面板前请手动选中并复制。`,"api.attribution.title":`按密钥统计的用量`,"api.attribution.requests7d":`最近 7 天请求数`,"api.attribution.totalRequests":`已归属请求总数`,"api.attribution.totalRequestsAvailable":`可用历史中的请求`,"api.attribution.sinceAvailable":`可用归属记录起始时间`,"api.attribution.lastUsed":`最近使用`,"api.attribution.since":`统计起始`,"api.attribution.neverUsed":`统计开始后未使用`,"api.attribution.unavailable":`暂无用量`,"api.attribution.unavailableDetail":`尚未归属任何用量。统计开始之前的请求无法追溯归属。`,"api.attribution.ambiguous":`两个密钥共用同一个 ID,无法判断用量属于哪一个。请在配置文件中为每个密钥设置唯一 ID。`,"api.attribution.railAmbiguous":`ID 重复`,"claude.subtitle":`在 Claude Code 中使用 GPT、Gemini 等其他模型。`,"claude.enabledLabel":`Claude 连接`,"claude.enabledHint":`关闭后 Claude Code 无法使用此代理。`,"claude.authMode":`认证模式`,"claude.authModeHint":`Subscription 需要 Claude 账户,Proxy 无需 Anthropic 账户即可使用`,"claude.authModeSubscription":`Subscription(Claude 账户)`,"claude.authModeProxy":`Proxy(无需账户)`,"claude.authModeAuto":`自动(检测 Claude 认证)`,"claude.effectiveMode.label":`下次启动生效`,"claude.effectiveMode.manual":`手动:{mode}`,"claude.effectiveMode.autoPresent":`自动:订阅 — 已通过 {source} 找到 Claude 认证`,"claude.effectiveMode.autoAbsent":`自动:代理模式 — 未找到 Claude 认证`,"claude.effectiveMode.autoUnknown":`自动:订阅 — 无法确认认证`,"claude.effectiveMode.admissionKey":`此代理的 API 密钥仍会发送。`,"claude.authSource.claude-json-oauth":`Claude 账户`,"claude.authSource.claude-credentials-file":`凭据文件`,"claude.authSource.macos-keychain":`macOS 钥匙串`,"claude.authSource.exported-env":`环境变量`,"claude.authSource.unknown":`检测到的凭据`,"claude.systemEnv":`自动连接`,"claude.systemEnvDesc":`开启后,在任意终端运行 claude 会自动通过代理。`,"claude.systemEnvUnsupported":`自动连接仅在 macOS 上可用。在此系统上,请使用 {cmd} 启动 Claude。`,"claude.systemEnvWarn":`⚠ 需要完全退出并重新打开终端应用才能生效。不推荐使用。`,"claude.fastMode":`Fast Mode (OpenAI)`,"claude.fastModeDesc":`控制 OpenAI 模型的推理速度。ON = 优先级(更快)。OFF = 默认速度。Auto = 透传客户端设置。`,"claude.fastAuto":`Auto`,"claude.fastOn":`ON`,"claude.fastOff":`OFF`,"claude.autoContext":`自动利用大上下文`,"claude.autoContextDesc":`决定 1M 标记的范围。开:窗口能容纳压缩阈值的模型都有大上下文条目;关:仅真正的 1M 模型有。`,"claude.autoContextInert":`配置文件中存在旧式上下文大小值(maxContextTokens),此功能暂不生效。删除该值即可恢复。`,"claude.autoCompactWindow":`自动摘要触发点`,"claude.autoCompactDefault":`{value}(默认)`,"claude.autoCompactWindowDesc":`对话达到该点时自动摘要旧内容。不会超过各模型自身上限,因此 200k 模型不受影响。`,"claude.autoCompactWindowWarn":`修改该值可能导致 GPT 模型异常——若超过模型真实上限,会在摘要触发前报错。`,"claude.injectAgents":`自动注册子代理`,"claude.injectAgentsDesc":`将“子代理”页选中的模型(以及当前默认模型)注册为 Claude Code 可派遣的代理(ocx-*)。从下一个会话开始生效。`,"claude.webSearchSidecar":`网页搜索附属服务覆盖`,"claude.webSearchSidecarHint":`仅对 Claude Code 请求覆盖主网页搜索附属服务设置。`,"claude.visionSidecar":`视觉附属服务覆盖`,"claude.visionSidecarHint":`仅对 Claude Code 请求覆盖主视觉附属服务设置。`,"claude.useMainSetting":`使用主设置`,"claude.sidecarModelPlaceholder":`主设置中的模型`,"claude.quickstart":`开始使用`,"claude.quickstartHint":`{cmd} 通过代理打开 Claude Code。你的 claude.ai 登录保持不变。`,"claude.manualEnv":`手动配置(高级)`,"claude.smallFastModel":`后台辅助模型`,"claude.smallFastModelHint":`Claude Code 用于对话摘要、主题识别等后台工作的模型。子代理的 haiku 别名也使用它。留空 = Claude 默认(Haiku)。`,"claude.smallFastModelAccurateHint":`Claude Code 用于聊天摘要、主题识别等后台工作的模型。子代理的 haiku 别名也使用此模型。`,"claude.smallFastModelUnsetOption":`让 Claude Code 选择(原生模型)`,"claude.smallFastModelNativeWarning":`留空时,OpenCodex 不会设置辅助模型覆盖项。Claude Code 可能使用其原生 Sonnet 模型,并可能产生原生提供方费用。`,"claude.slotUnset":`使用 Claude 默认值`,"claude.modelMap":`模型拦截`,"claude.modelMapHint":`拦截对特定模型的请求并重定向到你指定的模型。默认为空——添加规则后才生效。`,"claude.mapFrom":`原始模型(如 claude-sonnet-4-5)`,"claude.mapTo":`替换为(如 gemini/gemini-3-pro)`,"claude.addMapping":`添加规则`,"claude.removeMapping":`删除规则`,"claude.aliases":`可用模型`,"claude.aliasesHint":`Claude Code 的 /model 菜单中显示的模型列表。`,"claude.aliasProviderOther":`其他`,"claude.loading":`加载中…`,"claude.loadFail":`加载 Claude 设置失败`,"claude.saved":`已保存。`,"claude.saveFailed":`保存失败`,"claude.networkError":`网络错误 — 代理是否在运行?`,"claude.toggleAria":`切换 Claude 连接`,"claude.none":`无`,"common.close":`关闭`,"common.ok":`确定`,"app.logoAria":`opencodex 徽标`,"app.pageTitle":`{page} — opencodex`,"app.claudeOn":`Claude 开`,"app.claudeOff":`Claude 关`,"usage.dayMon":`一`,"usage.dayWed":`三`,"usage.dayFri":`五`,"usage.heatmap.tooltipTokens":`{tokens} 令牌`,"usage.heatmap.tooltipRequests":`{requests} 请求`,"usage.chart.dayDetail":`{date}:{requests} 个请求,{tokens} 个 Token`,"usage.heatmap.keyboardLabel":`使用上下方向键按天移动,使用左右方向键按周移动。`,"nav.storage":`存储`,"storage.title":`存储`,"storage.subtitle":`查看 CODEX_HOME 占用。清理不会动到活动会话。`,"storage.loading":`正在扫描存储…`,"storage.empty":`CODEX_HOME 为空或不存在——没有可显示的内容。`,"storage.error":`存储扫描失败。请检查 CODEX_HOME 是否指向有效目录。`,"storage.refresh":`重新扫描`,"storage.rescanned":`扫描完成。`,"storage.card.total":`总大小`,"storage.card.files":`文件数`,"storage.card.home":`CODEX_HOME`,"storage.snapshot.lastScan":`上次扫描`,"storage.snapshot.scanning":`扫描中…`,"storage.snapshot.unavailable":`尚无扫描。`,"storage.cleanupCard.title":`释放空间`,"storage.cleanupCard.tabs":`清理选项`,"storage.cleanupCard.tab.policy":`策略`,"storage.cleanupCard.tab.quarantine":`隔离区`,"storage.cleanup.noArchives":`没有可清理的归档会话。`,"storage.section.buckets":`分类`,"storage.section.largest":`最大文件`,"storage.workspace.overview":`概览`,"storage.workspace.selectBucket":`从列表中选择一个存储桶以查看明细。`,"storage.col.bucket":`分类`,"storage.col.size":`大小`,"storage.col.files":`文件`,"storage.col.oldest":`最旧`,"storage.col.newest":`最新`,"storage.col.rows":`数据库行数`,"storage.rows.unknown":`未知(已锁定)`,"storage.bucket.sessions":`活动会话`,"storage.bucket.archived_sessions":`已归档会话`,"storage.bucket.logs_db":`日志数据库`,"storage.bucket.state_db":`状态数据库`,"storage.bucket.attachments":`附件`,"storage.bucket.deletion_manifests":`删除清单`,"storage.bucket.other":`其他`,"storage.cleanup.title":`归档清理`,"storage.cleanup.help":`按百分比移除最旧的归档会话。不会触碰活动会话。默认隔离——文件移至 CODEX_HOME/.trash。`,"storage.cleanup.slider":`最旧归档百分比`,"storage.cleanup.percent":`{percent}%`,"storage.cleanup.preset":`{percent}`,"storage.cleanup.preview":`预览`,"storage.cleanup.confirmTitle":`确认归档清理`,"storage.cleanup.confirmBody":`将处理 {count} 个归档文件(约 {size}),即最旧的 {percent}%。`,"storage.cleanup.moreFiles":`…以及另外 {n} 个`,"storage.cleanup.permanent":`永久删除(跳过隔离)`,"storage.cleanup.permanentWarn":`永久删除无法撤销。`,"storage.cleanup.quarantineNote":`文件会移到 CODEX_HOME 下的 .trash。可在「隔离区」标签页恢复。`,"storage.cleanup.cancel":`取消`,"storage.cleanup.confirmQuarantine":`隔离`,"storage.cleanup.confirmPermanent":`永久删除`,"storage.cleanup.doneQuarantine":`已隔离 {count} 个文件({size})。`,"storage.cleanup.donePermanent":`已永久删除 {count} 个文件({size})。`,"storage.cleanup.previewFailed":`预览失败。`,"storage.cleanup.cleanupFailed":`清理失败。`,"storage.cleanup.err.codex_busy":`Codex 正在使用 state.sqlite — 请退出 Codex 后重试。`,"storage.cleanup.err.stale_preview":`预览后归档文件已变化 — 请重新预览。`,"storage.cleanup.err.restore_pending_overlap":`所选归档与未完成的隔离区恢复重叠 — 请先完成或重试恢复。`,"storage.cleanup.err.referenced_history":`所选归档仍被 fork 或分页历史引用。`,"storage.cleanup.err.invalid_digest":`预览摘要缺失或无效。`,"storage.cleanup.err.invalid_mode":`模式必须是 quarantine 或 permanent。`,"storage.cleanup.err.fs_failed":`文件系统清理失败。部分更改可能已生效 — 请检查 CODEX_HOME/.trash 及显示的恢复路径。`,"storage.cleanup.err.fs_failed_trash":`文件系统清理失败。部分更改可能已生效 — 请在 {trashDir} 和 manifest.json 中查找可恢复文件。`,"storage.cleanup.err.db_reconcile_failed":`无法更新 Codex 状态数据库。`,"storage.cleanup.err.cleanup_failed":`清理失败。`,"storage.trash.title":`隔离区`,"storage.trash.help":`已移至 CODEX_HOME/.trash 的归档会话。恢复会把 JSONL 与线程行写回。`,"storage.trash.empty":`没有隔离条目。`,"storage.trash.loading":`正在加载隔离区…`,"storage.trash.col.when":`隔离时间`,"storage.trash.col.files":`文件`,"storage.trash.col.size":`大小`,"storage.trash.col.mode":`模式`,"storage.trash.col.id":`条目`,"storage.trash.restore":`恢复`,"storage.trash.confirmTitle":`恢复隔离条目?`,"storage.trash.confirmBody":`将 {count} 个文件(约 {size})从 {id} 恢复到归档会话。`,"storage.trash.cancel":`取消`,"storage.trash.confirmRestore":`恢复`,"storage.trash.done":`已恢复 {count} 个文件({size})。`,"storage.trash.restoreFailed":`恢复失败。`,"storage.trash.listFailed":`无法列出隔离条目。`,"storage.trash.mode.quarantine":`隔离`,"storage.trash.mode.permanent":`永久(未完成)`,"storage.trash.err.codex_busy":`Codex 正在使用 state.sqlite — 请退出 Codex 后重试。`,"storage.trash.err.invalid_trash":`隔离条目 ID 缺失或无效。`,"storage.trash.err.missing_trash":`未找到隔离条目。`,"storage.trash.err.dest_exists":`恢复目标已存在 — 请删除或重命名归档文件后重试。`,"storage.trash.err.fs_failed":`文件系统恢复失败。部分文件可能已恢复 — 请检查 archived_sessions 与 .trash。`,"storage.trash.err.storage_mutation_busy":`另一项存储清理或恢复正在进行 — 请稍后再试。`,"storage.trash.err.db_reconcile_failed":`无法恢复 Codex 状态数据库行。`,"storage.trash.err.restore_failed":`恢复失败。`,"storage.trash.err.restore_worker_timeout":`恢复耗时过长(超过 10 分钟)已停止。`,"storage.trash.err.restore_worker_aborted":`关闭过程中恢复已取消。`,"storage.trash.err.restore_worker_failed":`恢复 worker 崩溃或意外失败。`,"storage.policy.title":`自动清理策略`,"storage.policy.help":`当归档大小超过阈值时可选批量清理。默认关闭——不会自动启用。`,"storage.policy.loading":`正在加载策略…`,"storage.policy.loadFailed":`无法加载清理策略。`,"storage.policy.saveFailed":`无法保存清理策略。`,"storage.policy.runFailed":`策略运行失败。`,"storage.policy.alreadyRunning":`清理策略已在运行中。`,"storage.policy.invalid":`策略值无效。`,"storage.policy.enabled":`启用自动清理`,"storage.policy.enabledHint":`默认关闭。启用后仅按所选计划(或立即运行)执行。`,"storage.policy.threshold":`当归档大小超过(GiB)`,"storage.policy.trigger":`触发条件`,"storage.policy.target":`清理目标`,"storage.policy.targetPercent":`删除最旧归档(%)`,"storage.policy.targetReduce":`将归档缩小至(GiB)`,"storage.policy.thresholdInc":`提高阈值`,"storage.policy.thresholdDec":`降低阈值`,"storage.policy.percentInc":`提高百分比`,"storage.policy.percentDec":`降低百分比`,"storage.policy.reduceInc":`提高缩减目标`,"storage.policy.reduceDec":`降低缩减目标`,"storage.policy.schedule":`计划`,"storage.policy.schedule.manual":`仅手动`,"storage.policy.schedule.startup":`代理启动时`,"storage.policy.schedule.daily":`每天`,"storage.policy.schedule.weekly":`每周`,"storage.policy.mode":`删除模式`,"storage.policy.mode.quarantine":`隔离(默认)`,"storage.policy.mode.permanent":`永久删除`,"storage.policy.permanentWarn":`永久模式无法撤销。不确定时请使用隔离。`,"storage.policy.lastRun":`上次运行`,"storage.policy.lastRunDetail":`已移除 {count} · 释放 {size}`,"storage.policy.nextRun":`下次运行`,"storage.policy.never":`从未`,"storage.policy.save":`保存`,"storage.policy.runNow":`立即运行`,"storage.policy.running":`运行中…`,"storage.policy.saved":`策略已保存。`,"storage.policy.skippedDisabled":`策略已禁用 — 请先启用。`,"storage.policy.skippedUnder":`归档大小低于阈值 — 无需操作。`,"storage.policy.skippedEmpty":`没有匹配目标的归档候选项。`,"storage.policy.doneQuarantine":`策略已隔离 {count} 个文件({size})。`,"storage.policy.donePermanent":`策略已永久删除 {count} 个文件({size})。`,"modal.back":`返回`,"modal.badge.oauth":`OAuth`,"modal.customProvider":`自定义提供方`,"replitGateway.title":`Replit 网关配套`,"replitGateway.subtitle":`连接您自行部署的 Replit 网关,并一起安装配对的 OpenAI Chat 与 Anthropic 提供方。`,"replitGateway.companionNote":`这是自定义配套流程,不是规范注册表预设。`,"replitGateway.originLabel":`部署 origin`,"replitGateway.originHint":`Replit 部署的 HTTPS origin(例如 https://my-app.replit.app)。`,"replitGateway.keyLabel":`网关密钥`,"replitGateway.keyHint":`部署中的 REPLIT_GATEWAY_KEY 密钥。它会保存在本地提供方配置中,并用于网关流量认证。`,"replitGateway.keyTooShort":`网关密钥过短(至少 32 个字符)。`,"replitGateway.keyTooLong":`网关密钥最多 512 个字符。`,"replitGateway.keyInvalidChars":`网关密钥只能包含可打印 ASCII 字符。`,"replitGateway.errorNetwork":`无法连接代理。请确认其正在运行后重试。`,"replitGateway.errorMalformed":`代理返回了无效响应。请稍后重试。`,"replitGateway.customDomainLabel":`允许自定义域名`,"replitGateway.customDomainHint":`仅当网关未托管在 .replit.app 上时启用。`,"replitGateway.setDefaultLabel":`安装后将 replit 设为默认提供方`,"replitGateway.install":`安装配对`,"replitGateway.installing":`安装中…`,"replitGateway.close":`关闭`,"replitGateway.openButton":`Replit 网关…`,"replitGateway.replaceTitle":`替换现有 Replit 配对?`,"replitGateway.replaceBody":`提供方 replit 与 replit-anthropic 已存在。替换会覆盖网关 origin 与密钥,但会保留您的覆盖设置。`,"replitGateway.replaceConfirm":`替换配对`,"replitGateway.replaceCancel":`保留现有`,"replitGateway.probeHealth":`healthz:HTTP {status}({ms} ms)`,"replitGateway.probeModels":`models:发现 {count} 个({ms} ms)`,"replitGateway.successTitle":`已安装 Replit 网关配对。`,"replitGateway.errorGeneric":`无法安装 Replit 网关配对。`,"replitGateway.errorCollision":`Replit 提供方配对已存在。`,"replitGateway.errorBusy":`配置繁忙。请稍后重试。`,"replitGateway.originRequired":`必须填写部署 origin。`,"replitGateway.keyRequired":`必须填写网关密钥。`,"modal.failedStatus":`失败 ({status})`,"modal.loginError":`登录错误:{error}`,"modal.badge.codexLogin":`Codex 登录`,"modal.badge.local":`本地`,"modal.badge.apiKey":`API 密钥`,"modal.badge.direct":`直连`,"modal.badge.pool":`账户池`,"modal.badge.free":`免费`,"modal.invalidPreset":`此内置提供方预设不完整。请重启代理后重试。`,"modal.freeTierTitle":`免费层级`,"modal.freeTierDefault":`无需 API 密钥,开箱即用。`,"modal.tab.accounts":`账户`,"modal.tab.free":`免费`,"modal.tab.paid":`付费`,"modal.accountsHint":`在此登录 ChatGPT/Codex、OAuth 与 API 密钥账户。OpenAI 为内置提供商 — 请登录,无需再次添加。`,"modal.accountsCodexAuthLink":`Codex 认证`,"modal.notListed":`没有你要的提供商?添加自定义`,"modal.catalogLoading":`正在加载目录…`,"modal.catalogLoadFailed":`无法加载提供商目录。`,"modal.accountLogin":`登录`,"modal.accountLogout":`退出登录`,"modal.accountAdd":`添加账户`,"modal.accountManage":`管理`,"modal.accountCodexPool":`ChatGPT 账户池`,"modal.accountLoggedIn":`已登录`,"modal.accountLoggedOut":`未登录`,"quota.fiveHourLimit":`5 小时限额`,"quota.weeklyLimit":`每周限额`,"quota.monthlyLimit":`30 天限额`,"quota.cursorFirstParty":`官方模型`,"quota.cursorApiUsage":`API 用量`,"quota.totalSubscriptionCredits":`订阅总额度`,"quota.creditsBalance":`额度余额`,"quota.creditsPeriodEnds":`账单周期结束于 {date}`,"quota.usedPercent":`已用 {pct}%`,"quota.limitReached":`已达上限`,"quota.resetsToday":`今天 {time} 重置`,"quota.resetsTomorrow":`明天 {time} 重置`,"quota.resetsAt":`{when} 重置`,"quota.resetsRelativeMinutes":`{n} 分钟后重置`,"quota.resetsRelativeHours":`{n} 小时后重置`,"pws.status.ready":`就绪`,"pws.status.needsSetup":`需要设置`,"pws.status.needsAttention":`需要关注`,"pws.auth.chatgptPassthrough":`ChatGPT 直通`,"pws.auth.noKey":`无需密钥`,"pws.freeTitle":`免费定价(可能仍需密钥)`,"pws.localTitle":`本地运行时`,"pws.modelCountOne":`1 个模型`,"pws.modelCount":`{count} 个模型`,"pws.rail.suffixDefault":` · 默认`,"pws.rail.suffixLocal":` · 本地`,"pws.rail.suffixFree":` · 免费`,"pws.rail.selectAria":`选择 {name} — {status}{suffix}`,"pws.searchPlaceholder":`搜索提供商…`,"pws.filterAria":`筛选提供商`,"pws.providerFiltersAria":`提供商筛选`,"pws.filters":`筛选`,"pws.filterStatus":`状态`,"pws.pricing":`定价`,"pws.paid":`付费`,"pws.filterType":`类型`,"pws.type.cloud":`云端`,"pws.type.local":`本地`,"pws.type.selfHosted":`自托管`,"pws.type.login":`登录`,"pws.sort":`排序`,"pws.sortProvidersAria":`排序提供商`,"pws.sort.az":`A–Z`,"pws.sort.za":`Z–A`,"pws.sort.freePaid":`免费优先`,"pws.sort.paidFree":`付费优先`,"pws.sort.accountsFirst":`账户优先`,"pws.resetAll":`全部重置`,"pws.providerList":`提供商列表`,"pws.providersAria":`提供商`,"pws.groupReady":`就绪 ({count})`,"pws.groupNeedsSetup":`需要设置 ({count})`,"pws.groupDisabled":`已禁用 ({count})`,"pws.noSearchResults":`没有匹配搜索的提供商。`,"pws.noMatchFilters":`没有匹配筛选的提供商。`,"pws.noProvidersConfigured":`尚未配置提供商。`,"pws.workspaceMainAria":`提供商详情`,"pws.detailComingSoon":`详情视图即将推出 — 请在经典视图中管理。`,"pws.selectPrompt":`从列表中选择一个提供商。`,"pws.connectFirst":`连接你的第一个提供商`,"pws.empty.browseFree":`浏览免费提供商`,"pws.empty.browseFreeDesc":`无需订阅即可开始`,"pws.empty.connectAccount":`连接账户`,"pws.empty.connectAccountDesc":`使用 ChatGPT 或提供商登录`,"pws.empty.addEndpoint":`添加端点`,"pws.empty.addEndpointDesc":`自定义 base URL 和 API 密钥`,"pws.tab.overview":`概览`,"pws.tab.models":`模型`,"pws.tab.usage":`用量`,"pws.tab.accounts":`账户`,"pws.tab.settings":`设置`,"pws.connection":`连接`,"pws.status.connected":`已连接`,"pws.attentionTitle":`需要关注`,"pws.attention.reauth":`当前账号需要重新认证`,"pws.attention.reauthForward":`当前 Codex 账号需要重新认证 — 请到“账号”中处理`,"pws.attention.missingCredentials":`缺少凭证`,"pws.cell.auth":`认证`,"pws.cell.note":`备注`,"pws.cell.defaultModel":`默认模型`,"pws.statsAria":`提供商统计`,"pws.statsTitle":`统计`,"pws.stats.totalRequests":`请求数(30 天)`,"pws.stats.totalTokens":`令牌(30 天)`,"pws.stats.quotaUpdated":`配额更新`,"pws.stats.quotaTracked":`在用量标签查看限额。`,"pws.stats.source":`来源`,"pws.usageLast30d":`用量(最近 30 天)`,"pws.allAccounts":`全部账号`,"pws.estimatedCost":`预估费用`,"pws.costDisclaimer":`基于 API 公示价格的预估值,非实际计费金额。`,"pws.modelBreakdown":`模型用量明细`,"pws.col.model":`模型`,"pws.col.cost":`预估费用`,"pws.col.tokens":`Token`,"pws.col.requests":`请求`,"pws.col.share":`占比`,"pws.tokenInput":`输入`,"pws.tokenOutput":`输出`,"pws.metricRequests":`请求`,"pws.metricTokens":`令牌`,"pws.usageUnavailable":`尚无用量记录。`,"pws.rateLimits":`速率限制`,"pws.quotaUnavailable":`此提供商暂无配额数据。`,"pws.accountQuotaUnavailable":`速率限制数据暂时不可用;若有上次已知值则继续显示。`,"pws.selected":`已选择`,"pws.copyModelId":`复制 ID`,"pws.modelCopied":`已复制!`,"pws.modelsAvailable":`{count} 个可用`,"pws.modelSearchPlaceholder":`筛选模型…`,"pws.modelsLoading":`正在加载模型…`,"pws.modelsLoadFailed":`无法加载模型。`,"pws.modelsNeedsReauth":`需要重新登录后才能获取实时模型列表。当前显示已配置的模型。`,"pws.modelsConfiguredFallback":`显示已配置的模型(实时发现不可用)。`,"pws.modelsTruncated":`显示 {total} 个模型中的前 {shown} 个。使用筛选以缩小列表。`,"pws.retry":`重试`,"pws.noModels":`未发现此提供商的模型。`,"pws.noModelMatch":`没有匹配筛选的模型。`,"pws.adapterBaseRequired":`适配器和基本 URL 为必填项。`,"pws.addAccount":`添加账户`,"pws.addKey":`添加 API 密钥`,"pws.apiKeys":`API 密钥`,"pws.authMode":`认证方式`,"pws.availableAccounts":`可用账户`,"pws.accountOrdinal":`账户 {count}`,"pws.accountsLoading":`正在加载账户…`,"pws.accountsLoadFailed":`无法加载账户。`,"pws.retryAccounts":`重试`,"pws.noAccounts":`尚未连接任何账户。`,"pws.cockpitImportDescription":`从此设备导入 Cockpit Tools Antigravity JSON 导出文件。不会显示文件内容。`,"pws.cockpitImportFileLabel":`Cockpit Tools Antigravity JSON 导出文件`,"pws.cockpitImportChooseFile":`选择 JSON 文件`,"pws.cockpitImporting":`正在导入…`,"pws.cockpitImportInvalid":`所选文件不是有效的 JSON 导出文件或文件过大。`,"pws.cockpitImportFailed":`无法完成账户导入。`,"pws.cockpitImportComplete":`导入完成:已导入 {imported},已更新 {updated},失败 {failed},不支持 {unsupported}。`,"pws.accountSwitching":`切换中…`,"pws.accountCurrent":`当前账户`,"pws.defaultModelNone":`无(使用提供商默认值)`,"pws.discardSettings":`放弃`,"pws.jsonEditorDesc":`直接编辑提供商 JSON 配置。更改将立即保存。`,"pws.jsonEditorTitle":`JSON 编辑器 — {name}`,"pws.jsonRestore":`恢复`,"pws.jsonSave":`保存`,"pws.loggedInTitle":`已登录`,"pws.notLoggedInTitle":`未登录`,"pws.note":`备注`,"pws.allowPrivateNetwork":`允许本地/私有网络`,"pws.liveModels":`从提供方发现模型`,"pws.liveModelsDesc":`获取提供方的实时模型目录。关闭后仅使用已配置的静态模型。`,"pws.xaiResponsesOptIn":`为 Grok 4.5 和 4.6 使用 Responses API`,"pws.xaiResponsesOptInDesc":`通过 openai-responses 路由这两个模型。其他 Grok 模型和层级行为不变。`,"pws.xaiResponsesOptInMixed":`已部分启用。`,"pws.cursorTransport":`Cursor 传输协议`,"pws.cursorTransportHttp2":`HTTP/2(默认)`,"pws.cursorTransportHttp1":`HTTP/1.1(代理兼容)`,"pws.cursorTransportDesc":`当代理无法稳定承载 Cursor 的 HTTP/2 流时,请使用 HTTP/1.1。`,"pws.optionalPlaceholder":`可选`,"pws.providerId":`提供商 ID`,"pws.reauth":`需要重新认证`,"pws.reauthenticate":`重新认证`,"pws.clearCooldown":`清除冷却`,"pws.copyDoctor":`复制 ocx doctor`,"pws.doctorCopied":`已复制`,"pws.healthCooldownHint":`请等到冷却结束。暂时不要探测此账户。`,"pws.doctorCopyUnavailable":`剪贴板不可用`,"pws.healthLabel.rateLimited":`已限速`,"pws.healthLabel.quotaLimited":`配额受限`,"pws.healthLabel.reauthRequired":`需要重新认证`,"pws.healthLabel.refreshFailed":`刷新失败`,"pws.healthLabel.metadataMismatch":`元数据不匹配`,"pws.healthLabel.credentialConflict":`凭证冲突`,"pws.healthSummary.rateLimited":`{provider} {account}:限速至 {until}。在此之前将暂停该账户的路由。`,"pws.healthSummary.quotaLimited":`{provider} {account}:配额限制至 {until}。在此之前将暂停该账户的路由。`,"pws.healthSummary.reauthRequired":`{provider} {account}:需要重新认证。`,"pws.healthSummary.credentialConflict":`{provider} {account}:凭证冲突。`,"pws.healthSummary.metadataMismatch":`{provider} {account}:元数据不匹配。`,"pws.healthSummary.staleCredentials":`{provider} {account}:凭证不完整。`,"pws.removeConfirm":`移除`,"pws.removeConfirmBody":`移除提供商「{name}」?此操作无法撤销。`,"pws.removeDefaultConfirmBody":`移除默认提供方「{name}」?「{defaultProvider}」将成为默认提供方。此操作无法撤销。`,"pws.removeConfirmTitle":`移除提供商`,"pws.saveSettings":`保存`,"pws.pacingTitle":`请求节流`,"pws.pacingDesc":`均匀延迟发往此提供商的请求启动。流式响应可以重叠。`,"pws.pacingEnabled":`启用`,"pws.pacingRpm":`每分钟请求数`,"pws.pacingRpmUnit":`RPM`,"pws.pacingDelay":`最小间隔(毫秒)`,"pws.pacingJitter":`随机抖动(毫秒)`,"pws.pacingSlowerWins":`以较慢的提供商限制为准,模型规则只能增加延迟。`,"pws.pacingQueued":`排队中`,"pws.pacingNextSlot":`距下个时隙`,"pws.pacingLastModel":`上个模型`,"pws.pacingNone":`无`,"pws.pacingModelOverrides":`模型规则`,"pws.pacingModel":`模型`,"pws.pacingAdd":`添加规则`,"pws.pacingRemove":`移除`,"pws.pacingRemoveModel":`移除 {model} 的请求节流规则`,"pws.pacingRuleRequired":`请先设置提供商限制或模型规则,再启用请求节流。`,"pws.antigravityTlsTitle":`Antigravity 浏览器 TLS 配置`,"pws.antigravityTlsEnable":`启用实验性 TLS/HTTP2 模拟`,"pws.antigravityTlsWarning":`非官方兼容功能。它不保证遵守服务条款或避免停用,可能使流量更具特征;初始化失败时会回退到 Bun。官方 Gemini API 密钥、Vertex 或有文档的 Code Assist 路由更安全。`,"pws.antigravityTlsConfirm":`启用实验性且非官方的 Antigravity TLS 配置?它不保证符合政策,也不能避免停用。继续吗?`,"pws.antigravityTlsStatus":`TLS 配置状态:{status}`,"pws.antigravityTlsDisabled":`已停用`,"pws.antigravityTlsActive":`活动`,"pws.antigravityTlsFallback":`回退`,"pws.saving":`保存中…`,"pws.settingsSaved":`设置已保存。`,"pws.accountModeSaved":`账户模式已保存。`,"pws.accountModeFailed":`无法切换账户模式。`,"pws.accountModeConfirm":`切换 OpenAI 账户模式?正在进行的对话将重新分配到另一种模式的账户集合,配额用量将按新模式计入。`,"pws.settingsUnsavedBar":`有未保存的更改。`,"pws.unsavedLeaveBody":`有未保存的更改。离开前保存吗?`,"pws.unsavedLeaveTitle":`未保存的更改`,"pws.attentionRequired":`需要关注`,"pws.attentionAria":`{name}:{reason}`,"pws.missingCredentials":`缺少凭证`,"pws.editJsonDesc":`以 JSON 编辑原始代理配置`,"pws.updatesUnavailable":`提供商更新不可用。`,"pws.dashboard.title":`提供商概览`,"pws.dashboard.subtitle":`在一个地方管理所有模型提供商。`,"pws.dashboard.rateLimits":`速率限制`,"pws.capacity.estimate":`按配置权重估算的账户池`,"pws.capacity.currentAccount":`当前有效账户`,"pws.capacity.nextRecovery":`下一次容量恢复`,"pws.capacity.recoveryShare":`+{percent}% 账户池容量`,"pws.capacity.incomplete":`覆盖不完整:已排除 {excluded} 个账户,其中 {unknown} 个套餐未知`,"pws.capacity.partial":`部分窗口覆盖不完整:{count} 个账户未报告所有显示的限额窗口`,"pws.capacity.windowPartial":`部分`,"pws.capacity.windowPartialA11y":`{window}:账户覆盖不完整`,"pws.dashboard.recentlyUsed":`最近使用`,"pws.dashboard.requests":`{count} 个请求`,"pws.dashboard.checkedAgo":`{time} 前检查`,"pws.dashboard.noQuota":`无配额数据`,"pws.dashboard.noUsage":`暂无使用数据`,"pws.dashboard.noRateLimits":`暂无速率限制数据`,"pws.allProviders":`提供商概览`,"pws.enabledLabel":`已启用`,"pws.testConnection":`测试连接`,"pws.testing":`测试中…`,"pws.connectionOk":`连接成功`,"pws.connectionFailed":`连接失败`,"pws.connectionNotApplicable":`不适用 — 此提供方使用静态模型目录。`,"pws.editSettings":`编辑设置`,"pws.viewUsage":`查看详细用量`,"pws.allSystemsOk":`所有系统正常运行`,"pws.apiKeyConfigured":`API 密钥已配置`,"pws.addApiKey":`添加 API 密钥`,"pws.loggedInAs":`已登录为 {email}`,"pws.notLoggedIn":`未登录`,"pws.passthrough":`Codex 透传`,"pws.notes":`备注`,"pws.notePlaceholder":`添加关于此提供商的备注...`,"pws.noteSaved":`备注已保存`,"pws.authSummary":`认证`,"pws.aiStudio":`AI Studio`,"pws.aiStudio.connected":`已连接`,"pws.aiStudio.checking":`正在检查会话`,"pws.aiStudio.unsupported":`此平台不支持原生登录`,"pws.aiStudio.needsReauth":`需要重新认证`,"pws.aiStudio.reauthenticated":`重新认证成功`,"pws.aiStudio.loginFailed":`原生登录失败`,"pws.aiStudio.connect":`连接`,"time.justNow":`刚刚`,"time.notChecked":`未检查`,"time.minutesAgo":`{n} 分钟前`,"time.hoursAgo":`{n} 小时前`,"time.daysAgo":`{n} 天前`,"modal.noMatch":`无匹配。`,"modal.oauthDefaultNote":`使用账户登录 — 无需 API 密钥。`,"modal.oauthComingSoon":`{label} 的 OAuth 登录将在下次更新提供。请先使用 API 密钥。`,"modal.oauthComingSoonShort":`此提供方的 OAuth 登录将在下次更新提供 — 请先使用 API 密钥。`,"modal.useApiKeyInstead":`改用 API 密钥`,"modal.setupGuide":`设置指南`,"modal.setupStep1Prefix":`前往`,"modal.setupDashboardLink":`{label} 控制台`,"modal.setupStep1Suffix":`并复制 API 密钥`,"modal.setupStep2":`粘贴到下方的 API 密钥字段`,"modal.setupStep3":`点击添加提供方 — 模型会自动发现`,"modal.namePlaceholder":`例如 openrouter`,"modal.duplicateWarn":`提供方 "{name}" 已存在,将被覆盖。`,"modal.forwardHintPrefix":`无需密钥 — 代理会转发你的`,"modal.forwardCredentials":`codex login`,"modal.forwardHintSuffix":`凭据到此提供方。`,"modal.localHint":`不会存储 API 密钥。这会为 Codex 添加 Cursor 的公开模型目录,但在审计完成前,实时 Cursor 传输与原生文件/Shell 执行仍保持禁用。`,"modal.getApiKey":`获取 {label} API 密钥`,"modal.apiKey":`API 密钥`,"modal.apiKeyTransport":`API 密钥请求头`,"modal.apiKeyTransportNative":`x-api-key(Anthropic 原生)`,"modal.apiKeyTransportBearer":`Authorization: Bearer`,"modal.apiKeyPlaceholder":`sk-…(或 $ENV_VAR)`,"modal.defaultModelPlaceholder":`例如 gpt-5.5`,"modal.baseUrlPlaceholder":`https://...`,"modal.baseUrlPlaceholderError":`Base URL 包含未解析的 {placeholder},请替换为实际值。`,"modal.baseUrlPlaceholderHint":`请在添加前将 Base URL 中的 {placeholder} 替换为你的实际 Account ID。`,"modal.adding":`正在添加…`,"modal.useOauthLogin":`← 使用 OAuth 登录`,"codexAuth.addIdPlaceholder":`codex-work, codex-alt, team…`,"codexAuth.resetCreditsAria":`{count} 个重置额度`,"claude.pageTitle":`Claude Code`,"claude.workspace.settings":`设置`,"cws.loading":`正在加载组合…`,"cws.loadFailed":`无法加载组合。`,"cws.saveFailed":`无法保存组合。`,"cws.removeFailed":`无法删除组合。`,"cws.saved":`组合已保存。`,"cws.created":`已创建 {model}。`,"cws.removed":`已删除 combo/{id}。`,"cws.renamed":`已将 {from} 重命名为 {to}。`,"cws.add":`添加组合`,"cws.addTitle":`添加组合`,"cws.addSubtitle":`创建跨提供方的虚拟模型,并指定客户端实际请求的模型名称。`,"cws.create":`创建组合`,"cws.railAria":`组合列表`,"cws.searchPlaceholder":`搜索组合或目标…`,"cws.noSearchResults":`没有匹配的组合。`,"cws.group.failover":`故障转移`,"cws.group.roundRobin":`轮询`,"cws.targetCount":`{count} 个目标`,"cws.targetCountOne":`1 个目标`,"cws.overviewTitle":`组合`,"cws.overviewBlurb":`可在提供方/模型目标间故障转移,或采用确定性平滑加权轮询的虚拟模型。`,"cws.count.total":`总计`,"cws.count.failover":`故障转移`,"cws.count.roundRobin":`轮询`,"cws.howTitle":`工作原理`,"cws.howBody":`在 Codex 中请求组合的公开模型名称;未设置时默认使用 combo/<id>。OpenCodex 仅在可重试的上游错误时切换目标。若没有可用目标,请求会直接失败,不会回退到全局默认提供方。`,"cws.attentionTitle":`需要关注`,"cws.attention.empty":`未配置目标`,"cws.attention.few":`只有一个目标 — 故障转移无处可跳`,"cws.attention.catalogOmitted":`未出现在模型目录中 — 成员能力不完整或不兼容(缺少上下文窗口/元数据,或模态交集为空)。按别名路由仍可用`,"cws.attention.allTargetsExhausted":`所有已启用目标的额度均已用尽`,"cws.emptyTitle":`创建第一个组合`,"cws.empty.createDesc":`命名虚拟模型并串联两个或多个后端。`,"cws.backToAll":`返回全部组合`,"cws.allCombos":`全部组合`,"cws.copyModel":`复制 ID`,"cws.copied":`已复制`,"cws.tabsLabel":`组合详情分区`,"cws.tab.config":`配置`,"cws.tab.about":`关于`,"cws.strategy":`策略`,"cws.strategy.failover":`故障转移`,"cws.strategy.roundRobin":`轮询`,"cws.strategy.failoverHint":`按顺序尝试目标。若出现可重试错误(限流、故障、订阅门控),则跳到下一个。`,"cws.strategy.roundRobinHint":`按权重确定性地分配流量。将所选目标保留一批成功请求后,再推进到下一个目标。`,"cws.field.id":`组合 ID`,"cws.field.idHint":`客户端将请求 {model}`,"cws.field.idInternalHint":`组合的内部 ID,创建后仍可修改。`,"cws.field.idHintEdit":`修改 ID 即重命名组合。客户端将请求 {model}。`,"cws.field.alias":`公开模型名称`,"cws.field.aliasPlaceholder":`deepseek-v4-flash 或 vendor/model`,"cws.field.aliasHint":`可选。可填无前缀裸名称、自定义前缀(如 vendor/model),或留空使用 combo/<id>。`,"cws.field.nativeAlias":`原生 OpenAI 别名`,"cws.field.nativeAliasHint":`允许此组合接管受支持的未限定 OpenAI 原生模型 ID。带账户或提供商限定的 OpenAI 路由仍保持独立。`,"cws.field.displayName":`显示名称`,"cws.field.displayNameHint":`模型选择器中的标签。启用原生 OpenAI 别名时必填。`,"cws.field.stickyLimit":`轮换前的粘性成功次数`,"cws.field.stickyLimitHint":`加权选择器推进前,将所选目标保留这么多次成功请求。`,"cws.field.defaultEffort":`默认推理级别`,"cws.field.defaultEffortNone":`无(使用目标默认)`,"cws.field.defaultEffortHint":`仅在客户端未指定推理级别时使用。选项为所选目标已公布努力级别的交集。`,"cws.capability.imageInputUnavailable":`所有已选目标均支持图片输入后才可用。`,"cws.capability.imageInputHint":`所有目标均支持图片时默认开启;关闭后仅接受文本。`,"cws.capability.imageInput":`图片 / 多模态`,"cws.capabilities":`能力`,"cws.field.defaultEffortUnsupported":`该级别不在目标的公共阶梯中 — 请求时会被忽略或就近映射。`,"cws.field.defaultEffortUnsupportedOption":`不在交集中`,"cws.targets":`目标`,"cws.targets.failoverHint":`顺序很重要 — 第一个为主。`,"cws.targets.roundRobinHint":`权重控制确定性的相对选择;顺序用于打破轮换环中的平局。`,"cws.target.provider":`提供方`,"cws.target.model":`模型`,"cws.target.weight":`权重`,"cws.target.pickProvider":`选择提供方…`,"cws.target.pickProviderFirst":`请先选择提供方…`,"cws.target.pickModel":`选择模型…`,"cws.target.noModels":`该提供方没有模型`,"cws.target.modelPlaceholder":`模型 ID`,"cws.target.add":`添加目标`,"cws.target.drag":`拖动以重新排序`,"cws.target.moveUp":`上移`,"cws.target.moveDown":`下移`,"cws.quota.available":`可用`,"cws.quota.exhausted":`额度已用尽`,"cws.quota.unknown":`额度未知`,"cws.quota.allExhausted":`所有已启用目标的额度均已用尽。请选择其他目标,或等待额度恢复。`,"cws.aboutTitle":`运行时`,"cws.aboutBody":`失败目标会短暂冷却并遵循 Retry-After。无效请求与上下文错误不会切换。每个目标按自身能力调整推理级别;所有目标耗尽时直接失败。日志与用量会保留有序的实际尝试及每次尝试的用量。`,"cws.removeConfirmTitle":`删除 {model}?`,"cws.removeConfirmDesc":`从配置与 Codex 目录移除该虚拟模型,不会删除任何提供方。`,"cws.unsavedTitle":`未保存的更改`,"cws.unsavedDesc":`丢弃对此组合的编辑并继续?`,"cws.keepEditing":`继续编辑`,"cws.err.missingId":`需要组合 ID。`,"cws.err.invalidId":`ID 须以字母或数字开头,仅含字母、数字、点、下划线或连字符(最多 64)。`,"cws.err.duplicateId":`已存在相同 ID 的组合。`,"cws.err.invalidAlias":`别名仅可包含字母、数字、点、下划线或连字符,最多一个“/”分段。`,"cws.err.aliasReservedNamespace":`别名不得使用保留的“combo/”命名空间。`,"cws.err.aliasNativeFamily":`不允许使用 OpenAI 原生家族裸别名(gpt-*、o1-*、o3-*、o4-*、codex-*)。`,"cws.err.unsupportedNativeAlias":`原生别名必须是当前受支持的 OpenAI 裸 model id。`,"cws.err.missingNativeAliasDisplayName":`原生别名必须提供显示名称。`,"cws.err.invalidDisplayName":`显示名称最多 128 个字符,且不能包含控制字符。`,"cws.err.duplicateAlias":`另一个组合已使用该别名。`,"cws.err.noTargets":`至少添加一个目标。`,"cws.err.incompleteTarget":`每个目标都需要提供方和模型。`,"cws.target.disabled":`{name}(已禁用)`,"cws.err.reservedNamespace":`创建组合前,请先重命名名为 combo 的实体提供方。`,"cws.err.providerCollision":`组合 ID 与已配置的提供方名称冲突。`,"cws.err.unknownProvider":`每个目标都必须使用已配置的提供方。`,"cws.err.duplicateTarget":`同一提供方/模型目标只能出现一次。`,"cws.err.invalidStickyLimit":`粘性成功次数必须是 1 到 100 的整数。`,"cws.err.invalidWeight":`每个轮询权重必须是 1 到 10000 的整数。`,"cws.err.noEnabledTarget":`至少一个目标必须使用已启用的提供方。`,"claude.tabsLabel":`Claude 客户端`,"claude.tabCode":`Code`,"claude.tabDesktop":`Desktop`,"claudeDesktop.title":`Claude Desktop`,"claudeDesktop.subtitle":`将每个 Claude 模型系列路由到端口 {port} 上的可用模型。`,"claudeDesktop.importJson":`导入 JSON`,"claudeDesktop.exportJson":`导出 JSON`,"claudeDesktop.loading":`正在加载 Claude Desktop 配置…`,"claudeDesktop.loadFail":`无法加载 Claude Desktop 配置。`,"claudeDesktop.retry":`重试`,"claudeDesktop.saveFailed":`无法保存 Claude Desktop 配置。`,"claudeDesktop.applyFailed":`配置已保存,但无法应用。`,"claudeDesktop.updateFailed":`Claude Desktop 更新失败。`,"claudeDesktop.savedApplied":`配置已保存并应用到 Claude Desktop。`,"claudeDesktop.appliedMarkerUnsaved":`已应用到 Claude Desktop,但应用标记未能保存。在再次应用之前,下方的已保存/已应用状态可能显示不准确。`,"claudeDesktop.savedAppliedAnnounce":`Claude Desktop 配置已保存并应用。`,"claudeDesktop.saved":`配置已保存。`,"claudeDesktop.savedAnnounce":`Claude Desktop 配置已保存。`,"claudeDesktop.exported":`配置已导出为 JSON。`,"claudeDesktop.importExpected":`需要版本 1 的 Claude Desktop 配置。`,"claudeDesktop.importReady":`JSON 已导入。请检查草稿,然后保存并应用。`,"claudeDesktop.importedAnnounce":`配置 JSON 已导入。可检查尚未保存的更改。`,"claudeDesktop.importInvalid":`所选文件不是有效配置。`,"claudeDesktop.importFailed":`导入失败。{error}`,"claudeDesktop.moved":`已将 {route} 移动到 {family}。`,"claudeDesktop.unsaved":`有未保存的更改`,"claudeDesktop.upToDate":`配置已是最新`,"claudeDesktop.saving":`正在保存…`,"claudeDesktop.applying":`正在应用…`,"claudeDesktop.saveApply":`保存并应用`,"claudeDesktop.emptyTitle":`没有可用模型`,"claudeDesktop.emptyHint":`请添加或启用提供商,然后返回分配 Claude Desktop 路由。`,"claudeDesktop.assignmentsLabel":`Claude 模型系列分配`,"claudeDesktop.family.opus":`Opus`,"claudeDesktop.family.fable":`Fable`,"claudeDesktop.family.sonnet":`Sonnet`,"claudeDesktop.family.haiku":`Haiku`,"claudeDesktop.modelCountOne":`{count} 个模型`,"claudeDesktop.modelCountMany":`{count} 个模型`,"claudeDesktop.chooseDefault":`选择默认模型`,"claudeDesktop.temporaryDefault":`临时默认模型`,"claudeDesktop.laneEmpty":`将模型拖到这里,或使用移动控件。`,"claudeDesktop.laneNoMatch":`该系列中没有与搜索匹配的模型。`,"nav.grok":`Grok`,"grok.title":`Grok Build`,"grok.subtitle":`opencodex 已注册到你的 Grok 配置中的模型。`,"grok.loading":`正在加载 Grok 状态…`,"grok.loadFail":`无法读取 Grok 配置。`,"grok.notConfiguredTitle":`Grok Build 尚未接入`,"grok.notConfiguredHint":`安装 Grok 后重启代理,opencodex 会把托管块写入:`,"grok.endpoint":`端点`,"grok.colModel":`模型`,"grok.colAlias":`Grok 别名`,"grok.colContext":`上下文`,"grok.groupNative":`原生模型`,"grok.groupRouted":`路由模型`,"grok.enabledCount":`已注册 {on}/{total}`,"grok.saved":`选择已保存。`,"grok.savedApplied":`选择已保存并写入 Grok 配置。`,"grok.saveFailed":`无法保存 Grok 选择。`,"grok.applyFailed":`选择已保存,但无法更新 Grok 配置。`,"grok.applySkipped":`选择已保存,Grok 配置未更改。`,"grok.saveApply":`保存并应用`,"grok.saving":`保存中…`,"grok.applying":`应用中…`,"grok.unsaved":`未保存的更改`,"grok.upToDate":`选择已是最新`,"grok.toggleModel":`将 {id} 注册到 Grok`,"claudeDesktop.available":`可用`,"claudeDesktop.defaultBadge":`默认`,"claudeDesktop.supports1m":`1M`,"claudeDesktop.unavailable":`不可用`,"claudeDesktop.contextM":`{n}M 上下文`,"claudeDesktop.contextK":`{n}k 上下文`,"claudeDesktop.contextUnknown":`上下文未知`,"claudeDesktop.alias":`别名`,"claudeDesktop.useAsDefault":`设为 {family} 默认模型`,"claudeDesktop.moveTo":`移动到`,"claudeDesktop.move":`移动`,"claudeDesktop.status.applied":`已应用到 Desktop`,"claudeDesktop.status.stale":`配置已更改 — 需重新应用`,"claudeDesktop.status.notApplied":`未应用`,"claudeDesktop.status.notActiveProfile":`Desktop 正在使用其他配置 — 请重新应用`,"claudeDesktop.status.disabled":`Claude Desktop 集成已关闭。开启后请完全退出并重新打开 Desktop。`,"claudeDesktop.enableApply":`开启并应用`,"claudeDesktop.health.lastRequest":`最后请求`,"claudeDesktop.health.stats":`{count} 请求 / {errors} 错误`,"claudeDesktop.effort.supported":`effort`,"claudeDesktop.effort.displayOnly":`effort (仅显示)`,"dash.injectionManage":`打开设置`,"sub.settings":`设置`,"sub.sections":`子代理分区`,"sub.delegation.model":`优先调用的模型`,"sub.delegation.modelHint":`Codex 分派工作时最先调用的模型。上面的推荐是可调用的名单,这里选的是其中第一顺位。`,"dash.syncModelsHint":`按已连接的提供商重写 Codex 的模型目录。`,"dash.syncRun":`立即同步`,"lab.title":`Compatibility Lab`,"lab.subtitle":`Read-only compatibility verdict matrix from lab projection evidence.`,"lab.loadFailed":`Could not load compatibility lab data`,"lab.projectionUnavailable":`Lab projection is not available. Run conformance or live probes first.`,"lab.projectionIncompatible":`Lab projection schema is incompatible. Rebuild the projection.`,"lab.statusTitle":`Projection status`,"lab.matrixTitle":`Compatibility matrix`,"lab.verdictsTitle":`Verdict records`,"lab.filter.layer":`Evidence layer`,"lab.filter.verdict":`Verdict`,"lab.filter.subject":`Subject ID`,"lab.filter.all":`All`,"lab.col.subject":`Subject`,"lab.col.layer":`Layer`,"lab.col.suite":`Suite`,"lab.col.verdict":`Verdict`,"lab.col.asOf":`As of`,"lab.col.protocol":`Protocol conformance`,"lab.col.live":`Live route compatibility`,"lab.col.task":`Task effectiveness`,"lab.empty":`No compatibility verdicts in the projection yet.`,"lab.subjectKind":`Kind`,"lab.observationCount":`Observations`,"lab.eventCount":`Events`,"lab.verdictCount":`Verdicts`,"lab.subjectCount":`Subjects`,"lab.builtAt":`Built`,"lab.loading":`Loading compatibility evidence…`,"lab.loadMore":`Load more`,"lab.detailTitle":`Verdict detail`,"lab.detailClose":`Close`,"lab.detailSubject":`Subject`,"lab.detailObservations":`Observations`,"lab.detailEvents":`Contributing events`,"lab.detailArtifacts":`Artifact metadata`,"lab.production.title":`观测到的生产流量`,"lab.production.notVerification":`不是实验室验证`,"lab.production.attempts":`尝试`,"lab.production.successes":`成功`,"lab.production.routeErrors":`路由错误`,"lab.production.lastObserved":`最近观测`,"lab.detailLoadFailed":`Could not load verdict detail`,"lab.refresh":`Refresh`,"lab.verdict.UNKNOWN":`Unknown`,"lab.verdict.CLAIMED":`Claimed`,"lab.verdict.PROBED":`Probed`,"lab.verdict.VERIFIED":`Verified`,"lab.verdict.DEGRADED":`Degraded`,"lab.verdict.BLOCKED":`Blocked`,"lab.verdict.UNSUPPORTED":`Unsupported`,"lab.layer.protocol_conformance":`Protocol conformance`,"lab.layer.live_route_compatibility":`Live route compatibility`,"lab.layer.task_effectiveness":`Task effectiveness`,"dash.visionAdvanced":`高级设置`,"dash.visionMaxDescriptions":`每回合最大描述次数`,"dash.visionMaxDescriptionsInvalid":`请输入正整数。`,"dash.visionTimeout":`超时`,"dash.visionTimeoutInvalid":`请输入 {min} 到 {max} 毫秒之间的整数。`,"dash.visionAdvancedPopover":`高级视觉设置`,"sub.routedDelegationBridge":`路由 V2 委派桥接`,"sub.routedDelegationBridgeHint":`实验性功能。启用期间,生成、发送和后续消息均为明文,包括原生代理之间的委派。Codex 仍可能显示原始模型;路由内容和隐私遵循所选提供商。`,"sub.routedDelegationBridgeInactive":`已就绪;仅对符合条件的原生 V2 根任务激活。`,"sub.routedDelegationBridgeSaveFail":`无法保存路由 V2 委派桥接`,"sub.routedDelegationBridgeSaved":`已保存路由 V2 委派桥接。禁用会立即生效。`,"models.newPolicyGlobal":`新模型默认停用`,"models.newPolicyProvider":`新模型策略`,"models.newPolicy_inherit":`继承`,"models.newPolicy_off":`关闭`,"models.newPolicy_on":`开启`,"models.newBadge":`新增`,"models.newCount":`{count} 个新增,已关闭`,"models.aliases":`别名`,"models.aliasesTable":`别名表`,"models.aliasPrompt":`服务商别名(留空即清除)`,"models.modelAliasPrompt":`模型别名(留空即清除)`,"models.aliasSaved":`别名已保存`,"models.aliasConflict":`该别名与现有名称冲突`,"models.editProviderAlias":`编辑服务商别名`,"models.editModelAlias":`编辑模型别名`,"models.useDefaultAliases":`使用默认别名`,"models.useDefaultAliasesGlobal":`全局使用默认别名`,"models.aliasAuto":`自动`,"models.aliasUser":`用户`,"models.aliasStale":`过期`},y={"nav.dashboard":`儀表板`,"nav.startup":`啟動安全`,"nav.providers":`供應商`,"nav.models":`模型`,"nav.combos":`組合`,"nav.subagents":`子代理`,"nav.logs":`日誌與除錯`,"nav.usage":`用量`,"common.github":`GitHub`,"common.save":`儲存`,"common.saving":`儲存中…`,"common.cancel":`取消`,"common.discard":`捨棄`,"common.delete":`刪除`,"common.close":`關閉`,"common.ok":`確定`,"common.remove":`移除`,"common.loading":`載入中…`,"common.retry":`重試`,"app.logoAria":`opencodex 徽標`,"app.pageTitle":`{page} — opencodex`,"app.claudeOn":`Claude 開`,"app.claudeOff":`Claude 關`,"theme.label":`主題`,"theme.light":`淺色`,"theme.dark":`深色`,"theme.system":`跟隨系統`,"lang.label":`語言`,"errorBoundary.title":`頁面載入失敗`,"errorBoundary.message":`此部分在渲染時發生錯誤。請重新載入後再試。`,"errorBoundary.details":`錯誤`,"errorBoundary.reload":`重新載入`,"startup.title":`啟動安全`,"startup.subtitle":`檢查重新啟動後 Codex 是否仍能連線 opencodex,避免本機代理路由陷入重複重連。`,"startup.refresh":`重新整理`,"startup.loading":`正在檢查啟動保護…`,"startup.error":`無法讀取啟動保護狀態。`,"startup.staleData":`最新啟動檢查失敗。以下資料已過期,不能視為已受保護的證明。`,"startup.status.native":`原生路由`,"startup.status.protected":`已保護重新啟動`,"startup.status.atRisk":`需要處理`,"startup.summary.native":`Codex 不依賴本機代理`,"startup.summary.protected":`重新啟動後 opencodex 會自動可用`,"startup.summary.atRisk":`重新啟動後 Codex 可能無法存取模型`,"startup.riskDetail":`Codex 已指向本機代理,但沒有持久服務或正常的 launcher shim 將其重新啟動。`,"startup.riskDetailCustomLocal":`Codex 指向自訂本地閘道器。opencodex 無法管理或驗證該閘道器的重新啟動生命週期。`,"startup.riskDetailWindowsShim":`Launcher shim 僅保護受支援的 CLI 指令碼;Windows 上的 Codex Desktop 和直接 codex.exe 啟動可以繞過它。`,"startup.safeDetail":`當前路由與啟動機制一致。重新啟動後無需手動執行 ocx start。`,"startup.routing":`Codex 路由`,"startup.routing.proxy":`本機代理`,"startup.routing.native":`OpenAI 原生`,"startup.routing.customLocal":`自訂本地閘道器`,"startup.routing.customRemote":`自訂遠端閘道器`,"startup.routing.unknown":`未知或無效的路由`,"startup.restartProtection":`重新啟動保護`,"startup.preference":`按需啟動`,"startup.enabled":`已啟用`,"startup.disabled":`已停用`,"startup.protection.service":`背景服務`,"startup.protection.shim":`Launcher shim`,"startup.protection.none":`未安裝`,"startup.details":`保護詳細資料`,"startup.service":`背景服務`,"startup.serviceHint":`登入時啟動,並在代理崩潰後重新啟動。`,"startup.installed":`已安裝`,"startup.notInstalled":`未安裝`,"startup.unsupported":`不支援`,"startup.shim":`Codex launcher shim`,"startup.shimHint":`支援的 Codex 指令碼啟動器執行時執行 ocx ensure。`,"startup.healthy":`正常`,"startup.cliOnly":`僅 CLI`,"startup.stale":`已失效`,"startup.viable":`可用`,"startup.unhealthy":`已安裝但異常`,"startup.conflict":`服務衝突`,"startup.installedDisabled":`已安裝但停用`,"startup.install":`安裝`,"startup.installing":`正在安裝…`,"startup.serviceInstalled":`背景服務安裝成功。`,"startup.shimInstalled":`Codex 啟動器 shim 安裝成功。`,"startup.installFailed":`安裝失敗:`,"startup.tray.title":`Windows 系統托盤`,"startup.tray.hint":`登入時啟動托盤圖示,一鍵控制代理啟動、停止、重新啟動、面板和狀態。`,"startup.tray.login":`Windows 登入時啟動托盤`,"startup.tray.notProtection":`托盤只是控制器,並非重新啟動保護。無人值守恢復仍需要正常的背景服務。`,"startup.tray.running":`執行中`,"startup.tray.stopped":`已安裝,未顯示`,"startup.tray.stale":`需要修復`,"startup.tray.notInstalled":`未安裝`,"startup.tray.loading":`正在檢查…`,"startup.tray.unavailable":`狀態不可用`,"startup.tray.install":`安裝並顯示托盤`,"startup.tray.start":`顯示托盤圖示`,"startup.tray.stop":`退出托盤圖示`,"startup.tray.uninstall":`移除登入托盤`,"startup.tray.error":`Windows 托盤操作失敗。請執行 ocx tray status 檢視詳細資料。`,"startup.recovery":`修復選項`,"startup.recoveryHint":`使用上方的一鍵安裝,或複製命令進行手動修復。Codex Desktop 和 Windows 可執行檔案建議使用背景服務。`,"startup.command.service":`推薦:持久背景服務`,"startup.command.shim":`備選:CLI launcher shim`,"startup.command.native":`安全恢復:還原 Codex 原生路由`,"startup.copy":`複製`,"startup.copied":`已複製`,"startup.recommended":`推薦修復:{cmd}`,"startup.navRisk":`啟動保護需要處理`,"startup.codexRuntime.clampHidden":`部分推理強度選項已隱藏,因為 OpenCodex 正在使用 Codex {version}。`,"startup.codexRuntime.clampHiddenWithEfforts":`部分推理強度選項已隱藏,因為 OpenCodex 正在使用 Codex {version}(已移除:{efforts})。`,"startup.codexRuntime.olderBinary":`OpenCodex 正在使用較舊的 Codex 二進位制檔案({version})。檢測到可用的較新安裝。`,"dash.subtitle":`本地 opencodex 代理、其供應商以及路由到 Codex 的模型的即時狀態。`,"dash.workspace.overview":`總覽`,"dash.workspace.sections":`板塊`,"dash.status":`狀態`,"dash.online":`線上`,"dash.offline":`離線`,"dash.version":`版本`,"dash.uptime":`執行時間`,"dash.providers":`供應商`,"dash.tokens30d":`Token (30 天)`,"dash.activity.title":`30 天活動`,"dash.activity.requests":`請求`,"dash.activity.tokens":`Token`,"dash.activity.chartLabel":`30 天活動。使用左右方向鍵選擇日期,使用 Home 和 End 跳到範圍兩端。`,"dash.activity.viewUsage":`檢視用量`,"dash.coverage":`覆蓋率 {pct}`,"dash.mem.title":`記憶體可觀測性`,"dash.mem.hint":`只讀執行時診斷。觀測記憶體為 max(RSS, external, ArrayBuffers),避免 Windows working set trimming 隱藏已提交的保留記憶體。`,"dash.mem.rss":`常駐記憶體 (RSS)`,"dash.mem.jsHeap":`JS 堆(已用 / 總計)`,"dash.mem.jscHeap":`JSC 堆`,"dash.mem.external":`External`,"dash.mem.arrayBuffers":`ArrayBuffers`,"dash.mem.observed":`觀測值`,"dash.mem.runtime":`執行時計數器`,"dash.mem.growth":`每小時觀測變化`,"dash.mem.perHour":`/小時`,"dash.mem.store":`延續儲存`,"dash.mem.storeHint":`代理 previous_response_id 快取。堆上升時總位元組數增加,說明是對話保留而非執行時分配器。`,"dash.mem.storeEntries":`條目`,"dash.mem.storeTotal":`總計`,"dash.mem.storeLargest":`最大`,"dash.mem.storeOldest":`最舊`,"dash.mem.threshold":`告警閾值`,"dash.mem.lastWarn":`上次告警`,"dash.mem.never":`從不`,"dash.mem.details":`詳細資料`,"dash.mem.unavailable":`記憶體診斷不可用(舊版代理)。`,"dash.mem.inFlight":`進行中的請求`,"dash.mem.restart":`排空並重啟`,"dash.mem.restartConfirm":`等待 {count} 個進行中的請求結束後再重啟(最多 {seconds} 秒;超時將中斷剩餘請求)。`,"dash.mem.draining":`正在等待 {count} 個請求完成… 完成後重啟`,"dash.mem.reconnecting":`代理正在重啟… 等待重新連線`,"dash.connectionReconnecting":`連線中斷 — 正在重新連線…`,"dash.mem.restartFailed":`排空並重啟失敗。請確認代理正在執行。`,"dash.mem.restartNoSupervisor":`未檢測到重啟保護。重啟後代理可能不會自動恢復,需手動啟動。`,"dash.activeProviders":`活躍供應商`,"dash.noProviders":`尚未配置供應商。請執行 {cmd}。`,"dash.col.name":`名稱`,"dash.col.adapter":`介面卡`,"dash.col.baseUrl":`Base URL`,"dash.col.model":`模型`,"dash.modelsNoResults":`沒有符合搜尋的模型。`,"dash.availableModels":`可用模型`,"dash.noModels":`未找到模型。請檢查供應商 API 金鑰。`,"dash.cannotConnect":`無法連線到代理。它在執行嗎?`,"dash.runStart":`執行 {cmd} 以啟動代理。`,"dash.stop":`停止代理`,"dash.stopConfirm":`停止代理並恢復原生 Codex 配置?`,"dash.stopFailed":`無法停止代理 (HTTP {status})。`,"dash.maSwitchFailed":`模式切換失敗 (HTTP {status})。`,"dash.maNetworkError":`網路錯誤 — 代理是否正在執行?`,"dash.stopping":`正在停止…`,"dash.actions":`代理`,"dash.codexRestart":`重新載入 Codex 模型清單`,"dash.codexRestarting":`正在停止…`,"dash.codexRestartConfirm":`停止 Codex app-server 以重新讀取模型清單?進行中的 Codex 工作會中斷,且 Codex 不會自動重啟,請稍後自行重新開啟。`,"dash.codexRestartDone":`已停止 {count} 個 Codex app-server。重新開啟 Codex 即可載入最新的模型清單。`,"dash.codexRestartNothing":`沒有執行中的 Codex app-server。下次啟動會讀取最新的模型清單。`,"dash.codexRestartUnknown":`無法列舉行程,因此沒有停止任何行程。`,"dash.codexRestartPartial":`有 {count} 個 app-server 未結束。若模型清單仍然過舊,請手動停止。`,"dash.codexRestartFailed":`無法重新載入 Codex 模型清單 (HTTP {status})。`,"dash.codexRestartUnreachable":`無法連線到代理。`,"dash.codexRestartMalformed":`代理回傳了非預期的回應。`,"dash.codexRestartTimeout":`代理未在時限內回應,可能仍在停止 app-server。`,"models.staleBanner":`Codex 顯示的模型清單比目前的目錄舊。重新啟動 Codex 即可重新讀取。`,"dash.codexAutoStart":`隨 Codex 啟動 opencodex`,"dash.codexAutoStartHint":`允許已安裝的 launcher shim 執行 ocx ensure。此設定不會安裝重新啟動保護;請在啟動安全中檢查實際狀態。`,"dash.searchModel":`搜尋附屬模型`,"dash.searchModelHint":`用於非 OpenAI 路由模型的 web_search 的模型。需要 ChatGPT 登入。`,"dash.searchReasoning":`搜尋推理強度`,"dash.visionModel":`視覺附屬模型`,"dash.visionModelHint":`為純文字路由模型描述圖像的模型。需要 ChatGPT 登入。`,"dash.webSearchSidecar":`網頁搜尋附屬服務`,"dash.webSearchSidecarHint":`選擇路由模型進行網頁搜尋時使用的後端和模型。`,"dash.webSearchStream":`即時串流輸出回答`,"dash.webSearchStreamHint":`即時串流輸出開頭的文字和推理,直到模型決定呼叫工具;其餘部分為攔截搜尋而保持緩衝。搜尋前的文字可能會部分重複。`,"dash.visionSidecar":`視覺附屬服務`,"dash.visionSidecarHint":`選擇純文字路由模型描述圖像時使用的後端和模型。`,"dash.visionOff":`關閉`,"dash.shadowCallIntercept":`影子呼叫攔截`,"dash.shadowCallInterceptHint":`攔截 Codex 應用的背景 helper 呼叫({models})以生成標題與提交訊息,並將它們重定向到您選擇的模型。effort 固定為 low。`,"dash.shadowCallWarning":`⚠ 啟用後,{models} 的所有請求將被替換為所選模型。`,"dash.shadowCallOriginal":`原始`,"dash.shadowCallModel":`替代模型`,"dash.shadowCallTooltip":`Codex 應用會為執行緒標題生成、提交訊息生成與技能編排發出背景 helper 呼叫。helper 模型因客戶端版本而異,因此 opencodex 攔截此集合中的每個模型:{models}。啟用此選項可將這些呼叫重定向到您選擇的模型。`,"models.shadowCallIntercept":`影子呼叫攔截`,"models.shadowCallInterceptHint":`攔截 Codex 應用的背景 helper 呼叫({models})以生成標題與提交訊息,並將它們重定向到您選擇的模型。`,"dash.sidecarBackend":`後端`,"dash.sidecarModel":`模型`,"dash.backendAuto":`自動`,"dash.backendOpenAI":`OpenAI`,"dash.backendAnthropic":`Anthropic`,"dash.sidecarSaved":`附屬設定已儲存。將在下一個請求時生效。`,"dash.sidecarSaveFailed":`儲存附屬設定失敗。`,"dash.injectionLabel":`子代理委託`,"dash.injectionHint":`選擇供下方兩個控制元件共用的模型和可選推理強度。`,"dash.syncCodexSubagentDefaults":`用作原生 Codex 子代理預設值`,"dash.syncCodexSubagentDefaultsHint":`預設關閉。當 OpenCodex 管理 Codex 路由時,同步或重啟會將所選模型和推理強度應用為新 Codex 任務的原生 Codex [agents] 預設值。此設定本身不會觸發委託;現有的使用者自有 [agents] 預設值會保留而不會被覆蓋。`,"dash.multiAgentGuidance":`OpenCodex 多代理指引`,"dash.multiAgentGuidanceHint":`新增由 OpenCodex 編寫的委託指引。它與上方的原生 Codex 預設值相互獨立,不會更改 v1/v2 介面、子代理清單、路由或 effort 上限。`,"dash.injectionNone":`無`,"dash.injectionEffortLabel":`推理強度`,"dash.injectionEffortNone":`模型預設`,"dash.effortCapLabel":`V2 ultra 推理強度限制`,"dash.subagentEffortCapLabel":`V2 子代理推理強度限制`,"dash.effortCapHelp":`限制 V2 ultra 模式輪次的推理強度。設定後,來自 ultra 模式的 max 請求將被限制到所選級別。子代理限制僅適用於衍生的子代理。只會降低強度,不會提高。如果模型不支援所選級別,將自動降至最近的支援級別。`,"dash.effortCapNone":`無上限`,"dash.maintenance":`維護`,"dash.maintenanceHint":`重新整理 Codex 模型目錄,或安裝新的 opencodex 版本。`,"dash.syncModels":`同步模型`,"dash.syncing":`同步中…`,"dash.syncOk":`同步完成。已追加 {count} 個模型。`,"dash.syncStaleHint":`如果 Codex 仍顯示舊列表,請重啟長期執行的 app-server({cmd})。`,"dash.syncFailed":`同步失敗:{error}`,"dash.projectConfigTitle":`專案 Codex 配置繞過了 OpenCodex`,"dash.projectConfigHint":`這些儲存庫級設定會覆蓋 OpenCodex 代理(例如直接走 OpenCode Go)。請移除它們,以便該專案使用 ~/.codex/config.toml 的代理路由。`,"dash.checkUpdate":`檢查更新`,"dash.updateTitle":`更新 opencodex`,"dash.updateDesc":`檢查所選 npm 頻道的最新版本,然後選擇安裝後是否重新啟動代理。`,"dash.updateChannel":`頻道`,"dash.updateChecking":`正在檢查更新…`,"dash.updateInstalled":`已安裝`,"dash.updateLatest":`最新`,"dash.updateAvailable":`有可用更新`,"dash.updateCurrent":`已是最新`,"dash.updateCommand":`命令`,"dash.updateSource":`當前是原始碼檢出。請在終端執行顯示的命令進行更新。`,"dash.updateUnavailable":`無法從 npm 讀取最新版本。請稍後重試。`,"dash.updateRetry":`重試`,"dash.updateRecheck":`重新檢查`,"dash.updateCannotAuto":`無法一鍵更新({reason})。`,"dash.updateReason.source_checkout":`原始碼檢出`,"dash.updateReason.latest_unavailable":`無法連線 npm 登入檔`,"dash.updateReason.already_latest":`已是最新版本`,"dash.updateReason.unknown":`無法更新`,"dash.updateRestart":`更新後重新啟動`,"dash.updateRestartHint":`推薦開啟。代理重新啟動前,當前 GUI 仍執行舊程式碼。`,"dash.runUpdate":`更新`,"dash.updateReconnecting":`正在等待重新啟動後的代理…`,"dash.updateStatus.running":`正在更新 opencodex。`,"dash.updateStatus.restarting":`更新已安裝。正在重新啟動代理。`,"dash.updateStatus.succeeded":`更新完成。`,"dash.updateStatus.failed":`更新失敗。`,"prov.subtitle":`配置 opencodex 路由到 Codex 的上游供應商。使用帳號登入、新增供應商,或編輯原始配置。`,"prov.add":`新增供應商`,"prov.editJson":`編輯 JSON`,"prov.accountLogin":`帳號登入`,"prov.noOauth":`沒有可用的 OAuth 供應商。`,"prov.loggedIn":`已登入`,"prov.notLoggedIn":`未登入`,"prov.logout":`登出`,"prov.login":`登入`,"prov.loginWith":`使用 {provider} 登入`,"prov.waitingBrowser":`等待瀏覽器…`,"prov.didntOpen":`沒有開啟?點選這裡`,"prov.copyLink":`複製連結`,"prov.dontOpenBrowser":`不要在執行代理的機器上開啟瀏覽器`,"prov.dontOpenBrowserHint":`適用於使用其他瀏覽器設定檔登入,或儀表板與代理不在同一台機器上。`,"prov.linkCopied":`已複製`,"prov.linkCopyUnavailable":`剪貼簿不可用`,"prov.deviceCode":`裝置驗證碼`,"prov.copyCode":`複製驗證碼`,"prov.codeCopied":`驗證碼已複製`,"prov.editAlias":`編輯別名`,"prov.aliasPrompt":`顯示名稱(留空以清除)`,"prov.aliasSaved":`別名已儲存`,"prov.aliasSaveFailed":`無法儲存別名`,"prov.cooldownCleared":`已清除冷卻`,"prov.cooldownClearFailed":`清除冷卻失敗`,"prov.accountId":`ID`,"prov.pasteRedirect":`貼上重定向 URL 或授權碼`,"prov.pasteRedirectHint":`如果瀏覽器顯示 localhost 錯誤,請複製位址列中的完整 URL 並貼上到此處(或貼上授權碼)。`,"prov.pasteSubmit":`提交`,"prov.pasteSubmitting":`提交中…`,"prov.pasteOk":`已提交授權碼 — 正在完成登入…`,"prov.pasteFail":`無法提交授權碼:{error}`,"prov.port":`連接埠`,"prov.default":`預設`,"prov.loadingConfig":`載入中…`,"prov.saved":`已儲存!重新啟動代理以生效。`,"prov.loadConfigFail":`載入配置失敗`,"prov.invalidJson":`無效的 JSON`,"prov.removedDefault":`已移除「{name}」。預設供應商現在是「{defaultProvider}」。`,"prov.removeLastProvider":`沒有其他啟用的供應商可接手預設值時,無法移除此供應商。`,"prov.removeHasDependentCombos":`請先移除或更新這些相依的組合路由:{combos}。`,"prov.setDefault":`設為預設`,"prov.setDefaultSuccess":`「{name}」現在是預設供應商。`,"prov.setDefaultFail":`無法將「{name}」設為預設供應商。`,"prov.defaultDisabled":`設為預設前請先啟用此供應商。`,"prov.updateFail":`無法更新此供應商。`,"prov.networkError":`網路錯誤。請確認代理正在執行後再試一次。`,"prov.saveFailed":`儲存失敗`,"prov.loginFailStart":`{provider} 登入啟動失敗`,"prov.loginError":`{provider} 登入錯誤:{error}`,"prov.loginRequestFail":`{provider} 登入請求失敗`,"prov.loginCancelled":`{provider} 登入已取消`,"prov.loginTimeout":`{provider} 登入逾時 — 瀏覽器已關閉或未完成。請重試。`,"prov.loginOk":`已登入到 {provider}。執行 {cmd}(或即時生效)以列出其模型。`,"oauthTos.highTitle":`{provider}:訂閱 OAuth 風險`,"oauthTos.elevatedTitle":`{provider}:非官方 OAuth 橋接`,"oauthTos.anthropicBody":`透過 OpenCodex 等第三方代理直接複用 Claude 訂閱 OAuth 權杖,並非 Anthropic 支援的整合方式,可能導致存取受限。可使用 Claude 訂閱的受支援 Agent SDK 整合屬於另一種方式。`,"oauthTos.highBody":`OpenCodex 透過第三方 OAuth 路徑連線 {provider}。如果該用法不受支援,存取可能會被限制或暫停。`,"oauthTos.elevatedBody":`OpenCodex 透過非官方 OAuth 路徑連線 {provider}。請儘量使用官方客戶端;異常或自動化流量可能被視為濫用,存取可能會被限制或暫停。`,"oauthTos.saferPath":`更安全的做法:改為在 OpenCodex 中配置 API 金鑰。`,"oauthTos.acknowledge":`我瞭解風險,仍要繼續使用 OAuth。`,"oauthTos.continue":`繼續使用 OAuth`,"prov.logoutOk":`已登出 {provider}。`,"prov.logoutFail":`無法登出 {provider}。帳號狀態保持不變。`,"prov.removed":`已移除 "{name}"。`,"prov.removeFail":`移除 "{name}" 失敗。`,"prov.added":`已新增 "{name}"。現已生效 — 執行 {cmd}(或重新啟動)以在 Codex 選擇器中列出其模型。`,"prov.removeConfirm":`移除供應商 "{name}"?其模型將從 Codex 選擇器中消失。`,"prov.hasApiKey":`已配置 API 金鑰`,"prov.hasHeaders":`已配置自訂請求標頭`,"prov.accounts":`帳號({n})`,"prov.accountsAria":`展開/收起 {name} 帳號`,"prov.accountActive":`使用中`,"prov.accountReauth":`需重新登入`,"prov.reauthenticate":`重新認證`,"prov.reauthAccountMissing":`登入後未找到所選帳號`,"prov.reauthIdentityMismatch":`登入帳號與所選帳號不符合`,"prov.accountAdd":`新增帳號`,"prov.accountNoLabel":`帳號 {id}`,"prov.accountSwitchTitle":`使用此帳號`,"prov.accountSwitched":`已切換到 {email}。`,"prov.accountSwitchFail":`切換帳號失敗`,"prov.accountRemoved":`已移除 {email}。`,"prov.accountRemoveFail":`無法移除 {email}。帳號保持不變。`,"prov.accountRemoveAria":`移除 {email}`,"prov.accountRemoveConfirm":`移除帳號 {email}?其登入將從此代理中刪除。`,"prov.keyAdd":`新增 API 金鑰`,"prov.keyAdded":`已為 {name} 新增 API 金鑰。`,"prov.keyAddFail":`新增 API 金鑰失敗`,"prov.keyPlaceholder":`貼上 API 金鑰`,"prov.keySwitchTitle":`使用此金鑰`,"prov.keySwitched":`已切換到金鑰 {key}。`,"prov.keySwitchFail":`切換金鑰失敗`,"prov.keyRemoved":`已移除金鑰 {key}。`,"prov.keyRemoveAria":`移除金鑰 {key}`,"prov.keyRemoveConfirm":`移除 API 金鑰 {key}?它將從此代理的配置中刪除。`,"prov.activeBadge":`已啟用`,"prov.disabledBadge":`已停用`,"prov.defaultBadge":`預設`,"prov.enable":`啟用`,"prov.disable":`停用`,"prov.enabled":`已啟用 "{name}"。其模型可再次出現在 Codex 中。`,"prov.disabled":`已停用 "{name}"。設定會保留,但模型會被隱藏。`,"prov.enableFail":`啟用 "{name}" 失敗。`,"prov.disableFail":`停用 "{name}" 失敗。`,"prov.enableAria":`啟用供應商 {name}`,"prov.disableAria":`停用供應商 {name}`,"prov.defaultCannotDisable":`預設供應商不能被停用`,"prov.openaiAccountMode":`Codex 帳號模式`,"prov.openaiModePool":`帳號池`,"prov.openaiModeDirect":`直連`,"prov.openaiPoolDesc":`預設模式。根據會話關聯、額度、冷卻時間和容錯移轉,在主登入與已新增帳號之間輪換。`,"prov.openaiDirectDesc":`僅使用當前主 Codex 登入。不會讀取或輪換已儲存的帳號池帳號。`,"prov.openaiModeSaved":`OpenAI 帳號模式已更改為 {mode}。`,"prov.openaiModeSaveFailed":`無法更改 OpenAI 帳號模式。`,"prov.openaiApiDesc":`僅使用 OpenAI API 金鑰,不使用 Codex 帳號憑證。`,"prov.manageCodexAccounts":`管理 Codex 帳號`,"prov.openaiApiMissing":`需要 API 金鑰`,"prov.openaiApiSetup":`設定 API 金鑰`,"models.subtitle":`開關 Codex 可見的模型 — 原生 GPT passthrough 與已路由模型按供應商分組(點選標題可摺疊)。已停用的模型會從目錄和模型選擇器中隱藏。更改在下一個 Codex 回合生效 — opencodex 會使 Codex 的 5 分鐘模型快取失效,因此無需重新啟動。`,"models.nativeGroupLabel":`OpenAI 原生`,"models.nativeHint":"Passthrough 模型使用在供應商頁面選擇的帳號池或直連選項。關閉後會從 Codex 選擇器中隱藏(目錄條目保留,重新開啟即可完整恢復)。 在此新增模型會註冊為路由的 `openai/<model>` 選擇器,而非新的裸 passthrough id。","models.active":`{active}/{total} 已啟用`,"models.workspace.providers":`供應商`,"models.workspace.allProviders":`所有供應商`,"models.workspace.mainAria":`模型詳細資料`,"models.allOn":`全部開啟`,"models.allOff":`全部關閉`,"models.presetLabel":`模型`,"models.presetMode_preset":`預設集`,"models.presetMode_all":`全部`,"models.presetMode_custom":`自訂`,"models.presetSummary":`顯示 {count} / {total} — 核心預設集 v{version}`,"models.presetUpdateAvailable":`預設集 v{version} 可用`,"models.presetAppliedToast":`{provider}:已套用預設集 — 選取 {count} 個模型`,"models.presetClearedToast":`{provider}:顯示全部模型`,"models.presetEmpty":`{provider}:預設集未比對到模型,選擇維持不變`,"models.presetConfirmReplace":`以包含 {count} 個模型的預設集取代你的選擇?`,"models.cap350k":`限制 350k`,"models.capApplied":`上下文限制已套用 — 將在下一個 Codex 回合生效。`,"models.capSaveFailed":`儲存上下文限制失敗`,"models.contextCapped":`350k 限制`,"models.contextCapLabel":`安全上限 / 回退`,"models.v2Label":`子代理`,"models.shadowCallOriginal":`⚠ {models} →`,"models.v2DocsLink":`v1 / v2 是什麼?`,"models.v2Mode_v1":`v1`,"models.v2Mode_default":`base`,"models.v2Mode_v2":`v2`,"models.v2ModeDesc_v1":`所有模型 → v1 介面`,"models.v2ModeDesc_default":`上游預設值 (sol/terra=v2, luna=v1)`,"models.v2ModeDesc_v2":`所有模型 → v2 介面`,"models.keepNativeOnV1":`ChatGPT 維持 v1`,"models.keepNativeOnV1Hint":`ChatGPT 原生父代理會加密 v2 子任務,Grok/Claude 無法讀取。若 Sol/Terra 仍需派發路由模型,請保持開啟。路由父代理仍使用 v2。`,"models.v2Help":`控制所有模型的多代理介面。
42
+
43
+ v1: 經典單執行緒代理。所有模型使用 v1 協作介面。
44
+ base: 上游預設值 — sol/terra 使用 v2,luna 使用 v1,其餘跟隨 codex 功能標誌。
45
+ v2: 多執行緒代理(spawn_agent)。所有模型使用 v2 協作介面。
46
+
47
+ 在 v2 下,「ChatGPT 維持 v1」會讓 Sol/Terra 留在 v1,以便繼續派發 Grok 或 Claude。ChatGPT 會加密 v2 子任務,路由模型無法讀取;路由父代理仍留在 v2。
48
+
49
+ 更改在新會話中生效。`,"dash.multiAgent":`子代理`,"models.v2Conflict":`[agents] max_threads 仍存在 — codex 將拒絕啟動,請從 config.toml 移除`,"models.v2Applied":`子代理模式已更新 — 新會話生效(重新啟動 Codex 應用以重新整理選擇器)`,"models.v2ThreadsLabel":`最大執行緒`,"models.v2ThreadsDefault":`預設 (4)`,"models.v2ThreadsApplied":`執行緒上限已更新 — 新會話生效`,"models.v2ThreadsInvalid":`執行緒上限必須為 >= 1 的整數`,"models.v2ThreadsApply":`套用`,"models.capValue":`預設 {value}`,"models.contextCappedValue":`{value} 限制`,"models.contextMetadataSource":`來源`,"models.contextMetadataLive":`已偵測`,"models.contextMetadataRegistry":`登錄檔`,"models.contextMetadataCursorStatic":`Cursor 精選`,"models.contextMetadataSnapshot":`已儲存`,"models.contextMetadataFallback":`回退`,"models.contextMetadataDerived":`衍生`,"models.contextMetadataUnknown":`未知`,"models.contextMetadataStale":`過期`,"models.contextTooltipDetected":`{value} · 已偵測`,"models.contextTooltipCapped":`{detected} 已偵測 · 上限 {cap}`,"models.contextTooltipStale":`{value}({when})`,"models.contextTooltipUnknown":`上下文視窗未知`,"models.contextTooltipSource":`{value}({source})`,"models.contextLastChecked":`上次檢查 {when}`,"models.contextYesterday":`昨天`,"models.setAll":`全部設定`,"models.setAllHint":`為所有已路由供應商打開 {value} 預設視窗。中繼站沒回報 context_window / context_length 時,這個值就是 Codex 實際視窗。要幫單一模型手寫,用同一列上的「自訂視窗」。原生供應商不受影響。`,"models.collapseAll":`全部摺疊`,"models.expandAll":`全部展開`,"models.orderHint":`選擇器順序:Subagents 中的選擇(按所選順序)→ 其餘已路由模型(依次按供應商、模型 ID 字母排序)→ 原生模型。可見性開關僅用於篩選,不會改變此順序。`,"models.custom":`自訂…`,"models.customApply":`套用`,"models.customPlaceholder":`tokens (例如 420000)`,"models.customAdd":`新增自訂模型`,"models.customAddTitle":`新增自訂模型 — {provider}`,"models.customEditTitle":`編輯自訂模型 — {provider}`,"models.customAdded":`已新增自訂模型`,"models.customUpdated":`已更新自訂模型`,"models.customDeleted":`已刪除自訂模型`,"models.customSaveFailed":`儲存自訂模型失敗`,"models.customSaving":`正在儲存…`,"models.customAddBtn":`新增`,"models.customEditBtn":`更新`,"models.customEditNamed":`編輯{name}`,"models.customDeleteNamed":`刪除{name}`,"models.customDeleteConfirm":`要刪除模型 {name} 嗎?`,"models.customBadge":`自訂`,"models.customSummary":`{count} 個自訂模型`,"models.customFieldModelId":`模型 ID(端點標識)`,"models.customFieldModelIdPlaceholder":`例如 qwen4-max-preview`,"models.customFieldDisplayName":`顯示名稱(可選)`,"models.customFieldDisplayNamePlaceholder":`例如 Qwen 4 Max Preview`,"models.customFieldContext":`上下文視窗`,"models.customFieldModalities":`輸入模態`,"models.customFieldReasoning":`推理強度`,"models.customFieldReasoningOverride":`覆寫推理強度`,"models.reasoningEffort.none":`無`,"models.reasoningEffort.minimal":`最低`,"models.reasoningEffort.low":`低`,"models.reasoningEffort.medium":`中`,"models.reasoningEffort.high":`高`,"models.reasoningEffort.xhigh":`極高`,"models.reasoningEffort.max":`最高`,"models.tipProvider":`供應商`,"models.tipContext":`上下文`,"models.tipModalities":`模態`,"models.tipStatus":`狀態`,"models.tipActive":`已啟用`,"models.tipDisabled":`已停用`,"models.applied":`已套用 — 將在下一個 Codex 回合生效。`,"models.saveFailed":`儲存失敗`,"models.networkError":`網路錯誤 — 代理在執行嗎?`,"models.loadFail":`載入模型失敗 — 代理在執行嗎?`,"models.noRouted":`沒有已路由的模型`,"models.noRoutedHint":`請先登入供應商或新增一個。`,"models.emptyDiscovery":`未發現任何模型。請檢查供應商端點,或新增靜態/自訂模型。`,"models.emptyDiscoveryDisabled":`即時模型發現已關閉,且尚未配置靜態模型。`,"models.discoveryFailedBadge":`發現失敗`,"models.discoveryFailedHttp":`模型發現失敗(HTTP {status})。`,"models.discoveryFailedBlocked":`模型發現被目標策略阻止。`,"models.discoveryFailedInvalidResponse":`模型發現返回了無效回應。`,"models.discoveryFailedNetwork":`由於網路錯誤,模型發現失敗。`,"models.discoveryFailedProvider":`供應商報告了模型發現錯誤。`,"models.discoveryFailedGeneric":`模型發現失敗。`,"models.openProviderSettings":`開啟供應商設定`,"models.loading":`載入中…`,"models.search":`搜尋模型…`,"models.showMore":`再顯示 {n} 個`,"models.allowlistLabel":`僅所選`,"models.allowlistHint":`僅勾選的模型進入目錄(留空 = 全部)。適用於暴露成千上萬模型的供應商。`,"models.selectedCount":`已選 {n} 個`,"sub.subtitle":`Codex 的 {cmd} 僅將優先順序最高的前 5 個模型作為覆蓋項公開。在此最多選擇 5 個 — 原生 gpt 或已路由模型 — opencodex 會設定它們的目錄優先順序,使其正好排在前面。其他模型仍可按確切名稱呼叫;此設定僅控制顯示項。`,"sub.featured":`精選`,"sub.orderHint":`此處所選並顯示的順序決定 Codex 模型選擇器頂部第 1–5 位,以及 {cmd} 的預設模型候選。`,"sub.noneSelected":`未選擇 — 請從下方列表選擇。`,"sub.models":`模型`,"sub.search":`搜尋模型(原生 gpt + 已路由)…`,"sub.noModels":`沒有模型 — 請先登入供應商或新增一個。`,"sub.saved":`已儲存 {n} 個模型。啟動新的 Codex 會話(或執行 {cmd})以將它們作為 spawn_agent 覆蓋項檢視。`,"sub.saveFailed":`儲存失敗`,"sub.networkError":`網路錯誤 — 代理在執行嗎?`,"sub.loadFail":`載入模型失敗 — 代理在執行嗎?`,"sub.loading":`載入中…`,"sub.moveUp":`上移 {m}`,"sub.moveDown":`下移 {m}`,"sub.removeAria":`移除 {m}`,"sub.ultraMode":`超級模式`,"sub.ultraModeHint":`為所有模型和推理力度啟用主動多代理委派策略(不改變推理力度本身)。將 features.multi_agent_v2.multi_agent_mode_hint_text 寫入 config.toml。`,"sub.ultraModeV2Required":`需要 v2 多代理表面 — 請先啟用 multi_agent_v2,並在子代理模式控制項中選擇 v2。`,"sub.ultraModeText":`超級模式委派文字`,"sub.ultraModePreset":`還原預設`,"sub.ultraModeLoadFail":`無法載入超級模式設定 — 代理是否在執行?`,"sub.ultraModeSaveFail":`儲存超級模式設定失敗`,"sub.ultraModeSaved":`超級模式已儲存。適用於新的 Codex 會話。`,"sub.nativeParentOverride":`路由原生 V2 父代理`,"sub.nativeParentOverrideHint":`Codex 可能顯示原始原生模型,而 OpenCodex 會在所選路由目標上執行根請求。`,"sub.nativeParentOverridePrivacyWarning":`提示詞、儲存庫內容、對話記錄和工具結果會傳送至所選提供者,並繼承其可用性、內容、延遲、行為、成本和隱私特性。`,"sub.nativeParentOverrideModel":`原生父代理目標模型`,"sub.nativeParentOverrideV2Required":`需要明確 V2、上游 V2 旗標,並關閉「將 ChatGPT 保持在 v1」。`,"sub.nativeParentOverrideSaveFail":`儲存原生父代理路由失敗`,"sub.nativeParentOverrideSaved":`原生父代理路由已儲存。適用於後續父代理回合和壓縮。`,"sub.agentTaskRecovery":`恢復加密的 V2 任務`,"sub.agentTaskRecoveryHint":`透過 ChatGPT 解密 OpenAI Fernet 加密任務訊息,以便非 OpenAI 子代理可以讀取並執行路由的 V2 任務。`,"sub.agentTaskRecoveryModel":`恢復模型(預設:gpt-5.6-luna)`,"sub.agentTaskRecoverySaveFail":`儲存加密任務恢復設定失敗`,"sub.agentTaskRecoverySaved":`加密任務恢復設定已儲存。`,"sub.roles":`角色`,"sub.roles.hint":`父代理可以 spawn 的具名專家。每個角色固定模型與子代理提示。是否委派仍由父代理決定。`,"sub.roles.add":`新增角色`,"sub.roles.empty":`尚無角色。請為審查、搜尋或其他委派工作新增專家。`,"sub.roles.full":`角色目錄已滿(最多 8 個)`,"sub.roles.id":`角色名稱`,"sub.roles.description":`何時使用`,"sub.roles.descriptionHint":`顯示給父代理,讓它知道何時 spawn 此專家。`,"sub.roles.model":`模型`,"sub.roles.effort":`推理強度`,"sub.roles.effortNone":`模型預設`,"sub.roles.instructions":`子代理說明`,"sub.roles.instructionsHint":`子代理載入的開發者提示。`,"sub.roles.enabled":`啟用`,"sub.roles.delete":`刪除角色 {id}`,"sub.roles.save":`儲存角色`,"sub.roles.saved":`角色已儲存。適用於新的 Codex 會話。`,"sub.roles.saveFailed":`儲存角色失敗`,"sub.roles.loadFail":`無法載入角色 — 代理是否正在執行?`,"sub.roles.routedV2Warning":`此角色在 v2 表面上使用了路由模型,且未將 ChatGPT 維持在 v1。原生 v2 父工作階段會加密子任務。`,"sub.roles.sync":`同步到 Codex 代理檔案`,"sub.roles.syncHint":`將已啟用角色寫入帶標記的 ocx-*.toml。關閉時只清理 OpenCodex 擁有的檔案,不改動你的檔案。`,"sub.injectionPrompt":`自訂父級指引`,"sub.injectionPromptHint":`取代內建 v2 spawn 說明。留空則使用內建文字。若需要即時值,請加入佔位符:`,"sub.injectionPromptSave":`儲存父級指引`,"sub.injectionPromptSaved":`父級指引已儲存。適用於新的 Codex 會話。`,"sub.injectionPromptSaveFailed":`儲存父級指引失敗`,"sub.childInstructions":`全域子代理說明`,"sub.childInstructionsHint":`套用到每個被 spawn 的子代理。角色說明在同步後僅套用到該專家。`,"sub.childInstructionsSave":`儲存子代理說明`,"sub.childInstructionsSaved":`子代理說明已儲存。適用於新的 Codex 會話。`,"sub.childInstructionsSaveFailed":`儲存子代理說明失敗`,"logs.title":`請求日誌`,"logs.tabLogs":`日誌`,"logs.tabDebug":`除錯`,"logs.subtitle":`經過本地 opencodex 代理的最近請求,最新在前。`,"logs.autoRefresh":`自動重新整理`,"logs.noRequests":`暫無請求。`,"logs.loadError":`無法載入請求日誌。`,"logs.filter.surface.label":`介面`,"logs.filter.surface.all":`全部`,"logs.filter.surface.claude":`Claude`,"logs.filter.surface.codex":`Codex`,"logs.filter.surface.grok":`Grok`,"logs.filter.interceptedHelpersOnly":`僅已攔截的輔助請求`,"logs.filter.model.label":`模型`,"logs.filter.model.all":`所有模型`,"logs.filter.provider.label":`提供者`,"logs.filter.provider.all":`所有提供者`,"logs.filter.status.label":`狀態`,"logs.filter.status.all":`所有狀態`,"logs.filter.status.success":`成功 (2xx)`,"logs.filter.status.errors":`錯誤 (4xx/5xx)`,"logs.filter.time.label":`時間`,"logs.filter.time.all":`全部時間`,"logs.filter.time.15m":`最近 15 分鐘`,"logs.filter.time.1h":`最近 1 小時`,"logs.filter.time.24h":`最近 24 小時`,"logs.filter.speed.label":`速度`,"logs.filter.speed.all":`所有速度`,"logs.filter.speed.slow":`< 15 tok/s`,"logs.filter.speed.medium":`15–50 tok/s`,"logs.filter.speed.fast":`> 50 tok/s`,"logs.filter.reset":`重設篩選`,"logs.filter.showingCount":`顯示 {count} / {total} 條`,"logs.badge.interceptedHelper":`I · {model}`,"logs.badge.interceptedHelperTitle":`已攔截的輔助請求`,"logs.filter.conversation.label":`對話`,"logs.filter.conversation.placeholder":`貼上對話 ID`,"logs.filter.conversation.clear":`清除`,"logs.filter.conversation.apply":`篩選日誌`,"logs.conversation.totals":`{requests} 次請求 · {tokens} tokens · {cost}`,"logs.conversation.scope":`合計僅涵蓋目前已載入的 Logs 環形緩衝。`,"logs.conversation.excluded":`(~$ 已排除 {unpriced} 筆無定價、{unmetered} 筆無計量)`,"logs.cost.approximate":`約 {amount}`,"logs.cost.lowerBound":`至少 {amount}`,"logs.cost.unavailable":`無法估算`,"logs.detail.conversation":`對話`,"logs.badge.claude":`Claude`,"logs.col.time":`時間`,"logs.col.request":`請求`,"logs.col.model":`模型`,"logs.col.effort":`推理強度`,"logs.col.provider":`供應商`,"logs.col.status":`狀態`,"logs.col.tokens":`Token 數`,"logs.col.tokPerSec":`tok/s`,"logs.col.estimatedCost":`~$`,"logs.metric.tokPerSecTitle":`按完整請求耗時計算的每秒輸出 token`,"logs.metric.estimatedCostTitle":`按 API 標價估算,並非實際扣費;價格無法符合時不顯示`,"usage.cost.total":`API 標價折算(當前範圍)`,"usage.cost.disclaimer":`這不是帳單或扣費憑證。實際可能計入訂閱用量或消耗服務商額度。`,"usage.cost.unpricedNote":`已排除 {count} 個無法計費的請求`,"logs.detail.section.basic":`基本資訊`,"logs.detail.section.performance":`效能`,"logs.detail.section.cost":`API 標價折算`,"logs.detail.section.attempts":`Combo 嘗試`,"logs.detail.section.usage":`原始 usage`,"logs.detail.ttft":`TTFT`,"logs.detail.costTotal":`標價折算`,"logs.detail.totalTokens":`Token 總數`,"logs.detail.matchedKey":`符合的 jawcode 鍵`,"logs.detail.priceSource":`價格來源`,"logs.detail.unavailableReason":`不可用原因`,"logs.detail.copyRequestId":`複製請求 ID`,"logs.detail.copied":`已複製`,"logs.detail.source.jawcode":`jawcode 目錄`,"logs.detail.source.expected":`Expected 價格覆蓋`,"logs.detail.verification.verified":`已驗證`,"logs.detail.verification.derived":`由基礎模型推導`,"logs.detail.attempt.target":`供應商 / 模型`,"logs.detail.attempt.reason":`結果 / 原因`,"logs.detail.attempt.completed":`已完成`,"logs.detail.attempt.e2eNote":`頂層 tok/s 為端到端值;每次嘗試使用各自耗時。`,"logs.detail.reason.usage_missing":`未上報 usage。`,"logs.detail.reason.usage_unsupported":`該供應商不支援上報 usage。`,"logs.detail.reason.output_missing":`未上報正數輸出 token。`,"logs.detail.reason.invalid_duration":`請求耗時無效。`,"logs.detail.reason.price_unmatched":`未找到符合的 jawcode 價格。`,"logs.detail.reason.invalid_cache_breakdown":`快取 token 明細與輸入 token 總數衝突。`,"logs.detail.reason.invalid_usage":`Usage 包含無效的 token 值。`,"logs.detail.reason.combo_attempt_unavailable":`至少一次 Combo 嘗試無法計價。`,"logs.detail.estimate.usage_estimated":`供應商 usage 為估算值。`,"logs.detail.estimate.cache_detail_missing":`缺少快取明細;輸入費用按上限估算。`,"logs.detail.estimate.expected_price_overlay":`使用了已驗證的 Expected 標價。`,"logs.col.error":`錯誤`,"logs.col.upstreamReason":`上游原因`,"logs.col.duration":`耗時`,"logs.modelTooltip.model":`模型`,"logs.modelTooltip.resolvedModel":`解析後模型`,"logs.modelTooltip.requestedTier":`請求層級`,"logs.modelTooltip.configuredTier":`設定層級`,"logs.modelTooltip.responseTier":`回應層級`,"logs.modelTooltip.supportsTier":`支援層級`,"logs.tokens.reported":`已上報`,"logs.tokens.unreported":`未上報`,"logs.tokens.unsupported":`不支援`,"logs.tokens.estimated":`估算`,"logs.tokens.input":`輸入`,"logs.tokens.output":`輸出`,"logs.tokens.cacheRead":`快取命中 (c)`,"logs.tokens.cacheWrite":`快取寫入 (w)`,"logs.tokens.reasoning":`推理`,"logs.tokens.noCache":`無快取資料`,"logs.tokens.noCacheNote":`該供應商不報告快取 token 數`,"logs.tokens.noCacheCursor":`Cursor 未報告快取明細`,"logs.tokens.noCacheCursorNote":`Cursor 不提供快取讀寫 token 數;這表示未知,並不代表已確認快取未命中`,"logs.tokens.estimatedNote":`估算值(供應商不報告精確用量)`,"logs.details":`檢視詳細資料`,"logs.detailTitle":`請求詳細資料`,"logs.detailRaw":`原始日誌`,"debug.title":`除錯`,"debug.subtitle":`可選的 provider transport 與 usage 提取診斷。請求錯誤和 502 在“日誌”分頁顯示。`,"debug.debug":`供應商除錯`,"debug.usage":`用量提取`,"debug.injection":`注入日誌`,"debug.claude":`Claude 入站`,"debug.claudeInbound.title":`Claude 入站請求`,"debug.claudeInbound.sub":`顯示 Claude Code/Desktop 實際傳送的內容(thinking、effort、metadata)— 不儲存提示詞原文。`,"debug.claudeInbound.empty":`尚未捕獲任何請求。開啟後從 Claude 傳送一條訊息試試。`,"debug.claudeInbound.time":`時間`,"debug.claudeInbound.endpoint":`端點`,"debug.claudeInbound.model":`模型`,"debug.claudeInbound.none":`無`,"debug.reset":`清除執行時覆蓋`,"debug.refresh":`重新整理`,"debug.follow":`跟隨捲動`,"debug.streamProvider":`供應商`,"debug.streamUsage":`用量`,"debug.streamInjection":`注入`,"debug.loading":`正在載入除錯設定…`,"debug.emptyTitle":`除錯日誌已關閉`,"debug.empty":`請在上方卡片中開啟供應商除錯或用量提取。透過代理傳送請求後,診斷行會顯示在這裡。`,"debug.noLinesTitle":`等待診斷行`,"debug.noLines.provider":`供應商除錯已開啟,但僅紀錄傳輸異常(捨棄或格式錯誤的幀,以及 Cursor dial/retry 事件)。透過 Anthropic 等供應商的正常請求可能不會產生任何行。`,"debug.noLines.usage":`用量提取已開啟但尚未捕獲任何內容。請透過 Codex 傳送請求,隨後會顯示在此處。`,"debug.noLines.injection":`注入日誌已開啟但尚未捕獲任何內容。它紀錄協作和子代理回合中的多代理指導注入與 effort-cap 決策。`,"usage.title":`用量`,"usage.subtitle":`代理本地的 Token 用量統計。缺失的用量不會顯示為零。`,"usage.loading":`正在載入用量資料…`,"usage.empty":`尚無用量紀錄。透過代理傳送請求後將在此顯示。`,"usage.loadError":`無法載入用量資料。`,"usage.range.all":`全部`,"usage.range.30d":`30 天`,"usage.range.7d":`7 天`,"usage.card.requests":`請求數`,"usage.card.measured":`已計量`,"usage.card.reported":`已上報`,"usage.card.totalTokens":`Token 總數`,"usage.card.cachedTokens":`快取命中 Token`,"usage.card.cachedTokensHint":`從供應商快取讀取的提示 Token(命中)。快取寫入在下方單獨顯示。`,"usage.card.cacheWriteTokens":`快取寫入`,"usage.card.coverage":`覆蓋率`,"usage.card.activeDays":`活躍天數`,"usage.section.heatmap":`每日活動`,"usage.section.overview":`總覽`,"usage.section.models":`模型`,"usage.section.providers":`供應商`,"usage.section.coverage":`覆蓋率明細`,"usage.coverage.measured":`已計量`,"usage.coverage.reported":`供應商上報`,"usage.coverage.estimated":`估算`,"usage.coverage.note":`已計量包含供應商上報和估算的 Token 數。未上報 / 不支援請求僅做計數,不會被算作 0 Token。`,"usage.search.models":`搜尋模型…`,"usage.col.requests":`請求數`,"usage.col.measured":`已計量`,"usage.col.reported":`已上報`,"usage.col.tokens":`Token 數`,"usage.col.share":`佔比`,"usage.heatmap.less":`少`,"usage.heatmap.more":`多`,"usage.dayMon":`一`,"usage.dayWed":`三`,"usage.dayFri":`五`,"usage.heatmap.tooltipTokens":`{tokens} Token`,"usage.heatmap.tooltipRequests":`{requests} 請求`,"usage.chart.dayDetail":`{date}:{requests} 個請求,{tokens} 個 Token`,"usage.heatmap.keyboardLabel":`使用上下方向鍵按天移動,使用左右方向鍵按週移動。`,"nav.storage":`儲存`,"storage.title":`儲存`,"storage.subtitle":`CODEX_HOME 磁碟佔用診斷。下方歸檔清理可將最舊歸檔會話隔離或永久刪除——活動會話保持只讀。`,"storage.loading":`正在掃描儲存…`,"storage.empty":`CODEX_HOME 為空或不存在——沒有可顯示的內容。`,"storage.error":`儲存掃描失敗。請檢查 CODEX_HOME 是否指向有效目錄。`,"storage.refresh":`重新掃描`,"storage.card.total":`總大小`,"storage.card.files":`檔案數`,"storage.card.home":`CODEX_HOME`,"storage.section.buckets":`分類`,"storage.section.largest":`最大檔案`,"storage.col.bucket":`分類`,"storage.col.size":`大小`,"storage.col.files":`檔案`,"storage.col.oldest":`最舊`,"storage.col.newest":`最新`,"storage.col.rows":`資料庫行數`,"storage.rows.unknown":`未知(已鎖定)`,"storage.bucket.sessions":`活動會話`,"storage.bucket.archived_sessions":`已歸檔會話`,"storage.bucket.logs_db":`日誌資料庫`,"storage.bucket.state_db":`狀態資料庫`,"storage.bucket.attachments":`附件`,"storage.bucket.deletion_manifests":`刪除清單`,"storage.bucket.other":`其他`,"storage.cleanup.title":`歸檔清理`,"storage.cleanup.help":`按百分比移除最舊的歸檔會話。不會觸碰活動會話。預設隔離——檔案移至 CODEX_HOME/.trash。`,"storage.cleanup.slider":`最舊歸檔百分比`,"storage.cleanup.percent":`最舊 {percent}%`,"storage.cleanup.preset":`{percent}`,"storage.cleanup.preview":`預覽`,"storage.cleanup.confirmTitle":`確認歸檔清理`,"storage.cleanup.confirmBody":`將處理 {count} 個歸檔檔案(約 {size}),即最舊的 {percent}%。`,"storage.cleanup.moreFiles":`…以及另外 {n} 個`,"storage.cleanup.permanent":`永久刪除(跳過隔離)`,"storage.cleanup.permanentWarn":`永久刪除無法復原。`,"storage.cleanup.quarantineNote":`檔案會移到 CODEX_HOME 下的 .trash。可在下方「隔離區」恢復。`,"storage.cleanup.cancel":`取消`,"storage.cleanup.confirmQuarantine":`隔離`,"storage.cleanup.confirmPermanent":`永久刪除`,"storage.cleanup.doneQuarantine":`已隔離 {count} 個檔案({size})。`,"storage.cleanup.donePermanent":`已永久刪除 {count} 個檔案({size})。`,"storage.cleanup.previewFailed":`預覽失敗。`,"storage.cleanup.cleanupFailed":`清理失敗。`,"storage.cleanup.err.codex_busy":`Codex 正在使用 state.sqlite — 請退出 Codex 後重試。`,"storage.cleanup.err.stale_preview":`預覽後歸檔檔案已變化 — 請重新預覽。`,"storage.cleanup.err.restore_pending_overlap":`所選歸檔與未完成的隔離區恢復重疊 — 請先完成或重試恢復。`,"storage.cleanup.err.referenced_history":`所選歸檔仍被 fork 或分頁歷史引用。`,"storage.cleanup.err.invalid_digest":`預覽摘要缺失或無效。`,"storage.cleanup.err.invalid_mode":`模式必須是 quarantine 或 permanent。`,"storage.cleanup.err.fs_failed":`檔案系統清理失敗。部分更改可能已生效 — 請檢查 CODEX_HOME/.trash 及顯示的恢復路徑。`,"storage.cleanup.err.fs_failed_trash":`檔案系統清理失敗。部分更改可能已生效 — 請在 {trashDir} 和 manifest.json 中查詢可恢復檔案。`,"storage.cleanup.err.db_reconcile_failed":`無法更新 Codex 狀態資料庫。`,"storage.cleanup.err.cleanup_failed":`清理失敗。`,"storage.trash.title":`隔離區`,"storage.trash.help":`已移至 CODEX_HOME/.trash 的歸檔會話。恢復會把 JSONL 與執行緒行寫回。`,"storage.trash.empty":`沒有隔離條目。`,"storage.trash.loading":`正在載入隔離區…`,"storage.trash.col.when":`隔離時間`,"storage.trash.col.files":`檔案`,"storage.trash.col.size":`大小`,"storage.trash.col.mode":`模式`,"storage.trash.col.id":`條目`,"storage.trash.restore":`恢復`,"storage.trash.confirmTitle":`恢復隔離條目?`,"storage.trash.confirmBody":`將 {count} 個檔案(約 {size})從 {id} 恢復到歸檔會話。`,"storage.trash.cancel":`取消`,"storage.trash.confirmRestore":`恢復`,"storage.trash.done":`已恢復 {count} 個檔案({size})。`,"storage.trash.restoreFailed":`恢復失敗。`,"storage.trash.listFailed":`無法列出隔離條目。`,"storage.trash.mode.quarantine":`隔離`,"storage.trash.mode.permanent":`永久(未完成)`,"storage.trash.err.codex_busy":`Codex 正在使用 state.sqlite — 請退出 Codex 後重試。`,"storage.trash.err.invalid_trash":`隔離條目 ID 缺失或無效。`,"storage.trash.err.missing_trash":`未找到隔離條目。`,"storage.trash.err.dest_exists":`恢復目標已存在 — 請刪除或重新命名歸檔檔案後重試。`,"storage.trash.err.fs_failed":`檔案系統恢復失敗。部分檔案可能已恢復 — 請檢查 archived_sessions 與 .trash。`,"storage.trash.err.db_reconcile_failed":`無法恢復 Codex 狀態資料庫行。`,"storage.trash.err.storage_mutation_busy":`另一項儲存清理或恢復正在進行 — 請稍後再試。`,"storage.trash.err.restore_failed":`恢復失敗。`,"storage.trash.err.restore_worker_timeout":`恢復耗時過長(超過 10 分鐘)已停止。`,"storage.trash.err.restore_worker_aborted":`關閉過程中恢復已取消。`,"storage.trash.err.restore_worker_failed":`恢復 worker 崩潰或意外失敗。`,"storage.policy.title":`自動清理策略`,"storage.policy.help":`當歸檔大小超過閾值時可選批次清理。預設關閉——不會自動啟用。`,"storage.policy.loading":`正在載入策略…`,"storage.policy.loadFailed":`無法載入清理策略。`,"storage.policy.saveFailed":`無法儲存清理策略。`,"storage.policy.runFailed":`策略執行失敗。`,"storage.policy.alreadyRunning":`清理策略已在執行中。`,"storage.policy.invalid":`策略值無效。`,"storage.policy.enabled":`啟用自動清理`,"storage.policy.enabledHint":`預設關閉。啟用後僅按所選計劃(或立即執行)執行。`,"storage.policy.threshold":`歸檔大小超過時觸發(GiB)`,"storage.policy.target":`清理目標`,"storage.policy.targetPercent":`刪除最舊歸檔百分比`,"storage.policy.targetReduce":`將歸檔縮小至(GiB)`,"storage.policy.schedule":`計劃`,"storage.policy.schedule.manual":`僅手動`,"storage.policy.schedule.startup":`代理啟動時`,"storage.policy.schedule.daily":`每天`,"storage.policy.schedule.weekly":`每週`,"storage.policy.mode":`刪除模式`,"storage.policy.mode.quarantine":`隔離(預設)`,"storage.policy.mode.permanent":`永久刪除`,"storage.policy.permanentWarn":`永久模式無法復原。不確定時請使用隔離。`,"storage.policy.lastRun":`上次執行`,"storage.policy.lastRunDetail":`已移除 {count} · 釋放 {size}`,"storage.policy.nextRun":`下次執行`,"storage.policy.never":`從未`,"storage.policy.save":`儲存`,"storage.policy.runNow":`立即執行`,"storage.policy.running":`執行中…`,"storage.policy.saved":`策略已儲存。`,"storage.policy.skippedDisabled":`策略已禁用 — 請先啟用。`,"storage.policy.skippedUnder":`歸檔大小低於閾值 — 無需操作。`,"storage.policy.skippedEmpty":`沒有匹配目標的歸檔候選項。`,"storage.policy.doneQuarantine":`策略已隔離 {count} 個檔案({size})。`,"storage.policy.donePermanent":`策略已永久刪除 {count} 個檔案({size})。`,"modal.addNamed":`新增:{label}`,"modal.add":`新增供應商`,"modal.catalogTabs":`供應商類別`,"modal.searchLabel":`搜尋供應商`,"modal.search":`搜尋供應商…`,"modal.logInWith":`使用 {label} 登入`,"modal.waitingBrowser":`等待瀏覽器…`,"modal.providerName":`供應商名稱`,"modal.adapter":`介面卡`,"modal.baseUrl":`Base URL`,"modal.endpoint":`端點`,"modal.endpoint.tokenPlan":`Token 方案`,"modal.endpoint.payAsYouGo":`按量付費`,"modal.endpoint.custom":`自訂`,"modal.defaultModel":`預設模型(可選)`,"modal.allowPrivateNetwork":`允許本地/私有網路`,"modal.allowPrivateNetworkHint":`僅為有意自託管的供應商啟用。後設資料端點仍被阻止。`,"modal.nameRequired":`供應商名稱為必填項`,"modal.baseUrlRequired":`Base URL 為必填項`,"modal.networkError":`網路錯誤 — 代理在執行嗎?`,"modal.loginFailStart":`登入啟動失敗`,"modal.waitingLogin":`等待瀏覽器登入…`,"modal.loggingIn":`登入中…`,"modal.loginTimeout":`登入逾時 — 請重試。`,"modal.back":`返回`,"modal.badge.oauth":`OAuth`,"modal.customProvider":`自訂供應商`,"replitGateway.title":`Replit 閘道夥伴`,"replitGateway.subtitle":`連線您自行部署的 Replit 閘道,並一次安裝配對的 OpenAI Chat 與 Anthropic 提供者。`,"replitGateway.companionNote":`這是自訂夥伴工作流程,不是正式註冊表預設項目。`,"replitGateway.originLabel":`部署來源`,"replitGateway.originHint":`Replit 部署的 HTTPS 來源(例如 https://my-app.replit.app)。`,"replitGateway.keyLabel":`閘道金鑰`,"replitGateway.keyHint":`部署中的 REPLIT_GATEWAY_KEY 密鑰。它會保存在本機提供者設定中,並用於閘道流量驗證。`,"replitGateway.keyTooShort":`閘道金鑰過短(至少 32 個字元)。`,"replitGateway.keyTooLong":`閘道金鑰最多 512 個字元。`,"replitGateway.keyInvalidChars":`閘道金鑰只能包含可列印的 ASCII 字元。`,"replitGateway.errorNetwork":`無法連線至代理。請確認代理正在執行後再試。`,"replitGateway.errorMalformed":`代理回傳無效回應。請稍後再試。`,"replitGateway.customDomainLabel":`允許自訂網域`,"replitGateway.customDomainHint":`僅在閘道未託管於 .replit.app 時啟用。`,"replitGateway.setDefaultLabel":`安裝後將 replit 設為預設提供者`,"replitGateway.install":`安裝配對`,"replitGateway.installing":`安裝中…`,"replitGateway.close":`關閉`,"replitGateway.openButton":`Replit 閘道…`,"replitGateway.replaceTitle":`要取代現有的 Replit 配對嗎?`,"replitGateway.replaceBody":`提供者 replit 與 replit-anthropic 已存在。取代會覆寫閘道來源與金鑰,但會保留您的覆寫設定。`,"replitGateway.replaceConfirm":`取代配對`,"replitGateway.replaceCancel":`保留現有`,"replitGateway.probeHealth":`healthz:HTTP {status}({ms} 毫秒)`,"replitGateway.probeModels":`models:發現 {count} 個({ms} 毫秒)`,"replitGateway.successTitle":`已安裝 Replit 閘道配對。`,"replitGateway.errorGeneric":`無法安裝 Replit 閘道配對。`,"replitGateway.errorCollision":`Replit 提供者配對已存在。`,"replitGateway.errorBusy":`設定檔忙碌中,請稍後重試。`,"replitGateway.originRequired":`必須填寫部署來源。`,"replitGateway.keyRequired":`必須填寫閘道金鑰。`,"modal.failedStatus":`失敗 ({status})`,"modal.loginError":`登入錯誤:{error}`,"modal.badge.codexLogin":`Codex 登入`,"modal.badge.local":`本地`,"modal.badge.apiKey":`API 金鑰`,"modal.badge.direct":`Direct`,"modal.badge.pool":`帳號池`,"modal.badge.free":`免費`,"modal.invalidPreset":`此內建供應商預設不完整。請重新啟動代理後重試。`,"modal.freeTierTitle":`免費層級`,"modal.freeTierDefault":`無需 API 金鑰,開箱即用。`,"modal.tab.accounts":`帳號`,"modal.tab.free":`免費`,"modal.tab.paid":`付費`,"modal.accountsHint":`在此登入 ChatGPT/Codex、OAuth 與 API 金鑰帳號。OpenAI 為內建供應商 — 請登入,無需再次新增。`,"modal.accountsCodexAuthLink":`Codex 認證`,"modal.notListed":`沒有你要的供應商?新增自訂`,"modal.catalogLoading":`正在載入目錄…`,"modal.catalogLoadFailed":`無法載入供應商目錄。`,"modal.accountLogin":`登入`,"modal.accountLogout":`登出`,"modal.accountAdd":`新增帳號`,"modal.accountManage":`管理`,"modal.accountCodexPool":`ChatGPT 帳號池`,"modal.accountLoggedIn":`已登入`,"modal.accountLoggedOut":`未登入`,"quota.fiveHourLimit":`5 小時限額`,"quota.weeklyLimit":`每週限額`,"quota.monthlyLimit":`30 天限額`,"quota.cursorFirstParty":`官方模型`,"quota.cursorApiUsage":`API 用量`,"quota.totalSubscriptionCredits":`訂閱總額度`,"quota.creditsBalance":`額度餘額`,"quota.creditsPeriodEnds":`帳單週期結束於 {date}`,"quota.usedPercent":`已用 {pct}%`,"quota.limitReached":`已達上限`,"quota.resetsToday":`今天 {time} 重設`,"quota.resetsTomorrow":`明天 {time} 重設`,"quota.resetsAt":`{when} 重設`,"quota.resetsRelativeMinutes":`{n} 分鐘後重設`,"quota.resetsRelativeHours":`{n} 小時後重設`,"pws.status.ready":`就緒`,"pws.status.needsSetup":`需要設定`,"pws.status.needsAttention":`需要關注`,"pws.auth.chatgptPassthrough":`ChatGPT 直通`,"pws.auth.noKey":`無需金鑰`,"pws.freeTitle":`免費定價(可能仍需金鑰)`,"pws.localTitle":`本地執行時`,"pws.modelCountOne":`1 個模型`,"pws.modelCount":`{count} 個模型`,"pws.rail.suffixDefault":` · 預設`,"pws.rail.suffixLocal":` · 本地`,"pws.rail.suffixFree":` · 免費`,"pws.rail.selectAria":`選擇 {name} — {status}{suffix}`,"pws.searchPlaceholder":`搜尋供應商…`,"pws.filterAria":`篩選供應商`,"pws.providerFiltersAria":`供應商篩選`,"pws.filters":`篩選`,"pws.filterStatus":`狀態`,"pws.pricing":`定價`,"pws.paid":`付費`,"pws.filterType":`型別`,"pws.type.cloud":`雲端`,"pws.type.local":`本地`,"pws.type.selfHosted":`自託管`,"pws.type.login":`登入`,"pws.sort":`排序`,"pws.sortProvidersAria":`排序供應商`,"pws.sort.az":`A–Z`,"pws.sort.za":`Z–A`,"pws.sort.freePaid":`免費優先`,"pws.sort.paidFree":`付費優先`,"pws.sort.accountsFirst":`帳號優先`,"pws.resetAll":`全部重設`,"pws.providerList":`供應商列表`,"pws.providersAria":`供應商`,"pws.groupReady":`就緒 ({count})`,"pws.groupNeedsSetup":`需要設定 ({count})`,"pws.groupDisabled":`已停用 ({count})`,"pws.noSearchResults":`沒有符合搜尋的供應商。`,"pws.noMatchFilters":`沒有符合篩選的供應商。`,"pws.noProvidersConfigured":`尚未配置供應商。`,"pws.workspaceMainAria":`供應商詳細資料`,"pws.detailComingSoon":`詳細資料檢視即將推出 — 請在經典檢視中管理。`,"pws.selectPrompt":`從列表中選擇一個供應商。`,"pws.connectFirst":`連線你的第一個供應商`,"pws.empty.browseFree":`瀏覽免費供應商`,"pws.empty.browseFreeDesc":`無需訂閱即可開始`,"pws.empty.connectAccount":`連線帳號`,"pws.empty.connectAccountDesc":`使用 ChatGPT 或供應商登入`,"pws.empty.addEndpoint":`新增端點`,"pws.empty.addEndpointDesc":`自訂 base URL 和 API 金鑰`,"pws.tab.overview":`總覽`,"pws.tab.models":`模型`,"pws.tab.usage":`用量`,"pws.tab.accounts":`帳號`,"pws.tab.settings":`設定`,"pws.connection":`連線`,"pws.status.connected":`已連線`,"pws.attentionTitle":`需要關注`,"pws.attention.reauth":`當前帳號需要重新認證`,"pws.attention.reauthForward":`當前 Codex 帳號需要重新認證 — 請到“帳號”中處理`,"pws.attention.missingCredentials":`缺少憑證`,"pws.cell.auth":`認證`,"pws.cell.note":`備註`,"pws.cell.defaultModel":`預設模型`,"pws.statsAria":`供應商統計`,"pws.statsTitle":`統計`,"pws.stats.totalRequests":`請求數(30 天)`,"pws.stats.totalTokens":`tokens(30 天)`,"pws.stats.quotaUpdated":`配額更新`,"pws.stats.quotaTracked":`在用量標籤檢視限額。`,"pws.stats.source":`來源`,"pws.usageLast30d":`用量(最近 30 天)`,"pws.allAccounts":`全部帳號`,"pws.estimatedCost":`預估費用`,"pws.costDisclaimer":`基於 API 公示價格的預估值,非實際計費金額。`,"pws.modelBreakdown":`模型用量明細`,"pws.col.model":`模型`,"pws.col.cost":`預估費用`,"pws.col.tokens":`Token`,"pws.col.requests":`請求`,"pws.col.share":`佔比`,"pws.tokenInput":`輸入`,"pws.tokenOutput":`輸出`,"pws.metricRequests":`請求`,"pws.metricTokens":`Token`,"pws.usageUnavailable":`尚無用量紀錄。`,"pws.rateLimits":`速率限制`,"pws.quotaUnavailable":`此供應商暫無配額資料。`,"pws.accountQuotaUnavailable":`速率限制資料暫時不可用;若有上次已知值則繼續顯示。`,"pws.selected":`已選擇`,"pws.copyModelId":`複製 ID`,"pws.modelCopied":`已複製!`,"pws.modelsAvailable":`{count} 個可用`,"pws.modelSearchPlaceholder":`篩選模型…`,"pws.modelsLoading":`正在載入模型…`,"pws.modelsLoadFailed":`無法載入模型。`,"pws.modelsNeedsReauth":`需要重新登入後才能取得即時模型列表。當前顯示已配置的模型。`,"pws.modelsConfiguredFallback":`顯示已配置的模型(即時發現不可用)。`,"pws.modelsTruncated":`顯示 {total} 個模型中的前 {shown} 個。使用篩選以縮小列表。`,"pws.retry":`重試`,"pws.noModels":`未發現此供應商的模型。`,"pws.noModelMatch":`沒有符合篩選條件的模型。`,"pws.adapterBaseRequired":`介面卡和基本 URL 為必填項。`,"pws.addAccount":`新增帳號`,"pws.addKey":`新增 API 金鑰`,"pws.apiKeys":`API 金鑰`,"pws.authMode":`認證方式`,"pws.availableAccounts":`可用帳號`,"pws.accountOrdinal":`帳號 {count}`,"pws.accountsLoading":`正在載入帳號…`,"pws.accountsLoadFailed":`無法載入帳號。`,"pws.retryAccounts":`重試`,"pws.noAccounts":`尚未連線任何帳號。`,"pws.accountSwitching":`切換中…`,"pws.accountCurrent":`當前帳號`,"pws.defaultModelNone":`無(使用供應商預設值)`,"pws.discardSettings":`放棄`,"pws.jsonEditorDesc":`直接編輯供應商 JSON 配置。更改將立即儲存。`,"pws.jsonEditorTitle":`JSON 編輯器 — {name}`,"pws.jsonRestore":`恢復`,"pws.jsonSave":`儲存`,"pws.loggedInTitle":`已登入`,"pws.notLoggedInTitle":`未登入`,"pws.note":`備註`,"pws.allowPrivateNetwork":`允許本地/私有網路`,"pws.liveModels":`從供應商發現模型`,"pws.liveModelsDesc":`取得供應商的即時模型目錄。關閉後僅使用已配置的靜態模型。`,"pws.xaiResponsesOptIn":`讓 Grok 4.5 與 4.6 使用 Responses API`,"pws.xaiResponsesOptInDesc":`透過 openai-responses 路由這兩個模型。其他 Grok 模型與層級行為不變。`,"pws.xaiResponsesOptInMixed":`已部分啟用。`,"pws.cursorTransport":`Cursor 傳輸協定`,"pws.cursorTransportHttp2":`HTTP/2(預設)`,"pws.cursorTransportHttp1":`HTTP/1.1(代理相容)`,"pws.cursorTransportDesc":`當代理無法穩定承載 Cursor 的 HTTP/2 串流時,請使用 HTTP/1.1。`,"pws.optionalPlaceholder":`可選`,"pws.providerId":`供應商 ID`,"pws.reauth":`需要重新認證`,"pws.reauthenticate":`重新認證`,"pws.clearCooldown":`清除冷卻`,"pws.copyDoctor":`複製 ocx doctor`,"pws.doctorCopied":`已複製`,"pws.doctorCopyUnavailable":`剪貼簿不可用`,"pws.healthCooldownHint":`請等到冷卻結束。暫時不要探測此帳號。`,"pws.healthLabel.rateLimited":`已限速`,"pws.healthLabel.quotaLimited":`配額受限`,"pws.healthLabel.reauthRequired":`需要重新認證`,"pws.healthLabel.refreshFailed":`重新整理失敗`,"pws.healthLabel.metadataMismatch":`後設資料不符合`,"pws.healthLabel.credentialConflict":`憑證衝突`,"pws.healthSummary.rateLimited":`{provider} {account}:限速至 {until}。在此之前將暫停該帳號的路由。`,"pws.healthSummary.quotaLimited":`{provider} {account}:配額限制至 {until}。在此之前將暫停該帳號的路由。`,"pws.healthSummary.reauthRequired":`{provider} {account}:需要重新認證。`,"pws.healthSummary.credentialConflict":`{provider} {account}:憑證衝突。`,"pws.healthSummary.metadataMismatch":`{provider} {account}:後設資料不符合。`,"pws.healthSummary.staleCredentials":`{provider} {account}:憑證不完整。`,"pws.removeConfirm":`移除`,"pws.removeConfirmBody":`移除供應商「{name}」?此操作無法撤消。`,"pws.removeDefaultConfirmBody":`移除預設供應商「{name}」?「{defaultProvider}」將成為預設供應商。此操作無法撤消。`,"pws.removeConfirmTitle":`移除供應商`,"pws.saveSettings":`儲存`,"pws.pacingTitle":`請求節流`,"pws.pacingDesc":`均勻延遲送往此供應商的請求啟動。串流回應可以重疊。`,"pws.pacingEnabled":`啟用`,"pws.pacingRpm":`每分鐘請求數`,"pws.pacingRpmUnit":`次/分鐘`,"pws.pacingDelay":`最小間隔(毫秒)`,"pws.pacingJitter":`隨機抖動(毫秒)`,"pws.pacingSlowerWins":`以較慢的供應商限制為準,模型規則只能增加延遲。`,"pws.pacingQueued":`排隊中`,"pws.pacingNextSlot":`距下個時段`,"pws.pacingLastModel":`上個模型`,"pws.pacingNone":`無`,"pws.pacingModelOverrides":`模型規則`,"pws.pacingModel":`模型`,"pws.pacingAdd":`新增規則`,"pws.pacingRemove":`移除`,"pws.pacingRemoveModel":`移除 {model} 的請求節流規則`,"pws.pacingRuleRequired":`請先設定供應商限制或模型規則,再啟用請求節流。`,"pws.antigravityTlsTitle":`Antigravity 瀏覽器 TLS 設定檔`,"pws.antigravityTlsEnable":`啟用實驗性 TLS/HTTP2 模擬`,"pws.antigravityTlsWarning":`非官方相容功能。不保證符合服務條款或避免停權,可能讓流量更具辨識度;初始化失敗時會回退到 Bun。官方 Gemini API 金鑰、Vertex 或有文件的 Code Assist 路由較安全。`,"pws.antigravityTlsConfirm":`要啟用實驗性且非官方的 Antigravity TLS 設定檔嗎?它不保證符合政策,也無法避免停權。繼續嗎?`,"pws.antigravityTlsStatus":`TLS 設定檔狀態:{status}`,"pws.antigravityTlsDisabled":`已停用`,"pws.antigravityTlsActive":`啟用中`,"pws.antigravityTlsFallback":`回退`,"pws.saving":`儲存中…`,"pws.settingsSaved":`設定已儲存。`,"pws.settingsUnsavedBar":`有未儲存的更改。`,"pws.unsavedLeaveBody":`有未儲存的更改。離開前儲存嗎?`,"pws.unsavedLeaveTitle":`未儲存的更改`,"pws.attentionRequired":`需要關注`,"pws.attentionAria":`{name}:{reason}`,"pws.missingCredentials":`缺少憑證`,"pws.editJsonDesc":`以 JSON 編輯原始代理配置`,"pws.updatesUnavailable":`供應商更新不可用。`,"pws.dashboard.title":`供應商總覽`,"pws.dashboard.subtitle":`在一個地方管理所有模型供應商。`,"pws.dashboard.rateLimits":`速率限制`,"pws.dashboard.recentlyUsed":`最近使用`,"pws.dashboard.requests":`{count} 個請求`,"pws.dashboard.checkedAgo":`{time} 前檢查`,"pws.dashboard.noQuota":`無配額資料`,"pws.dashboard.noUsage":`暫無使用資料`,"pws.allProviders":`供應商總覽`,"pws.enabledLabel":`已啟用`,"pws.testConnection":`測試連線`,"pws.testing":`測試中…`,"pws.connectionOk":`連線成功`,"pws.connectionFailed":`連線失敗`,"pws.editSettings":`編輯設定`,"pws.viewUsage":`檢視詳細用量`,"pws.allSystemsOk":`所有系統正常執行`,"pws.apiKeyConfigured":`API 金鑰已配置`,"pws.addApiKey":`新增 API 金鑰`,"pws.loggedInAs":`已登入為 {email}`,"pws.notLoggedIn":`未登入`,"pws.passthrough":`Codex 透傳`,"pws.notes":`備註`,"pws.notePlaceholder":`新增關於此供應商的備註...`,"pws.noteSaved":`備註已儲存`,"pws.authSummary":`認證`,"pws.aiStudio":`AI Studio`,"pws.aiStudio.connected":`已連線`,"pws.aiStudio.checking":`正在檢查工作階段`,"pws.aiStudio.unsupported":`此平台不支援原生登入`,"pws.aiStudio.needsReauth":`需要重新驗證`,"pws.aiStudio.reauthenticated":`重新驗證成功`,"pws.aiStudio.loginFailed":`原生登入失敗`,"pws.aiStudio.connect":`連線`,"time.justNow":`剛剛`,"time.notChecked":`未檢查`,"time.minutesAgo":`{n} 分鐘前`,"time.hoursAgo":`{n} 小時前`,"time.daysAgo":`{n} 天前`,"modal.noMatch":`無符合。`,"modal.oauthDefaultNote":`使用帳號登入 — 無需 API 金鑰。`,"modal.oauthComingSoon":`{label} 的 OAuth 登入將在下次更新提供。請先使用 API 金鑰。`,"modal.oauthComingSoonShort":`此供應商的 OAuth 登入將在下次更新提供 — 請先使用 API 金鑰。`,"modal.useApiKeyInstead":`改用 API 金鑰`,"modal.setupGuide":`設定指南`,"modal.setupStep1Prefix":`前往`,"modal.setupDashboardLink":`{label} 控制檯`,"modal.setupStep1Suffix":`並複製 API 金鑰`,"modal.setupStep2":`貼上到下方的 API 金鑰欄位`,"modal.setupStep3":`點選新增供應商 — 模型會自動發現`,"modal.namePlaceholder":`例如 openrouter`,"modal.duplicateWarn":`供應商 "{name}" 已存在,將被覆蓋。`,"modal.forwardHintPrefix":`無需金鑰 — 代理會轉發你的`,"modal.forwardCredentials":`codex login`,"modal.forwardHintSuffix":`憑證到此供應商。`,"modal.localHint":`不會儲存 API 金鑰。這會為 Codex 新增 Cursor 的公開模型目錄,但在審計完成前,即時 Cursor 傳輸與原生檔案/Shell 執行仍保持停用。`,"modal.getApiKey":`取得 {label} API 金鑰`,"modal.apiKey":`API 金鑰`,"modal.apiKeyTransport":`API 金鑰標頭`,"modal.apiKeyTransportNative":`x-api-key(Anthropic 原生)`,"modal.apiKeyTransportBearer":`Authorization: Bearer`,"modal.apiKeyPlaceholder":`sk-…(或 $ENV_VAR)`,"modal.defaultModelPlaceholder":`例如 gpt-5.5`,"modal.baseUrlPlaceholder":`https://...`,"modal.baseUrlPlaceholderError":`Base URL 包含未解析的 {placeholder},請替換為實際值。`,"modal.baseUrlPlaceholderHint":`請在新增前將 Base URL 中的 {placeholder} 替換為你的實際 Account ID。`,"modal.adding":`正在新增…`,"modal.useOauthLogin":`← 使用 OAuth 登入`,"nav.codexAuth":`Codex 認證`,"nav.codexSet":`Codex 設定`,"codexSet.tab.multiauth":`多帳號認證`,"codexSet.tab.prompt":`提示詞`,"codexSet.prompt.title":`提示詞層`,"codexSet.prompt.timing":`對新啟動的工作階段生效。執行中的工作階段會保留目前的提示詞設定。`,"codexSet.prompt.staleRevision":`設定已在別處變更,清單已重新載入。`,"codexSet.prompt.writeFailed":`無法儲存變更。`,"codexSet.prompt.loadFailed":`無法載入提示詞層。`,"codexSet.prompt.repair":`修復`,"codexSet.prompt.repairFailed":`無法完成修復。`,"codexSet.drift.journalPresent":`上一次寫入未完成。下次寫入時會自動復原。`,"codexSet.drift.projectionStale":`已儲存的層與 config.toml 中的值不一致。修復會依你的層重新寫入該值。`,"codexSet.drift.storeMissing":`層檔案已遺失,但 config.toml 中仍有指示。修復會先建立備份,並將該文字保留為一個層。`,"codexSet.drift.ownedMalformed":`config.toml 中產生的該行曾被手動變更,因此重寫不再安全。`,"codexSet.custom.adoptUnsupported":`{path} 第 {line} 行的值不是單行字串,無法匯入。若要在此管理,請手動移動它。`,"codexSet.prompt.unreadable":`Codex 設定檔存在但無法讀取,因此拒絕了變更。`,"codexSet.layer.permissions":`權限`,"codexSet.layer.collaboration":`協作模式`,"codexSet.layer.environment":`環境內容`,"codexSet.layer.apps":`應用程式`,"codexSet.layer.skills":`技能`,"codexSet.prompt.extensionsUnknown":`擴充功能可新增自己的層。Codex 不會公開這些層,因此無法在此列出。`,"codexSet.group.transition":`變更通知`,"codexSet.group.transitionDesc":`它們通報變化而非描述狀態,因此僅在工作階段切換為即時模式或更換模型時出現。`,"codexSet.custom.slotNote":`自訂層會依此順序合併為一個區段。`,"codexSet.row.alwaysOn":`一律啟用`,"codexSet.row.onChange":`變更時傳送`,"codexSet.row.featureGated":`在 [features] 下設定`,"codexSet.row.openFeatures":`開啟設定`,"codexSet.dialog.setValue":`{value}(預設 {fallback})`,"codexSet.dialog.copyKey":`複製設定鍵`,"codexSet.dialog.unknownLayer":`此版本沒有該層的說明。它來自比儀表板更新的 Codex 執行環境。`,"codexSet.custom.heading":`自訂層`,"codexSet.custom.add":`+ 新增層`,"codexSet.custom.newTitle":`新增層`,"codexSet.custom.editTitle":`編輯層`,"codexSet.custom.titleLabel":`標題`,"codexSet.custom.bodyLabel":`指示`,"codexSet.custom.bodySize":`{bytes}/{max} 位元組`,"codexSet.custom.normalized":`定位字元已轉換為四個空格,換行符號已轉換為 LF。`,"codexSet.custom.titleRequired":`請輸入標題。`,"codexSet.custom.titleTooLong":`標題有 {count} 個字元,上限為 {max} 個。`,"codexSet.custom.titleMultiline":`標題必須為單行。`,"codexSet.custom.bodyTooLarge":`此層為 {bytes} 位元組,上限為 {max} 位元組。`,"codexSet.custom.composedTooLarge":`啟用的層合計將達到 {bytes} 位元組,超過上限。`,"codexSet.custom.invalidCharacter":`無法儲存位置 {position} 的控制字元。`,"codexSet.custom.discardPrompt":`要捨棄變更嗎?`,"codexSet.custom.keepEditing":`繼續編輯`,"codexSet.custom.delete":`刪除 {title}`,"codexSet.custom.deleteConfirm":`要刪除此層嗎?此操作無法復原。`,"codexSet.custom.layerGone":`該層已在別處被刪除,因此編輯器已關閉。`,"codexSet.custom.deleteConfirmNamed":`要刪除“{title}”嗎?此操作無法復原。`,"codexSet.custom.moveUp":`將 {title} 上移`,"codexSet.custom.prevLayer":`上一層`,"codexSet.custom.nextLayer":`下一層`,"codexSet.custom.navPosition":`{position} / {total}`,"codexSet.custom.moveDown":`將 {title} 下移`,"codexSet.custom.limitReached":`最多可保留 {max} 個自訂層。`,"codexSet.custom.notOwned":`developer_instructions 是在 opencodex 外部寫入的,因此無法在此編輯。請將其匯入,以便作為層管理。`,"codexSet.custom.adopt":`匯入現有指示`,"codexSet.custom.adoptConfirm":`匯入為層`,"codexSet.custom.adoptRefused":`無法匯入現有值。`,"codexSet.custom.baseReplaced":`model_instructions_file 已設為 {path},因此 opencodex 外部的內容已取代基礎提示詞。`,"codexSet.lint.identity":`此內容宣稱了與 Codex 所設定身分不同的身分。`,"codexSet.lint.foreignTool":`工具由登錄檔提供;在此指定名稱並不會建立工具。`,"codexSet.lint.placeholder":`指示不會經過範本引擎處理,因此此內容會依原樣傳送。`,"codexSet.lint.applyPatch":`apply_patch 由工具登錄檔定義,而不是由指示定義。`,"codexSet.lint.approvalVocab":`Codex 會注入自己的核准用語;此內容可能與其衝突。`,"codexSet.lint.environment":`環境資訊稍後才會產生,可能與此內容衝突。`,"codexSet.lint.size":`此層超過 8 KB。仍可儲存,但每次請求都會耗用權杖。`,"codexSet.preset.blank":`空白層`,"codexSet.preset.concise.name":`精簡輸出`,"codexSet.preset.concise.description":`簡短作答,不加開場白,儘量減少格式。`,"codexSet.preset.concise.provenance":`改編自 Claude Code 的精簡指示。文案由我們原創,並非複製。`,"codexSet.preset.planFirst.name":`編輯前先規劃`,"codexSet.preset.planFirst.description":`先說明計畫,再進行變更。`,"codexSet.preset.planFirst.provenance":`改編自 Claude Code 的規劃方式。文案由我們原創,並非複製。`,"codexSet.preset.explainWhy.name":`說明理由`,"codexSet.preset.explainWhy.description":`不只說明要做什麼,也說明原因。`,"codexSet.preset.explainWhy.provenance":`改編自 Grok Build 的確認風格。文案由我們原創,並非複製。`,"codexSet.preset.testFirst.name":`測試優先`,"codexSet.preset.testFirst.description":`修正前先撰寫會失敗的測試。`,"codexSet.preset.testFirst.provenance":`改編自常見的代理實務。文案由我們原創,並非複製。`,"codexSet.preset.korean.name":`韓文回覆`,"codexSet.preset.korean.description":`無論要求使用哪種語言,都以韓文回答。`,"codexSet.preset.korean.provenance":`根據常見的使用者需求為 opencodex 撰寫。文案由我們原創,並非複製。`,"codexSet.dialog.class":`類型`,"codexSet.dialog.key":`設定鍵`,"codexSet.dialog.fileValue":`此檔案中的值`,"codexSet.dialog.absentDefault":`未設定(預設為 {value})`,"codexSet.dialog.noRenderedText":`Codex 不會公開內建層組合後的文字,因此此對話框只說明該層並列出其設定鍵,不顯示具體內容。`,"codexSet.dialog.sourceText":`傳送給模型的原文`,"codexSet.dialog.sourceBytes":`{bytes} 位元組`,"codexSet.dialog.notRendered":`在我們讀取的那一輪中,此層沒有傳送任何內容。各區段只在內容變更時才會重新傳送,因此單次取樣可能看不到它。`,"codexSet.dialog.emptySource":`{path} 檔案存在但為空,因此此層不會傳送任何內容。`,"codexSet.dialog.notExposed":`基礎提示詞不在 Codex 可列印的訊息清單中傳遞,因此無法在此顯示。可以透過 model_instructions_file 取代它。`,"codexSet.dialog.textUnavailable":`本機無法讀取 Codex 提示詞,因此無法顯示原文。`,"codexSet.class.base":`基礎指令`,"codexSet.class.config-toggle":`可在此切換`,"codexSet.class.feature-gated":`功能開關控制`,"codexSet.class.runtime-conditional":`執行時條件控制`,"codexSet.class.extension-unknown":`擴充層`,"codexSet.layer.base-instructions":`基礎指令`,"codexSet.layer.model-switch":`模型切換通知`,"codexSet.layer.personality":`個性`,"codexSet.layer.context-window-guidance":`上下文視窗指引`,"codexSet.layer.realtime":`即時工作階段`,"codexSet.layer.agents-md":`AGENTS.md`,"codexSet.layer.environments-instructions":`執行環境`,"codexSet.layer.plugins":`外掛程式`,"codexSet.layer.tools":`工具`,"codexSet.layer.multi-agent-mode":`多代理模式`,"codexSet.layer.git-attribution":`提交署名`,"codexSet.about.base-instructions":`Codex 自身的指令。它們會隨請求一同傳送,無法關閉。`,"codexSet.about.model-switch":`工作階段中途切換模型時新增。`,"codexSet.about.personality":`語氣和表達風格指引,由功能開關控制。`,"codexSet.about.context-window-guidance":`剩餘上下文預算的相關建議,由功能開關控制。`,"codexSet.about.realtime":`即時工作階段中新增。`,"codexSet.about.agents-md":`專案中的 AGENTS.md 檔案。此頁面只顯示該層,絕不會編輯專案文件。`,"codexSet.about.permissions":`說明目前生效的沙箱和核准設定。`,"codexSet.about.collaboration":`說明目前啟用的協作模式。`,"codexSet.about.environment":`工作目錄、平台及其他環境資訊。`,"codexSet.about.environments-instructions":`延後執行環境的相關指引,由功能開關控制。`,"codexSet.about.apps":`已連接應用程式的使用方式。`,"codexSet.about.plugins":`選取外掛程式或任一外掛程式宣告功能時新增。`,"codexSet.about.tools":`延後載入的工具說明,由功能開關控制。`,"codexSet.about.skills":`可用技能清單。`,"codexSet.about.multi-agent-mode":`子代理指令,由功能開關控制。`,"codexSet.about.git-attribution":`讓模型在它寫的提交加上 Co-authored-by: Codex 尾註,並在它開的拉取請求加上 Generated with Codex. 這一行。Codex 從你的帳號讀取此項,所以這裡和 [features] 都改不了。帳號關閉時,Codex 會送出相反的指令,而不是什麼都不送。`,"codexSet.condition.model-switch":`僅在工作階段中途切換模型後插入。`,"codexSet.condition.realtime":`僅在即時工作階段中插入。`,"codexSet.condition.agents-md":`找到適用於目前工作目錄的專案文件時插入。`,"codexSet.condition.plugins":`選取外掛程式或任一外掛程式宣告功能時插入。`,"codexSet.condition.git-attribution":`由你帳號的署名政策決定。`,"codexSet.base.title":`基礎提示詞`,"codexSet.base.prev":`上一個選項`,"codexSet.base.next":`下一個選項`,"codexSet.base.position":`{position} / {total}`,"codexSet.base.swipeHint":`左右滑動、按方向鍵,或點箭頭按鈕切換選項。對新開始的工作階段生效。`,"codexSet.base.defaultTitle":`Codex 自帶的基礎提示詞`,"codexSet.base.defaultBody":`預設項並不存在這裡,所以沒有可編輯或刪除的內容:選它只是從設定移除 model_instructions_file,讓 Codex 用自帶的提示詞。`,"codexSet.base.variantTitle":`名稱`,"codexSet.base.variantBody":`提示詞`,"codexSet.base.replacesWarning":`這會整體取代 Codex 自帶的基礎提示詞,而不是在其後附加。這裡寫得短,模型收到的指令就只有這麼短。`,"codexSet.base.use":`用這一個`,"codexSet.base.inUse":`正在使用`,"codexSet.base.externalBlocked":`model_instructions_file 已指向 {path},且不是 opencodex 寫的。請先自行清除,再在此處選擇。`,"nav.api":`API`,"nav.openMenu":`開啟選單`,"nav.closeMenu":`關閉選單`,"codexAuth.mainAccount":`主帳號`,"codexAuth.codexApp":`Codex App`,"codexAuth.logLabel":`日誌標籤`,"codexAuth.appLogin":`應用登入`,"codexAuth.accountPool":`帳號池`,"codexAuth.accountModeTitle":`OpenAI 帳號模式`,"codexAuth.accountModePool":`帳號池模式`,"codexAuth.accountModePoolDesc":`主登入與符合條件的已新增帳號會在此輪換。`,"codexAuth.accountModeDirect":`直連模式`,"codexAuth.accountModeDirectDesc":`請求僅使用主登入;已新增帳號會繼續儲存,供帳號池模式使用。`,"codexAuth.openaiMissing":`未配置內建 OpenAI 供應商。`,"codexAuth.openaiDisabled":`內建 OpenAI 供應商已停用。`,"codexAuth.openaiUnavailableDesc":`你的 OpenAI 帳號仍然可用。啟用供應商後即可路由 Codex 請求。`,"codexAuth.enableOpenai":`啟用 OpenAI`,"codexAuth.enablingOpenai":`正在啟用...`,"codexAuth.enableOpenaiFailed":`無法啟用 OpenAI 供應商。`,"codexAuth.openaiPresetLoadFailed":`無法載入 OpenAI 供應商預設。`,"codexAuth.openaiPresetUnavailable":`OpenAI 供應商預設不可用。`,"codexAuth.openProviders":`開啟供應商`,"codexAuth.add":`新增`,"codexAuth.sparkQuota":`Codex Spark 配額`,"codexAuth.sparkQuotaHint":`在帳號卡片上顯示 GPT-5.3-Codex-Spark 週視窗。預設隱藏,因為只適用於單一模型。`,"codexAuth.sparkQuotaShown":`已顯示 Codex Spark 配額`,"codexAuth.sparkQuotaHidden":`已隱藏 Codex Spark 配額`,"codexAuth.sparkQuotaFailed":`無法變更 Codex Spark 配額設定`,"codexAuth.refreshQuota":`重新整理額度`,"codexAuth.refreshingQuota":`重新整理中...`,"codexAuth.quotaRefreshed":`額度已重新整理`,"codexAuth.quotaRefreshFailed":`額度重新整理失敗`,"codexAuth.noPool":`尚未新增池帳號。`,"codexAuth.fiveHour":`5 小時`,"codexAuth.weekly":`每週`,"codexAuth.monthly":`30天`,"codexAuth.resets":`重設`,"codexAuth.today":`今天`,"codexAuth.current":`當前`,"codexAuth.nextSession":`已選擇`,"codexAuth.poolPrepared":`已為帳號池準備`,"codexAuth.preparePoolTitle":`為帳號池模式準備此帳號?`,"codexAuth.preparePoolDesc":`直連請求仍使用主登入。啟用帳號池模式後,此帳號會成為預先選擇的池帳號。`,"codexAuth.prepareForPool":`為帳號池準備`,"codexAuth.poolPreparedToast":`已為帳號池模式準備 {email}`,"codexAuth.switchTitle":`切換活躍帳號?`,"codexAuth.switchDesc":`從現有和新 Codex 會話的下一次請求開始生效。進行中的請求保留原帳號。`,"codexAuth.cacheWarning":`切換帳號會重設提示快取。新會話從空快取開始。`,"codexAuth.setAsNext":`選擇帳號`,"codexAuth.cancel":`取消`,"codexAuth.switchBack":`切換回主帳號?`,"codexAuth.switchBackDesc":`現有和新 Codex 會話的下一次請求將使用應用登入帳號。`,"codexAuth.autoSwitch":`自動切換帳號`,"codexAuth.autoSwitchThreshold":`切換閾值`,"codexAuth.autoSwitchThresholdAria":`切換閾值(百分比)`,"codexAuth.autoSwitchLoadFailed":`無法載入自動切換帳號設定。`,"codexAuth.autoSwitchThresholdInvalid":`請輸入 1 到 100 之間的整數`,"codexAuth.autoSwitchUpdated":`自動切換帳號設定已更新`,"codexAuth.autoSwitchUpdateFailed":`無法確認更新。當前顯示最後一次確認的值。`,"codexAuth.pauseExhausted":`暫停已達上限帳號`,"codexAuth.pausingExhausted":`正在檢查額度...`,"codexAuth.pauseExhaustedSucceeded":`已暫停 {count} 個達到上限的帳號`,"codexAuth.pauseExhaustedNone":`沒有確認達到 100% 用量的帳號。`,"codexAuth.pauseExhaustedFailed":`無法檢查並暫停已達上限帳號。`,"codexAuth.pause":`暫停`,"codexAuth.resume":`恢復`,"codexAuth.paused":`已暫停`,"codexAuth.pauseSucceeded":`已暫停 {email}`,"codexAuth.resumeSucceeded":`{email} 已重新加入帳號池`,"codexAuth.pauseFailed":`無法暫停 {email},未做任何變更。`,"codexAuth.resumeFailed":`無法恢復 {email},未做任何變更。`,"codexAuth.pausedHint":`恢復前不會參與自動切換、重試、冷卻恢復或手動選擇。`,"anthropicPool.title":`Claude 帳號池(實驗性)`,"anthropicPool.enabledDesc":`遇到 429 時冷卻該帳號並故障轉移。新會話優先使用 5 小時用量低於 {threshold}% 的帳號。`,"anthropicPool.disabledDesc":`僅使用當前活躍的 Claude 帳號。僅在接受實驗性路由時啟用。`,"anthropicPool.experimentalWarning":`實驗性功能,尚未充分驗證。看起來像自動多帳號輪換的行為可能導致 Anthropic 限制帳號。同一組織可能共享配額——對這些帳號做池化沒有幫助。除非瞭解風險,否則請保持關閉。`,"anthropicPool.needTwoAccounts":`啟用帳號池前請至少新增兩個 Claude OAuth 帳號。`,"anthropicPool.threshold":`新會話用量閾值`,"anthropicPool.thresholdAria":`新會話用量閾值(百分比)`,"anthropicPool.thresholdHelp":`0 表示禁用基於配額的選擇(僅親和性 + 活躍帳號)。預設 80。`,"anthropicPool.thresholdInvalid":`請輸入 0 到 100 之間的整數`,"anthropicPool.loadFailed":`無法載入 Claude 帳號池設定。`,"anthropicPool.saveFailed":`無法儲存 Claude 帳號池設定。`,"anthropicPool.on":`開`,"anthropicPool.off":`關`,"cursorPool.title":`Cursor 帳號池(實驗性)`,"cursorPool.enabledDesc":`遇到 429 或認證失敗時冷卻該帳號並為此對話故障轉移。每個對話會保持一個帳號,直到發生限速或憑證失敗。`,"cursorPool.disabledDesc":`僅使用目前活躍的 Cursor 帳號。僅在接受實驗性路由時啟用。`,"cursorPool.experimentalWarning":`實驗性功能,尚未充分驗證。Cursor 使用政策禁止規避速率限制和操作用量計量。Teams 包含用量按席位計算,可能無法轉移。除非瞭解風險,否則請保持關閉。`,"cursorPool.needTwoAccounts":`啟用帳號池前請至少新增兩個 Cursor OAuth 帳號。`,"cursorPool.loadFailed":`無法載入 Cursor 帳號池設定。`,"cursorPool.saveFailed":`無法儲存 Cursor 帳號池設定。`,"cursorPool.on":`開`,"cursorPool.off":`關`,"antigravityRouting.failoverOnlyTitle":`多帳號路由(僅故障轉移)`,"antigravityRouting.failoverOnlyDesc":`每個對話保持一個 Antigravity 帳號。遇到限速 429 或憑證失敗時,opencodex 可為該對話故障轉移到另一個符合條件的帳號 — 不會在新工作階段間負載平衡,也不會更改其他進行中對話的全域活躍帳號。`,"accountPool.strategy":`輪換策略`,"accountPool.strategyDesc":`新會話如何從帳號池中選擇帳號。`,"accountPool.strategyQuota":`配額`,"accountPool.strategyRoundRobin":`輪詢`,"accountPool.strategyFillFirst":`填滿優先`,"accountPool.stickyLimit":`輪換前的粘性成功次數`,"accountPool.stickyLimitAria":`輪換前的粘性成功次數`,"accountPool.stickyLimitHelp":`在推進到下一個帳號之前,將所選帳號保留這麼多次成功的新會話繫結。`,"accountPool.stickyLimitInvalid":`請輸入 1 到 100 之間的整數`,"accountPool.strategyLoadFailed":`無法載入輪換策略。`,"accountPool.strategyUpdateFailed":`無法儲存輪換策略。`,"codexAuth.switched":`下一次請求將使用 {email}`,"codexAuth.loadFailed":`無法載入 Codex 帳號設定。`,"codexAuth.switchFailed":`無法切換帳號。之前的選擇保持不變。`,"codexAuth.removeConfirm":`刪除 {id}?`,"codexAuth.removeFailed":`無法移除帳號。未進行任何更改。`,"codexAuth.addTitle":`新增 Codex 帳號`,"codexAuth.addIdLabel":`帳號 ID(識別符號)`,"codexAuth.addIdPlaceholder":`codex-work, codex-alt, team…`,"codexAuth.resetCreditsAria":`{count} 個重設額度`,"codexAuth.addJsonLabel":`auth.json 內容`,"codexAuth.addHelp":`從另一臺機器的 ~/.codex/auth.json 複製,或使用 codex-auth export。`,"codexAuth.importBtn":`匯入`,"codexAuth.importInvalidJson":`無效的 JSON`,"codexAuth.importMissingTokens":`JSON 中缺少 access_token 或 refresh_token`,"codexAuth.importMissingId":`請輸入帳號 ID`,"codexAuth.accountAdded":`帳號已新增到池中`,"codexAuth.addPickDesc":`使用另一個 ChatGPT 帳號登入以新增到池中。`,"codexAuth.oauthLogin":`OAuth 登入`,"codexAuth.oauthDesc":`在瀏覽器中開啟 ChatGPT 登入`,"codexAuth.importAuthJson":`匯入 auth.json`,"codexAuth.importAuthJsonDesc":`從另一個 Codex 安裝或 codex-auth 匯出`,"codexAuth.back":`返回`,"codexAuth.oauthAlreadyInProgress":`登入已在進行中。請在瀏覽器中完成。`,"codexAuth.oauthWaiting":`等待瀏覽器中完成 ChatGPT 登入...`,"codexAuth.oauthSubmittingCode":`正在提交程式碼…`,"codexAuth.oauthCodeSubmitted":`程式碼已提交——正在等待登入完成…`,"codexAuth.oauthStatusRetrying":`檢查登入狀態時發生網路或代理錯誤——正在重試…`,"codexAuth.oauthCancelled":`登入已取消。`,"codexAuth.loginFailed":`登入失敗`,"codexAuth.needsReauth":`重新登入`,"codexAuth.reauthenticate":`重新認證`,"codexAuth.tokenExpired":`權杖已過期 — 請重新認證此帳號`,"codexAuth.mainTokenExpired":`權杖已過期 — 請透過 Codex 應用登入重新登入`,"codexAuth.emailCollision":`此帳號與您的主 Codex 登入相同。請使用其他帳號。`,"codexAuth.resetCreditsTitle":`重設額度`,"codexAuth.resetCreditsAvailable":`您有 {count} 個可用重設額度。`,"codexAuth.resetCreditsDesc":`每個額度可立即重設您當前的小時和每週使用限制。`,"codexAuth.noResetCredits":`沒有可用的重設額度。`,"codexAuth.earnCreditsHint":`額度每月自動發放,也可透過推薦計劃獲得。`,"codexAuth.creditsExpireNote":`額度在獲得後 30 天過期。`,"codexAuth.useOneCredit":`使用 1 個額度`,"codexAuth.confirmResetTitle":`使用重設額度?`,"codexAuth.confirmResetDesc":`這將立即重設您當前的使用限制。剩餘額度:{count} 個。`,"codexAuth.irreversible":`此操作無法復原。`,"codexAuth.useCredit":`使用額度`,"codexAuth.redeeming":`重設中...`,"codexAuth.resetSuccess":`使用限制已重設!剩餘額度:{remaining} 個。`,"codexAuth.resetSuccessGeneric":`使用限制已重設!`,"codexAuth.resetAlreadyRedeemed":`該額度已兌換過,額度未變。`,"codexAuth.resetNothingToReset":`當前沒有需要重設的使用視窗。`,"codexAuth.resetNoCredit":`沒有可用的重設額度。`,"codexAuth.resetError":`重設額度使用失敗,請重試。`,"codexAuth.fifoNote":`最早獲得的額度優先使用。`,"codexAuth.confirmWhichCredit":`將使用 {date} 獲得的額度。`,"codexAuth.creditNext":`即將使用`,"codexAuth.creditLabel":`額度 #{n}`,"codexAuth.creditNextBadge":`NEXT`,"codexAuth.creditGranted":`獲得 {date}`,"codexAuth.creditExpires":`過期 {date}(剩餘 {days} 天)`,"api.title":`API 存取`,"api.subtitle":`使用生成的 API 金鑰從外部應用存取 opencodex 代理。金鑰透過 {authHeader} 標頭認證;下表顯示每個端點接受什麼。`,"api.baseUrl":`基礎 URL`,"api.responsesEndpoint":`Responses API`,"api.chatCompletionsEndpoint":`Chat Completions API`,"api.messagesEndpoint":`Messages API`,"api.modelsEndpoint":`Models API`,"api.endpointNote":`請將基礎 URL 用於 OpenAI 相容客戶端。Responses 與 Chat Completions 在 /v1 下提供。`,"api.endpointsTitle":`閘道器端點`,"api.authTitle":`身份驗證`,"api.authLoopback":`迴環繫結(127.0.0.1 或 ::1)會跳過身份驗證。遠端繫結需要生成的 ocx_ 金鑰或 OPENCODEX_API_AUTH_TOKEN。`,"api.authBaseUrlNote":`客戶端應使用基礎 URL,然後選擇下面的協議端點。`,"api.newKeyTitle":`已建立新金鑰`,"api.newKeyNote":`請立即複製此金鑰,它不會再次顯示。`,"api.copy":`複製`,"api.copied":`已複製`,"api.dismiss":`關閉`,"api.generateTitle":`生成金鑰`,"api.keyNamePlaceholder":`金鑰名稱(可選)`,"api.generate":`生成`,"api.generating":`建立中…`,"api.activeKeys":`活躍金鑰({count})`,"api.noKeys":`還沒有 API 金鑰。請在上方生成一個。`,"api.colName":`名稱`,"api.colKey":`金鑰`,"api.colCreated":`建立時間`,"api.confirm":`確認`,"api.deleteAria":`刪除 API 金鑰`,"api.modelsTitle":`外部模型目錄`,"api.modelsCount":`{count} 個可呼叫`,"api.modelsLoading":`正在載入模型…`,"api.modelsSearch":`搜尋模型`,"api.modelsSubtitle":`請使用這些精確的模型 ID 搭配 /v1/models 和你選擇的入站協議。`,"api.modelsEmpty":`還沒有可供外部呼叫的模型。`,"api.modelsNoMatch":`沒有模型符合「{query}」。`,"api.modelsLoadFailed":`無法載入外部模型目錄。`,"api.colModel":`模型`,"api.colSource":`來源`,"api.colProtocols":`協議`,"api.sourceNative":`ChatGPT 池`,"api.sourceCombo":`組合路由`,"api.sourceCustom":`自訂`,"api.protocolResponses":`Responses`,"api.protocolChatCompletions":`Chat Completions`,"api.protocolMessages":`Messages`,"api.copyModelId":`複製 ID`,"api.modelCopied":`已複製`,"api.testModel":`測試`,"api.testingModel":`測試中…`,"api.testSucceeded":`成功`,"api.testFailed":`失敗`,"api.usageChatTitle":`Chat Completions 範例`,"api.usageResponsesTitle":`Responses 範例`,"api.usageMessagesTitle":`Messages 範例`,"api.usageSampleInput":`你好,世界!`,"api.keysLoadFailed":`無法載入 API 金鑰。`,"api.createFailed":`無法建立 API 金鑰。`,"api.deleteFailed":`無法刪除 API 金鑰。`,"api.auth.endpoint":`端點`,"api.auth.required":`必要`,"api.auth.accepted":`已接受`,"api.auth.rejected":`未接受`,"api.auth.testProtocol":`測試 {protocol}`,"api.auth.testNeedsFreshKey":`生成一組金鑰並保留其一次性數值在畫面上,才能執行已認證的測試。`,"api.key.name":`金鑰名稱`,"api.key.rename":`重新命名`,"api.key.saveName":`儲存名稱`,"api.key.renaming":`儲存中…`,"api.key.renameFailed":`無法重新命名金鑰。你的草稿已保留。`,"api.key.deleting":`刪除中…`,"api.key.copyFailed":`無法複製金鑰。請手動選取並複製後再關閉此面板。`,"api.attribution.title":`已歸因用量`,"api.attribution.requests7d":`請求數,最近 7 天`,"api.attribution.totalRequests":`已歸因請求總數`,"api.attribution.lastUsed":`上次使用`,"api.attribution.since":`歸因功能自啟用時間起算`,"api.attribution.neverUsed":`自歸因啟用以來未曾使用`,"api.attribution.unavailable":`用量無法取得`,"api.attribution.unavailableDetail":`尚未歸因任何用量。歸因啟用前記錄的請求無法事後補歸。`,"api.attribution.ambiguous":`兩組金鑰共用此 ID,因此用量無法歸因到其中一組。請在設定檔中為每組金鑰指定唯一 ID。`,"api.attribution.railAmbiguous":`ID 重複`,"claude.subtitle":`在 Claude Code 中使用 GPT、Gemini 等其他模型。`,"claude.pageTitle":`Claude Code`,"claude.enabledLabel":`Claude 連線`,"claude.enabledHint":`關閉後 Claude Code 無法使用此代理。`,"claude.authMode":`認證模式`,"claude.authModeHint":`Subscription 需要 Claude 帳號,Proxy 無需 Anthropic 帳號即可使用`,"claude.authModeSubscription":`Subscription(Claude 帳號)`,"claude.authModeProxy":`Proxy(無需帳號)`,"claude.authModeAuto":`自動(檢測 Claude 認證)`,"claude.effectiveMode.label":`下次啟動生效`,"claude.effectiveMode.manual":`手動:{mode}`,"claude.effectiveMode.autoPresent":`自動:訂閱 — 已透過 {source} 找到 Claude 認證`,"claude.effectiveMode.autoAbsent":`自動:代理模式 — 未找到 Claude 認證`,"claude.effectiveMode.autoUnknown":`自動:訂閱 — 無法確認認證`,"claude.effectiveMode.admissionKey":`此代理的 API 金鑰仍會傳送。`,"claude.authSource.claude-json-oauth":`Claude 帳號`,"claude.authSource.claude-credentials-file":`憑證檔案`,"claude.authSource.macos-keychain":`macOS 鑰匙串`,"claude.authSource.exported-env":`環境變數`,"claude.authSource.unknown":`檢測到的憑證`,"claude.systemEnv":`自動連線`,"claude.systemEnvDesc":`開啟後,在任意終端執行 claude 會自動透過代理。`,"claude.systemEnvUnsupported":`自動連線僅在 macOS 上可用。在此系統上,請使用 {cmd} 啟動 Claude。`,"claude.systemEnvWarn":`⚠ 需要完全退出並重新開啟終端應用才能生效。不推薦使用。`,"claude.fastMode":`Fast Mode (OpenAI)`,"claude.fastModeDesc":`控制 OpenAI 模型的推理速度。ON = 優先順序(更快)。OFF = 預設速度。Auto = 透傳客戶端設定。`,"claude.fastAuto":`Auto`,"claude.fastOn":`ON`,"claude.fastOff":`OFF`,"claude.autoContext":`自動利用大上下文`,"claude.autoContextDesc":`決定 1M 標記的範圍。開:視窗能容納壓縮門檻的模型都有大上下文條目;關:僅真正的 1M 模型有。`,"claude.autoContextInert":`配置檔案中存在舊式上下文大小值(maxContextTokens),此功能暫不生效。刪除該值即可恢復。`,"claude.autoCompactWindow":`自動摘要觸發點`,"claude.autoCompactDefault":`{value}(預設)`,"claude.autoCompactWindowDesc":`對話達到該點時自動摘要舊內容。不會超過各模型自身上限,因此 200k 模型不受影響。`,"claude.autoCompactWindowWarn":`修改該值可能導致 GPT 模型異常——若超過模型真實上限,會在摘要觸發前報錯。`,"claude.injectAgents":`自動註冊子代理`,"claude.injectAgentsDesc":`將“子代理”頁選中的模型(以及當前預設模型)註冊為 Claude Code 可派遣的代理(ocx-*)。從下一個會話開始生效。`,"claude.webSearchSidecar":`網頁搜尋附屬服務覆蓋`,"claude.webSearchSidecarHint":`僅對 Claude Code 請求覆蓋主網頁搜尋附屬服務設定。`,"claude.visionSidecar":`視覺附屬服務覆蓋`,"claude.visionSidecarHint":`僅對 Claude Code 請求覆蓋主視覺附屬服務設定。`,"claude.useMainSetting":`使用主設定`,"claude.sidecarModelPlaceholder":`主設定中的模型`,"claude.quickstart":`開始使用`,"claude.quickstartHint":`{cmd} 透過代理開啟 Claude Code。你的 claude.ai 登入保持不變。`,"claude.manualEnv":`手動配置(高階)`,"claude.smallFastModel":`背景輔助模型`,"claude.smallFastModelHint":`Claude Code 用於對話摘要、主題識別等背景工作的模型。子代理的 haiku 別名也使用它。留空 = Claude 預設(Haiku)。`,"claude.smallFastModelAccurateHint":`Claude Code 用於聊天摘要、主題識別等背景工作的模型。子代理的 haiku 別名也使用此模型。`,"claude.smallFastModelUnsetOption":`讓 Claude Code 選擇(原生模型)`,"claude.smallFastModelNativeWarning":`留空時,OpenCodex 不會設定輔助模型覆蓋項。Claude Code 可能使用其原生 Sonnet 模型,並可能產生原生供應商費用。`,"claude.slotUnset":`使用 Claude 預設值`,"claude.modelMap":`模型攔截`,"claude.modelMapHint":`攔截對特定模型的請求並重定向到你指定的模型。預設為空——新增規則後才生效。`,"claude.mapFrom":`原始模型(如 claude-sonnet-4-5)`,"claude.mapTo":`替換為(如 gemini/gemini-3-pro)`,"claude.addMapping":`新增規則`,"claude.removeMapping":`刪除規則`,"claude.aliases":`可用模型`,"claude.aliasesHint":`Claude Code 的 /model 選單中顯示的模型列表。`,"claude.aliasProviderOther":`其他`,"claude.loading":`載入中…`,"claude.loadFail":`載入 Claude 設定失敗`,"claude.saved":`已儲存。`,"claude.saveFailed":`儲存失敗`,"claude.networkError":`網路錯誤 — 代理是否在執行?`,"claude.toggleAria":`切換 Claude 連線`,"claude.none":`無`,"cws.loading":`正在載入組合…`,"cws.loadFailed":`無法載入組合。`,"cws.saveFailed":`無法儲存組合。`,"cws.removeFailed":`無法刪除組合。`,"cws.saved":`組合已儲存。`,"cws.created":`已建立 {model}。`,"cws.removed":`已刪除 combo/{id}。`,"cws.renamed":`已將 {from} 重新命名為 {to}。`,"cws.add":`新增組合`,"cws.addTitle":`新增組合`,"cws.addSubtitle":`建立跨供應商的虛擬模型,並指定客戶端實際請求的模型名稱。`,"cws.create":`建立組合`,"cws.railAria":`組合列表`,"cws.searchPlaceholder":`搜尋組合或目標…`,"cws.noSearchResults":`沒有符合的組合。`,"cws.group.failover":`容錯移轉`,"cws.group.roundRobin":`輪詢`,"cws.targetCount":`{count} 個目標`,"cws.targetCountOne":`1 個目標`,"cws.overviewTitle":`組合`,"cws.overviewBlurb":`可在供應商/模型目標間容錯移轉,或採用確定性平滑加權輪詢的虛擬模型。`,"cws.count.total":`總計`,"cws.count.failover":`容錯移轉`,"cws.count.roundRobin":`輪詢`,"cws.howTitle":`工作原理`,"cws.howBody":`在 Codex 中請求組合的公開模型名稱;未設定時預設使用 combo/<id>。OpenCodex 僅在可重試的上游錯誤時切換目標。若沒有可用目標,請求會直接失敗,不會回退到全域性預設供應商。`,"cws.attentionTitle":`需要關注`,"cws.attention.empty":`未配置目標`,"cws.attention.few":`只有一個目標 — 容錯移轉無處可跳`,"cws.attention.catalogOmitted":`未出現在模型目錄中 — 成員能力不完整或不相容(缺少上下文視窗/中繼資料,或模態交集為空)。依別名路由仍可用`,"cws.attention.allTargetsExhausted":`所有已啟用目標的額度均已用盡`,"cws.emptyTitle":`建立第一個組合`,"cws.empty.createDesc":`命名虛擬模型並串聯兩個或多個後端。`,"cws.backToAll":`返回全部組合`,"cws.allCombos":`全部組合`,"cws.copyModel":`複製 ID`,"cws.copied":`已複製`,"cws.tab.config":`配置`,"cws.tab.about":`關於`,"cws.strategy":`策略`,"cws.strategy.failover":`容錯移轉`,"cws.strategy.roundRobin":`輪詢`,"cws.strategy.failoverHint":`按順序嘗試目標。若出現可重試錯誤(限流、故障、訂閱門控),則跳到下一個。`,"cws.strategy.roundRobinHint":`按權重確定性地分配流量。將所選目標保留一批成功請求後,再推進到下一個目標。`,"cws.field.id":`組合 ID`,"cws.field.idHint":`客戶端將請求 {model}`,"cws.field.idInternalHint":`組合的內部 ID,建立後仍可修改。`,"cws.field.idHintEdit":`修改 ID 即重新命名組合。客戶端將請求 {model}。`,"cws.field.alias":`公開模型名稱`,"cws.field.aliasPlaceholder":`deepseek-v4-flash 或 vendor/model`,"cws.field.aliasHint":`可選。可填無字首裸名稱、自訂字首(如 vendor/model),或留空使用 combo/<id>。`,"cws.field.stickyLimit":`輪換前的粘性成功次數`,"cws.field.stickyLimitHint":`加權選擇器推進前,將所選目標保留這麼多次成功請求。`,"cws.field.defaultEffort":`預設推理級別`,"cws.field.defaultEffortNone":`無(使用目標預設)`,"cws.field.defaultEffortHint":`僅在客戶端未指定推理級別時使用。客戶端值優先,每個目標會按自身能力進行處理。`,"cws.capability.imageInputUnavailable":`所有已選目標都支援圖片輸入後才可使用。`,"cws.capability.imageInputHint":`所有目標都支援圖片時預設開啟;關閉後僅接受文字。`,"cws.capability.imageInput":`圖片 / 多模態`,"cws.capabilities":`功能`,"cws.field.defaultEffortUnsupported":`此 effort 不在目標的共同階梯中 — 請求時會被忽略或就近對應。`,"cws.field.defaultEffortUnsupportedOption":`不在交集中`,"cws.targets":`目標`,"cws.targets.failoverHint":`順序很重要 — 第一個為主。`,"cws.targets.roundRobinHint":`權重控制確定性的相對選擇;順序用於打破輪換環中的平局。`,"cws.target.provider":`供應商`,"cws.target.model":`模型`,"cws.target.weight":`權重`,"cws.target.pickProvider":`選擇供應商…`,"cws.target.pickProviderFirst":`請先選擇供應商…`,"cws.target.pickModel":`選擇模型…`,"cws.target.noModels":`該供應商沒有模型`,"cws.target.modelPlaceholder":`模型 ID`,"cws.target.add":`新增目標`,"cws.target.drag":`拖動以重新排序`,"cws.target.moveUp":`上移`,"cws.target.moveDown":`下移`,"cws.quota.available":`可用`,"cws.quota.exhausted":`額度已用盡`,"cws.quota.unknown":`額度未知`,"cws.quota.allExhausted":`所有已啟用目標的額度均已用盡。請選擇其他目標,或等待額度恢復。`,"cws.aboutTitle":`執行時`,"cws.aboutBody":`失敗目標會短暫冷卻並遵循 Retry-After。無效請求與上下文錯誤不會切換。每個目標按自身能力調整推理級別;所有目標耗盡時直接失敗。日誌與用量會保留有序的實際嘗試及每次嘗試的用量。`,"cws.removeConfirmTitle":`刪除 {model}?`,"cws.removeConfirmDesc":`從配置與 Codex 目錄移除該虛擬模型,不會刪除任何供應商。`,"cws.unsavedTitle":`未儲存的更改`,"cws.unsavedDesc":`捨棄對此組合的編輯並繼續?`,"cws.keepEditing":`繼續編輯`,"cws.err.missingId":`需要組合 ID。`,"cws.err.invalidId":`ID 須以字母或數字開頭,僅含字母、數字、點、下劃線或連字元(最多 64)。`,"cws.err.duplicateId":`已存在相同 ID 的組合。`,"cws.err.invalidAlias":`別名僅可包含字母、數字、點、下劃線或連字元,最多一個“/”分段。`,"cws.err.aliasReservedNamespace":`別名不得使用保留的“combo/”名稱空間。`,"cws.err.aliasNativeFamily":`不允許使用 OpenAI 原生家族裸別名(gpt-*、o1-*、o3-*、o4-*、codex-*)。`,"cws.err.duplicateAlias":`另一個組合已使用該別名。`,"cws.err.noTargets":`至少新增一個目標。`,"cws.err.incompleteTarget":`每個目標都需要供應商和模型。`,"cws.target.disabled":`{name}(已停用)`,"cws.err.reservedNamespace":`建立組合前,請先重新命名名為 combo 的實體供應商。`,"cws.err.providerCollision":`組合 ID 與已配置的供應商名稱衝突。`,"cws.err.unknownProvider":`每個目標都必須使用已配置的供應商。`,"cws.err.duplicateTarget":`同一供應商/模型目標只能出現一次。`,"cws.err.invalidStickyLimit":`粘性成功次數必須是 1 到 100 的整數。`,"cws.err.invalidWeight":`每個輪詢權重必須是 1 到 10000 的整數。`,"cws.err.noEnabledTarget":`至少一個目標必須使用已啟用的供應商。`,"claude.tabsLabel":`Claude 客戶端`,"claude.tabCode":`Code`,"claude.tabDesktop":`Desktop`,"claudeDesktop.title":`Claude Desktop`,"claudeDesktop.subtitle":`將每個 Claude 模型系列路由到埠 {port} 上的可用模型。`,"claudeDesktop.importJson":`匯入 JSON`,"claudeDesktop.exportJson":`匯出 JSON`,"claudeDesktop.loading":`正在載入 Claude Desktop 配置…`,"claudeDesktop.loadFail":`無法載入 Claude Desktop 配置。`,"claudeDesktop.retry":`重試`,"claudeDesktop.saveFailed":`無法儲存 Claude Desktop 配置。`,"claudeDesktop.applyFailed":`配置已儲存,但無法套用。`,"claudeDesktop.updateFailed":`Claude Desktop 更新失敗。`,"claudeDesktop.savedApplied":`配置已儲存並套用到 Claude Desktop。`,"claudeDesktop.savedAppliedAnnounce":`Claude Desktop 配置已儲存並套用。`,"claudeDesktop.saved":`配置已儲存。`,"claudeDesktop.savedAnnounce":`Claude Desktop 配置已儲存。`,"claudeDesktop.exported":`配置已匯出為 JSON。`,"claudeDesktop.importExpected":`需要版本 1 的 Claude Desktop 配置。`,"claudeDesktop.importReady":`JSON 已匯入。請檢查草稿,然後儲存並套用。`,"claudeDesktop.importedAnnounce":`配置 JSON 已匯入。可檢查尚未儲存的更改。`,"claudeDesktop.importInvalid":`所選檔案不是有效配置。`,"claudeDesktop.importFailed":`匯入失敗。{error}`,"claudeDesktop.moved":`已將 {route} 移動到 {family}。`,"claudeDesktop.unsaved":`有未儲存的更改`,"claudeDesktop.upToDate":`配置已是最新`,"claudeDesktop.saving":`正在儲存…`,"claudeDesktop.applying":`正在套用…`,"claudeDesktop.saveApply":`儲存並套用`,"claudeDesktop.emptyTitle":`沒有可用模型`,"claudeDesktop.emptyHint":`請新增或啟用供應商,然後返回分配 Claude Desktop 路由。`,"claudeDesktop.assignmentsLabel":`Claude 模型系列分配`,"claudeDesktop.family.opus":`Opus`,"claudeDesktop.family.fable":`Fable`,"claudeDesktop.family.sonnet":`Sonnet`,"claudeDesktop.family.haiku":`Haiku`,"claudeDesktop.modelCountOne":`{count} 個模型`,"claudeDesktop.modelCountMany":`{count} 個模型`,"claudeDesktop.chooseDefault":`選擇預設模型`,"claudeDesktop.temporaryDefault":`臨時預設模型`,"claudeDesktop.laneEmpty":`將模型拖到這裡,或使用移動控制元件。`,"claudeDesktop.laneNoMatch":`該系列中沒有與搜尋符合的模型。`,"nav.grok":`Grok`,"grok.title":`Grok Build`,"grok.subtitle":`opencodex 已註冊到你的 Grok 配置中的模型。`,"grok.loading":`正在載入 Grok 狀態…`,"grok.loadFail":`無法讀取 Grok 配置。`,"grok.notConfiguredTitle":`Grok Build 尚未接入`,"grok.notConfiguredHint":`安裝 Grok 後重新啟動代理,opencodex 會把託管塊寫入:`,"grok.endpoint":`端點`,"grok.colModel":`模型`,"grok.colAlias":`Grok 別名`,"grok.colContext":`上下文`,"grok.groupNative":`原生模型`,"grok.groupRouted":`路由模型`,"grok.enabledCount":`已註冊 {on}/{total}`,"grok.saved":`選擇已儲存。`,"grok.savedApplied":`選擇已儲存並寫入 Grok 配置。`,"grok.saveFailed":`無法儲存 Grok 選擇。`,"grok.applyFailed":`選擇已儲存,但無法更新 Grok 配置。`,"grok.applySkipped":`選擇已儲存,Grok 配置未更改。`,"grok.saveApply":`儲存並套用`,"grok.saving":`儲存中…`,"grok.applying":`套用中…`,"grok.unsaved":`未儲存的更改`,"grok.upToDate":`選擇已是最新`,"grok.toggleModel":`將 {id} 註冊到 Grok`,"claudeDesktop.available":`可用`,"claudeDesktop.defaultBadge":`預設`,"claudeDesktop.supports1m":`1M`,"claudeDesktop.unavailable":`不可用`,"claudeDesktop.contextM":`{n}M 上下文`,"claudeDesktop.contextK":`{n}k 上下文`,"claudeDesktop.contextUnknown":`上下文未知`,"claudeDesktop.alias":`別名`,"claudeDesktop.useAsDefault":`設為 {family} 預設模型`,"claudeDesktop.moveTo":`移動到`,"claudeDesktop.move":`移動`,"claudeDesktop.status.applied":`已套用到 Desktop`,"claudeDesktop.status.stale":`配置已更改 — 需重新套用`,"claudeDesktop.status.notApplied":`未套用`,"claudeDesktop.status.notActiveProfile":`Desktop 正在使用其他配置 — 請重新套用`,"claudeDesktop.health.lastRequest":`最後請求`,"claudeDesktop.health.stats":`{count} 請求 / {errors} 錯誤`,"claudeDesktop.effort.supported":`effort`,"claudeDesktop.effort.displayOnly":`effort (僅顯示)`,"startup.backToDashboard":`返回儀表板`,"startup.repair":`修復`,"startup.repairing":`正在修復…`,"startup.serviceRepaired":`背景服務修復成功。`,"startup.shimRepaired":`Codex 啟動器 shim 修復成功。`,"sub.workspace.addToFeatured":`將 {m} 加入精選`,"sub.workspace.allModels":`所有模型`,"sub.workspace.featuredFull":`精選列表已滿(最多 5 個)`,"sub.workspace.mainAria":`子代理模型詳情`,"sub.workspace.notFeatured":`未設為精選`,"sub.workspace.priority":`優先順序`,"sub.workspace.removeFromFeatured":`將 {m} 自精選移除`,"sub.workspace.selectModel":`選擇模型`,"sub.workspace.selectModelDesc":`從列表選擇模型以查看詳情,並設為 spawn_agent 的精選模型。`,"sub.workspace.selector":`公開選擇器`,"logs.badge.grok":`Grok`,"logs.tokens.contextTotal":`作用中上下文`,"usage.workspace.report":`用量報告`,"usage.workspace.sections":`用量分區`,"storage.rescanned":`掃描完成。`,"storage.snapshot.lastScan":`上次掃描`,"storage.snapshot.scanning":`掃描中…`,"storage.snapshot.unavailable":`尚無掃描。`,"storage.cleanupCard.title":`釋放空間`,"storage.cleanupCard.tabs":`清理選項`,"storage.cleanupCard.tab.policy":`原則`,"storage.cleanupCard.tab.quarantine":`隔離區`,"storage.cleanup.noArchives":`沒有可清理的封存工作階段。`,"storage.workspace.overview":`概覽`,"storage.workspace.selectBucket":`從列表選擇儲存區以查看明細。`,"storage.policy.trigger":`觸發條件`,"storage.policy.thresholdInc":`提高閾值`,"storage.policy.thresholdDec":`降低閾值`,"storage.policy.percentInc":`提高百分比`,"storage.policy.percentDec":`降低百分比`,"storage.policy.reduceInc":`提高縮減目標`,"storage.policy.reduceDec":`降低縮減目標`,"pws.dashboard.noRateLimits":`尚無速率限制資料`,"codexAuth.autoSwitchThresholdInc":`提高切換閾值`,"codexAuth.autoSwitchThresholdDec":`降低切換閾值`,"accountPool.stickyLimitInc":`提高黏性上限`,"accountPool.stickyLimitDec":`降低黏性上限`,"api.activeKeysLoading":`有效金鑰`,"api.workspace.details":`API 金鑰詳情`,"api.workspace.keyDetails":`金鑰詳情`,"api.workspace.keyPrefix":`金鑰前綴`,"api.workspace.deleteKey":`刪除金鑰`,"api.workspace.deleteConfirm":`確定要刪除此金鑰嗎?此操作無法復原。`,"api.workspace.usageExamples":`用法範例`,"api.copyUrlHint":`點擊以複製 URL`,"api.urlCopied":`已複製 URL`,"api.copyExampleHint":`點擊以複製範例`,"api.exampleCopied":`已複製範例`,"claude.workspace.settings":`設定`,"sidebar.star":`在 GitHub 上加星`,"sidebar.starred":`已在 GitHub 加星`,"sidebar.starUnauthenticated":`開啟 GitHub 加星(gh CLI 未登入)`,"sidebar.starFailed":`無法透過 gh 加星,改為開啟 GitHub。`,"sidebar.updateAvailable":`有可用更新:{version}`,"sidebar.checkUpdate":`檢查更新`,"dash.mem.jsHeapArena":`arena {total}`,"dash.mem.pressure":`相對於警告閾值`,"dash.mem.pressureOf":`警告閾值的 {pct}%`,"dash.mem.pressureUnknown":`未回報閾值`,"dash.injectionManage":`開啟設定`,"dash.syncModelsHint":`根據已連接的供應商重寫 Codex 的模型目錄。`,"dash.syncRun":`立即同步`,"sub.settings":`設定`,"sub.sections":`子代理分區`,"sub.delegation.model":`優先調用的模型`,"sub.delegation.modelHint":`Codex 分派工作時最先調用的模型。上面的推薦是可調用的名單,這裡選的是其中第一順位。`,"debug.loadFailed":`無法載入偵錯設定。`,"provider.name.volcengine":`Volcengine Ark`,"provider.name.volcengineCodingPlan":`Volcengine Ark Coding Plan`,"provider.name.volcengineAgentPlan":`Volcengine Ark Agent Plan`,"usage.range.available":`可用歷史紀錄`,"usage.historyTruncated":`總計僅涵蓋可用歷史紀錄,因為較舊的用量未被載入。`,"usage.historyTruncatedWindow":`已載入紀錄的請求開始時間介於 {start} 到 {end} 之間。受讀取上限限制,檔案較前的項目已被略過,所選期間可能不完整。`,"codexAuth.autoSwitchQuotaDesc":`配額:使用率達 {threshold}% 或以上時,下一個請求可能移至用量較低的合格帳號,包括已綁定的任務;Go/Free 僅使用 30 天。`,"codexAuth.autoSwitchQuotaOffDesc":`基於用量的主動切換已關閉。新增/未綁定分派與故障恢復仍然適用。`,"codexAuth.autoSwitchRoundRobinDesc":`輪詢分派不使用此閾值;它會繼續輪換新增/未綁定的任務。`,"codexAuth.autoSwitchFillFirstDesc":`優先填滿:{threshold}% 是新增/未綁定任務的耗盡點;健康的已綁定任務保留其帳號。`,"codexAuth.autoSwitchFillFirstOffDesc":`優先填滿對新增/未綁定任務沒有用量耗盡點;冷卻、重新驗證與故障恢復仍可改變路由。`,"codexAuth.failureRecoveryNote":`故障恢復是獨立的:請求在輸出前被拒絕(429/402)、冷卻、重新驗證、排除或已設定的暫時容錯移轉,可能選擇另一個合格帳號。`,"accountPool.strategyHintQuota":`配額也可以在跨越用量閾值後,於下次請求時重新綁定現有任務。`,"accountPool.strategyHintRoundRobin":`輪詢僅輪換沒有有效綁定的任務;用量閾值不會改變正常輪換。`,"accountPool.strategyHintFillFirst":`優先填滿將閾值用作未綁定任務的耗盡點;健康的已綁定任務保持親和性。`,"accountPool.unboundDefinition":`新增/未綁定任務表示沒有當前帳號綁定的請求;現有可見任務在代理或親和性重設後可能變成未綁定。`,"api.workspace.sections":`API 分區`,"api.section.keys":`金鑰`,"api.section.connect":`連接`,"api.section.endpoints":`端點`,"api.section.models":`模型`,"api.section.examples":`範例`,"api.clientConfig.title":`用戶端設定`,"api.clientConfig.rowsLabel":`連接用戶端`,"api.clientConfig.details":`詳情`,"api.clientConfig.detailsAria":`{client} 設定詳情`,"api.clientConfig.copyAria":`複製 {client} 設定 JSON`,"api.clientConfig.downloadAria":`下載 {client} 設定`,"api.clientConfig.rowMeta":`{destination} · {count} 個模型`,"api.clientConfig.rowError":`無法建構 {client} 設定。`,"api.clientConfig.copiedAnnounceClient":`{client} 設定 JSON 已複製到剪貼簿。`,"api.clientConfig.clientOpencode":`OpenCode`,"api.clientConfig.clientPi":`Pi`,"api.clientConfig.copy":`複製 JSON`,"api.clientConfig.download":`下載`,"api.clientConfig.loading":`正在建構用戶端設定…`,"api.clientConfig.jsonLabel":`{client} 設定 JSON`,"api.clientConfig.destination":`目標檔案`,"api.clientConfig.envHint":`啟動前設定金鑰`,"api.clientConfig.mergeWarning":`將此合併到目標檔案。替換它會丟失您的其他供應商和 MCP 設定。`,"api.clientConfig.modelCount":`已匯出 {count} 個模型`,"api.clientConfig.missingLimits":`{total} 個模型中有 {count} 個未附帶上下文限制;用戶端會套用自己的預設值。`,"api.clientConfig.noKeyYet":`{env} 背後尚無金鑰。在非回送環境使用此設定前,請先在上面產生金鑰。`,"api.clientConfig.loadFailed":`無法讀取模型清單,因此未產生用戶端設定。`,"api.clientConfig.copiedAnnounce":`用戶端設定 JSON 已複製到剪貼簿。`,"api.clientConfig.copyFailed":`無法複製用戶端設定 JSON。`,"api.clientConfig.downloadedAnnounce":`已下載 {filename}。目前尚未變更任何內容 — 請自行將其合併到 {destination}。`,"api.clientConfig.whereDisclosure":`此檔案的放置位置`,"api.clientConfig.whereBody":`上述目標是全域路徑。工作目錄中的專案本地設定檔優先於它,且用戶端從設定中指定的環境變數讀取金鑰 — 絕不從此檔案讀取。`,"api.attribution.totalRequestsAvailable":`可用歷史紀錄中的請求`,"api.attribution.sinceAvailable":`可用歸因起始自`,"uptime.day":`天`,"uptime.hour":`小時`,"uptime.minute":`分鐘`,"uptime.second":`秒`,"auth.adminTokenTitle":`OpenCodex 管理員金鑰 (OPENCODEX_ADMIN_AUTH_TOKEN)`,"auth.adminAccountLabel":`帳號`,"auth.adminTokenFieldLabel":`管理員金鑰`,"auth.adminTokenRejected":`該管理員金鑰被拒絕。請檢查後再試一次。`,"auth.adminTokenUnavailable":`無法驗證管理員金鑰。請再試一次。`,"lang.nativeName":`繁體中文`,"provider.name.commandCodeAuth":`Command Code - Auth`,"provider.name.commandCodeApi":`Command Code - API`,"routing.title":`路由智能 (beta)`,"routing.subtitle":`策略設定檔、試運行評估,以及有來源依據的路由分析。`,"routing.loadFailed":`無法載入路由資料`,"routing.empty":"尚未配置路由策略。請在 config.json 中新增 `routingProfiles`。","routing.revision":`rev`,"routing.detail":`設定檔`,"routing.createProfile":`建立設定檔`,"routing.dryRunError":`試運行失敗(HTTP {status})`,"routing.removeConfirm":`移除設定檔 {id}?`,"routing.unknownEvidence.allow":`允許`,"routing.unknownEvidence.penalize":`懲罰`,"routing.unknownEvidence.exclude":`排除`,"routing.removeCandidate":`移除候選 {provider}/{model}`,"routing.candidates":`候選`,"routing.require":`嚴格要求`,"routing.optimize":`最佳化權重`,"routing.limits":`限制`,"routing.unknownEvidence":`未知證據策略`,"routing.compatibility.title":`相容性策略`,"routing.compatibility.enabled":`要求 Compatibility Lab 證據`,"routing.compatibility.requiredSuites":`必要套件`,"routing.compatibility.loadingCatalog":`正在載入 Lab 目錄…`,"routing.compatibility.catalogUnavailable":`Lab 目錄不可用 — 請在 config.json 中手動輸入套件 ID。`,"routing.compatibility.layer.protocol_conformance":`協定一致性`,"routing.compatibility.layer.live_route_compatibility":`即時路由相容性`,"routing.compatibility.minStatus":`最低相容性狀態`,"routing.none":`無`,"routing.unavailable":`–`,"routing.dryRun":`試運行評估`,"routing.dryRunContext":`請求上下文視窗(tokens)`,"routing.dryRunTools":`請求需要工具`,"routing.dryRunImage":`請求需要圖片輸入`,"routing.dryRunStructured":`請求需要結構化輸出`,"routing.dryRunRun":`評估候選`,"routing.candidate":`候選`,"routing.eligible":`合格`,"routing.exclusions":`排除項目`,"routing.costCap":`成本上限`,"routing.capOutcome.satisfied":`未超過上限`,"routing.capOutcome.exceeded":`超過上限`,"routing.capOutcome.unknown-allowed":`未知(允許)`,"routing.capOutcome.unknown-excluded":`未知(排除)`,"routing.exclusion.capability-unsatisfied":`能力未滿足`,"routing.exclusion.unknown-capability":`能力未知`,"routing.exclusion.cost-limit":`超過成本上限`,"routing.exclusion.cost-limit-unknown":`成本未知(在上限內)`,"routing.exclusion.cooldown":`冷卻中`,"routing.exclusion.unknown-health":`健康狀態未知`,"routing.exclusion.unknown-quota":`額度未知`,"routing.exclusion.unknown-price":`價格未知`,"routing.exclusion.other":`排除:{code}`,"routing.score":`分數`,"routing.selected":`已選取`,"routing.yes":`是`,"routing.no":`否`,"routing.analytics":`路由分析`,"routing.analyticsTotal":`請求`,"routing.analyticsSuccessRate":`成功率`,"routing.analyticsFallbackRate":`備援`,"routing.analyticsP50":`p50`,"routing.analyticsP95":`p95`,"routing.analyticsP99":`p99`,"routing.analyticsCooldown":`冷卻失敗`,"routing.analyticsConfidence":`可信度`,"routing.analyticsTruncated":`已截斷的歷史`,"routing.analyticsRequests":`請求`,"routing.analyticsEmpty":`尚無分析資料 — 請先傳送一些請求。`,"dash.updateVersionTransition":`{currentVersion} -> {latestVersion}。`,"prov.loginSameAccount":`仍是同一個 {provider} 帳號 — 請在瀏覽器中切換帳號後,再試一次「新增帳號」。`,"models.tab.catalog":`模型`,"models.tab.combos":`組合`,"models.tab.compatibility":`相容性`,"models.tab.routing":`路由 (beta)`,"models.tabsLabel":`模型介面`,"models.subtitle.combos":`將多個模型合成一個 id 來回答。容錯移轉會依序嘗試目標;輪詢則分攤負載。`,"models.subtitle.compatibility":`來自實驗室投影證據的唯讀相容性判定矩陣。`,"models.subtitle.routing":`原則設定檔、dry-run 評估,以及有來源依據的路由分析。`,"models.contextSettings":`自訂視窗`,"models.contextSettingsTitle":`自訂視窗 — {provider}`,"models.contextDefault":`安全上限 / 回退`,"models.contextModel":`模型`,"models.contextModelOverride":`模型覆寫`,"models.contextHint":`留空即自動偵測。這裡填的是安全上限和回退:只在上游沒有視窗時補上,並且只壓低更大的回報值。即時偵測結果不會寫回此欄。`,"models.contextAutomatic":`自動偵測`,"models.contextSaved":`上下文視窗已更新 — 將在下一個 Codex 回合生效。`,"models.contextUnchanged":`沒有需要儲存的上下文視窗變更。`,"models.contextSaveFailed":`儲存上下文視窗失敗`,"models.contextInvalid":`上下文視窗必須是正整數`,"logs.detail.route.section":`路由決策`,"logs.detail.route.kind":`路由類型`,"logs.detail.route.profile":`原則設定`,"logs.detail.route.selected":`已選取`,"logs.detail.route.candidates":`候選`,"logs.detail.route.unknown":`此請求沒有記錄路由追蹤(追蹤前的列)。`,"logs.detail.source.user":`供應商設定的價格覆蓋`,"logs.detail.attempt.recovery.transient5xx":`暫時性 5xx`,"logs.detail.attempt.recovery.connectionReset":`連線重設`,"logs.detail.attempt.recovery.oauth401":`OAuth 重新驗證`,"logs.detail.attempt.recovery.key429":`金鑰被限流 (429)`,"logs.detail.attempt.recovery.rateLimit429":`被限流 (429)`,"logs.detail.attempt.recovery.anthropicOauth429":`Anthropic OAuth 被限流 (429)`,"logs.detail.attempt.recovery.image413":`圖片承載過大 (413)`,"logs.detail.attempt.recovery.emptyCompletion":`空白完成重試`,"logs.detail.attempt.recovery.unknown":`未知的復原原因`,"logs.detail.estimate.provider_cost_overlay":`已使用供應商設定的價格覆蓋。`,"logs.detail.estimate.priority_lower_bound":`無法取得已確認的 Priority 價格;目前顯示的估算是已知下限。`,"pws.cockpitImportDescription":`從此裝置匯入 Cockpit Tools Antigravity JSON 匯出檔。不會顯示檔案內容。`,"pws.cockpitImportFileLabel":`Cockpit Tools Antigravity JSON 匯出檔`,"pws.cockpitImportChooseFile":`選擇 JSON 檔案`,"pws.cockpitImporting":`匯入中…`,"pws.cockpitImportInvalid":`選取的檔案不是有效的 JSON 匯出檔,或檔案過大。`,"pws.cockpitImportFailed":`無法完成帳號匯入。`,"pws.cockpitImportComplete":`匯入完成:已匯入 {imported} 個、已更新 {updated} 個、失敗 {failed} 個、不支援 {unsupported} 個。`,"pws.accountModeSaved":`帳號模式已儲存。`,"pws.accountModeFailed":`無法切換帳號模式。`,"pws.accountModeConfirm":`要切換 OpenAI 帳號模式嗎?進行中的對話將重新指派到另一種模式的帳號集合,配額用量將依新模式追蹤。`,"pws.capacity.estimate":`依設定權重的帳號池估算`,"pws.capacity.currentAccount":`目前有效帳號`,"pws.capacity.nextRecovery":`下一次容量復原`,"pws.capacity.recoveryShare":`+{percent}% 帳號池容量`,"pws.capacity.incomplete":`覆蓋不完整:已排除 {excluded} 個帳號,其中 {unknown} 個方案未知`,"pws.capacity.partial":`部分視窗覆蓋:{count} 個帳號未回報所有顯示的限額視窗`,"pws.capacity.windowPartial":`部分`,"pws.capacity.windowPartialA11y":`{window}:帳號覆蓋不完整`,"pws.connectionNotApplicable":`不適用 — 此供應商使用靜態模型目錄。`,"nav.integrations":`整合`,"integrations.subtitle":`將客戶端連線到 opencodex、管理憑證,並還原客戶端設定。`,"integrations.tabsLabel":`整合表面`,"integrations.tab.overview":`總覽`,"integrations.tab.keys":`API 金鑰`,"integrations.tab.codex":`Codex CLI`,"integrations.tab.claude":`Claude`,"integrations.tab.grok":`Grok Build`,"integrations.tab.opencode":`OpenCode`,"integrations.tab.pi":`Pi`,"integrations.tab.omp":`OMP`,"integrations.tab.hermes":`Hermes`,"integrations.tab.openclaw":`OpenClaw`,"integrations.tab.kimi":`Kimi Code`,"integrations.tab.gajae":`Gajae Code`,"integrations.tab.dsh":`DeepSeek Harness (DSH)`,"integrations.tab.mcode":`MiniMax Code`,"integrations.tab.zcode":`ZCode`,"integrations.tab.prime":`Prime Agent`,"integrations.codex.title":`Codex CLI`,"integrations.codex.body":`Codex 連線由代理服務管理。啟動 opencodex 時套用;停止服務時還原原生路由。`,"integrations.codex.openService":`開啟服務控制`,"integrations.state.notInstalled":`未安裝`,"integrations.state.unknown":`檢查中…`,"integrations.detail.codexRouted":`Codex 請求經由此代理`,"integrations.detail.codexAbsent":`Codex 尚未經由此代理路由`,"integrations.detail.keyCount":`已簽發 {count} 個金鑰`,"integrations.detail.keyNone":`尚未簽發金鑰`,"integrations.detail.keyChecking":`檢查中…`,"integrations.detail.keyUnavailable":`無法取得金鑰狀態`,"integrations.detail.claudeOff":`連線已關閉`,"integrations.detail.desktopCurrent":`Desktop 正在使用此設定檔`,"integrations.detail.desktopStale":`設定檔在套用後被變更`,"integrations.detail.desktopNotServed":`設定檔存在,但 Desktop 使用的是另一個`,"integrations.detail.desktopAbsent":`未套用任何設定檔`,"integrations.detail.desktopDesiredOff":`Claude Desktop 整合已關閉`,"integrations.detail.desktopDesiredOffCleanupPending":`Claude Desktop 仍在使用閘道,清理尚未完成`,"integrations.detail.desktopDesiredOnNotApplied":`整合已開啟,但 Desktop 未使用閘道設定檔`,"integrations.detail.desktopSelectedElsewhere":`Desktop 正在使用其他設定檔`,"integrations.detail.desktopProfileDrift":`選取的 Desktop 設定檔已變更`,"integrations.detail.desktopObservedUnsafe":`無法安全變更選取的 Desktop 設定檔`,"integrations.detail.desktopNotInstalled":`未安裝 Claude Desktop 設定程式庫`,"integrations.detail.grokModels":`已接入 {count} 個模型`,"integrations.detail.grokAbsent":`設定中沒有 opencodex 區塊`,"integrations.dialog.grok.title":`要停用 Grok Build 整合嗎?`,"integrations.dialog.grok.changes":`只會從 {path} 移除由 opencodex 標記的區塊。區塊之外寫入的內容將保持不變。`,"integrations.dialog.grok.breakage":`停用後,Grok Build 中的 opencodex 模型別名將消失。透過 xAI 帳號使用的模型不受影響。`,"integrations.dialog.grok.undo":`如果 opencodex 正在 loopback 位址上執行,重新啟用時會根據目前可用的模型寫入新的區塊。`,"integrations.dialog.grok.confirm":`停用`,"integrations.dialog.desktop.title":`要停用 Claude Desktop 整合嗎?`,"integrations.dialog.desktop.changes":`如果 {path} 包含 opencodex 管理的閘道設定檔,Desktop 會先選取新的免憑證標準設定檔,再移除舊設定檔與其備份。`,"integrations.dialog.desktop.breakage":`Claude Desktop 將恢復為標準 Claude,不再使用經由 opencodex 路由的模型。`,"integrations.dialog.desktop.undo":`重新啟用時,會根據你儲存的模型指派重新產生 opencodex 設定檔。`,"integrations.dialog.desktop.restart":`Claude Desktop 僅在啟動時讀取此設定。請完全結束並重新開啟 Desktop,變更才會生效。`,"integrations.dialog.desktop.confirm":`停用`,"integrations.native.msg.nonLoopbackRemoved":`只有當 opencodex 在 loopback 位址上執行時,才能自動註冊 Grok Build。先前指向 loopback 的區塊已移除。`,"integrations.native.msg.nonLoopbackRemovedNoop":`只有當 opencodex 在 loopback 位址上執行時,才能自動註冊 Grok Build。沒有需要移除的舊區塊。`,"integrations.native.msg.nonLoopbackSuperseded":`只有當 opencodex 在 loopback 位址上執行時,才能自動註冊 Grok Build。在此期間,另一個程序寫入了新的區塊,因此檔案中目前的區塊並非由本次請求建立。`,"integrations.native.error.orphanedMarker":`{path} 有 opencodex 開始標記但沒有結束標記。由於 opencodex 無法判斷其區塊的結束位置,因此未變更檔案。`,"integrations.native.error.homeMismatch":`已安裝服務的 home 與目前的 home 不符,因此未變更檔案。`,"integrations.native.error.notInstalled":`尚未安裝 Grok Build,因此沒有可變更的內容。`,"integrations.native.error.configBusy":`設定正在其他地方儲存中,無法變更。請稍後再試。`,"integrations.native.error.desktopUnsafeMetadata":`無法安全讀取 {path} 中的 Claude Desktop 中繼資料,因此未變更其設定庫。`,"integrations.native.error.desktopCleanupIncomplete":`Claude Desktop 已指向標準模式,但仍有舊的 opencodex 憑證檔案殘留於:{paths}。`,"integrations.native.msg.desktopDisabled":`Claude Desktop 整合已停用。`,"integrations.native.msg.desktopEnabled":`Claude Desktop 整合已啟用。`,"integrations.state.absent":`未套用`,"integrations.state.current":`已套用`,"integrations.state.stale":`需要更新`,"integrations.state.conflict":`衝突`,"integrations.state.unsafe":`無法驗證`,"integrations.summary.detected":`偵測到的用戶端`,"integrations.summary.applied":`已設定的用戶端`,"integrations.summary.stale":`需要更新`,"integrations.summary.lastChange":`上次變更`,"integrations.summary.disableAll":`全部停用…`,"integrations.onboarding":`套用時會先儲存備份,再寫入一個 opencodex 供應商區塊。停用只會移除該區塊,且可從保留的快照還原。`,"integrations.empty.title":`未偵測到已安裝的用戶端`,"integrations.empty.body":`安裝受支援的用戶端,然後返回此處套用 opencodex。`,"integrations.action.apply":`套用`,"integrations.action.disable":`停用`,"integrations.action.refresh":`更新`,"integrations.action.settings":`設定`,"integrations.action.manageKeys":`管理金鑰`,"integrations.action.restore":`還原…`,"integrations.action.undo":`復原`,"integrations.action.restorePoint":`還原到此時間點…`,"integrations.action.snapshotExpired":`備份已過期`,"integrations.rollback.title":`還原中心`,"integrations.rollback.empty":`尚無套用紀錄`,"integrations.rollback.emptyBody":`每次成功寫入前都會先保留一份寫入前快照。`,"integrations.restore.title":`要還原此快照?`,"integrations.restore.body":`系統會先備份目前的檔案,再用所選快照取代它。`,"integrations.restore.driftTitle":`偵測到較新的編輯`,"integrations.restore.driftBody":`此快照之後的變更會先備份,然後再取代檔案。`,"integrations.restore.confirm":`還原`,"integrations.restore.confirmDrift":`備份較新的編輯並還原`,"integrations.restore.pending":`正在還原…`,"integrations.restore.manual":`自動還原失敗:{reason}。請從 {path} 手動還原。`,"integrations.error.load":`無法載入整合狀態。`,"integrations.error.stale":`最近的重新整理失敗。下列值可能已過期。`,"integrations.error.busy":`此用戶端的另一項變更仍在進行中。請稍後再試。`,"integrations.error.conflict":`opencodex 寫入後設定又變更了。未移除任何內容。`,"integrations.error.unsafe":`無法安全地變更設定。`,"integrations.error.generic":`整合變更失敗。已保留你先前的狀態。`,"integrations.error.nonLoopback":`{client} 只能連線到 localhost 上的 proxy——其設定沒有位置可放入遠端繫結所需的准入標頭,手動撰寫也不會有幫助。請改以隧道或本機轉發器提供 loopback 存取。`,"integrations.status.installed":`已安裝`,"integrations.status.notInstalled":`未安裝`,"integrations.status.appliedAt":`已套用`,"integrations.status.backup":`備份`,"integrations.status.lastRestore":`上次還原`,"integrations.status.unknown":`未知`,"integrations.bulk.title":`要停用已套用的用戶端整合?`,"integrations.bulk.body":`只會移除屬於 opencodex 的區塊。每個用戶端都會先保留一份寫入前快照。`,"integrations.bulk.partial":`部分用戶端無法停用:{clients}`,"integrations.bulk.success":`已套用的用戶端整合已停用。`,"integrations.retention.degraded":`備份清理進度落後;磁碟上可能仍有較舊的備份。`,"integrations.error.residual":`檔案可能處於中間狀態:{message} 請從 {path} 還原。`,"integrations.error.recover":`{message} 備份位於 {path}。`,"integrations.kind.apply":`已套用`,"integrations.kind.disable":`已停用`,"integrations.kind.refresh":`已更新`,"integrations.kind.restore":`已還原`,"integrations.semantics.opencode":`僅適用於直接從磁碟啟動;ocx opencode 的環境注入優先。`,"integrations.semantics.pi":`適用於新工作階段。`,"integrations.semantics.omp":`重新啟動 OMP 以載入模型目錄。`,"integrations.semantics.hermes":`適用於新工作階段。`,"integrations.semantics.openclaw":`立即套用到正在執行的閘道。`,"integrations.semantics.kimi":`重新啟動或執行 /reload 以套用(v2 會監視該檔案)。`,"integrations.semantics.gajae":`在新工作階段中或開啟 /model 時生效。`,"integrations.semantics.dsh":`OpenCodex 只管理 $DSH_HOME/settings.yaml 中的 llm-pi-ai.providers.opencodex。DSH 會熱重載該 provider;你的預設模型與 deepseek-official 維持不變。目前僅支援 loopback,且不會寫入真實憑證。`,"integrations.semantics.mcode":`僅管理 custom_provider.opencodex,不會變更預設模型或 MiniMax 登入狀態。`,"integrations.semantics.zcode":`僅管理 ~/.zcode/v2/config.json 中的 provider.opencodex,不會變更 Z.ai 登入狀態或其他供應商。變更後請重新啟動 ZCode。`,"integrations.semantics.prime":`僅管理 Prime Agent 的 models.json 中的 providers.opencodex;預設位於 ~/.prime/agent,若設定 PRIME_AGENT_CODING_AGENT_DIR 則以其為準。不會變更其他供應商或模型覆寫設定。對新工作階段生效。`,"codexAuth.pinned":`已固定`,"codexAuth.pinnedHint":`你手動選取了此帳號,因此較高的選擇順序不會越過它。此固定會持續到該帳號用盡、你改選其他帳號,或你變更任一選擇順序為止。`,"codexAuth.requestUserInput":`在 Default 模式中要求輸入`,"codexAuth.requestUserInputDesc":`讓 Codex 暫停 Default 模式工作階段,並使用 request_user_input 工具向你提問。`,"codexAuth.requestUserInputUpdated":`功能旗標已更新 - 適用於新工作階段。`,"codexAuth.requestUserInputUpdatedRestart":`功能旗標已更新 - 適用於新工作階段。請重新啟動 Codex 應用程式以套用。`,"codexAuth.requestUserInputUpdateFailed":`無法更新功能旗標。未做任何變更。`,"codexAuth.requestUserInputLoadFailed":`無法從 config.toml 讀取功能旗標。`,"codexAuth.accountPickerTitle":`從模型選擇器指定特定的 Codex 帳號`,"codexAuth.accountPickerOffDesc":`啟用後,一般 GPT 選擇器選項會替換為每個帳號選擇器對應的選項,讓你可以不需登出就為對話指定確切帳號。關閉此功能不會移除任何帳號。`,"codexAuth.accountPickerOnDesc":`每個選擇器都是某個已儲存帳號的公開標籤。選擇後,該對話會鎖定到對應的帳號:永遠不會輪換或容錯移轉,也不會改變目前 Pool 的帳號。`,"codexAuth.accountPickerCompatibility":`內建的 Codex App 登入有自己的選擇器;產生的對應通常稱為 main,需要時會使用 main-2 這類避免衝突的後綴。新增的帳號會獲得穩定且保護隱私的標籤,而自訂選擇器名稱保持不變。現有的對話與已儲存的模型選擇會繼續路由。關閉此功能只會隱藏產生的選項,仍會保留選擇器與確切路由。一般 GPT 模型 ID 維持原有的 Pool 或 Direct 行為。`,"codexAuth.accountPickerUpdated":`帳號指定設定已更新。`,"codexAuth.accountPickerUpdateFailed":`無法更新帳號指定設定。目前顯示的是最後一次確認的設定。`,"codexAuth.accountPickerLoadFailed":`無法載入帳號指定設定。`,"codexAuth.accountPickerRefreshFailed":`無法重新整理此設定。目前仍顯示最後一次確認的值。`,"codexAuth.advancedSettings":`進階設定`,"codexAuth.advancedSettingsAria":`顯示或隱藏進階 Codex 認證設定`,"codexAuth.catalogRefreshPending":`變更已儲存,但 Codex 模型目錄仍在等待重新整理。請執行 ocx sync 重試。`,"accountPool.priority":`選擇順序`,"accountPool.priorityAria":`此帳號的選擇順序`,"accountPool.priorityHint":`數字越大越先使用。只有當排名在前的所有帳號都已耗盡或不可用時,帳號池才會轉向較小的數字。`,"accountPool.priorityFirst":`最先`,"accountPool.priorityEarlier":`較先`,"accountPool.priorityNormal":`一般`,"accountPool.priorityLater":`較後`,"accountPool.priorityLast":`最後`,"accountPool.priorityOption":`{name}({value})`,"accountPool.priorityCustom":`自訂`,"accountPool.priorityUpdated":`已更新 {email} 的選擇順序`,"accountPool.priorityUpdateFailed":`無法儲存 {email} 的選擇順序。目前顯示最後一次確認的值。`,"api.clientConfig.clientOmp":`OMP`,"api.clientConfig.clientHermes":`Hermes`,"api.clientConfig.clientOpenclaw":`OpenClaw`,"api.clientConfig.clientKimi":`Kimi Code`,"api.clientConfig.clientGajae":`Gajae Code`,"api.clientConfig.clientDsh":`DeepSeek Harness (DSH)`,"api.clientConfig.clientMcode":`MiniMax Code`,"api.clientConfig.clientZcode":`ZCode`,"api.clientConfig.clientPrime":`Prime Agent`,"cws.tabsLabel":`Combo 詳細區段`,"cws.field.nativeAlias":`原生 OpenAI 別名`,"cws.field.nativeAliasHint":`讓此 combo 擁有受支援的未限定原生 OpenAI 模型 ID。帶有帳號或供應商限定的 OpenAI 路由仍保持獨立。`,"cws.field.displayName":`顯示名稱`,"cws.field.displayNameHint":`此 combo 在模型選擇器中的標籤。啟用原生 OpenAI 別名時必填。`,"cws.err.unsupportedNativeAlias":`原生別名必須是目前受支援的裸 OpenAI 模型 ID。`,"cws.err.missingNativeAliasDisplayName":`原生別名必須提供顯示名稱。`,"cws.err.invalidDisplayName":`顯示名稱最多 128 個字元,且不能包含控制字元。`,"claudeDesktop.appliedMarkerUnsaved":`已套用到 Claude Desktop,但套用標記未能儲存 — 在你再次套用之前,下方的已儲存/已套用狀態可能顯示過時資訊。`,"claudeDesktop.status.disabled":`Claude Desktop 整合已關閉。啟用後請完全結束並重新開啟 Desktop。`,"claudeDesktop.enableApply":`啟用並套用`,"lab.title":`相容性實驗室`,"lab.subtitle":`以實驗室投影證據為基礎的唯讀相容性判定矩陣。`,"lab.loadFailed":`無法載入相容性實驗室資料`,"lab.projectionUnavailable":`實驗室投影不可用。請先執行 conformance 或 live 探測。`,"lab.projectionIncompatible":`實驗室投影 schema 不相容。請重新建立投影。`,"lab.statusTitle":`投影狀態`,"lab.matrixTitle":`相容性矩陣`,"lab.verdictsTitle":`判定記錄`,"lab.filter.layer":`證據層`,"lab.filter.verdict":`判定`,"lab.filter.subject":`主體 ID`,"lab.filter.all":`全部`,"lab.col.subject":`主體`,"lab.col.layer":`層級`,"lab.col.suite":`套件`,"lab.col.verdict":`判定`,"lab.col.asOf":`截至`,"lab.col.protocol":`協定符合度`,"lab.col.live":`即時路由相容性`,"lab.col.task":`任務效能`,"lab.empty":`投影中還沒有相容性判定。`,"lab.subjectKind":`類型`,"lab.observationCount":`觀察數`,"lab.eventCount":`事件數`,"lab.verdictCount":`判定數`,"lab.subjectCount":`主體數`,"lab.builtAt":`建立於`,"lab.loading":`載入相容性證據中…`,"lab.loadMore":`載入更多`,"lab.detailTitle":`判定詳細資料`,"lab.detailClose":`關閉`,"lab.detailSubject":`主體`,"lab.detailObservations":`觀察數`,"lab.detailEvents":`貢獻事件`,"lab.detailArtifacts":`產物中繼資料`,"lab.production.title":`觀測到的正式環境流量`,"lab.production.notVerification":`不是實驗室驗證`,"lab.production.attempts":`嘗試`,"lab.production.successes":`成功`,"lab.production.routeErrors":`路由錯誤`,"lab.production.lastObserved":`最近觀測`,"lab.detailLoadFailed":`無法載入判定詳細資料`,"lab.refresh":`重新整理`,"lab.verdict.UNKNOWN":`未知`,"lab.verdict.CLAIMED":`已宣稱`,"lab.verdict.PROBED":`已探測`,"lab.verdict.VERIFIED":`已驗證`,"lab.verdict.DEGRADED":`已降級`,"lab.verdict.BLOCKED":`已封鎖`,"lab.verdict.UNSUPPORTED":`不支援`,"lab.layer.protocol_conformance":`協定符合度`,"lab.layer.live_route_compatibility":`即時路由相容性`,"lab.layer.task_effectiveness":`任務效能`,"dash.visionAdvanced":`進階設定`,"dash.visionMaxDescriptions":`每回合最大描述次數`,"dash.visionMaxDescriptionsInvalid":`請輸入正整數。`,"dash.visionTimeout":`逾時`,"dash.visionTimeoutInvalid":`請輸入 {min} 到 {max} 毫秒之間的整數。`,"dash.visionAdvancedPopover":`進階視覺設定`,"sub.routedDelegationBridge":`路由 V2 委派橋接`,"sub.routedDelegationBridgeHint":`實驗性功能。啟用期間,建立、傳送和後續訊息皆為明文,包括原生代理之間的委派。Codex 仍可能顯示原始模型;路由內容和隱私依所選提供者而定。`,"sub.routedDelegationBridgeInactive":`已就緒;僅會為符合資格的原生 V2 根任務啟用。`,"sub.routedDelegationBridgeSaveFail":`無法儲存路由 V2 委派橋接`,"sub.routedDelegationBridgeSaved":`已儲存路由 V2 委派橋接。停用會立即生效。`,"models.newPolicyGlobal":`新模型預設停用`,"models.newPolicyProvider":`新模型策略`,"models.newPolicy_inherit":`繼承`,"models.newPolicy_off":`關閉`,"models.newPolicy_on":`開啟`,"models.newBadge":`新增`,"models.newCount":`{count} 個新增,已關閉`,"models.aliases":`別名`,"models.aliasesTable":`別名表`,"models.aliasPrompt":`供應商別名(留空即清除)`,"models.modelAliasPrompt":`模型別名(留空即清除)`,"models.aliasSaved":`別名已儲存`,"models.aliasConflict":`此別名與現有名稱衝突`,"models.editProviderAlias":`編輯供應商別名`,"models.editModelAlias":`編輯模型別名`,"models.useDefaultAliases":`使用預設別名`,"models.useDefaultAliasesGlobal":`全域使用預設別名`,"models.aliasAuto":`自動`,"models.aliasUser":`使用者`,"models.aliasStale":`過期`},b={"nav.dashboard":`Дашборд`,"uptime.day":`д`,"uptime.hour":`ч`,"uptime.minute":`мин`,"uptime.second":`с`,"nav.startup":`Безопасность запуска`,"nav.providers":`Провайдеры`,"nav.models":`Модели`,"nav.combos":`Комбо`,"nav.subagents":`Подагенты`,"routing.title":`Интеллект маршрутизации (beta)`,"routing.subtitle":`Политики маршрутизации, пробная оценка и аналитика на основе источников.`,"routing.loadFailed":`Не удалось загрузить данные маршрутизации`,"routing.empty":"Профили маршрутизации не настроены. Добавьте `routingProfiles` в config.json.","routing.revision":`rev`,"routing.detail":`Профиль`,"routing.createProfile":`Создать профиль`,"routing.dryRunError":`Ошибка пробного запуска (HTTP {status})`,"routing.removeConfirm":`Удалить профиль {id}?`,"routing.unknownEvidence.allow":`разрешить`,"routing.unknownEvidence.penalize":`штрафовать`,"routing.unknownEvidence.exclude":`исключить`,"routing.removeCandidate":`Удалить кандидата {provider}/{model}`,"routing.candidates":`Кандидаты`,"routing.require":`Жёсткие требования`,"routing.optimize":`Веса оптимизации`,"routing.limits":`Лимиты`,"routing.unknownEvidence":`Политика неизвестных данных`,"routing.compatibility.title":`Политика совместимости`,"routing.compatibility.enabled":`Требовать доказательства Compatibility Lab`,"routing.compatibility.requiredSuites":`Обязательные наборы`,"routing.compatibility.loadingCatalog":`Загрузка каталога Lab…`,"routing.compatibility.catalogUnavailable":`Каталог Lab недоступен — укажите id наборов вручную в config.json.`,"routing.compatibility.layer.protocol_conformance":`Соответствие протоколу`,"routing.compatibility.layer.live_route_compatibility":`Совместимость живого маршрута`,"routing.compatibility.minStatus":`Минимальный статус совместимости`,"routing.none":`нет`,"routing.unavailable":`–`,"routing.dryRun":`Пробная оценка`,"routing.dryRunContext":`Контекстное окно запроса (токены)`,"routing.dryRunTools":`Запрос требует инструменты`,"routing.dryRunImage":`Запрос требует изображения`,"routing.dryRunStructured":`Запрос требует структурированный вывод`,"routing.dryRunRun":`Оценить кандидатов`,"routing.candidate":`Кандидат`,"routing.eligible":`Допустим`,"routing.exclusions":`Исключения`,"routing.costCap":`Лимит стоимости`,"routing.capOutcome.satisfied":`в пределах лимита`,"routing.capOutcome.exceeded":`сверх лимита`,"routing.capOutcome.unknown-allowed":`неизвестно (разрешено)`,"routing.capOutcome.unknown-excluded":`неизвестно (исключено)`,"routing.exclusion.capability-unsatisfied":`требование не выполнено`,"routing.exclusion.unknown-capability":`неизвестная возможность`,"routing.exclusion.cost-limit":`сверх лимита стоимости`,"routing.exclusion.cost-limit-unknown":`неизвестная стоимость при лимите`,"routing.exclusion.cooldown":`пауза`,"routing.exclusion.unknown-health":`неизвестное состояние`,"routing.exclusion.unknown-quota":`неизвестная квота`,"routing.exclusion.unknown-price":`неизвестная цена`,"routing.exclusion.other":`исключение: {code}`,"routing.score":`Оценка`,"routing.selected":`выбран`,"routing.yes":`да`,"routing.no":`нет`,"routing.analytics":`Аналитика маршрутизации`,"routing.analyticsTotal":`Запросы`,"routing.analyticsSuccessRate":`Успех`,"routing.analyticsFallbackRate":`Фолбэк`,"routing.analyticsP50":`p50`,"routing.analyticsP95":`p95`,"routing.analyticsP99":`p99`,"routing.analyticsCooldown":`Сбои кулдауна`,"routing.analyticsConfidence":`Доверие`,"routing.analyticsTruncated":`усечённая история`,"routing.analyticsRequests":`Запросы`,"routing.analyticsEmpty":`Аналитики пока нет — сначала отправьте несколько запросов.`,"nav.logs":`Логи и отладка`,"nav.usage":`Использование`,"common.github":`GitHub`,"sidebar.star":`Поставить звезду на GitHub`,"sidebar.starred":`Звезда на GitHub поставлена`,"sidebar.starUnauthenticated":`Открыть GitHub, чтобы поставить звезду (gh CLI не выполнил вход)`,"sidebar.starFailed":`Не удалось поставить звезду через gh. Открываем GitHub.`,"sidebar.updateAvailable":`Доступно обновление: {version}`,"sidebar.checkUpdate":`Проверить обновления`,"common.save":`Сохранить`,"common.saving":`Сохранение…`,"common.cancel":`Отмена`,"common.discard":`Отбросить`,"common.delete":`Удалить`,"common.close":`Закрыть`,"common.ok":`ОК`,"common.remove":`Удалить`,"common.loading":`Загрузка…`,"common.retry":`Повторить`,"auth.adminTokenTitle":`Токен администратора OpenCodex (OPENCODEX_ADMIN_AUTH_TOKEN)`,"auth.adminAccountLabel":`Учётная запись`,"auth.adminTokenFieldLabel":`Токен администратора`,"auth.adminTokenRejected":`Токен администратора отклонён. Проверьте его и повторите попытку.`,"auth.adminTokenUnavailable":`Не удалось проверить токен администратора. Повторите попытку.`,"app.logoAria":`Логотип opencodex`,"app.pageTitle":`{page} — opencodex`,"app.claudeOn":`Claude ВКЛ`,"app.claudeOff":`Claude ВЫКЛ`,"theme.label":`Тема`,"theme.light":`Светлая`,"theme.dark":`Тёмная`,"theme.system":`Системная`,"lang.label":`Язык`,"lang.nativeName":`Русский`,"provider.name.commandCodeAuth":`Command Code - Auth`,"provider.name.commandCodeApi":`Command Code - API`,"provider.name.volcengine":`Volcengine Ark`,"provider.name.volcengineCodingPlan":`Volcengine Ark — тариф Coding`,"provider.name.volcengineAgentPlan":`Volcengine Ark — тариф Agent`,"errorBoundary.title":`Не удалось загрузить страницу`,"errorBoundary.message":`При отображении этого раздела произошла ошибка. Перезагрузите его, чтобы повторить попытку.`,"errorBoundary.details":`Ошибка`,"errorBoundary.reload":`Перезагрузить`,"startup.title":`Безопасность запуска`,"startup.subtitle":`Проверьте, сможет ли Codex подключиться к opencodex после перезагрузки, прежде чем локальный прокси вызовет бесконечное переподключение.`,"startup.refresh":`Обновить`,"startup.backToDashboard":`Назад к панели`,"startup.loading":`Проверка защиты запуска…`,"startup.error":`Не удалось прочитать состояние защиты запуска.`,"startup.staleData":`Последняя проверка не удалась. Значения ниже устарели и не подтверждают защиту.`,"startup.status.native":`Нативная маршрутизация`,"startup.status.protected":`Перезапуск защищён`,"startup.status.atRisk":`Требуется действие`,"startup.summary.native":`Codex не зависит от локального прокси`,"startup.summary.protected":`opencodex будет доступен после перезагрузки`,"startup.summary.atRisk":`После перезагрузки Codex может потерять доступ к моделям`,"startup.riskDetail":`Codex направлен на локальный прокси, но постоянная служба или исправный launcher shim не запустят его снова.`,"startup.riskDetailCustomLocal":`Codex направлен на пользовательский локальный шлюз. opencodex не может управлять или проверять его перезапуск.`,"startup.riskDetailWindowsShim":`Launcher shim защищает поддерживаемые CLI-скрипты, но Codex Desktop и прямой запуск codex.exe в Windows могут обходить его.`,"startup.safeDetail":`Маршрутизация и механизм запуска согласованы. После перезагрузки ручной запуск ocx start не требуется.`,"startup.routing":`Маршрутизация Codex`,"startup.routing.proxy":`Локальный прокси`,"startup.routing.native":`Нативный OpenAI`,"startup.routing.customLocal":`Пользовательский локальный шлюз`,"startup.routing.customRemote":`Пользовательский удалённый шлюз`,"startup.routing.unknown":`Неизвестная или недопустимая маршрутизация`,"startup.restartProtection":`Защита перезапуска`,"startup.preference":`Запуск по требованию`,"startup.enabled":`Включён`,"startup.disabled":`Выключен`,"startup.protection.service":`Фоновая служба`,"startup.protection.shim":`Launcher shim`,"startup.protection.none":`Не установлен`,"startup.details":`Сведения о защите`,"startup.service":`Фоновая служба`,"startup.serviceHint":`Запускается при входе и перезапускает прокси после сбоя.`,"startup.installed":`Установлена`,"startup.notInstalled":`Не установлена`,"startup.unsupported":`Не поддерживается`,"startup.shim":`Codex launcher shim`,"startup.shimHint":`Запускает ocx ensure при запуске поддерживаемого скриптового лаунчера Codex.`,"startup.healthy":`Исправен`,"startup.cliOnly":`Только CLI`,"startup.stale":`Устарел`,"startup.viable":`Готов`,"startup.unhealthy":`Установлен, но неисправен`,"startup.conflict":`Конфликт служб`,"startup.installedDisabled":`Установлен, но отключён`,"startup.install":`Установить`,"startup.installing":`Установка…`,"startup.repair":`Исправить`,"startup.repairing":`Исправление…`,"startup.serviceInstalled":`Фоновая служба успешно установлена.`,"startup.serviceRepaired":`Фоновая служба успешно исправлена.`,"startup.shimInstalled":`Launcher shim Codex успешно установлен.`,"startup.shimRepaired":`Launcher shim Codex успешно исправлен.`,"startup.installFailed":`Не удалось установить:`,"startup.tray.title":`Системный трей Windows`,"startup.tray.hint":`Запускает значок при входе для управления запуском, остановкой, перезапуском, панелью и состоянием прокси.`,"startup.tray.login":`Запускать трей при входе в Windows`,"startup.tray.notProtection":`Трей — это контроллер, а не защита перезапуска. Для автоматического восстановления по-прежнему нужна исправная фоновая служба.`,"startup.tray.running":`Работает`,"startup.tray.stopped":`Установлен, скрыт`,"startup.tray.stale":`Требуется ремонт`,"startup.tray.notInstalled":`Не установлен`,"startup.tray.loading":`Проверка…`,"startup.tray.unavailable":`Статус недоступен`,"startup.tray.install":`Установить и показать трей`,"startup.tray.start":`Показать значок`,"startup.tray.stop":`Закрыть значок`,"startup.tray.uninstall":`Удалить трей входа`,"startup.tray.error":`Действие Windows tray завершилось ошибкой. Подробности: ocx tray status.`,"startup.recovery":`Варианты исправления`,"startup.recoveryHint":`Используйте установку в один клик выше или скопируйте команду для ручного восстановления. Для Codex Desktop и Windows рекомендуется фоновая служба.`,"startup.command.service":`Рекомендуется: постоянная фоновая служба`,"startup.command.shim":`Альтернатива: CLI launcher shim`,"startup.command.native":`Безопасный режим: восстановить нативную маршрутизацию Codex`,"startup.copy":`Копировать`,"startup.copied":`Скопировано`,"startup.recommended":`Рекомендуемое исправление: {cmd}`,"startup.navRisk":`Защита запуска требует внимания`,"startup.codexRuntime.clampHidden":`Некоторые уровни рассуждений скрыты, потому что OpenCodex использует Codex {version}.`,"startup.codexRuntime.clampHiddenWithEfforts":`Некоторые уровни рассуждений скрыты, потому что OpenCodex использует Codex {version} (удалены: {efforts}).`,"startup.codexRuntime.olderBinary":`OpenCodex использует более старый бинарник Codex ({version}). Доступна более новая установка.`,"dash.subtitle":`Актуальное состояние локального прокси opencodex, его провайдеров и моделей, маршрутизируемых в Codex.`,"dash.workspace.overview":`Обзор`,"dash.workspace.sections":`Разделы`,"dash.status":`Статус`,"dash.online":`В сети`,"dash.offline":`Не в сети`,"dash.version":`Версия`,"dash.uptime":`Время работы`,"dash.providers":`Провайдеры`,"dash.tokens30d":`Токены (30 дн.)`,"dash.activity.title":`Активность за 30 дней`,"dash.activity.requests":`Запросы`,"dash.activity.tokens":`Токены`,"dash.activity.chartLabel":`Активность за 30 дней. Стрелки влево и вправо выбирают день; Home и End переходят к границам диапазона.`,"dash.activity.viewUsage":`Открыть статистику`,"dash.coverage":`{pct} покрытия`,"dash.mem.title":`Наблюдение за памятью`,"dash.mem.hint":`Диагностика среды выполнения только для чтения. Наблюдаемая память — max(RSS, external, ArrayBuffers), чтобы trimming рабочего набора Windows не скрывал удержанную память.`,"dash.mem.rss":`Резидентная память (RSS)`,"dash.mem.jsHeap":`Куча JS занято`,"dash.mem.jsHeapArena":`арена {total}`,"dash.mem.pressure":`Относительно порога`,"dash.mem.pressureOf":`{pct}% от порога`,"dash.mem.pressureUnknown":`Порог не сообщён`,"dash.mem.jscHeap":`Куча JSC`,"dash.mem.external":`External`,"dash.mem.arrayBuffers":`ArrayBuffers`,"dash.mem.observed":`Наблюдаемая`,"dash.mem.runtime":`Счётчики среды`,"dash.mem.growth":`Изменение наблюдаемой / час`,"dash.mem.perHour":`/ч`,"dash.mem.store":`Хранилище продолжений`,"dash.mem.storeHint":`Кэш прокси previous_response_id. Рост общего числа байт при растущей куче указывает на удержание диалогов, а не на аллокатор среды.`,"dash.mem.storeEntries":`Записи`,"dash.mem.storeTotal":`Всего`,"dash.mem.storeLargest":`Наибольшая`,"dash.mem.storeOldest":`Старейшая`,"dash.mem.threshold":`Порог предупреждения`,"dash.mem.lastWarn":`Последнее предупреждение`,"dash.mem.never":`Никогда`,"dash.mem.details":`Подробности`,"dash.mem.unavailable":`Диагностика памяти недоступна (старая версия прокси).`,"dash.mem.inFlight":`Активные запросы`,"dash.mem.restart":`Дождаться и перезапустить`,"dash.mem.restartConfirm":`Дождаться завершения {count} активных запросов, затем перезапустить (до {seconds} с; оставшиеся при таймауте прервутся).`,"dash.mem.draining":`Ожидание {count} запрос(ов)… перезапуск после завершения`,"dash.mem.reconnecting":`Прокси перезапускается… ожидание подключения`,"dash.connectionReconnecting":`Соединение прервано — повторное подключение…`,"dash.mem.restartFailed":`Не удалось дождаться и перезапустить. Проверьте, что прокси запущен.`,"dash.mem.restartNoSupervisor":`Защита перезапуска не обнаружена. После перезапуска прокси может остаться выключенным, пока вы не запустите его снова.`,"dash.activeProviders":`Активные провайдеры`,"dash.noProviders":`Провайдеры не настроены. Выполните {cmd}.`,"dash.col.name":`Название`,"dash.col.adapter":`Адаптер`,"dash.col.baseUrl":`Базовый URL`,"dash.col.model":`Модель`,"dash.modelsNoResults":`Нет моделей, соответствующих поиску.`,"dash.availableModels":`Доступные модели`,"dash.noModels":`Модели не найдены. Проверьте API-ключи провайдеров.`,"dash.cannotConnect":`Не удаётся подключиться к прокси. Он запущен?`,"dash.runStart":`Выполните {cmd}, чтобы запустить прокси.`,"dash.stop":`Остановить прокси`,"dash.stopConfirm":`Остановить прокси и восстановить нативный Codex?`,"dash.stopFailed":`Не удалось остановить прокси (HTTP {status}).`,"dash.maSwitchFailed":`Не удалось переключить режим (HTTP {status}).`,"dash.maNetworkError":`Ошибка сети — прокси запущен?`,"dash.stopping":`Остановка…`,"dash.actions":`Прокси`,"dash.codexRestart":`Обновить список моделей Codex`,"dash.codexRestarting":`Останавливается…`,"dash.codexRestartConfirm":`Остановить app-server'ы Codex, чтобы они перечитали список моделей? Текущий ход Codex будет прерван, и Codex не перезапустится сам — откройте его заново.`,"dash.codexRestartDone":`Остановлено app-server Codex: {count}. Откройте Codex заново, чтобы загрузить актуальный список моделей.`,"dash.codexRestartNothing":`Ни один app-server Codex не запущен. При следующем запуске будет прочитан актуальный список моделей.`,"dash.codexRestartUnknown":`Не удалось получить список процессов, поэтому ничего не остановлено.`,"dash.codexRestartPartial":`app-server не завершились: {count}. Остановите их вручную, если список моделей остаётся устаревшим.`,"dash.codexRestartFailed":`Не удалось обновить список моделей Codex (HTTP {status}).`,"dash.codexRestartUnreachable":`Не удалось связаться с прокси.`,"dash.codexRestartMalformed":`Прокси вернул неожиданный ответ.`,"dash.codexRestartTimeout":`Прокси не ответил вовремя. Возможно, он всё ещё останавливает app-server'ы.`,"models.staleBanner":`Codex показывает список моделей старее этого каталога. Перезапустите Codex, чтобы перечитать его.`,"dash.codexAutoStart":`Запускать opencodex вместе с Codex`,"dash.codexAutoStartHint":`Разрешает установленному launcher shim выполнять ocx ensure. Эта настройка не устанавливает защиту перезапуска; проверьте фактическое состояние в разделе безопасности запуска.`,"dash.searchModel":`Модель сайдкара поиска`,"dash.searchModelHint":`Модель, используемая для web_search на маршрутизируемых моделях, отличных от OpenAI. Требуется вход в аккаунт ChatGPT.`,"dash.searchReasoning":`Уровень рассуждений для поиска`,"dash.visionModel":`Модель сайдкара для изображений`,"dash.visionModelHint":`Модель, которая описывает изображения для маршрутизируемых моделей, работающих только с текстом. Требуется вход в аккаунт ChatGPT.`,"dash.webSearchSidecar":`Сайдкар веб-поиска`,"dash.webSearchSidecarHint":`Выберите бэкенд и модель, используемые для веб-поиска на маршрутизируемых моделях.`,"dash.webSearchStream":`Стримить ответы вживую`,"dash.webSearchStreamHint":`Транслировать начальный текст и рассуждения вживую, пока модель не решит вызвать инструмент; остальное буферизуется для перехвата поиска. Текст до поиска может частично повторяться.`,"dash.visionSidecar":`Сайдкар для изображений`,"dash.visionSidecarHint":`Выберите бэкенд и модель, которые описывают изображения для маршрутизируемых моделей, работающих только с текстом.`,"dash.visionOff":`Выкл`,"dash.shadowCallIntercept":`Перехват теневых вызовов`,"dash.shadowCallInterceptHint":`Перехватывает фоновые служебные вызовы Codex App ({models}: генерация заголовков, сообщений коммитов) и перенаправляет их на выбранную вами модель. Уровень рассуждений жёстко задан как low.`,"dash.shadowCallWarning":`⚠ Когда функция включена, ВСЕ запросы к {models} будут заменены выбранной моделью.`,"dash.shadowCallOriginal":`Оригинал`,"dash.shadowCallModel":`Модель-замена`,"dash.shadowCallTooltip":`Codex App в фоновом режиме вызывает служебную модель для генерации заголовков тредов, сообщений коммитов и оркестрации навыков. Эта модель менялась между версиями клиента, поэтому opencodex перехватывает весь набор: {models}. Включите функцию, чтобы перенаправлять такие вызовы на выбранную вами модель.`,"models.shadowCallIntercept":`Перехват теневых вызовов`,"models.shadowCallInterceptHint":`Перехватывает фоновые служебные вызовы Codex App ({models}: заголовки, сообщения коммитов) и перенаправляет их на выбранную вами модель.`,"dash.sidecarBackend":`Бэкенд`,"dash.sidecarModel":`Модель`,"dash.backendAuto":`Авто`,"dash.backendOpenAI":`OpenAI`,"dash.backendAnthropic":`Anthropic`,"dash.sidecarSaved":`Настройки сайдкара сохранены. Вступят в силу со следующего запроса.`,"dash.sidecarSaveFailed":`Не удалось сохранить настройки сайдкара.`,"dash.injectionLabel":`Делегирование подагентам`,"dash.injectionHint":`Выберите модель, которой Codex будет передавать работу подагентов. Где применяется этот выбор, решают два переключателя ниже.`,"dash.syncCodexSubagentDefaults":`Сохранить и как значение по умолчанию в Codex`,"dash.syncCodexSubagentDefaultsHint":`Если включено, выбранная выше модель записывается в собственную конфигурацию Codex, и новые задачи тоже начинаются с неё. Если выключено, выбор запоминается только здесь. Применится при следующей синхронизации или перезапуске, а ваши настройки [agents] останутся нетронутыми.`,"dash.multiAgentGuidance":`Подсказывать, как делить работу`,"dash.multiAgentGuidanceHint":`Отправляет Codex короткую записку о том, как передавать работу подагентам. На v2 она называет доступные модели и предпочтительную; на v1 работает только при усилии рассуждения max или ultra. Если выключено, записка не добавляется.`,"dash.injectionNone":`Нет`,"dash.injectionEffortLabel":`Уровень рассуждений`,"dash.injectionEffortNone":`По умолчанию для модели`,"dash.effortCapLabel":`Лимит рассуждений V2 ultra`,"dash.subagentEffortCapLabel":`Лимит рассуждений подагентов V2`,"dash.effortCapHelp":`Ограничивает уровень рассуждений для ходов V2 в режиме ultra. Когда лимит задан, входящие запросы с максимальным уровнем рассуждений (из режима ultra) снижаются до выбранного уровня. Лимит для подагентов действует только на порождённые дочерние агенты. Лимиты только понижают уровень рассуждений и никогда не повышают его. Если модель не поддерживает заданный лимитом уровень, он снижается до ближайшего поддерживаемого.`,"dash.effortCapNone":`Без лимита`,"dash.maintenance":`Обслуживание`,"dash.maintenanceHint":`Обновите каталог моделей Codex или установите более новую версию opencodex.`,"dash.syncModels":`Синхронизировать модели`,"dash.syncing":`Синхронизация…`,"dash.syncOk":`Синхронизация завершена. Добавлено моделей: {count}.`,"dash.syncStaleHint":`Если Codex всё ещё показывает старый список, перезапустите долгоживущий app-server ({cmd}).`,"dash.syncFailed":`Ошибка синхронизации: {error}`,"dash.projectConfigTitle":`Конфигурация Codex в проекте обходит OpenCodex`,"dash.projectConfigHint":`Эти локальные настройки репозитория переопределяют прокси OpenCodex (например, направляют запросы напрямую в OpenCode Go). Удалите их, чтобы в этом проекте действовала маршрутизация из ~/.codex/config.toml.`,"dash.checkUpdate":`Проверить обновления`,"dash.updateTitle":`Обновление opencodex`,"dash.updateDesc":`Проверьте npm для выбранного канала, затем решите, перезапускать ли прокси после установки.`,"dash.updateChannel":`Канал`,"dash.updateChecking":`Проверка обновлений…`,"dash.updateInstalled":`Установлена`,"dash.updateLatest":`Последняя`,"dash.updateAvailable":`Доступно обновление`,"dash.updateCurrent":`Актуальная версия`,"dash.updateCommand":`Команда`,"dash.updateSource":`Это рабочая копия из исходного кода. Обновите её в терминале с помощью показанной команды.`,"dash.updateUnavailable":`Не удалось получить сведения о последней версии из npm. Попробуйте позже.`,"dash.updateRetry":`Повторить`,"dash.updateRecheck":`Проверить снова`,"dash.updateCannotAuto":`Обновление в один клик недоступно ({reason}).`,"dash.updateReason.source_checkout":`установка из исходного кода`,"dash.updateReason.latest_unavailable":`реестр npm недоступен`,"dash.updateReason.already_latest":`уже установлена последняя версия`,"dash.updateReason.unknown":`обновление недоступно`,"dash.updateRestart":`Перезапустить после обновления`,"dash.updateRestartHint":`Рекомендуется. Текущий GUI продолжает работать на старом коде, пока прокси не перезапустится.`,"dash.runUpdate":`Обновить`,"dash.updateReconnecting":`Ожидание перезапущенного прокси…`,"dash.updateStatus.running":`Обновление opencodex.`,"dash.updateStatus.restarting":`Обновление установлено. Перезапуск прокси.`,"dash.updateStatus.succeeded":`Обновление завершено.`,"dash.updateVersionTransition":`{currentVersion} -> {latestVersion}.`,"dash.updateStatus.failed":`Обновление не удалось.`,"prov.subtitle":`Настройте вышестоящих провайдеров, которых opencodex маршрутизирует в Codex. Войдите в аккаунт, добавьте провайдера или отредактируйте конфигурацию вручную.`,"prov.add":`Добавить провайдера`,"prov.editJson":`Редактировать JSON`,"prov.accountLogin":`Вход в аккаунт`,"prov.noOauth":`Нет доступных OAuth-провайдеров.`,"prov.loggedIn":`вход выполнен`,"prov.notLoggedIn":`вход не выполнен`,"prov.logout":`Выйти`,"prov.login":`Войти`,"prov.loginWith":`Войти через {provider}`,"prov.waitingBrowser":`Ожидание браузера…`,"prov.didntOpen":`Не открылось? Нажмите здесь`,"prov.copyLink":`Копировать ссылку`,"prov.dontOpenBrowser":`Не открывать браузер на машине с прокси`,"prov.dontOpenBrowserHint":`Полезно для другого профиля браузера или когда панель управления не на машине с прокси.`,"prov.linkCopied":`Скопировано`,"prov.linkCopyUnavailable":`Буфер обмена недоступен`,"prov.deviceCode":`Код устройства`,"prov.copyCode":`Копировать код`,"prov.codeCopied":`Код скопирован`,"prov.editAlias":`Изменить псевдоним`,"prov.aliasPrompt":`Отображаемое имя (оставьте пустым для удаления)`,"prov.aliasSaved":`Псевдоним сохранен`,"prov.aliasSaveFailed":`Не удалось сохранить псевдоним`,"prov.cooldownCleared":`Пауза сброшена`,"prov.cooldownClearFailed":`Не удалось сбросить паузу`,"prov.accountId":`ID`,"prov.pasteRedirect":`Вставьте URL перенаправления или код`,"prov.pasteRedirectHint":`Если браузер показывает ошибку localhost, скопируйте полный URL из его адресной строки и вставьте сюда (или вставьте код авторизации).`,"prov.pasteSubmit":`Отправить`,"prov.pasteSubmitting":`Отправка…`,"prov.pasteOk":`Код отправлен — завершаем вход…`,"prov.pasteFail":`Не удалось отправить код: {error}`,"prov.port":`Порт`,"prov.default":`По умолчанию`,"prov.loadingConfig":`Загрузка…`,"prov.saved":`Сохранено! Перезапустите прокси, чтобы применить изменения.`,"prov.loadConfigFail":`Не удалось загрузить конфигурацию`,"prov.invalidJson":`Некорректный JSON`,"prov.saveFailed":`Не удалось сохранить`,"prov.loginFailStart":`Не удалось начать вход в {provider}`,"prov.loginError":`Ошибка входа в {provider}: {error}`,"prov.loginRequestFail":`Не удалось выполнить запрос на вход в {provider}`,"prov.loginCancelled":`Вход в {provider} отменён`,"prov.loginTimeout":`Время ожидания входа в {provider} истекло — браузер был закрыт или вход не был завершён. Попробуйте ещё раз.`,"prov.loginOk":`Выполнен вход в {provider}. Выполните {cmd} (или изменения применятся на лету), чтобы его модели появились в списке.`,"prov.loginSameAccount":`Это всё ещё тот же аккаунт {provider} — переключите аккаунт в браузере и снова нажмите «Добавить аккаунт».`,"oauthTos.highTitle":`{provider}: риск OAuth по подписке`,"oauthTos.elevatedTitle":`{provider}: неофициальный OAuth-мост`,"oauthTos.anthropicBody":`Прямое повторное использование OAuth-токенов подписки Claude через сторонний прокси, такой как OpenCodex, не является поддерживаемой интеграцией Anthropic и может привести к ограничению доступа. Поддерживаемые интеграции Agent SDK, использующие подписки Claude, — это отдельный механизм.`,"oauthTos.highBody":`OpenCodex подключает {provider} через сторонний механизм OAuth. Неподдерживаемое использование может привести к ограничению или приостановке доступа.`,"oauthTos.elevatedBody":`OpenCodex подключает {provider} через неофициальный механизм OAuth. По возможности используйте официальный клиент; нетипичный или автоматизированный трафик может быть расценён как злоупотребление, и доступ может быть ограничен или приостановлен.`,"oauthTos.saferPath":`Более безопасный вариант: вместо этого настройте API-ключ в OpenCodex.`,"oauthTos.acknowledge":`Я понимаю риск и всё равно хочу продолжить с OAuth.`,"oauthTos.continue":`Продолжить с OAuth`,"prov.logoutOk":`Выполнен выход из {provider}.`,"prov.logoutFail":`Не удалось выйти из {provider}. Состояние аккаунта не изменилось.`,"prov.removed":`Провайдер "{name}" удалён.`,"prov.removedDefault":`Провайдер "{name}" удалён. Провайдером по умолчанию теперь является "{defaultProvider}".`,"prov.removeFail":`Не удалось удалить "{name}".`,"prov.removeLastProvider":`Нельзя удалить этого провайдера, если ни один другой включённый провайдер не может стать провайдером по умолчанию.`,"prov.removeHasDependentCombos":`Сначала удалите или обновите зависимые комбо: {combos}.`,"prov.setDefault":`Сделать основным`,"prov.setDefaultSuccess":`"{name}" теперь провайдер по умолчанию.`,"prov.setDefaultFail":`Не удалось сделать "{name}" провайдером по умолчанию.`,"prov.defaultDisabled":`Сначала включите этого провайдера, затем сделайте его основным.`,"prov.updateFail":`Не удалось обновить этого провайдера.`,"prov.networkError":`Ошибка сети. Проверьте, что прокси запущен, и повторите попытку.`,"prov.added":`Провайдер "{name}" добавлен. Уже активен — выполните {cmd} (или перезапустите), чтобы его модели появились в селекторе моделей Codex.`,"prov.removeConfirm":`Удалить провайдера "{name}"? Его модели исчезнут из селектора моделей Codex.`,"prov.hasApiKey":`API-ключ настроен`,"prov.hasHeaders":`настроены пользовательские заголовки`,"prov.accounts":`Аккаунты ({n})`,"prov.accountsAria":`Показать или скрыть аккаунты {name}`,"prov.accountActive":`Активен`,"prov.accountReauth":`Повторный вход`,"prov.reauthenticate":`Переавторизоваться`,"prov.reauthAccountMissing":`Выбранный аккаунт не найден после входа`,"prov.reauthIdentityMismatch":`Аккаунт, в который выполнен вход, не совпадает с выбранным`,"prov.accountAdd":`Добавить аккаунт`,"prov.accountNoLabel":`аккаунт {id}`,"prov.accountSwitchTitle":`Использовать этот аккаунт`,"prov.accountSwitched":`Переключено на {email}.`,"prov.accountSwitchFail":`Не удалось переключить аккаунт`,"prov.accountRemoved":`Аккаунт {email} удалён.`,"prov.accountRemoveFail":`Не удалось удалить {email}. Аккаунт не изменён.`,"prov.accountRemoveAria":`Удалить {email}`,"prov.accountRemoveConfirm":`Удалить аккаунт {email}? Данные его входа будут удалены из этого прокси.`,"prov.keyAdd":`Добавить API-ключ`,"prov.keyAdded":`API-ключ добавлен для {name}.`,"prov.keyAddFail":`Не удалось добавить API-ключ`,"prov.keyPlaceholder":`Вставьте API-ключ`,"prov.keySwitchTitle":`Использовать этот ключ`,"prov.keySwitched":`Переключено на ключ {key}.`,"prov.keySwitchFail":`Не удалось переключить ключ`,"prov.keyRemoved":`Ключ {key} удалён.`,"prov.keyRemoveAria":`Удалить ключ {key}`,"prov.keyRemoveConfirm":`Удалить API-ключ {key}? Он будет удалён из конфигурации этого прокси.`,"prov.activeBadge":`Активен`,"prov.disabledBadge":`Отключён`,"prov.defaultBadge":`По умолчанию`,"prov.enable":`Включить`,"prov.disable":`Отключить`,"prov.enabled":`Провайдер "{name}" включён. Его модели снова могут появляться в Codex.`,"prov.disabled":`Провайдер "{name}" отключён. Настройки сохранены, но его модели скрыты.`,"prov.enableFail":`Не удалось включить "{name}".`,"prov.disableFail":`Не удалось отключить "{name}".`,"prov.enableAria":`Включить провайдера {name}`,"prov.disableAria":`Отключить провайдера {name}`,"prov.defaultCannotDisable":`Провайдера по умолчанию нельзя отключить`,"prov.openaiAccountMode":`Режим аккаунта Codex`,"prov.openaiModePool":`Пул`,"prov.openaiModeDirect":`Прямой`,"prov.openaiPoolDesc":`По умолчанию. Ротация основного входа и добавленных аккаунтов с учётом привязки, квот, периодов ожидания и отказоустойчивого переключения (failover).`,"prov.openaiDirectDesc":`Используется только текущий/основной вход Codex. Сохранённые аккаунты пула не читаются и не ротируются.`,"prov.openaiModeSaved":`Режим аккаунта OpenAI изменён на {mode}.`,"prov.openaiModeSaveFailed":`Не удалось изменить режим аккаунта OpenAI.`,"prov.openaiApiDesc":`Используется API-ключ OpenAI; учётные данные аккаунта Codex никогда не используются.`,"prov.manageCodexAccounts":`Управление аккаунтами Codex`,"prov.openaiApiMissing":`Требуется API-ключ`,"prov.openaiApiSetup":`Настроить API-ключ`,"models.tab.catalog":`Модели`,"models.tab.combos":`Комбо`,"models.tab.compatibility":`Совместимость`,"models.tab.routing":`Маршрутизация (beta)`,"models.tabsLabel":`Поверхности моделей`,"models.subtitle.combos":`Упорядоченные группы моделей, отвечающие под одним id. Failover пробует цели по порядку, round-robin распределяет нагрузку.`,"models.subtitle.compatibility":`Матрица совместимости только для чтения из проекции лаборатории.`,"models.subtitle.routing":`Профили политик, оценка в режиме dry-run и аналитика маршрутизации с подтверждением источников.`,"models.subtitle":`Управляйте тем, какие модели видит Codex — нативные GPT (сквозной проброс) и модели маршрутизируемых провайдеров, сгруппированные по провайдеру (нажмите на заголовок, чтобы свернуть группу). Скрытые модели исчезают из каталога и селектора, но остаются вызываемыми по точному id. Изменения применяются на следующем ходе Codex — opencodex сбрасывает 5-минутный кэш моделей Codex, поэтому перезапуск не требуется.`,"models.nativeGroupLabel":`Нативные OpenAI`,"models.nativeHint":"Модели сквозного проброса используют режим аккаунта (пул или прямое подключение), выбранный на странице «Провайдеры». Отключение модели скрывает её из селектора Codex (запись в каталоге сохраняется, поэтому при повторном включении она восстанавливается в точности). Добавление модели здесь регистрирует маршрутизируемый селектор `openai/<model>`, а не новый «голый» passthrough-идентификатор.","models.active":`{active}/{total} видимо`,"models.workspace.providers":`Провайдеры`,"models.workspace.allProviders":`Все провайдеры`,"models.workspace.mainAria":`Сведения о моделях`,"models.allOn":`Все вкл.`,"models.allOff":`Все выкл.`,"models.presetLabel":`Модели`,"models.presetMode_preset":`Пресет`,"models.presetMode_all":`Все`,"models.presetMode_custom":`Свои`,"models.presetSummary":`Показано {count} из {total} — базовый пресет v{version}`,"models.presetUpdateAvailable":`Доступен пресет v{version}`,"models.presetAppliedToast":`{provider}: пресет применён — выбрано моделей: {count}`,"models.presetClearedToast":`{provider}: показаны все модели`,"models.presetEmpty":`{provider}: пресет не совпал ни с одной моделью — выбор не изменён`,"models.presetConfirmReplace":`Заменить ваш выбор пресетом из {count} моделей?`,"models.cap350k":`Лимит 350k`,"models.capApplied":`Лимит контекста применён — вступит в силу на следующем ходе Codex.`,"models.capSaveFailed":`Не удалось сохранить лимит контекста`,"models.contextCapped":`Лимит 350k`,"models.contextCapLabel":`Предохранительный лимит / запасной`,"models.v2Label":`Подагент`,"models.shadowCallOriginal":`⚠ {models} →`,"models.v2DocsLink":`Что такое v1 / v2?`,"models.v2Mode_v1":`v1`,"models.v2Mode_default":`base`,"models.v2Mode_v2":`v2`,"models.v2ModeDesc_v1":`Все модели → поверхность v1`,"models.v2ModeDesc_default":`Вышестоящие значения по умолчанию (sol/terra=v2, luna=v1)`,"models.v2ModeDesc_v2":`Все модели → поверхность v2`,"models.keepNativeOnV1":`Оставить ChatGPT на v1`,"models.keepNativeOnV1Hint":`Нативные родители ChatGPT шифруют дочерние задачи v2 — Grok и Claude их не читают. Оставьте включённым, если Sol/Terra должны порождать routed-модели. Routed-родители остаются на v2.`,"models.v2Help":`Управляет мультиагентной поверхностью для всех моделей.
50
+
51
+ v1: Классический однопоточный агент. Каждая модель использует поверхность взаимодействия v1.
52
+ base: Вышестоящие значения по умолчанию — sol/terra используют v2, luna использует v1, остальные следуют функциональному флагу codex.
53
+ v2: Многопоточный агент со spawn_agent. Каждая модель использует поверхность взаимодействия v2.
54
+
55
+ На v2 «Оставить ChatGPT на v1» оставляет Sol/Terra на v1, чтобы они могли порождать Grok или Claude. ChatGPT шифрует дочерние задачи v2 — routed-модели их не читают. Routed-родители остаются на v2.
56
+
57
+ Изменения применяются к новым сессиям.`,"dash.multiAgent":`Подагент`,"models.v2Conflict":`Задан [agents] max_threads — codex откажется запускаться; удалите его из config.toml`,"models.v2Applied":`Режим подагента обновлён — применяется к новым сессиям (перезапустите приложение Codex, чтобы обновить селектор моделей)`,"models.v2ThreadsLabel":`Макс. потоков`,"models.v2ThreadsDefault":`по умолчанию (4)`,"models.v2ThreadsApplied":`Лимит потоков обновлён — применяется к новым сессиям`,"models.v2ThreadsInvalid":`Лимит потоков должен быть целым числом >= 1`,"models.v2ThreadsApply":`Применить`,"models.capValue":`По умолч. {value}`,"models.contextSettings":`Пользовательские окна`,"models.contextSettingsTitle":`Пользовательские окна — {provider}`,"models.contextDefault":`Предохранительный лимит / запасной`,"models.contextModel":`Модель`,"models.contextModelOverride":`Переопределение модели`,"models.contextHint":`Оставьте пустым для автоматического определения. Значение здесь — предохранительный лимит и запасной вариант: оно заполняет отсутствующее окно и только снижает большее заявленное. Результаты live-обнаружения в это поле не записываются.`,"models.contextAutomatic":`Автоматическое определение`,"models.contextSaved":`Контекстные окна обновлены — изменения вступят в силу на следующем ходе Codex.`,"models.contextUnchanged":`Нет изменений контекстных окон для сохранения.`,"models.contextSaveFailed":`Не удалось сохранить контекстные окна`,"models.contextInvalid":`Контекстные окна должны быть положительными целыми числами`,"models.contextCappedValue":`Лимит {value}`,"models.contextMetadataSource":`Источник`,"models.contextMetadataLive":`обнаружено`,"models.contextMetadataRegistry":`реестр`,"models.contextMetadataCursorStatic":`подборка Cursor`,"models.contextMetadataSnapshot":`сохранено`,"models.contextMetadataFallback":`запасной`,"models.contextMetadataDerived":`производный`,"models.contextMetadataUnknown":`неизвестно`,"models.contextMetadataStale":`устарело`,"models.contextTooltipDetected":`{value} · обнаружено`,"models.contextTooltipCapped":`{detected} обнаружено · ограничено до {cap}`,"models.contextTooltipStale":`{value} · {when}`,"models.contextTooltipUnknown":`Контекстное окно неизвестно`,"models.contextTooltipSource":`{value} · {source}`,"models.contextLastChecked":`последняя проверка {when}`,"models.contextYesterday":`вчера`,"models.setAll":`Применить ко всем`,"models.setAllHint":`Включает окно по умолчанию {value} для всех маршрутизируемых провайдеров. Если релей не отдаёт context_window / context_length, это значение становится реальным окном Codex. Чтобы задать одну модель вручную, используйте «Пользовательские окна» в той же строке. Нативные провайдеры не затрагиваются.`,"models.collapseAll":`Свернуть все`,"models.expandAll":`Развернуть все`,"models.orderHint":`Порядок в селекторе: модели, выбранные на странице «Подагенты» (в заданном порядке) → остальные маршрутизируемые модели по алфавиту — сначала по провайдеру, затем по ID модели → нативные модели. Переключатели видимости лишь фильтруют модели и не меняют этот порядок.`,"models.custom":`Другое…`,"models.customApply":`Применить`,"models.customPlaceholder":`Токены (напр. 420000)`,"models.customAdd":`Добавить пользовательскую модель`,"models.customAddTitle":`Добавить пользовательскую модель — {provider}`,"models.customEditTitle":`Изменить пользовательскую модель — {provider}`,"models.customAdded":`Пользовательская модель добавлена`,"models.customUpdated":`Пользовательская модель обновлена`,"models.customDeleted":`Пользовательская модель удалена`,"models.customSaveFailed":`Не удалось сохранить пользовательскую модель`,"models.customSaving":`Сохранение…`,"models.customAddBtn":`Добавить`,"models.customEditBtn":`Обновить`,"models.customEditNamed":`Изменить {name}`,"models.customDeleteNamed":`Удалить {name}`,"models.customDeleteConfirm":`Удалить модель {name}?`,"models.customBadge":`Пользовательская`,"models.customSummary":`Пользовательских: {count}`,"models.customFieldModelId":`ID модели (slug эндпоинта)`,"models.customFieldModelIdPlaceholder":`например, qwen4-max-preview`,"models.customFieldDisplayName":`Отображаемое имя (необязательно)`,"models.customFieldDisplayNamePlaceholder":`например, Qwen 4 Max Preview`,"models.customFieldContext":`Контекстное окно`,"models.customFieldModalities":`Входные модальности`,"models.customFieldReasoning":`Уровень рассуждений`,"models.customFieldReasoningOverride":`Переопределить уровень рассуждений`,"models.reasoningEffort.none":`Нет`,"models.reasoningEffort.minimal":`Минимальный`,"models.reasoningEffort.low":`Низкий`,"models.reasoningEffort.medium":`Средний`,"models.reasoningEffort.high":`Высокий`,"models.reasoningEffort.xhigh":`Очень высокий`,"models.reasoningEffort.max":`Максимальный`,"models.tipProvider":`Провайдер`,"models.tipContext":`Контекст`,"models.tipModalities":`Модальности`,"models.tipStatus":`Статус`,"models.tipActive":`Активна`,"models.tipDisabled":`Отключена`,"models.applied":`Применено — вступит в силу на следующем ходе Codex.`,"models.saveFailed":`Не удалось сохранить`,"models.networkError":`Ошибка сети — запущен ли прокси?`,"models.loadFail":`Не удалось загрузить модели — запущен ли прокси?`,"models.noRouted":`Нет маршрутизируемых моделей`,"models.noRoutedHint":`Сначала войдите в провайдера или добавьте нового.`,"models.emptyDiscovery":`Модели не обнаружены. Проверьте адрес провайдера или добавьте статическую/пользовательскую модель.`,"models.emptyDiscoveryDisabled":`Автообнаружение моделей выключено, статические модели не настроены.`,"models.discoveryFailedBadge":`Ошибка обнаружения`,"models.discoveryFailedHttp":`Не удалось обнаружить модели (HTTP {status}).`,"models.discoveryFailedBlocked":`Обнаружение моделей заблокировано политикой назначения.`,"models.discoveryFailedInvalidResponse":`Обнаружение моделей вернуло недопустимый ответ.`,"models.discoveryFailedNetwork":`Обнаружение моделей не удалось из-за сетевой ошибки.`,"models.discoveryFailedProvider":`Провайдер сообщил об ошибке обнаружения моделей.`,"models.discoveryFailedGeneric":`Не удалось обнаружить модели.`,"models.openProviderSettings":`Открыть настройки провайдера`,"models.loading":`Загрузка…`,"models.search":`Поиск моделей…`,"models.showMore":`Показать ещё {n}`,"models.allowlistLabel":`Только выбранные`,"models.allowlistHint":`В каталог попадают только отмеченные модели (пусто = все). Полезно для провайдеров, предоставляющих тысячи моделей.`,"models.selectedCount":`Выбрано: {n}`,"sub.subtitle":`{cmd} в Codex объявляет как переопределения только первые 5 моделей (по приоритету). Выберите здесь до 5 моделей — нативные gpt или маршрутизируемые — и opencodex задаст им приоритет в каталоге так, чтобы именно они шли первыми. Любую другую модель по-прежнему можно вызвать по её точному имени; эта настройка управляет только тем, что отображается.`,"sub.featured":`Избранные`,"sub.orderHint":`Показанный здесь порядок задаёт позиции 1–5 в верхней части селектора моделей Codex и кандидатов в модели по умолчанию для {cmd}.`,"sub.noneSelected":`Ничего не выбрано — выберите из списка ниже.`,"sub.models":`Модели`,"sub.search":`Поиск моделей (нативные gpt + маршрутизируемые)…`,"sub.noModels":`Нет моделей — сначала войдите в провайдера или добавьте нового.`,"sub.saved":`Сохранено {n} моделей. Начните новую сессию Codex (или выполните {cmd}), чтобы увидеть их как переопределения spawn_agent.`,"sub.saveFailed":`Не удалось сохранить`,"sub.networkError":`Ошибка сети — запущен ли прокси?`,"sub.loadFail":`Не удалось загрузить модели — запущен ли прокси?`,"sub.loading":`Загрузка…`,"sub.moveUp":`Переместить {m} вверх`,"sub.moveDown":`Переместить {m} вниз`,"sub.removeAria":`Убрать {m}`,"sub.workspace.addToFeatured":`Добавить {m} в избранные`,"sub.workspace.allModels":`Все модели`,"sub.workspace.featuredFull":`Список избранных заполнен (макс. 5)`,"sub.workspace.mainAria":`Сведения о модели субагента`,"sub.workspace.notFeatured":`Не в избранных`,"sub.workspace.priority":`Приоритет`,"sub.workspace.removeFromFeatured":`Убрать {m} из избранных`,"sub.workspace.selectModel":`Выберите модель`,"sub.workspace.selectModelDesc":`Выберите модель из списка, чтобы увидеть детали и добавить её в избранные для spawn_agent.`,"sub.workspace.selector":`Публичный селектор`,"sub.ultraMode":`Ультра-режим`,"sub.ultraModeHint":`Включает политику упреждающего делегирования мультиагентов для всех моделей и уровней reasoning effort (сам reasoning effort не меняется). Записывает features.multi_agent_v2.multi_agent_mode_hint_text в config.toml.`,"sub.ultraModeV2Required":`Требуется мультиагентная поверхность v2 — сначала включите multi_agent_v2 и выберите v2 в переключателе режима субагентов.`,"sub.ultraModeText":`Текст делегирования ультра-режима`,"sub.ultraModePreset":`Восстановить пресет`,"sub.ultraModeLoadFail":`Не удалось загрузить настройки ультра-режима — работает ли прокси?`,"sub.ultraModeSaveFail":`Не удалось сохранить настройки ультра-режима`,"sub.ultraModeSaved":`Ультра-режим сохранён. Применяется к новым сеансам Codex.`,"sub.nativeParentOverride":`Маршрутизировать нативных родителей V2`,"sub.nativeParentOverrideHint":`Codex может показывать исходную нативную модель, а OpenCodex выполняет корневой запрос на выбранной маршрутизируемой цели.`,"sub.nativeParentOverridePrivacyWarning":`Промпты, контекст репозитория, история разговора и результаты инструментов отправляются выбранному провайдеру и наследуют его доступность, контекст, задержку, поведение, стоимость и характеристики конфиденциальности.`,"sub.nativeParentOverrideModel":`Целевая модель нативного родителя`,"sub.nativeParentOverrideV2Required":`Требуются явный V2, флаг V2 провайдера и отключённая настройка «Оставлять ChatGPT на v1».`,"sub.nativeParentOverrideSaveFail":`Не удалось сохранить маршрутизацию нативного родителя`,"sub.nativeParentOverrideSaved":`Маршрутизация нативного родителя сохранена. Применяется к последующим ходам родителя и компакции.`,"sub.agentTaskRecovery":`Восстановление зашифрованных задач V2`,"sub.agentTaskRecoveryHint":`Расшифровывает сообщения задач OpenAI Fernet через ChatGPT, чтобы субагенты сторонних провайдеров могли читать и выполнять задачи V2.`,"sub.agentTaskRecoveryModel":`Модель восстановления (по умолчанию: gpt-5.6-luna)`,"sub.agentTaskRecoverySaveFail":`Не удалось сохранить восстановление зашифрованных задач`,"sub.agentTaskRecoverySaved":`Настройка восстановления зашифрованных задач сохранена.`,"sub.roles":`Роли`,"sub.roles.hint":`Именованные специалисты, которых родитель может порождать. Каждая роль фиксирует модель и промпт ребёнка. Решение о делегировании остаётся за родителем.`,"sub.roles.add":`Добавить роль`,"sub.roles.empty":`Ролей пока нет. Добавьте специалиста для ревью, поиска или другой делегированной работы.`,"sub.roles.full":`Каталог ролей заполнен (макс. 8)`,"sub.roles.id":`Имя роли`,"sub.roles.description":`Когда использовать`,"sub.roles.descriptionHint":`Показывается родителю, чтобы он знал, когда порождать этого специалиста.`,"sub.roles.model":`Модель`,"sub.roles.effort":`Усилие`,"sub.roles.effortNone":`По умолчанию модели`,"sub.roles.instructions":`Инструкции ребёнка`,"sub.roles.instructionsHint":`Developer-промпт, который загружает дочерний агент.`,"sub.roles.enabled":`Включена`,"sub.roles.delete":`Удалить роль {id}`,"sub.roles.save":`Сохранить роли`,"sub.roles.saved":`Роли сохранены. Применяется к новым сеансам Codex.`,"sub.roles.saveFailed":`Не удалось сохранить роли`,"sub.roles.loadFail":`Не удалось загрузить роли — прокси запущен?`,"sub.roles.routedV2Warning":`Эта роль использует маршрутизируемую модель на поверхности v2, не оставляя ChatGPT на v1. Нативные v2-родители шифруют задачи детей.`,"sub.roles.sync":`Синхронизировать в файлы агентов Codex`,"sub.roles.syncHint":`Пишет включённые роли в marker-owned ocx-*.toml. Выключение удаляет файлы OpenCodex и не трогает ваши.`,"sub.injectionPrompt":`Пользовательские подсказки родителю`,"sub.injectionPromptHint":`Заменяет встроенный v2-текст spawn. Оставьте пустым для стандартного текста. Добавьте плейсхолдеры для живых значений:`,"sub.injectionPromptSave":`Сохранить подсказки родителю`,"sub.injectionPromptSaved":`Подсказки родителю сохранены. Применяется к новым сеансам Codex.`,"sub.injectionPromptSaveFailed":`Не удалось сохранить подсказки родителю`,"sub.childInstructions":`Глобальные инструкции ребёнка`,"sub.childInstructionsHint":`Применяется к каждому порождённому ребёнку. Инструкции роли после синхронизации действуют только на этого специалиста.`,"sub.childInstructionsSave":`Сохранить инструкции ребёнка`,"sub.childInstructionsSaved":`Инструкции ребёнка сохранены. Применяется к новым сеансам Codex.`,"sub.childInstructionsSaveFailed":`Не удалось сохранить инструкции ребёнка`,"logs.title":`Журнал запросов`,"logs.tabLogs":`Логи`,"logs.tabDebug":`Отладка`,"logs.subtitle":`Недавние запросы через локальный прокси opencodex, новые сверху.`,"logs.autoRefresh":`Автообновление`,"logs.noRequests":`Запросов пока нет.`,"logs.loadError":`Не удалось загрузить журнал запросов.`,"logs.filter.surface.label":`Источник`,"logs.filter.surface.all":`Все`,"logs.filter.surface.claude":`Claude`,"logs.filter.surface.codex":`Codex`,"logs.filter.surface.grok":`Grok`,"logs.filter.interceptedHelpersOnly":`Только перехваченные помощники`,"logs.filter.model.label":`Модель`,"logs.filter.model.all":`Все модели`,"logs.filter.provider.label":`Провайдер`,"logs.filter.provider.all":`Все провайдеры`,"logs.filter.status.label":`Статус`,"logs.filter.status.all":`Все статусы`,"logs.filter.status.success":`Успешно (2xx)`,"logs.filter.status.errors":`Ошибки (4xx/5xx)`,"logs.filter.time.label":`Время`,"logs.filter.time.all":`За всё время`,"logs.filter.time.15m":`За 15 минут`,"logs.filter.time.1h":`За 1 час`,"logs.filter.time.24h":`За 24 часа`,"logs.filter.speed.label":`Скорость`,"logs.filter.speed.all":`Любая скорость`,"logs.filter.speed.slow":`< 15 tok/s`,"logs.filter.speed.medium":`15–50 tok/s`,"logs.filter.speed.fast":`> 50 tok/s`,"logs.filter.reset":`Сбросить фильтры`,"logs.filter.showingCount":`Показано {count} из {total}`,"logs.badge.interceptedHelper":`I · {model}`,"logs.badge.interceptedHelperTitle":`Перехваченный запрос помощника`,"logs.filter.conversation.label":`Диалог`,"logs.filter.conversation.placeholder":`Вставьте ID диалога`,"logs.filter.conversation.clear":`Сбросить`,"logs.filter.conversation.apply":`Фильтровать логи`,"logs.conversation.totals":`{requests} запросов · {tokens} токенов · {cost}`,"logs.conversation.scope":`Итоги только по загруженному кольцу Logs.`,"logs.conversation.excluded":`(из ~$ исключены {unpriced} без цены, {unmetered} без учёта)`,"logs.cost.approximate":`около {amount}`,"logs.cost.lowerBound":`не менее {amount}`,"logs.cost.unavailable":`недоступно`,"logs.detail.conversation":`Диалог`,"logs.badge.claude":`Claude`,"logs.badge.grok":`Grok`,"logs.col.time":`Время`,"logs.col.request":`Запрос`,"logs.col.model":`Модель`,"logs.col.effort":`Уровень`,"logs.col.provider":`Провайдер`,"logs.col.status":`Статус`,"logs.col.tokens":`Токены`,"logs.col.tokPerSec":`tok/s`,"logs.col.estimatedCost":`~$`,"logs.metric.tokPerSecTitle":`Выходные токены в секунду за полную длительность запроса`,"logs.metric.estimatedCostTitle":`Эквивалент стоимости по прайс-листу API, а не фактическое списание; если цену не удалось сопоставить, значение недоступно`,"usage.cost.total":`Эквивалент стоимости по прайс-листу API (за этот период)`,"usage.cost.disclaimer":`Не является счётом. Расходы могут покрываться подпиской или кредитами провайдера.`,"usage.cost.unpricedNote":`Исключено {count} запросов (нет цены или данных использования)`,"logs.detail.section.basic":`Основная информация`,"logs.detail.route.section":`Решение о маршруте`,"logs.detail.route.kind":`Тип маршрута`,"logs.detail.route.profile":`Профиль`,"logs.detail.route.selected":`Выбрано`,"logs.detail.route.candidates":`Кандидаты`,"logs.detail.route.unknown":`Для этого запроса трасса маршрута не записана (строка до трассировки).`,"logs.detail.section.performance":`Производительность`,"logs.detail.section.cost":`Эквивалент стоимости по прайс-листу API`,"logs.detail.section.attempts":`Попытки комбо`,"logs.detail.section.usage":`Сырые данные использования`,"logs.detail.ttft":`TTFT`,"logs.detail.costTotal":`Эквивалент по прайс-листу`,"logs.detail.totalTokens":`Всего токенов`,"logs.detail.matchedKey":`Совпавший ключ цены`,"logs.detail.priceSource":`Источник цены`,"logs.detail.unavailableReason":`Причина недоступности`,"logs.detail.copyRequestId":`Копировать ID запроса`,"logs.detail.copied":`Скопировано`,"logs.detail.source.jawcode":`каталог jawcode`,"logs.detail.source.expected":`Оверлей ожидаемых цен`,"logs.detail.source.user":`Ценовой оверлей провайдера`,"logs.detail.verification.verified":`Подтверждено`,"logs.detail.verification.derived":`Выведено из базовой модели`,"logs.detail.attempt.target":`Провайдер / модель`,"logs.detail.attempt.reason":`Результат / причина`,"logs.detail.attempt.completed":`Завершено`,"logs.detail.attempt.e2eNote":`Общий tok/s — сквозной показатель; для каждой попытки используется её собственная длительность.`,"logs.detail.attempt.recovery.transient5xx":`Временная ошибка 5xx`,"logs.detail.attempt.recovery.connectionReset":`Соединение сброшено`,"logs.detail.attempt.recovery.oauth401":`Повторная авторизация OAuth`,"logs.detail.attempt.recovery.key429":`Ключ ограничен (429)`,"logs.detail.attempt.recovery.rateLimit429":`Ограничение частоты запросов (429)`,"logs.detail.attempt.recovery.anthropicOauth429":`Anthropic OAuth ограничен (429)`,"logs.detail.attempt.recovery.image413":`Слишком большой размер изображения (413)`,"logs.detail.attempt.recovery.emptyCompletion":`Повтор пустого завершения`,"logs.detail.attempt.recovery.unknown":`Неизвестная причина восстановления`,"logs.detail.reason.usage_missing":`Данные об использовании не были сообщены.`,"logs.detail.reason.usage_unsupported":`Этот провайдер не сообщает данные об использовании.`,"logs.detail.reason.output_missing":`Положительное число выходных токенов не было сообщено.`,"logs.detail.reason.invalid_duration":`Длительность запроса некорректна.`,"logs.detail.reason.price_unmatched":`Подходящая цена не найдена.`,"logs.detail.reason.invalid_cache_breakdown":`Детализация кэш-токенов противоречит общему числу входных токенов.`,"logs.detail.reason.invalid_usage":`В данных использования есть некорректное значение токенов.`,"logs.detail.reason.combo_attempt_unavailable":`Не удалось рассчитать стоимость как минимум одной попытки комбо.`,"logs.detail.estimate.usage_estimated":`Данные об использовании от провайдера — оценочные.`,"logs.detail.estimate.cache_detail_missing":`Детализация кэша недоступна; входные токены оценены по верхней границе.`,"logs.detail.estimate.expected_price_overlay":`Использована подтверждённая ожидаемая цена из прайс-листа.`,"logs.detail.estimate.provider_cost_overlay":`Использован ценовой оверлей провайдера.`,"logs.detail.estimate.priority_lower_bound":`Подтверждённая цена Priority недоступна; показанная оценка является известной нижней границей.`,"logs.col.error":`Ошибка`,"logs.col.upstreamReason":`Причина от провайдера`,"logs.col.duration":`Длительность`,"logs.modelTooltip.model":`модель`,"logs.modelTooltip.resolvedModel":`разрешённая модель`,"logs.modelTooltip.requestedTier":`запрошенный уровень`,"logs.modelTooltip.configuredTier":`настроенный уровень`,"logs.modelTooltip.responseTier":`уровень ответа`,"logs.modelTooltip.supportsTier":`поддержка уровня`,"logs.tokens.reported":`сообщено`,"logs.tokens.unreported":`не сообщено`,"logs.tokens.unsupported":`не поддерживается`,"logs.tokens.estimated":`оценка`,"logs.tokens.input":`вход`,"logs.tokens.output":`выход`,"logs.tokens.cacheRead":`чтение кэша (c)`,"logs.tokens.cacheWrite":`запись кэша (w)`,"logs.tokens.reasoning":`рассуждения`,"logs.tokens.noCache":`нет данных кэша`,"logs.tokens.contextTotal":`активный контекст`,"logs.tokens.noCacheNote":`этот провайдер не сообщает данные о кэш-токенах`,"logs.tokens.noCacheCursor":`детализация кэша Cursor не сообщается`,"logs.tokens.noCacheCursorNote":`Cursor не передает число токенов чтения/записи кэша; это неизвестно, а не подтвержденный промах кэша`,"logs.tokens.estimatedNote":`оценка (провайдер не сообщает точные данные использования)`,"logs.details":`Детали`,"logs.detailTitle":`Детали запроса`,"logs.detailRaw":`Сырая запись лога`,"debug.title":`Отладка`,"debug.subtitle":`Включаемая по желанию диагностика транспорта провайдеров и извлечения данных использования. Ошибки запросов и 502 остаются на вкладке «Логи».`,"debug.debug":`Отладка провайдера`,"debug.usage":`Извлечение данных использования`,"debug.injection":`Лог инъекций`,"debug.claude":`Входящие Claude`,"debug.claudeInbound.title":`Входящие запросы Claude`,"debug.claudeInbound.sub":`Что фактически отправляет Claude Code/Desktop (thinking, effort, метаданные) — текст промптов не сохраняется.`,"debug.claudeInbound.empty":`Запросы пока не зафиксированы. Отправьте сообщение из Claude, пока эта опция включена.`,"debug.claudeInbound.time":`Время`,"debug.claudeInbound.endpoint":`Конечная точка`,"debug.claudeInbound.model":`Модель`,"debug.claudeInbound.none":`нет`,"debug.reset":`Сбросить временные переопределения`,"debug.refresh":`Обновить`,"debug.follow":`Следить`,"debug.streamProvider":`Провайдер`,"debug.streamUsage":`Использование`,"debug.streamInjection":`Инъекции`,"debug.loading":`Загрузка настроек отладки…`,"debug.loadFailed":`Не удалось загрузить настройки отладки.`,"debug.emptyTitle":`Отладочное логирование выключено`,"debug.empty":`Включите «Отладка провайдера» или «Извлечение данных использования» в карточке выше. Строки появятся здесь после отправки запроса через прокси.`,"debug.noLinesTitle":`Ожидание строк`,"debug.noLines.provider":`Отладка провайдера включена, но записываются только аномалии транспорта (потерянные или повреждённые фреймы, а также события подключения и повторов Cursor). Успешный запрос через провайдера вроде Anthropic может не дать ни одной строки.`,"debug.noLines.usage":`Извлечение данных использования включено, но пока ничего не зафиксировано. Отправьте чат или запрос через Codex — и записи появятся здесь.`,"debug.noLines.injection":`Лог инъекций включён, но пока ничего не зафиксировано. Он записывает инъекции мультиагентных инструкций и решения об ограничении уровня рассуждений на ходах совместной работы (collab) и подагентов.`,"usage.title":`Использование`,"usage.subtitle":`Локальный учёт токенов вашего прокси. Отсутствующие данные никогда не показываются как ноль.`,"usage.loading":`Загрузка данных об использовании…`,"usage.empty":`Данных об использовании пока нет. Отправьте запрос через прокси, чтобы увидеть здесь активность.`,"usage.loadError":`Не удалось загрузить данные об использовании.`,"usage.range.all":`Все`,"usage.range.available":`Доступная история`,"usage.historyTruncated":`Итоги охватывают только доступную историю, поскольку старые данные не загружены.`,"usage.historyTruncatedWindow":`У загруженных записей время начала запроса находится в диапазоне от {start} до {end}. Более ранние записи файла пропущены из-за лимита чтения, поэтому выбранный период может быть неполным.`,"usage.range.30d":`30 дн.`,"usage.range.7d":`7 дн.`,"usage.card.requests":`Запросы`,"usage.card.measured":`Измерено`,"usage.card.reported":`Сообщено`,"usage.card.totalTokens":`Всего токенов`,"usage.card.cachedTokens":`Чтения из кэша`,"usage.card.cachedTokensHint":`Токены промпта, отданные из кэша провайдера (чтения). Записи в кэш показаны ниже, если они есть.`,"usage.card.cacheWriteTokens":`записи в кэш`,"usage.card.coverage":`Покрытие`,"usage.card.activeDays":`Активные дни`,"usage.section.heatmap":`Активность по дням`,"usage.section.overview":`Обзор`,"usage.section.models":`Модели`,"usage.section.providers":`Провайдеры`,"usage.section.coverage":`Детализация покрытия`,"usage.workspace.report":`Отчёт об использовании`,"usage.workspace.sections":`Разделы использования`,"usage.coverage.measured":`Измерено`,"usage.coverage.reported":`Сообщено провайдером`,"usage.coverage.estimated":`Оценено`,"usage.coverage.note":`Измеренные записи включают количество токенов, сообщённое провайдером, и оценочные значения. Запросы без отчёта и неподдерживаемые запросы учитываются, но никогда не показываются как ноль токенов.`,"usage.search.models":`Поиск моделей…`,"usage.col.requests":`Запросы`,"usage.col.measured":`Измерено`,"usage.col.reported":`Сообщено`,"usage.col.tokens":`Токены`,"usage.col.share":`Доля`,"usage.heatmap.less":`Меньше`,"usage.heatmap.more":`Больше`,"usage.dayMon":`Пн`,"usage.dayWed":`Ср`,"usage.dayFri":`Пт`,"usage.heatmap.tooltipTokens":`{tokens} токенов`,"usage.heatmap.tooltipRequests":`{requests} запросов`,"usage.chart.dayDetail":`{date}: {requests} запросов, {tokens} токенов`,"usage.heatmap.keyboardLabel":`Стрелки вверх и вниз перемещают по дням, влево и вправо — по неделям.`,"nav.storage":`Хранилище`,"storage.title":`Хранилище`,"storage.subtitle":`Смотрите, что занимает CODEX_HOME. Очистка не затрагивает активные сессии.`,"storage.loading":`Сканирование хранилища…`,"storage.empty":`CODEX_HOME пуст или отсутствует — показывать нечего.`,"storage.error":`Не удалось просканировать хранилище. Убедитесь, что CODEX_HOME указывает на корректный каталог.`,"storage.refresh":`Пересканировать`,"storage.rescanned":`Сканирование завершено.`,"storage.card.total":`Общий размер`,"storage.card.files":`Файлы`,"storage.card.home":`CODEX_HOME`,"storage.snapshot.lastScan":`Последний скан`,"storage.snapshot.scanning":`Сканирование…`,"storage.snapshot.unavailable":`Сканирования ещё не было.`,"storage.cleanupCard.title":`Освободить место`,"storage.cleanupCard.tabs":`Параметры очистки`,"storage.cleanupCard.tab.policy":`Политика`,"storage.cleanupCard.tab.quarantine":`Карантин`,"storage.cleanup.noArchives":`Нет архивных сессий для очистки.`,"storage.section.buckets":`Категории`,"storage.section.largest":`Крупнейшие файлы`,"storage.workspace.overview":`Обзор`,"storage.workspace.selectBucket":`Выберите сегмент в списке, чтобы увидеть разбивку.`,"storage.col.bucket":`Категория`,"storage.col.size":`Размер`,"storage.col.files":`Файлы`,"storage.col.oldest":`Старейший`,"storage.col.newest":`Новейший`,"storage.col.rows":`Строки БД`,"storage.rows.unknown":`неизвестно (заблокировано)`,"storage.bucket.sessions":`Активные сессии`,"storage.bucket.archived_sessions":`Архивные сессии`,"storage.bucket.logs_db":`База данных логов`,"storage.bucket.state_db":`База данных состояния`,"storage.bucket.attachments":`Вложения`,"storage.bucket.deletion_manifests":`Манифесты удаления`,"storage.bucket.other":`Прочее`,"storage.cleanup.title":`Очистка архива`,"storage.cleanup.help":`Удаляет самые старые архивные сессии по проценту. Активные сессии не затрагиваются. По умолчанию — карантин: файлы перемещаются в CODEX_HOME/.trash.`,"storage.cleanup.slider":`Доля самых старых архивов`,"storage.cleanup.percent":`{percent}%`,"storage.cleanup.preset":`{percent}`,"storage.cleanup.preview":`Предпросмотр`,"storage.cleanup.confirmTitle":`Подтвердить очистку архива`,"storage.cleanup.confirmBody":`Будет обработано {count} архивных файл(ов) (~{size}), самые старые {percent}%.`,"storage.cleanup.moreFiles":`…и ещё {n}`,"storage.cleanup.permanent":`Удалить навсегда (без карантина)`,"storage.cleanup.permanentWarn":`Безвозвратное удаление нельзя отменить.`,"storage.cleanup.quarantineNote":`Файлы перемещаются в .trash под CODEX_HOME. Восстановить можно на вкладке «Карантин».`,"storage.cleanup.cancel":`Отмена`,"storage.cleanup.confirmQuarantine":`В карантин`,"storage.cleanup.confirmPermanent":`Удалить навсегда`,"storage.cleanup.doneQuarantine":`В карантин: {count} файл(ов) ({size}).`,"storage.cleanup.donePermanent":`Удалено навсегда: {count} файл(ов) ({size}).`,"storage.cleanup.previewFailed":`Не удалось выполнить предпросмотр.`,"storage.cleanup.cleanupFailed":`Не удалось выполнить очистку.`,"storage.cleanup.err.codex_busy":`Codex использует state.sqlite — закройте Codex и повторите попытку.`,"storage.cleanup.err.stale_preview":`Архивы изменились после предпросмотра — выполните предпросмотр снова.`,"storage.cleanup.err.restore_pending_overlap":`Выбранные архивы пересекаются с незавершённым восстановлением из корзины — завершите или повторите восстановление.`,"storage.cleanup.err.referenced_history":`Выбранные архивы всё ещё ссылаются из forked или paginated history.`,"storage.cleanup.err.invalid_digest":`Digest предпросмотра отсутствует или недействителен.`,"storage.cleanup.err.invalid_mode":`Режим должен быть quarantine или permanent.`,"storage.cleanup.err.fs_failed":`Ошибка файловой очистки. Часть изменений могла уже примениться — проверьте CODEX_HOME/.trash и указанный путь восстановления.`,"storage.cleanup.err.fs_failed_trash":`Ошибка файловой очистки. Часть изменений могла уже примениться — проверьте {trashDir} и manifest.json на восстанавливаемые файлы.`,"storage.cleanup.err.db_reconcile_failed":`Не удалось обновить базу состояния Codex.`,"storage.cleanup.err.cleanup_failed":`Не удалось выполнить очистку.`,"storage.trash.title":`Карантин`,"storage.trash.help":`Архивные сессии в CODEX_HOME/.trash. Восстановление возвращает JSONL и строки потоков.`,"storage.trash.empty":`Нет записей в карантине.`,"storage.trash.loading":`Загрузка карантина…`,"storage.trash.col.when":`В карантине с`,"storage.trash.col.files":`Файлы`,"storage.trash.col.size":`Размер`,"storage.trash.col.mode":`Режим`,"storage.trash.col.id":`Запись`,"storage.trash.restore":`Восстановить`,"storage.trash.confirmTitle":`Восстановить запись карантина?`,"storage.trash.confirmBody":`Вернуть {count} файл(ов) (~{size}) из {id} в архивные сессии.`,"storage.trash.cancel":`Отмена`,"storage.trash.confirmRestore":`Восстановить`,"storage.trash.done":`Восстановлено {count} файл(ов) ({size}).`,"storage.trash.restoreFailed":`Не удалось восстановить.`,"storage.trash.listFailed":`Не удалось получить список карантина.`,"storage.trash.mode.quarantine":`карантин`,"storage.trash.mode.permanent":`permanent (незавершён)`,"storage.trash.err.codex_busy":`Codex использует state.sqlite — закройте Codex и повторите попытку.`,"storage.trash.err.invalid_trash":`Идентификатор записи корзины отсутствует или недействителен.`,"storage.trash.err.missing_trash":`Запись корзины не найдена.`,"storage.trash.err.dest_exists":`Цель восстановления уже существует — удалите или переименуйте архивный файл и повторите.`,"storage.trash.err.fs_failed":`Ошибка восстановления файлов. Часть файлов могла уже восстановиться — проверьте archived_sessions и .trash.`,"storage.trash.err.storage_mutation_busy":`Выполняется другая очистка или восстановление — повторите позже.`,"storage.trash.err.db_reconcile_failed":`Не удалось восстановить строки базы состояния Codex.`,"storage.trash.err.restore_failed":`Не удалось восстановить.`,"storage.trash.err.restore_worker_timeout":`Восстановление заняло слишком много времени (более 10 минут) и было остановлено.`,"storage.trash.err.restore_worker_aborted":`Восстановление отменено при завершении работы.`,"storage.trash.err.restore_worker_failed":`Worker восстановления завершился с ошибкой или аварийно.`,"storage.policy.title":`Политика автоочистки`,"storage.policy.help":`Необязательная пакетная очистка, когда архивные сессии превышают порог. По умолчанию выкл. — никогда не включается сама.`,"storage.policy.loading":`Загрузка политики…`,"storage.policy.loadFailed":`Не удалось загрузить политику очистки.`,"storage.policy.saveFailed":`Не удалось сохранить политику очистки.`,"storage.policy.runFailed":`Не удалось выполнить политику.`,"storage.policy.alreadyRunning":`Выполнение политики очистки уже выполняется.`,"storage.policy.invalid":`Недопустимые значения политики.`,"storage.policy.enabled":`Включить автоочистку`,"storage.policy.enabledHint":`По умолчанию выкл. При включении работает только по выбранному расписанию (или «Запустить сейчас»).`,"storage.policy.threshold":`Когда размер архива больше (ГиБ)`,"storage.policy.trigger":`Триггер`,"storage.policy.target":`Цель очистки`,"storage.policy.targetPercent":`Удалить самые старые архивы (%)`,"storage.policy.targetReduce":`Уменьшить архив до (ГиБ)`,"storage.policy.thresholdInc":`Увеличить порог`,"storage.policy.thresholdDec":`Уменьшить порог`,"storage.policy.percentInc":`Увеличить процент`,"storage.policy.percentDec":`Уменьшить процент`,"storage.policy.reduceInc":`Увеличить целевой размер`,"storage.policy.reduceDec":`Уменьшить целевой размер`,"storage.policy.schedule":`Расписание`,"storage.policy.schedule.manual":`Только вручную`,"storage.policy.schedule.startup":`При запуске прокси`,"storage.policy.schedule.daily":`Ежедневно`,"storage.policy.schedule.weekly":`Еженедельно`,"storage.policy.mode":`Режим удаления`,"storage.policy.mode.quarantine":`Карантин (по умолчанию)`,"storage.policy.mode.permanent":`Удалить навсегда`,"storage.policy.permanentWarn":`Постоянный режим нельзя отменить. Предпочитайте карантин, если не уверены.`,"storage.policy.lastRun":`Последний запуск`,"storage.policy.lastRunDetail":`Удалено {count} · освобождено {size}`,"storage.policy.nextRun":`Следующий запуск`,"storage.policy.never":`Никогда`,"storage.policy.save":`Сохранить`,"storage.policy.runNow":`Запустить сейчас`,"storage.policy.running":`Выполняется…`,"storage.policy.saved":`Политика сохранена.`,"storage.policy.skippedDisabled":`Политика отключена — сначала включите её.`,"storage.policy.skippedUnder":`Размер архива ниже порога — делать нечего.`,"storage.policy.skippedEmpty":`Нет архивных кандидатов под цель.`,"storage.policy.doneQuarantine":`Политика отправила в карантин {count} файл(ов) ({size}).`,"storage.policy.donePermanent":`Политика навсегда удалила {count} файл(ов) ({size}).`,"modal.addNamed":`Добавить: {label}`,"modal.add":`Добавить провайдера`,"modal.catalogTabs":`Категории провайдеров`,"modal.searchLabel":`Поиск провайдеров`,"modal.search":`Поиск провайдеров…`,"modal.logInWith":`Войти через {label}`,"modal.waitingBrowser":`Ожидание браузера…`,"modal.providerName":`Название провайдера`,"modal.adapter":`Адаптер`,"modal.baseUrl":`Базовый URL`,"modal.endpoint":`Конечная точка`,"modal.endpoint.tokenPlan":`Пакет токенов`,"modal.endpoint.payAsYouGo":`Оплата по факту`,"modal.endpoint.custom":`Своя`,"modal.defaultModel":`Модель по умолчанию (необязательно)`,"modal.allowPrivateNetwork":`Разрешить локальную/частную сеть`,"modal.allowPrivateNetworkHint":`Включайте только для провайдеров, намеренно развёрнутых у себя. Конечные точки метаданных остаются заблокированными.`,"modal.nameRequired":`Укажите название провайдера`,"modal.baseUrlRequired":`Укажите базовый URL`,"modal.networkError":`Ошибка сети — запущен ли прокси?`,"modal.loginFailStart":`Не удалось начать вход`,"modal.waitingLogin":`Ожидание входа в браузере…`,"modal.loggingIn":`Выполняется вход…`,"modal.loginTimeout":`Время входа истекло — попробуйте ещё раз.`,"modal.back":`Назад`,"modal.badge.oauth":`OAuth`,"modal.customProvider":`Свой провайдер`,"replitGateway.title":`Компаньон шлюза Replit`,"replitGateway.subtitle":`Подключите развернутый вами шлюз Replit и установите пару провайдеров OpenAI Chat и Anthropic вместе.`,"replitGateway.companionNote":`Это пользовательский сценарий-компаньон, а не канонический пресет реестра.`,"replitGateway.originLabel":`Origin развертывания`,"replitGateway.originHint":`HTTPS origin вашего развертывания Replit (например, https://my-app.replit.app).`,"replitGateway.keyLabel":`Ключ шлюза`,"replitGateway.keyHint":`Секрет REPLIT_GATEWAY_KEY из вашего развертывания. Он сохраняется в локальной конфигурации провайдеров и используется для аутентификации трафика к шлюзу.`,"replitGateway.keyTooShort":`Ключ шлюза слишком короткий (минимум 32 символа).`,"replitGateway.keyTooLong":`Ключ шлюза должен содержать не более 512 символов.`,"replitGateway.keyInvalidChars":`Ключ шлюза должен содержать только печатаемые символы ASCII.`,"replitGateway.errorNetwork":`Не удалось связаться с прокси. Проверьте, что он запущен, и повторите попытку.`,"replitGateway.errorMalformed":`Прокси вернул недопустимый ответ. Повторите попытку через некоторое время.`,"replitGateway.customDomainLabel":`Разрешить пользовательский домен`,"replitGateway.customDomainHint":`Включайте только если ваш шлюз не размещен на .replit.app.`,"replitGateway.setDefaultLabel":`Сделать replit провайдером по умолчанию после установки`,"replitGateway.install":`Установить пару`,"replitGateway.installing":`Установка…`,"replitGateway.close":`Закрыть`,"replitGateway.openButton":`Шлюз Replit…`,"replitGateway.replaceTitle":`Заменить существующую пару Replit?`,"replitGateway.replaceBody":`Провайдеры replit и replit-anthropic уже существуют. Замена перезапишет origin и ключ шлюза, сохранив ваши наложения.`,"replitGateway.replaceConfirm":`Заменить пару`,"replitGateway.replaceCancel":`Оставить существующую`,"replitGateway.probeHealth":`healthz: HTTP {status} ({ms} ms)`,"replitGateway.probeModels":`models: обнаружено {count} ({ms} ms)`,"replitGateway.successTitle":`Пара шлюза Replit установлена.`,"replitGateway.errorGeneric":`Не удалось установить пару шлюза Replit.`,"replitGateway.errorCollision":`Пара провайдеров Replit уже существует.`,"replitGateway.errorBusy":`Конфигурация занята. Повторите попытку через некоторое время.`,"replitGateway.originRequired":`Origin развертывания обязателен.`,"replitGateway.keyRequired":`Ключ шлюза обязателен.`,"modal.failedStatus":`Ошибка ({status})`,"modal.loginError":`Ошибка входа: {error}`,"modal.badge.codexLogin":`Вход через Codex`,"modal.badge.local":`Локальный`,"modal.badge.apiKey":`API-ключ`,"modal.badge.direct":`Прямой`,"modal.badge.pool":`Пул`,"modal.badge.free":`Бесплатно`,"modal.invalidPreset":`Этот встроенный пресет провайдера неполный. Перезапустите прокси и попробуйте ещё раз.`,"modal.freeTierTitle":`Бесплатный тариф`,"modal.freeTierDefault":`API-ключ не нужен. Работает из коробки.`,"modal.tab.accounts":`Аккаунты`,"modal.tab.free":`Бесплатные`,"modal.tab.paid":`Платные`,"modal.accountsHint":`Здесь можно войти в аккаунты ChatGPT/Codex и OAuth-провайдеров, а также в аккаунты с API-ключами. Провайдер OpenAI уже встроен — просто войдите, а не добавляйте его заново.`,"modal.accountsCodexAuthLink":`Аутентификация Codex`,"modal.notListed":`Нет нужного провайдера? Добавьте свой`,"modal.catalogLoading":`Загрузка каталога…`,"modal.catalogLoadFailed":`Не удалось загрузить каталог провайдеров.`,"modal.accountLogin":`Войти`,"modal.accountLogout":`Выйти`,"modal.accountAdd":`Добавить аккаунт`,"modal.accountManage":`Управление`,"modal.accountCodexPool":`Пул аккаунтов ChatGPT`,"modal.accountLoggedIn":`Вход выполнен`,"modal.accountLoggedOut":`Вход не выполнен`,"quota.fiveHourLimit":`5-часовой лимит`,"quota.weeklyLimit":`Недельный лимит`,"quota.monthlyLimit":`30-дневный лимит`,"quota.cursorFirstParty":`Собственные модели`,"quota.cursorApiUsage":`Использование API`,"quota.totalSubscriptionCredits":`Всего кредитов подписки`,"quota.creditsBalance":`Остаток кредитов`,"quota.creditsPeriodEnds":`Расчётный период заканчивается {date}`,"quota.usedPercent":`Использовано {pct}%`,"quota.limitReached":`Лимит исчерпан`,"quota.resetsToday":`Сброс сегодня в {time}`,"quota.resetsTomorrow":`Сброс завтра в {time}`,"quota.resetsAt":`Сброс: {when}`,"quota.resetsRelativeMinutes":`Сброс через {n} мин`,"quota.resetsRelativeHours":`Сброс через {n} ч`,"pws.status.ready":`Готов`,"pws.status.needsSetup":`Требуется настройка`,"pws.status.needsAttention":`Требует внимания`,"pws.auth.chatgptPassthrough":`Сквозной режим ChatGPT`,"pws.auth.noKey":`Ключ не нужен`,"pws.freeTitle":`Бесплатный тариф (ключ всё же может потребоваться)`,"pws.localTitle":`Локальная среда выполнения`,"pws.modelCountOne":`1 модель`,"pws.modelCount":`{count} моделей`,"pws.rail.suffixDefault":` · по умолчанию`,"pws.rail.suffixLocal":` · локальный`,"pws.rail.suffixFree":` · бесплатный`,"pws.rail.selectAria":`Выбрать {name} — {status}{suffix}`,"pws.searchPlaceholder":`Поиск провайдеров…`,"pws.filterAria":`Фильтр провайдеров`,"pws.providerFiltersAria":`Фильтры провайдеров`,"pws.filters":`Фильтры`,"pws.filterStatus":`Статус`,"pws.pricing":`Тариф`,"pws.paid":`Платные`,"pws.filterType":`Тип`,"pws.type.cloud":`Облачные`,"pws.type.local":`Локальные`,"pws.type.selfHosted":`Свой хостинг`,"pws.type.login":`Вход`,"pws.sort":`Сортировка`,"pws.sortProvidersAria":`Сортировка провайдеров`,"pws.sort.az":`A–Z`,"pws.sort.za":`Z–A`,"pws.sort.freePaid":`Сначала бесплатные`,"pws.sort.paidFree":`Сначала платные`,"pws.sort.accountsFirst":`Сначала с аккаунтами`,"pws.resetAll":`Сбросить всё`,"pws.providerList":`Список провайдеров`,"pws.providersAria":`Провайдеры`,"pws.groupReady":`Готовы ({count})`,"pws.groupNeedsSetup":`Требуется настройка ({count})`,"pws.groupDisabled":`Отключены ({count})`,"pws.noSearchResults":`По вашему запросу провайдеры не найдены.`,"pws.noMatchFilters":`Нет провайдеров, соответствующих фильтрам.`,"pws.noProvidersConfigured":`Провайдеры не настроены.`,"pws.workspaceMainAria":`Сведения о провайдере`,"pws.detailComingSoon":`Подробный вид скоро появится — для управления этим провайдером используйте классический вид.`,"pws.selectPrompt":`Выберите провайдера из списка.`,"pws.connectFirst":`Подключите первого провайдера`,"pws.empty.browseFree":`Посмотреть бесплатных провайдеров`,"pws.empty.browseFreeDesc":`Начните без подписки`,"pws.empty.connectAccount":`Подключить аккаунт`,"pws.empty.connectAccountDesc":`Войдите через ChatGPT или аккаунт провайдера`,"pws.empty.addEndpoint":`Добавить конечную точку`,"pws.empty.addEndpointDesc":`Свой базовый URL и API-ключ`,"pws.tab.overview":`Обзор`,"pws.tab.models":`Модели`,"pws.tab.usage":`Использование`,"pws.tab.accounts":`Аккаунты`,"pws.tab.settings":`Настройки`,"pws.connection":`Подключение`,"pws.status.connected":`Подключено`,"pws.attentionTitle":`Требует внимания`,"pws.attention.reauth":`Активному аккаунту требуется повторная аутентификация`,"pws.attention.reauthForward":`Активному аккаунту Codex требуется повторная аутентификация — откройте вкладку «Аккаунты», чтобы исправить`,"pws.attention.missingCredentials":`Отсутствуют учётные данные`,"pws.cell.auth":`Аутентификация`,"pws.cell.note":`Заметка`,"pws.cell.defaultModel":`Модель по умолчанию`,"pws.statsAria":`Статистика провайдера`,"pws.statsTitle":`Статистика`,"pws.stats.totalRequests":`Запросы (30 дн.)`,"pws.stats.totalTokens":`Токены (30 дн.)`,"pws.stats.quotaUpdated":`Квота обновлена`,"pws.stats.quotaTracked":`Лимиты запросов отслеживаются на вкладке «Использование».`,"pws.stats.source":`Источник`,"pws.usageLast30d":`Использование (последние 30 дней)`,"pws.allAccounts":`Все аккаунты`,"pws.estimatedCost":`Ориентировочная стоимость`,"pws.costDisclaimer":`Оценка на основе публичных цен API, не фактический счёт.`,"pws.modelBreakdown":`Разбивка по моделям`,"pws.col.model":`Модель`,"pws.col.cost":`Ориент. стоимость`,"pws.col.tokens":`Токены`,"pws.col.requests":`Запр.`,"pws.col.share":`Доля`,"pws.tokenInput":`Вход`,"pws.tokenOutput":`Выход`,"pws.metricRequests":`запросов`,"pws.metricTokens":`токенов`,"pws.usageUnavailable":`Использование пока не зафиксировано.`,"pws.rateLimits":`Лимиты запросов`,"pws.quotaUnavailable":`Нет данных о квоте для этого провайдера.`,"pws.accountQuotaUnavailable":`Данные о лимитах временно недоступны; при наличии показываются последние известные значения.`,"pws.selected":`Выбрана`,"pws.copyModelId":`Копировать ID`,"pws.modelCopied":`Скопировано!`,"pws.modelsAvailable":`Доступно: {count}`,"pws.modelSearchPlaceholder":`Фильтр моделей…`,"pws.modelsLoading":`Загрузка моделей…`,"pws.modelsLoadFailed":`Не удалось загрузить модели.`,"pws.modelsNeedsReauth":`Для автоматического обнаружения моделей необходимо повторно войти в аккаунт. Пока отображаются настроенные модели.`,"pws.modelsConfiguredFallback":`Отображаются настроенные модели (автоматическое обнаружение недоступно).`,"pws.modelsTruncated":`Показаны первые {shown} моделей из {total}. Примените фильтр, чтобы сузить список.`,"pws.retry":`Повторить`,"pws.noModels":`Для этого провайдера модели не обнаружены.`,"pws.noModelMatch":`Нет моделей, соответствующих фильтру.`,"pws.adapterBaseRequired":`Укажите адаптер и базовый URL.`,"pws.addAccount":`Добавить аккаунт`,"pws.addKey":`Добавить API-ключ`,"pws.apiKeys":`API-ключи`,"pws.authMode":`Режим аутентификации`,"pws.availableAccounts":`Доступные аккаунты`,"pws.accountOrdinal":`Аккаунт {count}`,"pws.accountsLoading":`Загрузка аккаунтов…`,"pws.accountsLoadFailed":`Не удалось загрузить аккаунты.`,"pws.retryAccounts":`Повторить`,"pws.noAccounts":`Аккаунты пока не подключены.`,"pws.cockpitImportDescription":`Импортируйте JSON-экспорт Cockpit Tools Antigravity с этого устройства. Содержимое файла не показывается.`,"pws.cockpitImportFileLabel":`JSON-экспорт Cockpit Tools Antigravity`,"pws.cockpitImportChooseFile":`Выбрать JSON-файл`,"pws.cockpitImporting":`Импорт…`,"pws.cockpitImportInvalid":`Выбранный файл не является корректным JSON-экспортом или слишком велик.`,"pws.cockpitImportFailed":`Не удалось завершить импорт аккаунтов.`,"pws.cockpitImportComplete":`Импорт завершён: импортировано — {imported}, обновлено — {updated}, ошибок — {failed}, неподдерживаемых — {unsupported}.`,"pws.accountSwitching":`Переключение…`,"pws.accountCurrent":`Текущий аккаунт`,"pws.defaultModelNone":`Нет (использовать значение провайдера)`,"pws.discardSettings":`Не сохранять`,"pws.jsonEditorDesc":`Редактируйте исходную JSON-конфигурацию провайдера. Изменения сохраняются сразу.`,"pws.jsonEditorTitle":`Редактор JSON — {name}`,"pws.jsonRestore":`Восстановить`,"pws.jsonSave":`Сохранить`,"pws.loggedInTitle":`Вход выполнен`,"pws.notLoggedInTitle":`Вход не выполнен`,"pws.note":`Заметка`,"pws.allowPrivateNetwork":`Разрешить локальную/частную сеть`,"pws.liveModels":`Обнаруживать модели провайдера`,"pws.liveModelsDesc":`Загружать актуальный каталог моделей провайдера. Выключите, чтобы использовать только настроенные статические модели.`,"pws.xaiResponsesOptIn":`Использовать Responses API для Grok 4.5 и 4.6`,"pws.xaiResponsesOptInDesc":`Направляет обе модели через openai-responses. Другие модели Grok и поведение tier не меняются.`,"pws.xaiResponsesOptInMixed":`Включено частично.`,"pws.cursorTransport":`Транспорт Cursor`,"pws.cursorTransportHttp2":`HTTP/2 (по умолчанию)`,"pws.cursorTransportHttp1":`HTTP/1.1 (совместимость с прокси)`,"pws.cursorTransportDesc":`Используйте HTTP/1.1, если прокси нестабильно передаёт поток Cursor по HTTP/2.`,"pws.optionalPlaceholder":`Необязательно`,"pws.providerId":`ID провайдера`,"pws.reauth":`Нужна переавторизация`,"pws.reauthenticate":`Переавторизоваться`,"pws.clearCooldown":`Сбросить паузу`,"pws.copyDoctor":`Скопировать ocx doctor`,"pws.doctorCopied":`Скопировано`,"pws.healthCooldownHint":`Дождитесь окончания паузы. Пока не проверяйте эту учётную запись.`,"pws.doctorCopyUnavailable":`Буфер обмена недоступен`,"pws.healthLabel.rateLimited":`Ограничение частоты`,"pws.healthLabel.quotaLimited":`Ограничение квоты`,"pws.healthLabel.reauthRequired":`Требуется повторная аутентификация`,"pws.healthLabel.refreshFailed":`Ошибка обновления`,"pws.healthLabel.metadataMismatch":`Несоответствие метаданных`,"pws.healthLabel.credentialConflict":`Конфликт учётных данных`,"pws.healthSummary.rateLimited":`{provider} {account}: ограничение частоты до {until}. Маршрутизация этой учётной записи приостановлена до этого времени.`,"pws.healthSummary.quotaLimited":`{provider} {account}: квота ограничена до {until}. Маршрутизация этой учётной записи приостановлена до этого времени.`,"pws.healthSummary.reauthRequired":`{provider} {account}: требуется повторная аутентификация.`,"pws.healthSummary.credentialConflict":`{provider} {account}: конфликт учётных данных.`,"pws.healthSummary.metadataMismatch":`{provider} {account}: несоответствие метаданных.`,"pws.healthSummary.staleCredentials":`{provider} {account}: неполные учётные данные.`,"pws.removeConfirm":`Удалить`,"pws.removeConfirmBody":`Удалить провайдера "{name}"? Это действие нельзя отменить.`,"pws.removeDefaultConfirmBody":`Удалить провайдера по умолчанию "{name}"? "{defaultProvider}" станет провайдером по умолчанию. Это действие нельзя отменить.`,"pws.removeConfirmTitle":`Удалить провайдера`,"pws.saveSettings":`Сохранить`,"pws.pacingTitle":`Интервал запросов`,"pws.pacingDesc":`Равномерно задерживает начало исходящих запросов к провайдеру. Потоковые ответы могут пересекаться.`,"pws.pacingEnabled":`Включено`,"pws.pacingRpm":`Запросов в минуту`,"pws.pacingRpmUnit":`RPM`,"pws.pacingDelay":`Минимальный интервал (мс)`,"pws.pacingJitter":`Случайная задержка (мс)`,"pws.pacingSlowerWins":`Действует более медленный лимит провайдера. Правила моделей могут только увеличить задержку.`,"pws.pacingQueued":`в очереди`,"pws.pacingNextSlot":`до следующего слота`,"pws.pacingLastModel":`последняя модель`,"pws.pacingNone":`Нет`,"pws.pacingModelOverrides":`Правила моделей`,"pws.pacingModel":`Модель`,"pws.pacingAdd":`Добавить правило`,"pws.pacingRemove":`Удалить`,"pws.pacingRemoveModel":`Удалить интервал запросов для {model}`,"pws.pacingRuleRequired":`Сначала задайте лимит провайдера или правило модели.`,"pws.antigravityTlsTitle":`TLS-профиль браузера Antigravity`,"pws.antigravityTlsEnable":`Включить экспериментальную эмуляцию TLS/HTTP2`,"pws.antigravityTlsWarning":`Неофициальная функция совместимости. Она не гарантирует соблюдение условий использования или отсутствие блокировки, может сделать трафик более отличимым и при ошибке инициализации перейти на Bun. Официальные маршруты Gemini с API-ключом, Vertex или документированный Code Assist безопаснее.`,"pws.antigravityTlsConfirm":`Включить экспериментальный неофициальный TLS-профиль Antigravity? Он не гарантирует соблюдение политики и не предотвращает блокировку. Продолжить?`,"pws.antigravityTlsStatus":`Состояние TLS-профиля: {status}`,"pws.antigravityTlsDisabled":`Отключён`,"pws.antigravityTlsActive":`Активен`,"pws.antigravityTlsFallback":`Резервный режим`,"pws.saving":`Сохранение…`,"pws.settingsSaved":`Настройки сохранены.`,"pws.accountModeSaved":`Режим аккаунта сохранён.`,"pws.accountModeFailed":`Не удалось переключить режим аккаунта.`,"pws.accountModeConfirm":`Переключить режим аккаунта OpenAI? Текущие беседы будут перенаправлены на другой набор аккаунтов, а использование квоты будет учитываться в новом режиме.`,"pws.settingsUnsavedBar":`Есть несохранённые изменения.`,"pws.unsavedLeaveBody":`Есть несохранённые изменения. Сохранить их перед переходом?`,"pws.unsavedLeaveTitle":`Несохранённые изменения`,"pws.attentionRequired":`Требуется внимание`,"pws.attentionAria":`{name}: {reason}`,"pws.missingCredentials":`Отсутствуют учётные данные`,"pws.editJsonDesc":`Редактировать конфигурацию прокси в формате JSON`,"pws.updatesUnavailable":`Обновление провайдера недоступно.`,"pws.dashboard.title":`Обзор провайдеров`,"pws.dashboard.subtitle":`Управляйте всеми провайдерами моделей в одном месте.`,"pws.dashboard.rateLimits":`Лимиты запросов`,"pws.capacity.estimate":`Оценка пула по настроенным весам`,"pws.capacity.currentAccount":`Текущая активная учётная запись`,"pws.capacity.nextRecovery":`Следующее восстановление ёмкости`,"pws.capacity.recoveryShare":`+{percent}% ёмкости пула`,"pws.capacity.incomplete":`Неполное покрытие: исключено аккаунтов: {excluded}, в том числе с неизвестным планом: {unknown}`,"pws.capacity.partial":`Частичное покрытие окон: для {count} аккаунтов доступны не все показанные окна лимитов`,"pws.capacity.windowPartial":`Частично`,"pws.capacity.windowPartialA11y":`{window}: неполное покрытие аккаунтов`,"pws.dashboard.recentlyUsed":`Недавно использованные`,"pws.dashboard.requests":`{count} запросов`,"pws.dashboard.checkedAgo":`Проверено {time}`,"pws.dashboard.noQuota":`Нет данных о квоте`,"pws.dashboard.noUsage":`Данных об использовании пока нет`,"pws.dashboard.noRateLimits":`Данных о лимитах пока нет`,"pws.allProviders":`Обзор провайдеров`,"pws.enabledLabel":`Включён`,"pws.testConnection":`Проверить подключение`,"pws.testing":`Проверка…`,"pws.connectionOk":`Подключение успешно`,"pws.connectionFailed":`Ошибка подключения`,"pws.connectionNotApplicable":`Не применимо — этот провайдер использует статический каталог моделей.`,"pws.editSettings":`Изменить настройки`,"pws.viewUsage":`Подробнее об использовании`,"pws.allSystemsOk":`Все системы работают штатно`,"pws.apiKeyConfigured":`API-ключ настроен`,"pws.addApiKey":`Добавить API-ключ`,"pws.loggedInAs":`Выполнен вход как {email}`,"pws.notLoggedIn":`Вход не выполнен`,"pws.passthrough":`Сквозной режим Codex`,"pws.notes":`Заметки`,"pws.notePlaceholder":`Добавьте заметку об этом провайдере...`,"pws.noteSaved":`Заметка сохранена`,"pws.authSummary":`Аутентификация`,"pws.aiStudio":`AI Studio`,"pws.aiStudio.connected":`Подключено`,"pws.aiStudio.checking":`Проверка сессии`,"pws.aiStudio.unsupported":`Нативный вход не поддерживается на этой платформе`,"pws.aiStudio.needsReauth":`Требуется повторная аутентификация`,"pws.aiStudio.reauthenticated":`Повторная аутентификация выполнена`,"pws.aiStudio.loginFailed":`Не удалось выполнить нативный вход`,"pws.aiStudio.connect":`Подключить`,"time.justNow":`Только что`,"time.notChecked":`Не проверялось`,"time.minutesAgo":`{n} мин назад`,"time.hoursAgo":`{n} ч назад`,"time.daysAgo":`{n} дн. назад`,"modal.noMatch":`Ничего не найдено.`,"modal.oauthDefaultNote":`Войдите со своим аккаунтом — API-ключ не нужен.`,"modal.oauthComingSoon":`Вход через OAuth для {label} появится в следующем обновлении. Пока используйте API-ключ.`,"modal.oauthComingSoonShort":`Вход через OAuth для этого провайдера появится в следующем обновлении — пока используйте API-ключ.`,"modal.useApiKeyInstead":`Использовать API-ключ`,"modal.setupGuide":`Инструкция по настройке`,"modal.setupStep1Prefix":`Откройте`,"modal.setupDashboardLink":`панель управления {label}`,"modal.setupStep1Suffix":`и скопируйте свой API-ключ`,"modal.setupStep2":`Вставьте его в поле «API-ключ» ниже`,"modal.setupStep3":`Нажмите «Добавить провайдера» — модели будут обнаружены автоматически`,"modal.namePlaceholder":`напр. openrouter`,"modal.duplicateWarn":`Провайдер "{name}" уже существует и будет перезаписан.`,"modal.forwardHintPrefix":`Ключ не нужен — прокси передаёт ваши учётные данные`,"modal.forwardCredentials":`codex login`,"modal.forwardHintSuffix":`этому провайдеру.`,"modal.localHint":`API-ключ не сохраняется. Будет добавлен статический публичный каталог моделей Cursor для Codex, но живой транспорт Cursor и нативное выполнение файловых и shell-операций остаются отключёнными до прохождения аудита.`,"modal.getApiKey":`Получить API-ключ {label}`,"modal.apiKey":`API-ключ`,"modal.apiKeyTransport":`Заголовок API-ключа`,"modal.apiKeyTransportNative":`x-api-key (нативный Anthropic)`,"modal.apiKeyTransportBearer":`Authorization: Bearer`,"modal.apiKeyPlaceholder":`sk-… (или $ENV_VAR)`,"modal.defaultModelPlaceholder":`напр. gpt-5.5`,"modal.baseUrlPlaceholder":`https://...`,"modal.baseUrlPlaceholderError":`Базовый URL содержит незаменённый {placeholder}. Замените его реальным значением.`,"modal.baseUrlPlaceholderHint":`Перед добавлением замените {placeholder} в базовом URL на реальный ID аккаунта.`,"modal.adding":`Добавление…`,"modal.useOauthLogin":`← Войти через OAuth`,"nav.codexAuth":`Аутентификация Codex`,"nav.codexSet":`Настройки Codex`,"codexSet.tab.multiauth":`Мультиаутентификация`,"codexSet.tab.prompt":`Промпт`,"codexSet.prompt.title":`Слои промпта`,"codexSet.prompt.timing":`Применяется к новым сессиям. Запущенные сессии сохраняют текущие настройки промпта.`,"codexSet.prompt.staleRevision":`Конфигурация изменилась в другом месте. Список перезагружен.`,"codexSet.prompt.writeFailed":`Не удалось сохранить изменение.`,"codexSet.prompt.loadFailed":`Не удалось загрузить слои промпта.`,"codexSet.prompt.repair":`Восстановить`,"codexSet.prompt.repairFailed":`Не удалось выполнить восстановление.`,"codexSet.drift.journalPresent":`Предыдущая запись не завершилась. Восстановление произойдёт автоматически при следующей записи.`,"codexSet.drift.projectionStale":`Сохранённые слои и значение в config.toml расходятся. Восстановление перезапишет значение из ваших слоёв.`,"codexSet.drift.storeMissing":`Файл слоёв отсутствует, но инструкции в config.toml остались. Восстановление сначала создаст резервную копию и сохранит текст одним слоем.`,"codexSet.drift.ownedMalformed":`Сгенерированная строка в config.toml была изменена вручную, поэтому перезаписывать её небезопасно.`,"codexSet.custom.adoptUnsupported":`Значение в {path}, строка {line}, не является однострочной строкой и не может быть импортировано. Перенесите его вручную, чтобы управлять им здесь.`,"codexSet.prompt.unreadable":`Файл конфигурации Codex существует, но его не удалось прочитать, поэтому изменения отклонены.`,"codexSet.layer.permissions":`Разрешения`,"codexSet.layer.collaboration":`Режим совместной работы`,"codexSet.layer.environment":`Контекст окружения`,"codexSet.layer.apps":`Приложения`,"codexSet.layer.skills":`Навыки`,"codexSet.prompt.extensionsUnknown":`Расширения могут добавлять собственные слои. Codex не раскрывает их, поэтому показать их здесь нельзя.`,"codexSet.group.transition":`Уведомления о переходе`,"codexSet.group.transitionDesc":`Они сообщают об изменении, а не описывают состояние, поэтому появляются только при переходе сессии в реальное время или смене модели.`,"codexSet.custom.slotNote":`Пользовательские слои объединяются в один раздел в этом порядке.`,"codexSet.row.alwaysOn":`Всегда включён`,"codexSet.row.onChange":`При изменении`,"codexSet.row.featureGated":`Настраивается в [features]`,"codexSet.row.openFeatures":`Открыть настройки`,"codexSet.dialog.setValue":`{value} (по умолчанию {fallback})`,"codexSet.dialog.copyKey":`Скопировать ключ`,"codexSet.dialog.unknownLayer":`В этой сборке нет описания этого слоя. Он получен из более новой среды выполнения Codex, чем панель.`,"codexSet.custom.heading":`Пользовательские слои`,"codexSet.custom.add":`+ Добавить слой`,"codexSet.custom.newTitle":`Новый слой`,"codexSet.custom.editTitle":`Изменить слой`,"codexSet.custom.titleLabel":`Название`,"codexSet.custom.bodyLabel":`Инструкции`,"codexSet.custom.bodySize":`{bytes} из {max} байт`,"codexSet.custom.normalized":`Табуляции заменены четырьмя пробелами, а окончания строк — на LF.`,"codexSet.custom.titleRequired":`Введите название.`,"codexSet.custom.titleTooLong":`В названии {count} символов; предел — {max}.`,"codexSet.custom.titleMultiline":`Название должно занимать одну строку.`,"codexSet.custom.bodyTooLarge":`Размер этого слоя — {bytes} байт; предел — {max}.`,"codexSet.custom.composedTooLarge":`Общий размер включённых слоёв составит {bytes} байт и превысит предел.`,"codexSet.custom.invalidCharacter":`Управляющий символ в позиции {position} невозможно сохранить.`,"codexSet.custom.discardPrompt":`Отменить изменения?`,"codexSet.custom.keepEditing":`Продолжить редактирование`,"codexSet.custom.delete":`Удалить {title}`,"codexSet.custom.deleteConfirm":`Удалить этот слой? Это действие нельзя отменить.`,"codexSet.custom.layerGone":`Этот слой был удалён в другом месте, поэтому редактор закрыт.`,"codexSet.custom.deleteConfirmNamed":`Удалить “{title}”? Это действие нельзя отменить.`,"codexSet.custom.moveUp":`Переместить {title} вверх`,"codexSet.custom.prevLayer":`Предыдущий слой`,"codexSet.custom.nextLayer":`Следующий слой`,"codexSet.custom.navPosition":`{position} / {total}`,"codexSet.custom.moveDown":`Переместить {title} вниз`,"codexSet.custom.limitReached":`Можно сохранить не более {max} пользовательских слоёв.`,"codexSet.custom.notOwned":`developer_instructions записан вне opencodex, поэтому его нельзя изменить здесь. Импортируйте его, чтобы управлять им как слоем.`,"codexSet.custom.adopt":`Импортировать существующие инструкции`,"codexSet.custom.adoptConfirm":`Импортировать как слой`,"codexSet.custom.adoptRefused":`Не удалось импортировать существующее значение.`,"codexSet.custom.baseReplaced":`Для model_instructions_file задан путь {path}, поэтому базовый промпт заменён за пределами opencodex.`,"codexSet.lint.identity":`Здесь заявлена личность, отличная от той, которую задаёт Codex.`,"codexSet.lint.foreignTool":`Инструменты предоставляет реестр; упоминание инструмента здесь не создаёт его.`,"codexSet.lint.placeholder":`Инструкции не обрабатываются шаблонизатором, поэтому этот текст будет отправлен буквально.`,"codexSet.lint.applyPatch":`apply_patch определяется реестром инструментов, а не инструкциями.`,"codexSet.lint.approvalVocab":`Codex добавляет собственную терминологию подтверждений; это может ей противоречить.`,"codexSet.lint.environment":`Данные среды создаются позже и могут этому противоречить.`,"codexSet.lint.size":`Размер этого слоя превышает 8 KB. Его можно сохранить, но он расходует токены при каждом запросе.`,"codexSet.preset.blank":`Пустой слой`,"codexSet.preset.concise.name":`Краткий ответ`,"codexSet.preset.concise.description":`Короткие ответы без вступлений и лишнего форматирования.`,"codexSet.preset.concise.provenance":`Адаптировано на основе указаний Claude Code о краткости. Формулировки наши, это не копия.`,"codexSet.preset.planFirst.name":`План перед правками`,"codexSet.preset.planFirst.description":`Сначала изложить план, затем внести изменения.`,"codexSet.preset.planFirst.provenance":`Адаптировано на основе подхода Claude Code к планированию. Формулировки наши, это не копия.`,"codexSet.preset.explainWhy.name":`Объяснять причины`,"codexSet.preset.explainWhy.description":`Объяснять не только что, но и почему.`,"codexSet.preset.explainWhy.provenance":`Адаптировано на основе стиля подтверждений Grok Build. Формулировки наши, это не копия.`,"codexSet.preset.testFirst.name":`Сначала тест`,"codexSet.preset.testFirst.description":`Перед исправлением написать тест, который завершается с ошибкой.`,"codexSet.preset.testFirst.provenance":`Адаптировано на основе распространённой практики работы агентов. Формулировки наши, это не копия.`,"codexSet.preset.korean.name":`Ответы на корейском`,"codexSet.preset.korean.description":`Отвечать на корейском независимо от языка запроса.`,"codexSet.preset.korean.provenance":`Написано для opencodex на основе частого пользовательского запроса. Формулировки наши, это не копия.`,"codexSet.dialog.class":`Тип`,"codexSet.dialog.key":`Ключ конфигурации`,"codexSet.dialog.fileValue":`Значение в этом файле`,"codexSet.dialog.absentDefault":`не задано (по умолчанию: {value})`,"codexSet.dialog.noRenderedText":`Codex не раскрывает собранный текст встроенного слоя, поэтому здесь приведены описание слоя и его ключ, а не содержимое.`,"codexSet.dialog.sourceText":`Текст, отправляемый модели`,"codexSet.dialog.sourceBytes":`{bytes} байт`,"codexSet.dialog.notRendered":`На прочитанном нами шаге этот слой ничего не отправил. Разделы пересылаются только при изменении, поэтому в одной выборке слой может отсутствовать.`,"codexSet.dialog.emptySource":`Файл {path} существует, но пуст, поэтому этот слой ничего не отправляет.`,"codexSet.dialog.notExposed":`Базовый промпт передаётся вне списка сообщений, который Codex может напечатать, поэтому показать его здесь нельзя. Заменить его можно через model_instructions_file.`,"codexSet.dialog.textUnavailable":`На этой машине не удалось прочитать промпт Codex, поэтому текст недоступен.`,"codexSet.class.base":`Базовые инструкции`,"codexSet.class.config-toggle":`Переключается здесь`,"codexSet.class.feature-gated":`Управляется флагом функции`,"codexSet.class.runtime-conditional":`Зависит от среды выполнения`,"codexSet.class.extension-unknown":`Слой расширения`,"codexSet.layer.base-instructions":`Базовые инструкции`,"codexSet.layer.model-switch":`Уведомление о смене модели`,"codexSet.layer.personality":`Стиль общения`,"codexSet.layer.context-window-guidance":`Рекомендации по контекстному окну`,"codexSet.layer.realtime":`Реальное время`,"codexSet.layer.agents-md":`AGENTS.md`,"codexSet.layer.environments-instructions":`Среды выполнения`,"codexSet.layer.plugins":`Плагины`,"codexSet.layer.tools":`Инструменты`,"codexSet.layer.multi-agent-mode":`Мультиагентный режим`,"codexSet.layer.git-attribution":`Атрибуция коммитов`,"codexSet.about.base-instructions":`Собственные инструкции Codex. Они передаются вместе с запросом, и отключить их нельзя.`,"codexSet.about.model-switch":`Добавляется при смене модели во время диалога.`,"codexSet.about.personality":`Указания по тону и стилю, управляемые флагом функции.`,"codexSet.about.context-window-guidance":`Рекомендации по оставшемуся бюджету контекста, управляемые флагом функции.`,"codexSet.about.realtime":`Добавляется для сеансов реального времени.`,"codexSet.about.agents-md":`Файлы AGENTS.md вашего проекта. Эта страница лишь показывает слой и никогда не изменяет документацию проекта.`,"codexSet.about.permissions":`Описывает действующие настройки песочницы и подтверждений.`,"codexSet.about.collaboration":`Описывает активный режим совместной работы.`,"codexSet.about.environment":`Рабочий каталог, платформа и другие сведения об окружении.`,"codexSet.about.environments-instructions":`Указания для сред отложенного выполнения, управляемые флагом функции.`,"codexSet.about.apps":`Правила использования подключённых приложений.`,"codexSet.about.plugins":`Добавляется, если выбран плагин или какой-либо плагин объявляет возможность.`,"codexSet.about.tools":`Описания отложенных инструментов, управляемые флагом функции.`,"codexSet.about.skills":`Список доступных навыков.`,"codexSet.about.multi-agent-mode":`Инструкции для подагентов, управляемые флагом функции.`,"codexSet.about.git-attribution":`Просит модель добавлять трейлер Co-authored-by: Codex в коммиты, которые она пишет, и строку Generated with Codex. в пул-реквесты, которые она открывает. Codex берёт это из вашей учётной записи, поэтому настройки нет ни здесь, ни в [features]. Если в учётной записи атрибуция отключена, Codex отправляет обратную инструкцию, а не молчит.`,"codexSet.condition.model-switch":`Добавляется только после смены модели во время сеанса.`,"codexSet.condition.realtime":`Добавляется только в сеансе реального времени.`,"codexSet.condition.agents-md":`Добавляется, если для рабочего каталога найден документ проекта.`,"codexSet.condition.plugins":`Добавляется, если выбран плагин или какой-либо плагин объявляет возможность.`,"codexSet.condition.git-attribution":`Определяется политикой атрибуции вашей учётной записи.`,"codexSet.base.title":`Базовый промпт`,"codexSet.base.prev":`Предыдущий вариант`,"codexSet.base.next":`Следующий вариант`,"codexSet.base.position":`{position} / {total}`,"codexSet.base.swipeHint":`Проведите в сторону, используйте клавиши-стрелки или кнопки со стрелками. Применяется к новым сессиям.`,"codexSet.base.defaultTitle":`Собственный базовый промпт Codex`,"codexSet.base.defaultBody":`Вариант по умолчанию здесь не хранится, поэтому его нечего править или удалять: выбор просто убирает model_instructions_file из конфигурации, и Codex берёт свой штатный промпт.`,"codexSet.base.variantTitle":`Название`,"codexSet.base.variantBody":`Промпт`,"codexSet.base.replacesWarning":`Это ЗАМЕНЯЕТ собственный базовый промпт Codex, а не дополняет его. Короткий текст здесь означает короткие инструкции для модели.`,"codexSet.base.use":`Использовать этот`,"codexSet.base.inUse":`Используется`,"codexSet.base.externalBlocked":`model_instructions_file уже указывает на {path}, и это значение записал не opencodex. Уберите его сами, прежде чем выбирать здесь.`,"nav.api":`API`,"nav.integrations":`Интеграции`,"nav.openMenu":`Открыть меню`,"nav.closeMenu":`Закрыть меню`,"integrations.subtitle":`Подключайте клиенты к opencodex, управляйте учётными данными и восстанавливайте конфигурацию клиентов.`,"integrations.tabsLabel":`Разделы интеграций`,"integrations.tab.overview":`Обзор`,"integrations.tab.keys":`Ключи API`,"integrations.tab.codex":`Codex CLI`,"integrations.tab.claude":`Claude`,"integrations.tab.grok":`Grok Build`,"integrations.tab.opencode":`OpenCode`,"integrations.tab.pi":`Pi`,"integrations.tab.omp":`OMP`,"integrations.tab.hermes":`Hermes`,"integrations.tab.openclaw":`OpenClaw`,"integrations.tab.kimi":`Kimi Code`,"integrations.tab.gajae":`Gajae Code`,"integrations.tab.dsh":`DeepSeek Harness (DSH)`,"integrations.tab.mcode":`MiniMax Code`,"integrations.tab.zcode":`ZCode`,"integrations.tab.prime":`Prime Agent`,"integrations.codex.title":`Codex CLI`,"integrations.codex.body":`Подключением Codex управляет прокси-сервис. При запуске opencodex оно применяется, а при остановке сервиса восстанавливается нативная маршрутизация.`,"integrations.codex.openService":`Открыть управление сервисом`,"integrations.state.notInstalled":`Не установлен`,"integrations.state.unknown":`Проверка…`,"integrations.detail.codexRouted":`Запросы Codex идут через этот прокси`,"integrations.detail.codexAbsent":`Codex пока не идёт через этот прокси`,"integrations.detail.keyCount":`Выпущено ключей: {count}`,"integrations.detail.keyNone":`Ключи не выпущены`,"integrations.detail.keyChecking":`Проверка…`,"integrations.detail.keyUnavailable":`Статус ключей недоступен`,"integrations.detail.claudeOff":`Подключение выключено`,"integrations.detail.desktopCurrent":`Desktop работает с этим профилем`,"integrations.detail.desktopStale":`Файл профиля изменился после применения`,"integrations.detail.desktopNotServed":`Профиль есть, но Desktop использует другой`,"integrations.detail.desktopAbsent":`Профиль не применён`,"integrations.detail.desktopDesiredOff":`Интеграция Claude Desktop отключена`,"integrations.detail.desktopDesiredOffCleanupPending":`Claude Desktop всё ещё использует шлюз; очистка не завершена`,"integrations.detail.desktopDesiredOnNotApplied":`Интеграция включена, но Desktop не использует профиль шлюза`,"integrations.detail.desktopSelectedElsewhere":`Desktop использует другой профиль`,"integrations.detail.desktopProfileDrift":`Выбранный профиль Desktop был изменён`,"integrations.detail.desktopObservedUnsafe":`Выбранный профиль Desktop нельзя безопасно изменить`,"integrations.detail.desktopNotInstalled":`Библиотека конфигурации Claude Desktop не установлена`,"integrations.dialog.desktop.title":`Отключить интеграцию Claude Desktop?`,"integrations.dialog.desktop.changes":`Если {path} содержит профиль шлюза, управляемый opencodex, Desktop сначала выберет новый стандартный профиль без учётных данных, а затем удалит старый профиль и резервную копию.`,"integrations.dialog.desktop.breakage":`Claude Desktop вернётся к обычному Claude вместо моделей, маршрутизируемых через opencodex.`,"integrations.dialog.desktop.undo":`При повторном включении профиль opencodex будет создан заново из сохранённых назначений моделей.`,"integrations.dialog.desktop.restart":`Claude Desktop читает эту конфигурацию только при запуске. Полностью закройте и снова откройте Desktop, чтобы изменение вступило в силу.`,"integrations.dialog.desktop.confirm":`Отключить`,"integrations.native.error.desktopUnsafeMetadata":`Не удалось безопасно прочитать метаданные Claude Desktop в {path}, поэтому библиотека не изменялась.`,"integrations.native.error.desktopCleanupIncomplete":`Claude Desktop указывает на стандартный режим, но старые файлы учётных данных opencodex остались в: {paths}.`,"integrations.native.msg.desktopDisabled":`Интеграция Claude Desktop отключена.`,"integrations.native.msg.desktopEnabled":`Интеграция Claude Desktop включена.`,"integrations.detail.grokModels":`Подключено моделей: {count}`,"integrations.detail.grokAbsent":`В конфигурации нет блока opencodex`,"integrations.dialog.grok.title":`Отключить интеграцию Grok Build?`,"integrations.dialog.grok.changes":`Из {path} будет удалён только блок, отмеченный opencodex. Содержимое, добавленное вручную вне блока, останется без изменений.`,"integrations.dialog.grok.breakage":`После отключения псевдонимы моделей opencodex исчезнут из Grok Build. Модели, использовавшиеся с учётной записью xAI, останутся доступны.`,"integrations.dialog.grok.undo":`Если opencodex запущен на loopback-адресе, при повторном включении будет записан новый блок из списка доступных на тот момент моделей.`,"integrations.dialog.grok.confirm":`Отключить`,"integrations.native.msg.nonLoopbackRemoved":`Grok Build можно регистрировать автоматически, только когда opencodex запущен на loopback-адресе. Предыдущий блок, указывавший на loopback-адрес, удалён.`,"integrations.native.msg.nonLoopbackRemovedNoop":`Grok Build можно регистрировать автоматически, только когда opencodex запущен на loopback-адресе. Предыдущего блока для удаления не было.`,"integrations.native.msg.nonLoopbackSuperseded":`Grok Build можно регистрировать автоматически, только когда opencodex запущен на loopback-адресе. Тем временем другая программа записала в конфигурацию новый блок, поэтому текущий блок в файле создан не этим запросом.`,"integrations.native.error.orphanedMarker":`В {path} есть начальная метка opencodex, но нет конечной. Файл не изменён, потому что невозможно надёжно определить конец блока.`,"integrations.native.error.homeMismatch":`Домашний каталог установленного сервиса не совпадает с текущим, поэтому файл не изменён.`,"integrations.native.error.notInstalled":`Grok Build не установлен, поэтому изменять нечего.`,"integrations.native.error.configBusy":`Конфигурация сохраняется в другом месте, поэтому изменить её не удалось. Повторите попытку чуть позже.`,"integrations.state.absent":`Не применено`,"integrations.state.current":`Применено`,"integrations.state.stale":`Требуется обновление`,"integrations.state.conflict":`Конфликт`,"integrations.state.unsafe":`Невозможно проверить`,"integrations.summary.detected":`Клиентов найдено`,"integrations.summary.applied":`Настроено клиентов`,"integrations.summary.stale":`Требуется обновление`,"integrations.summary.lastChange":`Последнее изменение`,"integrations.summary.disableAll":`Отключить все…`,"integrations.onboarding":`При применении сначала сохраняется резервная копия, а затем записывается один блок провайдера opencodex. При отключении удаляется только этот блок, а сохранённый снимок можно восстановить.`,"integrations.empty.title":`Установленные клиенты не обнаружены`,"integrations.empty.body":`Установите поддерживаемый клиент, затем вернитесь сюда и примените opencodex.`,"integrations.action.apply":`Применить`,"integrations.action.disable":`Отключить`,"integrations.action.refresh":`Обновить`,"integrations.action.settings":`Настройки`,"integrations.action.manageKeys":`Управлять ключами`,"integrations.action.restore":`Восстановить…`,"integrations.action.undo":`Отменить`,"integrations.action.restorePoint":`Восстановить эту точку…`,"integrations.action.snapshotExpired":`Резервная копия устарела`,"integrations.rollback.title":`Центр восстановления`,"integrations.rollback.empty":`Истории применений пока нет`,"integrations.rollback.emptyBody":`Перед каждой успешной записью сначала сохраняется снимок исходного состояния.`,"integrations.restore.title":`Восстановить этот снимок?`,"integrations.restore.body":`Сначала будет создана резервная копия текущего файла, затем выбранный снимок заменит его.`,"integrations.restore.driftTitle":`Обнаружены более новые изменения`,"integrations.restore.driftBody":`Изменения, сделанные после этого снимка, будут сохранены в резервной копии, а затем файл будет заменён.`,"integrations.restore.confirm":`Восстановить`,"integrations.restore.confirmDrift":`Сохранить новые изменения и восстановить`,"integrations.restore.pending":`Восстановление…`,"integrations.restore.manual":`Автоматическое восстановление не удалось: {reason}. Восстановите вручную из {path}.`,"integrations.error.load":`Не удалось загрузить состояние интеграции.`,"integrations.error.stale":`Последнее обновление не удалось. Значения ниже могут быть устаревшими.`,"integrations.error.busy":`Другое изменение для этого клиента ещё выполняется. Повторите попытку чуть позже.`,"integrations.error.conflict":`После записи opencodex конфигурация изменилась. Ничего не было удалено.`,"integrations.error.unsafe":`Конфигурацию нельзя изменить безопасно.`,"integrations.error.generic":`Изменить интеграцию не удалось. Предыдущее состояние сохранено.`,"integrations.error.nonLoopback":`{client} может обращаться только к прокси на localhost: в его конфигурации негде разместить заголовок, который требуется при удалённой привязке, поэтому ручная настройка тоже не поможет. Обеспечьте доступ через loopback — туннелем или локальным форвардером.`,"integrations.status.installed":`Установлен`,"integrations.status.notInstalled":`Не установлен`,"integrations.status.appliedAt":`Применено`,"integrations.status.backup":`Резервная копия`,"integrations.status.lastRestore":`Последнее восстановление`,"integrations.status.unknown":`Неизвестно`,"integrations.bulk.title":`Отключить применённые интеграции клиентов?`,"integrations.bulk.body":`Будет удалён только блок, принадлежащий opencodex. Для каждого клиента предварительно сохраняется снимок исходного состояния.`,"integrations.bulk.partial":`Не удалось отключить некоторые клиенты: {clients}`,"integrations.bulk.success":`Применённые интеграции клиентов отключены.`,"integrations.retention.degraded":`Очистка резервных копий отстаёт; старые копии могут всё ещё находиться на диске.`,"integrations.error.residual":`Файл может остаться в промежуточном состоянии: {message} Восстановите его из {path}.`,"integrations.error.recover":`{message} Резервная копия находится в {path}.`,"integrations.kind.apply":`Применено`,"integrations.kind.disable":`Отключено`,"integrations.kind.refresh":`Обновлено`,"integrations.kind.restore":`Восстановлено`,"integrations.semantics.opencode":`Действует только при прямом запуске с диска; внедрение окружения через ocx opencode имеет приоритет.`,"integrations.semantics.pi":`Применяется к новым сеансам.`,"integrations.semantics.omp":`Перезапустите OMP, чтобы загрузить каталог.`,"integrations.semantics.hermes":`Применяется к новым сеансам.`,"integrations.semantics.openclaw":`Немедленно применяется к работающему шлюзу.`,"integrations.semantics.kimi":`Чтобы применить, перезапустите клиент или выполните /reload (v2 отслеживает файл).`,"integrations.semantics.gajae":`Применяется в новом сеансе или при открытии /model.`,"integrations.semantics.dsh":`OpenCodex управляет только llm-pi-ai.providers.opencodex в $DSH_HOME/settings.yaml. DSH применяет этот провайдер горячей перезагрузкой; модель по умолчанию и deepseek-official остаются без изменений. Сейчас поддерживается только loopback; реальные учётные данные не записываются.`,"integrations.semantics.mcode":`Управляет только custom_provider.opencodex. Модель по умолчанию и вход MiniMax не меняются.`,"integrations.semantics.zcode":`Управляет только provider.opencodex в ~/.zcode/v2/config.json. Вход Z.ai и другие провайдеры не меняются. Перезапустите ZCode после изменений.`,"integrations.semantics.prime":`Управляет только providers.opencodex в models.json Prime Agent — ~/.prime/agent, если PRIME_AGENT_CODING_AGENT_DIR не переопределяет путь. Другие провайдеры и переопределения моделей не меняются. Применяется к новым сессиям.`,"codexAuth.mainAccount":`Основной аккаунт`,"codexAuth.logLabel":`Метка журнала`,"codexAuth.codexApp":`Codex App`,"codexAuth.appLogin":`Вход через приложение`,"codexAuth.accountPool":`Пул аккаунтов`,"codexAuth.accountModeTitle":`Режим аккаунта OpenAI`,"codexAuth.accountModePool":`Режим пула`,"codexAuth.accountModePoolDesc":`Основной вход и подходящие добавленные аккаунты работают здесь в ротации.`,"codexAuth.accountModeDirect":`Прямой режим`,"codexAuth.accountModeDirectDesc":`Запросы используют только основной вход; добавленные аккаунты сохраняются для режима пула.`,"codexAuth.openaiMissing":`Встроенный провайдер OpenAI не настроен.`,"codexAuth.openaiDisabled":`Встроенный провайдер OpenAI отключён.`,"codexAuth.openaiUnavailableDesc":`Ваши аккаунты OpenAI по-прежнему доступны. Включите провайдера для маршрутизации запросов Codex.`,"codexAuth.enableOpenai":`Включить OpenAI`,"codexAuth.enablingOpenai":`Включение...`,"codexAuth.enableOpenaiFailed":`Не удалось включить провайдер OpenAI.`,"codexAuth.openaiPresetLoadFailed":`Не удалось загрузить пресет провайдера OpenAI.`,"codexAuth.openaiPresetUnavailable":`Пресет провайдера OpenAI недоступен.`,"codexAuth.openProviders":`Открыть провайдеров`,"codexAuth.add":`Добавить`,"codexAuth.sparkQuota":`Квота Codex Spark`,"codexAuth.sparkQuotaHint":`Показывать недельное окно GPT-5.3-Codex-Spark на карточках аккаунтов. По умолчанию скрыто: оно относится лишь к одной модели.`,"codexAuth.sparkQuotaShown":`Квота Codex Spark показана`,"codexAuth.sparkQuotaHidden":`Квота Codex Spark скрыта`,"codexAuth.sparkQuotaFailed":`Не удалось изменить настройку квоты Codex Spark`,"codexAuth.refreshQuota":`Обновить квоты`,"codexAuth.refreshingQuota":`Обновление...`,"codexAuth.quotaRefreshed":`Квоты обновлены`,"codexAuth.quotaRefreshFailed":`Не удалось обновить квоты`,"codexAuth.pauseExhausted":`Приостановить исчерпанные`,"codexAuth.pausingExhausted":`Проверка квот...`,"codexAuth.pauseExhaustedSucceeded":`Приостановлено аккаунтов на лимите: {count}`,"codexAuth.pauseExhaustedNone":`Нет аккаунтов с подтверждённым использованием 100%.`,"codexAuth.pauseExhaustedFailed":`Не удалось проверить и приостановить исчерпанные аккаунты.`,"codexAuth.noPool":`В пул ещё не добавлено ни одного аккаунта.`,"codexAuth.pause":`Приостановить`,"codexAuth.resume":`Возобновить`,"codexAuth.paused":`ПРИОСТАНОВЛЕН`,"codexAuth.pauseSucceeded":`Аккаунт {email} приостановлен`,"codexAuth.resumeSucceeded":`Аккаунт {email} снова доступен в пуле`,"codexAuth.pauseFailed":`Не удалось приостановить {email}. Изменений нет.`,"codexAuth.resumeFailed":`Не удалось возобновить {email}. Изменений нет.`,"codexAuth.pausedHint":`До возобновления исключён из автоматического переключения, повторов, восстановления после задержки и ручного выбора.`,"codexAuth.pinned":`ЗАКРЕПЛЁН`,"codexAuth.pinnedHint":`Этот аккаунт выбран вручную, поэтому более высокий порядок выбора не обойдёт его. Закрепление действует, пока этот аккаунт не будет исчерпан, пока вы не выберете другой или пока вы не измените порядок выбора любого аккаунта.`,"codexAuth.fiveHour":`5 ч`,"codexAuth.weekly":`Неделя`,"codexAuth.monthly":`30 дн.`,"codexAuth.resets":`сброс`,"codexAuth.today":`сегодня`,"codexAuth.current":`ТЕКУЩИЙ`,"codexAuth.nextSession":`ВЫБРАН`,"codexAuth.poolPrepared":`ГОТОВ ДЛЯ ПУЛА`,"codexAuth.preparePoolTitle":`Подготовить этот аккаунт для режима пула?`,"codexAuth.preparePoolDesc":`Прямые запросы продолжат использовать основной вход. Когда режим пула будет включён, этот аккаунт станет подготовленным выбором пула.`,"codexAuth.prepareForPool":`Подготовить для пула`,"codexAuth.poolPreparedToast":`{email} подготовлен для режима пула`,"codexAuth.switchTitle":`Сменить активный аккаунт?`,"codexAuth.switchDesc":`Применяется сразу. Существующие привязанные к аккаунту потоки и уже выполняющиеся запросы сохраняют прежний аккаунт; новые или непривязанные запросы используют порядковый уровень выбранного аккаунта. Аккаунты с тем же порядком выбора продолжают чередоваться.`,"codexAuth.cacheWarning":`Кэш промптов сбрасывается при смене аккаунта. Новая сессия начнётся с пустым кэшем.`,"codexAuth.setAsNext":`Использовать этот аккаунт следующим`,"codexAuth.cancel":`Отмена`,"codexAuth.switchBack":`Вернуться на основной аккаунт?`,"codexAuth.switchBackDesc":`Применяется сразу. Существующие привязанные к аккаунту потоки и уже выполняющиеся запросы сохраняют прежний аккаунт; новые или непривязанные запросы используют порядковый уровень аккаунта входа через приложение. Аккаунты с тем же порядком выбора продолжают чередоваться.`,"codexAuth.autoSwitch":`Проактивное переключение по использованию`,"codexAuth.autoSwitchQuotaDesc":`Квота: при использовании {threshold}% или выше следующий запрос может перейти на подходящий аккаунт с меньшим использованием, включая уже привязанную задачу; Go/Free используют только 30 дней.`,"codexAuth.autoSwitchQuotaOffDesc":`Проактивное переключение по использованию выключено. Назначение новых/непривязанных задач и восстановление после сбоев остаются активными.`,"codexAuth.autoSwitchRoundRobinDesc":`Round-robin не использует этот порог и продолжает ротировать новые/непривязанные задачи.`,"codexAuth.autoSwitchFillFirstDesc":`Fill-first: {threshold}% — порог исчерпания для новых/непривязанных задач; здоровые привязанные задачи сохраняют аккаунт.`,"codexAuth.autoSwitchFillFirstOffDesc":`У fill-first нет порога использования для новых/непривязанных задач; cooldown, повторная аутентификация и восстановление после сбоев всё ещё могут менять маршрутизацию.`,"codexAuth.failureRecoveryNote":`Восстановление после сбоев выполняется отдельно: отказ 429/402 до вывода, cooldown, повторная аутентификация, исключение или настроенный failover могут выбрать другой подходящий аккаунт.`,"codexAuth.autoSwitchThreshold":`Порог использования`,"codexAuth.autoSwitchThresholdAria":`Порог использования в процентах`,"codexAuth.autoSwitchThresholdInc":`Увеличить порог использования`,"codexAuth.autoSwitchThresholdDec":`Уменьшить порог использования`,"codexAuth.autoSwitchLoadFailed":`Не удалось загрузить настройку переключения по использованию.`,"codexAuth.autoSwitchThresholdInvalid":`Введите целое число от 1 до 100`,"codexAuth.autoSwitchUpdated":`Проактивное переключение по использованию обновлено`,"codexAuth.autoSwitchUpdateFailed":`Не удалось подтвердить обновление переключения по использованию. Показано последнее подтверждённое значение.`,"codexAuth.requestUserInput":`Запрашивать ввод в режиме Default`,"codexAuth.requestUserInputDesc":`Позволяет Codex ставить сеанс Default на паузу и задавать вопросы через инструмент request_user_input.`,"codexAuth.requestUserInputUpdated":`Флаг обновлён - применяется к новым сеансам.`,"codexAuth.requestUserInputUpdatedRestart":`Флаг обновлён - применяется к новым сеансам. Перезапустите приложение Codex.`,"codexAuth.requestUserInputUpdateFailed":`Не удалось обновить флаг. Ничего не изменено.`,"codexAuth.requestUserInputLoadFailed":`Не удалось прочитать флаг из config.toml.`,"codexAuth.accountPickerTitle":`Выбирать конкретный аккаунт Codex в списке моделей`,"codexAuth.accountPickerOffDesc":`После включения обычные пункты GPT в списке моделей заменяются отдельным пунктом для каждого селектора аккаунта, поэтому можно явно выбрать аккаунт для разговора без выхода из системы. Отключение не удаляет аккаунты.`,"codexAuth.accountPickerOnDesc":`Каждый селектор — публичная метка одного сохранённого аккаунта. Выбор закрепляет разговор за этим аккаунтом: без ротации и перехода на другой аккаунт, а активный аккаунт Pool не меняется.`,"codexAuth.accountPickerCompatibility":`Для встроенного входа Codex App используется отдельный селектор; в созданных map он обычно называется main, а при коллизии получает безопасный суффикс вроде main-2. Добавленные аккаунты получают стабильные метки, не раскрывающие личные данные, а пользовательские имена селекторов сохраняются. Существующие разговоры и сохранённые варианты моделей продолжают маршрутизироваться. Отключение скрывает созданные пункты, но сохраняет селекторы и точные маршруты. Обычные идентификаторы моделей GPT продолжают работать в режиме Pool или Direct.`,"codexAuth.accountPickerUpdated":`Выбор целевого аккаунта обновлён.`,"codexAuth.accountPickerUpdateFailed":`Не удалось обновить выбор целевого аккаунта. Показана последняя подтверждённая настройка.`,"codexAuth.accountPickerLoadFailed":`Не удалось загрузить настройку выбора аккаунта.`,"codexAuth.accountPickerRefreshFailed":`Не удалось обновить эту настройку. По-прежнему показано последнее подтверждённое значение.`,"codexAuth.advancedSettings":`Дополнительные настройки`,"codexAuth.advancedSettingsAria":`Показать или скрыть дополнительные настройки Codex Auth`,"codexAuth.catalogRefreshPending":`Изменение сохранено, но обновление каталога моделей Codex ещё не завершено. Выполните ocx sync, чтобы повторить попытку.`,"anthropicPool.title":`Пул аккаунтов Claude (экспериментально)`,"anthropicPool.enabledDesc":`При 429 аккаунт охлаждается и выполняется переключение. Новые сессии предпочитают использование ниже {threshold}% (полоса 5 часов).`,"anthropicPool.disabledDesc":`Используется только активный аккаунт Claude. Включайте только если принимаете экспериментальную маршрутизацию.`,"anthropicPool.experimentalWarning":`Экспериментально и недостаточно проверено. Anthropic может ограничить аккаунты, похожие на автоматическую ротацию. Одна организация может делить квоту — пул таких аккаунтов не поможет. Оставляйте выключенным, если не понимаете риск.`,"anthropicPool.needTwoAccounts":`Перед включением пула добавьте минимум два OAuth-аккаунта Claude.`,"anthropicPool.threshold":`Порог использования для новых сессий`,"anthropicPool.thresholdAria":`Порог использования для новых сессий в процентах`,"anthropicPool.thresholdHelp":`0 отключает выбор по квоте (только аффинити + активный аккаунт). По умолчанию 80.`,"anthropicPool.thresholdInvalid":`Введите целое число от 0 до 100`,"anthropicPool.loadFailed":`Не удалось загрузить настройки пула Claude.`,"anthropicPool.saveFailed":`Не удалось сохранить настройки пула Claude.`,"anthropicPool.on":`Вкл`,"anthropicPool.off":`Выкл`,"cursorPool.title":`Пул аккаунтов Cursor (экспериментально)`,"cursorPool.enabledDesc":`При 429 или ошибке аутентификации аккаунт охлаждается и выполняется переключение для этой беседы. Каждая беседа остаётся на одном аккаунте до rate-limit или ошибки учётных данных.`,"cursorPool.disabledDesc":`Используется только активный аккаунт Cursor. Включайте только если принимаете экспериментальную маршрутизацию.`,"cursorPool.experimentalWarning":`Экспериментально и недостаточно проверено. Политика Cursor запрещает обход лимитов запросов и манипуляции с учётом использования. Включённое использование Teams рассчитывается на место и может не переноситься. Оставляйте выключенным, если не понимаете риск.`,"cursorPool.needTwoAccounts":`Перед включением пула добавьте минимум два OAuth-аккаунта Cursor.`,"cursorPool.loadFailed":`Не удалось загрузить настройки пула Cursor.`,"cursorPool.saveFailed":`Не удалось сохранить настройки пула Cursor.`,"cursorPool.on":`Вкл`,"cursorPool.off":`Выкл`,"antigravityRouting.failoverOnlyTitle":`Маршрутизация нескольких аккаунтов (только failover)`,"antigravityRouting.failoverOnlyDesc":`Каждая беседа остаётся на одном аккаунте Antigravity. При rate-limit 429 или ошибке учётных данных opencodex может переключиться на другой подходящий аккаунт для этой беседы — без распределения новых сессий между аккаунтами и без изменения глобального активного аккаунта для других живых бесед.`,"accountPool.strategy":`Стратегия ротации`,"accountPool.strategyDesc":`Как OpenCodex назначает аккаунт новой/непривязанной задаче.`,"accountPool.strategyQuota":`Квота`,"accountPool.strategyRoundRobin":`Round-robin`,"accountPool.strategyFillFirst":`Fill-first`,"accountPool.strategyHintQuota":`Quota может перепривязать существующую задачу при следующем запросе после превышения порога использования.`,"accountPool.strategyHintRoundRobin":`Round-robin ротирует только задачи без действующей привязки; порог использования не меняет обычную ротацию.`,"accountPool.strategyHintFillFirst":`Fill-first использует порог как точку исчерпания для непривязанных задач; здоровые привязанные задачи сохраняют affinity.`,"accountPool.unboundDefinition":`Новая/непривязанная задача — запрос без текущей привязки к аккаунту; видимая существующая задача может стать непривязанной после сброса прокси или affinity.`,"accountPool.stickyLimit":`Назначений новых/непривязанных задач до ротации`,"accountPool.stickyLimitAria":`Назначений новых/непривязанных задач до ротации`,"accountPool.stickyLimitInc":`Увеличить sticky-лимит`,"accountPool.stickyLimitDec":`Уменьшить sticky-лимит`,"accountPool.stickyLimitHelp":`Назначить выбранному аккаунту столько новых/непривязанных задач перед переходом дальше; счётчик растёт при привязке задачи, а не после успеха upstream.`,"accountPool.stickyLimitInvalid":`Введите целое число от 1 до 100`,"accountPool.strategyLoadFailed":`Не удалось загрузить стратегию ротации.`,"accountPool.strategyUpdateFailed":`Не удалось сохранить стратегию ротации.`,"accountPool.priority":`Порядок выбора`,"accountPool.priorityAria":`Порядок выбора для этого аккаунта`,"accountPool.priorityHint":`Большие числа используются раньше. Пул переходит к меньшему числу только тогда, когда все аккаунты выше исчерпаны или недоступны.`,"accountPool.priorityFirst":`Первым`,"accountPool.priorityEarlier":`Раньше`,"accountPool.priorityNormal":`По умолчанию`,"accountPool.priorityLater":`Позже`,"accountPool.priorityLast":`Последним`,"accountPool.priorityOption":`{name} ({value})`,"accountPool.priorityCustom":`Своё значение`,"accountPool.priorityUpdated":`Порядок выбора для {email} обновлён`,"accountPool.priorityUpdateFailed":`Не удалось сохранить порядок выбора для {email}. Показано последнее подтверждённое значение.`,"codexAuth.switched":`{email} выбран для следующего запроса`,"codexAuth.loadFailed":`Не удалось загрузить настройки аккаунтов Codex.`,"codexAuth.switchFailed":`Не удалось переключить аккаунт. Ваш предыдущий выбор не изменён.`,"codexAuth.removeConfirm":`Удалить {id}?`,"codexAuth.removeFailed":`Не удалось удалить аккаунт. Ничего не изменено.`,"codexAuth.addTitle":`Добавить аккаунт Codex`,"codexAuth.addIdLabel":`ID аккаунта (slug)`,"codexAuth.addIdPlaceholder":`codex-work, codex-alt, team...`,"codexAuth.resetCreditsAria":`Кредитов сброса: {count}`,"codexAuth.addJsonLabel":`Содержимое auth.json`,"codexAuth.addHelp":`Скопируйте из ~/.codex/auth.json на другой машине или используйте codex-auth export.`,"codexAuth.importBtn":`Импортировать`,"codexAuth.importInvalidJson":`Некорректный JSON`,"codexAuth.importMissingTokens":`В JSON отсутствует access_token или refresh_token`,"codexAuth.importMissingId":`Укажите ID аккаунта`,"codexAuth.accountAdded":`Аккаунт добавлен в пул`,"codexAuth.addPickDesc":`Войдите в другой аккаунт ChatGPT, чтобы добавить его в пул.`,"codexAuth.oauthLogin":`Вход через OAuth`,"codexAuth.oauthDesc":`Открывает вход ChatGPT в браузере`,"codexAuth.importAuthJson":`Импорт auth.json`,"codexAuth.importAuthJsonDesc":`Из другой установки Codex или через codex-auth export`,"codexAuth.back":`Назад`,"codexAuth.oauthAlreadyInProgress":`Вход уже выполняется. Завершите его в браузере.`,"codexAuth.oauthWaiting":`Ожидание завершения входа ChatGPT в браузере...`,"codexAuth.oauthSubmittingCode":`Отправка кода…`,"codexAuth.oauthCodeSubmitted":`Код отправлен — ждём завершения входа…`,"codexAuth.oauthStatusRetrying":`При проверке статуса входа возникла сетевая ошибка или ошибка прокси — повторяем…`,"codexAuth.oauthCancelled":`Вход отменён.`,"codexAuth.loginFailed":`Не удалось войти`,"codexAuth.needsReauth":`Повторный вход`,"codexAuth.reauthenticate":`Переавторизоваться`,"codexAuth.tokenExpired":`Токен истёк — переавторизуйте этот аккаунт`,"codexAuth.mainTokenExpired":`Токен истёк — повторите вход через приложение Codex`,"codexAuth.emailCollision":`Этот аккаунт совпадает с вашим основным входом Codex. Используйте другой аккаунт.`,"codexAuth.resetCreditsTitle":`Кредиты сброса`,"codexAuth.resetCreditsAvailable":`У вас доступно кредитов сброса: {count}.`,"codexAuth.resetCreditsDesc":`Каждый кредит мгновенно сбрасывает ваши текущие часовые и недельные лимиты использования.`,"codexAuth.noResetCredits":`У вас нет кредитов сброса.`,"codexAuth.earnCreditsHint":`Кредиты начисляются ежемесячно и по реферальной программе.`,"codexAuth.creditsExpireNote":`Кредиты истекают через 30 дней после начисления.`,"codexAuth.useOneCredit":`Использовать 1 кредит`,"codexAuth.confirmResetTitle":`Использовать кредит сброса?`,"codexAuth.confirmResetDesc":`Текущие лимиты запросов будут мгновенно сброшены. У вас осталось кредитов: {count}.`,"codexAuth.irreversible":`Это действие нельзя отменить.`,"codexAuth.useCredit":`Использовать кредит`,"codexAuth.redeeming":`Сброс...`,"codexAuth.resetSuccess":`Лимиты запросов сброшены! Осталось кредитов: {remaining}.`,"codexAuth.resetSuccessGeneric":`Лимиты запросов сброшены!`,"codexAuth.resetAlreadyRedeemed":`Этот кредит уже был использован. Количество кредитов не изменилось.`,"codexAuth.resetNothingToReset":`Сейчас ни одно окно лимитов не требует сброса.`,"codexAuth.resetNoCredit":`Нет доступных кредитов сброса.`,"codexAuth.resetError":`Не удалось использовать кредит сброса. Попробуйте ещё раз.`,"codexAuth.fifoNote":`Первым используется самый старый кредит.`,"codexAuth.confirmWhichCredit":`Будет использован кредит от {date}.`,"codexAuth.creditNext":`Следующий к использованию`,"codexAuth.creditLabel":`Кредит №{n}`,"codexAuth.creditNextBadge":`СЛЕД.`,"codexAuth.creditGranted":`Начислен {date}`,"codexAuth.creditExpires":`Истекает {date} (осталось {days} дн.)`,"api.title":`Доступ по API`,"api.subtitle":`Сгенерированные API-ключи дают внешним приложениям доступ к прокси opencodex. Аутентификация — через заголовок {authHeader}; какие заголовки принимает каждый эндпоинт, смотрите в таблице ниже.`,"api.endpointNote":`Используйте базовый URL с OpenAI-совместимыми клиентами. Responses и Chat Completions доступны под /v1.`,"api.baseUrl":`Базовый URL`,"api.responsesEndpoint":`Responses API`,"api.chatCompletionsEndpoint":`Chat Completions API`,"api.messagesEndpoint":`Messages API`,"api.modelsEndpoint":`Models API`,"api.endpointsTitle":`Конечные точки`,"api.authTitle":`Аутентификация`,"api.authBaseUrlNote":`Настройте клиентов с базовым URL, затем выберите нужный протокольный endpoint ниже.`,"api.authLoopback":`Loopback-привязки (127.0.0.1 или ::1) обходят аутентификацию. Для удалённых привязок нужен сгенерированный ocx_-ключ или OPENCODEX_API_AUTH_TOKEN.`,"api.modelsTitle":`Каталог внешних моделей`,"api.modelsCount":`{count} доступно`,"api.modelsSearch":`Поиск моделей`,"api.modelsSubtitle":`Используйте эти точные ID моделей с /v1/models и выбранным входящим протоколом.`,"api.modelsLoading":`Загрузка моделей…`,"api.modelsLoadFailed":`Не удалось загрузить каталог внешних моделей.`,"api.modelsEmpty":`Пока нет внешне доступных моделей.`,"api.modelsNoMatch":`Нет моделей, соответствующих «{query}».`,"api.colModel":`Модель`,"api.colSource":`Источник`,"api.colProtocols":`Протоколы`,"api.copyModelId":`Копировать ID`,"api.modelCopied":`Скопировано`,"api.testModel":`Тест`,"api.testingModel":`Тестирование…`,"api.testSucceeded":`OK`,"api.testFailed":`Ошибка`,"api.protocolResponses":`Responses`,"api.protocolChatCompletions":`Chat Completions`,"api.protocolMessages":`Messages`,"api.sourceNative":`Пул ChatGPT`,"api.sourceCombo":`Combo-маршрут`,"api.sourceCustom":`Пользовательская`,"api.usageResponsesTitle":`Пример Responses`,"api.usageChatTitle":`Пример Chat Completions`,"api.usageMessagesTitle":`Пример Messages`,"api.newKeyTitle":`Создан новый ключ`,"api.newKeyNote":`Скопируйте ключ сейчас — он больше не будет показан.`,"api.copy":`Копировать`,"api.copied":`Скопировано`,"api.dismiss":`Закрыть`,"api.generateTitle":`Сгенерировать ключ`,"api.keyNamePlaceholder":`Имя ключа (необязательно)`,"api.generate":`Сгенерировать`,"api.generating":`Создание…`,"api.activeKeys":`Активные ключи ({count})`,"api.activeKeysLoading":`Активные ключи`,"api.noKeys":`API-ключей пока нет. Сгенерируйте ключ выше.`,"api.workspace.sections":`Разделы API`,"api.section.keys":`Ключи`,"api.section.connect":`Подключение`,"api.section.endpoints":`Эндпоинты`,"api.section.models":`Модели`,"api.section.examples":`Примеры`,"api.workspace.details":`Сведения об API-ключе`,"api.workspace.keyDetails":`Сведения о ключе`,"api.workspace.keyPrefix":`Префикс ключа`,"api.workspace.deleteKey":`Удалить ключ`,"api.workspace.deleteConfirm":`Удалить этот ключ? Это действие нельзя отменить.`,"api.workspace.usageExamples":`Примеры использования`,"api.copyUrlHint":`Нажмите, чтобы скопировать URL`,"api.urlCopied":`URL скопирован`,"api.copyExampleHint":`Нажмите, чтобы скопировать пример`,"api.exampleCopied":`Пример скопирован`,"api.colName":`Имя`,"api.colKey":`Ключ`,"api.colCreated":`Создан`,"api.confirm":`Подтвердить`,"api.deleteAria":`Удалить API-ключ`,"api.usageSampleInput":`Привет, мир!`,"api.clientConfig.title":`Конфигурация клиента`,"api.clientConfig.rowsLabel":`Подключение клиента`,"api.clientConfig.details":`Подробнее`,"api.clientConfig.detailsAria":`Подробности конфигурации {client}`,"api.clientConfig.copyAria":`Скопировать конфигурацию {client}`,"api.clientConfig.downloadAria":`Скачать конфигурацию {client}`,"api.clientConfig.rowMeta":`{destination} · моделей: {count}`,"api.clientConfig.rowError":`Не удалось собрать конфигурацию {client}.`,"api.clientConfig.copiedAnnounceClient":`Конфигурация {client} скопирована в буфер обмена.`,"api.clientConfig.clientOpencode":`OpenCode`,"api.clientConfig.clientPi":`Pi`,"api.clientConfig.clientOmp":`OMP`,"api.clientConfig.clientHermes":`Hermes`,"api.clientConfig.clientOpenclaw":`OpenClaw`,"api.clientConfig.clientKimi":`Kimi Code`,"api.clientConfig.clientGajae":`Gajae Code`,"api.clientConfig.clientDsh":`DeepSeek Harness (DSH)`,"api.clientConfig.clientMcode":`MiniMax Code`,"api.clientConfig.clientZcode":`ZCode`,"api.clientConfig.clientPrime":`Prime Agent`,"api.clientConfig.copy":`Копировать конфигурацию`,"api.clientConfig.download":`Скачать`,"api.clientConfig.loading":`Формируется конфигурация клиента…`,"api.clientConfig.jsonLabel":`Конфигурация {client}`,"api.clientConfig.destination":`Целевой файл`,"api.clientConfig.envHint":`Задайте ключ перед запуском`,"api.clientConfig.mergeWarning":`Объедините это с целевым файлом. Замена удалит ваши другие провайдеры и настройки MCP.`,"api.clientConfig.modelCount":`Экспортировано моделей: {count}`,"api.clientConfig.missingLimits":`У {count} из {total} моделей нет лимита контекста; клиент применит свои значения по умолчанию.`,"api.clientConfig.noKeyYet":`Для {env} пока нет ключа. Создайте ключ выше, прежде чем использовать конфигурацию вне loopback.`,"api.clientConfig.loadFailed":`Не удалось прочитать список моделей, поэтому конфигурация клиента не создана.`,"api.clientConfig.copiedAnnounce":`Конфигурация клиента скопирована в буфер обмена.`,"api.clientConfig.copyFailed":`Не удалось скопировать конфигурацию клиента.`,"api.clientConfig.downloadedAnnounce":`Файл {filename} скачан. Пока ничего не изменилось — объедините его с {destination} самостоятельно.`,"api.clientConfig.whereDisclosure":`Куда положить этот файл`,"api.clientConfig.whereBody":`Путь выше — глобальное расположение. Файл конфигурации проекта в рабочем каталоге имеет приоритет, а ключ читается из переменной окружения, указанной в конфигурации, и никогда не хранится в этом файле.`,"api.keysLoadFailed":`Не удалось загрузить API-ключи.`,"api.createFailed":`Не удалось создать API-ключ.`,"api.deleteFailed":`Не удалось удалить API-ключ.`,"api.auth.endpoint":`Эндпоинт`,"api.auth.required":`Обязателен`,"api.auth.accepted":`Принимается`,"api.auth.rejected":`Не принимается`,"api.auth.testProtocol":`Проверить {protocol}`,"api.auth.testNeedsFreshKey":`Чтобы выполнить проверку с аутентификацией, создайте ключ и оставьте его одноразовое значение на экране.`,"api.key.name":`Имя ключа`,"api.key.rename":`Переименовать`,"api.key.saveName":`Сохранить имя`,"api.key.renaming":`Сохранение…`,"api.key.renameFailed":`Не удалось переименовать ключ. Введённое имя сохранено.`,"api.key.deleting":`Удаление…`,"api.key.copyFailed":`Не удалось скопировать ключ. Выделите и скопируйте его вручную, прежде чем закрыть панель.`,"api.attribution.title":`Использование по ключам`,"api.attribution.requests7d":`Запросы за 7 дней`,"api.attribution.totalRequests":`Всего учтённых запросов`,"api.attribution.totalRequestsAvailable":`Запросы в доступной истории`,"api.attribution.sinceAvailable":`Доступная атрибуция с`,"api.attribution.lastUsed":`Последнее использование`,"api.attribution.since":`Учёт ведётся с`,"api.attribution.neverUsed":`Не использовался с начала учёта`,"api.attribution.unavailable":`Нет данных`,"api.attribution.unavailableDetail":`Использование ещё не учтено. Запросы до начала учёта нельзя отнести к ключам задним числом.`,"api.attribution.ambiguous":`Два ключа используют один и тот же ID, поэтому нельзя определить, чьё это использование. Задайте каждому ключу уникальный ID в файле конфигурации.`,"api.attribution.railAmbiguous":`дубль ID`,"claude.subtitle":`Используйте GPT, Gemini и другие модели внутри Claude Code.`,"claude.pageTitle":`Claude Code`,"claude.workspace.settings":`Настройки`,"claude.enabledLabel":`Подключение Claude`,"claude.enabledHint":`Если выключено, Claude Code не сможет использовать этот прокси.`,"claude.authMode":`Режим аутентификации`,"claude.authModeHint":`«Подписка» требует аккаунт Claude, «Прокси» работает без аккаунта Anthropic`,"claude.authModeSubscription":`Подписка (аккаунт Claude)`,"claude.authModeProxy":`Прокси (аккаунт не нужен)`,"claude.authModeAuto":`Авто (определять вход в Claude)`,"claude.effectiveMode.label":`Применится при следующем запуске`,"claude.effectiveMode.manual":`Вручную: {mode}`,"claude.effectiveMode.autoPresent":`Авто: подписка — вход в Claude найден через {source}`,"claude.effectiveMode.autoAbsent":`Авто: режим прокси — вход в Claude не найден`,"claude.effectiveMode.autoUnknown":`Авто: подписка — не удалось проверить вход`,"claude.effectiveMode.admissionKey":`API-ключ этого прокси всё равно отправляется.`,"claude.authSource.claude-json-oauth":`аккаунт Claude`,"claude.authSource.claude-credentials-file":`файл учётных данных`,"claude.authSource.macos-keychain":`связку ключей macOS`,"claude.authSource.exported-env":`переменную окружения`,"claude.authSource.unknown":`обнаруженные учётные данные`,"claude.systemEnv":`Автоподключение`,"claude.systemEnvDesc":`Если включено, запуск claude в любом терминале автоматически идёт через прокси.`,"claude.systemEnvUnsupported":`Автоподключение доступно только в macOS. В этой системе запускайте Claude с помощью {cmd}.`,"claude.systemEnvWarn":`⚠ Чтобы изменение вступило в силу, необходимо полностью закрыть и заново запустить приложение терминала. Не рекомендуется.`,"claude.fastMode":`Быстрый режим (OpenAI)`,"claude.fastModeDesc":`Управляет service_tier для моделей OpenAI. ВКЛ = priority (быстрее). ВЫКЛ = default. Авто = сквозная передача (решает клиент).`,"claude.fastAuto":`Авто`,"claude.fastOn":`ВКЛ`,"claude.fastOff":`ВЫКЛ`,"claude.autoContext":`Автоматически использовать большой контекст`,"claude.autoContextDesc":`Определяет, как широко применяется пометка 1M. ВКЛ: строку с большим контекстом получает каждая модель, окно которой вмещает порог сжатия. ВЫКЛ: её получают только модели с настоящим контекстом 1M.`,"claude.autoContextInert":`Неактивно, поскольку в файле конфигурации задано устаревшее значение размера контекста (maxContextTokens). Удалите его там, чтобы снова включить эту настройку.`,"claude.autoCompactWindow":`Порог автосуммаризации`,"claude.autoCompactDefault":`{value} (по умолчанию)`,"claude.autoCompactWindowDesc":`Когда чат достигает этого порога, старые сообщения суммаризируются. Порог никогда не превышает собственный лимит модели, поэтому модели с контекстом 200k не затрагиваются.`,"claude.autoCompactWindowWarn":`Изменение этого значения может сломать модели GPT — если задать порог выше реального лимита модели, чаты будут выдавать ошибку ещё до срабатывания суммаризации.`,"claude.injectAgents":`Авторегистрация подагентов`,"claude.injectAgentsDesc":`Регистрирует модели, выбранные на вкладке «Подагенты» (плюс текущую модель по умолчанию), как доступных для вызова агентов Claude Code (ocx-*). Применяется со следующей сессии.`,"claude.webSearchSidecar":`Переопределение сайдкара веб-поиска`,"claude.webSearchSidecarHint":`Переопределяет основной сайдкар веб-поиска для запросов Claude Code.`,"claude.visionSidecar":`Переопределение сайдкара для изображений`,"claude.visionSidecarHint":`Переопределяет основной сайдкар для изображений в запросах Claude Code.`,"claude.useMainSetting":`Использовать основную настройку`,"claude.sidecarModelPlaceholder":`Модель из основной настройки`,"claude.quickstart":`Начало работы`,"claude.quickstartHint":`{cmd} запускает Claude Code через прокси. Ваш вход в claude.ai остаётся активным.`,"claude.manualEnv":`Ручная настройка (для продвинутых)`,"claude.smallFastModel":`Фоновая вспомогательная модель`,"claude.smallFastModelHint":`Модель, которую Claude Code использует для фоновых задач вроде суммаризации чатов и определения тем. Её также использует алиас подагента haiku. Пусто = значение Claude по умолчанию (Haiku).`,"claude.smallFastModelAccurateHint":`Модель, которую Claude Code использует для фоновых задач, например суммаризации чатов и определения тем. Её также использует алиас подагента haiku.`,"claude.smallFastModelUnsetOption":`Разрешить Claude Code выбрать нативную модель`,"claude.smallFastModelNativeWarning":`Если модель не выбрана, OpenCodex не задаёт переопределения вспомогательной модели. Claude Code может использовать нативную модель Sonnet, что может привести к расходам у вашего нативного провайдера.`,"claude.slotUnset":`Модель Claude по умолчанию`,"claude.modelMap":`Перехват моделей`,"claude.modelMapHint":`Перехватывает запросы к определённой модели и перенаправляет их на выбранную вами. По умолчанию список пуст — пока вы не добавите правило, ничего не происходит.`,"claude.mapFrom":`Исходная модель (напр. claude-sonnet-4-5)`,"claude.mapTo":`Заменить на (напр. gemini/gemini-3-pro)`,"claude.addMapping":`Добавить правило`,"claude.removeMapping":`Удалить правило`,"claude.aliases":`Доступные модели`,"claude.aliasesHint":`Модели, которые появляются в меню /model в Claude Code.`,"claude.aliasProviderOther":`Другое`,"claude.loading":`Загрузка…`,"claude.loadFail":`Не удалось загрузить настройки Claude`,"claude.saved":`Сохранено.`,"claude.saveFailed":`Не удалось сохранить`,"claude.networkError":`Ошибка сети — запущен ли прокси?`,"claude.toggleAria":`Переключить подключение Claude`,"claude.none":`Нет`,"claude.tabsLabel":`Клиент Claude`,"claude.tabCode":`Code`,"claude.tabDesktop":`Desktop`,"claudeDesktop.title":`Claude Desktop`,"claudeDesktop.subtitle":`Маршрутизируйте каждое семейство моделей Claude через доступную модель на порту {port}.`,"claudeDesktop.importJson":`Импорт JSON`,"claudeDesktop.exportJson":`Экспорт JSON`,"claudeDesktop.loading":`Загрузка профиля Claude Desktop…`,"claudeDesktop.loadFail":`Не удалось загрузить профиль Claude Desktop.`,"claudeDesktop.retry":`Повторить`,"claudeDesktop.saveFailed":`Не удалось сохранить профиль Claude Desktop.`,"claudeDesktop.applyFailed":`Профиль сохранён, но применить его не удалось.`,"claudeDesktop.updateFailed":`Не удалось обновить Claude Desktop.`,"claudeDesktop.savedApplied":`Профиль сохранён и применён к Claude Desktop.`,"claudeDesktop.appliedMarkerUnsaved":`Применено к Claude Desktop, но отметка о применении не сохранена — состояние ниже может показывать устаревшие данные до повторного применения.`,"claudeDesktop.savedAppliedAnnounce":`Профиль Claude Desktop сохранён и применён.`,"claudeDesktop.saved":`Профиль сохранён.`,"claudeDesktop.savedAnnounce":`Профиль Claude Desktop сохранён.`,"claudeDesktop.exported":`Профиль экспортирован в JSON.`,"claudeDesktop.importExpected":`Ожидается профиль Claude Desktop версии 1.`,"claudeDesktop.importReady":`JSON импортирован. Проверьте черновик, затем сохраните и примените.`,"claudeDesktop.importedAnnounce":`JSON профиля импортирован. Несохранённые изменения готовы к проверке.`,"claudeDesktop.importInvalid":`Выбранный файл не является допустимым профилем.`,"claudeDesktop.importFailed":`Импорт не удался. {error}`,"claudeDesktop.moved":`{route} перемещён в {family}.`,"claudeDesktop.unsaved":`Несохранённые изменения`,"claudeDesktop.upToDate":`Профиль актуален`,"claudeDesktop.saving":`Сохранение…`,"claudeDesktop.applying":`Применение…`,"claudeDesktop.saveApply":`Сохранить и применить`,"claudeDesktop.emptyTitle":`Нет доступных моделей`,"claudeDesktop.emptyHint":`Добавьте или включите провайдера, затем вернитесь для назначения маршрутов Claude Desktop.`,"claudeDesktop.assignmentsLabel":`Назначения семейств моделей Claude`,"claudeDesktop.family.opus":`Opus`,"claudeDesktop.family.fable":`Fable`,"claudeDesktop.family.sonnet":`Sonnet`,"claudeDesktop.family.haiku":`Haiku`,"claudeDesktop.modelCountOne":`{count} модель`,"claudeDesktop.modelCountMany":`{count} моделей`,"claudeDesktop.chooseDefault":`Выберите модель по умолчанию`,"claudeDesktop.temporaryDefault":`Временная модель по умолчанию`,"claudeDesktop.laneEmpty":`Перетащите модель сюда или используйте её элемент «Переместить».`,"claudeDesktop.laneNoMatch":`В этом семействе нет моделей, соответствующих запросу.`,"nav.grok":`Grok`,"grok.title":`Grok Build`,"grok.subtitle":`Модели, зарегистрированные opencodex в вашей конфигурации Grok.`,"grok.loading":`Загрузка состояния Grok…`,"grok.loadFail":`Не удалось прочитать конфигурацию Grok.`,"grok.notConfiguredTitle":`Grok Build не подключён`,"grok.notConfiguredHint":`Установите Grok и перезапустите прокси — opencodex запишет управляемый блок в:`,"grok.endpoint":`Точка входа`,"grok.colModel":`Модель`,"grok.colAlias":`Псевдоним Grok`,"grok.colContext":`Контекст`,"grok.groupNative":`Нативные модели`,"grok.groupRouted":`Маршрутизируемые модели`,"grok.enabledCount":`Зарегистрировано {on} из {total}`,"grok.saved":`Выбор сохранён.`,"grok.savedApplied":`Выбор сохранён и записан в конфиг Grok.`,"grok.saveFailed":`Не удалось сохранить выбор Grok.`,"grok.applyFailed":`Выбор сохранён, но конфиг Grok обновить не удалось.`,"grok.applySkipped":`Выбор сохранён. Конфиг Grok не изменён.`,"grok.saveApply":`Сохранить и применить`,"grok.saving":`Сохранение…`,"grok.applying":`Применение…`,"grok.unsaved":`Несохранённые изменения`,"grok.upToDate":`Выбор актуален`,"grok.toggleModel":`Зарегистрировать {id} в Grok`,"claudeDesktop.available":`Доступно`,"claudeDesktop.defaultBadge":`По умолчанию`,"claudeDesktop.supports1m":`1M`,"claudeDesktop.unavailable":`Недоступно`,"claudeDesktop.contextM":`Контекст {n}M`,"claudeDesktop.contextK":`Контекст {n}k`,"claudeDesktop.contextUnknown":`контекст неизвестен`,"claudeDesktop.alias":`Псевдоним`,"claudeDesktop.useAsDefault":`Сделать по умолчанию для {family}`,"claudeDesktop.moveTo":`Переместить в`,"claudeDesktop.move":`Переместить`,"claudeDesktop.status.applied":`Применено к Desktop`,"claudeDesktop.status.stale":`Конфигурация устарела — примените заново`,"claudeDesktop.status.notApplied":`Не применено`,"claudeDesktop.status.notActiveProfile":`Desktop использует другой профиль — примените заново`,"claudeDesktop.status.disabled":`Интеграция Claude Desktop отключена. После включения полностью закройте и снова откройте Desktop.`,"claudeDesktop.enableApply":`Включить и применить`,"claudeDesktop.health.lastRequest":`Последний запрос`,"claudeDesktop.health.stats":`{count} запр. / {errors} ошиб.`,"claudeDesktop.effort.supported":`effort`,"claudeDesktop.effort.displayOnly":`effort (только отображение)`,"cws.loading":`Загрузка комбо…`,"cws.loadFailed":`Не удалось загрузить комбо.`,"cws.saveFailed":`Не удалось сохранить комбо.`,"cws.removeFailed":`Не удалось удалить комбо.`,"cws.saved":`Комбо сохранено.`,"cws.created":`Создано: {model}.`,"cws.removed":`Удалено: combo/{id}.`,"cws.renamed":`Переименовано: {from} → {to}.`,"cws.add":`Добавить комбо`,"cws.addTitle":`Добавить комбо`,"cws.addSubtitle":`Создайте виртуальную модель для нескольких провайдеров и выберите точное имя, которое будут запрашивать клиенты.`,"cws.create":`Создать комбо`,"cws.railAria":`Список комбо`,"cws.searchPlaceholder":`Поиск комбо или целей…`,"cws.noSearchResults":`Нет комбо, соответствующих запросу.`,"cws.group.failover":`Failover`,"cws.group.roundRobin":`Round-robin`,"cws.targetCount":`{count} целей`,"cws.targetCountOne":`1 цель`,"cws.overviewTitle":`Комбо`,"cws.overviewBlurb":`Виртуальные модели, которые при сбоях переключаются между целями провайдер/модель (отказоустойчивое переключение, failover) или используют детерминированный плавный взвешенный циклический перебор (round-robin).`,"cws.count.total":`Всего`,"cws.count.failover":`Failover`,"cws.count.roundRobin":`Round-robin`,"cws.howTitle":`Как это работает`,"cws.howBody":`Запросите у Codex публичное имя модели комбо. Если оно не задано, используется combo/<id>. OpenCodex выбирает цель и переключается на следующую только при сбоях вышестоящего провайдера, допускающих повтор. Если доступных целей не осталось, запрос завершается ошибкой, а не переходит на глобальный провайдер по умолчанию.`,"cws.attentionTitle":`Требует внимания`,"cws.attention.empty":`Цели не настроены`,"cws.attention.few":`Только одна цель — failover некуда переключаться`,"cws.attention.catalogOmitted":`Отсутствует в каталоге моделей — возможности участников неполны или несовместимы (нет context window / метаданных, или пустое пересечение modalities). Маршрутизация по alias всё ещё работает`,"cws.attention.allTargetsExhausted":`Квота исчерпана у всех включённых целей`,"cws.emptyTitle":`Создайте первое комбо`,"cws.empty.createDesc":`Задайте имя виртуальной модели и объедините в цепочку два и более бэкенда.`,"cws.backToAll":`Назад ко всем комбо`,"cws.allCombos":`Все комбо`,"cws.copyModel":`Копировать id`,"cws.copied":`Скопировано`,"cws.tabsLabel":`Разделы деталей комбо`,"cws.tab.config":`Конфигурация`,"cws.tab.about":`О комбо`,"cws.strategy":`Стратегия`,"cws.strategy.failover":`Failover`,"cws.strategy.roundRobin":`Round-robin`,"cws.strategy.failoverHint":`Цели перебираются по порядку. Если первая завершается ошибкой, допускающей повтор (лимит запросов, сбой, ограничение подписки), происходит переключение на следующую.`,"cws.strategy.roundRobinHint":`Детерминированное распределение трафика по весам. Выбранная цель удерживается на серию успешных запросов, затем селектор переходит к следующей.`,"cws.field.id":`Id комбо`,"cws.field.idHint":`Клиенты будут запрашивать {model}`,"cws.field.idInternalHint":`Внутренний id комбо. Его можно изменить после создания.`,"cws.field.idHintEdit":`При переименовании комбо будет перенесено на новый id. Клиенты запрашивают {model}.`,"cws.field.alias":`Публичное имя модели`,"cws.field.aliasPlaceholder":`deepseek-v4-flash или vendor/model`,"cws.field.aliasHint":`Необязательно. Используйте имя без префикса, собственный префикс вроде vendor/model или оставьте поле пустым для combo/<id>.`,"cws.field.nativeAlias":`Нативный псевдоним OpenAI`,"cws.field.nativeAliasHint":`Разрешает комбо занимать поддерживаемый неквалифицированный ID нативной модели OpenAI. Маршруты OpenAI с аккаунтом или провайдером остаются отдельными.`,"cws.field.displayName":`Отображаемое имя`,"cws.field.displayNameHint":`Подпись в списке моделей. Обязательна для нативного псевдонима OpenAI.`,"cws.field.stickyLimit":`Успешных запросов до ротации`,"cws.field.stickyLimitHint":`Выбранная цель удерживается на указанное число успешных запросов, прежде чем взвешенный селектор перейдёт к следующей.`,"cws.field.defaultEffort":`Рассуждения по умолчанию`,"cws.field.defaultEffortNone":`Нет (по умолчанию для цели)`,"cws.field.defaultEffortHint":`Используется, только если клиент не указал уровень рассуждений. Варианты — пересечение заявленных уровней выбранных целей.`,"cws.capability.imageInputUnavailable":`Доступно, когда все выбранные цели поддерживают ввод изображений.`,"cws.capability.imageInputHint":`Включено по умолчанию, если все цели поддерживают изображения. Выключите, чтобы принимать только текст.`,"cws.capability.imageInput":`Изображения / мультимодальность`,"cws.capabilities":`Возможности`,"cws.field.defaultEffortUnsupported":`Этот уровень не входит в общую лестницу целей — при запросе он будет проигнорирован или снижен.`,"cws.field.defaultEffortUnsupportedOption":`нет в пересечении`,"cws.targets":`Цели`,"cws.targets.failoverHint":`Порядок важен — первая цель основная.`,"cws.targets.roundRobinHint":`Веса задают детерминированный относительный выбор; при равных весах порядок определяет очерёдность в кольце ротации.`,"cws.target.provider":`Провайдер`,"cws.target.model":`Модель`,"cws.target.weight":`Вес`,"cws.target.pickProvider":`Выберите провайдера…`,"cws.target.pickProviderFirst":`Сначала выберите провайдера…`,"cws.target.pickModel":`Выберите модель…`,"cws.target.noModels":`Нет моделей для этого провайдера`,"cws.target.modelPlaceholder":`id модели`,"cws.target.add":`Добавить цель`,"cws.target.drag":`Перетащите, чтобы изменить порядок`,"cws.target.moveUp":`Переместить вверх`,"cws.target.moveDown":`Переместить вниз`,"cws.quota.available":`Доступно`,"cws.quota.exhausted":`Квота исчерпана`,"cws.quota.unknown":`Квота неизвестна`,"cws.quota.allExhausted":`Квота исчерпана у всех включённых целей. Выберите другую цель или дождитесь восстановления квоты.`,"cws.aboutTitle":`Поведение во время работы`,"cws.aboutBody":`После сбоя цель на короткое время выводится из ротации с учётом заголовка Retry-After. При ошибках валидации или превышения контекста переключение не выполняется. Каждая цель адаптирует уровень рассуждений к своим возможностям; полностью исчерпанное комбо завершает запрос ошибкой. Разделы «Логи» и «Использование» сохраняют упорядоченные физические попытки и расход по каждой попытке.`,"cws.removeConfirmTitle":`Удалить {model}?`,"cws.removeConfirmDesc":`Виртуальная модель будет удалена из конфигурации и каталога Codex. Провайдеры при этом не удаляются.`,"cws.unsavedTitle":`Несохранённые изменения`,"cws.unsavedDesc":`Отбросить изменения этого комбо и продолжить?`,"cws.keepEditing":`Продолжить редактирование`,"cws.err.missingId":`Необходимо указать id комбо.`,"cws.err.invalidId":`Id должен начинаться с буквы или цифры и содержать только буквы, цифры, точки, подчёркивания и дефисы (не более 64 символов).`,"cws.err.duplicateId":`Комбо с таким id уже существует.`,"cws.err.invalidAlias":`Алиас должен содержать только буквы, цифры, точки, подчёркивания и дефисы, максимум с одним сегментом "/".`,"cws.err.aliasReservedNamespace":`Алиас не должен использовать зарезервированное пространство имён "combo/".`,"cws.err.aliasNativeFamily":`Алиасы без префикса из нативного семейства OpenAI (gpt-*, o1-*, o3-*, o4-*, codex-*) недопустимы.`,"cws.err.unsupportedNativeAlias":`Нативный алиас должен быть одним из поддерживаемых сейчас неквалифицированных id моделей OpenAI.`,"cws.err.missingNativeAliasDisplayName":`Для нативного алиаса требуется отображаемое имя.`,"cws.err.invalidDisplayName":`Отображаемое имя должно содержать не более 128 символов и не иметь управляющих символов.`,"cws.err.duplicateAlias":`Другое комбо уже использует этот алиас.`,"cws.err.noTargets":`Добавьте хотя бы одну цель.`,"cws.err.incompleteTarget":`Для каждой цели нужно указать провайдера и модель.`,"cws.target.disabled":`{name} (отключён)`,"cws.err.reservedNamespace":`Прежде чем создавать комбо, необходимо переименовать физического провайдера с именем «combo».`,"cws.err.providerCollision":`Id комбо конфликтует с именем настроенного провайдера.`,"cws.err.unknownProvider":`Каждая цель должна использовать настроенного провайдера.`,"cws.err.duplicateTarget":`Одна и та же цель провайдер/модель может встречаться только один раз.`,"cws.err.invalidStickyLimit":`Число успешных запросов до ротации должно быть целым от 1 до 100.`,"cws.err.invalidWeight":`Каждый вес round-robin должен быть целым числом от 1 до 10000.`,"cws.err.noEnabledTarget":`Хотя бы одна цель должна использовать включённого провайдера.`,"dash.injectionManage":`Открыть настройки`,"sub.settings":`Настройки`,"sub.sections":`Разделы подагентов`,"sub.delegation.model":`Модель, которую вызывать первой`,"sub.delegation.modelHint":`Модель, к которой Codex обращается первой, когда передаёт работу. Список выше — кого он вообще может вызвать, а здесь выбирается первый в очереди.`,"dash.syncModelsHint":`Перезаписывает каталог моделей Codex по подключённым провайдерам.`,"dash.syncRun":`Синхронизировать`,"lab.title":`Compatibility Lab`,"lab.subtitle":`Read-only compatibility verdict matrix from lab projection evidence.`,"lab.loadFailed":`Could not load compatibility lab data`,"lab.projectionUnavailable":`Lab projection is not available. Run conformance or live probes first.`,"lab.projectionIncompatible":`Lab projection schema is incompatible. Rebuild the projection.`,"lab.statusTitle":`Projection status`,"lab.matrixTitle":`Compatibility matrix`,"lab.verdictsTitle":`Verdict records`,"lab.filter.layer":`Evidence layer`,"lab.filter.verdict":`Verdict`,"lab.filter.subject":`Subject ID`,"lab.filter.all":`All`,"lab.col.subject":`Subject`,"lab.col.layer":`Layer`,"lab.col.suite":`Suite`,"lab.col.verdict":`Verdict`,"lab.col.asOf":`As of`,"lab.col.protocol":`Protocol conformance`,"lab.col.live":`Live route compatibility`,"lab.col.task":`Task effectiveness`,"lab.empty":`No compatibility verdicts in the projection yet.`,"lab.subjectKind":`Kind`,"lab.observationCount":`Observations`,"lab.eventCount":`Events`,"lab.verdictCount":`Verdicts`,"lab.subjectCount":`Subjects`,"lab.builtAt":`Built`,"lab.loading":`Loading compatibility evidence…`,"lab.loadMore":`Load more`,"lab.detailTitle":`Verdict detail`,"lab.detailClose":`Close`,"lab.detailSubject":`Subject`,"lab.detailObservations":`Observations`,"lab.detailEvents":`Contributing events`,"lab.detailArtifacts":`Artifact metadata`,"lab.production.title":`Наблюдаемый производственный трафик`,"lab.production.notVerification":`Не является проверкой Lab`,"lab.production.attempts":`Попытки`,"lab.production.successes":`Успешные попытки`,"lab.production.routeErrors":`Ошибки маршрута`,"lab.production.lastObserved":`Последнее наблюдение`,"lab.detailLoadFailed":`Could not load verdict detail`,"lab.refresh":`Refresh`,"lab.verdict.UNKNOWN":`Unknown`,"lab.verdict.CLAIMED":`Claimed`,"lab.verdict.PROBED":`Probed`,"lab.verdict.VERIFIED":`Verified`,"lab.verdict.DEGRADED":`Degraded`,"lab.verdict.BLOCKED":`Blocked`,"lab.verdict.UNSUPPORTED":`Unsupported`,"lab.layer.protocol_conformance":`Protocol conformance`,"lab.layer.live_route_compatibility":`Live route compatibility`,"lab.layer.task_effectiveness":`Task effectiveness`,"dash.visionAdvanced":`Дополнительные настройки`,"dash.visionMaxDescriptions":`Максимум описаний за ход`,"dash.visionMaxDescriptionsInvalid":`Введите положительное целое число.`,"dash.visionTimeout":`Таймаут`,"dash.visionTimeoutInvalid":`Введите целое число от {min} до {max} миллисекунд.`,"dash.visionAdvancedPopover":`Дополнительные настройки изображений`,"sub.routedDelegationBridge":`Мост маршрутизированной делегации V2`,"sub.routedDelegationBridgeHint":`Экспериментальная функция. Пока она активна, сообщения создания, отправки и продолжения передаются открытым текстом, включая делегирование между нативными агентами. Codex может показывать исходную модель; маршрутизированный контент и конфиденциальность зависят от выбранного провайдера.`,"sub.routedDelegationBridgeInactive":`Подготовлен; включается только для подходящих нативных корней V2.`,"sub.routedDelegationBridgeSaveFail":`Не удалось сохранить мост маршрутизированной делегации V2`,"sub.routedDelegationBridgeSaved":`Мост маршрутизированной делегации V2 сохранён. Отключение применяется сразу.`,"models.newPolicyGlobal":`Добавлять новые модели выключенными`,"models.newPolicyProvider":`Политика новых моделей`,"models.newPolicy_inherit":`Наследовать`,"models.newPolicy_off":`Выкл.`,"models.newPolicy_on":`Вкл.`,"models.newBadge":`НОВАЯ`,"models.newCount":`Новых: {count}, выкл.`,"models.aliases":`Псевдонимы`,"models.aliasesTable":`Таблица псевдонимов`,"models.aliasPrompt":`Псевдоним провайдера (оставьте пустым, чтобы очистить)`,"models.modelAliasPrompt":`Псевдоним модели (оставьте пустым, чтобы очистить)`,"models.aliasSaved":`Псевдоним сохранён`,"models.aliasConflict":`Этот псевдоним конфликтует с существующим именем`,"models.editProviderAlias":`Изменить псевдоним провайдера`,"models.editModelAlias":`Изменить псевдоним модели`,"models.useDefaultAliases":`Использовать псевдонимы по умолчанию`,"models.useDefaultAliasesGlobal":`Использовать псевдонимы по умолчанию везде`,"models.aliasAuto":`авто`,"models.aliasUser":`пользователь`,"models.aliasStale":`устарел`},x={"nav.dashboard":`ダッシュボード`,"uptime.day":`日`,"uptime.hour":`時間`,"uptime.minute":`分`,"uptime.second":`秒`,"nav.startup":`起動安全性`,"nav.providers":`プロバイダー`,"nav.models":`モデル`,"nav.combos":`コンボ`,"nav.subagents":`サブエージェント`,"routing.title":`ルーティングインテリジェンス (beta)`,"routing.subtitle":`ポリシープロファイル、ドライラン評価、ソース連携のルーティング分析。`,"routing.loadFailed":`ルーティングデータを読み込めませんでした`,"routing.empty":"ルーティングプロファイルが設定されていません。config.json に `routingProfiles` を追加してください。","routing.revision":`rev`,"routing.detail":`プロファイル`,"routing.createProfile":`プロファイルを作成`,"routing.dryRunError":`ドライラン失敗 (HTTP {status})`,"routing.removeConfirm":`プロファイル {id} を削除しますか?`,"routing.unknownEvidence.allow":`許可`,"routing.unknownEvidence.penalize":`ペナルティ`,"routing.unknownEvidence.exclude":`除外`,"routing.removeCandidate":`候補 {provider}/{model} を削除`,"routing.candidates":`候補`,"routing.require":`必須要件`,"routing.optimize":`最適化ウェイト`,"routing.limits":`制限`,"routing.unknownEvidence":`不明なエビデンスのポリシー`,"routing.compatibility.title":`互換性ポリシー`,"routing.compatibility.enabled":`Compatibility Lab エビデンスを必須にする`,"routing.compatibility.requiredSuites":`必須スイート`,"routing.compatibility.loadingCatalog":`Lab カタログを読み込み中…`,"routing.compatibility.catalogUnavailable":`Lab カタログを利用できません — config.json でスイート ID を手動入力してください。`,"routing.compatibility.layer.protocol_conformance":`プロトコル適合`,"routing.compatibility.layer.live_route_compatibility":`ライブルート互換性`,"routing.compatibility.minStatus":`最低互換性ステータス`,"routing.none":`なし`,"routing.unavailable":`–`,"routing.dryRun":`ドライラン評価`,"routing.dryRunContext":`リクエストのコンテキストウィンドウ(トークン)`,"routing.dryRunTools":`リクエストにツールが必要`,"routing.dryRunImage":`リクエストに画像入力が必要`,"routing.dryRunStructured":`リクエストに構造化出力が必要`,"routing.dryRunRun":`候補を評価`,"routing.candidate":`候補`,"routing.eligible":`対象`,"routing.exclusions":`除外`,"routing.costCap":`コスト上限`,"routing.capOutcome.satisfied":`上限内`,"routing.capOutcome.exceeded":`上限超過`,"routing.capOutcome.unknown-allowed":`不明(許可)`,"routing.capOutcome.unknown-excluded":`不明(除外)`,"routing.exclusion.capability-unsatisfied":`能力要件未達`,"routing.exclusion.unknown-capability":`能力不明`,"routing.exclusion.cost-limit":`コスト上限超過`,"routing.exclusion.cost-limit-unknown":`上限下でコスト不明`,"routing.exclusion.cooldown":`クールダウン`,"routing.exclusion.unknown-health":`健全性不明`,"routing.exclusion.unknown-quota":`割当不明`,"routing.exclusion.unknown-price":`価格不明`,"routing.exclusion.other":`除外: {code}`,"routing.score":`スコア`,"routing.selected":`選択済み`,"routing.yes":`はい`,"routing.no":`いいえ`,"routing.analytics":`ルーティング分析`,"routing.analyticsTotal":`リクエスト`,"routing.analyticsSuccessRate":`成功率`,"routing.analyticsFallbackRate":`フォールバック`,"routing.analyticsP50":`p50`,"routing.analyticsP95":`p95`,"routing.analyticsP99":`p99`,"routing.analyticsCooldown":`クールダウン失敗`,"routing.analyticsConfidence":`信頼度`,"routing.analyticsTruncated":`切り捨て履歴`,"routing.analyticsRequests":`リクエスト`,"routing.analyticsEmpty":`分析はまだありません。まずリクエストを送信してください。`,"nav.logs":`ログ & デバッグ`,"nav.usage":`使用量`,"common.github":`GitHub`,"sidebar.star":`GitHub でスターを付ける`,"sidebar.starred":`GitHub でスター済み`,"sidebar.starUnauthenticated":`GitHub を開いてスターを付ける (gh CLI が未ログイン)`,"sidebar.starFailed":`gh でスターを付けられませんでした。代わりに GitHub を開きます。`,"sidebar.updateAvailable":`更新あり: {version}`,"sidebar.checkUpdate":`更新を確認`,"common.save":`保存`,"common.saving":`保存中…`,"common.cancel":`キャンセル`,"common.discard":`破棄`,"common.delete":`削除`,"common.close":`閉じる`,"common.ok":`OK`,"common.remove":`削除`,"common.loading":`読み込み中…`,"common.retry":`再試行`,"auth.adminTokenTitle":`OpenCodex 管理者トークン (OPENCODEX_ADMIN_AUTH_TOKEN)`,"auth.adminAccountLabel":`アカウント`,"auth.adminTokenFieldLabel":`管理者トークン`,"auth.adminTokenRejected":`管理者トークンが拒否されました。確認してもう一度お試しください。`,"auth.adminTokenUnavailable":`管理者トークンを確認できませんでした。もう一度お試しください。`,"app.logoAria":`opencodex ロゴ`,"app.pageTitle":`{page} — opencodex`,"app.claudeOn":`Claude オン`,"app.claudeOff":`Claude オフ`,"theme.label":`テーマ`,"theme.light":`ライト`,"theme.dark":`ダーク`,"theme.system":`システム`,"lang.label":`言語`,"lang.nativeName":`日本語`,"provider.name.commandCodeAuth":`Command Code - Auth`,"provider.name.commandCodeApi":`Command Code - API`,"provider.name.volcengine":`Volcengine Ark`,"provider.name.volcengineCodingPlan":`Volcengine Ark コーディングプラン`,"provider.name.volcengineAgentPlan":`Volcengine Ark エージェントプラン`,"errorBoundary.title":`ページを読み込めませんでした`,"errorBoundary.message":`このセクションの表示中にエラーが発生しました。再読み込みしてもう一度お試しください。`,"errorBoundary.details":`エラー`,"errorBoundary.reload":`再読み込み`,"startup.title":`起動安全性`,"startup.subtitle":`再起動後にローカルプロキシへの接続が再接続ループになる前に、Codex が opencodex へ到達できるか確認します。`,"startup.refresh":`更新`,"startup.backToDashboard":`ダッシュボードに戻る`,"startup.loading":`起動保護を確認中…`,"startup.error":`起動保護を読み取れませんでした。`,"startup.staleData":`最新の確認に失敗しました。以下は古い値であり、保護の証明にはなりません。`,"startup.status.native":`ネイティブルーティング`,"startup.status.protected":`再起動保護済み`,"startup.status.atRisk":`対応が必要`,"startup.summary.native":`Codex はローカルプロキシに依存していません`,"startup.summary.protected":`再起動後も opencodex を利用できます`,"startup.summary.atRisk":`再起動後に Codex がモデルへ接続できなくなる可能性があります`,"startup.riskDetail":`Codex はローカルプロキシを参照していますが、再起動する永続サービスまたは正常な launcher shim がありません。`,"startup.riskDetailCustomLocal":`Codex はカスタムローカルゲートウェイを参照しています。opencodex はその再起動ライフサイクルを管理・検証できません。`,"startup.riskDetailWindowsShim":`Launcher shim は対応する CLI スクリプトのみを保護し、Windows の Codex Desktop と codex.exe の直接起動はこれを迂回できます。`,"startup.safeDetail":`現在のルーティングと起動方式は整合しています。再起動後に ocx start を手動実行する必要はありません。`,"startup.routing":`Codex ルーティング`,"startup.routing.proxy":`ローカルプロキシ`,"startup.routing.native":`OpenAI ネイティブ`,"startup.routing.customLocal":`カスタムローカルゲートウェイ`,"startup.routing.customRemote":`カスタム遠隔ゲートウェイ`,"startup.routing.unknown":`不明または無効なルーティング`,"startup.restartProtection":`再起動保護`,"startup.preference":`オンデマンド起動`,"startup.enabled":`有効`,"startup.disabled":`無効`,"startup.protection.service":`バックグラウンドサービス`,"startup.protection.shim":`Launcher shim`,"startup.protection.none":`未インストール`,"startup.details":`保護の詳細`,"startup.service":`バックグラウンドサービス`,"startup.serviceHint":`ログイン時に起動し、クラッシュ後にプロキシを再起動します。`,"startup.installed":`インストール済み`,"startup.notInstalled":`未インストール`,"startup.unsupported":`未対応`,"startup.shim":`Codex launcher shim`,"startup.shimHint":`対応する Codex スクリプトランチャーの起動時に ocx ensure を実行します。`,"startup.healthy":`正常`,"startup.cliOnly":`CLI のみ`,"startup.stale":`要更新`,"startup.viable":`利用可能`,"startup.unhealthy":`インストール済み・異常`,"startup.conflict":`サービス競合`,"startup.installedDisabled":`インストール済み・無効`,"startup.install":`インストール`,"startup.installing":`インストール中…`,"startup.repair":`修復`,"startup.repairing":`修復中…`,"startup.serviceInstalled":`バックグラウンドサービスをインストールしました。`,"startup.serviceRepaired":`バックグラウンドサービスを修復しました。`,"startup.shimInstalled":`Codex ランチャー shim をインストールしました。`,"startup.shimRepaired":`Codex ランチャー shim を修復しました。`,"startup.installFailed":`インストールに失敗しました:`,"startup.tray.title":`Windows システムトレイ`,"startup.tray.hint":`ログイン時にトレイを起動し、プロキシの開始・停止・再起動・ダッシュボード・状態をクリックで操作します。`,"startup.tray.login":`Windows ログイン時にトレイを開始`,"startup.tray.notProtection":`トレイは操作画面であり再起動保護ではありません。無人復旧には正常なバックグラウンドサービスが必要です。`,"startup.tray.running":`実行中`,"startup.tray.stopped":`インストール済み・非表示`,"startup.tray.stale":`修復が必要`,"startup.tray.notInstalled":`未インストール`,"startup.tray.loading":`確認中…`,"startup.tray.unavailable":`状態を確認できません`,"startup.tray.install":`トレイをインストールして表示`,"startup.tray.start":`トレイアイコンを表示`,"startup.tray.stop":`トレイアイコンを終了`,"startup.tray.uninstall":`ログイントレイを削除`,"startup.tray.error":`Windows トレイ操作に失敗しました。ocx tray status で詳細を確認してください。`,"startup.recovery":`修復方法`,"startup.recoveryHint":`上のワンクリックインストールを使うか、手動修復用のコマンドをコピーできます。Codex Desktop と Windows 実行ファイルにはバックグラウンドサービスを推奨します。`,"startup.command.service":`推奨: 永続バックグラウンドサービス`,"startup.command.shim":`代替: CLI launcher shim`,"startup.command.native":`安全策: Codex ネイティブルーティングを復元`,"startup.copy":`コピー`,"startup.copied":`コピー済み`,"startup.recommended":`推奨修復: {cmd}`,"startup.navRisk":`起動保護に対応が必要です`,"startup.codexRuntime.clampHidden":`OpenCodex が Codex {version} を使用したため、一部の reasoning effort オプションが非表示になりました。`,"startup.codexRuntime.clampHiddenWithEfforts":`OpenCodex が Codex {version} を使用したため、一部の reasoning effort オプションが非表示になりました(削除: {efforts})。`,"startup.codexRuntime.olderBinary":`OpenCodex は古い Codex バイナリ({version})を使用しています。より新しいインストールが利用可能です。`,"dash.subtitle":`ローカル opencodex プロキシ、そのプロバイダー、Codex にルーティングされるモデルのライブ状態です。`,"dash.workspace.overview":`概要`,"dash.workspace.sections":`セクション`,"dash.status":`状態`,"dash.online":`オンライン`,"dash.offline":`オフライン`,"dash.version":`バージョン`,"dash.uptime":`稼働時間`,"dash.providers":`プロバイダー`,"dash.tokens30d":`トークン (30日)`,"dash.activity.title":`30日間のアクティビティ`,"dash.activity.requests":`リクエスト`,"dash.activity.tokens":`トークン`,"dash.activity.chartLabel":`30日間のアクティビティ。左右キーで日を選択し、Home と End で範囲の端へ移動します。`,"dash.activity.viewUsage":`使用状況を表示`,"dash.coverage":`{pct} カバレッジ`,"dash.mem.title":`メモリ可観測性`,"dash.mem.hint":`読み取り専用のランタイム診断。観測メモリは max(RSS, external, ArrayBuffers) で、Windows の working set trimming がコミット済み保持を隠さないようにします。`,"dash.mem.rss":`常駐メモリ (RSS)`,"dash.mem.jsHeap":`JS ヒープ使用量`,"dash.mem.jsHeapArena":`アリーナ {total}`,"dash.mem.pressure":`警告しきい値に対して`,"dash.mem.pressureOf":`しきい値の {pct}%`,"dash.mem.pressureUnknown":`しきい値の情報なし`,"dash.mem.jscHeap":`JSC ヒープ`,"dash.mem.external":`External`,"dash.mem.arrayBuffers":`ArrayBuffers`,"dash.mem.observed":`観測値`,"dash.mem.runtime":`ランタイムカウンター`,"dash.mem.growth":`1時間あたりの観測変化`,"dash.mem.perHour":`/時間`,"dash.mem.store":`継続ストア`,"dash.mem.storeHint":`プロキシの previous_response_id キャッシュ。ヒープ増加中に合計バイトが増える場合、ランタイムアロケータではなく会話保持を示します。`,"dash.mem.storeEntries":`エントリ`,"dash.mem.storeTotal":`合計`,"dash.mem.storeLargest":`最大`,"dash.mem.storeOldest":`最古`,"dash.mem.threshold":`警告しきい値`,"dash.mem.lastWarn":`最終警告`,"dash.mem.never":`なし`,"dash.mem.details":`詳細`,"dash.mem.unavailable":`メモリ診断は利用できません(旧バージョンのプロキシ)。`,"dash.mem.inFlight":`処理中のリクエスト`,"dash.mem.restart":`完了後に再起動`,"dash.mem.restartConfirm":`処理中のリクエスト {count} 件の完了を待ってから再起動します(最大 {seconds} 秒。タイムアウト時は残りを打ち切ります)。`,"dash.mem.draining":`リクエスト {count} 件の完了を待機中… 完了後に再起動`,"dash.mem.reconnecting":`プロキシを再起動中… 再接続を待機`,"dash.connectionReconnecting":`接続が中断されました — 再接続中…`,"dash.mem.restartFailed":`完了後の再起動に失敗しました。プロキシが起動しているか確認してください。`,"dash.mem.restartNoSupervisor":`再起動保護がありません。再起動後、プロキシが自動で戻らない可能性があります。`,"dash.activeProviders":`アクティブなプロバイダー`,"dash.noProviders":`プロバイダーが設定されていません。{cmd} を実行してください。`,"dash.col.name":`名前`,"dash.col.adapter":`アダプター`,"dash.col.baseUrl":`ベース URL`,"dash.col.model":`モデル`,"dash.modelsNoResults":`検索に一致するモデルはありません。`,"dash.availableModels":`利用可能なモデル`,"dash.noModels":`モデルが見つかりません。プロバイダーの API キーを確認してください。`,"dash.cannotConnect":`プロキシに接続できません。起動していますか?`,"dash.runStart":`{cmd} を実行してプロキシを起動してください。`,"dash.stop":`プロキシを停止`,"dash.stopConfirm":`プロキシを停止してネイティブの Codex に戻しますか?`,"dash.stopFailed":`プロキシを停止できませんでした (HTTP {status})。`,"dash.maSwitchFailed":`モードの切り替えに失敗しました (HTTP {status})。`,"dash.maNetworkError":`ネットワークエラー — プロキシは起動していますか?`,"dash.stopping":`停止中…`,"dash.actions":`プロキシ`,"dash.codexRestart":`Codex のモデル一覧を再読み込み`,"dash.codexRestarting":`停止中…`,"dash.codexRestartConfirm":`Codex app-server を停止してモデル一覧を読み直させますか? 進行中の Codex の処理は中断され、Codex は自動では再起動しないので後で開き直してください。`,"dash.codexRestartDone":`Codex app-server を {count} 個停止しました。Codex を開き直すと最新のモデル一覧が読み込まれます。`,"dash.codexRestartNothing":`実行中の Codex app-server はありません。次回起動時に最新のモデル一覧を読み込みます。`,"dash.codexRestartUnknown":`プロセスを列挙できなかったため、何も停止しませんでした。`,"dash.codexRestartPartial":`app-server が {count} 個終了しませんでした。モデル一覧が古いままなら手動で停止してください。`,"dash.codexRestartFailed":`Codex のモデル一覧を再読み込みできませんでした (HTTP {status})。`,"dash.codexRestartUnreachable":`プロキシに接続できませんでした。`,"dash.codexRestartMalformed":`プロキシが予期しない応答を返しました。`,"dash.codexRestartTimeout":`プロキシから時間内に応答がありませんでした。app-server の停止が続いている可能性があります。`,"models.staleBanner":`Codex はこのカタログより古いモデル一覧を表示しています。Codex を再起動すると読み直されます。`,"dash.codexAutoStart":`Codex と一緒に opencodex を起動`,"dash.codexAutoStartHint":`インストール済み launcher shim に ocx ensure の実行を許可します。この設定だけでは再起動保護はインストールされません。起動安全性で実際の状態を確認してください。`,"dash.searchModel":`検索サイドカーモデル`,"dash.searchModelHint":`非 OpenAI ルーティングモデルで web_search に使うモデル。ChatGPT ログインが必要です。`,"dash.searchReasoning":`検索の推論負荷`,"dash.visionModel":`ビジョンサイドカーモデル`,"dash.visionModelHint":`テキスト専用ルーティングモデルで画像を説明するために使うモデル。ChatGPT ログインが必要です。`,"dash.webSearchSidecar":`ウェブ検索サイドカー`,"dash.webSearchSidecarHint":`ルーティングモデルでウェブ検索に使うバックエンドとモデルを選択します。`,"dash.webSearchStream":`回答をライブ配信`,"dash.webSearchStreamHint":`モデルがツール呼び出しを決定するまで、先頭のテキストと推論をライブ配信します。以降は検索インターセプトのためバッファされます。検索前のテキストは一部繰り返される場合があります。`,"dash.visionSidecar":`ビジョンサイドカー`,"dash.visionSidecarHint":`テキスト専用ルーティングモデルで画像を説明するために使うバックエンドとモデルを選択します。`,"dash.visionOff":`オフ`,"dash.shadowCallIntercept":`シャドウコール傍受`,"dash.shadowCallInterceptHint":`Codex App のバックグラウンドヘルパー呼び出し({models}: タイトル生成、コミットメッセージ)を傍受し、選択したモデルにリダイレクトします。負荷は low に固定されます。`,"dash.shadowCallWarning":`⚠ オンにすると、{models} へのリクエストがすべて選択したモデルに置き換えられます。`,"dash.shadowCallOriginal":`元のモデル`,"dash.shadowCallModel":`差し替えモデル`,"dash.shadowCallTooltip":`Codex App はスレッドタイトル生成、コミットメッセージ生成、スキルオーケストレーションをバックグラウンドで呼び出します。使われるモデルはクライアントのバージョンによって変わるため、opencodex は {models} をまとめて傍受します。これをオンにすると、それらの呼び出しを選択したモデルにリダイレクトします。`,"models.shadowCallIntercept":`シャドウコール傍受`,"models.shadowCallInterceptHint":`Codex App のバックグラウンドヘルパー呼び出し({models}: タイトル、コミットメッセージ)を傍受し、選択したモデルにリダイレクトします。`,"dash.sidecarBackend":`バックエンド`,"dash.sidecarModel":`モデル`,"dash.backendAuto":`自動`,"dash.backendOpenAI":`OpenAI`,"dash.backendAnthropic":`Anthropic`,"dash.sidecarSaved":`サイドカー設定を保存しました。次回リクエスト時に適用されます。`,"dash.sidecarSaveFailed":`サイドカー設定の保存に失敗しました。`,"dash.injectionLabel":`サブエージェント委任`,"dash.injectionHint":`Codex がサブエージェントに作業を渡すときのモデルを選びます。この選択をどこに適用するかは下の 2 つのスイッチが決めます。`,"dash.syncCodexSubagentDefaults":`Codex の既定値としても保存`,"dash.syncCodexSubagentDefaultsHint":`オンにすると、上で選んだモデルが Codex 自身の設定にも保存され、新しいタスクも最初からそのモデルを使います。オフならここだけで記憶します。反映は次回の同期または再起動時で、自分で書いた [agents] 設定はそのまま残ります。`,"dash.multiAgentGuidance":`作業の分け方を伝える`,"dash.multiAgentGuidanceHint":`「作業はこう分けて任せる」という短いメモを Codex に送ります。v2 では使えるモデルと優先モデルを伝え、v1 では推論強度が max か ultra のときだけ働きます。オフならメモは付きません。`,"dash.injectionNone":`なし`,"dash.injectionEffortLabel":`推論負荷`,"dash.injectionEffortNone":`モデル既定`,"dash.effortCapLabel":`V2 ultra 推論上限`,"dash.subagentEffortCapLabel":`V2 サブエージェント推論上限`,"dash.effortCapHelp":`V2 ultra モードのターンの推論負荷を制限します。設定すると、(ultra モードからの)最大負荷リクエストは選択したレベルに制限されます。サブエージェント上限は生成された子エージェントにのみ適用されます。上限は負荷を下げるだけで上げることはありません。モデルが制限レベルをサポートしない場合、最も近いサポートレベルに切り下げられます。`,"dash.effortCapNone":`上限なし`,"dash.maintenance":`メンテナンス`,"dash.maintenanceHint":`Codex のモデルカタログを更新するか、より新しい opencodex リリースをインストールします。`,"dash.syncModels":`モデルを同期`,"dash.syncing":`同期中…`,"dash.syncOk":`同期完了。{count} 個のモデルを追加しました。`,"dash.syncStaleHint":`Codex がまだ古いリストを表示する場合、長時間稼働の app-server を再起動してください({cmd})。`,"dash.syncFailed":`同期失敗: {error}`,"dash.projectConfigTitle":`プロジェクトの Codex 設定が OpenCodex をバイパスします`,"dash.projectConfigHint":`これらのリポジローカル設定は OpenCodex プロキシを上書きします(例: OpenCode Go に直接ルーティング)。~/.codex/config.toml のルーティングがそのプロジェクトで適用されるように削除してください。`,"dash.checkUpdate":`更新を確認`,"dash.updateTitle":`opencodex を更新`,"dash.updateDesc":`選択したチャンネルの npm を確認し、インストール後にプロキシを再起動するか選択します。`,"dash.updateChannel":`チャンネル`,"dash.updateChecking":`更新を確認中…`,"dash.updateInstalled":`インストール済み`,"dash.updateLatest":`最新`,"dash.updateAvailable":`更新があります`,"dash.updateCurrent":`最新です`,"dash.updateCommand":`コマンド`,"dash.updateSource":`これはソースチェックアウトです。表示されたコマンドでターミナルから更新してください。`,"dash.updateUnavailable":`npm から最新バージョンを読み取れませんでした。後でもう一度お試しください。`,"dash.updateRetry":`再試行`,"dash.updateRecheck":`再確認`,"dash.updateCannotAuto":`ワンクリック更新は利用できません({reason})。`,"dash.updateReason.source_checkout":`ソースチェックアウト`,"dash.updateReason.latest_unavailable":`npm レジストリに到達できません`,"dash.updateReason.already_latest":`最新です`,"dash.updateReason.unknown":`更新は利用できません`,"dash.updateRestart":`更新後に再起動`,"dash.updateRestartHint":`推奨。プロキシが再起動されるまで現在の GUI は古いコードを実行し続けます。`,"dash.runUpdate":`更新`,"dash.updateReconnecting":`再起動したプロキシを待機中…`,"dash.updateStatus.running":`opencodex を更新しています。`,"dash.updateStatus.restarting":`更新をインストールしました。プロキシを再起動中。`,"dash.updateStatus.succeeded":`更新が完了しました。`,"dash.updateVersionTransition":`{currentVersion} -> {latestVersion}.`,"dash.updateStatus.failed":`更新に失敗しました。`,"prov.subtitle":`opencodex が Codex にルーティングする上流プロバイダーを設定します。アカウントでログインするか、プロバイダーを追加、または生の設定を編集します。`,"prov.add":`プロバイダーを追加`,"prov.editJson":`JSON を編集`,"prov.accountLogin":`アカウントログイン`,"prov.noOauth":`利用可能な OAuth プロバイダーがありません。`,"prov.loggedIn":`ログイン済み`,"prov.notLoggedIn":`未ログイン`,"prov.logout":`ログアウト`,"prov.login":`ログイン`,"prov.loginWith":`{provider} でログイン`,"prov.waitingBrowser":`ブラウザを待機中…`,"prov.didntOpen":`開きませんか? ここをクリック`,"prov.copyLink":`リンクをコピー`,"prov.dontOpenBrowser":`プロキシのマシンでブラウザーを開かない`,"prov.dontOpenBrowserHint":`別のブラウザープロファイルでログインする場合や、ダッシュボードがプロキシと別のマシンにある場合に使います。`,"prov.linkCopied":`コピーしました`,"prov.linkCopyUnavailable":`クリップボードを使用できません`,"prov.deviceCode":`デバイスコード`,"prov.copyCode":`コードをコピー`,"prov.codeCopied":`コードをコピーしました`,"prov.pasteRedirect":`リダイレクト URL またはコードを貼り付け`,"prov.pasteRedirectHint":`ブラウザに localhost エラーが表示された場合、アドレスバーから URL 全体をコピーしてここに貼り付けてください(または認可コードを貼り付け)。`,"prov.pasteSubmit":`送信`,"prov.pasteSubmitting":`送信中…`,"prov.pasteOk":`コードを送信しました — ログインを完了しています…`,"prov.pasteFail":`コードを送信できませんでした: {error}`,"prov.port":`ポート`,"prov.default":`デフォルト`,"prov.loadingConfig":`読み込み中…`,"prov.saved":`保存しました! 適用にはプロキシを再起動してください。`,"prov.loadConfigFail":`設定の読み込みに失敗しました`,"prov.invalidJson":`無効な JSON です`,"prov.saveFailed":`保存に失敗しました`,"prov.loginFailStart":`{provider} ログインを開始できませんでした`,"prov.loginError":`{provider} ログインエラー: {error}`,"prov.loginRequestFail":`{provider} ログインリクエストに失敗しました`,"prov.loginCancelled":`{provider} ログインはキャンセルされました`,"prov.loginTimeout":`{provider} ログインがタイムアウトしました — ブラウザが閉じたか完了しませんでした。もう一度お試しください。`,"prov.loginOk":`{provider} にログインしました。{cmd} を実行(またはライブで適用)してモデルを一覧表示します。`,"prov.loginSameAccount":`同じ {provider} アカウントのままです。ブラウザでアカウントを切り替えてから、もう一度アカウント追加を試してください。`,"oauthTos.highTitle":`{provider}: サブスクリプション OAuth リスク`,"oauthTos.elevatedTitle":`{provider}: 非公式 OAuth ブリッジ`,"oauthTos.anthropicBody":`OpenCodex のような第三者プロキシ経由で Claude サブスクリプションの OAuth トークンを直接再利用することは、Anthropic がサポートする統合ではなく、アクセス制限につながる可能性があります。Claude サブスクリプションを使用するサポートされた Agent SDK 統合は別物です。`,"oauthTos.highBody":`OpenCodex は第三者 OAuth パス経由で {provider} に接続します。サポート外の利用はアクセス制限や停止につながる可能性があります。`,"oauthTos.elevatedBody":`OpenCodex は非公式 OAuth パス経由で {provider} に接続します。可能な場合は公式クライアントを使用してください。異常または自動化されたトラフィックは悪用とみなされ、アクセスが制限または停止される可能性があります。`,"oauthTos.saferPath":`より安全な選択肢: 代わりに OpenCodex で API キーを設定してください。`,"oauthTos.acknowledge":`リスクを理解した上で、OAuth を続行します。`,"oauthTos.continue":`OAuth で続行`,"prov.logoutOk":`{provider} からログアウトしました。`,"prov.logoutFail":`{provider} からログアウトできませんでした。アカウント状態は変更されていません。`,"prov.removed":`"{name}" を削除しました。`,"prov.removedDefault":`"{name}" を削除しました。既定のプロバイダーは "{defaultProvider}" になりました。`,"prov.removeFail":`"{name}" の削除に失敗しました。`,"prov.removeLastProvider":`このプロバイダーは、他に有効なプロバイダーを既定にできない場合は削除できません。`,"prov.removeHasDependentCombos":`先に依存するコンボを削除または更新してください: {combos}。`,"prov.setDefault":`既定に設定`,"prov.setDefaultSuccess":`"{name}" を既定のプロバイダーに設定しました。`,"prov.setDefaultFail":`"{name}" を既定のプロバイダーに設定できませんでした。`,"prov.defaultDisabled":`既定に設定する前に、このプロバイダーを有効にしてください。`,"prov.updateFail":`このプロバイダーを更新できませんでした。`,"prov.networkError":`ネットワークエラーです。プロキシが実行中であることを確認して、もう一度試してください。`,"prov.added":`"{name}" を追加しました。即時反映 — {cmd} を実行(または再起動)して Codex のピッカーにモデルを一覧表示します。`,"prov.removeConfirm":`プロバイダー "{name}" を削除しますか? そのモデルは Codex のピッカーから消えます。`,"prov.hasApiKey":`API キー設定済み`,"prov.hasHeaders":`カスタムヘッダー設定済み`,"prov.accounts":`アカウント ({n})`,"prov.accountsAria":`{name} のアカウントを切り替え`,"prov.accountActive":`アクティブ`,"prov.accountReauth":`再ログイン`,"prov.reauthenticate":`再認証`,"prov.reauthAccountMissing":`ログイン後に選択されたアカウントが見つかりませんでした`,"prov.reauthIdentityMismatch":`サインインしたアカウントが選択したアカウントと一致しませんでした`,"prov.accountAdd":`アカウントを追加`,"prov.accountNoLabel":`アカウント {id}`,"prov.accountSwitchTitle":`このアカウントを使用`,"prov.accountSwitched":`{email} に切り替えました。`,"prov.accountSwitchFail":`アカウントの切り替えに失敗しました`,"prov.accountRemoved":`{email} を削除しました。`,"prov.accountRemoveFail":`{email} を削除できませんでした。アカウントは変更されていません。`,"prov.accountRemoveAria":`{email} を削除`,"prov.accountRemoveConfirm":`アカウント {email} を削除しますか? そのログインはこのプロキシから削除されます。`,"prov.keyAdd":`API キーを追加`,"prov.keyAdded":`{name} に API キーを追加しました。`,"prov.keyAddFail":`API キーの追加に失敗しました`,"prov.keyPlaceholder":`API キーを貼り付け`,"prov.keySwitchTitle":`このキーを使用`,"prov.keySwitched":`キー {key} に切り替えました。`,"prov.keySwitchFail":`キーの切り替えに失敗しました`,"prov.keyRemoved":`キー {key} を削除しました。`,"prov.keyRemoveAria":`キー {key} を削除`,"prov.keyRemoveConfirm":`API キー {key} を削除しますか? このプロキシの設定から削除されます。`,"prov.activeBadge":`アクティブ`,"prov.disabledBadge":`無効`,"prov.defaultBadge":`デフォルト`,"prov.enable":`有効化`,"prov.disable":`無効化`,"prov.enabled":`"{name}" を有効にしました。そのモデルは再び Codex に表示できます。`,"prov.disabled":`"{name}" を無効にしました。設定は保持されますが、モデルは非表示になります。`,"prov.enableFail":`"{name}" の有効化に失敗しました。`,"prov.disableFail":`"{name}" の無効化に失敗しました。`,"prov.enableAria":`プロバイダー {name} を有効化`,"prov.disableAria":`プロバイダー {name} を無効化`,"prov.defaultCannotDisable":`デフォルトプロバイダーは無効化できません`,"prov.openaiAccountMode":`Codex アカウントモード`,"prov.openaiModePool":`プール`,"prov.openaiModeDirect":`ダイレクト`,"prov.openaiPoolDesc":`デフォルト。アフィニティ、クォータ、クールダウン、フェイルオーバーを使ってメインログインと追加アカウントをローテーションします。`,"prov.openaiDirectDesc":`現在/メインの Codex ログインのみを使用します。保存されたプールアカウントは読み込まれずローテーションもされません。`,"prov.openaiModeSaved":`OpenAI アカウントモードを {mode} に変更しました。`,"prov.openaiModeSaveFailed":`OpenAI アカウントモードを変更できませんでした。`,"prov.openaiApiDesc":`OpenAI API キーを使用し、Codex アカウントの資格情報は使用しません。`,"prov.manageCodexAccounts":`Codex アカウントを管理`,"prov.openaiApiMissing":`API キーが必要です`,"prov.openaiApiSetup":`API キーを設定`,"models.tab.catalog":`モデル`,"models.tab.combos":`コンボ`,"models.tab.compatibility":`互換性`,"models.tab.routing":`ルーティング (beta)`,"models.tabsLabel":`モデルサーフェス`,"models.subtitle.combos":`複数のモデルを 1 つの id にまとめ、順に応答させます。failover は順番に試し、round-robin は負荷を分散します。`,"models.subtitle.compatibility":`ラボ投影証拠の読み取り専用互換性判定マトリクス。`,"models.subtitle.routing":`ポリシープロファイル、dry-run 評価、そして根拠の残るルーティング分析です。`,"models.subtitle":`Codex に表示するモデルを切り替えます — ネイティブ GPT パススルーとルーティングプロバイダー、プロバイダー別(ヘッダーをクリックで折りたたみ)。非表示モデルはカタログとピッカーから外れますが、正確な id での直接呼び出しは可能です。変更は次回の Codex ターンで適用 — opencodex は Codex の 5 分間モデルキャッシュを無効化するので再起動は不要です。`,"models.nativeGroupLabel":`OpenAI ネイティブ`,"models.nativeHint":"パススルーモデルはプロバイダーで選択したプールまたはダイレクトアカウントオプションを使用します。一つオフにすると Codex ピッカーから隠します(カタログエントリは保持されるので、再有効化で正確に復元されます)。 ここでモデルを追加すると、bare passthrough id ではなくルーティングされた `openai/<model>` セレクタとして登録されます。","models.active":`{active}/{total} 表示中`,"models.workspace.providers":`プロバイダー`,"models.workspace.allProviders":`すべてのプロバイダー`,"models.workspace.mainAria":`モデルの詳細`,"models.allOn":`すべてオン`,"models.allOff":`すべてオフ`,"models.presetLabel":`モデル`,"models.presetMode_preset":`プリセット`,"models.presetMode_all":`すべて`,"models.presetMode_custom":`カスタム`,"models.presetSummary":`{total} 件中 {count} 件を表示 — コアプリセット v{version}`,"models.presetUpdateAvailable":`プリセット v{version} が利用可能`,"models.presetAppliedToast":`{provider}: プリセットを適用 — {count} 件を選択`,"models.presetClearedToast":`{provider}: すべてのモデルを表示`,"models.presetEmpty":`{provider}: プリセットに一致するモデルがないため選択は変更していません`,"models.presetConfirmReplace":`選択中の一覧を {count} 件のプリセットで置き換えますか?`,"models.cap350k":`350k 上限`,"models.capApplied":`コンテキスト上限を適用しました — 次回の Codex ターンで有効になります。`,"models.capSaveFailed":`コンテキスト上限の保存に失敗しました`,"models.contextCapped":`350k 上限`,"models.contextCapLabel":`安全上限 / フォールバック`,"models.v2Label":`サブエージェント`,"models.shadowCallOriginal":`⚠ {models} →`,"models.v2DocsLink":`v1 / v2 とは?`,"models.v2Mode_v1":`v1`,"models.v2Mode_default":`ベース`,"models.v2Mode_v2":`v2`,"models.v2ModeDesc_v1":`すべてのモデル → v1 サーフェス`,"models.v2ModeDesc_default":`上流のデフォルト(sol/terra=v2、luna=v1)`,"models.v2ModeDesc_v2":`すべてのモデル → v2 サーフェス`,"models.keepNativeOnV1":`ChatGPT を v1 のまま`,"models.keepNativeOnV1Hint":`ChatGPT ネイティブの親は v2 子タスクを暗号化するため、Grok や Claude は読めません。Sol/Terra から routed モデルを spawn するならオンのまま。routed 親は v2 のままです。`,"models.v2Help":`すべてのモデルのマルチエージェントサーフェスを制御します。
58
+
59
+ v1: クラシックな単一スレッドエージェント。すべてのモデルが v1 コラボサーフェスを使います。
60
+ ベース: 上流のデフォルト — sol/terra は v2、luna は v1、それ以外は codex のフィーチャーフラグに従います。
61
+ v2: spawn_agent を備えたマルチスレッドエージェント。すべてのモデルが v2 コラボサーフェスを使います。
62
+
63
+ v2 では「ChatGPT を v1 のまま」にすると Sol/Terra が v1 に留まり、Grok や Claude を spawn できます。ChatGPT は v2 子タスクを暗号化するため routed モデルは読めません。routed 親は v2 のままです。
64
+
65
+ 変更は新規セッションに適用されます。`,"dash.multiAgent":`サブエージェント`,"models.v2Conflict":`[agents] max_threads が設定されています — codex は起動を拒否します; config.toml から削除してください`,"models.v2Applied":`サブエージェントモードを更新しました — 新規セッションに適用(ピッカーを更新するには Codex アプリを再起動)`,"models.v2ThreadsLabel":`最大スレッド数`,"models.v2ThreadsDefault":`デフォルト (4)`,"models.v2ThreadsApplied":`スレッド上限を更新しました — 新規セッションに適用`,"models.v2ThreadsInvalid":`スレッド上限は 1 以上の整数にしてください`,"models.v2ThreadsApply":`適用`,"models.capValue":`デフォルト {value}`,"models.contextSettings":`カスタムウィンドウ`,"models.contextSettingsTitle":`カスタムウィンドウ — {provider}`,"models.contextDefault":`安全上限 / フォールバック`,"models.contextModel":`モデル`,"models.contextModelOverride":`モデル別の上書き`,"models.contextHint":`空欄のままにすると自動検出します。ここに書いた値は安全上限兼フォールバックで、上流の窓がないときだけ埋め、より大きな報告値だけ下げます。ライブ検出の結果はこの欄に書き戻りません。`,"models.contextAutomatic":`自動検出`,"models.contextSaved":`コンテキストウィンドウを更新しました — 次回の Codex ターンから有効です。`,"models.contextUnchanged":`保存するコンテキストウィンドウの変更はありません。`,"models.contextSaveFailed":`コンテキストウィンドウを保存できませんでした`,"models.contextInvalid":`コンテキストウィンドウは正の整数で指定してください`,"models.contextCappedValue":`{value} 上限`,"models.contextMetadataSource":`出典`,"models.contextMetadataLive":`検出`,"models.contextMetadataRegistry":`レジストリ`,"models.contextMetadataCursorStatic":`Cursor選定`,"models.contextMetadataSnapshot":`保存済み`,"models.contextMetadataFallback":`フォールバック`,"models.contextMetadataDerived":`派生`,"models.contextMetadataUnknown":`不明`,"models.contextMetadataStale":`古い`,"models.contextTooltipDetected":`{value} · 検出`,"models.contextTooltipCapped":`{detected} 検出 · {cap} に制限`,"models.contextTooltipStale":`{value} · {when}`,"models.contextTooltipUnknown":`コンテキストウィンドウ不明`,"models.contextTooltipSource":`{value} · {source}`,"models.contextLastChecked":`最終確認 {when}`,"models.contextYesterday":`昨日`,"models.setAll":`すべて設定`,"models.setAllHint":`すべてのルーティング済みプロバイダーに {value} のデフォルトウィンドウをオンにします。中継が context_window / context_length を返さない場合、この値が実際の Codex ウィンドウになります。1 モデルだけ手で書くときは同じ行の「カスタムウィンドウ」を使います。ネイティブプロバイダーには影響しません。`,"models.collapseAll":`すべて折りたたむ`,"models.expandAll":`すべて展開`,"models.orderHint":`ピッカーの順序: サブエージェントの選択(選択順) → 残りのルーティングモデルはプロバイダー別、次にモデル ID 別のアルファベット順 → ネイティブモデル。表示切り替えはモデルをフィルタするだけで、この順序は変更しません。`,"models.custom":`カスタム…`,"models.customApply":`適用`,"models.customPlaceholder":`トークン (例: 420000)`,"models.applied":`適用しました — 次回の Codex ターンで有効になります。`,"models.saveFailed":`保存に失敗しました`,"models.networkError":`ネットワークエラー — プロキシは起動していますか?`,"models.loadFail":`モデルの読み込みに失敗しました — プロキシは起動していますか?`,"models.noRouted":`ルーティングモデルがありません`,"models.noRoutedHint":`まずプロバイダーにログインするか追加してください。`,"models.emptyDiscovery":`モデルが見つかりませんでした。プロバイダーのエンドポイントを確認するか、静的/カスタムモデルを追加してください。`,"models.emptyDiscoveryDisabled":`ライブモデル検出がオフで、静的モデルも設定されていません。`,"models.discoveryFailedBadge":`検出に失敗`,"models.discoveryFailedHttp":`モデル検出に失敗しました(HTTP {status})。`,"models.discoveryFailedBlocked":`モデル検出は宛先ポリシーによりブロックされました。`,"models.discoveryFailedInvalidResponse":`モデル検出が無効な応答を返しました。`,"models.discoveryFailedNetwork":`ネットワークエラーによりモデル検出に失敗しました。`,"models.discoveryFailedProvider":`プロバイダーがモデル検出エラーを報告しました。`,"models.discoveryFailedGeneric":`モデル検出に失敗しました。`,"models.openProviderSettings":`プロバイダー設定を開く`,"models.loading":`読み込み中…`,"models.search":`モデルを検索…`,"models.showMore":`さらに {n} 件表示`,"models.allowlistLabel":`選択のみ`,"models.allowlistHint":`チェックしたモデルのみカタログに送信します(空 = すべて)。数千のモデルを公開するプロバイダーで有用です。`,"models.selectedCount":`{n} 件選択`,"sub.subtitle":`Codex の {cmd} は最初の 5 モデル(優先度順)のみをオーバーライドとして通知します。ここで最大 5 つを選んでください — ネイティブ gpt またはルーティング — opencodex がカタログ優先度を設定し、これらが先頭に来るようにします。他のモデルも正確な名前で呼び出し可能です; これは表示のみを制御します。`,"sub.featured":`おすすめ`,"sub.orderHint":`ここでの表示順が Codex モデルピッカーの上位 1〜5 番目の位置と {cmd} のデフォルトモデル候補を決定します。`,"sub.noneSelected":`未選択 — 以下のリストから選んでください。`,"sub.models":`モデル`,"sub.search":`モデルを検索(ネイティブ gpt + ルーティング)…`,"sub.noModels":`モデルがありません — まずプロバイダーにログインするか追加してください。`,"sub.saved":`{n} 件のモデルを保存しました。新規 Codex セッションを開始(または {cmd} を実行)して spawn_agent オーバーライドとして確認してください。`,"sub.saveFailed":`保存に失敗しました`,"sub.networkError":`ネットワークエラー — プロキシは起動していますか?`,"sub.loadFail":`モデルの読み込みに失敗しました — プロキシは起動していますか?`,"sub.loading":`読み込み中…`,"sub.moveUp":`{m} を上へ移動`,"sub.moveDown":`{m} を下へ移動`,"sub.removeAria":`{m} を削除`,"sub.workspace.addToFeatured":`{m} をおすすめに追加`,"sub.workspace.allModels":`すべてのモデル`,"sub.workspace.featuredFull":`おすすめリストがいっぱいです(最大 5)`,"sub.workspace.mainAria":`サブエージェントのモデル詳細`,"sub.workspace.notFeatured":`おすすめ未設定`,"sub.workspace.priority":`優先度`,"sub.workspace.removeFromFeatured":`{m} をおすすめから削除`,"sub.workspace.selectModel":`モデルを選択`,"sub.workspace.selectModelDesc":`一覧からモデルを選んで詳細を確認し、spawn_agent のおすすめに設定します。`,"sub.workspace.selector":`公開セレクター`,"sub.ultraMode":`ウルトラモード`,"sub.ultraModeHint":`すべてのモデルと reasoning effort で Proactive マルチエージェント委任ポリシーを有効にします(reasoning effort 自体は変更しません)。config.toml に features.multi_agent_v2.multi_agent_mode_hint_text を書き込みます。`,"sub.ultraModeV2Required":`v2 マルチエージェントサーフェスが必要です — 先に multi_agent_v2 を有効にし、サブエージェントモードで v2 を選択してください。`,"sub.ultraModeText":`ウルトラモード委任テキスト`,"sub.ultraModePreset":`プリセットを復元`,"sub.ultraModeLoadFail":`ウルトラモード設定を読み込めませんでした — プロキシは実行中ですか?`,"sub.ultraModeSaveFail":`ウルトラモード設定の保存に失敗しました`,"sub.ultraModeSaved":`ウルトラモードを保存しました。新しい Codex セッションから適用されます。`,"sub.nativeParentOverride":`ネイティブ V2 親をルーティング`,"sub.nativeParentOverrideHint":`Codex には元のネイティブモデルが表示される場合がありますが、OpenCodex は選択したルーティング先でルートを実行します。`,"sub.nativeParentOverridePrivacyWarning":`プロンプト、リポジトリコンテキスト、会話履歴、ツール結果は選択したプロバイダーに送られ、その可用性、コンテキスト、遅延、動作、コスト、プライバシー特性を引き継ぎます。`,"sub.nativeParentOverrideModel":`ネイティブ親の対象モデル`,"sub.nativeParentOverrideV2Required":`明示的な V2、上流の V2 フラグ、「ChatGPT を v1 に保持」の無効化が必要です。`,"sub.nativeParentOverrideSaveFail":`ネイティブ親ルーティングの保存に失敗しました`,"sub.nativeParentOverrideSaved":`ネイティブ親ルーティングを保存しました。以降の親ターンとコンパクションに適用されます。`,"sub.agentTaskRecovery":`暗号化された V2 タスクの復元`,"sub.agentTaskRecoveryHint":`ChatGPT 経由で OpenAI Fernet 暗号化タスクメッセージを復号し、OpenAI 以外のサブエージェントでも V2 タスクを読み取れるようにします。`,"sub.agentTaskRecoveryModel":`復元モデル (デフォルト: gpt-5.6-luna)`,"sub.agentTaskRecoverySaveFail":`暗号化タスク復元の保存に失敗しました`,"sub.agentTaskRecoverySaved":`暗号化タスク復元の設定を保存しました。`,"sub.roles":`ロール`,"sub.roles.hint":`親が spawn できる名前付きスペシャリストです。各ロールはモデルと子プロンプトを固定します。委譲するかどうかは親が決めます。`,"sub.roles.add":`ロールを追加`,"sub.roles.empty":`まだロールがありません。レビューや検索など、委譲したい作業用のスペシャリストを追加してください。`,"sub.roles.full":`ロールカタログがいっぱいです(最大 8)`,"sub.roles.id":`ロール名`,"sub.roles.description":`使うタイミング`,"sub.roles.descriptionHint":`親がこのスペシャリストをいつ spawn すべきか判断するために表示されます。`,"sub.roles.model":`モデル`,"sub.roles.effort":`エフォート`,"sub.roles.effortNone":`モデル既定`,"sub.roles.instructions":`子の指示`,"sub.roles.instructionsHint":`子エージェントが読み込むデベロッパープロンプトです。`,"sub.roles.enabled":`有効`,"sub.roles.delete":`ロール {id} を削除`,"sub.roles.save":`ロールを保存`,"sub.roles.saved":`ロールを保存しました。新しい Codex セッションから適用されます。`,"sub.roles.saveFailed":`ロールの保存に失敗しました`,"sub.roles.loadFail":`ロールを読み込めませんでした — プロキシは起動していますか?`,"sub.roles.routedV2Warning":`このロールは v2 サーフェス上のルーテッドモデルを使い、ChatGPT を v1 に保っていません。ネイティブ v2 の親は子タスクを暗号化します。`,"sub.roles.sync":`Codex エージェントファイルへ同期`,"sub.roles.syncHint":`有効なロールをマーカー所有の ocx-*.toml に書き込みます。オフにすると OpenCodex 所有ファイルだけを削除し、あなたのファイルは触りません。`,"sub.injectionPrompt":`カスタム親ガイダンス`,"sub.injectionPromptHint":`組み込みの v2 spawn 案内を置き換えます。空なら組み込み文です。ライブ値が必要ならプレースホルダを入れてください:`,"sub.injectionPromptSave":`親ガイダンスを保存`,"sub.injectionPromptSaved":`親ガイダンスを保存しました。新しい Codex セッションから適用されます。`,"sub.injectionPromptSaveFailed":`親ガイダンスの保存に失敗しました`,"sub.childInstructions":`グローバルな子の指示`,"sub.childInstructionsHint":`spawn されたすべての子に適用されます。ロール指示は同期後、そのスペシャリストにだけ適用されます。`,"sub.childInstructionsSave":`子の指示を保存`,"sub.childInstructionsSaved":`子の指示を保存しました。新しい Codex セッションから適用されます。`,"sub.childInstructionsSaveFailed":`子の指示の保存に失敗しました`,"logs.title":`リクエストログ`,"logs.tabLogs":`ログ`,"logs.tabDebug":`デバッグ`,"logs.subtitle":`ローカル opencodex プロキシを経由した最近のリクエスト(新しい順)。`,"logs.autoRefresh":`自動更新`,"logs.noRequests":`まだリクエストがありません。`,"logs.loadError":`リクエストログを読み込めませんでした。`,"logs.filter.surface.label":`サーフェス`,"logs.filter.surface.all":`すべて`,"logs.filter.surface.claude":`Claude`,"logs.filter.surface.codex":`Codex`,"logs.filter.surface.grok":`Grok`,"logs.filter.interceptedHelpersOnly":`インターセプトされたヘルパーのみ`,"logs.filter.model.label":`モデル`,"logs.filter.model.all":`すべてのモデル`,"logs.filter.provider.label":`プロバイダー`,"logs.filter.provider.all":`すべてのプロバイダー`,"logs.filter.status.label":`状態`,"logs.filter.status.all":`すべての状態`,"logs.filter.status.success":`成功 (2xx)`,"logs.filter.status.errors":`エラー (4xx/5xx)`,"logs.filter.time.label":`期間`,"logs.filter.time.all":`全期間`,"logs.filter.time.15m":`直近15分`,"logs.filter.time.1h":`直近1時間`,"logs.filter.time.24h":`直近24時間`,"logs.filter.speed.label":`速度`,"logs.filter.speed.all":`すべての速度`,"logs.filter.speed.slow":`< 15 tok/s`,"logs.filter.speed.medium":`15–50 tok/s`,"logs.filter.speed.fast":`> 50 tok/s`,"logs.filter.reset":`フィルターをリセット`,"logs.filter.showingCount":`{total} 件中 {count} 件を表示`,"logs.badge.interceptedHelper":`I · {model}`,"logs.badge.interceptedHelperTitle":`インターセプトされたヘルパー要求`,"logs.filter.conversation.label":`会話`,"logs.filter.conversation.placeholder":`会話 ID を貼り付け`,"logs.filter.conversation.clear":`クリア`,"logs.filter.conversation.apply":`ログを絞り込み`,"logs.conversation.totals":`{requests} 件 · {tokens} トークン · {cost}`,"logs.conversation.scope":`合計は現在読み込まれている Logs リングのみです。`,"logs.conversation.excluded":`(~$ から価格なし {unpriced} / 未計測 {unmetered} を除外)`,"logs.cost.approximate":`約{amount}`,"logs.cost.lowerBound":`最低{amount}`,"logs.cost.unavailable":`利用不可`,"logs.detail.conversation":`会話`,"logs.badge.claude":`Claude`,"logs.badge.grok":`Grok`,"logs.col.time":`時刻`,"logs.col.request":`リクエスト`,"logs.col.model":`モデル`,"logs.col.effort":`負荷`,"logs.col.provider":`プロバイダー`,"logs.col.status":`状態`,"logs.col.tokens":`トークン`,"logs.col.tokPerSec":`tok/s`,"logs.col.estimatedCost":`~$`,"logs.metric.tokPerSecTitle":`リクエスト全体の所要時間あたりの出力トークン数`,"logs.metric.estimatedCostTitle":`API 定価相当額(実際の請求ではありません); 未対応の価格は利用できません`,"usage.cost.total":`API 定価相当額(この期間)`,"usage.cost.disclaimer":`請求明細ではありません。サブスクリプション利用量やプロバイダークレジットが代わりに適用される場合があります。`,"usage.cost.unpricedNote":`{count} 件のリクエストを除外(価格または使用量なし)`,"logs.detail.section.basic":`基本情報`,"logs.detail.route.section":`ルート決定`,"logs.detail.route.kind":`ルート種別`,"logs.detail.route.profile":`プロファイル`,"logs.detail.route.selected":`選択済み`,"logs.detail.route.candidates":`候補`,"logs.detail.route.unknown":`このリクエストにはルートトレースが記録されていません(トレース前の行)。`,"logs.detail.section.performance":`パフォーマンス`,"logs.detail.section.cost":`API 定価相当額`,"logs.detail.section.attempts":`コンボの試行`,"logs.detail.section.usage":`生の使用量`,"logs.detail.ttft":`TTFT`,"logs.detail.costTotal":`定価相当額`,"logs.detail.totalTokens":`合計トークン`,"logs.detail.matchedKey":`一致した価格キー`,"logs.detail.priceSource":`価格ソース`,"logs.detail.unavailableReason":`利用不可の理由`,"logs.detail.copyRequestId":`リクエスト ID をコピー`,"logs.detail.copied":`コピーしました`,"logs.detail.source.jawcode":`jawcode カタログ`,"logs.detail.source.expected":`予想価格オーバーレイ`,"logs.detail.source.user":`プロバイダー設定の価格オーバーレイ`,"logs.detail.verification.verified":`検証済み`,"logs.detail.verification.derived":`ベースモデルから派生`,"logs.detail.attempt.target":`プロバイダー / モデル`,"logs.detail.attempt.reason":`結果 / 理由`,"logs.detail.attempt.completed":`完了`,"logs.detail.attempt.e2eNote":`トップレベルの tok/s はエンドツーエンドです; 各試行は自身の所要時間を使います。`,"logs.detail.attempt.recovery.transient5xx":`一時的な5xxエラー`,"logs.detail.attempt.recovery.connectionReset":`接続がリセットされました`,"logs.detail.attempt.recovery.oauth401":`OAuth 再認証`,"logs.detail.attempt.recovery.key429":`キーがレート制限 (429)`,"logs.detail.attempt.recovery.rateLimit429":`レート制限 (429)`,"logs.detail.attempt.recovery.anthropicOauth429":`Anthropic OAuth レート制限 (429)`,"logs.detail.attempt.recovery.image413":`画像ペイロードが大きすぎます (413)`,"logs.detail.attempt.recovery.emptyCompletion":`空の完了を再試行`,"logs.detail.attempt.recovery.unknown":`不明なリカバリ理由`,"logs.detail.reason.usage_missing":`使用量が報告されませんでした。`,"logs.detail.reason.usage_unsupported":`このプロバイダーは使用量を報告しません。`,"logs.detail.reason.output_missing":`正の出力トークン数が報告されませんでした。`,"logs.detail.reason.invalid_duration":`リクエストの所要時間が有効ではありません。`,"logs.detail.reason.price_unmatched":`一致する価格が見つかりませんでした。`,"logs.detail.reason.invalid_cache_breakdown":`キャッシュトークンの詳細が合計入力トークンと矛盾しています。`,"logs.detail.reason.invalid_usage":`使用量に無効なトークン値が含まれています。`,"logs.detail.reason.combo_attempt_unavailable":`少なくとも 1 つのコンボ試行に価格を設定できませんでした。`,"logs.detail.estimate.usage_estimated":`プロバイダーの使用量は推定です。`,"logs.detail.estimate.cache_detail_missing":`キャッシュの詳細が利用できませんでした; 入力は上限の推定です。`,"logs.detail.estimate.expected_price_overlay":`検証済みの予想定価が使用されました。`,"logs.detail.estimate.provider_cost_overlay":`プロバイダー設定の価格オーバーレイが使用されました。`,"logs.detail.estimate.priority_lower_bound":`確認済みの Priority 価格を利用できないため、表示される見積もりは既知の下限です。`,"logs.col.error":`エラー`,"logs.col.upstreamReason":`上流の理由`,"logs.col.duration":`所要時間`,"logs.modelTooltip.model":`モデル`,"logs.modelTooltip.resolvedModel":`解決後モデル`,"logs.modelTooltip.requestedTier":`要求ティア`,"logs.modelTooltip.configuredTier":`設定ティア`,"logs.modelTooltip.responseTier":`応答ティア`,"logs.modelTooltip.supportsTier":`ティア対応`,"logs.tokens.reported":`報告済み`,"logs.tokens.unreported":`未報告`,"logs.tokens.unsupported":`非対応`,"logs.tokens.estimated":`推定`,"logs.tokens.input":`入力`,"logs.tokens.output":`出力`,"logs.tokens.cacheRead":`キャッシュ読み取り (c)`,"logs.tokens.cacheWrite":`キャッシュ書き込み (w)`,"logs.tokens.reasoning":`推論`,"logs.tokens.noCache":`キャッシュデータなし`,"logs.tokens.contextTotal":`アクティブコンテキスト`,"logs.tokens.noCacheNote":`このプロバイダーはキャッシュトークンを報告しません`,"logs.tokens.noCacheCursor":`Cursor のキャッシュ詳細は未報告`,"logs.tokens.noCacheCursorNote":`Cursor はキャッシュ read/write トークン数を公開しません。これは不明という意味で、キャッシュミスの確定ではありません`,"logs.tokens.estimatedNote":`推定(プロバイダーは正確な使用量を報告しません)`,"logs.details":`詳細`,"logs.detailTitle":`リクエストの詳細`,"logs.detailRaw":`生のログエントリ`,"debug.title":`デバッグ`,"debug.subtitle":`オプトインのプロバイダートランスポートおよび使用量抽出診断です。リクエストエラーと 502 はログタブに残ります。`,"debug.debug":`プロバイダーデバッグ`,"debug.usage":`使用量抽出`,"debug.injection":`インジェクションログ`,"debug.claude":`Claude インバウンド`,"debug.claudeInbound.title":`Claude インバウンドリクエスト`,"debug.claudeInbound.sub":`Claude Code/Desktop が実際に送信する内容(thinking、effort、metadata) — プロンプトテキストは保存されません。`,"debug.claudeInbound.empty":`まだキャプチャされたリクエストはありません。これがオンの状態で Claude からメッセージを送信してください。`,"debug.claudeInbound.time":`時刻`,"debug.claudeInbound.endpoint":`エンドポイント`,"debug.claudeInbound.model":`モデル`,"debug.claudeInbound.none":`なし`,"debug.reset":`ランタイムオーバーライドをクリア`,"debug.refresh":`更新`,"debug.follow":`追従`,"debug.streamProvider":`プロバイダー`,"debug.streamUsage":`使用量`,"debug.streamInjection":`インジェクション`,"debug.loading":`デバッグ設定を読み込み中…`,"debug.loadFailed":`デバッグ設定を読み込めませんでした。`,"debug.emptyTitle":`デバッグログはオフです`,"debug.empty":`上のカードでプロバイダーデバッグまたは使用量抽出をオンにしてください。プロキシ経由でリクエストを送信すると、ここに行が表示されます。`,"debug.noLinesTitle":`行を待機中`,"debug.noLines.provider":`プロバイダーデバッグはオンですが、トランスポートの異常(欠落または不正なフレーム、Cursor のダイヤル/再試行イベント)のみを記録します。Anthropic のようなプロバイダーでの正常なリクエストは行を生成しないことがあります。`,"debug.noLines.usage":`使用量抽出はオンですが、まだ何もキャプチャされていません。Codex 経由でチャット/リクエストを送信するとここに表示されます。`,"debug.noLines.injection":`インジェクションログはオンですが、まだ何もキャプチャされていません。コラボおよびサブエージェントのターンでのマルチエージェントガイダンスインジェクションと負荷上限の決定を記録します。`,"usage.title":`使用量`,"usage.subtitle":`プロキシからのローカルトークン会計です。欠損した使用量はゼロとして表示されることはありません。`,"usage.loading":`使用量データを読み込み中…`,"usage.empty":`まだ使用量が記録されていません。プロキシ経由でリクエストを送信するとここにアクティビティが表示されます。`,"usage.loadError":`使用量データを読み込めませんでした。`,"usage.range.all":`すべて`,"usage.range.available":`利用可能な履歴`,"usage.historyTruncated":`古い利用履歴が読み込まれていないため、合計は利用可能な履歴のみを対象とします。`,"usage.historyTruncatedWindow":`読み込まれた行のリクエスト開始時刻は {start} から {end} の範囲です。読み取り上限によりファイル前方の記録が除外されているため、選択した期間は不完全な場合があります。`,"usage.range.30d":`30日`,"usage.range.7d":`7日`,"usage.card.requests":`リクエスト`,"usage.card.measured":`計測`,"usage.card.reported":`報告`,"usage.card.totalTokens":`合計トークン`,"usage.card.cachedTokens":`キャッシュ読み取り`,"usage.card.cachedTokensHint":`プロバイダーキャッシュから提供されたプロンプトトークン(読み取り)。キャッシュ書き込みは存在する場合、下に表示されます。`,"usage.card.cacheWriteTokens":`キャッシュ書き込み`,"usage.card.coverage":`カバレッジ`,"usage.card.activeDays":`アクティブ日数`,"usage.section.heatmap":`日のアクティビティ`,"usage.section.overview":`概要`,"usage.section.models":`モデル`,"usage.section.providers":`プロバイダー`,"usage.section.coverage":`カバレッジ内訳`,"usage.workspace.report":`使用量レポート`,"usage.workspace.sections":`使用量セクション`,"usage.coverage.measured":`計測`,"usage.coverage.reported":`プロバイダー報告`,"usage.coverage.estimated":`推定`,"usage.coverage.note":`計測エントリにはプロバイダー報告および推定のトークン数が含まれます。未報告および非対応のリクエストは追跡されますが、ゼロトークンに水増しされることはありません。`,"usage.search.models":`モデルを検索…`,"usage.col.requests":`リクエスト`,"usage.col.measured":`計測`,"usage.col.reported":`報告`,"usage.col.tokens":`トークン`,"usage.col.share":`割合`,"usage.heatmap.less":`少ない`,"usage.heatmap.more":`多い`,"usage.dayMon":`月`,"usage.dayWed":`水`,"usage.dayFri":`金`,"usage.heatmap.tooltipTokens":`{tokens} トークン`,"usage.heatmap.tooltipRequests":`{requests} リクエスト`,"usage.chart.dayDetail":`{date}: {requests} リクエスト、{tokens} トークン`,"usage.heatmap.keyboardLabel":`上下キーで日単位、左右キーで週単位に移動します。`,"nav.storage":`ストレージ`,"storage.title":`ストレージ`,"storage.subtitle":`CODEX_HOME の使用状況を確認。クリーンアップはアクティブセッションに触れません。`,"storage.loading":`ストレージをスキャン中…`,"storage.empty":`CODEX_HOME が空か存在しません — 報告するものはありません。`,"storage.error":`ストレージのスキャンに失敗しました。CODEX_HOME が有効なディレクトリを指しているか確認してください。`,"storage.refresh":`再スキャン`,"storage.rescanned":`スキャンが完了しました。`,"storage.card.total":`合計サイズ`,"storage.card.files":`ファイル`,"storage.card.home":`CODEX_HOME`,"storage.snapshot.lastScan":`最終スキャン`,"storage.snapshot.scanning":`スキャン中…`,"storage.snapshot.unavailable":`まだスキャンがありません。`,"storage.cleanupCard.title":`容量を空ける`,"storage.cleanupCard.tabs":`クリーンアップオプション`,"storage.cleanupCard.tab.policy":`ポリシー`,"storage.cleanupCard.tab.quarantine":`隔離`,"storage.cleanup.noArchives":`クリーンアップ対象のアーカイブセッションはありません。`,"storage.section.buckets":`バケット`,"storage.section.largest":`最大ファイル`,"storage.workspace.overview":`概要`,"storage.workspace.selectBucket":`一覧からバケットを選ぶと内訳が表示されます。`,"storage.col.bucket":`バケット`,"storage.col.size":`サイズ`,"storage.col.files":`ファイル`,"storage.col.oldest":`最古`,"storage.col.newest":`最新`,"storage.col.rows":`DB 行`,"storage.rows.unknown":`不明(ロック中)`,"storage.bucket.sessions":`アクティブセッション`,"storage.bucket.archived_sessions":`アーカイブ済みセッション`,"storage.bucket.logs_db":`ログデータベース`,"storage.bucket.state_db":`状態データベース`,"storage.bucket.attachments":`添付`,"storage.bucket.deletion_manifests":`削除マニフェスト`,"storage.bucket.other":`その他`,"storage.cleanup.title":`アーカイブのクリーンアップ`,"storage.cleanup.help":`古いアーカイブセッションを割合で削除します。アクティブセッションには触れません。既定は隔離で、ファイルは CODEX_HOME/.trash へ移動します。`,"storage.cleanup.slider":`古いアーカイブの割合`,"storage.cleanup.percent":`{percent}%`,"storage.cleanup.preset":`{percent}`,"storage.cleanup.preview":`プレビュー`,"storage.cleanup.confirmTitle":`アーカイブクリーンアップの確認`,"storage.cleanup.confirmBody":`アーカイブ {count} 件(約 {size})、古い {percent}% を処理します。`,"storage.cleanup.moreFiles":`…ほか {n} 件`,"storage.cleanup.permanent":`完全に削除する(隔離しない)`,"storage.cleanup.permanentWarn":`完全削除は元に戻せません。`,"storage.cleanup.quarantineNote":`ファイルは CODEX_HOME 下の .trash へ移動します。隔離タブから復元できます。`,"storage.cleanup.cancel":`キャンセル`,"storage.cleanup.confirmQuarantine":`隔離する`,"storage.cleanup.confirmPermanent":`完全に削除`,"storage.cleanup.doneQuarantine":`{count} 件を隔離しました({size})。`,"storage.cleanup.donePermanent":`{count} 件を完全削除しました({size})。`,"storage.cleanup.previewFailed":`プレビューに失敗しました。`,"storage.cleanup.cleanupFailed":`クリーンアップに失敗しました。`,"storage.cleanup.err.codex_busy":`Codex が state.sqlite を使用中です — Codex を終了して再試行してください。`,"storage.cleanup.err.stale_preview":`プレビュー以降にアーカイブが変わりました — プレビューをやり直してください。`,"storage.cleanup.err.restore_pending_overlap":`選択したアーカイブは未完了の隔離復元と重なっています — 復元を完了するか再試行してください。`,"storage.cleanup.err.referenced_history":`選択したアーカイブはフォークまたはページング履歴から参照されています。`,"storage.cleanup.err.invalid_digest":`プレビューのダイジェストが無い、または無効です。`,"storage.cleanup.err.invalid_mode":`モードは quarantine または permanent である必要があります。`,"storage.cleanup.err.fs_failed":`ファイルシステムのクリーンアップに失敗しました。一部の変更は既に適用されている可能性があります — CODEX_HOME/.trash と表示されたリカバリパスを確認してください。`,"storage.cleanup.err.fs_failed_trash":`ファイルシステムのクリーンアップに失敗しました。一部の変更は既に適用されている可能性があります — {trashDir} と manifest.json で復旧可能なファイルを確認してください。`,"storage.cleanup.err.db_reconcile_failed":`Codex の状態データベースを更新できませんでした。`,"storage.cleanup.err.cleanup_failed":`クリーンアップに失敗しました。`,"storage.trash.title":`隔離`,"storage.trash.help":`CODEX_HOME/.trash へ移したアーカイブセッションです。復元すると JSONL とスレッド行が戻ります。`,"storage.trash.empty":`隔離エントリはありません。`,"storage.trash.loading":`隔離を読み込み中…`,"storage.trash.col.when":`隔離日時`,"storage.trash.col.files":`ファイル`,"storage.trash.col.size":`サイズ`,"storage.trash.col.mode":`モード`,"storage.trash.col.id":`エントリ`,"storage.trash.restore":`復元`,"storage.trash.confirmTitle":`隔離エントリを復元しますか?`,"storage.trash.confirmBody":`{id} から {count} 件(約 {size})をアーカイブセッションへ戻します。`,"storage.trash.cancel":`キャンセル`,"storage.trash.confirmRestore":`復元`,"storage.trash.done":`{count} 件を復元しました({size})。`,"storage.trash.restoreFailed":`復元に失敗しました。`,"storage.trash.listFailed":`隔離一覧を取得できませんでした。`,"storage.trash.mode.quarantine":`隔離`,"storage.trash.mode.permanent":`完全削除(未完了)`,"storage.trash.err.codex_busy":`Codex が state.sqlite を使用中です — Codex を終了して再試行してください。`,"storage.trash.err.invalid_trash":`隔離エントリ ID が無い、または無効です。`,"storage.trash.err.missing_trash":`隔離エントリが見つかりません。`,"storage.trash.err.dest_exists":`復元先が既に存在します — アーカイブファイルを削除または改名して再試行してください。`,"storage.trash.err.fs_failed":`ファイルシステムの復元に失敗しました。一部は既に復元されている可能性があります — archived_sessions と .trash を確認してください。`,"storage.trash.err.storage_mutation_busy":`別のストレージクリーンアップまたは復元が進行中です — しばらくして再試行してください。`,"storage.trash.err.db_reconcile_failed":`Codex の状態データベース行を復元できませんでした。`,"storage.trash.err.restore_failed":`復元に失敗しました。`,"storage.trash.err.restore_worker_timeout":`復元が長時間(10 分超)かかったため停止しました。`,"storage.trash.err.restore_worker_aborted":`シャットダウン中に復元がキャンセルされました。`,"storage.trash.err.restore_worker_failed":`復元ワーカーがクラッシュまたは予期しないエラーで失敗しました。`,"storage.policy.title":`自動クリーンアップ方針`,"storage.policy.help":`アーカイブがしきい値を超えたときの任意の一括クリーンアップ。既定はオフ — 自動では有効になりません。`,"storage.policy.loading":`方針を読み込み中…`,"storage.policy.loadFailed":`クリーンアップ方針を読み込めませんでした。`,"storage.policy.saveFailed":`クリーンアップ方針を保存できませんでした。`,"storage.policy.runFailed":`方針の実行に失敗しました。`,"storage.policy.alreadyRunning":`クリーンアップ方針の実行が既に進行中です。`,"storage.policy.invalid":`方針の値が無効です。`,"storage.policy.enabled":`自動クリーンアップを有効化`,"storage.policy.enabledHint":`既定はオフです。有効にすると選択したスケジュール(または今すぐ実行)でのみ動きます。`,"storage.policy.threshold":`アーカイブサイズが超えたら(GiB)`,"storage.policy.trigger":`トリガー`,"storage.policy.target":`クリーンアップ目標`,"storage.policy.targetPercent":`古いアーカイブを削除(%)`,"storage.policy.targetReduce":`アーカイブを次のサイズまで縮小(GiB)`,"storage.policy.thresholdInc":`しきい値を上げる`,"storage.policy.thresholdDec":`しきい値を下げる`,"storage.policy.percentInc":`パーセントを上げる`,"storage.policy.percentDec":`パーセントを下げる`,"storage.policy.reduceInc":`削減目標を上げる`,"storage.policy.reduceDec":`削減目標を下げる`,"storage.policy.schedule":`スケジュール`,"storage.policy.schedule.manual":`手動のみ`,"storage.policy.schedule.startup":`プロキシ起動時`,"storage.policy.schedule.daily":`毎日`,"storage.policy.schedule.weekly":`毎週`,"storage.policy.mode":`削除モード`,"storage.policy.mode.quarantine":`隔離(既定)`,"storage.policy.mode.permanent":`完全削除`,"storage.policy.permanentWarn":`完全削除モードは元に戻せません。確信がなければ隔離を使ってください。`,"storage.policy.lastRun":`前回の実行`,"storage.policy.lastRunDetail":`{count} 件削除 · {size} 解放`,"storage.policy.nextRun":`次回の実行`,"storage.policy.never":`なし`,"storage.policy.save":`保存`,"storage.policy.runNow":`今すぐ実行`,"storage.policy.running":`実行中…`,"storage.policy.saved":`方針を保存しました。`,"storage.policy.skippedDisabled":`方針が無効です — 先に有効化してください。`,"storage.policy.skippedUnder":`アーカイブサイズがしきい値未満です — 作業はありません。`,"storage.policy.skippedEmpty":`目標に合うアーカイブ候補がありません。`,"storage.policy.doneQuarantine":`方針が {count} 件を隔離しました({size})。`,"storage.policy.donePermanent":`方針が {count} 件を完全削除しました({size})。`,"modal.addNamed":`追加: {label}`,"modal.add":`プロバイダーを追加`,"modal.catalogTabs":`プロバイダーのカテゴリ`,"modal.searchLabel":`プロバイダーを検索`,"modal.search":`プロバイダーを検索…`,"modal.logInWith":`{label} でログイン`,"modal.waitingBrowser":`ブラウザを待機中…`,"modal.providerName":`プロバイダー名`,"modal.adapter":`アダプター`,"modal.baseUrl":`ベース URL`,"modal.endpoint":`エンドポイント`,"modal.endpoint.tokenPlan":`トークンプラン`,"modal.endpoint.payAsYouGo":`従量課金`,"modal.endpoint.custom":`カスタム`,"modal.defaultModel":`デフォルトモデル(任意)`,"modal.allowPrivateNetwork":`ローカル/プライベートネットワークを許可`,"modal.allowPrivateNetworkHint":`意図的にセルフホストしたプロバイダーに対してのみ有効化してください。メタデータエンドポイントはブロックされたままです。`,"modal.nameRequired":`プロバイダー名は必須です`,"modal.baseUrlRequired":`ベース URL は必須です`,"modal.networkError":`ネットワークエラー — プロキシは起動していますか?`,"modal.loginFailStart":`ログインを開始できませんでした`,"modal.waitingLogin":`ブラウザログインを待機中…`,"modal.loggingIn":`ログイン中…`,"modal.loginTimeout":`ログインがタイムアウトしました — もう一度お試しください。`,"modal.back":`戻る`,"modal.badge.oauth":`OAuth`,"modal.customProvider":`カスタムプロバイダー`,"replitGateway.title":`Replit ゲートウェイコンパニオン`,"replitGateway.subtitle":`自分でデプロイした Replit ゲートウェイに接続し、OpenAI Chat と Anthropic のペアプロバイダーをまとめてインストールします。`,"replitGateway.companionNote":`これはカスタムのコンパニオンワークフローであり、正規レジストリのプリセットではありません。`,"replitGateway.originLabel":`デプロイメントのオリジン`,"replitGateway.originHint":`Replit デプロイメントの HTTPS オリジン(例: https://my-app.replit.app)。`,"replitGateway.keyLabel":`ゲートウェイキー`,"replitGateway.keyHint":`デプロイメントの REPLIT_GATEWAY_KEY シークレット。ローカルのプロバイダー設定に保存され、ゲートウェイ通信の認証に使われます。`,"replitGateway.keyTooShort":`ゲートウェイキーが短すぎます(最低 32 文字)。`,"replitGateway.keyTooLong":`ゲートウェイキーは 512 文字以内にしてください。`,"replitGateway.keyInvalidChars":`ゲートウェイキーは印字可能な ASCII 文字のみ使用できます。`,"replitGateway.errorNetwork":`プロキシに接続できませんでした。実行中か確認してから再試行してください。`,"replitGateway.errorMalformed":`プロキシから無効な応答が返されました。しばらくしてから再試行してください。`,"replitGateway.customDomainLabel":`カスタムドメインを許可`,"replitGateway.customDomainHint":`ゲートウェイが .replit.app 以外でホストされている場合のみ有効にしてください。`,"replitGateway.setDefaultLabel":`インストール後に replit を既定プロバイダーに設定`,"replitGateway.install":`ペアをインストール`,"replitGateway.installing":`インストール中…`,"replitGateway.close":`閉じる`,"replitGateway.openButton":`Replit ゲートウェイ…`,"replitGateway.replaceTitle":`既存の Replit ペアを置き換えますか?`,"replitGateway.replaceBody":`プロバイダー replit と replit-anthropic は既に存在します。置き換えるとゲートウェイのオリジンとキーが上書きされますが、オーバーレイは保持されます。`,"replitGateway.replaceConfirm":`ペアを置き換え`,"replitGateway.replaceCancel":`既存を保持`,"replitGateway.probeHealth":`healthz: HTTP {status}({ms} ms)`,"replitGateway.probeModels":`models: {count} 件を検出({ms} ms)`,"replitGateway.successTitle":`Replit ゲートウェイペアをインストールしました。`,"replitGateway.errorGeneric":`Replit ゲートウェイペアをインストールできませんでした。`,"replitGateway.errorCollision":`Replit プロバイダーペアは既に存在します。`,"replitGateway.errorBusy":`設定がビジーです。しばらくしてから再試行してください。`,"replitGateway.originRequired":`デプロイメントのオリジンは必須です。`,"replitGateway.keyRequired":`ゲートウェイキーは必須です。`,"modal.failedStatus":`失敗 ({status})`,"modal.loginError":`ログインエラー: {error}`,"modal.badge.codexLogin":`Codex ログイン`,"modal.badge.local":`ローカル`,"modal.badge.apiKey":`API キー`,"modal.badge.direct":`ダイレクト`,"modal.badge.pool":`プール`,"modal.badge.free":`無料`,"modal.invalidPreset":`この組み込みプロバイダープリセットは不完全です。プロキシを再起動してもう一度お試しください。`,"modal.freeTierTitle":`無料枠`,"modal.freeTierDefault":`API キー不要です。そのまま利用できます。`,"modal.tab.accounts":`アカウント`,"modal.tab.free":`無料`,"modal.tab.paid":`有料`,"modal.accountsHint":`ChatGPT/Codex、OAuth プロバイダー、API キーアカウントにここからサインインします。OpenAI は組み込み済み — 再度追加せずログインしてください。`,"modal.accountsCodexAuthLink":`Codex 認証`,"modal.notListed":`プロバイダーが載っていませんか? カスタムを追加`,"modal.catalogLoading":`カタログを読み込み中…`,"modal.catalogLoadFailed":`プロバイダーカタログを読み込めませんでした。`,"modal.accountLogin":`ログイン`,"modal.accountLogout":`ログアウト`,"modal.accountAdd":`アカウントを追加`,"modal.accountManage":`管理`,"modal.accountCodexPool":`ChatGPT アカウントプール`,"modal.accountLoggedIn":`ログイン済み`,"modal.accountLoggedOut":`未ログイン`,"quota.fiveHourLimit":`5 時間上限`,"quota.weeklyLimit":`週間上限`,"quota.monthlyLimit":`30 日上限`,"quota.cursorFirstParty":`ファーストパーティモデル`,"quota.cursorApiUsage":`API 使用量`,"quota.totalSubscriptionCredits":`サブスクリプションクレジット合計`,"quota.creditsBalance":`クレジット残高`,"quota.creditsPeriodEnds":`請求期間終了日: {date}`,"quota.usedPercent":`{pct}% 使用`,"quota.limitReached":`上限に達しました`,"quota.resetsToday":`今日 {time} にリセット`,"quota.resetsTomorrow":`明日 {time} にリセット`,"quota.resetsAt":`{when} にリセット`,"quota.resetsRelativeMinutes":`{n} 分後にリセット`,"quota.resetsRelativeHours":`{n} 時間後にリセット`,"pws.status.ready":`準備完了`,"pws.status.needsSetup":`セットアップが必要`,"pws.status.needsAttention":`要対応`,"pws.auth.chatgptPassthrough":`ChatGPT パススルー`,"pws.auth.noKey":`キー不要`,"pws.freeTitle":`無料料金(キーが必要な場合もあります)`,"pws.localTitle":`ローカルランタイム`,"pws.modelCountOne":`1 モデル`,"pws.modelCount":`{count} モデル`,"pws.rail.suffixDefault":` · デフォルト`,"pws.rail.suffixLocal":` · ローカル`,"pws.rail.suffixFree":` · 無料`,"pws.rail.selectAria":`{name} を選択 — {status}{suffix}`,"pws.searchPlaceholder":`プロバイダーを検索…`,"pws.filterAria":`プロバイダーを絞り込み`,"pws.providerFiltersAria":`プロバイダーフィルタ`,"pws.filters":`フィルタ`,"pws.filterStatus":`状態`,"pws.pricing":`料金`,"pws.paid":`有料`,"pws.filterType":`タイプ`,"pws.type.cloud":`クラウド`,"pws.type.local":`ローカル`,"pws.type.selfHosted":`セルフホスト`,"pws.type.login":`ログイン`,"pws.sort":`並べ替え`,"pws.sortProvidersAria":`プロバイダーを並べ替え`,"pws.sort.az":`A–Z`,"pws.sort.za":`Z–A`,"pws.sort.freePaid":`無料優先`,"pws.sort.paidFree":`有料優先`,"pws.sort.accountsFirst":`アカウント優先`,"pws.resetAll":`すべてリセット`,"pws.providerList":`プロバイダー一覧`,"pws.providersAria":`プロバイダー`,"pws.groupReady":`準備完了 ({count})`,"pws.groupNeedsSetup":`セットアップが必要 ({count})`,"pws.groupDisabled":`無効 ({count})`,"pws.noSearchResults":`検索に一致するプロバイダーがありません。`,"pws.noMatchFilters":`フィルタに一致するプロバイダーがありません。`,"pws.noProvidersConfigured":`プロバイダーが設定されていません。`,"pws.workspaceMainAria":`プロバイダーの詳細`,"pws.detailComingSoon":`詳細ビューは近日対応 — このプロバイダーの管理にはクラシックビューを使用してください。`,"pws.selectPrompt":`リストからプロバイダーを選択してください。`,"pws.connectFirst":`最初のプロバイダーを接続`,"pws.empty.browseFree":`無料プロバイダーを見る`,"pws.empty.browseFreeDesc":`サブスクリプションなしで始める`,"pws.empty.connectAccount":`アカウントを接続`,"pws.empty.connectAccountDesc":`ChatGPT やプロバイダーのログインを使用`,"pws.empty.addEndpoint":`エンドポイントを追加`,"pws.empty.addEndpointDesc":`カスタムベース URL と API キー`,"pws.tab.overview":`概要`,"pws.tab.models":`モデル`,"pws.tab.usage":`使用量`,"pws.tab.accounts":`アカウント`,"pws.tab.settings":`設定`,"pws.connection":`接続`,"pws.status.connected":`接続済み`,"pws.attentionTitle":`要対応`,"pws.attention.reauth":`アクティブアカウントの再認証が必要です`,"pws.attention.reauthForward":`アクティブな Codex アカウントの再認証が必要です — アカウントタブを開いて修正してください`,"pws.attention.missingCredentials":`資格情報が不足しています`,"pws.cell.auth":`認証`,"pws.cell.note":`メモ`,"pws.cell.defaultModel":`デフォルトモデル`,"pws.statsAria":`プロバイダー統計`,"pws.statsTitle":`統計`,"pws.stats.totalRequests":`リクエスト (30日)`,"pws.stats.totalTokens":`トークン (30日)`,"pws.stats.quotaUpdated":`クォータを更新しました`,"pws.stats.quotaTracked":`レート制限は使用量タブで追跡されます。`,"pws.stats.source":`ソース`,"pws.usageLast30d":`使用量 (過去30日)`,"pws.allAccounts":`すべてのアカウント`,"pws.metricRequests":`リクエスト`,"pws.metricTokens":`トークン`,"pws.usageUnavailable":`まだ使用量が記録されていません。`,"pws.rateLimits":`レート制限`,"pws.quotaUnavailable":`このプロバイダーのクォータデータがありません。`,"pws.accountQuotaUnavailable":`レート制限データを一時的に取得できません。前回の値がある場合はそれを表示します。`,"pws.selected":`選択中`,"pws.copyModelId":`ID をコピー`,"pws.modelCopied":`コピーしました!`,"pws.modelsAvailable":`{count} 件利用可能`,"pws.modelSearchPlaceholder":`モデルを絞り込み…`,"pws.modelsLoading":`モデルを読み込み中…`,"pws.modelsLoadFailed":`モデルを読み込めませんでした。`,"pws.modelsNeedsReauth":`ライブモデル検出が動作するには再ログインが必要です。今は設定済みモデルを表示しています。`,"pws.modelsConfiguredFallback":`設定済みモデルを表示中(ライブ検出は利用不可)。`,"pws.modelsTruncated":`最初の {shown} / {total} モデルを表示中。リストを絞り込んでください。`,"pws.retry":`再試行`,"pws.noModels":`このプロバイダーで検出されたモデルはありません。`,"pws.noModelMatch":`フィルタに一致するモデルがありません。`,"pws.adapterBaseRequired":`アダプターとベース URL は必須です。`,"pws.addAccount":`アカウントを追加`,"pws.addKey":`API キーを追加`,"pws.apiKeys":`API キー`,"pws.authMode":`認証モード`,"pws.availableAccounts":`利用可能なアカウント`,"pws.accountOrdinal":`アカウント {count}`,"pws.accountsLoading":`アカウントを読み込み中…`,"pws.accountsLoadFailed":`アカウントを読み込めませんでした。`,"pws.retryAccounts":`再試行`,"pws.noAccounts":`まだアカウントが接続されていません。`,"pws.cockpitImportDescription":`このデバイスから Cockpit Tools Antigravity JSON エクスポートをインポートします。ファイル内容は表示されません。`,"pws.cockpitImportFileLabel":`Cockpit Tools Antigravity JSON エクスポート`,"pws.cockpitImportChooseFile":`JSON ファイルを選択`,"pws.cockpitImporting":`インポート中…`,"pws.cockpitImportInvalid":`選択したファイルは有効な JSON エクスポートではないか、大きすぎます。`,"pws.cockpitImportFailed":`アカウントのインポートを完了できませんでした。`,"pws.cockpitImportComplete":`インポート完了: インポート {imported}、更新 {updated}、失敗 {failed}、未対応 {unsupported}。`,"pws.accountSwitching":`切り替え中…`,"pws.accountCurrent":`現在のアカウント`,"pws.defaultModelNone":`なし(プロバイダーのデフォルトを使用)`,"pws.discardSettings":`破棄`,"pws.jsonEditorDesc":`生のプロバイダー JSON 設定を編集します。変更はすぐに保存されます。`,"pws.jsonEditorTitle":`JSON エディタ — {name}`,"pws.jsonRestore":`復元`,"pws.jsonSave":`保存`,"pws.loggedInTitle":`ログイン済み`,"pws.notLoggedInTitle":`未ログイン`,"pws.note":`メモ`,"pws.allowPrivateNetwork":`ローカル/プライベートネットワークを許可`,"pws.liveModels":`プロバイダーからモデルを検出`,"pws.liveModelsDesc":`プロバイダーのライブモデルカタログを取得します。オフにすると設定済みの静的モデルのみを使用します。`,"pws.xaiResponsesOptIn":`Grok 4.5 と 4.6 で Responses API を使用`,"pws.xaiResponsesOptInDesc":`両モデルを openai-responses 経由でルーティングします。他の Grok モデルと tier 動作は変わりません。`,"pws.xaiResponsesOptInMixed":`一部のみ有効です。`,"pws.cursorTransport":`Cursor トランスポート`,"pws.cursorTransportHttp2":`HTTP/2(デフォルト)`,"pws.cursorTransportHttp1":`HTTP/1.1(プロキシ互換)`,"pws.cursorTransportDesc":`プロキシが Cursor の HTTP/2 ストリームを安定して転送できない場合は HTTP/1.1 を使用します。`,"pws.optionalPlaceholder":`任意`,"pws.providerId":`プロバイダー ID`,"pws.reauth":`再認証が必要`,"pws.reauthenticate":`再認証`,"pws.clearCooldown":`クールダウンを解除`,"pws.copyDoctor":`ocx doctor をコピー`,"pws.doctorCopied":`コピー済み`,"pws.healthCooldownHint":`クールダウンが終わるまで待ってください。まだこのアカウントをプローブしないでください。`,"pws.doctorCopyUnavailable":`クリップボードを利用できません`,"pws.healthLabel.rateLimited":`レート制限中`,"pws.healthLabel.quotaLimited":`クォータ制限中`,"pws.healthLabel.reauthRequired":`再認証が必要です`,"pws.healthLabel.refreshFailed":`更新に失敗しました`,"pws.healthLabel.metadataMismatch":`メタデータの不一致`,"pws.healthLabel.credentialConflict":`資格情報の競合`,"pws.healthSummary.rateLimited":`{provider} {account}: {until} までレート制限中です。それまでこのアカウントのルーティングは停止します。`,"pws.healthSummary.quotaLimited":`{provider} {account}: {until} までクォータ制限中です。それまでこのアカウントのルーティングは停止します。`,"pws.healthSummary.reauthRequired":`{provider} {account}: 再認証が必要です。`,"pws.healthSummary.credentialConflict":`{provider} {account}: 資格情報の競合があります。`,"pws.healthSummary.metadataMismatch":`{provider} {account}: メタデータが一致しません。`,"pws.healthSummary.staleCredentials":`{provider} {account}: 資格情報が不完全です。`,"pws.removeConfirm":`削除`,"pws.removeConfirmBody":`プロバイダー "{name}" を削除しますか? これは元に戻せません。`,"pws.removeDefaultConfirmBody":`既定のプロバイダー "{name}" を削除しますか? "{defaultProvider}" が既定のプロバイダーになります。この操作は元に戻せません。`,"pws.removeConfirmTitle":`プロバイダーを削除`,"pws.saveSettings":`保存`,"pws.pacingTitle":`リクエスト間隔調整`,"pws.pacingDesc":`このプロバイダーへの送信開始を均等に遅延します。ストリーミング応答は重複できます。`,"pws.pacingEnabled":`有効`,"pws.pacingRpm":`1分あたりのリクエスト数`,"pws.pacingRpmUnit":`RPM`,"pws.pacingDelay":`最小間隔 (ms)`,"pws.pacingJitter":`ランダムジッター (ms)`,"pws.pacingSlowerWins":`より遅いプロバイダー制限が優先され、モデル設定は遅延を増やす場合のみ適用されます。`,"pws.pacingQueued":`待機中`,"pws.pacingNextSlot":`次のスロットまで`,"pws.pacingLastModel":`最後のモデル`,"pws.pacingNone":`なし`,"pws.pacingModelOverrides":`モデル別設定`,"pws.pacingModel":`モデル`,"pws.pacingAdd":`設定を追加`,"pws.pacingRemove":`削除`,"pws.pacingRemoveModel":`{model} のリクエスト間隔設定を削除`,"pws.pacingRuleRequired":`プロバイダー制限またはモデル別設定を追加してから有効にしてください。`,"pws.antigravityTlsTitle":`Antigravity ブラウザー TLS プロファイル`,"pws.antigravityTlsEnable":`実験的な TLS/HTTP2 エミュレーションを有効化`,"pws.antigravityTlsWarning":`非公式の互換機能です。利用規約への準拠や停止防止を保証せず、通信をより特徴的にする可能性があり、初期化に失敗すると Bun にフォールバックします。公式の Gemini API キー、Vertex、または文書化された Code Assist ルートの方が安全です。`,"pws.antigravityTlsConfirm":`実験的で非公式な Antigravity TLS プロファイルを有効にしますか?ポリシー準拠や停止防止は保証されません。続行しますか?`,"pws.antigravityTlsStatus":`TLS プロファイルの状態: {status}`,"pws.antigravityTlsDisabled":`無効`,"pws.antigravityTlsActive":`有効`,"pws.antigravityTlsFallback":`フォールバック`,"pws.saving":`保存中…`,"pws.settingsSaved":`設定を保存しました。`,"pws.accountModeSaved":`アカウントモードを保存しました。`,"pws.accountModeFailed":`アカウントモードを切り替えられませんでした。`,"pws.accountModeConfirm":`OpenAI のアカウントモードを切り替えますか?実行中の会話はもう一方のモードのアカウントセットに再割り当てされ、クォータ使用量は新しいモードで計上されます。`,"pws.settingsUnsavedBar":`未保存の変更があります。`,"pws.unsavedLeaveBody":`未保存の変更があります。保存してから移動しますか?`,"pws.unsavedLeaveTitle":`未保存の変更`,"pws.attentionRequired":`要対応`,"pws.attentionAria":`{name}: {reason}`,"pws.missingCredentials":`資格情報が不足しています`,"pws.editJsonDesc":`生のプロキシ設定を JSON として編集`,"pws.updatesUnavailable":`プロバイダーの更新は利用できません。`,"pws.dashboard.title":`プロバイダー概要`,"pws.dashboard.subtitle":`すべてのモデルプロバイダーを一か所で管理します。`,"pws.dashboard.rateLimits":`レート制限`,"pws.capacity.estimate":`設定済み重みによるプール推定`,"pws.capacity.currentAccount":`現在の有効アカウント`,"pws.capacity.nextRecovery":`次の容量回復`,"pws.capacity.recoveryShare":`+{percent}% のプール容量`,"pws.capacity.incomplete":`対象範囲が不完全です: {excluded} 件を除外(不明なプラン {unknown} 件)`,"pws.capacity.partial":`一部の期間の対象範囲が不完全です: {count} 件のアカウントでは表示中のすべての制限期間を取得できません`,"pws.capacity.windowPartial":`一部のみ`,"pws.capacity.windowPartialA11y":`{window}: アカウントの対象範囲が不完全です`,"pws.dashboard.recentlyUsed":`最近の使用`,"pws.dashboard.requests":`{count} リクエスト`,"pws.dashboard.checkedAgo":`{time} に確認`,"pws.dashboard.noQuota":`クォータデータなし`,"pws.dashboard.noUsage":`まだ使用量データはありません`,"pws.dashboard.noRateLimits":`まだレート制限データはありません`,"pws.allProviders":`プロバイダー概要`,"pws.enabledLabel":`有効`,"pws.testConnection":`接続テスト`,"pws.testing":`テスト中…`,"pws.connectionOk":`接続 OK`,"pws.connectionFailed":`接続失敗`,"pws.connectionNotApplicable":`対象外 — このプロバイダーは静的モデルカタログを使用します。`,"pws.editSettings":`設定を編集`,"pws.viewUsage":`詳細な使用量を表示`,"pws.allSystemsOk":`すべてのシステムが稼働中`,"pws.apiKeyConfigured":`API キー設定済み`,"pws.addApiKey":`API キーを追加`,"pws.loggedInAs":`{email} としてログイン中`,"pws.notLoggedIn":`未ログイン`,"pws.passthrough":`Codex パススルー`,"pws.notes":`メモ`,"pws.notePlaceholder":`このプロバイダーについてのメモを追加...`,"pws.noteSaved":`メモを保存しました`,"pws.authSummary":`認証`,"pws.aiStudio":`AI Studio`,"pws.aiStudio.connected":`接続済み`,"pws.aiStudio.checking":`セッションを確認中`,"pws.aiStudio.unsupported":`このプラットフォームではネイティブログインに対応していません`,"pws.aiStudio.needsReauth":`再認証が必要です`,"pws.aiStudio.reauthenticated":`再認証に成功しました`,"pws.aiStudio.loginFailed":`ネイティブログインに失敗しました`,"pws.aiStudio.connect":`接続`,"time.justNow":`たった今`,"time.notChecked":`未確認`,"time.minutesAgo":`{n}分前`,"time.hoursAgo":`{n}時間前`,"time.daysAgo":`{n}日前`,"modal.noMatch":`一致なし。`,"modal.oauthDefaultNote":`アカウントでログイン — API キー不要です。`,"modal.oauthComingSoon":`{label} の OAuth ログインは次回の更新で対応予定です。今は API キーをお使いください。`,"modal.oauthComingSoonShort":`このプロバイダーの OAuth ログインは次回の更新で対応予定です — 今は API キーをお使いください。`,"modal.useApiKeyInstead":`代わりに API キーを使用`,"modal.setupGuide":`セットアップガイド`,"modal.setupStep1Prefix":`にアクセスし`,"modal.setupDashboardLink":`{label} ダッシュボード`,"modal.setupStep1Suffix":`から API キーをコピー`,"modal.setupStep2":`下の API キー欄に貼り付け`,"modal.setupStep3":`プロバイダーを追加をクリック — モデルは自動検出されます`,"modal.namePlaceholder":`例: openrouter`,"modal.duplicateWarn":`プロバイダー "{name}" は既存で、上書きされます。`,"modal.forwardHintPrefix":`キー不要 — プロキシはあなたの`,"modal.forwardCredentials":`codex ログイン`,"modal.forwardHintSuffix":`資格情報をこのプロバイダーに転送します。`,"modal.localHint":`API キーは保存されません。Cursor の静的な公開モデルカタログを Codex に追加しますが、ライブの Cursor トランスポートとネイティブのファイル/シェル実行は監査されるまで無効のままです。`,"modal.getApiKey":`{label} の API キーを取得`,"modal.apiKey":`API キー`,"modal.apiKeyTransport":`API キーヘッダー`,"modal.apiKeyTransportNative":`x-api-key (Anthropic 標準)`,"modal.apiKeyTransportBearer":`Authorization: Bearer`,"modal.apiKeyPlaceholder":`sk-… (または $ENV_VAR)`,"modal.defaultModelPlaceholder":`例: gpt-5.5`,"modal.baseUrlPlaceholder":`https://...`,"modal.baseUrlPlaceholderError":`ベース URL に未解決の {placeholder} が含まれています。実際の値に置き換えてください。`,"modal.baseUrlPlaceholderHint":`プロバイダーを追加する前に、ベース URL の {placeholder} を実際の Account ID に置き換えてください。`,"modal.adding":`追加中…`,"modal.useOauthLogin":`← OAuth ログインを使用`,"nav.codexAuth":`Codex 認証`,"nav.codexSet":`Codex 設定`,"codexSet.tab.multiauth":`マルチ認証`,"codexSet.tab.prompt":`プロンプト`,"codexSet.prompt.title":`プロンプトレイヤー`,"codexSet.prompt.timing":`新しく開始したセッションから適用されます。実行中のセッションは現在の設定を保持します。`,"codexSet.prompt.staleRevision":`他の場所で設定が変更されたため、一覧を再読み込みしました。`,"codexSet.prompt.writeFailed":`変更を保存できませんでした。`,"codexSet.prompt.loadFailed":`プロンプトレイヤーを読み込めませんでした。`,"codexSet.prompt.repair":`修復`,"codexSet.prompt.repairFailed":`修復を完了できませんでした。`,"codexSet.drift.journalPresent":`前回の書き込みが完了していません。次の書き込み時に自動で復旧します。`,"codexSet.drift.projectionStale":`保存済みのレイヤーと config.toml の値が一致しません。修復するとレイヤーの内容で値を書き直します。`,"codexSet.drift.storeMissing":`レイヤーファイルがないのに config.toml に指示が残っています。修復するとバックアップを作成し、その内容を1つのレイヤーとして保持します。`,"codexSet.drift.ownedMalformed":`config.toml に生成された行が手動で変更されているため、安全に書き直せません。`,"codexSet.custom.adoptUnsupported":`{path} の {line} 行目の値が単一行の文字列ではないため、インポートできません。ここで管理するには手動で移動してください。`,"codexSet.prompt.unreadable":`Codex の設定ファイルは存在しますが読み取れないため、変更を拒否しました。`,"codexSet.layer.permissions":`権限`,"codexSet.layer.collaboration":`コラボレーションモード`,"codexSet.layer.environment":`環境コンテキスト`,"codexSet.layer.apps":`アプリ`,"codexSet.layer.skills":`スキル`,"codexSet.prompt.extensionsUnknown":`拡張機能は独自のレイヤーを追加できます。Codex が公開していないため、ここには表示できません。`,"codexSet.group.transition":`遷移通知`,"codexSet.group.transitionDesc":`状態を説明するのではなく変化を知らせる項目のため、セッションがリアルタイムに切り替わるかモデルが変わったときだけ現れます。`,"codexSet.custom.slotNote":`カスタムレイヤーはこの順序で連結され、1つのセクションになります。`,"codexSet.row.alwaysOn":`常に有効`,"codexSet.row.onChange":`変更時に送信`,"codexSet.row.featureGated":`[features] で設定`,"codexSet.row.openFeatures":`設定を開く`,"codexSet.dialog.setValue":`{value}(デフォルト {fallback})`,"codexSet.dialog.copyKey":`キーをコピー`,"codexSet.dialog.unknownLayer":`このビルドにはこのレイヤーの説明がありません。ダッシュボードより新しい Codex ランタイムのレイヤーです。`,"codexSet.custom.heading":`カスタムレイヤー`,"codexSet.custom.add":`+ レイヤーを追加`,"codexSet.custom.newTitle":`新しいレイヤー`,"codexSet.custom.editTitle":`レイヤーを編集`,"codexSet.custom.titleLabel":`タイトル`,"codexSet.custom.bodyLabel":`指示`,"codexSet.custom.bodySize":`{max} バイト中 {bytes} バイト`,"codexSet.custom.normalized":`タブを半角スペース4個に、改行コードを LF に変換しました。`,"codexSet.custom.titleRequired":`タイトルを入力してください。`,"codexSet.custom.titleTooLong":`タイトルは {count} 文字です。上限は {max} 文字です。`,"codexSet.custom.titleMultiline":`タイトルは1行で入力してください。`,"codexSet.custom.bodyTooLarge":`このレイヤーは {bytes} バイトです。上限は {max} バイトです。`,"codexSet.custom.composedTooLarge":`有効なレイヤーを合わせると {bytes} バイトとなり、上限を超えます。`,"codexSet.custom.invalidCharacter":`位置 {position} の制御文字は保存できません。`,"codexSet.custom.discardPrompt":`変更を破棄しますか?`,"codexSet.custom.keepEditing":`編集を続ける`,"codexSet.custom.delete":`{title} を削除`,"codexSet.custom.deleteConfirm":`このレイヤーを削除しますか?元に戻せません。`,"codexSet.custom.layerGone":`他の場所でそのレイヤーが削除されたため、エディターを閉じました。`,"codexSet.custom.deleteConfirmNamed":`“{title}” を削除しますか?元に戻せません。`,"codexSet.custom.moveUp":`{title} を上へ移動`,"codexSet.custom.prevLayer":`前のレイヤー`,"codexSet.custom.nextLayer":`次のレイヤー`,"codexSet.custom.navPosition":`{position} / {total}`,"codexSet.custom.moveDown":`{title} を下へ移動`,"codexSet.custom.limitReached":`カスタムレイヤーは最大 {max} 個まで保存できます。`,"codexSet.custom.notOwned":`developer_instructions は opencodex の外部で作成されたため、ここでは編集できません。レイヤーとして管理するにはインポートしてください。`,"codexSet.custom.adopt":`既存の指示をインポート`,"codexSet.custom.adoptConfirm":`レイヤーとしてインポート`,"codexSet.custom.adoptRefused":`既存の値をインポートできませんでした。`,"codexSet.custom.baseReplaced":`model_instructions_file が {path} に設定されているため、opencodex の外部で基本プロンプトが置き換えられています。`,"codexSet.lint.identity":`Codex が設定するものとは異なるアイデンティティを名乗っています。`,"codexSet.lint.foreignTool":`ツールはレジストリから提供されます。ここに名前を書いてもツールは作成されません。`,"codexSet.lint.placeholder":`指示にはテンプレートエンジンが適用されないため、このまま送信されます。`,"codexSet.lint.applyPatch":`apply_patch は指示ではなく、ツールレジストリで定義されます。`,"codexSet.lint.approvalVocab":`Codex は独自の承認用語を挿入するため、これと矛盾する可能性があります。`,"codexSet.lint.environment":`環境情報は後で生成されるため、これと矛盾する可能性があります。`,"codexSet.lint.size":`このレイヤーは 8 KB を超えています。保存はできますが、リクエストのたびにトークンを消費します。`,"codexSet.preset.blank":`空のレイヤー`,"codexSet.preset.concise.name":`簡潔な出力`,"codexSet.preset.concise.description":`短く答え、前置きと不要な書式を省きます。`,"codexSet.preset.concise.provenance":`Claude Code の簡潔さに関する指示をもとに翻案しました。独自の文言であり、複製ではありません。`,"codexSet.preset.planFirst.name":`編集前に計画`,"codexSet.preset.planFirst.description":`計画を示してから変更します。`,"codexSet.preset.planFirst.provenance":`Claude Code の計画重視の方針をもとに翻案しました。独自の文言であり、複製ではありません。`,"codexSet.preset.explainWhy.name":`理由を説明`,"codexSet.preset.explainWhy.description":`何をするかだけでなく、理由も説明します。`,"codexSet.preset.explainWhy.provenance":`Grok Build の確認スタイルをもとに翻案しました。独自の文言であり、複製ではありません。`,"codexSet.preset.testFirst.name":`テストを先に`,"codexSet.preset.testFirst.description":`修正前に、失敗するテストを作成します。`,"codexSet.preset.testFirst.provenance":`一般的なエージェントの実践をもとに翻案しました。独自の文言であり、複製ではありません。`,"codexSet.preset.korean.name":`韓国語で回答`,"codexSet.preset.korean.description":`リクエストの言語にかかわらず、韓国語で回答します。`,"codexSet.preset.korean.provenance":`よく要望される項目をもとに opencodex 向けに作成しました。独自の文言であり、複製ではありません。`,"codexSet.dialog.class":`種類`,"codexSet.dialog.key":`設定キー`,"codexSet.dialog.fileValue":`このファイルの値`,"codexSet.dialog.absentDefault":`未設定(デフォルト: {value})`,"codexSet.dialog.noRenderedText":`Codex は組み立て済みの組み込みレイヤー本文を公開していません。そのため、このダイアログには内容ではなくレイヤーの説明とキーを表示します。`,"codexSet.dialog.sourceText":`モデルに送られる原文`,"codexSet.dialog.sourceBytes":`{bytes} バイト`,"codexSet.dialog.notRendered":`確認したターンでは、このレイヤーは何も送信していません。各セクションは内容が変わったときだけ再送されるため、一度の確認では欠けて見えることがあります。`,"codexSet.dialog.emptySource":`{path} のファイルは存在しますが空のため、このレイヤーは何も送信しません。`,"codexSet.dialog.notExposed":`基本プロンプトは Codex が出力するメッセージ一覧の外を通るため、ここには表示できません。model_instructions_file で置き換えることは可能です。`,"codexSet.dialog.textUnavailable":`このマシンでは Codex のプロンプトを読み取れず、原文を表示できません。`,"codexSet.class.base":`基本指示`,"codexSet.class.config-toggle":`ここで切り替え可能`,"codexSet.class.feature-gated":`機能フラグ制御`,"codexSet.class.runtime-conditional":`ランタイム条件付き`,"codexSet.class.extension-unknown":`拡張レイヤー`,"codexSet.layer.base-instructions":`基本指示`,"codexSet.layer.model-switch":`モデル切り替え通知`,"codexSet.layer.personality":`パーソナリティ`,"codexSet.layer.context-window-guidance":`コンテキストウィンドウのガイダンス`,"codexSet.layer.realtime":`リアルタイム`,"codexSet.layer.agents-md":`AGENTS.md`,"codexSet.layer.environments-instructions":`実行環境`,"codexSet.layer.plugins":`プラグイン`,"codexSet.layer.tools":`ツール`,"codexSet.layer.multi-agent-mode":`マルチエージェントモード`,"codexSet.layer.git-attribution":`コミットの帰属表示`,"codexSet.about.base-instructions":`Codex 自体の指示です。リクエストに含まれ、無効にはできません。`,"codexSet.about.model-switch":`会話の途中でセッションのモデルが変わると追加されます。`,"codexSet.about.personality":`機能フラグで制御されるトーンと語調のガイダンスです。`,"codexSet.about.context-window-guidance":`機能フラグで制御される残りのコンテキスト予算のガイダンスです。`,"codexSet.about.realtime":`リアルタイムセッションに追加されます。`,"codexSet.about.agents-md":`プロジェクトの AGENTS.md ファイルです。このページはレイヤーを表示するだけで、プロジェクト文書は編集しません。`,"codexSet.about.permissions":`現在適用されているサンドボックスと承認設定を説明します。`,"codexSet.about.collaboration":`有効なコラボレーションモードを説明します。`,"codexSet.about.environment":`作業ディレクトリ、プラットフォーム、その他の環境情報です。`,"codexSet.about.environments-instructions":`機能フラグで制御される遅延実行環境向けのガイダンスです。`,"codexSet.about.apps":`接続済みアプリの使用方法です。`,"codexSet.about.plugins":`プラグインが選択されているか、プラグインが機能を提供すると追加されます。`,"codexSet.about.tools":`機能フラグで制御される遅延読み込みツールの説明です。`,"codexSet.about.skills":`利用可能なスキルの一覧です。`,"codexSet.about.multi-agent-mode":`機能フラグで制御されるサブエージェント向けの指示です。`,"codexSet.about.git-attribution":`モデルが書いたコミットに Co-authored-by: Codex トレーラーを、開いたプルリクエストに Generated with Codex. の行を追加させます。Codex がアカウントから取得するため、ここでも [features] でも変更できません。アカウント側で無効にすると、何も送らないのではなく逆の指示を送ります。`,"codexSet.condition.model-switch":`セッション中にモデルが変わった後のみ含まれます。`,"codexSet.condition.realtime":`リアルタイムセッションのみ含まれます。`,"codexSet.condition.agents-md":`作業ディレクトリ用のプロジェクト文書が見つかると含まれます。`,"codexSet.condition.plugins":`プラグインが選択されているか、プラグインが機能を提供すると含まれます。`,"codexSet.condition.git-attribution":`アカウントの帰属表示ポリシーで決まります。`,"codexSet.base.title":`ベースプロンプト`,"codexSet.base.prev":`前のオプション`,"codexSet.base.next":`次のオプション`,"codexSet.base.position":`{position} / {total}`,"codexSet.base.swipeHint":`左右にスワイプするか、矢印キーか矢印ボタンでオプションを切り替えます。新しく開始したセッションに適用されます。`,"codexSet.base.defaultTitle":`Codex 自身のベースプロンプト`,"codexSet.base.defaultBody":`デフォルトはここに保存されないため、編集も削除もできません。選ぶと設定から model_instructions_file が削除され、Codex は同梱のプロンプトを使います。`,"codexSet.base.variantTitle":`名前`,"codexSet.base.variantBody":`プロンプト`,"codexSet.base.replacesWarning":`Codex 自身のベースプロンプトに追記するのではなく、丸ごと置き換えます。ここに短く書けば、モデルへの指示もその分だけになります。`,"codexSet.base.use":`これを使う`,"codexSet.base.inUse":`使用中`,"codexSet.base.externalBlocked":`model_instructions_file はすでに {path} を指しており、opencodex が書いた値ではありません。自分で消してから選んでください。`,"nav.api":`API`,"nav.integrations":`連携`,"nav.openMenu":`メニューを開く`,"nav.closeMenu":`メニューを閉じる`,"integrations.subtitle":`クライアントを opencodex に接続し、認証情報の管理とクライアント設定の復元を行います。`,"integrations.tabsLabel":`連携画面`,"integrations.tab.overview":`概要`,"integrations.tab.keys":`API キー`,"integrations.tab.codex":`Codex CLI`,"integrations.tab.claude":`Claude`,"integrations.tab.grok":`Grok Build`,"integrations.tab.opencode":`OpenCode`,"integrations.tab.pi":`Pi`,"integrations.tab.omp":`OMP`,"integrations.tab.hermes":`Hermes`,"integrations.tab.openclaw":`OpenClaw`,"integrations.tab.kimi":`Kimi Code`,"integrations.tab.gajae":`Gajae Code`,"integrations.tab.dsh":`DeepSeek Harness (DSH)`,"integrations.tab.mcode":`MiniMax Code`,"integrations.tab.zcode":`ZCode`,"integrations.tab.prime":`Prime Agent`,"integrations.codex.title":`Codex CLI`,"integrations.codex.body":`Codex の接続はプロキシサービスが管理します。opencodex を起動すると適用され、サービスを停止するとネイティブのルーティングに戻ります。`,"integrations.codex.openService":`サービス制御を開く`,"integrations.state.notInstalled":`未インストール`,"integrations.state.unknown":`確認中`,"integrations.detail.codexRouted":`Codex のリクエストはこのプロキシを経由します`,"integrations.detail.codexAbsent":`Codex はまだこのプロキシを経由していません`,"integrations.detail.keyCount":`キー {count} 個を発行済み`,"integrations.detail.keyNone":`発行済みのキーはありません`,"integrations.detail.keyChecking":`確認中…`,"integrations.detail.keyUnavailable":`キーの状態を取得できません`,"integrations.detail.claudeOff":`接続がオフです`,"integrations.detail.desktopCurrent":`Desktop はこのプロファイルで動作しています`,"integrations.detail.desktopStale":`適用後にプロファイルが変更されました`,"integrations.detail.desktopNotServed":`プロファイルはありますが Desktop は別のものを使用中です`,"integrations.detail.desktopAbsent":`適用されたプロファイルはありません`,"integrations.detail.desktopDesiredOff":`Claude Desktop 連携はオフです`,"integrations.detail.desktopDesiredOffCleanupPending":`Claude Desktop はまだゲートウェイを使用しています。クリーンアップ待ちです`,"integrations.detail.desktopDesiredOnNotApplied":`連携はオンですが、Desktop はゲートウェイプロファイルを使用していません`,"integrations.detail.desktopSelectedElsewhere":`Desktop は別のプロファイルを使用しています`,"integrations.detail.desktopProfileDrift":`選択された Desktop プロファイルが変更されました`,"integrations.detail.desktopObservedUnsafe":`選択された Desktop プロファイルは安全に変更できません`,"integrations.detail.desktopNotInstalled":`Claude Desktop の設定ライブラリがインストールされていません`,"integrations.dialog.desktop.title":`Claude Desktop 連携を無効にしますか?`,"integrations.dialog.desktop.changes":`{path} に opencodex 管理のゲートウェイプロファイルがある場合、Desktop は先に認証情報のない標準プロファイルを選択し、その後で古いプロファイルとバックアップを削除します。`,"integrations.dialog.desktop.breakage":`Claude Desktop は opencodex 経由のモデルではなく、標準の Claude に戻ります。`,"integrations.dialog.desktop.undo":`再度有効にすると、保存済みのモデル割り当てから opencodex プロファイルを再生成します。`,"integrations.dialog.desktop.restart":`Claude Desktop は起動時にのみこの設定を読み取ります。変更を反映するには完全に終了して再起動してください。`,"integrations.dialog.desktop.confirm":`無効にする`,"integrations.native.error.desktopUnsafeMetadata":`{path} の Claude Desktop メタデータを安全に読み取れなかったため、ライブラリは変更されませんでした。`,"integrations.native.error.desktopCleanupIncomplete":`Claude Desktop は標準モードを指していますが、古い opencodex 認証情報ファイルが残っています: {paths}。`,"integrations.native.msg.desktopDisabled":`Claude Desktop 連携を無効にしました。`,"integrations.native.msg.desktopEnabled":`Claude Desktop 連携を有効にしました。`,"integrations.detail.grokModels":`モデル {count} 個を接続済み`,"integrations.detail.grokAbsent":`設定に opencodex ブロックがありません`,"integrations.dialog.grok.title":`Grok Build 連携を解除しますか?`,"integrations.dialog.grok.changes":`{path} から、opencodex が印を付けたブロックだけを削除します。ブロック外に直接書いた内容はそのまま残します。`,"integrations.dialog.grok.breakage":`解除すると、Grok Build から opencodex のモデルエイリアスが消えます。xAI アカウントで使用していたモデルはそのままです。`,"integrations.dialog.grok.undo":`opencodex が loopback アドレスで実行中なら、再び有効にしたとき、現在利用できるモデル一覧からブロックを新しく書き込みます。`,"integrations.dialog.grok.confirm":`解除`,"integrations.native.msg.nonLoopbackRemoved":`Grok Build を自動登録できるのは、opencodex が loopback アドレスで実行中の場合だけです。loopback アドレスを指していた以前のブロックを削除しました。`,"integrations.native.msg.nonLoopbackRemovedNoop":`Grok Build を自動登録できるのは、opencodex が loopback アドレスで実行中の場合だけです。削除する以前のブロックはありませんでした。`,"integrations.native.msg.nonLoopbackSuperseded":`Grok Build を自動登録できるのは、opencodex が loopback アドレスで実行中の場合だけです。その間に別の場所から設定へ新しいブロックが書かれたため、現在ファイルにあるブロックはこのリクエストが作成したものではありません。`,"integrations.native.error.orphanedMarker":`{path} に opencodex の開始マーカーはありますが、終了マーカーがありません。ブロックの終端を特定できないため、ファイルは変更していません。`,"integrations.native.error.homeMismatch":`インストール済みサービスのホームと現在のホームが一致しないため、ファイルは変更していません。`,"integrations.native.error.notInstalled":`Grok Build がインストールされていないため、変更できません。`,"integrations.native.error.configBusy":`別の場所で設定を保存中のため、変更できませんでした。しばらくしてから再試行してください。`,"integrations.state.absent":`未適用`,"integrations.state.current":`適用済み`,"integrations.state.stale":`更新が必要`,"integrations.state.conflict":`競合`,"integrations.state.unsafe":`確認不可`,"integrations.summary.detected":`検出されたクライアント`,"integrations.summary.applied":`設定済みクライアント`,"integrations.summary.stale":`更新が必要`,"integrations.summary.lastChange":`最終変更`,"integrations.summary.disableAll":`すべて無効にする…`,"integrations.onboarding":`適用時は、先にバックアップを保存してから opencodex プロバイダーブロックを 1 つだけ書き込みます。無効化時はそのブロックだけを削除し、保存されたスナップショットから復元できます。`,"integrations.empty.title":`インストール済みのクライアントが検出されませんでした`,"integrations.empty.body":`対応クライアントをインストールしてから、ここに戻って opencodex を適用してください。`,"integrations.action.apply":`適用`,"integrations.action.disable":`無効にする`,"integrations.action.refresh":`更新`,"integrations.action.settings":`設定`,"integrations.action.manageKeys":`キーを管理`,"integrations.action.restore":`復元…`,"integrations.action.undo":`元に戻す`,"integrations.action.restorePoint":`この時点に復元…`,"integrations.action.snapshotExpired":`バックアップ期限切れ`,"integrations.rollback.title":`復元センター`,"integrations.rollback.empty":`適用履歴はまだありません`,"integrations.rollback.emptyBody":`書き込みが成功するたびに、変更前のスナップショットが先に保存されます。`,"integrations.restore.title":`このスナップショットを復元しますか?`,"integrations.restore.body":`現在のファイルを先にバックアップしてから、選択したスナップショットで置き換えます。`,"integrations.restore.driftTitle":`新しい編集が検出されました`,"integrations.restore.driftBody":`このスナップショット以降の変更をバックアップしてから、ファイルを置き換えます。`,"integrations.restore.confirm":`復元`,"integrations.restore.confirmDrift":`新しい編集をバックアップして復元`,"integrations.restore.pending":`復元中…`,"integrations.restore.manual":`自動復元に失敗しました: {reason}。{path} から手動で復元してください。`,"integrations.error.load":`連携状態を読み込めませんでした。`,"integrations.error.stale":`最新の更新に失敗しました。以下の値は古い可能性があります。`,"integrations.error.busy":`このクライアントに対する別の変更が実行中です。しばらくしてから再試行してください。`,"integrations.error.conflict":`opencodex の書き込み後に設定が変更されました。何も削除していません。`,"integrations.error.unsafe":`設定を安全に変更できません。`,"integrations.error.generic":`連携の変更に失敗しました。以前の状態は保持されています。`,"integrations.error.nonLoopback":`{client} は localhost のプロキシにしか接続できません。リモートバインドに必要な認証ヘッダーを置く場所が設定ファイルになく、手動で書いても同じです。トンネルやローカルフォワーダーで loopback 経路を用意してください。`,"integrations.status.installed":`インストール済み`,"integrations.status.notInstalled":`未インストール`,"integrations.status.appliedAt":`適用`,"integrations.status.backup":`バックアップ`,"integrations.status.lastRestore":`最終復元`,"integrations.status.unknown":`不明`,"integrations.bulk.title":`適用済みのクライアント連携を無効にしますか?`,"integrations.bulk.body":`opencodex が所有するブロックだけを削除します。各クライアントについて、変更前のスナップショットを保存します。`,"integrations.bulk.partial":`一部のクライアントを無効にできませんでした: {clients}`,"integrations.bulk.success":`適用済みのクライアント連携を無効にしました。`,"integrations.retention.degraded":`バックアップの整理が遅れています。古いバックアップがディスクに残っている可能性があります。`,"integrations.error.residual":`ファイルが中間状態のままの可能性があります: {message} {path} から復元してください。`,"integrations.error.recover":`{message} バックアップは {path} にあります。`,"integrations.kind.apply":`適用`,"integrations.kind.disable":`解除`,"integrations.kind.refresh":`更新`,"integrations.kind.restore":`復元`,"integrations.semantics.opencode":`ディスクから直接起動した場合にのみ適用されます。ocx opencode の環境注入が優先されます。`,"integrations.semantics.pi":`新しいセッションから適用されます。`,"integrations.semantics.omp":`カタログを読み込むには OMP を再起動してください。`,"integrations.semantics.hermes":`新しいセッションから適用されます。`,"integrations.semantics.openclaw":`実行中のゲートウェイにすぐ適用されます。`,"integrations.semantics.kimi":`再起動するか /reload を実行すると適用されます(v2 はファイルを監視します)。`,"integrations.semantics.gajae":`新しいセッション、または /model を開いたときに適用されます。`,"integrations.semantics.dsh":`OpenCodex が管理するのは $DSH_HOME/settings.yaml 内の llm-pi-ai.providers.opencodex だけです。DSH はこのプロバイダーをホットリロードし、既定のモデルと deepseek-official は変更しません。現在はループバック専用で、実際の認証情報は書き込みません。`,"integrations.semantics.mcode":`custom_provider.opencodex のみを管理します。既定モデルと MiniMax ログインは変更しません。`,"integrations.semantics.zcode":`~/.zcode/v2/config.json の provider.opencodex のみを管理します。Z.ai ログインと他のプロバイダーは変更しません。変更後は ZCode を再起動してください。`,"integrations.semantics.prime":`Prime Agent の models.json 内の providers.opencodex のみを管理します。場所は ~/.prime/agent ですが、PRIME_AGENT_CODING_AGENT_DIR が設定されている場合はそちらが優先されます。他のプロバイダーとモデルオーバーライドは変更しません。新しいセッションから適用されます。`,"codexAuth.mainAccount":`メインアカウント`,"codexAuth.logLabel":`ログラベル`,"codexAuth.codexApp":`Codex App`,"codexAuth.appLogin":`アプリログイン`,"codexAuth.accountPool":`アカウントプール`,"codexAuth.accountModeTitle":`OpenAI アカウントモード`,"codexAuth.accountModePool":`プールモード`,"codexAuth.accountModePoolDesc":`メインログインと対象の追加アカウントがここでローテーションします。`,"codexAuth.accountModeDirect":`ダイレクトモード`,"codexAuth.accountModeDirectDesc":`リクエストはメインログインのみを使用します; 追加アカウントはプールモード用に保持されます。`,"codexAuth.openaiMissing":`組み込みの OpenAI プロバイダーが設定されていません。`,"codexAuth.openaiDisabled":`組み込みの OpenAI プロバイダーが無効です。`,"codexAuth.openaiUnavailableDesc":`OpenAI アカウントは引き続き利用できます。Codex リクエストをルーティングするにはプロバイダーを有効にしてください。`,"codexAuth.enableOpenai":`OpenAI を有効にする`,"codexAuth.enablingOpenai":`有効化中...`,"codexAuth.enableOpenaiFailed":`OpenAI プロバイダーを有効にできませんでした。`,"codexAuth.openaiPresetLoadFailed":`OpenAI プロバイダーのプリセットを読み込めませんでした。`,"codexAuth.openaiPresetUnavailable":`OpenAI プロバイダーのプリセットを利用できません。`,"codexAuth.openProviders":`プロバイダーを開く`,"codexAuth.add":`追加`,"codexAuth.sparkQuota":`Codex Spark 使用量`,"codexAuth.sparkQuotaHint":`アカウントカードに GPT-5.3-Codex-Spark の週次枠を表示します。対象が 1 モデルのみのため既定は非表示です。`,"codexAuth.sparkQuotaShown":`Codex Spark 使用量を表示しました`,"codexAuth.sparkQuotaHidden":`Codex Spark 使用量を非表示にしました`,"codexAuth.sparkQuotaFailed":`Codex Spark 使用量の設定を変更できませんでした`,"codexAuth.refreshQuota":`クォータを更新`,"codexAuth.refreshingQuota":`更新中...`,"codexAuth.quotaRefreshed":`クォータを更新しました`,"codexAuth.quotaRefreshFailed":`クォータの更新に失敗しました`,"codexAuth.pauseExhausted":`上限到達を一括停止`,"codexAuth.pausingExhausted":`クォータを確認中...`,"codexAuth.pauseExhaustedSucceeded":`上限に達したアカウントを停止しました: {count}`,"codexAuth.pauseExhaustedNone":`使用率 100% が確認されたアカウントはありません。`,"codexAuth.pauseExhaustedFailed":`上限到達アカウントの確認と停止に失敗しました。`,"codexAuth.noPool":`まだプールアカウントは追加されていません。`,"codexAuth.pause":`一時停止`,"codexAuth.resume":`再開`,"codexAuth.paused":`一時停止中`,"codexAuth.pauseSucceeded":`{email} を一時停止しました`,"codexAuth.resumeSucceeded":`{email} をアカウントプールに戻しました`,"codexAuth.pauseFailed":`{email} を一時停止できませんでした。変更はありません。`,"codexAuth.resumeFailed":`{email} を再開できませんでした。変更はありません。`,"codexAuth.pausedHint":`再開するまで、自動切り替え、再試行、クールダウン復旧、手動選択の対象外です。`,"codexAuth.pinned":`固定中`,"codexAuth.pinnedHint":`手動で選択したアカウントなので、これより高い選択順序が先に使われることはありません。固定はこのアカウントを使い切るか、別のアカウントを選ぶか、いずれかの選択順序を変更するまで続きます。`,"codexAuth.fiveHour":`5時間`,"codexAuth.weekly":`週`,"codexAuth.monthly":`30日`,"codexAuth.resets":`リセット`,"codexAuth.today":`今日`,"codexAuth.current":`現在`,"codexAuth.nextSession":`選択済み`,"codexAuth.poolPrepared":`プール準備済み`,"codexAuth.preparePoolTitle":`このアカウントをプールモード用に準備しますか?`,"codexAuth.preparePoolDesc":`ダイレクトリクエストはメインログインを使い続けます。このアカウントはプールモードが有効化された際の準備済みプール選択になります。`,"codexAuth.prepareForPool":`プール用に準備`,"codexAuth.poolPreparedToast":`{email} はプールモード用に準備されました`,"codexAuth.switchTitle":`アクティブアカウントを切り替えますか?`,"codexAuth.switchDesc":`すぐに反映されます。アカウントに紐付いた既存スレッドと処理中のリクエストは現在のアカウントを維持し、新規または未紐付けのリクエストは選択したアカウントの順序ティアを使います。同じ選択順序のアカウントは引き続き交代で使われます。`,"codexAuth.cacheWarning":`アカウント切り替えでプロンプトキャッシュはリセットされます。新規セッションは空のキャッシュで開始します。`,"codexAuth.setAsNext":`このアカウントを次に使う`,"codexAuth.cancel":`キャンセル`,"codexAuth.switchBack":`メインに戻しますか?`,"codexAuth.switchBackDesc":`すぐに反映されます。アカウントに紐付いた既存スレッドと処理中のリクエストは現在のアカウントを維持し、新規または未紐付けのリクエストはアプリログインアカウントの順序ティアを使います。同じ選択順序のアカウントは引き続き交代で使われます。`,"codexAuth.autoSwitch":`使用量ベースのプロアクティブ切り替え`,"codexAuth.autoSwitchQuotaDesc":`クォータ: 使用率が {threshold}% 以上になると、既に紐付いたタスクを含む次のリクエストが、使用率の低い適格アカウントへ移る場合があります。Go/Free は 30 日枠のみを使用します。`,"codexAuth.autoSwitchQuotaOffDesc":`使用量ベースのプロアクティブ切り替えはオフです。新規/未紐付けタスクの割り当てと障害回復は引き続き適用されます。`,"codexAuth.autoSwitchRoundRobinDesc":`ラウンドロビン割り当てはこのしきい値を使用せず、新規/未紐付けタスクを引き続きローテーションします。`,"codexAuth.autoSwitchFillFirstDesc":`フィルファースト: {threshold}% は新規/未紐付けタスクの使い切り基準です。正常な紐付け済みタスクはアカウントを維持します。`,"codexAuth.autoSwitchFillFirstOffDesc":`フィルファーストには新規/未紐付けタスクの使用量基準がありません。クールダウン、再認証、障害回復では引き続きルーティングが変わる場合があります。`,"codexAuth.failureRecoveryNote":`障害回復は別です。出力前の 429/402 拒否、クールダウン、再認証、除外、または設定済みの一時障害フェイルオーバーにより、別の適格アカウントが選ばれる場合があります。`,"codexAuth.autoSwitchThreshold":`使用量しきい値`,"codexAuth.autoSwitchThresholdAria":`使用量しきい値(パーセント)`,"codexAuth.autoSwitchThresholdInc":`使用量しきい値を上げる`,"codexAuth.autoSwitchThresholdDec":`使用量しきい値を下げる`,"codexAuth.autoSwitchLoadFailed":`使用量ベースの切り替え設定を読み込めませんでした。`,"codexAuth.autoSwitchThresholdInvalid":`1 から 100 までの整数を入力してください`,"codexAuth.autoSwitchUpdated":`使用量ベースのプロアクティブ切り替え設定を更新しました`,"codexAuth.autoSwitchUpdateFailed":`使用量ベースの切り替え更新を確認できませんでした。最後に確認された値を表示しています。`,"codexAuth.requestUserInput":`Default モードで入力を求める`,"codexAuth.requestUserInputDesc":`Default モードのセッションで Codex が一時停止し、request_user_input ツールで質問できるようにします。`,"codexAuth.requestUserInputUpdated":`機能フラグを更新しました - 新しいセッションから適用されます。`,"codexAuth.requestUserInputUpdatedRestart":`機能フラグを更新しました - 新しいセッションから適用されます。Codex アプリを再起動してください。`,"codexAuth.requestUserInputUpdateFailed":`機能フラグを更新できませんでした。変更はありません。`,"codexAuth.requestUserInputLoadFailed":`config.toml から機能フラグを読み込めませんでした。`,"codexAuth.accountPickerTitle":`モデルピッカーで使用する Codex アカウントを指定`,"codexAuth.accountPickerOffDesc":`有効にすると、通常の GPT ピッカー項目がアカウントセレクターごとの項目に置き換わり、ログアウトせずに会話で使うアカウントを明示的に選べます。無効にしてもアカウントは削除されません。`,"codexAuth.accountPickerOnDesc":`各セレクターは保存済みアカウント 1 つに対応する公開ラベルです。選択した会話はそのアカウントに固定され、Pool のローテーションやフォールバックは行われず、現在の Pool アカウントも変更されません。`,"codexAuth.accountPickerCompatibility":`組み込みの Codex App ログインには専用セレクターがあります。生成されたマップでは通常 main と呼ばれ、必要に応じて main-2 のような衝突を避けるサフィックスが使われます。追加アカウントには安定したプライバシー保護ラベルが割り当てられ、カスタムセレクター名は保持されます。既存の会話と保存済みのモデル選択は引き続きルーティングされます。無効にすると生成された項目だけが非表示になり、セレクターと完全一致ルートは保持されます。通常の GPT モデル ID は従来どおり Pool または Direct で動作します。`,"codexAuth.accountPickerUpdated":`アカウント指定を更新しました。`,"codexAuth.accountPickerUpdateFailed":`アカウント指定を更新できませんでした。最後に確認された設定を表示しています。`,"codexAuth.accountPickerLoadFailed":`アカウント指定の設定を読み込めませんでした。`,"codexAuth.accountPickerRefreshFailed":`この設定を更新できませんでした。最後に確認された値を引き続き表示しています。`,"codexAuth.advancedSettings":`詳細設定`,"codexAuth.advancedSettingsAria":`高度な Codex 認証設定を表示または非表示`,"codexAuth.catalogRefreshPending":`変更は保存されましたが、Codex モデルカタログの更新が保留中です。ocx sync を実行して再試行してください。`,"anthropicPool.title":`Claude アカウントプール(実験的)`,"anthropicPool.enabledDesc":`429 時にアカウントをクールダウンしてフェイルオーバーします。新規セッションは 5 時間使用率が {threshold}% 未満のアカウントを優先します。`,"anthropicPool.disabledDesc":`アクティブな Claude アカウントのみを使用します。実験的ルーティングを受け入れる場合のみ有効にしてください。`,"anthropicPool.experimentalWarning":`実験的で十分に検証されていません。自動的な複数アカウント回転に見える行為は Anthropic により制限される可能性があります。同一組織はクォータを共有することがあり、その場合プールしても効果がありません。リスクを理解していない場合はオフのままにしてください。`,"anthropicPool.needTwoAccounts":`プールを有効にする前に、Claude OAuth アカウントを 2 つ以上追加してください。`,"anthropicPool.threshold":`新規セッションの使用率しきい値`,"anthropicPool.thresholdAria":`新規セッションの使用率しきい値(パーセント)`,"anthropicPool.thresholdHelp":`0 はクォータに基づく選択を無効にします(アフィニティ + アクティブアカウントのみ)。デフォルト 80。`,"anthropicPool.thresholdInvalid":`0 から 100 までの整数を入力してください`,"anthropicPool.loadFailed":`Claude プール設定を読み込めませんでした。`,"anthropicPool.saveFailed":`Claude プール設定を保存できませんでした。`,"anthropicPool.on":`オン`,"anthropicPool.off":`オフ`,"cursorPool.title":`Cursor アカウントプール(実験的)`,"cursorPool.enabledDesc":`429 または認証失敗時にアカウントをクールダウンし、この会話でフェイルオーバーします。レート制限または認証失敗が発生するまで、各会話は 1 つのアカウントに留まります。`,"cursorPool.disabledDesc":`アクティブな Cursor アカウントのみを使用します。実験的ルーティングを受け入れる場合のみ有効にしてください。`,"cursorPool.experimentalWarning":`実験的で十分に検証されていません。Cursor の利用規約はレート制限の回避と使用量計測の操作を禁止しています。Teams の含まれる使用量はシート単位で、転送されない場合があります。リスクを理解していない場合はオフのままにしてください。`,"cursorPool.needTwoAccounts":`プールを有効にする前に、Cursor OAuth アカウントを 2 つ以上追加してください。`,"cursorPool.loadFailed":`Cursor プール設定を読み込めませんでした。`,"cursorPool.saveFailed":`Cursor プール設定を保存できませんでした。`,"cursorPool.on":`オン`,"cursorPool.off":`オフ`,"antigravityRouting.failoverOnlyTitle":`マルチアカウントルーティング(フェイルオーバーのみ)`,"antigravityRouting.failoverOnlyDesc":`各会話は 1 つの Antigravity アカウントに留まります。レート制限 429 または認証失敗時に、opencodex はその会話の別の適格アカウントへフェイルオーバーできます — 新規セッションをアカウント間で分散したり、他の進行中会話のグローバルなアクティブアカウントを変更したりしません。`,"accountPool.strategy":`ローテーション戦略`,"accountPool.strategyDesc":`OpenCodex が新規/未紐付けタスクへアカウントを割り当てる方法です。`,"accountPool.strategyQuota":`クォータ`,"accountPool.strategyRoundRobin":`ラウンドロビン`,"accountPool.strategyFillFirst":`フィルファースト`,"accountPool.strategyHintQuota":`クォータ戦略は使用量しきい値を超えると、既存タスクの次のリクエストも別アカウントへ再紐付けできます。`,"accountPool.strategyHintRoundRobin":`ラウンドロビンは有効な紐付けがないタスクだけをローテーションし、使用量しきい値は通常のローテーションを変えません。`,"accountPool.strategyHintFillFirst":`フィルファーストはしきい値を未紐付けタスクの使い切り基準として使用し、正常な紐付け済みタスクは親和性を維持します。`,"accountPool.unboundDefinition":`新規/未紐付けタスクとは、現在のアカウント紐付けがないリクエストです。既存の表示中タスクも、プロキシまたは親和性のリセット後は未紐付けになる場合があります。`,"accountPool.stickyLimit":`ローテーション前の新規/未紐付け割り当て数`,"accountPool.stickyLimitAria":`ローテーション前の新規/未紐付け割り当て数`,"accountPool.stickyLimitInc":`スティッキー上限を上げる`,"accountPool.stickyLimitDec":`スティッキー上限を下げる`,"accountPool.stickyLimitHelp":`次へ進む前に、この回数の新規/未紐付けタスクを選択アカウントへ割り当てます。カウンターは上流の成功後ではなく、タスクを紐付けた時点で増えます。`,"accountPool.stickyLimitInvalid":`1 から 100 までの整数を入力してください`,"accountPool.strategyLoadFailed":`ローテーション戦略を読み込めませんでした。`,"accountPool.strategyUpdateFailed":`ローテーション戦略を保存できませんでした。`,"accountPool.priority":`選択順序`,"accountPool.priorityAria":`このアカウントの選択順序`,"accountPool.priorityHint":`数値が大きいほど先に使われます。上位のアカウントがすべて使い切られるか利用できなくなったときにのみ、より小さい数値へ移ります。`,"accountPool.priorityFirst":`最初`,"accountPool.priorityEarlier":`早め`,"accountPool.priorityNormal":`標準`,"accountPool.priorityLater":`遅め`,"accountPool.priorityLast":`最後`,"accountPool.priorityOption":`{name}({value})`,"accountPool.priorityCustom":`カスタム`,"accountPool.priorityUpdated":`{email} の選択順序を更新しました`,"accountPool.priorityUpdateFailed":`{email} の選択順序を保存できませんでした。最後に確認された値を表示しています。`,"codexAuth.switched":`次のリクエストでは {email} を使用します`,"codexAuth.loadFailed":`Codex アカウント設定を読み込めませんでした。`,"codexAuth.switchFailed":`アカウントを切り替えられませんでした。以前の選択はそのままです。`,"codexAuth.removeConfirm":`{id} を削除しますか?`,"codexAuth.removeFailed":`アカウントを削除できませんでした。何も変更されていません。`,"codexAuth.addTitle":`Codex アカウントを追加`,"codexAuth.addIdLabel":`アカウント ID (スラッグ)`,"codexAuth.addIdPlaceholder":`codex-work、codex-alt、team...`,"codexAuth.resetCreditsAria":`{count} 個のリセットクレジット`,"codexAuth.addJsonLabel":`auth.json の内容`,"codexAuth.addHelp":`別のマシンの ~/.codex/auth.json からコピー、または codex-auth export を使用。`,"codexAuth.importBtn":`インポート`,"codexAuth.importInvalidJson":`無効な JSON です`,"codexAuth.importMissingTokens":`JSON に access_token または refresh_token がありません`,"codexAuth.importMissingId":`アカウント ID は必須です`,"codexAuth.accountAdded":`アカウントをプールに追加しました`,"codexAuth.addPickDesc":`別の ChatGPT アカウントでログインしてプールに追加します。`,"codexAuth.oauthLogin":`OAuth ログイン`,"codexAuth.oauthDesc":`ブラウザで ChatGPT ログインを開きます`,"codexAuth.importAuthJson":`auth.json をインポート`,"codexAuth.importAuthJsonDesc":`別の Codex インストールまたは codex-auth export から`,"codexAuth.back":`戻る`,"codexAuth.oauthAlreadyInProgress":`ログインは既に進行中です。ブラウザで完了してください。`,"codexAuth.oauthWaiting":`ブラウザで ChatGPT ログインが完了するのを待機中...`,"codexAuth.oauthSubmittingCode":`コードを送信中…`,"codexAuth.oauthCodeSubmitted":`コードを送信しました — ログイン完了を待っています…`,"codexAuth.oauthStatusRetrying":`ログイン状態の確認中にネットワークまたはプロキシ エラーが発生しました — 再試行中…`,"codexAuth.oauthCancelled":`ログインはキャンセルされました。`,"codexAuth.loginFailed":`ログインに失敗しました`,"codexAuth.needsReauth":`再ログイン`,"codexAuth.reauthenticate":`再認証`,"codexAuth.tokenExpired":`トークンが期限切れ — このアカウントを再認証してください`,"codexAuth.mainTokenExpired":`トークンが期限切れ — Codex アプリログインから再度サインインしてください`,"codexAuth.emailCollision":`このアカウントはメインの Codex ログインと一致します。別のアカウントを使用してください。`,"codexAuth.resetCreditsTitle":`リセットクレジット`,"codexAuth.resetCreditsAvailable":`{count} 個のリセットクレジットが利用可能です。`,"codexAuth.resetCreditsDesc":`各クレジットは現在の時間別・週間使用量上限を即座にリセットします。`,"codexAuth.noResetCredits":`リセットクレジットはありません。`,"codexAuth.earnCreditsHint":`クレジットは毎月および紹介プログラム経由で獲得できます。`,"codexAuth.creditsExpireNote":`クレジットは獲得から 30 日で失効します。`,"codexAuth.useOneCredit":`1 クレジットを使用`,"codexAuth.confirmResetTitle":`リセットクレジットを使用しますか?`,"codexAuth.confirmResetDesc":`現在のレート制限を即座にリセットします。残り {count} クレジットです。`,"codexAuth.irreversible":`この操作は元に戻せません。`,"codexAuth.useCredit":`クレジットを使用`,"codexAuth.redeeming":`リセット中...`,"codexAuth.resetSuccess":`レート制限をリセットしました! 残り {remaining} クレジット。`,"codexAuth.resetSuccessGeneric":`レート制限をリセットしました!`,"codexAuth.resetAlreadyRedeemed":`このクレジットは既に引き換え済みです。クレジットは変わりません。`,"codexAuth.resetNothingToReset":`今リセットが必要なレート制限枠はありません。`,"codexAuth.resetNoCredit":`利用可能なリセットクレジットはありません。`,"codexAuth.resetError":`リセットクレジットの引き換えに失敗しました。もう一度お試しください。`,"codexAuth.fifoNote":`最も古いクレジットが先に使用されます。`,"codexAuth.confirmWhichCredit":`{date} のクレジットが使用されます。`,"codexAuth.creditNext":`次に使用`,"codexAuth.creditLabel":`クレジット #{n}`,"codexAuth.creditNextBadge":`次`,"codexAuth.creditGranted":`付与 {date}`,"codexAuth.creditExpires":`失効 {date} (残り {days}日)`,"api.title":`API アクセス`,"api.subtitle":`生成した API キーで外部アプリから opencodex プロキシに接続します。認証は {authHeader} ヘッダーで行い、エンドポイントごとに受け付けるヘッダーは下の表のとおりです。`,"api.endpointNote":`ベース URL を OpenAI 互換クライアントで使ってください。Responses と Chat Completions は /v1 配下で公開されます。`,"api.endpointsTitle":`エンドポイント`,"api.baseUrl":`ベース URL`,"api.responsesEndpoint":`Responses API`,"api.chatCompletionsEndpoint":`Chat Completions API`,"api.messagesEndpoint":`Messages API`,"api.modelsEndpoint":`Models API`,"api.authTitle":`認証`,"api.authBaseUrlNote":`クライアントにはベース URL を設定し、下のプロトコル別エンドポイントを選んでください。`,"api.authLoopback":`ループバック (127.0.0.1 または ::1) は認証を省略します。リモートでは生成した ocx_ キーまたは OPENCODEX_API_AUTH_TOKEN が必要です。`,"api.modelsTitle":`外部モデルカタログ`,"api.modelsCount":`{count} 件が利用可能`,"api.modelsSearch":`モデルを検索`,"api.modelsSubtitle":`これらの ID を /v1/models と選択したプロトコルで使用してください。`,"api.modelsLoading":`モデルを読み込み中…`,"api.modelsLoadFailed":`外部モデルカタログを読み込めませんでした。`,"api.modelsEmpty":`外部から呼び出せるモデルはまだありません。`,"api.modelsNoMatch":`「{query}」に一致するモデルはありません。`,"api.colModel":`モデル`,"api.colSource":`ソース`,"api.colProtocols":`プロトコル`,"api.copyModelId":`ID をコピー`,"api.modelCopied":`コピーしました`,"api.testModel":`テスト`,"api.testingModel":`テスト中…`,"api.testSucceeded":`OK`,"api.testFailed":`失敗`,"api.protocolResponses":`Responses`,"api.protocolChatCompletions":`Chat Completions`,"api.protocolMessages":`Messages`,"api.sourceNative":`ChatGPT プール`,"api.sourceCombo":`コンボ`,"api.sourceCustom":`カスタム`,"api.usageResponsesTitle":`Responses の例`,"api.usageChatTitle":`Chat Completions の例`,"api.usageMessagesTitle":`Messages の例`,"api.newKeyTitle":`新しいキーを作成しました`,"api.newKeyNote":`今すぐこのキーをコピーしてください — 再表示されません。`,"api.copy":`コピー`,"api.copied":`コピーしました`,"api.dismiss":`閉じる`,"api.generateTitle":`キーを生成`,"api.keyNamePlaceholder":`キー名(任意)`,"api.generate":`生成`,"api.generating":`作成中…`,"api.activeKeys":`アクティブなキー ({count})`,"api.activeKeysLoading":`有効なキー`,"api.noKeys":`まだ API キーがありません。上で生成してください。`,"api.workspace.sections":`API セクション`,"api.section.keys":`キー`,"api.section.connect":`接続`,"api.section.endpoints":`エンドポイント`,"api.section.models":`モデル`,"api.section.examples":`例`,"api.workspace.details":`APIキーの詳細`,"api.workspace.keyDetails":`キーの詳細`,"api.workspace.keyPrefix":`キーのプレフィックス`,"api.workspace.deleteKey":`キーを削除`,"api.workspace.deleteConfirm":`このキーを削除しますか?この操作は元に戻せません。`,"api.workspace.usageExamples":`使用例`,"api.copyUrlHint":`クリックして URL をコピー`,"api.urlCopied":`URL をコピーしました`,"api.copyExampleHint":`クリックして例をコピー`,"api.exampleCopied":`例をコピーしました`,"api.colName":`名前`,"api.colKey":`キー`,"api.colCreated":`作成日`,"api.confirm":`確認`,"api.deleteAria":`API キーを削除`,"api.usageSampleInput":`こんにちは、世界!`,"api.clientConfig.title":`クライアント設定`,"api.clientConfig.rowsLabel":`クライアントを接続`,"api.clientConfig.details":`詳細`,"api.clientConfig.detailsAria":`{client} 設定の詳細`,"api.clientConfig.copyAria":`{client} 設定をコピー`,"api.clientConfig.downloadAria":`{client} 設定をダウンロード`,"api.clientConfig.rowMeta":`{destination} · モデル {count} 件`,"api.clientConfig.rowError":`{client} の設定を生成できませんでした。`,"api.clientConfig.copiedAnnounceClient":`{client} の設定をクリップボードにコピーしました。`,"api.clientConfig.clientOpencode":`OpenCode`,"api.clientConfig.clientPi":`Pi`,"api.clientConfig.clientOmp":`OMP`,"api.clientConfig.clientHermes":`Hermes`,"api.clientConfig.clientOpenclaw":`OpenClaw`,"api.clientConfig.clientKimi":`Kimi Code`,"api.clientConfig.clientGajae":`Gajae Code`,"api.clientConfig.clientDsh":`DeepSeek Harness (DSH)`,"api.clientConfig.clientMcode":`MiniMax Code`,"api.clientConfig.clientZcode":`ZCode`,"api.clientConfig.clientPrime":`Prime Agent`,"api.clientConfig.copy":`設定をコピー`,"api.clientConfig.download":`ダウンロード`,"api.clientConfig.loading":`クライアント設定を生成中…`,"api.clientConfig.jsonLabel":`{client} 設定`,"api.clientConfig.destination":`配置先ファイル`,"api.clientConfig.envHint":`起動前にキーを設定`,"api.clientConfig.mergeWarning":`配置先ファイルにマージしてください。置き換えると既存のプロバイダーや MCP 設定が失われます。`,"api.clientConfig.modelCount":`{count} 件のモデルを書き出しました`,"api.clientConfig.missingLimits":`{total} 件中 {count} 件のモデルにコンテキスト上限がないため、クライアント側の既定値が使われます。`,"api.clientConfig.noKeyYet":`{env} に対応するキーがまだありません。ループバック外で使う前に上でキーを発行してください。`,"api.clientConfig.loadFailed":`モデル一覧を読み取れなかったため、クライアント設定を生成できませんでした。`,"api.clientConfig.copiedAnnounce":`クライアント設定をクリップボードにコピーしました。`,"api.clientConfig.copyFailed":`クライアント設定をコピーできませんでした。`,"api.clientConfig.downloadedAnnounce":`{filename} をダウンロードしました。まだ何も変わっていません。{destination} に自分でマージしてください。`,"api.clientConfig.whereDisclosure":`このファイルの置き場所`,"api.clientConfig.whereBody":`上のパスはグローバル設定の場所です。作業ディレクトリのプロジェクト設定ファイルが優先され、キーは設定に書かれた環境変数から読み込まれ、このファイルには保存されません。`,"api.keysLoadFailed":`APIキーを読み込めませんでした。`,"api.createFailed":`APIキーを作成できませんでした。`,"api.deleteFailed":`APIキーを削除できませんでした。`,"api.auth.endpoint":`エンドポイント`,"api.auth.required":`必須`,"api.auth.accepted":`利用可`,"api.auth.rejected":`不可`,"api.auth.testProtocol":`{protocol} をテスト`,"api.auth.testNeedsFreshKey":`認証付きテストを実行するには、キーを新しく作成し、一度だけ表示される値を画面に残したままにしてください。`,"api.key.name":`キー名`,"api.key.rename":`名前を変更`,"api.key.saveName":`名前を保存`,"api.key.renaming":`保存中…`,"api.key.renameFailed":`名前を変更できませんでした。入力内容はそのまま残しています。`,"api.key.deleting":`削除中…`,"api.key.copyFailed":`キーをコピーできませんでした。このパネルを閉じる前に手動で選択してコピーしてください。`,"api.attribution.title":`キー別の使用状況`,"api.attribution.requests7d":`直近 7 日のリクエスト`,"api.attribution.totalRequests":`集計済みリクエスト総数`,"api.attribution.totalRequestsAvailable":`利用可能な履歴のリクエスト`,"api.attribution.sinceAvailable":`利用可能な集計開始日`,"api.attribution.lastUsed":`最終使用`,"api.attribution.since":`集計開始`,"api.attribution.neverUsed":`集計開始以降は未使用`,"api.attribution.unavailable":`使用状況なし`,"api.attribution.unavailableDetail":`まだ集計された使用状況がありません。集計開始前のリクエストは遡って割り当てられません。`,"api.attribution.ambiguous":`2 つのキーが同じ ID を共有しているため、どちらの使用状況か判別できません。設定ファイルでキーごとに一意の ID を指定してください。`,"api.attribution.railAmbiguous":`ID 重複`,"claude.subtitle":`Claude Code 内で GPT、Gemini などのモデルを使用します。`,"claude.pageTitle":`Claude Code`,"claude.workspace.settings":`設定`,"claude.enabledLabel":`Claude 接続`,"claude.enabledHint":`オフにすると Claude Code はこのプロキシを使用できません。`,"claude.authMode":`認証モード`,"claude.authModeHint":`サブスクリプションは Claude アカウントが必要、プロキシは Anthropic アカウント不要で動作します`,"claude.authModeSubscription":`サブスクリプション(Claude アカウント)`,"claude.authModeProxy":`プロキシ(アカウント不要)`,"claude.authModeAuto":`自動 (Claude 認証を検出)`,"claude.effectiveMode.label":`次回起動時に適用`,"claude.effectiveMode.manual":`手動: {mode}`,"claude.effectiveMode.autoPresent":`自動: サブスクリプション — {source} で Claude 認証を検出`,"claude.effectiveMode.autoAbsent":`自動: プロキシモード — Claude 認証が見つかりません`,"claude.effectiveMode.autoUnknown":`自動: サブスクリプション — 認証を確認できませんでした`,"claude.effectiveMode.admissionKey":`このプロキシの API キーは引き続き送信されます。`,"claude.authSource.claude-json-oauth":`Claude アカウント`,"claude.authSource.claude-credentials-file":`認証情報ファイル`,"claude.authSource.macos-keychain":`macOS キーチェーン`,"claude.authSource.exported-env":`環境変数`,"claude.authSource.unknown":`検出された認証情報`,"claude.systemEnv":`自動接続`,"claude.systemEnvDesc":`オンにすると、任意のターミナルで claude を実行すると自動的にプロキシ経由になります。`,"claude.systemEnvUnsupported":`自動接続は macOS でのみ利用できます。このシステムでは {cmd} で Claude を起動してください。`,"claude.systemEnvWarn":`⚠ これを有効化するにはターミナルアプリを完全に終了して再起動する必要があります。推奨されません。`,"claude.fastMode":`高速モード(OpenAI)`,"claude.fastModeDesc":`OpenAI モデルの service_tier を制御します。オン = 優先(高速)。オフ = デフォルト。自動 = パススルー(クライアントが決定)。`,"claude.fastAuto":`自動`,"claude.fastOn":`オン`,"claude.fastOff":`オフ`,"claude.autoContext":`大きなコンテキストを自動で使用`,"claude.autoContextDesc":`1M マーキングがどこまで及ぶかを制御します。オン: 圧縮しきい値を収められるウィンドウを持つモデルに大型コンテキスト行を付けます。オフ: 真の 1M モデルのみに付けます。`,"claude.autoContextInert":`設定ファイルにレガシーのコンテキストサイズ値(maxContextTokens)が存在するため無効です。再び有効化するにはそれを削除してください。`,"claude.autoCompactWindow":`自動要約ポイント`,"claude.autoCompactDefault":`{value}(デフォルト)`,"claude.autoCompactWindowDesc":`チャットがこのポイントに達すると古いメッセージが要約されます。各モデル自身の上限を超えることはないので、200k モデルは影響を受けません。`,"claude.autoCompactWindowWarn":`これを変更すると GPT モデルが壊れる可能性があります — モデルの実際の上限より高く設定すると、要約が働く前にチャットがエラーになります。`,"claude.injectAgents":`サブエージェントを自動登録`,"claude.injectAgentsDesc":`サブエージェントタブで選んだモデル(と現在のデフォルトモデル)をディスパッチ可能な Claude Code エージェント(ocx-*)として登録します。次回セッションから適用されます。`,"claude.webSearchSidecar":`ウェブ検索サイドカーの上書き`,"claude.webSearchSidecarHint":`Claude Code リクエストのメインウェブ検索サイドカーを上書きします。`,"claude.visionSidecar":`ビジョンサイドカーの上書き`,"claude.visionSidecarHint":`Claude Code リクエストのメインビジョンサイドカーを上書きします。`,"claude.useMainSetting":`メイン設定を使用`,"claude.sidecarModelPlaceholder":`メイン設定のモデル`,"claude.quickstart":`はじめる`,"claude.quickstartHint":`{cmd} はプロキシ経由で Claude Code を開きます。あなたの claude.ai ログインはそのまま有効です。`,"claude.manualEnv":`手動セットアップ(高度)`,"claude.smallFastModel":`バックグラウンドヘルパーモデル`,"claude.smallFastModelHint":`チャットの要約やトピック検出のようなバックグラウンド作業に Claude Code が使うモデルです。haiku サブエージェントエイリアスもこれを使います。空 = Claude デフォルト(Haiku)。`,"claude.smallFastModelAccurateHint":`チャットの要約やトピック検出など、Claude Code がバックグラウンド処理に使うモデルです。サブエージェントの haiku エイリアスもこのモデルを使います。`,"claude.smallFastModelUnsetOption":`Claude Code に選択させる(ネイティブモデル)`,"claude.smallFastModelNativeWarning":`未設定の場合、OpenCodex はヘルパーモデルの上書きを設定しません。Claude Code がネイティブの Sonnet モデルを使用し、ネイティブプロバイダーで料金が発生する可能性があります。`,"claude.slotUnset":`Claude デフォルトを使用`,"claude.modelMap":`モデルの傍受`,"claude.modelMapHint":`特定モデルへのリクエストを傍受し、選んだモデルに再ルーティングします。デフォルトは空 — ルールを追加するまで何も起きません。`,"claude.mapFrom":`元のモデル(例: claude-sonnet-4-5)`,"claude.mapTo":`差し替え先(例: gemini/gemini-3-pro)`,"claude.addMapping":`ルールを追加`,"claude.removeMapping":`ルールを削除`,"claude.aliases":`利用可能なモデル`,"claude.aliasesHint":`Claude Code の /model メニューに表示されるモデル。`,"claude.aliasProviderOther":`その他`,"claude.loading":`読み込み中…`,"claude.loadFail":`Claude 設定の読み込みに失敗しました`,"claude.saved":`保存しました。`,"claude.saveFailed":`保存に失敗しました`,"claude.networkError":`ネットワークエラー — プロキシは起動していますか?`,"claude.toggleAria":`Claude 接続を切り替え`,"claude.none":`なし`,"claude.tabsLabel":`Claude クライアント`,"claude.tabCode":`Code`,"claude.tabDesktop":`Desktop`,"claudeDesktop.title":`Claude Desktop`,"claudeDesktop.subtitle":`各 Claude モデルファミリーをポート {port} の利用可能なモデルへルーティングします。`,"claudeDesktop.importJson":`JSON をインポート`,"claudeDesktop.exportJson":`JSON をエクスポート`,"claudeDesktop.loading":`Claude Desktop プロファイルを読み込み中…`,"claudeDesktop.loadFail":`Claude Desktop プロファイルの読み込みに失敗しました。`,"claudeDesktop.retry":`再試行`,"claudeDesktop.saveFailed":`Claude Desktop プロファイルの保存に失敗しました。`,"claudeDesktop.applyFailed":`プロファイルは保存されましたが、適用できませんでした。`,"claudeDesktop.updateFailed":`Claude Desktop の更新に失敗しました。`,"claudeDesktop.savedApplied":`プロファイルを保存し、Claude Desktop に適用しました。`,"claudeDesktop.appliedMarkerUnsaved":`Claude Desktop への適用は完了しましたが、適用マーカーを保存できませんでした。再度適用するまで、下の保存済み/適用済み表示が実際と異なる場合があります。`,"claudeDesktop.savedAppliedAnnounce":`Claude Desktop プロファイルを保存して適用しました。`,"claudeDesktop.saved":`プロファイルを保存しました。`,"claudeDesktop.savedAnnounce":`Claude Desktop プロファイルを保存しました。`,"claudeDesktop.exported":`プロファイルを JSON としてエクスポートしました。`,"claudeDesktop.importExpected":`バージョン 1 の Claude Desktop プロファイルが必要です。`,"claudeDesktop.importReady":`JSON をインポートしました。ドラフトを確認して保存・適用してください。`,"claudeDesktop.importedAnnounce":`プロファイル JSON をインポートしました。未保存の変更を確認できます。`,"claudeDesktop.importInvalid":`選択されたファイルは有効なプロファイルではありません。`,"claudeDesktop.importFailed":`インポートに失敗しました。{error}`,"claudeDesktop.moved":`{route} を {family} に移動しました。`,"claudeDesktop.unsaved":`未保存の変更`,"claudeDesktop.upToDate":`プロファイルは最新です`,"claudeDesktop.saving":`保存中…`,"claudeDesktop.applying":`適用中…`,"claudeDesktop.saveApply":`保存して適用`,"claudeDesktop.emptyTitle":`利用可能なモデルがありません`,"claudeDesktop.emptyHint":`プロバイダーを追加または有効化してから、Claude Desktop ルートを割り当ててください。`,"claudeDesktop.assignmentsLabel":`Claude モデルファミリーの割り当て`,"claudeDesktop.family.opus":`Opus`,"claudeDesktop.family.fable":`Fable`,"claudeDesktop.family.sonnet":`Sonnet`,"claudeDesktop.family.haiku":`Haiku`,"claudeDesktop.modelCountOne":`{count} モデル`,"claudeDesktop.modelCountMany":`{count} モデル`,"claudeDesktop.chooseDefault":`デフォルトを選択`,"claudeDesktop.temporaryDefault":`一時的なデフォルト`,"claudeDesktop.laneEmpty":`ここにモデルをドロップするか、移動コントロールを使用してください。`,"claudeDesktop.laneNoMatch":`検索に一致するモデルはこのファミリーにありません。`,"nav.grok":`Grok`,"grok.title":`Grok Build`,"grok.subtitle":`opencodex が Grok 設定に登録したモデルです。`,"grok.loading":`Grok の状態を読み込み中…`,"grok.loadFail":`Grok 設定を読み取れませんでした。`,"grok.notConfiguredTitle":`Grok Build が未設定です`,"grok.notConfiguredHint":`Grok をインストールしてプロキシを再起動すると、opencodex が管理ブロックを次の場所に書き込みます:`,"grok.endpoint":`エンドポイント`,"grok.colModel":`モデル`,"grok.colAlias":`Grok エイリアス`,"grok.colContext":`コンテキスト`,"grok.groupNative":`ネイティブモデル`,"grok.groupRouted":`ルーティングモデル`,"grok.enabledCount":`{total} 件中 {on} 件を登録`,"grok.saved":`選択を保存しました。`,"grok.savedApplied":`選択を保存し、Grok 設定に反映しました。`,"grok.saveFailed":`Grok の選択を保存できませんでした。`,"grok.applyFailed":`選択は保存しましたが、Grok 設定を更新できませんでした。`,"grok.applySkipped":`選択は保存しましたが、Grok 設定は変更されませんでした。`,"grok.saveApply":`保存して適用`,"grok.saving":`保存中…`,"grok.applying":`適用中…`,"grok.unsaved":`未保存の変更`,"grok.upToDate":`選択は最新です`,"grok.toggleModel":`{id} を Grok に登録`,"claudeDesktop.available":`利用可能`,"claudeDesktop.defaultBadge":`既定`,"claudeDesktop.supports1m":`1M`,"claudeDesktop.unavailable":`利用不可`,"claudeDesktop.contextM":`{n}M コンテキスト`,"claudeDesktop.contextK":`{n}k コンテキスト`,"claudeDesktop.contextUnknown":`コンテキスト不明`,"claudeDesktop.alias":`エイリアス`,"claudeDesktop.useAsDefault":`{family} のデフォルトに設定`,"claudeDesktop.moveTo":`移動先`,"claudeDesktop.move":`移動`,"claudeDesktop.status.applied":`Desktop に適用済み`,"claudeDesktop.status.stale":`設定が古くなっています — 再適用してください`,"claudeDesktop.status.notApplied":`未適用`,"claudeDesktop.status.notActiveProfile":`Desktop は別のプロファイルを使用中 — 再適用してください`,"claudeDesktop.status.disabled":`Claude Desktop 連携はオフです。有効にした後、Desktop を完全に終了して再起動してください。`,"claudeDesktop.enableApply":`有効にして適用`,"claudeDesktop.health.lastRequest":`最終リクエスト`,"claudeDesktop.health.stats":`{count} リクエスト / {errors} エラー`,"claudeDesktop.effort.supported":`effort`,"claudeDesktop.effort.displayOnly":`effort (表示のみ)`,"cws.loading":`コンボを読み込み中…`,"cws.loadFailed":`コンボを読み込めませんでした。`,"cws.saveFailed":`コンボを保存できませんでした。`,"cws.removeFailed":`コンボを削除できませんでした。`,"cws.saved":`コンボを保存しました。`,"cws.created":`{model} を作成しました。`,"cws.removed":`combo/{id} を削除しました。`,"cws.add":`コンボを追加`,"cws.addTitle":`コンボを追加`,"cws.addSubtitle":`プロバイダー全体にファンアウトする仮想モデルを作成します。クライアントは combo/<id> をリクエストします。`,"cws.create":`コンボを作成`,"cws.railAria":`コンボ一覧`,"cws.searchPlaceholder":`コンボやターゲットを検索…`,"cws.noSearchResults":`検索に一致するコンボがありません。`,"cws.group.failover":`フェイルオーバー`,"cws.group.roundRobin":`ラウンドロビン`,"cws.targetCount":`{count} ターゲット`,"cws.targetCountOne":`1 ターゲット`,"cws.overviewTitle":`コンボ`,"cws.overviewBlurb":`プロバイダー/モデルターゲット間でフェイルオーバーする、または決定論的で滑らかな重み付きラウンドロビンを使う仮想モデル。`,"cws.count.total":`合計`,"cws.count.failover":`フェイルオーバー`,"cws.count.roundRobin":`ラウンドロビン`,"cws.howTitle":`仕組み`,"cws.howBody":`Codex に combo/<id> を要求します。OpenCodex はターゲットを選び、再試行可能な上流の失敗時のみホップします。利用可能なターゲットが残っていない場合、グローバルなデフォルトプロバイダーを使わずにフェイルクローズします。`,"cws.attentionTitle":`要対応`,"cws.attention.empty":`ターゲットが設定されていません`,"cws.attention.few":`ターゲットが 1 つだけ — フェイルオーバーのホップ先がありません`,"cws.attention.catalogOmitted":`モデルカタログにありません — メンバー能力が不完全または非互換です(context window / メタデータ不足、または modality 交差が空)。エイリアス指定のルーティングは動作します`,"cws.attention.allTargetsExhausted":`有効なすべてのターゲットがクォータを使い切っています`,"cws.emptyTitle":`最初のコンボを作成`,"cws.empty.createDesc":`仮想モデルに名前を付け、2 つ以上のバックエンドをつなぎます。`,"cws.backToAll":`すべてのコンボに戻る`,"cws.allCombos":`すべてのコンボ`,"cws.copyModel":`ID をコピー`,"cws.copied":`コピーしました`,"cws.renamed":`{from} を {to} に変更しました。`,"cws.tabsLabel":`コンボ詳細セクション`,"cws.tab.config":`設定`,"cws.tab.about":`概要`,"cws.strategy":`ストラテジー`,"cws.strategy.failover":`フェイルオーバー`,"cws.strategy.roundRobin":`ラウンドロビン`,"cws.strategy.failoverHint":`ターゲットを順に試します。最初が再試行可能なエラー(レート制限、障害、サブスクリプションゲート)で失敗した場合、次へホップします。`,"cws.strategy.roundRobinHint":`重みで決定論的にトラフィックを分散します。選んだターゲットを成功リクエストのバッチ分保持し、次へ進みます。`,"cws.field.id":`コンボ ID`,"cws.field.idHint":`クライアントは {model} をリクエストします`,"cws.field.idInternalHint":`コンボの内部 ID。作成後も変更できます。`,"cws.field.idHintEdit":`ID を変更するとコンボの名前が変更されます。クライアントは {model} をリクエストします。`,"cws.field.alias":`公開モデル名`,"cws.field.aliasPlaceholder":`deepseek-v4-flash または vendor/model`,"cws.field.aliasHint":`任意。プレフィックスなしの名前、vendor/model のようなカスタムプレフィックスを指定するか、空欄のままにすると combo/<id> を使用します。`,"cws.field.nativeAlias":`ネイティブ OpenAI エイリアス`,"cws.field.nativeAliasHint":`このコンボがサポート対象の修飾なし OpenAI ネイティブモデル ID を所有します。アカウント修飾・プロバイダー修飾ルートは別のままです。`,"cws.field.displayName":`表示名`,"cws.field.displayNameHint":`モデルピッカーに表示するラベルです。ネイティブ OpenAI エイリアスでは必須です。`,"cws.field.stickyLimit":`ローテーション前の固定成功数`,"cws.field.stickyLimitHint":`重み付きセレクタが進む前に、選んだターゲットをこの回数の成功リクエスト分保持します。`,"cws.field.defaultEffort":`デフォルトの推論`,"cws.field.defaultEffortNone":`なし(ターゲットのデフォルト)`,"cws.field.defaultEffortHint":`クライアントが推論負荷を省略した場合のみ使用されます。選択肢は選択ターゲットが広告する負荷の交差です。`,"cws.capability.imageInputUnavailable":`選択した全ターゲットが画像入力に対応すると有効になります。`,"cws.capability.imageInputHint":`全ターゲットが画像対応なら既定でオン。オフにするとテキストのみ。`,"cws.capability.imageInput":`画像 / マルチモーダル`,"cws.capabilities":`能力`,"cws.field.defaultEffortUnsupported":`この負荷はターゲット共通の階段にありません — リクエスト時に無視またはスナップされます。`,"cws.field.defaultEffortUnsupportedOption":`交差に含まれない`,"cws.targets":`ターゲット`,"cws.targets.failoverHint":`順序が重要 — 最初がプライマリです。`,"cws.targets.roundRobinHint":`重みが決定論的な相対選択を制御し、順序がローテーションリングの同点を解消します。`,"cws.target.provider":`プロバイダー`,"cws.target.model":`モデル`,"cws.target.weight":`重み`,"cws.target.pickProvider":`プロバイダーを選択…`,"cws.target.pickProviderFirst":`最初にプロバイダーを選択…`,"cws.target.pickModel":`モデルを選択…`,"cws.target.noModels":`このプロバイダーにモデルはありません`,"cws.target.modelPlaceholder":`モデル ID`,"cws.target.add":`ターゲットを追加`,"cws.target.drag":`ドラッグで並べ替え`,"cws.target.moveUp":`上へ移動`,"cws.target.moveDown":`下へ移動`,"cws.quota.available":`利用可能`,"cws.quota.exhausted":`クォータを使い切りました`,"cws.quota.unknown":`クォータ不明`,"cws.quota.allExhausted":`有効なすべてのターゲットがクォータを使い切っています。別のターゲットを選ぶか、クォータの回復を待ってください。`,"cws.aboutTitle":`ランタイム`,"cws.aboutBody":`失敗したターゲットは Retry-After を尊重して短時間クールダウンします。無効またはコンテキストエラーはホップしません。各ターゲットは自身の能力に推論負荷を適応させます; 枯渇したコンボはフェイルクローズします。ログと使用量は順序付きの物理試行と試行ごとの使用量を保持します。`,"cws.removeConfirmTitle":`{model} を削除しますか?`,"cws.removeConfirmDesc":`これで仮想モデルが設定と Codex カタログから削除されます。プロバイダーは削除されません。`,"cws.unsavedTitle":`未保存の変更`,"cws.unsavedDesc":`このコンボへの編集を破棄して続行しますか?`,"cws.keepEditing":`編集を続ける`,"cws.err.missingId":`コンボ ID は必須です。`,"cws.err.invalidId":`ID は英字または数字で始まり、英数字、ドット、アンダースコア、ハイフンのみ使用できます(最大 64)。`,"cws.err.duplicateId":`この ID のコンボはすでに存在します。`,"cws.err.invalidAlias":`エイリアスには英字、数字、ドット、アンダースコア、ハイフンを使用でき、スラッシュ区切りは 1 つまでです。`,"cws.err.aliasReservedNamespace":`エイリアスに予約済みの "combo/" 名前空間は使用できません。`,"cws.err.aliasNativeFamily":`OpenAI ネイティブファミリー(gpt-*、o1-*、o3-*、o4-*、codex-*)のプレフィックスなしエイリアスは使用できません。`,"cws.err.unsupportedNativeAlias":`ネイティブエイリアスには、現在サポートされている OpenAI の bare model id を指定してください。`,"cws.err.missingNativeAliasDisplayName":`ネイティブエイリアスには表示名が必要です。`,"cws.err.invalidDisplayName":`表示名は 128 文字以内で、制御文字を含めることはできません。`,"cws.err.duplicateAlias":`別のコンボがすでにこのエイリアスを使用しています。`,"cws.err.noTargets":`少なくとも 1 つのターゲットを追加してください。`,"cws.err.incompleteTarget":`各ターゲットにはプロバイダーとモデルが必要です。`,"cws.target.disabled":`{name}(無効)`,"cws.err.reservedNamespace":`combo という物理プロバイダーは、コンボ作成前に名前を変更する必要があります。`,"cws.err.providerCollision":`コンボ ID が設定されたプロバイダー名と衝突しています。`,"cws.err.unknownProvider":`各ターゲットは設定済みプロバイダーを使用する必要があります。`,"cws.err.duplicateTarget":`同じプロバイダー/モデルターゲットは一度しか使用できません。`,"cws.err.invalidStickyLimit":`固定成功数は 1 から 100 の整数にしてください。`,"cws.err.invalidWeight":`各ラウンドロビン重みは 1 から 10000 の整数にしてください。`,"cws.err.noEnabledTarget":`少なくとも 1 つのターゲットは有効なプロバイダーを使用する必要があります。`,"prov.editAlias":`Edit alias`,"prov.aliasPrompt":`Display name (leave empty to clear)`,"prov.aliasSaved":`Alias saved`,"prov.aliasSaveFailed":`Could not save alias`,"prov.cooldownCleared":`クールダウンが解除されました`,"prov.cooldownClearFailed":`クールダウンを解除できませんでした`,"prov.accountId":`ID`,"models.customAdd":`Add custom model`,"models.customAddTitle":`Add custom model — {provider}`,"models.customEditTitle":`Edit custom model — {provider}`,"models.customAdded":`Custom model added`,"models.customUpdated":`Custom model updated`,"models.customDeleted":`Custom model deleted`,"models.customSaveFailed":`Failed to save custom model`,"models.customSaving":`Saving…`,"models.customAddBtn":`Add`,"models.customEditBtn":`Update`,"models.customEditNamed":`{name}を編集`,"models.customDeleteNamed":`{name}を削除`,"models.customDeleteConfirm":`Delete the {name} model?`,"models.customBadge":`Custom`,"models.customSummary":`{count} custom`,"models.customFieldModelId":`Model ID (endpoint slug)`,"models.customFieldModelIdPlaceholder":`e.g. qwen4-max-preview`,"models.customFieldDisplayName":`Display name (optional)`,"models.customFieldDisplayNamePlaceholder":`e.g. Qwen 4 Max Preview`,"models.customFieldContext":`Context window`,"models.customFieldModalities":`Input modalities`,"models.customFieldReasoning":`推論努力`,"models.customFieldReasoningOverride":`推論努力を上書き`,"models.reasoningEffort.none":`なし`,"models.reasoningEffort.minimal":`最小`,"models.reasoningEffort.low":`低`,"models.reasoningEffort.medium":`中`,"models.reasoningEffort.high":`高`,"models.reasoningEffort.xhigh":`非常に高`,"models.reasoningEffort.max":`最大`,"models.tipProvider":`Provider`,"models.tipContext":`Context`,"models.tipModalities":`Modalities`,"models.tipStatus":`Status`,"models.tipActive":`Active`,"models.tipDisabled":`Disabled`,"pws.estimatedCost":`Estimated cost`,"pws.costDisclaimer":`API list-price estimate, not an actual charge.`,"pws.modelBreakdown":`Model breakdown`,"pws.col.model":`Model`,"pws.col.cost":`Est. cost`,"pws.col.tokens":`Tokens`,"pws.col.requests":`Req.`,"pws.col.share":`Share`,"pws.tokenInput":`Input`,"pws.tokenOutput":`Output`,"dash.injectionManage":`設定を開く`,"sub.settings":`設定`,"sub.sections":`サブエージェントのセクション`,"sub.delegation.model":`最初に呼ぶモデル`,"sub.delegation.modelHint":`Codex が作業を任せるとき、最初に呼ぶモデルです。上のおすすめが呼べる候補で、ここで選んだものがその中の第一候補になります。`,"dash.syncModelsHint":`接続済みのプロバイダーをもとに Codex のモデルカタログを書き直します。`,"dash.syncRun":`今すぐ同期`,"lab.title":`Compatibility Lab`,"lab.subtitle":`Read-only compatibility verdict matrix from lab projection evidence.`,"lab.loadFailed":`Could not load compatibility lab data`,"lab.projectionUnavailable":`Lab projection is not available. Run conformance or live probes first.`,"lab.projectionIncompatible":`Lab projection schema is incompatible. Rebuild the projection.`,"lab.statusTitle":`Projection status`,"lab.matrixTitle":`Compatibility matrix`,"lab.verdictsTitle":`Verdict records`,"lab.filter.layer":`Evidence layer`,"lab.filter.verdict":`Verdict`,"lab.filter.subject":`Subject ID`,"lab.filter.all":`All`,"lab.col.subject":`Subject`,"lab.col.layer":`Layer`,"lab.col.suite":`Suite`,"lab.col.verdict":`Verdict`,"lab.col.asOf":`As of`,"lab.col.protocol":`Protocol conformance`,"lab.col.live":`Live route compatibility`,"lab.col.task":`Task effectiveness`,"lab.empty":`No compatibility verdicts in the projection yet.`,"lab.subjectKind":`Kind`,"lab.observationCount":`Observations`,"lab.eventCount":`Events`,"lab.verdictCount":`Verdicts`,"lab.subjectCount":`Subjects`,"lab.builtAt":`Built`,"lab.loading":`Loading compatibility evidence…`,"lab.loadMore":`Load more`,"lab.detailTitle":`Verdict detail`,"lab.detailClose":`Close`,"lab.detailSubject":`Subject`,"lab.detailObservations":`Observations`,"lab.detailEvents":`Contributing events`,"lab.detailArtifacts":`Artifact metadata`,"lab.production.title":`観測された本番トラフィック`,"lab.production.notVerification":`ラボ検証ではありません`,"lab.production.attempts":`試行`,"lab.production.successes":`成功`,"lab.production.routeErrors":`ルートエラー`,"lab.production.lastObserved":`最終観測`,"lab.detailLoadFailed":`Could not load verdict detail`,"lab.refresh":`Refresh`,"lab.verdict.UNKNOWN":`Unknown`,"lab.verdict.CLAIMED":`Claimed`,"lab.verdict.PROBED":`Probed`,"lab.verdict.VERIFIED":`Verified`,"lab.verdict.DEGRADED":`Degraded`,"lab.verdict.BLOCKED":`Blocked`,"lab.verdict.UNSUPPORTED":`Unsupported`,"lab.layer.protocol_conformance":`Protocol conformance`,"lab.layer.live_route_compatibility":`Live route compatibility`,"lab.layer.task_effectiveness":`Task effectiveness`,"dash.visionAdvanced":`詳細設定`,"dash.visionMaxDescriptions":`1 ターンあたりの最大説明数`,"dash.visionMaxDescriptionsInvalid":`正の整数を入力してください。`,"dash.visionTimeout":`タイムアウト`,"dash.visionTimeoutInvalid":`{min} から {max} ミリ秒の整数を入力してください。`,"dash.visionAdvancedPopover":`詳細なビジョン設定`,"sub.routedDelegationBridge":`ルーティングされた V2 委任ブリッジ`,"sub.routedDelegationBridgeHint":`実験的機能です。有効中は、生成・送信・フォローアップのメッセージが、ネイティブ間の委任を含め平文になります。Codex には元のモデルが表示される場合がありますが、ルーティングされた内容とプライバシーは選択したプロバイダーに従います。`,"sub.routedDelegationBridgeInactive":`有効化済みです。対象となるネイティブ V2 ルートでのみ動作します。`,"sub.routedDelegationBridgeSaveFail":`ルーティングされた V2 委任ブリッジを保存できませんでした`,"sub.routedDelegationBridgeSaved":`ルーティングされた V2 委任ブリッジを保存しました。無効化は直ちに適用されます。`,"models.newPolicyGlobal":`新しいモデルを無効で追加`,"models.newPolicyProvider":`新しいモデルのポリシー`,"models.newPolicy_inherit":`継承`,"models.newPolicy_off":`オフ`,"models.newPolicy_on":`オン`,"models.newBadge":`新着`,"models.newCount":`新着 {count} 件、オフ`,"models.aliases":`エイリアス`,"models.aliasesTable":`エイリアス一覧`,"models.aliasPrompt":`プロバイダーのエイリアス(空にすると解除)`,"models.modelAliasPrompt":`モデルのエイリアス(空にすると解除)`,"models.aliasSaved":`エイリアスを保存しました`,"models.aliasConflict":`このエイリアスは既存の名前と競合します`,"models.editProviderAlias":`プロバイダーのエイリアスを編集`,"models.editModelAlias":`モデルのエイリアスを編集`,"models.useDefaultAliases":`既定のエイリアスを使う`,"models.useDefaultAliasesGlobal":`既定のエイリアスを全体で使う`,"models.aliasAuto":`自動`,"models.aliasUser":`ユーザー`,"models.aliasStale":`古い`},S={"nav.dashboard":`Gösterge Paneli`,"uptime.day":` gün`,"uptime.hour":` saat`,"uptime.minute":` dk`,"uptime.second":` sn`,"nav.startup":`Başlatma Güvenliği`,"nav.providers":`Sağlayıcılar`,"nav.models":`Modeller`,"nav.combos":`Kombolar`,"nav.subagents":`Alt Ajanlar`,"nav.logs":`Günlükler & Hata Ayıklama`,"nav.usage":`Kullanım`,"common.github":`GitHub`,"sidebar.star":`GitHub'da Yıldız Ver`,"sidebar.starred":`GitHub'da Yıldız Verildi`,"sidebar.starUnauthenticated":`Yıldız vermek için GitHub'ı açın (gh CLI oturum açmamış)`,"sidebar.starFailed":`gh üzerinden yıldız verilemedi. Bunun yerine GitHub açılıyor.`,"sidebar.updateAvailable":`Güncelleme mevcut: {version}`,"sidebar.checkUpdate":`Güncellemeleri kontrol et`,"common.save":`Kaydet`,"common.saving":`Kaydediliyor…`,"common.cancel":`İptal`,"common.discard":`Vazgeç`,"common.delete":`Sil`,"common.close":`Kapat`,"common.ok":`Tamam`,"common.remove":`Kaldır`,"common.loading":`Yükleniyor…`,"common.retry":`Tekrar Dene`,"auth.adminTokenTitle":`OpenCodex yönetici jetonu (OPENCODEX_ADMIN_AUTH_TOKEN)`,"auth.adminAccountLabel":`Hesap`,"auth.adminTokenFieldLabel":`Yönetici jetonu`,"auth.adminTokenRejected":`Bu yönetici jetonu reddedildi. Kontrol edip tekrar deneyin.`,"auth.adminTokenUnavailable":`Yönetici jetonu doğrulanamadı. Tekrar deneyin.`,"app.logoAria":`opencodex logosu`,"app.pageTitle":`{page} — opencodex`,"app.claudeOn":`Claude AÇIK`,"app.claudeOff":`Claude KAPALI`,"theme.label":`Tema`,"theme.light":`Açık`,"theme.dark":`Koyu`,"theme.system":`Sistem`,"lang.label":`Dil`,"lang.nativeName":`Türkçe`,"provider.name.commandCodeAuth":`Command Code - Auth`,"provider.name.commandCodeApi":`Command Code - API`,"provider.name.volcengine":`Volcengine Ark`,"provider.name.volcengineCodingPlan":`Volcengine Ark Coding Plan`,"provider.name.volcengineAgentPlan":`Volcengine Ark Agent Plan`,"errorBoundary.title":`Sayfa yüklenemedi`,"errorBoundary.message":`Bu bölümde bir işleme hatası oluştu. Yeniden denemek için sayfayı yenileyin.`,"errorBoundary.details":`Hata`,"errorBoundary.reload":`Yeniden Yükle`,"routing.title":`Yönlendirme Zekası (beta)`,"routing.subtitle":`Politika profilleri, simülasyon değerlendirmesi ve kaynak destekli yönlendirme analitiği.`,"routing.loadFailed":`Yönlendirme verileri yüklenemedi`,"routing.empty":"Yapılandırılmış yönlendirme profili yok. config.json dosyasına `routingProfiles` ekleyin.","routing.revision":`revizyon`,"routing.detail":`Profil`,"routing.createProfile":`Profil oluştur`,"routing.dryRunError":`Simülasyon başarısız oldu (HTTP {status})`,"routing.removeConfirm":`{id} profili kaldırılsın mı?`,"routing.unknownEvidence.allow":`izin ver`,"routing.unknownEvidence.penalize":`cezalandır`,"routing.unknownEvidence.exclude":`hariç tut`,"routing.removeCandidate":`{provider}/{model} adayı kaldırılsın mı`,"routing.candidates":`Adaylar`,"routing.require":`Katı gereksinimler`,"routing.optimize":`Optimizasyon ağırlıkları`,"routing.limits":`Limitler`,"routing.unknownEvidence":`Bilinmeyen kanıt politikası`,"routing.compatibility.title":`Uyumluluk politikası`,"routing.compatibility.enabled":`Compatibility Lab kanıtı gerekli`,"routing.compatibility.requiredSuites":`Gerekli test süitleri`,"routing.compatibility.loadingCatalog":`Lab kataloğu yükleniyor…`,"routing.compatibility.catalogUnavailable":`Lab kataloğu kullanılamıyor — test süiti kimliklerini config.json içinde elle girin.`,"routing.compatibility.layer.protocol_conformance":`Protokol uyumu`,"routing.compatibility.layer.live_route_compatibility":`Canlı rota uyumluluğu`,"routing.compatibility.minStatus":`Minimum uyumluluk durumu`,"routing.none":`yok`,"routing.unavailable":`–`,"routing.dryRun":`Simülasyon değerlendirmesi`,"routing.dryRunContext":`İstek bağlam penceresi (jetonlar)`,"routing.dryRunTools":`İstek araç gerektiriyor`,"routing.dryRunImage":`İstek görsel girdisi gerektiriyor`,"routing.dryRunStructured":`İstek yapılandırılmış çıktı gerektiriyor`,"routing.dryRunRun":`Adayları değerlendir`,"routing.candidate":`Aday`,"routing.eligible":`Uygun`,"routing.exclusions":`Hariç Tutulanlar`,"routing.costCap":`Maliyet tavanı`,"routing.capOutcome.satisfied":`limit içinde`,"routing.capOutcome.exceeded":`limit aşıldı`,"routing.capOutcome.unknown-allowed":`bilinmiyor (izinli)`,"routing.capOutcome.unknown-excluded":`bilinmiyor (hariç tutuldu)`,"routing.exclusion.capability-unsatisfied":`yetenek karşılanmadı`,"routing.exclusion.unknown-capability":`bilinmeyen yetenek`,"routing.exclusion.cost-limit":`maliyet tavanı aşıldı`,"routing.exclusion.cost-limit-unknown":`maliyet tavanı doğrulanamadı`,"routing.exclusion.cooldown":`soğuma süresi`,"routing.exclusion.unknown-health":`bilinmeyen sağlık`,"routing.exclusion.unknown-quota":`bilinmeyen kota`,"routing.exclusion.unknown-price":`bilinmeyen fiyat`,"routing.exclusion.other":`hariç tutma: {code}`,"routing.score":`Puan`,"routing.selected":`seçildi`,"routing.yes":`evet`,"routing.no":`hayır`,"routing.analytics":`Yönlendirme analitiği`,"routing.analyticsTotal":`İstekler`,"routing.analyticsSuccessRate":`Başarı`,"routing.analyticsFallbackRate":`Yedekleme`,"routing.analyticsP50":`p50`,"routing.analyticsP95":`p95`,"routing.analyticsP99":`p99`,"routing.analyticsCooldown":`Soğuma süresi hataları`,"routing.analyticsConfidence":`Güvenilirlik`,"routing.analyticsTruncated":`kısaltılmış geçmiş`,"routing.analyticsRequests":`İstekler`,"routing.analyticsEmpty":`Henüz analitik verisi yok — önce birkaç istek gönderin.`,"startup.title":`Başlatma güvenliği`,"startup.subtitle":`Yerel proxy yönlendirmesi bir yeniden bağlanma döngüsüne girmeden önce Codex'in yeniden başlatmanın ardından opencodex'e erişebildiğini doğrulayın.`,"startup.refresh":`Yenile`,"startup.backToDashboard":`Gösterge Paneline Dön`,"startup.loading":`Başlatma koruması kontrol ediliyor…`,"startup.error":`Başlatma koruması okunamadı.`,"startup.staleData":`Son başlatma kontrolü başarısız oldu. Aşağıdaki değerler güncel değildir ve koruma kanıtı olarak kabul edilmemelidir.`,"startup.status.native":`Yerel yönlendirme`,"startup.status.protected":`Yeniden başlatma korumalı`,"startup.status.atRisk":`Eylem gerekiyor`,"startup.summary.native":`Codex yerel proxy'ye bağımlı değildir`,"startup.summary.protected":`opencodex yeniden başlatmanın ardından kullanılabilir olacaktır`,"startup.summary.atRisk":`Codex yeniden başlatmanın ardından model erişimini kaybedebilir`,"startup.riskDetail":`Codex yerel proxy'ye sabitlenmiş, ancak kalıcı bir servis veya sağlıklı başlatıcı shim bunu tekrar başlatmayacak.`,"startup.riskDetailCustomLocal":`Codex özel bir yerel ağ geçidine işaret ediyor. opencodex bu ağ geçidinin yeniden başlatma yaşam döngüsünü yönetemez veya doğrulayamaz.`,"startup.riskDetailWindowsShim":`Başlatıcı shim desteklenen CLI betiklerini korur, ancak Codex Desktop ve doğrudan codex.exe başlatmaları Windows'ta bunu atlayabilir.`,"startup.safeDetail":"Mevcut yönlendirme ve başlatma mekanizması tutarlıdır. Yeniden başlatmanın ardından manuel `ocx start` komutuna gerek yoktur.","startup.routing":`Codex yönlendirmesi`,"startup.routing.proxy":`Yerel proxy`,"startup.routing.native":`Yerel OpenAI`,"startup.routing.customLocal":`Özel yerel ağ geçidi`,"startup.routing.customRemote":`Özel uzak ağ geçidi`,"startup.routing.unknown":`Bilinmeyen veya geçersiz yönlendirme`,"startup.restartProtection":`Yeniden başlatma koruması`,"startup.preference":`İsteğe bağlı başlatma`,"startup.enabled":`Etkin`,"startup.disabled":`Devre dışı`,"startup.protection.service":`Arka plan servisi`,"startup.protection.shim":`Başlatıcı shim`,"startup.protection.none":`Yüklü değil`,"startup.details":`Koruma detayları`,"startup.service":`Arka plan servisi`,"startup.serviceHint":`Oturum açmada başlar ve çökmenin ardından proxy'yi yeniden başlatır.`,"startup.installed":`Yüklü`,"startup.notInstalled":`Yüklü değil`,"startup.unsupported":`Desteklenmiyor`,"startup.shim":`Codex başlatıcı shim`,"startup.shimHint":"Desteklenen bir Codex betik başlatıcısı başladığında `ocx ensure` çalıştırır.","startup.healthy":`Sağlıklı`,"startup.cliOnly":`Yalnızca CLI`,"startup.stale":`Eski`,"startup.viable":`Hazır`,"startup.unhealthy":`Yüklü ama sağlıksız`,"startup.conflict":`Servis çakışması`,"startup.installedDisabled":`Yüklü ama devre dışı`,"startup.install":`Yükle`,"startup.installing":`Yükleniyor…`,"startup.repair":`Onar`,"startup.repairing":`Onarılıyor…`,"startup.serviceInstalled":`Arka plan servisi başarıyla yüklendi.`,"startup.serviceRepaired":`Arka plan servisi başarıyla onarıldı.`,"startup.shimInstalled":`Codex başlatıcı shim başarıyla yüklendi.`,"startup.shimRepaired":`Codex başlatıcı shim başarıyla onarıldı.`,"startup.installFailed":`Yükleme başarısız oldu:`,"startup.tray.title":`Windows sistem tepsisi`,"startup.tray.hint":`Tek tıkla proxy başlatma, durdurma, yeniden başlatma, panel ve durum kontrolleri için oturum tepsisi simgesi yükleyin.`,"startup.tray.login":`Windows oturum açılışında tepsiyi başlat`,"startup.tray.notProtection":`Tepsi bir denetleyicidir, yeniden başlatma koruması değildir. İnsansız proxy kurtarma için hâlâ geçerli bir arka plan servisi gereklidir.`,"startup.tray.running":`Çalışıyor`,"startup.tray.stopped":`Yüklü, gizli`,"startup.tray.stale":`Onarım gerekiyor`,"startup.tray.notInstalled":`Yüklü değil`,"startup.tray.loading":`Kontrol ediliyor…`,"startup.tray.unavailable":`Durum kullanılamıyor`,"startup.tray.install":`Yükle ve tepsiyi göster`,"startup.tray.start":`Tepsi simgesini göster`,"startup.tray.stop":`Tepsi simgesinden çık`,"startup.tray.uninstall":`Oturum tepsisini kaldır`,"startup.tray.error":"Windows tepsi eylemi başarısız oldu. Detaylar için `ocx tray status` kontrol edin.","startup.recovery":`Onarım seçenekleri`,"startup.recoveryHint":`Yukarıdaki tek tıkla yükleyicileri kullanın veya manuel onarım için komutu kopyalayın. Codex Desktop ve Windows yürütülebilir dosyaları için arka plan servisi önerilir.`,"startup.command.service":`Önerilen: kalıcı arka plan servisi`,"startup.command.shim":`Alternatif: CLI başlatıcı shim`,"startup.command.native":`Güvenli mod: yerel Codex yönlendirmesini geri yükle`,"startup.copy":`Kopyala`,"startup.copied":`Kopyalandı`,"startup.recommended":`Önerilen onarım: {cmd}`,"startup.navRisk":`Başlatma koruması dikkat gerektiriyor`,"startup.codexRuntime.clampHidden":`OpenCodex, Codex {version} kullandığı için bazı akıl yürütme çabası seçenekleri gizlendi.`,"startup.codexRuntime.clampHiddenWithEfforts":`OpenCodex, Codex {version} kullandığı için bazı akıl yürütme çabası seçenekleri gizlendi (kaldırılanlar: {efforts}).`,"startup.codexRuntime.olderBinary":`OpenCodex eski bir Codex ikili dosyası ({version}) kullanıyor. Daha yeni bir kurulum mevcut.`,"dash.subtitle":`Yerel opencodex proxy'sinin, sağlayıcılarının ve Codex'e yönlendirilen modellerin canlı durumu.`,"dash.workspace.overview":`Genel Bakış`,"dash.workspace.sections":`Bölümler`,"dash.status":`Durum`,"dash.online":`Çevrimiçi`,"dash.offline":`Çevrimdışı`,"dash.version":`Sürüm`,"dash.uptime":`Çalışma Süresi`,"dash.providers":`Sağlayıcılar`,"dash.tokens30d":`Jetonlar (30 gün)`,"dash.activity.title":`30 günlük etkinlik`,"dash.activity.requests":`İstekler`,"dash.activity.tokens":`Jetonlar`,"dash.activity.chartLabel":`30 günlük etkinlik. Gün seçmek için Sol ve Sağ, aralık sınırlarına gitmek için Home ve End tuşlarını kullanın.`,"dash.activity.viewUsage":`Kullanımı görüntüle`,"dash.coverage":`%{pct} kapsam`,"dash.mem.title":`Bellek izlenebilirliği`,"dash.mem.hint":`Salt okunur çalışma zamanı tanılamaları. Gözlemlenen bellek max(RSS, harici, ArrayBuffers) değeridir.`,"dash.mem.rss":`Yerleşik küme (RSS)`,"dash.mem.jsHeap":`Kullanımdaki JS yığını`,"dash.mem.jsHeapArena":`arena {total}`,"dash.mem.pressure":`Uyarı eşiğine göre`,"dash.mem.pressureOf":`Eşiğin %{pct}'si`,"dash.mem.pressureUnknown":`Bildirilen eşik yok`,"dash.mem.jscHeap":`JSC yığını`,"dash.mem.external":`Harici`,"dash.mem.arrayBuffers":`ArrayBuffers`,"dash.mem.observed":`Gözlemlenen`,"dash.mem.runtime":`Çalışma zamanı sayaçları`,"dash.mem.growth":`Saatlik gözlemlenen kayma`,"dash.mem.perHour":`/saat`,"dash.mem.store":`Devamlılık deposu`,"dash.mem.storeHint":`Proxy previous_response_id önbelleği.`,"dash.mem.storeEntries":`Girdiler`,"dash.mem.storeTotal":`Toplam`,"dash.mem.storeLargest":`En büyük`,"dash.mem.storeOldest":`En eski`,"dash.mem.threshold":`Uyarı eşiği`,"dash.mem.lastWarn":`Son uyarı`,"dash.mem.never":`Hiçbir zaman`,"dash.mem.details":`Detaylar`,"dash.mem.unavailable":`Bellek tanılaması kullanılamıyor (eski proxy).`,"dash.mem.inFlight":`İşlemdeki istekler`,"dash.mem.restart":`Boşalt & yeniden başlat`,"dash.mem.restartConfirm":`{count} işlemdeki isteğin tamamlanmasını bekleyin, ardından yeniden başlatın ({seconds} saniyeye kadar).`,"dash.mem.draining":`{count} istek boşaltılıyor… tamamlandığında yeniden başlatılacak`,"dash.mem.reconnecting":`Proxy yeniden başlatılıyor… yeniden bağlanması bekleniyor`,"dash.connectionReconnecting":`Bağlantı kesildi — yeniden bağlanılıyor…`,"dash.mem.restartFailed":`Boşaltma ve yeniden başlatma başarısız oldu. Proxy'nin çalıştığını kontrol edin.`,"dash.mem.restartNoSupervisor":`Yeniden başlatma koruması algılanmadı.`,"dash.activeProviders":`Aktif sağlayıcılar`,"dash.noProviders":`Yapılandırılmış sağlayıcı yok. {cmd} komutunu çalıştırın.`,"dash.col.name":`İsim`,"dash.col.adapter":`Adaptör`,"dash.col.baseUrl":`Taban URL`,"dash.col.model":`Model`,"dash.modelsNoResults":`Aramanızla eşleşen model bulunamadı.`,"dash.availableModels":`Kullanılabilir modeller`,"dash.noModels":`Model bulunamadı. Sağlayıcı API anahtarlarını kontrol edin.`,"dash.cannotConnect":`Proxy'ye bağlanılamıyor. Çalışıyor mu?`,"dash.runStart":`Proxy'yi başlatmak için {cmd} çalıştırın.`,"dash.stop":`Proxy'yi Durdur`,"dash.stopConfirm":`Proxy durdurulsun ve yerel Codex geri yüklensin mi?`,"dash.stopFailed":`Proxy durdurulamadı (HTTP {status}).`,"dash.maSwitchFailed":`Mod değiştirme başarısız oldu (HTTP {status}).`,"dash.maNetworkError":`Ağ hatası — proxy çalışıyor mu?`,"dash.stopping":`Durduruluyor…`,"dash.actions":`Proxy`,"dash.codexRestart":`Codex model listesini yenile`,"dash.codexRestarting":`Durduruluyor…`,"dash.codexRestartConfirm":`Model listesini yeniden okumaları için Codex app-server'ları durdurulsun mu? Süren bir Codex işlemi kesilir ve Codex kendiliğinden yeniden başlamaz — sonrasında yeniden açın.`,"dash.codexRestartDone":`{count} Codex app-server durduruldu. Güncel model listesi için Codex'i yeniden açın.`,"dash.codexRestartNothing":`Çalışan Codex app-server yok. Sonraki açılışta güncel model listesi okunur.`,"dash.codexRestartUnknown":`Süreçler listelenemedi, bu yüzden hiçbir şey durdurulmadı.`,"dash.codexRestartPartial":`{count} app-server kapanmadı. Model listesi eski kalırsa bunları elle durdurun.`,"dash.codexRestartFailed":`Codex model listesi yenilenemedi (HTTP {status}).`,"dash.codexRestartUnreachable":`Proxy'ye ulaşılamadı.`,"dash.codexRestartMalformed":`Proxy beklenmeyen bir yanıt döndürdü.`,"dash.codexRestartTimeout":`Proxy zamanında yanıt vermedi. App-server'ları durdurmaya devam ediyor olabilir.`,"models.staleBanner":`Codex, bu katalogdan daha eski bir model listesi gösteriyor. Yeniden okumak için Codex'i yeniden başlatın.`,"dash.codexAutoStart":`opencodex'i Codex ile başlat`,"dash.codexAutoStartHint":`Yüklü bir shim'in ocx ensure çalıştırmasına izin verir. Arka plan servisi veya yeniden başlatma koruması kurmaz; sistem durumu için Başlatma Güvenliği'ne bakın.`,"dash.searchModel":`Arama yan araç modeli`,"dash.searchModelHint":`OpenAI dışı yönlendirilen modellerde web_search için kullanılan model. ChatGPT girişi gerektirir.`,"dash.searchReasoning":`Arama akıl yürütme çabası`,"dash.visionModel":`Görsel yan araç modeli`,"dash.visionModelHint":`Salt metin yönlendirilen modeller için görselleri tanımlamakta kullanılan model. ChatGPT girişi gerektirir.`,"dash.webSearchSidecar":`Web arama yan aracı (sidecar)`,"dash.webSearchSidecarHint":`Yönlendirilen modellerde web araması için kullanılan arka ucu ve modeli seçin.`,"dash.webSearchStream":`Yanıtları canlı akıt`,"dash.webSearchStreamHint":`Model bir araç çağrısına karar verene kadar baştaki metni ve akıl yürütmeyi canlı akıtır; kalanı arama yakalama için arabelleğe alınır. Aramadan önce yazılan metin kısmen tekrarlanabilir.`,"dash.visionSidecar":`Görsel yan aracı (sidecar)`,"dash.visionSidecarHint":`Salt metin modeller için görselleri tanımlamakta kullanılan arka ucu ve modeli seçin.`,"dash.visionOff":`Kapalı`,"dash.shadowCallIntercept":`Gölge Çağrı Yakalama`,"dash.shadowCallInterceptHint":`Codex App'in arka plan yardımcı çağrılarını ({models}) başlık oluşturma ve commit mesajları için yakalar ve seçtiğiniz modele yönlendirir.`,"dash.shadowCallWarning":`⚠ Etkinleştirildiğinde, {models} için olan TÜM istekler seçilen modelle değiştirilecektir.`,"dash.shadowCallOriginal":`Orijinal`,"dash.shadowCallModel":`Yedek model`,"dash.shadowCallTooltip":`Codex App arka planda başlık ve commit mesajı oluşturmak için yardımcı çağrılar yapar (orijinal {models}). Etkinleştirerek bunları seçtiğiniz modele yönlendirebilirsiniz.`,"models.shadowCallIntercept":`Gölge Çağrı Yakalama`,"models.shadowCallInterceptHint":`Codex App'in başlıklar ve commit mesajları için yaptığı arka plan çağrılarını ({models}) yakalar ve seçtiğiniz modele yönlendirir.`,"dash.sidecarBackend":`Arka uç`,"dash.sidecarModel":`Model`,"dash.backendAuto":`Otomatik`,"dash.backendOpenAI":`OpenAI`,"dash.backendAnthropic":`Anthropic`,"dash.sidecarSaved":`Yan araç ayarları kaydedildi. Sonraki istekte uygulanacak.`,"dash.sidecarSaveFailed":`Yan araç ayarları kaydedilemedi.`,"dash.injectionLabel":`Alt ajan devri`,"dash.injectionHint":`Codex'in alt ajan işlerini devredeceği modeli seçin.`,"dash.injectionManage":`Ayarları aç`,"dash.syncCodexSubagentDefaults":`Ayrıca Codex varsayılanı olarak kaydet`,"dash.syncCodexSubagentDefaultsHint":`Açık olduğunda, yukarıdaki seçim Codex'in kendi yapılandırmasına yazılır.`,"dash.multiAgentGuidance":`Codex'e işi nasıl böleceğini söyle`,"dash.multiAgentGuidanceHint":`Codex'e işleri alt ajanlara nasıl devredeceğini söyleyen kısa bir not gönderir.`,"dash.injectionNone":`Yok`,"dash.injectionEffortLabel":`Akıl yürütme çabası`,"dash.injectionEffortNone":`Model varsayılanı`,"dash.effortCapLabel":`V2 ultra çaba limiti`,"dash.subagentEffortCapLabel":`V2 alt ajan çaba limiti`,"dash.effortCapHelp":`V2 ultra modu turları için akıl yürütme çabasını sınırlar. Ayarlandığında, gelen maksimum çaba istekleri (ultra modundan) seçilen seviye ile sınırlandırılır. Alt ajan limiti yalnızca türetilen çocuk ajanları etkiler. Limitler çabayı yalnızca düşürür, asla yükseltmez. Bir model sınırlandırılan seviyeyi desteklemiyorsa, desteklenen en yakın alt seviyeye iner.`,"dash.effortCapNone":`Limit yok`,"dash.maintenance":`Bakım`,"dash.maintenanceHint":`Codex'in model kataloğunu yenileyin veya daha yeni bir opencodex sürümü yükleyin.`,"dash.syncModels":`Modelleri senkronize et`,"dash.syncModelsHint":`Bağladığınız sağlayıcılardan Codex'in model kataloğunu yeniden yazın.`,"dash.syncRun":`Şimdi senkronize et`,"dash.syncing":`Senkronize ediliyor…`,"dash.syncOk":`Senkronizasyon tamamlandı. {count} model eklendi.`,"dash.syncStaleHint":`Codex hâlâ eski bir liste gösteriyorsa uygulama sunucusunu yeniden başlatın ({cmd}).`,"dash.syncFailed":`Senkronizasyon başarısız oldu: {error}`,"dash.projectConfigTitle":`Proje Codex konfigürasyonu OpenCodex'i atlıyor`,"dash.projectConfigHint":`Bu depoya özel ayarlar OpenCodex proxy'sini geçersiz kılar.`,"dash.checkUpdate":`Güncellemeyi kontrol et`,"dash.updateTitle":`opencodex'i güncelle`,"dash.updateDesc":`Seçilen kanal için npm'i kontrol edin.`,"dash.updateChannel":`Kanal`,"dash.updateChecking":`Güncellemeler kontrol ediliyor…`,"dash.updateInstalled":`Yüklü`,"dash.updateLatest":`En son`,"dash.updateAvailable":`Güncelleme mevcut`,"dash.updateCurrent":`Güncel`,"dash.updateCommand":`Komut`,"dash.updateSource":`Bu bir kaynak kod kopyasıdır. Terminalden güncelleyin.`,"dash.updateUnavailable":`npm'den en son sürüm okunamadı.`,"dash.updateRetry":`Tekrar dene`,"dash.updateRecheck":`Yeniden kontrol et`,"dash.updateCannotAuto":`Tek tıkla güncelleme kullanılamıyor ({reason}).`,"dash.updateReason.source_checkout":`kaynak kod kopyası`,"dash.updateReason.latest_unavailable":`npm sunucusuna ulaşılamıyor`,"dash.updateReason.already_latest":`zaten en son sürümde`,"dash.updateReason.unknown":`güncelleme kullanılamıyor`,"dash.updateRestart":`Güncellemeden sonra yeniden başlat`,"dash.updateRestartHint":`Önerilir. Proxy yeniden başlayana kadar mevcut GUI eski kodu çalıştırmaya devam eder.`,"dash.runUpdate":`Güncelle`,"dash.updateReconnecting":`Yeniden başlatılan proxy bekleniyor…`,"dash.updateStatus.running":`opencodex güncelleniyor.`,"dash.updateStatus.restarting":`Güncelleme yüklendi. Proxy yeniden başlatılıyor.`,"dash.updateStatus.succeeded":`Güncelleme tamamlandı.`,"dash.updateVersionTransition":`{currentVersion} -> {latestVersion}.`,"dash.updateStatus.failed":`Güncelleme başarısız oldu.`,"prov.subtitle":`opencodex'in Codex'e yönlendirdiği sağlayıcıları yapılandırın.`,"prov.add":`Sağlayıcı Ekle`,"prov.editJson":`JSON Düzenle`,"prov.accountLogin":`Hesap girişi`,"prov.noOauth":`Kullanılabilir OAuth sağlayıcısı yok.`,"prov.loggedIn":`giriş yapıldı`,"prov.notLoggedIn":`giriş yapılmadı`,"prov.logout":`Çıkış Yap`,"prov.login":`Giriş Yap`,"prov.loginWith":`{provider} ile Giriş Yap`,"prov.waitingBrowser":`Tarayıcı bekleniyor…`,"prov.didntOpen":`Açılmadı mı? Buraya tıklayın`,"prov.copyLink":`Bağlantıyı kopyala`,"prov.dontOpenBrowser":`Proxy makinesinde tarayıcı açma`,"prov.dontOpenBrowserHint":`Farklı bir tarayıcı profili için ya da pano proxy'nin makinesinde değilken kullanışlıdır.`,"prov.linkCopied":`Kopyalandı`,"prov.linkCopyUnavailable":`Pano kullanılamıyor`,"prov.deviceCode":`Cihaz kodu`,"prov.copyCode":`Kodu kopyala`,"prov.codeCopied":`Kod kopyalandı`,"prov.editAlias":`Takma adı düzenle`,"prov.aliasPrompt":`Görüntülenen ad (temizlemek için boş bırakın)`,"prov.aliasSaved":`Takma ad kaydedildi`,"prov.aliasSaveFailed":`Takma ad kaydedilemedi`,"prov.cooldownCleared":`Soğuma süresi temizlendi`,"prov.cooldownClearFailed":`Soğuma süresi temizlenemedi`,"prov.accountId":`ID`,"prov.pasteRedirect":`Yönlendirme URL'sini veya kodu yapıştırın`,"prov.pasteRedirectHint":`Tarayıcı localhost hatası gösterirse adres çubuğundaki URL'yi kopyalayıp buraya yapıştırın.`,"prov.pasteSubmit":`Gönder`,"prov.pasteSubmitting":`Gönderiliyor…`,"prov.pasteOk":`Kod gönderildi — giriş tamamlanıyor…`,"prov.pasteFail":`Kod gönderilemedi: {error}`,"prov.port":`Port`,"prov.default":`Varsayılan`,"prov.loadingConfig":`Yükleniyor…`,"prov.saved":`Kaydedildi! Uygulamak için proxy'yi yeniden başlatın.`,"prov.loadConfigFail":`Konfigürasyon yüklenemedi`,"prov.invalidJson":`Geçersiz JSON`,"prov.saveFailed":`Kaydetme başarısız`,"prov.loginFailStart":`{provider} girişi başlatılamadı`,"prov.loginError":`{provider} giriş hatası: {error}`,"prov.loginRequestFail":`{provider} giriş isteği başarısız oldu`,"prov.loginCancelled":`{provider} girişi iptal edildi`,"prov.loginTimeout":`{provider} girişi zaman aşımına uğradı.`,"prov.loginSameAccount":`Hâlâ aynı {provider} hesabı — tarayıcıda hesap değiştirin, ardından tekrar Hesap Ekle'yi deneyin.`,"prov.loginOk":`{provider} hesabına giriş yapıldı. Modellerini listelemek için {cmd} çalıştırın (veya canlı olarak uygulanır).`,"prov.added":`"{name}" eklendi. Modellerini listelemek için {cmd} çalıştırın (veya canlı olarak uygulanır).`,"oauthTos.highTitle":`{provider}: abonelik OAuth riski`,"oauthTos.elevatedTitle":`{provider}: gayri resmi OAuth köprüsü`,"oauthTos.anthropicBody":`Claude abonelik OAuth jetonlarının OpenCodex gibi üçüncü taraf bir proxy üzerinden doğrudan yeniden kullanılması desteklenen bir Anthropic entegrasyonu değildir ve erişim kısıtlamalarına yol açabilir. Claude aboneliklerini kullanan desteklenen Agent SDK entegrasyonları ayrıdır.`,"oauthTos.highBody":`OpenCodex, {provider} bağlantısını üçüncü taraf bir OAuth yolu üzerinden kurar. Desteklenmeyen kullanım, erişim kısıtlamalarına veya hesabın askıya alınmasına yol açabilir.`,"oauthTos.elevatedBody":`OpenCodex, {provider} bağlantısını resmi olmayan bir OAuth yolu üzerinden kurar. Mümkün olduğunda resmi istemciyi kullanın; sıra dışı veya otomatik trafik kötüye kullanım olarak değerlendirilebilir ve erişim kısıtlanabilir veya askıya alınabilir.`,"oauthTos.saferPath":`Daha güvenli seçenek: OpenCodex'te bir API anahtarı yapılandırın.`,"oauthTos.acknowledge":`Riski anlıyorum ve OAuth ile devam etmek istiyorum.`,"oauthTos.continue":`OAuth ile devam et`,"prov.logoutOk":`{provider} çıkışı yapıldı.`,"prov.logoutFail":`{provider} çıkışı yapılamadı.`,"prov.removed":`"{name}" kaldırıldı.`,"prov.removedDefault":`"{name}" kaldırıldı. Varsayılan sağlayıcı artık "{defaultProvider}".`,"prov.removeFail":`"{name}" kaldırılamadı.`,"prov.removeLastProvider":`Başka etkin sağlayıcı yokken bu sağlayıcıyı kaldıramazsınız.`,"prov.removeHasDependentCombos":`Önce bağımlı komboları kaldırın veya güncelleyin: {combos}.`,"prov.setDefault":`Varsayılan olarak ayarla`,"prov.setDefaultSuccess":`"{name}" artık varsayılan sağlayıcı.`,"prov.setDefaultFail":`"{name}" varsayılan yapılamadı.`,"prov.defaultDisabled":`Varsayılan yapmadan önce bu sağlayıcıyı etkinleştirin.`,"prov.updateFail":`Sağlayıcı güncellenemedi.`,"prov.networkError":`Ağ hatası. Proxy'nin çalıştığını kontrol edin.`,"prov.removeConfirm":`"{name}" sağlayıcısı kaldırılsın mı?`,"prov.hasApiKey":`API anahtarı yapılandırıldı`,"prov.hasHeaders":`özel başlıklar yapılandırıldı`,"prov.accounts":`Hesaplar ({n})`,"prov.accountsAria":`{name} hesaplarını aç/kapat`,"prov.accountActive":`Aktif`,"prov.accountReauth":`Tekrar giriş yap`,"prov.reauthenticate":`Yeniden doğrula`,"prov.reauthAccountMissing":`Seçilen hesap bulunamadı`,"prov.reauthIdentityMismatch":`Giriş yapılan hesap seçilen hesapla eşleşmedi`,"prov.accountAdd":`Hesap ekle`,"prov.accountNoLabel":`hesap {id}`,"prov.accountSwitchTitle":`Bu hesabı kullan`,"prov.accountSwitched":`{email} hesabına geçildi.`,"prov.accountSwitchFail":`Hesap değiştirilemedi`,"prov.accountRemoved":`{email} kaldırıldı.`,"prov.accountRemoveFail":`{email} kaldırılamadı.`,"prov.accountRemoveAria":`{email} hesabını kaldır`,"prov.accountRemoveConfirm":`{email} hesabı kaldırılsın mı?`,"prov.keyAdd":`API anahtarı ekle`,"prov.keyAdded":`{name} için API anahtarı eklendi.`,"prov.keyAddFail":`API anahtarı eklenemedi`,"prov.keyPlaceholder":`API anahtarını yapıştırın`,"prov.keySwitchTitle":`Bu anahtarı kullan`,"prov.keySwitched":`{key} anahtarına geçildi.`,"prov.keySwitchFail":`Anahtar değiştirilemedi`,"prov.keyRemoved":`{key} anahtarı kaldırıldı.`,"prov.keyRemoveAria":`{key} anahtarını kaldır`,"prov.keyRemoveConfirm":`{key} API anahtarı silinsin mi?`,"prov.activeBadge":`Aktif`,"prov.disabledBadge":`Devre Dışı`,"prov.defaultBadge":`Varsayılan`,"prov.enable":`Etkinleştir`,"prov.disable":`Devre Dışı Bırak`,"prov.enabled":`"{name}" etkinleştirildi.`,"prov.disabled":`"{name}" devre dışı bırakıldı.`,"prov.enableFail":`"{name}" etkinleştirilemedi.`,"prov.disableFail":`"{name}" devre dışı bırakılamadı.`,"prov.enableAria":`{name} sağlayıcısını etkinleştir`,"prov.disableAria":`{name} sağlayıcısını devre dışı bırak`,"prov.defaultCannotDisable":`Varsayılan sağlayıcı devre dışı bırakılamaz`,"prov.openaiAccountMode":`Codex hesap modu`,"prov.openaiModePool":`Havuz (Pool)`,"prov.openaiModeDirect":`Doğrudan (Direct)`,"prov.openaiPoolDesc":`Varsayılan. Ana girişi ve eklenen hesapları havuzda döndürür.`,"prov.openaiDirectDesc":`Yalnızca ana Codex girişini kullanır.`,"prov.openaiModeSaved":`OpenAI hesap modu {mode} olarak değiştirildi.`,"prov.openaiModeSaveFailed":`OpenAI hesap modu değiştirilemedi.`,"prov.openaiApiDesc":`OpenAI API anahtarı kullanır.`,"prov.manageCodexAccounts":`Codex hesaplarını yönet`,"prov.openaiApiMissing":`API anahtarı gerekli`,"prov.openaiApiSetup":`API anahtarı ayarla`,"models.tab.catalog":`Modeller`,"models.tab.combos":`Kombolar`,"models.tab.compatibility":`Uyumluluk`,"models.tab.routing":`Yönlendirme (beta)`,"models.tabsLabel":`Model yüzeyleri`,"models.subtitle.combos":`Tek bir kimlik olarak yanıt veren sıralı model grupları.`,"models.subtitle.compatibility":`Lab projeksiyon kanıtından salt okunur uyumluluk matrisi.`,"models.subtitle.routing":`Politika profilleri ve simülasyon değerlendirmesi.`,"models.subtitle":`Codex'in göreceği modelleri açıp kapatın.`,"models.nativeGroupLabel":`Yerel OpenAI`,"models.nativeHint":"Doğrudan geçiş modelleri Sağlayıcılar bölümünde seçilen Havuz veya Doğrudan seçeneğini kullanır. Buradan model eklemek, yeni bir düz passthrough kimliği değil, yönlendirilmiş bir `openai/<model>` seçici kaydeder.","models.active":`{active}/{total} görünür`,"models.workspace.providers":`Sağlayıcılar`,"models.workspace.allProviders":`Tüm sağlayıcılar`,"models.workspace.mainAria":`Model detayları`,"models.allOn":`Tümünü aç`,"models.allOff":`Tümünü kapat`,"models.presetLabel":`Modeller`,"models.presetMode_preset":`Ön ayar`,"models.presetMode_all":`Tümü`,"models.presetMode_custom":`Özel`,"models.presetSummary":`{total} modelden {count} tanesi gösteriliyor — çekirdek ön ayar v{version}`,"models.presetUpdateAvailable":`Ön ayar v{version} mevcut`,"models.presetAppliedToast":`{provider}: ön ayar uygulandı — {count} model seçildi`,"models.presetClearedToast":`{provider}: tüm modeller gösteriliyor`,"models.presetEmpty":`{provider}: ön ayar hiçbir modelle eşleşmedi — seçim değişmedi`,"models.presetConfirmReplace":`Seçiminiz {count} modellik ön ayarla değiştirilsin mi?`,"models.cap350k":`350k Sınırı`,"models.capApplied":`Bağlam sınırı uygulandı.`,"models.capSaveFailed":`Bağlam sınırı kaydedilemedi`,"models.contextCapped":`350k sınırı`,"models.contextCapLabel":`Güvenlik sınırı / yedek`,"models.v2Label":`Alt Ajan`,"models.shadowCallOriginal":`⚠ {models} →`,"models.v2DocsLink":`v1 / v2 nedir?`,"models.v2Mode_v1":`v1`,"models.v2Mode_default":`taban`,"models.v2Mode_v2":`v2`,"models.v2ModeDesc_v1":`Tüm modeller → v1 yüzeyi`,"models.v2ModeDesc_default":`Yukarı akış varsayılanları`,"models.v2ModeDesc_v2":`Tüm modeller → v2 yüzeyi`,"models.keepNativeOnV1":`ChatGPT v1'de kalsın`,"models.keepNativeOnV1Hint":`ChatGPT yerel ebeveynleri v2 çocuk görevlerini şifreler; Grok ve Claude okuyamaz. Sol/Terra yönlendirilmiş modelleri spawn edecekse açık bırakın. Yönlendirilmiş ebeveynler v2'de kalır.`,"models.v2Help":`v1 alt ajanları birincil modelle sınırlandırır; taban standart ajan sınırlarını devralır; v2 tam çoklu ajan orkestrasyonunu etkinleştirir.
66
+
67
+ v2'de ChatGPT v1'de kalsın, Sol/Terra'yı v1'de bırakır; böylece Grok veya Claude spawn edebilirler. ChatGPT v2 çocuk görevlerini şifreler; yönlendirilmiş modeller okuyamaz. Yönlendirilmiş ebeveynler v2'de kalır.
68
+
69
+ Değişiklikler yeni oturumlara uygulanır.`,"dash.multiAgent":`Alt Ajan`,"models.v2Conflict":`[agents] max_threads ayarlanmış — config.toml dosyasından kaldırın`,"models.v2Applied":`Çoklu ajan modu güncellendi. Yeni oturumlar bu modu kullanacaktır; model seçiciyi yenilemek için Codex uygulamasını yeniden başlatın.`,"models.v2ThreadsLabel":`Maksimum iş parçacığı`,"models.v2ThreadsDefault":`varsayılan (4)`,"models.v2ThreadsApplied":`İş parçacığı limiti güncellendi`,"models.v2ThreadsInvalid":`İş parçacığı limiti >= 1 tamsayı olmalıdır`,"models.v2ThreadsApply":`Uygula`,"models.capValue":`Varsayılan {value}`,"models.contextSettings":`Özel pencereler`,"models.contextSettingsTitle":`Özel pencereler — {provider}`,"models.contextDefault":`Güvenlik sınırı / yedek`,"models.contextModel":`Model`,"models.contextModelOverride":`Model geçersiz kılma`,"models.contextHint":`Otomatik keşif için boş bırakın. Buradaki değer bir güvenlik sınırı ve yedektir: eksik bir üst akış penceresini doldurur ve yalnızca daha büyük bildirileni düşürür. Canlı keşif bu alana yazılmaz.`,"models.contextAutomatic":`Otomatik keşif`,"models.contextSaved":`Bağlam pencereleri güncellendi.`,"models.contextUnchanged":`Kaydedilecek bağlam penceresi değişikliği yok.`,"models.contextSaveFailed":`Bağlam pencereleri kaydedilemedi`,"models.contextInvalid":`Bağlam pencereleri pozitif tam sayılar olmalıdır`,"models.contextCappedValue":`{value} sınırı`,"models.contextMetadataSource":`Kaynak`,"models.contextMetadataLive":`tespit`,"models.contextMetadataRegistry":`kayıt`,"models.contextMetadataCursorStatic":`Cursor seçkisi`,"models.contextMetadataSnapshot":`kayıtlı`,"models.contextMetadataFallback":`yedek`,"models.contextMetadataDerived":`türetilmiş`,"models.contextMetadataUnknown":`bilinmiyor`,"models.contextMetadataStale":`eski`,"models.contextTooltipDetected":`{value} · tespit`,"models.contextTooltipCapped":`{detected} tespit · {cap} ile sınırlı`,"models.contextTooltipStale":`{value} · {when}`,"models.contextTooltipUnknown":`Bağlam penceresi bilinmiyor`,"models.contextTooltipSource":`{value} · {source}`,"models.contextLastChecked":`son kontrol {when}`,"models.contextYesterday":`dün`,"models.setAll":`Tümünü ayarla`,"models.setAllHint":`Her yönlendirilen sağlayıcıda {value} varsayılan pencereyi açar. Röle context_window / context_length vermezse bu değer gerçek Codex penceresi olur. Tek bir modeli elle yazmak için aynı satırdaki «Özel pencereler»i kullanın.`,"models.collapseAll":`Tümünü daralt`,"models.expandAll":`Tümünü genişlet`,"models.orderHint":`Seçici sırası: Alt ajan seçimleri → kalan modeller.`,"models.custom":`Özel…`,"models.customApply":`Uygula`,"models.customPlaceholder":`Jetonlar (örn. 420000)`,"models.customAdd":`Özel model ekle`,"models.customAddTitle":`Özel model ekle — {provider}`,"models.customEditTitle":`Özel modeli düzenle — {provider}`,"models.customAdded":`Özel model eklendi`,"models.customUpdated":`Özel model güncellendi`,"models.customDeleted":`Özel model silindi`,"models.customSaveFailed":`Özel model kaydedilemedi`,"models.customSaving":`Kaydediliyor…`,"models.customAddBtn":`Ekle`,"models.customEditBtn":`Güncelle`,"models.customEditNamed":`{name} modelini düzenle`,"models.customDeleteNamed":`{name} modelini sil`,"models.customDeleteConfirm":`{name} modeli silinsin mi?`,"models.customBadge":`Özel`,"models.customSummary":`{count} özel`,"models.customFieldModelId":`Model ID`,"models.customFieldModelIdPlaceholder":`örn. qwen4-max-preview`,"models.customFieldDisplayName":`Görüntülenen ad (isteğe bağlı)`,"models.customFieldDisplayNamePlaceholder":`örn. Qwen 4 Max Preview`,"models.customFieldContext":`Bağlam penceresi`,"models.customFieldModalities":`Girdi türleri`,"models.customFieldReasoning":`Akıl yürütme çabası`,"models.customFieldReasoningOverride":`Akıl yürütme çabasını geçersiz kıl`,"models.reasoningEffort.none":`Yok`,"models.reasoningEffort.minimal":`Minimal`,"models.reasoningEffort.low":`Düşük`,"models.reasoningEffort.medium":`Orta`,"models.reasoningEffort.high":`Yüksek`,"models.reasoningEffort.xhigh":`Çok yüksek`,"models.reasoningEffort.max":`Maksimum`,"models.tipProvider":`Sağlayıcı`,"models.tipContext":`Bağlam`,"models.tipModalities":`Girdi Türleri`,"models.tipStatus":`Durum`,"models.tipActive":`Aktif`,"models.tipDisabled":`Devre Dışı`,"models.applied":`Uygulandı.`,"models.saveFailed":`Kaydetme başarısız`,"models.networkError":`Ağ hatası — proxy çalışıyor mu?`,"models.loadFail":`Modeller yüklenemedi — proxy çalışıyor mu?`,"models.noRouted":`Yönlendirilen model yok`,"models.noRoutedHint":`Önce bir sağlayıcıya giriş yapın veya ekleyin.`,"models.emptyDiscovery":`Keşfedilen model yok.`,"models.emptyDiscoveryDisabled":`Canlı model keşfi kapalı.`,"models.discoveryFailedBadge":`Keşif başarısız`,"models.discoveryFailedHttp":`Model keşfi başarısız oldu (HTTP {status}).`,"models.discoveryFailedBlocked":`Model keşfi engellendi.`,"models.discoveryFailedInvalidResponse":`Model keşfi geçersiz bir yanıt döndürdü.`,"models.discoveryFailedNetwork":`Model keşfi ağ hatası nedeniyle başarısız oldu.`,"models.discoveryFailedProvider":`Sağlayıcı bir model keşfi hatası bildirdi.`,"models.discoveryFailedGeneric":`Model keşfi başarısız oldu.`,"models.openProviderSettings":`Sağlayıcı ayarlarını aç`,"models.loading":`Yükleniyor…`,"models.search":`Modellerde ara…`,"models.showMore":`{n} tane daha göster`,"models.allowlistLabel":`Sadece seçilenler`,"models.allowlistHint":`Sadece işaretli modeller kataloğa gönderilir.`,"models.selectedCount":`{n} seçildi`,"sub.subtitle":`Codex'in {cmd} komutu, geçersiz kılma olarak yalnızca ilk 5 modeli (önceliğe göre) sunar. Buradan 5 taneye kadar seçin (yerel gpt veya yönlendirilen) ve opencodex bunların katalog önceliğini tam olarak bunların liderlik edeceği şekilde ayarlar. Diğer herhangi bir model tam adıyla çağrılabilir kalır; bu yalnızca neyin gösterileceğini kontrol eder.`,"sub.featured":`Öne Çıkarılanlar`,"sub.orderHint":`Burada gösterilen sıralama, Codex model seçicisinin üst kısmındaki 1-5 pozisyonlarını ve {cmd} için varsayılan model adaylarını belirler.`,"sub.noneSelected":`Hiçbiri seçilmedi — aşağıdaki listeden seçin.`,"sub.models":`Modeller`,"sub.search":`Modellerde ara…`,"sub.settings":`Ayarlar`,"sub.sections":`Alt ajan bölümleri`,"sub.delegation.model":`İlk çağrılacak model`,"sub.delegation.modelHint":`Codex'in iş devrederken ilk ulaştığı model.`,"sub.noModels":`Model yok — önce bir sağlayıcı ekleyin.`,"sub.saved":`{n} model kaydedildi. Bunları spawn_agent geçersiz kılmaları olarak görmek için yeni bir Codex oturumu başlatın (veya {cmd} çalıştırın).`,"sub.saveFailed":`Kaydetme başarısız`,"sub.networkError":`Ağ hatası — proxy çalışıyor mu?`,"sub.loadFail":`Modeller yüklenemedi`,"sub.loading":`Yükleniyor…`,"sub.moveUp":`{m} modelini yukarı taşı`,"sub.moveDown":`{m} modelini aşağı taşı`,"sub.removeAria":`{m} modelini kaldır`,"sub.workspace.addToFeatured":`{m} modelini öne çıkarılanlara ekle`,"sub.workspace.allModels":`Tüm modeller`,"sub.workspace.featuredFull":`Öne çıkarılanlar listesi dolu (maksimum 5)`,"sub.workspace.mainAria":`Alt ajan model detayları`,"sub.workspace.notFeatured":`Öne çıkarılmadı`,"sub.workspace.priority":`Öncelik`,"sub.workspace.removeFromFeatured":`{m} modelini öne çıkarılanlardan kaldır`,"sub.workspace.selectModel":`Bir model seçin`,"sub.workspace.selectModelDesc":`Detayları görmek için listeden bir model seçin.`,"sub.workspace.selector":`Genel seçici`,"sub.ultraMode":`Ultra modu`,"sub.ultraModeHint":`Tüm modeller ve reasoning effort için Proactive çoklu ajan delegasyon politikasını etkinleştirir (reasoning effort değerini değiştirmez). config.toml dosyasına features.multi_agent_v2.multi_agent_mode_hint_text yazar.`,"sub.ultraModeV2Required":`v2 çoklu ajan yüzeyi gerekir — önce multi_agent_v2'yi etkinleştirin ve alt ajan modu denetiminde v2'yi seçin.`,"sub.ultraModeText":`Ultra modu delegasyon metni`,"sub.ultraModePreset":`Ön ayarı geri yükle`,"sub.ultraModeLoadFail":`Ultra modu ayarları yüklenemedi — proxy çalışıyor mu?`,"sub.ultraModeSaveFail":`Ultra modu ayarları kaydedilemedi`,"sub.ultraModeSaved":`Ultra modu kaydedildi. Yeni Codex oturumlarına uygulanır.`,"sub.nativeParentOverride":`Yerel V2 üst ajanlarını yönlendir`,"sub.nativeParentOverrideHint":`Codex özgün yerel modeli gösterebilir; OpenCodex ise kökü seçilen yönlendirilmiş hedefte çalıştırır.`,"sub.nativeParentOverridePrivacyWarning":`İstemler, depo bağlamı, konuşma geçmişi ve araç sonuçları seçilen sağlayıcıya gider; sağlayıcının kullanılabilirlik, bağlam, gecikme, davranış, maliyet ve gizlilik özelliklerini devralır.`,"sub.nativeParentOverrideModel":`Yerel üst ajan hedef modeli`,"sub.nativeParentOverrideV2Required":`Açık V2, üst akış V2 bayrağı ve ‘ChatGPT’yi v1’de tut’ seçeneğinin kapalı olması gerekir.`,"sub.nativeParentOverrideSaveFail":`Yerel üst ajan yönlendirmesi kaydedilemedi`,"sub.nativeParentOverrideSaved":`Yerel üst ajan yönlendirmesi kaydedildi. Sonraki üst ajan turlarına ve sıkıştırmaya uygulanır.`,"sub.agentTaskRecovery":`Şifreli V2 Görevlerini Kurtar`,"sub.agentTaskRecoveryHint":`OpenAI Fernet şifreli görev iletilerini ChatGPT aracılığıyla çözerek OpenAI dışı alt ajanların yönlendirilen V2 görevlerini okuyup yürütmesini sağlar.`,"sub.agentTaskRecoveryModel":`Kurtarma modeli (varsayılan: gpt-5.6-luna)`,"sub.agentTaskRecoverySaveFail":`Şifreli görev kurtarma kaydedilemedi`,"sub.agentTaskRecoverySaved":`Şifreli görev kurtarma ayarı kaydedildi.`,"sub.roles":`Roller`,"sub.roles.hint":`Ebeveynin spawn edebileceği adlı uzmanlar. Her rol bir model ve çocuk istemini sabitler. Yetki devrine ebeveyn karar verir.`,"sub.roles.add":`Rol ekle`,"sub.roles.empty":`Henüz rol yok. İnceleme, arama veya başka yetki devri için bir uzman ekleyin.`,"sub.roles.full":`Rol kataloğu dolu (en fazla 8)`,"sub.roles.id":`Rol adı`,"sub.roles.description":`Ne zaman kullanılır`,"sub.roles.descriptionHint":`Ebeveynin bu uzmanı ne zaman spawn edeceğini bilmesi için gösterilir.`,"sub.roles.model":`Model`,"sub.roles.effort":`Efor`,"sub.roles.effortNone":`Model varsayılanı`,"sub.roles.instructions":`Çocuk yönergeleri`,"sub.roles.instructionsHint":`Çocuk aracının yüklediği geliştirici istemi.`,"sub.roles.enabled":`Etkin`,"sub.roles.delete":`{id} rolünü sil`,"sub.roles.save":`Rolleri kaydet`,"sub.roles.saved":`Roller kaydedildi. Yeni Codex oturumlarına uygulanır.`,"sub.roles.saveFailed":`Roller kaydedilemedi`,"sub.roles.loadFail":`Roller yüklenemedi — vekil çalışıyor mu?`,"sub.roles.routedV2Warning":`Bu rol, ChatGPT’yi v1’de tutmadan v2 yüzeyinde yönlendirilmiş bir model kullanıyor. Yerel v2 ebeveynler çocuk görevlerini şifreler.`,"sub.roles.sync":`Codex aracı dosyalarına eşitle`,"sub.roles.syncHint":`Etkin rolleri işaretli ocx-*.toml dosyalarına yazar. Kapalıyken OpenCodex dosyalarını budar, sizinkilere dokunmaz.`,"sub.injectionPrompt":`Özel ebeveyn rehberi`,"sub.injectionPromptHint":`Yerleşik v2 spawn metnini değiştirir. Boş bırakırsanız yerleşik metin kullanılır. Canlı değerler için yer tutucuları ekleyin:`,"sub.injectionPromptSave":`Ebeveyn rehberini kaydet`,"sub.injectionPromptSaved":`Ebeveyn rehberi kaydedildi. Yeni Codex oturumlarına uygulanır.`,"sub.injectionPromptSaveFailed":`Ebeveyn rehberi kaydedilemedi`,"sub.childInstructions":`Küresel çocuk yönergeleri`,"sub.childInstructionsHint":`Spawn edilen her çocuğa uygulanır. Rol yönergeleri eşitlenince yalnızca o uzmana uygulanır.`,"sub.childInstructionsSave":`Çocuk yönergelerini kaydet`,"sub.childInstructionsSaved":`Çocuk yönergeleri kaydedildi. Yeni Codex oturumlarına uygulanır.`,"sub.childInstructionsSaveFailed":`Çocuk yönergeleri kaydedilemedi`,"logs.title":`İstek Günlükleri`,"logs.tabLogs":`Günlükler`,"logs.tabDebug":`Hata Ayıklama`,"logs.subtitle":`Proxy üzerinden yönlendirilen son istekler.`,"logs.autoRefresh":`Otomatik yenile`,"logs.noRequests":`Henüz istek yok.`,"logs.loadError":`İstek günlükleri yüklenemedi.`,"logs.filter.surface.label":`Yüzey`,"logs.filter.surface.all":`Tümü`,"logs.filter.surface.claude":`Claude`,"logs.filter.surface.codex":`Codex`,"logs.filter.surface.grok":`Grok`,"logs.filter.interceptedHelpersOnly":`Yalnizca yakalanan yardimcilar`,"logs.filter.model.label":`Model`,"logs.filter.model.all":`Tüm modeller`,"logs.filter.provider.label":`Sağlayıcı`,"logs.filter.provider.all":`Tüm sağlayıcılar`,"logs.filter.status.label":`Durum`,"logs.filter.status.all":`Tüm durumlar`,"logs.filter.status.success":`Başarılı (2xx)`,"logs.filter.status.errors":`Hatalar (4xx/5xx)`,"logs.filter.time.label":`Zaman`,"logs.filter.time.all":`Tüm zamanlar`,"logs.filter.time.15m":`Son 15 dk`,"logs.filter.time.1h":`Son 1 sa`,"logs.filter.time.24h":`Son 24 sa`,"logs.filter.speed.label":`Hız`,"logs.filter.speed.all":`Tüm hızlar`,"logs.filter.speed.slow":`< 15 tok/s`,"logs.filter.speed.medium":`15–50 tok/s`,"logs.filter.speed.fast":`> 50 tok/s`,"logs.filter.reset":`Filtreleri sıfırla`,"logs.filter.showingCount":`{total} kayıttan {count} tanesi gösteriliyor`,"logs.badge.interceptedHelper":`I · {model}`,"logs.badge.interceptedHelperTitle":`Yakalanan yardimci istegi`,"logs.filter.conversation.label":`Sohbet`,"logs.filter.conversation.placeholder":`Sohbet ID'sini yapıştırın`,"logs.filter.conversation.clear":`Temizle`,"logs.filter.conversation.apply":`Günlükleri filtrele`,"logs.conversation.totals":`{requests} istek · {tokens} jeton · {cost}`,"logs.conversation.scope":`Toplamlar yalnızca yüklü günlükleri kapsar.`,"logs.conversation.excluded":`({unpriced} fiyatlandırılmamış, {unmetered} ölçülmemiş hariç)`,"logs.cost.approximate":`yaklaşık {amount}`,"logs.cost.lowerBound":`en az {amount}`,"logs.cost.unavailable":`kullanılamıyor`,"logs.detail.conversation":`Sohbet`,"logs.badge.claude":`Claude`,"logs.badge.grok":`Grok`,"logs.col.time":`Zaman`,"logs.col.request":`İstek`,"logs.col.model":`Model`,"logs.col.effort":`Çaba`,"logs.col.provider":`Sağlayıcı`,"logs.col.status":`Durum`,"logs.col.tokens":`Jetonlar`,"logs.col.tokPerSec":`jeton/sn`,"logs.col.estimatedCost":`~$`,"logs.metric.tokPerSecTitle":`Çıktı jetonu / saniye`,"logs.metric.estimatedCostTitle":`Tahmini API liste fiyatı`,"usage.cost.total":`API liste fiyatı eşdeğeri`,"usage.cost.disclaimer":`Fatura makbuzu değildir.`,"usage.cost.unpricedNote":`{count} istek hariç tutuldu`,"logs.detail.section.basic":`Temel bilgiler`,"logs.detail.route.section":`Yönlendirme kararı`,"logs.detail.route.kind":`Yönlendirme türü`,"logs.detail.route.profile":`Profil`,"logs.detail.route.selected":`Seçilen`,"logs.detail.route.candidates":`Adaylar`,"logs.detail.route.unknown":`Kayıtlı yönlendirme izi yok.`,"logs.detail.section.performance":`Performans`,"logs.detail.section.cost":`Tahmini maliyet`,"logs.detail.section.attempts":`Kombo denemeleri`,"logs.detail.section.usage":`Ham kullanım`,"logs.detail.ttft":`TTFT`,"logs.detail.costTotal":`Liste fiyatı eşdeğeri`,"logs.detail.totalTokens":`Toplam jeton`,"logs.detail.matchedKey":`Eşleşen anahtar`,"logs.detail.priceSource":`Fiyat kaynağı`,"logs.detail.unavailableReason":`Kullanılamama nedeni`,"logs.detail.copyRequestId":`İstek ID kopyala`,"logs.detail.copied":`Kopyalandı`,"logs.detail.source.jawcode":`katalog`,"logs.detail.source.expected":`Beklenen fiyat`,"logs.detail.source.user":`Kullanıcı tarafından yapılandırılan sağlayıcı fiyat katmanı`,"logs.detail.verification.verified":`Doğrulandı`,"logs.detail.verification.derived":`Taban modelden türetildi`,"logs.detail.attempt.target":`Sağlayıcı / model`,"logs.detail.attempt.reason":`Sonuç / neden`,"logs.detail.attempt.completed":`Tamamlandı`,"logs.detail.attempt.e2eNote":`Süreç bilgisi`,"logs.detail.attempt.recovery.transient5xx":`Geçici 5xx`,"logs.detail.attempt.recovery.connectionReset":`Bağlantı sıfırlandı`,"logs.detail.attempt.recovery.oauth401":`OAuth yeniden doğrulaması`,"logs.detail.attempt.recovery.key429":`Anahtar oranı kısıtlandı (429)`,"logs.detail.attempt.recovery.rateLimit429":`Oran kısıtlandı (429)`,"logs.detail.attempt.recovery.anthropicOauth429":`Anthropic OAuth kısıtlandı (429)`,"logs.detail.attempt.recovery.image413":`Görsel boyutu çok büyük (413)`,"logs.detail.attempt.recovery.emptyCompletion":`Boş tamamlama yeniden denemesi`,"logs.detail.attempt.recovery.unknown":`Bilinmeyen kurtarma nedeni`,"logs.detail.reason.usage_missing":`Kullanım bildirilmedi.`,"logs.detail.reason.usage_unsupported":`Bu sağlayıcı kullanım bildirmeyebilir.`,"logs.detail.reason.output_missing":`Çıktı jeton sayısı bildirilmedi.`,"logs.detail.reason.invalid_duration":`İstek süresi geçersiz.`,"logs.detail.reason.price_unmatched":`Eşleşen fiyat bulunamadı.`,"logs.detail.reason.invalid_cache_breakdown":`Önbellek detayları çakışıyor.`,"logs.detail.reason.invalid_usage":`Kullanım geçersiz bir jeton değeri içeriyor.`,"logs.detail.reason.combo_attempt_unavailable":`Kombo denemesi fiyatlandırılamadı.`,"logs.detail.estimate.usage_estimated":`Sağlayıcı kullanımı tahminidir.`,"logs.detail.estimate.cache_detail_missing":`Önbellek detayları eksik.`,"logs.detail.estimate.expected_price_overlay":`Doğrulanmış liste fiyatı kullanıldı.`,"logs.detail.estimate.provider_cost_overlay":`Kullanıcı tarafından yapılandırılan bir sağlayıcı fiyat katmanı kullanıldı.`,"logs.detail.estimate.priority_lower_bound":`Doğrulanan Priority fiyatı kullanılamıyor; gösterilen tahmin bilinen bir alt sınırdır.`,"logs.col.error":`Hata`,"logs.col.upstreamReason":`Yukarı akış nedeni`,"logs.col.duration":`Süre`,"logs.modelTooltip.model":`model`,"logs.modelTooltip.resolvedModel":`çözümlenen model`,"logs.modelTooltip.requestedTier":`istenen katman`,"logs.modelTooltip.configuredTier":`yapılandırılan katman`,"logs.modelTooltip.responseTier":`yanıt katmanı`,"logs.modelTooltip.supportsTier":`katman desteği`,"logs.tokens.reported":`bildirilen`,"logs.tokens.unreported":`bildirilmeyen`,"logs.tokens.unsupported":`desteklenmeyen`,"logs.tokens.estimated":`tahmini`,"logs.tokens.input":`girdi`,"logs.tokens.output":`çıktı`,"logs.tokens.cacheRead":`önbellek okuma`,"logs.tokens.cacheWrite":`önbellek yazma`,"logs.tokens.reasoning":`akıl yürütme`,"logs.tokens.noCache":`önbellek verisi yok`,"logs.tokens.contextTotal":`aktif bağlam`,"logs.tokens.noCacheNote":`bu sağlayıcı önbellek jetonlarını bildirmiyor`,"logs.tokens.noCacheCursor":`Cursor önbellek detayı bildirilmedi`,"logs.tokens.noCacheCursorNote":`Cursor önbellek jeton sayılarını sunmaz`,"logs.tokens.estimatedNote":`tahmini kullanım`,"logs.details":`Detaylar`,"logs.detailTitle":`İstek detayları`,"logs.detailRaw":`Ham günlük kaydı`,"debug.title":`Hata Ayıklama`,"debug.subtitle":`Sağlayıcı taşıma ve kullanım çıkarma tanılamaları.`,"debug.debug":`Sağlayıcı hata ayıklama`,"debug.usage":`Kullanım çıkarma`,"debug.injection":`Enjeksiyon günlüğü`,"debug.claude":`Claude gelen istekler`,"debug.claudeInbound.title":`Claude gelen istekleri`,"debug.claudeInbound.sub":`Claude Code/Desktop tarafından gönderilen istekler.`,"debug.claudeInbound.empty":`Henüz istek yakalanmadı.`,"debug.claudeInbound.time":`Zaman`,"debug.claudeInbound.endpoint":`Uç nokta`,"debug.claudeInbound.model":`Model`,"debug.claudeInbound.none":`yok`,"debug.reset":`Sıfırla`,"debug.refresh":`Yenile`,"debug.follow":`Takip Et`,"debug.streamProvider":`Sağlayıcı`,"debug.streamUsage":`Kullanım`,"debug.streamInjection":`Enjeksiyon`,"debug.loading":`Ayarlar yükleniyor…`,"debug.loadFailed":`Ayarlar yüklenemedi.`,"debug.emptyTitle":`Hata ayıklama günlüğü kapalı`,"debug.empty":`Hata ayıklama seçeneğini açın.`,"debug.noLinesTitle":`Satırlar bekleniyor`,"debug.noLines.provider":`Sağlayıcı hata ayıklama açık.`,"debug.noLines.usage":`Kullanım çıkarma açık.`,"debug.noLines.injection":`Enjeksiyon günlüğü açık.`,"usage.title":`Kullanım`,"usage.subtitle":`Proxy'nizden yerel jeton muhasebesi.`,"usage.loading":`Kullanım verileri yükleniyor…`,"usage.empty":`Henüz kullanım kaydedilmedi.`,"usage.loadError":`Kullanım verileri yüklenemedi.`,"usage.range.all":`Tümü`,"usage.range.available":`Mevcut geçmiş`,"usage.historyTruncated":`Toplamlar yalnızca mevcut geçmişi kapsar.`,"usage.historyTruncatedWindow":`Yüklenen satırların istek başlangıç zamanları {start} ile {end} arasındadır. Dosyanın önceki kayıtları okuma sınırı nedeniyle atlandı, bu yüzden seçilen aralık eksik olabilir.`,"usage.range.30d":`30 gün`,"usage.range.7d":`7 gün`,"usage.card.requests":`İstekler`,"usage.card.measured":`Ölçülen`,"usage.card.reported":`Bildirilen`,"usage.card.totalTokens":`Toplam jeton`,"usage.card.cachedTokens":`Önbellek okuma`,"usage.card.cachedTokensHint":`Sağlayıcı önbelleğinden sunulan jetonlar.`,"usage.card.cacheWriteTokens":`önbellek yazma`,"usage.card.coverage":`Kapsam`,"usage.card.activeDays":`Aktif günler`,"usage.section.heatmap":`Günlük aktivite`,"usage.section.overview":`Genel bakış`,"usage.section.models":`Modeller`,"usage.section.providers":`Sağlayıcılar`,"usage.section.coverage":`Kapsam dağılımı`,"usage.workspace.report":`Kullanım raporu`,"usage.workspace.sections":`Kullanım bölümleri`,"usage.coverage.measured":`Ölçülen`,"usage.coverage.reported":`Bildirilen`,"usage.coverage.estimated":`Tahmin edilen`,"usage.coverage.note":`Ölçülen girdiler bildirilen ve tahmin edilen jeton sayılarını içerir.`,"usage.search.models":`Modellerde ara…`,"usage.col.requests":`İstekler`,"usage.col.measured":`Ölçülen`,"usage.col.reported":`Bildirilen`,"usage.col.tokens":`Jetonlar`,"usage.col.share":`Pay`,"usage.heatmap.less":`Daha az`,"usage.heatmap.more":`Daha fazla`,"usage.dayMon":`Pzt`,"usage.dayWed":`Çar`,"usage.dayFri":`Cum`,"usage.heatmap.tooltipTokens":`{tokens} jeton`,"usage.heatmap.tooltipRequests":`{requests} istek`,"usage.chart.dayDetail":`{date}: {requests} istek, {tokens} jeton`,"usage.heatmap.keyboardLabel":`Gün gün ilerlemek için Yukarı ve Aşağı, hafta hafta ilerlemek için Sol ve Sağ tuşlarını kullanın.`,"nav.storage":`Depolama`,"storage.title":`Depolama`,"storage.subtitle":`CODEX_HOME dizinini nelerin kullandığını görün.`,"storage.loading":`Depolama taranıyor…`,"storage.empty":`CODEX_HOME boş veya eksik.`,"storage.error":`Depolama taraması başarısız oldu.`,"storage.refresh":`Yeniden tara`,"storage.rescanned":`Tarama tamamlandı.`,"storage.card.total":`Toplam boyut`,"storage.card.files":`Dosyalar`,"storage.card.home":`CODEX_HOME`,"storage.snapshot.lastScan":`Son tarama`,"storage.snapshot.scanning":`Taranıyor…`,"storage.snapshot.unavailable":`Henüz tarama yok.`,"storage.cleanupCard.title":`Alan açın`,"storage.cleanupCard.tabs":`Temizleme seçenekleri`,"storage.cleanupCard.tab.policy":`Politika`,"storage.cleanupCard.tab.quarantine":`Karantina`,"storage.cleanup.noArchives":`Temizlenecek arşivlenmiş oturum yok.`,"storage.section.buckets":`Kovalar`,"storage.section.largest":`En büyük dosyalar`,"storage.workspace.overview":`Genel Bakış`,"storage.workspace.selectBucket":`Ayrıntıları görmek için listeden bir kova seçin.`,"storage.col.bucket":`Kova`,"storage.col.size":`Boyut`,"storage.col.files":`Dosyalar`,"storage.col.oldest":`En eski`,"storage.col.newest":`En yeni`,"storage.col.rows":`DB satırları`,"storage.rows.unknown":`bilinmiyor (kilitli)`,"storage.bucket.sessions":`Aktif oturumlar`,"storage.bucket.archived_sessions":`Arşivlenmiş oturumlar`,"storage.bucket.logs_db":`Günlük veritabanı`,"storage.bucket.state_db":`Durum veritabanı`,"storage.bucket.attachments":`Eklentiler`,"storage.bucket.deletion_manifests":`Silme bildirimleri`,"storage.bucket.other":`Diğer`,"storage.cleanup.title":`Arşiv temizleme`,"storage.cleanup.help":`En eski arşivlenmiş oturumları yüzdeye göre kaldırın.`,"storage.cleanup.slider":`En eski arşivlenen yüzde`,"storage.cleanup.percent":`%{percent}`,"storage.cleanup.preset":`{percent}`,"storage.cleanup.preview":`Önizleme`,"storage.cleanup.confirmTitle":`Arşiv temizliğini onayla`,"storage.cleanup.confirmBody":`Toplam ~{size} tutan {count} arşivlenmiş oturum dosyası silinsin mi (%{percent} eşiği)?`,"storage.cleanup.moreFiles":`…ve {n} tane daha`,"storage.cleanup.permanent":`Kalıcı olarak sil (karantinayı atla)`,"storage.cleanup.permanentWarn":`Kalıcı silme geri alınamaz.`,"storage.cleanup.quarantineNote":`Dosyalar CODEX_HOME/.trash altına taşınır.`,"storage.cleanup.cancel":`İptal`,"storage.cleanup.confirmQuarantine":`Karantinaya Al`,"storage.cleanup.confirmPermanent":`Kalıcı Olarak Sil`,"storage.cleanup.doneQuarantine":`{count} dosya karantinaya alındı ({size}).`,"storage.cleanup.donePermanent":`{count} dosya kalıcı olarak silindi ({size}).`,"storage.cleanup.previewFailed":`Önizleme başarısız oldu.`,"storage.cleanup.cleanupFailed":`Temizleme başarısız oldu.`,"storage.cleanup.err.codex_busy":`Codex state.sqlite dosyasını kullanıyor.`,"storage.cleanup.err.stale_preview":`Önizlemeden sonra arşivlenmiş dosyalar değişti.`,"storage.cleanup.err.restore_pending_overlap":`Seçilen arşivler tamamlanmamış bir geri yükleme ile çakışıyor.`,"storage.cleanup.err.referenced_history":`Seçilen arşivler hâlâ geçmiş tarafından referans gösteriliyor.`,"storage.cleanup.err.invalid_digest":`Önizleme özeti eksik veya geçersiz.`,"storage.cleanup.err.invalid_mode":`Temizleme modu karantina veya kalıcı olmalıdır.`,"storage.cleanup.err.fs_failed":`Dosya sistemi temizliği başarısız oldu. Bazı dosyalar başarısızlıktan önce taşınmış olabilir; CODEX_HOME/.trash veya hedef dizini inceleyin.`,"storage.cleanup.err.fs_failed_trash":`{trashDir} için çöp kutusu işlemi başarısız oldu.`,"storage.cleanup.err.db_reconcile_failed":`Codex durum veritabanı güncellenemedi.`,"storage.cleanup.err.cleanup_failed":`Temizleme başarısız oldu.`,"storage.trash.title":`Karantina`,"storage.trash.help":`CODEX_HOME/.trash altına taşınan arşivlenmiş oturumlar.`,"storage.trash.empty":`Karantinaya alınmış öğe yok.`,"storage.trash.loading":`Karantina yükleniyor…`,"storage.trash.col.when":`Karantinaya Alındı`,"storage.trash.col.files":`Dosyalar`,"storage.trash.col.size":`Boyut`,"storage.trash.col.mode":`Mod`,"storage.trash.col.id":`Girdi`,"storage.trash.restore":`Geri Yükle`,"storage.trash.confirmTitle":`Karantina girdisi geri yüklensin mi?`,"storage.trash.confirmBody":`{id} kimliğinden {count} dosya (~{size}) geri yüklensin mi?`,"storage.trash.cancel":`İptal`,"storage.trash.confirmRestore":`Geri Yükle`,"storage.trash.done":`{count} dosya geri yüklendi ({size}).`,"storage.trash.restoreFailed":`Geri yükleme başarısız oldu.`,"storage.trash.listFailed":`Karantina girdileri listelenemedi.`,"storage.trash.mode.quarantine":`karantina`,"storage.trash.mode.permanent":`kalıcı (tamamlanmamış)`,"storage.trash.err.codex_busy":`Codex state.sqlite dosyasını kullanıyor.`,"storage.trash.err.invalid_trash":`Çöp girdisi ID'si eksik veya geçersiz.`,"storage.trash.err.missing_trash":`Çöp girdisi bulunamadı.`,"storage.trash.err.dest_exists":`Geri yükleme hedefi zaten mevcut.`,"storage.trash.err.fs_failed":`Dosya sistemi geri yüklemesi başarısız oldu.`,"storage.trash.err.db_reconcile_failed":`Veritabanı satırları geri yüklenemedi.`,"storage.trash.err.storage_mutation_busy":`Başka bir depolama eylemi devam ediyor.`,"storage.trash.err.restore_failed":`Geri yükleme başarısız oldu.`,"storage.trash.err.restore_worker_timeout":`Geri yükleme çok uzun sürdü.`,"storage.trash.err.restore_worker_aborted":`Geri yükleme iptal edildi.`,"storage.trash.err.restore_worker_failed":`Geri yükleme işleyicisi çöktü.`,"storage.policy.title":`Otomatik temizleme politikası`,"storage.policy.help":`İsteğe bağlı toplu temizleme politikası.`,"storage.policy.loading":`Politika yükleniyor…`,"storage.policy.loadFailed":`Temizleme politikası yüklenemedi.`,"storage.policy.saveFailed":`Temizleme politikası kaydedilemedi.`,"storage.policy.runFailed":`Politika çalıştırması başarısız oldu.`,"storage.policy.alreadyRunning":`Bir politika çalıştırması zaten devam ediyor.`,"storage.policy.invalid":`Geçersiz politika değerleri.`,"storage.policy.enabled":`Otomatik temizlemeyi etkinleştir`,"storage.policy.enabledHint":`Varsayılan olarak kapalıdır.`,"storage.policy.threshold":`Arşivlenen boyut aşıldığında (GiB)`,"storage.policy.trigger":`Tetikleyici`,"storage.policy.target":`Temizleme hedefi`,"storage.policy.targetPercent":`En eski arşivlenenleri kaldır (%)`,"storage.policy.targetReduce":`Arşiv boyutunu düşür (GiB)`,"storage.policy.thresholdInc":`Eşiği artır`,"storage.policy.thresholdDec":`Eşiği azalt`,"storage.policy.percentInc":`Yüzdeyi artır`,"storage.policy.percentDec":`Yüzdeyi azalt`,"storage.policy.reduceInc":`Hedef boyutu artır`,"storage.policy.reduceDec":`Hedef boyutu azalt`,"storage.policy.schedule":`Zamanlama`,"storage.policy.schedule.manual":`Yalnızca manuel`,"storage.policy.schedule.startup":`Proxy başlangıcında`,"storage.policy.schedule.daily":`Günlük`,"storage.policy.schedule.weekly":`Haftalık`,"storage.policy.mode":`Silme modu`,"storage.policy.mode.quarantine":`Karantina (varsayılan)`,"storage.policy.mode.permanent":`Kalıcı silme`,"storage.policy.permanentWarn":`Kalıcı mod geri alınamaz.`,"storage.policy.lastRun":`Son çalıştırma`,"storage.policy.lastRunDetail":`{count} kaldırıldı · {size} alan açıldı`,"storage.policy.nextRun":`Sonraki çalıştırma`,"storage.policy.never":`Hiçbir zaman`,"storage.policy.save":`Kaydet`,"storage.policy.runNow":`Şimdi çalıştır`,"storage.policy.running":`Çalıştırılıyor…`,"storage.policy.saved":`Politika kaydedildi.`,"storage.policy.skippedDisabled":`Politika devre dışı.`,"storage.policy.skippedUnder":`Arşiv boyutu eşiğin altında.`,"storage.policy.skippedEmpty":`Hedefle eşleşen aday yok.`,"storage.policy.doneQuarantine":`Politika {count} dosyayı karantinaya aldı ({size}).`,"storage.policy.donePermanent":`Politika {count} dosyayı kalıcı olarak sildi ({size}).`,"modal.addNamed":`Ekle: {label}`,"modal.add":`Sağlayıcı ekle`,"modal.catalogTabs":`Sağlayıcı kategorileri`,"modal.searchLabel":`Sağlayıcı ara`,"modal.search":`Sağlayıcılarda ara…`,"modal.logInWith":`{label} ile giriş yap`,"modal.waitingBrowser":`Tarayıcı bekleniyor…`,"modal.providerName":`Sağlayıcı adı`,"modal.adapter":`Adaptör`,"modal.baseUrl":`Taban URL`,"modal.endpoint":`Uç nokta`,"modal.endpoint.tokenPlan":`Jeton planı`,"modal.endpoint.payAsYouGo":`Kullandıkça öde`,"modal.endpoint.custom":`Özel`,"modal.defaultModel":`Varsayılan model (isteğe bağlı)`,"modal.allowPrivateNetwork":`Yerel/özel ağa izin ver`,"modal.allowPrivateNetworkHint":`Yalnızca yerel barındırılan sağlayıcılar için etkinleştirin.`,"modal.nameRequired":`Sağlayıcı adı gereklidir`,"modal.baseUrlRequired":`Taban URL gereklidir`,"modal.networkError":`Ağ hatası — proxy çalışıyor mu?`,"modal.loginFailStart":`Giriş başlatılamadı`,"modal.waitingLogin":`Tarayıcı girişi bekleniyor…`,"modal.loggingIn":`Giriş yapılıyor…`,"modal.loginTimeout":`Giriş zaman aşılanına uğradı.`,"modal.back":`Geri`,"modal.badge.oauth":`OAuth`,"modal.customProvider":`Özel sağlayıcı`,"replitGateway.title":`Replit ağ geçidi yardımcısı`,"replitGateway.subtitle":`Kendi dağıttığınız Replit ağ geçidine bağlanın ve eşleşen OpenAI Chat ile Anthropic sağlayıcılarını birlikte kurun.`,"replitGateway.companionNote":`Bu, kanonik bir kayıt ön ayarı değil, özel bir yardımcı iş akışıdır.`,"replitGateway.originLabel":`Dağıtım origin'i`,"replitGateway.originHint":`Replit dağıtımınızın HTTPS origin'i (örneğin https://my-app.replit.app).`,"replitGateway.keyLabel":`Ağ geçidi anahtarı`,"replitGateway.keyHint":`Dağıtımınızdaki REPLIT_GATEWAY_KEY gizli değeri. Yerel sağlayıcı yapılandırmanızda saklanır ve ağ geçidi trafiğini doğrulamak için kullanılır.`,"replitGateway.keyTooShort":`Ağ geçidi anahtarı çok kısa (en az 32 karakter).`,"replitGateway.keyTooLong":`Ağ geçidi anahtarı en fazla 512 karakter olabilir.`,"replitGateway.keyInvalidChars":`Ağ geçidi anahtarı yalnızca yazdırılabilir ASCII karakterler içermelidir.`,"replitGateway.errorNetwork":`Proxy'ye ulaşılamadı. Çalıştığını doğrulayıp tekrar deneyin.`,"replitGateway.errorMalformed":`Proxy geçersiz bir yanıt döndürdü. Kısa süre sonra tekrar deneyin.`,"replitGateway.customDomainLabel":`Özel etki alanına izin ver`,"replitGateway.customDomainHint":`Yalnızca ağ geçidiniz .replit.app üzerinde barındırılmıyorsa etkinleştirin.`,"replitGateway.setDefaultLabel":`Kurulumdan sonra replit'i varsayılan sağlayıcı yap`,"replitGateway.install":`Eşi kur`,"replitGateway.installing":`Kuruluyor…`,"replitGateway.close":`Kapat`,"replitGateway.openButton":`Replit ağ geçidi…`,"replitGateway.replaceTitle":`Mevcut Replit eşi değiştirilsin mi?`,"replitGateway.replaceBody":`replit ve replit-anthropic sağlayıcıları zaten var. Değiştirmek ağ geçidi origin'ini ve anahtarını üzerine yazar; katmanlarınız korunur.`,"replitGateway.replaceConfirm":`Eşi değiştir`,"replitGateway.replaceCancel":`Mevcut olanı koru`,"replitGateway.probeHealth":`healthz: HTTP {status} ({ms} ms)`,"replitGateway.probeModels":`models: {count} bulundu ({ms} ms)`,"replitGateway.successTitle":`Replit ağ geçidi eşi kuruldu.`,"replitGateway.errorGeneric":`Replit ağ geçidi eşi kurulamadı.`,"replitGateway.errorCollision":`Replit sağlayıcı eşi zaten mevcut.`,"replitGateway.errorBusy":`Yapılandırma meşgul. Kısa süre sonra tekrar deneyin.`,"replitGateway.originRequired":`Dağıtım origin'i gerekli.`,"replitGateway.keyRequired":`Ağ geçidi anahtarı gerekli.`,"modal.failedStatus":`Başarısız ({status})`,"modal.loginError":`Giriş hatası: {error}`,"modal.badge.codexLogin":`Codex girişi`,"modal.badge.local":`Yerel`,"modal.badge.apiKey":`API anahtarı`,"modal.badge.direct":`Doğrudan`,"modal.badge.pool":`Havuz`,"modal.badge.free":`Ücretsiz`,"modal.invalidPreset":`Bu yerleşik sağlayıcı ayarı eksik.`,"modal.freeTierTitle":`Ücretsiz katman`,"modal.freeTierDefault":`API anahtarı gerekmez. Doğrudan çalışır.`,"modal.tab.accounts":`Hesaplar`,"modal.tab.free":`Ücretsiz`,"modal.tab.paid":`Ücretli`,"modal.accountsHint":`ChatGPT/Codex ve OAuth hesaplarına buradan giriş yapın.`,"modal.accountsCodexAuthLink":`Codex Kimlik Doğrulaması`,"modal.notListed":`Sağlayıcı listede yok mu? Özel sağlayıcı ekleyin`,"modal.catalogLoading":`Katalog yükleniyor…`,"modal.catalogLoadFailed":`Sağlayıcı kataloğu yüklenemedi.`,"modal.accountLogin":`Giriş yap`,"modal.accountLogout":`Çıkış yap`,"modal.accountAdd":`Hesap ekle`,"modal.accountManage":`Yönet`,"modal.accountCodexPool":`ChatGPT hesap havuzu`,"modal.accountLoggedIn":`Giriş yapıldı`,"modal.accountLoggedOut":`Giriş yapılmadı`,"quota.fiveHourLimit":`5 saatlik limit`,"quota.weeklyLimit":`Haftalık limit`,"quota.monthlyLimit":`30 günlük limit`,"quota.cursorFirstParty":`Birinci taraf modeller`,"quota.cursorApiUsage":`API kullanımı`,"quota.totalSubscriptionCredits":`Toplam abonelik kredileri`,"quota.creditsBalance":`Kredi bakiyesi`,"quota.creditsPeriodEnds":`Faturalandırma dönemi {date} tarihinde sona erer`,"quota.usedPercent":`%{pct} kullanıldı`,"quota.limitReached":`Limite ulaşıldı`,"quota.resetsToday":`Bugün {time} saatinde sıfırlanır`,"quota.resetsTomorrow":`Yarın {time} saatinde sıfırlanır`,"quota.resetsAt":`{when} sıfırlanır`,"quota.resetsRelativeMinutes":`{n} dakika içinde sıfırlanır`,"quota.resetsRelativeHours":`{n} saat içinde sıfırlanır`,"pws.status.ready":`Hazır`,"pws.status.needsSetup":`Kurulum gerekiyor`,"pws.status.needsAttention":`Dikkat gerekiyor`,"pws.auth.chatgptPassthrough":`ChatGPT doğrudan geçiş`,"pws.auth.noKey":`Anahtar gerekmiyor`,"pws.freeTitle":`Ücretsiz fiyatlandırma`,"pws.localTitle":`Yerel çalışma zamanı`,"pws.modelCountOne":`1 model`,"pws.modelCount":`{count} model`,"pws.rail.suffixDefault":` · varsayılan`,"pws.rail.suffixLocal":` · yerel`,"pws.rail.suffixFree":` · ücretsiz`,"pws.rail.selectAria":`{name} seç — {status}{suffix}`,"pws.searchPlaceholder":`Sağlayıcılarda ara…`,"pws.filterAria":`Sağlayıcıları filtrele`,"pws.providerFiltersAria":`Sağlayıcı filtreleri`,"pws.filters":`Filtreler`,"pws.filterStatus":`Durum`,"pws.pricing":`Fiyatlandırma`,"pws.paid":`Ücretli`,"pws.filterType":`Tür`,"pws.type.cloud":`Bulut`,"pws.type.local":`Yerel`,"pws.type.selfHosted":`Kendi barındırdığı`,"pws.type.login":`Giriş yap`,"pws.sort":`Sırala`,"pws.sortProvidersAria":`Sağlayıcıları sırala`,"pws.sort.az":`A–Z`,"pws.sort.za":`Z–A`,"pws.sort.freePaid":`Önce ücretsizler`,"pws.sort.paidFree":`Önce ücretliler`,"pws.sort.accountsFirst":`Önce hesaplar`,"pws.resetAll":`Tümünü sıfırla`,"pws.providerList":`Sağlayıcı listesi`,"pws.providersAria":`Sağlayıcılar`,"pws.groupReady":`Hazır ({count})`,"pws.groupNeedsSetup":`Kurulum gerekiyor ({count})`,"pws.groupDisabled":`Devre dışı ({count})`,"pws.noSearchResults":`Aramanızla eşleşen sağlayıcı yok.`,"pws.noMatchFilters":`Filtrelerle eşleşen sağlayıcı yok.`,"pws.noProvidersConfigured":`Yapılandırılmış sağlayıcı yok.`,"pws.workspaceMainAria":`Sağlayıcı detayları`,"pws.detailComingSoon":`Detay görünümü yakında geliyor.`,"pws.selectPrompt":`Listeden bir sağlayıcı seçin.`,"pws.connectFirst":`İlk sağlayıcınızı bağlayın`,"pws.empty.browseFree":`Ücretsiz sağlayıcılara göz atın`,"pws.empty.browseFreeDesc":`Abonelik olmadan başlayın`,"pws.empty.connectAccount":`Bir hesap bağlayın`,"pws.empty.connectAccountDesc":`ChatGPT veya sağlayıcı girişinizi kullanın`,"pws.empty.addEndpoint":`Bir uç nokta ekleyin`,"pws.empty.addEndpointDesc":`Özel taban URL ve API anahtarı`,"pws.tab.overview":`Genel Bakış`,"pws.tab.models":`Modeller`,"pws.tab.usage":`Kullanım`,"pws.tab.accounts":`Hesaplar`,"pws.tab.settings":`Ayarlar`,"pws.connection":`Bağlantı`,"pws.status.connected":`Bağlandı`,"pws.attentionTitle":`Dikkat gerekiyor`,"pws.attention.reauth":`Aktif hesap yeniden doğrulama gerektiriyor`,"pws.attention.reauthForward":`Aktif Codex hesabı yeniden doğrulama gerektiriyor`,"pws.attention.missingCredentials":`Kimlik bilgileri eksik`,"pws.cell.auth":`Kimlik Doğrulama`,"pws.cell.note":`Not`,"pws.cell.defaultModel":`Varsayılan model`,"pws.statsAria":`Sağlayıcı istatistikleri`,"pws.statsTitle":`İstatistikler`,"pws.stats.totalRequests":`İstekler (30 gün)`,"pws.stats.totalTokens":`Jetonlar (30 gün)`,"pws.stats.quotaUpdated":`Kota güncellendi`,"pws.stats.quotaTracked":`Oran limitleri Kullanım sekmesinde takip edilir.`,"pws.stats.source":`Kaynak`,"pws.usageLast30d":`Kullanım (son 30 gün)`,"pws.allAccounts":`Tüm hesaplar`,"pws.estimatedCost":`Tahmini maliyet`,"pws.costDisclaimer":`API liste fiyatı tahminidir.`,"pws.modelBreakdown":`Model dağılımı`,"pws.col.model":`Model`,"pws.col.cost":`Tahm. maliyet`,"pws.col.tokens":`Jetonlar`,"pws.col.requests":`İst.`,"pws.col.share":`Pay`,"pws.tokenInput":`Girdi`,"pws.tokenOutput":`Çıktı`,"pws.metricRequests":`istek`,"pws.metricTokens":`jeton`,"pws.usageUnavailable":`Henüz kullanım kaydedilmedi.`,"pws.rateLimits":`Oran limitleri`,"pws.quotaUnavailable":`Bu sağlayıcı için kota verisi yok.`,"pws.accountQuotaUnavailable":`Oran limiti verisi geçici olarak kullanılamıyor.`,"pws.selected":`Seçilen`,"pws.copyModelId":`ID Kopyala`,"pws.modelCopied":`Kopyalandı!`,"pws.modelsAvailable":`{count} kullanılabilir`,"pws.modelSearchPlaceholder":`Modelleri filtrele…`,"pws.modelsLoading":`Modeller yükleniyor…`,"pws.modelsLoadFailed":`Modeller yüklenemedi.`,"pws.modelsNeedsReauth":`Hesabın yeniden giriş yapması gerekiyor.`,"pws.modelsConfiguredFallback":`Yapılandırılmış modeller gösteriliyor.`,"pws.modelsTruncated":`{total} modelden ilk {shown} tanesi gösteriliyor.`,"pws.retry":`Tekrar Dene`,"pws.noModels":`Bu sağlayıcı için keşfedilen model yok.`,"pws.noModelMatch":`Filtreyle eşleşen model yok.`,"pws.adapterBaseRequired":`Adaptör ve taban URL gereklidir.`,"pws.addAccount":`Hesap ekle`,"pws.addKey":`API anahtarı ekle`,"pws.apiKeys":`API Anahtarları`,"pws.authMode":`Kimlik doğrulama modu`,"pws.availableAccounts":`Mevcut hesaplar`,"pws.accountOrdinal":`Hesap {count}`,"pws.accountsLoading":`Hesaplar yükleniyor…`,"pws.accountsLoadFailed":`Hesaplar yüklenemedi.`,"pws.retryAccounts":`Tekrar Dene`,"pws.noAccounts":`Henüz bağlı hesap yok.`,"pws.cockpitImportDescription":`Bu cihazdan bir Cockpit Tools Antigravity JSON dışa aktarımını içe aktarın. Dosya içeriği gösterilmez.`,"pws.cockpitImportFileLabel":`Cockpit Tools Antigravity JSON dışa aktarımı`,"pws.cockpitImportChooseFile":`JSON dosyası seç`,"pws.cockpitImporting":`İçe aktarılıyor…`,"pws.cockpitImportInvalid":`Seçilen dosya geçerli bir JSON dışa aktarımı değil veya çok büyük.`,"pws.cockpitImportFailed":`Hesap içe aktarımı tamamlanamadı.`,"pws.cockpitImportComplete":`İçe aktarma tamamlandı: {imported} içe aktarıldı, {updated} güncellendi, {failed} başarısız, {unsupported} desteklenmiyor.`,"pws.accountSwitching":`Değiştiriliyor…`,"pws.accountCurrent":`Mevcut hesap`,"pws.defaultModelNone":`Yok (sağlayıcı varsayılanını kullan)`,"pws.discardSettings":`Vazgeç`,"pws.jsonEditorDesc":`Ham sağlayıcı JSON konfigürasyonunu düzenleyin.`,"pws.jsonEditorTitle":`JSON düzenleyici — {name}`,"pws.jsonRestore":`Geri Yükle`,"pws.jsonSave":`Kaydet`,"pws.loggedInTitle":`Giriş yapıldı`,"pws.notLoggedInTitle":`Giriş yapılmadı`,"pws.note":`Not`,"pws.allowPrivateNetwork":`Yerel/özel ağa izin ver`,"pws.liveModels":`Sağlayıcıdan canlı model keşfet`,"pws.liveModelsDesc":`Sağlayıcının canlı model kataloğunu çekin.`,"pws.xaiResponsesOptIn":`Grok 4.5 ve 4.6 için Responses API kullan`,"pws.xaiResponsesOptInDesc":`İki modeli de openai-responses üzerinden yönlendirir. Diğer Grok modelleri ve katman davranışı değişmez.`,"pws.xaiResponsesOptInMixed":`Kısmen etkin.`,"pws.cursorTransport":`Cursor aktarımı`,"pws.cursorTransportHttp2":`HTTP/2 (varsayılan)`,"pws.cursorTransportHttp1":`HTTP/1.1 (proxy uyumluluğu)`,"pws.cursorTransportDesc":`Proxy'niz Cursor'ın HTTP/2 akışını güvenilir biçimde taşıyamıyorsa HTTP/1.1 kullanın.`,"pws.optionalPlaceholder":`İsteğe bağlı`,"pws.providerId":`Sağlayıcı ID`,"pws.reauth":`Yeniden doğrulama gerekiyor`,"pws.reauthenticate":`Yeniden doğrula`,"pws.clearCooldown":`Soğuma süresini temizle`,"pws.copyDoctor":`ocx doctor kopyala`,"pws.doctorCopied":`Kopyalandı`,"pws.doctorCopyUnavailable":`Pano kullanılamıyor`,"pws.healthCooldownHint":`Soğuma süresi bitene kadar bekleyin.`,"pws.healthLabel.rateLimited":`Oran kısıtlandı`,"pws.healthLabel.quotaLimited":`Kota kısıtlandı`,"pws.healthLabel.reauthRequired":`Yeniden doğrulama gerekli`,"pws.healthLabel.refreshFailed":`Yenileme başarısız oldu`,"pws.healthLabel.metadataMismatch":`Meta veri uyuşmazlığı`,"pws.healthLabel.credentialConflict":`Kimlik bilgisi çakışması`,"pws.healthSummary.rateLimited":`{provider} {account}: {until} tarihine kadar oran kısıtlandı.`,"pws.healthSummary.quotaLimited":`{provider} {account}: {until} tarihine kadar kota kısıtlandı.`,"pws.healthSummary.reauthRequired":`{provider} {account}: yeniden doğrulama gerekli.`,"pws.healthSummary.credentialConflict":`{provider} {account}: kimlik bilgisi çakışması.`,"pws.healthSummary.metadataMismatch":`{provider} {account}: meta veri uyuşmazlığı.`,"pws.healthSummary.staleCredentials":`{provider} {account}: eksik kimlik bilgileri.`,"pws.removeConfirm":`Kaldır`,"pws.removeConfirmBody":`"{name}" sağlayıcısı kaldırılsın mı?`,"pws.removeDefaultConfirmBody":`Varsayılan sağlayıcı "{name}" kaldırılsın mı? "{defaultProvider}" varsayılan sağlayıcı olacaktır. Bu işlem geri alınamaz.`,"pws.removeConfirmTitle":`Sağlayıcıyı kaldır`,"pws.saveSettings":`Kaydet`,"pws.pacingTitle":`İstek aralığı`,"pws.pacingDesc":`Bu sağlayıcıya giden istek başlangıçlarını eşit aralıklarla geciktirir. Akış yanıtları çakışabilir.`,"pws.pacingEnabled":`Etkin`,"pws.pacingRpm":`Dakikadaki istek`,"pws.pacingRpmUnit":`RPM`,"pws.pacingDelay":`En kısa aralık (ms)`,"pws.pacingJitter":`Rastgele titreşim (ms)`,"pws.pacingSlowerWins":`Daha yavaş sağlayıcı sınırı geçerlidir. Model kuralları yalnızca ek gecikme getirir.`,"pws.pacingQueued":`kuyrukta`,"pws.pacingNextSlot":`sonraki aralığa`,"pws.pacingLastModel":`son model`,"pws.pacingNone":`Yok`,"pws.pacingModelOverrides":`Model kuralları`,"pws.pacingModel":`Model`,"pws.pacingAdd":`Kural ekle`,"pws.pacingRemove":`Kaldır`,"pws.pacingRemoveModel":`{model} için istek aralığı kuralını kaldır`,"pws.pacingRuleRequired":`Önce bir sağlayıcı sınırı veya model kuralı belirleyin.`,"pws.antigravityTlsTitle":`Antigravity tarayıcı TLS profili`,"pws.antigravityTlsEnable":`Deneysel TLS/HTTP2 öykünmesini etkinleştir`,"pws.antigravityTlsWarning":`Resmi olmayan uyumluluk özelliğidir. Hizmet şartlarına uyumu veya askıya alınmayı önlemeyi garanti etmez, trafiği daha ayırt edilebilir kılabilir ve başlatma başarısız olursa Bun'a dönebilir. Resmi Gemini API anahtarı, Vertex veya belgelenmiş Code Assist yolları daha güvenlidir.`,"pws.antigravityTlsConfirm":`Deneysel ve resmi olmayan Antigravity TLS profilini etkinleştirelim mi? Politika uyumu veya askıya alınmayı önleme garantisi yoktur. Devam edilsin mi?`,"pws.antigravityTlsStatus":`TLS profili durumu: {status}`,"pws.antigravityTlsDisabled":`Devre dışı`,"pws.antigravityTlsActive":`Etkin`,"pws.antigravityTlsFallback":`Geri dönüş`,"pws.saving":`Kaydediliyor…`,"pws.settingsSaved":`Ayarlar kaydedildi.`,"pws.accountModeSaved":`Hesap modu kaydedildi.`,"pws.accountModeFailed":`Hesap modu değiştirilemedi.`,"pws.accountModeConfirm":`OpenAI hesap modu değiştirilsin mi? Aktif oturumlar hedef hesap havuzuna yönlendirilecek ve kota yeni mod altında birikecektir.`,"pws.settingsUnsavedBar":`Kaydedilmemiş değişiklikleriniz var.`,"pws.unsavedLeaveBody":`Kaydedilmemiş değişiklikleriniz var. Ayrılmadan önce kaydetmek ister misiniz?`,"pws.unsavedLeaveTitle":`Kaydedilmemiş değişiklikler`,"pws.attentionRequired":`Dikkat gerekiyor`,"pws.attentionAria":`{name}: {reason}`,"pws.missingCredentials":`Kimlik bilgileri eksik`,"pws.editJsonDesc":`Proxy konfigürasyonunu JSON olarak düzenleyin`,"pws.updatesUnavailable":`Sağlayıcı güncellemeleri mevcut değil.`,"pws.dashboard.title":`Sağlayıcılara genel bakış`,"pws.dashboard.subtitle":`Tüm model sağlayıcılarınızı tek bir yerden yönetin.`,"pws.dashboard.rateLimits":`ORAN LİMİTLERİ`,"pws.capacity.estimate":`Havuz kapasite tahmini`,"pws.capacity.currentAccount":`Mevcut geçerli hesap`,"pws.capacity.nextRecovery":`Sonraki kapasite yenilenmesi`,"pws.capacity.recoveryShare":`+%{percent} havuz kapasitesi`,"pws.capacity.incomplete":`Kısmi pencere kapsamı ({unknown} bilinmeyen, {excluded} hariç tutuldu)`,"pws.capacity.partial":`Kısmi ({count} hesap kota metriği bildiriyor)`,"pws.capacity.windowPartial":`Kısmi`,"pws.capacity.windowPartialA11y":`{window}: eksik hesap kapsamı`,"pws.dashboard.recentlyUsed":`SON KULLANILANLAR`,"pws.dashboard.requests":`{count} istek`,"pws.dashboard.checkedAgo":`{time} önce kontrol edildi`,"pws.dashboard.noQuota":`Kota verisi yok`,"pws.dashboard.noUsage":`Henüz kullanım verisi yok`,"pws.dashboard.noRateLimits":`Henüz oran limiti verisi yok`,"pws.allProviders":`Sağlayıcı Genel Bakışı`,"pws.enabledLabel":`Etkin`,"pws.testConnection":`Bağlantıyı test et`,"pws.testing":`Test ediliyor…`,"pws.connectionOk":`Bağlantı Başarılı`,"pws.connectionFailed":`Bağlantı Başarısız`,"pws.connectionNotApplicable":`Uygulanamaz — bu sağlayıcı statik katalog kullanıyor.`,"pws.editSettings":`Ayarları düzenle`,"pws.viewUsage":`Detaylı kullanımı gör`,"pws.allSystemsOk":`Tüm sistemler çalışır durumda`,"pws.apiKeyConfigured":`API anahtarı yapılandırıldı`,"pws.addApiKey":`API anahtarı ekle`,"pws.loggedInAs":`{email} olarak giriş yapıldı`,"pws.notLoggedIn":`Giriş yapılmadı`,"pws.passthrough":`Codex doğrudan geçiş`,"pws.notes":`NOTLAR`,"pws.notePlaceholder":`Bu sağlayıcı hakkında bir not ekleyin...`,"pws.noteSaved":`Not kaydedildi`,"pws.authSummary":`KİMLİK DOĞRULAMA`,"pws.aiStudio":`AI Studio`,"pws.aiStudio.connected":`Bağlı`,"pws.aiStudio.checking":`Oturum kontrol ediliyor`,"pws.aiStudio.unsupported":`Bu platformda yerel giriş desteklenmiyor`,"pws.aiStudio.needsReauth":`Yeniden kimlik doğrulama gerekli`,"pws.aiStudio.reauthenticated":`Yeniden kimlik doğrulama başarılı`,"pws.aiStudio.loginFailed":`Yerel giriş başarısız`,"pws.aiStudio.connect":`Bağlan`,"time.justNow":`Az önce`,"time.notChecked":`Kontrol edilmedi`,"time.minutesAgo":`{n}dk önce`,"time.hoursAgo":`{n}sa önce`,"time.daysAgo":`{n}gün önce`,"modal.noMatch":`Eşleşme yok.`,"modal.oauthDefaultNote":`Hesabınızla giriş yapın — API anahtarı gerekmez.`,"modal.oauthComingSoon":`{label} için OAuth girişi gelecektir. Şimdilik API anahtarı kullanın.`,"modal.oauthComingSoonShort":`Bu sağlayıcı için OAuth girişi gelecektir — şimdilik API anahtarı kullanın.`,"modal.useApiKeyInstead":`Bunun yerine API anahtarı kullanın`,"modal.setupGuide":`Kurulum rehberi`,"modal.setupStep1Prefix":`Adresine gidin:`,"modal.setupDashboardLink":`{label} paneli`,"modal.setupStep1Suffix":`ve API anahtarınızı kopyalayın`,"modal.setupStep2":`Aşağıdaki API anahtarı alanına yapıştırın`,"modal.setupStep3":`Sağlayıcı ekle'ye tıklayın — modeller otomatik keşfedilir`,"modal.namePlaceholder":`örn. openrouter`,"modal.duplicateWarn":`"{name}" sağlayıcısı mevcut ve üzerine yazılacak.`,"modal.forwardHintPrefix":`Anahtar gerekmez — proxy kimlik bilgilerinizi iletir`,"modal.forwardCredentials":`codex girişi`,"modal.forwardHintSuffix":`kimlik bilgilerini bu sağlayıcıya iletir.`,"modal.localHint":`Yerel mod, Cursor'ın statik kamuya açık kataloğunu kaydeder. Canlı taşıma, dosya ve kabuk (shell) araçları denetlenene kadar kapalı kalır.`,"modal.getApiKey":`{label} API anahtarınızı alın`,"modal.apiKey":`API anahtarı`,"modal.apiKeyTransport":`API anahtar başlığı`,"modal.apiKeyTransportNative":`x-api-key (Anthropic yerel)`,"modal.apiKeyTransportBearer":`Authorization: Bearer`,"modal.apiKeyPlaceholder":`sk-… (veya $ENV_VAR)`,"modal.defaultModelPlaceholder":`örn. gpt-5.5`,"modal.baseUrlPlaceholder":`https://...`,"modal.baseUrlPlaceholderError":`Taban URL çözümlenmemiş bir {placeholder} içeriyor.`,"modal.baseUrlPlaceholderHint":`Eklemeden önce {placeholder} değerini gerçek Hesap ID'nizle değiştirin.`,"modal.adding":`Ekleniyor…`,"modal.useOauthLogin":`← OAuth girişini kullan`,"nav.codexAuth":`Codex Kimlik Doğrulama`,"nav.codexSet":`Codex Ayarları`,"codexSet.tab.multiauth":`Çoklu kimlik doğrulama`,"codexSet.tab.prompt":`İstem`,"codexSet.prompt.title":`İstem katmanları`,"codexSet.prompt.timing":`Yeni başlatılan oturumlara uygulanır. Çalışan oturumlar mevcut istem ayarlarını korur.`,"codexSet.prompt.staleRevision":`Yapılandırma başka bir yerde değişti. Liste yeniden yüklendi.`,"codexSet.prompt.writeFailed":`Değişiklik kaydedilemedi.`,"codexSet.prompt.loadFailed":`İstem katmanları yüklenemedi.`,"codexSet.prompt.repair":`Onar`,"codexSet.prompt.repairFailed":`Onarım tamamlanamadı.`,"codexSet.drift.journalPresent":`Önceki yazma işlemi tamamlanmadı. Kurtarma bir sonraki yazma sırasında otomatik olarak çalışır.`,"codexSet.drift.projectionStale":`Kaydedilen katmanlar ile config.toml içindeki değer uyuşmuyor. Onarım, değeri katmanlarınıza göre yeniden yazar.`,"codexSet.drift.storeMissing":`Katman dosyası yok ancak config.toml içinde talimatlar duruyor. Onarım önce yedek alır ve metni tek bir katman olarak saklar.`,"codexSet.drift.ownedMalformed":`config.toml içinde oluşturulan satır elle değiştirilmiş, bu yüzden yeniden yazmak artık güvenli değil.`,"codexSet.custom.adoptUnsupported":`{path} dosyasının {line}. satırındaki değer tek satırlık bir dizge olmadığından içe aktarılamaz. Burada yönetmek için elle taşıyın.`,"codexSet.prompt.unreadable":`Codex yapılandırma dosyası var ancak okunamadı, bu yüzden değişiklikler reddedildi.`,"codexSet.layer.permissions":`İzinler`,"codexSet.layer.collaboration":`İş birliği modu`,"codexSet.layer.environment":`Ortam bağlamı`,"codexSet.layer.apps":`Uygulamalar`,"codexSet.layer.skills":`Beceriler`,"codexSet.prompt.extensionsUnknown":`Uzantılar kendi katmanlarını ekleyebilir. Codex bunları göstermediği için burada listelenemez.`,"codexSet.group.transition":`Geçiş bildirimleri`,"codexSet.group.transitionDesc":`Durumu anlatmak yerine bir değişikliği bildirirler; bu yüzden yalnızca oturum gerçek zamanlıya geçtiğinde veya model değiştiğinde görünürler.`,"codexSet.custom.slotNote":`Özel katmanlar bu sırayla birleştirilip tek bir bölüm olur.`,"codexSet.row.alwaysOn":`Her zaman açık`,"codexSet.row.onChange":`Değişimde gönderilir`,"codexSet.row.featureGated":`[features] altında yapılandırılır`,"codexSet.row.openFeatures":`Ayarları aç`,"codexSet.dialog.setValue":`{value} (varsayılan {fallback})`,"codexSet.dialog.copyKey":`Anahtarı kopyala`,"codexSet.dialog.unknownLayer":`Bu derlemede bu katman için açıklama yok. Panelden daha yeni bir Codex çalışma zamanından geliyor.`,"codexSet.custom.heading":`Özel katmanlar`,"codexSet.custom.add":`+ Katman ekle`,"codexSet.custom.newTitle":`Yeni katman`,"codexSet.custom.editTitle":`Katmanı düzenle`,"codexSet.custom.titleLabel":`Başlık`,"codexSet.custom.bodyLabel":`Talimatlar`,"codexSet.custom.bodySize":`{max} baytın {bytes} baytı`,"codexSet.custom.normalized":`Sekmeler dört boşluğa, satır sonları LF biçimine dönüştürüldü.`,"codexSet.custom.titleRequired":`Bir başlık girin.`,"codexSet.custom.titleTooLong":`Başlık {count} karakter; sınır {max}.`,"codexSet.custom.titleMultiline":`Başlık tek satır olmalıdır.`,"codexSet.custom.bodyTooLarge":`Bu katman {bytes} bayt; sınır {max}.`,"codexSet.custom.composedTooLarge":`Etkin katmanların toplamı {bytes} bayt olacak ve sınırı aşacak.`,"codexSet.custom.invalidCharacter":`{position} konumundaki denetim karakteri kaydedilemez.`,"codexSet.custom.discardPrompt":`Değişiklikler silinsin mi?`,"codexSet.custom.keepEditing":`Düzenlemeye devam et`,"codexSet.custom.delete":`{title} katmanını sil`,"codexSet.custom.deleteConfirm":`Bu katman silinsin mi? Bu işlem geri alınamaz.`,"codexSet.custom.layerGone":`Bu katman başka bir yerde silindiği için düzenleyici kapatıldı.`,"codexSet.custom.deleteConfirmNamed":`“{title}” silinsin mi? Bu işlem geri alınamaz.`,"codexSet.custom.moveUp":`{title} katmanını yukarı taşı`,"codexSet.custom.prevLayer":`Önceki katman`,"codexSet.custom.nextLayer":`Sonraki katman`,"codexSet.custom.navPosition":`{position} / {total}`,"codexSet.custom.moveDown":`{title} katmanını aşağı taşı`,"codexSet.custom.limitReached":`En fazla {max} özel katman saklayabilirsiniz.`,"codexSet.custom.notOwned":`developer_instructions opencodex dışında yazıldığı için buradan düzenlenemez. Katman olarak yönetmek için içe aktarın.`,"codexSet.custom.adopt":`Mevcut talimatları içe aktar`,"codexSet.custom.adoptConfirm":`Katman olarak içe aktar`,"codexSet.custom.adoptRefused":`Mevcut değer içe aktarılamadı.`,"codexSet.custom.baseReplaced":`model_instructions_file {path} olarak ayarlandığından, opencodex dışındaki bir öğe temel istemi değiştirmiş.`,"codexSet.lint.identity":`Bu, Codex tarafından belirlenenden farklı bir kimlik iddia ediyor.`,"codexSet.lint.foreignTool":`Araçlar kayıt defterinden gelir; burada bir aracın adını belirtmek onu oluşturmaz.`,"codexSet.lint.placeholder":`Talimatlar bir şablon motorundan geçmez, bu nedenle bu metin olduğu gibi gönderilir.`,"codexSet.lint.applyPatch":`apply_patch talimatlar tarafından değil, araç kayıt defteri tarafından tanımlanır.`,"codexSet.lint.approvalVocab":`Codex kendi onay terimlerini ekler; bu metin onlarla çelişebilir.`,"codexSet.lint.environment":`Ortam bilgileri daha sonra oluşturulur ve bu metinle çelişebilir.`,"codexSet.lint.size":`Bu katman 8 KB sınırını aşıyor. Yine de kaydedilir, ancak her istekte belirteç harcar.`,"codexSet.preset.blank":`Boş katman`,"codexSet.preset.concise.name":`Kısa çıktı`,"codexSet.preset.concise.description":`Kısa yanıtlar, giriş yok, en az biçimlendirme.`,"codexSet.preset.concise.provenance":`Claude Code'un kısa yanıt talimatlarından uyarlandı. İfade bize aittir, kopya değildir.`,"codexSet.preset.planFirst.name":`Düzenlemeden önce planla`,"codexSet.preset.planFirst.description":`Önce planı belirt, ardından değişikliği yap.`,"codexSet.preset.planFirst.provenance":`Claude Code'un planlama yaklaşımından uyarlandı. İfade bize aittir, kopya değildir.`,"codexSet.preset.explainWhy.name":`Gerekçeyi açıkla`,"codexSet.preset.explainWhy.description":`Yalnızca ne olduğunu değil, nedenini de belirt.`,"codexSet.preset.explainWhy.provenance":`Grok Build'in onaylama tarzından uyarlandı. İfade bize aittir, kopya değildir.`,"codexSet.preset.testFirst.name":`Önce test`,"codexSet.preset.testFirst.description":`Düzeltmeden önce başarısız olan testi yaz.`,"codexSet.preset.testFirst.provenance":`Yaygın ajan uygulamalarından uyarlandı. İfade bize aittir, kopya değildir.`,"codexSet.preset.korean.name":`Korece yanıtlar`,"codexSet.preset.korean.description":`İstek hangi dilde olursa olsun Korece yanıt ver.`,"codexSet.preset.korean.provenance":`Sık istenen bir ihtiyaçtan yola çıkarak opencodex için yazıldı. İfade bize aittir, kopya değildir.`,"codexSet.dialog.class":`Tür`,"codexSet.dialog.key":`Yapılandırma anahtarı`,"codexSet.dialog.fileValue":`Bu dosyadaki değer`,"codexSet.dialog.absentDefault":`ayarlanmamış (varsayılan: {value})`,"codexSet.dialog.noRenderedText":`Codex yerleşik bir katmanın birleştirilmiş metnini göstermez. Bu nedenle bu iletişim kutusu içeriği göstermek yerine katmanı açıklar ve anahtarını belirtir.`,"codexSet.dialog.sourceText":`Modele gönderilen metin`,"codexSet.dialog.sourceBytes":`{bytes} bayt`,"codexSet.dialog.notRendered":`Okuduğumuz turda bu katman hiçbir şey göndermedi. Bölümler yalnızca değiştiklerinde yeniden gönderilir, bu yüzden tek bir örnekte görünmeyebilir.`,"codexSet.dialog.emptySource":`{path} konumundaki dosya var ancak boş, bu yüzden bu katman hiçbir şey göndermiyor.`,"codexSet.dialog.notExposed":`Temel istem, Codex'in yazdırabildiği mesaj listesinin dışından geçtiği için burada gösterilemez. model_instructions_file ile değiştirilebilir.`,"codexSet.dialog.textUnavailable":`Bu makinede Codex istemi okunamadı, bu yüzden metin kullanılamıyor.`,"codexSet.class.base":`Temel talimatlar`,"codexSet.class.config-toggle":`Buradan değiştirilebilir`,"codexSet.class.feature-gated":`Özellik bayraklı`,"codexSet.class.runtime-conditional":`Çalışma zamanına bağlı`,"codexSet.class.extension-unknown":`Uzantı katmanı`,"codexSet.layer.base-instructions":`Temel talimatlar`,"codexSet.layer.model-switch":`Model değişikliği bildirimi`,"codexSet.layer.personality":`Kişilik`,"codexSet.layer.context-window-guidance":`Bağlam penceresi yönlendirmesi`,"codexSet.layer.realtime":`Gerçek zamanlı`,"codexSet.layer.agents-md":`AGENTS.md`,"codexSet.layer.environments-instructions":`Yürütme ortamları`,"codexSet.layer.plugins":`Eklentiler`,"codexSet.layer.tools":`Araçlar`,"codexSet.layer.multi-agent-mode":`Çoklu ajan modu`,"codexSet.layer.git-attribution":`Commit atıfları`,"codexSet.about.base-instructions":`Codex'in kendi talimatlarıdır. İstekle birlikte gönderilir ve kapatılamaz.`,"codexSet.about.model-switch":`Oturum sırasında model değiştiğinde eklenir.`,"codexSet.about.personality":`Bir özellik bayrağının yönettiği ton ve anlatım yönlendirmesi.`,"codexSet.about.context-window-guidance":`Bir özellik bayrağının yönettiği kalan bağlam bütçesi önerileri.`,"codexSet.about.realtime":`Gerçek zamanlı oturumlarda eklenir.`,"codexSet.about.agents-md":`Projenizin AGENTS.md dosyalarıdır. Bu sayfa katmanı gösterir, proje belgelerinizi değiştirmez.`,"codexSet.about.permissions":`Geçerli korumalı alan ve onay ayarlarını açıklar.`,"codexSet.about.collaboration":`Etkin iş birliği modunu açıklar.`,"codexSet.about.environment":`Çalışma dizini, platform ve diğer ortam bilgileri.`,"codexSet.about.environments-instructions":`Bir özellik bayrağının yönettiği ertelenmiş yürütme ortamı talimatları.`,"codexSet.about.apps":`Bağlı uygulamaların nasıl kullanılacağını açıklar.`,"codexSet.about.plugins":`Bir eklenti seçildiğinde veya herhangi bir eklenti bir yetenek bildirdiğinde eklenir.`,"codexSet.about.tools":`Bir özellik bayrağının yönettiği ertelenmiş araç açıklamaları.`,"codexSet.about.skills":`Kullanılabilir becerilerin listesi.`,"codexSet.about.multi-agent-mode":`Bir özellik bayrağının yönettiği alt ajan talimatları.`,"codexSet.about.git-attribution":`Modelin yazdığı commit’lere Co-authored-by: Codex trailer’ını, açtığı pull request’lere de Generated with Codex. satırını eklemesini söyler. Codex bunu hesabınızdan okur; ne burada ne de [features] altında değiştirilebilir. Hesabınız kapattığında Codex hiçbir şey göndermek yerine tersi yönde talimat gönderir.`,"codexSet.condition.model-switch":`Yalnızca oturum sırasında model değiştikten sonra eklenir.`,"codexSet.condition.realtime":`Yalnızca gerçek zamanlı oturumlarda eklenir.`,"codexSet.condition.agents-md":`Çalışma dizini için bir proje belgesi bulunduğunda eklenir.`,"codexSet.condition.plugins":`Bir eklenti seçildiğinde veya herhangi bir eklenti bir yetenek bildirdiğinde eklenir.`,"codexSet.condition.git-attribution":`Hesabınızın atıf politikası belirler.`,"codexSet.base.title":`Temel istem`,"codexSet.base.prev":`Önceki seçenek`,"codexSet.base.next":`Sonraki seçenek`,"codexSet.base.position":`{position} / {total}`,"codexSet.base.swipeHint":`Yana kaydırın, yön tuşlarını ya da ok düğmelerini kullanarak seçenekler arasında geçin. Yeni başlatılan oturumlarda geçerlidir.`,"codexSet.base.defaultTitle":`Codex’in kendi temel istemi`,"codexSet.base.defaultBody":`Varsayılan burada saklanmaz, dolayısıyla düzenlenecek veya silinecek bir şey yoktur: seçmek yapılandırmadan model_instructions_file satırını kaldırır ve Codex kendi istemini kullanır.`,"codexSet.base.variantTitle":`Ad`,"codexSet.base.variantBody":`İstem`,"codexSet.base.replacesWarning":`Bu, Codex’in temel istemine eklemek yerine onun YERİNE geçer. Buraya kısa yazarsanız modelin talimatları da o kadar kısa olur.`,"codexSet.base.use":`Bunu kullan`,"codexSet.base.inUse":`Kullanımda`,"codexSet.base.externalBlocked":`model_instructions_file zaten {path} yolunu gösteriyor ve bunu opencodex yazmadı. Buradan seçim yapmadan önce kendiniz temizleyin.`,"nav.api":`API`,"nav.integrations":`Entegrasyonlar`,"nav.openMenu":`Menüyü aç`,"nav.closeMenu":`Menüyü kapat`,"integrations.subtitle":`İstemcileri opencodex'e bağlayın, kimlik bilgilerini yönetin.`,"integrations.tabsLabel":`Entegrasyon yüzeyleri`,"integrations.tab.overview":`Genel Bakış`,"integrations.tab.keys":`API Anahtarları`,"integrations.tab.codex":`Codex CLI`,"integrations.tab.claude":`Claude`,"integrations.tab.grok":`Grok Build`,"integrations.tab.opencode":`OpenCode`,"integrations.tab.pi":`Pi`,"integrations.tab.omp":`OMP`,"integrations.tab.hermes":`Hermes`,"integrations.tab.openclaw":`OpenClaw`,"integrations.tab.kimi":`Kimi Code`,"integrations.tab.gajae":`Gajae Code`,"integrations.tab.dsh":`DeepSeek Harness (DSH)`,"integrations.tab.mcode":`MiniMax Code`,"integrations.tab.zcode":`ZCode`,"integrations.tab.prime":`Prime Agent`,"integrations.codex.title":`Codex CLI`,"integrations.codex.body":`Codex bağlantısı proxy servisine aittir.`,"integrations.codex.openService":`Servis kontrollerini aç`,"integrations.state.notInstalled":`Yüklü değil`,"integrations.state.unknown":`Kontrol ediliyor…`,"integrations.detail.codexRouted":`Codex istekleri bu proxy üzerinden geçer`,"integrations.detail.codexAbsent":`Codex henüz bu proxy üzerinden yönlendirilmedi`,"integrations.detail.keyCount":`{count} anahtar oluşturuldu`,"integrations.detail.keyNone":`Oluşturulmuş anahtar yok`,"integrations.detail.keyChecking":`Kontrol ediliyor…`,"integrations.detail.keyUnavailable":`Anahtar durumu kullanılamıyor`,"integrations.detail.claudeOff":`Bağlantı kapalı`,"integrations.detail.desktopCurrent":`Desktop bu profili çalıştırıyor`,"integrations.detail.desktopStale":`Profil dosyası değiştirildi`,"integrations.detail.desktopNotServed":`Profil mevcut ancak Desktop başkasını kullanıyor`,"integrations.detail.desktopAbsent":`Uygulanan profil yok`,"integrations.detail.desktopDesiredOff":`Claude Desktop entegrasyonu kapalı`,"integrations.detail.desktopDesiredOffCleanupPending":`Claude Desktop hâlâ ağ geçidini kullanıyor; temizlik bekleniyor`,"integrations.detail.desktopDesiredOnNotApplied":`Entegrasyon açık ancak Desktop kullanmıyor`,"integrations.detail.desktopSelectedElsewhere":`Desktop başka bir profil kullanıyor`,"integrations.detail.desktopProfileDrift":`Seçilen Desktop profili değişti`,"integrations.detail.desktopObservedUnsafe":`Desktop profili güvenle değiştirilemiyor`,"integrations.detail.desktopNotInstalled":`Claude Desktop kütüphanesi yüklü değil`,"integrations.detail.grokModels":`{count} model bağlandı`,"integrations.detail.grokAbsent":`Konfigürasyonda opencodex bloğu yok`,"integrations.dialog.grok.title":`Grok Build entegrasyonu devre dışı bırakılsın mı?`,"integrations.dialog.grok.changes":`Yalnızca {path} dosyasında opencodex tarafından işaretlenen blok kaldırılacaktır. Blok dışında yazılan içerik değişmeden kalır.`,"integrations.dialog.grok.breakage":`Devre dışı bırakmak, opencodex model takma adlarını Grok Build'den kaldırır. xAI hesabınızla kullanılan modeller kullanılabilir kalır.`,"integrations.dialog.grok.undo":`opencodex bir geri döngü (loopback) adresinde çalışıyorsa, bunu tekrar açmak şu anda mevcut olan modellerden yeni bir blok yazar.`,"integrations.dialog.grok.confirm":`Devre Dışı Bırak`,"integrations.dialog.desktop.title":`Claude Desktop entegrasyonu devre dışı bırakılsın mı?`,"integrations.dialog.desktop.changes":`Eğer {path} opencodex tarafından yönetilen bir ağ geçidi profili içeriyorsa, Desktop önce kimlik bilgisiz yeni bir standart profil seçer, ardından eski profili ve yedeği kaldırır.`,"integrations.dialog.desktop.breakage":`Claude Desktop, opencodex üzerinden yönlendirilen modeller yerine standart Claude'a geri dönecektir.`,"integrations.dialog.desktop.undo":`Bunu tekrar açmak, kaydedilmiş model atamalarınızdan opencodex profilini yeniden oluşturur.`,"integrations.dialog.desktop.restart":`Claude Desktop bu yapılandırmayı yalnızca açılışta okur. Değişikliğin yürürlüğe girmesi için uygulamayı tamamen kapatıp yeniden açın.`,"integrations.dialog.desktop.confirm":`Devre Dışı Bırak`,"integrations.native.msg.nonLoopbackRemoved":`Grok Build yalnızca opencodex bir geri döngü (loopback) adresinde çalışırken otomatik olarak kaydolabilir. Loopback'i işaret eden önceki blok kaldırıldı.`,"integrations.native.msg.nonLoopbackRemovedNoop":`Grok Build yalnızca opencodex bir geri döngü (loopback) adresinde çalışırken otomatik olarak kaydolabilir. Kaldırılacak önceki bir blok yoktu.`,"integrations.native.msg.nonLoopbackSuperseded":`Grok Build yalnızca opencodex bir geri döngü adresi üzerinde çalışırken otomatik kaydedilebilir. Bu sırada başka bir işlem yeni bir blok yazdı, bu nedenle şu an dosyadaki blok bu istek tarafından oluşturulmadı.`,"integrations.native.error.orphanedMarker":`{path} bir opencodex başlangıç işaretine sahip ancak bitiş işareti yok. opencodex bloğunun nerede bittiğini belirleyemediği için dosya değiştirilmeden bırakıldı.`,"integrations.native.error.homeMismatch":`Yüklü servis dizini mevcut ev dizini ile uyuşmuyor, bu nedenle dosya değiştirilmeden bırakıldı.`,"integrations.native.error.notInstalled":`Grok Build yüklü değil, bu nedenle değiştirilecek bir şey yok.`,"integrations.native.error.configBusy":`Yapılandırma başka bir yerde kaydediliyor ve değiştirilemedi. Kısa süre sonra tekrar deneyin.`,"integrations.native.error.desktopUnsafeMetadata":`{path} konumundaki Claude Desktop meta verileri güvenle okunamadı, bu nedenle kütüphanesi değiştirilmedi.`,"integrations.native.error.desktopCleanupIncomplete":`Claude Desktop standart moda yönlendirildi, ancak eski opencodex kimlik bilgisi dosyaları şu konumda kalmaya devam ediyor: {paths}.`,"integrations.native.msg.desktopDisabled":`Claude Desktop entegrasyonu devre dışı bırakıldı.`,"integrations.native.msg.desktopEnabled":`Claude Desktop entegrasyonu etkinleştirildi.`,"integrations.state.absent":`Uygulanmadı`,"integrations.state.current":`Uygulandı`,"integrations.state.stale":`Güncelleme gerekiyor`,"integrations.state.conflict":`Çakışma`,"integrations.state.unsafe":`Doğrulanamadı`,"integrations.summary.detected":`Algılanan istemciler`,"integrations.summary.applied":`Yapılandırılan istemciler`,"integrations.summary.stale":`Güncelleme gerekiyor`,"integrations.summary.lastChange":`Son değişiklik`,"integrations.summary.disableAll":`Tümünü devre dışı bırak…`,"integrations.onboarding":`Uygulama işlemi bir yedek aldıktan sonra yazar.`,"integrations.empty.title":`Yüklü istemci algılanmadı`,"integrations.empty.body":`Desteklenen bir istemci yükleyin.`,"integrations.action.apply":`Uygula`,"integrations.action.disable":`Devre Dışı Bırak`,"integrations.action.refresh":`Güncelle`,"integrations.action.settings":`Ayarlar`,"integrations.action.manageKeys":`Anahtarları yönet`,"integrations.action.restore":`Geri Yükle…`,"integrations.action.undo":`Geri Al`,"integrations.action.restorePoint":`Bu noktayı geri yükle…`,"integrations.action.snapshotExpired":`Yedek süresi doldu`,"integrations.rollback.title":`Geri alma merkezi`,"integrations.rollback.empty":`Henüz uygulama geçmişi yok`,"integrations.rollback.emptyBody":`Her başarılı yazma bir anlık görüntü saklar.`,"integrations.restore.title":`Bu anlık görüntü geri yüklensin mi?`,"integrations.restore.body":`Mevcut dosya önce yedeklenir.`,"integrations.restore.driftTitle":`Daha yeni düzenlemeler algılandı`,"integrations.restore.driftBody":`Bu anlık görüntüden sonra yapılan değişiklikler yedeklenecektir.`,"integrations.restore.confirm":`Geri Yükle`,"integrations.restore.confirmDrift":`Yedekle ve geri yükle`,"integrations.restore.pending":`Geri yükleniyor…`,"integrations.restore.manual":`{reason}: {path} dosyasını el ile geri yükleyin`,"integrations.error.load":`Entegrasyon durumu yüklenemedi.`,"integrations.error.stale":`Son yenileme başarısız oldu.`,"integrations.error.busy":`İşlem devam ediyor.`,"integrations.error.conflict":`Konfigürasyon yazıldıktan sonra değişti.`,"integrations.error.unsafe":`Konfigürasyon güvenle değiştirilemiyor.`,"integrations.error.generic":`Entegrasyon değişikliği başarısız oldu.`,"integrations.error.nonLoopback":`{client} istemcisi geri döngü (loopback) dışında bir adreste. Yerel entegrasyonlar yalnızca loopback (127.0.0.1 veya ::1) üzerinden düzenlenebilir. Bir API anahtarı ayarlayın veya yerel erişim kullanın.`,"integrations.status.installed":`Yüklü`,"integrations.status.notInstalled":`Yüklü değil`,"integrations.status.appliedAt":`Uygulandı`,"integrations.status.backup":`Yedek`,"integrations.status.lastRestore":`Son geri yükleme`,"integrations.status.unknown":`Bilinmiyor`,"integrations.bulk.title":`Uygulanan istemci entegrasyonları devre dışı bırakılsın mı?`,"integrations.bulk.body":`Yalnızca opencodex bloğu kaldırılır.`,"integrations.bulk.partial":`Bazı istemciler devre dışı bırakılamadı: {clients}`,"integrations.bulk.success":`Uygulanan istemci entegrasyonları devre dışı bırakıldı.`,"integrations.retention.degraded":`Yedek temizliği geride kaldı.`,"integrations.error.residual":`{path} konumunda {message}`,"integrations.error.recover":`{path} kurtarılırken {message}`,"integrations.kind.apply":`Uygulandı`,"integrations.kind.disable":`Devre Dışı Bırakıldı`,"integrations.kind.refresh":`Güncellendi`,"integrations.kind.restore":`Geri Yüklendi`,"integrations.semantics.opencode":`Doğrudan disk başlatmaları.`,"integrations.semantics.pi":`Yeni oturumlara uygulanır.`,"integrations.semantics.hermes":`Yeni oturumlara uygulanır.`,"integrations.semantics.openclaw":`Anında uygulanır.`,"integrations.semantics.kimi":`Uygulamak için yeniden başlatın.`,"integrations.semantics.gajae":`Yeni oturuma uygulanır.`,"integrations.semantics.dsh":`OpenCodex yalnızca $DSH_HOME/settings.yaml içindeki llm-pi-ai.providers.opencodex bölümünü yönetir. DSH bu sağlayıcıyı çalışırken yeniden yükler; varsayılan modeliniz ve deepseek-official değişmez. Şimdilik yalnızca geri döngü desteklenir; gerçek kimlik bilgisi yazılmaz.`,"integrations.semantics.mcode":`Yalnızca custom_provider.opencodex bölümünü yönetir. Varsayılan model ve MiniMax oturumu değişmez.`,"integrations.semantics.zcode":`Yalnızca ~/.zcode/v2/config.json içindeki provider.opencodex bölümünü yönetir. Z.ai oturumu ve diğer sağlayıcılar değişmez. Değişikliklerden sonra ZCode'u yeniden başlatın.`,"integrations.semantics.prime":`Yalnızca Prime Agent'ın models.json dosyasındaki providers.opencodex bölümünü yönetir — PRIME_AGENT_CODING_AGENT_DIR ayarlı değilse ~/.prime/agent. Diğer sağlayıcılar ve model geçersiz kılmaları değişmez. Yeni oturumlarda geçerli olur.`,"integrations.semantics.omp":`Kataloğu yüklemek için OMP'yi yeniden başlatın.`,"codexAuth.mainAccount":`Ana Hesap`,"codexAuth.logLabel":`Günlük etiketi`,"codexAuth.codexApp":`Codex Uygulaması`,"codexAuth.appLogin":`Uygulama girişi`,"codexAuth.accountPool":`Hesap Havuzu`,"codexAuth.accountModeTitle":`OpenAI hesap modu`,"codexAuth.accountModePool":`Havuz modu`,"codexAuth.accountModePoolDesc":`Ana giriş ve eklenen hesaplar burada döner.`,"codexAuth.accountModeDirect":`Doğrudan mod`,"codexAuth.accountModeDirectDesc":`İstekler yalnızca ana girişi kullanır.`,"codexAuth.accountPickerTitle":`Model seçiciden belirli bir Codex hesabını hedefleyin`,"codexAuth.accountPickerOffDesc":`Etkinleştirildiğinde, sıradan GPT seçici satırlarının yerini her hesap seçicisi için bir giriş alır, böylece çıkış yapmadan bir konuşma için tam hesabı seçebilirsiniz. Kapatılması hiçbir hesabı kaldırmaz.`,"codexAuth.accountPickerOnDesc":`Her seçici, kayıtlı bir hesap için genel bir etikettir. Bunu seçmek, konuşmayı eşlenen hesaba kilitler: asla dönmez veya yedek hesaba geçmez ve aktif Havuz hesabını değiştirmez.`,"codexAuth.accountPickerCompatibility":`Yerleşik Codex Uygulama girişinin kendi seçicisi vardır; oluşturulan haritalar normalde bunu main olarak adlandırır ve gerektiğinde main-2 gibi çakışmasız bir son ek kullanır. Eklenen hesaplar kararlı ve gizlilik açısından güvenli etiketler alırken, özel seçici etiketleri değişmeden kalır. Mevcut konuşmalar ve kaydedilmiş model seçimleri yönlendirilmeye devam eder. Bunu kapatmak oluşturulan girişleri gizler ancak seçicileri ve tam rotaları korur. Yalın GPT model kimlikleri Havuz veya Doğrudan davranışlarını sürdürür.`,"codexAuth.accountPickerUpdated":`Hesap hedefleme güncellendi.`,"codexAuth.accountPickerUpdateFailed":`Hesap hedefleme güncellenemedi. Son doğrulanan ayar gösteriliyor.`,"codexAuth.accountPickerLoadFailed":`Hesap hedefleme ayarı yüklenemedi.`,"codexAuth.accountPickerRefreshFailed":`Bu ayar yenilenemedi. Son doğrulanan değer hâlâ gösteriliyor.`,"codexAuth.advancedSettings":`Gelişmiş ayarlar`,"codexAuth.advancedSettingsAria":`Gelişmiş Codex Auth ayarlarını göster veya gizle`,"codexAuth.catalogRefreshPending":`Değişiklik kaydedildi ancak Codex model kataloğunun yenilenmesi bekleniyor. Yeniden denemek için ocx sync çalıştırın.`,"codexAuth.openaiMissing":`Yerleşik OpenAI sağlayıcısı yapılandırılmamış.`,"codexAuth.openaiDisabled":`Yerleşik OpenAI sağlayıcısı devre dışı.`,"codexAuth.openaiUnavailableDesc":`OpenAI hesaplarınız kullanılabilir.`,"codexAuth.enableOpenai":`OpenAI'yi Etkinleştir`,"codexAuth.enablingOpenai":`Etkinleştiriliyor...`,"codexAuth.enableOpenaiFailed":`OpenAI sağlayıcısı etkinleştirilemedi.`,"codexAuth.openaiPresetLoadFailed":`Ayar yüklenemedi.`,"codexAuth.openaiPresetUnavailable":`Ayar kullanılamıyor.`,"codexAuth.openProviders":`Sağlayıcıları Aç`,"codexAuth.add":`Ekle`,"codexAuth.sparkQuota":`Codex Spark kotası`,"codexAuth.sparkQuotaHint":`Hesap kartlarında GPT-5.3-Codex-Spark haftalık penceresini gösterir. Yalnızca tek bir modeli kapsadığı için varsayılan olarak gizlidir.`,"codexAuth.sparkQuotaShown":`Codex Spark kotası gösteriliyor`,"codexAuth.sparkQuotaHidden":`Codex Spark kotası gizlendi`,"codexAuth.sparkQuotaFailed":`Codex Spark kotası ayarı değiştirilemedi`,"codexAuth.refreshQuota":`Kotaları yenile`,"codexAuth.refreshingQuota":`Yenileniyor...`,"codexAuth.quotaRefreshed":`Kotalar yenilendi`,"codexAuth.quotaRefreshFailed":`Kotalar yenilenemedi`,"codexAuth.pauseExhausted":`Tükenenleri duraklat`,"codexAuth.pausingExhausted":`Kotalar kontrol ediliyor...`,"codexAuth.pauseExhaustedSucceeded":`Limitteki hesaplar duraklatıldı: {count}`,"codexAuth.pauseExhaustedNone":`%100 kullanımı doğrulanmış hesap yok.`,"codexAuth.pauseExhaustedFailed":`Tükenen hesaplar kontrol edilemedi.`,"codexAuth.noPool":`Henüz havuz hesabı eklenmedi.`,"codexAuth.pause":`Duraklat`,"codexAuth.resume":`Devam Ettir`,"codexAuth.paused":`DURAKLATILDI`,"codexAuth.pauseSucceeded":`{email} duraklatıldı`,"codexAuth.resumeSucceeded":`{email} tekrar havuza alındı`,"codexAuth.pauseFailed":`{email} duraklatılamadı.`,"codexAuth.resumeFailed":`{email} devam ettirilemedi.`,"codexAuth.pausedHint":`Devam ettirilene kadar otomatik seçimden hariç tutulur.`,"codexAuth.pinned":`SABİTLENDİ`,"codexAuth.pinnedHint":`Bu hesabı elle seçtiniz.`,"codexAuth.fiveHour":`5saat`,"codexAuth.weekly":`Hafta`,"codexAuth.monthly":`30gün`,"codexAuth.resets":`sıfırlanma`,"codexAuth.today":`Bugün`,"codexAuth.current":`MEVCUT`,"codexAuth.nextSession":`SEÇİLEN`,"codexAuth.poolPrepared":`HAVUZ İÇİN HAZIRLANDI`,"codexAuth.preparePoolTitle":`Bu hesap Havuz modu için hazırlansın mı?`,"codexAuth.preparePoolDesc":`Doğrudan istekler ana girişi kullanmaya devam eder.`,"codexAuth.prepareForPool":`Havuz İçin Hazırla`,"codexAuth.poolPreparedToast":`{email} Havuz modu için hazırlandı`,"codexAuth.switchTitle":`Aktif hesap değiştirilsin mi?`,"codexAuth.switchDesc":`Anında yürürlüğe girer. Mevcut hesaba bağlı iş parçacıkları ve işlenmekte olan istekler yakalanan hesaplarını korur; yeni veya bağımsız istekler seçilen hesabın sıra kademesini kullanır ve aynı seçim sırasındaki hesaplar sırayla görev almaya devam eder.`,"codexAuth.cacheWarning":`Hesap değiştirildiğinde önbellek sıfırlanır.`,"codexAuth.setAsNext":`Sonraki istekte bu hesabı kullan`,"codexAuth.cancel":`İptal`,"codexAuth.switchBack":`Ana hesaba geri dönülsün mü?`,"codexAuth.switchBackDesc":`Anında yürürlüğe girer. Mevcut hesaba bağlı iş parçacıkları ve işlenmekte olan istekler yakalanan hesaplarını korur; yeni veya bağımsız istekler Uygulama giriş hesabınızın sıra kademesini kullanır ve aynı seçim sırasındaki hesaplar sırayla görev almaya devam eder.`,"codexAuth.autoSwitch":`Kullanıma dayalı proaktif geçiş`,"codexAuth.autoSwitchQuotaDesc":`Kota: %{threshold} veya üzeri kullanımda sonraki istek daha az kullanılan bir hesaba geçebilir.`,"codexAuth.autoSwitchQuotaOffDesc":`Kullanıma dayalı proaktif geçiş kapalı.`,"codexAuth.autoSwitchRoundRobinDesc":`Round-robin bu eşiği kullanmaz.`,"codexAuth.autoSwitchFillFirstDesc":`Kullanım %{threshold} eşiğini aşana kadar hesabı doldurun, ardından sonraki kullanılabilir hesaba geçin.`,"codexAuth.autoSwitchFillFirstOffDesc":`İlk doldurma modunda kullanım boşaltma noktası yok.`,"codexAuth.failureRecoveryNote":`Hata kurtarma ayrıdır.`,"codexAuth.autoSwitchThreshold":`Kullanım eşiği`,"codexAuth.autoSwitchThresholdAria":`Kullanım eşiği, yüzde`,"codexAuth.autoSwitchThresholdInc":`Kullanım eşiğini artır`,"codexAuth.autoSwitchThresholdDec":`Kullanım eşiğini azalt`,"codexAuth.autoSwitchLoadFailed":`Ayarlar yüklenemedi.`,"codexAuth.autoSwitchThresholdInvalid":`1 ile 100 arasında bir tam sayı girin`,"codexAuth.autoSwitchUpdated":`Proaktif geçiş güncellendi`,"codexAuth.autoSwitchUpdateFailed":`Geçiş güncellemesi doğrulanamadı.`,"codexAuth.requestUserInput":`Varsayılan modda kullanıcı girdisi iste`,"codexAuth.requestUserInputDesc":`Codex'in soru sormasına izin verir.`,"codexAuth.requestUserInputUpdated":`Özellik güncellendi.`,"codexAuth.requestUserInputUpdatedRestart":`Özellik güncellendi. Codex uygulamasını yeniden başlatın.`,"codexAuth.requestUserInputUpdateFailed":`Özellik güncellenemedi.`,"codexAuth.requestUserInputLoadFailed":`Özellik okunamadı.`,"anthropicPool.title":`Claude hesap havuzu (deneysel)`,"anthropicPool.enabledDesc":`Kullanım %{threshold} seviyesine ulaştığında sonraki anahtara geçin.`,"anthropicPool.disabledDesc":`Yalnızca aktif Claude hesabını kullanır.`,"anthropicPool.experimentalWarning":`Deneysel: Claude OAuth hesaplarını döndürmek desteklenmeyen bir kullanım yoludur ve Anthropic hesap kısıtlamalarına veya hesabın askıya alınmasına yol açabilir. Aynı kuruluşu paylaşan hesaplar oran limitlerini paylaşır ve döndürmeden ek kapasite kazanmaz. Riskleri anlamıyorsanız kapalı tutun.`,"anthropicPool.needTwoAccounts":`Havuzu etkinleştirmeden önce en az iki Claude OAuth hesabı ekleyin.`,"anthropicPool.threshold":`Yeni oturum kullanım eşiği`,"anthropicPool.thresholdAria":`Yeni oturum kullanım eşiği, yüzde`,"anthropicPool.thresholdHelp":`0 kota bazlı seçimi devre dışı bırakır. Varsayılan 80.`,"anthropicPool.thresholdInvalid":`0 ile 100 arasında bir tam sayı girin`,"anthropicPool.loadFailed":`Claude havuz ayarları yüklenemedi.`,"anthropicPool.saveFailed":`Claude havuz ayarları kaydedilemedi.`,"anthropicPool.on":`Açık`,"anthropicPool.off":`Kapalı`,"cursorPool.title":`Cursor hesap havuzu (deneysel)`,"cursorPool.enabledDesc":`429 veya kimlik doğrulama hatasında hesabı soğutur ve bu konuşma için yedeklemeye geçer. Her konuşma, bir oran sınırı veya kimlik bilgisi hatası oluşana kadar tek bir hesapta kalır.`,"cursorPool.disabledDesc":`Yalnızca aktif Cursor hesabını kullanır. Deneysel yönlendirmeyi kabul ediyorsanız etkinleştirin.`,"cursorPool.experimentalWarning":`Deneysel ve yeterince test edilmemiş. Cursor kullanım politikası oran sınırlarını aşmayı ve kullanım ölçümünü manipüle etmeyi yasaklar. Teams dahil kullanım koltuk bazlıdır ve aktarılmayabilir. Riskleri anlamıyorsanız kapalı tutun.`,"cursorPool.needTwoAccounts":`Havuzu etkinleştirmeden önce en az iki Cursor OAuth hesabı ekleyin.`,"cursorPool.loadFailed":`Cursor havuz ayarları yüklenemedi.`,"cursorPool.saveFailed":`Cursor havuz ayarları kaydedilemedi.`,"cursorPool.on":`Açık`,"cursorPool.off":`Kapalı`,"antigravityRouting.failoverOnlyTitle":`Çoklu hesap yönlendirme (yalnızca yedekleme)`,"antigravityRouting.failoverOnlyDesc":`Her konuşma tek bir Antigravity hesabında kalır. Oran sınırı 429 veya kimlik bilgisi hatasında opencodex, bu konuşma için başka bir uygun hesaba geçebilir — yeni oturumları hesaplar arasında dağıtmadan veya diğer canlı konuşmaların genel aktif hesabını değiştirmeden.`,"accountPool.strategy":`Rotasyon stratejisi`,"accountPool.strategyDesc":`OpenCodex'in yeni bir göreve nasıl hesap atayacağı.`,"accountPool.strategyQuota":`Kota`,"accountPool.strategyRoundRobin":`Round-robin`,"accountPool.strategyFillFirst":`İlk doldurma`,"accountPool.strategyHintQuota":`Kota kullanımı eşik aşıldığında hesabı değiştirebilir.`,"accountPool.strategyHintRoundRobin":`Round-robin yalnızca canlı bir hesap bağı olmayan yeni/bağımsız görevleri döndürür; mevcut görevler bağlı kalabilir ve kullanım eşiği normal rotasyonu değiştirmez.`,"accountPool.strategyHintFillFirst":`İlk doldurma eşiği boşaltma noktası olarak kullanır.`,"accountPool.unboundDefinition":`Bağlı olmayan yeni görev.`,"accountPool.stickyLimit":`Döndürmeden önceki sabit atamalar`,"accountPool.stickyLimitAria":`Döndürmeden önceki sabit atamalar`,"accountPool.stickyLimitInc":`Sabit limiti artır`,"accountPool.stickyLimitDec":`Sabit limiti azalt`,"accountPool.stickyLimitHelp":`Seçilen hesabı bu kadar yeni atama boyunca tutun.`,"accountPool.stickyLimitInvalid":`1 ile 100 arasında bir tam sayı girin`,"accountPool.strategyLoadFailed":`Strateji yüklenemedi.`,"accountPool.strategyUpdateFailed":`Strateji kaydedilemedi.`,"accountPool.priority":`Seçim sırası`,"accountPool.priorityAria":`Bu hesap için seçim sırası`,"accountPool.priorityHint":`Yüksek sayılar önce kullanılır.`,"accountPool.priorityFirst":`İlk`,"accountPool.priorityEarlier":`Daha önce`,"accountPool.priorityNormal":`Normal`,"accountPool.priorityLater":`Daha sonra`,"accountPool.priorityLast":`Son`,"accountPool.priorityOption":`{name} ({value})`,"accountPool.priorityCustom":`Özel`,"accountPool.priorityUpdated":`{email} için seçim sırası güncellendi`,"accountPool.priorityUpdateFailed":`{email} için öncelik güncellenemedi`,"codexAuth.switched":`Sonraki istek için {email} seçildi`,"codexAuth.loadFailed":`Codex hesap ayarları yüklenemedi.`,"codexAuth.switchFailed":`Hesap değiştirilemedi.`,"codexAuth.removeConfirm":`{id} kaldırılsın mı?`,"codexAuth.removeFailed":`Hesap kaldırılamadı.`,"codexAuth.addTitle":`Codex Hesabı Ekle`,"codexAuth.addIdLabel":`Hesap ID`,"codexAuth.addIdPlaceholder":`codex-is, codex-yedek...`,"codexAuth.resetCreditsAria":`{count} sıfırlama kredisi`,"codexAuth.addJsonLabel":`auth.json içeriği`,"codexAuth.addHelp":`Başka bir makineden kopyalayın.`,"codexAuth.importBtn":`İçe Aktar`,"codexAuth.importInvalidJson":`Geçersiz JSON`,"codexAuth.importMissingTokens":`Eksik jetonlar`,"codexAuth.importMissingId":`Hesap ID gereklidir`,"codexAuth.accountAdded":`Hesap havuza eklendi`,"codexAuth.addPickDesc":`Havuza eklemek için başka bir ChatGPT hesabı ile giriş yapın.`,"codexAuth.oauthLogin":`OAuth Girişi`,"codexAuth.oauthDesc":`Tarayıcıda ChatGPT girişini açar`,"codexAuth.importAuthJson":`auth.json İçe Aktar`,"codexAuth.importAuthJsonDesc":`Başka bir kurulumdan veya dışa aktarımdan`,"codexAuth.back":`Geri`,"codexAuth.oauthAlreadyInProgress":`Giriş zaten devam ediyor.`,"codexAuth.oauthWaiting":`Tarayıcıda girişin tamamlanması bekleniyor...`,"codexAuth.oauthSubmittingCode":`Kod gönderiliyor…`,"codexAuth.oauthCodeSubmitted":`Kod gönderildi — giriş bitmesi bekleniyor…`,"codexAuth.oauthStatusRetrying":`Durum kontrol edilirken hata — tekrar deneniyor…`,"codexAuth.oauthCancelled":`Giriş iptal edildi.`,"codexAuth.loginFailed":`Giriş başarısız oldu`,"codexAuth.needsReauth":`Tekrar Giriş Yap`,"codexAuth.reauthenticate":`Yeniden Doğrula`,"codexAuth.tokenExpired":`Jeton süresi doldu — hesabı yeniden doğrulayın`,"codexAuth.mainTokenExpired":`Jeton süresi doldu — tekrar giriş yapın`,"codexAuth.emailCollision":`Bu hesap ana girişinizle eşleşiyor.`,"codexAuth.resetCreditsTitle":`Kredileri Sıfırla`,"codexAuth.resetCreditsAvailable":`{count} sıfırlama krediniz var.`,"codexAuth.resetCreditsDesc":`Her kredi oran limitlerinizi anında sıfırlar.`,"codexAuth.noResetCredits":`Sıfırlama krediniz yok.`,"codexAuth.earnCreditsHint":`Krediler aylık ve tavsiye programı ile kazanılır.`,"codexAuth.creditsExpireNote":`Kredilerin süresi 30 gün içinde dolmaktadır.`,"codexAuth.useOneCredit":`1 Kredi Kullan`,"codexAuth.confirmResetTitle":`Sıfırlama Kredisi Kullanılsın mı?`,"codexAuth.confirmResetDesc":`Bu işlem oran limitlerinizi anında sıfırlayacaktır. {count} krediniz kaldı.`,"codexAuth.irreversible":`Bu işlem geri alınamaz.`,"codexAuth.useCredit":`Kredi Kullan`,"codexAuth.redeeming":`Sıfırlanıyor...`,"codexAuth.resetSuccess":`Oran limitleri sıfırlandı! Kalan kredi: {remaining}.`,"codexAuth.resetSuccessGeneric":`Oran limitleri sıfırlandı!`,"codexAuth.resetAlreadyRedeemed":`Bu kredi zaten kullanıldı.`,"codexAuth.resetNothingToReset":`Şu anda sıfırlanması gereken oran limiti yok.`,"codexAuth.resetNoCredit":`Kullanılabilir sıfırlama kredisi yok.`,"codexAuth.resetError":`Sıfırlama kredisi kullanılamadı.`,"codexAuth.fifoNote":`En eski kredi ilk önce kullanılır.`,"codexAuth.confirmWhichCredit":`{date} tarihli kredi kullanılacak.`,"codexAuth.creditNext":`Sonraki kullanılacak`,"codexAuth.creditLabel":`Kredi #{n}`,"codexAuth.creditNextBadge":`SONRAKİ`,"codexAuth.creditGranted":`Verildiği tarih {date}`,"codexAuth.creditExpires":`Son kullanma {date} ({days}gün kaldı)`,"api.title":`API Erişimi`,"api.subtitle":`Harici uygulamalardan opencodex proxy'sine erişmek için üretilen API anahtarlarını kullanın. Anahtarlar {authHeader} başlığı üzerinden kimlik doğrulaması yapar; her bir uç noktanın neleri kabul ettiğini görmek için aşağıdaki tabloya bakın.`,"api.baseUrl":`Taban URL`,"api.responsesEndpoint":`Responses API`,"api.chatCompletionsEndpoint":`Chat Completions API`,"api.messagesEndpoint":`Messages API`,"api.modelsEndpoint":`Models API`,"api.endpointNote":`OpenAI uyumlu istemcilerle taban URL'yi kullanın.`,"api.endpointsTitle":`Uç noktalar`,"api.authTitle":`Kimlik Doğrulama`,"api.authLoopback":`Geri döngü (loopback) bağlantıları (127.0.0.1 / ::1) kimlik doğrulamasını atlar. Harici/ağ istemcileri x-opencodex-api-key veya Authorization başlığında bir ocx_ API anahtarı ya da OPENCODEX_API_AUTH_TOKEN göndermelidir.`,"api.authBaseUrlNote":`İstemcileri taban URL ile yapılandırın.`,"api.newKeyTitle":`Yeni anahtar oluşturuldu`,"api.newKeyNote":`Bu anahtarı şimdi kopyalayın — tekrar gösterilmeyecektir.`,"api.copy":`Kopyala`,"api.copied":`Kopyalandı`,"api.dismiss":`Kapat`,"api.generateTitle":`Anahtar oluştur`,"api.keyNamePlaceholder":`Anahtar adı (isteğe bağlı)`,"api.generate":`Oluştur`,"api.generating":`Oluşturuluyor…`,"api.activeKeys":`Aktif anahtarlar ({count})`,"api.activeKeysLoading":`Aktif anahtarlar`,"api.noKeys":`Henüz API anahtarı yok. Yukarıdan bir tane oluşturun.`,"api.workspace.sections":`API bölümleri`,"api.section.keys":`Anahtarlar`,"api.section.connect":`Bağlan`,"api.section.endpoints":`Uç noktalar`,"api.section.models":`Modeller`,"api.section.examples":`Örnekler`,"api.workspace.details":`API anahtar detayları`,"api.workspace.keyDetails":`Anahtar detayları`,"api.workspace.keyPrefix":`Anahtar ön eki`,"api.workspace.deleteKey":`Anahtarı sil`,"api.workspace.deleteConfirm":`Bu API anahtarı silinsin mi? Bunu kullanan istemciler erişimi anında kaybedecektir. Bu işlem geri alınamaz.`,"api.workspace.usageExamples":`Kullanım örnekleri`,"api.copyUrlHint":`URL kopyalamak için tıklayın`,"api.urlCopied":`URL kopyalandı`,"api.copyExampleHint":`Örnek kopyalamak için tıklayın`,"api.exampleCopied":`Örnek kopyalandı`,"api.colName":`İsim`,"api.colKey":`Anahtar`,"api.colCreated":`Oluşturuldu`,"api.confirm":`Onayla`,"api.deleteAria":`API anahtarını sil`,"api.modelsTitle":`Harici model kataloğu`,"api.modelsCount":`{count} çağrılabilir`,"api.modelsLoading":`Modeller yükleniyor…`,"api.modelsSearch":`Modellerde ara`,"api.modelsSubtitle":`Uç noktalarınızla bu tam model ID'lerini kullanın.`,"api.modelsEmpty":`Henüz harici olarak çağrılabilir model yok.`,"api.modelsNoMatch":`“{query}” ile eşleşen model yok.`,"api.modelsLoadFailed":`Harici model kataloğu yüklenemedi.`,"api.colModel":`Model`,"api.colSource":`Kaynak`,"api.colProtocols":`Protokoller`,"api.sourceNative":`ChatGPT havuzu`,"api.sourceCombo":`Kombo rotası`,"api.sourceCustom":`Özel`,"api.protocolResponses":`Responses`,"api.protocolChatCompletions":`Chat Completions`,"api.protocolMessages":`Messages`,"api.copyModelId":`ID Kopyala`,"api.modelCopied":`Kopyalandı`,"api.testModel":`Test Et`,"api.testingModel":`Test ediliyor…`,"api.testSucceeded":`Tamam`,"api.testFailed":`Başarısız`,"api.usageChatTitle":`Chat Completions örneği`,"api.usageResponsesTitle":`Responses örneği`,"api.usageMessagesTitle":`Messages örneği`,"api.usageSampleInput":`Merhaba dünya!`,"api.clientConfig.title":`İstemci konfigürasyonu`,"api.clientConfig.rowsLabel":`Bir istemci bağlayın`,"api.clientConfig.details":`Detaylar`,"api.clientConfig.detailsAria":`{client} konfigürasyon detayları`,"api.clientConfig.copyAria":`{client} konfigürasyon JSON kopyala`,"api.clientConfig.downloadAria":`{client} konfigürasyonu indir`,"api.clientConfig.rowMeta":`{destination} · {count} model`,"api.clientConfig.rowError":`{client} konfigürasyonu oluşturulamadı.`,"api.clientConfig.copiedAnnounceClient":`{client} konfigürasyon JSON panoya kopyalandı.`,"api.clientConfig.clientOpencode":`OpenCode`,"api.clientConfig.clientPi":`Pi`,"api.clientConfig.clientHermes":`Hermes`,"api.clientConfig.clientOpenclaw":`OpenClaw`,"api.clientConfig.clientKimi":`Kimi Code`,"api.clientConfig.clientGajae":`Gajae Code`,"api.clientConfig.clientDsh":`DeepSeek Harness (DSH)`,"api.clientConfig.clientMcode":`MiniMax Code`,"api.clientConfig.clientZcode":`ZCode`,"api.clientConfig.clientPrime":`Prime Agent`,"api.clientConfig.copy":`JSON Kopyala`,"api.clientConfig.download":`İndir`,"api.clientConfig.loading":`İstemci konfigürasyonu oluşturuluyor…`,"api.clientConfig.jsonLabel":`{client} konfigürasyon JSON`,"api.clientConfig.destination":`Hedef dosya`,"api.clientConfig.envHint":`Başlatmadan önce anahtarı ayarlayın`,"api.clientConfig.mergeWarning":`Bunu hedef dosyaya birleştirin. Dosyanın üzerine yazıp değiştirmek, diğer sağlayıcılarınızı ve MCP ayarlarınızı silecektir.`,"api.clientConfig.modelCount":`{count} model dışa aktarıldı`,"api.clientConfig.missingLimits":`{total} modelden {count} tanesi bağlam sınırı olmadan gönderildi.`,"api.clientConfig.noKeyYet":`{env} arkasında henüz anahtar yok.`,"api.clientConfig.loadFailed":`Model listesi okunamadı.`,"api.clientConfig.copiedAnnounce":`İstemci konfigürasyonu JSON panoya kopyalandı.`,"api.clientConfig.copyFailed":`Kopyalanamadı.`,"api.clientConfig.downloadedAnnounce":`{filename} indirildi. Henüz hiçbir şey değişmedi — kendiniz {destination} konumuna birleştirin.`,"api.clientConfig.whereDisclosure":`Bu dosya nereye gidiyor`,"api.clientConfig.whereBody":`Yukarıdaki hedef genel (global) yoldur. Çalışma dizinindeki projeye özel bir konfigürasyon dosyası buna öncelik eder ve istemci anahtarı bu dosyadan değil, konfigürasyonda belirtilen çevre değişkeninden okur.`,"api.clientConfig.clientOmp":`OMP`,"api.keysLoadFailed":`API anahtarları yüklenemedi.`,"api.createFailed":`API anahtarı oluşturulamadı.`,"api.deleteFailed":`API anahtarı silinemedi.`,"api.auth.endpoint":`Uç nokta`,"api.auth.required":`Gerekli`,"api.auth.accepted":`Kabul edildi`,"api.auth.rejected":`Kabul edilmedi`,"api.auth.testProtocol":`{protocol} Test Et`,"api.auth.testNeedsFreshKey":`Test için bir anahtar oluşturun.`,"api.key.name":`Anahtar adı`,"api.key.rename":`Yeniden adlandır`,"api.key.saveName":`İsmi kaydet`,"api.key.renaming":`Kaydediliyor…`,"api.key.renameFailed":`Yeniden adlandırılamadı.`,"api.key.deleting":`Siliniyor…`,"api.key.copyFailed":`Otomatik kopyalanamadı. Kapatmadan önce anahtarı manuel olarak seçip kopyalayın — tekrar gösterilmeyecektir.`,"api.attribution.title":`Atfedilen kullanım`,"api.attribution.requests7d":`Son 7 gün istekleri`,"api.attribution.totalRequests":`Toplam atfedilen istekler`,"api.attribution.totalRequestsAvailable":`Mevcut geçmişteki istekler`,"api.attribution.sinceAvailable":`Mevcut atıf başlangıcı`,"api.attribution.lastUsed":`Son kullanım`,"api.attribution.since":`Atıf başlangıcı`,"api.attribution.neverUsed":`Henüz kullanılmadı`,"api.attribution.unavailable":`Kullanım mevcut değil`,"api.attribution.unavailableDetail":`Henüz kullanım atfedilmedi.`,"api.attribution.ambiguous":`İki anahtar aynı ID'yi paylaşıyor.`,"api.attribution.railAmbiguous":`mükerrer ID`,"claude.subtitle":`Claude Code içinde GPT, Gemini ve diğer modelleri kullanın.`,"claude.pageTitle":`Claude Code`,"claude.workspace.settings":`Ayarlar`,"claude.enabledLabel":`Claude bağlantısı`,"claude.enabledHint":`Kapalı olduğunda Claude Code bu proxy'yi kullanamaz.`,"claude.authMode":`Kimlik Doğrulama Modu`,"claude.authModeHint":`Abonelik Claude hesabı gerektirir, Proxy modunda gerekmez`,"claude.authModeSubscription":`Abonelik (Claude hesabı)`,"claude.authModeProxy":`Proxy (hesap gerekmez)`,"claude.authModeAuto":`Otomatik (Claude doğrulamasını algıla)`,"claude.effectiveMode.label":`Sonraki başlatmada geçerli`,"claude.effectiveMode.manual":`Manuel: {mode}`,"claude.effectiveMode.autoPresent":`Otomatik: abonelik — {source} üzerinden Claude kimliği bulundu`,"claude.effectiveMode.autoAbsent":`Otomatik: proxy modu — Claude kimliği bulunamadı`,"claude.effectiveMode.autoUnknown":`Otomatik: abonelik — doğrulanamadı`,"claude.effectiveMode.admissionKey":`Bu proxy'nin API anahtarı hâlâ gönderiliyor.`,"claude.authSource.claude-json-oauth":`Claude hesabı`,"claude.authSource.claude-credentials-file":`kimlik bilgileri dosyası`,"claude.authSource.macos-keychain":`macOS Keychain`,"claude.authSource.exported-env":`ortam değişkeni`,"claude.authSource.unknown":`algılanan bir kimlik bilgisi`,"claude.systemEnv":`Otomatik bağlan`,"claude.systemEnvDesc":`Açık olduğunda terminalde claude çalıştırmak proxy üzerinden geçer.`,"claude.systemEnvUnsupported":`Otomatik bağlanma yalnızca macOS üzerinde kullanılabilirdir. Bu sistemde Claude'u {cmd} ile başlatın.`,"claude.systemEnvWarn":`⚠ Terminal uygulamasını tamamen kapatıp yeniden açmalısınız.`,"claude.fastMode":`Hızlı Mod (OpenAI)`,"claude.fastModeDesc":`OpenAI modelleri için service_tier ayarını kontrol eder.`,"claude.fastAuto":`Otomatik`,"claude.fastOn":`AÇIK`,"claude.fastOff":`KAPALI`,"claude.autoContext":`Otomatik büyük bağlam kullan`,"claude.autoContextDesc":`1M işaretinin ne kadar ileri gideceğini kontrol eder. AÇIK: penceresi sıkıştırma eşiğini barındırabilen her model 1M aralığı kazanır. KAPALI: yalnızca gerçek 1M modelleri alır.`,"claude.autoContextInert":`Pasif durumdadır çünkü konfigürasyon dosyasında eski bir bağlam boyutu değeri (maxContextTokens) var. Yeniden etkinleştirmek için oradan kaldırın.`,"claude.autoCompactWindow":`Otomatik özetleme noktası`,"claude.autoCompactDefault":`{value} (varsayılan)`,"claude.autoCompactWindowDesc":`Sohbet bu noktaya ulaştığında eski mesajlar özetlenir. Her modelin kendi sınırını asla aşmaz, bu nedenle 200k modeller etkilenmez.`,"claude.autoCompactWindowWarn":`Bunu değiştirmek GPT modellerini bozabilir — bir modelin gerçek sınırından daha yüksek ayarlanırsa, sohbetler özet devreye girmeden önce hata verecektir.`,"claude.injectAgents":`Alt ajanları otomatik kaydet`,"claude.injectAgentsDesc":`Alt Ajanlar sekmesinde seçilen modelleri (ve mevcut varsayılan modeli) çağrılabilir Claude Code ajanları (ocx-*) olarak kaydeder. Sonraki oturumdan itibaren uygulanır.`,"claude.webSearchSidecar":`Web arama yan araç geçersiz kılması`,"claude.webSearchSidecarHint":`Claude Code istekleri için ana web arama sidecar'ını geçersiz kılın.`,"claude.visionSidecar":`Görsel yan araç geçersiz kılması`,"claude.visionSidecarHint":`Claude Code istekleri için ana görsel sidecar'ını geçersiz kılın.`,"claude.useMainSetting":`Ana ayarı kullan`,"claude.sidecarModelPlaceholder":`Ana ayar modeli`,"claude.quickstart":`Başlarken`,"claude.quickstartHint":`{cmd} Claude Code'u proxy üzerinden açar. claude.ai girişiniz aktif kalır.`,"claude.manualEnv":`Manuel kurulum (gelişmiş)`,"claude.smallFastModel":`Arka plan yardımcı modeli`,"claude.smallFastModelHint":`Claude Code'un sohbet özetleri ve konu tespiti gibi arka plan işleri için kullandığı model. haiku alt ajan takma adı da bunu kullanır. Boş = Claude varsayılanı (Haiku).`,"claude.smallFastModelAccurateHint":`Claude Code'un sohbet özetleri ve konu tespiti gibi arka plan işleri için kullandığı model. haiku alt ajan takma adı da bunu kullanır.`,"claude.smallFastModelUnsetOption":`Bırakın Claude Code seçsin (yerel model)`,"claude.smallFastModelNativeWarning":`Ayarlanmadığında, OpenCodex yardımcı model geçersiz kılmalarını boş bırakır. Claude Code kendi yerel Sonnet modelini kullanabilir ve bu durum yerel sağlayıcınızdan ücret alınmasına yol açabilir.`,"claude.slotUnset":`Claude varsayılanını kullan`,"claude.modelMap":`Model yakalama`,"claude.modelMapHint":`Belirli bir model isteklerini yakalar ve seçtiğiniz modele yönlendirir.`,"claude.mapFrom":`Orijinal model (örn. claude-sonnet-4-5)`,"claude.mapTo":`Değiştirilecek model (örn. gemini/gemini-3-pro)`,"claude.addMapping":`Kural ekle`,"claude.removeMapping":`Kuralı kaldır`,"claude.aliases":`Kullanılabilir modeller`,"claude.aliasesHint":`Claude Code'un /model menüsünde görünen modeller.`,"claude.aliasProviderOther":`Diğer`,"claude.loading":`Yükleniyor…`,"claude.loadFail":`Claude ayarları yüklenemedi`,"claude.saved":`Kaydedildi.`,"claude.saveFailed":`Kaydetme başarısız`,"claude.networkError":`Ağ hatası — proxy çalışıyor mu?`,"claude.toggleAria":`Claude bağlantısını değiştir`,"claude.none":`Yok`,"cws.loading":`Kombolar yükleniyor…`,"cws.loadFailed":`Kombolar yüklenemedi.`,"cws.saveFailed":`Kombo kaydedilemedi.`,"cws.removeFailed":`Kombo kaldırılamadı.`,"cws.saved":`Kombo kaydedildi.`,"cws.created":`{model} oluşturuldu.`,"cws.removed":`combo/{id} kaldırıldı.`,"cws.renamed":`{from}, {to} olarak yeniden adlandırıldı.`,"cws.add":`Kombo ekle`,"cws.addTitle":`Kombo ekle`,"cws.addSubtitle":`Sağlayıcılar arasında sanal bir model oluşturun.`,"cws.create":`Kombo oluştur`,"cws.railAria":`Kombo listesi`,"cws.searchPlaceholder":`Kombolarda veya hedeflerde ara…`,"cws.noSearchResults":`Aramanızla eşleşen kombo yok.`,"cws.group.failover":`Yedekli (Failover)`,"cws.group.roundRobin":`Round-robin`,"cws.targetCount":`{count} hedef`,"cws.targetCountOne":`1 hedef`,"cws.overviewTitle":`Kombolar`,"cws.overviewBlurb":`Sağlayıcı/model hedefleri arasında devreden sanal modeller.`,"cws.count.total":`Toplam`,"cws.count.failover":`Failover`,"cws.count.roundRobin":`Round-robin`,"cws.howTitle":`Nasıl çalışır`,"cws.howBody":`Codex'ten kombonun kamuya açık model adını isteyin. Bir ad olmadan varsayılan combo/<id> şeklindedir. OpenCodex bir hedef seçer ve yalnızca yeniden denenebilir yukarı akış hatalarında atlar. Hiçbir hedef kullanılabilir kalmazsa, istek küresel varsayılan sağlayıcıyı kullanmak yerine kapalı olarak başarısız olur (fail closed).`,"cws.attentionTitle":`Dikkat gerekiyor`,"cws.attention.empty":`Yapılandırılmış hedef yok`,"cws.attention.few":`Yalnızca bir hedef — geçiş yapılacak yer yok`,"cws.attention.catalogOmitted":`Model kataloğunda eksik — üye yetenekleri eksik veya uyumsuz (eksik bağlam penceresi / meta veri veya boş modalite kesişimi). Takma ada göre yönlendirme hâlâ çalışır`,"cws.attention.allTargetsExhausted":`Etkin hedeflerin tüm kotaları tükendi`,"cws.emptyTitle":`İlk kombonuzu oluşturun`,"cws.empty.createDesc":`Sanal bir model adlandırın ve iki veya daha fazla arka ucu bağlayın.`,"cws.backToAll":`Tüm kombolara dön`,"cws.allCombos":`Tüm kombolar`,"cws.copyModel":`ID kopyala`,"cws.copied":`Kopyalandı`,"cws.tabsLabel":`Kombo detay bölümleri`,"cws.tab.config":`Konfigürasyon`,"cws.tab.about":`Hakkında`,"cws.strategy":`Strateji`,"cws.strategy.failover":`Yedekli (Failover)`,"cws.strategy.roundRobin":`Round-robin`,"cws.strategy.failoverHint":`Hedefleri sırayla deneyin. İlk hedef yeniden denenebilir bir hatayla (oran sınırı, kesinti, abonelik engeli) başarısız olursa sonraki hedefe atlayın.`,"cws.strategy.roundRobinHint":`Trafiği ağırlığa göre kararlı bir şekilde dengeleyin. Seçilen her hedefi bir dizi başarılı istek boyunca tutun, ardından ilerleyin.`,"cws.field.id":`Kombo ID`,"cws.field.idHint":`İstemciler {model} isteyecek`,"cws.field.idInternalHint":`Dahili kombo ID. Oluşturduktan sonra değiştirebilirsiniz.`,"cws.field.idHintEdit":`Yeniden adlandırmak komboyu yeni bir ID'ye taşır. İstemciler {model} ister.`,"cws.field.alias":`Genel model adı`,"cws.field.aliasPlaceholder":`deepseek-v4-flash veya üretici/model`,"cws.field.aliasHint":`İsteğe bağlı. Ön eki olmayan yalın bir ad, üretici/model gibi özel bir ön ek kullanın veya combo/<id> kullanmak için boş bırakın.`,"cws.field.nativeAlias":`Yerel OpenAI takma adı`,"cws.field.nativeAliasHint":`Bu kombonun desteklenen nitelemesiz yerel bir OpenAI model kimliğine sahip olmasına izin verin. Hesap ve sağlayıcı nitelikli OpenAI rotaları ayrı kalır.`,"cws.field.displayName":`Görünen ad`,"cws.field.displayNameHint":`Bu kombo için seçici etiketi. Yerel OpenAI takma adı etkinleştirildiğinde gereklidir.`,"cws.field.stickyLimit":`Döndürmeden önceki sabit başarılar`,"cws.field.stickyLimitHint":`Ağırlıklı seçici ilerlemeden önce seçilen hedefi bu kadar başarılı istek boyunca tutun.`,"cws.field.defaultEffort":`Varsayılan akıl yürütme`,"cws.field.defaultEffortNone":`Yok (hedef varsayılanı)`,"cws.field.defaultEffortHint":`Yalnızca istemci akıl yürütme çabasını belirtmediğinde (atladığında) kullanılır. Seçenekler, seçilen hedeflerin duyurulan çabalarının kesişimidir; katalog çaba meta verisi olmayan hedefler hiçbir seçenek sunmaz.`,"cws.capability.imageInputUnavailable":`Seçilen tüm hedefler görsel girişini destekleyene kadar kullanılamaz.`,"cws.capability.imageInputHint":`Tüm hedefler görselleri desteklediğinde varsayılan olarak açıktır. Yalnızca metin kabul etmek için kapatın.`,"cws.capability.imageInput":`Görsel / çok modlu`,"cws.capabilities":`Yetenekler`,"cws.field.defaultEffortUnsupported":`Bu çaba hedeflerin ortak merdiveninde yok — istek anında yok sayılacak veya uydurulacaktır.`,"cws.field.defaultEffortUnsupportedOption":`kesişimde değil`,"cws.targets":`Hedefler`,"cws.targets.failoverHint":`Sıralama önemlidir — birincil olan ilktir.`,"cws.targets.roundRobinHint":`Ağırlıklar kararlı bağıntılı seçimi kontrol eder; sıralama rotasyon halkasındaki eşitlikleri bozar.`,"cws.target.provider":`Sağlayıcı`,"cws.target.model":`Model`,"cws.target.weight":`Ağırlık`,"cws.target.pickProvider":`Sağlayıcı seçin…`,"cws.target.pickProviderFirst":`Önce bir sağlayıcı seçin…`,"cws.target.pickModel":`Model seçin…`,"cws.target.noModels":`Bu sağlayıcı için model yok`,"cws.target.modelPlaceholder":`model ID`,"cws.target.add":`Hedef ekle`,"cws.target.drag":`Yeniden sıralamak için sürükleyin`,"cws.target.moveUp":`Yukarı taşı`,"cws.target.moveDown":`Aşağı taşı`,"cws.quota.available":`Kullanılabilir`,"cws.quota.exhausted":`Kota tükendi`,"cws.quota.unknown":`Kota bilinmiyor`,"cws.quota.allExhausted":`Etkin hedeflerin tüm kotaları tükendi. Başka bir hedef seçin veya kotanın yenilenmesini bekleyin.`,"cws.aboutTitle":`Çalışma zamanı`,"cws.aboutBody":`Başarısız hedefler Retry-After süresine uyarak kısa süreliğine soğumaya alınır. Geçersiz istek veya bağlam (context) hataları diğer hedefe atlamaz. Her hedef çabayı kendi yeteneklerine uyarlar; tükenen kombolar kapalı olarak başarısız olur (fail closed). Günlükler ve Kullanım bölümü sıralı fiziksel denemeleri ve deneme başına kullanımı saklar.`,"cws.removeConfirmTitle":`{model} kaldırılsın mı?`,"cws.removeConfirmDesc":`Bu işlem sanal modeli konfigürasyondan ve Codex kataloğundan kaldırır. Hiçbir sağlayıcıyı silmez.`,"cws.unsavedTitle":`Kaydedilmemiş değişiklikler`,"cws.unsavedDesc":`Düzenlemelerden vazgeçip devam edilsin mi?`,"cws.keepEditing":`Düzenlemeye devam et`,"cws.err.missingId":`Kombo ID gereklidir.`,"cws.err.invalidId":`ID harf veya sayı ile başlamalıdır.`,"cws.err.duplicateId":`Bu ID ile bir kombo zaten var.`,"cws.err.invalidAlias":`Takma ad geçerli karakterler içermelidir.`,"cws.err.aliasReservedNamespace":`Takma ad ayrılmış namespace kullanamaz.`,"cws.err.aliasNativeFamily":`Yerel OpenAI isimlerine izin verilmez.`,"cws.err.unsupportedNativeAlias":`Yerel takma ad, şu anda desteklenen yalın bir OpenAI model kimliği olmalıdır.`,"cws.err.missingNativeAliasDisplayName":`Yerel takma adlar için bir görünen ad gereklidir.`,"cws.err.invalidDisplayName":`Görünen ad en fazla 128 karakter olmalı ve kontrol karakteri içermemelidir.`,"cws.err.duplicateAlias":`Başka bir kombo bu takma adı zaten kullanıyor.`,"cws.err.noTargets":`En az bir hedef ekleyin.`,"cws.err.incompleteTarget":`Her hedefin bir sağlayıcısı ve modeli olmalıdır.`,"cws.target.disabled":`{name} (devre dışı)`,"cws.err.reservedNamespace":`Önce fiziksel sağlayıcı yeniden adlandırılmalıdır.`,"cws.err.providerCollision":`Kombo ID'si bir sağlayıcı adı ile çakışıyor.`,"cws.err.unknownProvider":`Her hedef yapılandırılmış bir sağlayıcı kullanmalıdır.`,"cws.err.duplicateTarget":`Aynı hedef yalnızca bir kez görünebilir.`,"cws.err.invalidStickyLimit":`Limit 1 ile 100 arasında bir tam sayı olmalıdır.`,"cws.err.invalidWeight":`Ağırlık 1 ile 10000 arasında olmalıdır.`,"cws.err.noEnabledTarget":`En az bir hedef etkin bir sağlayıcı kullanmalıdır.`,"claude.tabsLabel":`Claude istemcisi`,"claude.tabCode":`Code`,"claude.tabDesktop":`Desktop`,"claudeDesktop.title":`Claude Desktop`,"claudeDesktop.subtitle":`Claude model ailelerini {port} portundaki bir modele yönlendirin.`,"claudeDesktop.importJson":`JSON İçe Aktar`,"claudeDesktop.exportJson":`JSON Dışa Aktar`,"claudeDesktop.loading":`Claude Desktop profili yükleniyor…`,"claudeDesktop.loadFail":`Claude Desktop profili yüklenemedi.`,"claudeDesktop.retry":`Tekrar Dene`,"claudeDesktop.saveFailed":`Claude Desktop profili kaydedilemedi.`,"claudeDesktop.applyFailed":`Profil kaydedildi ancak uygulanamadı.`,"claudeDesktop.updateFailed":`Güncelleme başarısız oldu.`,"claudeDesktop.savedApplied":`Profil kaydedildi ve uygulandı.`,"claudeDesktop.appliedMarkerUnsaved":`Profil uygulandı ancak işaretçi kaydedilmedi.`,"claudeDesktop.savedAppliedAnnounce":`Profil kaydedildi ve uygulandı.`,"claudeDesktop.saved":`Profil kaydedildi.`,"claudeDesktop.savedAnnounce":`Profil kaydedildi.`,"claudeDesktop.exported":`Profil JSON olarak dışa aktarıldı.`,"claudeDesktop.importExpected":`Sürüm 1 profili bekleniyordu.`,"claudeDesktop.importReady":`JSON içe aktarıldı.`,"claudeDesktop.importedAnnounce":`Profil JSON içe aktarıldı.`,"claudeDesktop.importInvalid":`Seçilen dosya geçerli bir profil değil.`,"claudeDesktop.importFailed":`İçe aktarma başarısız oldu. {error}`,"claudeDesktop.moved":`{route}, {family} ailesine taşındı.`,"claudeDesktop.unsaved":`Kaydedilmemiş değişiklikler`,"claudeDesktop.upToDate":`Profil güncel`,"claudeDesktop.saving":`Kaydediliyor…`,"claudeDesktop.applying":`Uygulanıyor…`,"claudeDesktop.saveApply":`Kaydet & uygula`,"claudeDesktop.emptyTitle":`Kullanılabilir model yok`,"claudeDesktop.emptyHint":`Bir sağlayıcı ekleyin veya etkinleştirin.`,"claudeDesktop.assignmentsLabel":`Claude model ailesi atamaları`,"claudeDesktop.family.opus":`Opus`,"claudeDesktop.family.fable":`Fable`,"claudeDesktop.family.sonnet":`Sonnet`,"claudeDesktop.family.haiku":`Haiku`,"claudeDesktop.modelCountOne":`{count} model`,"claudeDesktop.modelCountMany":`{count} model`,"claudeDesktop.chooseDefault":`Bir varsayılan seçin`,"claudeDesktop.temporaryDefault":`Geçici varsayılan`,"claudeDesktop.laneEmpty":`Buraya bir model sürükleyin.`,"claudeDesktop.laneNoMatch":`Bu ailede aramanızla eşleşen model yok.`,"nav.grok":`Grok`,"grok.title":`Grok Build`,"grok.subtitle":`opencodex'in Grok konfigürasyonunuza kaydettiği modeller.`,"grok.loading":`Grok durumu yükleniyor…`,"grok.loadFail":`Grok konfigürasyonu okunamadı.`,"grok.notConfiguredTitle":`Grok Build henüz bağlanmadı`,"grok.notConfiguredHint":`Proxy'yi Grok yüklüyken başlatın.`,"grok.endpoint":`Uç nokta`,"grok.colModel":`Model`,"grok.colAlias":`Grok takma adı`,"grok.colContext":`Bağlam`,"grok.groupNative":`Yerel modeller`,"grok.groupRouted":`Yönlendirilen modeller`,"grok.enabledCount":`{total} modelden {on} tanesi kayıtlı`,"grok.saved":`Seçim kaydedildi.`,"grok.savedApplied":`Seçim kaydedildi ve Grok konfigürasyonuna yazıldı.`,"grok.saveFailed":`Grok seçimi kaydedilemedi.`,"grok.applyFailed":`Seçim kaydedildi ancak Grok güncellenemedi.`,"grok.applySkipped":`Seçim kaydedildi.`,"grok.saveApply":`Kaydet & uygula`,"grok.saving":`Kaydediliyor…`,"grok.applying":`Uygulanıyor…`,"grok.unsaved":`Kaydedilmemiş değişiklikler`,"grok.upToDate":`Seçim güncel`,"grok.toggleModel":`{id} modelini Grok ile kaydet`,"claudeDesktop.available":`Kullanılabilir`,"claudeDesktop.defaultBadge":`Varsayılan`,"claudeDesktop.supports1m":`1M`,"claudeDesktop.unavailable":`Kullanılamıyor`,"claudeDesktop.contextM":`{n}M bağlam`,"claudeDesktop.contextK":`{n}k bağlam`,"claudeDesktop.contextUnknown":`bağlam bilinmiyor`,"claudeDesktop.alias":`Takma Ad`,"claudeDesktop.useAsDefault":`{family} varsayılanı olarak kullan`,"claudeDesktop.moveTo":`Şuraya taşı`,"claudeDesktop.move":`Taşı`,"claudeDesktop.status.applied":`Desktop'a Uygulandı`,"claudeDesktop.status.stale":`Konfigürasyon eski — tekrar uygulayın`,"claudeDesktop.status.notApplied":`Uygulanmadı`,"claudeDesktop.status.notActiveProfile":`Desktop başka bir profil kullanıyor`,"claudeDesktop.status.disabled":`Claude Desktop entegrasyonu kapalı.`,"claudeDesktop.enableApply":`Etkinleştir ve uygula`,"claudeDesktop.health.lastRequest":`Son istek`,"claudeDesktop.health.stats":`{count} istek / {errors} hata`,"claudeDesktop.effort.supported":`çaba`,"claudeDesktop.effort.displayOnly":`çaba (yalnızca ekran)`,"lab.title":`Compatibility Lab`,"lab.subtitle":`Read-only compatibility verdict matrix from lab projection evidence.`,"lab.loadFailed":`Could not load compatibility lab data`,"lab.projectionUnavailable":`Lab projection is not available. Run conformance or live probes first.`,"lab.projectionIncompatible":`Lab projection schema is incompatible. Rebuild the projection.`,"lab.statusTitle":`Projection status`,"lab.matrixTitle":`Compatibility matrix`,"lab.verdictsTitle":`Verdict records`,"lab.filter.layer":`Evidence layer`,"lab.filter.verdict":`Verdict`,"lab.filter.subject":`Subject ID`,"lab.filter.all":`All`,"lab.col.subject":`Subject`,"lab.col.layer":`Layer`,"lab.col.suite":`Suite`,"lab.col.verdict":`Verdict`,"lab.col.asOf":`As of`,"lab.col.protocol":`Protocol conformance`,"lab.col.live":`Live route compatibility`,"lab.col.task":`Task effectiveness`,"lab.empty":`No compatibility verdicts in the projection yet.`,"lab.subjectKind":`Kind`,"lab.observationCount":`Observations`,"lab.eventCount":`Events`,"lab.verdictCount":`Verdicts`,"lab.subjectCount":`Subjects`,"lab.builtAt":`Built`,"lab.loading":`Loading compatibility evidence…`,"lab.loadMore":`Load more`,"lab.detailTitle":`Verdict detail`,"lab.detailClose":`Close`,"lab.detailSubject":`Subject`,"lab.detailObservations":`Observations`,"lab.detailEvents":`Contributing events`,"lab.detailArtifacts":`Artifact metadata`,"lab.production.title":`Gözlemlenen üretim trafiği`,"lab.production.notVerification":`Lab doğrulaması değildir`,"lab.production.attempts":`Denemeler`,"lab.production.successes":`Başarılı denemeler`,"lab.production.routeErrors":`Rota hataları`,"lab.production.lastObserved":`Son gözlem`,"lab.detailLoadFailed":`Could not load verdict detail`,"lab.refresh":`Refresh`,"lab.verdict.UNKNOWN":`Unknown`,"lab.verdict.CLAIMED":`Claimed`,"lab.verdict.PROBED":`Probed`,"lab.verdict.VERIFIED":`Verified`,"lab.verdict.DEGRADED":`Degraded`,"lab.verdict.BLOCKED":`Blocked`,"lab.verdict.UNSUPPORTED":`Unsupported`,"lab.layer.protocol_conformance":`Protocol conformance`,"lab.layer.live_route_compatibility":`Live route compatibility`,"lab.layer.task_effectiveness":`Task effectiveness`,"dash.visionAdvanced":`Gelişmiş ayarlar`,"dash.visionMaxDescriptions":`Tur başına en fazla açıklama`,"dash.visionMaxDescriptionsInvalid":`Pozitif bir tam sayı girin.`,"dash.visionTimeout":`Zaman aşımı`,"dash.visionTimeoutInvalid":`{min} ile {max} milisaniye arasında bir tam sayı girin.`,"dash.visionAdvancedPopover":`Gelişmiş görsel ayarları`,"sub.routedDelegationBridge":`Yönlendirilmiş V2 yetkilendirme köprüsü`,"sub.routedDelegationBridgeHint":`Deneyseldir. Etkinken oluşturma, gönderme ve takip mesajları, yerel ajanlar arası delegasyon dahil düz metindir. Codex özgün modeli gösterebilir; yönlendirilen içerik ve gizlilik seçilen sağlayıcıya bağlıdır.`,"sub.routedDelegationBridgeInactive":`Hazır; yalnızca uygun yerel V2 kökleri için etkinleşir.`,"sub.routedDelegationBridgeSaveFail":`Yönlendirilmiş V2 yetkilendirme köprüsü kaydedilemedi`,"sub.routedDelegationBridgeSaved":`Yönlendirilmiş V2 yetkilendirme köprüsü kaydedildi. Devre dışı bırakma hemen uygulanır.`,"models.newPolicyGlobal":`Yeni modeller devre dışı başlasın`,"models.newPolicyProvider":`Yeni model ilkesi`,"models.newPolicy_inherit":`Devral`,"models.newPolicy_off":`Kapalı`,"models.newPolicy_on":`Açık`,"models.newBadge":`YENİ`,"models.newCount":`{count} yeni, kapalı`,"models.aliases":`Takma adlar`,"models.aliasesTable":`Takma ad tablosu`,"models.aliasPrompt":`Sağlayıcı takma adı (temizlemek için boş bırakın)`,"models.modelAliasPrompt":`Model takma adı (temizlemek için boş bırakın)`,"models.aliasSaved":`Takma ad kaydedildi`,"models.aliasConflict":`Bu takma ad mevcut bir adla çakışıyor`,"models.editProviderAlias":`Sağlayıcı takma adını düzenle`,"models.editModelAlias":`Model takma adını düzenle`,"models.useDefaultAliases":`Varsayılan takma adları kullan`,"models.useDefaultAliasesGlobal":`Varsayılan takma adları her yerde kullan`,"models.aliasAuto":`otomatik`,"models.aliasUser":`kullanıcı`,"models.aliasStale":`eski`},C={en:{"lab.title":`Compatibility Lab`,"lab.subtitle":`Read-only compatibility verdict matrix from lab projection evidence.`,"lab.loadFailed":`Could not load compatibility lab data`,"lab.projectionUnavailable":`Lab projection is not available. Run conformance or live probes first.`,"lab.projectionIncompatible":`Lab projection schema is incompatible. Rebuild the projection.`,"lab.statusTitle":`Projection status`,"lab.matrixTitle":`Compatibility matrix`,"lab.verdictsTitle":`Verdict records`,"lab.filter.layer":`Evidence layer`,"lab.filter.verdict":`Verdict`,"lab.filter.subject":`Subject ID`,"lab.filter.all":`All`,"lab.col.subject":`Subject`,"lab.col.layer":`Layer`,"lab.col.suite":`Suite`,"lab.col.verdict":`Verdict`,"lab.col.asOf":`As of`,"lab.col.protocol":`Protocol conformance`,"lab.col.live":`Live route compatibility`,"lab.col.task":`Task effectiveness`,"lab.empty":`No compatibility verdicts in the projection yet.`,"lab.subjectKind":`Kind`,"lab.observationCount":`Observations`,"lab.eventCount":`Events`,"lab.verdictCount":`Verdicts`,"lab.subjectCount":`Subjects`,"lab.builtAt":`Built`,"lab.loading":`Loading compatibility evidence…`,"lab.loadMore":`Load more`,"lab.detailTitle":`Verdict detail`,"lab.detailClose":`Close`,"lab.detailSubject":`Subject`,"lab.detailObservations":`Observations`,"lab.detailEvents":`Evidence events`,"lab.detailArtifacts":`Artifact metadata`,"lab.detailLoadFailed":`Could not load verdict detail`,"lab.refresh":`Refresh`,"lab.verdict.UNKNOWN":`Unknown`,"lab.verdict.CLAIMED":`Claimed`,"lab.verdict.PROBED":`Probed`,"lab.verdict.VERIFIED":`Verified`,"lab.verdict.DEGRADED":`Degraded`,"lab.verdict.BLOCKED":`Blocked`,"lab.verdict.UNSUPPORTED":`Unsupported`,"lab.layer.protocol_conformance":`Protocol conformance`,"lab.layer.live_route_compatibility":`Live route compatibility`,"lab.layer.task_effectiveness":`Task effectiveness`},de:{"lab.title":`Kompatibilitäts-Labor`,"lab.subtitle":`Schreibgeschützte Kompatibilitätsmatrix aus den Evidenzen der Lab-Projektion.`,"lab.loadFailed":`Kompatibilitätsdaten konnten nicht geladen werden`,"lab.projectionUnavailable":`Die Lab-Projektion ist nicht verfügbar. Führe zuerst Konformitäts- oder Live-Probes aus.`,"lab.projectionIncompatible":`Das Schema der Lab-Projektion ist inkompatibel. Baue die Projektion neu auf.`,"lab.statusTitle":`Projektionsstatus`,"lab.matrixTitle":`Kompatibilitätsmatrix`,"lab.verdictsTitle":`Urteilsdatensätze`,"lab.filter.layer":`Evidenzschicht`,"lab.filter.verdict":`Urteil`,"lab.filter.subject":`Subjekt-ID`,"lab.filter.all":`Alle`,"lab.col.subject":`Subjekt`,"lab.col.layer":`Schicht`,"lab.col.suite":`Suite`,"lab.col.verdict":`Urteil`,"lab.col.asOf":`Stand`,"lab.col.protocol":`Protokollkonformität`,"lab.col.live":`Live-Route-Kompatibilität`,"lab.col.task":`Aufgabenwirksamkeit`,"lab.empty":`In der Projektion gibt es noch keine Kompatibilitätsurteile.`,"lab.subjectKind":`Art`,"lab.observationCount":`Beobachtungen`,"lab.eventCount":`Ereignisse`,"lab.verdictCount":`Urteile`,"lab.subjectCount":`Subjekte`,"lab.builtAt":`Erstellt`,"lab.loading":`Kompatibilitätsevidenz wird geladen…`,"lab.loadMore":`Mehr laden`,"lab.detailTitle":`Urteilsdetails`,"lab.detailClose":`Schließen`,"lab.detailSubject":`Subjekt`,"lab.detailObservations":`Beobachtungen`,"lab.detailEvents":`Evidenzereignisse`,"lab.detailArtifacts":`Artefakt-Metadaten`,"lab.detailLoadFailed":`Urteilsdetails konnten nicht geladen werden`,"lab.refresh":`Aktualisieren`,"lab.verdict.UNKNOWN":`Unbekannt`,"lab.verdict.CLAIMED":`Behauptet`,"lab.verdict.PROBED":`Geprüft`,"lab.verdict.VERIFIED":`Verifiziert`,"lab.verdict.DEGRADED":`Eingeschränkt`,"lab.verdict.BLOCKED":`Blockiert`,"lab.verdict.UNSUPPORTED":`Nicht unterstützt`,"lab.layer.protocol_conformance":`Protokollkonformität`,"lab.layer.live_route_compatibility":`Live-Route-Kompatibilität`,"lab.layer.task_effectiveness":`Aufgabenwirksamkeit`},fr:{"lab.title":`Laboratoire de compatibilité`,"lab.subtitle":`Matrice en lecture seule des verdicts de compatibilité fondée sur les preuves de la projection du laboratoire.`,"lab.loadFailed":`Impossible de charger les données du laboratoire de compatibilité`,"lab.projectionUnavailable":`La projection du laboratoire n’est pas disponible. Exécutez d’abord les sondes de conformité ou en conditions réelles.`,"lab.projectionIncompatible":`Le schéma de la projection du laboratoire est incompatible. Reconstruisez la projection.`,"lab.statusTitle":`État de la projection`,"lab.matrixTitle":`Matrice de compatibilité`,"lab.verdictsTitle":`Enregistrements des verdicts`,"lab.filter.layer":`Couche de preuves`,"lab.filter.verdict":`Verdict`,"lab.filter.subject":`ID du sujet`,"lab.filter.all":`Tous`,"lab.col.subject":`Sujet`,"lab.col.layer":`Couche`,"lab.col.suite":`Suite`,"lab.col.verdict":`Verdict`,"lab.col.asOf":`Établi le`,"lab.col.protocol":`Conformité au protocole`,"lab.col.live":`Compatibilité du routage en conditions réelles`,"lab.col.task":`Efficacité des tâches`,"lab.empty":`La projection ne contient encore aucun verdict de compatibilité.`,"lab.subjectKind":`Type`,"lab.observationCount":`Observations`,"lab.eventCount":`Événements`,"lab.verdictCount":`Verdicts`,"lab.subjectCount":`Sujets`,"lab.builtAt":`Générée le`,"lab.loading":`Chargement des preuves de compatibilité…`,"lab.loadMore":`Charger plus`,"lab.detailTitle":`Détails du verdict`,"lab.detailClose":`Fermer`,"lab.detailSubject":`Sujet`,"lab.detailObservations":`Observations`,"lab.detailEvents":`Événements probants`,"lab.detailArtifacts":`Métadonnées des artefacts`,"lab.detailLoadFailed":`Impossible de charger les détails du verdict`,"lab.refresh":`Actualiser`,"lab.verdict.UNKNOWN":`Inconnu`,"lab.verdict.CLAIMED":`Déclaré`,"lab.verdict.PROBED":`Sondé`,"lab.verdict.VERIFIED":`Vérifié`,"lab.verdict.DEGRADED":`Dégradé`,"lab.verdict.BLOCKED":`Bloqué`,"lab.verdict.UNSUPPORTED":`Non pris en charge`,"lab.layer.protocol_conformance":`Conformité au protocole`,"lab.layer.live_route_compatibility":`Compatibilité du routage en conditions réelles`,"lab.layer.task_effectiveness":`Efficacité des tâches`},ko:{"lab.title":`호환성 랩`,"lab.subtitle":`랩 프로젝션 증거를 기반으로 한 읽기 전용 호환성 판정 매트릭스입니다.`,"lab.loadFailed":`호환성 랩 데이터를 불러오지 못했습니다`,"lab.projectionUnavailable":`랩 프로젝션을 사용할 수 없습니다. 먼저 적합성 또는 라이브 프로브를 실행하세요.`,"lab.projectionIncompatible":`랩 프로젝션 스키마가 호환되지 않습니다. 프로젝션을 다시 빌드하세요.`,"lab.statusTitle":`프로젝션 상태`,"lab.matrixTitle":`호환성 매트릭스`,"lab.verdictsTitle":`판정 레코드`,"lab.filter.layer":`증거 레이어`,"lab.filter.verdict":`판정`,"lab.filter.subject":`대상 ID`,"lab.filter.all":`전체`,"lab.col.subject":`대상`,"lab.col.layer":`레이어`,"lab.col.suite":`스위트`,"lab.col.verdict":`판정`,"lab.col.asOf":`기준 시각`,"lab.col.protocol":`프로토콜 적합성`,"lab.col.live":`라이브 경로 호환성`,"lab.col.task":`작업 효과성`,"lab.empty":`프로젝션에 아직 호환성 판정이 없습니다.`,"lab.subjectKind":`종류`,"lab.observationCount":`관측`,"lab.eventCount":`이벤트`,"lab.verdictCount":`판정`,"lab.subjectCount":`대상`,"lab.builtAt":`빌드 시각`,"lab.loading":`호환성 증거를 불러오는 중…`,"lab.loadMore":`더 불러오기`,"lab.detailTitle":`판정 상세`,"lab.detailClose":`닫기`,"lab.detailSubject":`대상`,"lab.detailObservations":`관측`,"lab.detailEvents":`증거 이벤트`,"lab.detailArtifacts":`아티팩트 메타데이터`,"lab.detailLoadFailed":`판정 상세를 불러오지 못했습니다`,"lab.refresh":`새로고침`,"lab.verdict.UNKNOWN":`알 수 없음`,"lab.verdict.CLAIMED":`주장됨`,"lab.verdict.PROBED":`프로브됨`,"lab.verdict.VERIFIED":`검증됨`,"lab.verdict.DEGRADED":`저하됨`,"lab.verdict.BLOCKED":`차단됨`,"lab.verdict.UNSUPPORTED":`지원되지 않음`,"lab.layer.protocol_conformance":`프로토콜 적합성`,"lab.layer.live_route_compatibility":`라이브 경로 호환성`,"lab.layer.task_effectiveness":`작업 효과성`},zh:{"lab.title":`兼容性实验室`,"lab.subtitle":`基于实验室投影证据的只读兼容性判定矩阵。`,"lab.loadFailed":`无法加载兼容性实验室数据`,"lab.projectionUnavailable":`实验室投影不可用。请先运行一致性探测或实时探测。`,"lab.projectionIncompatible":`实验室投影架构不兼容。请重新构建投影。`,"lab.statusTitle":`投影状态`,"lab.matrixTitle":`兼容性矩阵`,"lab.verdictsTitle":`判定记录`,"lab.filter.layer":`证据层`,"lab.filter.verdict":`判定`,"lab.filter.subject":`主体 ID`,"lab.filter.all":`全部`,"lab.col.subject":`主体`,"lab.col.layer":`层`,"lab.col.suite":`测试套件`,"lab.col.verdict":`判定`,"lab.col.asOf":`截至`,"lab.col.protocol":`协议一致性`,"lab.col.live":`实时路由兼容性`,"lab.col.task":`任务有效性`,"lab.empty":`投影中还没有兼容性判定。`,"lab.subjectKind":`类型`,"lab.observationCount":`观测`,"lab.eventCount":`事件`,"lab.verdictCount":`判定`,"lab.subjectCount":`主体`,"lab.builtAt":`构建时间`,"lab.loading":`正在加载兼容性证据…`,"lab.loadMore":`加载更多`,"lab.detailTitle":`判定详情`,"lab.detailClose":`关闭`,"lab.detailSubject":`主体`,"lab.detailObservations":`观测`,"lab.detailEvents":`证据事件`,"lab.detailArtifacts":`制品元数据`,"lab.detailLoadFailed":`无法加载判定详情`,"lab.refresh":`刷新`,"lab.verdict.UNKNOWN":`未知`,"lab.verdict.CLAIMED":`已声明`,"lab.verdict.PROBED":`已探测`,"lab.verdict.VERIFIED":`已验证`,"lab.verdict.DEGRADED":`降级`,"lab.verdict.BLOCKED":`已阻止`,"lab.verdict.UNSUPPORTED":`不支持`,"lab.layer.protocol_conformance":`协议一致性`,"lab.layer.live_route_compatibility":`实时路由兼容性`,"lab.layer.task_effectiveness":`任务有效性`},"zh-TW":{"lab.title":`相容性實驗室`,"lab.subtitle":`基於實驗室投影證據的唯讀相容性判定矩陣。`,"lab.loadFailed":`無法載入相容性實驗室資料`,"lab.projectionUnavailable":`實驗室投影不可用。請先執行一致性探測或即時探測。`,"lab.projectionIncompatible":`實驗室投影架構不相容。請重新建置投影。`,"lab.statusTitle":`投影狀態`,"lab.matrixTitle":`相容性矩陣`,"lab.verdictsTitle":`判定記錄`,"lab.filter.layer":`證據層`,"lab.filter.verdict":`判定`,"lab.filter.subject":`主體 ID`,"lab.filter.all":`全部`,"lab.col.subject":`主體`,"lab.col.layer":`層`,"lab.col.suite":`測試套件`,"lab.col.verdict":`判定`,"lab.col.asOf":`截至`,"lab.col.protocol":`協定一致性`,"lab.col.live":`即時路由相容性`,"lab.col.task":`任務有效性`,"lab.empty":`投影中還沒有相容性判定。`,"lab.subjectKind":`類型`,"lab.observationCount":`觀測`,"lab.eventCount":`事件`,"lab.verdictCount":`判定`,"lab.subjectCount":`主體`,"lab.builtAt":`建置時間`,"lab.loading":`正在載入相容性證據…`,"lab.loadMore":`載入更多`,"lab.detailTitle":`判定詳情`,"lab.detailClose":`關閉`,"lab.detailSubject":`主體`,"lab.detailObservations":`觀測`,"lab.detailEvents":`證據事件`,"lab.detailArtifacts":`產物中繼資料`,"lab.detailLoadFailed":`無法載入判定詳情`,"lab.refresh":`重新整理`,"lab.verdict.UNKNOWN":`未知`,"lab.verdict.CLAIMED":`已聲明`,"lab.verdict.PROBED":`已探測`,"lab.verdict.VERIFIED":`已驗證`,"lab.verdict.DEGRADED":`降級`,"lab.verdict.BLOCKED":`已封鎖`,"lab.verdict.UNSUPPORTED":`不支援`,"lab.layer.protocol_conformance":`協定一致性`,"lab.layer.live_route_compatibility":`即時路由相容性`,"lab.layer.task_effectiveness":`任務有效性`},ru:{"lab.title":`Лаборатория совместимости`,"lab.subtitle":`Матрица вердиктов совместимости только для чтения на основе данных проекции лаборатории.`,"lab.loadFailed":`Не удалось загрузить данные лаборатории совместимости`,"lab.projectionUnavailable":`Проекция лаборатории недоступна. Сначала выполните проверки соответствия или live-проверки.`,"lab.projectionIncompatible":`Схема проекции лаборатории несовместима. Перестройте проекцию.`,"lab.statusTitle":`Состояние проекции`,"lab.matrixTitle":`Матрица совместимости`,"lab.verdictsTitle":`Записи вердиктов`,"lab.filter.layer":`Слой доказательств`,"lab.filter.verdict":`Вердикт`,"lab.filter.subject":`ID субъекта`,"lab.filter.all":`Все`,"lab.col.subject":`Субъект`,"lab.col.layer":`Слой`,"lab.col.suite":`Набор`,"lab.col.verdict":`Вердикт`,"lab.col.asOf":`По состоянию на`,"lab.col.protocol":`Соответствие протоколу`,"lab.col.live":`Совместимость live-маршрута`,"lab.col.task":`Эффективность задач`,"lab.empty":`В проекции пока нет вердиктов совместимости.`,"lab.subjectKind":`Тип`,"lab.observationCount":`Наблюдения`,"lab.eventCount":`События`,"lab.verdictCount":`Вердикты`,"lab.subjectCount":`Субъекты`,"lab.builtAt":`Собрано`,"lab.loading":`Загрузка доказательств совместимости…`,"lab.loadMore":`Загрузить ещё`,"lab.detailTitle":`Детали вердикта`,"lab.detailClose":`Закрыть`,"lab.detailSubject":`Субъект`,"lab.detailObservations":`Наблюдения`,"lab.detailEvents":`События доказательств`,"lab.detailArtifacts":`Метаданные артефактов`,"lab.detailLoadFailed":`Не удалось загрузить детали вердикта`,"lab.refresh":`Обновить`,"lab.verdict.UNKNOWN":`Неизвестно`,"lab.verdict.CLAIMED":`Заявлено`,"lab.verdict.PROBED":`Проверено пробой`,"lab.verdict.VERIFIED":`Подтверждено`,"lab.verdict.DEGRADED":`Ограничено`,"lab.verdict.BLOCKED":`Заблокировано`,"lab.verdict.UNSUPPORTED":`Не поддерживается`,"lab.layer.protocol_conformance":`Соответствие протоколу`,"lab.layer.live_route_compatibility":`Совместимость live-маршрута`,"lab.layer.task_effectiveness":`Эффективность задач`},ja:{"lab.title":`互換性ラボ`,"lab.subtitle":`ラボ投影の証拠に基づく読み取り専用の互換性判定マトリクスです。`,"lab.loadFailed":`互換性ラボのデータを読み込めませんでした`,"lab.projectionUnavailable":`ラボ投影を利用できません。先に適合性プローブまたはライブプローブを実行してください。`,"lab.projectionIncompatible":`ラボ投影のスキーマに互換性がありません。投影を再構築してください。`,"lab.statusTitle":`投影ステータス`,"lab.matrixTitle":`互換性マトリクス`,"lab.verdictsTitle":`判定レコード`,"lab.filter.layer":`証拠レイヤー`,"lab.filter.verdict":`判定`,"lab.filter.subject":`サブジェクト ID`,"lab.filter.all":`すべて`,"lab.col.subject":`サブジェクト`,"lab.col.layer":`レイヤー`,"lab.col.suite":`スイート`,"lab.col.verdict":`判定`,"lab.col.asOf":`時点`,"lab.col.protocol":`プロトコル適合性`,"lab.col.live":`ライブ経路互換性`,"lab.col.task":`タスク有効性`,"lab.empty":`投影にはまだ互換性判定がありません。`,"lab.subjectKind":`種類`,"lab.observationCount":`観測`,"lab.eventCount":`イベント`,"lab.verdictCount":`判定`,"lab.subjectCount":`サブジェクト`,"lab.builtAt":`構築日時`,"lab.loading":`互換性の証拠を読み込み中…`,"lab.loadMore":`さらに読み込む`,"lab.detailTitle":`判定の詳細`,"lab.detailClose":`閉じる`,"lab.detailSubject":`サブジェクト`,"lab.detailObservations":`観測`,"lab.detailEvents":`証拠イベント`,"lab.detailArtifacts":`アーティファクトのメタデータ`,"lab.detailLoadFailed":`判定の詳細を読み込めませんでした`,"lab.refresh":`更新`,"lab.verdict.UNKNOWN":`不明`,"lab.verdict.CLAIMED":`申告済み`,"lab.verdict.PROBED":`プローブ済み`,"lab.verdict.VERIFIED":`検証済み`,"lab.verdict.DEGRADED":`低下`,"lab.verdict.BLOCKED":`ブロック`,"lab.verdict.UNSUPPORTED":`未対応`,"lab.layer.protocol_conformance":`プロトコル適合性`,"lab.layer.live_route_compatibility":`ライブ経路互換性`,"lab.layer.task_effectiveness":`タスク有効性`},tr:{"lab.title":`Uyumluluk Laboratuvarı`,"lab.subtitle":`Laboratuvar projeksiyonu kanıtlarından oluşturulan salt okunur uyumluluk karar matrisi.`,"lab.loadFailed":`Uyumluluk laboratuvarı verileri yüklenemedi`,"lab.projectionUnavailable":`Laboratuvar projeksiyonu kullanılamıyor. Önce uygunluk veya canlı probları çalıştırın.`,"lab.projectionIncompatible":`Laboratuvar projeksiyonu şeması uyumsuz. Projeksiyonu yeniden oluşturun.`,"lab.statusTitle":`Projeksiyon durumu`,"lab.matrixTitle":`Uyumluluk matrisi`,"lab.verdictsTitle":`Karar kayıtları`,"lab.filter.layer":`Kanıt katmanı`,"lab.filter.verdict":`Karar`,"lab.filter.subject":`Özne kimliği`,"lab.filter.all":`Tümü`,"lab.col.subject":`Özne`,"lab.col.layer":`Katman`,"lab.col.suite":`Paket`,"lab.col.verdict":`Karar`,"lab.col.asOf":`Tarih`,"lab.col.protocol":`Protokol uygunluğu`,"lab.col.live":`Canlı rota uyumluluğu`,"lab.col.task":`Görev etkinliği`,"lab.empty":`Projeksiyonda henüz uyumluluk kararı yok.`,"lab.subjectKind":`Tür`,"lab.observationCount":`Gözlemler`,"lab.eventCount":`Olaylar`,"lab.verdictCount":`Kararlar`,"lab.subjectCount":`Özneler`,"lab.builtAt":`Oluşturulma`,"lab.loading":`Uyumluluk kanıtları yükleniyor…`,"lab.loadMore":`Daha fazla yükle`,"lab.detailTitle":`Karar ayrıntısı`,"lab.detailClose":`Kapat`,"lab.detailSubject":`Özne`,"lab.detailObservations":`Gözlemler`,"lab.detailEvents":`Kanıt olayları`,"lab.detailArtifacts":`Artefakt meta verileri`,"lab.detailLoadFailed":`Karar ayrıntısı yüklenemedi`,"lab.refresh":`Yenile`,"lab.verdict.UNKNOWN":`Bilinmiyor`,"lab.verdict.CLAIMED":`İddia edildi`,"lab.verdict.PROBED":`Problandı`,"lab.verdict.VERIFIED":`Doğrulandı`,"lab.verdict.DEGRADED":`Kısıtlı`,"lab.verdict.BLOCKED":`Engellendi`,"lab.verdict.UNSUPPORTED":`Desteklenmiyor`,"lab.layer.protocol_conformance":`Protokol uygunluğu`,"lab.layer.live_route_compatibility":`Canlı rota uyumluluğu`,"lab.layer.task_effectiveness":`Görev etkinliği`}},w={en:{subjectKindUnknown:`Unknown`,"artifact.present":`Present`,"artifact.corrupt":`Corrupt`,"artifact.purged_unavailable":`Purged / unavailable`,selectVerdict:`View verdict for {subject}`,"community.title":`Community evidence`,"community.notLocalVerdict":`Untrusted read-only context. Not included in this local verdict.`,"community.bundles":`Bundles`,"community.activeRecords":`Active records`,"community.revokedRecords":`Revoked records`},de:{subjectKindUnknown:`Unbekannt`,"artifact.present":`Vorhanden`,"artifact.corrupt":`Beschädigt`,"artifact.purged_unavailable":`Gelöscht / nicht verfügbar`,selectVerdict:`Urteil für {subject} anzeigen`,"community.title":`Community-Evidenz`,"community.notLocalVerdict":`Nicht vertrauenswürdiger Nur-Lese-Kontext. Nicht Teil dieses lokalen Urteils.`,"community.bundles":`Pakete`,"community.activeRecords":`Aktive Einträge`,"community.revokedRecords":`Widerrufene Einträge`},fr:{subjectKindUnknown:`Inconnu`,"artifact.present":`Présent`,"artifact.corrupt":`Corrompu`,"artifact.purged_unavailable":`Purgé / indisponible`,selectVerdict:`Afficher le verdict pour {subject}`,"community.title":`Données de la communauté`,"community.notLocalVerdict":`Contexte non fiable en lecture seule. Non inclus dans ce verdict local.`,"community.bundles":`Lots`,"community.activeRecords":`Enregistrements actifs`,"community.revokedRecords":`Enregistrements révoqués`},ko:{subjectKindUnknown:`알 수 없음`,"artifact.present":`있음`,"artifact.corrupt":`손상됨`,"artifact.purged_unavailable":`삭제됨 / 사용할 수 없음`,selectVerdict:`{subject}의 판정 보기`,"community.title":`커뮤니티 증거`,"community.notLocalVerdict":`신뢰되지 않는 읽기 전용 컨텍스트입니다. 이 로컬 판정에는 포함되지 않습니다.`,"community.bundles":`번들`,"community.activeRecords":`활성 레코드`,"community.revokedRecords":`폐기된 레코드`},zh:{subjectKindUnknown:`未知`,"artifact.present":`存在`,"artifact.corrupt":`已损坏`,"artifact.purged_unavailable":`已清除 / 不可用`,selectVerdict:`查看 {subject} 的判定`,"community.title":`社区证据`,"community.notLocalVerdict":`不受信任的只读上下文。不计入此本地判定。`,"community.bundles":`证据包`,"community.activeRecords":`有效记录`,"community.revokedRecords":`已撤销记录`},"zh-TW":{subjectKindUnknown:`未知`,"artifact.present":`存在`,"artifact.corrupt":`已損壞`,"artifact.purged_unavailable":`已清除 / 不可用`,selectVerdict:`查看 {subject} 的判定`,"community.title":`社群證據`,"community.notLocalVerdict":`不受信任的唯讀脈絡。不計入此本地判定。`,"community.bundles":`證據包`,"community.activeRecords":`有效記錄`,"community.revokedRecords":`已撤銷記錄`},ru:{subjectKindUnknown:`Неизвестно`,"artifact.present":`Доступен`,"artifact.corrupt":`Повреждён`,"artifact.purged_unavailable":`Удалён / недоступен`,selectVerdict:`Открыть вердикт для {subject}`,"community.title":`Данные сообщества`,"community.notLocalVerdict":`Недоверенный контекст только для чтения. Не входит в этот локальный вердикт.`,"community.bundles":`Пакеты`,"community.activeRecords":`Активные записи`,"community.revokedRecords":`Отозванные записи`},ja:{subjectKindUnknown:`不明`,"artifact.present":`存在`,"artifact.corrupt":`破損`,"artifact.purged_unavailable":`削除済み / 利用不可`,selectVerdict:`{subject} の判定を表示`,"community.title":`コミュニティ証拠`,"community.notLocalVerdict":`信頼されていない読み取り専用コンテキストです。このローカル判定には含まれません。`,"community.bundles":`バンドル`,"community.activeRecords":`有効なレコード`,"community.revokedRecords":`取り消されたレコード`},tr:{subjectKindUnknown:`Bilinmiyor`,"artifact.present":`Mevcut`,"artifact.corrupt":`Bozuk`,"artifact.purged_unavailable":`Temizlenmiş / kullanılamıyor`,selectVerdict:`{subject} için kararı görüntüle`,"community.title":`Topluluk kanıtı`,"community.notLocalVerdict":`Güvenilmeyen salt okunur bağlam. Bu yerel karara dahil değildir.`,"community.bundles":`Paketler`,"community.activeRecords":`Etkin kayıtlar`,"community.revokedRecords":`Geri çekilen kayıtlar`}};function T(e,t,n){let r=w[e][t];if(n)for(let[e,t]of Object.entries(n))r=r.split(`{${e}}`).join(String(t));return r}function E(e,t){return{...t,...C[e]}}var D={en:E(`en`,m),de:E(`de`,h),fr:E(`fr`,g),ko:E(`ko`,_),zh:E(`zh`,v),"zh-TW":E(`zh-TW`,y),ru:E(`ru`,b),ja:E(`ja`,x),tr:E(`tr`,S)};function O(e){return D[e][`lang.nativeName`]}function k(e,t){return D[e][t]}var A=[{code:`en`,htmlLang:`en`},{code:`de`,htmlLang:`de`},{code:`fr`,htmlLang:`fr`},{code:`ko`,htmlLang:`ko`},{code:`zh`,htmlLang:`zh-CN`},{code:`zh-TW`,htmlLang:`zh-TW`},{code:`ru`,htmlLang:`ru`},{code:`ja`,htmlLang:`ja`},{code:`tr`,htmlLang:`tr`}],j=`ocx-lang`,M=null;function N(){try{let e=localStorage.getItem(j);if(e===`en`||e===`de`||e===`fr`||e===`ko`||e===`zh`||e===`zh-TW`||e===`ru`||e===`ja`||e===`tr`)return e}catch{}let e=typeof navigator<`u`&&navigator?.language?navigator.language.toLowerCase():`en`;return e.startsWith(`de`)?`de`:e.startsWith(`fr`)?`fr`:e.startsWith(`ko`)?`ko`:e.startsWith(`zh`)?e.includes(`tw`)||e.includes(`hk`)||e.includes(`mo`)||e.includes(`hant`)?`zh-TW`:`zh`:e.startsWith(`ru`)?`ru`:e.startsWith(`ja`)?`ja`:e.startsWith(`tr`)?`tr`:`en`}function P(){return M??N()}function F(e){M=e}var I=(0,p.createContext)(null);function L(e,t){if(!t)return e;let n=e;for(let e of Object.keys(t))n=n.split(`{${e}}`).join(String(t[e]));return n}function R(){let e=(0,p.useContext)(I);if(!e)throw Error(`useI18n must be used within LanguageProvider`);return e}function z(){return R().t}export{c as _,L as a,z as c,O as d,T as f,o as g,u as h,P as i,D as l,f as m,A as n,F as o,m as p,N as r,R as s,I as t,k as u};